adiary置き換え計画始動から連なる、adiary-extendsを爆発的に改修している話の続き。

adiary置き換え計画は取りやめようと思ったで開発を取りやめた新製CMSLyndbaumだが、実装した機能そのものは便利なものだったためadiary-extendsに機能のバックポートを行っており、同時にLyndbaumに寄せるための機能削除も行っている。

バージョンは前回の記事を書いた時点ではv4.08だったが、あれから0.7上がり、現在はv4.15になっている。この間の変更を合計すると約5,800行の追加に対して約14,500行の削除で、バックポートより機能削除の方が多いかもしれない。

取り敢えず大まかなことを以下に挙げていく。細々としたことまでは書いてられないのでそこは省略するが、参考程度にPRのリンクもつけておく。

削除した機能

マルチサイト機能の削除

元々レンタルブログを運用するために開発された機能に見えるが個人的に使っていない事や、保守が大変なことがあり消すことにした。

マルチサイトはWordPressにもある機能だが運用が面倒であり、正直個人的には要らないと考えている。欲しいサイトの数分個別に置いた方が楽だと思う。

Dockerなどでのシングルテナント運営が流行りの今の風潮で考えるならなおのことそうだろう。バラバラにしていた方がカスタマイズなどもしやすいし、権限管理やセキュリティ回りなどでも利点があると考えている。

この対応によりRSSフィードのURLがLyndbaumの時と同じになっている。このため以前のRSS切り戻し問題が再燃しそうである。extends→Lyndbaumの変更でRSSのURLが変わり、Lyndbaum→extendsの切り戻しで戻り、今回はextendsの改修によってRSSのURLがLyndbaumの頃に戻ったとかいう…w

リダイレクトは入れてあるが購読者の方などにおかれては反復横飛びの様になってしまい恐れ入る…。

サブドメイン機能の削除

adiaryにはサブドメインモードと言う機能があり、マルチサイトを運営するときに各サイトをサブドメインに割り振れる機能だったと記憶しているが、マルチサイト機能を消したので道連れになった。

と言うのは建前で、過去にサブドメインモードを試したときにまともに使えなかった記憶があり、バグが眠っていると考えていたので消したという方が正しく、マルチサイト機能の削除はこの機能を消すことが目的の一つになっていた。何が問題だったかは記憶が残っていないので定かではない。

公開画像アルバムと全ページ一覧の削除

本質的に管理機能であるため、管理機能側に寄せた。

全ページ一覧を舐めてみたい人もいない気がするし、アルバムもUIが管理機能感満載で、一般ユーザーが見れて嬉しいと思えなかったため。

スマートフォン向け画像アルバムの削除

レスポンシブ対応にしたため、UAを見てPC/SPに分岐し、スマートフォン向けのアルバムを表示する機能を削除した。

前に作ったOGP選択機能の削除

adiaryを爆発的に改造したで開発した機能だが、画像が増えると微妙なのと、記事外の画像を選ぶのが面倒なのと、サムネイルが拡大できないなど色々面倒だったので、削除して作り直した。

死んだか使い勝手が悪くなったサービスとの連携を削除

  • Twitter通知プラグイン
    • Twitter APIは庶民が使えるものではなくなったため
  • OAuth機能
    • Twitterでしか使ってなかったため
  • Twitterウィジェット
    • Twitterにログインしているユーザーしか見れないため
  • Facebook関連のシェアボタン以外の機能
    • APIキーの必須化が随分前にあり、面倒なため
  • Pocketのシェアボタン
    • サービス終了
  • sitemapのping
    • ping先が既に死んでいた
  • Google Analyticsのユニバーサルアナリティクス
    • 数年前に滅んでGA4に移行したため
  • AMP
    • 最近見ないし多分数年前くらいに滅んでる
  • はてな系の記法
    • はてブとスター以外サービス終了していたため、これ以外は全部消した
  • ASIN記法
    • [asin:…]と書くとアフィリンクが貼れる機能だったが、商品名を手設定する必要があるなど自分でリンク張った方が楽で、存在意義が不明だったため削除
  • name記法
    • 「~たん」や「~たんハァハァ」みたいな出力を作れる記法だった
    • ネタだと思ったので消した
    • ついでに言うと表示に必要なファイルが存在せず、まともに動いてなかった
  • adiary v1, v2に関連するあらゆる実装
    • 互換記法、マイグレーション処理などを全て消した
    • 20年以上前のCMSからextendsに移行してくる人はいないと思うため
  • reStructuredText記法とSphinx連携
    • GitHubの.rstが書けるやつ
    • 観測範囲で使用者がいないのでサポートから落とした(知らない機能なので保守したくない)
  • URLのサムネイルを外部で作る記法
    • レンタルサーバーの容量が50M以下だった時代ならいざ知らず、今の世の中で外部サムネイルが必要なケースがあるとは思えなかったため
    • 今は無料サーバーでも10GBくらいはあるのでサムネイルで溢れることは早々ないだろう
    • さくらのレンサバならライトプランですら100GBある
  • WebPush
    • ニュースサイトとかで通知求められたとき基本拒否すると思うしEdgeはデフォルト拒否だしAdblock入れたら蹴られるものだと思うので消した
  • その他、およそ使わないであろう記法を独自判断でバッサリ消した

変えたこと

スパム対策

ベースはLyndbaumから持ってきているがadiaryの機能を生かすために一部は独自機能にしたもの。

curlのような単純なHTTPクライアントからコメントを投げられないように細工したり、ハニーポットを加えるなどしてBOT対策を強化した。adiaryは元々独自のスパム対策があるため、それに上乗せした形。

その他、IPアドレス指定による投稿禁止やNGワード、日本語を含むかどうかや連投防止など様々なチェックを追加。

管理人を名乗るコメントも出来ないように、管理人っぽい名前を入れてコメントするとエラーになるようにしたほか、管理人は管理人であることが表示で分かるようにした。従来からCSSにクラスはあったが、普通の人はそんなところ見ないので「管理人」と出るようにした(以前から一応文字の見た目は変えていた)

またコメントにリンクを貼られた場合もSEO的に評価されないように属性を付与するようにした。

ImageMagickのセキュリティ対策

LyndbaumではGDを採用したがImageMagickに対して機能面で劣るためextendsではセキュリティ対策をしたうえで、ImageMagickを継続することにした。

ImageMagickに渡す前にファイルヘッダから中身の形式を確かめ、JPEG、PNG、APNG、GIF、WebP、AVIFだけを読み込むようにした。これによってImageMagickが脆弱性を突かれ、任意のコマンドを発行できる可能性を減らした。

同時にアップロード可能拡張子の初期値からTIFFとICOを外した。これはTIFFは脆弱性を仕込みやすいと言われているため。ICOについてはLLMのアドバイスで外した。

Markdownパーサーの改修

Lyndbaumのパーサーをベースに、adiaryのパーサーをマージしていい感じにした。

CommonMarkやGFMには準拠しておらず、それっぽい方言にしている。

例えば改行は<br />、二連続改行は段落<p />としたり、見出し構文は# hogeと書くと# hoge [#l7a712f2]のように変換する。HTMLに出るときには[#l7a712f2]をアンカーリンクとして出すようにしている。これはPukiwikiと同じ仕様で、見出しを変えてもアンカーが変わらないようにしている。Pukiwiki同様アンカーID部分は好きな文字列を指定できるが、既定ではランダムな文字列である。

シェアボタンの最新化

全て最新化し、TwitterとFacebookは件数が取れなくなっていたので件数欄を消した。

HTTPクライアントのUAをサーバー管理者に優しくなるように変更

これもLyndbaumに乗っていた機能である。

adiary extends v4.15 (https://blog.lycolia.info)みたいなUAを吐くようにした。

Mastodonとかがこのタイプで、ログを見たときに出自が解り易い(いやまぁ詐称は容易にできるが…

adiaryには元からUAを設定する機能があったため、実装が楽だったのがありがたい。

360度写真の記法を追加

[image:360:…]と画像記法を書くことで360度写真用ビューアプラグインを使えるようにした。これまではファイル名で判定されており、無関係なファイルが巻き添えになっていた。

公開フォルダをpub/に集約

これもLyndbaumの思想を持ち込んだやつ。

公開フォルダは元々4つあり、ページ名と衝突していたほか、管理が煩雑だったためpub/に集約した。

これによりjs/、pub-dist/、theme/がpub/配下に移動した。

base.cssの容量削減

以前公開画面と管理画面を実装上分離したが、CSSはそのままだったため、CSSも分離した。これによって公開ページ向けのbase.cssは47.5KBから38.6KBに容量を削減できた。

管理画面のレイアウト変更

例によってWordPressっぽくしている。Lyndbaumをベースに作っているが結構変えているので、そんなに似ていない。

画像アルバム・タグ・ページツリー(コンテンツツリー)については元のUIが便利なので、ほぼそのまま残している。

タグ入力のインクリメンタルサーチも以前extendsに組み込んだものをそのまま残している。

PageSpeed Insightsのスコア改善

  • 記事に挿入した画像にwidth, heightを付与するように
  • RSSのバナーにもwidth, heightを付与
  • 動画・音声記法で出る動画へpreloadを付与
  • Prism.jsにdefer追加
  • nginxの設定サンプルを追加し、静的資材にキャッシュヘッダを生やす設定サンプルを追加

RSSのフォーマットをRSS 2.0の仕様に準拠するようにした

Lyndbaum開発時のadiary置き換え計画 進捗その2でやったことをそのままバックポートしただけ。

記事の編集で、保存していない変更があるまま離れるときに確認するようにした(誤操作による離脱防止)

Lyndbaum開発時のadiary置き換え計画 進捗その3でやったことをそのままバックポートしただけ。

関連PR

v4.09 / v4.10 / v4.11 / v4.12 / v4.13 / v4.14 / v4.15

あとがき

Lyndbaumから相当量の機能をバックポートしたので、だいぶ使い勝手がよくなり、機能的にもLyndbaumっぽくなってきた。そのうち名前をLyndbaumにしてもいいかもしれない。

作っていて思ったのは0から同じものを作るより、既にあるものを改造した方が遥かに楽で心配事もなく、運用にも問題が生じなかったことだ。

コアについてはほぼ触っていないので、恐らく実行時間は誤差の範疇でしか変わっていないと思う。adiary-extendsを爆発的に改修している話で1ms増えた気がしていたが、計測回数が少ないので誤差だったかもしれない。この辺りのベンチマークも落ち着いた頃に取っていきたい。

なおここまでの開発で破壊的変更をがっつり入れているが、adiary Version 3.52devからExtends Version 4.15まで移行するためのマイグレーション処理は組み込んでいるため、adiaryを使っている人であれば移行することができる。但し記法などを一部切り捨てているため、それらを使っている場合は支障が出ることもあるとは思う。

また今回変更になったパスについてはリダイレクトをかけているため、基本的に支障になることはないと思われるものの、世のRSSリーダーがどれほどリダイレクトによるURLの自動変更に対応しているか不明なため、先行きは不明である…。