私のパソコン歴(7) : 小学生~高校生までを振り返って(後編)

今までの投稿で小学生~高校生までの自分のやってきたことを振り返ってきた。 改めて見返すと、自分がなにかを習得するには4つのステップを踏んでいることがわかった。

  1. 学ぶ
  2. 手を動かす
  3. 見てもらう
  4. 教える

これからプログラミングを学ぶ人にとっても、このステップを踏んでいくのは意味のあることだと思っている。 そこで、学んだテーマごとにそれぞれのステップで私がどういうことをやっていたのかを振り返ってみようと思う。 今日は後半。実は3と4までやっているのが思いのほか無くてガッカリしている。

ネットワークの仕組み

学ぶ

座学としては、基本情報技術者試験の勉強でOSI参照モデルを知った。 セキュリティキャンプTCPのシーケンスやフラグなどの踏み込んだ内容を学んだ。 カッコつけてキャンプでもらったネットワークスペシャリストの本も地味に勉強の役に立った。

いまから学ぶなら、『マスタリングTCP/IP入門編』をおすすめする*1

手を動かす

C言語のソケットプログラミングを覚えた後、チャットアプリケーションを作ってパソコン室でクラスメイトとチャットをやった。 Webサーバを書いてみて、実際にブラウザからアクセスできることを知った。 WireSharkでパケットキャプチャを取って、知らない通信を調べたり通信内容を読んでみた。

ネットワークの話は手を動かすことで格段に理解度が増した。

見てもらう

自宅にサーバを置いて、Ubuntuを入れて、Dynamic DNSでサーバを公開してみた。

教える

高3までに教えた記憶はない。

OSの仕組み

学ぶ

勉強会で浴びるように話を聞いていたらなんとなくわかるようになってきた。 あとはTwitterのフォロワーさんや勉強会*2で知り合った人たちに教えてもらったり。

いまから学ぶなら、『[試して理解]Linuxのしくみ』が良い。 https://www.amazon.co.jp/dp/B079YJS1J1/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

手を動かす

課題研究でOSを作ろうとしてコンテキストスイッチまでは実装した。

見てもらう

課題研究で発表した。

教える

課題研究のメンバーに原理を説明した。

セキュリティ

学ぶ

主にセキュリティキャンプで勉強。OS, ネットワーク, アプリケーションといろいろなレイヤに脆弱性の入り込むスキがあることを知った。 また、守るためには攻撃の手法をよく知らないといけないこともよく分かった。

手を動かす

セキュリティキャンプで閉鎖ネットワーク内にて攻撃手法の実践を行った。 バースデーアタックやDNSキャッシュポイズニングやシェルコードによるroot奪取などを体験した。

※法に触れることもあるので皆さんが手を動かすときは法令を理解し正しく学習しましょう

見てもらう

特に活動した記憶はない。

教える

高3までで特に活動した記憶はない。

ソフトウェアを公開する作法

学ぶ

移植性の高いコードの書き方やMakefileDoxygenなどを高校の同級生から教えてもらった。

手を動かす

実際に作ったものを高校の同級生に見てもらった。

見てもらう

実際に作ったものを高校の同級生に見てもらった(繰り返し)。

教える

特に教えた記憶はない。

*1:表紙が素っ気ないが、解説は丁寧

*2:カーネル/VM探検隊

私のパソコン歴(6) : 小学生~高校生までを振り返って(前編)

今までの投稿で小学生~高校生までの自分のやってきたことを振り返ってきた。 改めて見返すと、自分がなにかを習得するには4つのステップをだいたい踏んでいることがわかった。

  1. 学ぶ
  2. 手を動かす
  3. 見てもらう
  4. 教える

これからプログラミングを学ぶ人にとっても、このステップを踏んでいくのは意味のあることだと思っている。 そこで、学んだテーマごとにそれぞれのステップで私がどういうことをやっていたのかを振り返ってみようと思う。 書いていたら内容が思いのほか長くなってしまったので、後半はまた明日。 テーマがMESEではないのでまた今度整理を試みる。

Webページ

学ぶ

主にインターネットに転がっていた情報で勉強。Webサイトを構成するHTMLとCSSを学んだ。 友達をサイト作りに誘ってからは、友達から教えてもらう情報も多くあった。 出来上がる「実体」ではなく「指示書」を触る経験はこのあとのプログラミングを勉強する上で役に立った。

手を動かす

小中学生のときに、しりとりの必勝を取り上げたWebページを作った。 チュートリアル通りのサイトだけでなく、自分の作りたいサイトも同時並行で作っていったのがよかった。 全部分かったつもりでも、やりたいことに当てはめようとすることで分かっていない部分が見つかった。

見てもらう

Webページという特性上、作ったものはほとんど公開した。 無料のレンタルサーバを借りて、実際にインターネットに公開した。 更新するたびに友達にも教えて、新しく覚えたことを共有した。

教える

小中学生のころはほぼ同時スタートだったこともあり、教えるというより学びあうという形だった。 高校の授業でHTMLを扱ったときには、うまく表示されなくて困っているクラスメイトに教えたりもした。

プログラミング言語の文法

学ぶ

いろいろなプログラミング言語を触ったことは、総じて良いことだったと思う。

いろいろな言語の文法を学ぶことで、理解が立体的に深まった。 新しいプログラミング言語を覚えるときには、知っている言語との比較をして、同じ挙動を示すコードを書いた。 知っている言語が増えていくにつれ、加速度的に言語の習得速度も上がっていった。

いろいろな言語の用途を学ぶことで、自分が挑戦できる範囲を広げられた。 プログラミング言語はその実行形態や文法によって用途の向き不向きがある。 システムプログラミングにつかうC言語、かゆいところに手が届くPerl, 大規模なシステム開発に使うJava, Flashを作るのに使うActionScript。 正しい道具の選択で生産性が格段に違うこと、すべてを解決する唯一無二の言語など存在しないことを思い知った。

主に書籍と人から教えてもらうことで勉強した。 書籍はプログラミング言語1つごとに一冊買った。C言語は『独習C』、Javaは『独習Java』、Perlは『初めてのPerl』、Erlangは『プログラミングErlang』を買った。 いまから同じようなことを勉強をしたい人には、Go言語とJavaPythonOCamlを勧める*1。 買った本に書いてあった内容のうち、わからなかったものを友達やTwitterのフォロワーさんに教えてもらった。

手を動かす

Webページのときもそうだったが、学んだ文法の範囲で遊べるだけ遊んだ。 四則演算とキーボードからの入力を覚えたら、解の公式を使うプログラムを書いてみた。

見てもらう

文法を勉強しただけのころは特になにも公開していなかった。

教える

プログラミングの授業が始まったとき、クラスメイトに教える機会を得た。 自分がつまったところは同じようにクラスメイトもつまることが分かった。 また、教えることで理解も進んだ。なんとなく理解してつもりで飛ばしたところを聞かれると、プライドのためにも調べざるを得なかった。

プログラミングに使うツール

学ぶ

テキストエディタバージョン管理システムの使い方を学んだ。

テキストエディタは最初はTeraPadを使っていて、C言語を勉強するタイミングでNotepad++に移った。その後、使えるのがカッコいいという理由だけでVimに移った。 いまから勉強を始める人には、Visual Studio Codeを薦める。

バージョン管理システムはGitを勉強した。 ただし、高3の時点ではcheckoutとcommitとresetとpushしか知らず、セーブポイント的な使い方しかしていなかった。 勉強は大きなアプリケーションを自分でつくるときになってからでも遅くない。

手を動かす

道具なので必然的に手を動かした。

見てもらう

エディタの設定は友達に見せた。

教える

プログラミングの授業で、クラスメイトに副次的に教えていた。

データ構造とアルゴリズム

学ぶ

リスト構造や木構造基本情報技術者試験の勉強で存在自体は知っていた。 高校の愛好会で受けたC言語のe-learningで、連結リストや二分木といった有名なデータ構造の実装方法を勉強して試した。

アルゴリズムは学校の授業と愛好会の活動で学んだ。 マージソートクイックソートといったソートアルゴリズムニュートン法やルンゲクッタ法といった数値計算アルゴリズムは、高校の授業で学んだ。 多角形の面積の求め方や最短経路探索などのアルゴリズムは、愛好会で参加したプログラミングコンテストで学んだ。

手を動かす

リスト構造はメモリ上の概念が分かりにくかったので何度も何度も書いた。授業中に紙に書いたりもして、最終的にはソラで書けるようにまでなった。

見てもらう

あまり実装を見てもらったりはしなかった。すればよかった。

教える

高校の専門授業の定期試験が近づくとクラスメイトに教えたりした。

Unix系OS

学ぶ

高校の授業で初めてVine Linuxを触り、基本的なコマンドやパイプやリダイレクトといった技法を知った。 セキュリティキャンプ参加前に、自分のノートPCにUbuntuデュアルブートさせた*2

いまから初めて触るならUbuntuDebianがいいと思う。 VMware PlayerやVirtualBoxHyper-Vで仮想化するか、Windows Subsystem for Linuxを使うのが良さそう。

手を動かす

高校のパソコン室と教室にVine LinuxのPCがあったので日常的に触っていた。 セキュリティキャンプのときにいろいろなディストリビューションを触った。

見てもらう

特に見てもらった記憶はない。

教える

特に教えた記憶はない。

ライブラリの使い方・作り方

学ぶ

標準ライブラリは、各プログラミング言語の文法を覚える際に合わせて覚えた。細かい使い方はWebページで調べることが多かった。 言語によってその作法が異なるので、それぞれ覚える必要があった。

C言語ライブラリの使い方*3は、高校の友人に教えてもらった。 C言語ライブラリの作り方は高校の愛好会で受けたe-learningで覚えた。別にインターネットにも転がっている内容だと思う。

手を動かす

標準ライブラリを覚えるために短いプログラムはたくさん書いた。 友達の作ったライブラリを使われてもらうこともあった。うまくビルドができず、ソースコードは様々な環境で動くとは限らないことを知った。

見てもらう

これに関してはとくにアクションを起こしていなかった。

教える

特に教えた記憶はない。

CPUの仕組み

学ぶ

勉強したアーキテクチャはPICとMIPSとH8SX。振り返ってみると意外と触っている。

PICは高校の授業でライントレーサーを作るときにやった。 MIPSはCPUの仕組みを知りたいと言ったらTwitterのフォロワーさんに紹介されて学んだ。 H8SXは課題研究でコンテキストスイッチを実装するときに使った。

私が初めて触ったアセンブリは授業で習ったPICマイコンだったが、いまから学ぶならPCに使われるCPUを勉強したほうが良い。 おすすめの本は「コンピュータの構成と設計」。

手を動かす

授業でライントレーサーと作った。 課題研究でコンテキストスイッチを実装した。

見てもらう

課題研究の発表をした。

教える

H8SXのアーキテクチャは、課題研究チームのメンバーに教えた。

*1:C言語で書かれたソフトウェアはいまだに多いので勉強の価値はあるが、文法に罠が多すぎるため初期に触るならGo言語のほうがいい。Perlは歴史が古く、いまはPythonにその役を譲っている。Erlangは用途が特殊すぎてこの時期に勉強するものではなかった

*2:ちなみにインストールに失敗して起動しなくなったこともあった

*3:ビルドの仕方、インストールの仕方、ライブラリを使ったプログラムのコンパイルの仕方

私のパソコン歴(5) : 受験と課題研究

今日は高3の話。明日は大学1年の話。 思い出話と学んだことが混ざっているので、一通り思い出したあとに学んだことについてあとで整理していくことにする。

課題研究

東工大附属高校では、チームを組んで課題に1年間取りくむ「課題研究」というものを3年生になるとやる。 もちろん専門の門戸を叩いて2年程度しか経っていない高校生がやるものなので、別に世紀の大発見とかがあるわけでは(たぶん)ない。 が、その割にはけっこう突っ込んだこともやっていることで地味に有名である。

課題は専門分野の先生たちが持ち寄ってくるものを採用するか、自分たちで設定する。 すぐ動くマイコンのボードの付録のついた雑誌のムック本を先生が見つけてきて、私のいたチームではこの上で動くOSを作ろうということになった。

http://toragi.cqpub.co.jp/Portals/0/support/2010/H8/MTRZ201004l.jpg

振り返ってみると二次記憶装置からブートしてないしそもそもカーネルすらないしでツッコミどころがたくさんあった。 実のところ、私はこれに取りくむまでOSの仕組みをまるっきり分かっていなかった。Twitterで知り合った人たちにOSのしくみを教えてもらったり、実装を見てもらったりもした。

チームでは、マルチタスクとシェルとファイルシステムとウィンドウシステムを手分けして実装をした。 私は主にマルチタスクのところを担当し、Makefileの書き方、CPUのしくみ*1、各種デバイスの制御方法*2 、組込みC言語の制約はここで覚えた。

最終的にはすべてを統合するまで間に合わなかったので、部品単位で成果を発表した。

大学受験

大学受験をする年になって、志望校に設定したのは筑波大学だった。

高2で参加したセキュリティキャンプには、筑波大学の在学生も数多くいた。 AC入試の存在を思い出した私は、これに向けて本格的に準備を始めた。

まず、テーマ決めで悩んだ。AC入試では自分の取りくんだ研究テーマを持ち込む。 課題研究で取り組んでいたOSの話は、当時の自分では説明がしきれないと考えたため避けた。

いろいろ考えた挙句、題材には「しりとり」を取り上げた。理由は簡単で、「誰も答えを知らないもの」かつ「好きなもの」だったからだ。 しりとりの必勝法にしようかとも考えたが、これは簡単すぎた。そこで、できるだけ長く続くしりとりbotを作ることにした。 当時ゲテモノ言語にハマっていた私は、Erlangというプログラミング言語を使ってしりとりのbotを実装した。

*1:スタックポインタやプログラムカウンタや割り込みハンドラとかのレベル

*2:メモリマップドI/Oとかでビット演算しまくり

私のパソコン歴(4) : 芋づる式コミュニティ

昨日の続き。今日は高2くらいまでの話。 明日は高3の話。

セキュリティ&プログラミングキャンプ

ひょんなことから参加したこの合宿イベントは、日本の中でも選りすぐりの優秀な人たちが集まっていた。 自分でOSを作った人、Webサービスを作った人、分散ハッシュテーブルを実装した人、勉強会を主宰している人... この環境下において、ちょっとC言語JavaPerlを触ったくらいでいい気になっていた自分は完全に底辺の存在だった。 事前の準備として、Ubuntuを自分のノートPCに入れたり、先生に個人授業をしてもらったり、 問題特定に役立つ様々なコマンドを覚えたり、パケットキャプチャをしてみたり、・・・とやってはいたが、それでも底辺だった。

自分の実力を思い知った私は、変な見栄を捨て、分からないことはぜんぶ分からないと言うことにした。 もちろん言い出すまでは恥ずかしいが、この姿勢を持つことで色んな人が教えてくれた。

セキュリティクラスの"セキュアなOSをつくろうコース"に入った私は、セキュアOSのしくみとセキュリティについて4泊5日学んだ。 自分は授業で習った程度しかUnix系OSを知らなかったが、講義内容は丁寧だった。

バースデーアタック、SYN flood攻撃、バッファオーバーフロー攻撃、DNSキャッシュポイズニング・・・など 主要な攻撃手法についてよく理解することができたし、その危険性や倫理についてもしっかりと叩き込まれた。 おかげさまで講義が終わるころにはTCP/IPのスタックもだいぶ覚えていた。

講義が終わると、毎晩ホテルの談話室に集まってワイワイ技術トークで盛り上がっていた。 「SMTPは知っているがGmailSSLが必須なのでしゃべったことがない」と私が言うと、 その場でノートPCを取り出してopensslコマンド上でSMTPを喋るのを実演してくれたりもした。

最終日、協賛で献本された本が参加者に分け与えられた。私はここで初めてオライリー本の存在を知った。 ちなみに私がもらったのはネットワークスペシャリスト合格読本とHacker Japan無線LANセキュリティのムック本。 もらった本を読んで知った単語もたくさんあった。

そして別れ。参加者もチューターも講師もみんなTwitterをやっていたので、私も彼らをフォローした。 そして私はTwitterにどっぷりとハマっていった...。

Twitter

セキュリティキャンプで知り合ったメンバー、チューター、講師の人たちをTwitterでフォローしたあと、 そこから芋づる式に色々な人をフォローしていった。

2009年ごろにTwitterにいた人たちは主に「アーリーアダプター」と呼ばれる人種で、 新しいものを受け入れ、積極的に情報発信をする人たちだった。 高専や大学で勉強している学生、会社員、専業主婦、同世代の中高生・・・ 最新の技術情報はもちろん、趣味を仕事にするべきか否かとかいった価値観の違いをよく見ることもできた。

当時の私の基本スタンスは「知らないことは聞く」。疑問を投げかけると、その道の人が答えてくれることもあった。 人から面白おかしく話を聞くという行為を繰り返していたら、いつの間にかそれが得意になっていた。*1

勉強会

Twitterで知り合った人たちは情報発信が活発な人たちで、勉強会に参加している人も多くみられた。 周りの空気に飲まれ、私も勉強会に顔を出すようになった。

勉強会ではライトニングトークと呼ばれる、おやつみたいな短いプレゼンもある。 私はここで色々なひとのプレゼンの技を見た。そして、マネした。

高校生が懇親会に参加するのは相当珍しかったらしく、参加者のひとはよく色々な話をしてくれた。 聞いているだけではもったいないと思い、簡単な発表をしたりもした。

*1:だからいま自力だけで解決できなくて困っている、ともいう

私のパソコン歴(3) : 落ちこぼれから始まったプログラミング入門

すごい散文になっている...。 とりあえず全部振り返りきってから全体を通して書き直したい。

受験を経て、私は東京工業大学附属科学技術高等学校に入学した。 ここで私は初めてプログラミングに出会った。様々なコミュニティのなかで、私はプログラミングの腕を磨いていった。 下に書いたコミュニティのほかにもTwitter, セキュリティ&プログラミングキャンプ, 勉強会などにも参加していたのだが、 分量が多くなってしまったので続きはまた明日。

パソコン愛好会

パソコン好きなクラスメイトに誘われてなんとなく入ったこの愛好会が、人生で初めてプログラミングを触るきっかけになった。 『独習C』を買うように言われ、よーいドンで同級生と勉強が始まった。

ちなみに、この中で私は理解度で最下位にいた。読み進めるのが遅いというのもあったが、振り返ると周りがとても優秀だったことも理由の一つだと思う。 それでも、黒い画面をカチャカチャ操作しているのがとにかくカッコよくて、わからないなりにがむしゃらに勉強した。

愛好会の主な活動内容は基本情報技術者試験の勉強とプログラミングコンテストへの参加だった。 基本情報は言っている内容がピンと来なくて全然点数が取れなかった。 プログラミングコンテストは頭の柔らかさが全然足りず、あまり芳しい成績は取れなかった。

学校の授業

高校では結構つっこんだ専門的な授業があった。 カリキュラムや雰囲気に関しては先輩の記事が詳しいのでそちらに譲る。 ある工業高校のカリキュラムをまとめる - FLYING

C言語はパソコン愛好会でやっていたのである程度分かっていたので、どちらかというと同級生の勉強をフォローする側だった。 が、実は説明できるほどよく理解していない部分もあり、教えようとすることで自分も勉強になっていた。

同級生との切磋琢磨

クラスには何人かプログラミングのできる子がいて、ありがたいことに「あれってどうやるの」と聞けば教えてもらえる状況下にいた。 特にH君にはよく色々なことを教えてもらった。プログラミング言語の作り方、オブジェクト指向の考え方などなど、 思い返せば職業プログラマとして持っておくべき知識をいろいろここで仕入れることができた。

プログラミングのできる人たちのなかで目立ちたかった私は、クラスメイトが触っていないプログラミング言語を求めてあてもなく触った。 Java, Perl, ActionScript, Erlang... みんなは「また迷走してる」と笑っていたが、個人的には言語の特性が理解できたこと、新しい文法を覚えるのが得意になったことは良かったと思っている。

クラスのWikiにはプログラムを作って公開するページもあった。 自分で作ったプログラムを公開するという経験は、ここで初めてやった。 初めて作ったのはC言語で書いた暗記カードアプリだ。500行くらいで、コメントも自分なりにきれいに書いた。当時の自分にとっては超大作だ。 READMEを書いてみたり、動作環境の違いを知ったり、他人からソースコードのレビューを受けたりした。

私のパソコン歴(2) : Webページ作りにハマった小中学生

小学5年のとき、自分でWebページをゼロからタダで作れることを知った。 お小遣いのない小学生にとって材料費のかからないWebページ作りはとても魅力的で、どっぷりとハマった。 パソコンの好きな同級生に自慢し、お互いに新しく覚えたHTMLタグや無料のレンタルサーバを教えあった。

Webページを作ることで学んだもの

「Webページを作る」という経験は、プログラミングを始める前準備として非常によく活きた。 これを通して学んだものは3つある。

出来上がる「実体」ではなく「指示書」を触るもどかしさ

WebページはWordやExcelのように完成形を見ていじりながら作るわけではない。 どんなに色々な図や文字飾りが多彩なレイアウトで構成されていても、「ここの字を赤くして」とかマウスでクリックはできない。ではどうやって作るか。

Webページやプログラムを作るには、「ソース」と呼ばれるコンピュータへの指示書のようなものを書いて作る。 指示書といっても味気ないもので、人間向けと違って別に色や文字の大きさで飾りつけたりはしない。ただの文字の羅列である。 面倒なだけで、その気になればWindowsのメモ帳でも書くことができる。

「作りたいそのもの」ではなく、「指示書」を書く、というのはスイカ割りの野次馬みたいな感覚だ。思った通りにならないことが多発する。 自分の書いたソースをコンピュータはどう解釈するのか、よくよく考える必要がある。 一気に書くのではなく、ちょこちょこ書きながら動作を確認する姿勢はここで身に着いた。

英単語への慣れ

コンピュータへの指示は基本的に日本語を使わない。 Webページは内容こそ日本語だが、コンピュータへの指示部分(HTMLタグ)は英語で書く。 何度も打っているうちに慣れてきた。

自分で情報を探すコツ

Webページを作っていると、わからないことが出てくる。 Googleで検索するときの単語選び、サンプルコードのパクリかたなどはここで覚えた。

尻切れトンボ感があるので今度追記する。 明日は高校生のときの話。

私のパソコン歴 (1)

きっかけ

ふとしたきっかけから、プログラミングを教える機会を得た。 最初は「直接教えればいいや」と思っていたが、せっかくアウトプットするならもっと色んなひとのためにしたいと思い、本を書こうと思い立った。

……が、なにかを効率よく教えるというのは改めて考えると難しい。 大学のレポート以来、文章をあまり書かなくなってしまった自分にとっては尚更だ。

とにかくなにか足掛かりが欲しいと思い、まずは自分のパソコン人生を振り返ってみることにした。 学んでよかったもの、期待はずれだったもの、自分がコケたポイント、自信につながったできごとを思い出して並べてみよう。 自分が学んだ要素の依存関係グラフを作れるようになるころには、自ずと語りたいストーリーが出てくるはずだ。

執筆予定

プログラミングの方面に語るうえでは小5から振り返っていくのが妥当だろう。 プログラミングを始めたのは高1だが、小5の時点でネットワークの雑な理解とWebページの作り方くらいは覚えていた気がする。

分量が多くなりそうなので、ひとまず7回くらいに分けて書く。 これを書き終えたあとの予定についてはおいおい考える。

  • 小5~中3 (Webページ, しりとり)
  • 高1~高2 (授業, プロコン, spcamp, Twitter, 勉強会)
  • 高3 (授業, 受験, 課研)
  • 大1 (授業, 学実委, 勉強会, iOSバイト)
  • 大2 (授業, 学実委, 同人誌, Webバイト)
  • 大3 (授業, 学実委, Webバイト, 就職)
  • 大4 (授業, 卒研, Rubyバイト, )

執筆ルール

執筆のルールは以下の通りとした。

  • 一日に一回投稿すること。
  • 次の日に何を書くか述べること。
  • 記事は400字以上(ソースコードを含まない)であること。
  • 投稿できなかった日の翌日はTwitterのアイコンを猿にする(放っておくと猿のアイコンになるのがよさそう)。