開発や公開の続いている和製CMSの一覧

掲載基準は私が見つけることができたもので、配布サイトが生きていたものとしている。

adiary

最終更新:2026年6月24日

高速で使いやすいCMS - ブログ/Wiki/Markdown - adiary official website

Perl製のCMSで日記機能とコンテンツページ機能を備える、現在うちのブログで使っているやつ。はてなダイアリーのクローンのような存在で、リッチな機能が薄く、古い人間には使いやすいと思う。モダンよりレガシーみたいな感じだが、Markdownが使えるのが最大の特徴だ。

実行環境はCGI/FastCGI/組み込みサーバーの三つが選べるため、レンタルサーバーでも、自宅サーバーでもVPSでも動く。動作は軽快でWordPressより遥かに軽い。

対応記法は、はてな記法の亜種である、さつき記法、Markdown、HTML、reStructuredTextがある。Markdown記法は概ね問題なく使えるが癖がある。CommonMarkとGFMが中途半端に実装されており、脚注記法などに対応していないほか、エスケープ周りで細かいバグがある。

DBはテキストファイルDBとRDBが選べるため、格安レンタルサーバーでも使いやすい。RDBはMySQLとPostgreSQLに対応している。但し個人ブログ程度の記事量ではテキストDBがDBドライバが起動してる間に全てを完了させられるため、RDBを選ぶ意味はほとんどないと思う。SQLiteに対応するパッチを書いたことがあるが、800記事程度ではFastCGI環境下ですらテキストDBの方が早かった。

個人開発であるため、仕様に思想が強く好き嫌いが解れる部分も多々あると思うが、その辺りはソースをいじってなんとかできる。

adiary-extends

私はかつてadiary-extendsとして以下のように幾らか小手先を改造したものを運用していたが、後述するように今はadiaryをベースにした魔改造CMSを使っている。

  • クリップボードから画像をアップロード可能にした
    • 本家は今でもたぶんできないと思う
  • Lightbox2をFancybox v3.5.7に置換
    • これは後日、本家にも似たような対応が入った
  • 任意の画像をOGPに設定可能にした
    • 凄い雑な実装をしているが一応可能になっている
    • 本家では記事先頭の画像がOGPになる

他にもいくつか追加している。

Lyndbaum

私がadiary-extendsのアップデートを続けて改修しているもので、adiary置き換え計画始動から連なるものとして膨大な手入れをしている。このへんに変更履歴があるが最新版であるv4.21については本記事執筆時点ではまとめていない。

大まかに次の改修を施しているが、adiary-extends時代にやったことも混ざっている。

  • 不必要な機能の削除
    • RDB機能の削除
      • 前述のとおり存在意義がないため
    • マルチサイト機能の削除
      • WordPressなどにあるような複数サイト運営の機能を丸ごと削除した
      • WordPressでもそうだが、この機能には多くの問題があり、バグも内包していたため切り捨てた
  • レスポンシブデザイン対応
    • かつてはUAでPCとSPとサーバーサイドで切り替えて応答HTMLを変える懐かしの実装だったが、これをやめてレスポンシブデザインにした
  • SEOなど、クローラー向けの改善
    • LCP, FCP, CLSなどの初回ロードにかかわる数値の改善
    • meta descriptionの追加
    • OGPを無条件で出せるようにした
      • 元々UAでOGPが出るようになっていたが、無条件で出すようにした
  • Markdownパーサーの改良
    • 不足していた構文の実装のためCommon MarkやGFMの機能を取り込み、バグってる構文もこれに基づいて修正した
    • Common MarkやGFMはそのままだと扱いづらいため、日本人向け[1]に改良してある
  • 管理画面と閲覧画面の分離
    • 何を言っているか分からないと思うがadiaryは管理画面と閲覧画面が融合しており管理画面に余計な要素が多かった
    • このため一般的なCMS同様、これを完全に分離した
  • コメントスパム対策の強化
    • IPアドレスによるコメント禁止機能(CIDR対応)、NGワード機能、リンクを含む投稿の制限、短すぎるコメント、日本語を含まないコメントの制限、連投制限など、スパムコメントを弾く機能を強化した
  • NSFWコンテンツ対応
    • 年齢制限のあるコンテンツを公開するための年齢確認、ブラー、検索エンジンへの通知機能を追加している

tDiary

最終更新:2026年10月9日

tDiary.org

みんな大好きtDiary!と言いたいところだが、このCMSの存在を知っている人は今ではインターネット老人か、ニッチな趣味を持つ若者くらいだろう。

はてなダイアリーの元祖クローンであり、RubyでCGIとして実装されている。

はてなダイアリークローンとしてみると、adiaryの親戚的なCMSでもある。公開日はtDiaryの方が古く2002年2月20日で、adiaryは2006年7月10日だ。

てがろぐ

最終更新:2026年6月29日

お手軽マイクロブログCGI「てがろぐ」:スキン式で複数ユーザ対応 - にししふぁくとりー

今日において創作界隈で一定の支持を持っているCMSで、Perl製のCGIとして実装されている。初出は2017年12月07日と、Perl CGIとしてはかなり新しい部類だ。

Twitterのようなタイムラインを作ることができるため、マイクロブログに近い使い方ができるのが特徴で、SNSに疲れたけど何かを発信したいとか、自分のサイトにたぶんを載せたい用途にマッチすると思われる。

Serene Bach

最終更新:2026年10月25日

sb開発研究所

Go製でCGIと組み込みサーバーに対応しているCMS。かつてsbとして一世を風靡していたCMSの一つで、初版であるsbは2004年9月14日公開と、tDiary並の古参である。現在ではWordPressとHugoの中間にある軽量な選択肢を名乗っている。

本記事掲載のCMSの中で唯一スクリプトでなく、バイナリで動作するものだ。動作してはmacOS、FreeBSD、Linux、Windows向けのARM64, AMD64(x64)バイナリがサポートされているようで、クロスプラットフォームで動作するのが嬉しい。

個人的にはBlogn→BlognPlus→の流れでCMSを色々触っている中で採用候補としてsbを試したことがあるので、少しだけ縁がある。

英語の説明がメインで日本語の説明が少ないのが日本人向けとしてはやや難しそうだ。ちょっと興味が湧いたので実際にレンタルサーバーに置いて動くか見たので、[さくらのレンタルサーバーにSerene Bach v4を設置してみた
](0824)で記事にしたりもした。

shiromuku DIARY

最終更新:2024年4月3日

Perl CGI's By Mrs. Shiromuku

Perl製のCGIで、KENT-WEBの掲示板CGIにありそうな素朴なデザインのやつ。最近は更新されていないようだが、2年前に更新があったので載せることにした。

確認できた範囲では2003年6月12日が最も古いタイムスタンプだったので、かなりの古参のようだ。全く聞いたことがなかったのでCMS界隈の広さを感じる。

Pukiwiki

最終更新:2022年3月30日

FrontPage - PukiWiki-official

現在でも日本Wiki界隈のデファクトスタンダードと思われるWiki向けCMS。現在でも結構活発にフォークされておりMarkdown対応を謳うものも存在する。

基本的にCGIであり、PHPで実装されている。Markdownが普及した現在となっては中々厳しい状況だと思うが、チケット管理システムであるBacklogのWikiでPukiwiki構文が使えるなど、割と日本に根差した存在だと思う。

初出を調べてみたもののWikipediaにある2001年以上の情報を得ることは出来ず不明だった。作者のサイトのWebArchiveは2004年以降しかなく、見つけられた範囲で最も古い利用者のサイトでさえ、2002年時点だった。

PukiwikiはYukiwikiのPHP移植であり、元ネタがあるのだがそちらは2018年で更新が止まっているようだ。しかしこれだけ古いと、もうYukiwikiの作者は鬼籍に入っているだろうな…と思ったらめちゃくちゃインターネットで見たことあって椅子から転げ落ちてしまった。というかFediverse界でも超有名人だったわ…。

Pukiwikiは私が最も長く運用しているCMSで、現在でもFrontPage - ECO-Wiki (lycolia)で利用しているし、過去にROの職Wikiを運営したこともあるほどだ。ROの職Wikiはアクセスが凄まじく、一日のPCが一万ほどあったと思うし、当時のさくらのレンサバは負荷に耐えられず、よく落ちていた。

まとめ

基本的に最新版のことを書いている。

ソフトウェア 動作方式 実装言語 初出 最終更新
adiary CGI/FastCGI/組み込みサーバー Perl 2006年7月10日 2026年6月24日
tDiary CGI Ruby 2002年2月20日 2026年10月25日
てがろぐ CGI Perl 2017年12月07日 2026年6月29日
Serene Bach CGI/組み込みサーバー Go 2004年9月14日 2026年10月25日
shiromuku DIARY CGI Perl 2003年6月12日 2024年4月3日
Pukiwiki CGI PHP 2001年のどこか 2022年3月30日

  1. 改行を素直に改行として扱う方式。Qiitaやはてなダイアリー、Typoraでは改行を開業として扱えるが、本来の仕様では行末に半角スペースが不達必要で日本語を書くにあたり煩わしいのだ。 ↩

さくらのレンタルサーバーにSerene Bach v4を設置してみた

さくらのレンタルサーバーにSerene Bach v4.0.0-beta.25を設置してみたので、その時のメモ。運用する気がないため画面が出ることと記事が書けること以外何も見ていない。

公式のドキュメントが日英混在で解りづらく、なんか書いてるのを適当に試しても上手く行かなかったので手順を残す。

前提条件

/home/<ユーザーID>/www/blogに設置し、このパスにblog.example.comを割り振り、https://blog.example.comでアクセスするものとする。

設置手順

  1. 必要なファイルをダウンロードし設置する

    # 展開先のパスをここに書く
    DIST="blog"
    
    mkdir -p "${DIST}"
    wget 'https://github.com/serendipitynz/serenebach/releases/download/v4.0.0-beta.25/serenebach-v4.0.0-beta.25-freebsd-amd64.tar.gz'
    tar xzvf serenebach-v4.0.0-beta.25-freebsd-amd64.tar.gz -C "${DIST}" --strip-components=1
    rm serenebach-v4.0.0-beta.25-freebsd-amd64.tar.gz
    cd "${DIST}"
    chmod 755 serenebach
    mv serenebach serenebach.cgi
    
    cat <<'EOF' > .htaccess
    RewriteEngine On
    # ブログをサブパス(例 /blog/)に置く場合は、実際のパスに合わせる:
    RewriteBase /
    
    # ① データベースなど内部ファイルを外部から遮断する(最優先・必須)
    RewriteRule ^data/ - [F]
    
    # ② すでにサーバにある「古い画像ファイル」だけ直接配信する。
    #    実在チェック(-f)で絞るのがポイント。存在しない画像リクエストは③で
    #    Serene Bach に渡り、アップロード画像・OG カードなどが配信される。
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^img/ - [L]
    
    # ③ それ以外はすべて CGI へ渡す(ブログ本体・旧 sb.cgi・旧 *.html・
    #    カテゴリーディレクトリも Serene Bach に届き、旧 URL 転送が働く)
    RewriteRule ^serenebach\.cgi/ - [L]
    RewriteRule ^(.*)$ serenebach\.cgi/$1 [L]
    EOF
    
  2. https://blog.example.comにアクセスしセットアップを流す

  3. 最初のセットアップ画面。管理者ユーザー名、パスワードさえ入れれば通る。
    最初のセットアップ画面。管理者ユーザー名、パスワードさえ入れれば通る
  4. ログイン画面。さっき設定した内容でログイン
    設定するとログイン画面に遷移するのでさっき設定した内容でログインする
  5. 管理画面。新規記事で記事が書ける
    ログインすると管理画面に遷移するのでここで記事が書ける
  6. 執筆画面。HTML、Markdown、sbtextを選べる
    新規記事作成画面ではHTML、Markdown、sbtextを選べた
  7. 公開画面トップ
    https://blog.example.comにもう一度アクセスすると公開ページのトップが出るようになっていた

Serene Bach v4とLyndbaum、GitHubでMarkdownの解釈を比較してみた

GitHubを正とした場合、次の違いが見られた。パーサーごとにこういう違うが出るのは面白い。

  • Lyndbaum
    • 斜体構文が下線付きで太字、斜体にならない(HTML上は<em>で出しているため仕様上は正しい。CSSでわざとやってる)
  • Serene Bach v4
    • 引用のネストで色が変わる、斜体になる
    • 単なる改行は未反映
    • 脚注構文未対応
      • リンクは出るが文字列に飛ぶ
Serene Bach v4 Lyndbaum v4.21 GitHub
上記で利用した構文
# 見出し1

## 見出し2

### 見出し3

#### 見出し4

##### 見出し5

###### 見出し6

####### 見出し7

# ほげ

段落1寿限無、寿限無、五劫ごこうのすりきれ、海砂利水魚、水行末・雲来末・風来末、食う寝るところに住むところ、やぶらこうじのぶらこうじ、パイポ・パイポ・パイポのシューリンガン、シューリンガンのグーリンダイ、グーリンダイのポンポコピーのポンポコナの、長久命ちょうきゅうめいの長助!

段落2日本語のMarkdownを
快適に書ける
そんなパーサーがあるといいな

## ふが

1. 番号付きリスト
2. ほげほげ

ここは段落

- ふつーのリスト
- ふがふが

ここも段落

- ふつーのリスト
  - ネストされたふつーのリスト
- ぴよぴよ
  1. ネストされた数字のリスト
  2. にこめ
     - ネストされた普通のリスト

1. 番号付きリスト
   - ネストされたふつーのリスト
     - 更にネストされたふつーのリスト
2. ほげほげ
3. 一行空きリスト開始

   ```bash
   #!/bin/sh
   # デバイスが存在しなければ終了
   [ -n "$DEVICE" ] || exit 0
   ```

4. 一行空きリスト終了(Prettierのフォーマットで生まれる)

リストとリストの間に別のブロックが入ると切れる

1. uniuni
   ```bash
   #!/bin/sh
   # デバイスが存在しなければ終了
   [ -n "$DEVICE" ] || exit 0
   ```
2. aa

## ぴよ

[リンク](https://example.com)

_斜体_
**太字**
~~取り消し線~~

> スペース空き引用
>
> > スペース空き引用の中の引用
> >
> > > スペース空き引用の中の引用の中の引用
>
> コードフェンス引用
>
> ```php
> <?php
> echo "aaa";
> ?>
> ```

<!--prettier-ignore-->
>スペースなし引用
>
>>スペースなし引用の中の引用
>>
>>>スペースなし引用の中の引用の中の引用
>
>コードフェンス引用
>
>```php
><?php
>echo "aaa";
>?>
>```

# 季節の食べ物について

## そうめん

今年もそうめん[^1]の季節になってきた。

[^1]: 関西地方でよく食べられる細い麺である。

## うどん

うどん[^udon]もいいだろう。

[^udon]: 讃岐うどんがうどんのすべてのような顔をしているが稲庭うどんなどもある

<http://example.com>

a ->
<-b
<-hoge->

| th1 | th2 |
| --- | --- |
| aaa | bbb |
| ccc | ddd |

---

# 番号リストテスト

1. あ
2. い
3. う
4. え
5. お
6. か
7. き
8. く
9. け
   - 桁が変わると
10. こ
    - 桁が変わるとインデントが深くなる



ほげほげ[^11]

[^11]: ほげほげの脚注

# ああああ

ふがふが

ぴよ[^12]ぴよ

[^12]: ぴよぴよの脚注

## いいいい

foobarbaz1[^124]
foobarbaz2[^124]
foobarbaz3[^124]

# C#

[^124]: foobarbazの脚注

あとがき

Lyndbaumの斜体問題についてだが、これは仕様としている。

まず個人的に_underscore_は下線だと考えており、斜体は*italic*だと考えているの。しかしMarkdown的にはどちらも同じで、Prettierは文脈に応じてアンダースコアをアスタリスクに変換するため、文中にこの二つが混在することがしばしばある。

つまり下線付きか斜体かを区別することが難しい。そこで私は下線付き太字として本来のMarkdownと異なる解釈をすることにした。斜体って読みづらいし。HTML的には<em>で出ているので見た目だけの問題である。

Lyndbaum v4.20アップデート

adiary置き換え計画始動から連なる、adiary extends v4.19アップデートの続き。adiary extendsはLyndbaumにリネームしたため、今回からは名乗りを変えてゆく。

旧Lyndbaumからバックポートするネタが枯渇し、私が使う場合に関して言えば必要な機能は最低限揃った状態だ。他人が使えるかどうかかどうかは余り考慮していない。ここまでの改修で本体側に目に見えるパフォーマンス劣化はなく、これは非常に良かった。

今回は前回よりバージョンが0.01上がって311行追加、160行削除だった。今回はドキュメントとCIの整備がメインで、多少のUX改善を実施した。

と言うことで今回のアップデートを書いてゆく。

今回の変更

管理画面のナビ文言を解り易くした。

変更前 変更後

「記事」を「記事一覧」に、「コメント」を「コメント一覧」にしただけで、非常に軽微な修正だが、パッと見て解り易いことは日々のストレスを減らすのに役立つと考えている。

記事一覧の「公開」が「すべて」のときに、下書きが出ていなかったのを出るようにした

変更前 変更後

これまでは公開記事と非公開記事しか出ていなかったが、下書きも出るようにした。

Lyndbaum0からのバックポートの一つだが、Lyndbaum0では下書きが上にまとまる仕様だったのを、今回は単純な時系列にしている。

Lyndbaum0で下書きが上にまとまる仕様はOpus 5.5が勝手に作ったもので、意図したものではなかったので微妙に思っていたが、そこは引き継がれなくてよかった。

ついでにこれまでは記事の公開状態で公開記事が「公」と出ていただけだったのを、「非公開」と「下書き」も出すようにし、「公」も「公開」と出すようにした。

管理画面のごみ箱で画面幅を狭めると要素がボックスを貫通する不具合を修正

行を収めている下地から行が突き抜けている

この画面だけレスポンシブUIの実装に変な挙動があり、突き抜ける状態だったのを突き抜けなくした。

実装は他の一覧系と共通だったようだが、要素のサイズが他の画面と異なる関係でゴミ箱だけ突き抜ける状態になっていたらしい。

参考までに突き抜けていた時の挙動を上に残す。どうも行UIからカードUIに変化する境界で上手く変換が出来ていなかったようだ。

やらなかったこと

やろうとしていたけどやめたこと

サムネイルのAVIFやWebP対応を断念

AVIFが非常に良いフォーマットだというのに興味を持ってAVIF対応をまず検討したが、保存処理が非常に重く、この段階で断念した。

WebPは以前検証したときに容量が大して減らなかった気がしたので、AVIFが載せられないならWebPも別に以下と言うことで却下した。

またほかにも理由がある。Lyndbaumではサムネイルを出すときに[image:S:posts/2026/10/:hoge.png:]のような構文を使っており、この構文を指定すると自動的にサムネイル画像と本体画像へのリンクを出力するようになっている。しかしこの構文はサムネイルの画像フォーマットをどこにも持っていない。なぜサムネイルのフォーマットを持っていないかと言うと、そもそも同一ブログの中に複数の形式のサムネイルがあることを想定していないからである。

WordPressのようにWYTSIWYGでHTMLを正本にしているシステムでは問題にならないが、Lyndbaumでは問題になるのである。サムネイルの形式を構文に持ちたくないし、過去の膨大な画像のサムネイルをすべて変換するのも非現実的だし、この手のフォーマットはポッと出てポッと消えたりするため、運用面での対応が難しいと判断し、サムネイルをAVIFやWebPにする対応をやめることにした。

PageSpeed Insightsを無駄に追っても仕方がない。TwitterやGitHubのようなサイトもHTMLやJSが地獄のように重く低速回線ではまるで読み込めないし、それを考えたらうちは軽いし偶にある画像まみれのページの読み込みに問題があるくらい些細なことだろうとして片づけることにした。第一画像読めなくてもページは出るし。ページそのものが出ない最近の激重サイトと比べたらマシだと思う。それにどれほど軽量化したところで画像が無限に並ぶページはどうにもならない。

PageSpeed Insightsの推移

計測をトップページにしている関係でブレが出る計測を続けてきたが、取り敢えず現状のトップページではパフォーマンス100になるケースが出ることが分かったので、いったんここで計測を打ち切ろうと思った。満足。

今回の変更には特にスコアを改善する要素がないため、単純にトップページが軽くなっただけではあるが、表示画像サイズの削減や動画のサムネイル化、レスポンシブデザインの導入などの過去の施策によってLCPやCLSは確実に改善しているため、

モバイル

バージョンとスコアリンク パフォーマンス ユーザー補助 おすすめの方法 SEO エージェントによるブラウジング
v0.41.0 100 69 92 82 1/2
v4.5 87 86 100 82 1/2
v4.7 88 86 100 82 1/2
v4.13 85 86 100 82 0/2
v4.17 92 86 100 82 1/2
v4.19 100 86 100 91 1/2
v4.20 100 86 100 91 1/2

PC

バージョンとスコアリンク パフォーマンス ユーザー補助 おすすめの方法 SEO エージェントによるブラウジング
v0.41.0 95 74 96 82 1/2
v4.5 76 82 100 82 1/2
v4.7 76 82 100 82 0/2
v4.13 76 82 100 82 0/2
v4.17 100 82 100 82 1/2
v4.19 99 82 100 91 1/2
v4.20 100 82 100 91 1/2

実際のユーザーの環境のメモ

モバイル PC

28日後にこの辺りも改善されてるといいな。

おまけでCore Web Vitals Summaryも置いておこう。

あとがき

自分で使う分には概ねいい感じになったので満足している。後は困ったときにちょいちょい直したり、気が向いたら他の人が使えるようにもしていけたらいいなと思った。

adiary extends v4.19アップデート

adiary置き換え計画始動から連なる、adiary extends v4.17アップデートの続き。

流石にLyndbaumからバックポートするネタも尽きてきたので段々やれることがなくなってきた。負債解消を検討しても調べると厳しいというパターンが多い。概ね大体がadiaryのパフォーマンスの源泉なのだ。機能は落としてもパフォーマンスは落とさず改修するのが軸なので、パフォーマンスが落ちる時点で対応は出来ない。ただまぁやることがなくなってきたのはいいことではある。LLM代もタダではない。

今回は前回よりバージョンが0.02上がって2,643行追加、3,172行削除だった。この内、ドキュメントの追加行が5-600行程度あるため、大まかには掃除である。

と言うことで今回のアップデートを書いてゆく。

今回の変更

RDBMSのサポート廃止

adiaryはMySQLとPostgreSQLに対応していたが、これらを利用するユースケースが思いつかなかったため削除した。と言うのもOpus 5.5に調べさせたところ、1万記事程度までならSQLiteよりTextDBに分があるとのことで、それより確実に遅いMySQLやPostgreSQLが必要になるケースが思いつかなかったからだ。SQLiteはRDBMSの中では最も速い[1]と言われており、これより遅い時点で話にならないのである。

CGIで動かす場合は毎回DBドライバを呼ぶことになるため、DBドライバのいらないTextDBは非常に優位になる。FCGIの場合でも倍くらい差がある。

ユーザー管理に「操作の記録」の画面を追加

adiaryはログインやログアウト、アカウントに対する操作をログに取っているのだが、これを確認する画面がどこにもなかったので作った。

サムネイルの大きさと画像の挿入の既定値を全体設定で一元管理するようにした

adiaryは画像をアップロードする単位でサムネイルサイズを設定できたのだが毎回設定しないしUIがあると煩わしいため全体設定に寄せて個別設定できないようにした。

WordPressも記事に挿入する画像のサイズをいじれるが、あれを使っている人がどれほどいるのか分からない。画像の左右にテキストを回り込みさせたいみたいな躍動的な記事を書くようなケースでは有用だと思うが、私にその需要がなかったのでこうした。

ダイアログの中の数値入力の矢印で、値が止まらずに動き続けるのを直した

input type=numberの要素で矢印を押すと無限にインクリメント・デクリメントされていたので、この制御をしてるJSを殺した。

記事に出す動画のサムネイルの長い辺を、1280pxから960pxにした

PageSpeed Insightsで動画のサムネイルの容量がデカすぎると言われたので少しだけサイズを落とした。480px表示なので480pxでいいと思うのだがOpus 5.5が小さくし過ぎるとスマホでぼやけるからやめておけと言うので嘘か本当か分からないがこうした。

そもそも静止画のサムネは320pxな訳で何ら問題ないわけだし、次のアップデートで480pxに落とすと思う。

品質を落としたWebPかAVIFにしたらいいのは解らないでもないのだが、AVIFは非常に使い勝手が悪く、ClaudeやChatGPTのWebUIでは扱えなかった記憶がある。またこの手の規格は割とコロコロ変わって面倒なので余り手出ししたくないのが本音だ。どうせ次はJPEG XLが来るのだろう。正直この部分についてはPageSpeed Insightsの指摘を無視してもいいかなと言う気がしているので放置するつもり。

metaタグのdescriptionを出すようにした

昔はGoogleでは付けても無価値と言われていた気がするのだがPageSpeed Insightsがうるさいので付けた。

Bing Webmaster Toolsでは前々から出ていた指摘なのでついでに潰せて丁度いい。

ページ送りの行けない方向を非表示にした

次のページや前のページがない時にナビを出さないようにした。これもPageSpeed Insights対策。

画像アルバムのサムネイルを同じ大きさのマスに並べ、UIに幾つか手を加えた

画像アルバムのサムネイルを同じ大きさのマスに並べ、並びの既定を日付の降順にし、邪魔なコントロールを消し、ファイル名でフィルタ出来るようにした。

変更前 変更後

変更前は細長い画像や小さい画像があると見づらいし、面積当たりの情報量が多いのはいいのだが整然としていないのがどうにも微妙だと感じていた。

そこで全部同じ矩形に入れ、碁盤状にすることでどこに画像ファイルがあるのかを解り易くした。面積当たりの情報量は減ってしまったがトレードオフだ。

その代わり最近追加したファイルを探しやすくできるようにデフォルトのソートをアップロードした日付の降順にした。これは最も頻繁に探すのは最近追加したファイルだからだ。アイキャッチ画像(OGP)を決めるときや間違ってアップロードしたのを消すときや、前回の記事で貼った画像を再利用するときなどに重宝する。

またサムネイルのサイズを変える機能もあったが、邪魔くさかったので消した。消してスペースができたのでLyndbaumにあったファイル名でフィルタする機能を追加した。

参考までにadiary本家だとこんな感じだが、UIがコンパクトなのでサムネイルのサイズを変える機能があっても気にならないというか、私はそもそもこの機能に気づいてすらいなかった。

画像アルバムの名前をメディアにし、URLを?album/から?media/にした

画像以外も上げられるのに画像アルバムは変だよなと言うことで名前を変え、パスも?album/から?media/に変更した。

一つ上の見出しの変更前と変更後にも出ている。

記事一覧の題名のリンクを、記事の表示から編集画面にし、絞り込み機能を追加するなどした

管理画面にある記事一覧だが、以前はタイトルのリンクを踏んだ時に公開ページが表示されていた。これを編集ページを開くように変えた。Lyndbaumからのバックポートの一つである。

更に種類の列と、種類と公開・非公開の絞り込みを追加した。adiaryには記事とコンテンツページが種類としてあるので種類にはそれが出るようにしている。adiaryでは記事とページは相互に切り替えることができる。実装的にはctypeが空なら記事、wikiならページと言う扱いになっている。

URLの形式は記事とページで明確に異なる。記事は^0\d+$にマッチするURLで、ページはそれ以外のURL規則にマッチするものすべてだ。ただ、データ上はどちらも数値IDを持つレコードとして管理されている。記事はIDで、ページはページ名でアクセスする仕組みだが、実体は同じなので、実はページも数値IDでアクセスできる。ややこしいので上手く説明しづらい…w

恐らく飛んできた値が数字でなければ文字列でインデックスを当てる処理をしていると思う。実装は見てないし、LLMにも聞いてないので適当に書いている。

コメントに承認待ちを足し、コメント一覧で承認済み・承認待ちが分かるようにした

主にスパム対策で、誤検知で引っかかったコメントを救済する機能。WordPressとかによくある奴。

システム名をadiary-ExtendsからLyndbaumに改称

Lyndbaumからのバックポートを大分やった結果、もはやこれはLyndbaumと呼んでよいのでは…?と思ったので名前を変えた。Extendsってのもなんだか野暮ったいし、世の中のOSSはフォークでその名前を変えていることも少なくないからだ。既存のコードの中に「adiary extended」と言うワードがあり、これと被って紛らわしかったのもある。

例えばMastodonのフォークではglitch-socやkmyblue、Fedibirdがあるし、Misskeyにもsharkey、cherrypick、iceshrimpなどがある。もっと大御所で言えばMySQLのフォークであるMariaDB、RedisのフォークであるValkey、Debianのフォークと言えるUbuntuなどもある。

ぶっちゃけ現時点では本家との互換性もほとんど壊れており同一性と言う意味では怪しい。精々adiary 3.52dev時点からアップデータ経由でアップデートできるくらいしかない。それもTextDBでかつMarkdownを使用していて、これまでに削除した記法を使っておらず、非公開コメントを使っていないなど、多数の前提条件が付いたうえでやっと可能なことだ。それらを使っている場合のコンバート機能はつけていないし、UAによるスマホモード切替も廃止したので既存のテーマは全滅しているなど、甚だしく互換性を失っている。

ただそれでもadiaryからフォークし、コアであるSatsukiSystemは維持しており、TextDBは健在だし、テンプレートエンジンの様式であるSkelも生きているので、全くの別物という訳でもない。

リポジトリはlyndbaum4として、今までLyndbaumと呼んでいたやつはlyndbaum0として分けた。4と0の違いは振っていたバージョンからそのままつけている。

余談だが本家ではSatsukiSystemをフォークしたと思われるSakiaを開発しているようで、どうやら今後はこちらを軸にしていくようだ。

動画や記事のサムネイル生成処理を共通化し、更にファイルサイズを落とす対応の実施

元々動画のサムネはOpus 5.5の気分によってやたら画質が良く、JPEG品質85だった。クライアントサイドで動画からJPEGサムネを作りサーバーはそれを受け取って保存、表示するだけだった。

これをクライアントではPNGサムネを作り、サーバー側にある共通サムネ生成処理を通すことで普通の画像のサムネと同じ条件であるJPEG品質80に揃え、容量を落とした。ついでにこの処理にプログレッシブ処理を追加し、更に容量を削れるようにした。

これによって動画のサムネイルは平均14.5%のサイズダウン、普通の画像のサムネイルは2%のサイズダウンが実現でき、将来的にavifやwebp対応を考えた場合も統一的に変更できるようになった。

adiary向けのpingが失敗する問題を修正

Opus 5.5の言うことを真に受けたら失敗するようになっていたので直した。恐らくHTTPクライアントのUAをサーバー管理者に優しくなるように変更から起きていたと思われるが昨日まで気づいてなかった。

Opus 5.5はadiary向けのpingはUAを別にセットするから大丈夫とか言ってたのだが、コードを見たらどう見ても規定値を変数で突っ込んでおり、どうやらその関連性が読めなかったようだ。

管理画面のリンクとカードタイトルが視認しづらい問題を目立つように修正

変更前 変更後

僅かな差だが背景色とリンク文字のコントラスト比が改善し文字が見やすくなった気がするのと、カードタイトルが太字になり、視認性が高まったと感じている。

この差分についてはLyndbaumのスタイリングを取り入れている。

IDの同時ログインセッション数を、設定ファイルからシステム管理画面に移動

adiaryは同時セッション数を設定で変更できるのだが、これは画面ではなくファイル側に設定があり、解りづらかった。そこで管理画面に設定を移し替えた。

アップデート時にアップデートしろと出るだけで手順が解らなかったのでアップデートするためのリンクを生やした

本システムにはアップデート処理を伴うアップデートがあった場合にお知らせする機能があるのだが、お知らせするだけで何をすればいいのか直感的ではなかったため、アップデートページへのリンクをつけた。

FCGIモード用のスクリプトにメモリリークを起こすバグがあったのを修正

adiary本体にもある不具合の修正。

なんか最近たまにサーバーが劇的に重いなと思ってGrafanaを見ていたらメモリ使用量が上限に達しており、調べたらデーモンがOOMを吐いて再起動していた。タイミング的にClaude Codeが何かしてる時に良く起きていたため調べたところ、FCGIの起動中にFCGIファイルが書き換わると特定の条件でプロセスが無限に増殖するバグがあり、3秒ごとに起動時の引数で指定されたプロセス数が増殖していた。

3秒ごとに増える理由は3秒ごとにプロセス数をフェッチして減ってたら復活させる処理があった関係だ。そしてこの時の判定と増分がおかしいせいで無限増殖が起きる状態だった。

実装上は(指定されたプロセス数 - フォークしたプロセス数 - 1)が0でなければ指定されたプロセス数を新しくフォークする内容だった。

例えば指定されたプロセス数が10だとして親プロセスと合わせて11プロセスが起動する。この時10-10-1となり-1になるため、0を満たすことができずプロセスがフォークされ、次回は10-20-1となり-11で更にフォークされ…といった具合で増えており、OOMが出るまでプロセスが無限に増殖していた。

厳密な再現条件は不明だが、少なくとも自身が書き換えられてすぐにHTTPリクエストが飛んできた場合に発生していた。そしてこの条件はClaude Codeが作業をする流れで発生していたため、Claude Codeを使って開発していた時に発生していた。

基本的にこのファイルを直す必要性は低いのだが、恐らくClaude Codeは何も考えずにFCGIを修正し、修正対象じゃないのでコミットのタイミングで元に戻すみたいなことをしばしばしていたので起きていたのではないかとみている。なお本番でも一回起きており、恐らくこれはFCGIファイルのアップデートをした直後にアクセスがあって起きていたものと考えている。

恐らくこれはadiary-extendsをlyndbaumにリネームしたときにルートに存在していたcgi系のファイルを軒並みリネームした影響で発現した潜在的な不具合だと考えている。基本的に発生しない不具合とはいえ、一度起きるとサーバーが不安定になるためadiary本家にもPRを提出している。

PageSpeed Insightsの推移

相変わらず比較対象をトップページにしてるため計測の度にブレがあり、信頼性は微妙だが、これで測り始めた以上これで続けている。検索流入があるのは個別ページなのでなんかいい感じのページで測るのも一つかもしれないが、今度は指標別にやる必要とかが出てきて面倒なので一旦このままで…。

取り敢えず今回の対応でモバイルのパフォーマンスは100になった。PCは99に落ちた。謎。

モバイル

バージョンとスコアリンク パフォーマンス ユーザー補助 おすすめの方法 SEO エージェントによるブラウジング
v0.41.0 100 69 92 82 1/2
v4.5 87 86 100 82 1/2
v4.7 88 86 100 82 1/2
v4.13 85 86 100 82 0/2
v4.17 92 86 100 82 1/2
v4.19 100 86 100 91 1/2

PC

バージョンとスコアリンク パフォーマンス ユーザー補助 おすすめの方法 SEO エージェントによるブラウジング
v0.41.0 95 74 96 82 1/2
v4.5 76 82 100 82 1/2
v4.7 76 82 100 82 0/2
v4.13 76 82 100 82 0/2
v4.17 100 82 100 82 1/2
v4.19 99 82 100 91 1/2

今後の開発予定

v4.20の予定

バグ対応がメイン。

  • Android Edgeで下書き一覧で選択時の前景色が文字にしか掛かっていないかも
  • 画面幅を狭くするとゴミ箱で画面要素が突き抜ける
    • この手の部品は共通化して起きないようにする
  • 管理画面のナビにある記事を記事一覧にする
  • 記事一覧に下書きがデフォルトで出ていない
    • 下書きの公開状態が下書きになっていない
    • 公開の公開状態が公開になっていない
  • サムネの軽量化
    • avifが使えればavif, webpが使えればwebp, いずれもなければ今のjpeg
    • ただavifは再利用が厳しいフォーマットなのでやや悩む。例えばブログからサムネを保存してClaudeやChatGPTに投げても未対応と蹴られてしまう。と思ってさっき試したらChatGPTは対応済みで、Claudeは添付可能になっておりPNGに頑張ってデコードして読んでくれた。

v4.20以降の対応

こっから先は優先度低め。

  • テーマ作成の土台となる標準テーマを作成する
    • テーマを作れるようにするためにはベースのSkelを何とかしないとならないため
      • ミニマムだけ持たせて、他はテーマ側に移譲すべき?
    • そもそもどう作るかから
    • 色調整機能を復帰させる?
  • 記法のマニュアルなど、ユーザーガイドを作る
    • adiary本家にある記法説明だけは最低限内部のHTMLで持っておくと良い気がする、外部サイトに飛ぶのも変な話なので
  • 既存テーマのレスポンシブ移行
    • 著作者の意に沿わない可能性が多分にあるので、移行でなくバリエーションを増やすだけくらいがいいかもしれない
  • Markdown ParserとSatsuki Parserを分離して他のシステムでも使いまわせるようにする
  • 設定画面の項目がおかしいのを整理する
    • 例えば基本設定>編集画面の設定>すべての記事はサイト全体の事であり、編集画面とは関係がない
  • docs/仕様/テーブル.md
    • artのctype=linkって殺さなかったっけ?
    • 生き残りがいるなら殺さざるをえない

あとがき

PageSpeed Insightsで動画のサムネがデカすぎるという指摘を受けているがAVIFもWebPも現状微妙なのでJPEGの品質を85%から80%に落とし、プログレッシブJPEGにする方向で対処することにした。これはv4.19の開発版に既に乗せている。結果として14%程度の容量減になるため、これで多少はマシになると思うが、そもそも動画が登場するページそのものが少ないので効果のほどは微妙である。

通常記事のサムネイルもプログレッシブJPEGに変更し、こちらは1-2%容量が減ることが予想される。画像が多い記事では多少役に立つ可能性がある。

Claude Max x5の利用率は23%となり、Pro換算で115%なのでPro換算だとオーバーだが、木曜でこの水準と言うことは、ここまで爆発的な開発でなければProでも十分と言うことが確認できたように思う。ドル高もあり、可能なら来月からはProに戻していきたいところだ。プランは切り替え予定にしてある。

以下が今ある残件。以前までに書いた内容から削ったものも結構あるので、だいぶ減らせた。例えばjQueryの根絶とかは諦めた。


  1. SQLiteはミニマムだと型検査すらなく、単なるファイルであるがゆえにロック管理やアカウント管理、パーティショニングなどのDBA機能をほとんど持たず非常に単純なため、データストアとして見ると極めて高速に動作する。その代わり高度なことは一切何もできない。つまり、高く遅く堅牢なOracle Databaseの対極にある技術である。 ↩

adiary extends v4.17アップデート

adiary置き換え計画始動から連なる、adiary-extendsにLyndbaumの機能を多数バックポートしたり、機能の削除祭りを敢行したの続き。

Claudeのトークン消費量が激しすぎて上限を超えそうだったため、契約をProからMax x5に切り替えたくらい爆発的に開発を続けている。土曜の夕方に切り替えて既に16%使っているためProだと80%使ったことになる。Proだったら到底次の土曜までは持たない計算だ。

今回はv4.15からv4.17への0.2バージョン分上げた。結果は追加4,956行、削除2,391行で削除の倍以上追加が起きている。今回はUXの改善やバグ潰しを中心に行っている。

主なUX改善

地味なものから大きなものまでいろいろ。ここに挙げていない細かな改善もたくさんしている。

ヘルプアイコンの廃止

adiaryにはヘルプアイコンと言うマウスオーバーでヘルプが見れる仕組みがあったが、これを辞めた。

理由として出たまま消えないことがあり、消えないと凄い邪魔だったからだ。他にも一々見ないといけないので、見るのが面倒と言うのがあった。

とはいえ、説明文は必要なので常時表示にすることにした。これはWordPressの実装方式から着想を得ている。ついでに進次郎構文化しているヘルプを削除したり、具体性がないヘルプの記述を見直すなども行った。今までまともに見たことがなかったから、意外な発見も多くあった。

変更前のコメント欄のヘルプ、ヘルプボタンにマウスオーバーしないと注意書きが見えない変更後のコメント欄のヘルプ、注意書きが標準で表示されていて解り易い

特にコメント欄についてはこのヘルプを読む人がいったいどれほどいるのか?と考えていたため、大きな改善になったと思っている。但しヒートマップの収集はしていないので効果は不明だ。

記事のソーシャルボタンに汎用の共有ボタンを追加

前回ソーシャルボタンの最新化を行い、ボタンデザインを最新化したり、サ終していたPocketを消したりしたがMastodonなどのFediverseにシェアできない問題があった。

そこでどうするか考えた。まずFediverseに限ればFediverse用のシェアボタンサービスがあるのがあるのでそれを使うことを考えたが、Fediverseはシェアする先を設定しないといけないためどう考えても手間だった。そこで思いついたのが汎用的なシェアボタンだ。

ひとまず参考になる実装を探そうと思ったが、こういう時に限って中々思い浮かばなかった。そんな時に助けになったのがこぶりーを運営されているsilverbirderさんのブログ、ジブンノートだった。

確認するとWindows EdgeとAndroid Edgeではブラウザ標準の共有機能が起動するようだったので、この方式にすることにした。

結果として右にボタンが一つ増え、ブラウザ標準の共有機能が立ち上がるようになった。

添付動画とYoutubeのポップアップ再生

これまで本ブログでは動画やYoutubeはHTMLに埋め込んで表示していた。そのため動画やYoutubeは主の文章に対して従にせざるを得ずサイズを大きくできない問題があった。また動画を直に入れているためHTMLのロードが遅くなるのもネックだった。動画は個人的に正直気にならなかったがYoutubeが凄く重かった。PageSpeed Insightsでも動画があると激烈にスコアが落ちていた。

そこでlythumb-viewerを改修して画像の拡大同様に動画とYoutubeをポップアップ(モーダル)で出せるようにした。ページには動画やiframeを出さず静止画を出し、クリックするとモーダルがポップアップされて動画やiframeが出てくるためページのロード負荷が低くなり、またモーダルで開くため大サイズの動画が開けるようになった。ついでにadiaryの組み込みだとフルウィンドウボタンが押せなかったのが押せるようになっている。画像と同じ仕組みなのでスライドショーにも出てくる。

動画のサムネイルをどうするかは悩んだが、アップロード時にブラウザ側で生成することにした。最初はサーバーサイドでffmpegを叩くことを考えていたが、この方式だとレンタルサーバーで動かせないうえに、コマンドを叩くので任意コマンドが実行されるリスクがある。ブラウザ内で完結させることができれば、そのリスクを避けられるため、ブラウザでサムネイルを作り、それを画像として動画とともにアップロードするようにした。

過去の動画についてもブログに過去の動画のサムネイルを作る機能を実装し、過去の動画をすべてブラウザに読ませサムネイルを生成してサムネイルをアップロードさせる処理を入れたので、手間なく対応できた。動画の埋め込み自体は[file:mp4:posts/2026/09/:20260822_093123812.mp4]のような記法で埋め込んでいるため、単純に記法から生成するHTMLを書き換えるだけで対応している。Youtubeも[youtube:PRUQ2XtJqDo]と言う感じで専用の構文がある。

参考までに以下に動画とYoutubeの実際の表示を置いている。動画はまだ表に出してない下書き記事から引っ張って来てるので未公開分である()

NSFW記事・NSFWサイト表示に対応

これは今回最大の変更と言っても過言ではない内容だ。これはLyndbaumにも乗せようとしていた機能だが、当時はOpus 5.5に却下されて辞めていた。しかし今回は鋼の意思で実装しきった。

昨今は創作の見方だと思っていたpixivですら厳しい態度をとっているということで、セルフホストで分散可能なCMSと言うのは非常に重要な立場にあると考えている。私自身もpixivで飽きるほど警告を受けてうんざりしているので、自主公開するのにもこの機能が必要だった。

これまで数件のエロゲ関係の記事をあげているのに、その全てが全年齢とか、明らかに健全な目的で利用していない技術を健全に見せかける記事を書いたりだとか、だいぶ無理があったので、その辺りを見直す切っ掛けには充分なり得ると考えている。

内容としてはブログ全体をNSFW指定して、サイト表示時に年齢確認を求める機能と、それとは別に記事単位にNSFW指定し、記事単体に年齢確認を求める機能、そして年齢確認を記憶して毎回出さない機能、その記憶の解除、検索エンジンへのレーティング通知機能、RSSフィードでの本文削除機能を実装している。

実際の画面としては以下のような感じ。

サイト表示に年齢確認が表示され、一度押すと以降は出てこない。SPAではないため毎回出してると面倒だからだ。セッションCookieに持たせるのも手だとは思うが、管理が面倒なのでlocalStorageに放り込んでいる。

設定の解除は設定画面を設けるのもあれなので記事のナビゲーションUIの辺りに置いている。

記事をNSFWにする場合は投稿画面でチェックを入れると設定でき、記事単位のNSFW設定が可能になる。記事単位の場合は今後確認しない場合のチェックボックスをつけている。これは一時的に見たい場合があると思うからだ。

記事別の場合も設定解除ボタンは用意してあり、これは記事の頭の方に出している。

またレーティング用のメタタグは以下を設定しているが、サイト全体の場合は常時、記事だけの場合はその記事だけ出るようにしている。

<meta name="rating" content="adult">

管理者が公開ページにいるときに画面上部に管理バーを追加

こういう画面上部のバーを追加した。同様の機能はLyndbaumにも実装していたが、アンカーリンクを踏むとバーとアンカーの頭がオーバーラップしてしまい、一行目あたりが読めない問題があった。今回の実装ではそうならないようフローティングUIにせず、画面上部にバーを差し込み、そこから下をバーより下げる実装にすることでアンカーを踏んだ時にバーに記事本文が重ならないように調整している。

以前の版にも似た機能はあったのだが、ヘッダーロゴの一行上に出てレイアウト的に良くなかったのと、スクロール時に追従しない問題があり、今回の形にした。

今回の形はアイコンがあり、見た目的にもメリハリがあるので気に入っている。

ログインリンクも元々は二行になっていたが、これを一行にした(下記)

こちらが改修後で、一行に収めることでタイトルロゴが下にズレて不格好になるのを解決している。また収まらない場合ログインリンク側をカラム落ちさせることにしている。どう考えてもタイトル側が落ちるのはおかしい。サイト自身の存在を示すタイトルこそが主でログインリンクなんて管理人の便利要素は従属要素である。

なおログインリンクをなくすというのは選択しなかった。不便なので。

またLyndbaumではWordPrssに合わせて要素を左に寄せていたが、マウスを左に持っていくのが面倒なので右寄せにした。adiary本家も右寄せである。

但し管理画面は左寄せ気味にしている。これはナビバーを左に置いてる関係で目線が左に行くためだ。公開ページと比べた場合に位置が異なっているが画面の目的が異なるため意図的にこうしている。

記事ページにコメントと参照元に飛ぶためのナビを追加

私のサイトはサイドバーが長く、記事も長いことが多いが、大抵の場合記事はサイドバーより短いため、Endキーなどでページ最下部に移動してもあるのはコメント欄や参照元ではなく、単なる空白である。

これが不便なので一発で移動するためのリンクを足した。単にページ内アンカーに飛ぶだけである。

ハンバーガーメニューのスクロール追従

Lyndbaumではハンバーガーメニューの追従は方式が定まらず実装できていなかったが、今回 extends v4.16で実装した。

ページ最上部ではハンバーガーメニューはフローティングしているスクロールするとハンバーガメニューが追従する目次より下にスクロールするとハンバーガーメニューの下に目次が追従してくるスクロール追従する目次を開いたところ

ページ最上部・スクロール追従・目次スタック・目次開放の一連の流れはこんな感じだ。

管理画面の設定を常時開放

以前は設定にアクセスするには一度設定を開く操作が必要だったが、面倒だし何があるか分からないので常に開くようにした。そもそも下ががら空きなのでこれで良い。

脚注・注釈記法で内容をポップアップで表示するように

これまで脚注や注釈を見るにはマウスホバーしてブラウザ標準のツールチップを見るか、クリックして下の方にある原文を見る必要があった。スマホではツールチップが見れないため原文まで移動し、読んだらバックリンクを使って元の位置に戻る必要があり、大変な手間だった。しかもツールチップには文字装飾が付かないためハイパーリンクがあっても無意味だった。

そこでWikipediaのようにマウスホバーしたときに小さなポップアップを出すようにし、そこに表示するようにした。このポップアップは文字装飾が載せられるほか、マウスを載せて選択したりクリックすることができるため、心置きなくハイパーリンクを設置することも出来るようになり、大変利便性が良くなった。

本サイトでは脚注を多用していたため、その効果は絶大だと言える。注釈はバグがあったため、ほとんど使っていなかったが、後述するように今回対応したので、今後は使っていくと思う。

公開ページに使われていたjQueryの根絶

jQueryに依存していた360度写真プラグイン・時計・Cookieメモが動作することを人間である私が確認したので公開ページ側のJavaScript系の整備の大半は終了した。残りは管理画面側に重厚なのがいるので、こいつらを倒せば終わり。

もうAI任せでほとんどコードを読まないとはいえ、CJSやESMに慣れている私にとってjQueryは読むのしんどいので消え去ってほしい思いがある。

バグ潰し

テーマデザイナでモジュールウィンドウにアイコンがないボタンがある問題を解消

これはadiary 3.52bの画面だが、テーマデザイナで画像の通りボタンにアイコンが出ていないものがあった。押せばわかるので別にいいが、もしアイコンのないボタンが複数あると解らなくなる。

という訳で今回アイコンを設けることにした。2018年にインストール*1したっきりほとんど起動した記憶のなかったGraphicsGaleを立ち上げてドット絵を作成して実装した。

GraphicsGaleは無料のドット絵エディタで投下色も扱える優秀なツールだ。ドット絵と言うとEDGEが有名だと思うが、透過を扱えるEDGE2はシェアウェアで、最新版のEdge3 *2も有料ソフトになっている。

GraphicsGaleではこのように定番のサイズに応じたグリッドを表示することができ、adiaryのアイコンに利用されているようなチップセットを作るのに非常に重宝する。因みにこの機能が存在することは知らなかったが、あるだろうと思ったらあった。クリスタを起動して不便さにうなだれていたが、すぐにGraphicsGaleへ切り替えた。

そんなこんなで80x32のチップセットのキャンバスを96x32に拡大し、横に伸ばした16x32pxの上半分を新規アイコンブロックとして描いていくことにした。

こんな感じでドット絵を打っていき、人間の力、息吹を込めながら新しいアイコンを描いていた。

この画像だと拡大したエリアと元のエリアで下地の色が異なるが、最終的にはちゃんと揃えて直している。

そして無事アイコンが完成したので組み込んだ。アイコンはPNGのチップセットで作られており、それを2色に落としたうえでDataURI形式にしてCSSに埋め込むという実装だったため、Opus 5.5に変換ツールを書いてもらって作成したPNGをコードに落として実装した。

画像アップロード時に同名ファイルがあるときにリネームして保存しているのに上書きしていた

adiaryでは同名ファイルがる場合確か上書きしていたと思うのだが、これが嫌で私は同名ファイルがある場合、ファイル名にタイムスタンプを生やして別名で保存するように実装していた。

しかしこの処理にはバグがあり、元ファイルを上書きした上で、別名のファイルを生成するという間抜けな実装になっていた。恐らくadiaryのファイルハンドリング処理を余り理解できないまま実装していたからだろう。

今回の修正では元ファイルをきちんと残し、衝突するファイルは別名で保存されるようにした。また同名で中身が同じっぽい場合はアップロード自体しないようにしているが、このときにエラーになるのか、暗黙的に既にあるファイルが本文に挿入されるのかまではLLMが書いたコードを見ていないため、確認していない。そのうちしようと思うが、まぁ実運用で支障があればその時にやるだろう、きっと。

Satsuki記法の注釈記法(())で、注釈の一覧が出ない問題と、Markdownモードで一行に複数の注釈を書くと**で強調が成立し、強調に化けてしまう問題、記事を更新するたびに注釈番号がインクリメントされていた問題を直した

注釈の一覧が出ない問題と、Markdownモードで一行に複数の注釈を書くと注釈記号のアスタリスクが連なり、強調構文が成立し、強調に化けてしまう問題は本家にもある不具合で、インクリメントされるのは恐らくextendsだけにあった不具合。

これを直して注釈構文がまともに機能するようになった。またLLMの言い分を眺めていた感じだとSatsuki構文からパージしてMarkdown構文として取り込んだような気がしていたが、コミット差分を見る限り双方に跨っているようだ。差分的に元からこういう実装だったと思われる。本家も確認したがそうっぽく、Satsuki記法とMarkdown記法は不可分の関係にあるようだ。

自分のユーザー名を変更しようとするとエラーで変更できない問題を修正した

本家でも起きるかは確認していないが、少なくともextendsでは起きていたバグ。理論上は本家にもあると思う。

内容としては公開ページなどに表示するアカウントのユーザー名(アカウント名)を変更できない問題があった。どうやら関数を呼ぶときに必要なパラメーター(ID)を渡しておらず、誰の情報を変更するか特定できないために起きていたようだ。単にパラメーターを追加するだけで治った。

プライベートモードにしても、閲覧できない人に記事、コメント、タグが見えていた問題と、ファイルパスの秘匿化が解除されていた問題を修正

extends 4.09で発生したらしいバグ。恐らく4.10でマルチサイト対応を削除したときにセキュリティ系の実装に穴が開いてしまい発生したものと思われる。

後者については秘匿化の必要がないと判断したが、URLを一度秘匿化していた方が意義があると思い、削除した実装を戻した。これは以前のURLを知っている人がファイルを見続けることができるため。adiaryのプライベートモードはファイルパスをランダムな英数のパスに変更することで保護するだけなので、物理的にはアクセスできてしまう。

当然記事そのものには認証を前提としたロックが掛かっているが、マルチサイトを解除したときに認証周りが壊れたものとみられる。一旦この機能が動作することは確認している。機能していなかったことは確認していない。

検索した語の強調が動いていなかった問題を修正

Fancyboxを入れたときに関数を消し飛ばしていたらしいのを戻した。

クリップボードから貼り付けた画像がposts/ではなくadiary/にアップロードされていたのを修正

ディレクトリ構造を変更したときにクリップボードからのアップロード処理が追従できていなかった。理由は共通アップロード関数を使わずに自前実装していたため漏れていた。

このクリップボードからのファイルアップロード処理こそがadiary-extendsを生み出した発端で、ここから独自機能を発展させてゆくことになった。

*1 : 端末は代替わりしており、単にexeをストレージに突っ込んでいるだけなのでインストールと呼べるかどうかは怪しい

*2 : AIパワーなのか随分リッチになってしまって…

改善系

存在しない記事が参照されたときに200を返す問題の修正

/99のように0で始まらない数字だけのURLで、記事が無くても200を返していた問題を修正。404を返すようにした。

ブログの基本設定でブログ名や紹介を変えたときに、RSSを作り直すようにした

ブログの再構築からブログを再構築すれば反映されたが、普通に設定変更時に反映されて欲しかったのでそうした。

画面・操作・権限の回帰テストを追加した

中身見てないので実効性のほどは不明だが、Opus 5.5が書いたので6割くらいはまともだと信じている。

ぶつかったら人間が再誘導するためのガードレール替わりなので困ったらそん時に直せばいい精神。

関連PR

v4.16 / v4.17

PageSpeed Insightsの推移

スコアは改善の兆候があり、よくなってきていると思う。

モバイルのパフォーマンスはv0.41.0から見ると悪化しているが、計測しているのがトップページである関係で、デカいファイルがあったりなかったりする部分も大きい。ここは内容が変動しないページで比較できるとより良かったと思う。

モバイル

バージョンとスコアリンク パフォーマンス ユーザー補助 おすすめの方法 SEO エージェントによるブラウジング
v0.41.0 100 69 92 82 1/2
v4.5 87 86 100 82 1/2
v4.7 88 86 100 82 1/2
v4.13 85 86 100 82 0/2
v4.17 92 86 100 82 1/2

PC

バージョンとスコアリンク パフォーマンス ユーザー補助 おすすめの方法 SEO エージェントによるブラウジング
v0.41.0 95 74 96 82 1/2
v4.5 76 82 100 82 1/2
v4.7 76 82 100 82 0/2
v4.13 76 82 100 82 0/2
v4.17 100 82 100 82 1/2

あとがき

先週時点でClaude Proの使用量が上限ギリギリだったためMax x5にアップグレードしたが、既に16%も使っておりProなら80%換算なので物凄い勢いで実装を進められていると思う。果てしない勢いを感じる。

v4.16は極めて膨大な機能追加・変更・削除を伴っており、正直全部は把握できていない。まぁ何かあればその時に対応すればよいのではないかと言う勢いになっている。それよりも開発速度に理がありすぎるし、実際問題大体動いており、たまにバグが出る程度だからである。

残件は後述のリストくらいなので、この辺りが片付けば概ねFix出来ると考えている。普通に使う分には現状でも不満はほとんどない。10/19のLyndbaum開発切り上げから、僅か7日という短期間でよくやったと思う。

なお実装にはLLMをガンガン使っているが、本記事は100%人間の手書きである。

実装残件

取り敢えずこれがやれたら終われるよねリスト。増やさないようにしたい。

  • コメントの折り畳みをやめる
  • 記事編集画面の詳細設定の奴をチェックボックスから折り畳みUIに変える
  • 記事・ページをそれぞれ記事一覧、ページ一覧とする
  • 記事一覧のリンクを編集リンクにする
  • コンテンツと言う名前をページに名寄せする
  • dynatree(jquery.dynatree)を置き換える
  • 編集画面の画像の挿入の既定値を設定できるようにする
  • 画像アルバム
    • デフォルトで日付降順にしたい
      • 縦長や横長の画像のサムネイルがクリック、視認しづらい
  • 設定ファイルの設定値の幾つかを管理画面に移す
    • 同時ログインセッションとかあんな所にあっても気づかない!!!
  • デザインテンプレートのクラス名を変える。hatena〜とあるが全部普通の名前に変えたい
  • 既存テーマのレスポンシブ移行
    • 著作者の意に沿わない可能性が多分にあるので、移行でなくバリエーションを増やすだけくらいがいいかもしれない
  • 記法のマニュアルなど、ユーザーガイドを作る
  • adiary本家にある記法説明だけは最低限内部のHTMLで持っておくと良い気がする、外部サイトに飛ぶのも変な話なので