🏠️Top Page

🖊️おもしろき こともなき世をおもしろく 住みなすものは 心なりけり.

⏩️高知県の地方通貨ジモッペイに対応したら恐らく使う人増えると思うこと.

おはようございます、高知県の地方通貨ジモッペイに対応したら恐らく使う人増えると思うことを書いていきます.1.JR四国とタイアップ、2.とさでん交通とタイアップ、これらが出来れば間違いなく使う人が増えると思います.

特にとさでん交通とタイアップは出来そうな気もします.ジモッペイでとさでん交通を乗れるように慣れば結構便利だなって思います.そもそもとさでん交通のicカード「ですか」のチャージがとても不便です、チャージ出来る場所も限られていたり、スマホ板「ですか」も無いので高知県人でも限られた人しかicカードを持ってない気がしています.

なので、ジモッペイにシステム作ってもらったら、どちらもウィン・ウィンになるのではないかと思います.

JR四国とのタイアップが出来れば良いのだけども恐らく難しいと思うので、まずはとさでん交通さんとタイアップして頂きたいです.

ちなみにジモッペイ使ったことがないです、間違いなくとさでん交通さんとタイアップしたら自分のスマホにジモッペイを入れます!

明日へ続く

⏩️お知らせ.ブログの不具合をコンプリートしました.

おはようございます、ブログの不具合をコンプリートしました.今までほったらかしにしていた、検索結果のページの不具合をこの度修正しました.

どんな不具合が発生していたかと言えば、次頁へ遷移せずシングルページの次頁へ遷移するという不具合です.この不具合は自分のテンプレートを作ってからずっと今まで発生したのを知っていたけど対応を放置していた不具合になります.

ちなみに分かりにくいと思いますが、関数名のポストが複数形に置き換わっただけです...じゃ直ぐに対応出来たのではというご指摘があるかと思いますが案外気が付かないですよ.生成AIに投げてやっと「あっ」と思ったわけです.

人には先入観とかいう物があるけど今のところ、生成AIは機械的なのでそういうミスは指摘してくれます.いやー便利ですよね本当に.

明日へ続く

⏩️万博の来場者数と5月23日以降の予測をバイブコーディングで作ってみました

おはようございます.万博の来場者数と5月23日以降の予測をバイブコーディングで作ってみましたのでコードをシェアします.大阪万博の来場者数はYahooニュースの記事のデータを元にしています、其処から今後の予測を立ててもらいました.

https://zip358.com/tool/EXPO2025-OSAKA-KANSAI-JAPAN

因みに予測は簡易的なものなので、恐らく大きくハズレるとは思いますがそれなりの表が生成されるのが凄いなと思います.生成AIはOpenAIの無料枠を使用してデータと次のデータを元に10月13日までの予測を出力してという指示とJavaScriptやCSSを使用してグラフ化してという指示を出しただけで、コードを書いてくれます.

    const labels = [];
    const allVisitors = [];
    const generalVisitors = [];
    const staffVisitors = [];

    const rawData = [
      ["4/13", 146426, 22000], ["4/14", 70488, 17000], ["4/15", 63719, 16000], ["4/16", 73869, 15000],
      ["4/17", 82692, 15000], ["4/18", 93908, 15000], ["4/19", 108773, 15000], ["4/20", 95524, 16142],
      ["4/21", 99638, 17352], ["4/22", 103729, 17099], ["4/23", 99140, 17795], ["4/24", 108888, 17376],
      ["4/25", 110759, 17591], ["4/26", 122102, 17299], ["4/27", 102015, 16985], ["4/28", 121282, 17465],
      ["4/29", 97559, 17813], ["4/30", 101397, 17621], ["5/1", 105945, 17548], ["5/2", 104805, 17741],
      ["5/3", 120696, 17886], ["5/4", 136805, 16289], ["5/5", 126371, 16804], ["5/6", 76517, 16935],
      ["5/7", 91688, 16932], ["5/8", 105449, 18578], ["5/9", 105782, 19813], ["5/10", 128918, 21373],
      ["5/11", 121667, 18268], ["5/12", 117658, 17856], ["5/13", 123640, 18087], ["5/14", 129527, 17668],
      ["5/15", 129456, 17762], ["5/16", 132817, 17700], ["5/17", 123974, 16464], ["5/18", 117000, 16000],
      ["5/19", 129000, 17000], ["5/20", 125000, 18000], ["5/21", 129000, 19000], ["5/22", 134000, 18000],
      ["5/23", 157000, 18000]
    ];

    rawData.forEach(([date, total, staff]) => {
      labels.push(date);
      allVisitors.push(total);
      staffVisitors.push(staff);
      generalVisitors.push(total - staff);
    });

    const futureDays = 143;
    for (let i = 1; i <= futureDays; i++) {
      const futureDate = new Date(2025, 4, 13 + i); // 4月13日からスタート
      const label = `${futureDate.getMonth() + 1}/${futureDate.getDate()}`;
      labels.push(label);

      // 予測ロジック: 最近5日間の平均にランダムなゆらぎを加える
      const recentGeneral = generalVisitors.slice(-5);
      const avgGeneral = recentGeneral.reduce((a, b) => a + b, 0) / recentGeneral.length;
      const fluctuation = Math.sin(i / 5) * 5000 + (Math.random() - 0.5) * 8000;
      const predictedGeneral = Math.round(avgGeneral + fluctuation);

      const predictedStaff = 18000 + Math.round(Math.sin(i / 7) * 1000);
      const predictedTotal = predictedGeneral + predictedStaff;

      generalVisitors.push(predictedGeneral);
      staffVisitors.push(predictedStaff);
      allVisitors.push(predictedTotal);
    }

    const ctx = document.getElementById('visitorChart').getContext('2d');
    const chart = new Chart(ctx, {
      type: 'line',
      data: {
        labels: labels,
        datasets: [
          {
            label: '来場者数(合計)',
            data: allVisitors,
            borderColor: 'rgba(75, 192, 192, 1)',
            backgroundColor: 'rgba(75, 192, 192, 0.1)',
            borderWidth: 2,
            tension: 0.3,
            fill: true
          },
          {
            label: '一般来場者数',
            data: generalVisitors,
            borderColor: 'rgba(255, 159, 64, 1)',
            backgroundColor: 'rgba(255, 159, 64, 0.1)',
            borderWidth: 2,
            tension: 0.4,
            fill: true
          },
          {
            label: '関係者数',
            data: staffVisitors,
            borderColor: 'rgba(153, 102, 255, 1)',
            backgroundColor: 'rgba(153, 102, 255, 0.1)',
            borderWidth: 2,
            tension: 0.4,
            fill: true
          }
        ]
      },
      options: {
        animation: {
          duration: 1500,
          easing: 'easeInOutQuart'
        },
        responsive: true,
        scales: {
          y: {
            title: {
              display: true,
              text: '人数'
            }
          },
          x: {
            title: {
              display: true,
              text: '日付'
            },
            ticks: {
              maxRotation: 90,
              minRotation: 45,
              maxTicksLimit: 50
            }
          }
        },
        plugins: {
          legend: {
            position: 'top',
          },
          title: {
            display: false
          }
        }
      }
    });

これは脅威だなって思う人もいると思いますが、自分は便利だなって思う方です.今後、数年でエンジニア職を奪われかねないという懸念もありますが、コード書きは無くならないじゃないかなって思う方です.理由は修正しないといけない事が必ず起きる事.動作はするが予期しない動作が発生した場合、素人には対応できないため.

未来は人が描いている斜め上の未来になる事が多く、どう転ぶかは「神のみぞ知る」だと思います.なのであまり脅威に思わずそうなった時に対応するというスタンスで良いのかなと.

明日へ続く

⏩️デジタルアドレスAPIのコードを書いてみました.書いたのは

おはようございます.デジタルアドレスAPIのコードを書いてみました.書いたのは生成AIだけど一度で上手く正しいコードが生成出来たわけではなくて二、三回の指示出しを行って下記のコードが生成されました.

デジタルアドレスのAPIを使用するには企業もしくは個人事業者で屋号を登録されている方でないとAPIのアカウント登録は今のところ出来ないので、自分はリファレンスと生成AIが出力したコードを見て恐らく正しく処理されるだろうと思ったのでgist.githubに公開しました.

尚、引数にIPアドレスを渡さないといけない所があるけれど、これはサーバーのIPアドレスになります.


<?php

class JapanPostAPIClient
{
    private string $clientId;
    private string $secretKey;
    private string $clientIp;
    private ?string $accessToken = null;
    private ?array $lastResponse = null;

    public function __construct(string $clientId, string $secretKey, string $clientIp)
    {
        $this->clientId = $clientId;
        $this->secretKey = $secretKey;
        $this->clientIp = $clientIp;
    }

    public function authenticate(): self
    {
        $url = 'https://api.da.pf.japanpost.jp/api/v1/j/token';
        $data = json_encode([
            'grant_type' => 'client_credentials',
            'client_id' => $this->clientId,
            'secret_key' => $this->secretKey
        ]);

        $headers = [
            "Content-Type: application/json",
            "x-forwarded-for: {$this->clientIp}"
        ];

        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

        $response = curl_exec($ch);
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($httpcode !== 200) {
            throw new Exception("Token request failed with status {$httpcode}: {$response}");
        }

        $responseData = json_decode($response, true);
        $this->accessToken = $responseData['token'] ?? null;
        $this->lastResponse = $responseData;

        return $this;
    }

    public function searchCode(string $searchCode, array $params = []): self
    {
        if (!$this->accessToken) {
            throw new Exception("Access token is not set. Please call authenticate() first.");
        }

        $defaultParams = [
            'page' => 1,
            'limit' => 10,
            'choikitype' => 1,
            'searchtype' => 1
        ];

        $queryParams = http_build_query(array_merge($defaultParams, $params));
        $url = "https://api.da.pf.japanpost.jp/api/v1/searchcode/{$searchCode}?{$queryParams}";

        $headers = [
            "Authorization: Bearer {$this->accessToken}",
            "Accept: application/json"
        ];

        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($httpCode !== 200) {
            throw new Exception("Search request failed with status {$httpCode}: {$response}");
        }

        $this->lastResponse = json_decode($response, true);
        return $this;
    }

    public function getJson(): string
    {
        return json_encode($this->lastResponse, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    }

    public function getArray(): ?array
    {
        return $this->lastResponse;
    }
}

// 使い方の例:
// $client = new JapanPostAPIClient('YOUR_CLIENT_ID', 'YOUR_SECRET_KEY', 'IPアドレス.xxx.xxx.xxx');
// echo $client->authenticate()->searchCode('1000001')->getJson();

明日へ続く

⏩️いにしえのサイトの変数の命名を直しました.大部分を生成AIに直してもらった.

おはようございます.いにしえのサイトの変数の命名を直しました.大部分を生成AIに直してもらいましたがまだ残ってはいます.因みにいにしえのサイトというのは、このサイトのことを指しています.

生成AIに「変数と関数の命名を直して」と頼むとプログラミングのコードはそのままで変数の命名や関数の命名を直してくれます.

その方法でいにしえのサイトのコードを書き換えて「駆け出し感」は少し消えている感じがします.

命名もそうですがプログラミングには命名規則という物があります.自分はそんな事を知らずにコードを書いてきたのですが、いまやっと命名規則などをちゃんとした職場にいます.

なのですが、今までのなんか癖が抜けきれていない部分があり、ちゃんとしたコードを昔から書いていたらという後悔があります.

最後に命名規則というのは何なのかという人のために命名規則をわかりやすく書いているQiitaの記事を載せておきます.

明日へ続く

⏩️投稿時間を6時から7時へシフトしました.通勤時間帯に.

おはようございます.今までは6時投稿だったのだけど通勤時間帯にシフトしました、今まで6時にしていたのは、競合を避けて投稿していた感じになります.その昔まえは9時投稿にしていました.9時に投稿していた理由は仕事の関係者に記事を読まれたくなかったので、仕事が始まる9時に予約投稿していた形になります.

前置きはこれぐらいで本題、7時にシフトしたことを書いていきます.7時にシフトした事により微量にアクセス数が増えるのかも知れないという淡い期待もあります.

理由はSNSなどと連動しているので、通勤時間帯で電車やバスで通勤しているひとの目に止まりそうな気がしています.

今までより競争相手は多いもののユーザー傾向から言えば、その層が一番多いので期待もあります.もし上手く行かなったら「しれっ」と元の時間帯に戻しているかも知れません.

明日へ続く

⏩️Noteは飽和しているのでなかなか難しそうですね.

おはようございます.Noteに2記事書いてみたのだけどもアクセス数は一桁台でした、これからユーザーを増やして収益化に繋げる道のりは遠そうだと判断したので一時停止するつもりです.

そしてNoteはもう生成AIで書かれた記事が無数にあり、もう人の書いた記事にたどり着くのが難しそうな状態になっていますよね.

記事が無数にあるということは競争相手が多くて、利益が薄まる傾向にあるのである一定の収入を得たい人には向かないプラットホームになっているように思えます.

ではブログはどうかと言えば同じだと思うだけど、Noteと違うところと言えばブログでレンタルサーバーなどを借りて運用している人は、カスタマイズ出来るので個性的なページが作れたり他のSNSへの連携などもしやすいし、投げ銭を募ることも可能なので結果、ブログの方が良い気がしている.

AI検索時代になった場合、どうなるのかが自分は見通せていないけど、ひとつ言えることは後発は厳しいということです.

明日へ続く

⏩️Gさんが検索からAI検索へシフトした.これからどうなるですかね.

おはようございます、Gさんが検索からAI検索へシフトしました、米国ではAI検索が出来るようになっているそうです、順次、米国以外の国でもAI検索に置き換わっていくと思います.

そうなると間違いなくブログなどの情報提供を主に行っているサイトは影響を受けてくると思います、逆に掲示板など双方のサービスを提供しているサイトは影響を受けにくいと思います.

要するに、そのサイトを訪問して始めて意味があるサイトはいままで通りだと思います.なのでショッピングサイトなどはそれほど影響を受けることは無さそうです.そのうちAIが代行してショッピングサイトで購入するのが当たり前になると、AIフレンドリーなサイトが有利になりそうです.

ブログはこれからは前以上に新しい価値や情報を提供していかないと厳しくなってきそうですね.もしくはその人が書いているから見に行くといった、人の感情を揺さぶる何かがブログにないと難しいと思います.

日本でGさんのAI検索が動き出すまでには、少し先になると思いますので米国でどうなったかという事を収集してこれからの対応をするのが企業の課題になりそうですね.

明日へ続く

⏩️AIでは作れないものの例えばこの人の職業は今後数十年は安泰だと思いました.

おはようございます、AIでは作れないものの例えばこの人の職業は今後数十年は安泰だと思いました.下記のような職業は全然、AIの影響は受けていないと思います.こんな感じでリアルで何かを創作する人達はあまり影響を受けないかと思います.

今から影響を受けてくるのは、エンジニアやデスクワークの方々なんですよ、これ結構な勢いで置き換わっていくと思います.いままでエンジニアしか出来なかったプログラミングの職業もAIを使用してちょっとしたアプリなんかを作れるようになって来ています.

いわゆるバイブコーディングという奴です.でもこれを修正することは素人には難しいので、結局のところプログラミングの素養が必要みたいです.いま一番影響を受けているのはデジタルなクリエイターだと思います.

ちょっとお金を支払えばAIでかなり良い物が作れるようになってきて...正直なところこれから大変になってきそうです.殆どのユーザーが生成AIで良いと思ったらそれはカナリ辛いものだと思います.

因みに何故、日本はAI生成の影響を受けにくいかといえば、生成AIの操作するユーザーインターフェースが英語で表記しているからなんだと思います.ここを取っ払うことが出来てくると浸透してくると自分は思っています.

AIで作ったものが溢れてきてしまうのは時間の問題なのかも知れない.

これからはリアルで創作するか、もしくはAIを上手く使用してモノづくりするべきなのかもと思います.

明日へ続く

⏩️トランプ大統領の2025年からの任期をカウントするJSコードです.

おはようございます.トランプ大統領の2025年からの任期をカウントするコードです.まだまだトランプ政権は始まったばかりなんですが、もう自分としてはあんま嬉しい気持ちはしていません.いま儲かっているのはデイトレードを行っている人達かも知れないです.

// トランプ大統領の2025年からの任期をカウント
const termStart = new Date('2025-01-20');
const termEnd = new Date('2029-01-20');
const today = new Date();

const totalTermDays = Math.floor((termEnd - termStart) / (1000 * 60 * 60 * 24));

if (today < termStart) {
  console.log('任期はまだ始まっていません。');
} else if (today > termEnd) {
  const servedDays = totalTermDays;
  console.log('任期は終了しています。');
  console.log(`トランプ大統領は ${servedDays} 日間、在任しました。`);
} else {
  const servedDays = Math.floor((today - termStart) / (1000 * 60 * 60 * 24));
  const remainingDays = Math.floor((termEnd - today) / (1000 * 60 * 60 * 24));
  console.log(`任期中です。(${today.toISOString().split('T')[0]} 現在)`);
  console.log(`在任日数: ${servedDays} 日`);
  console.log(`残り日数: ${remainingDays} 日`);
  console.log(`任期全体の日数: ${totalTermDays} 日`);
}

秒でウクライナとロシアの戦争を止めると言っていたのに、泥沼化しています.トランプさんになってからアメリカは前より酷くなったのではとか思っていますが、アメリカ国民は満足しているのでしょうか🤔.

知らないけれど、結構たいへんそうな気がしています.

明日へ続く