AIで潮汐計算の式をPHPのプログラムコードに直すとこうなる.

2024.11.07

Logging

おはようございます.AIで潮汐計算の式をPHPのプログラムコードに直すとこうなる.こうなったけどもこれがあっているかが分からないのは使う人の問題ですね(馬しかな自分).

PHPコードにpowdeg2radいうものが存在している事すら知らなかったけども、AIを使用するとこんなことも可能になるのかと感慨深いですね.そして最終的には自分がある程度の知識が必要になるのだなぁって思います.AIが出力してきたコードや計算式が合っているかどうかを検証しなくてはならないので自分の知識もある程度必要になる.

やっぱ知識はないよりある方が良い.無くても良いけど貪欲に吸収する力は必要になりそうなそんな気がしてきました.

最後にAIが生成したコードを記載しておきます.※このコードは検証が必要です.間違っているという指摘はコメントか一言コメントご記載ください🙇‍♂️

<?php

// 潮汐力の計算
function calculateTidalForce($G, $M, $d, $a, $theta) {
    // 水平成分
    $fTh = 3/2 * ($G * $M / pow($d, 3)) * $a * pow(sin($theta), 2);
    
    // 鉛直成分
    $fTv = 3 * ($G * $M / pow($d, 3)) * $a * (pow(cos($theta), 2) - 1/3);
    
    return ['horizontal' => $fTh, 'vertical' => $fTv];
}

// 潮汐ポテンシャルの計算
function calculateTidalPotential($G, $M, $d, $a, $theta) {
    return 3/2 * ($G * $M / pow($d, 3)) * pow($a, 2) * (pow(cos($theta), 2) - 1/3);
}

// 平衡潮汐の計算
function calculateEquilibriumTide($g, $M, $E, $a, $c, $d, $theta) {
    $D = 3/4 * $g * ($M / $E) * pow($a / $c, 3) * $a;
    return 2 * $D * pow($c / $d, 3) * (pow(cos($theta), 2) - 1/3);
}

// 観測点での潮汐ポテンシャルの計算
function calculateObservationPointPotential($D, $c, $d, $phi, $delta, $T) {
    $cosTheta = cos($phi) * cos($delta) * cos($T) + sin($phi) * sin($delta);
    return $D * pow($c / $d, 3) * (
        pow(cos($phi), 2) * pow(cos($delta), 2) * pow(cos($T), 2) +
        pow(sin($phi), 2) * pow(sin($delta), 2) * cos($T) +
        3 * (pow(sin($phi), 2) - 1/3) * (pow(sin($delta), 2) - 1/3)
    );
}

// 使用例
$G = 6.674e-11; // 万有引力定数
$M = 7.34767309e22; // 月の質量
$E = 5.97219e24; // 地球の質量
$d = 384400000; // 地球と月の平均距離
$a = 6371000; // 地球の半径
$g = 9.81; // 重力加速度
$c = $d; // 地球と月の平均距離(簡略化のため同じ値を使用)
$theta = deg2rad(45); // 例として45度を使用
$phi = deg2rad(35); // 観測点の緯度(例:35度)
$delta = deg2rad(5); // 天体の赤緯(例:5度)
$T = deg2rad(30); // 時角(例:30度)

$tidalForce = calculateTidalForce($G, $M, $d, $a, $theta);
$tidalPotential = calculateTidalPotential($G, $M, $d, $a, $theta);
$equilibriumTide = calculateEquilibriumTide($g, $M, $E, $a, $c, $d, $theta);
$observationPointPotential = calculateObservationPointPotential($D, $c, $d, $phi, $delta, $T);

echo "Tidal Force (Horizontal): " . $tidalForce['horizontal'] . " N\n";
echo "Tidal Force (Vertical): " . $tidalForce['vertical'] . " N\n";
echo "Tidal Potential: " . $tidalPotential . " J/kg\n";
echo "Equilibrium Tide: " . $equilibriumTide . " m\n";
echo "Observation Point Potential: " . $observationPointPotential . " J/kg\n";
<?php

/**
 * 時角を計算する
 * 
 * @param int $year 年
 * @param int $month 月
 * @param int $day 日
 * @param int $hour 時
 * @param int $minute 分
 * @param int $second 秒
 * @param float $longitude 経度(東経は正、西経は負)
 * @return float 時角(度数法)
 */
function calculateHourAngle($year, $month, $day, $hour, $minute, $second, $longitude) {
    // 修正ユリウス日を計算
    $mjd = calculateModifiedJulianDate($year, $month, $day, $hour, $minute, $second);
    
    // グリニッジ恒星時を計算
    $gst = calculateGreenwichSiderealTime($mjd);
    
    // 地方恒星時を計算
    $lst = calculateLocalSiderealTime($gst, $longitude);
    
    // 時角を計算(0から360度の範囲に正規化)
    $hourAngle = fmod($lst * 15, 360);
    if ($hourAngle < 0) {
        $hourAngle += 360;
    }
    
    return $hourAngle;
}

/**
 * 修正ユリウス日を計算する
 */
function calculateModifiedJulianDate($y, $m, $d, $h, $mi, $s) {
    if ($m <= 2) {
        $y -= 1;
        $m += 12;
    }
    $ret = (int)(365.25 * $y) + (int)($y / 400) - (int)($y / 100);
    $ret += (int)(30.59 * ($m - 2)) + $d - 678912;
    $ret += $h / 24 + $mi / 1440 + $s / 86400 - 0.375;
    return $ret;
}

/**
 * グリニッジ恒星時を計算する
 */
function calculateGreenwichSiderealTime($mjd) {
    $t = ($mjd - 51544.5) / 36525;
    $gst = 280.46061837 + 360.98564736629 * ($mjd - 51544.5) + 0.000387933 * $t * $t - $t * $t * $t / 38710000;
    return fmod($gst, 360) / 15; // 時間単位に変換
}

/**
 * 地方恒星時を計算する
 */
function calculateLocalSiderealTime($gst, $longitude) {
    $lst = $gst + $longitude / 15;
    if ($lst < 0) {
        $lst += 24;
    } elseif ($lst >= 24) {
        $lst -= 24;
    }
    return $lst;
}

// 使用例
$year = 2024;
$month = 9;
$day = 11;
$hour = 21;
$minute = 7;
$second = 0;
$longitude = 139.75; // 東京の経度

$hourAngle = calculateHourAngle($year, $month, $day, $hour, $minute, $second, $longitude);
echo "時角: " . $hourAngle . "度";

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

$longitude, $lst, $phi, calculateEquilibriumTide, calculateGreenwichSiderealTime, calculateHourAngle, calculateLocalSiderealTime, calculateModifiedJulianDate, calculateObservationPointPotential, calculateTidalForce, calculateTidalPotential, cos, echo, elseif, fmod, Horizontal, pOW, quot, Vertical, 西経,

文字の背景に色を付ける.ハイライトを追加してみました.#即興コード.

2024.10.22

Logging

おはようございます.文字の背景に色を付ける=ハイライトを追加してみました.付けた結果、ちょっとごちゃごちゃしている感はありますが、文章の目を引くことになるのかなと思っています、ちなみにハイライトをつけようと思ったきっかけはこのサイトを見て思いました.

思ってから実行に移すのは「思い立ったが吉日」タイプなので直ぐに手を動かすして書きました.

それほど対したコードではないものの.WordPressの記事の文章内にタグを基にして今回のようにハイライトを付けたり太文字にと思っている人は一定数いると思ったので何かの参考にしてみてください.

ソースコードはバニラJS(javascript)とCSSになります.

if (maincontent = document.querySelectorAll('#main_content > p')) {
    let words = [...document.querySelectorAll('.zip358tag > a')].map((elm) => {
        return elm.textContent;
    });
    if (words.length) {
        [...maincontent].forEach((maincontentElm) => {
            words.forEach((word) => {
                const regexp = new RegExp(word, 'g');
                if (maincontentElm.querySelectorAll('a').length === 0 && maincontentElm.querySelectorAll('img').length === 0) {
                    maincontentElm.innerHTML = maincontentElm.innerHTML.replace(regexp, '<strong class="highlight">' + word + '</strong>');
                } else {
                    nodeReplace(maincontentElm, regexp, words, word);
                }
            });
        });
    }
}

function nodeReplace(elm, regexp, words, word) {
    let key = [];
    if (elm.querySelectorAll('a').length) {
        [...elm.querySelectorAll('a')].forEach((e) => {
            key.push(e.outerHTML);
        });
    }
    if (elm.querySelectorAll('img').length) {
        [...elm.querySelectorAll('img')].forEach((e) => {
            key.push(e.outerHTML);
        });
    }

    if (nodeElmJudge(word, key) === true) {
        elm.innerHTML = elm.innerHTML.replace(regexp, '<strong class="highlight">' + word + '</strong>');
    }
}

function nodeElmJudge(word, key) {

    let result = [];
    result.push(...key.map(element => {
        const regex = new RegExp(word, 'g');
        return regex.test(element);
    }));
    return result.every(e => e === false);
}
strong.highlight{
    background: linear-gradient(transparent 40%, #2ff6da 40%);
}

明日へ続く.

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

background, document.querySelectorAll, element, elm, foreach, innerHTML, linear-gradient, lt, maincontent, maincontentElm, nodeElmJudge, nodeReplace, querySelectorAll, quot, RegExp, result.push, textContent, words, words.forEach, words.length,

githubのIPアドレスを取得したい方へ送るコード.

2024.10.06

Logging

おはようございます.以前、さくらレンタルサーバーにデプロイするためにGithubのIPアドレスを許可しなくては成らなくなり下記のコードを作りました.今回はそのコードのお裾分けです.Githubは使用されているIPアドレスをJsonデータとして公開しているので、そのJSONデータを取得するPHPコードです.

大したコードではないものの、ユーザーエージェントが無いと取得できないのでそこは気おつけてください.それはfile_get_contentsでも同様ですのでお気をつけください.

ソースコードは下記になります.尚、IPアドレスは下記のページから参照可能となります.

https://zip358.com/tool/github-ip-address

class githubIpAddress
{
    public $url = 'https://api.github.com/meta';
    public function getIpAddress($key)
    {
        $data = [];
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $this->url);
        curl_setopt($curl, CURLOPT_USERAGENT, 'getgithubaddress');
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

        $obj = json_decode(@curl_exec($curl));

        if ($obj?->$key) {
            foreach ($obj?->$key as $val) {
                $data[] = $val;
            }
        }
        curl_close($curl);
        return $data;
    }

    public function saveIpAddress($key, $data)
    {
        $filename = "data/{$key}-ip-address.txt";
        file_put_contents($filename, implode("\n",$data));
        return $filename;
    }
}

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

curl, curl_close, curl_exec, curl_init, curl_setopt, false, filename, foreach, github, gt, implode, ip-address.txt&quot, json_decode, obj, quot, quot;data, return, true, val, ユーザーエージェント,

号外NETの記事タイトルをポストするようにコードを組みました.tosajin.info

2024.10.02

Logging

おはようございます.号外サイト記事タイトルをポストするようにコードを組みました.これによって少しは高知県の人に貢献できたのではと思っています.この号外NETというサイトはとても良いです.新しいお店の紹介などが逐次わかるというのは良い感じですよね.

因みにソースコードはこんな感じになります.これをLaravelのスケジュールを使用して叩いている形になります.ポストするコードに関してはご自身で考えて作らないとポストすることは出来ないです.

    /**
     * Execute the job.
     */
    public function handle(): void
    {
        $xmlobj = @simplexml_load_file('https://kochi.goguynet.jp/feed/');
        if($xmlobj?->channel?->item){
            $str = [];
            foreach($xmlobj->channel->item as $key=>$val){
                if($this->dateCheck($val->pubDate)){
                    $str[] = "{$val->title}
{$val->guid}
引用元:号外NET 高知市
                    ";
                }else{
                    break;
                }
            }
            $str = array_reverse($str);
            if(count($str)){
                $TwitterController = new TwitterController();
                foreach($str as $val){
                    $TwitterController->tweet($val);
                }
            }
        }
    }

    private function dateCheck($inputDate)
    {
        $inputDateTime = new DateTime($inputDate);
        $inputDateTime->setTimezone(new DateTimeZone('UTC')); // UTCに合わせる
        
        // 現在の日付(UTC)
        $currentDateTime = new DateTime('now', new DateTimeZone('UTC'));
        
        // 今日の日付を取得
        $today = $currentDateTime->format('Y-m-d');
        
        // 昨日の日付を取得
        $yesterday = $currentDateTime->modify('-5 day')->format('Y-m-d');
        
        // 入力された日付のフォーマット
        $inputDateFormatted = $inputDateTime->format('Y-m-d');
        
        // 比較
        if ($inputDateFormatted === $today || $inputDateFormatted > $yesterday) {
            return true;
        }
        return false;
    }

Xなどにポストするにはライブラリを使用してポストすることが簡単だと思っていますが、それが難しいという方は生成AIを使用してクラス化したXにポストするPHPコードを書いてと指示をすればコードを書いてくれると思います.

ちなみにこのソースコードは高知県の号外に特化したコードになります.

明日へ続く.

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

array_reverse, break, count, dateCheck, else, foreach, format, gt, guid, item, Laravel, modify, pubDate, quot, setTimezone, Tweet, val, void, yesterday, 号外,

レンタルサーバーでデスクトップ通知はPush7がおすすめ.

2024.10.01

Logging

おはようございます.今日から10月ですね~.この頃はクーラーを夜な夜な付けることもなくなり快適な生活を送っています.夏は好きですけど今年の夏は暑かった.

さてレンタルサーバーでデスクトップ通知はPush7がおすすめです、今のところプッシュ通知を行っている日本企業はここしか知りません.おそらく海外で同じようなAPIサービスはあると思います.

因みにこのサービス、無料版では購買者に一括送信しか出来ませんが980円支払えば個別送信することも可能です.自分がいま作っているサービスは「npush」というものです.このサービスはNHKの番組表から自分が見たい番組をチェックすると前の日にデスクトップ通知が送信されるというもの.あまり需要がなさそうだけど、自分には必要なものなので運用しようと思っています.まずは自分だけ使う感じで他のユーザーさんは番組検索機能だけ開放します.ただし番組表は東京だけですけどね.

技術的な話.デスクトップ通知などはレンタルサーバーが開放されているポートだけでは機能しません.なので、APIサービスを使用せずに制作したい場合はAWSやVPSサーバーなどを使用することをおすすめします.今回、使用したAPIサービスでPushするPHPコードを抜粋して貼っときます.あくまでもテスト用なので、ここから改修が必要になります.また、個別送信したい方は新たにパラメーターを付与してください.詳しくは公式ページのドキュメントを参照くださいませ.

        $apiurl = "https://api.push7.jp/api/v1/";
        $appno = config('app.push7no');
        $apikey = config('app.push7apikey');
        $icon_url = 'https://dashboard.push7.jp/uploads/example.png.webp';
        
        // 送信データ
        $data = array(
            'title' => "通知タイトル", // 通知タイトル
            'body' => "通知テキスト", // 通知テキスト。記事タイトルなど
            'icon' => $icon_url, // アイコンファイル
            'url' => "https://example.com/", // リンク先。記事URLなど
            'apikey' => $apikey
        );
        
        // JSON形式に変換
        $json_data = json_encode($data);
        
        // cURLセッションを初期化
        $ch = curl_init($apiurl . $appno . '/send');
        
        // オプションをセット
        curl_setopt($ch, CURLOPT_POST, true); // POSTメソッドを使用
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); // ヘッダーにJSON形式を指定
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // レスポンスを文字列で返す
        curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data); // POSTデータをセット
        
        // 実行してレスポンスを取得
        $response = curl_exec($ch);
        
        // エラーチェック
        if (curl_errno($ch)) {
            $error_msg = curl_error($ch);
            log::error("cURLエラー: " . $error_msg); // エラーログ
        } else {
            // レスポンスをデコード
            $response_data = json_decode($response, true);
            log::info($response_data); // レスポンスをログに記録
        }
        
        // cURLセッションを終了
        curl_close($ch);

明日へ続く.

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

application, array, config, Content-type, curl_errno, cURLエラー, cURLセッション, else, Error, json_decode, json_encode, log, npush, quot, response, true, アイコンファイル, エラーログ, デコード, パラメーター,

この記事は何投稿目かをWordPressで表示する関数を生成AIで生成💮

2024.09.29

Logging

おはようございます.この記事は何投稿目かをWordPressで表示する関数を生成AIで生成しました、これぐらいの事は生成AIでも出来るのですねーそれも無料のChatGPTで.こういう事が出来るので少しPHPコードができる人でもなんとかなるだなぁーって思いましたが、実際の現場では1ファイル数百行ー数千行は当たり前なので仕事としては大変かと思うものの.ホームページを主としている会社では充分な助っ人になると思います.

この頃は分からないことは生成AIに聞いてそれでも明確な答えが出ないものはググってます.自分でも思うのですが、ちょっと煩雑な文章で書いているからもう少し丁寧に情報提供して実行すれば良いかなと思うものの、それを用意するのが少し億劫で答えに満足せずにググっている自分がいます.

function getArticleCount($post_id)
{
    global $wpdb;

    // 指定された投稿の公開日時を取得
    $post_date = $wpdb->get_var(
        $wpdb->prepare("SELECT post_date FROM $wpdb->posts WHERE ID = %d AND post_type = 'post' AND post_status = 'publish'", $post_id)
    );

    if (!$post_date) {
        return 0; // 投稿が存在しない場合
    }

    // この投稿より古い投稿の数を数える
    $post_rank = $wpdb->get_var(
        $wpdb->prepare(
            "SELECT COUNT(*) + 1 FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' AND post_date < %s", 
            $post_date
        )
    );

    return $post_rank;
}

明日へ続く.

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

$post_date, $post_id, $post_rank, $wpdb, ChatGPT, from, function getArticleCount, global, gt, gt;get_var, if, lt, posts WHERE post_type, prepare, quot, quot;SELECT COUNT, quot;SELECT post_date, return, 助っ人, 関数,

Githubアクションでレンタルサーバーにデプロイさせる話.

2024.09.20

Logging

おはようございます.将軍が米エミー賞を受賞しましたね、これを機会に自分はディズニープラスを契約してウォーキングのときに将軍をみています、これは田舎だから出来る特権かと思います💁.

さてGithubアクションでレンタルサーバーにデプロイ(アップロード)させる方法を書いていきます.まず前提条件としてIDとPASSでの認証ではなくて鍵での方法です.事前に公開鍵をレンタルサーバーに登録しとく必要があります.

では最初に対象となるリポジトリのセッティングから下記の順にクリックしてください.

次、アクションシークレットに必要な値を登録します(SSH_PRIVATE_KEYやSERVER_USERNAMEなどです)

最後にアクションの設定(yml)を行えば完了です.完了ですがレンタルサーバーによっては海外IPアドレスをブロックするように設定しているレンタルサーバーがあります.なので、海外IPを解除する必要があります.GithubのIPアドレスはこちらを参照して設定ください.
https://api.github.com/meta

※ルート直下をデプロイ対象すると.gitもアップロードされ大変危険ですので対策を取るか、直下をアップロードしないようにするか等が必要なります.

name: sakura

on:
  push:
    branches: [ "main" ]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4

      - name: Set up SSH key
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa_sakura
          chmod 600 ~/.ssh/id_rsa_sakura

      - name: Deploy Files via rsync
        run: |
          rsync -avz -e "ssh -i ~/.ssh/id_rsa_sakura -o StrictHostKeyChecking=no" ./path ${{ secrets.SERVER_USERNAME }}@${{ secrets.SERVER_HOST }}:${{ secrets.SERVER_DEPLOY_DIR }}

これでメインにプシュしたものはレンタルサーバーにアップロード(Deploy)されるようになります.

簡略化した説明なので分からない方もいると思います.そんな方は生成AIやググると何とかなるかと思いますので諦めずにトライしてみてください.

明日へ続く.

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

actions, branches, deploy, echo, git, github, jobs, path, push, quot, run, sakura, SSH, steps, StrictHostKeyChecking, ubuntu-latest, uses, yml, デプロイ,

【#javascript定番】日付のカウントダウンを行う

2024.07.14

Logging

おはようございます.日付のカウントダウンを行うJavaScript言語の定番プログラムコードを作りましたので公開します.昨今、生成AIを使用してこのぐらいのコードは生成出来るかと思っていたのですが、こんなコードでも手直しが必要になりました.

やはり今の生成AIは事細かい指示を出さないと上手く動かないような気がします.それはプログラミングじゃない事でもそんな感じなのかもしれません.

<h1 id="countdown" data-y="2025" data-m="07" data-d="11"></h1>
function countdown() {
    let Y = document.querySelector('#countdown').getAttribute('data-Y');
    let m = Math.floor(document.querySelector('#countdown').getAttribute('data-m')) -1;
    let d = document.querySelector('#countdown').getAttribute('data-d');
    let strCountDown = '';
    let nowDate = new Date();
    let countdownDate = new Date(Y,m,d,0,0,0);
    let distance = countdownDate.getTime() - nowDate.getTime();
    const day = Math.floor(distance / 1000 / 60 / 60 / 24);
    const hour = Math.floor(distance / 1000 / 60 / 60) % 24;
    const minute = Math.floor(distance / 1000 / 60) % 60;
    const second = Math.floor(distance / 1000) % 60;

    strCountDown = `${day}日 ${hour}:${minute}:${second}`;

    view(strCountDown);
}

setInterval(countdown, 1000);

function view(str) {
    document.querySelector('#countdown').textContent = str;
}

デモページはこちらになります.

https://zip358.com/tool/demo94

明日へ続く.

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

countdown, countdownDate.getTime, data-y, distance, document.querySelector, floor, getAttribute, gt, hour, let, lt, minute, nowDate.getTime, querySelector, quot, second, setInterval, STR, strCountDown, textContent,

よさこい2024年の出場チーム一覧をJsonで公開しました.

2024.07.10

Logging

おはようございます.高知の夏と言えばよさこいだと思います、そう思っているのは高知県民だけかもしれません.そんなよさこい高知の出場チーム一覧をJsonファイルで作りましたので、おすそ分けします😌.

高知県民、未だにPDFや画像でweb公開しているサイトが多い中、高知新聞さんがテキスト形式で公開していたのでデータだけ抽出してJson形式に加工しました.抽出コードはこんな感じの単純なものです.またJsonデータは出場する時間帯などは無い感じです.チーム名だけが得られるJsonファイルになっています.
https://yosakoi-video.com/js/yosakoi2024.json

copy([...document.querySelectorAll('a')].map(elm=>{
    let t ='';
    if(elm.innerText.match(/(/)){
        t = elm.innerText;
    }
    return t + "\n";
}).join(''));

広報活動になりますが、よさこい動画検索という鳴かず飛ばずのサイトを運営しています.なかなか、検索にもヒットしないので、直リンクから訪問頂けたら幸いです.

https://yosakoi-video.com

明日へ続く.

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

-t, copy, document.querySelectorAll, elm, elm.innerText, gt, if, innerText.match, join, Jsonデータ, jsonファイル, Json形式, map, n&quot, pdf, quot, web, 抽出コード, 高知, 高知県民,

x.comのAPI(FREE)にて自分のユーザー情報を取得するには

2024.06.05

Logging

おはようございます.x.comのAPI(FREE)にて自分のユーザー情報を取得するにはってググってもv1.1の情報だらけだったので情報を記載します.v2対応です.一部、有料でないと取得できない部分があり返却もエラーで返ってきますが、雛形コードを記載します.

注意事項
TwitterOAuthというComposerライブラリを使用しています.
APIなどの値はご自身のAPIに合わしてください.

参考にしたサイト
https://developer.x.com/en/docs/twitter-api/users/lookup/api-reference/get-users-me

<?php
date_default_timezone_set('Asia/Tokyo');
require_once "../vendor/autoload.php";

use Abraham\TwitterOAuth\TwitterOAuth;

class xMyProfile
{

    public $connection = null;
    public $response = null;

    public function __construct()
    {
        $this->connection = new TwitterOAuth(APIKEY, APISECRET, ACCESSTOKEN, ACCESSTOKENSECRET);
        $this->connection->setApiVersion("2");
        $this->response = $this->connection->get('users/me', [
            'expansions'=>'pinned_tweet_id',
            'tweet.fields'=>implode(',',[
                'attachments',
                'author_id',
                'context_annotations',
                'conversation_id',
                'created_at',
                'edit_controls',
                'entities',
                'geo',
                'id',
                'in_reply_to_user_id',
                'lang',
                'non_public_metrics',
                'public_metrics',
                'organic_metrics',
                'promoted_metrics',
                'possibly_sensitive',
                'referenced_tweets',
                'reply_settings',
                'source',
                'text',
                'withheld'
            ]),
            'user.fields' => implode(',', [
                'created_at',
                'description',
                'entities',
                'id',
                'location',
                'most_recent_tweet_id',
                'name',
                'pinned_tweet_id',
                'profile_image_url',
                'protected',
                'public_metrics',
                'url',
                'username',
                'verified',
                'verified_type',
                'withheld'
            ])
        ]);
        return $this;
    }

    /**
     * プロフィール情報全てを取得
     */
    public function getMyProfile()
    {
        return $this->response;
    }
    /**
     * プロフィールアイコンURLを取得
     */
    public function getIconUrl()
    {
        return $this->response->data->profile_image_url;
    }
}
var_dump((new xMyProfile)->getMyProfile());
//print (new xMyProfile)->getIconUrl();

この記事はQiitaに掲載していた記事になります.

明日へ続く.

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

connection, construct, edit_controls, getIconUrl, getMyProfile, implode, lt, null, organic_metrics, print, promoted_metrics, public, qiita, quot, response, return, use AbrahamTwitterOAuthTwitterOAuth, users, vendor, X.com,

PHP言語で連想配列の指定キーにて並び替える方法.

2024.06.04

Logging

おはようございます、PHP言語で連想配列の指定キーにて並び替える方法は下記です.下記の方法を行うことにより日付キーかつ降順で並び替えを行えるようになります.よく使う関数かどうかは分からないけど頭の片隅に残しておいた方が良い気がしましたので記事にしました.

<?php
$data = [
    [
    'title'=>'Aタイトル',
    'date'=>'2024.05.31 05:00',
    ],
    [
    'title'=>'Cタイトル',
    'date'=>'2024.05.30 05:00',
    ],
    [
    'title'=>'Bタイトル',
    'date'=>'2024.05.31 07:10',
    ],
];
$dateArray = array_column($data, 'date');
array_multisort($dateArray, SORT_DESC, $data);
var_dump($data);

因みに上記の内容(ソース・コード)を実行すると下記の結果が返ってきます.いやーarray_columnとarray_multisortの関数は良いですよね、便利です😌ということで技術共有でした.

array(3) {
  [0]=>
  array(2) {
    ["title"]=>
    string(13) "Bタイトル"
    ["date"]=>
    string(16) "2024.05.31 07:10"
  }
  [1]=>
  array(2) {
    ["title"]=>
    string(13) "Aタイトル"
    ["date"]=>
    string(16) "2024.05.31 05:00"
  }
  [2]=>
  array(2) {
    ["title"]=>
    string(13) "Cタイトル"
    ["date"]=>
    string(16) "2024.05.30 05:00"
  }
}

明日へ続く.

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

$dateArray, array, array_column, array_multisort, Bタイトル&quot, data, lt, php, PHP言語, quot, quot;Aタイトル&quot, quot;date&quot, quot;title&quot, SORT_DESC, string, var_dump, 片隅, 連想配列, 関数,

Tensorflow.jsの画像認識って

2024.03.11

Logging

おはようございます、Tensorflow.jsの画像認識ってドキュメント通り書いて上手く画像認識できますか?自分が試してみたら、どうも下記のエラーがでて上手く動作してくれなかったのでもしかしたらと思いバージョンをアップしたら動作してくれました。

Uncaught (in promise) Error: Tensorflow Op is not supported: _FusedConv2D
<!-- Load TensorFlow.js. This is required to use MobileNet. -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@4.17.0"> </script>
<!-- Load the MobileNet model. -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/mobilenet@2.1.1"> </script>

<!-- Replace this with your image. Make sure CORS settings allow reading the image! -->
<img id="img" src="cat.jpg.webp"></img>

<!-- Place your code in the script tag below. You can also use an external .js file -->
<script>
  // Notice there is no 'import' statement. 'mobilenet' and 'tf' is
  // available on the index-page because of the script tag above.

  const img = document.getElementById('img');

  // Load the model.
  mobilenet.load().then(model => {
    // Classify the image.
    model.classify(img).then(predictions => {
      console.log('Predictions: ');
      console.log(predictions);
    });
  });
</script>

因みに自分は画像投稿系のサイトで使用するために今回のTensorflow.jsを使用するのですが、よくよく調べているとファインチューニングが出来るようです。ファインチューニングとは一度学習したものに再学習を埋め込む手法といえば良いのかな?要するにカスタマイズしてある分類に特化させる手法のことを指します。今のところ学習済みのモデルで全然判定されるのでOKだと思うのですが、ユーザーさんから認識できないという不満の声が上がれば対応しないといけなくなりそうです。

明日へ続く。

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

'src', below, const img, Error, getElementById, gt, img, img&quot, Load TensorFlow.js, lt, MobileNet, mobilenet.load, model, predictions, quot, statement, then, Uncaught, ファインチューニング,

Photo by Victor Freitas on Pexels.com

文章を解析して#を付与して返却。

2024.03.04

Logging

おはようございます、文章を解析して#を付与して返却…Qiitaの丸コピです
SNSでの使用することを考えて作りました。文章を解析して名詞と形容詞の文字の先頭に#を付与して返却します😌。

レンタルサーバーでは動きませんがawsやgcp,vpsなどでは動く作りになっています。
作った経緯はこういうサービスが無かったので作りました?。

因みにexecの脆弱性が気になるところですので対応が必要かもです🙇。

※phpやPythonのインストールはご自身で行ってください。

#前処理 mecab-python3バージョンは1.0.8です
sudo apt-get install mecab libmecab-dev mecab-ipadic-utf8
sudo pip install mecab-python3
pip install unidic-lite
<?php
class sharpPost
{
    /**
     * mecab.pyを使って文章を解析(名詞と形容詞を取り出す)
     * @param $posstData
     * @return array|null
     */
    public function analysis($postData)
    {
        if(!$postData)return null;
        $word = null;
        exec('python py/mecab.py "'.strip_tags(htmlentities($postData)).'"',$output);// 2>&1
        if(is_array($output)){
            foreach($output as $val){
                $analysisWord = explode("\t",$val);
                if(isset($analysisWord[1]) && preg_match('/(名詞|形容詞)/',$analysisWord[1])){
                    $word[] = $analysisWord[0];
                    $word = array_unique($word);
                }
            }
        }
        return $word;
    }
    
    /**
     * 文字列を置き換える処理
     * @param $postData
     * @param $word|null
     * @return string
     */
    public function replacePostData($postData='',$word=null)
    {
        if(is_array($word)){
            foreach($word as $val){
                $postData = preg_replace("/({$val})/u"," #{$val} ",$postData);
            }
        }
        return $postData;
    }
}
$textData = '単なる自分が使いたい機能です、無かったので作ってみただけです。';
$sharpPost = new sharpPost();
$word = $sharpPost->analysis($textData);
print(($sharpPost->replacePostData($textData,$word)).PHP_EOL);
import MeCab
import sys
args = sys.argv
if(args[1]):
    tagger = MeCab.Tagger()
    print(tagger.parse(args[1]))

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

analysis, args, argv if, AWS, exec, explode, foreach, htmlentities, isset, PARAM, preg_match, preg_replace, print, qiita, quot, replacePostData, return, sharpPost, tagger, tagger.parse,

アイキャッチ画像を表示するように変更。PHPコード

2023.11.25

Logging

おはよう御座います、先日アイキャッチ画像を表示するように変更しました、PHPコードはこんな感じです。Bootstrapでレスポンシブ画像に対応しています。アイキャッチ画像を表示するようにした訳はデザインも変えたのでアイキャッチいれても変じゃないかなって思ったことです。そういう訳で先日の休みに対応しましたというのが経緯(いきさつ)です。

            <div>
              <?php
              print get_the_post_thumbnail_url() ? '<img src="' . get_the_post_thumbnail_url() . '" class="img-fluid">' : '';
              ?>
            </div>

そんな休みの日にこんなタイムラインが流れてきました、こんなのが浸透したら商売が破綻すると思う人がいると思うけれども、たぶん今の生成AIで凄いことが出来るのに殆んどの人が使えていない。これが浸透するのにかなり月日がかかると思います。一般の人に浸透するにはラグが存在するので、それまでにどうすれば良いか対処出来ると思います。ちなみにポストが消えてしまった時のために上のポストの内容を解説しておくと、画像(デザイン)からフロントエンドエンジニアやデザインナーが行うHTML作成作業を生成AIが変わって行ってくれる。今の所、完璧なコードが生成される訳ではないので手直しが必要ですが、いずれは必要なくなることは時間の問題という話なんだけど、実際ひとが思っている未来の斜め上を行くのが未来かと思います。なので落胆はせずに上手く取り入れていく方が賢明かなって自分は思います。

明日へ続く。

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

Bootstrap, class, div&gt, get_the_post_thumbnail_url, gt, img src, img-fluid&quot, lt, php, print get_the_post_thumbnail_url, quot, アイキャッチ, デザインナー, ラク, レスポンシブ画像, 商売, 手直し, 生成AI, 経緯, 落胆,

Photo by Pixabay on Pexels.com

#久しぶりのコード`Xにポストするコード`

2023.11.17

Logging

おはよう御座います、さて正月休みは11日ぐらいあります、いやー正月休みはネトフリとゲームざんまいしてみたいと思っているのですが、結局どこかに出ていったりとかして目標達成できずにズルズルと休みを過ごすことになりそうです。👈前と言っていることが違いますね🙇。

さて、久しぶりにコードを書きました、この記事だけ見るとプログラマーじゃないかって思われるので最初に記載しときます。毎日のように仕事ではコードを書いています、仕事以外でコードを書いたのは一週間ぶりかなぁ。でも、このコードはポストでも書いている通り、特に難しいコードでもないのでオープンに公開しました。

このコードには必要ないコードが紛れているのはこのコードが使いましたコードだからです😂。

<?php
date_default_timezone_set('Asia/Tokyo');
ini_set("display_errors", 0);
require_once "../tw-config-v2.php";
require_once "../vendor/autoload.php";

use Abraham\TwitterOAuth\TwitterOAuth;

class merukari{
    public $connection = null;
    public $pdo = null;

    public function __construct()
    {
        $this->connection = new TwitterOAuth(APIKEY, APISECRET,ACCESSTOKEN,ACCESSTOKENSECRET);
        $this->connection->setApiVersion("2");
    }

    public function tweet($pattern)
    {
        $result = $this->connection->post("tweets", ["text" =>$pattern], true);
    }
    
    public static function pattern()
    {
        $pattern = [
            'メルカリで参考書を取り扱ってます📖 どれも綺麗な状態です。#学び #python Cシャープ #プログラム ⏭ https://jp.mercari.com/user/profile/808093563',
            'メルカリで参考書を出品してます📖 どれも綺麗な状態です。#学び #機械学習 #AI #プログラム ⏭ https://jp.mercari.com/user/profile/808093563',
            'メルカリで参考書を売ってます📖 どれも綺麗な状態です。#学び #人工知能 #python #プログラム ⏭ https://jp.mercari.com/user/profile/808093563',
            'メルカリで参考書を取り扱ってますよ📖 どれも綺麗な状態です。#学び #テック #企業 #学び #プログラム ⏭ https://jp.mercari.com/user/profile/808093563',
        ];

        return $pattern[ (int)rand(0,(count($pattern)-1))];
    }
}

try {
    if($argv[1] === 'merukari'){
        (new merukari())->tweet(merukari::pattern());
    }
} catch (\Throwable $th) {
    //throw $th;
}

もしかしたら、以前にもコードを公開して2回目になっていたりするかも知れません。そうだったらごめんなさい、無駄に記事を量産しています(反省。

そうそうXのハッシュタグ廃止は誤解だそうです。思い出したので書いときます、、、。

明日へ続く。

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

argv, Asia, catch, connection, construct, int, lt, null, pattern, Python, quot, rand, return, throw, Throwable, true, try, Tweet, use AbrahamTwitterOAuthTwitterOAuth, vendor,

スマホでも動画再生させる方法。

2023.10.16

Logging

おはよう御座います、スマホでも動画再生させる方法を記載しますね。このコードをvideoタグに入れるとスマホでも動画が再生されるようです。iPhoneのSafariとchromeで動作確認済。最新のブラウザではスマホでも動画再生されるようです。

<video autoplay preload="none" loop="loop" muted="muted" playsinline=""

上記のコードで大事になるのが「playsinline」という所、この記述がなければスマホでは動画が再生されません。ググってもなかなかこのコードにたどり着くことが出来なかった。昔はスマホで動画が再生され無かったのですが、いまの最新のブラウザではスマホでも動画が再生出来るようになっているので、これは良い感じだなぁと思います。なお、ミュートとかオートプレイも大事だということも付け加えて置きます👍。

因みに一昔前だとサーバーサイドでストリーミング再生でとかしていたと思いますが、この手法が使えるようになってからは、かなり低予算で対応出来るようになったのではないかなって個人的には思いました。

明日へ続く😌

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

Chrome, iPhone, loop, lt;video autoplay preload, muted, muted&quot, none&quot, playsinline, quot, quot;loop&quot, Safari, videoタグ, オートプレイ, サーバーサイド, ストリーミング再生, ブラウザ, ミュート, 一昔前, 手法, 記述,

よさこい祭り動画検索を久しぶりにバージョンアップ

2023.08.24

Logging

おはようございます、よさこい祭り動画検索を久しぶりにバージョンアップしました。バージョンアップした理由はGさんがAndroid12に対応していないアプリは駄目だよと警告⚠を頂きまして、その対応のため、アプリを更新しました。このアプリはサイトを読み込んで表示しているだけのアプリなのでそのうち改修しようと思っているのだけどなかなか、手直ししていないアプリです。

Androidアプリでリリースしているものは、これだけでこのアプリがGさんに出禁になっても別に良いやというアプリですが、それでもなんだか知らない間にアプリのインストールも増えていて、びっくりしています。更新したのですが、実機で確認するとなんだかエラーが出てたりして何度か手直しを行いました。原因はマニフェストの書き方が駄目だったみたいです。

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.yosakoi_app">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

こんな感じに書かないとお叱りを受けるようです、皆さまも気おつけてください🙇。

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

Androidアプリ, example.yosakoi_app&quot, gt, lt, manifest xmlns, Package, quot, quot;android.permission.ACCESS_NETWORK_STATE&quot, quot;android.permission.INTERNET&quot, uses-permission android, インストール, うち, エラー, お叱り, バージョン, マニフェスト, 何度か手直し, 出禁, 皆さま, 警告,

Laravelにてnpmが使えないサーバにてログイン画面の構築。

2023.08.06

Logging

おはようございます、Laravelにてnpmが使えないサーバにてログイン画面の構築のお話です。お話というより動画を作りました。この動画を全画面表示でみると大体のことが分かると思います。この動画は画面ができるまですので、この後、Commandを使用して下記のCommandを打ち完成となります。

php artisan migrate
laravelのログイン機能と日本語化とバリデーション日本語化

前提条件として.envファイルの設定は済ましていることとします。因みにさくらレンタルサーバーでは初期のドメインより.envファイルが見える仕様になっているので、.htaccessファイルを使用して隠しファイルは見えないように設定してあげてください🗿。さくらレンタルサーバーの公式ブログではこの事に一切触れていないのだけど大丈夫なのか?気になるところです。

<Files ~ "^(\.en|\.edi|\.git|\.dat|\.sql|composer\.|artisan)">
deny from all
</Files>
{
    "Login": "ログイン",
    "Register": "新規登録",
    "Forgot Your Password?": "パスワードを忘れた場合",
    "Reset Password": "パスワード再設定",
    "Send Password Reset Link":  "パスワード再設定URLを送信",
    
    "Name": "お名前",
    "Email Address": "メールアドレス",
    "Password": "パスワード",
    "Confirm Password": "パスワード(確認用)",
    "Remember Me": "ログイン状態を保存",
    
    "Hello!": "ご利用ありがとうございます。",
    "Reset Password Notification":  "パスワード再設定のお知らせ",
    "You are receiving this email because we received a password reset request for your account.": "あなたのアカウントでパスワード再発行のリクエストがありました。",
    "This password reset link will expire in :count minutes.": "再設定URLの有効期限は :count 分です。",
    "If you did not request a password reset, no further action is required.": "もしパスワード再発行をリクエストしていない場合、操作は不要です。",
    "If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser: [:actionURL](:actionURL)": "\":actionText\"ボタンを押しても何も起きない場合、以下URLをコピーしてWebブラウザに貼り付けてください。\n[:actionURL](:actionURL)",
    "Regards": "よろしくお願いいたします"
    }

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

-Command, actionText, actionURL, artisan, count, dat, edi, en, envファイル, git, gt, Laravel, lt, npm, quot, quot;Login&quot, quot;Regards&quot, quot;Register&quot, sql|composer, will expire,

Photo by RENATO CONTI on Pexels.com

TwitterとMastodonに同時配信するツールを作成

2023.07.08

Logging

おはようございます。先日、Twitter民がAPI制限で表示がされない問題が起きていた時に、TwitterとMastodonに同時配信するツールを作っていました。普通につぶやくのは前にコードを作っていましたので、それを流用して簡単に出来るなぁなどと思いながら作っていたら画像も添付した状態でつぶやきたいという欲が出てきて沼にハマりました。

Twitterの方は画像添付のつぶやきも簡単にできたものの、Mastodonで沼にハマりました。PHPにはcurlのメソッドがあります、これを使用してAPIに指示を出す感じです。ドキュメントにはヘッダーとともに必須項目を送信すればトゥート(つぶやける)できるよと記載されていたのだけど、実際はユーザーエージェントの値も送信しないと上手く動作しない仕様になっていました。

これはちょっと酷くない?と思いながら数時間悩み、その後、パラメーターの文字化けするという問題に沼にハマりここで数分悩んでいました。結局、全て自己解決したのですが調べても生成AIを頼っても答えが出ない場合は、今までの自分の知識や経験がある方が優位だなって感じました。

トイウコトデ、Qiitaでも掲載したのですがこちらでも解決策を記載します。

<?php
class Mastodon
{
    const host = "mstdn.jp";
    const endpoint1  = "/api/v1/statuses";
    const endpoint2  = "/api/v1/media";

    public function toot($text){
        $data = array('file' => new CURLFile("/var/www/html/t_m/image.png.webp", 'image/png', "image.png.webp"));
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, "https://" . self::host . self::endpoint2);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['User-Agent: ' . $_SERVER['HTTP_USER_AGENT'], 'Content-Type: multipart/form-data', 'Authorization: Bearer ' . MSTDN_ACCESSTOKEN]);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        $response =   json_decode(@curl_exec($ch));
        curl_close($ch);
        if (isset($response->id)) {
            $postdata = [
                "visibility" => "public",
                "media_ids" => [$response->id],
                "status" => strip_tags($text),
            ];
            $data = json_encode($postdata);
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, "https://" . self::host . self::endpoint1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            curl_setopt($ch, CURLOPT_HTTPHEADER, ['User-Agent: ' . $_SERVER['HTTP_USER_AGENT'], 'Content-Type: application/json', 'Authorization: Bearer ' . MSTDN_ACCESSTOKEN]);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            $response =  @curl_exec($ch);
            curl_close($ch);
        }
    }
}

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

'User-Agent', API, application, array, Authorization, Bearer, Content-type, curl, false, isset, json_decode, mastodon, multipart, qiita, quot, Twitter, VERIFYHOST, トイウコトデ, トゥート, ユーザーエージェント,

Twitter API V2では画像ツイートが出来ないと流れてきたので対処方法

2023.06.02

Logging

おはようございます。先日、Twitter API V2では画像ツイートが出来ないと流れてきたので対処方法を載せときます。Qiitaにも掲載していますが、こちらでも記載します。コードはいつまで使用出来るかは不明ですね、イーロン・マスクのサジカゲンで無料プランでは出来なくなる可能性を秘めています。今のところ、使用できるコードです。PHP8系では動きますがPHP7系は:mixedの部分を退けてあげないと動かないかもです。因みにPythonのサンプルコードが公式にはあったような気がします。

<?php

require_once "tw-config-v2.php";
require_once "vendor/autoload.php";

use Abraham\TwitterOAuth\TwitterOAuth;

class tw
{
    public $connection = null;
    public $media = null;
    public function __construct()
    {
        $this->connection = new TwitterOAuth(APIKEY, APISECRET, ACCESSTOKEN, ACCESSTOKENSECRET);
    }

    /**
     * イメージのエンドポイントを取得する v1.1 そのうち廃止されそう。
     * @param $imageName
     * @return boolean
     */
    public function getImage($imageName = null): bool
    {
        if (empty($imageName)) {
            return false;
        }
        $this->media = $this->connection->upload('media/upload', ['media' => "/var/www/html/tw/tmp/images/$imageName"]);
        return true;
    }

    /**
     * イメージ付きでツイート。
     * @param $text
     * @return mixed
     */
    public function tweet($text = null): mixed
    {
        if (!empty($text) && isset($this->media->media_id_string)) {
            $param = [
                'text' => $text,
                'media' => [
                    'media_ids' => [
                        $this->media->media_id_string
                    ]
                ]
            ];
            $this->connection->setApiVersion('2');
            return $this->connection->post('tweets', $param, true);
        }
        return false;
    }
}

if($argv[0]){
    $tw = new tw();
    if($tw->getImage("php2023.png.webp"))
    {
        $tw->tweet("これはテストです");
    }    
}

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

argv, bool, connection, construct, empty, getImage, isset, media', mixed, PARAM, qiita, quot, quot;vendor, return, tmp, tw, Tweet, use AbrahamTwitterOAuthTwitterOAuth, イーロン, サジカゲン,

ContactForm7で現在ページのURLを送る方法。 #カスタマイズ

2023.05.27

Logging

おはようございます。ContactForm7で現在ページのURLを送る方法です、全ての記事の下にお問い合わせフォームを設置している人はあまりいないかもしれないけれど。そのあまりいない人の一人です😂。

記事の下にショートコードを設置するにはプラグインを自作するか、テンプレート内に埋め込むかどちらかだと思います。自分は前者のプラグインを自作してショートコードを埋め込んでいます。

ショートコードを埋め込むコードはこんなコードです。

<?php
do_shortcode('[contact-form-7 id="XXXX" title="comment"]')

これで全記事にショートコードを埋め込むことが可能ですがこれだけでは動きません。こんな感じのプラグインを作ってみてください。プラグインの設置方法などはググって下さい。

<?php
/*
  Plugin Name: comment-add
  Plugin URI:
  Description: 記事の下にアドセンス広告などを貼り付けるのに使用
  Version: 1.0.0
  Author: @zip358com
  Author URI: https://www.zip358.com
 */


function comment_add($content)
{
    if (is_single() && 'post' == get_post_type()) {
        $content = $content.do_shortcode('[contact-form-7 id="xxxx" title="comment"]');
        return $content;
    } else {
        return $content;
    }
}
add_filter('the_content', 'comment_add');
remove_filter('the_content', 'wpautop');

これだけでは、どのページから問い合わせしたのか分からないので、名前などの入力欄以外に入力欄を設置します。次に設置したそのNoを控えて下さい。

<script>
//Contact Form 7 現在ページのURL
if(document.querySelectorAll("[name='text-564']")){
    [...document.querySelectorAll("[name='text-564']")].forEach(elm=>{
        elm.setAttribute("type","hidden");
        elm.value = decodeURIComponent(location.href);
    });
}
</script>

上記のコードを</body>タグ直前に設置してください。設置後、text-564を控えたNoに変更シテクダサイこれで設置が完了です☹。

⚠ContactForm7のメール送信欄にも控えたNoを設置してください。これで完了です!!
最後に送信のご確認を忘れずに😐。

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

add_filter, body, comment-add, decodeURIComponent, description, document.querySelectorAll, elm, else, foreach, hidden&quot, lt, php, php do_shortcode, quot, remove_filter, return, setAttribute, title, Version, wpautop,

php:トレイトって言うよりclassの中でuseを使用。

2023.05.19

Logging

おはようございます、php:トレイトって言うよりclassの中でuseを使用する方法って言った方がわかり易いのかも知れません。詳しい説明は公式を参照して下さい。コード例とtraitの説明を書いときます。

トレイトは、PHPのようなプログラミング言語でコードを再利用するための仕組みのひとつです。通常、プログラムではクラスを使ってコードを組み立てますが、トレイトを使うことで、異なるクラスに属するメソッドのグループを独立したクラスとして再利用することができます。これにより、単一継承という制限を緩和することができます。トレイトを使うことで、多重継承やMixinといった問題を回避することもできます。

トレイトはクラスと似ていますが、トレイトは単に機能をまとめるためのものです。トレイト自体のインスタンスを作成することはできません。トレイトを使うことで、従来の継承に機能を追加するだけでなく、クラスのメンバーを水平方向に追加することもできます。つまり、継承しなくてもクラスに新しい機能を追加することができるようになります。

実行サンプル=>https://zip358.com/tool/demo75/

<?php
require_once "hello/hello_class.php";

use hello\Hello;

class Test
{
    use Hello;
    public function main()
    {
        print("-goodbye");
    }
}

(new Test())->main();
<?php

namespace hello;

trait Hello
{
    public function __construct()
    {
        print("Hello");
    }
}

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

class, construct, goodbye&quot, gt, lt, Mixin, namespace hello, php, php require_once, print, quot, quot;hello, quot;Hello&quot, trait, trait Hello, use, use helloHello, トレイト, トレイト自体, 単一継承,

404の画像をno-imageにする#jscode

2023.05.16

Logging

おはようございます、404の画像をno-imageにするコードです。案外簡単なコードですが、これでノーイメージに変換できます。因みに参照した404ページが404のステータスを吐き出していなかったら、このJSコードは機能しません。

if(document.querySelectorAll("img")){
     [...document.querySelectorAll("img")].forEach(elm=>{
        fetch(elm.src).then(response=>{
            if(!response.ok){
                elm.src = "no_image1.gif";
            }
        });
     });
}

因みに自分のブログサイトもこんな感じのコードを埋め込んでいます。これをphp言語で対応すると処理がサーバーサイドになるので重たくなります。こういうのはJSコードで対応するのが個人的には良いと思っています。尚、JSコードとPHPを連動させて表示の有無を行うのも良いかも知れません。

画像URLを参照してレスポンスデータが返ってきます、このレスポンスの変数をconsole.log(response);で表示するとstatusなども返ってきていることが分かると思います。404ステータスだけ何かしたい場合はresponse.statusで判断するともっと厳密になって良いかも知れません。

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

'src', console.log, document.querySelectorAll, elm, fetch, foreach, gt, if, img&quot, no-image, quot, response, response.ok, response.status, status, then, サーバーサイド, ブログサイト, レスポンス, 変数,

ブルータス、お前もか?古代の暗号シーザー。 #phpcode

2023.04.30

Logging

おはようございます。古代にも暗号というものがあったらしい。古代の人が使っていたシーザーという暗号をPHP化しました。demo74のページを見ると実行結果が表示されていると思います。

古代にはPCというものが無かったので、これでも解読するのにある程度、時間がかかったんでしょうね。ぱっと見、暗号化されているのは分かるけど瞬時に解読できる人はあまりいなかっただと思います。近年では量子暗号とか、パッと見どころかPCがあっても鍵が無いと解読に途方も無い時間を費やする暗号までありますよね。そう思うと暗号の歴史を辿るのも面白いかもしれないですね。

<?php
function caesarCipher($str, $shift) {
  $result = "";
  $len = strlen($str);
  // 26文字のアルファベットを配列として定義する
  $alpha = range('a', 'z');
  
  for ($i = 0; $i < $len; $i++) {
    $char = strtolower($str[$i]); // 大文字を小文字に変換する
    if (in_array($char, $alpha)) { // アルファベットの場合のみシフトする
      $index = array_search($char, $alpha); // アルファベットの位置を検索する
      $newIndex = ($index + $shift) % 26; // シフト後のアルファベットの位置を計算する
      $result .= $alpha[$newIndex]; // シフト後のアルファベットを結果に追加する
    } else {
      $result .= $char; // アルファベット以外はそのまま結果に追加する
    }
  }
  return $result;
}

// 使用例
$plaintext = "hello world";
$ciphertext = caesarCipher($plaintext, 3);
echo $ciphertext; // "khoor zruog"

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

$alpha, $ciphertext, $len, $newIndex, $plaintext, $shift, caesarCipher, char, echo, else, lt, quot, range, result, return, STR, strlen, シーザー, 小文字, 解読,

ツイッターのDM内容をOpenAI api(chatGPT)で判別しスパムの場合ブロックする。#ソースコード

2023.04.17

Logging

おはようございます、スパムをブロックするソースコードを掲載します。ご自由にご使用いただけばと思っています。これを作ったのは先週の日曜日のことです、TwitterのDMに悩まされていたので何か方法はないかなって思って作ったのがこれです。実際、自分は試しに導入してみたのですが、精度はまずまず良い結果でした。因みに自分は作ったのですが今のところ、使ったのは先週の日曜日だけで未だに手動でブロックしています。使わない理由は大量のスパムが来ているわけではないので、特に問題は無いからです。唯、大量のスパムが来ている人にはそれなりにお役に立てるツールかも知れないです。

ツイッターのDM内容をOpenAI api(chatGPT)で判別しスパムの場合ブロックする。

スパム精度は結構良いです。

使用方法

  • コマンドで実行
php BlockMessage.php spamcheck

使用したComposerのライブラリ

  • TwitterOAuth
  • openai-php/client

phpのバージョン

  • php8.1

前提条件

  • 掲載していないファイルは推測して作ってください。
<?php
require_once "../vendor/autoload.php";
require_once "../tw-config-v2.php";
require_once "../openAI-config.php";

use Abraham\TwitterOAuth\TwitterOAuth;

class BlockMessage
{
    var $connection = null;

    public function __construct()
    {
        $this->twitterConnection();
        $result = $this->getTwitterDM();
        if(!$this->judgmentSpam($result[0])){
            $this->setTwitterBlockedUser($result[1]);
        }
    }

    public function twitterConnection()
    {
        // TwitterOAuthクラスのインスタンスを作成する
        $this->connection = new TwitterOAuth(APIKEY, APISECRET, ACCESSTOKEN, ACCESSTOKENSECRET);
        // APIバージョンを設定する
        $this->connection->setApiVersion('2');
    }

    /**
     * DMを取得する
     * @return array 
     */
    public function getTwitterDM()
    {
        $dm_events = $this->connection->get('dm_events',["expansions"=>"sender_id","user.fields"=>"username,id"]);
        return [$dm_events->data[0]->text,$dm_events->data[0]->sender_id,$dm_events->data[0]->id];
    }
    /**
     * OpenAI APIを使用してスパム判定
     * @param string $text
     * @return false
     */
    public function judgmentSpam(string $text="")
    {
        if (!$text) return false;
        $client = OpenAI::client(OPENAIAPIKEY);
        $result = $client->chat()->create([
            'model' => 'gpt-3.5-turbo',
            'messages' => [
                ["role"=>"system", "content"=>'Your job is to identify spam, please determine if the message is spam or not. If it is spam, please write "This is spam". For non-spam messages, write "OK".'],
                ["role"=>"system", "content"=>'respond to in English.'],
                ['role'=> 'user', 'content' => $text],
            ]
        ]);
        if(preg_match("/(OK)/i",$result->choices[0]->message->content)){
            print "non-spam".PHP_EOL;
            return true;    
        }
        if(preg_match("/(spam)/i",$result->choices[0]->message->content)){
            print "This is spam".PHP_EOL;
            return false;
        }
        return true;
    }

    /**
     * スパムアカウントをブロック
     * @param string $blocked_user_id
     * @return false
     */
    public function setTwitterBlockedUser(string $blocked_user_id = "")
    {
        if (!$blocked_user_id) return false;

        $block_result = $this->connection->post('users/'.MYTWID.'/blocking', ['target_user_id' => $blocked_user_id], true);
        if ($block_result->data->blocking) {
            print 'Blocked user successfully.'.PHP_EOL;
            return true;
        } else {
            print 'Failed to block user.'.PHP_EOL;
            return false;
        }
    }
}
if($argv[1]==="spamcheck"){
    new BlockMessage();
}

https://github.com/taoka-toshiaki/BlockMessage

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

argv, chat, ChatGPT, choices, Client, Composer, connection, construct, getTwitterDM, messages, OPENAIAPIKEY, print, quot, spam, spamcheck, string, Twitter, twitterConnection, TwitterOAuth, vendor,