セキュキャン2019 応募記

セキュリティ・キャンプ2019のデータベースゼミ(以下DBゼミ)に参加できることになりました🎉 年齢制限的に今年が応募資格を満たす最後の年だったので、無事に通過できて本当に嬉しいです。頑張っていこうと思います。

以下にDBゼミの概要と、提出した応募用紙の自分が気に入っている箇所だけを書きたいと思います。 応募課題は自己アピール系の問題が多く、書いたとしても参考にならないとは思うので、次に応募する人の参考にしてもらうためという目的よりは、単に記録に残しておきたいから、という理由で書いています

DBゼミとは?

セキュキャンのコースは、5日間に色々な講義を受ける選択コースと、5日間(+キャンプ前の1ヶ月くらい)を通して1つのソフトウェア開発を行う集中開発コースの2つに大きく分けられます。

DBゼミは後者の集中開発コースの1つで、データベースを実際に開発します。特にトランザクション処理について学ぶことをテーマにしているので、自作DBにトランザクションを実装することを目標にしています。講師の方による詳しい説明がこちらにあります。

応募課題について

問1

あなたの好きなプログラミング言語について,どんなところが好きなのか教えてください.

詳細は割愛しますが、OCamlHaskellの話をしました。関数型言語の話ばかりでなんだこいつと思われないか心配になったので、ちゃんと手続き型言語も書けるよ!というアピールの意味でC/C++の話もしました。

問2

トランザクション処理やそれに関する技術のどんなところに興味を持ったのか教えてください.

DBゼミに応募しようと思った動機を含めて書きました。内容含め思い入れのある箇所なので以下に晒します。


トランザクション処理やデータベースに興味を持ったきっかけのお話を含めて書こうと思います。 私は今年の3月、GSoC(Google Summer of Code)のHaskell.orgのプロジェクトに応募しようと準備をしていました。 狙っていたプロジェクトは、statefulでかつconcurrentな操作をサポートしているHaskellのライブラリ・ツールを1つ探してきて、メンターの人が開発中のQuickCheckの拡張版ライブラリを用いてテストするというもの*1でした。私はプログラムの形式検証やテストといったことに漠然と興味を持っていたので、このプロジェクトに興味を持って調べ始めていました。最初はstatefulなライブラリといっても具体的にどんなものがあるのかピンときておらず、Hackage(Haskellのライブラリをまとめているサイト)のConcurrencyカテゴリにあるライブラリを闇雲に見ては探していました。

また、Parallel and Concurrent Programming in Haskell (邦題:『Haskellによる並行・並列プログラミング』)という本に出会い、Part2のConcurrencyの部分を読んで勉強していました。 トランザクションという概念に最初に出会ったのはおそらくその中で、STM(Software Transactional Memory)について読んだときでした。複数のアクションを1つのatomicなものとしてまとめ、失敗したら実行前の状態に戻すことができ、デッドロックなど並行計算にひそむ危険性を簡単に減らすことができるというところに興味を持ちました。最初はこれをテスト対象にしてみたいと考え、メンターに提案していましたが、STMのHaskell実装がかなり安定しておりバグがなさそうだということと、ライブラリの規模が小さすぎるというところから、この提案はなしになってしまいました。

その後、Jepsenという類似のテストツールの例を見たり、RaftのアルゴリズムのテストをQuickCheckの拡張ライブラリで実装したもの*2などをメンターに紹介してもらったりしたことで、データベースや分散システムの何かのアルゴリズムを対象とするのが良さそうらしいということに気づきました。分散システムについてはあまり詳しくなかったため、Haskellバインディングが存在する色々なデータベースを探してきて、その中から絞って最終的にRedisをテストすることに決めました。

最終的に提出したproposalには、Redisのどのようなコマンドをどのようにテストするかなどを詳細に盛り込み、また一部のコマンドに対して部分的にテストを実装してみたものをGitHubにアップロード*3したりして頑張りました。

残念ながらこのプロジェクトには私よりずっと分散システムへの知見が深そうな他の候補者が採用されてしまいましたが、この応募の経験を通じて、それまでよく知らなかったデータベースや並行計算などのトピックが意外と奥深いことに気づき、仕組みを学んでみたいと思うようになりました。このセキュリティキャンプのゼミで、データベースの実装を通じてその仕組みを学ぶことができるならば、とても良い機会になると思い応募しました。


問3

次の (3a)~(3f) の中から 2 つ選んで説明してください.
たくさん時間をかける必要はありません(目安はひとつにつき 5〜20 分くらい).
調べる過程で分かったことだけでなく,分からなかったことや疑問に思ったことも書いてください.
参考にした書籍や Web ページの情報があれば全て書いてください.
(3a) ACID (atomicity, consistency, isolation, durability) について.
(3b) データ構造としての Hash table と Tree の違いについて.
(3c) Write-ahead Logging (WAL) について.
(3d) Serializability について.
(3e) キャッシュメモリについて.
(3f) 永続(不揮発)ストレージについて.

来年このゼミがあるとしたらまた似たような問題が出されるのではないかと思いますし、少し調べればわかる知識をまとめた感じの内容なので割愛します。

問4

何かアピールしたいことがあれば自由に書いてください.この欄は空欄でも構いません.

実は当初はこの欄は空欄でいいかなと思っていたんですが、セキュキャンでは熱意をアピールするのが大事だと言われたので、ここ1年間で頑張ったことであるところのChromiumインターンの話とCPU実験の話を書きました。何かしら書くといいと思います。

余談

GSoCに応募してみようとした中でDBや分散システムについて触れる機会を得て、その経験が今回の応募に活きた結果となりました。 何事も応募は気力を使うし、落ちると多かれ少なかれ落ち込みますが(GSoCに落ちた時はかなり落ち込んでいましたが...)、 GSoCの方の応募を通して得たことが0ではなかったと、セキュキャンの応募用紙を書きながら思うことができ、その意味でもいい経験になりました。