blue note.

blue0a6m5cのブログ

#WriteFreely #Fediverse #ActivityPub #サーバーいじり #ChatGPT #VibeCoding

経緯

これまで個人ブログとして WriteFreely を運用していたが、ActivityPub周りの不具合修正や、投稿URLを日時ベースにするカスタマイズなど、独自の変更が少しずつ増えてきた。

当初は本番環境への個別パッチとして扱っていたものの、今後のWriteFreely本家への追従や変更管理を考え、WriteFreely v0.17.2をベースとしたForkとして正式に管理することにした。

Forkの名前は BlueNote とした。

今日やったこと

回帰テストの追加

まず既存の独自変更について回帰テストを追加し、今後upstreamを更新してもBlueNote固有の動作を確認できるようにした。

現在のBlueNoteには、主に以下の変更が入っている。

  • ISO 8601形式で出力される投稿日時のUTC化
  • ActivityPub Article の summary をプレーンテキスト化
  • 空のfollowers / following collectionでpaginationを正しく終了
  • 日時ベースの投稿スラッグ

日時スラッグを設定可能に

これまで特定ブログ向けに実装していた日時ベースのスラッグ生成を汎用化した。

config.ini から以下のように設定できる。

[app]
datetime_slugs = true
datetime_slug_timezone = Asia/Tokyo

datetime_slugs で機能のON/OFFを切り替えられ、datetime_slug_timezone にはIANA timezoneを指定できる。

日時には記事の保存された公開日時である Created を使用する。既に生成済みのURLについては、後から公開日時やtimezone設定を変更しても勝手に変更しない。

プロジェクト文書の整理

README、CONTRIBUTING、SECURITY、AUTHORS、Issue / Pull Request templateなども確認した。

元々はWriteFreely本家の内容がそのまま残っていたため、BlueNoteが

WriteFreelyをベースとした非公式Fork

であることが分かるように整理した。

また、本家のCLAやFundingなど、BlueNoteにはそのまま適用できないものも削除・整理した。

BlueNote独自のバージョン管理

BlueNoteとWriteFreely本家のバージョンを分離して管理する仕組みも追加した。

現在は、

  • BlueNote: 0.1.0
  • WriteFreely base: 0.17.2

としている。

CLIでは次のように表示される。

BlueNote 0.1.0 (based on WriteFreely 0.17.2; commit 0f67085)

NodeInfoについては、Fediverse上での既存の互換性を考えてsoftware名は当面 writefreely のままとし、versionを

0.17.2+bluenote.0.1.0

としてForkであることを識別できるようにした。

Web画面のfooterにも BlueNote 0.1.0 とソースコードへのリンクを表示するようにした。

BlueNote 0.1.0を本番投入

ここまでの変更を本番サーバーでビルドし、実際に稼働中のブログへ投入した。

NodeInfoでも、

software.name    = writefreely
software.version = 0.17.2+bluenote.0.1.0

となっていることを確認。

これで、これまで単なるWriteFreelyへのローカルパッチだったものが、ひとまず BlueNote 0.1.0 として動き始めた。

そしてサイドバーが消えた

......と、ここまで順調だったが、本番投入後にブログを確認するとサイドバーが消えていた。

調べてみると、サイドバーそのものを生成しているJavaScript、

/local/blue-note.js

は残っていた。JSONデータやCSSも無事だった。

しかし、以前の本番環境ではテンプレートへ手作業で追加していた、

<script src="/local/blue-note.js?v=12"></script>

という読み込み部分が、今回Gitで管理している新しいテンプレートへ更新したことで消えていた。

この一行を現行テンプレートへ戻してWriteFreelyを再起動し、無事復旧。

今後

今回のトラブルによって、本番環境にしか存在しないカスタマイズがまだ残っていることも分かった。

今後は、

  • BlueNoteそのものに含める機能
  • 自分のブログ固有のUIや設定
  • 本番サーバー側の運用設定

を整理して、BlueNote本体とインスタンス固有カスタマイズを明確に分離して管理していきたい。

とりあえず今日は、WriteFreelyへのローカルパッチ群だったものを「BlueNote 0.1.0」という一つのForkとして整理し、本番で動かすところまで到達した。

#WriteFreely #Fediverse #ActivityPub #サーバーいじり #ChatGPT #VibeCoding

2年ほど存在を忘れていたこのブログを、ふと思い出したので色々改造なども行ってみました。 (とはいえ僕はコードの読み書きができるわけではないので、ChatGPTを使ったVibe-Codingです。)

  • 独自テーマの整備 — WriteFreely標準UIをベースに、ダーク系の個人ブログらしいレイアウト・配色へカスタマイズ。
  • 記事インデックスの独自実装 — 記事情報をJSON化し、JavaScriptから記事一覧・タグなどを扱える仕組みを追加。
  • タグ機能の追加 — WriteFreelyの記事からタグを扱い、サイドバーなどから記事を辿れるようにした。
  • 記事シェアボタンの追加 — Mastodon・Misskey・Xへの共有と、URLコピー機能を記事下部に実装。
  • ActivityPub Actorアイコンの変更 — WriteFreely標準の「ブログ名先頭文字アイコン」を独自画像へ差し替え。
  • サイドバー「Links」の追加 — 外部サイトやSNSへのリンク集を独自に追加。 リンク情報のJSON外出し — リンクを blue-note-links.json で管理し、JavaScript本体を編集せず追加・変更できるようにした。
  • リンクバナー対応 — リンクごとにバナー画像を指定でき、未指定ならテキストリンクへフォールバックするよう実装。
  • 自サイト用リンクバナーの設置 — 「リンクフリー・相互リンク歓迎」とblue note.のバナーをサイドバーへ追加。
  • カスタマイズ資産のバックアップ拡張 — JS・JSON・アイコン・バナー・テンプレート・インデックス生成スクリプト等をバックアップ対象へ追加。
  • 記事URIを日時形式へ変更 — WriteFreely本体をGoで改造し、新規記事のURIをタイトル由来ではなく YYYYMMDDHHMMSS に変更。
  • URI改造をblue note.限定に実装 — blue0a6m5c Collectionへの公開時だけ日時slugを適用し、WriteFreely本来の挙動への影響を限定。
  • WriteFreelyをソースから独自ビルド — Go 1.25環境を導入し、v0.17.2をベースに独自改造版バイナリを作成・稼働。
  • ついでに謎のスパムアカウントを調査・除去 — 過去のWriteFreely登録制御バグを突いたBotによるアカウント・投稿を特定し、証拠をバックアップしたうえでDBから削除。

かなり使いやすくなったし、ブログっぽい見た目に出来たと思います。

#RaspberryPi #広告ブロック #サーバーいじり

iPhoneやタブレットを家のWifiに接続すると、自宅鯖のMastodonやMisskeyにアクセスできない問題を解決するために内部向けDNSサーバーを設置することにしたのですが、構築方法などを調べていたら”Pi-hole”というRaspberry PiないしはLinuxマシンで動作するフィルタリング機能付きDNSサーバーがあることを知りました。 Raspberry Pi3b+が余っていることもあり、使ってみることにしました。

構築は概ね以下の記事をなぞりました。 広告をブロックできるPi-holeをラズパイで構築する方法(Zero 2 W)

インストールスクリプトを起動するだけなのですぐできました。 インストール後はWebUIから既存のブラックリストをいくつか登録して、Pi-holeのIPアドレスをそれぞれのデバイスのDNSサーバとして設定すればかなり広告を弾いてくれます。 ルーターなどのDHCPサーバ機能で配布するDNSアドレスとして設定しておけば楽ですね。

ブラックリストはpi-hole listとかで検索すれば出るので良さそうなのをWeb UIから追加してあげるといいっぽい。

Web UIの画面は以下のような感じ。 Pi-holeの画面

紹介した記事にも書いてあるyouTubeads4_pi-holeはちょっと自分のやり方ではうまくいかなかったので、リストを手動で追加しましたが、これでもPCのブラウザから視聴する場合はかなりブロックしている様子。 ですがAndroid TVやiOSのYouTubeアプリにはあまり効果ないかも。(DNSサーバーを使っていなさそう)

ActivityPub対応のブログプラットフォームを立ててみた。 なにか長文を書きたいときやまとめを行いたい時に使っていこうと考えている。

  • ひとまず課題
    • 画像どうやって入れるの
    • カスタムCSSの書き方
    • 連合時のユーザーアイコン変えたい