Project Fx 2.0

怪文書と備忘録を書きます

セキュリティ・キャンプ2024 ネクスト 応募課題晒し

あなたに関する問い

あなたは今までどのようなことをやってきましたか.どのようなことができて,どのようなことが得意で,どのようなことに自信がありますか. どのようなものを作りましたか.どのような情報を発信してきましたか. どのようにしてそうしたことをやってきましたか.なぜ,そのようなことをやってきましたか.やってきてどう思いましたか. 参加できた場合,セキュリティ・キャンプ ネクストにどのようなことを期待し,どのようなことをやってみたいですか.

人々がコンピュータの世界に初めて触れる入口は千差万別と思われるが、私の場合は「関数電卓」がその入口だった。私に関数電卓というものを、コンピュータというものを、何よりコンピュータで計算する楽しさを教えてくれたのは、小学生の時に入った個別指導塾の先生だった。この先生は、まだ小学校低学年だった私に、私の興味に応じて中学・高校数学の初歩も教えてくれることがあった。時には雑誌『Newton』を片手に、大学の理系学問の話をしてくれることもあった。私は算数用のジャポニカ学習帳に「数学記号ノート」というタイトルをつけ、鉛筆で先生の話をメモしていった(このノートは今も手元に保管している)。ギリシャ文字の書き方、ルート、シグマ記号、円周率、指数・対数、絶対値関数のグラフ、2次正方行列の積の計算法、ベクトルの概念、接線の傾きと微分の概念、べき関数の導関数。私はそれらの意味を必ずしも理解していたわけではないが、とにかく先生の話に夢中になっていた。ある時、先生は「関数電卓」という道具の話をしてくれた。何桁もの数の加減乗除はもちろんのこと、三角関数やeのx乗やlogまで計算してくれる電卓があり、それが先生の家にも1台あるのだという。その直後、私は『空想科学読本Q』(柳田理科雄著、2010年)という本をたまたま読んだ。その前書きで、著者は「各地のイベントを飛び回って参加者の質問を受け、愛用の関数電卓を使って即興で様々な計算をして答えを出した」という苦労話を述べていた。これら2つの "関数電卓" に対する言及が私の脳内で重なり合い、「普通の電卓ではできない高等数学の機能がいくつもあるとは凄そうだ。しかもそれを使えばこの本に書いてあるような計算ができるのか」と考え、関数電卓への興味が膨らんだ。そして私は両親に関数電卓をねだり、「EL-520F」というSHARP製のエントリー向け機種を買い与えられた。私はEL-520Fの説明書( https://jp.sharp/support/e_calc/doc/el520f_mn.pdf )を読み、載っていた様々な計算を試した。シンプソン法で数値積分を計算できることを知ったり、複素数の座標変換、放物運動のシミュレーション、交流回路のインピーダンス計算、様々な物理定数の呼び出しなどをやってみるなどして、知識がどんどんと広がっていった。コンピュータとこのような出会い方をしたことで、私の中には「コンピュータとは科学計算をするためのものである」「コンピュータを使えば、今ここにない現象のことすらもシミュレーションすることができる」という印象が深く刻みつけられた。このイメージは今でも私がコンピュータに対して抱く大きな要素の一つであり続けている。

小学校高学年になると私は中学受験をすることになり、両親の方針で別の塾に移らなくてはならなくなった。お世話になった塾の先生に学問の楽しさを教わることはできなくなってしまったが、その代わりに私の先生になってくれたのは本とインターネットだった。 本は、今まで全く聞いたことのない面白いテーマを教えてくれる媒体だった。今振り返ってみると、当時の私は情報科学やコンピュータ科学に分類されるものを「面白い」と感じることが多かった。ある時は『マーチン・ガードナーの数学ゲームI』(別冊日経サイエンス)という本を読み、セル・オートマトンの一種として有名な「ライフゲーム」を知った。囲碁盤の上に黒い碁石をいくつも並べ、「グライダー」や「Rペントミノ」と名付けられた図形が、単純なルールに従ってどう変化していくのかを手動で観察した。小学校の卒業文集に将来の夢として「ライフゲームの新しい物体を発見すること」と書いたほど熱中した。サイモン・シンの『暗号解読』というノンフィクションもこの時期の愛読書だった。私はこの本で公開鍵暗号共通鍵暗号の概念を知った。本の説明に則ってRSAの暗号化/復号のプロセスを1桁や2桁の小さな数字で実際に計算して、確かに理屈が成り立っていることを確認した時は面白く感じた。 インターネットは、すでに知っている言葉をもとに自分の知識を広げていくための手段として使っていた。私が説明書を見て遊んでいたSHARP関数電卓はあくまでも「計算をするための道具」であって、説明書にも「その計算がどういうものか」が詳しく解説されているわけではない。私は家族のパソコンやタブレット端末を借りて、「インピーダンス」とか「複素数平面」とかのキーワードで検索をかけ、その詳細を学んだ。同時に「他の関数電卓にはどのようなものがあるんだろう」という疑問を持ち、家電量販店で他社の関数電卓のカタログを大量にもらってきたり、世の好事家が運営している関数電卓関係の個人サイトを読んだりするようになった。そのうち、私は「世の中には、とても高機能な関数電卓もいくつか存在すること」「上位機種には数式のグラフを描画する機能や、数値計算のみならず文字式を計算できる『数式処理』という機能があること」「ものによっては、複雑な計算をワンタッチで出来るようにするための『プログラム機能』という機能もあること」を学んだ。そうした機能を有する上位モデルに強い興味を持った私は、クリスマスプレゼントや誕生日プレゼントで「HP 50g」や「TI-Nspire CAS」という高機能な関数電卓を貰った。これらのモデルには英語のマニュアルが付属していたが、当時の私は英語を読めなかった。そのため私はインターネット上をくまなく検索し、同じシリーズの関数電卓について解説された日本語・英語の記事を数百個は読み漁り、英語の記事はGoogle翻訳を使って読み解いていった。ひとつひとつのウェブサイトから自分が読み解けた内容はわずかだったが、それらの情報を自分なりに組み合わせ、関数電卓の仕様の知識を自力で開拓していった。使い方が少しずつ分かってくると、ネット情報の見様見真似でフィボナッチ数列再帰で実装してみたり、時系列信号の高速フーリエ変換を計算して周波数領域の成分が得られることを確かめたりした。この時書いた関数電卓用のプログラムの一部は https://github.com/stepney141/HP50g-works で公開している。

紆余曲折の末、私はご縁あって某中高一貫校に入学した。進学すると、「関数電卓で計算する」という前提のもとで私の興味分野はさらに広がった。「昔のアメリカでは関数電卓を叩いて人工衛星の軌道計算をしていた」という話をインターネットで見て、天体の軌道計算の方法にも興味を持った。『天体の位置計算』(地人書館)という本を読んで「惑星の位置はケプラー方程式という式を使って計算できる」ということを知り、ニュートン法でその近似解を計算する方法をネットで勉強したりした。また、中学の図書室で読んだ『ウォール街の物理学者』という本では、「金融市場では『デリバティブ』と呼ばれる資産が取引されていて、その価格はブラックショールズ方程式という偏微分方程式で説明できる。この方程式の解析解を使ってオプション価格を計算できる」という話を知った。自分でもその計算をやってみようとオプション価格のデータを集めようとした。しかし当時の私は金融商品の概念を理解しておらず、ただ新聞の株価欄を見て首をひねるだけで、実際のオプション価格を計算するまでには至れなかった。中学三年生の時、ウィキペディアで、地球の気象現象は「プリミティブ方程式」という偏微分方程式に従って動いていることや、現代の天気予報はこの方程式を数値的に解くことで実現されていることを知った(「数値予報」と呼ばれる技術である)。私はこれを関数電卓で実現することに興味を持ち、様々な資料を読み漁った。そして日本気象学会の研究報告に載っていたFORTRANの数値シミュレーションコードを、関数電卓用の専用プログラミング言語「RPL」に移植し、実際に24時間後の気圧予測値を計算することに成功した。私の学校には「卒業研究」という中学3年生の1年間をかけた自由研究の授業があり、私はこの「関数電卓を使った天気予報」をテーマに選び、レポートに書いて提出した。このレポートは https://stepney141.hatenablog.com/entry/2020/05/27/071742 で公開している。

なお、この頃の私にとって、パソコンや携帯電話は「インターネットに接続するためのデバイス」という認識であり、これも計算に使われているのだという認識はほぼなかった。当時の私の中では、あくまでも「関数電卓こそコンピュータ」だったのだ。中学2年生の時、友達の誘いで「コンピュータ部」という部活動に入った。この部では、Hot Soup Processorというインタプリタ言語を用いてゲームを作ることを主な活動としていた。これを見て初めて私は「パソコンでもプログラミングをすることが出来る」という事実に気がついたのだが、私はあくまで関数電卓に夢中になっていたため、パソコンでゲームを作ることはしなかった。その一方、学校の図書室に置かれていたC言語Javaの入門書を読み、自分なりにプログラミングの知識を広げてはいた。 私がパソコンで開発をするようになったのは高校2年生の時である。学園祭の広報委員の仕事をすることになった私は、「広報委員会唯一のコンピュータ部員だから」という理由で、学園祭の公式サイトの制作を任されることになった。当時の私はWebサイトの制作など全く経験がなく、HTMLもCSSJavaScriptも書いたことがなかった。私は学校の図書室でHTMLとCSSによるホームページ制作入門の本を借り、必死にホームページ制作の基礎を学んだ。そしてインターネットの情報も探し、「リッチなウェブサイトにはJavaScriptが必要である」「CSSフレームワークを使えば簡単にきれいなサイトが作れる」という知識を得た。また、他の中高一貫校の学園祭公式サイトのソースコードを開発者ツールで見て、どのようなツールを使っているのか、どのようにHTMLやCSSを書けばいいのかというコーディング作法のヒントを学んだりもした。また、クライアントとも言える実行委員会からは「今やっているイベントステージの情報や軽食の販売状況を公式サイト上で動的に表示させたい」というオーダーも受けたため、プログラミングの心得があった他の広報担当者の手を借りて、そのような機能をPHPで実装した。最終的にはBootstrapというCSSフレームワークを活用し、全く知識のない状態から数ヶ月で公式サイトを仕上げることに成功し、来場者や実行委員会からも好評を得ることができた。実際に作った公式サイトのソースコードは、学園祭実行委員会の許可を得て https://github.com/stepney141/kigyoku2017 で公開している。この出来事を通して、私はパソコンでのWeb開発にも興味を持つようになった。この学園祭と同時期に、私の学校のコンピュータ部は、首都圏の様々な高校のコンピュータ部の人たちが交流する「CombNaf」というイベントに招かれた。当時副部長をしていた私は、部を代表してこのイベントに参加し、そこで他校のコンピュータ部の人たちがパソコンを使って非常に面白い開発をたくさんしていることを知った。私はこのイベントのLTセッションにも参加して、関数電卓プログラミングの基礎内容について発表し、非常な好評を得た。 これらの出来事をきっかけに「パソコン上で関数電卓のプログラムを開発する」というクロス開発にも興味を持った私は、他のユーザが開発・公開している関数電卓用のSDKを導入するため、WindowsCygwinを導入した。しかし想定通りの挙動をしなかったため、Ubuntuをパソコン上で直接動かすことにし、Windows7とのデュアルブート環境を構築した。これ以降私はLinux環境に親しむようになり、現在はLinuxデスクトップを普段から常用している。

大学入学後、私は2つの体験によってゲームAI・ゲーム情報学に興味を持った。体験の1つ目は、世界最大の盤上遊戯大局将棋」を対局したことである。私は大局将棋のネット対局サイトの存在を知り、知人とのオンライン対局を試みた。しかし、ゲームの規模があまりに巨大なためにゲームの展開が遅く、先方が飽きてしまったため、結局十数手しか指せずに終わってしまった。この経験で、私は「計算機ならば飽きずに相手をしてもらえる」と考えるようになり、ゲームAI分野や強化学習技術に興味を持つようになった。体験の2つ目は、様々な盤上遊戯の存在と、それらを上手くプレイするゲームAIの実現の難しさを知ったことである。私は大局将棋について調べるうちに、かつての日本では現在の将棋とは異なる様々な古将棋が遊ばれていたことや、世界では古今東西で莫大な数のボードゲームが遊ばれていたことを知った。例えばチェスという一見ごくありふれたゲームを一つ取っても、歴史的変種や現代に生まれたフェアリールールが数多く存在するのである。このような盤上遊戯の世界の多様さ・奥深さを知った私は、「廃れたゲーム・競技人口の少ないゲームを計算機に上手くプレイさせたい」という考えを持つようになった。こうした経緯から、盤上遊戯の変遷を定量的に分析する研究アプローチや、汎用的なゲームAIを目指す「General Game Playing」という人工知能研究の一分野に興味を抱くようになった。

こうした興味がきっかけとなって、自分は「Dagaz」というJavaScript製のボードゲームエンジン(https://dagazproject.github.io/)の開発に参加するようになった。Dagazは、将棋・チェス・囲碁・オセロなどといった様々なボードゲームをCPU対戦可能なWebアプリとして実装することを支援するフレームワークである。具体的な使い方は「専用のDSLでゲームのルールを書き、盤や駒のがぞファイルと共にJava製の変換ツールに通すと、ボードゲームWebアプリの雛形となるHTMLファイルとJavaScriptコードの組が生成される。もしもDSL単体では記述しきれないような複雑なルールがあるならば、生成されたJavaScriptに自分で手を入れてWebアプリを完成させる」というものになっている。自分は現在このソフトウェアのリファクタリング・高速化・ドキュメントの整備を担当しており、それを通じて様々な開発経験を積むことができている(詳細は後述する)。Dagazは非常に幅広いボードゲームを素早く開発できるとても便利なツールなのだが、それと同時に様々な問題点を持っている。その問題点の多くは、Dagazの考案者(現メンテナ)が現代的なJavaScript開発に不慣れであったことに起因している。問題点の具体的な例を挙げると「ボードゲームのルールの書き方が非直感的である」「ソースコードがES5時代のレガシーなJavaScriptで書かれており、Underscore.jsを至るところで使っているなど、ES2015以降の時代から見ると非常に回りくどい実装の仕方をしている」「リポジトリにCI環境もテストコードもnpm scriptsも整備されておらず、開発環境が現代的なJavaScript開発の水準に追いついていない」「ユーザー向けのドキュメントがほぼ整備されていない」「Model部分とView部分が密結合しており、Reactを始めとするView部分のフレームワークに一切対応していない」などが挙げられる。これらの様々な問題を解消したメジャーバージョンを開発することが、自分が主に担当している役割である。

私がDagazの開発に参加するようになったきっかけは、次のようなものである:大局将棋を実装するのに活用できそうな情報をインターネットで調査していた時、検索エンジンでたまたまDagazのGitHubリポジトリを見つけ、これを使えば大局将棋を実装できそうだと考えて使い方の質問のIssueを送った。しかし開発者から「自分にはドキュメントを書く時間がないのだが、メールを送ってくれればサポートできる」という返事をもらったのである。そこで自分は開発者とメールのやり取りをし、ソースコードを読み解きながら、Dagazの開発に参加して自分の目的に合うように機能を追加することにした。開発に参加する上で難関だったのは、当時のDagazにはドキュメントどころかソースコード内のコメントすらほとんど存在せず、手がかりになるような情報が開発者の書いたロシア語の技術記事しかなかったことである。ブラウザの開発者ツールを使い、Dagazで実装されたボードゲームWebアプリの挙動を少しずつ追ったり、ロシア語母語話者の開発者とお互いにとって不慣れな英語で少しずつやり取りを重ねるなどして、一歩一歩動作や使い方を学んでいった。また、DagazのGitHubリポジトリには長らくREADMEすらも存在しなかった。そこで、開発者がDagazについて述べている様々な技術ブログ記事を集め、それらの記述やメールのやり取りを元にREADME.mdを執筆するという作業も自分で行った。自分はこうした経験から、「ソフトウェアを他の開発者に使ってもらいやすいような状態に保つこと」「ソフトウェアのドキュメントをしっかりと整備すること」の重要を痛いほどに学んだ。また、Dagazのような任意のボードゲームを取り扱うコンピュータプログラムの開発は「General Game Playing」という人工知能研究の一分野になっている。そのため、先行する学術研究や様々なボードゲームAIからDagazの開発のヒントになる情報が見つかるかもしれないと考え、様々な英語論文を読み解いたり、自分にとってはあまり馴染みのないC/C++で実装されたソフトウェアのソースコードを読むなどして、得られた学びをDagazのソースコードに落とし込むことも行っている。私は、Dagazに関しては複数の記事を執筆している。そちらもご参照いただければ幸いである:

さらに、セキュリティキャンプ全国大会2022では「ハードウェア魔改造ゼミ」に参加した。このコースでは、フロントエンドのプログラミングから電子工作まで、「様々な技術を自分で触り、それを互いに組み合わせることで一つの物を作る」という体験をした。これを経て気付かされたのは「現代のプロダクトは、抽象的な高レイヤ層から工学的な低レイヤ層まで、幅広い技術が膨大な単位で集まった上で、それらが互いに組み合わさることによって動いている」ということだった。人はともすれば「自分の専門分野」「自分が今知っている技術」だけに閉じこもってしまいがちな生き物だが、それでは様々な技術を投入されて精巧に作り上げられている現代のプロダクトについて学んだり、遊んだり、それこそ攻撃に備えたりするためには支障が生じる。また、現代のプロダクトは様々なレイヤ層の幅広い技術を組み合わせて作られている以上、自分で何か新規性のあるプロダクトを作るには、それを構成する要素となる各レイヤについて自分自身が手の動かし方を心得ておく必要がある。これは既存のプロダクトをリバースエンジニアリングしてその上に自分なりの改造を施すにせよ、自分で一から設計してプロダクトを作るにせよ、どちらにしても変わらないことである。むしろ前者の方が、他者が設計したものをゼロから読み解く必要がある以上、各レイヤに通じておく必要性もより強くなると言えるかもしれない。このセキュキャン講義を通じて、私は「全ての技術レイヤに自分で触れて、技術と技術がどう組み合わされて実用されているのかを知っておくこと」の重要性を学んだ。同時に「様々なIT技術を縦横無尽に活用して一つのハードウェアを作る」という初めての体験を大いに楽しむことが出来た。

参加できた場合に私がセキュリティ・ネクストキャンプへ期待することは、何よりも「情熱ある仲間たちと交流を深めつつ、一つの課題に楽しんで取り組む」という体験を積むことである。私はかつて幸運にも素晴らしい先生に巡り合うことができ、色々なキーワードを与えて頂いた。そしてそのキーワードをもとにして知のネットワークを辿っては、それまで自分の知らなかったことを知っていく、という営みを反復深化法的に繰り返してきた。しかしこれまでの私の人生を振り返ってみると、その営みは基本的に私一人だけしか学び手のいない空間であったことに気づいた。ご縁があって、私はSNS上でたくさんの理工系・情報系の人と交流させて頂けている。しかし、残念なことにどの方々ともインターネットという大きな塀に隔絶されており、「好き」という感情や情熱を心から共有できていると言える仲間と共に学び合うことができていない。私は、セキュリティ・ネクストキャンプで「自分と同じ方向を向いて同じ情熱を燃やしている人たちと対面の空間で出会い、面白い話題を一緒に交換し合う」という体験を得たいのである。

課題への姿勢に関する問い

自身で何らかの技術的な疑問を設定し,その疑問を解決しようと取り組み,その過程を示すことで,自身の技術力や課題に取り組むやりかたを説明してください. (疑問の例:実行ファイルはどのような構造になっているのだろう? pingコマンドを実行すると何が起きるんだろう? オンラインゲームはどうやって通信対戦を実現しているのだろう? といったようなことです) 設定する疑問は何でも構いませんし,解決しなくても構いません. 解決できたかどうかではなく,いかに課題に取り組むかという点を評価します.

「自身の技術力や課題に取り組むやりかた」の例として、Dagazに対する自分の大きな貢献の一つである「指し手生成の高速化」について大まかに述べる。 JavaScriptの代表的な処理系であるV8は、様々な仕組みを用いてJSコードの最適化を行っている。自分はその中でも"Inline Caches"・"Hidden Class"という概念を用いた最適化(詳しくは https://qiita.com/keiya01/items/4e7d0fb104524cdebc89 などを参照)に着目した。 大まかに述べると、V8には「オブジェクトに対して動的に値を追加・削除していて、プロパティが頻繁に変更されているようなコードは処理が遅くなる」という特徴がある。しかし、当時のDagazのコードでは、コンストラクタ以外でのクラスのメンバの追加や、deleteによるオブジェクトプロパティの動的な削除を非常に頻繁に行う設計になっていた。自分は「これらの問題を解消すればV8に最適化してもらいやすくなり、定数倍の高速化に繋がるのではないか」と考えて、これを達成するための改修を行うことにした。 Dagazに限らず、ボードゲームに関するアプリケーションは普通のアプリケーションに比べて徹底した高速化・最適化が重要になる。なぜなら、より短い時間で多くの指し手を計算できれば、その分だけコンピュータが検討できる戦略が増え、CPU思考ルーチンの棋力の向上に繋がるからである。同時にソフトウェア全体のパフォーマンスの改善、ひいてはユーザビリティの向上も期待できる。 Dagazは任意のボードゲームを取り扱うことを目指して設計されているが、今回の高速化作業にあたってはチェスを実行した際のベンチマークスコアを計測することにした。これは、チェスは古くからAIの開発が行われているゲームであることから、様々な言語での実装・様々な環境でのベンチマークスコア・ゲーム自体の理論的解析情報といった先人の資産が非常に充実しており、現状のDagazのパフォーマンスと比較・検討する上で参考にできるデータが非常に多かったからである。パフォーマンス計測にあたっては、コンピュータチェスAIで一般的な "Perft" という手法を用いることにした。これは、ゲームの初期状態から数手先までの、ルール上許されている全ての指し手を生成し終えるまでにかかる時間を計測するという方法である。実際に計測してみると、改修前の時点で4手先までの指し手(=Perft 4、合計197,281手)を生成するのに9.4秒もの時間がかかっていた。 その後、「コンストラクタ以外でのクラスのメンバの追加」「deleteによるオブジェクトプロパティの動的な削除」をしている箇所を除去した結果、同じく197,281個の指し手の生成がわずか2.3秒で完了するようになった。一般的なボードゲームAIは、将棋ソフトなら将棋というゲームの性質を、チェスソフトならチェスというゲームの性質を存分に利用し、CPU命令やメモリアクセスの性能も加味した極限までの最適化を行っている。しかしDagazのような任意のボードゲームに対して設計されている抽象的なプログラムでは、そのようなゲームの性質を活用した最適化は原理的に不可能である。こうした難題を乗り越えつつどのようにすればDagazをよりよいソフトウェアにすることが出来るか考えることは、現在の自分にとって最も楽しい開発体験である。

また別の一例として、私がセキュリティキャンプ全国大会2022の講義で遭遇した「電気回路が想定通りに動かない」という問題と、その時の私の感想を挙げる。 具体的な当時のログは、私が書いた以下の記事の「電気回路との戦い・序」〜「電気回路との戦い・急」の節をご参照頂きたい。 https://stepney141.hatenablog.com/entry/2022/08/29/124409#%E9%9B%BB%E6%B0%97%E5%9B%9E%E8%B7%AF%E3%81%A8%E3%81%AE%E6%88%A6%E3%81%84%E5%BA%8F この体験は、「自身の技術力や課題に取り組むやりかた」について、私が大きく反省をした体験でもあった。上述の記事から当時の私の反省を引用する。 『電気回路を組む上では「上手なハンダ付けの仕方」のような専門的技能も非常に重要ですが、それ以上に大事と感じたのは「なぜコンデンサをここに入れるのか」「回路が動かない時、どういう方向に思考を働かせて、どういう風に原因を切り分けたら良いのか」といった『その分野の思考法に関する知識』です。頭の使い方・手探りの仕方・これの何が嬉しいのか...といった「お気持ち」を会得することが、新しい技術を学ぶ上で重要であると感じました。 考えてみれば至極当然のことなのですが、やったことのない分野に改めて入門してみるということをしばらくしていないと、「お気持ち」の重要性を忘れてしまうようです。』 『電子工作の中で自分が今回詰まったポイントとして、例えば「基板にターミナルブロックやピンヘッダをハンダ付けする必要があることを知らなかった」という点があります。 しかしこれも「ブレッドボードや基板の端子がどのようにして通電しているのか」をちゃんと調べながら演繹していれば「端子とブレッドボードを接続するために、ピンヘッダやターミナルブロックをハンダ付けする必要がある」ということをすぐに導き出せていたはずです。』 現在の私は、このときの学びをもとに、「技術の仕組みをしっかり知って、動かない理屈を自分の頭で演繹する」ということを大事にしている。

興味ある分野に関する問い

セキュリティ・キャンプ ネクストの講義の一覧を見て,その中から興味のある講義を選び,その講義で扱うテーマに対して自分が考えること,興味,疑問,課題,自分なりの考察などを説明してください. その分野について知識があるかどうかではなく,いかに興味や疑問を持ち,課題を考え,自分なりに調べて考察するかといった点を評価します.

講義の概要だけを見た限りでは、特に、以下の2つの講義に興味を惹かれた。

「ハードウェア再現実装で学ぶアーキテクチャ解析」

講義説明には「コンピュータシステムをFPGA基板で実際に再現する」と書かれているが、私の現在の知識ではこれがどういうことなのかよく理解できていない。CPUをFPGA上に実装するというのなら分かるが、「コンピュータシステム」という言葉を使っていることにはどのような意味があるのだろうか。SoC(System-on-a-chip)をFPGA上に実装するということなのだろうか。いや、最初のプロセスが「コンピュータシステムをソフトウェアモデルとして再現」であるという以上、SoCとはまた別の概念であろう。SoCの実装にそのような抽象化が必要だとは考えにくい気がするからだ。いずれにせよ、まだ講義内容のイメージこそあまりついてはいないが、本来であれば様々な技術要素を複合的に組み合わせて作られているものであるはずのコンピュータシステムを、1枚のFPGA上で、ソフトウェア的な抽象化のプロセスを経て再現するというのは面白そうである。私は関数電卓に対して、「手のひらの中に収まる筐体だけで様々な計算ができること」に魅力を感じている。講義内容を読んでいてその感覚を思い出し、大変わくわくした。 かつてヒューレット・パッカード社の関数電卓に使われていた「HP Saturn」というCPUがある。HP Saturnを採用したHP関数電卓は、HP Saturn上で動作する機械語コンパイルされるHP内製の専用の高級言語を搭載している。中学時代の私は一時期、HP Saturnを自分で実装して自前の関数電卓を作ることが出来ないか?と試行錯誤していたことがあった。当時の私は関数電卓上で動作するプログラムを書くことに熱中していたので、そうした「関数電卓自作」の方面まで踏み出すことはなかった。しかし今なら、この講義をヒントにすればそれを数年越しに実現出来るかもしれない、という感情が湧いてきた。

C++ ライブラリ開発」

Dagazの開発を通じて私が深く実感していることとして、「ライブラリ/フレームワークのコードは、普通のアプリケーションとは違った書き方が求められる」という点が挙げられる。「可読性とユーザーフレンドリーな設計を兼ね備えた高性能ライブラリを開発する方法」について学ぶというこの講義は、実際にDagazというフレームワークを作っている者として非常に興味をそそられるテーマである。「C++言語の進化と、そのライブラリ設計への影響」というのも、ES5で書かれた古いコードを最新の言語仕様に準拠させて書き換えた経験を持つ私にとっては、非常に共感できるところだ。『プログラミング言語の仕様は、それを使うプログラマ側がどのような思考を巡らせてコードを書くのかをも規定してしまう』というのが、その経験によって得た私の考えである。さらに、「どのようなコードをユーザーに書かせたいか」を重視するというのも私の問題意識にとてもマッチしている。Dagazでゲームのルールを記述する際には、Dagazが提供する内部DSLを使用する。我々開発者側は、Dagazをプログラミングに必ずしも詳しくないボードゲーム愛好家にも使ってもらいたいと思っている。当然、内部DSLは可能な限り読みやすく書きやすいものであることが望ましい。しかし、JavaScriptの言語機能の枠をはみ出さず、なおかつ読みやすく書きやすいDSLとはどういう形をしていればいいのかが中々見えていないのが現状だ。この講義でDSLを扱うかは分からないが、講義概要を拝見して、私の抱える問題意識と何かしら共通するものがあると強く感じている。

その他に関する問い

その他,アピールしたい点などあれば自由記述で回答してください.

「あなたに関する問い」の箇所でも説明させて頂いたように、私は「こういったものを作りたい」という興味・関心を原動力に、それまで自分にとって全くの未知だった巨大な分野に飛び込んで成果や貢献を出してきた。この文章では主にコンピュータに関する私の経験について述べてきたが、私のWebサイト(https://stepney141.github.io/)に記載している「興味のある分野」の項をご覧いただければわかる通り、自分はソフトウェア開発についてもそれ以外の分野についても、ここに書ききれない非常に広範な興味を持っている。自分であれば、どの講義についても根っからの深い興味を持って、楽しんで開発経験を積ませて頂けると確信している。


感想

セキュキャン全国大会の課題と比べると、ネクストの選考は根本的に問われていることが違うなと感じました。全国大会の選考は「与えられた専門的課題にちゃんと思考して取り組めるか」を見られている感じがしますが、ネクストでは「お前という人間は何を為してきたか」「お前はネクストを受けるに値する人間であるのか」について問われている感じがします。1問目など、要は自分語りを求められているわけですからね。 全国大会とネクストの違いは、ネクストキャンプ公式サイトを見るともっとはっきり分かります。

ネクストキャンプ公式サイト トップページより

セキュリティ・キャンプでは高度セキュリティ人材の発掘と育成を今まで行ってきていますが、人材不足の根本解決のためには各分野のIT基盤の根幹からセキュリティ対策を講じ、結果的に社会全体のインシデント発生を抑える必要があります。 そこで、広範囲な分野を深く理解し対応できるフルスタック・エンジニアと呼ばれる人材、新たな攻撃をいち早く見つけ、理解し、対応できるトップオブトップの人材、各分野の基盤から根本的な対策を講ずるために新たな価値を生み出し、多くの人や技術を巻き込んで活躍する人材の発掘と育成の必要があります。

選考のポイント」より

セキュリティ・キャンプ ネクストでは、広範囲な分野を深く理解し、新たな攻撃をいち早く見つけ、理解し、基盤から根本的な対策を講ずるために新たな価値を生み出していけるトップオブトップの人材、フルスタック・エンジニアと呼ばれる人材を発掘・育成することを目的とします。 またその修了後には、既存の受け皿に納まるのではなく、多くの人や技術を巻き込んで活躍することを期待しています。 このため自身の技術力だけでなく、新たな技術や未知の分野に抵抗感無く踏み出せるか、新たな発想や価値観を生み出せる素養があるか、といった点を評価します。 課題に対する回答の正否でなく、そうした点を見て総合的に判断します。

選考終了にあたり、竹田主査から次回のセキュリティ・ネクストキャンプを目指す方へのメッセージ」より

今回、ネクストキャンプへの選考では残念ながらマッチしなかった方の中でも、全国大会やミニキャンプを経てキャンプネクストに参加すれば十二分に楽しめるのではないか?と感じる方は多かったです。(中略) ネクストキャンプでは分野にとらわれずみなさんが持っている”得意とすること”、“好きなこと”、”実現したいこと”のさらなる掛け合わせ、拡張、フュージョンの可能性を探り、新たな価値を創造していただくことを期待しています。 そうした「新たな価値を創造すること」をぜひ考えてみてください。 アイデアを思考するだけでなく、自ら手を動かし、モノを作り、発信しましょう。 チームでモノづくりしている方も、チームの中で自分は何に貢献したのかよく振り返ってみてください。 そうした中で、自らが”得意とすること”、“好きなこと”、”実現したいこと”がより洗礼され明確に見えてくると思います。

選考通過者の一覧を見る限りでは、今年のネクストには少なくとも135人のエントリーがあったことが分かります。つまり倍率は少なくとも13.5倍…。拾って頂いたからには背筋を伸ばして、しっかりと学びを得てきたいと思います。