🏠️Top Page

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

⏩️プログラミング絶望ラジオは為になるなぁと思う.

おはようございます.先日の休みは風が強くて飛行機が低飛行で飛んでいたりして少々怖いなーって思いながらプログラミング絶望ラジオを聞きていました.プログラミング絶望ラジオは良いです和むなぁー.

技術的なことはラジオを聞いてもらいたいのでここでは記載しませんが、技術的な話以外で言えば壁にプログラミング絶望ラジオと書いているのだけどこの文字が動くです.これどうやってるだろうというのが凄く気になりました.

壁に緑のシートでも貼っているようでもなさそうなんですけど、上手く動いて消えていくですよ.これどうやって出来るのだろうかというのが、凄く気になりましたね.

「あー」悩ましい謎です.

明日へ続く

⏩️駆け出しエンジニアとつながりたい的なコードを書いてみた.ごっさんです.

おはようございます.下記のコードを知っておくと便利ですよ、フレームワークとかなら使わないかもしれないけども素(えいてぃぶコード)のPHP言語で書くと便利ですね.この頃、素のPHP言語で書くことが無くなりつつあります.仕事ではフレームワークやフロントエンドでもライブラリを使用してコードを書くことが多いですね.たまにバニラJSで書くこともありますが.

<?php
$foo = [
	'name' => '山田 太郎',
	'age' => 25,
	'tel' => '09012341234'
	];
var_dump($foo);
var_dump(array_keys($foo));
var_dump(array_values($foo));

駆け出しエンジニアがもういないよなぁ...コードの土台はAIによって書くことが多くなりプロジェクトの改修時に古のコードを見るようになるだろうなぁ.たまに見かける痛いコードを昔は書いていたなぁと思いつつ、今でも痛いコードを書いていると思った方が良いなって.数ヶ月前に書いたコードが痛いコードに見えるので...まだまだ成長過程かなって思っています.

明日へ続く

⏩️レンダリングのちらつきを無くしました、あとはアップロード際に.

おはようございます.レンダリングのちらつきを無くしました、あとはアップロード際に画質劣化するワードプレスの対応を行えばひとまず、このサイトは改善しないつもりでいます.因みにレンダリングのちらつきがどのような時に発生するかと言えば、背景色の切り替えを行っているところです.

ベースは黄緑色の背景色にしているのですがJSで背景色の切り替えが出来るようにしています.切り替えると切り替えた色をローカルで持つって再度訪問された時に切り替えた色にJSでレンダリングしていたのですが、その時にちらつきが発生していました.

理由は分かっていたけど今の今まで放置していました.切り替えて使っているユーザーがどれぐらいいるのか把握していなかっただけど、自分は背景色を黒にしているのでやっぱ気になるという事で先日の休みを使用して切り替えました.

フロントエンドな作り例えばヘッドレスCMS等で作っていたら色の切り替わりを行っても何らちらつきとは無縁ですがね.今回はかなりベターな対応をしたのだけど、もっと良い方法はないかと思っています.

明日へ続く

⏩️なんか知らんけど、僕のことを分かったふうに言うな.

おはようございます.キャッチフレーズが絶妙です.朝方、自分のタイムラインに流れた広告、この頃、クレカのCM多いですがお金に困っている訳では無いのだけども...いや困っているけど大きな借金があるわけではないですよと断っときますね.

「あの」さんはいじめられていたというのは分からんでもない、ちょっと変わっている存在なんだと思う、自分もなんか未だに人と馴染めないので「あの」さんのCMに流れるセリフが好きですね.多分、価値観が人とずれているだと思うから「あの」さんの言葉がささる人にはささるだと思います.

もう40過ぎているけど脳内が年齢と一致しない.社会的にはこうあるべきという像があるだと思いますが、そこから自分は大きくズレが生じていて、いろいろと社会的に生きにくい.同年代を見てみると大人な人が多いと感じる.それが普通なんだと思うだけども....

自分はそういうのを見てあんま面白く感じない.大体の人は40代にもなると普通の人はブログやSNSをしなくなる人もいるようです.それを続けている人は昭和的な考えではないこと言わなくてもわかると思う.

明日へ続く

⏩️8番出口を観に行こうか迷っている.怖いもの見たさ.

おはようございます.映画、8番出口を観に行こうか迷っている.怖いもの見たさってのもありますが、川村元気さんが手掛けたり関わった作品は当たる確率が増えそうな予感がします.そして川村元気さんと二宮さんという掛け合わせもヒットしそうな気もしますが、観に行こうかどうか迷っています.

理由はこういうのって怖いもの見たさ的な要素で中身がないような気もしますし、尚且つあまり恐いの好きではないという理由ですね.落ちは何となく映画キューブみたいな落ちだろうなって思ってしまって、、、という感じで悩んでいます.

それなりに高評価だったら観に行こうかなという感じで今のところ未定です.因みに上映は2025年の8月29日です.

それにしても二宮さん福耳ですね...今ごろ気づいてしまった.

明日へ続く

⏩️ユーチューバーの成功への道は険しい、可視化してみました.

おはようございます.ユーチューバーの成功への道は険しいですね、1000人以上の割合は13%ぐらいだそうです、狭き門だなって正直思いました.因みに自分は一部AIのちからを借りている動画があるので1000人以上になっても恐らく収益は5000円ぐらいじゃないかと思っています.

道半ばでYOUTUBERを諦める人の気持ちがわかります、馬鹿みたいに毎日UPしていてもチャンネル登録者数は増えそうにない、それなりに戦略やニーズに答えていかないと難しいと思います.中身のない内容を毎日UPしても難しいでしょうね.

先日、YOUTUBEを頑張りたいと記載したばかりだけど、心が折れそうな現実をみてしまった...

因みに表などを詳しくみたい人はこちらを参照してください、今回Geminiを使用してウェブ解析した資料になります.

明日へ続く

⏩️映画、Fukushima 50(フクシマ フィフティ)を観ました.

おはようございます.映画、Fukushima 50(フクシマ フィフティ)をネトフリで再度観ました.いろいろと考えさせられる内容だった.これを見ると南海トラフ巨大地震が発生したときに愛媛県にある伊方原発は大丈夫なのかという事が脳裏に過ぎりました.調べてみると伊方原発は津波10メートルまで耐えれるということらしい、もし仮に南海トラフ巨大地震が発生したとしても伊方原発の方には4.5メートルの津波しか来ないとの事.

なので福島の原発事故(災害)のような事は発生しないという事らしいのだけども、福島の原発も10メートルを超える津波は来ないという想定でしたが、東日本大震災時には10メートルを超える津波が押し寄せてきたわけです.

想定外のことが起こるかもという事を考えて設計していない、これが事なかれ主義な国のすることだなと...今では原発反対という人も減ってきているけれども映画フクシマフィフティを観ると島国の日本で原発を稼働させるのはリスクの方が大きいと思います.

これから将来の起こることを考えるとクリーンな発電所を増やしていくべきなのではないのかと・・・.

本当に映画は事実に基づく映画なので、ただただ大変な思いをした現場の方々には何も言えないですよ.後手後手の東電の対応や政治家などに不信感を抱いた自分がいました.実際は、それぞれ懸命に頑張っていたと思いますが、、、、.これが日本という国なのかも知れないですね.

明日へ続く

⏩️ワードプレスのテーブルwp_postsデータを取ってきてLaravelで表示.

おはようございます.ワードプレスのテーブル(wp_posts)データを取ってきて別サイト(Laravel)にて表示してます.別サイトには広告が付かない感じです.因みにデータは自サイトのブログデータを使用していますが随時去年あたりのデータから取得するようにSQLに記述しています.

尚、どうやって取得しているかをお話するとSQLのコネクション変更する設定をコンフィグフォルダのデータベースファイルに記述してモデルにもその事を明記しています.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;


class Blog extends Model
{
    protected $connection = 'second_db';
    protected $table = 'wp_posts';
}

そしてそれらを呼び出しているだけです、とても簡単なコードで動いています.そんな感じなのでブレイドのコードをシェアします、流石にコントローラーは見せられないけどYoutubeのリンクやXのリンクは出力する前に置き換えていることをヒントとしてお伝えしときますね.

<!doctype html>
<html lang="ja" class="transition-colors duration-300">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
    <meta name="robots" content="noindex,nofollow" />
    <title>blog - [taoka toshiaki]</title>
    <link rel="icon" href="https://taoka-toshiaki.com/images/g4DV7mRe_400x400.jpg?t=1752317617"
        sizes="16x16 24x24 32x32 48x48 64x64">
    <!-- Prism CSS -->
    <link id="prism-theme" rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@1/themes/prism.css" />
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@1/plugins/line-numbers/prism-line-numbers.css" />
    <link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.css"
        rel="stylesheet" />
    <style>
        body {
            background-color: #f9fafb;
            color: #1f2937;
            transition: background-color 0.3s, color 0.3s;
            word-wrap: break-word;
            overflow-wrap: break-word;
        }

        .dark body {
            background-color: #242425;
            color: #f9fafb;
        }

        article {
            background-color: #fff;
            transition: background-color 0.3s;
            word-wrap: break-word;
            overflow-wrap: break-word;
        }

        .dark article {
            background-color: #3d3d47;
        }

        time {
            color: #6b7280;
        }

        .dark time {
            color: #9ca3af;
        }

        .prose {
            color: inherit;
            word-wrap: break-word;
            overflow-wrap: break-word;
        }

        pre[class*="language-"] {
            overflow-x: auto;
            padding: 1em;
            border-radius: 0.5rem;
        }

        code[class*="language-"] {
            white-space: pre;
        }

        a,
        a:hover {
            border-bottom: solid 2px #fbf81c;
        }
    </style>
    @include('header_script')
</head>

<body class="transition-colors duration-300">

    <div class="max-w-3xl mx-auto p-6">
        <h1 class="text-2xl font-bold mb-6"><a href="/" class="text-current">🏠️Top Page</a></h1>
        <p class="mb-3 font-bold"><a href="/blog">🖊️</a>おもしろき こともなき世をおもしろく 住みなすものは 心なりけり.</p>
        @if (request()->input('page') == 108)
            <a href="/blog" class="text-[54px]">📖</a>
            <h1 class="text-2xl font-bold text-[108px] mb-6">108🧘️</h1>
        @endif

        <button id="darkModeToggle"
            class="mb-6 px-4 py-2 bg-gray-200 dark:bg-gray-700 text-gray-800 dark:text-gray-200 rounded">
            ダークモード切り替え
        </button>

        <div class="space-y-10">
            @foreach ($items as $item)
                <article class="shadow-md rounded-lg p-6 transition-colors duration-300">
                    <h2 class="text-xl font-semibold mb-2 break-words">⏩️{{ $item->post_title }}</h2>
                    <time class="text-sm block mb-4">{{ $item->post_date }}</time>
                    <div class="prose prose-sm max-w-none break-words">
                        {!! $item->post_content !!}
                    </div>
                </article>
            @endforeach
        </div>

        <div class="mt-10">
            {{ $items->links() }}
        </div>
    </div>
    <!-- トップに戻るボタン -->
    <button id="scrollTopBtn"
        class="fixed bottom-6 right-6 hidden bg-gray-600 text-white px-4 py-2 rounded-full shadow-lg hover:bg-gray-700 transition-opacity">
        ▲ 上へ戻る
    </button>
    <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
    <script src="https://cdn.jsdelivr.net/clipboard.js/1.5.13/clipboard.min.js"></script>
    <!-- Prism.jsのコアファイル -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js"></script>
    <!-- Prism.jsのオートローダ -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js"></script>
    <!-- Toolbarプラグインのスクリプト -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.js"></script>
    <!-- その他のプラグインのスクリプト -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/highlight-keywords/prism-highlight-keywords.min.js"></script>

    <script>
        const toggleBtn = document.getElementById('darkModeToggle');
        const prismTheme = document.getElementById('prism-theme');
        const darkThemeHref = 'https://cdn.jsdelivr.net/npm/prismjs@1/themes/prism-tomorrow.css';
        const lightThemeHref = 'https://cdn.jsdelivr.net/npm/prismjs@1/themes/prism.css';

        if (localStorage.getItem('darkMode') === 'true') {
            document.documentElement.classList.add('dark');
            prismTheme.href = darkThemeHref;
        }

        toggleBtn.addEventListener('click', () => {
            const isDark = document.documentElement.classList.toggle('dark');
            prismTheme.href = isDark ? darkThemeHref : lightThemeHref;
            localStorage.setItem('darkMode', isDark);
        });

        document.addEventListener("DOMContentLoaded", () => {
            document.querySelectorAll('pre[class*="lang-"]').forEach(pre => {
                const match = pre.className.match(/lang-(\w+)/);
                if (match) {
                    const lang = match[1];
                    pre.className = `language-${lang} line-numbers`;
                    const code = pre.querySelector('code');
                    if (code) code.className = `language-${lang}`;
                }
            });
            // トップへ戻るボタンの処理
            const scrollTopBtn = document.getElementById("scrollTopBtn");
            window.addEventListener("scroll", () => {
                scrollTopBtn.classList.toggle("hidden", window.scrollY < 200);
            });

            scrollTopBtn.addEventListener("click", () => {
                window.scrollTo({
                    top: 0,
                    behavior: "smooth"
                });
            });
        });

        //全選択ボタンを作成&クラス名付与
        Prism.plugins.toolbar.registerButton('select-code', function(env) {
            var newButton = document.createElement('button');
            newButton.className = 'code-select-btn';
            newButton.innerHTML = 'コードを選択';

            newButton.addEventListener('click', function() {
                if (document.body.createTextRange) { // ms
                    var range = document.body.createTextRange();
                    range.moveToElementText(env.element);
                    range.select();
                } else if (window.getSelection) { // moz, opera, webkit
                    var selection = window.getSelection();
                    var range = document.createRange();
                    range.selectNodeContents(env.element);
                    selection.removeAllRanges();
                    selection.addRange(range);
                }
            });
            return newButton;
        });

        //使用言語表示ボタンを作成&クラス名付与
        Prism.plugins.toolbar.registerButton('show-lang-btn', function(env) {
            var newButton2 = document.createElement('button');
            newButton2.className = 'show-lang-btn';
            newButton2.innerHTML = env.language;
            return newButton2;
        });

        $(function() {
            //各ボタン要素の親要素にクラス名付与
            $('.toolbar-item .code-select-btn').parents('.toolbar-item').addClass('code-select');
        });
    </script>

</body>

</html>

明日へ続く

⏩️Jsonの返却時に便利ですよを貼っときますねと雑煮.

おはようございます.Jsonの返却時に便利ですよを貼っときますね、こう書くのがベストプラクティスなのか分かりませんが便利な時がありますので覚えておいて損はない書き方だと思います.

//Jsonの返却時に便利ですよ👍️
const obj = {
  name: "Taoka",
  age: 25,
  country: "Japan"
};
Object.entries(obj).forEach(([key, value]) => {
    console.log(key,value)
});
//console log ⬇️
//name Taro
//age 25
//country Japan

雑煮ではなくて雑談です、最近?のUPDATEでウィンドウズ11のメモ帳でもマークダウン記法が使えるようになったソウデス.ちょっと驚きました、なんかメモ帳ってウィルスに感染しないぐらい強固なアプリなイメージがあるので、いまのメモ帳は今まで無かったものを拡張していっている感じがしてちょっと心配なイメージが少しあります.

便利になることは良いことですが、拡張していくとバグや脆弱性が発生するので大丈夫かなって思います.マイクロソフト開発陣営は優秀な人だと思いますが、やっぱ心配.

全然関係ない話をもう一つウィンドウズをアップデートしていく内に何だか家のパソコンが熱暴走で...固まりだした.この原因を探ろうとログを見て解決したいと思っています.原因が分かったら記事にしようと思います.

明日へ続く

⏩️チャットワークのAPIを使ってみました.プロンプトでほぼ書いています.

おはようございます.チャットワークのAPIを使ってみました.プロンプトでほぼ書いたコードになります、チャットGPTの無料版にリファレンスのURLリンクとPHPのクラス化、リターンに$thisで返却出来る所は$thisを使用してスマートにコードを書いてと指示を出しました.

出来上がったコードが下記になります.ソースコードは自分の方でモンキーテスト的に動かしてみましたが、ちゃんと動作するようです.

<?php
class ChatworkClient
{
    private string $apiToken;
    private string $baseUrl = 'https://api.chatwork.com/v2';
    private int $retryCount = 3;
    private int $retryDelay = 1000000; // microseconds

    public function __construct(string $apiToken)
    {
        $this->apiToken = $apiToken;
    }

    public function setRetry(int $count, int $delayMicroseconds): self
    {
        $this->retryCount = $count;
        $this->retryDelay = $delayMicroseconds;
        return $this;
    }

    private function request(string $method, string $path, array $params = []): array
    {
        $attempts = 0;

        while ($attempts < $this->retryCount) {
            $attempts++;

            $ch = curl_init();
            $url = $this->baseUrl . $path;

            if ($method === 'GET' && $params) {
                $url .= '?' . http_build_query($params);
            }

            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            $headers = ['X-ChatWorkToken: ' . $this->apiToken];

            if (in_array($method, ['POST', 'PUT', 'DELETE'])) {
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
                curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
                $headers[] = 'Content-Type: application/x-www-form-urlencoded';
            }

            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

            $body = curl_exec($ch);
            $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $error = curl_error($ch);
            curl_close($ch);

            if ($error) {
                if ($attempts < $this->retryCount) {
                    usleep($this->retryDelay);
                    continue;
                }
                throw new RuntimeException("cURL error after {$attempts} attempts: {$error}");
            }

            if ($status >= 200 && $status < 300) {
                return [
                    'status' => $status,
                    'body' => $body ? json_decode($body, true) : null,
                ];
            }

            if ($attempts < $this->retryCount && $status >= 500) {
                usleep($this->retryDelay);
                continue;
            }

            return [
                'status' => $status,
                'body' => $body ? json_decode($body, true) : null,
            ];
        }

        throw new RuntimeException("Request failed after {$this->retryCount} attempts");
    }

    public function setToken(string $token): self
    {
        $this->apiToken = $token;
        return $this;
    }

    public function me(): array
    {
        return $this->request('GET', '/me');
    }
    public function getMyStatus(): array
    {
        return $this->request('GET', '/my/status');
    }
    public function getMyTasks(array $filters = []): array
    {
        return $this->request('GET', '/my/tasks', $filters);
    }
    public function getContacts(): array
    {
        return $this->request('GET', '/contacts');
    }
    public function getRooms(): array
    {
        return $this->request('GET', '/rooms');
    }
    public function createRoom(array $params): array
    {
        return $this->request('POST', '/rooms', $params);
    }
    public function getRoom(int $roomId): array
    {
        return $this->request('GET', "/rooms/{$roomId}");
    }
    public function updateRoom(int $roomId, array $params): array
    {
        return $this->request('PUT', "/rooms/{$roomId}", $params);
    }
    public function deleteRoom(int $roomId, string $action = 'leave'): array
    {
        return $this->request('DELETE', "/rooms/{$roomId}", ['action_type' => $action]);
    }

    public function getMembers(int $roomId): array
    {
        return $this->request('GET', "/rooms/{$roomId}/members");
    }
    public function updateMembers(int $roomId, array $params): array
    {
        return $this->request('PUT', "/rooms/{$roomId}/members", $params);
    }

    public function getMessages(int $roomId, bool $force = false): array
    {
        return $this->request('GET', "/rooms/{$roomId}/messages", ['force' => $force ? 1 : 0]);
    }

    public function postMessage(int $roomId, string $body, bool $selfUnread = false): self
    {
        $this->request('POST', "/rooms/{$roomId}/messages", ['body' => $body, 'self_unread' => $selfUnread ? 1 : 0]);
        return $this;
    }

    public function markRead(int $roomId): self
    {
        $this->request('PUT', "/rooms/{$roomId}/messages/read");
        return $this;
    }

    public function markUnread(int $roomId): self
    {
        $this->request('PUT', "/rooms/{$roomId}/messages/unread");
        return $this;
    }

    public function getMessage(int $roomId, int $messageId): array
    {
        return $this->request('GET', "/rooms/{$roomId}/messages/{$messageId}");
    }

    public function getRoomTasks(int $roomId, array $filters = []): array
    {
        return $this->request('GET', "/rooms/{$roomId}/tasks", $filters);
    }

    public function createTask(int $roomId, array $params): array
    {
        return $this->request('POST', "/rooms/{$roomId}/tasks", $params);
    }

    public function uploadFile(int $roomId, string $filePath, string $message = ''): array
    {
        if (!file_exists($filePath)) {
            throw new InvalidArgumentException("File not found: {$filePath}");
        }

        $ch = curl_init();
        $url = $this->baseUrl . "/rooms/{$roomId}/files";
        $cfile = curl_file_create($filePath);

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-ChatWorkToken: ' . $this->apiToken]);
        curl_setopt($ch, CURLOPT_POSTFIELDS, ['file' => $cfile, 'message' => $message]);

        $body = curl_exec($ch);
        $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        if (curl_errno($ch)) {
            throw new RuntimeException(curl_error($ch));
        }

        curl_close($ch);
        return ['status' => $status, 'body' => json_decode($body, true)];
    }
}

人が今回のコードを書いた場合、早い人でも10分ぐらいはコードを書かないといけないと思います、どんなに早くてもそれぐらいの時間は必要だと思いますが、生成AIはこれを数十秒で書ける訳ですから、確実に時間短縮になります.

なので人工知能が使える現場は間違いなく最初のコード出力は人工知能に任せた方が良いです.特に新規案件の土台は生成AIに任せると開発コストは削減出来ます.

明日へ続く