たびとの旅路 ~電脳砂漠の冒険譚~

フロッピー頼りに歩き、クラウドの地平を見つめる今日まで。見つけたオアシス、迷い込んだ砂の迷宮、全てこの羊皮紙に。

第四章:幻の神器『TubeEater』追想録 ~魂に宿りし苦難の記憶~

旅の途中、ふと、かつて記した古い羊皮紙を見つけた。忘れないうちに、その記憶をここに書き留めておくとしよう。

コロナワクチンという名の試練に倒れ、39.4度の熱に浮かされながらも、私は「TubeEater」の錬成を続けていた。これは、その開発の旅路も終盤、この神器にどんな魂を宿らせようとしていたのか、その開発の裏側を記した、古き記録である。

今となっては、NuGetパッケージという名の部品が時の砂に埋もれ、新たにこの神器を錬成することは叶わない。しかし、そこに込められた自動化の仕組み、多言語への対応、そして数多の不具合との戦いの記憶は、未来の冒険者たちの、何かの役に立つかもしれない。

この羊皮紙のあらまし

この羊皮紙が導く者

  • かつて、YouTubeからビデオをダウンロードするという、禁断の夢を見た者
  • .NET 6のC#で、アプリケーションという名のゴーレムを創り出す術に興味がある者
  • 今はもう動かぬ、幻の神器「TubeEater」の開発の裏側に、興味を抱く考古学者

神器の心臓部:自動化という名の魂

TubeEaterの最も強力な魔法、それは「自動化」だった。一度、自動ダウンロードボタンを押せば、あとはYouTubeのURLをコピーするだけで、神器が自動的に宝を釣り上げてくれる。

TubeEater の自動ダウンロード状態

チェックマークが、自動化の魔法が発動している証

その仕組みは、三つの魔法の組み合わせで成り立っていた。

  1. クリップボードの監視: DispatcherTimerという名の見えざる目が、常にクリップボードを監視し、YouTubeのURLという獲物を見つけ出す。
  2. 非同期のタスク実行: 獲物を見つけ次第、ダウンロードという名の狩りを、非同期のタスクとして実行する。これにより、狩りの最中も、次の獲物を見つけ出すことができる。
  3. 完了後の処理: 狩りが終われば、獲物をファイルとデータベースという名の宝物庫に納め、プログレスバーという名の狩りの痕跡を消し去る。

神器の知性:多言語対応という魂

この神器は、日本語と英語だけでなく、理論上は、世界のあらゆる言葉を操ることができた。 その秘密は、言語データをJSONファイルとして外部に持ち、起動時にそれを読み込んで、データベースに格納するという、柔軟な設計思想にあった。

public class LangData
{
    public string Name { get; set; } = String.Empty;     // 言語名
    public string Locale { get; set; } = String.Empty;   // ロケール
    public Dictionary<string, string> Messages { get; set; } = new(); // メッセージ集
}

これにより、ユーザーは自ら言語ファイルを追加・編集し、関西弁のTubeEaterさえも創り出すことが可能だったのだ。

神器の試練:数多の不具合との戦い

数えきれないほどのダウンロードテストの中で、私はいくつもの試練に直面した。

  • 文字化けの呪い: VideoLibraryという、ダウンロードの核となる魔法が、時折、日本語を韓国語として誤認識する。これは、もはや手の打ちようのない、ライブラリそのものにかけられた呪いだった。
  • 同名コンテンツの罠: 同じ作者が、同じタイトルのコンテンツを複数アップロードしている場合、ダウンロード済みと誤認識し、スキップしてしまう。これは、YouTube IDで最終確認を行うことで、なんとか回避した。
  • ライブ配信という結界: ライブ配信のURLを指定すると、VideoLibraryは例外という名の悲鳴を上げる。これをそのままにしておくと、ユーザーは毎回エラーダイアログに悩まされる。私は、この悲鳴だけを静かにログに記録し、旅を続けさせるよう、魔法を書き換えた。

羊皮紙を巻く前に

こうして、私は数多の試練を乗り越え、TubeEaterという神器を、ほぼ完成にまでこぎつけた。 自動化、多言語対応、そして数々の不具合修正。開発という名の旅は、常に新たな発見と、それを乗り越える喜びの連続だった。

しかし、その先に待っていたのは、YouTubeの利用規約という、あまりに巨大な壁。 この物語は、ハッピーエンドでは終わらなかった。

この羊皮紙が、一つのアプリケーションが、どのような思考と、どのような苦難の末に形作られていくのか、その一例として、未来の冒険者の目に留まるなら、私のこの旅も、無駄ではなかったのかもしれない。

おっと、どうやら相棒が腹を空かせたようだ。今日はこのへんで筆を置くとしよう。

砂漠で見つけた魔法のランプ

ラクダの独り言

ご主人が、熱に浮かされながらも、必死に鉄の箱を叩いて、何かを創り上げていたかと思えば、今度は「規約がー」とか言って、がっくりと肩を落としている。俺に言わせりゃ、そんなに必死になる前に、まず最初に「その獲物は、獲ってもいい獲物なのか」を調べるのが、狩人の基本ってもんだろうに。まったく、後先考えねえから、そういうことになるんだ。やれやれだぜ。