🏠️Top Page

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

⏩️YOUTUBEはタダ(無料)で買える宝くじ

おはようございます.YOUTUBEはタダ(無料)で買える宝くじとヒロシさんが仰っていた動画をこの頃見て確かになって.これはユーチューブだけではなくブログでも同じことなんだと思います.

ブログもYOUTUBEも飽和気味で過当競争だけども、それでもゼロからイチを生み出せるツールであることは間違いなくてとても夢があると思っています.

そして自分ができる範囲で始められるという所が凄いことだと.

ネットって改めて凄い発明だなと思っています、生成AIがそれを学習して新たなものを生み出せるようになってきたけど、やっぱり人が想像し創作したものには劣る.

劣らないのは要約する技術ぐらいかも知れない.プログラミングの世界にもAIは導入されてきたけど、何か物足りなさがある.土台作りには適していると思うけど、結局、CLIが一番かなと.

ちょっと脱線したけどYOUTUBEやブログはアプリひとつで誰でも始められて平等にチャンスがある、確かにアルゴリズムによってレコメンドが決められている所はあるけれどSNS(ソーシャルメディアサービス)を使うことでそこをカバーしてくれる.

ヒロシさんが言う通りタダで宝くじを買えるのと同じだと.

追伸:アナログ回線、ADSLネット頃からネットをしているけど、今も昔も楽しいのはネットにはチャンスや夢があるからだと思うし何だかんだ言って世界と繋がっていて誰でも世界に発信することが出来るツールだからだと思う.それは人工知能にはない機能だよなって思っています.

明日へ続く

⏩️HTMLをMarkdownに変換する方法、PHP言語編

おはようございます.HTMLをMarkdownに変換する方法、PHP言語編を書いています.これでワードプレスのLLMO対策しています.まず、自分はめんどくさがり屋なので、一からHTML(ハイパーテキストマークアップランゲージ)をマークダウン記法に変えるアルゴリズムを作るのは面倒なので今回は先人が作ったライブラリーを使用します.

composer require league/html-to-markdown

因みにこのライブラリーで変換出来ない、YOUTUBEの埋め込みなどは正規表現で置き換えています.

    // カスタム:YouTube埋め込み対応
    $content = preg_replace_callback(
        '#<iframe[^>]+src="https?://www\.youtube\.com/embed/([^"?]+)[^"]*"[^>]*></iframe>#i',
        function ($matches) {
            $id = $matches[1];
            return "\n[![YouTube Video](https://img.youtube.com/vi/{$id}/0.jpg)](https://www.youtube.com/watch?v={$id})\n";
        },
        $content
    );

このライブラリーの使い方は、こちらのリードミーをご確認ください.人様のコードなのでいつサポートが切れるか分からないですが、当分の間は大丈夫そうな気がしています.もしサポートが非対応になったらフォークしてカスタマイズする方法も残されていますので、あまり気にしていませんが・・・.

一番怖いのはAPIの突然のサービス停止です、これが一番厄介だと思うのでこの頃はAPIサービスは極力使用しないように頑張っていますとは言ってもSNS系はAPIサービスに頼るしかないのが現状ですね.

明日へ続く

⏩️記事の検閲はこの日本でも行われているだろうな.

おはようございます.記事の検閲はこの日本でも行われている、公にはそれは知られてはいない気がしますが.さてネット検閲の厳しい国の代表的な国が中国です、国に文句が言えないらしいぐらい厳しいらしいですね、実際どうなのかは分からないですが.

国の検閲が厳しいものでも他の国に旅行に行くことが出来る世の中です、世界を見ると自分の国がどんな国なのか分かると思います.そして、徐々に世の中は変わっていくと思うので検閲の厳しい国でも変わっていくと思っています.

何故そう思うかと言えば、囚われた国家(映画)のように物事が徐々に動いてくのだろうと思うからです、なので何れ100年、200年と時が経つと世界は大きく変わっていくと思っています.

何故、検閲のことを書こうかと思ったかはこの頃、日本もなんかきな臭い感じがするからです.そうなった時、日本も検閲が厳しくなると思います.

参考までに検閲の情報を添付しときますね.

インターネット検閲が厳しい国は、国際的な人権団体や調査機関が発表する報告書によって評価されています。最新の情報を基に、特に検閲が厳しいとされている国々をいくつか挙げます。

インターネット検閲が特に厳しいとされる国々

  • 中国: 中国は「金盾(グレート・ファイアウォール)」と呼ばれる大規模な検閲システムを運用しており、Facebook、X(旧Twitter)、Google、YouTubeなど、多くの海外サービスへのアクセスを厳しく制限しています。また、言論統制や監視も厳格に行われています。
  • イラン: 反体制的な情報や西側諸国のコンテンツを厳しく検閲しており、特定のウェブサイトやSNSへのアクセスを遮断しています。VPNも頻繁にブロックされます。
  • ミャンマー: 軍事政権がインターネットを厳しく管理しており、SNSの遮断や通信の制限が行われています。
  • ロシア: ウクライナ侵攻以降、特に検閲が強化されました。独立系メディアのウェブサイトやSNSへのアクセスを制限し、政府に不都合な情報を削除するよう事業者に要求しています。
  • 北朝鮮: 一般国民はインターネットに自由にアクセスすることができず、政府が管理する国内ネットワークのみが利用可能です。

これらの国々では、単に特定のウェブサイトをブロックするだけでなく、オンラインでの言論や活動そのものを監視し、ユーザーの権利を侵害するような措置がとられている点が共通しています。

なお、これらのランキングは調査機関によって異なる場合があります。国際的なNGOである「フリーダム・ハウス」や「国境なき記者団」などが毎年発表する報告書は、世界のネット検閲状況を把握する上で重要な情報源となります。

明日へ続く

⏩️この頃、見つけた旅系YOUTUBER{ユーチューバー}

おはようございます.この頃、県外へ旅行行けない日々を過ごしている中、その埋め合わせを旅系YOUTUBE(ユーチューブ)でしています.

ぼっちけい旅系YOUTUBER(ユーチューバー)と言えば、いけちゃんですが炎上中なのでスルーしますが、見せ方は上手いと思っています.

1つ目のチャンネルはこちらAbao Ambienceというチャンネルです.こちら電車旅などやドライブ視点で映している映像がとても綺麗です.

2つ目のチャンネルはMaibaru Travelというチャンネルです.こちらは解説付きの視点でいろいろな観光地を巡っているチャンネルです、こちらも映像がとても綺麗です.


最後に以前、紹介した東京を散策している動画、TOKYO URBAN TRIP & Beyondというチャンネルです.

この3つのチャンネルを流しながら休日はコードを書いています.ではでは~

明日へ続く

⏩️この世界には始まりがないらしいという仮説.

おはようございます.この世界には始まりがないらしいという仮説を何処かの記事で読んだだけど、さっぱり分からないですよね.始まりがないってどういうことみたいな・・・.

無からビッグバンが起こって今の宇宙が誕生したというのも自分は信じがたいですよね.無の向こう側は何なのかと思うとモヤモヤして考えていた幼少期があります.

何も無いのに何故、無から有に転換したのかとか思うとモヤモヤしませんか?そう思うとこの世を作った創造主がいると思うわけですが、その創造主は何処から来たのかという新たなモヤモヤが誕生してしまって、結果永遠のループに陥るので無が正しいのかななどと空想していた事を思い出します.

これを真剣に取り組んでいる人たちもいる訳ですけど、たぶん人間の脳では理解できないこと何だと思っています.

この世界はシュミレーション世界だと言っている人もいます、あながち悪くない話だと自分も思っていたのだけど、この頃はシュミレーションというより創造主の世界の子ども向けのゲームじゃないのかと・・・

まぁともあれ、この世界は不可思議なことだらけですので、あの世も有るのかもなぁと思うようになってきました.

追伸:以前にもそのような事を書いたことがあるのですが...

明日へ続く

⏩️没記事がこの頃多くて自分でも困っています

おはようございます.先日、YOUTUBEにアップした動画が50回再生されていて困惑気味の中の人です.

さて、この頃、没記事がこの頃多くて自分でも困っています、とくに金銭的なモヤモヤを記事にしていると今は話せないなという思いに至り記事を消しています.

技術的な話もやっぱり支障をきたす場合もあるので、之また記事を消したりしています.なので、中々、ネタが無いのが現状ですね.

このブログは10年以上前から始めているのですがデータとしては2014年が最古です、本当はもっと昔から始めているのですが途中で移行時にデータが紛失したりして今に至っている感じですね.

サーバー移行は、年に一度は行っている気がします.今年も何だかんだ言ってサーバー移行しましたから、来年もサーバー移行するじゃないかな?

お金に余裕があればAWSで構築したいのだけどVPS止まりです.AWSの実務経験ゼロですけど、AWSよりVPS知っているという事は結果、AWSの触りはそこそこ出来るという事を理解出来ると思った方が良いと思うですけどね.

そこら辺を人材紹介会社は知っていない気がしています.

話戻しまして技術的なネタは控えているのと金銭的なモヤモヤももう少しすれば話せるようになると思います.それまで技術的な小ネタ等が続くと思います.

明日の記事は今日の記事に近いものにするつもりでいます.では!

明日へ続く

⏩️LLMO対策の前手順として、マークダウン記法を施しました.

おはようございます.LLMO対策の前手順として、マークダウン記法を施しました.シングルページにマークダウン記法のリンクがそれぞれの記事にあると思います.

そのリンクをクリックするとマークダウン記法が表示されます.LLMO設置後、LLMs.txtを設置すれば良いらしいので、そちらも近日中に対応する予定です.尚、この記事がUPされている頃にはLLMs.txtの設置が終わっている気もします.

追伸:LLMs.txtの設置が終わりました、ルートに設置しています.LLMs.txtはマークダウン記法が記載されているURL(リンク)を一行ずつ表示するような形式で良いらしいです.

これをチャッピーさんにプラグインにして貰いましたのでお裾分けです.下記のプラグインを導入すると全記事URL(パラメーター(マークダウン記法と認識させる))が発行されます.

※マークダウン記法したページはご自身で作る必要があります.

<?php
/*
Plugin Name: LLMS URL Exporter (Fixed)
Description: 公開記事のURLをuploads/llms.txt に日付降順で出力します。管理画面のボタンで非同期(AJAX)実行。新規公開時は先頭に追記。
Version: 1.1
Author: taoka toshiaki
*/

if ( ! defined( 'ABSPATH' ) ) exit;

class LLMS_URL_Exporter {
    private $file;

    public function __construct() {
        $this->file = $_SERVER['DOCUMENT_ROOT'] . '/llms.txt';

        add_action( 'admin_menu', [ $this, 'add_admin_page' ] );
        add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_script' ] );

        // AJAX (管理画面からの呼び出し = ログインユーザー用)
        add_action( 'wp_ajax_llms_generate_urls', [ $this, 'generate_urls' ] );

        // 投稿が公開になったとき(状態遷移を監視)
        add_action( 'transition_post_status', [ $this, 'on_transition_post_status' ], 10, 3 );

        register_activation_hook( __FILE__, [ $this, 'create_file_on_activate' ] );
    }

    public function create_file_on_activate() {
        $dir = dirname( $this->file );
        if ( ! is_dir( $dir ) ) {
            wp_mkdir_p( $dir );
        }
        if ( ! file_exists( $this->file ) ) {
            @file_put_contents( $this->file, "" );
        }
    }

    public function add_admin_page() {
        add_menu_page(
            'LLMS URL Exporter',
            'LLMS Export',
            'manage_options',
            'llms-url-exporter',
            [ $this, 'admin_page_html' ]
        );
    }

    public function enqueue_admin_script( $hook ) {
        // 管理画面の当該ページだけに読み込む
        if ( $hook !== 'toplevel_page_llms-url-exporter' ) return;

        // jQuery は管理画面に既に存在
        wp_enqueue_script( 'llms-admin', plugins_url( 'llms-admin.js', __FILE__ ), [ 'jquery' ], '1.0', true );

        wp_localize_script( 'llms-admin', 'LLMS_Ajax', [
            'ajax_url' => admin_url( 'admin-ajax.php' ),
            'nonce'    => wp_create_nonce( 'llms_generate_urls_nonce' ),
        ] );

        // もし外部ファイルを用意しないなら、admin_page_html 内の inline script がフォールバックになります。
    }

    public function admin_page_html() {
        ?>
        <div class="wrap">
            <h1>LLMS URL Exporter</h1>
            <p>公開中の全投稿URLを <code>/llms.txt</code> に日付降順で書き出します。</p>
            <button id="llms-generate-btn" class="button button-primary">全記事URLを書き出す</button>
            <div id="llms-result" style="margin-top:12px;"></div>
        </div>
        <?php
        // フォールバック用のインラインスクリプト(もし外部 JS を作らない場合に有効)
        $nonce = wp_create_nonce( 'llms_generate_urls_nonce' );
        $ajax_url = admin_url( 'admin-ajax.php' );
        ?>
        <script type="text/javascript">
        jQuery(function($){
            $('#llms-generate-btn').on('click', function(){
                var $res = $('#llms-result');
                $res.text('処理中...');

                var data = {
                    action: 'llms_generate_urls',
                    _ajax_nonce: (typeof LLMS_Ajax !== 'undefined' ? LLMS_Ajax.nonce : '<?php echo esc_js( $nonce ); ?>')
                };
                var url = (typeof LLMS_Ajax !== 'undefined' ? LLMS_Ajax.ajax_url : '<?php echo esc_js( $ajax_url ); ?>');

                $.post(url, data, function(response){
                    if ( response && response.success ) {
                        $res.html( response.data.message );
                    } else if ( response && response.data && response.data.message ) {
                        $res.html('エラー: ' + response.data.message);
                    } else {
                        $res.html('不明なレスポンス: ' + JSON.stringify(response));
                    }
                }).fail(function(jqXHR, textStatus, errorThrown){
                    $res.html('AJAX エラー: ' + textStatus + ' ' + errorThrown + ' (status: ' + jqXHR.status + ')');
                });
            });
        });
        </script>
        <?php
    }

    // AJAX ハンドラ
    public function generate_urls() {
        // nonce と権限チェック
        check_ajax_referer( 'llms_generate_urls_nonce', '_ajax_nonce' );
        if ( ! current_user_can( 'manage_options' ) ) {
            wp_send_json_error( [ 'message' => '権限がありません。' ], 403 );
        }

        $args = [
            'post_type'      => 'post',
            'post_status'    => 'publish',
            'orderby'        => 'date',
            'order'          => 'DESC',
            'posts_per_page' => -1,
            'no_found_rows'  => true,
            'fields'         => 'ids',
        ];

        $posts = get_posts( $args );
        $urls = [];
        foreach ( $posts as $pid ) {
            $permalink = get_permalink( $pid );
            if ( $permalink ) $urls[] = $permalink.'?md=1';
        }

        $content = implode("\n", $urls);


        $written = @file_put_contents( $this->file, $content );
        if ( $written === false ) {
            $err = error_get_last();
            $msg = isset( $err['message'] ) ? $err['message'] : '不明な書き込みエラー';
            wp_send_json_error( [ 'message' => 'ファイル書き込みに失敗しました: ' . $msg ] );
        }

        wp_send_json_success( [ 'message' => 'llms.txt に ' . count( $urls ) . ' 件のURLを書き出しました。' ] );
    }

    // 公開判定:状態遷移で publish になったときに先頭へ追加
    public function on_transition_post_status( $new_status, $old_status, $post ) {
        if ( $post->post_type !== 'post' ) return;
        if ( $new_status === 'publish' && $old_status !== 'publish' ) {
            $url = get_permalink( $post->ID ).'?md=1';

            $current = '';
            if ( file_exists( $this->file ) ) {
                $current = file_get_contents( $this->file );
            }

            // 既存の同一URLがあれば削除して先頭へ
            $lines = array_filter( array_map( 'trim', explode("\n", $current ) ) );
            $lines = array_values( array_diff( $lines, [ $url ] ) );
            array_unshift( $lines, $url );

            $new_content = implode("\n", $lines);

            @file_put_contents( $this->file, $new_content );
        }
    }
}

new LLMS_URL_Exporter();

明日へ続く

⏩️ブログをワードプレスからLaravelへ

おはようございます.ブログをワードプレスからLaravelへ置き換えていこうか悩んでいます.チャッピーさんで調べった結果.

WordPress を Laravel に統合またはブログを移行する際に使える「プラグイン」やライブラリについて、おすすめの方法とその特徴を整理してご紹介します。


おすすめの主要アプローチ

1. Corcel

  • WordPress データ(投稿、カスタム投稿タイプ、メタデータなど)を Laravel から直接取得できる Eloquent ベースの橋渡しライブラリです。Composer で簡単にインストールでき、設定ファイルで WP の DB 接続やモデル構成を指定可能です。(WP Engine, GitHub)
  • WordPress を「バックエンド」として活用しつつ、Laravel を「フロントエンド/アプリロジック基盤」として完全に使いたい場合に最適です。

2. WordPress Pete

  • WordPress 側にプラグイン(アプリのように動作)として組み込み、WordPress 管理画面から Laravel との統合を設定できます。試用も可能です。(WP Engine, Aalpha)
  • Laravel 側から WordPress コンテンツを表示・活用したい場合に便利です。

3. Acorn

  • Roots.io が開発したライブラリで、Laravel の Blade テンプレートや Artisan コマンド、マイグレーション機能を WordPress 内で使えるようにします。(Roots)
  • WordPress 内でモダンな Laravel 開発体験(Blade, Artisan, Migration)ができるようになります。例えとして:wp acorn make:controller や Blade テンプレートの活用など。(Roots)

その他のアプローチ・参考情報

  • WordPress REST API を使う方法
    WordPress から REST API 経由でコンテンツを取得し、Laravel 側で API 呼び出しする形もあり。比較的シンプルです。(Laracasts, Codeable)
  • 中ミドル層としての統合
    Laravel をバックエンド、WordPress をフロントエンドに設定し、ログイン機能や API 呼び出しを含めた構成も可能です。(Medium)
  • Reddit 上の意見
    Laravel はあくまで「フレームワーク」であり、WordPress は即使える CMS。ブログ用途中心であれば WordPress のままでも十分との声もあります。但し、October CMS や Canvas のような Laravel ベース CMS を使う選択肢もあります。(Reddit)

比較まとめ

方法特徴・用途
CorcelWordPress DB を Laravel で直接使う。柔軟で強力。
WordPress PeteWordPress 管理画面から簡単に Laravel 連携を設定可能。
AcornWordPress 内で Laravel 開発体験(Blade, Artisan)を実現。
REST APIAPI 経由で疎結合に統合。軽量で保守性あり。
Laravel CMS (Canvas, October CMS)Laravel 上に CMS 機能を構築したい場合に有効。

まとめ

  • 即時利用・簡単統合:まずは WordPress Pete を試してみるのがおすすめ。
  • 柔軟で高性能な連携 を求めるなら、Corcel による直接 DB アクセスが強み。
  • 開発体験の統一(Blade や Artisan を WordPress 内で使いたい場合)は Acorn が魅力的です。
  • 軽めの統合・API中心構成 を望む場合は、REST API を使ったアプローチも便利です。

という結果が返ってきたわけですが、一番妥当なのはCorcelかなと思っています、ただ、本当に移行するかは結構大変な感じがします.移植すれば後々、いろいろと出来ることが広がるかなと思っています.フロント側をvue(ビュー)かReact(リアクト)に変更するにしてもメンテは楽になりそうな予感もします.

悩ましいですね...

明日へ続く

⏩️人工知能が読みやすいLLMO対策を近日中に対応.

おはようございます.WordPressに人工知能が読みやすいLLMO対策を近日中に対応を施します.ただ、単にマークダウン記法で出力させるだけなんだけども、そんなに簡単でもないと思います.

簡単といえば簡単?知っているか知らないかで差が生まれるかも.

単なるコンテキストだけを抽出するならそんなに時間はかからないけど、記事の中にYOUTUBEやコードを埋め込んでいる場合はちょっと取り出し方に工夫がいるようになると思います.

取り出し方を知っているか知らないかで、差が発生すると思います.

因みにLLMO対策を何故するかは、これをしないと今後ページへ来てくれなくなる恐れがあるので速い内に対応しとこうと思ったわけです.

人工知能に記事を読んで貰いたいわけではないのだけど、AI(人工知能)モードが日本でも始まったらかなり打撃になることは確かなことだと思います.それぐらい脅威だと...

明日へ続く

⏩️映画、8番出口を観ました.#津波を連想する所があります.そこだけ注意かな.

おはようございます.映画、8番出口を観ました.考えさせられる映画だった、唯単に怖い恐ろしいという映画ではなく中盤から考えさせられる内容だったですね.

この映画が国宝のようにヒットするかは置いといても、観る人によればそうなんか考え方が変わるかもなって思います.ループ映画かどうかは答えられないけども..

プラス思考かマイナス思考かによっても大きく変わるかも知れない、ラストシーン.

この映画を例えると自分は現代のなまはげな感じがしました.怖いシーンも含めてこういう事をするとこうなってしまうぞ的なそういう要素が含まれている気がします.

なので、中学生なんかにはオススメな作品なんじゃないかなって思います.

明日へ続く