AIに自然言語だけでNext.jsでmacOSクローン電卓を作ってみた

じゃんくはっく
じゃんくはっく

結論:2024年10月現在でプログラミングのワークフローは変わりつつある!これを知らないのと、知ってるのとでは大違いということがわかりました。

この記事の概要

  • VScode経由で、AIにお願いして自然言語(日本語)で電卓を作った
  • 作ったのはNext.jsで動作するWEBアプリ
  • その作り方の具体例
  • シーケンス図やフローチャートや仕様書なども良いものを作ってくれます

AIにお願いして作ったもの

 何を作ったのかというと、それはmacOSの付属する電卓アプリのカラーリングに似たWEBアプリの電卓です。僕自身がほぼ知らないNext.jsのフレームワークを使ってAIに作ってもらうことを目標にしたプロジェクトです。AIが作ったソースコードは以下にあります。

macOS clone2 電卓アプリ

また、GITHUBにあるreadme.md の仕様書もAIに作ってもらいました。びっくりしたのは、シーケンス図やフローチャートなんか書けないだろうな!って思っていたのですが、依頼したら作ってくれました。GITHUBにある図はまったく、加工していません。びっくりですよね!シーケンス図をこちらにも載せておきます。

sequenceDiagram
    participant User as ユーザー
    participant CalculatorApp as 電卓アプリ
    participant Display as 表示部
    participant Clipboard as クリップボード

    User->>CalculatorApp: ボタンまたはキーボードで入力
    CalculatorApp->>Display: 入力値を更新
    Note right of Display: displayValueを更新

    User->>CalculatorApp: "="キーを押下
    CalculatorApp->>CalculatorApp: 計算式を組み立て
    CalculatorApp->>CalculatorApp: evaluateExpression関数を呼び出し
    CalculatorApp-->>Display: 計算結果を表示
    CalculatorApp->>CalculatorApp: 履歴を更新

    User->>CalculatorApp: "COPY"ボタンを押下
    CalculatorApp->>Clipboard: 計算結果をコピー

    User->>CalculatorApp: 外部から数字をペースト
    Clipboard-->>CalculatorApp: 数字を貼り付け
    CalculatorApp->>Display: displayValueを更新

作り方・概要

さて、ではどういうものを用意すれば良いのでしょうか? それは簡単で以下を用意すれば良いです。

  • OpenAIなどAIサービスプロバイダのAPI KEY
  • VScode
  • そのプラグインのCLINE:LINK

これだけです。

作り方

いきなり作り始めても良いのですが、完成度を求める場合は、仕様書を作ることをお勧めいたします。たとえば、gitのREADME.mdと、macosの電卓のスクショだけLocalの適当なディレクトリにコピーして、そのディレクトリをVScodeで開きます。

そして、CLINEで以下のようにお願いするだけです。

README.md の仕様を元にNext.js で電卓を作ってください。添付画像、ss.png も参考にして。

画像は、カメラアイコンから添付できます。すると、npx create-next-app@latest calculator-appなど必要なコマンドなどを、Run Commandするだけです。画像は1つ進んだ状態です。たとえば、エラーなどが起きてもそれを再度、AIが判断し解決策をコマンドなりを教えてくれます。やばいですよね!

そして、以下のスクショではpage.tsxをAIが書いてくれて人間はSaveボタンを押すだけです。ふぁー! この時点で僕はぶっ倒れそうになりました。

実際に作り込んでいく過程では、指示の仕方が重要です。

作るときのコツ

やってみるとわかりますが、指示の与え方、つまりお願いの仕方がポイントです。 時には、無限ループっぽくなるときもあります。そういう時は、ソースコードを全部1枚のテキスト上にして、WEB版のChatGPTのo1に解決してもらいます。そして、その指示や、修正ソースコードをCLINEで投げることにより、ほぼ全て解決できました。 CLINEでo1に投げると、コンテンツが長いって怒られますのでWEB版を使いました。

また、UIを作る時は、v0 の方がより良いUIデザインを作ってくれます。あと、実際の開発フローのようにGITで管理して、ISSUEを作りフューチャーブランチを切りながら、進めるとよりどこに問題があって、どういうコードが書かれて、AIがどこで間違っているのかの原因を探る時に効果的です。

AIプロバイダについて

CLINEで指定できるプロバイダは、いろいろあります。ChatGPTのo1はAPI経由では使えないようなので、mistral.aiのCodestralというのがあります。これを使いたい時は、APIキーを発行して、CLINEのOpenAI Compatible で使えるかなと試したのですが、うまくいきませんでした。以下を入れてプロキシー経由で使えば回避できるみたいでした。

pip3 install litellm
pip3 install 'litellm[proxy]'
export MISTRAL_API_KEY=取得したAPIキーを
export CODESTRAL_API_KEY=これのAPIキーは別のようです。取得したAPIキーを
litellm --model mistral/mistral-large-latest

CLINE側には以下のように設定します。

無料版だと、レート制限が低かったり、データが非公開じゃなかったり、カスタムモデルが使えなかったりと制限がありますので、よさそうであれば有料プランも考えています。

まとめ

今回なんとなくわかったこと

  • VScodeから、CLINEプラグインを経由しAPI経由で使う
  • 仕様書は必ず書くべき。面倒な時はあとから、ソースコードのロジックを追って書いておく
  • 要求仕様は、平たく言えばアジャイル開発するときの、ユーザー目線のやれることを文章化することが大切
  • システムプロンプトにも、絶対守ってほしいルールは書いておくと良い
  • AIにお願いするときは、具体的にお願いする
  • CLINEのAIにお願いするとき、お願いの仕方をより頭の良いAIであるo1に依頼する
  • 実際の開発のワークフローと同じようにすることで、問題がどこにあるか顕在化することが可能
  • Bugが取れない時は、ChatGPTのo1など、IQの高いAIに解決してもらう
  • gitなどでAIの変更履歴を保存し、方向性が悪くなったら元に戻せるようにしておく
  • 指示を与える人間が問題の根本を理解していないと、うまく解決できないのでまずそこを理解してからAIに指示を与える

あとがき

ChatGPTが発表されたのは、2022年11月30日です。今は2024年10月ですから来月の30にがくると丸2年になるわけですね。  そして、僕らエンジニア業界のワークフローも変わりつつあります。まだ、これに気がついていないエンジニアもいますが、僕はこれらの体験によって今後の仕事で何が大切なのかを改めて考えさせられました。 結局、AIのほうが広範囲にいろんな知識を知っていて頭が良いわけで、細かな構文や、パッケージの依存関係などそういう部分はAIに任せれば良いです。しかし、一番重要なのはそれ以外の人間でしか決められないアプリの方向性や、大切にしたい部分。これは指示を与える人間がしっかりと方向と方針を固めておかないと良いものは作れないな!と感じました。

また、ここには書ききれませんでしたが、以下のアプリも作れることを確認済みです。とにかく、ひと昔前(といっても1年前くらいですが)はこんなワークフローが作れるなんて夢にも思っていませんでした。

  • これ以外にもAndroidネイティブアプリをビルドした
  • Auth認証の面倒なのも作れます
  • macOSやWindowsネイティブアプリも作り始めています

とんでもない世の中になったもんです。ある意味、大チャンス到来といったところでしょうか。プログラムミングの勉強も、AIと一緒にやればより、深く学習できますし。 1つだけ、懸念があります。それはAIが自律的に動けるようになったとき、OSのカーネルにAI機能を統合してしまう恐れがあることです。すごく堅陣なOSができる反面、使い方を誤るとやばい用途にも使われることになります。良い未来にしたいものですね。

著者にメッセージ

間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

WordPressのAIプラグイン・AI Engineを使って自分のブログを学習させてみた

じゃんくはっく
じゃんくはっく

WordPressのコンテンツをAIに学習させて有効に使う方法がないか調査したよ

今回は、ちょっと長い記事です。WordPressを使って自分のブログの内容を学習したAIを実装する方法はどのような手法があるかいろいろ考えてみました。ブログの内容をAIに学習させて便利に使う方法を模索したいと思います。

何をしたいのか?

普段は、ChatGPTやGoogleのGeminiとかにお世話になっています。GPTsが出たことで、自分用にカスタム学習したAIを作ることは簡単にできるようになりました。 しかし、自分のブログを自動的に学習させて、その内容を加味した回答をAIがしてくれる、そんな執事のようなAIはどうやったら作れるのか? まだ試してはいませんが、GPTsのAPIを使えばそれも可能だと思います。  今回の記事は、そういう自分用にカスタムしたAIをWordPressに連携するお話です。

結論から先に

今、ブログの右下についているボットがありますが、これはDocsBotという仕組みを利用しています。

これは、AI Engineとは関係ないDocsBotというサービスで、以下で提供されています。

DocsBot

URL:https://docsbot.ai/

例えば、「ベトナムでおすすめの料理は?」と聞くと学習してあるブログ記事の内容を加味した答えが返ってきます。

このブログは、WordPressで管理していますが公開するときは静的ファイルを出力しています。ですので、AI Engineは常時WordPressを稼働させないといけない関係上、今は利用せず、DocsBotのサービスを利用しています。有料のサービスですが、なかなか出来が良いので今は使っています。

AI Engine Pro版を使うメリットは?

読者の中には、他のサービスではなく自前のブログ(WEBアプリ)や、WordPressのプラグインで学習済みのAIを連携するような仕組みを作りたいという要望があるかもしれません。自分もWordPressで似たようなことができたらいいなと思っていました。もし、そういうことが出来たら、いろいろと応用が効きそうです。

 調べてみると、Ai EngineのPro版を使うとできそうなことがわかったので、実際に使ってみました。

Ai Engine Pro (WordPressのプラグイン)
無料版のWordPress公式https://wordpress.org/plugins/ai-engine/
プロ版https://meowapps.com/products/ai-engine-pro/

プロ版は買取のライセンスもありますが、まずは様子を見たいのでスタンダードの年間ライセンスを購入してみました。5つのWEBサイトに適用できて年間69USDです。

AI Engineとは何か?

WordPressのAI系プラグインは、AIにコンテンツやタイトル・SEO系のワードを書いてもらう補助をするツールが多いです。ブログを書くときに、WordPressのUI画面から直接、ChatGPTのAPIを通して利用できるメリットがあります。

紹介するAI Engineもこういう機能はありますが、他のプラグインには無い機能としては、Embeddignsからベクターデータベースを指定でき、自分のブログの記事や独自の学習内容を覚えさせることができます。

画像では、すでに1つの記事(以下)を覚えさせた状態です。

Surface ProのHackintoshが欲しい!(LINK
投稿日: 2024年2月2日 更新日:2024年2月6日

ChatGPTには、質問として「Surface Proの記事は?」と聞いています。答えは

Surface ProをHackintosh化してmacOSを楽しむプロジェクトについて興味があるんだね。この種のプロジェクトでは、特にSurface Pro7や7+のような高性能モデルが推奨されていることが多いけど、予算の都合でSurface Pro5や6で試すのも一つの方法だっちゃ。中古市場での価格は機種や状態によって大きく異なるけれど、正常な状態のSurface Proはだいたい1万円から5万円程度で手に入るみたいだっちゃ。Hackintosh化は技術的な挑戦が多いけど、macOSのタッチ操作体験やその他の利点を探究する価値は確かにあるね。詳細な情報は専門のサイトで確認するといいだっちゃ。

と回答するようになりました。素晴らしいですね!!

AI Engineで使えるベクターデータベースは?

設定から、Environments for Embeddings でベクターDBの設定が可能です。今は、PineconeQdrant が使えます。この両者のメリット・デメリットはまだよく調べていませんが、どちらも無料枠があります。本格的に利用したい場合は、課金したほうがよいかもです。

このベクターデータベースとはmysqlとかと違っていて面白い仕組みなんですが、また違う記事で取り上げてみたいなと思います。

自分のWordPressのAPIから使ってみる

他の利用例として、自分のWordPressからAPIを提供できるようです。設定Advancedから、Public API にチェックすれば利用できます。

マニュアル(LINK)によると、以下のように利用できるようです。

REST APIhttps://domains.com/wp-json/mwai/v1/{function_name}

認証は、Bearer Token が使えるようです。例えば、「おはよう。あなたについて教えて」とAPI経由で投げる場合は、

curl --location --request POST 'https://hack.gpl.jp/wp-json/mwai/v1/simpleChatbotQuery?prompt={URLエンコードした質問文}&botId={チャットボットのID}' \
--header 'Authorization: Bearer {トークン}'

と聞くと以下のようにJsonが返ってきます。

{
    "success": true,
    "data": "おはよう!私はぴーで、25歳の元気な女性だよ。いちごが大好きなんだっちゃ!"
}

カスタム学習した内容で回答が返っていますね。JavaScriptからもこれで使えますね。

OpenRouter経由でGemini proも使える

設定のEnvironments for AIでは Typeとして OpenRouterAzure(OpenAI)も選べます。これにより、例えば、Gemini pro なども利用できます。

まとめ

今回、なんとなくわかったのは以下となります。

  • AI EngineのPro版は、ベクターデータベースとも連携できる
  • Pinecone Qdrant が現在使える
  • WordPressの記事を上記のインポートできる機能がある
  • つまり、学習させることが可能
  • 学習させた内容を回答させることが可能
  • APIは、WordPressのREST APIを通して使える
  • 認証はBearer Tokenが使える
  • 外部のAPIは、OpenRouter経由で、Gemini proも使える

あとがき

応用すればいろいろと使えそうです。たとえば、自社のナレッジシステムを学習させた自社内AI チャットGPTとか。あとは、3Dオブジェクトと組み合わせて、音声でキャラクターとお話、会話できるものとか。アプリに組み込んで、ヘルプのやり取りをさせたりとか。

もっと機能を限定してシンプルなWordPressのプラグインとか作りたいですね。

著者にメッセージ

間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

音声認識のやることリストで遊んでみた

じゃんくはっく
じゃんくはっく

音声認識ってやったことなかったなー!

WEB技術だけで出来るみたいですね!

ぴー
ぴー
じゃんくはっく
じゃんくはっく

そうみたい。最近のブラウザは賢いですね

実用的なサンプルをお願いします〜

ぴー
ぴー

最近の音声認識って、どんな感じなんだろう? と思ったのでリサーチしてみました。きっと誰かが作っているだろうと思うので調査開始です。いくつか見つかりましたが、今日は、ブラウザが標準で持っている音声認識の機能を使って遊んでみようかなと思います。

さっそくデモです

さて、まずはデモを実際に触ってみてもらったほうが速いかと思います。PCでChromeブラウザであれば動作すると思います。Safariでも動作しました。

Artyom.js – A Sticky Notes Demo

https://take-i.github.io/artyom-todo/

このような付箋紙のToDoリストが音声認識で追加・削除できるものです。メモの追加は、以下のように喋れば追加できます。

  • ソースコードレビューをする メモ作成

削除したい場合は、

  • 1番目のメモを削除

とすれば、消えます。また、付箋紙をクリックすれば、その内容を喋ってくれます。なお、English USAや、English Great Britain にすると英語の発音じゃないと登録、削除できません。英語の発音練習とかよいのかもしれませんね。

ソースコード

元ネタは、以下となります。

github : Artyom.js

https://github.com/sdkcarlos/artyom.js

このToDoリストのサンプルアプリの元ソースのGITは不明でしたが、日本語化してあるのが自分のgithub リポジトリにコミットしておきました。

artyom.js – todo list

https://github.com/take-i/artyom-todo

どうやって動作しているのか?

とりあえず、サンプルを日本語化して日本語の音声で話せ、認識できるということがわかりました。さて、これはどういう仕組みで動作しているのでしょうか? どこぞやのAPIを叩いているのかと思っていたのですが、ソースをみるとそうではないようでした。

 はい、これはWeb Speech APIというようで、つまりはHTML5 対応のブラウザに実装されている仕様ということでした。ほとんどの主要ブラウザーではサポートしているようです。

注意するのは、IEとAndroid版のOperaブラウザー、そしてAndroidのWebViewではまだ動作しないって書いてありますね。PWA化したWEBアプリなら大丈夫そうです。

 音声をしゃべらせる部分が、SpeechSynthesisUtterance というようです。意味としては、音声発話ということですね。

 そして、音声を認識する部分は、SpeechRecognitionということのようです。こちらのブラウザ対応状況は

こちらは、AndroidのWebViewもいけるようですが、Firefoxや、Operaはだめなようです。ChromeやSafariはPC、スマホは大丈夫なようですね。

まとめ

今回、なんとなくわかったのは以下となります。

・最近のブラウザは賢くなって音声発話や音声認識もできる
・ChromeやSafarriやEdgeは問題なく使えそう。
・スマホは発話が、AndroidのWebViewでは使えないので注意が必要。
・httpsのSSL通信でないと、ブラウザからマイクへの許可許諾のダイアログがアクセスするごとに出る
・デモ版のJSはVerが0.9.6と最新1.0.6と比べて少し低いので、最新も使ってみたい

あとがき

音声認識や、音声合成は利用用途によって使えるので何か案件が来た時には積極的に使っていきたいですね。声フォントとか使えば、自然な喋りが実現できるし、キーボード入力が苦手な方は音声入力のようが良いですしね。

著者にメッセージ

間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

アルゴリア検索を導入してみたら、速くて便利で気に入った話!

じゃんくはっく
じゃんくはっく

静的サイトでも動作する検索を模索してみたよ

Google検索とかじゃなくて?

ぴー
ぴー
じゃんくはっく
じゃんくはっく

自分のサイトにもっと特化して検索できるやつが欲しかったのよ

このブログってGitHub Pagesでしょ? どうやるのかしら?

ぴー
ぴー

ゴールデンウィーク真っ最中ですね! 皆さんは何してますか?

僕は、まったりとPCと戯れて、世界中の面白いネタを探しています。もうね、あるわあるわ。面白ネタがたくさんあって、世界は広いなと、再認識しました。

さて、今回のネタは「検索」です。このブログはgithub pages ってのを使っていて静的なサイトなんです。見た目はWordPressのブログサイトっぽいのですが、htmlとcssとjsだけの構成でPHPとかデータベースとか動作していないんです。なので、自分のサイトの検索機能はGoogleのを使っているんですが、もっと良いのはないかなーと探していました。こういう分野のエンジニアは、フロントエンド・エンジニアと、いうんですが、自分は苦手分野なのであまり知識がありませんでした。

見つけたところは、Electronのサイト!

Electronえれくとろんっていう、仕組みがあるのですがこの本家サイトの日本語ドキュメントにその良い例が載っています。

Electron ドキュメント

https://www.electronjs.org/ja/docs/latest/

このサイトを見ると、キーボード操作 CMD+K で検索ウィンドウが出てきます。

こんな感じで、検索文字をタイプするごとにそのキーワードを含んだページとヒットした文字部分が出てくるわけです。検索キーワードの提案(サジェスト)が出るのではなく、検索結果がリアルタイムで表示されるイメージです。このキーワードに対して、その候補のページが出てくる仕組み・検索システムが優秀で使いやすいんです。

で、この仕組みってどうやって作っているんだろうなーと思っていたところ、このウインドウの下にはalgoliaあるごりあ と表示されています。どうやら、algolia の検索システムを使っているようです。

ちなみに、Electronっていのは、簡単に紹介すると以下です。そのうち、ネタにしようかなと思っています

Electron(エレクトロン)とは、ウェブ技術でデスクトップアプリケーションを作成できるテクノロジーです。 HTMLとCSS、JavaScriptを使って開発し、WindowsとmacOSの両OSのアプリケーションを1つのコードから作ることができます。

https://ics.media/entry/7298/

algolia の検索システムとは何なのか?

さて、algoliaの検索とはいったい何なのでしょうか? 英語サイトですが、サービス名称は「Algolia Searchあるごりあ さーち」と言うようです。

Algolia Search

https://www.algolia.com/products/search-and-discovery/hosted-search-api/

FAQのところを見ると、概要が見えてきます。まず、Algoliaは高速で、SaaSさーす製品でモバイル向けにも特化してあり、日本語も使えるようです。

機能は大きくわけて、2つあるようです。1つは、Autocompleteと呼ばれる、検索キーワードを入れると、リアルタイムで検索結果が出る仕組み。もう一つは、検索キーワードの提案(サジェスト)のAutoCompleteで、これは「Query Suggestions」を設定すると可能のようです。

こういうのは、まず使ってみるのが手っ取り早いです。幸い、WordPressでalgolia検索を使うのは簡単です。まずは、このサイトですでに実装してあるので、それを紹介してみます。

このブログでの実装例

このブログでは、キーボード操作「/」スラッシュをタイプすると、以下のような検索ウィンドウが出てきます。

検索テキスト入力エリアにフォーカスするには、「.」ドットをタイプするかマウスでフォーカスします。適当な検索ワードをタイプすればその結果を含むページが下に表示されます。これは、検索キーワードのサジェストとは違いますが、検索結果がすぐに出てくるので検索結果に遷移しなくても良くて便利です。検索ワードをタイプしてから、検索結果が出てくるのが異常に速くないでしょうか?

WordPressに入れてみる

では、このブログと同じことをしてみたい人向けに具体的な手順の紹介です。2つプラグインを入れるのですが、まず、1つ目は以下です。

WP Search with Algolia

https://ja.wordpress.org/plugins/wp-search-with-algolia/

次に、algolia のサイトではアカウントを作成し、Applicationを作成し、APIキーを参照します。

で、その各種項目を先ほどのWordPressプラグインに設定します。

少し説明は端折りますが、「Search Page」では、とりあえず真ん中の「Use Algolia in the backend」を選んでおけば良いでしょう。Autocomplete では、検索させる対象、たとえば「投稿」を選択してインデックスを再作成しておきます。

WP標準の検索ウィンドウで確認

WP標準の検索ウィンドウで、検索キーワードを入れたら、検索結果が出てくるようになっていれば成功です。

アイキャッチ記事の画像があれば、こんな感じで表示されるかなと思います。

キーボード操作で検索ウィンドウを出す

続いて、キーボード操作で、検索窓がポップアップする部分です。検索結果に遷移しなくて良いので、どのページからも検索ウィンドウが表示されれば便利かなと思いました。

そのような動作をするプラグインを昔みたことがあったので検索してみました。「wp-keyboard-nav」というのがあったので、それには検索窓がついていないので、少し手直しして、以下のような野良プラグインを作ってみました。

Keyboard PopUP algolia search
WordPress の野良プラグインです。プラグイン名称は、Keyboard PopUP algolia search です。 キーボード操作でポップアップする検索ウィンドウです。algolia検索と組み合わせて使うために、改造しました。元ソースは、wp-keyboard-nav LINK というプラグインです。

https://github.com/take-i/wp-keypopup-algolia

こちらは何も設定は必要ありません。プラグインを入れれば、すべてのページでキーボード操作で検索ウィンドウが出てくるかと思います。

レスポンス時間はどのくらいなのか?

検索ウィンドウに1文字づつタイプするごとに、Algolia のAPIにリクエストが飛び、レスポンスされます。何回か試したのですが、ほとんどが100ms 以内に帰ってきています。

以下のように、20ms以内くらいで帰ってくるようです。劇速いです!

まとめ

今回、なんとなくわかったのは以下となります。

・Algolia の無料枠は、10,000検索リクエスト/月
・検索対象の数制限は、10,000 レコード
・無料枠利用にカード登録は必要なし
・個人用サイトなら無料枠で足りそうだが、しばらく運用してみる
・有料版は、1000リクエスト/月 で1.5ドル
・検索クエリーは1文字づつ、APIリクエストが飛んでいる
・その、ほとんどが20ms以内にレスポンスされている
・検索結果が検索窓に検索キーワードを入れた時点で表示される
・↑これがすごく便利で気に入りました
・日本語にも対応していている
・紹介はしきれなかったが、静的サイトでも少しの手入れで動作する
・速いというのは、正義だなと改めて実感
・キーボードで出てくる検索ウィンドウは思ったより、便利
・algolia にINDEXデータを入れる部分はwordpressで可能
・algoliaの管理画面でAnalyticsがあり、検索ワードや表示ページなど統計データが見れる

あとがき

英語サイトの情報なので、まだあまり日本語の情報がないのですが、この手のサイト内検索を商材にするサービスは他にもたくさんあります。商用のサイトなら、たくさんある商品や情報の中から、お客さんが希望するモノにたどり着きやすくするため、サイト内検索は結構重要だと思っています。

今回の話は、バックエンドにデータベースがあって、それを直接検索参照させる従来のやり方ではないケースです。このブログのように、静的なページがあってそれを対象に高速で検索させる場合は何が正解なのでしょうか。ある人は、全文検索エンジンを入れたらどう? とか。検索用のインデッックスを持ったDBを用意すればよいとか。

このブログの場合は、記事の作成時点ではWordPressで管理していて、書き出すときに静的なHTMLにしています。全ての記事のインデックス(目次情報)は、WordPressで動作している時点でAlgolia に投げられます。静的ページからの検索は、JavaScript経由でAlgoliaに参照され、文字が入るたびにリアルタイムに検索結果が表示される仕組みです。

データベースは無く、作るつもりもないので静的ページをどうやって手間なく、検索させるか? の1つの解だとは思います。

著者にメッセージ

間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

WordPressをhtmlファイルに出してGitHub Pagesで運用するスタイルが最高

じゃんくはっく
じゃんくはっく

スマホサイトでWordPressも納得したしなー!

あ〜、例の記事をネタにするんですね!

ぴー
ぴー
じゃんくはっく
じゃんくはっく

やっぱり運用が楽なのがいいしね!

率直な感想なんかを聞いてみたいわ。

ぴー
ぴー

長らく、スマホ上でWordPress環境を作って、自家サーバで動かしていましたがSLAも納得の数値を出せたのでそろそろ違う環境にしようかなと、考えていました。

 今日のお話は、WordPressから静的なHTMLファイルを書き出してそれをGitHub Pages やNETLIFYで、独自ドメインを使って動かしてみた感想なんかを書きたいなと思います。具体的な手順なんかは記載していませんので、要望があれば別ネタにしたいなと思います。

WordPressでの編集から記事公開までの概略

全体の流れは、基本的に以下の3ステップです。

 (1) ローカル環境のWordPressで記事を書く

 (2) Simply Staticプラグインで、「静的ファイルを生成する」ボタンを押す

 (3) 上記でできたファイルを展開して、Github Pages のリポジトリへコミットする

Github Pages の設定をしておけば、こんな感じですね。(2) のファイル生成時間は、動作速度、記事数や画像数などにもよって変わりますが、自分の場合は1時間弱くらいでした。

WordPressのデータをどうやって、静的ファイルにするの?

これは非常によくできたプラグインがあります。それを使うだけ。いろいろ検討しましたが以下のが一押しです。

Simply Static
HTTPS://JA.WORDPRESS.ORG/PLUGINS/SIMPLY-STATIC/

これは、Pro 版と無償版があります。今使っているのは、無償版ですが、Pro版も検討しています。とりあえずは、無償版でも十分な機能を持っています。以下のように「相対 URL を使用する」でファイルを書き出す設定をしておきます。なぜ相対URLにしているかといえば、ミラーサイトにも公開しているからです。このブログの場合、以下のように複数のリポジトリへコミットしているからです。

 メインサイト:https://hack.gpl.jp/

 エイリアス:https://junkhack.gpl.jp/

 ミラーサイト:https://jh.gpl.jp/

あとは、「静的ファイルを生成する」でOKです。このブログの場合、583個の記事を1時間弱で書き出せました。

書き出したあとはどうするの?

無事に静的ファイルが描き出せたら、圧縮ファイルを展開してGithub Pages のリポジトリにコミットするだけです。自分は、Sourcetree を使っています。

自動化するならスクリプトを作ってコミットもできると思います。そのうち、やってみたいなと思っています。ちなみに、Simply StaticのPro版はGitHub連携も出来るので一手間減ります。

環境づくりで、注意する点

WordPress の環境作りでは、以下の点に気を付ける必要があります。

  • 書き出されるのは静的なHTMLとjsとcss と画像ファイルなのでコメントやメールフォームや検索など動的に動かすことができない
  • なので、コメントは全部閉じる
  • メールフォームなど、自分の場合はコンタクトフォーム 7を使わないようにした
  • 検索はGoogleのカスタム検索をWordPressのウィジェットに貼り付ける(https://programmablesearchengine.google.com/cse/
  • WordPressのスラグは全部英文字にしておく(日本語は使わない)
  • ローカル環境のPHP設定でメモリ関連の設定を上げておく

といったところでしょうか。静的化してもコメントやメールフォームを動かす別の方法もありますが、現時点ではまだ導入していません。そもそも、コメントやメールフォームは無くても良いかなと。あればコミュニケーションができますが、仕事の依頼系はメールでも十分かなと感じています。わざわざ、メールフォームにしておく必要性もないのが実際のところです。コメントについては、このブログの場合、ほとんど書き込みがないので無くても問題はありません。どうしても、コンタクト撮りたい場合は、メールしてもらえれば良いかなと現時点では思っています。

現時点で使っているプラグインは?

静的ファイルを書き出すSimply Staticを使っても、ちゃんと動作しているWordPressのプラグインは以下です。表示系ではない関係ないプラグインもありますが、表示系に関連するのは動いていることを確認しています。

+-------------------------------------------+----------+-----------+-------------+
| name                                      | status   | update    | version     |
+-------------------------------------------+----------+-----------+-------------+
| acf-quickedit-fields                      | active   | available | 3.1.6       |
| advanced-custom-fields                    | active   | none      | 5.11.4      |
| akismet                                   | active   | none      | 4.2.1       |
| autoptimize                               | active   | none      | 2.9.5       |
| backwpup                                  | active   | none      | 3.10.0      |
| bulk-media-register                       | active   | none      | 1.25        |
| admin-featured-image                      | active   | none      | 1.2         |
| export-all-urls                           | active   | none      | 4.1         |
| google-sitemap-generator                  | active   | none      | 4.1.1       |
| jquery-manager                            | active   | none      | 1.10.6      |
| list-urls                                 | active   | none      | 0.2         |
| luckywp-table-of-contents                 | active   | none      | 2.1.4       |
| multiple-domain-mapping-on-single-site    | active   | none      | 1.0.5       |
| permalink-manager                         | active   | available | 2.2.14      |
| search-regex                              | active   | none      | 2.4.1       |
| shortcoder                                | active   | none      | 5.6         |
| simply-static                             | active   | available | 2.1.5.2     |
| google-site-kit                           | active   | none      | 1.48.1      |
| ultimate-addons-for-gutenberg             | active   | none      | 1.25.2      |
| word-balloon                              | active   | none      | 4.18.4      |
| wordpress-importer                        | active   | none      | 0.7         |
| wp-external-links                         | active   | none      | 2.50        |
| wpfront-scroll-top                        | active   | none      | 2.0.7.08086 |
| wp-multibyte-patch                        | active   | none      | 2.9         |
| duplicate-post                            | active   | none      | 4.3         |
+-------------------------------------------+----------+-----------+-------------+

意外だったのは、目次を作っている「luckywp-table-of-contents」や吹き出し表示の「word-balloon」もちゃんと動作しています。

まとめ

今回、なんとなくわかったのは以下となります。

・運用コストが下がるので、今後はコンテンツネタに力を入れていきたい

・やっぱり静的ファイルは読み込みが速い!

・WordPressとは今後もローカル環境で付き合っていきます

あとがき

かなり前から、WordPress運用環境を変えたいなと検討していました。やっぱりシンプルが一番です。まだ切り替えたばかりなので、少し記事を書いてからまた感想などを書きたいなと思います。

著者にメッセージ

間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

KeyCDNという安いCDNを半年使った感想、価格や月維持費などレポート!

じゃんくはっく
じゃんくはっく

CDNってのを半年、使ってみましたよ

クラウドからコンテンツを配信するってヤツですね。

ぴー
ぴー
じゃんくはっく
じゃんくはっく

どんな効果があって、月維持費はどのくらいかレポートしてみます。

私は、月500円くらいまでなら出せるかなー

ぴー
ぴー

KeyCDNは数年前、1位か2位くらいの安さでしたが、今はもっと安いのがあるようです。CDNのコスト計算サイトでは以下のようでした。blazingcdnというのが破格の安さのようです。

今回は前から気になっていたKeyCDNをこのスマホサーバのWordPressサイトに適用してみましたので、実際どのくらいの値段で運用できるんだ? みたいな感想をレポートしてみたいと思います。

そもそもCDNって何?

CDNは平たく言えば、画像やコンテンツを本家とは違うサーバから配信するというものです。キャッシュサーバとか、エッジサーバとか表現したりしますが、要は静的なファイルを本家サーバからではなく、CDNのクラウドから配信することによりネットワーク負荷や、レスポンス改善(時に改悪)したりするのが目的です。

コンテンツデリバリネットワーク(英語: content delivery network、CDN)

wiki

いくらするの?

ほとんどの人が気になるのは、初期や維持費などの価格がいくらなのか? っていうことと、速度はどのくらい改善されるのか? ってことだと思います。こればっかりは使ってみないとなんとも言えない部分があります。早速、値段からレポートしてみたいと思います。

 まず、KeyCDNは最初にクレジットを入れてそれを消費する仕組みです。最小の入金単位は 49ドル となります。日本円で当時のキャッシュカード換金レートで、5,553円でした。

 入金したのが、2021年の06月/01なので現時点で半年使っていることになります。クレジットの消費は以下のようになっています。

残りクレジットは18くらいです。49から約36%残っていますので半年で67% 消費したことになります。半年で、約3720円ですので、1ヶ月あたり620円という感じですね。

 グラフの途中に、ガクンとクレジットが消費しているところがありますが、これはキャッシュを完全に消去して作り直している部分です。

どのくらいのアクセス数なの?

統計期間が約4ヶ月くらいなので、KeyCDN上のデータでは以下のようです。

1日あたり、cssや画像やhtmlなど合計して1.8万くらいのヒットがあります。PV的な数値は1つ前の記事に載せてありますので、参考にしてください。

1ヶ月のデータ転送量は?

このサイトの1ヶ月のデータ転送量(総トラフィック)は、KeyCDNの統計データで見ると以下のようです。

PV的には2000〜2500くらいでこの転送量です。3000〜5000くらいのPVでも15GBを1ヶ月に超えることはありませんでした。

CDNの効果はどのくらい?

ページ計測サイトで、CDN適用前と適用後のデータを測っておきましたので載せておきます。

まずは、CDN適用前。

次は、CDN適用後。

だいぶ改善されていますね。適用前は、最初のレンダリングが始まるのに、約4.2秒かかっていますが、適用後は、0.8秒です。CDNの効果は絶大です。

まとめ

今回、なんとなくわかったのは以下となります。

・このサイトのようにPVが月に2000〜5000くらいでは、月600円〜700円くらいのCDNコスト

・設定は非常に楽

・CDNの効果は絶大で、最初の描画が4.2秒から0.8秒となった

blazingcdnというCDNはKeyCDNより激安で、どんな効果があるのか試してみたい気もする

あとがき

WordPressのように、コンテンツ側で結構リソースを使うタイプや、スマホサーバのように非力な環境ではCDNの効力は絶大です。しかし、利用コストが月に600円〜700円くらいかかり趣味で使うのなら良いのですが、静的HTMLにして運用したほうが、良いなという結論に至りました。要はWordPressは、リソースを使うし無駄が多いんです。近々、そういう運用に方針を変えますので、紹介したいなと思っています。

著者にメッセージ

間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。