🏠️Top Page

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

⏩️さくらのAI Engine(API)をPHP言語で叩いてみてないコード(たぶん動く)

おはようございます.さくらのAI Engine(API)をPHP言語で叩いてみてないコード(たぶん動く)を記事の最終行ぐらいに記載しています.使用したい方はご自由お使い下さい.

さて、いま自分はPHP言語よりPython言語やTypeScript言語に興味があります.TypeScript言語は実務でも見る機会は増えています.ほぼ生成AIで出力したコードを見るのでいきなり中間層が書いたコードを見ることになります.

コードにはレベルがあります、初心者の方がいきなり中間層のコードを見ると何を書いているのか、恐らく分からないという問題に直面します、よって生成AIで出力されたコードが呪文のように見えるのです.

コードを理解するにはコードを読む力やコードを書く力をやっぱ付けないといけないと思います.これからプログラマーになろうと思っている方は、いきなり中間層のコードを目の当たりすると思います.なのでプログラマーという職は非常に狭き門になっていく可能性があります.

この頃、自分は実務でプログラムコードをほぼ書いていない日が続いています.コードを書かない代わりにCLI(プロンプト指示して)がコードを書いています.出力されたコードを確認してテストしてプルリクという感じの日々です.

そういう訳なのでツヨツヨエンジニアさんしか中々厳しい時代になってきたなと思います.

では、AI Engine(API)をPHP言語で叩いてみてないコード(たぶん動く)を下記に添付します.

<?php

/**
 * Sakura AI Chat Completion APIと連携するためのクラス(さくらのAI Engine)
 */
class SakuraAiChatClient {
    private string $apiBase = "https://api.ai.sakura.ad.jp/v1/chat/completions";
    private string $token;
    private string $defaultModel = "gpt-oss-120b";

    /**
     * コンストラクタ
     *
     * @param string $token さくらのAI Engineの認証トークン
     */
    public function __construct(string $token) {
        $this->token = $token;
    }

    /**
     * チャットコンプリーションAPIを呼び出す
     *
     * @param string $query LLMに送るメッセージ(クエリ)
     * @param string|null $model 使用するモデル名(nullの場合はデフォルトモデルを使用)
     * @return string LLMからの応答メッセージの内容
     * @throws Exception APIリクエストまたはJSONデコードに失敗した場合
     */
    public function getCompletion(string $query, ?string $model = null): string {
        $model = $model ?? $this->defaultModel;

        $headers = [
            "Content-Type: application/json",
            "Authorization: Bearer " . $this->token,
        ];

        $messages = [
            ["role" => "user", "content" => $query]
        ];

        $data = [
            "model" => $model,
            "messages" => $messages
        ];

        // cURLを使用してPOSTリクエストを送信
        $ch = curl_init($this->apiBase);
        if ($ch === false) {
            throw new Exception("cURLの初期化に失敗しました。");
        }

        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 実行結果を文字列で返す

        $response = curl_exec($ch);

        if ($response === false) {
            $error = curl_error($ch);
            curl_close($ch);
            throw new Exception("APIリクエストエラー: " . $error);
        }

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

        if ($httpCode !== 200) {
            // エラー応答の場合
            throw new Exception("APIエラーが発生しました。HTTPステータスコード: " . $httpCode . " 応答: " . $response);
        }

        // JSON応答をデコード
        $responseData = json_decode($response, true);

        if (json_last_error() !== JSON_ERROR_NONE) {
            throw new Exception("JSONデコードエラー: " . json_last_error_msg() . " 応答: " . $response);
        }

        // 応答からメッセージの内容を抽出
        if (isset($responseData["choices"][0]["message"]["content"])) {
            return $responseData["choices"][0]["message"]["content"];
        } else {
            throw new Exception("API応答からメッセージの内容を取得できませんでした。応答: " . $response);
        }
    }
}

明日へ続く

⏩️夢がある.数年前はネットには夢があった、では今は?

おはようございます.夢がある数年前はネットには夢があった、では今は?今でもネットには夢があると思う、昔よりも夢があるとくにIT技術者は一人や少人数でも開発が出来るようになったと思っています.

お金があれば全自動で24時間トライ・アンド・エラーを繰り返してシステムを作ってくれる強い味方が登場している.例えばClaudeなどのAIエージェントを複数、github上で動かすことでシステムを構築してくれる時代になった.

これは凄いことだとも思います、そしてとてもチャンスなことだとも思います.どんな企業でもAIを導入することで優秀な生産物を出力してくれるという事はアイディア次第でいきなりユニコーン企業にさえなれてしまうという事.

生成AIが登場して初期の頃は使えないなどという人もいたと思いますが、いまの生成AIは無料でも結構、いやかなり役に立つ相棒です.

ちゃんとした回答や期待した答えを示さないのは指示する側の問題が多いと自分は思っています.それなりに技術知識が必要になります、それを知らない場合の指示と知っている人の指示では大きく回答結果が変わってきます.

なので知識は必要.また人工知能の生産物が良いものなのかどうかなどを判断するのは人の役割.夢がある代わりに人工知能は人の労働時間を奪っていっているし雇用を奪っていっている事は明らかだけど、それでもネットには夢があると思う.

明日へ続く

⏩️15年ぐらいのパソコンで生成AIは果たして動くのか?

おはようございます.15年ぐらいのパソコンで生成AIは果たして動くのか?試してみた結果、ギリ動くという事が分かったのだけど、全く持って使えないという事も判明しました.プロンプトを投げて、最初の一文字が返ってくるのに3分かかりその後1文字ずつ30秒毎に表示されていくのでレスポンスが全て完了するのに10分ぐらいは軽くかかります.

これでは使えないので現行のパソコン環境にモデルを落としてきて、プロンプトを投げた結果.1分ほどで全文のレスポンスが返ってきました、これなら使い物になるなと思う反面、仕事中に裏で動かすのは負荷的に如何なものかと思ったり...

生成AIモデルを使って何をしようとしているかと言えば前回記載した通り、自分が之まで書いてきた記事を要約して紹介文としてレスポンスで返してもらう、その紹介文を使用してXやその他のSNSにポストするような仕組みを作ろうとしています.

その前段階としてローカルパソコンで動作可能かどうかを先日の休みに試していました.因みに試したソースコードを貼っときますね.動かすには事前にCUDAを入っている事とモデルを落としてきている事などが必要です(Windowsの場合).

import sys
from llama_cpp import Llama
from jinja2 import Template

# Windowsターミナルで文字化け対策
sys.stdout.reconfigure(encoding="utf-8")

# モデルロード
model_path = "models/Meta-Llama-3-8B-Instruct.Q5_0.gguf"
llm = Llama(model_path=model_path, n_gpu_layers=-1, n_ctx=600)

# 対話ログ保存ファイル
log_file = "chat_history.txt"

# jinja2テンプレート
chat_template = """{% set rule = "ルール: 以下の会話では必ず日本語で回答してください。" %}
{{ bos_token + '<|start_header_id|>system<|end_header_id|> ' + rule + '<|eot_id|>' }}
{% for message in messages %}
    {% set content = '<|start_header_id|>' + message['role'] + '<|end_header_id|> ' + message['content'] | trim + '<|eot_id|>' %}
    {{ content }}
{% endfor %}
{% if add_generation_prompt %}
    {{ '<|start_header_id|>assistant<|end_header_id|> ' }}
{% endif %}"""

print("=== 日本語対話モード ===")
print("終了するには exit と入力してください。\n")

messages = []

while True:
    user_input = input("あなた: ")
    if user_input.lower() == "exit":
        print("対話終了")
        break

    # ユーザーの発言を messages に追加
    messages.append({"role": "user", "content": user_input})

    # プロンプト生成
    template = Template(chat_template)
    prompt = template.render(messages=messages, bos_token="<s>", add_generation_prompt=True)

    # モデル呼び出し
    output = llm(prompt, max_tokens=200)
    text = output["choices"][0]["text"]

    # バイト列ならUTF-8変換
    if isinstance(text, bytes):
        text = text.decode("utf-8", errors="replace")

    print("アシスタント:", text)

    # メッセージとして追加(次のやり取りでコンテキスト維持)
    messages.append({"role": "assistant", "content": text})

    # ログに保存
    with open(log_file, "a", encoding="utf-8") as f:
        f.write(f"ユーザー: {user_input}\n")
        f.write(f"アシスタント: {text}\n\n")

明日へ続く

⏩️悲報、PCがガタガタになっている感がある、新しい

おはようございます.久しぶりの悲報です、PCがガタガタになっている感がある、新しいパソコンを来年は買わないといけない気がしています.

買い替えるのにMac Miniでも買おうかなと思ったりしていますが、どのみち買うならMacBookにするべきか、前と同じようにWindowの自作PCにするべきか悩んでいます...

投資信託の金額は崩したくないので現金で何とかしないといけないなって思っていますが悩ましい.まだ動くので固まる原因が分かればその部分だけを代替えすれば良い話なのでそれで来年もいまの自作PCで頑張るという選択肢もあると思います.

恐らくいまの収入の事を考えると、代替えして使い続けるというのが懸命でギリギリまで選択し続けると思ったりしていますが、こればかりは自分の気分にもよるので分からないです.

ともあれ、PCの電源スイッチ部分が壊れたのは見た目ダサいなって.

明日へ続く

⏩️新着記事紹介を電光掲示板2CSSに切り替えました.

おはようございます.気温って徐々に寒くなるのではなくていきなり変わっていくものなのかも知れません、これも温暖化の性なのかも.

さて、「新着記事紹介を電光掲示板2CSSに切り替えました.」の話をしていきます.お気づきかも知れませんがトップページの新着記事紹介を変えました.これにより何得かは分かりませんが以前よりシンプルなトップページになった事は確かかも.

因みに自分はCSSがあまり好きではないのですが、CSSオンリーで電光掲示板を作れたのもChatGPTのおかげです.でも、彼の作った電光掲示板が良いなと思っています.ググっても上位表示しないけど一番、電光掲示板に近いCSSコードだと思います.

そのうち彼の作った電光掲示板CSSに変える可能性はあります.彼のコードを参照して作ってとChatGPTにお願いしても出てくるコードは全く別物ばかりで...呆れ顔.

トイウコトで今回作ったコードはそのうち変えますのでお裾分けです.

<div class="slide">
    <ul>
        <li>ABC TEST</li>
    </ul>
</div>
        @import url('https://fonts.googleapis.com/css2?family=DotGothic16&display=swap');

        .slide {
            margin: 20px auto;
            width: 90%;
            /* スマホでも見切れないように */
            max-width: 600px;
            overflow: hidden;
            background: #000;
            border: 3px solid #111;
            border-radius: 8px;
            box-shadow: 0 0 20px #000 inset;
            position: relative;
        }

        /* LED風ドット背景 */
        .slide::before {
            content: "";
            position: absolute;
            inset: 0;
            background-image: radial-gradient(rgba(255, 255, 255, 0.08) 1px, transparent 1px);
            background-size: 4px 4px;
            background-color: #302f2f;
            pointer-events: none;
            z-index: 0;
        }

        /* スクロールテキスト */
        .slide ul {
            display: inline-block;
            margin: 0;
            padding-left: 100%;
            white-space: nowrap;
            animation: SlideAni 15s linear infinite;
            position: relative;
            z-index: 1;
        }

        /* テキストスタイル */
        .slide ul li {
            display: inline;
            margin: 0 80px 0 0;
            font-size: clamp(10px, 2vw, 16px);
            letter-spacing: 0.1em;
            font-family: "DotGothic16", "Noto Sans JP", "MS Gothic", monospace;
            color: #0f0;
            text-shadow:
                0 0 2px #0f0,
                0 0 5px #0f0,
                0 0 10px #0f0,
                0 0 20px #0f0;
            animation: Flicker 0.2s infinite alternate;
            image-rendering: pixelated;
            /* ピクセル感強調 */
            filter: contrast(180%) brightness(1.3);
            /* LEDっぽく */
        }

        /* 横スクロールアニメーション */
        @keyframes SlideAni {
            0% {
                transform: translateX(0);
            }

            100% {
                transform: translateX(-100%);
            }
        }

        /* チラつきアニメーション */
        @keyframes Flicker {

            0%,
            18%,
            22%,
            25%,
            53%,
            57%,
            100% {
                opacity: 1;
            }

            20%,
            24%,
            55% {
                opacity: 0.7;
            }
        }

        /* --- レスポンシブ対応 --- */

        /* タブレットサイズ */
        @media (max-width: 768px) {
            .slide {
                max-width: 90%;
            }

            .slide ul li {
                margin: 0 40px 0 0;
            }

            .slide ul {
                animation: SlideAni 18s linear infinite;
                /* ややゆっくり */
            }
        }

        /* スマートフォンサイズ */
        @media (max-width: 480px) {
            .slide ul li {
                margin: 0 24px 0 0;
            }

            .slide ul {
                animation: SlideAni 22s linear infinite;
                /* スマホではさらにゆっくり */
            }
        }

明日へ続く

⏩️泣かず飛ばずでも続けていきますのでご心配なく.

おはようございます.泣かず飛ばずでも続けていきますのでご心配なくというタイトル通りYOUTUBEチャンネルは泣かず飛ばずでも続けていきます.第一目標人数まで451人ですが年内までに目標達成出来るかは分からないけど、なんか路線を変えたら伸びていきそうな気もします.

最近アップした動画は3回か4回ぐらいの再生回数ですが、それでも続けていくのは続けていけばなんか掠るかもとか思っているです、何が掠るのかと言えば収益が発生すると思っているからです.

そうそう、この頃NHKの72時間を観ていたらアスペルガー(自閉症)と発達障害を持った人達が出ていてその人達が障がい者手帳を持っていたのを観て、昭和だったら何も困ることなく生きていただろうに.今は障がい者手帳がないと生きにくいのだろうかと思うと何だかモヤッとした気分になりました.

日本って国は全然障がい者に寛容な社会ではないのです.障害になっただけで偏見などもある、そして障害を持っているだけで収入が激減したりして本当に見た目(お喋り上手)重視の社会になってきたなと思うとナカナカ社会の大きな成長はないじゃないかなと思っています.

イノベーションを起こす人は大体社会からはみ出した人なんじゃないかなって思っています、なのでそういう人達の居場所が社会から取り上げると恐らく社会は徐々に沈んでいくと思います.

本当、この頃モヤってしています.

明日へ続く

⏩️ラズパイで温度と湿度をリアルタイムで抽出.

おはようございます.先日の休みに友からお土産を頂き、そして去っていきました.いつも高知へ帰ってきたときはもらってばかりで申し訳ないです.いつ帰るか一言有れば用意出来るのになって思います.

さて、思い立ったが吉日な自分、ラズベリーパイ3B+を持っていて一度温度と湿度の抽出もDHT11で行ったことがあるのですが、その時、原因不明の熱をセンサーが持ちこのまま置いておくのは危ない感じがしたので、以前は辞めた工作です.

それを先日の朝、目が覚めて「なんかもう一度試してみたいな」って事になりDHT22をアマゾンで購入.配線等はこちらのリンクを参照し、プログラムコードはチャッピーに聞いてみてリアルタイムで抽出がものの数分で完成.

Qiitaなどで記述しているコードで上手く行かなかった人向けにこちらにコードとインストール方法を記載しときます.

python3 -m venv dht-venv
source dht-venv/bin/activate
pip install --upgrade pip
pip install adafruit-circuitpython-dht adafruit-blinka
import time
import board
import adafruit_dht

# DHT22 を GPIO4 に接続
dhtDevice = adafruit_dht.DHT22(board.D4)

while True:
    try:
        temperature_c = dhtDevice.temperature
        humidity = dhtDevice.humidity
        print(f"Temp: {temperature_c:.1f}C    Humidity: {humidity:.1f}%")
    except RuntimeError as error:
        print("Retrying:", error.args[0])
        time.sleep(2.0)
        continue
    time.sleep(2.0)
python example.py

なお、リアルタイムの温度と湿度を記事の下に表示するように設定しています.APIサービスを自分で作りそこから受信している感じです.

明日へ続く

⏩️AI検索モードで崩壊寸前なのかも、なので.

おはようございます.あんなにも暑い夏から涼しくなってきましたが冬は平年よりも寒い時期が続くらしいです.冬は好きではないのですが冬が来るのだなって....

さて、AI検索モードで崩壊寸前なのかも、なので何か対策を取らないという思いいろいろと改善しようとこのサイトをテコ入れ策をしています.

会社でSEO対策をしている人は大変な時代になってきたなと思っています.明らかにソーシャルメディアに力を入れている会社じゃないと厳しいかなと特にハウツーサイトはかなりチャット生成AI(人工知能)で打撃になっています.

自分のサイトはプログラムコードなどの記事はだいぶアクセス数が減りました.それに伴い広告収入も激減しました.恐らく直ぐにはアクセス数が戻るとは思えないので、当分の間は収益がスズメの涙程度になることは覚悟して置かないと大変です.

もしこれが会社でSEO対策などをしていた人達は広告宣伝を薦めるか、ソーシャルメディアを薦めるかになると思いますが自分はどちらもそれ程効果はないと思っています.広告を増やしてもそれ程効果はないので顧客の負担が増えるだけです、ソーシャルメディアはボットではそれほど効果はないので人が発信した方が良さそうです.

因みに自分はボットを人が発信したような感じで投稿できるように模索中(開発中)です.たぶん一番それが効果がありそうです.

※自宅PC{人工知能搭載で処理して}からAPIサーバーに投げてそれを投稿するようなそんな形にしようかとそれだと費用は電気代だけです.高価なサーバーでAI動かすや人工知能のAPI費用を支払うよりも安価な方法かと思います.

明日へ続く

⏩️敗者のゲームという本を金高堂で購入

おはようございます.敗者のゲームという本を金高堂で購入して読み進めていますが、これでインデックス投資を始めてみようとか、そういう訳ではなく.本屋さんで立ち読みしていたらなんか読みやすさと共感に惹かれて購入しました.

まだ3章の冒頭までしか読んでいないけど恐らくこの本は本の帯に書かれていること、辛抱強く遂行することで敗者のゲームが勝者のゲームになるだという事を指しているだと思います.

裏帯に書かれていること言葉は内容はコチラ

  1. 将来、いつ何に、どの程度の資金が必要になるか、目標を立てる
  2. その目標を達成するために、必要な積み立て計画と株式・債券の配分比率などの投資の基本方針を決める
  3. 株と債券を幅広く分散する
  4. 投資の基本方針を、ブレずに辛抱強く実行する

上記のことを辛抱強くできる人は必ず勝者のゲームになる事を指していると思っています.

3章まで読んで自分が思ったのは1章あたりで書かれている投資信託も長期スパンで見ると成果が出せていないということだけど、これが書かれたのは1980年(初版)です、そして自分が読んでいる8版は2022年の話どちらも賢いAI(人工知能)が登場していなかった時代の話です.なので、ここに大きな見落としがあるのかもと思っています.

それを除くとチャールズ・エリア氏が述べていることはデータと経験に基づいていて今日でも通用する書になっていると思います.なので素人のデイトレードは市場で殆ど勝てないなどは今も同じ割合になっていると思いますし、またプロでもなかなか厳しい市場だと思うので素人は分散投資を行い辛抱強く長い目で見ることの大事さを懇懇と説いている本だと感じました.

これが3章まで読んだ自分の感想ですが、読了したときには違う思いになっているかも知れません.

明日へ続く

⏩️ブログは必要最低限の広告にしました.

おはようございます.ユニクロさんが秋冬用を変わっていたけど大丈夫かなって思っていたけど、今日はエアコン無しで仕事が出来るような季節になってきましたね.さて、コアなユーザー(読者)さんならお気づきかも知れませんが、広告をかなり削減しました.

広告を削減して良かったことはブログがシンプルになり良かったです、ではデメリット面は何かといえば広告をアフェリエイトに変えたのでクリックしても自分に収益が入らないところです、収益が発生するのは契約を結んだときです(※現時点(2025/09/16)の話です).

なので収益は発生したら大きいのだけど、前のようなアクセス数があればとかクリックしたら収益が発生するのとは大きく違います.断っておきますが、前のような広告も駆動している所はあります例えばこのサイトの自作ツールサービス部分は以前の広告が動いています.

{※注意 Adsに変更しましたので、クリックすると収益が発生します(2025/09/23)}

以前書いたように稼ぎ頭のサービスを閉鎖した時点で収益は激減しました、どれぐらい減ったかというと60%収益が減りました.サービスを閉鎖したらそれぐらい減るのは分かっていたけど閉鎖しました.

ここまで減ったので、もう最低限の広告にしようと決断して今に至ります.広告がいっぱいあるよりシンプルな広告がひとつ有れば良いという考えに至ったのはザッカーバーグ氏などと同じ考えです.

無料で使用して頂いて回転数が上がればその時に広告を貼るという考えです.いま、このブログは毎日50ー60人ぐらいのアクセス数があります.サイトで言えば120超えにはなるのだけどブログはその半分のアクセス数だと思って頂いてOKです.

自分の戦略としてはブログに関しては最小の広告だけにしてリピーターと滞在率を増やして徐々にアクセス数を増やしていこうと思っています.

広告はもしかしたら変わっていくかも知れないけど極力少なくしたいという思いはあります.

話は尽きないですけどここら辺で〆ます、ではまた明日.

明日へ続く