2025年を振り返る

書きます書きますと言ってしばらく経ってしまい、もう1月15日(!?)となってしまったが、1年間を振り返って書いてみる。今回も主にパソコン関連について時系列順にまとめていく。2024年の躍進も中々だったが、2025年は自分にとってそれを上回る大躍進の年になった。2024年の振り返りはこちら。

n4mlz.hatenablog.com

なお、現在既に2026年ではあるがこの記事中では特に注釈がない限り便宜上、"今年" は 2025 年を指すものとする。

1月

WORD 編集部 編集長に就任

1年生の頃から所属している、筑波大学のパソコンオタク達が集う「WORD 編集部」の 2025 年編集長になった。一応3人の立候補の中から投票で選ばれた。当初は「保守的で無難な政治をします」といった公約を掲げて選出されたが、今年を振り返ると私の行動はむしろ革新派であった。それについては後述。これまで人を取りまとめる経験がなかったので、少々不安であったのを覚えている。

自作コンテナランタイム「tiny-youki」の開発

筑波大学には 1 年間いい感じの個人開発をしているだけで単位が振ってくるおもしろ授業(?) があるのだが、その授業の成果発表会が1月にあった。ここで発表したものが、この tiny-youki である。去年の終わりに Go で tiny-runc というコンテナランタイムを書いていたのだが、様々な実装上の苦しさにより Rust で書き直した。この tiny-youki は、名前の通り youki を元に同じようなディレクトリ構成や構造体を使って、より小さい実装で書いてみたものである。そして実際の youki と同じく OCI Bundle の config.json のパーサーには oci-spec-rs を利用し、root 不要で非特権に動作する。Docker から pull してきた busybox のコンテナもいい感じに起動できた。ちなみに起動はむっちゃ早い (Go 実装と比較して)。

リポジトリはこちら。結構綺麗に書いている自信があるので、Rust でコンテナ自作したい方は参考にぜひ。

github.com

https://x.com/n4mlz/status/1879570678086869508?s=20

2月

恋人ができる

冒頭に「主にパソコンの話」と書いたのに含むのも何だが、恋人ができた。私は共学の中高一貫校に通っていたのだが、その同窓会が1月にあり、何やかんやあって中学の頃に付き合っていた彼女と再会し、復縁した。大学に入学してからは割とパソコン一筋でやっていたが、それからは身だしなみに気を使うようになり、料理も習得した。パソコンの時間は減ったが、人生の幸福度は確実に上がったと思っている。なお突然の環境の変化についていけず、2月〜4月はかパソコンがかなり疎かになった。

株式会社はてなでアルバイト

去年株式会社はてなインターン に参加していた伝手により新規事業開発チームに2月からジョインさせていただき、7月いっぱいまで働いた。ここでは、toitta という法人向けのインタビュー分析サービスの開発に携わった。とても働きやすい環境だった。ここに入る前と後で、書くコードの質やコミュニケーションの質も格段に変わったと思う。

ja.toitta.com

WORD 引っ越し準備号

編集長となって初めて号を出した。引っ越し準備号は、筑波大学情報科学類への入学をひかえた新入生に向けて、入学説明の書類に併せて同封される特別な号である。

WORD の記事は GitHub で管理している。色々あって普段記事を書かない人たちも沢山記事を書いてくれたのだが、そのためか手元でプレビューせずに投げられてビルドの通らない壊れた PR が乱立するといった事態が発生した。収拾をつけるのがかなり大変だったのを覚えている。

引っ越し準備号はこちら。私は「非パソに向ける WORD 編集部のすすめ」という記事を書いた。

www.word-ac.net

3月

ICTSC 本戦

破壊王ブレイキング」というふざけたチーム名で予選2回をくぐり抜け、なぜか本戦までたどり着いた。オンサイトのコンテストが初めてだったので緊張した。当日は当チームの遅刻により開始時間を破壊したり、当チームが会場ネットワークの帯域の3分の1を使用してしまったりなど、活動は多岐に渡る。当日は #BREAKINGWIN #破壊王ブレイキングWIN など破壊王ブレイキングを応援する(?)謎のタグが生まれていて良かった。なお、順位はそんなに良くはなかった。

ICTSC 本戦

https://x.com/n4mlz/status/1900721081906020605?s=20

https://x.com/n4mlz/status/1900721081906020605?s=20

https://x.com/bb_mase/status/1901152049053462894?s=20

https://x.com/bb_mase/status/1901152049053462894?s=20

4月

WORD 新歓と入学祝い号

紆余曲折あって WORD の新歓フローを更新した。以前までは直接部屋に訪問するか wordian (WORD 編集部員) に直接話しかけて入部させてくれと頼む必要のあったところを、「GitHub の新歓リポジトリに PR を出す」という形式に変更した。こうすると非同期に任意のタイミングで入部を申し込むことができ、また入部希望者が GitHub アカウントを持っていて最低限 fork と PR は行えるということが担保できて大変嬉しい。

また例年通り、入学祝い号も発行した。ページはこちら。私は「Go でシステムプログラミングするな!」という話を書いた。

www.word-ac.net

主専攻実験 カーネルハック

筑波大学情報科学類で開講されている主専攻実験のうちの一つ。様々な場所で言及されているが、授業ページでは履修予定者に対し赤文字で脅しを行うような文言が載せられていることでお馴染みである。

www.coins.tsukuba.ac.jp

授業では Linux カーネルに syscall を追加したり、カーネルモジュールやデバドラ、ファイルシステムを追加するなどの課題を行った。授業と言っても教室に先生は基本おらず実態はほとんど課題を行うための作業時間だったので、詰まった時は教室を抜け出して WORD の先輩と散歩などをしていた。

5月

型のみで実装する正規表現エンジン (UNTIL. LT #0x07)

筑波大学 UNTIL. のやっている LT の第7回 (UNTIL. LT #0x07) が行われた。前日にネタを探していた時にたまたま見つけた TypeScript の型のみで Brainfuck のインタプリタを作成する記事 に感動し、私も型のみで正規表現エンジンを作ってみた。書きながら「これ DFA 型でも VM 型でもないなぁ」と思っていたのだが、どうやら私が実装していたのは微分型というやつだったらしい (コードはこちら)。

スライドは以下。

speakerdeck.com

SecHack365 2025 合格

SecHack365 は、総務省所管の NICT (情報通信研究機構) が主催する、25歳以下を対象とした長期個人ハッカソンである。

sechack365.nict.go.jp

開発テーマは何でも良い。私は以前からコンテナランタイムについて関心があったので、「コンテナランタイムを OS レイヤから自作する」というテーマで学習駆動コースの坂井ゼミに応募した。坂井ゼミの持つ何でも面白いと思った興味と好奇心に身をまかせて手を動かすといったような思想に、かなり共感できたからである。応募課題は16000字ほど書いた (この記事の文字数と同じくらい。しかしそれほど苦ではなかった)。そして愛が実ったのか(?)、5月末に合格の連絡が来た。

https://x.com/n4mlz/status/1925854465141195077?s=20

httpあs://x.com/n4mlz/status/1O925854465141195077?s=20

私自身かなり飽き性で、個人開発も1つにつき1ヶ月も持たないことが殆どであったため、1年間も同じものを開発し続ける事はこういう機会がないと自分には出来なかったと思う。OS 自作自体も初めてであったが、こうして逃げ道を強制排除できたことにより、頑張るぞという気持ちになった。

6月

インターン受けまくり・コーディングテストと面接しまくり

去年は株式会社はてなによる はてなサマーインターンシップ2024 に参加し良い経験をしたので、今年は更に本腰を入れてインターンに行こうと考えた。去年は1社 (はてな) しか受けなかったが、今年は5社受けた。その結果、5月と6月はカレンダーがコーディングテストと面接だらけになってしまった。同時期に SecHack とセキュリティキャンプの応募も重なっていたため、忙しくなりすぎてメンタルもズタボロだった。結果、インターンは複数社合格し、そのうちまだ経験したことのない大きい企業に行こうという気持ちから LINEヤフー株式会社を選択させていただいた。ちなみに LINEヤフーのコーディング試験では任意の言語が選択できた為 Rust で書いた。インターン内容に関しては8月のセクションで後述。

Rust で自作 OS に入門する

SecHack では「コンテナが動く OS を作ります」と言ったので、コンテナが動く自作 OS をする前にまずは普通の自作 OS から始めようということで OS in 1,000 Lines を Rust で走り始めた。参考にしたチュートリアルと同じく、QEMU 上の RISC-V で 動作し、OpenSBI を利用している。一応実装はしたい部分だけやって、気持ちのない部分は後回しにした。no_std Rust と自作 OS の感触を理解した。

github.com

CNCF Japan Community Day

以前からコンテナやクラウド技術に関する興味があったが、始めてそのカンファレンスに行った。普段パソコンの中でしか見ない言葉が間近で話されていてワクワクした。しかし話はほぼ全て英語で、モニターの自動翻訳を眺めるばかりになってしまい、英語の勉強の必要性を痛感した。

https://x.com/n4mlz/s tatus/1934238761589883338?s=20

セキュリティキャンプ全国大会 2025 合格

セキュリティキャンプとは、経済産業省所管の IPA (情報処理推進機構) が主催する、22歳以下を対象とした情報セキュリティに関する合宿形式の学習プログラムである。

www.ipa.go.jp私は去年から OS 自作ゼミやハイパーバイザー自作ゼミに目を付けていたのだが、今年は残念なことに両方とも開講していなかった (かなり異例の事態っぽい)。そのため、Code Sanitizer・Fuzzer 自作ゼミ (以降 Sanitizer 自作ゼミ) と Rust 検証器自作ゼミにこの希望順で応募した。結果、Sanitizer 自作ゼミに合格し、全国大会に参加することとなった。

応募課題は「締切3日前から『1日1つ全力で応募課題やる』を3日間やったら3つ応募課題出せるんでは?」みたいな謎戦略(?)で3日間大学に引きこもって缶詰みたいにやっていたが、意外と何とかなった。副産物として、頭をフル回転させると2時間でお腹が空き、1日5食食べることになるということを知った。一歩も動かずカロリーを消費したい人間はひたすら脳に労働を強いるといいと思う。

セキュリティキャンプには合格発表後に自身が提出した応募課題を晒す文化があるため、私も公開した。気になる方がいればぜひ。

zenn.dev

これにより、今年の私は SecHack とセキュリティキャンプの二刀流となった。両方ともトレーニー・受講生として参加するのは、2025年においては私だけである。

WORD 57号・組版システムを Typst に移行

それまでの WORD は TeX組版されていたのだが、今号から Typst に移行した。テンプレートの作成を引き受けてくれた Ryoga_exe に感謝。

github.com

WORD 57号はこちら (この号では私は記事を書けていない)。

www.word-ac.net

ICPC 2025 国内予選

大学対抗プログラミングコンテスト。競プロは久しくやっていなかったのだが、誘われて参加した。AtCoder と違って知識は必要とせず、考察ゲーという感じだった。予選敗退してしまったが、久しぶりに頭を使ったので楽しかった。

7月

Dotfiles を移行

元々持っていた Dotfiles の運用方法に難があったため、リポジトリごと刷新した。元々手書きの秘伝のタレみたいな Shell Script で適用していて、マシンごとにブランチを分ける運用方針であった。新しいリポジトリでは、chezmoi (シェモアと読むらしい。フランス語で "私の家" という意味) という Dotfiles 管理ツールを使用する。これにより、単一のブランチでも Go Templete 形式で環境差分を吸収できるようになった。また 1Password Vault と連携しており、パブリックリポジトリでありつつ秘密鍵の管理も行っている。chezmoi apply 時にフックして Shell Script を実行する機能を利用し、apply 時に使用するパッケージマネージャを検出して最低限必要な CLI ツールを一式インストールするスクリプトも追加した。GitHub Actions ではコミット毎に ArchLinux, Debian, Ubuntu へのインストールの自動テストを行い、また Dotfiles の CLI 環境を一式含んだ Docker イメージをビルドして push している。ちなみに curl さえ使用できれば導入はワンライナー (curl -fsSL https://dotfiles.n4mlz.dev/install.sh | sh) で完結する。

やはりこういうチマチマした盆栽ってやつは楽しい。新しい Dotfiles のリポジトリはこちら。

github.com

Brainfuck コンパイラ

とある後述する文脈で、Brainfuck コンパイラを書くことになった。チュートリアル以外では初のコンパイラ自作だったが、言語仕様が単純である為、さほど難しくなかった。なんと実装は lexer で24行、parser で24行である。とても綺麗に書けたと思うのでぜひ見てほしい。インタプリタコンパイラを両方実装しており、コンパイラLLVM-IR を出力する。

github.com

編み物

編んだブックカバー

彼女が執筆活動をしていたので、なんでも書きこめるアイデアノートを贈ろうと誕生日プレゼントにブックカバーを編んだ。これはいわゆるかぎ針編みというやつ。初編み物だったが、元々手先を動かすのが好きなのでこれはハマるなと思った。ブックカバーはこの大きさでも編むのに20時間以上かかった。

8月

SecHack 第2回イベント

SecHack に参加して初のオフラインイベント。会場は都内だった (過去には北海道や沖縄だった事もあるらしいので羨ましく思っている)。自作 OS はコンテナどころか、まだプロセスを実装して協調的マルチタスクによるコンテキストスイッチを行える程度までしか実装出来ていなかった。それでも成果をそれっぽく見せるため、ANSI エスケープで画面を4分割して各々の枠で何かしら描画するプロセスを動作させることで、マルチタスクが行えることをアピールしてみた。

ANSI エスケープによりマルチタスクを表現している様子

同じ println! するにも見栄えが良いので、ANSI エスケープは伝え方としてはまぁ賢かったと思う。また机の上に「最近実装したもの」として様々なリポジトリのコードを印刷して冊子にして置きまくり、なんか凄そうだぞと思わせることにした (その場しのぎである)。

Brainfork (自作言語)

セキュリティキャンプでは、sanitizer を作ることになった。ところで大抵の sanitizer は配列外参照に対し ASan、未定義動作に対し UBSan 等、C 言語特有の問題を排除するために存在している。私は先人の尻拭い (本当にすみません) にはあまり興味が湧かなかったため、現代のモダンな言語でも悩まされる事の多い data race やデッドロックを検出する TSan (Thread Sanitizer) を実装することにした。sanitizer の実装ではコンパイラ自体に改変を加えることになるのだが、既存のコンパイラを扱うよりはむしろ "意図的にデッドロックを引き起こしやすい言語" 自体を自作しようと思い、Brainfork を考案した。

Brainfork は簡単に言えば、並列処理をサポートする Brainfuck-like な難解言語である。Brainfuck の持つ単純で少ない命令を元に、ロックや条件変数を扱う文法を新たに追加した。文法に関してはこちら (Brainfork コンパイラを実際に実装する前に PoC として AI に Pythonインタプリタを書かせたもの)。

Brainfork コンパイラは Rust で実装した。中間表現には LLVM-IR を利用している。mutex や条件変数には POSIX の pthread を使用した。以下のリポジトリでは、コンパイラインタプリタを両方実装している。

github.com

なんとかセキュリティキャンプ当日までに自作言語を終えたが、本来の目的は sanitizer である。こちらはキャンプの文脈で後述する。

セキュリティキャンプ全国大会

キャンプでは宣言していた通り Brainfork に対する TSan を実装し、data race を動的検出できるようにした。この TSan では、lockset の共通部分が空集合、かつ happens-before 関係による実行順の保証がないような非 mutex 同士の読み書きのペアを検出し、それをデータレースとして報告する。また、Vector Clock を使用した happens-before 関係に基づく検出手法も取り入れた。TSan は以下のようにリンクされ、Brainfork の実行バイナリに組み込まれる形になる (このホワイトボードはキャンプ中に書いたもの)。

Brainfork TSan がコンパイルされるフロー

詳しい解説はキャンプ中のやる気のある時に PR のdescription に書いていたので、気になる方がいれば読んでいただきたい。

github.com

最終日の発表では Brainfork がちょっとウケて、リポジトリに 25 スターを頂けた。当時一つのリポジトリにこれだけスターが貰えたことがなかったので、嬉しかった。

生活面では、セキュリティ芸人・アスースン・オンラインさんのネタが生で見られたり、夜の自由時間に受講生で机と椅子のあるスペースに集まって Kubernetes の話をしたり、実装が終わらず寝ずに夜な夜な部屋で作業したりなど、セキュリティキャンプらしい文化を存分と味わえた。また朝のラジオ体操の皆勤賞を狙っていたが、最後の1日だけアラームが何故か鳴らず逃してしまったのがちょっと悔しい。

WORD 編集部としてコミケにサークル参加

セキュリティキャンプが終わって次の日、コミックマーケット (C106) にサークル参加した。WORD 編集部がコミケに参加するのは、実に10年ぶりである。ブースは東U-14ab。申し込み時に何も知らずに2スペース分のデカい机を申し込んだところ、何故か通ってしまった。普通はあまりないらしい。

WORD のブースでは、「Best Selection 号」を新刊として頒布した。これは 過去3年間の WORD の記事の中で最も面白かった記事を、WORD 編集部内の投票により選んで揃えたものである。

当日は 間瀬bb がやかましトークを行い、凄まじい勢いで 100 冊以上売り捌いた。またそのようなツイートがバズり、そのやかましトークが全世界に大公開された。

(余談) 申し込みから投票、当日準備と頒布までまぁまぁ骨の折れる作業だったので、この後冬コミや技術書典には応募しなかった。

LINEヤフー インターンシップ 2025

LINEヤフー株式会社にて、フルタイム1ヶ月間のサマーインターンに参加した。私が参加したのは Athenz の開発チームである。Athenz とは Yahoo! Inc. 時代から開発されている、RBAC を用いた認証認可基盤システムである。Athenz はオープンソースであり、CNCF Sandbox Project としても登録されている。インターンページは以下。

www.lycorp.co.jp

基本はオンラインだが、何回か千代田区紀尾井町本社に出社する機会を頂けた。社食がバリエーション豊富で美味しかった。作業の空き時間は興味本位で社内ドキュメントを漁るなどしていた。やはり謎のオンプレプライベートクラウドの巣窟で面白い。またインターンレポートも書いたので、詳しくは以下を参照されたい。

techblog.lycorp.co.jp

連日様々なイベントに出席していたからか、途中 COVID-19 を発症して1日だけ休んでしまった。いい加減継続的なガンバリを行う術を身につけたい。

cTENcf

cTENcf は、CNCF の 10 周年記念イベントである。会場は渋谷の Abema Towers だった。インターンでも取り組んでいる Athenz についてちょうど登壇発表が行われるようで、勤務終了後に同じチームの社員の方と会場に向かうことができた。発表では、インターンでいつも見ているプロダクトが目の前で発表されていて不思議な感覚になった。

懇親会では、 youki の開発者の utam0k さんやメンテナーの saku3 さんとお話することができた。今年の始めに開発した tiny-youki が認知されていて嬉しかった。またちょうどその日に youki として発表されていた、OCI specification に追加された新仕様への追従を担当してみないかという機会を頂いた。OSS contribution 自体経験がなかったが、こんな素晴らしい機会はそうそうないと思い、喜んで承諾した。

youki に PR、人生初 OSS Contribution

改めて: youki は CNCF の Sandbox Project で、Docker や containerd などで利用されている runc と同じく OCI specification に準拠している。

OCI specification では先日、Linux memory policy をサポートする仕様が追加されていた (PR) 。Linux memory policy は簡単に言えばプロセスのメモリ配置ポリシーを設定する機能で、特定の NUMA ノードからメモリを割り当てるようにしたり、ノード間でメモリをインターリーブさせるようにできる。そして、OCI に準拠したランタイムではこの仕様に追従することが求められた。私が提出した PR が以下である。

github.comやっていることは memory policy 用に追加されたフィールドを見てコンテナプロセスの実行前に set_mempolicy(2) システムコールを発行するだけなのだがテストが大変で、 1000 行規模の変更になってしまった。また、コンテナの作成には config.json といった名前のファイルが参照されるのだが、ここに memory policy の設定値を書くフィールドが新たに追加されたので、そのパーサー実装である oci-spec-rs にも実装を追加する必要があった。

github.comこちらの方はすぐにマージされた。おめでたい、私の人生初 OSS contribution である。ちなみにメインの youki への PR の方は approve までがかなり長い道のりで、マージまで数ヶ月かかってしまった。これについては後述。また、マージまでに OCI specification 自体に何度か変更が加えられたため、追従するために更にいくつか追加で PR を行う必要があった (Linux memory policy の設定値の扱いに関する変更 (こちら)、runc 1.3.2 で更新された cgroup v2 の設定値の解釈方法に関する変更 (こちら))。インターンと並行して作業を進めるのが大変で、休み時間や勤務していない時間をこれらに費やしていた。

ICTSC2025 1次予選

ICTSC2025 も破壊するぞ!ということで「破壊王ブレイキング2」というふざけたチーム名で ICTSC に再び参加。しかしメンバーが5人いるにも関わらず何故かみんな予定を把握せずに予定を入れたり飯を食いに行ったりクネクネしたりしていて (???) 当日は開始時間の時点で私一人しかいなかった。

https://x.com/n4mlz/status/1961655504205414903?s=20

最終的に私と途中から来た whatacotton の2人で問題のほぼ大半を解いた。最終的になんか1次予選通過してて助かった。2次予選は同じことに絶対になるなよ!!とここで皆が誓った (これが後のフラグになることを知らず...)。

https://x.com/n4mlz/status/1962104011336868083?s=20

9月

自作OS「Cyrius」の開発

当初はコンテナっぽい何かを作る目的で RISC-V で 自作OS をしていたが、本当の Linux コンテナを動かしたい気持ちになったため、コードの保守性も悪くなっていたしせっかくならとリポジトリ自体を捨てて新しく作り直すことにした。メイン PC として利用している Linuxx86-64 であり、また OCI イメージは x86-64 のものが多いので、新たな OS も x86-64 で書くことにした。いずれは手元で作成したコンテナを自作 OS 上で動かすことを目標にしている。また HAL として arch/ ディレクトリを用意してアーキテクチャ依存の処理を集約し、将来的には他のアーキテクチャにも対応できるようにした。それが、以下のリポジトリである。

github.com

ただしインターンOSS Contirbution により時間を取りにくかったこともあり、最初はあまり開発が順調ではなかった。

大阪・関西万博

大屋根リングからの会場の眺め。散歩大好きなのでリングを歩くだけで楽しかった

恋人と5泊6日で京都・大阪を旅行し、そのうちの3日間は万博に行った。世界中のおもしろ料理が日本の衛生水準で食べられるのと、将来絶対行けないであろう渡航困難な国の文化を間近で感じられることができたのが最高だった。コモンズ館もどれも面白かった。人の多い時期だったが、上手くやりくりして十分楽しめたと思う。

WORD 研究室紹介号

学類の研究室 (40程ある) の全てとメールのやり取りをして、研究室の紹介を募って1冊にまとめた。毎年行われていることだが、印刷製本作業以外の全ては編集長が行うのでかなり重たかった。9月中旬以降はずっと何らかの研究室とメールしていたのではないかと思う。学生には締切遵守を口うるさく言うくせに、締切を全然守らない研究室もあるんだなと思った。

SecHack 第3回イベント

9月から実装している自作OSである Cyrius を展示した。と言っても8月・9月はあまりに忙しかったので、この時点ではまだブートできるのみであった。その代わり、この Cyrius で実現しようとしているアイデアのリストをモニターに移して説明し、ツッコミ待ちするという事をしていた。

イベント終了後はトレーニー数名で集まって秋葉原を散策するなどして楽しかった。

https://x.com/n4mlz/status/1972967514499101008?s=20

10月

中高OBOGオーケストラ 演奏会

中高時代に所属していたオーケストラ部の卒業生と元顧問の先生で集まり再びオーケストラが編成され、その演奏会を10月上旬に行った。私はこの練習に2月から定期的に参加していた。よく見た同期や先輩と再びオーケストラをできたのが嬉しかった。

音ゲー「XLAIR」の開発

Ryoga_exe と共に筑波大学の学園祭「雙峰祭」で展示するために音ゲーを開発していた。それが「XLAIR」(読み: エクレア) である。構想自体はかなり前からあり7月頃からは毎週会議を行うなどして進めていたものの、結局締め切り駆動開発になってしまった。

開発についてはゲーム本体は Ryoga_exe、ゲーム以外のソフトウェアは私という担当で行った。サウンド・デザインチームを合わせてメンバーは5人である。

音ゲー「XLAIR」

バックエンドのスコアサーバーは、Rust (axum+SeaORM) で書いた。久しぶりにドメイン駆動設計というやつをやってみたが、なかなか綺麗に書けたのではないかと思う。本番前2周間でPRを22個、200 commits ほど行った (嘘だと思うならリポジトリを見て頂きたい) 。血と涙の結晶である。

github.com

また、フロントエンド (https://xlair.dev/) の開発も行った。Next.js + TailwindCSS である。この頃何故か定期的に落ちているので、見られなかったら申し訳ない。

xlair.dev

この Web サイトの開発はバックエンドよりも更に過酷であった。なんと、リポジトリを作成したのは本番2日前である。ここから2日間でPR を14個、122 commits 行った (嘘だと思うならリポジトリを見て頂きたい2)。そして、何とか来場者数やランキングのリアルタイム表示機能、本番デプロイまで含めて本番までに間に合わせた。俺って実は結構パソコンできるんだなと思った。

github.comこの他にも Felica リーダーを使用して学生証でユーザー登録するソフトウェアも書いたので、本番前 1 週間では XLAIR 関連だけで PR を40個、400 commits 近く行っていたことになる。もう二度とこのような締め切り駆動はしないようにしようと肝に銘じた。

11月

雙峰祭

雙峰祭の時間のほとんどは XLAIR を展示している教室にいた。当日は、2日間合計で140回遊んでもらうことができた。教室が辺鄙な場所であったにも関わらず、デカいスピーカーから爆音でゲーム音を垂れ流していたおかげか、集客に困ることはなく常に教室にある程度の人だかりができていた。易しい難易度も用意していたおかげで小さな子供にも遊んでもらえたり、高難易度曲のスコア狙いで何度も遊ぶヘビーユーザーの方が現れたりして嬉しかった。また、ゲームとしてでなく個人開発として仕組みに興味を持ってもらえることもあった。

https://x.com/XLAIR_Project/status/1984839141662826614?s=20

教室を離れている間も見るたびに https://xlair.dev/ のランキングが更新されているのを見て、沢山の人に遊んでもらえているのだなぁと実感していた。

SecHack 第4回イベント

会場は大阪。イベント開始はお昼からだったので朝に着く新幹線を取り、一人で軽いグルメ旅をして大阪グルメを堪能していた。

自作 OS「Cyrius」では、ついに軽めの Linux バイナリ互換ができた。no PIE かつ libc をリンクしていない、syscall 直叩きのバイナリであればそのまま動作する (libc をリンクすると余計な syscall が呼ばれてしまう為)。ファイルシステムは実装していないので、ELF ファイルは Rust の include_bytes! マクロで埋め込んだ。
展示では、donut.c が動く様子を示した。libc が使えないので、自前実装のものに差し替えて静的リンクした。

donut.c が動作する様子

イベント終了後にトレーニー数名で集まって大阪グルメを食べ歩くなどして楽しかった。今年だけで大阪グルメにまぁまぁ詳しくなった気がする。

Cloud Native Days Winter 2025 (学生枠登壇)

Cloud Native Days は名前の通り、クラウドネイティブ技術に関するカンファレンスである。このイベントにおいて、学生スカラシップ枠として登壇を行った。タイトルは「NUMA環境とコンテナランタイム ― youki における Linux Memory Policy 実装」。8月から行っている youki への大きな PR の内容ついて話した (この時点でもまだマージされていない)。大学内 LT などの発表の経験はあったが、しっかりとしたカンファレンスでの発表は初めてだったので緊張した。

speakerdeck.com

ちなみに登壇者にはオリジナルのパーカーが配られる。SecHack やセキュリティキャンプ、更には夏インターン等でも服を貰っていたので、今年の服に関してはおそらく買った数よりも貰った数の方が多いだろう。

https://x.com/n4mlz/status/1991338974171000992?s=2

12月

WORD 58号・初の2巻構成

年内最後の WORD として、58号を発行した。様々な事象が重なり、ページ数は前代未聞の 232 ページになってしまった。WORD 編集部では製本作業も自前で行っており、既存の備品では 80 枚ほどしか綴じられないので、WORD 史上初の上下巻構成で発行した。印刷作業がいつも以上に大掛かりとなってしまい大変だった。

58号はこちら。私は「カレーの作り方」という記事を書いた。

www.word-ac.net

ICTSC2025 2次予選

1次予選ではメンバーのほぼ全員が遅刻/欠席して競技開始時に私しかおらず発狂しており、2次予選では二度とこうならない!と全員で約束したはずなのだが、見事フラグを回収した。開始10分前になっても部屋には誰もいないし、誰とも連絡がつかない。

https://x.com/n4mlz/status/2001133923888455730?s=20

結局、競技時間が減るのを覚悟で直接私が家に凸ることで解決した。競技自体は良好であり、結果的に2次予選も通過した。

オンサイトの本戦は来年である。本戦は流石にこうはならないといいのだが... (フラグ??)

youki、遂にマージ

8月から続けていた、youki への Linux memory policy 実装が、遂にマージされた。

むしろ機能追加を私なんかが引き受けてしまったために youki に一生 memory policy サポートが入らなくて本当に申し訳ない気持ちでいっぱいだったので、 ようやくやり通せたのだと安堵した。思えば夏インターンに行っていた頃からやっていたので、感慨深いマジマージ。

us/2001126625669472454?s=20

https://x.com/n4mlz/status/1999681077460500530?s=20

JANOG57 登壇決定

logica さんと共に、JANOG57 (2026年2月) にて Kubernetes CNI の話をすることになった。logica さんとは今年 SecHack の同期で、定期的にカンファレンスでも一緒になっている。夏に CNCF の記念イベントで utam0k さんに繋げてもらったのも、11月に Cloud Native Days で登壇しないかと誘ってくれたのも彼であるので、本当に頭が上がらない。  

www.janog.gr.jp

登壇に関してセッションは1時間用意されており、また JANOG57 では学生で登壇するのは我々だけであるようなので、気を引き締めて取り組みたい。

WORD 編集長 任期満了

保守的で無難な政治をすると言っておいて革新派であったのは若干公約違反であった気もするが、大きな問題なく (諸説あり) 1年間やり通せたのではないかと思っている。来年は上皇となって院政を... (やりません)

その他

今年作った料理たち

今年の初めまで包丁すらほとんど持ったことがなかったのに、恋人ができたことをきっかけに料理に気持ちが生えて諸々作っていた。上の画像は、その一部である。また、都内を散歩するという趣味が増えた。最も多い日では、1日に35km程歩くなども...? (北千住〜上野〜御茶ノ水〜皇居〜東京タワー〜品川)。あと、定期的に献血をするようになった。

2025 年を振り返ってみて

去年からは想像のつかないような1年になった。次の2026年も今年のようなアクティブさ・貪欲さを忘れず、積極的に新しい世界に飛び込めるような人間でありたい。

来年の抱負

パソコン: SecHack 優秀修了生取りたい。セキュリティキャンプネクストか未踏かサイボウズラボユース行きたい。シスプロとクラウド関連に強くなりたい。おうち Kubernetes ちゃんと運用したい。流石に来年こそは Vimmer になりたい。

大学および学問: 今年で卒業までの大抵の単位は取り終わって来年度は時間割に余裕があるので、他学類の授業取りまくってスーパー学問人間になりたい。あと、カンファレンスで人と雑談できるくらい英語を話せるようになりたい。

その他: 早寝早起きを心がけたい。スマホの利用時間を制限したい。本を読む習慣をつけたい。一度行った飲食店は二度行かない (ただし人から誘われた場合を除く) ルールを適用して1年を過ごし、あわよくばつくば市中の飲食店に詳しくなりたい。1年の抱負だけでなくn月の抱負というやつを12回繰り返して達成可能性を底上げする試みをしたい。

↑流石に欲張りすぎという説もある。何個達成できるかな〜

2024年を振り返る

なんかみんな一年の振り返りを書いているので、私も書いてみる。主にパソコン関連のことについて時系列順に書いていく。

1月

初めて Linux をインストール

元々 Windows を使っていたのだが、WSL をそれなりに使い始めてから 3 ヶ月くらいが経ち、「う〜んこれ、Windows 捨てて Linux にした方が嬉しくね?」となったので Linux をインストールすることを決意。大学で流行りまくっていた ArchLinux とやらをインストールした。のだが、当時は本当に知識がなくインストールだけでまる一日溶かした。

これより少し前に 20 万のハイスペックなノートパソコンを買って Windows として使っていたのだが、買ったばかりのこいつをすぐに Linux にするのはあまりにもリスクが大きすぎてやめた。代わりに、友人から安く購入した ThinkPad に ArchLinux をインストールした。

デスクトップ環境は使わず、Hyprland という Wayland コンポジタを導入した。KDE のようなデスクトップ環境と違い、当然、バーやランチャー、ファイラー、通知等必要なソフトウェアを全て自分で揃える必要があって大変だった。しかし「今このパソコンにはどこで何が動いている」みたいな見通しが効くようになったので、今考えてみればこれが正解だったのかもしれない。

ノートパソコンにインストールしたのでそれからは大学の課題も含めて全て Linux で行うことになった。始めのうちは何をするのにもわからず困っていた。

Dotfiles 作りにハマる

元々環境を整備するもの全般 (ex: フォーマッター、パッケージマネージャー、コンテナなど) が好きだったので、Dotfiles 作りにも当然のようにハマっていった。一日に何十コミットもするので、GitHub の草を生え散らかしていた。README も異常に気合が入っている。そして当時の環境のスクリーンショットが以下。いかにも "nerd" な感じが漂ってきて、香ばしい。

いかにも "nerd" な環境

github.com

ちなみに、今の環境はこのような感じになっている。あまり変わっていない。

現在の環境

フロントエンジニアとしてバイト

少し前から、フロントエンジニアとしてバイトしていた。コーディング試験こそあったものの、ほとんど未経験の状態から手探りで触り始めたので、話についていくのがやっとだった。ここで初めて Next.js を触った。

2月

ドメインを取り、ブログを作る

今は様々な事情で動いていないのだが、ブログを作って https://n4mlz.dev で公開してみた。hugo などの静的サイトジェネレータを使うことも考えたが、せっかく Web 開発を学び始めている時期だったので、Astro というフレームワークを使って自作してみることにした。UI フレームワークなどは使わず、CSS を全部自分で書いた。Markdown で記事を書けるようになっている。

github.com

また、ブログとは別に記事の内容のみを git で扱えるようにもしている。リポジトリが別れているので変更を追いやすいし、差分が混ざることもない。

ブログの記事の方のリポジトリでは、GitHub Actions で Docker イメージをビルドするようにしている。ブログを更新すると Astro をビルドして静的ファイルにし、nginx で配信するイメージが出来上がる。

github.com

ちなみに今このはてなブログでこの記事を綴っていることからわかるように、特にここで作ったブログは使っていない。作るフェーズは面白かったのだが、文章を書くのは別に面白くなかったからである。

バイト消えた

様々な事情で、なんかプロジェクトごと消えた(?)。秘密保持によりあまり具体的に書けないのでパス。

3月

プリムローズコンサートで弦楽アンサンブル

私は筑波大学管弦楽団というサークルに所属してヴァイオリンを弾いているのだが、どうやら一人一度は弦楽アンサンブルのソロを (もちろん一人で) 弾くという伝統があるらしく、私もその餌食になった。ヴァイオリンは実は 8 年ほど弾いているものの、練習もまともにしてこなかったのでヘタクソである。オーケストラも、みんなが上手に弾けている中腕だけ動かして、さも弾いている "風" に見せてなんとかしのいでいた。初めてソロを弾くという経験はさながら、公開処刑そのものだった。

演奏曲目は「W.A.Mozart 弦楽四重奏曲第17番『狩』より第一楽章」。自分にとっては本当に難しい曲だった。本番も決して成功と呼べるような演奏が出来なかったが、それでもなんとか乗り切った。おそらくこんなにヴァイオリンを練習したことはなかっただろう。

筑波大学管弦楽団の新歓サイトを作成

自分が所属している管弦楽団の、新歓サイトを作成した。デザインは他の部員の方にお願いして、Figma で作ってもらった。サイト自体は、Next.js + SCSS で制作した。

この URL は今後の新歓も使い回すだろうからいつまで私の作った新歓サイトが置いてあるのかはわからないが、一応掲載しておく。

Figma

shinkan.tsukuba-orch.org

github.com

 

私の所属する管弦楽団は本当にレベルが高く、練習量もとんでもないので私はパソコンと管弦楽団との時間の兼ね合いに非常に困っていた。とにかく時間がない。自分が楽器を弾いている間に同期はどんどんパソコンつよつよになっていく。それが怖くて、でも練習には行かないといけないジレンマで、常に焦燥感でたまらなかった。かなり精神的にまいっていた時期。

4月

個人開発 SNS「snooze」の開発

私はよく日常で思い浮かんだアイデアをメモに書き記しておく癖があるのだが、その中の一つ、「鍵垢のみの SNS」を作ることにした。せっかく Web フロントエンドも勉強してきたので、今度はバックエンド、あわよくば CRUD 操作の全てを行う RDB を持つ Web アプリケーションを作りたいと思った。Web アプリケーションを構成する上から下までの全ての技術スタックを一通り触り、丸ごと一つサービスを作ることで、「自分は Web 開発をこれだけ理解しています」ということをアピールできるものを作りたかった。いわば「ポートフォリオ」である。

バックエンドには Go、データベースには MariaDB を採用した。バックエンドやデータベースという概念、Go や SQLAPI 設計や DB 設計などどれも初めて触るものばかりであった。また、バックエンドを 6 割ほど完成させた頃、大学の友人に「そのディレクトリ構成、少し変じゃないですか?」と言われたのをきっかけに、せっかくならとドメイン駆動開発やソフトウェアアーキテクチャの勉強をした。なんだか自分の書いているコードが汚物のように見えたので、全部消してまたゼロから書き直した。熱量だけはあったので、意外になんとかなった。

5月

管弦楽団第95回定期演奏会

流石に決心して、管弦楽団はこの演奏会を最後に、いったん休団することにした。楽器を弾くこと自体は好きなので、退団はしなかった。

個人開発 SNS「snooze」リリース

なんと、開発期間 1 ヶ月半にしてリリースできた。本当に熱量の塊みたいな 1 ヶ月を過ごしていた。

これをポートフォリオにしたいとか言っていたが、結局頑張りすぎた挙げ句作ったものが巨大すぎて、記事にする気力が湧かなくなってしまった。使用技術、経験したこと、苦労したこと、こだわったこと、これからの展望など書きたいことは山ほどあったが、本当に膨大すぎて途方に暮れてしまった。今もまだ書けていない。そういう意味では、snooze というプロジェクトは本来の目的を完全には果たせていない。未完成である。

また、サービスを作るよりも運用する方が何倍も根気と体力がいることも実感した。そもそもサービスの運用経験なんてないので、アップデートするたびにサーバーを止めていたり、なんならサーバーを止めるよと告知する手段も作っていなかった。全くノウハウがないのでかなり苦労した。今ではこの辺はもちろん解消されている。

snooze.page

github.com

github.com

6月

ラックサーバー購入・Kubernetes 捌き

コンテナという技術が好きであり、またインフラも snooze の運用によりある程度関心を持ち始めていたので、K8s に入門した。そのために、ヤフオクでラックサーバーも購入した。

購入したラックサーバー

まずはシングルノードで運用しよう、ということで Proxmox 上の VM 1 つを K8s 用にした。また、GitOps を体感すべく ArgoCD を導入した。

ArgoCD のダッシュボード

なお、以下のリポジトリマニフェスト置き場にしている。

github.com

 

また、ある程度作り終えた直後に K8s の綴りが「Kubernates」ではなく「Kubernetes」であることが判明し、これまでの VM 名、ホスト名、またマニフェスト内の全ての「Kubernates」という文字列が誤字であることが発覚。DevOps や IaC (Infrastructure as Code) を目指していたので、せっかくならと完成したクラスタ全てを破壊し、VM を立てるところからやり直した。30分くらいで元の場所まで戻ってこられたので、IaC しか勝たん!となった。

また、2月に作ったブログを K8s 上に移行した。MetalLB により外部公開するようにしている。ブログ以外の用途であまり運用できていないので、2025年は K8s をもっと有効活用したい。

この一通りの過程である程度 K8s がどういうものであるとか、マニフェストの書き方であるとかを理解したので、このあとも (この自作クラスタ用ではないが) ちょくちょく K8s 用のマニフェストを書いている。

7月

コンテナ遊び

コンテナランタイム自作という新しい遊びにハマった。筑波大学で開講されている「情報特別演習」という授業では、1年間その分野の専門の先生の元で研究や開発など好きに行うことができる。1年間の最後、1月の成果発表会を目指して、演習することになる。私はこの演習題目に、「コンテナランタイム自作」を選んだ。元々コンテナが好きであったのと、同期である id:appare45 が去年同じ題目で発表していたのを見て、興味が湧いたからである。

コンテナ自作は面白い。中身を何も知らないブラックボックスの状態で見れば、それはそれはたいそうなものに見えるが、実際は決まった順番で決まったシステムコールを呼んで、名前空間を分離しているだけである (簡単に言えば)。

この時期には、ファイルシステムやマウントポイント、pivot_root などの実体がよくわからなかったため、色々プログラムを書いて気になった挙動を片っ端から試していた。

例えば、chroot 環境からの jailbreak などを試していた。そのリポジトリが以下。プログラムは C で書いている。

github.com

コンテナを実現している技術の知識がある程度ついた。

VRChat を始めた

大学の友人が Quest 2 を貸してくれたので、VRChat を始めてみた。想像以上にドハマりして、7 月だけで 150 時間以上遊んだ。どハマリしすぎて、そのまま Quest 3 を購入してしまった。とても快適。買って良かった。以降は流石に自粛して、月平均 30 時間くらいにとどめている。

購入した Meta Quest 3

ちなみに、VRChat 用のアバター改変は、6 月に購入したラックサーバーの Proxmox の上に Gitea を立てて行っている。

VRChat アバター改変用の Gitea

8月

OS自作・コンパイラ自作のチュートリアルを触る

コンテナ遊びで Linuxシステムコールの実装を見に行ったりなどするようになると、OS やコンパイラなど、低レイヤの技術に興味が湧くようになった。書籍を購入したり、小さい OS や小さいコンパイラを作るチュートリアルなど触ってみた。「低レイヤを知りたい人のためのCコンパイラ作成入門」、「1000行で作るOS」などといったチュートリアルを触っていた。しかし、長くは続かなかった。おそらくこういったチュートリアルは、始めからやることが決まっていて、飽き性の自分には相性が悪かったのだろう。車輪の再発明は大好物だが私は敷かれたレールの上を走りたいわけではない。

はてなサマーインターン

株式会社はてな」。そう、このブログ、「はてなブログ」を開発しているはてなである。元々はてなブログうごメモくらいしかサービスを知らなかったのだが、toB サービスがめちゃくちゃ強い。はてなインターンは、魔法のスプレッドシートから知った。とにかく質の高いインターンとして知名度も高く、更には毎年10人ほどしか取らないので、おそらくエンジニア向けインターンの中では、最上位クラスに人気度の高いインターンであろう。「git ってなに?初めて聞いた」みたいなレベルからたった 1 年でここまで来たと思うと、本当に頑張ったなと思う。

はてなサマーインターン

はてなインターン 2024 がどういった内容のものであったかについては、以下のレポートサイトを見てほしい。なんと講義資料のスライドまで載っているので、ぜひ。

hatena.co.jp

snooze に関する取材を受けた

snooze をリリースしたことで、レバテック LAB 様から取材の依頼をお受けした。取材を受けることは初めての経験だったので、とても嬉しかった。自分が頑張ったら頑張っただけ世界はフィードバックするのだと、心の底から実感した。世を動かすほど大きく有名なあの人も同じ人間で、同じ延長線上にいるのだと思った。自分が思っているより世界は自分の行動次第でいくらでもフィードバックをくれる。そう思った。とても良い経験になった。まだまだ未熟だけど、これに満足せず更に高みを目指そうと思った。

ちなみに取材の記事が公開されたのはインターン期間中だったので、記事を見つけた社員の方が社内 Slack に共有してくださり、色んな人から「すごい!」と言ってもらえて嬉しかった。

levtech.jp

9月

はてなインターンでほたて賞を取った

はてなインターンの最終成果発表が 9 月に行われた。その成果発表にて社内投票で一位を獲得し、「ほたて賞」をいただいた。なんとも光栄。この「ほたて賞」含め、私がはてなインターンで経験したことについては以下の記事に詳しく書いている。はてなインターン、本当に良い経験になった。

n4mlz.hatenablog.com

Rust に入門

Rust というものに前々から気になっていたので、Rust に入門した。所有権、とても良い。元々他の言語を触っているときに参照/コピーの挙動にモヤモヤする経験があったので、それを言語のルールとしてコンパイラが保証してくれているのは大変嬉しい、となった。なるべくコンパイル前に悪い部分は弾こうとしてくれるのも嬉しい。またパッケージの管理方法、フォーマッター・リンターの統一、後方互換性サポートなどがスマートで、Rust に所有権がなくても Rust を使う価値がある。これまでの他の言語の失敗を見てきた結果、全てに見通しが立った上でなるべく最善となるように作りました、みたいな綺麗さがある。全てが整っている。感動した。私は一気に Rust が好きになった。

10月

応用情報技術者試験を受験

めっちゃ勉強が面倒くさかった。何が面白いかわからなかった。これできても別にパソは強くならないよな、と思った。ただ単に表面的な知識を、字面だけ暗記して、広く浅く片っ端から覚える。変な情報商材屋とかこういうの好きそう、知らんけど。別に面白くないけど、空き時間にスマホぽちぽちして勉強した。手応えはまあまああったし自己採点しても全然合格してそうだったので、ひとまず安心した。

雙峰祭ステージ生配信サイトの開発

筑波大学学園祭「雙峰祭」のステージ生配信は例年 YouTube で行っていたのだが、著作権料がとんでもないらしい。自作の配信サイトを使えばその著作権料が数十分の一になるらしく、今年は自作することになった。私はその開発のメインメンバーとして携わった。フロントエンドにもバックエンドにも手を加えた。ずっと書いてた。

11月

雙峰祭

雙峰祭本番が11月にあった。前夜祭の時点で実装がまだ完全には終わっていなかったため、実行委員用の部屋にずっと籠もってみんなで実装していた。そして、完成した。

雙峰祭ステージ生配信サイトの画面

この生配信には、本当に多くの人が関わっていたと思う。ステージで演目を披露する人、それを撮影する人、配信卓で映像を切り替える人、テロップを出す人、テロップを作る人、映像を作る人、配信するソフトを作る人、配信サイトのデザインを作る人、配信サイトを作る人、著作権を管理する人、映像の暗号化を手掛ける人、K8s などのインフラを管理する人...これだけ多くの人と「雙峰祭ステージ生配信」という一つのものを作り上げた体験は、この先もずっと生きると思う。本当に良い経験になった。

学園祭実行委員会は 2 年生で定年なので、もう引退である。ちょっと寂しい。

テトリス AI 「Artemis」の開発

Rust でテトリス AI を開発した。名前は「Artemis (アルテミス)」。私がパソコンに興味を持ったのは、中学生の頃にテトリス AI を見てかっこいいと思ったからである。それから高校生の頃に何度かテトリス AI を作ったのだが、git も知らなければ、そもそもファイルを分けることも知らなかったので、全然駄目駄目だった。今ならリベンジできるのではないか、と考えて、当時の憧れだったテトリス AI を作ることにした。「Artemis」という名前は、高校生の頃に作っていたテトリス AI の名前を再度使っている。

人に魅せるコード、というのを心がけたので、コードはかなり読みやすいんではないかと思う。かなり綺麗に書いているし、関心の分離も意識した。

ある程度テトリスを上手にプレイできるところまでは出来たのだが、それ以上に強くする前に開発が飽きてしまった。この続きを作るか、新しく作り直すか、放棄するかは決めていない。

github.com

12月

自作コンテナランタイム「tiny-runc」の開発

コンテナ自作への熱が再燃した。いや、情報特別演習の演習成果発表が 1 月に迫ってきているので、どっちにしろやるべきである。

tiny-runc は、非特権環境で動作する OCI Runtime Specification 準拠の低レベルコンテナランタイムを目指して開発している。tiny-runc という名前の通り、「runc」という OSS を参考に書いている。runc は、Docker や Podman の中で動いている低レベルコンテナランタイムである。実際は youkiid:appare45 作の socker など、多くのコンテナランタイムの実装を参考に書いている。tiny-runc はコードをめちゃくちゃ丁寧に書いて、人々のコンテナ自作の実装のサンプルにして欲しい!みたいな気持ちがあって書いていたが、だいぶ失敗した。まず Go はシステムプログラムに向いていない。fork と exec を分離できないのは論外。例えば fork したあとの処理を親と子で 1 つずつ書けばいいところを、わざわざ子プロセス用の処理を自身のサブコマンドとして分けて、親から自分自身を呼び出す、みたいな遠回りなことをしないといけない。しかもそうすると明確にプロセスが別れてしまうので、親で利用していた構造体を子で使うみたいなことができない。せっかくオブジェクト指向的抽象化を行っているのに、プロセスを fork するたびに exec を行ってしまうと、もう一度同じ構造体を作らないといけない。

あとパスとパッケージが同じ扱いなので、循環インポートを避けるために同一パッケージにしたい、あるいはドメインモデリング的に同一パッケージの方が自然だが同じパスにファイルが増えすぎてしまい、ある程度のまとまりごとに整理したい、みたいな時に非常に困る。

それまでは「Go って雑に書けていいね」みたいに思っていたのに、この件のせいで一気に Go が好きではなくなった。まぁ、runc でも名前空間を分けたり fork したりする部分だけは C で書かれているので、「Go でシステムプログラムをするな」という話ではありそう。使う場所を間違えたね。

github.com

応用情報技術者試験合格

人の合格発表ツイート見て合格発表が出ていることを知った。合格していた。まぁとりあえず良かった。

応用情報技術者試験合格

WORD 編集部 次期編集長になった

私の人生の大きなターニングポイントを作ってくれた WORD 編集部の、次期編集長になった。任期は 2025 年 1 月 1 日から。精一杯がんばります。

 

2024 年を振り返ってみて

本当に今年はよく成長したと思う。多分 1 年前の自分から見たら想像もつかないくらい。特に snooze を開発したのが大きかった。学園祭実行委員会の初対面の人や WORD 編集部の OB の方にも、あぁ SNS 作った人!と認知されていたりして嬉しかった。やはり形として何かにアウトプットすることは重要なんだなぁ、と思った。まぁ、いつまでも snooze を擦ってないで、次のものを作ります。次は何を作ろうかねぇ。

来年の抱負

来年は低レイヤの年にしたい。自作コンパイラ、自作 OS やりたい。Rust 書きまくりたい。Zig とかやりたい。CTF もやりたい。

 

はてなインターン 2024 に参加し、ほたて賞をいただきました

どうも、 id:n4mlz です。この夏、8/19〜9/6 の三週間にわたって はてなサマーインターンシップ2024 に参加してきました。今回はその参加記を、時系列順に追って振り返っていきたいと思います。

 

応募と面接

私は現在大学二年生でインターンは必ずしも行く必要はなかったのですが、実務経験を積みたい、実際の大きなサービスの開発に携わってみたい、より強いエンジニアになりたいなどの気持ちからインターンを探していました。インターン探しには 魔法のスプレッドシート2024 | Notion を利用しました。そこで見つけたのが、このはてなインターンでした。

 

はてなインターンを知る

はてなサマーインターンシップ2024 を見てみると、いろいろ面白いことに気がつきます。まず、無料で京都に行けるではありませんか。

これはすごい。京都では、Webアプリケーション開発のための技術やインフラやライティングも含めたサービス開発の知識を扱った講義を受けられるとのこと。こういった講義を受けられる機会って、そうそうないんじゃないでしょうか。

またなんといっても特徴的なのが、その応募方法。

https://hatena.co.jp/recruit/intern/2024 より引用

簡易的な CTF?っぽさを感じます。しかもこれ、毎年応募には違うギミックが考案されているみたいですよ (参考)。

という感じで、はてなインターンは面白そうだぞ、となり応募しました。全体の選考の流れとしては、応募→ 書類審査 → 面接 という感じで行われます。ちなみに私が応募したインターンはこのはてなインターンだけでした。

 

面接

面接は、リモートで行いました。インターンの面接自体が初めてだったので、かなり緊張しました。ただ思ったよりもゆるい雰囲気で、後半は技術的な雑談をして終わりました。たしか k8s クラスタで遊んだ話と、個人開発として snooze という SNS を作っている話をしていた気がします。

 

そして内定

そして後日、メールにてインターンの内定を頂けました。はてなインターンってけっこうな倍率のイメージあったので、めっちゃ嬉しかった。

 

第1週 (前半) 講義パート

前述の通り、講義パートは京都で行われます。今回は、以下の全 9 回にわたる講義が行われました。

  • 第1回「HTTP, Web, API
  • 第2回「RDBMS
  • 第3回「コンテナ」
  • 第4回「コンテナオーケストレーション
  • 第5回「ライティング」
  • 第6回「フロントエンド」
  • 第7回「インフラ」
  • 第8回「AI」
  • 第9回「チーム開発」

どれもその分野を実際の業務で扱っている方が基礎部分から応用的な範囲まで解説されます。講義は一つあたり約一時間で、その一時間に濃い内容がぎゅっと詰め込まれています。LT などとも違い、「講義」という形でここまで実務的な話をされる経験は、そうそうないんじゃないかと思います。スライドの資料はあとから PDF で貰えました。あとでめっちゃ読み返そうと思います。

 

個人的には第3回の「コンテナ」講義がとてもためになりました。コンテナの意義やその仕組み、良いコンテナイメージの作り方という実用的な話まで、幅広い内容が扱われていました。私はコンテナ大好き人間なので聞いていてとてもためになる話ばかりでした。

 

また、前半の講義パートでは課題が出されます。課題は「小さいブログサービスに記法変換サービスを追加する」というものでした。この課題は毎年ほとんど同じものらしいです。課題のブログサービスは GitHub CodeSpaces 上の Minikube でマイクロサービスとして動作しており、記法変換サービスは Go か TypeScript で実装するという感じです。今年は全員が TypeScript を選択し、全員が Unified という文字列を抽象構文木に変換するフレームワークを使いました。これを使って独自記法を作ったりいろいろやるんですが、まぁ最初は色々詰まるわけです。でもはてなのメンターの方々が常時近くに数人いて進捗を見守ってくれているので、最後まで課題が終わらないという人はいませんでした。詰まった時はメンターの方に助けて貰えますし、「10分以上悩むくらいなら遠慮なくどんどん質問しよう!」という感じです。なんならメンターじゃない方が一緒に考えてくださることもありました。そういった感じでインターン生が気軽に質問しやすい雰囲気作りもされていて、すごくありがたかったです。

 

はてなの生活・文化

はてなには「ギベン」や「ほたて」といった文化があります。

「ギベン」とは「技術勉強会」のことで、略して「ギベン」です。これは LT みたいなもので、技術に限らず法律関係の話やデザイナー視点から見た新規プロジェクトの 0→1 を追う話など、エンジニアとしては知っていて損のない、自分からその情報に出会うことはなかったであろう有益な話を色々聞けます。ギベンは週一回あるっぽいです。インターン中は 2 回参加できました。

「ほたて」は「ホ」ットな「タ」スクを「手」がけたで賞のことで、いわゆる表彰イベントです。毎週自薦方式で社内のほたてのサービスに立候補し、ほたての時間になったら立候補した人が「こんなことしました!」というのをスライドで発表します。そしてそのあと投票タイムに入り、最後に社長が結果発表をします。その発表内容もめちゃめちゃ自由で、東京オフィスにプロの職人呼んでマグロ一匹捌いてもらった話みたいなものもありました。結果発表もかなり盛り上がっていた。

 

第2〜3週 (後半) 実践パート

後半は実践パートで、ここからは実際のチームに配属されて業務を行うことになります。配属先のチームは、あらかじめエントリーシートに第3希望まで書いていたものの中から決まり、1つのチームにはインターン生が二人入ります。私の配属先はマンガメディアチームで、チームメイトは id:SSlime さんでした。

実践パートではチームごとにインターン生がタスクをこなし、最後に全チームでそれぞれ成果を発表するという流れになっています。そう、「ほたて」ですね。ほたてでは投票による順位付けがあるので、どうにかほたて賞 (一位) を貰いたい。燃えてきました。

マンがメディアチームでは、GigaViewer というサービスを扱います。

GigaViewer とは?

GigaViewer ははてなが数々の出版社に提供しているマンガビューワーです。「ビューワー」と言いつつ、実際はフロントエンドからバックエンド、デプロイや監視まで全て含んでいます。GigaViewer に導入サービスの一覧があるのですが、本当に数が多くてびっくりすると思います。特に少年ジャンプ+などは、利用したことのある人も多いんじゃないでしょうか。

実装タスク

今回は、インターン生の手がけるタスクとして「エピソードページネーション」と「モアレ対策フィルター」を実装しました。

前者は、エピソード選択部分の UX を向上させるものです。従来の UI では、例えば 300 話まである作品に対して、デフォルトで 1〜5 話までと 296〜300 話までを選択できるようにして、その間は「もっと見る」ボタンで追加でロードするというものでした。この UI の欠点は、1 話から 300 話までが縦に並ぶため、例えば 6 話を選択したいときには何度ももっと見るを押したり、たくさんスクロールする必要がありました。これを解決するために、「1〜100話」「101〜200話」「201〜300話」のようにタブで分けて選択しやすくしよう、というのがこの「エピソードページネーション」というタスクです。

後者は、漫画でよく発生する「モアレ」を防ぐためのフィルターを開発する、というものです。モアレはよく漫画をスマホなどで表示すると出る縞模様のノイズで、漫画のトーンが原因で発生します。普段からスマホで漫画をよく読む人は、おそらく実感があると思います (「漫画 モアレ」とかで画像検索すると、「これのことか!」となると思います) 。これをいい感じに防ぐフィルターを漫画の管理画面から適用できるようにして漫画をもっと快適に読めるようにしよう、というのがこの「モアレ対策フィルター」というタスクです。

はじめは両方のタスクをインターンの期間中に終わらせるのは時間的に厳しいんじゃないかという感じだったので、まずはエピソードページネーションの方から取り掛かることにしました。

初日は環境構築を行いました。貸出用 PC で作業しているとはいえ GigaViewer の実際のリポジトリをローカルに落としてくることになるので、それはもう大興奮でした。巨大なサービスのコードが手元にあるというだけで、ワクワクします。

2日目以降は、メンターの方やチームの方々に助けられながら、実際の業務に取り掛かりました。コードが巨大であることと、初めて Perl 言語を書いていることも相まって、始めはかなり戸惑っていました。やりたいことを理解していても実際にどこを変更すればよいかわかりませんでした。しかし、メンターさんがとても丁寧に教えてくださったり、気軽に相談できる雰囲気が作られていたおかげでだんだん Perl と GigaViewer に慣れていくことができました。2~3日経ったあとは、次第に自立して動けるようになってきました。

エピソードページネーション

「エピソードページネーション」のタスクでは、ページネーション情報を取得する API と実際にページネーションされたエピソード一覧を返す API を作成しました。フロントエンドの部分はチームメイトの id:SSlime さんが行い、私はバックエンド部分を行いました。このページネーションをどう実現するか、どういう API 設計にするか、DB のクエリはどのような文で行うと高速にできるのか、などの部分はメンターの方とインターン生で考えて決めました。ただ実装するのではなく実際に意思決定のフェーズを体験できたのも良かったです。

モアレ対策フィルター

また、エピソードページネーションを実装してからインターンの期間的にまだ時間に余裕があったため、「モアレ対策フィルター」の方にも取り掛かりました。私は、モアレフィルターの処理の部分を担当しました。まずはどのようなフィルターにするとモアレが軽減するのかわからなかったので、OpenCV を用いて Python で検証しました。この検証内容と結果は実験チックでかなり面白いものになったので、ここに掲載しておこうと思います。私はこの検証を通して、モアレに関する以下のような法則を発見しました。

  1. トーンは2つの要素から成り立っている
    1. 構成するひとつの丸の大きさ (以後 トーンのサイズ)
    2. 丸の間隔 (以後 トーンの周期)
  2. どれくらい縮小した段階でモアレが発生するかはトーンの周期のみに依存する
  3. モアレが発生するときの拡大率はモニターの解像度に依存する
  4. ある画像に対し適切なフィルターの強さは表示するモニターの解像度に関わらず一定である

ここから、次のようなことが言えます。

  1. モニターの解像度は考えなくてよい
  2. ブラウザの viewport の大きさは考えなくてよい
  3. モバイル用やPC用などでフィルターを分ける必要はない
  4. 画像自体のサイズからフィルターの強さを決めることはできない
  5. トーンの周期によってのみ適切なフィルターの強さが決まる

これらの法則から、複数のフィルターを使って、特定の作品に対してパラメータを変更することでモアレを軽減しつつも元の画像の鮮明さはある程度維持することができるようなフィルターを作成することができました。

ADR の作成

また、モアレ対策フィルターのタスクでは ADR の作成も行いました。ADR とは Architecture Decision Record の略で、システムの設計における意思決定を文書化するための手法です。「なぜそのアーキテクチャになったのか」という意思決定の記録を文書として残しておくことで、設計当時のコンテキストや意図を追いやすくすることができます。ADR の話は、はてなのチーフエンジニアである onk さんが YAPC::Hakodate 2024 にて登壇された時のスライド (ADRを運用して3年経った僕らの現在地 - Speaker Deck) が参考になると思います。モアレ対策フィルターのタスクでは、フィルターの情報を DB でどう持つかを検討する ADR を作成しました。議論→ ADR を作成→承認・採用までの流れを体験することができました。マンガメディアチームのエンジニアの方から多数のフィードバックをいただくことができ、無事にこの ADR は承認されました。

DB のマイグレーション

また、この DB 設計の変更に伴い、本番環境での DB のマイグレーションも行いました。実際の本番環境の DB をマイグレーションする部分は社員の方が行うのですが、その直前までを自分の手で体感することが出来ました。DB のマイグレーションは本当に大変で、巨大なテーブルを、サービスを止めることなく安全にマイグレーションする必要があります。これには、Instant アルゴリズムというものを使いました。この Instant アルゴリズムは、メタデータの更新だけ行うことで、高速かつ負荷をかけずにカラムの追加などを行うことができます。今回は DB の設計を大きくは変更せず一つカラムを追加するだけだったので、Instant アルゴリズムが適用可能な操作でした。実際にマイグレーションが手元で実行できるか確認したところで、PR を出しました。その後、PR 承認→開発環境で実行→本番環境で実行というフェーズを辿って、無事本番環境でのマイグレーションを行うことが出来ました。このような大きなサービスでの DB のマイグレーションを実際のインターン期間中にリアルタイムで見ることができたのは、本当にためになりました。

 

そして最終的に、なんとか最終発表までにモアレ対策フィルター機能を開発することが出来ました。正確には一部の機能は実装出来なかったのですが、「フィルターをページに対してプレビューする」という機能は間に合わせることが出来ました。個人的にも、かなり納得の行く出来に仕上げることが出来ました。

最終発表

最終発表は、前述した「ほたて」という自薦式の表彰イベントとして行われました。どのチームの発表も素晴らしく、中でもノベルチームは 4 つもタスクを手掛けていたりととんでもない成果を上げていました。また、ブログチームは「自動生成アイキャッチ画像を HTML でカスタマイズする」というめちゃめちゃ面白い機能を開発していました。これだけで色々遊べそうですごい。

staff.hatenablog.com

そしてなんと、我らがマンガメディアチームは、投票により、「ほたて賞」を頂くことができました!!本当に良かった。頂いたコメントを読んでみると、モアレ対策フィルターの研究に言及されている意見が多い印象でした。頑張って本当に良かった。

感想

大きなプロジェクトを扱うことに関して、自分の実装する範囲に必要な情報を上手く
見つけ出したり、プロジェクト全体の動作を把握する経験ができたのは、本当に良かったです。またこのインターンを通して、仕様や実装方針を議論する、役割を分担する、自分や他人の進捗を把握しながら進める、実装が終わったら都度テストを書く、リリース前に PR単位で動作を一つずつ確認する、などのチーム開発の根幹となる部分を学ぶことができました。
最後に、メンターの id:cateiru さん、エンジニアの id:handat さん、ディレクターの id:byorori さん、デザイナーの id:tymikii さん、その他マンガメディア開発チームの皆様には大変お世話になりました。本当にありがとうございました!