Refactoring English:12ヶ月目
原文は Michael Lynch により に公開されました。 このブログを購読する
一言でまとめると
わかった、だったら赤ちゃんの写真を共有するアプリは自分で作るよ。
ハイライト
- Hacker Newsのトップページに載る投稿を予測するゲームを作っています。
- 腹いせに家族向け写真共有アプリを作っています。
- キーボード中心のウィンドウマネージャーに乗り換えました。
目標の成績
毎月初めに、その月に達成したいことを宣言しています。目標に対してどれだけできたか振り返ります。
本の章を2つ公開する
- 結果: 1章のみ公開
- 評価: C
設計ドキュメントの章で行き詰まっています。カバーしたいことが多すぎて、うまく言語化できなかったり、この本にどこまで含めるべきか決めかねています。
問題の一つは、章があまりに長大で、一度に取り組むには圧倒されてしまうことです。新しい計画は、この章をより小さなセクションに分割し、一つずつ集中して取り組むことにしました。残りの章については何を書きたいかがはっきりしているので、これが最後の「難しい」章になるはずです。
10人の読者に連絡を取る
- 結果: 2人にしか連絡できず、うち1人から返信がありました。
- 評価: D
やること自体は楽しいし、有益な反応も得られるのに、ずるずると先延ばしにしてしまいます。最初のハードルを下げればやる気が出るかと思い、事務作業の部分をどんどん自動化しています。
Refactoring Englishのウェブサイトに人を呼び込むツールやブログ記事を作る
- 結果: 「What Makes the Intro to Crafting Interpreters so Good?」を公開しました
- 評価: B
3,508人に読んでもらえたので、新規読者を集めるという点ではある程度成功でした。取り上げた本の著者であるBob Nystrom氏が記事を気に入ってくれたのも嬉しかったです。たとえ記事が伸びなくても、少なくとも彼にどれだけ彼の仕事に感謝しているかを伝えられるだろうと思っていました。
Refactoring Englishの指標
| 指標 | 2025年10月 | 2025年11月 | 増減 |
|---|---|---|---|
| ユニーク訪問者数 | 22,398 | 7,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の売上になりました。
Peter Spiess-Knafl氏(zeitkapsl共同創業者)がブログ記事の中でRefactoring Englishに言及してくれ、その記事はLobstersで1位になりました。もともと本の狙いは、読者が成功するブログ記事を書けるよう手助けし、本に満足して人におすすめしてもらうことだったので、彼の投稿は嬉しかったです。
「トップページに載るか?」ゲーム
Hacker Newsをしょっちゅう読んでいるので、どのストーリーがトップページに載るかは当てられる気がしていましたが、それを厳密に検証したことはありませんでした。そこで、自分の予測精度を試すゲームを作りました。

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

このゲームの最大の問題は、ストーリーがトップページに載るまでに最大24時間かかることです。結果が出るまで24時間も待たされるのでは、楽しさが半減してしまいます。
最初は「投稿から最初の30分以内にトップページに載るか」を予測するルールに変えてみましたが、30分でもやはり痛いほど長く感じます。
新しいアイデアとしては、投稿から10分後に暫定的な判定を出すというものです。ストーリーの経過時間、アップボート数、コメント数から、トップページに載る可能性があるかどうかを大まかな確率で計算できます。つまり、あるストーリーがトップページに載ると予測したものの、10分後になってもアップボートもコメントも付いていなければ、ゲームは暫定的に「不正解」と伝えますが、その後24時間以内に奇跡的な巻き返しがあれば、得点を取り戻すこともできます。
過去のストーリーの結果を当てるバージョンも考えました。そうすれば答えがすでに確定しているので即時にフィードバックできますが、それはあまり面白くないと感じました。似たようなゲームをすでに他の人が作っているからです。それに、私が狙っているようなHacker Newsのヘビーユーザーにとっては、過去のデータでは台無しです。何がトップページに載ったかをなんとなく覚えているからです。
腹いせに作る無料のTinyBeans代替アプリ
妻と私は去年第一子が生まれたので、家族とプライベートに赤ちゃんの写真を共有する方法が欲しくなりました。友人の中にはこうしたアプリを使っている人もいましたが、どれも広告付きでした。自分の子どもの写真に企業が広告をベタベタ貼るなんて嫌だったので、別の選択肢を探しました。
TinyBeansを見つけたときは、これだと思いました。広告を無効にできる有料版があり、プライバシーが最大の売りとして謳われていました。完璧です。
ところが、TinyBeansを使い始めると、広告だらけでした。「フォトブックを買いませんか!」「もっと個人情報を教えてください!」
たった今アプリを開いただけでも、自分の子どもの写真を見るまでに3つの別々の広告を閉じなければなりませんでした。



有料会員で、これらの広告を何十回も閉じているにもかかわらず、TinyBeansはアプリを開くたびに3つの巨大な広告を表示します。
しかも、私の家族は私が見るよりもさらに多くの広告を受け取っていることがわかりました。中にはサードパーティのサービスの広告も含まれています。最近のものでは、家族に胡散臭いAI企業への投資を勧める広告がありました。

TinyBeansが家族にメールを送る際、息子の写真の間にこうしたスパムのような広告を挟み込んできます。
有料プランの「広告なし」の約束は私と妻にしか適用されず、家族の他のメンバーはみな、広告やアップセル攻勢にさらされています。
早い段階でTinyBeansをやめたかったのですが、新生児育児で忙しくて、新しいアプリを探して家族全員を移行させる時間がありませんでした。だから毎月、しぶしぶTinyBeansに$9を払い続けています。
そしてブラックフライデーがやってきました。
TinyBeansから、アプリ内でセールを行うので受信箱をブラックフライデーのセール情報で煩わせることはない、と自画自賛するメールが届きました。

受信箱を無駄なメールで煩わせないことを自慢する無駄なメールをTinyBeansが送ってきました。
なるほど、自分がいかにメールを送らないかを自慢するメールですか。
しかしそれすら嘘でした!TinyBeansはその後、アプリ内のブラックフライデーセールをチェックするよう促すメールをさらに4通も送ってきたのです。

受信箱をブラックフライデーのプロモーションで埋め尽くさないと約束した後、TinyBeansは5通ものブラックフライデーのプロモーションメールを送ってきました。
これで堪忍袋の緒が切れ、今では意地になってTinyBeansの代替品を自作し、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を試すことを勧めてくれました。
単一目的の仮想デスクトップというokayの考え方が気に入ったので、それを中心にAwesome window managerの設定を作りました。ブログ用の専用デスクトップ、本用の専用デスクトップ、メール用のデスクトップといった具合です。1つのデスクトップあたりウィンドウは1〜2個に抑えるようにしていますが、何かを調べる際に3つ目や4つ目を開くこともあります。
こちらが私のブログ用デスクトップの様子で、典型的な例です。編集用のVS Codeウィンドウが1つ、結果を確認するためのFirefoxウィンドウが1つ、そして調べもの用のもう1つのFirefoxウィンドウが時々加わります。

デフォルトのデスクトップモードはどれも気に入らなかったので、自分で作ることにしました。各ウィンドウに画面幅の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がこのアイデアを検討し、対応を実装しました。彼は外部ソース(ツイートなど)から一度だけデータを事前ダウンロードするスクリプトを実行し、その後はブログのビルド時や読者の訪問時に再取得することなくコンテンツを埋め込めるようにしています。
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がDeelのCOOの妻を通じてスパイに報酬を送金していたことを示す銀行記録を発見したという続報を出しました。その妻は偶然にも、Robinhoodのコンプライアンス責任者でした。Robinhoodといえば、その胡散臭い倫理観で知られる会社です。
Deelの元不満顧客として、彼らが報いを受けるのを見るのは嬉しいことです。
まとめ
何ができたか
- 「What Makes the Intro to Crafting Interpreters so Good?」を公開しました
- 「My First Impressions of MeshCore Off-Grid Messaging」を公開しました。
- 「Add a VLAN to OPNsense in Just 26 Clicks Across 6 Screens」を公開しました
- x11システムでクリック数とキーストローク数を数えるための小さなZig製ユーティリティ、count-clicksを作成しました。
- Awesome Window Managerを動作させました。
学んだこと
- 楽しいゲームを作るには迅速なフィードバックが重要である。
- TinyBeansは有料版でも実際には広告が大量にある。
- Awesome window managerはGnomeよりも自分のニーズに合っている。
来月の目標
- Refactoring Englishのウェブサイトに人を呼び込むゲームを公開する。
- Refactoring Englishの章を2つ公開する。
- 趣味で作る家族向け写真共有アプリの設計ドキュメントを書く。
お願い
- 「Will it Hit the Front Page?」ゲームのベータテストに興味がある方は、ご連絡ください。
記事をランダムに読む
コメント
ログインしてコメントする