Refactoring English: Month 20

Michael Lynch

Refactoring English:20ヶ月目

一言でまとめると

スクレイピングボットと戦いながら、書籍の売上を3倍にしました。

初めての方へ

こんにちは、Michaelです。ソフトウェア開発者で、小さなインディーテックビジネスを運営しています。現在、Refactoring English: Effective Writing for Software Developersという本を執筆しています。

毎月、このような振り返り記事を公開して、本の進捗や仕事全体の状況を共有しています。

ハイライト

  • 7月の書籍売上は、好調だった6月の3倍になりました。
  • 世界一間抜けなスクレイピングボットと戦っています。
  • AIを使ってマルチプレイヤーのブラウザゲームを作っています。

目標の達成度

毎月初めに、その月に達成したい目標を掲げています。結果は次のとおりです。

『Refactoring English』について話すため、5つのポッドキャストに出演交渉する

  • 結果: 1件のみ交渉しました
  • 評価: D

Talking Postgresへの出演交渉に時間をかけたのですが、ホストの連絡先がLinkedInしか見つかりませんでした。LinkedInでメッセージを送りましたが、返信はありませんでした。なお、The TMPDIR Podcastにゲスト出演しましたが、こちらは交渉する前から招待いただいていたので、カウントには入れていません。

『Refactoring English』のサイトにユニーク読者3万人を集める

  • 結果: サイトのユニーク読者数は23,817人でした
  • 評価: B

内心では「Hacker Newsのトップページに1本記事を載せる」という目標として考えていたのですが、実際に掲載されたにもかかわらず3万人には届きませんでした。

早期アクセスを終了し、本の正式版(1.0)をリリースする

  • 結果: まだ正式版のリリースには至っていません
  • 評価: D

読者からのフィードバックへの対応に予想以上に時間がかかってしまいました。フィードバックアプリ自体はうまく機能しているのですが、そこから生まれる作業量が読みにくいのです。

『Refactoring English』の指標

指標2026年6月2026年7月変化
ユニーク訪問者数17,52323,817+6,294 (+36%)
予約販売による収益$1,441.86$3,908.80+$2,466.94 (+171%)

6月はKickstarter以来2番目に売上が良い月でしたが、7月はさらにその3倍を記録しました。

売上が跳ね上がった最大の理由は、早期アクセス割引を終了したことです。7月13日に、7月20日で早期アクセス価格を終了し、価格を30ドルから49ドルに引き上げると告知しました。

7月20日に売上が急増し、その後は緩やかに推移したことを示す売上グラフ

セール最終日には、「Why I Stopped ‘Creating Content’(なぜ私は“コンテンツ制作”をやめたのか)」というブログ記事を公開したところ、Hacker Newsのトップページに掲載されました。さらに、Hacker News風のサイトで、よりインディー色が強くテック寄りでないbubbles.townでもその日のトップ投稿になりました。

セール最終日には売上が急増し、その日だけで1,000ドル以上を売り上げました。

価格を49ドルに上げた後は、予想どおり売上は急速に落ち着きました。正式版(1.0)をリリースした後に、価格について改めて検証する予定です。

世界一間抜けなスクレイピングボットとの戦い

ブログ記事を月曜日に公開して訪問者が大きく増えました。すると火曜日にも、さらに大きな急増がありました。

訪問者数の大きな増加を見て、有名なブロガーがリンクしてくれたのかと思いましたが、すぐにボットによるものだと気づきました。

すべてのアクセスはHacker News Popularity Contestに集中していました。以前にも、ブロガーがコンテストでの順位について書いて私のツールにリンクし、訪問者が急増したことはありましたが、今回のような規模や継続的な波は初めてでした。

2度目の急増を見たときは、「今週は絶好調だな!」と思い、妻にその話をしていたところ、はっと気づきました。

今日も5万人も訪問者が来たよ!どこから来てるんだろう。誰かがツイートしてくれたのかな。

ん、でもツイートならリファラーにTwitterが表示されるはずだよな。

あ……ボットだ。

ログを確認すると、すべてのリクエストがまったく同じブラウザのユーザーエージェントを使っていました。

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36

これはChrome 125、2年以上前のブラウザバージョンです。この古いバージョンのおかげでボットを簡単に識別できました。私のブログを読むような人が、今さらこんなに古いブラウザを使っているとは考えにくいからです。

スクレイパーはコンテストのトップページを繰り返し読み込み、そこにあるリンクを片っ端からクリックしているようでした。そこで少し工夫してみました。Bunnyにリライトスクリプトを仕込み、ユーザーエージェントをチェックして、スクレイパーだった場合には偽のレスポンスを返すようにしたのです。本来3,000件以上のリンクを生成するページを、リンク3件だけのページに置き換えるという手でした。

しかし、なぜかこの偽装はうまくいきませんでした。おそらくスクレイパーはすでにすべてのURLをデータベースに登録済みで、トップページからリンクを隠しても意味がなかったのだと思います。

レート制限も試しましたが、Bunnyがサポートする最低速度は1KB/sで、アプリのデータの多くは数KBのファイルに収まっているため効果がありませんでした。スクレイパーは約100もの異なるIPブロックを使い分けていたので、IPごとの制限もできませんでした。

最終的にはIPレンジでブロックすることにしました。Bunnyのログから特定のユーザーエージェントを抽出し、攻撃に関連するIPをすべて集めるツールを、vibecodingで作りました。これはうまくいったのですが、1週間後に今度は新しいIPと、少しだけ新しいユーザーエージェントで攻撃が再開したので、スクリプトを再実行してブロックリストを更新しました。今のところはうまく抑えられています。

この攻撃で一番奇妙なのは、ボットがブロックされてもまったく気にしないことです。延々とサーバーを叩き続けます。「2週間もTCPレベルで100%ブロックされているリクエストに、わざわざ計算資源や帯域を浪費しても意味がない」と判断しそうなものですが、彼らは気にしないようです。

攻撃者のIPをブロックした後も、彼らは叩き続けています。

攻撃が始まった日にNetlifyのサポートに連絡しましたが、まったく役に立ちませんでした。返信1通につき1週間待たされました。最初の返信は存在しない設定を変更しろという内容だったので、おそらくAIが生成したものだと思います。2通目はより人間の書いたものに感じましたが、「対応に2週間かかった間に問題は解決したようですね、やることはありません」という内容でした。幸い、超過料金の55ドルは、頼んだところ返金してもらえました。

静的サイトはどこでホストすべきか

私はすべての静的サイトをNetlifyでホストしていますが、サービスは徐々に悪くなってきていました。今回のスクレイピングボット攻撃に対する完全に無関心な対応を見て、より積極的にボット対策をしてくれるベンダーに乗り換えようと決めました。

答えは明らかに「Cloudflare」なのですが、インターネットのインフラがCloudflareに集中しすぎている現状には危機感を覚えているので、これ以上集中させることには加担したくありません。

VPSやVPS+BunnyをCDNとして使うことも考えましたが、Hacker Newsのトップページに載った日に、VPSが落ちたりBunnyのキャッシュ設定を誤ったりしてサイトがダウンするのは避けたいのです。誰かにお金を払って、サイトを常にオンラインに保ってもらいたいのです。

  • Surge
    • 長所
      • 静的ホスティングに特化しており、まさに私が求めているものです
      • 帯域幅が無制限なので、スクレイピングボット攻撃のコストを向こうが負担してくれます
    • 短所
      • (おそらく)1人で運営されているため、障害リスクが高まります
      • 管理はすべてターミナルアプリ経由で、ウェブアプリがありません
      • 多要素認証に対応していないようです。対応に向けて作業中ではあるようですが
      • アップロード時に変更のあったファイルだけを同期するrsyncのような仕組みではなく、すべてのファイルを毎回アップロードするため、少しずつしか変わらない大規模なサイトでは手間がかかります
  • statichost
    • 長所
      • 1人で運営されているため、カスタマーサポートが迅速かつ丁寧です
      • 余計な複雑さを排し、主に静的ホスティングに特化しています
    • 短所
      • 1人で運営されているため、障害リスクが高まります
      • アップロード時に変更のあったファイルだけを同期するrsyncのような仕組みではなく、すべてのファイルを毎回アップロードするため、少しずつしか変わらない大規模なサイトでは手間がかかります
      • ボット・スクレイパー対策は含まれていません
      • サイトのビルドとホスティングがセットになっていますが、私はホスティングだけが必要です
      • EU中心であることが大きな売りですが、私は米国にいます
  • Vercel
    • 長所
      • DDoSやスクレイピングボットを防ぐと謳っています
      • rsync形式のアップロードに対応していると思います
    • 短所
      • 巨大で複雑なサービスです
      • Netlifyより親切に対応してくれるという根拠がありません
  • Bunny CDN上に自前で構築する
    • 検討しましたが、Bunny上で差分アップロードやアトミックデプロイを実装するのは、それ自体が複雑なプロジェクトになってしまいます

Mikeville:未完成のマルチプレイヤーブラウザゲーム

小さなクラウドサーバーでいろいろ試しているのですが、4 CPU・8GBメモリのサーバーがほとんどアイドル状態で遊んでいます。せっかく余裕のあるまともなサーバーがあるなら、友人たちのために何か楽しいものをホストできないでしょうか。

ゲームはどうでしょう。ValheimARKのようなセルフホスト可能なゲームも見かけましたが、あれらは他のプレイヤーが同時にいないとあまり楽しくないように感じます。

数ヶ月に一度しかゲームをしない私としては、他の人が同時にいれば一緒に楽しめて、いなくても不在の間に何があったかを見るのが楽しい、そんなゲームが理想です。イメージとしては、友人たちと共同で持つビーチハウスのような感覚です。時々一緒にバカンスを過ごしつつ、別々に訪れたときは互いにメモや贈り物を残しておくような。

問題は、このビーチハウスのような感覚を、具体的なゲームのコンセプトにどう落とし込むかが思いつかないことです。

ひとまず、vibecodingによるゲーム開発がどんなものか試しながら、何が楽しいかを探っているところです。このプロトタイプを作るにあたって頭にあったのは、Stardew ValleyとUltima Onlineという、私が何時間も遊んだ2つのゲームです。

ゲームはブラウザでプレイできます。よければ遊んでみてください。

今日は少しの間オンラインにいる予定なので、よければ遊びに来てください。ソースコードは、より良いgit forgeが見つかるまでGitLabで公開しています。

今月読んで面白かったブログ記事

  • Stripe Just Wants a Number
    • exe.devブログが好きで、特に小規模なソフトウェアベンダーに影響するソフトウェアの問題について、彼らの考え方が面白いと感じています。私自身は課金ロジックがそこまで複雑ではないので直接役立つわけではありませんが、考え方としてはすごく面白いと思います。
  • 99% of My Website Traffic Is Bots
    • 今月のスクレイピングボット騒動があったので、とても共感でき、参考にもなりました。カスタムのイラストも素敵でした。
  • I Regret Migrating to Codeberg
    • 私はこの1年、プロジェクトをGitHubからCodebergへ移してきて、有料メンバーにもなっていますが、今ではその選択を後悔しています。障害やサーバーの過負荷が頻発しています。極めつけは、AIを使っているプロジェクトを禁止するというCodebergの決定でした。私自身は「やりすぎ」とされる恣意的な閾値を下回っていると思いますが、それでも他の場所へ移すことを検討しています。
  • Super Mario Derivations
    • 面白いNixの小技が紹介されていました。Super Mario 3のエミュレータ上のプレイ状態をNixの属性でエンコードするというもので、例えば nix build '.#level1.rightb.rightb.rightab.rightb' は、レベル1を開始して「右+B(右にダッシュ)」を2回、「右+A+B(ダッシュしながらジャンプ)」、「右+B」を1回押す、という意味になります。Nixがすべてのゲーム状態をキャッシュしてくれるので、ボタン操作を変えても、前回との差分だけを再計算すれば済むのです。

まとめ

来月の目標

  • 『Refactoring English』について話すため、5つのポッドキャストに出演交渉する。
  • 『Refactoring English』のサイトにユニーク読者3万人を集める。
  • 本の正式版(1.0)をリリースする。

協力のお願い

  • 静的サイトのホスティングについて、おすすめがあれば教えてください。
  • Claire Giordanoをご存じでしたら、Talking Postgresに(Postgresについてではなく)テクニカルライティングについて話すゲストとして私が適任だと伝えてください。

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

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