なんかみんな一年の振り返りを書いているので、私も書いてみる。主にパソコン関連のことについて時系列順に書いていく。
1月
初めて Linux をインストール
元々 Windows を使っていたのだが、WSL をそれなりに使い始めてから 3 ヶ月くらいが経ち、「う〜んこれ、Windows 捨てて Linux にした方が嬉しくね?」となったので Linux をインストールすることを決意。大学で流行りまくっていた ArchLinux とやらをインストールした。のだが、当時は本当に知識がなくインストールだけでまる一日溶かした。
これより少し前に 20 万のハイスペックなノートパソコンを買って Windows として使っていたのだが、買ったばかりのこいつをすぐに Linux にするのはあまりにもリスクが大きすぎてやめた。代わりに、友人から安く購入した ThinkPad に ArchLinux をインストールした。
デスクトップ環境は使わず、Hyprland という Wayland コンポジタを導入した。KDE のようなデスクトップ環境と違い、当然、バーやランチャー、ファイラー、通知等必要なソフトウェアを全て自分で揃える必要があって大変だった。しかし「今このパソコンにはどこで何が動いている」みたいな見通しが効くようになったので、今考えてみればこれが正解だったのかもしれない。
ノートパソコンにインストールしたのでそれからは大学の課題も含めて全て Linux で行うことになった。始めのうちは何をするのにもわからず困っていた。
Dotfiles 作りにハマる
元々環境を整備するもの全般 (ex: フォーマッター、パッケージマネージャー、コンテナなど) が好きだったので、Dotfiles 作りにも当然のようにハマっていった。一日に何十コミットもするので、GitHub の草を生え散らかしていた。README も異常に気合が入っている。そして当時の環境のスクリーンショットが以下。いかにも "nerd" な感じが漂ってきて、香ばしい。
ちなみに、今の環境はこのような感じになっている。あまり変わっていない。
フロントエンジニアとしてバイト
少し前から、フロントエンジニアとしてバイトしていた。コーディング試験こそあったものの、ほとんど未経験の状態から手探りで触り始めたので、話についていくのがやっとだった。ここで初めて Next.js を触った。
2月
ドメインを取り、ブログを作る
今は様々な事情で動いていないのだが、ブログを作って https://n4mlz.dev で公開してみた。hugo などの静的サイトジェネレータを使うことも考えたが、せっかく Web 開発を学び始めている時期だったので、Astro というフレームワークを使って自作してみることにした。UI フレームワークなどは使わず、CSS を全部自分で書いた。Markdown で記事を書けるようになっている。
また、ブログとは別に記事の内容のみを git で扱えるようにもしている。リポジトリが別れているので変更を追いやすいし、差分が混ざることもない。
ブログの記事の方のリポジトリでは、GitHub Actions で Docker イメージをビルドするようにしている。ブログを更新すると Astro をビルドして静的ファイルにし、nginx で配信するイメージが出来上がる。
ちなみに今このはてなブログでこの記事を綴っていることからわかるように、特にここで作ったブログは使っていない。作るフェーズは面白かったのだが、文章を書くのは別に面白くなかったからである。
バイト消えた
様々な事情で、なんかプロジェクトごと消えた(?)。秘密保持によりあまり具体的に書けないのでパス。
3月
プリムローズコンサートで弦楽アンサンブル
私は筑波大学管弦楽団というサークルに所属してヴァイオリンを弾いているのだが、どうやら一人一度は弦楽アンサンブルのソロを (もちろん一人で) 弾くという伝統があるらしく、私もその餌食になった。ヴァイオリンは実は 8 年ほど弾いているものの、練習もまともにしてこなかったのでヘタクソである。オーケストラも、みんなが上手に弾けている中腕だけ動かして、さも弾いている "風" に見せてなんとかしのいでいた。初めてソロを弾くという経験はさながら、公開処刑そのものだった。
演奏曲目は「W.A.Mozart 弦楽四重奏曲第17番『狩』より第一楽章」。自分にとっては本当に難しい曲だった。本番も決して成功と呼べるような演奏が出来なかったが、それでもなんとか乗り切った。おそらくこんなにヴァイオリンを練習したことはなかっただろう。
筑波大学管弦楽団の新歓サイトを作成
自分が所属している管弦楽団の、新歓サイトを作成した。デザインは他の部員の方にお願いして、Figma で作ってもらった。サイト自体は、Next.js + SCSS で制作した。
この URL は今後の新歓も使い回すだろうからいつまで私の作った新歓サイトが置いてあるのかはわからないが、一応掲載しておく。
私の所属する管弦楽団は本当にレベルが高く、練習量もとんでもないので私はパソコンと管弦楽団との時間の兼ね合いに非常に困っていた。とにかく時間がない。自分が楽器を弾いている間に同期はどんどんパソコンつよつよになっていく。それが怖くて、でも練習には行かないといけないジレンマで、常に焦燥感でたまらなかった。かなり精神的にまいっていた時期。
4月
個人開発 SNS「snooze」の開発
私はよく日常で思い浮かんだアイデアをメモに書き記しておく癖があるのだが、その中の一つ、「鍵垢のみの SNS」を作ることにした。せっかく Web フロントエンドも勉強してきたので、今度はバックエンド、あわよくば CRUD 操作の全てを行う RDB を持つ Web アプリケーションを作りたいと思った。Web アプリケーションを構成する上から下までの全ての技術スタックを一通り触り、丸ごと一つサービスを作ることで、「自分は Web 開発をこれだけ理解しています」ということをアピールできるものを作りたかった。いわば「ポートフォリオ」である。
バックエンドには Go、データベースには MariaDB を採用した。バックエンドやデータベースという概念、Go や SQL、API 設計や DB 設計などどれも初めて触るものばかりであった。また、バックエンドを 6 割ほど完成させた頃、大学の友人に「そのディレクトリ構成、少し変じゃないですか?」と言われたのをきっかけに、せっかくならとドメイン駆動開発やソフトウェアアーキテクチャの勉強をした。なんだか自分の書いているコードが汚物のように見えたので、全部消してまたゼロから書き直した。熱量だけはあったので、意外になんとかなった。
5月
管弦楽団第95回定期演奏会
流石に決心して、管弦楽団はこの演奏会を最後に、いったん休団することにした。楽器を弾くこと自体は好きなので、退団はしなかった。
個人開発 SNS「snooze」リリース
なんと、開発期間 1 ヶ月半にしてリリースできた。本当に熱量の塊みたいな 1 ヶ月を過ごしていた。
これをポートフォリオにしたいとか言っていたが、結局頑張りすぎた挙げ句作ったものが巨大すぎて、記事にする気力が湧かなくなってしまった。使用技術、経験したこと、苦労したこと、こだわったこと、これからの展望など書きたいことは山ほどあったが、本当に膨大すぎて途方に暮れてしまった。今もまだ書けていない。そういう意味では、snooze というプロジェクトは本来の目的を完全には果たせていない。未完成である。
また、サービスを作るよりも運用する方が何倍も根気と体力がいることも実感した。そもそもサービスの運用経験なんてないので、アップデートするたびにサーバーを止めていたり、なんならサーバーを止めるよと告知する手段も作っていなかった。全くノウハウがないのでかなり苦労した。今ではこの辺はもちろん解消されている。
6月
ラックサーバー購入・Kubernetes 捌き
コンテナという技術が好きであり、またインフラも snooze の運用によりある程度関心を持ち始めていたので、K8s に入門した。そのために、ヤフオクでラックサーバーも購入した。
まずはシングルノードで運用しよう、ということで Proxmox 上の VM 1 つを K8s 用にした。また、GitOps を体感すべく ArgoCD を導入した。
また、ある程度作り終えた直後に 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 で書いている。
コンテナを実現している技術の知識がある程度ついた。
VRChat を始めた
大学の友人が Quest 2 を貸してくれたので、VRChat を始めてみた。想像以上にドハマりして、7 月だけで 150 時間以上遊んだ。どハマリしすぎて、そのまま Quest 3 を購入してしまった。とても快適。買って良かった。以降は流石に自粛して、月平均 30 時間くらいにとどめている。
ちなみに、VRChat 用のアバター改変は、6 月に購入したラックサーバーの Proxmox の上に Gitea を立てて行っている。
8月
OS自作・コンパイラ自作のチュートリアルを触る
コンテナ遊びで Linux のシステムコールの実装を見に行ったりなどするようになると、OS やコンパイラなど、低レイヤの技術に興味が湧くようになった。書籍を購入したり、小さい OS や小さいコンパイラを作るチュートリアルなど触ってみた。「低レイヤを知りたい人のためのCコンパイラ作成入門」、「1000行で作るOS」などといったチュートリアルを触っていた。しかし、長くは続かなかった。おそらくこういったチュートリアルは、始めからやることが決まっていて、飽き性の自分には相性が悪かったのだろう。車輪の再発明は大好物だが私は敷かれたレールの上を走りたいわけではない。
はてなサマーインターン
「株式会社はてな」。そう、このブログ、「はてなブログ」を開発しているはてなである。元々はてなブログとうごメモくらいしかサービスを知らなかったのだが、toB サービスがめちゃくちゃ強い。はてなインターンは、魔法のスプレッドシートから知った。とにかく質の高いインターンとして知名度も高く、更には毎年10人ほどしか取らないので、おそらくエンジニア向けインターンの中では、最上位クラスに人気度の高いインターンであろう。「git ってなに?初めて聞いた」みたいなレベルからたった 1 年でここまで来たと思うと、本当に頑張ったなと思う。
はてなインターン 2024 がどういった内容のものであったかについては、以下のレポートサイトを見てほしい。なんと講義資料のスライドまで載っているので、ぜひ。
snooze に関する取材を受けた
snooze をリリースしたことで、レバテック LAB 様から取材の依頼をお受けした。取材を受けることは初めての経験だったので、とても嬉しかった。自分が頑張ったら頑張っただけ世界はフィードバックするのだと、心の底から実感した。世を動かすほど大きく有名なあの人も同じ人間で、同じ延長線上にいるのだと思った。自分が思っているより世界は自分の行動次第でいくらでもフィードバックをくれる。そう思った。とても良い経験になった。まだまだ未熟だけど、これに満足せず更に高みを目指そうと思った。
ちなみに取材の記事が公開されたのはインターン期間中だったので、記事を見つけた社員の方が社内 Slack に共有してくださり、色んな人から「すごい!」と言ってもらえて嬉しかった。
9月
はてなインターンでほたて賞を取った
はてなインターンの最終成果発表が 9 月に行われた。その成果発表にて社内投票で一位を獲得し、「ほたて賞」をいただいた。なんとも光栄。この「ほたて賞」含め、私がはてなインターンで経験したことについては以下の記事に詳しく書いている。はてなインターン、本当に良い経験になった。
Rust に入門
Rust というものに前々から気になっていたので、Rust に入門した。所有権、とても良い。元々他の言語を触っているときに参照/コピーの挙動にモヤモヤする経験があったので、それを言語のルールとしてコンパイラが保証してくれているのは大変嬉しい、となった。なるべくコンパイル前に悪い部分は弾こうとしてくれるのも嬉しい。またパッケージの管理方法、フォーマッター・リンターの統一、後方互換性サポートなどがスマートで、Rust に所有権がなくても Rust を使う価値がある。これまでの他の言語の失敗を見てきた結果、全てに見通しが立った上でなるべく最善となるように作りました、みたいな綺麗さがある。全てが整っている。感動した。私は一気に Rust が好きになった。
10月
応用情報技術者試験を受験
めっちゃ勉強が面倒くさかった。何が面白いかわからなかった。これできても別にパソは強くならないよな、と思った。ただ単に表面的な知識を、字面だけ暗記して、広く浅く片っ端から覚える。変な情報商材屋とかこういうの好きそう、知らんけど。別に面白くないけど、空き時間にスマホぽちぽちして勉強した。手応えはまあまああったし自己採点しても全然合格してそうだったので、ひとまず安心した。
雙峰祭ステージ生配信サイトの開発
筑波大学学園祭「雙峰祭」のステージ生配信は例年 YouTube で行っていたのだが、著作権料がとんでもないらしい。自作の配信サイトを使えばその著作権料が数十分の一になるらしく、今年は自作することになった。私はその開発のメインメンバーとして携わった。フロントエンドにもバックエンドにも手を加えた。ずっと書いてた。
11月
雙峰祭
雙峰祭本番が11月にあった。前夜祭の時点で実装がまだ完全には終わっていなかったため、実行委員用の部屋にずっと籠もってみんなで実装していた。そして、完成した。
この生配信には、本当に多くの人が関わっていたと思う。ステージで演目を披露する人、それを撮影する人、配信卓で映像を切り替える人、テロップを出す人、テロップを作る人、映像を作る人、配信するソフトを作る人、配信サイトのデザインを作る人、配信サイトを作る人、著作権を管理する人、映像の暗号化を手掛ける人、K8s などのインフラを管理する人...これだけ多くの人と「雙峰祭ステージ生配信」という一つのものを作り上げた体験は、この先もずっと生きると思う。本当に良い経験になった。
学園祭実行委員会は 2 年生で定年なので、もう引退である。ちょっと寂しい。
テトリス AI 「Artemis」の開発
Rust でテトリス AI を開発した。名前は「Artemis (アルテミス)」。私がパソコンに興味を持ったのは、中学生の頃にテトリス AI を見てかっこいいと思ったからである。それから高校生の頃に何度かテトリス AI を作ったのだが、git も知らなければ、そもそもファイルを分けることも知らなかったので、全然駄目駄目だった。今ならリベンジできるのではないか、と考えて、当時の憧れだったテトリス AI を作ることにした。「Artemis」という名前は、高校生の頃に作っていたテトリス AI の名前を再度使っている。
人に魅せるコード、というのを心がけたので、コードはかなり読みやすいんではないかと思う。かなり綺麗に書いているし、関心の分離も意識した。
ある程度テトリスを上手にプレイできるところまでは出来たのだが、それ以上に強くする前に開発が飽きてしまった。この続きを作るか、新しく作り直すか、放棄するかは決めていない。
12月
自作コンテナランタイム「tiny-runc」の開発
コンテナ自作への熱が再燃した。いや、情報特別演習の演習成果発表が 1 月に迫ってきているので、どっちにしろやるべきである。
tiny-runc は、非特権環境で動作する OCI Runtime Specification 準拠の低レベルコンテナランタイムを目指して開発している。tiny-runc という名前の通り、「runc」という OSS を参考に書いている。runc は、Docker や Podman の中で動いている低レベルコンテナランタイムである。実際は youki やid:appare45 作の socker など、多くのコンテナランタイムの実装を参考に書いている。tiny-runc はコードをめちゃくちゃ丁寧に書いて、人々のコンテナ自作の実装のサンプルにして欲しい!みたいな気持ちがあって書いていたが、だいぶ失敗した。まず Go はシステムプログラムに向いていない。fork と exec を分離できないのは論外。例えば fork したあとの処理を親と子で 1 つずつ書けばいいところを、わざわざ子プロセス用の処理を自身のサブコマンドとして分けて、親から自分自身を呼び出す、みたいな遠回りなことをしないといけない。しかもそうすると明確にプロセスが別れてしまうので、親で利用していた構造体を子で使うみたいなことができない。せっかくオブジェクト指向的抽象化を行っているのに、プロセスを fork するたびに exec を行ってしまうと、もう一度同じ構造体を作らないといけない。
またせっかくあとパスとパッケージが同じ扱いなので、循環インポートを避けるために同一パッケージにしたい、あるいはドメインモデリング的に同一パッケージの方が自然だが同じパスにファイルが増えすぎてしまい、ある程度のまとまりごとに整理したい、みたいな時に非常に困る。
それまでは「Go って雑に書けていいね」みたいに思っていたのに、この件のせいで一気に Go が好きではなくなった。まぁ、runc でも名前空間を分けたり fork したりする部分だけは C で書かれているので、「Go でシステムプログラムをするな」という話ではありそう。使う場所を間違えたね。
応用情報技術者試験合格
人の合格発表ツイート見て合格発表が出ていることを知った。合格していた。まぁとりあえず良かった。
WORD 編集部 次期編集長になった
私の人生の大きなターニングポイントを作ってくれた WORD 編集部の、次期編集長になった。任期は 2025 年 1 月 1 日から。精一杯がんばります。
2024 年を振り返ってみて
本当に今年はよく成長したと思う。多分 1 年前の自分から見たら想像もつかないくらい。特に snooze を開発したのが大きかった。学園祭実行委員会の初対面の人や WORD 編集部の OB の方にも、あぁ SNS 作った人!と認知されていたりして嬉しかった。やはり形として何かにアウトプットすることは重要なんだなぁ、と思った。まぁ、いつまでも snooze を擦ってないで、次のものを作ります。次は何を作ろうかねぇ。
来年の抱負
来年は低レイヤの年にしたい。自作コンパイラ、自作 OS やりたい。Rust 書きまくりたい。Zig とかやりたい。CTF もやりたい。