<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Story on kimoto</title><link>https://new.kymt.me/story/</link><description>Recent content in Story on kimoto</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Thu, 09 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://new.kymt.me/story/index.xml" rel="self" type="application/rss+xml"/><item><title>当時は合法なソフトウェアの開発</title><link>https://new.kymt.me/story/legal-at-the-time/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://new.kymt.me/story/legal-at-the-time/</guid><description>&lt;p&gt;高校生の頃、当時はまだ合法だったソフトを作って、ネットで公開していた。いまの言葉で言えば、たぶん&amp;quot;作ってはいけない側&amp;quot;のものだ。でも当時は、法律がそこに追いついていなかっただけで、違法ではなかった。自分でも際どいものを作っている自覚はあったけれど、&amp;ldquo;ふつうの無害なソフト&amp;quot;を作っているつもりはなく、&amp;ldquo;いまはまだ合法なソフトウェア&amp;quot;を作っている、という感覚だった。&lt;/p&gt;
&lt;p&gt;なんでそんなものを、高校生が一人で作れたのか。たぶん、当時の自分に「&lt;strong&gt;ライブラリを使ったら負け&lt;/strong&gt;」という、妙に強い美学があったからだと思う。出来合いの関数を呼んで済ませるのは負け。仕様書を原典で読んで、一段下から自分で組んでこそ本物だ――という信条で、われながら頑固だった。&lt;/p&gt;
&lt;h2 id="仕様を読んで下から組む"&gt;仕様を読んで、下から組む&lt;/h2&gt;
&lt;p&gt;その頃書いていたものは、たいてい生の Windows API と、プロトコルの仕様書だけでできていた。コンパイラこそ Visual C++ 6.0 だが、中身は実質 C++ ではなく、素の C だった。C++ の便利な機能に頼らないどころか、標準ライブラリのお世話にもほとんどならない。文字列を入れておくバッファすら、&lt;code&gt;std::string&lt;/code&gt; のようなものは使わず、&lt;code&gt;malloc&lt;/code&gt; で自分で確保して、自分で解放していた。本当に、ライブラリというものをほとんど使っていなかった。そういう小さなプログラムを九十本近く、合わせて四千行ほど書いていた。&lt;/p&gt;
&lt;p&gt;たとえば DNS。名前を引くのにライブラリを使わず、RFC1035 を見ながら問い合わせパケットをバイト列から自分で組み立てて、UDP で投げていた。メールもそうで、SMTP(RFC821)を生のソケットで直接喋る自作メーラーを書いた。しかも凝ったことに、宛先のメールサーバーを自作の DNS リゾルバで MX レコードから自力で引いて、途中のリレーサーバーを介さず相手のサーバーへ直接配送する、というところまでやっていた。ISO-2022-JP のような当時のメールの文字コードも、変換処理を自分で書いて通していた。&lt;/p&gt;
&lt;p&gt;画面まわりも同じだ。MFC のような分厚いフレームワークには乗らず、Windows SDK を直に叩いた。ウィンドウを出すのも、メッセージループを回すのも、生の Win32 API で書く。ときには Win32 のもっと深いところ——他のプロセスに自分の DLL を送り込んで、そのプログラムの内側でコードを動かす、DLL インジェクションのようなことまで、API を直に叩いて自作した。OS が用意した仕組みの、想定された使い方の一歩外側に手を伸ばすのが、とにかく面白かった。&lt;/p&gt;
&lt;p&gt;メールの MIME も、multipart/mixed を自分で組み立てて、本文に添付ファイルを付けられるところまで作った。whois クライアントも、掲示板や日記の CGI（こちらは Perl）も、ぜんぶ自前だった。&lt;/p&gt;
&lt;p&gt;いま思えば効率は最悪だ。既製のライブラリなら数行で済むことを、何十行も書いて再発明していた。でも、そうやって一段下を触っているうちに、パケットの中身も、文字コードの都合も、OS が裏で何をしているのかも、手が覚えていった。「使う」だけでは絶対に手に入らない解像度が、そこにあった。&lt;/p&gt;
&lt;h2 id="小さく削ぎ落として作る"&gt;小さく、削ぎ落として作る&lt;/h2&gt;
&lt;p&gt;冒頭のあのソフトも、その延長だった。作るときは、とにかく&lt;strong&gt;小さくする&lt;/strong&gt;ことにこだわった。余計なランタイムを積まず、標準ライブラリにもなるべく頼らず、実行ファイルを圧縮して、フロッピー1枚に余裕で収まるサイズにした。「ライブラリを使ったら負け」の裏返しで、「余計なものを積んだら負け」でもあったのだと思う。&lt;/p&gt;
&lt;p&gt;そうして削ぎ落として作った小さなソフトを、誰でも落とせる形でネットに公開していた。当時は、そういうものを作って世に出すこと自体が、できることだった。&lt;/p&gt;
&lt;h2 id="二十年後検体になっていた"&gt;二十年後、検体になっていた&lt;/h2&gt;
&lt;p&gt;面白いのはここからだ。何年も――というより十数年、二十年という単位で経ってから――そのソフトが、**査読付きのセキュリティ研究の&amp;quot;検体&amp;rdquo;**として使われていたことを知った。当時は「いまはまだ合法」として配っていたものが、時代が進み、法も検知技術も追いついて、「検知すべき対象」の側に回り、それを見つけ出す手法の実験台のひとつに選ばれていた。作った本人が何も知らないうちに、自分の書いたコードが、どこかの研究室で走らされていた。&lt;/p&gt;
&lt;h2 id="それをいまのマシンが消した"&gt;それを、いまのマシンが消した&lt;/h2&gt;
&lt;p&gt;ふと、あれはどんなソフトだったっけ、と思った。細かい作りは、もう覚えていない。二十年も前に、高校生の自分が書いたものだ。懐かしくなって、いまも残っているその配布ページから、自分で自分のソフトを落としてみた。&lt;/p&gt;
&lt;p&gt;開く暇もなかった。ダウンロードが終わった瞬間、いまの OS が、それをマルウェアとして検知して、目の前で強制的に削除した。止める間もない。ただ「削除しました」という通知だけが残った。当時は合法として配っていた自分の作品を、二十年後の自分のマシンが、危険物として問答無用で拭き消していく。手を伸ばした過去が、現在の側から、静かに、しかし容赦なく消された――そういう感触だった。&lt;/p&gt;
&lt;p&gt;手元のファイルは、それで消えた。二十年前、あんなに苦労して組み上げたものが、いまのマシンにはただ一瞬だった。&lt;/p&gt;
&lt;p&gt;それでも、不思議と嫌な気はしなかった。消えたのは実行ファイルだけで、あれを作った日々——ライブラリを使わず、下から一つずつ積み上げて、やっと動いたときのあの感覚は、消えずに残っている。あれを動かすのにどれだけ夜を溶かしたか、初めてちゃんと動いた瞬間にどれだけ興奮したか。その苦労と達成感だけは消せない。&lt;/p&gt;</description></item><item><title>L4D2 マップ・MOD 配布記</title><link>https://new.kymt.me/story/l4d2-modding/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://new.kymt.me/story/l4d2-modding/</guid><description>&lt;p&gt;Left 4 Dead 2(L4D2)は Valve のゾンビ協力 FPS。対戦モードでは生存者4人と特殊感染者4人に分かれて戦い、特殊感染者への対処スキルが勝敗を分ける。ただ、突進してくる Charger(体当たりで突っ込んでくる特殊感染者)を近接武器のヘッドショット一発で確殺するような一瞬の技術は、実戦の失敗の中でしか磨けない。それなら練習環境ごと自作すればいい、と練習マップ3部作と HUD MOD 群を作って配布していた。&lt;/p&gt;
&lt;h2 id="練習マップ3部作2010年頃"&gt;練習マップ3部作(2010年頃)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://new.kymt.me/gaming/charger_hs_training/"&gt;Charger 近接 HS 練習マップ&lt;/a&gt; — Charger を近接武器のヘッドショットで一発確殺する練習をするマップ。ひたすら Charger が湧いて突進してくる。BOT の Charger は突進中の被ダメージが減る仕様で近接 HS 一撃死が再現できないため、spawn した瞬間に自動でダメージを与えて擬似的に成立させた。&lt;code&gt;net_fakelag&lt;/code&gt; で実戦のラグまで再現できる&lt;/li&gt;
&lt;li&gt;&lt;a href="https://new.kymt.me/gaming/witch_farm/"&gt;Witch 処理練習マップ&lt;/a&gt; — Witch(刺激すると襲いかかる特殊感染者)の処理だけを延々と反復する&lt;/li&gt;
&lt;li&gt;&lt;a href="https://new.kymt.me/gaming/jockey_training/"&gt;Jockey 練習マップ&lt;/a&gt; — Jockey(生存者に飛び乗って操作を奪う特殊感染者)の bhop(連続ジャンプで加速する移動技)と strafe ジャンプを練習する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;遊ぶ側の不満は HUD MOD で解決した。残弾警告(Large Ammo HUD)、キルログ拡大(Large Damage Log)、味方ヘルスの数値表示、コンパクトな ClearHUD、観戦者用 HUD——いずれも GameBanana(旧 FPSBANANA)で配布した(&lt;a href="https://new.kymt.me/gaming/"&gt;配布物一覧&lt;/a&gt;)。当時の日記には配布側の実感も残っている:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;HomePageのリストに、Jockey Training乗せるの忘れてたので追加した。あれなぜかめっちゃ人気なんだよな、よくわからん&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="調べて直す2010年"&gt;調べて、直す(2010年)&lt;/h2&gt;
&lt;p&gt;マップと MOD の裏には、ゲームを分解して調べた蓄積がある。調査メモは当時から公開していた:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://new.kymt.me/gaming/l4d2_hud_editing/"&gt;L4D2 の HUD 改造方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://new.kymt.me/gaming/l4d2_c1m4_rush/"&gt;c1m4 のラッシュ特性についての研究結果&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://new.kymt.me/gaming/l4d2_gameinstructor_forcenotify/"&gt;ゲームインストラクター初期化アドオンの仕組み&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://new.kymt.me/gaming/l4d2_dem_version_check/"&gt;dem ファイルから記録時のバージョン情報を取得する方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2年前のメモが答え合わせされる"&gt;2年前のメモが答え合わせされる&lt;/h3&gt;
&lt;p&gt;2012年10月のアップデートで、ハシゴを高速でのぼるテクニックが突然できなくなり、Steam の公式フォーラム(SPUF)にスレッドが立つ騒ぎになった。原因は cvar(ゲームの設定値)の &lt;code&gt;joystick&lt;/code&gt; がデフォルトで 1 になったこと——そして「joystick 1 だと高速のぼりができなくなる」という現象自体は、&lt;strong&gt;その2年前に自分で見つけて wiki の&lt;a href="https://new.kymt.me/wiki/l4d2-in-depth/"&gt;詳解Left4Dead2&lt;/a&gt;に書き残していたもの&lt;/strong&gt;だった。Valve の開発者が「コントローラーを使っていないのに移動が変わるのは意図していない」と認めて翌日に修正され、高速のぼりが Valve 公認のテクニックであることも確定した(2012年10月19日〜20日)。&lt;/p&gt;</description></item><item><title>2010年の夏を .dem から掘り起こす</title><link>https://new.kymt.me/story/dem_forensics/</link><pubDate>Thu, 09 Jul 2026 00:00:00 +0000</pubDate><guid>https://new.kymt.me/story/dem_forensics/</guid><description>16年前の L4D2 対抗戦の demo 185本を AI が解析し、固有文字列から全プレイヤーの座標まで開いた記録</description></item><item><title>タイムアタックと記録</title><link>https://new.kymt.me/story/records/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://new.kymt.me/story/records/</guid><description>&lt;p&gt;FPS の中でも、&lt;strong&gt;bhop(バニーホップ)&lt;/strong&gt; という移動テクニックに一時期のめり込んでいた。ジャンプを連打しながら空中で視点と入力を合わせると加速し続ける、Source Engine 特有の挙動で、それを突き詰めるための &lt;strong&gt;Kreedz Climbing(KZ)&lt;/strong&gt; という MOD がある。地形を登ったり bhop でコースを駆け抜けたりしてタイムを競う、タイムアタックの世界。ここでの記録と、そこから派生した bhop まわりの作りものをまとめる。&lt;/p&gt;
&lt;h2 id="kreedz-climbing-の記録"&gt;Kreedz Climbing の記録&lt;/h2&gt;
&lt;p&gt;当時の日本記録(jp best)をいくつか持っていた。&lt;code&gt;*&lt;/code&gt; が jp best、&lt;code&gt;(tie)&lt;/code&gt; が同記録:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kz_date2: 03:02 *jp best&lt;/li&gt;
&lt;li&gt;kz_bhop_cartooncastle: 00:35 *jp best&lt;/li&gt;
&lt;li&gt;kz_bhop_shrubhop: 02:24 *jp best&lt;/li&gt;
&lt;li&gt;kz_bhop_tiles: 01:18 *jp best&lt;/li&gt;
&lt;li&gt;kz_bhop_ocean: 00:37 *jp best&lt;/li&gt;
&lt;li&gt;kz_bhop_arctic: 00:24 *jp best (tie)&lt;/li&gt;
&lt;li&gt;kz_bhop_backalley: 00:22 jp best (tie)&lt;/li&gt;
&lt;li&gt;kz_bhop_kashgar: 00:24 *jp best (tie)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;日記に残っている「実績まとめ」より:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;JP Best(4つ): kz_date2, kz_bhop_cartooncastle, kz_bhop_shrubhop, kz_bhop_tiles
JP Best同記録(3つ): kz_bhop_arctic, kz_bhop_backalley, kz_bhop_kashgar
そろそろkz界はフラグムービー作ったあとに去ろうと思っている&lt;/p&gt;</description></item><item><title>peercast.in</title><link>https://new.kymt.me/story/peercast-in/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://new.kymt.me/story/peercast-in/</guid><description>&lt;p&gt;PeerCast は 2002年生まれの P2P 映像配信ソフト。専用クライアントを入れてポートを開放しないと視聴できない、敷居の高さごと愛されてきた配信文化圏だった。&lt;strong&gt;peercast.in&lt;/strong&gt; は 2012年に作った、その PeerCast の配信をブラウザだけでサムネイル一覧・検索・視聴できるようにするサイト。「インストールしないと何をやっているかすら見えない」せいで失われているリスナーを取り戻し、PeerCast の間口を広げるのが狙いだった。&lt;/p&gt;
&lt;p&gt;実装は nginx reverse proxy + Sinatra + 自作のしたらば掲示板クローラー。配信ごとのコメントをリアルタイム表示する「Peercast Stream」機能は Server-Sent Events(サーバーから一方向にデータを流し続ける仕組み)で作っていた(詳しくは後述の&lt;a href="https://new.kymt.me/story/peercast-in/#%e5%86%85%e9%83%a8%e3%81%ae%e4%bb%95%e7%b5%84%e3%81%bf"&gt;内部の仕組み&lt;/a&gt;)。&lt;/p&gt;
&lt;h2 id="どんな画面だったか"&gt;どんな画面だったか&lt;/h2&gt;
&lt;p&gt;サイトの実物は残っていないが、公開10日目(2012年3月15日)のトップページの HTML が Wayback Machine に丸ごと残っていた。そこから当時の画面を再現したのがこれ:&lt;/p&gt;
&lt;figure class="map-thumb"&gt;
 &lt;img src="https://new.kymt.me/images/story/peercast-in-top-20120315-recon.png" alt="peercast.in トップページの再現スクリーンショット。黒いナビゲーションバーの下にサイト説明と検索フォーム、リスナー数順の配信一覧テーブルが並ぶ" width="1280" height="1000"&gt;
 &lt;figcaption&gt;2012年3月15日のトップページの再現。アーカイブされていた当時の HTML に同時期の Twitter Bootstrap 2.0 を当てたもので、配信者名はぼかし、未アーカイブのサムネイル画像はプレースホルダにしてある。「現在のPeercast総人口は、1220人です」「現在41件 配信中」も当時の実データ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;トップページは配信中チャンネルをリスナー数順に並べたリアルタイムランキングで、各行にサムネイル・配信時間・「再生する」リンク・掲示板リンクが付く。配信中チャンネルの全文検索と過去の全データからの検索、AutoPagerize 対応もあった(2012年3月13日)。ランキングは最高リスナー数・平均リスナー数・配信時間の3種類で、「客観的な指標をもとに新たな配信者さんを見つけることができる」ことを狙っていた(2012年3月15日)。&lt;/p&gt;
&lt;p&gt;サムネイルは10分おきに全配信から取得していて、配信ごとの「サムネ一覧」ページで時系列に眺められた。ノンストップで蜘蛛の生活を流し続ける配信(当時すでに100時間超)をこのサムネ一覧で紹介した日記も残っている(2012年3月12日)。&lt;/p&gt;
&lt;p&gt;このスクリーンショットの2日後(2012年3月17日)には、配信中の番組をスクリーンショットのタイルで一覧できる「Now!」ページが追加された。「アクセスするごとにランダムに並び変わるので、人間が左上から順番に見てしまうという行動パターンへの対策もバッチリできています」(当時の日記)。その後もサイドバー・最新レス表示・配信者一覧・取得先 YP(配信一覧を持つ元サイト)の追加と、ほぼ日次のペースで機能が増えていった(2012年3月20日〜26日)。&lt;/p&gt;
&lt;h2 id="内部の仕組み"&gt;内部の仕組み&lt;/h2&gt;
&lt;p&gt;当時のソースコードが手元に残っていた。それと日記を突き合わせると、内部構成はこうなっていた:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://new.kymt.me/story/peercast-in/architecture.svg" alt="peercast.in のシステム構成図(当時のソースコードと日記から作成)"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;スタック&lt;/strong&gt;は nginx + Sinatra(Ruby)+ MySQL。実は Sinatra アプリは2つに分かれていて、&lt;strong&gt;peercast.in&lt;/strong&gt; 本体がランキング・検索・サムネ一覧・Now! を、別アプリの &lt;strong&gt;Peercast Stream&lt;/strong&gt; がコメントのリアルタイム配信を受け持っていた&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;サムネイルのキャプチャ&lt;/strong&gt;は、サーバー上で常駐させた PeerCast クライアント(&lt;code&gt;localhost:7144&lt;/code&gt;)経由で各配信に接続し、&lt;strong&gt;ffmpeg で「先頭8秒地点」の1フレーム&lt;/strong&gt;を切り出して、RMagick で縮小・黒背景に合成して軽くぼかす、という流れ。最初の8秒はバッファで映像が乱れがちだったのを避ける工夫で(2012年3月5日)、これを10分ごとに全配信ぶん回していた。並列化には parallel gem、失敗時のリトライには自作の &lt;a href="https://new.kymt.me/projects/retry-handler/"&gt;retry-handler&lt;/a&gt; を使っている&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;YP の index.txt&lt;/strong&gt;(&lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt; 区切りのチャンネル一覧)は、複数の YP を結合してから NG キーワードで配信を除外し、1つのファイルに書き出していた(&lt;code&gt;yp_merger&lt;/code&gt;)。パーサは自作ライブラリ集 orelib にあり、のちに自作の &lt;a href="https://github.com/kimoto/csvmapper"&gt;csvmapper&lt;/a&gt; で書き直す記事も書いた(2012年8月1日)。YP のクロール自体は本体とは別のサーバーで回していた(2012年3月23日)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ランキング&lt;/strong&gt;(最高リスナー数・平均リスナー数など)は MySQL のビューとして持っていた&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;8,000 req/sec&lt;/strong&gt; は nginx のキャッシュチューニングによるもの(2012年3月8日)。動画そのものは配信していない(再生リンクは視聴者手元の PeerCast クライアント &lt;code&gt;localhost:7144&lt;/code&gt; に向く)ので、捌くのは HTML とサムネイル画像だけでよかった&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Peercast Stream&lt;/strong&gt; の SSE は Sinatra の &lt;code&gt;stream :keep_open&lt;/code&gt;、nginx 側は &lt;code&gt;proxy_buffering off&lt;/code&gt; で流していた(2012年4月20日)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="クライアント側のパッチ"&gt;クライアント側のパッチ&lt;/h3&gt;
&lt;p&gt;そのキャプチャの土台になっていたのが、公開の2週間前(2012年2月21日)に用意した Linux 用 PeerCast クライアントの fork だ。ベースは「PeerCast for Linux(VP パッチ版)」で、README には &amp;ldquo;VP patch + fixed compile bug&amp;rdquo; とだけ書いてある。けれど実際に足していた本命は、&lt;strong&gt;サーバーで無人常駐させるための自動再起動&lt;/strong&gt;だった。PeerCast 本体を &lt;code&gt;fork()&lt;/code&gt; した子プロセスで動かし、親が &lt;code&gt;waitpid()&lt;/code&gt; で見張って、子が落ちたらまた起動しなおす——というスーパーバイザを &lt;code&gt;main.cpp&lt;/code&gt; に加えている。10分おきに何日も動き続けるキャプチャ基盤の裏で、クライアントが落ちても勝手に生き返るようにするための改造で、コンパイルを通すための細かい修正(&lt;code&gt;sys/wait.h&lt;/code&gt; の include など)も一緒に入っていた。&lt;/p&gt;</description></item><item><title>TF2 Sushi Server 運営記</title><link>https://new.kymt.me/story/tf2-sushi-server/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://new.kymt.me/story/tf2-sushi-server/</guid><description>&lt;p&gt;Team Fortress 2(TF2)は Valve の対戦 FPS。その協力モード &lt;strong&gt;MvM(Mann vs. Machine)&lt;/strong&gt; は、プレイヤー6人でロボット軍団の侵攻を防衛するモードで、公式サーバーのほかに個人が建てる「コミュニティサーバー」で遊ぶ文化があった。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sushi 鯖&lt;/strong&gt;は、2012年の夏にそのコミュニティサーバーとして建てた日本向けサーバー群。最初は1部屋だったが、最盛期には MvM 10部屋 + Payload(爆弾カートを押し合う対戦モード)+ Idle という構成になり、累計利用者は最終的に25万人を超えた。これはその運営の記録。&lt;/p&gt;
&lt;h2 id="数字で見る-sushi-鯖"&gt;数字で見る Sushi 鯖&lt;/h2&gt;
&lt;p&gt;累計利用者数の推移。当時のブログで節目ごとに発表していた実測値を直線でつないだもの:&lt;/p&gt;
&lt;svg viewBox="0 0 640 300" width="100%" role="img" aria-label="Sushi 鯖の累計利用者数の推移。2012年7月の設立から増え続け、2013年8月の一周年で58,340人、2014年6月に100,279人、2015年3月に158,840人、2016年8月の最終確認値で257,822人"&gt;
 &lt;title&gt;Sushi 鯖 累計利用者数の推移(2012–2016)&lt;/title&gt;
 &lt;line x1="60" y1="75" x2="620" y2="75" stroke="#e5e5e5" stroke-width="1"/&gt;
 &lt;line x1="60" y1="168" x2="620" y2="168" stroke="#e5e5e5" stroke-width="1"/&gt;
 &lt;line x1="60" y1="260" x2="620" y2="260" stroke="#cccccc" stroke-width="1"/&gt;
 &lt;text x="55" y="79" text-anchor="end" font-size="11" fill="#8a8a8a"&gt;20万&lt;/text&gt;
 &lt;text x="55" y="172" text-anchor="end" font-size="11" fill="#8a8a8a"&gt;10万&lt;/text&gt;
 &lt;text x="55" y="264" text-anchor="end" font-size="11" fill="#8a8a8a"&gt;0&lt;/text&gt;
 &lt;text x="128" y="280" text-anchor="middle" font-size="11" fill="#8a8a8a"&gt;2013&lt;/text&gt;
 &lt;text x="264" y="280" text-anchor="middle" font-size="11" fill="#8a8a8a"&gt;2014&lt;/text&gt;
 &lt;text x="399" y="280" text-anchor="middle" font-size="11" fill="#8a8a8a"&gt;2015&lt;/text&gt;
 &lt;text x="535" y="280" text-anchor="middle" font-size="11" fill="#8a8a8a"&gt;2016&lt;/text&gt;
 &lt;polyline points="60,260 106,247 139,239 157,232 181,223 200,214 213,206 233,195 322,167 429,113 620,22" fill="none" stroke="#2f6fbe" stroke-width="2" stroke-linejoin="round" stroke-linecap="round"/&gt;
 &lt;g fill="#2f6fbe" stroke="#ffffff" stroke-width="1.5"&gt;
 &lt;circle cx="60" cy="260" r="3"/&gt;&lt;circle cx="106" cy="247" r="3"/&gt;&lt;circle cx="139" cy="239" r="3"/&gt;&lt;circle cx="157" cy="232" r="3"/&gt;&lt;circle cx="181" cy="223" r="3"/&gt;&lt;circle cx="200" cy="214" r="3"/&gt;&lt;circle cx="213" cy="206" r="3"/&gt;&lt;circle cx="233" cy="195" r="3"/&gt;&lt;circle cx="322" cy="167" r="3"/&gt;&lt;circle cx="429" cy="113" r="3"/&gt;&lt;circle cx="620" cy="22" r="3"/&gt;
 &lt;/g&gt;
 &lt;text x="206" y="201" text-anchor="end" font-size="11" fill="#444444"&gt;1周年 58,340&lt;/text&gt;
 &lt;text x="322" y="154" text-anchor="middle" font-size="11" fill="#444444"&gt;100,279&lt;/text&gt;
 &lt;text x="429" y="100" text-anchor="middle" font-size="11" fill="#444444"&gt;158,840&lt;/text&gt;
 &lt;text x="612" y="18" text-anchor="end" font-size="11" fill="#444444"&gt;257,822&lt;/text&gt;
&lt;/svg&gt;
&lt;p&gt;設立一周年(2013年8月)時点の統計と、確認できる最終値(2016年8月、MOTD アーカイブの &lt;a href="https://new.kymt.me/gaming/tf2/mvm/stats.html"&gt;Stats ページ&lt;/a&gt;より):&lt;/p&gt;</description></item><item><title>TF2 マップ制作記</title><link>https://new.kymt.me/story/tf2-mapmaking/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://new.kymt.me/story/tf2-mapmaking/</guid><description>&lt;p&gt;TF2 の協力モード MvM(プレイヤー6人でロボット軍団を迎え撃つモード)用のマップを、自分で運営していた &lt;a href="https://new.kymt.me/story/tf2-sushi-server/"&gt;Sushi 鯖&lt;/a&gt;で回すために3枚作った——mvm_volcano_a4(溶岩)、mvm_labo_a1(研究所)、mvm_mountain_b3(山を防衛)。マップは Hammer という Source Engine 標準のレベルエディタで作る。ダウンロードは &lt;a href="https://new.kymt.me/gaming/"&gt;Gaming&lt;/a&gt; から。&lt;/p&gt;
&lt;p&gt;mvm_mountain と mvm_volcano は、テストプレイにすぐ join してくれる SpaceMomonga さんのアドバイスを受けて作ったマップで、「このときのコミットメントがすごく大きかったですね」と一周年の日記に書いている。&lt;/p&gt;
&lt;h2 id="作ってみて分かった大変さ"&gt;作ってみて分かった大変さ&lt;/h2&gt;
&lt;p&gt;自作マップのプレイ回数が421回になったときの日記(2013年1月)に、マップ制作の地味な苦労が記録されている:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;マップ作るのって意外とまじでめんどくて大変であるというのがよくわかって、たとえばbotの湧きタイミングの調整とか、botがスタックしないように見えない壁をせっせと設置したりとか、処理落ちしないように壁越しに見える必要のない部分にはnoclipっていう壁を設置することで、壁越しのオブジェクトを描画させないようにoptimizeしたりとか。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="制作日記map作り"&gt;制作日記「Map作り」&lt;/h2&gt;
&lt;p&gt;MvM 登場直後の2012年9月から、「Map 作り#N」と題した制作日記を連載していた(#1〜#13)。#11 は mvm_volcano のコンセプトメモで、「RED チームが火山の内部に持っていた秘密基地に、ロボットが爆弾を持って攻め込んでくる」という設定と一緒に、こんな設計判断が書いてある:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;溶岩ダメージは即死ではなくて火炎ダメージを数秒間耐えられるようにした。なぜかというと、溶岩エリアに落ちた味方をみてニヤニヤする時間的猶予を残すため。即死しちゃうと、溶岩でもがき苦しむ味方の姿をみることができない。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;wave(押し寄せる敵の波)の設計は秒単位で組んでいた。mvm_mountain_b3 の wave7 の設計メモ(2012年9月25日)は「1秒後に buff banner soldier squads が4体 spawn → 2秒後に natascha giant×2(2箇所で)→ …… → 60秒後におそらくクリア」というスポーン表そのものが残っている。&lt;/p&gt;
&lt;h2 id="ハマりどころの記録"&gt;ハマりどころの記録&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BOT が落ちる&lt;/strong&gt; — 曲がり角で左側に落下する BOT が多発。nav mesh を &lt;code&gt;nav_split&lt;/code&gt; で分割し、危ない縁に &lt;code&gt;nav_avoid&lt;/code&gt; 属性を付けて歩かせない手順を確立した(2012年10月1日)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;バランス調整は永遠に終わらない&lt;/strong&gt; — volcano の a1→a2 だけでも「Respawn Suicide バグを直した」「Engineer が強すぎるので Sentry Buster が湧く専用の場所を追加」「敵が落下死したときに bomb が近くに復活するようにした」(2012年9月30日)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;テストを速くする工夫&lt;/strong&gt; — &lt;code&gt;tf_mvm_jump_to_wave&lt;/code&gt; で任意の wave に飛び、世界の時間を倍速にして特定のラッシュまで早送りする、という検証手順を文書化していた(2012年9月24日)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;エンジン側のバグも踏む&lt;/strong&gt; — 制作中に TF2 本体のバグを何個も発見している。建築者のいない中立セントリーガンが敵を撃とうとするとサーバーごとフリーズする、セントリーガンは水中の敵に反応しない、テレポーター出口に物理オブジェクトがあると出口が壊れる(2012年9月26日)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;道具も壊れる&lt;/strong&gt; — 翌2013年、SteamPipe 化で Hammer Editor が新規マップ作成時にエラーを吐いて起動しなくなり、gameinfo.txt に &lt;code&gt;ToolsAppId&lt;/code&gt; を設定して復旧した(2013年7月29日)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="未完に終わった構想"&gt;未完に終わった構想&lt;/h2&gt;
&lt;p&gt;作りかけ・構想止まりのマップもいくつかあった(マップ名は伏せる)。&lt;/p&gt;</description></item></channel></rss>