大学に入って2年が過ぎました(これまで勉強してきたことなどのまとめ)

はじめに

この春,僕も無事に学部3年生になれたようです.ふと入学当初のことを思い返すと「わーなにも知らなかったなぁ」という気持ちになるのですが,一方でこの2年で結構たくさんことを学べたのかなぁとも思います.なにせ情報系の分野は「学校では教えてくれないけども常識」みたいなものが多い気がしていて,そういったものをどこで学んできたかというログを一旦残しておこうと,この記事を書いています.

B1春 (C言語をちゃんと書く)

まず,大学入学してすぐの頃.

中高の僕が出来たのは,ProcessingとArduinoが少しと,あとははんだ付けくらい.
そんなこんなでロボットを作るサークルに入る.
まぁ正直「オレ,プログラミングできるんじゃね?」と思っていたのだが,サークルのプログラミング講習でC言語を1から学んでいくうちに「あーなにもわかってなかったんだなぁ」と思い直した.ここを契機に,コンパイラの気持ちを考えながらプログラムを書くようになる.
どういうことかというと,言語仕様というものをちゃんと意識するようになった.
中高では,
「こんなのを作りたい」→「こんな感じで動くだろ」→「動かない」→「ウワー」
という感じだったのだ(大学でプログラミングの授業が始まると,周りの人もこんな感じだった気がするが).
まぁ当たり前のことなのだが,言語仕様を正確に学び,わからないことは知らべ,エラー文を熟読する,そういう習慣を身に着けたのが,B1春である.

B1夏 (ネットワークの基礎,はじめてのLinux)

夏が来た.暑い(サークルの部室にはクーラーが無い).

システム改修

当時B4だったある先輩から,サークルで使っていたシステムの改修を命じられる.
そのシステムというのが,ゲームのコントローラー4台からの信号をパソコンで受けて,その信号をいい感じに変換して,それぞれ4台のロボットに送る,というもの.これはロボットで使う通信モジュールがXbeeからESP8266に変わったことに伴う改修だった.
なぜか「わかりましたー」と二つ返事してしまったのだが,なにをやったらいいのやら,という感じだった.
長くなるし,あまり覚えていないので,このシステムについての詳細は述べないが,ここで学んだのは以下のこと.

オブジェクト指向

システムはProcessingで実装した(今ならこの選択はしないな......).Processingにはゲームコントローラーを扱うライブラリがあったので,それを使っていい感じにやった.ここで苦戦したのは,複数のコントローラーを独立して扱う必要があったこと.どうやらそんなことをする人は世の中にあまりいないようで,ググっても何も分からなかったので,リファレンスを読みながらなんとかやった.ということでオブジェクト指向に少し触れた.
(今思えば,このときは全然理解できていなくて,1フレーム毎にインスタンスを作成したりしていた......)

ネットワーク

通信のシステムなので,当然ネットワークの知識が少しは必要になる.この時ロボット側で使っていたESP8266というマイコンWiFiを使うことができる.最終的には,「パソコンでWiFi アクセスポイントを建て,それぞれのESP8266が異なる固定IPアドレスでアクセスポイントに接続し,その上でUDPで信号を送る」ということをした.多分これが普通かなぁと思う.
しかし,このときの僕は何も知らないので,そもそも「WiFi / IP / TCP / UDP / HTTPって何が違うの?」という感じだったので,勉強した.
この辺りは「マスタリング TCP/IP 入門編」を読んだ気がする.
www.ohmsha.co.jp
この辺りから「言語の勉強」から「技術の勉強」にシフトできた気がする.

Ubuntuインストール

そういえば,この頃にWindowsを消して,Ubuntuをインストールした.
はじめてのLinuxということもあり,何をするのにも,権限やパスの設定で苦戦していた.段々とターミナルを常用するようになり,いろいろなコマンドを覚えていったので,ここでホストOSをLinuxにしたのは結構良かった.

B1秋 (セキュリティ・ミニキャンプ)

1年後期の授業は結構大変だったな......

秋はセキュリティ・ミニキャンプというのに初めて参加した.
この頃はセキュリティにあんまり興味がなかったんだけども,ミニキャンプを受講して少し面白さがわかった.
参加費は無料なので,一度参加してみる(応募してみる)のがおススメ.
www.security-camp.or.jp
togetter.com

B1冬 (ソケットプログラミング)

冬.大学の暖房が入るのは午前8時から.しかし交通事情的に7時半くらいには大学についてしまう.寒い(寒い).

この頃はソケットプログラミングをやってみていた.C言語でソケットを使って,TCP / UDP通信するという基礎的なもの.自分で書いたプログラム同士で通信ができたのは結構感動的だった.
TCP通信ができたので,その上でHTTPも喋ってみた.http://なサイトの内容を表示する,しょぼいcurlコマンドみたいなものを作っていた.
https://なサイトも見るべく,OpenSSlを使って暗号化・復号化を試みたのだが,これはうまくいかず......
コードはこちら↓
github.comgithub.com

コーディングにはこちら↓のサイトを大いに参考にさせていただいた.
TCPを使う:Geekなぺーじ

この頃はTCPができたぞぉぉと喜んでいたのだが,ソケットという仕組み自体がとても作りこまれたものなので,大してすごくないんだよなぁ.

B2春 (SecHack365参加,FPGA)

2年生になった.

SecHack365という事業がNICT(総務省管轄の研究機関)でやられていて,それに応募した.
公式サイトでは,以下のように説明されている.

若手セキュリティイノベーター育成プログラム SecHack365は、25 歳以下の学生や社会人から公募選抜する 40 名程度の受講者を対象に、サイバーセキュリティに関するソフトウェア開発や研究、実験、発表を一年間継続してモノづくりをする機会を提供する長期ハッカソンです。全国の一流研究者・技術者や受講者等との交流をするなかで、自ら手を動かし、セキュリティに関わるモノづくりができる人材 (セキュリティイノベーター) を育てます。

sechack365.nict.go.jp

いろんなコースやゼミがあるのだが,その中でもフィジカルゼミという,物理層を扱うゼミに所属することになった.
(SecHack365に関しては別のエントリで書きまーす)

SecHackに参加したことで,2年生の一年間はSecHackを中心として回ることになる.

SecHackの初回,横浜回でゼミの先生に「FPGAやってみたら?」と言われたのをきっかけに,FPGAを始める.
FPGAとは何か?ということは,こちらの記事などを見てほしい.
いまさら聞けない FPGA入門 (1/3) - MONOist(モノイスト)

B2夏 (論文を読む.論文を読む.)

何年たっても夏は暑い.

SecHackでFPGA関連のセキュリティについて取り組んでいるわけだが,今のFPGAに何が足りないのかとか,FPGAでは何ができるか,といったことを学ぶ必要があった.そのためにひたすら論文を読む.ここで,なにより英語ができないなぁというの実感した......(勉強しなきゃ......)

そういうサーベイを通して,DevOps / DevSecOpsの考えや,サイドチャネル攻撃について学んだ.

この頃はかなり迷走していて,ずっと何を作ったらいいか考えていた気がする.

B2秋 (Linuxシステムコール,AES暗号)

2年後期は授業が少ないね.

この頃学んでいたのは,主にLinuxシステムコールとAES暗号.どちらもSecHackの取り組みでそれらの知識が必要になったので勉強した.

Linuxシステムコール

Linuxにはデバイスドライバとかシステムコールというような仕組みがあって,それぞれについて学んだ.
練習もかねて,大学の先輩であるけんつさんの作ったデバイスドライバLinux kernel 5.3.5に対応させて,プルリクエストを送った.
github.com

それと,システムコールを簡単に開発するために,(やや黒魔術的な)シェルスクリプトを書いたりもした.
github.com

AES暗号

AES(有名な共通鍵暗号)について理解する必要があったので,C言語フルスクラッチ実装した.
本来ならば,暗号アルゴリズムは自分で実装するべきではない(バグを作ってしまう可能性が高い)が,AESを理解するという目的なので自前実装である.
github.com

まず「暗号技術入門 第3版」を読んだ.これは非常に読みやすくて,まさしく入門に最適だと思う.
www.hyuki.com

AESとは何ぞや,ということは暗号技術入門で学べるが,その実装までは詳しく書かれていない.
詳細なアルゴリズムについて分かりやすくかかれているサイトがあるのだが,意外や意外,Wikipediaである(英語だけど).
en.wikipedia.org
結局は行列演算なので,ここを見ればお好きな言語で実装できると思う.
ちなみに,公式の仕様書も公開されている.
https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.197.pdf

B2冬 (SWIGFPGA Subsystem,SecHack365最終発表)

SecHackの成果発表が迫り,大分焦る日々.

SWIG

SWIG(Simplified Wrapper and Interface Generator)とは,C/C++のライブラリを,PythonJavaなど様々な言語から呼び出すことができるようにするツール.
これを使って,Cで書いたライブラリをPythonから使うということをやっていた.公式ドキュメントが結構丁寧で良い.
SWIG and Python

FPGA Subsystem

LinuxにはFPGA Subsystemという,FPGAの動的コンフィグをサポートする機能がある.なかなかにニッチな機能なので詳しくは述べないが,以下のドキュメントに概要が書いてある.
intro.rst « fpga « driver-api « Documentation - kernel/git/stable/linux.git - Linux kernel stable tree

SecHack365最終発表

一年間続いたSecHack365の最終発表を沖縄で行った.これはSecHack参加ブログを別に書くので,ここにはあまり書かないでおく.
sechack365.nict.go.jp
sechack365.nict.go.jp

B3春 (Vue.js,ベアメタルアプリ)

SecHackも一段落し,大学も春休みに入り,まとまった時間が出来たので,やりたかったことを一気にやった.

Vue.jsでポートフォリオを作った

Webフロントエンドは前々からやってみたかったのだが,この機にまとめてやってみた.
最近はやりのJSフレームワーク御三家(Vue,React, Angular)のどれを選ぶか,というのが最初の悩みどころ.ロゴが好きなのでVueをやってみることにした.
1週間ほどでポートフォリオサイトを公開できた.詳しくは下記のスライドにまとめてみた.
docs.google.com
ポートフォリオはこちら.
https://w-haibara.github.io/

ベアメタルアプリ入門

こちらもずっとやりたかったこと.これもマニアックな内容なので詳しくはこちらのスライドをどうぞ.
docs.google.com

おわりに

なんとなく2年間を振り返ってみました.大学に入ってこれからどうやって勉強しようかと悩んでいる人の役に立てばいいなぁと思います!