Write and Run

it's a simple way, but the only way.

総括2024

年末。KOBA789 です。

南米出張から戻ったあとちっとも時差ボケが治らず、自律神経を単振動させていたらもう年が明けそうです。それに限らず本年もさまざまなことがありました。

2023はこちら: diary.hatenablog.jp

年初

1月。2024年は配信2連チャンで幕を開けました。いずれも好評で、というか宮乃やみさんとやらせてもらったRust の所有権とライフタイムを解説する方はやたらと好評で、アーカイブについたコメントの数に驚いたりしました。まったくありがたいことです。結局2024年の YouTuber 活動は年始のこれがピークになってしまいましたが。

仕事の方では、念願のデータ利活用でビジネスすっぞという部が立ち上がり、そこへ異動となりました。私は個人のお金を稼ぐことにあまり興味はありませんが、お金をいただけるような価値を事業で創造するのは、稼いだお金でより大きなことができるようになっていくので大好きです。というわけで、よりビジネス寄りの所属への異動を希望していたのでした。が、そんなにスッと仕事の引き継ぎができるわけもなく、同僚のサポートも得ながら3ヶ月くらいかけて異動した気がします。このとき、某氏の「南米とか興味ある?」という言葉に曖昧に肯定的な返事をしたことが、私の2024年の動向を決定づけることになります。

それまで組込み Rust を書くことが多かった仕事とはうってかわって、異動先ではウェブフロントの TypeScript を書いたり Terraform HCL を書いたりといった感じで技術的にはどこか懐かしさがありました。まぁそれぞれを書く分量の割合が逆転したというだけで、それまで TypeScript を全然書いていなかったわけでも、それ以降組込み Rust を書かなくなったわけでもないんですが。

3月にはスペースワンカイロス1号の打ち上げ……とは関係なく、打ち上げ予定の前の週に串本に遊びに行きました。単に本州最南端を取りたかったというだけですね。青森やら鹿児島やらで長距離運転に慣れてしまった私としては土日で行くには近すぎました。現地で時間が余り気味になってしまったので、和歌山の内陸側の地図をもう少し読み込んでおくべきだったと後悔しています。本命の本州最南端の碑はあんまり印象に残っていません。交通アクセスが良すぎて最果て感がないこと、近くにバスツアー客向けの寂れた観光施設があって雰囲気が台無し、なども印象の薄さの一助になっていると思います。

串本にマイカーで行ったらぜひ通りたい手彫りの隧道。サイズはコンパクトカーでギリギリ。往路より復路が難しい(1敗)

そんな旅の帰りに寄った PA で開かれていた、レンタル落ち CD のワゴンセールでレアグルーヴを発見。「水の都の護神」のサントラはプレミアが付いており、1万5千円くらいで取引されています。たしか1万円弱くらいで入手したはず。これに収録されている「謎の少女、再び(迷宮)」がいい曲なんですよねぇ。最南端の碑よりこっちのほうが印象に残ってます。

劇場版ポケットモンスター「水の都の護神」オリジナルサウンドトラック

仕事の方はぼちぼちというか、体制が変わったので引き継ぎやら立ち上げやらであんまり成果らしい成果がなくもどかしい時期でした。でもここに(全然完璧ではないにせよ)時間をかけたからその後の調子がよかったのだ、と思いたい。言い訳かも。

ゴールデンウィーク翌週、ふと砂丘というやつが見たくなり、鳥取に行きました。串本が近すぎた反省を活かし、もし時間が余っても島根まで足を伸ばせば調整できるだろうという算段です。鳥取砂丘は一部ではがっかりスポットとか言われることもあるらしいですが、私にとってはまったくそんなことはなく、一面砂まみれの景色と、大量の砂に足を取られて歩いて丘に登るのも大変という体験はとても新鮮でした。砂丘の見学は太陽がピークアウトする前に追えてしまい、時間が余るかもという私の予感が見事的中したため、スイスポを海岸線に沿って西へ走らせることにしました。

鳥取砂丘の様子。どこを撮っても砂と空が映るだけなのでおもしろい画にするのは難しい。

観光地化されているお社にちょくちょく挨拶をして回りつつ、私は出雲大社……の裏手にある日御碕灯台に向かいました。ここから見える夕陽が綺麗だというので、是非この目で拝んでみたいと思っていたのです。水面に沈む陽の光は前評判通り美しく、満足して帰ろうとする私は灯台の駐車場でヒッチハイクを見つけました。その2人組みはちょっといいカメラも持っていた(SONY の PXW とかか?)ので、もしや YouTuber か何かだろうかと思って声を掛けてみると、なんと CBC テレビのロケでした。聞けば地名しりとりという企画で日本中を旅~させられている~しているらしく、日の入りを見に来たら終バスを逃したとのことでした。山の上で終バスを逃した人を麓まで送るのは人生で2度目です*1。麓の駅までの車内ではながつさんとお互いの旅の思い出で大いに盛り上がりました。別れ際に番組のステッカーをいただきました。番組ステッカーっていいですよね。小学生時代におに魂シールに憧れていたからでしょうか。なお、この模様は(ローカルなテレビ局とはいえ)バッチリ地上波と YouTube で放映されたみたいです。

思えば、日御碕までの道中で「因幡の白兎」の神話が有名な白兎神社に立ち寄っていました。縁結びの神様でありますが特段相手というのもいない始末でしたので、もしこの旅で何か愉快な縁があれば、とお祈りをしていたのでした。まさか即日とは思いませんでしたが、本場恐るべし、なのでしょうか。帰りがけにお礼参りをして帰路に就きました。

日御碕で見た夕陽。その場所の雰囲気も相まって特別に感じられる。

年初に言っていた南米の話がジワジワ現実味を帯びてきて、というか私を南米に連れて行く準備を周囲が着々と進めてくれていて、あとは黄熱病のワクチンさえ打てば行けるとなってしまったのがこの頃。2023年末の時点では海外で仕事する気なんて更々無く、この時点では海外経験も僅か1回という状態でした。よもや2回目の海外が地球の裏側になろうとは。

こうして日本の夏、南半球の南米では冬(?)に初めて南米に渡ることになりました。わかりやすく南米と書いていますが、「南米」って「アジア」くらいの広さがある言葉なわけで、正確にはパラグアイのアルゼンチン側の国境近くと、ブラジルのベレンマナウスあたりに行きました*2。この出張の目的は様々で、挨拶回りだったりデータ集めだったり学会参加だったりしました。しかし振り返ってみると、その地に人工衛星潜在的な需要があると感じられたことが何よりの収穫だったように思います。これは本当に行かないとわからないかも。

さて、その旅路はどうだったのかというと、まず行きの飛行機の機内食で出されたパイナップルで舌の裏を切って英語はおろか日本語すら満足に話せなくなり、ブラジルで泊まったホテルで焚かれていた殺虫剤で鼻水が止まらなくなり持っていったティッシュを使い果たしたりと、しょーもないところで大苦戦を強いられました。ブラジルのドラッグストアで陳列棚に出されていない虫刺されの薬をどうにかこうにかコミュニケーションして買ったのはいい経験だったかもしれません(ブラジルはポルトガル語圏なので町中では英語が通じない)。そんなこんなで不慮の事故によるデバフはありつつも、現地のみなさんには軒並み暖かく迎えていただいて、いずれの土地でも料理は美味しく(口は痛かったけど)、トータルでは無事に帰って来られたということになると思います。仕事の自己評価の方はまぁ、次回に期待という感じでしたが……。

パラグアイでいただいた、ナマズのフライ(揚げ焼き?)。めちゃくちゃ美味い。もう一度食べたくて後述の2度目の南米出張で聞いたところ、そのときは禁漁の季節で水揚げがないとのことだった。悲しい。

南米から帰ると日本の夏は粗方終わっていて、真夏の最も暑い時期を南半球でやりすごした形となりました。ベレンはほぼ赤道直下なので季節関係なく暑かったけど。

仕事の方では、宇宙科学技術連合講演会という宇宙系の学会で発表をしました。この学会は初参加だったのですが、これがなかなか(いい意味で)無茶苦茶な学会で、近年の宇宙産業の急速な発展に呼応してその規模を拡大しつつも、未だに宇宙系の発表をオールジャンルで受け止め続けており、スーツ・ジーパン・学生・エンジニア・サイエンティストが一堂に介しているという異様な光景が広がっていました。

プライベートではYAPC 函館に行ったり、高校の同級生と伊豆に遊びに行ったりしていました。今でも一緒に遊べる~アホな~高校時代の友人がいるというのは嬉しいことだなぁと思いつつ、かれこれ10年以上経つけど何も変わってなさすぎて安心したり心配になったり複雑な気分です。自分も心配される側であるという自覚はあります。そんな友人達も多忙は多忙で、なんならうち一人は日本海側に住んでてこっちに出てくるのも容易でないという事情もあり、なかなか予定の共通部分が取れずにいたのですが、10月の三連休は皆偶然予定が空いており、かくして伊豆旅行の運びと相成りました。

修善寺近くの「    屋」。任意が売ってる(知らんけど)

南米2。この回ではパラグアイにのみ行きました。夏の回では不意のデバフを食らいすぎてあまりバリュー出せなかったし、個人的に今度こそはという気持ちで挑みました。フィールドワークが多かった前回と違って、普通に議論やコミュニケーションの多い仕事ではありましたが、パイナップルによる事故はなく2回目故の余裕があったので多少のバリューは出せたような気がします。自分の詳しくないドメイン(異国の農業)に関して慣れない言語で質問して理解するプロセスはシンプルに脳が疲れる。それでも相手方の職員の方達がスペイン語と英語を通訳してくれるのでなんとかなっています。これなかったらどうなってたんだマジで……。

せっかく行くんだから空気をたくさん吸っとくのが大事というか、この国のことはググってもなんもわからんので現地にいるうちにちゃんと見て回っておきたいよねということで近くの山(丘?)へ。標高は350mくらいで日本の基準では低山ですが、頂上付近が急に切り立っていて岩場になっており、低いながらも楽しい登山でした。

Cerro Hu という筑波山みたいな山の山頂からの景色。パラグアイの地形が真っ平らなのがよくわかる

近くの Ypacaraí 湖の岬に立っていたパラグアイ国旗。パラグアイの国旗には裏と表があり、それぞれの別の図案が描かれている。それぞれの意味について調べてみるとおもしろい。

来年に向けて

金・時間・体力・気力のうち一番足らないのは時間ですがそれはどうにもならないので、時間→体力→気力という連鎖でジリー・プアー(徐々に不利)になるのを避けるべく2025年は体力を付けていきたいですね。そういえば2024年の目標はもはや覚えていません。

2025年の KOBA789 にもご期待ください。

*1:私の運転じゃなかったけど、京都の嵐山に取り残された友人を助けに行ったことがある。たまたま別件で遊びに来てて居合わせた

*2:パラグアイの地名は安定したカタカナ表記がないので省略。どうせ英語・日本語でググってもロクに情報がない

「なぜベストを尽くしたのか」への憧れ

これは VTuber・Vクリエイター Advent Calendar 2024 - Adventar の19日目の記事です。大遅刻。

Channel 78.9 という YouTube チャンネルでたまーに長時間の配信をやっている。内容はプログラミングとかコンピュータサイエンスとか、そういう感じだ。 www.youtube.com

配信頻度のごく低い私が、何を楽しみにして活動をやっているのか、ということについて書こうと思う。普段、自分のモチベーションや活動の裏側については動画や配信内ではあまり言及しないように、いわゆる舞台裏を明かさないようにしている。そうしている理由もこの記事の内容とちょっと関係があるのだけれど、いい機会だと思って筆を執ってみる。

「なぜベストを尽くしたのか」

「なぜベストを尽くしたのか」とは、ニコニコ動画で(やや)ポピュラーなタグの一つである。その意味について、ニコニコ大百科を引用すると以下の通り。

世の中には暇つぶし・気分転換など普通はベストを尽くさないもの、ベストを尽くす必然性が無いものが多数存在する。

しかし、そんなどうでもいいことに真摯な姿勢を貫く人がいる。

一説によれば人間は情熱の生物で、どうしようもないことにもベストを尽くさずにはいられないらしく、ニコニコ動画でもたまにそういうベストを尽くしてしまった人に遭遇する時がある。そんな時視聴者は様々な感情を持って本タグを付けるのである。

なぜベストを尽くしたのかとは (ナゼベストヲツクシタノカとは) [単語記事] - ニコニコ大百科

つまり、愛すべき無駄な頑張りを労うため、あるいはそれを称えるために使われるタグである。

私とニコニコ技術部

ところで、私はニコニコ動画とその文化が好きだ。15年前と比べるとだいぶ様々な印象を持たれるようになったニコニコ動画だが、今でも最もよく見ている動画サイトに違いない。私自身は YouTube で活動しているにもかかわらず、だ。

今でもほぼ毎日見ているニコニコ動画だが、やはり最も熱心に見ていたのは中学生の頃だったように思う。来る日も来る日もランキングとお気に入りのタグを追い、新着動画をチェックしていた。

当然、ボカロ曲なども追いかけていた*1のだが、一番追いかけていたのはニコニコ技術部のタグだった。ニコニコ技術部タグは、高い技術を応用したいわゆる「やってみた」動画に付けられるタグだ。今思えば、あれらの投稿者は当時の高専生だったり大学生だったり、あるいはプロの技術者だったりしたのだろう。

ニコニコ技術部の動画の魅力は、その技術力の高さだけではなかった。技術だけでなく、ユーモアに溢れた動画がたくさんあった。むしろ、ユーモアのために技術を惜しみなく使う姿勢があった。自分自身が多少技術に理解があるからこそ、その動画で行われていることがどれほど高度なことなのかがわかった。バカげたことにあまりに高度な技術が投入されていること自体がおもしろかった。ケーキをチェーンソーで切るのはエンジニアリングとしては不適切だが、ユーモアとしては適切である*2

技術がユーモアを生めるという事実は衝撃的で、それらの動画に私は夢中になっていた。

趣味だからこそベストを尽くす

仕事においては、全力を尽くすことが常に合理的だとは限らない、というのはまぁ多少反論はあるだろうけれど比較的受け入れられる意見だと思う。飽きても疲れてもある程度続けなければならない仕事では、その瞬間のパフォーマンスと未来のパフォーマンスでバランスを取らねばならないから、全力を出すことは長いスパンでの最適にならないことがある。短距離走とマラソンは違う、というやつだ。

しかし、後先考えずベストを尽くして、自分がどこまでできるのか知りたいと思うことがある。あるいはどこまでできるのかを示したいということがある。私がこの活動をしている理由のひとつは、それらの欲求を満たすためだ。

この活動をしているのは完全に趣味のためだ。つまり、あらゆる経済的合理性を無視していいってことだ。経済的合理性を無視しているから、収支は機材や資料の購入でずっと赤字だ。土日を潰して準備をしているけれど自分の時間単価を考えたら大赤字だ。

それでも、というか、それだからおもしろいのだと思っている。経済的合理性のあるコンテンツでは、経済的不合理のおもしろさは出せない。赤掘ってる人間からしか出せないユーモアがある。少なくとも私はそう信じている。

たまに、準備にコストかけててすごいですねと言われることがある。嬉しい言葉だ。でも、私の場合はほとんどコストをかけることそれ自体が目的なのでそれは当たり前なのだ。いいコンテンツを届けるために努力をしているのとはちょっと違う。無駄なコストを投下してみたいからこの活動をしているのだ。

2025年に向けて

配信頻度が低いのは、一発が高コストだからなのではなく、単にネタ切れだからだ。以上の話から理解いただけたと思うが、ネタがあるのならもっとコストを投下したい、配信をしたいと思っている。しかしネタが切れているのでそうもいかないという状況だ。

こればかりは私のセンスの問題でもあるので一朝一夕で改善することではないが、引き続き気長に待っていただければと思う。

*1:当時、ボカロ曲は合法的に無料で聞ける数少ない音楽のひとつであり、お金と音楽に飢えた中学生にはありがたい存在だった

*2:トリビアの泉で、無駄に金のかかった検証をしているのがおもしろいのと同じ理屈だと思う

函館に行ってきた

別に隠す理由があるわけではないし、X を見ればどこに行っていたかなんて丸わかりなのだけれど、下記のようなツイ……ポストを見かけたので敢えて伏せて(?)書いてみるかと思って書いてみます。対戦よろしくお願いします。

私と名前を出さないあのカンファレンスとの関係

恥ずかしながら、あのカンファレンスに参加したのは今回が初めてでした。もちろん存在自体はもはや思い出せないくらい昔から知っていたのだけれど、開催情報をずっと見落とし続けており、開催当日に Twitter(当時)に流れてきた楽しそうな写真を、みんな美味そうなもの食いやがって許せんなんで誰も教えてくれなかったんだと指くわえて見て悔しい思いをしてきました。

では今回はなぜ参加できたのかというと、これは今回のベストスピーカー*1でもある id:tomo_ari (osyoyu) のおかげによるところが大きいです。彼とは同じチームで毎年 ISUCON に出場しており、どうしても Ruby で優勝するぞという合理性のない目標を掲げて一緒に闘っている仲です。そして Ruby で勝つためには正しくパフォーマンス計測ができなきゃいかんということで、彼は pf2 という Ruby のプロファイラを開発しています。

ところが我々の ISUCON チームは仲が悪い[要出典]ことで知られており、直前の練習と本番以外で顔を合わせることはほとんどありません。そのため pf2 の開発状況はチームメイト間であっても共有されておらず、果たしてその年の大会で使えるのか、そのプロファイラで分析して何がわかったのかなどは長らく謎に包まれたままでした。

そんな中、ぼちぼち今年こそはなんとしても勝ちたい*2と思った私は、pf2 はどうなっているんだ、Ruby は遅いのか、100万円は獲れるのか、というようなことを問いただすべく彼のポストを漁りました。するとちょうど例のカンファレンスでそれに関する発表をするとの予告があり、かくしてようやく、私はチケット販売期間中に例のカンファレンスの存在を知ることができたわけです。チームへの情報共有を疎かにするのは悪いことばかりではないという学びがありますね。

私とはこだて未来大学

私がはこだて未来大学を訪れるのはこれが2度目です。1度目は6年ほど前、私がまだ前職にいたときでした。はこだて未来大学の学生を対象に集中講義(のようなもの。単位は出ません)をやっていいよと言われたので、当時まだマイナー言語枠だった Rust のハンズオンをやるべく訪れたのでした。C言語の講義の内容を初めて理解できたとか、低レイヤおもしろそうだとかといった反応をいただけてホクホクで帰ったような記憶がありますが、だいぶ昔のことなので都合の良い記憶が捏造されているかもしれません。

函館名物ラッキーピエロのチャイニーズチキンバーガーを初めて食べたのもそのときです。丸一日の講義ですから学生含めてお昼ご飯の用意が必要だったのですが、休日なので食堂などは使えません。困って未来大の学生さんに相談したところ、それならと教えてもらったのがラッピでした。というかラッピ以外ありえんだろみたいなテンションで言われたような気がします。当日も、お昼ご飯はラッピ?とかいうの用意しました、という案内に多くの学生が喜んでおり、当時ラッピの偉大さを微塵も知らなかった私はそんな大げさなと思っていたのですが、食べてみて確信しました。たしかに美味い。それ以来、年一くらいで食べに行っている気がします。

なんか未来大というか半分くらいラッピの話ですが、はこだて未来大学という地に再び遊びに行けるのはとても嬉しかったです。

スポンサーブースを回る

思い起こすと、今までいろいろなカンファレンスに参加してきましたが、セッションを聞くだけでスポンサーブースは回らないということがほとんどだったように思います。毎回登壇者として行くので、スライド作成に追われてて余裕がないとか、ロビーに突っ立ってると絡まれるのでそれで時間が溶けるとか、そういうことになりがちでした。

今回は友人の発表を聞くために行ったのでとても余裕がありました。スライド作成に追われないカンファレンス参加がこれほど気楽なものだとは思いませんでした。気楽さを体験して初めて、登壇者って大変なんだなと思いました。登壇者には懇親会では発表の感想を伝えたりして労ってあげましょう。登壇者のみなさんは猛烈なプレッシャーを乗り越えて懇親会に到達しています。

それはともかく、時間がたくさんあったので、今回はスポンサーブースをじっくり回ることにしました。そもそも、参加の目的の半分は「外の風にあたる」ことでした。pf2 の発表を聞くのももちろん大事でしたが、前日にスライド作成を手伝ったりでほとんど内容を知ってしまったのでそちらばかりに意識を向け過ぎる必要もなくなっていたのです。

私は、今はいわゆるウェブ業界*3から離れ、人工衛星スタートアップで働いています。そのため、今のウェブ業界にどういう企業があるのか、どういうビジネスをしているのかという事情にかなり疎くなっていました。業界は違えど、ソフトウェアエンジニアの活躍場所としては並列です。つまり、自分の未来の転職先である可能性があると同時に、今人材を取り合うライバルでもあるわけです。知らないわけにはいかないのです。

やや打算的な書き方になってしまいましたが、まぁそんなに深くは考えていなくて、私の狭い視野と拙い想像力では、ウェブ技術は EC サイトと UGC サービスしか作れないように感じてしまう(失礼)ので、他のみなさんは一体どんなビジネスに技術を使っているのかに興味があったということです。

今回は、私の知らない会社がたくさんブースを出展していました。私にとってとても嬉しいことでした。とりあえず社名を知らないブースに行って会社紹介の紙ペラをもらい、会社の概要や創業のきっかけ、お金を払ってくれるお客さんはどんな人・会社なのか、エンジニアリングのおもしろさはどこか、などを聞いてまわりました。私の全然知らないドメインでビジネスチャンスを見つけ、そこの課題を技術で解決している人たちの話を聞くのはとても新鮮な体験でした。ブースを回るごとに新しいことを教えてもらいました。事業ドメインのおもしろさだけを語る勉強会があったら行きたいかもしれません。

概ね各社共通しているなと思ったのは、そのドメインに詳しい人が創業しているということです。そんなの当たり前だ、と思うかもしれませんが、テックカンパニーはドメイン知識だけでは成立せず技術も必要です。しかし IT 技術はどんな分野とも隣接しているわけではありません。昔から距離の近かった金融や EC などはともかく、ヘルステックや不動産といった領域にも IT 技術が深く応用されるようになったのは、IT 技術がより広い範囲の人々に行き渡った結果だと思います。その結果、あるドメインエキスパートがたまたま IT 技術を持ち合わせているという確率が高まり、おもしろいビジネスが発生しやすくなっているのだと感じます。

あこがれとふるさと

私が参加に失敗しつづけていたからというのもありますが、このカンファレンスやこのカンファレンスに登壇している人々は以前から私のあこがれでした。私自身は Perl を書きませんが、Perl を書いている・書いていた先輩たちこそ、20年前、私がプログラミングを始めたときに憧れたハッカーの姿なのです。記号だらけのよくわからないコードを書き、伝わらないジョークを飛ばし、そういう仲間と酒を飲む、それが私にはクールでした。

いくらかの参加者とはそれぞれ別の場所で会ったことがありました。そのせいか、このカンファレンスに参加したのは今回が初だったのに、すごく懐かしい感じがしました。そうか、会に参加こそしていなかったけれど、いつの間にか自分はこの文化の中にいたんだな、そう思ったのでした。

初めて来るのにふるさと、そんな不思議な体験でした。

関係ない画像

*1:おめでとうございます

*2:毎年思っています

*3:というのが今日日まともな括りとして有効かどうかわかりませんが

OBS Studioの配信画面レイアウトのベストプラクティス

OBS Studio は現代の配信者にとって必須なソフトウェアです。かつては XSplit などのお世話になったこともありましたが、とくに YouTube Live や Twitch で活動している現代のアマチュア配信者のほとんどは OBS Studio を用いていると思います。かくいう私もそのような配信者のうちの1人で、Rust で Z80 を動かしたりリードソロモンを教わってゼロから実装したりする配信をしています(隙あらば宣伝): #ch789 / KOBA789 - YouTube

そんな OBS Studio ですが、配信画面のレイアウトを整えるのは至難の業であることが知られています。GUI の操作が難しいからでもありますが、レイアウトを司る「変換」という機能の仕様が難解なのが主因だと思います。日本語訳がわかりづらいこともその難解さに拍車をかけています。たとえば「変換」は "Trasnform" の訳なんですが、これはさすがに伝わらんと思います。他のアプリケーションに倣うと「変形」とかでしょうか。

この記事では「変換」の詳細な仕様については説明しません。言葉で説明したところでそれぞれの機能がプリミティブすぎて結局どのように使えばいいのかわからないからです。かわりにこの記事では、具体的にどのような設定にすべきかを紹介します。

基本の設定

シーンにソースを追加したらまずは「変換の編集」を開いてください。いきなりマウスで大きさを変えると不幸が始まります。うっかり大きさを変えた場合は「変換をリセット」で戻してから以下の設定をしてください。

以下の設定をした後ならマウスで動かしても大丈夫です。わかってきたら基本以外の設定をいろいろ試すとよいですが、まずは下記の設定から始めるのが安全だと思います。

「変換の編集」の原則

位置

そのままでよい。
座標を直接打ち込んで調整したいときはここに入力する。

回転

0.00° にする。
回転が入るとややこしくなるのでこの記事では扱わない。

大きさ

絶対に変えない。
大きさを直接打ち込んで調整したいときは後述の「バウンディングボックスのサイズ」を変更する。

位置揃え

「左上」でよい。
回転したいときは他の値にするがややこしくなるのでこの記事では扱わない。

バウンディングボックスの種類(超大事)

「境界の内側に合わせる」に設定する。この設定が一番大事。
この設定だと縦横比を歪められないが、縦横比を歪めたいケースはほとんどないのでこの記事では扱わない。うっかり縦横比が歪んでダサくなるほうがよっぽど不幸である。

バウンディングボックス内の配置

「中央」でよい。
それ以外でも悪いことは起きない。それぞれの効果が気になる人は試してみよう。

バウンディングボックスのサイズ

そのままでよい。
大きさを直接打ち込んで調整したいときはここに入力する。

バウンディングボックスにクロップ

この記事通りの設定では ON でも OFF でも同じ。
ややこしくなるのでこの記事では詳細を扱わない。

クロップ

よくわからなければ全部 0 でいい。入力データの端に映したくない部分や余計な部分がある場合にここで削れる。詳細は割愛するけどお好みで。

細かいことが気になる人向け

いきなり画面上でマウスを使って大きさを変えてはいけない理由

バウンディングボックスの種類」が「境界なし」のままマウスでサイズを変えると、「バウンディングボックスのサイズ」ではなく「大きさ」が変わるからです。

「大きさ」を変えてはならない理由

これを理解するには、シーン上のソースの大きさを OBS がどのように計算しているかを知らねばなりません。

バウンディングボックスの種類」が「境界なし」のときのシーン上の大きさは次の式で計算しています(クロップなどを無視しています)。

width = scaleX * sourceWidth
height = scaleY * sourceHeight

ここで、sourceWidth, sourceHeight はそれぞれ入力データの横幅と縦幅です。たとえばキャプチャカードデバイスが 1920x1080 で映像を取り込んでいれば、これらはそれぞれ sourceWidth = 1920, sourceHeight = 1080 となります。左辺の width, height はそれぞれ実際にシーン上で表示される大きさの縦幅と横幅です。

シーン上で表示される大きさは scaleX, scaleY という係数が乗されて決まるので、シーン上に表示される大きさを直接的に決めることはできません。

では「変換の編集」の「大きさ」を変更するとなにが起きているのでしょうか。実は width, height が変更されるかわりに、scaleX, scaleY が変更されます。つまり、狙った width, height になるように scaleX, scaleY が逆算されて保存されるのです。

これは入力データの大きさが変化したときに意図しない挙動を生み出します。例えば、シーンに背景画像を置いてそれをあとで差し替えるといったケースを考えてみます。

まず、シーンに「画像」ソースを追加し、背景画像を置きます。この画像ファイルの解像度は 3840x2160(4K) だったとします。つまり sourceWidth = 3840, sourceHeight = 2160 です。

しかし画像が大きすぎてシーンからはみ出してしまうので、あなたはマウスで大きさを調整してシーンサイズ 1920x1080(Full HD) ぴったりになるようにします。このとき、「バウンディングボックスの種類」は「境界なし」のままなので、内部パラメータ scaleX, scaleY が変更され、それぞれ 0.5 になります。

次にあなたはやはり別の背景画像に差し替えようと思い立ち、ソースのプロパティを変更して別の画像ファイルを読み込みます。この画像ファイルの解像度は 1920x1080(Full HD) だったとします。つまり sourceWidth = 1920, sourceHeight = 1080 に変わったわけです。

するとどうでしょう。シーン全体を覆うように配置されていた「画像」ソースは半分のサイズに縮んでしまい、960x540 の大きさになってしまいます。sourceWidth, sourceHeight が変わってしまったために、シーン上の大きさである width, height の値もそれに引きずられて変わってしまったのです。入力データの大きさが変わっても内部パラメータ scaleX, scaleY は調整されないので、入力データを変えるとシーン上の大きさが変わってしまうことがあるのです。

同様の現象はキャプチャカード等でゲームの画面を取り込んでいるときにも発生することがあります。ゲームが出力する画面解像度が変化すると、それに影響されてシーンのレイアウトが崩れてしまうのです。

COVID-19になった

2019年って何年前だよ。

今更ながら COVID-19 になりました。なってましたというか。

1/15くらいからやんわりと体調が変で1/18の夜に喉が痛くなり、1/19の夜に発熱。そのままするすると40℃まで上がり、布団から出れば寒くて震えが止まらない状態で、トイレに行くのも覚悟がいるといった具合。

かぜ薬は飲んだものの、朝になってもロクに熱は下がらず、1/20の夜も同様に40℃。食欲はあったし嗅覚異常とかもなかったのでご飯だけはめちゃくちゃ食べました。

1/21は40℃まで行かないにせよ38℃は切らないみたいな熱が継続。しかしながらこの辺りからじわじわと喉が痛くなってきました。

1/22になると喉が爆裂痛くなり、一方で熱は38℃弱くらいまで下がりました。喉の痛みと同時に咳が出るようになって体力と精神力が削られ始めました。抗原検査をしたのがこの日。

咳でロクに眠れないまま1/23になり、熱は微熱まで下がったものの寝不足と疲れでヘロヘロに。熱下がってやめてた風邪薬を改めて飲んだらこれがなかなか喉に効き、一筋の光に。

というわけでまだまだ調子悪くて回復しきってませんが、忘れる前にメモ。

相槌すらも喋れないレベルで喉痛いのはほんとにしんどいのでなんとかなってほしい。

総括2023

年末。 KOBA789 です。

本年もさまざまなことがありました。思い出したり反省したり、やんわりと近況報告したりするために書き残しておこうと思います。

年初

2023年はロケットの打ち上げから始まりました。私が管制システムの一部を担当した衛星が1月3日の夜中に打ち上がり、初の人工衛星運用を体験し、我々の至らなさあるいはコンピュータの活躍の余地について解像度を高める経験となりました。 仕事なので詳細は書けない。

また、友人に煽られて新車の購入を決意。煽られた翌週にディーラーに行き、即日サインしました。 買ったのはスズキ・スイフトスポーツ。よくも悪くも私に似合ってるのではないでしょうか。車のチョイスは残酷なほど当人の趣味が出ます。 このタイミングで車を買ったのは、欲しかったからだけではありません。仕事ばかりで遊んでおらず貯金が貯まっていたので、このままだとまたすぐ会社を辞めそうだなと思ったからです。車を現金で買えば一気に貯金は減るし、走りたくなって無駄遣いするはずなので好都合です。労働意欲を維持するために欲しい車を買うのは有効です。

古い方の車は必ず北海道に連れて行くと決めていたんですが、新車を衝動買いしたので時間的猶予がなく季節は真冬。詰んだかと思いきや、水戸のタイヤ屋さんがスタッドレスのレンタルをやっていたのでそこで借りて走って行きました。

仕事では採用活動に奔走していた……ような気がします。 思い返すと、今チームで共に仕事している同僚にはこの時期に入ってもらった人が多く、一年前の心細さをもはや思い出せないほどに毎日助けられています。

趣味の方だと、YouTube を放置して旅行三昧でした。5月の連休には新しい車で九州の南端、佐多岬まで自走で行きました。はじめ、MT 車を買うことに多少の不安があったのですが、3泊4日で3300kmも走ると左半身が意識の外でシフトチェンジをしてくれるようになり、実質 AT です。

また鹿児島旅行の翌々日には富士24耐にも行きました。テント張って観戦してたのですが、寝ても覚めてもエンジンの爆音が響いているというのはそれだけでおもしろいです。目で追いやすい速度で走る道路公団リバリーのフィットが最後まで楽しませてくれました。 現地とはいえ広いサーキット全体のことは見渡せないので、観戦は YouTube Live を観ながらです。セルラー回線でやると安定しないしギガが爆発してしまうしでいいことないので、Starlink を持ち込みました。いやー、快適。テクノロジーってすごい。

この季節も例に漏れず、いろいろありました。 私が作っていたものの一部が OSS になり、社外の人と仕事の話をしやすくなった……というのが一番嬉しかった出来事かもしれません。

夏はやっぱり北海道でしょ、ということで(一般人が簡単に到達できる)日本最北端に行きました。札幌の北の石狩あたりから稚内に向けての海岸線沿いには、オロロンラインという景色の綺麗な最高の道路があります。しかしオロロンライン周辺には宿町が少なく、ホテルというと留萌あたりにしか期待できません。 というわけで、人生初のキャンプをしました。先述の富士24耐で一応練習していたとはいえ、知らん土地でひとりでテント張って寝るというのはなかなか緊張します。ランタン忘れて真っ暗だし。 オロロンライン沿いに点在するそれぞれの町には、道の駅とキャンプ場と温泉がセットで存在しがちです。しかもキャンプ場は無料だったりします。車でのアクセスもよくて便利です。 1泊目のサイトが快適すぎて、2泊目にナメてかかったら、1泊目の撤収時にコオロギをテントに巻き込んでいたようで、いきなりペルソナノングラータとの戦いになりました。

手軽に行ける南端と北端に到達したので、ここらで旅行欲はおさまり、今年の秋の行楽シーズンはちょっとした日帰り旅行程度になりました。

仕事はボチボチというか、相変わらず忙しい日々が続きますねという感じでした。年始の打ち上げで燃え尽き気味だったけど、この頃チャレンジングな仕事がまた始まって、少しモチベーションが回復したかな。

プライベートの方では7,8年くらいお付き合いしていた相手と別れるなどのイベントがあり、仕事が一切できないくらいに精神はグラグラでした。相手に迷惑がかかるので詳細は書きませんが、大きな衝突があったとかではないので、双方を知っている各位に関してはあまり気にせず接してもらえると幸いです。 落ち込んでいる時期に支えてくれた古い友人各位には本当に感謝しています。持つべきものはよき友人です。

ここまで来ると最近の出来事です。 ISUCON は散々な結果でしたね。チームの力を引き出せなかったなぁという反省があります。1人だけ気張っていても勝てないというのが、チームで挑む ISUCON の難しいところです。それでも、チームメイトはいた方が楽しいのでチームで出場しています。ひとりだったら勝てるというわけでもありませんが。

年末には特番と称する長時間配信もやりました。年末特番という言葉の響きになんとも言えぬ憧れがあったり、RiJ のように風物詩化してる企画が好きだったり、年末年始って暇な時間多いよねという下心だったりで、年末の長時間配信は毎年やりたいと思っています。昨年末のように仕事の繁忙期が重なってしまうと難しいんですけどね。

企画の趣旨としては、Z80 という有名な CPU を(私が)知りたい、みんなにも知って欲しい、素朴な CPU を通じて低レイヤーに興味を持って欲しい、非定型な試行錯誤の記録を動画として残しておきたい(これはいつも)、みたいな感じでした。 長時間かつゴールデンタイムを外した配信にも関わらず、想像の倍くらいの方に興味を持ってもらえて大成功でした。 ちなみに「知って欲しい」「興味を持って欲しい」というのはつまり、同志を増やしたいということです。話の通じる友人は多いほど楽しいので、いつもそういうモチベーションで企画を考えています。私の企画が誰かにインスピレーションを与え、何かに挑戦するきっかけになれば嬉しいです。

来年に向けて

2024年の目標はすでに決めており、すでに実現可能性の検証も進めているところです。しかし、ここに書くのは恥ずかしいので、秘密にしておきます。

2024年の KOBA789 にもご期待ください。

非公式ISUCON練習プラットフォームISUNARABEを公開した

あなたの予想に反して、この記事の大半はタイトルとおおよそ関係のない感想文である。感情の発露に任せて書いているのであって、読ませるために書いているわけではないため、読みづらくても耐えて欲しい。

表題のとおり、非公式 ISUCON 練習プラットフォーム「ISUNARABE」をリリースした。
これは、ISUCON の素振り*1をより簡単にすることを目指して開発されたシステムで、近年の ISUCON 予選のポータルと似たような機能を持っている。
具体的には、過去問環境の CloudFormation テンプレートの自動生成・チーム編成・ベンチマーク実行・ベンチマーク結果確認などである。自動生成された CloudFormation テンプレートでスタックを作成すると、GitHub から取得したチームメイトの公開鍵が焼かれた状態のインスタンスが上がってくる、というあたりが重要なポイントだと個人的には思っている。公開鍵をチームメイトから収集して数台のサーバーに撒くというのは結構ダルい作業である。

こだわりポイントという意味だと、ベンチマークの実行と結果確認の UX にはちょっとしたこだわりがある。
私はかなりせっかちな性格である。となりに階段があるなら、エレベーターを待つよりも階段を上ることを選ぶ。結果的にエレベーターの方が早かったとしても、何も手を下せずボタンを押して待つことしかできないという時間が嫌いなのだ。鉄の箱が扉の前に到着するまでの間、人間が自由を奪われているのだ。許せるわけがない。
したがって、ベンチマーカーの実行は即時に開始され、ベンチマーカーのログや結果は「直ちに、遅滞なく」UI に反映されなければならない。
Pull 型でポーリングをするアーキテクチャは負荷分散という点において優れているのは知っている。それが理由かはわからないが、AWS のサービスは極端にストリーミング API を避けている。なんでもかんでもポーリングである。まぁこれは課金単位のわかりやすさのためもあるかもしれない。すべて邪推である。 さて、本物の ISUCON ではベンチマーカーは共有資源である。他チームの利用で埋まっている場合には即座に実行開始できない。これは仕方がない。また参加するチームの数は数百のオーダーであり、競技の参加者は千を超える。さらには、100万円という賞金(よりもプライド)が懸かった真剣勝負であるため、競技時間中のシステムダウンは可能な限り避けたい。つまるところ、ベンチマーク実行リクエストはキューイングされるし、ベンチマーカーのログを厳密にストリーミングするのは難しい。
しかしながら、ISUNARABE は練習プラットフォームであり、安定性よりも快適性が優先される。なぜなら、快適でなければ人はどんどん素振りをしなくなるからである。したがって、ベンチマークの実行リクエストは即座に受理され、ログは完全にストリーミングされる。ベンチマーカーは CloudFormation テンプレートに含まれており、チームに1台ずつ用意される。共有リソースではないのでキューイングは不要である。

この体験を実現するアーキテクチャは、意外にも自明ではない。最もナイーブには、各ユーザーのベンチマーカーが HTTP API を露出させ、ポータルのフロントエンドがその API を呼び出す方法である。ストリーミングが必要なため、これは WebSocket になるかもしれない。
残念ながらこのアイデアはいくらかの問題がある。どうやってベンチマーカーの Public IP を発見するのか、HTTPS で通信するなら証明書はどのように発行するのか、そもそもベンチマーカーのポートを開放して安全なのか、認証はどうするのか、等である。
そこで私は Reverse HTTP Transport のようなプロキシがあったらよいのではないかと考えた。私が管理するサーバーにプロキシを立てて、プロキシとベンチマーカーの間にトンネルを掘り、ユーザーはそのプロキシ経由でベンチマーカーにリクエストを送るという方針である。
この場合、プロキシで認証と認可を行うチャンスがあり、またベンチマーカー側からプロキシ側に向けてセッションを開始するようにすればポート開放も要らず、サービス検出も達成できる。
Reverse HTTP Transport を真面目に実装してもよかったのだが、証明書の管理が面倒ということと、私のサーバーは Cloudflare の裏側にあり TLS が貫通しない(クライアント証明書による認証ができない)ということから、アイデアだけを拝借して独自のプロトコルを作ることにした。

独自に開発したトンネリングプロトコルの基本的なアイデアは以下の通りである。

  • HTTP/1.1 (HTTPS)の Connection: Upgrade を用いて、ベンチマーカーからプロキシに向かってコネクションを張る
  • HTTP/1.1 なので、Authorization ヘッダに含めたトークンを用いて認証・認可をする
  • 開いたコネクションの上には HTTP/2 のリクエストを流す
    • リクエストの向きは プロキシ→ベンチマーカー

ポイントは、生の TCP ではなく HTTP/1.1 を用いることで、認証情報を乗せるチャンスを得ることと、その上のプロトコルを HTTP/2 とすることで、1本のコネクション上に複数のリクエストを多重化することである。
ここまでくればあとは gRPC のリクエストをこのトンネルの中に通すだけである。gRPC の Server Streaming を使えばログをストリームするくらいはなんの工夫もなく達成できる。

かくして私が納得できる品質の ISUNARABE はリリースにこぎ着けたわけである。趣味で作ったウェブサービスを一般公開するという行為は大変久しぶりであり、ヘタすると10年ぶりとかそういうレベルである。

サービスをひとりで作り、またそれを公開するというのは私にとって特別な意味がある。これは、ワールドワイドウェブが、なんらかの力に独占されているわけではないという事実を噛みしめ、技術者ひとりの持つ力の潜在的な大きさを再確認するための行いである。メモ帳で <CENTER> を書き、DynDNS で半固定 IP に無料のドメイン名を割り当てていた頃と、ウェブは本質的にはなんにも変わっちゃいないんだと感じることで、ある種の全能感を得られる。

ウェブサービスを作ろうとすると、あらゆる難しいことが襲いかかってくる。AWS やら Docker やらといった技術的なこともそうであるが、法律的な部分や、炎上したらどうするのか、攻撃されたらどうするのかといった本当に考えたくないことが多すぎる。法律やセキュリティの知識が不要であるとは言わないが、無知が責められる光景を日常的に目の当たりにしすぎているが故に、過度に萎縮しているのではないかと感じることがある。

個人開発者にはビッグテックのような優秀な法務部もなければ、インシデントレスポンスチームもない。SNS で盛り上がってしまっているユーザーとうまくコミュニケーションをとってくれるカスタマーサポートもいない。でもそれらがなければウェブサービスを公開してはならないのかといえば、そうではないと思う。

私はウェブがこれほど堅苦しくなる以前にだいぶ自由にやらせてもらった側であり、それによって今のキャリアがある。言ってしまえばイタズラを繰り返していたらいつのまにか職をもらえていたという状況である。自身がイタズラ坊主出身であるからこそ、スーツの奴らが嫌いである。結局ギークとスーツという古典的な二項対立かよと思われるかもしれないが、そうではない。ギーク出身であっても、若いギークが生まれる土壌を維持しないやつは全員ダサいスーツであるということだ。大人の事情とかはどうでもいいのである。イタズラ坊主のイタズラを邪魔するスーツだけは絶対に許せないのだ。

この文章にオチはないので、必然的に綺麗にはまとまらないのだが、ひとりでサービスを開発して公開するという行いは、ウェブが未だにイタズラ可能な土地であるかを確かめることであり、ウェブがイタズラ可能でなくなりそうなときは立ち上がらねばならない。さもなくばスーツである。

*1:ISUCON の練習のことをこう呼ぶ