まだ研究もしていない、成果物もないただの学部1年なので、今までどう考えて勉強してきたか、これからどう勉強をすすめていくのかということを述べたいと思います。
私は大学を一度中退しています。以前は東京大学理科一類前期教養過程にいましたが、病気になってしまい、同級生が大学3年生として過ごしているとき(2017/10)に休学をしました。そして、中退してこのままだと就職できないという不安に対し、僕は数学が好きだったので、プログラミング、特にAIの分野ならば生きていけるかもしれないと思い機械学習を学びはじめました。しかし、kaggleで他人のjupyter notebookをいじってみたりコピペするだけでは本質的な成長は見込めないことを知って、if, forなど基本的な構文を学びたいという気持ちが湧いてきました。progateやドットインストールをしていた時期もありましたがうまく使いこなせる感覚がありませんでした。そうして何かいい方法がないか探すうちに、Twitter経由でchokudaiさんの存在を知り、競技プログラミングというものがあることを知り、始めてみることにしました。これが2018/4のことです。なので、本格的に勉強をはじめたのは2018/4と自分の中では思っています。この頃にはだいぶ病状もよくなり、普通の人と同じように生活できるようになっていました。
はじめは機械学習がメインの興味でした。
- 単純ベイズ入門編( http://www.kamishima.net/mlmpyja/nbayes1/ )
- CourseraでAndrew Ng先生のmachine learning( https://www.coursera.org/learn/machine-learning )
- Backpropagationがよく分からなかったのでPRML上の一部を読みました。
また、競技プログラミングをしました。
- AtCoderを当時のABC-C問題まですべて埋めました。このときから簡単なプログラムならサッと書ける自信がつきました。使っていた言語はC++です。複雑なアルゴリズムを把握する能力がkaggleをやっていて僕に欠けているものだと思っていたので、その能力が鍛えられると考えていました。
開発にも興味を持っていました。
- CSS: yui540さんという方のCSS Animationが大好きで、CSS Animationメインのサマーウォーズの9周年記念サイトを作りました。( https://uta8a.github.io/summer_wars_9th_anniversary/ )
- JavaScript: Node.jsで簡単なAPI(CRUD程度)なら書けます。GlitchでSlack botを作ったり、firebase functionsを触りました。フロントエンドのJavaScriptもCSS Animationでサイトを作るときに学びました。ES6(ES2015)の主要な機能が分かるようになりました。フレームワークはVue.jsを触りました(VuePressから入り、公式referenceを見ながら簡単な静的サイトが作れるようになりました)
- Rust: The Rust Programming Languageを所有権を理解するの終わりまで読みました。ターミナル上で動作するオセロを書きました。
夏からはCTFにのめり込むようになりました。
- 2018/9/1 SECCON Beginners 2018 広島 演習CTF 2位: 広島で行われた、大学生、社会人対象のCTF入門講義。ここで低レイヤ(アセンブリくらいのレイヤ)に興味を持ちはじめます。
- 競技プログラミングをしている人向けにバイナリ演習を開きました。firebaseを用いてミニCTFサイトを作りました。(バックエンドを実装せずに1枚のindex.htmlで済ませた簡易的なものです)
OSSに興味を持ち、実装を読んでいました
- yui540/Dropoutのソースコードはほぼすべて読みました。
- CTFの影響から言語処理系や低レイヤに興味を持ち、uint256_t( https://github.com/maekawatoshiki )さんのリポジトリのうちnaglfar, rapidusを読みました。
記事を書きました
- 前述のバイナリ演習で思ったよりアセンブリはハードルが高いことを知り、アセンブリに触れてみよう( https://qiita.com/kaito_tateyama/items/89272098f4b286b64115 )という記事を書きました。(2019/2-2019/3)
- Arch Linuxに触れました
- ICTSCに出ました
- 低レイヤを知りたい人のためのCコンパイラ入門で電卓程度まで実装する
- 山梨ミニキャンプに行く
- hiro_itでCTFをはじめようというLTをする
- Rustでサーバーサイドを書きはじめる(hicoder-dev)
- 競技プログラミングのライブラリ環境整備をする( repo: https://github.com/uta8a/uta8alib blog: https://www.blog.uta8a.net/posts/2020-01-10-procon-lib-env/ )
詳しくは https://www.blog.uta8a.net/diaries/2020-01-01-new-year/ を見てください
2年目は大学に通うことに力を入れていたのでたいしたことができていません。その代わり、前期の単位をすべて取得など、当たり前ですがきちんと学生生活を送ることが出来ています。
研究: 言語処理系
山梨セキュリティミニキャンプで簡単な自作言語のLLVMフロントエンドを実装して、単純な仕組みで複雑なことが実現できるコンパイラの奥深さに惹かれました。また、TSGCTFで型に関する問題が出たことと、Rustを学んでいくうちに、型理論について、特に静的型付けでコンパイル時にエラーを検出することに興味がわきました。型無しラムダ計算の初歩しか理解できていないので、TaPLを読んでいこうと思います。
開発
Rustで高速で安全なサーバを書きたいという気持ちがあります。今はログイン機能しか実装できていませんが、Rustで競技プログラミング用サーバを書いています。
競技プログラミング
レートは気にせず、新しいアルゴリズムを学ぶことを目標にしています。ライブラリへのcommitが自分の中での指標です。
CTF
今年はCTFにただ出る以外にも時間をとって学習していきます。Pwnの簡単な問題ができるようになるために、アセンブリを読んで仕様を確認しています。