Refactoring English: Month 12

Michael Lynch

Refactoring English:12か月目

一言まとめ

いいよ、なら自分で赤ちゃんの写真を共有するアプリを作るよ。

ハイライト

  • Hacker Newsのフロントページに載る投稿を予測するゲームを作っています。
  • 腹いせに家族向け写真共有アプリを作っています。
  • キーボード中心のウィンドウマネージャーに切り替えました。

目標の成績

毎月のはじめに、達成したい目標を宣言しています。結果はこうなりました。

新しい章を2つ公開する

  • 結果: 新しい章を1つ公開
  • 評価: C

設計ドキュメントの章で行き詰まっています。カバーしたい内容が多く、何をどう言葉にするか、どこまで本に含めるべきかを決めかねています。

問題の一つは、章が長すぎて一度に取り組むには圧倒されることです。新しい計画は、章を小さなセクションに分割して、一つずつ集中して取り組むことです。残りの章については何を書きたいかがより明確なので、これが最後の「難しい」章だと思っています。

読者10人に連絡を取る

  • 結果: 2人にしか連絡できず、1人から返信がありました。
  • 評価: D

やれば楽しいし、有益な反応も得られるのに、ずっと先延ばしにしています。最初の手間を減らせばやる気が出るかと思い、事務作業の自動化をどんどん進めています。

Refactoring Englishのサイトに人を呼び込むツールやブログ記事を作る

  • 結果: 「What Makes the Intro to Crafting Interpreters so Good?(『Crafting Interpreters』の導入部は何がそんなに優れているのか)」を公開しました。
  • 評価: B

3,508人に読まれたので、新しい読者を集めるという点ではある程度成功しました。取り上げた本の著者であるBob Nystrom氏が記事を気に入ってくれたのも嬉しかったです。たとえ記事が伸びなくても、彼の仕事にどれだけ感謝しているかが伝わればいいと思っていました。

Refactoring Englishの指標

指標2025年10月2025年11月変化
ユニーク訪問者数22,3987,608-14,790 (-66%)
予約販売による収益$570.75$1,018.48+$447.73 (+78%)
スポンサー収益$48.25$48.25$0.00 (0%)
合計収益$619.00$1,066.73+$447.73 (+72%)

11月は訪問数と売上の面で良い月でした。訪問数は10月よりやや減少しましたが、それでも今年で最も好調な月の一つでした。

メーリングリストの読者だけに告知して、30%オフのブラックフライデー割引を実施しました。あちこちでセールを宣伝するのは気が引けるので、いつもそうしています。告知は成功し、18人のお客様が購入して合計359.41ドルの売上になりました。

zeitkapslの共同創業者であるPeter Spiess-Knafl氏がブログ記事でRefactoring Englishに言及してくれました。その記事はLobstersで1位になりました。もともと本の狙いは、読者が成功するブログ記事を書けるようになり、本に満足して人に勧めてくれることだったので、Peter氏の投稿は嬉しかったです。

「フロントページに載るか?」ゲーム

Hacker Newsを頻繁に読んでいるので、どのストーリーがフロントページに載るかをうまく予測できる気がしています。ただ、その思い込みをきちんと検証したことはありませんでした。そこで、精度を試すゲームを作りました。

ゲームではHacker Newsの最新投稿が表示され、プレイヤーはそれがフロントページに載るかどうかを予測します。

このゲームの最大の問題は、ストーリーがフロントページに載るまでに最大24時間かかることです。結果を24時間待つのは、ゲームの楽しさを削いでしまいます。

投稿後30分以内にフロントページに載るかを予測するルールに変えてみましたが、30分でも待ち時間が長く感じられます。

新しいアイデアは、投稿から10分後に暫定的な判定を出すことです。ストーリーの経過時間、upvote数、コメント数から、フロントページに載る可能性をざっくり計算できます。仮にフロントページに載ると予測したのに、10分経ってもupvoteもコメントも付いていなければ、ゲームは暫定的に「外れ」と表示します。ただし、その後24時間以内に奇跡的に伸びれば、ポイントを取り戻せます。

過去のストーリーの結果を当てるバージョンも考えました。答えがすでに確定しているので即時にフィードバックできますが、それはあまり面白くないと感じました。似たゲームはすでに他の人が作っていますし、私が想定しているHacker Newsのヘビーユーザーにとっては、過去データだと何がフロントページに載ったかをなんとなく覚えていて、面白さが半減してしまいます。

腹いせに作るTinyBeansの無料代替

昨年、妻と私の間に初めての子どもが生まれたので、家族とプライベートに赤ちゃんの写真を共有する方法が欲しくなりました。友人の中には似たアプリを使っている人もいましたが、どれも広告付きでした。子どもの写真に広告をべたべた貼られるのは嫌だったので、別の選択肢を探しました。

TinyBeansを見つけたときは、理想的なサービスだと思いました。有料版では広告が非表示になり、プライバシーを最大の売りにしていました。完璧です。

ところが使い始めると、広告だらけでした。「フォトブックを買いませんか!」「もっと個人情報を教えてください!」

今さっきアプリを開いただけでも、自分の子どもの写真を見るまでに3つの広告を閉じる必要がありました。

有料会員で、これまで何十回も同じ広告を閉じているのに、TinyBeansはアプリを開くたびに巨大な広告を3つ表示します。

しかも、私や妻が見る広告よりも、家族が受け取る広告の方がさらに多いことがわかりました。サードパーティのサービスまで含まれています。最近家族に届いたものでは、怪しげなAI企業への投資を勧める広告がありました。

TinyBeansが家族に送るメールでは、息子の写真の間にこうしたスパムのような広告が挟み込まれます。

有料プランの「広告なし」は私と妻にしか適用されません。家族の他のメンバーは広告やアップセルを大量に浴びせられます。

早い段階でTinyBeansをやめたかったのですが、新米の親として忙しく、新しいアプリを探して家族全員を移行させる時間がありませんでした。だから毎月、しぶしぶ9ドルを払い続けていました。

そしてブラックフライデーがやってきました。

TinyBeansから、ブラックフライデーのセール情報で受信箱を煩わせないことを自画自賛するメールが届きました。すべてのセール情報はアプリ内にあるというのです。

受信箱をどうでもいいメールで煩わせないことを自慢する、どうでもいいメールをTinyBeansが送ってきました。

なるほど、あまりメールを送らないことをわざわざ自慢するメールですか。

しかもそれは嘘でした!TinyBeansはその後、アプリ内のブラックフライデーセールをチェックするように促すメールをさらに4通も送ってきたのです。

ブラックフライデーの宣伝で煩わせないと約束したのに、TinyBeansは5通ものブラックフライデー宣伝メールを送ってきました。

これで我慢の限界を超え、腹いせにTinyBeansの代替を自作して、支払いをやめることにしました。

「赤ちゃんの写真を共有するアプリを作りたい理由は何ですか?」

TinyBeansで本当に必要な機能はこれだけです。

  • 家族が私のアップロードした赤ちゃんの写真や動画を閲覧できること。
  • 家族が新しい写真や動画をメールで受け取れるよう登録できること。
  • 家族が写真にコメントや絵文字リアクションを付けられること。

どれくらい大変でしょうか?開発に20時間くらい?

どうせTinyBeansのウェブアプリもAndroidアプリも出来が悪いので、乗り換えられてむしろ嬉しいです。体験の中心はメールなので、家族に移行の手間をかけずに自分のアプリに置き換えられます。

TinyBeansと競合する会社を立ち上げるつもりはありません。TinyBeansの機能を置き換えるウェブアプリを作りたいだけです。

Awesome Window Managerへの乗り換え

開発者としての恥ずかしい秘密の一つは、画面上のウィンドウ管理が苦手だということです。そのせいでマウスを使いすぎており、遅くて非効率だとわかっています。

昨年、WindowsからLinuxに乗り換え、49インチのウルトラワイドモニターを導入しました。Windowsは私のようなマウス派向けに作られていますが、Linuxのデスクトップはキーボード中心なので、キーボードをきちんと使えない弱点が露呈しました。ウィンドウを開いては閉じずに放置するので、VS Codeのウィンドウが10個以上、Firefoxのウィンドウが10個以上、ちょっとした計算用の電卓アプリが5つも、デスクトップの真ん中に山積みになっていました。

明らかに画面のスペースを無駄にし、ウィンドウを探すのに時間を浪費していました。いくつかのウィンドウマネージャーを試しましたが、問題が続きました。ロック画面が動かなかったり、モニターのフル解像度5120x1440が使えなかったりしました。

私がこれまで見た中で最も速くパソコンを操作するのが、友人のokay zed氏です。彼にアドバイスを求めると、ウィンドウ管理についての考え方を教えてくれました。彼の戦略は、多数の仮想デスクトップを使い、デスクトップ内ではウィンドウをほぼ常に全画面で使うというものです。彼はxmonadを使っていますが、私にはAwesome Window Managerを勧めてくれました。

単一目的の仮想デスクトップという考え方が気に入ったので、それを軸にAwesomeのウィンドウマネージャー設定を作りました。ブログ用、書籍用、メール用など、用途ごとに専用のデスクトップを用意しています。1つのデスクトップあたり1〜2ウィンドウに抑えるようにしていますが、調べ物をするときは3つや4つ開くこともあります。

こちらが私のブログ用デスクトップの様子で、典型的な例です。編集用のVS Codeウィンドウが1つ、結果確認用のFirefoxウィンドウが1つ、調べ物用のFirefoxウィンドウがもう1つ、という構成です。

デフォルトのデスクトップモードはどれも気に入らなかったので、自分で作ることにしました。各ウィンドウに画面幅の25%を割り当て、4つを超えたらすべてを詰めて収まるようにします。Shift+Win+HとShift+Win+Lで手動でウィンドウを拡大・縮小することもできます。ただ、Win+Lは画面ロックのホットキーなので、うっかり自分を締め出してしまうこともあります。

Awesomeを数週間使ってみた感想はこうです。

  • 気に入っている点
    • 集中しやすいよう、単一目的のデスクトップを保つことを促してくれる。
    • マウスクリックではなくキーボードのホットキーで操作することを促してくれる。
    • Gnomeのようにサスペンド時に2%の確率でクラッシュすることがない。
  • 気に入らない点
    • すべてがLuaで実装・設定されており、私はその言語を知らない。設定はすべてLLMに書かせている。
    • 設定がかなり低レベルなので、ビューポートを溢れさせずに埋めるようなロジックも自分で書く必要がある。
    • デフォルトのデスクトップモードがどれも気に入らないので、自分で作る必要があった。
    • ドキュメントがすべてテキストのみで、グラフィックに特化したソフトウェアなのに奇妙に感じる。
    • ホットキーが競合していても、Awesomeは警告してくれない。
    • Firefox以外でリンクをクリックすると、現在のデスクトップにないブラウザでリンクが開くことがある。最後に触ったFirefoxウィンドウで開いているのだと思う。
  • まだ解決できていないこと
    • 「スクラッチパッド」機能の実装方法。パスワードマネージャーをフローティングウィンドウでさっと呼び出したり、電卓を素早く呼び出してまた閉じたりしたい。
    • ネットワーク接続やリソース使用率などのウィジェットをステータスバーに追加する方法。

興味深いリンク

ブログで外部コンテンツをキャッシュする

MastodonでLGUG2Z氏と、ブログにツイートを埋め込むのがいかに面倒かという話をしていました。ユーザーがツイートを削除すると、記事内にリンク切れのコンテンツが残ります。うまく表示されたとしても、読者はTwitterのトラッカーを読み込むことになります。私はスクリーンショットで回避してきましたが、見栄えの悪い解決策です。

Hugo(このブログで使っている静的サイトジェネレーター)で{<tweet id="12345">}のようなショートコードでツイートを埋め込み、Hugoがツイートデータを取得してバージョン管理下に保存できれば、Twitterへの継続的な依存をなくせると考えています。

LGUG2Z氏はこのアイデアを検討し、Zolaブログで実装しました。外部ソース(ツイートなど)からデータを一度だけ事前にダウンロードするスクリプトを実行し、ブログのビルド時や読者の訪問時に再取得することなくコンテンツを埋め込めるようにしています。

LGUG2Z氏の解決策をHugo向けに適用しようとしましたが、複雑になりすぎました。Twitterからデータをダウンロードするスタンドアロンのスクリプトを書き、ツイート風のUIでレンダリングするようにしました。通常のテキストツイートはうまくいきましたが、埋め込みメディアやリツイートを含むツイートになると、脆い基盤の上に作り込みすぎているように感じました。

Michael Stapelberg氏のImmich体験記

以前はすべての写真をGoogle Photosに保存していました。プライバシーへの懸念はありましたが、Google Photosが他より圧倒的に優れていたので、目をつぶってすべての写真を預けていました。その後、プライバシーへの意識が高まり、Googleへの不信感も強まったので、新しい写真のアップロードはやめましたが、代替は見つかっていませんでした。

ImmichやEnteは評判が良いと聞いていたので、Michael Stapelberg氏がNixOSを使ってImmichサーバーを構築した体験を詳細に綴った記事を見つけて嬉しく思いました。

Firefoxの強化型トラッキング防止機能

Firefoxが最近強化型トラッキング防止機能を改善しましたが、その存在自体を知りませんでした。有効にしてみると、uBlockが許可していたトラッカーもブロックしてくれ、誤検出もありませんでした。

「Rich Friend, Poor Friend」

2022年の「Rich Friend, Poor Friend」と、数週間前に公開されたその続編を最近見つけました。友人に助けを求める代わりにプロを雇うという話にはとても共感します(例えば、友人に頼む代わりに引っ越し業者を雇うなど)。

私はおそらく曲線の中で最も厄介な位置にいます。友人に引っ越しの手伝いを頼みたくないほどには裕福だけれど、ゲストハウスを別に用意して気軽に泊められるほど裕福でもない、というあたりです。

Deelが企業スパイを雇ったさらなる証拠

Deelの企業スパイ事件は、私の周りでは驚くほど注目されていません。

2025年3月、Ripplingは、自社の従業員の一人が実は競合であるDeelに雇われた企業スパイだったことを発見したと公表しました。スパイが発覚したとき、彼はトイレに駆け込み、携帯電話を流そうとしました。

Ripplingは11月に、DeelがCOOの妻を通じてスパイに報酬を支払っていたことを示す銀行記録を発見したという続報を公開しました。偶然にも、その妻はRobinhoodのコンプライアンス責任者で、倫理観の怪しいことで知られる会社でした。

Deelの元不満顧客として、彼らが報いを受けるのを見るのは嬉しいことです。

まとめ

何ができたか?

  • 「What Makes the Intro to Crafting Interpreters so Good?(『Crafting Interpreters』の導入部は何がそんなに優れているのか)」を公開
  • 「My First Impressions of MeshCore Off-Grid Messaging(MeshCoreのオフグリッドメッセージングを初めて使った感想)」を公開
  • 「Add a VLAN to OPNsense in Just 26 Clicks Across 6 Screens(OPNsenseでVLANを追加するのにわずか6画面26クリック)」を公開
  • X11システムでクリック数とキー入力数を数える、count-clicksという小さなZig製ユーティリティを作成
  • Awesome Window Managerを動くようにした

学んだこと

  • 楽しいゲームを作るには素早いフィードバックが重要。
  • TinyBeansは有料版でも実際には広告が大量にある。
  • Awesome window managerはGnomeよりも自分のニーズに合っている。

来月の目標

  • Refactoring Englishのサイトに人を呼び込むゲームを公開する。
  • Refactoring Englishの章を2つ公開する。
  • 趣味で作る家族向け写真共有アプリの設計ドキュメントを書く。

お願い

  • 「Will it Hit the Front Page?(フロントページに載るか?)」ゲームのベータテストに興味があれば、ぜひ連絡してください。

原文は Michael Lynch により に公開されました。

この記事は「muse-spark-1.2-contributor」を使用して翻訳されました。