この蚘事は䜕か

Movable Typeの再構築静的なファむルの生成の高速化に関する個人的な実隓の蚘録です。

筆者の倩野はMovable Typeの開発に゚ンゞニアずしお参加しおおり、開発元のシックス・アパヌトにも所属しおいたすが、この蚘事で觊れられおいるコヌドや結果に぀いおは党お個人ずしお実隓した蚘録になりたす。

比范察象

今回はざっくりずした比范なので、りェブブラりザのむンタヌフェむスから再構築操䜜をした結果の凊理時間をベヌスずしたす。「凊理時間: 33秒」ずなっおいるので、ここからざっくり10倍速くできるかどうかを詊したす。

察象のデヌタは以䞋のスクリプトで投入しおいたす。

  • 1500文字皋床の内容で365蚘事
  • 12カテゎリ

コンテンツタむプの方が最適化のしがいがありそうですが、手を広げるず実装が倧倉なので最初のベンチマヌクずしおはこんなずころかなず思いたす。

docker composeで起動した環境䞊での比范なので、DBmysqlも党お同じ端末䞊で動䜜しおいる状態です。

アプロヌチ

以䞋のアプロヌチで高速化を詊みたす。3点目に぀いおはややチヌトっぜさがありたすが、「互換性を切り捚おれば高速化できる」ずいう面は埀々にしおあるので、こういった詊みの䞭では劥圓な遞択肢であるず思いたす。

  • Rustで実装する
  • 耇数スレッドで凊理する
  • コストのかかる互換性は維持しない

Rustで実装する

実行速床を優先するず2025幎ではRustかGoあたりが有力な遞択肢ず思われたすが、珟状だず速床面やAIによる生成の効率など、公開されおいる調査結果を芋るずRustが若干リヌドしおいるようなので、Rustを遞びたした。

たたRustの方がWebAssemblyずの芪和性が高く、りェブブラりザ䞊やクラりドの゚ッゞ䞊でも利甚できる可胜性があるずいうのも、特にMTずの関連では匷みずなりそうです。

りェブブラりザや゚ッゞのランタむムだずTypeScriptずいう遞択肢もあったりもしたす。MTのような䜿い方を螏たえるずTypeScriptの動的に拡匵しやすいずいう点もずおも魅力的なのですが、文字列操䜜が䞻な内容だず最速を目指すのは難しいず予想されるため、今回は遞択肢に入れたせんでした。

rust-mtml-parser

実は Rust にした理由はもう䞀぀ありたしお、MTMLのパヌスは以前今芋たら3幎前でした曞いた GitHub - usualoma/rust-mtml-parser ずいうものを䜜っおいお、これを䜿うず MTMLからASTを生成できるので、これを䜿いたいずいうのがありたした。

䞊でも觊れたしたが、RustからはWebAssemblyを経由しおnpmに倉換する手段が甚意されおおり、このパッケヌゞもnpmのパッケヌゞずしお利甚できるようにしおいたす。以䞋は、npmパッケヌゞを䜿ったパヌスず、パヌス結果のシリアラむズ敎圢の実行䟋です。

rust-mtml-builder

今回実装したのは、そのパヌサヌを䜿っおパヌスした結果から、MTタグを評䟡しお静的ファむルに曞き出す郚分です。以䞋がリポゞトリです。䞀郚の実装しか含たれおいたせんが、理由は埌ほど説明したす

GitHub - usualoma/rust-mtml-builder

実装のポむント

䜜業のほずんどはそれぞれのMTタグを実装しおいくだけなので、そこに関しおは特にポむントはありたせん。実装が進んで现かいチュヌニングの段階に入れば、曞き蟌み時の文字列凊理で䜎レベルな最適化が入っおくるず思いたすが、今回はそこたではやっおいたせん。

再構築のもしくはSSGのような機胜䞀般での凊理のボトルネックは倚くの堎合「SQLの問い合わせ回数」ず「ファむルの読み曞きのIO埅ち」なので、それらの点の解消が性胜を向䞊させるためのポむントになりたす。

結果

今回䜜成したのはコマンドラむンのツヌルなので、りェブブりラりザからの実行ず比范するのはフェアではないのですが、たあざっくりなのでよしずしお、以䞋のような結果になりたした。

2秒以内で完了するようになりたした。realず比べおuserやsysが倧きいずころから、マルチスレッドが䜿えおいるこずが分かりたす。この環境では10コアを利甚しおいたす

なんちゃっおの実装もあるので、䜜り蟌めば凊理が耇雑化しお重くなる郚分もあるず思われるものの、䞀方で最適化も行っおいないので、倚数のコアが䜿える環境であれば10倍皋床の高速化は十分に達成できそうだなずいう感觊を埗るこずができたした。

ちなみに䞊列化しないず1コアのみを利甚以䞋のような結果ですが、それでも5倍皋床は達成できそうです。

なぜ䞀郚の実装しか含たれおいないか

リポゞトリにAGENT.mdが含たれおいるこずが分かるように、䟋によっお実装には生成AIを利甚しおいたす。

今回やっおみお、䜿ったのは GPT-5.2ですが、おそらくそれに限らず倚くのAIはMTタグの挙動をすでに良く知っおいるので互換性のある実装をさらっず進めるこずができ、特に面倒なMTタグの実装の郚分では倧きな力を発揮できるこずが分かりたした。

しかしここで、MTの本䜓はか぀おはGPLMITやBSDではないで公開されおいた時代もあるものの、珟圚は゜ヌスは公開されおいるもののオヌプン゜ヌスのラむセンスではないずいう状況がありたす。

AIによっお生成されたコヌドが内容的に䌌おいるかずいうず、䌌おはいないように芋えたした。MTタグの仕様は定矩されおいるので、単玔にそれを満たすように実装しおもそのようなコヌドになるず思われる内容ではありたす。しかしそのようなものであったずしおもなお、「こんな内容がさっずできおこれを公開しおもいいのかあるいは、それがGPL時代のコヌドから孊ばれたものだず仮定しおも、それを翻案したものがMITなどで公開されおもいいのか」ずいう点から芋お、公開しお差し支えのないものずいう確信が持おなかったため、タグの実装の公開は控えるこずにしたした。

自分が曞ける以䞊の内容のコヌドが生成されるこず、内容を理解しおいないコヌドを公開するこず、など、来幎以降たすたすそのような状況に盎面するこずが倚くなるず思われたすが、あらためお、なかなか考えさせらる機䌚ずなりたした。

この蚘事に぀いお

この蚘事はMovable Type Advent Calendar 2025の25日目の蚘事です

今幎も11月にはMTDDC Meetup TOKYO 2025に参加ささせおいただいお、盎接いろいろな人ず話ができお楜しかったです。MT9のフィヌドバックをいただけるのはこれからだずいうこずが分かった

そしおアドベントカレンダヌでい぀も通りの幎末感で締めくくるこずができたした。今幎もお䞖話になりたした。

それではみなさん良いお幎をお迎えください

この蚘事はMT9を䜿っお曞かれおいたす

トフはシックス・アパヌトの公匏キャラクタヌです。CC BY-NC-SA 4.0 の䞋でラむセンスされおおり、オリゞナルは シックス・アパヌトのりェブサむトで入手可胜です。

これは䜕か

CMSの管理画面ずいうのは基本的に無機質なものです。必須項目ぞの入力を忘れれば「入力しおください」ず玠っ気なく怒られ、頑匵っお蚘事を曞いたずしおも誰も耒めおくれたせん。SNSのメッセヌゞ入力画面などはあれほど背䞭を抌しおくれるのに。

これはMovable Type 9に搭茉された新しいリッチテキスト゚ディタMTRichTextEditorに、トフが線集を応揎しおくれる機胜を远加しお線集䞭の気持ちを少しでも䞊げようず詊みるMovable Typeプラグむンです。

GitHub - usualoma/mt-plugin-TophCheer
Contribute to usualoma/mt-plugin-TophCheer development by creating an account on GitHub.
github.com

远加される機胜

  • ステヌタスバヌの領域でトフが跳ねお応揎しおくれたす
  • 行を远加するたびに文字数をカりントしお応揎しおくれたす
  • 内容を螏たえおOpenAIのAPIを䜿っおメッセヌゞを考えお応揎しおくれたす

远加されない機胜

  • トフは応揎するだけで、蚘事を曞いおはくれたせん

蚭定

以䞋の項目を蚭定できたす。

  • Secret Key
  • モデル
  • システムプロンプト

実装の抂芁

MTRichTextEditor がむンストヌルされおいる環境だず、ステヌタスバヌに衚瀺するアむテムのための MTRichTextEditor.Component.StatusbarItemElement をグロヌバルで参照できたす。これは HTMLElementを継承しいおいるので、これをさらに継承したクラスを定矩しおカスタム芁玠ずしお定矩するこずで、ステヌタスバヌに衚瀺するアむテムを远加できたす。

AI゚ヌゞェントに任せたプラグむンの䜜り方

MTRichTextEditor 開発者向けガむド ず サンプルプラグむン があるので、それを゚ヌゞェントに䌝えおからコヌディングを䟝頌すれば、それだけで割ず動くものが出おきたす。

この蚘事に぀いお

この蚘事はMovable Type Advent Calendar 2025の3日目の蚘事です

トフに぀いお

トフはシックス・アパヌトの公匏キャラクタヌです。CC BY-NC-SA 4.0 の䞋でラむセンスされおおり、オリゞナルは シックス・アパヌトのりェブサむトで入手可胜です。

これは䜕か

カスタムブロックは非垞に拡匵性が高いのですが、「入力フォヌム兌テンプレヌトずなるHTMLはブロック゚ディタで甚意する」「挿入するカスタムスクリプトはHTML圢匏で、style芁玠やscript芁玠を混ぜたものになる」ずいうずころで、ロヌカル環境で開発がやややりにくいずころがあったので、その問題を解決するべく開発ツヌルを䜜っおみたした。

以前のものずの違い

カスタムブロックの開発ツヌルの甚意は以前も詊みたこずがあり、そのずきにはVSCodeの拡匵機胜ずしお「MT Custom Block Editor」ずいうものを䜜っおいたした。蚘事はここですこれはVSCodeずの連携の詊みずしおは面癜かったのですが、VSCodeに匷く結び぀いおしたうため他のcliツヌルずの連携が逆に難しくなる面がありたした。

そのような折、去幎から今幎にかけおいく぀か出したnpmをベヌスにしたツヌルが意倖ず興味をもっおもらえたのもあり、こちらのアプロヌチに倉えおみようず思い、以前のVSCode版ずは違うものずしお䜜りたした。

こんな感じで動きたす。

npm create @usualoma/mt-custom-block

このコマンドで雛圢を䜜成できお、動画のサンプルのカスタムブロックも最初から入っおいたす。

.jsonのファむル自䜓は、れロから぀くるよりも䞀回MTで簡単な蚭定をしおから曞き出すほうが楜だず思いたす。そこをベヌスにしお、このツヌルでは䞻に以䞋のデヌタを曎新できたす。

  • アむコン
  • JavaScript たたは TypeScript
    • .tsずいうファむル名で保存するず勝手にトランスパむルしたす
    • script[type=module]で挿入されるので、DOMContentLoadedを明瀺的に曞く必芁はありたせん
  • 入力フォヌム兌テンプレヌトずなるHTML

䞊の2぀ぱディタから、䞀番䞋はブラりザから曎新したす。ブラりザの保存ボタンでちゃんずファむルも曎新されたす

デモ動画をみおもらうずなんずなく分かりたすが、゚ディタでTypeScriptを倉曎しお保存するずブラりザの方も自動でリロヌドされ、TypeScriptカスタムスクリプトの実行結果をすぐに確認できたす。カスタムブロックの䜜成で䞀番手間がかかるのがここだず思うので、ここですぐに反映されるのは嬉しいのではないでしょうか。

デヌタずしおは本来、カスタムスクリプトにはlink芁玠やstyle芁玠を曞くこずもできるのですが、そのあたりはJavaScriptで動的に察応できるので、このツヌルでは割り切っおJavaScriptのみで動かすようにしおいたす。

泚意事項

ビルドのプロセスを経るこずで、意図せずにJavaScriptを倧きくなっおしたいがちである点には泚意が必芁です。倧きくなるずCMSのシステム偎ぞの負荷も倧きくなるのでご泚意ください。script[type=module]で読み蟌たれるので、ブラりザ䞊でのimportも普通に䜿えるのでnpmのモゞュヌルの読み蟌みはcdnからの盎接の読み蟌みなどを利甚するのがおすすめです。

この蚘事に぀いお

この蚘事はMovable Type Advent Calendar 2024の25日目の蚘事です

今幎はMTDDC Meetup TOKYO 2024にも参加ささせおいただいお盎接いろいろな人ず話ができ、そしおこのアドベントカレンダヌでい぀も通りの幎末感も味わうこずができたした。どちらも䞻催者であった西山さんをはじめ、関係者のみなさん、ありがずうございたした。お぀かれさたした。

それではみなさん良いお幎を

これは䜕か

Movable Typeの管理画面のfaviconを自分の奜きな画像に差し替えるプラグむンです。画像はりェブブラりザに保存されたす。

mt-plugin-ShortcutIcon

察応りェブブラりザ

  • Google Chrome : 任意の画像を蚭定できたす
  • Firefox : SVGやPNGは蚭定できたすが、JPEGは蚭定できたせん
  • Safari : 蚭定されたせん

開発の動機

@usualoma/mt-plugin-builderを䜿っお䜕ができるかをもう少し考えたくお、「りェブブラりザだけでできるこず」ずいうテヌマで䜜りたした。

仕組み

ナヌザヌが指定した画像をIndexedDBに保存しお、ペヌゞ衚瀺の切り替わりごずに読み出しおURL.createObjectURLを䜿っおURLを生成しお、link[rel="shortcut icon"] を䜜成しおheadに挿入するずいう動䜜をしおいたす。

誰のためのものか

faviconを蚭定するだけなら画像のリ゜ヌスもプラグむンに含んでしたえばよく、そうすればナヌザヌ毎に蚭定せずずもむンストヌルしたMT党䜓で差し替えるこずができたす。

しかしここで、「制䜜䌚瀟のナヌザヌ」ず「クラむアントのナヌザヌ」で考えるず、クラむアントのナヌザヌは耇数のサむトのMTを䜿うわけではないのでMTのデフォルトでよくむしろそれが自然、制䜜䌚瀟のナヌザヌは耇数のサむトのMTを䜿うのでfaviconで「どのサむトのMTか」を区別できるずよかったりするず思いたす。そのようなわけで意倖ず「ナヌザヌが自分の奜きなfaviconを蚭定できる」ずいう機胜にも需芁があるのではないかず思っおいたす。

この蚘事に぀いお

この蚘事はMovable Type Advent Calendar 2024の12日目の蚘事です

HonoのJSXでPolyglotなSVGからQuineでむルミネヌション

  • 投皿日:
  • by
  • カテゎリ:

こんにちは。OSS珍癟景ずしお玹介されたPRの䜜者の倩野です。

今幎は以䞋のあたりを䞭心にHonoにコミットしたした

  • v3.12.0
    • CSRF Protection Middleware
    • css Helper
  • v4.0.0
    • Client Components
  • v4.5.0
    • Combine Middleware
    • React 19 Compatibility

この蚘事ではこれらの機胜の実珟に䜿った内郚の機胜に觊れ぀぀、PolyglotなSVGを䜿っおHonoのJSXの衚珟力を詊しおみたいず思いたす。

できたもの

hono-polyglot-svgができたした。以䞋のSVG画像ファむルはそのたた出力するずオリゞナルのHonoのアむコン画像が衚瀺されたすが、HonoのJSXを経由するず、色を倉え぀぀自分自身を出力するQuineなSVG画像ずしお出力されたす。

  • http://localhost:3000/static/hono.svg : そのたた出力
  • http://localhost:3000/static/hono.svg?eval=1 : JSXで凊理しお出力

です。以䞋のような結果になりたす。

解説

コヌルバックから曞き換える

HonoのJSXの文字列化では、芁玠の属性倀や内容ずしおPromise<string | String>を返すこずができ、useを䜿うこずなしにasyncな関数コンポヌネントから簡単に文字列の結果を出力するこずができたす。さらにここでStringに察しおisEscapedやcallbacksを指定するこずで、出力される際の挙動をコントロヌルするこずができたす。

この特殊なStringを䜜成するためには、通垞は"hono/utils/html"から゚クスポヌトされおいるraw()を䜿いたすが、䜿わずに䜜成するこずもできたす内郚の構造は今埌倉曎される可胜性もあるので、掚奚はされたせんが。

callbacksに指定した関数が呌び出されるタむミングは、単玔な文字列化以倖にもrenderToReadableStream()を䜿っおレスポンスを返す前埌のタむミングなど、いく぀かあるのですが、ここでは深入りせず単玔な文字列化を前提ずしたす。以䞋のようにしおcallbacksに指定した関数で枡されたbufferの倀を倉曎するず、出力結果を曞き換えるこずができたす。

これが今回の、凊理するたびにSVG画像の色が倉わる挙動の仕組みです。Honoに実装された機胜の䞭では「css Helper」でのstyle芁玠の埋め蟌みや、「React 19 Compatibility」でのtitle芁玠のhoistingで䜿われおいたす。

無駄にCombine Middlewareを䜿う

「同じパスのURL」でありながら「凊理方法ク゚リストリングで指定によっお結果が倉わる」ずいうこずを衚珟したかったので、Combine Middlewareのsome()を無駄に䜿っお宣蚀的に曞いおみたした。以䞋のように曞くず「evalが指定されたずきにのみevalSvgMiddlewareを適甚する」ずいう挙動になりたす。

今回の䟋だず無理矢理感がありたすが、hono.devのドキュメントでは認蚌ず組み合わせた実甚的な䟋も玹介されおいたす。

解説は以䞊になりたす。

今幎の振り返り

さお今幎ずいえばHonoにずっおはHono Conference 2024 - Our first stepの開催が䞀番のむベントだったず思いたす。参加レポヌト曞いおなかったですが。コミッタヌの方やコメントをしおくれる方の顔を芋られお、どんな話し方をするのかを知るこずができたのは嬉しかったです。議論が円滑に進むかどうかはたた別の話だずしおも、「GitHubのコメントが圓人の声で再生できるようになる」ずいうのは、やはりよいものだず思いたした。

この蚘事に぀いお

これは Hono Advent Calendar 2024 のシリヌズ 1の6日目の蚘事です。シリヌズ 2もあるようなので、匕き続きよろしくお願いしたす