道具の手触りや暮らしの思索を重ねながら、革しごとやガジェットに向き合う日々の試行錯誤の記録

デジタル手仕事 06|書いたそばからWebになる仕組みと、寝起きなMac miniのうたた寝

デジタル手仕事
デジタル手仕事 06|書いたそばからWebになる仕組みと、寝起きなMac miniのうたた寝
目次 ▼
嫁ちゃん 嫁ちゃん
……なぁ。さっきから文字打っては画面切り替えて、何ニヤニヤしてんの?
わたし わたし
これな、手元のエディタで文章書いて保存した瞬間、うちのアトリエのMac miniが勝手にWebサイトに仕立てて世界中に公開してくれる仕組みを作ってん。
嫁ちゃん 嫁ちゃん
へぇー。前はなんかログインしてポチポチやってたやん。あれと何が違うん?
わたし わたし
全然違うんよ。画面開くまでの摩擦がゼロになって、書くことだけに集中できるようになったんや。……まあ、そのあとちょっとした珍事件が起きたんやけどな。

「書くこと」の前に横たわっていた摩擦
#

長いあいだ、私の言葉の置き場所はWordPressにあった。

日々の思いつきや、革を縫う手のひらの感触、道具の手入れについて書き留める場所として、それは間違いなく頼もしい母艦だった。けれど、年月の経過とともにエディタはクラシックからブロックエディタへと姿を変え、プラグインの更新通知は絶え間なく灯り続けるようになった。

いつの頃からか、文章を書くという本来の営みの手前に、目に見えない薄い膜のような「摩擦」を感じるようになっていた。ブラウザを立ち上げ、管理画面にログインし、ポチポチとブロックを積み上げていく。思考の速度に対して、道具の振る舞いがほんの少しだけ重い。

ためしにGoogleのPageSpeed Insightsでサイトを測ってみても、スコアはパッとしない。有料のテーマを導入してみたり、プラグインを足したり引いたり、画像の遅延読み込みを試行錯誤してみても、劇的に数字が跳ね上がることはなく、「まあ、これくらいが普通なのだろう」と自分に言い聞かせていた。けれど心のどこかでは、書くこと以外のメンテナンスに意識を割かれる億劫さが、じわじわと溜まっていたのだと思う。

もちろん、自前でサーバーを立ち上げて運用するとなれば、構築や日々のメンテナンスに手間がかかることは百も承知だ。けれど、私にとってその試行錯誤自体は手を動かす「趣味」でもあるから苦にはならない。嫌だったのは、文章を書くその一瞬に、道具側から差し挟まれる細かな引っかかりの方だった。

かつてはWordPress APIを使って自作のスクリプトを組み、できる限り手元の執筆から投稿までをシームレスに繋ごうと試みたこともあった。それでも、どこか拭いきれない億劫さが残る。

私はもっと身軽になりたかった。 道具を意識することなく、ただ思考のままに文字を打ち、保存した瞬間にそれが静かにWebの海へと溶けていく。そんな、手触りのよい一本の線を求めていた。

手元で書いて手放す、一本のパイプライン
#

現在の私の執筆環境は、手元のMac上で動くWezTermとNeovim、そして全体の思考を束ねるObsidianである。裏ではローカルのRAG(検索拡張生成)とGeminiが、静かな助手のように控えている。

思考をキーボードから叩き込み、手元で完結させる心地よさを知ってしまうと、もうブラウザの入力フォームには戻れない。だからこそ、このObsidianの上で書いたMarkdownファイルを、そのままWebサイトとして直結させたかった。

そこで選んだのが、静的サイトジェネレーターの「Hugo」である。

以前は手元の端末同士を繋ぐために、iCloud同期やコミュニティ製の自前同期プラグインなどを色々と試したこともあった。しかし、執筆の最中にファイルの競合(衝突)が起きるたび、なんとも言えない嫌な手触りが残る。文章を書く道具において、データがすれ違う不安ほど集中を削ぐものはない。

結局、私はObsidian Syncを有料契約することにした。まずは1GBのプランから恐る恐る試してみたのだが、あまりの快適さに驚き、すぐさま年間契約へと切り替えた。端末を開けば、何も考えずとも最新のテキストがそこに佇んでいる。同期に対する心配事やストレスが、日常から綺麗に蒸発して消えた。これこそが、納得してお金を払う価値のある道具の手入れだった。

このObsidian Syncを中継地点にして、ひとつの自動化パイプラインを組んだ。

  1. 手元のMacで、ObsidianやNeovimを使ってMarkdown記事を書き、保存する。
  2. Obsidian Syncがクラウドを経由し、アトリエの片隅に置かれたM1 Mac miniへ変更を届ける。
  3. Mac miniの常駐プロセス(headlessのob sync)がテキストを受け取る。
  4. ファイルの変更を検知したHugoが、わずか数十ミリ秒でサイト全体の静的HTMLを焼き上げる。
  5. 同居するNginxが、それをWebへと配る。

記事を保存して一息つき、Safariで自分のドメイン(okadai.me)を開く。そこにはもう、今書いたばかりの文章が端正な佇まいで並んでいる。

WordPressの管理画面を介さず、データベースの読み書きも発生しない。ただのプレーンなテキストが、瞬時に完成されたWebページへと姿を変える。試しに速度を測ってみると、パフォーマンススコアは軽々と「98点」を叩き出した。かつてプラグインと睨めっこしていた時間が嘘のように、画面を開いた瞬間にパッとすべてが表示される。

道具の存在が消え、書くことと届けることが直結する。私はその軽快さに、深い納得感を覚えていた。


「なんで私が見に行った時だけ、切れてるねん?」
#

だが、理想的なパイプラインが完成したと胸を撫で下ろしたのも束の間、奇妙な現象が私を悩ませ始めた。

旧ブログから記事を自作のNode.jsスクリプトでMarkdownへと落とし込み、1本ずつ手作業で加筆や手入れを施しながら移植していく。いよいよ新しいドメインでの執筆を本格化させようと意気揚々としていた矢先のことだ。手元で記事を書き上げ、「よし、公開側の見栄えを確認しよう」とSafariを開くと、灰色の無機質な画面が立ちはだかる。

「Error 1033: Cloudflare Tunnel error」

自宅のMac miniと世界を繋いでいるはずのトンネルが、ぷつりと途切れているという警告だった。

「あれ? サーバーが落ちたのか?」 慌てて手元のターミナルからログを見にいくと、エラーログを吐き出したあと、3分から4分ほど経つと何事もなかったかのように自己復旧し、サイトが再び表示される。

一度や二度なら、回線の気まぐれかと思うかもしれない。だが、この現象は何度も繰り返された。しかも、決まって「私が手元のMacを開き、記事を書き終えて、ブラウザで確認しようとした瞬間」に起きるのだ。

1日は8万6,400秒もある。その広大な時間の中で、インターネット回線の瞬断が起きる一瞬と、私がたまたまアクセスした数秒が、ピンポイントで重なり続ける確率など天文学的に低いはずだ。

元プログラマーとしての嗅覚が、「偶然ではない、背後に明確なロジックがある」と告げていた。 けれど原因が掴めないあいだは、胃のあたりが落ち着かない。「折角ここまで引っ越しを進めてきたのに、この自宅サーバー環境は常用に耐えないのではないか……」という不安が、頭の隅をもやもやと掠め続けた。


犯人はクラウドではなく、足元の林檎だった
#

image

原因の切り分けは、暗中模索だった。 Cloudflare TunnelのDockerコンテナの設定を疑い、起動引数を書き換えてはエラーでコンテナを落とし、バックアップから元の記述へ戻すといった無駄足も踏んだ。

ただ、この時ばかりはコンテナ運用のありがたさを痛感した。もしこれがmacOSに直接ミドルウェアをインストールし、設定ファイルを直にいじり倒す構成だったなら、試行錯誤のたびに環境が汚れ、身動きが取れなくなっていただろう。失敗してもコンテナを破棄して再起動すれば、一瞬で元の綺麗な状態に戻れる。もっとも、本番運用が始まってしまえばコンテナといえど気安くはいじれなくなるのだろうが、この立ち上げ期の試行錯誤においては何物にも代えがたい気楽さだった。その身軽さに支えられながら、ログと時計を睨めっこし続けた。

そしてある時、ふと気づいたのだ。 「エラーの発生時刻、私が手元Macを開いて作業を開始したタイミングと寸分違わず連動していないか?」

疑いの目は、はるか海の向こうのクラウドから、自分の足元――アトリエの棚の片隅に鎮座するM1 Mac miniへと向かった。

ターミナルを開き、電源管理の状態を調べるコマンドを叩く。

pmset -g custom

返ってきた無機質な設定値の中に、私は真犯人の姿を見つけた。

disksleep 10
powernap 1

アトリエのMac miniは、回線が切れていたわけでも、サーバープロセスがクラッシュしていたわけでもなかった。10分間アクセスのない静寂の中で、ただただ気持ちよく「うたた寝」をしていただけだったのだ。

自宅サーバーに仕立てると決めた時点で、スリープ設定には気をつけるべきだと頭では分かっていたはずだった。macOSのグラフィカルな「システム設定」の画面で、それらしい省電力項目をオフにしたことで、「よし、これで常時稼働できる」と思い込んでしまっていたのだ。だが、裏で動くDarwinの低レイヤーでは、律儀に10分でストレージを眠らせる省電力の仕組みが生きていた。

私が手元でMacを開き、Obsidianで文字を書き、同期が走る。その刺激でMac miniはハッと目を覚ます。 だが、眠りから這い上がり、ディスクをスピンアップさせ、Cloudflareとのトンネルを再び完全に結び直すまでには、ほんの少しのタイムラグ――いわば「寝起きのあくび」のような時間が必要だったのだ。

私は、そのMac miniが目を擦っている数分間の隙間に、毎回真正面から突っ込んでは「1033エラー」を踏み抜いていたのである。


壊れていないなら、静かに回し続ける
#

原因さえ分かってしまえば、手当ては呆気ないほどシンプルだった。

sudo pmset -a disksleep 0 powernap 0

ディスクのうたた寝も、裏で勝手に起き出して処理をするPower Napも、すべてゼロにする。サーバーとして生きてもらう以上、余計な省電力の気遣いは引き算し、24時間ただ静かに目を開けていてもらうことにした。

昔のエンジニアとしての習性から、「何日かに一度、深夜にcronで自動再起動でもさせた方がいいのだろうか」という考えが一瞬頭をよぎった。Windowsや古いLinuxを触っていた頃の、「動かしっぱなしにしているとメモリリークやゴミが溜まっていくのではないか」という古い固定観念が、心のどこかにこびりついていたからだ。

だが、私はそのタスクを足すのをやめた。サーバーなのだから、メンテナンスの時以外はずっと淡々と動いていてもらえばいい。 壊れてもいないのに、予防線を張るように新しい仕組みを付け足すのは、私の美学に反する。定期再起動のスクリプト自体が何かの拍子にコケて、朝起きたらサーバーが上がっていなかった、なんてことになれば本末転倒だ。道具は、シンプルであればあるほど壊れにくい。

嫁ちゃん 嫁ちゃん
で、結局なんやったん? サーバーが壊れてたん?
わたし わたし
いや、あいつ(Mac mini)がアトリエで気持ちよーくうたた寝してただけやったわ。私が書き始めたら慌てて起きて、アクビしてる間に見に行ってたからエラー出てたみたい。
嫁ちゃん 嫁ちゃん
何それ(笑)。機械やのに人間くさいなぁ。まあ、ちゃんと起きるようになったんならええやん。

現在、アトリエの片隅に置かれたM1 Mac miniは、日々のHugoビルドだけでなく、自作のRAGサーバーとしての役割も淡々とこなしてくれている。

一応ファンを回すための監視ツールは入れているものの、本体に触れてみてもそれほど熱くなく、ターミナルのシステムステータスを眺めても、CPU使用率は凪のように穏やかで、部屋の中にはファンの音ひとつ響かない。

「動いているのか?」と心配になるほど静かに、けれど手元のObsidianで一文字書き足せば、瞬時にそれを世界へと届けてくれる。

道具の癖を知り、余計な気遣いを削ぎ落とし、ただ淡々とそこにある状態へと手懐ける。 うたた寝から目覚めた小さな林檎は、今、とても頼もしい相棒として、私の言葉の通り道を支えてくれている。


※本サイトの漫画やイラストはフィクションであり、実在の製品・団体・人物・地名とは関係ありません。

※本サイトに掲載する情報には充分に注意を払っておりますが、その内容について保証するものではありません。

※本サイトの使用ならびに閲覧によって生じたいかなる損害にも責任を負いかねます。