Yの技術ブログ

Yちゃんの技術関連のブログ

セキュリティキャンプ全国大会2019の選考(OS開発ゼミ)を通過した話

えっとまあ、高校入学から1ヶ月、部活に入部したての私のどんな力を見抜いたのかはわかりませんが、(おそらく、自己紹介の時に仮想通貨関連の開発の話をしたあたりでコイツやべーなって思われてたんでしょう)、担任であり部活の顧問でもある先生がセキュリティキャンプを勧めてくれまして、ちょっと興味があったので今の自分がある理由の原点に最も近い「OS開発ゼミ」に応募したところ、一発で受かってしまうというかなり驚く状況になりました...。(勧めてくれた先生自身もかなり驚いていました。)
なんか、応募課題の回答を晒すのがお決まり(?)らしいので晒してみようかなと。自分の回答は全然優れてないですが...。

  • 共通問題A
    我々講師は、普段いくつかのOSを使っていますが、使い込むうちに色々な発見をします。
    皆さんもきっとそういう体験があると思います。
    あなたが普段使っているOSで、好きな機能と改善してほしい部分について、思いのたけを聞かせてください。
    この問では、皆さんが普段どの程度興味を持って既存OSを観察しているかを評価します。

  • 私の回答
    私は、主にPCでWindowsUbuntuを、スマートフォンAndroidをよく使います。
    Windowsはおそらく一番長い期間使っていると思います。
    私が小学三年生のころ、Windows XPを使い始めて以来、Vista、7、8.1を経て、現在は最新の機能を使いたいがためにWindows 10 Insider Previewを使うまでになりました。
    その一例がWSL2(Windows Subsystem for Linux 2)です。
    普段、Windowsしか使わない私は、Ubuntuを使おうと思うとデュアルブート環境を構築するか、仮想マシンを構築します。
    しかし、デュアルブートだとWindowsでしたい作業をしながらUbuntuでプログラムのコンパイルを行う等の同時作業が出来ません。
    仮想マシンであれば、ホストコンピュータのハードウェアを用いるためにPCの動作が重たくなることがあります。
    このような事態は私にとってあまり都合がよくありません。効率が悪いからです。
    そんなとき、現行のWSLという機能が登場しました。
    これは私にとってとても画期的であり、すごくありがたいものでした。
    現在ではWindows側でGUI Gitクライアントを用いて開発し、WSL内のUbuntuでプログラムのコンパイルを即時に行う等の効率の良い作業が出来ています。
    しかし、WSLには様々な欠点があり、自分の欲を満たせない部分がありました。
    Linuxのsystemdが使えなかったり、dockerを実行できなかったり、そもそも実行速度があまり早くなかったりと、様々な問題を抱えています。
    WSL2はこれらの問題を解決しているというのです。
    自分の今までの不満が無くなれば、もっと色んなことが出来ます。
    Windowsで出来ることが広まれば自分の出来ることも増えると思っているのでとても楽しみな機能の一つです。
    私は新たな機能を知るとすぐに試してみるタイプなのでWindows Insider Previewに登録していますが、一方で古いままの方がいいと言う部分もあります。
    その一例がUbuntuです。私は今まで様々なバージョンのUbuntuを触ってきました。
    新しいバージョンであるほど優秀な機能が使えるのはWindowsと同じく一目瞭然でしょう。
    しかし、Ubuntuに関しては16.04 LTSにこだわっていていますが、理由はいたってシンプル、使いやすいからです。
    バージョンによって標準でインストールされるパッケージが違うUbuntuは、16.04が様々なソフトウェアなどをコンパイルする上で最も適していると考えます。
    これはただ単にネット上で情報量が多いというのが大きいです。何らかのエラーが出た時などに対処しやすいのが16.04です。
    さて、Ubuntuを触る経緯となったのはAndroid OSのビルドです。
    Androidは今まで未公開分や現在のDeveloper Preview(Android Q)も合わせて、大きくわけて17ものバージョンが存在します。
    特に日常的に使うスマホは、OS機能の進化のスピードがとても早く、その上一つの機能がとても優れています。
    これらの優れた機能をいち早く使おうと、Androidのビルドを始めたのがプログラミングを始めることとなった一つのきっかけです。
    そんなAndroidの中で好きな機能があります、Android 7で解禁されたマルチウィンドウです。 複数のウィンドウを開いて同時に見ることなど、PCでは容易です。しかし、今までのAndroidではそうは行きませんでした。
    動画を見ながらSNSをする、というようなことが可能になったという点ですごく魅力的な機能でした。
    PCでは当たり前のように出来ていたことがスマートフォンで出来るようになったというだけなのにとても感動的でした。
    最後に、OSだけで自分自身が体験できることは大きく変わってくると思います。
    もっと様々なOSに触れ合うことで私の人生は大きく揺らぐかもしれません。

  • 共通問題B
    皆さんが仮にOSを作るとしたら、「どんなOS(やOSの機能)を作ってみたい」でしょうか?
    (既にOSを作った事がある人は、その特徴を書いてくれても構いません。)
    そして、なぜそれを作ってみたいと思ったのでしょうか?
    皆さんが心の中で夢描いているであろう、ワクワクするようなOS像を教えてください。
    ※「Linux開発者を目指そう!」テーマを受講したいと思っている方は「どんなLinuxカーネルの機能を作ってみたいか」を答えてください。
    ※「Raspberry Pi向け組み込みOSを作ろう!」テーマを受講したいと思っている方は「どんな組み込みシステムを作ってみたいか」を答えてください。

  • 私の回答 (どんなLinuxカーネルの機能を作ってみたいかについて回答しました)
    私がLinuxカーネルにつけてみたい機能は2つあります。
    1つ目はユーザーごとにアクセスできる機能を制限する機能です。
    管理者権限を与えなかったり、ファイル操作権限等を弄ったりすれば、出来ることはかなり制限されます。
    それ以上に管理者権限が無くてもできることを細かく制限できれば、誤って何かをやらかしてしまうリスクは格段に低くなると思います。
    もう1つはカーネルで実装できることかはわからないですが、手軽なシステムの復元機能です。
    Windowsでは、システムの復元等において膨大なデータをバックアップし、それを修復する際などに上書きして修復しています。
    以前、PCのHDD容量のバーが赤くなってるから直してくれと言われたことがあり、見てみるとWindowsが自動的にバックアップを行っているものが蓄積されていました。
    バックアップを定期的にとることは非常に重要であり、ユーザーデータやシステムの保護につながります。
    しかし、定期的に行っているとどうしてもディスク空き容量がどんどん少なくなっていきます。
    これを防ぐために、システムの復元を行うために必要な、変更が加えられたシステムファイル一覧を定期的に作成し、万が一システムが破損した場合などはLiveCD等を用いて復元する機能を実装してみたいと思いました。

  • 共通問題C
    OSを実装する上で基礎となるC言語の力を見る問題です。

  • 1, C言語で双方向リンクリストとそれを操作する関数を作り、ソースコードを提出してください。
    リンクリストを生成する関数、要素を任意の場所に挿入する関数、全ての要素を順に標準出力に印字する関数、の3つがあれば十分です。
    やる気があればもっとたくさんの機能を実装しても構いません!

  • 私の回答(見やすいようにgistに置きました)

  • 2, 設計・実装で工夫した点を述べてください。

  • 私の回答
    最初、このプログラムは構造体を知るためにサンプルコードを見ながら書いた片方向線リストでした。
    自分の手で双方向リンクリストに修正しました。
    まず、どうすればいいのかを探るために、ネットで調べた双方向リンクリストの仕組みを調べながらとりあえず組み立てていきました。
    デバッグのために一覧表示の部分にprintf関数でアドレスを表示させ、何かミスがあればすぐにわかる形にしていきました。
    デバッグ機能を使いながらも、とりあえず形にした結果、300行を超すコードとなり、とても見にくい状態でした。
    なんとかもう少しでいいから見やすい形にできないかと思い、同じ処理をしている部分を一つの関数にまとめ、違う部分はそれぞれの関数ごとに処理させました。
    最後、選んだデータの前にデータを挿入する関数で、選んだデータの前の前に挿入される不具合を見つけたので、before = 0に戻し、対策を講じました。

  • 選択問題S3 テーマ「Linux開発者を目指そう!」(武内講師) Linuxカーネルについて知りたいこと、それについてこれまで調べたこと、
    つまづいたことを教えてください。最終的に解決しなかったとしてもOKです。 技術力が優れているかではなく、どれだけ試行錯誤したかという観点で採点をします。 「この機能のこのコードの意味がわからなかった」という高度なものでもいいですし、 「そもそも何から手を付けていいのかもわからなかった」というものでも構いません。

  • 私の回答
    私がLinuxを開発する、と言える機会はほんの一部しかなく、Android端末向けにAndroid Open Source Projectや、その派生で様々な便利な機能を追加しているLineage OSやAndroid Ice Cold Projectなどのビルドを行うぐらいでしかありません。
    私がこれを始めた時は中二だったのですが、何をやってるかすら理解しておらず、ネットの情報にただただ従ってやっているだけのことでした。
    最初のうちはビルドに失敗したことの何が原因なのかすらわかっておらず、これは途中で手順を間違えたんだと、そう思ってやめてしまっていました。
    今の私があるのはLinux系OSをビルドするということがあって、理解できないことを理解したいと思い始めたということがあったからです。
    今でこそ、ある程度の知識が身についてきたのでGitHubでメインやサブで使っている端末向けのカーネルソースコードのコミットを眺めて何がどう変わっているのかだとかはある程度わかるようになってきましたが、すべてを独学で理解するのは難しいと判断したので、このゼミを希望しました。

  • 共通問題D
    その他、書ききれなかったことを好きなだけ書いてください。

  • 私の回答
    私は今、ブロックチェーン技術に惹かれて、仮想通貨や、その周辺ソフトウェアの開発をしています。
    自分が仮想通貨に出会ったのは1年半ほど前、Androidのビルド用に組み立てたPCの使ってない間のリソースがもったいないからと、マイニングというブロックチェーンを支えて報酬を得るということに興味を持ち始めたことがきっかけでした。
    当時大した技術もなく、Androidのビルドに失敗し続けて飽きたところ、たまたまネットの中のいいひとがマイニングをしているということを知り、自分も興味を持ってとりあえずやってみました。
    仮想通貨といえば私の中には悪い印象しかなかったのですが、これを期にどんどん印象が変わっていき、仮想通貨って面白い、ブロックチェーンって面白い、と思うようになりました。
    そこで、更に仮想通貨やその周辺ソフトウェアの開発に携わっている人との出会いがあり、今度は開発に興味を持ち始めました。
    自分も開発をやってみたい、と思い始めて技術を手に入れたいと思うようになりました。
    ここまで来たのは、すべてAndroidをビルドしようとしたところが原点です。
    セキュリティキャンプを知って、今やってることもいいけども、私が技術や開発に興味を持ち始めたきっかけであるAndroidLinuxの開発を、真剣にもう一度やってみたいと思うようになりました。
    今の私がある理由の原点に帰って、もう一度手を付けてみたい、それが今回のセキュリティキャンプに応募した最大の理由です。

いかがだったでしょうか、内容がいかにも初心者感満載だったり、同じ内容が繰り返されていたり、課題ごとに文章量の差が大きすぎたりと自分の中ではあまり満足してないのですが、とりあえず受かってよかったと思っています。
因みに、Cの双方向リンクリストの参考にした、片方向線リストのソースコードこちらです。