ポクポク

ポクッとしてツナッ

セキュリティ&プログラミングキャンプ2009レポート

セキュリティ&プログラミングキャンプに行ってきました。

はじめに

皆さん本当にありがとうございました。みんな凄かった。僕も頑張らねば。


本当は毎日更新しようと思っていたんだけど、初日の夜書きながら寝てしまった。
感想的なblogが多いので、対抗して時系列にやったことを網羅する感じで書いた。
何か間違ったことを書いていたらご指摘ください(特に他人の言ったことをまとめてる所とか、意図してないことを書いてしまってるかも)。

会場まで

兵庫県から海浜幕張へゆくため朝早く家を出発。
Twitterでは今どこだの誰それと合流しただの既におっぱじまってる感じであった。
それにしても東京駅広すぎる、新幹線から京葉線まで700m近く歩いたんじゃなかろうか。
会場のOVTA
f:id:pokutuna:20090818032329j:image:h300

8/12 1日目

会場に到着すると荷物を置いて、名札とタダメシカードを貰って講師の方と参加者数名で昼食。
メシはこんな感じのメニューからBコースとCコースが選べ、Cなら値段的にドリンクバーがつけることができる。
高いのを食べてもいいが差額を払うシステム。
f:id:pokutuna:20090818032328j:image:w300


この時は、講師の国分さんid:amachangこと天野さん、他チューター&参加者5人で昼食を食べた。
昼食をとったら開会式と授業。1日目はコースの区別なく全体で共通の科目を受ける。

情報セキュリティ基礎(id:sonodamこと園田さん)

コンピュータウイルスや個人情報&コミュニケーションリスクについて、グループディスカッションを交えながらの講義
以下その議題と上がった意見等、印象的なもの。

  • ウイルス対策ソフトを使わずに「感染しているかどうか」をチェックするにはどうしたらよいか?
    • 正常な状態との比較(プロセスやポート、パケットを監視&スナップショットを取る)
    • 勘。
  • (母親など素人エンドユーザに)教えるべき対策は何か?
    • 感染させない方向へ: ActiveXやJavascrip等をOFF
    • 感染しても大丈夫に: 個人情報をそもそも保存しない
  • 今後どういう対策が必要か
    • ユーザ側だけでなくホスト側や経路での対策
    • VM等サンドボックスな環境でネットを使う
    • クライアント同士で感染ファイルのURL等の情報を共有
  • 「個人情報」とは何か?
  • 「個人情報」を守るには? 「個人情報」は守るべきなのか?
プログラミング入門(id:hyoshiokこと吉岡さん)

オープンソースソフトウェアとその開発方式、コミュニティについての講義でした。
プログラミング入門と題してはいるけど、オープンソースの考え方入門という感じの内容。
参考として、エリック・レイモンド「伽藍とバザール」が挙がる。
同じ言語組のErlang使いid:daiki41ti(でもあんまりErlang好きでないと漏らしていて面白かった)が、
「企業は公開して損をすることもあるんじゃないですか?」という質問をして、講師陣での間でも議論が紛糾。
やっぱり実体験に基づく人たちの議論は聞いていて本当におもしろい。

交流企画BoF1

夕食後はid:amachangプロデュースの交流企画。
くじで決めた席ごとに座り、自己紹介のあとキャンプの意気込みをシートに寄せ書く。
寄せ書きではマイクロソフトは忌み嫌われ、5,6人が世界征服をする運びとなった。
マイクロソフトがキャンプの後ろの方で金出してたりしたらどうするんだよ…と僕は不安になっていた。


その後は1時間ほど名刺交換会。僕は46人ほどに名刺を配った。
名刺を用意してなかった高名なエンジニアたる講師陣の急造手書き名刺という激レアアイテムを次々と入手する。


昼食の時も思ったけど、本当にamachangさんの良すぎる人当たりにびっくりした。
もしこの企画を別の人がやったなら、もっと白けた空気と同居する展開になったと思う。

16F談話室

解散後は約20人で談話室に集まってガヤガヤ
id:Pasta-KからUbuntuシールをもらい、彼の買ってきた生八つ橋を食べつづける。
emacs vs vi等、様々な宗教戦争をくり返した。
HOTSPOT割り勘計画、ルーティングがうまくいかず失敗。
僕は眠くなって途中で部屋に帰った。


8/13 2日目

プログラミングコース共通科目

初めてのRuby著者&Ruby1.9リリースマネージャのYuguiさんによるGitチュートリアル。
GNU Helloを教材にビルドや変更をしつつ、gitを通してバージョン管理システムの概念を学ぶ。
ブランチ名とかタグ名は結局リビジョン番号というかSHA1エイリアスだったのですね。

吉岡さんの講義。微視的/巨視的理解の軸と、静的/動的理解の軸の視点をもつべし。

引き続き吉岡さんの講義。Rubyを題材にgdbを使ってみる内容。

組別課目

ここから各組に分かれる。
言語組講師はささださん、稲葉さん(id:hzkr)、西尾さん(id:nishiohirokazu)、Yuguiさん。プログラミングコース主査の吉岡さん(id:hyoshiok)。
まさにオールスターな講師陣でした。
チューターの芝さんと曹さん。
11名の参加者、id:CanIid:daiki41tiid:takuto_hid:InoHiroid:yayuguid:uiureoid:Pasta-Kと、あとはてなid不明の3名でRuby処理系を題材に学ぶ。


実習課題以外はとりあえずここでまとめておく。
順番はまあ7割ぐらいあってると思う。

  • 再度自己紹介
  • version.hを書き換えたオレオレRubyのビルド
  • Ruby処理系の構成

include以下の*.hファイルは拡張を書くためのもの、1.8系、1.9系それぞれで互換性を保つため公開範囲を制限。
1.*ごとで中身はだいたい一緒。コロコロ変わる可能性があるのところとかASTは非公開という扱い。

まつもとさんは数学が苦手で、その辺の言語設計にはこだわりは無いので、そこを突けば簡単に取り込まれる。

  • 言語設計論について、文字列はmutableかimmutableか議論
    • mutableのほうが直感的に書きやすい? immutableのほうがバグが出ずらい?
    • パフォーマンス

mutableのほうがガンガン文字列追加していく処理は速い。
immutableはキャッシュが効くのでメモリ効率がいい。

    • mutable/immutableを色んな言語でみると

JavaはStringとStringBuffer、Pythonはリストとタプル。
Rubyだって文字列じゃないけどimmutableなシンボルがあるじゃない? という西尾さんの指摘。
#まあどっちも必要だし、必要に応じた仕組みがありますね、という感じかなあ。
#Rubyはコード内部だけでの文字列用途はSymbol使うの推奨ぽいし。Hashのキーは自動でfreezeされてる。

言語理論の研究者の稲葉さんによる流行りの言語理論研究の紹介。

    • 流行について

静的解析、検証、型やなんかは古くからある大きなテーマ。平行、並列マルチコアは今当たり前に流行。

    • 理論屋さんは「保証」や「証明」が好き。

数学的検証やバグの自動検査がしやすい言語設計。
マイクロソフトなんかはドライバ等の限定された範囲でのバグ検査や保証に力を入れているみたい。

紙とペンで行ってきた証明を機械的に行う。証明をコードに書くことで間違った証明を検出する。
#証明支援言語Coqのコードをちらっと見た。TheoremとかQed.とか見慣れないカッコイイ識別子が独特の雰囲気。

64ビットマシンで浮動小数点の仮数部を削ってフラグをつっこむ。

  • 挑戦するテーマ選び


時間が押しに押していたので、他にCによるRuby拡張ライブラリの作成チュートリアル、最適化手法をスルー。
配布の教科書を、「読めばわかります」とのこと。

休み時間中にhello,worldな拡張を作ったけど簡単にできた。
Rubyのメソッドに対応するCの関数が用意されてるので、部分的にCで書いて高速化っていうのは予想以上に簡単にできそう。


言語組でのSkypeチャットが設けられ、ウィンドウをプロジェクタでホワイトボードへ投影。
口で質問しにくいこと、質問というほどではない疑問とか、思いついたこと、講義のポイント等のメモ、コピペ可能な板書、ネタ発言、様々な用途で非常に機能しまくっていたし、キャンプ後の今も窓が残っている。西尾さん発案だったのかな、これはほんとうにいい仕組みです。


並列(concurrent)、平行(parallel)、分散(distributed)の違い。
並列: 全体としての1つの流れを細かく交互に? 現在のマルチタスクの実現とか。例:「ごはんとおかずはコンカレントに食べなさい!!」
平行: 同時に2つ以上が独立して進行? マルチコアでのそれぞれのコア? 例:「吉岡さんがお茶と水をパラレルに取得している」
分散: これは場所の違いが含まれるので、上記の2つとはまた少しズレる。異なる場所で並列に。


id:yayuguが唐突に「DEBUG HACKS読みにくい」と書いた本人(吉岡さん)の前で言う。


ちょうど持ってきていた初めてのRubyにYuguiさんのサインをいただきました。
ありがとうございます!
f:id:pokutuna:20090818063336j:image:h300


8/14 3日目

企業見学

午前は企業見学をする。プログラミングコースはモバゲータウンDeNAへ見学へ。
社内サーバールーム(案の定寒い)や3Dアバター開発のヨハンソンさんの机、看板エンジニアの川崎さんの部屋などを見学。
まさに今仕事中のオフィスをぞろぞろを歩いて見学をした。
あのアバターってヤツ、僕はずっと2Dでgifアニメ的なことをして動かしてると思ってたんですけど、3Dモデル動かしてトゥーンレンダリング的なことして作ってたんですね。
川崎さんは午後ティーを燃料として開発しているらしい。窓際に飲んだ午後ティーとコーラのボトルが大量に並んでいたけど見学が来るということで片付けられてしまったとのこと。


興味深かった質問の返答として、
iPhoneWillcomEmobile等で使えない == モバゲーはエンジニア層が使わないサービスではないか?」という質問があって、管理や対応のコスト、なるべく端末1つにつき1つのアカウントに限定したいという、まあ予測できる答えだけでなく、「そもそも、モバゲーはエンジニアたちが想定しがちな客層、エンジニアが求めるサービスとは離れた所にいる人たちを狙ったもので、そこにリーチできて成功した。その質問が出るということは、その意図どおりなサービスとなったということ。(意訳)」というようなことをおっしゃっていました。

言語組演習課題

午後からは、前述の講義を少し挟みつつ各自の演習課題をゴリゴリとやる。

それぞれみんなが取り組んだ課題

  • Little Quilt言語の処理系実装とRuby binding
  • Ruby処理系の「見えるor聞こえる化」
  • Rubyにオプションを追加しよう
  • Rubyに新しい文法の追加
  • Rubyのボトルネック分析と高速化
  • madviseで効率的メモリ管理

僕とid:InoHiroid:yayuguの3人がオプションを追加組だったので、オプション解析部分を探したり内部で決め打ちの定数を探すなどしていた。
rb_process_optionsの中でprocess_optionsが呼ばれ、その中でproc_optionsが呼ばれて名前的に混乱。
あと、Cの中でもeval(rb_eval_string)が呼べるので、実に意味は無いけど機能をムリクソ突っ込むのはRubyを書く程度に楽。


requireした時点でインタプリタに渡したファイルを削除する拡張の例。

#include <ruby.h>
void Init_destruct(void)
{
  rb_eval_string("File.delete($0)");
}

この日は夜まで課題をやる。


8/15 4日目

演習課題続き

この日の午後が一応のタイムリミット。
言語組内での発表練習をして、スライドの修正や実装の続きを進める。

僕がやったのは、

  • 実行したスクリプトを削除する"セキュア"なオプション

-9をつけて起動すると前述の要領でファイルが消える。
すぐ作れるネタ的なのを取り合えず保険的に完成させ、真面目な方もしっかり作る目論見だったがコレで押していくことに。

  • スレッドスタックサイズを変更するオプション

-8[size(KB)]で内部的に128KB決め打ちになっているスタックサイズを任意のサイズに変更できる。
このオプションで再帰しまくって遊びまくれるようになる。
ただオプション解析の段階で既にmainのスタックが確保されている? っぽくて、新たに作ったスレッドじゃないと反映されなかった。そのことに気づかなくてなかなか困った。

スレッドが落ちるまで再帰して回数を計測。

@hoge = 0

def rec
  @hoge += 1
  rec
end

th = Thread.start{rec}
check = Thread.start(th){
  loop do
    if th.stop?
      p @hoge
      break
    end
  end
}

check.join
$ ./ruby vm_thread_check.rb
9357
$ ./ruby -8128 vm_thread_check.rb
9357
$ ./ruby -8256 vm_thread_check.rb
18719
$ ./ruby -864 vm_thread_check.rb
4675

ふえたりへったり、一応できてますね。

特別講義

夕方からは特別講義

ハイテク検事 大橋さんの講演
学んだ技術で悪いことするなよ、という内容。
ここで書くのも申し訳ないんだけど、滑舌のせいか音声としては3割ほどしか理解できなくて、数秒経って意味が復元されていく感じでした。


id:naoyaこと伊藤直也さんの講演

  • 2002年にmovable typeを元にココログのサービスを立ち上げて有名になった
    • リスクを取っていないままチヤホヤされ自己嫌悪に
  • はてなへ
    • はてなブックマークの開発
      • 色々場当たり的な実装
      • 夜中に落ちて自転車で会社へ行って直して帰ってまた落ちて...
  • Linuxカーネル本3版
    • 2版は買ったけど積んでいた
    • 流行から距離をおいて技術に「潜る」必要
  • 負荷分散
    • 「技術」に向き合った実感、今までのは「ノウハウ」だった。
    • 10年先も使える技術
  • はてなブックマーク2の開発
  • 世界は変わった、手段は変わってない
    • 正しいことはあなたにしか分からない。自分の手で実現すればいい。
  • 失敗
    • 人に会うだけで成長したと思い込む
    • 嫉妬や僻み
  • コンプレックスは正面から乗り越えるしか解決しない
  • 世界を変えるチケットには有効期限がある
  • 技術に深く潜ることについて
    • 孤独を愛せるか、何を犠牲にできるか
    • 人並みの努力で追いつけるか
  • 好きな言葉
    • Be practical
    • 内なる声に自覚的であれ

本当にいい話だった、泣きそうになりました。
何人もの参加者に火を着けたんじゃないでしょうか。
毎年のキャンプで話しをしているので毎回似たような話をするのかと思っていたけど、はてブ2の開発から得た話が大量に入っていたり、id:naoyaさんの成功や挑戦に合わせてどんどんバージョンアップしていくみたいです。毎年聞きたいですね。
吉岡さんもうるうるきていた。

BoF2

交流企画2として、ブースごとに分かれて議論する。
間に公募チューターさんによる発表を挟んで、プログラミングコースから1つ、セキュリティコースから1つのディスカッションを選んで参加する形。

  • 公募チュータープレゼンテーション
    • Trusted Platform Moduleの紹介 細野さん
    • VMMによるゲストOSのファイル保護の試み 忠鉢さん
  • セキュリティコース
    • B-1 クラウド時代のセキュリティサービス 岡田講師
    • B-2 セキュリティに興味がない人々にどうやってセキュリティ意識を身につけてもらうか 上野講師
    • B-3 脆弱性、指摘する人される人 はせがわ&竹迫講師
    • B-4 仮想化とセキュリティの相性〜どこで使うのがいいの? わるいの? 宮本講師


僕はA-1、B-3に参加した。

PaulGrahamの百年の言語ComputerLanguageHistoryを見ながら各言語について軽く紹介し、議論しようという内容。
話がどんどん発展していき攻殻の話になったり、YuguiさんがSFの話に脱線と言うべきか飛び立とうとして、ささださんに止められる、未来から1ビット持ってくるワームホールを利用して思ったら即座に実装する構想を話し始める。実装者を常に観察することで背景となる文脈から適した実装を持ってくる、とか。中央のサーバーは必要のままか? ネットワークの転送限界があるから、全てのノード(脳に埋め込まれた計算機のことだ!)が全てのデータを持つようになるのでは? 自然言語は曖昧なのでより一意に決まるプログラミング言語のほうを人間が話すようになる。自分の言語を実装したいのに別の言語で実装するのはおかしい。.NETとかのGUIペタペタプログラミングは何度もクリックする必要や2次元上に展開するため一覧性に限界があった。その他、50年という議題に全く縛られない自由過ぎる議論が交わされました。

基本的にはどんどん曖昧さを許容する形へ進むのではないか、という方向でした。

#ここまで行くとプログラミングって何? って話に
#今の段階では、動作可能な形式への記述、定義の連続。
#少なくとも50年だと、ある程度細かなことは無視することも抽象化することも厳しい気がする。
#一意に決めるにはどこかが複雑さを引き受ける必要はある。
#おおよそ人間が考えるようなことは簡単にひっぱりだせて組み合わせられるようにはなるかもしれない。
#今みたいなエディタにテキストを入力するプログラミングスタイルが消え去るには50年は早すぎる、と思う

とにかく面白かった。

    • Trusted Platform Moduleの紹介 細野さん

TPMチップ(Wikipedia)の話。存在すら知らなかった。
引っこ抜こうとしたら自壊するなどの機能、どうやって実現しているのか(自壊の実装は仕様として持たないらしい)気になる。

    • VMMによるゲストOSのファイル保護の試み 忠鉢さん

仮想マシンを挟むことで、OSが信頼できない場合でもファイルを保護する話。
VMでセキュアにする、って実際どういう研究をやってるのかさっぱり知らなかったけど、なるほどという感じでした。

    • B-3 脆弱性、指摘する人される人

id:hasegawayosukeさんとid:TAKESAKOさんが講師。

      • チューターKazubuさんの学校のシステムの脆弱性を指摘してから改善されるまでの過程レポート。
      • おおやけに脆弱性を指摘するのは攻撃方法を開示することになる。どこに報告するか?
        • Namazuプロジェクトでは専用のメールアドレスを用意
        • IPAの脆弱性報告窓口
      • 指摘された側がすぐ修正できる環境にあるかどうか
        • 修正する予算がない
        • 土曜日より月曜日に指摘しよう
      • 仕様を書く企業の無知
        • セキュリティに関して規定がない仕様を書く
        • 瑕疵担保保証をつけずに入札にかける
      • はせがわさん、脆弱性を指摘することで「コードを書かずに世界を変える」

8/16 5日目

プログラミングコース研究成果発表会

Linuxカーネル組、言語組、OS自作組が集まって成果を報告。
結構プロジェクタ周りに手間取っていた。
たぶん言語組が一番スムーズでしたね、デモが無い発表は1台にファイルをまとめていたことと、発表練習が効いたかな。

Linux組は実際にLKMLにパッチを投げててすごい。
OS組はテキスト(30日でできる! OS自作入門)から適時脱線して独自の機能を詰め込むみたい。マルチウィンドウができてるのもあった。

合同成果発表会

セキュリティコースと合同で成果発表。
言語組はささださんが全体を説明し、代表としてid:CanIid:takuto_hの高速化組が発表をした。
セキュリティコースは調べ学習と議論した内容を発表する感じ。

閉講式

修了証という賞状的な紙を頂き、各人ひとことづつ述べる。
全体で記念撮影。

グッズ&技術書プレゼント

好きな書籍2冊、グッズ2つ、小さいグッズは5種1つづつ。
意表を突かれたという意味ではこれが一番びっくりした。
なんで本とかグッズとか貰えるんですか! クジ引きで1位と2位にはマシンって!

  • 戦利品

f:id:pokutuna:20090818032327j:image:h300
ハチドリ本バッヂ(O'REILLY書籍バッヂ)
Revolution in the Valleyキーホルダー(O'REILLY書籍キーホルダー)
codeなにがしマグネット
SANS INSTITUTEネックストラップ
Microsoft SQLServer2009ボールペン
O'REILLY Tシャツ
DNSandBINDトートバッグ
Ruby 逆引きレシピ すぐに美味しいサンプル&テクニック 232 (PROGRAMMER’S RECIPE)
Clean Code アジャイルソフトウェア達人の技


これって献本とかなんですか…
一体どういう闇の力が働けば61人の参加者全員に技術書2冊配布なんてできるんだろう。
Beautiful Code、結構爽やかな表紙ですけどキーホルダーにすると全くぱっとしませんね。


解散後、最終日はいらっしゃらなかったYuguiさん除く言語組講師陣とチューターさん、あとamachangさんに修了証にサインを頂く。
f:id:pokutuna:20090818063334j:image:h300
サインをもらった身として自分の名前だけ隠すのはどうかなと思って、全員にモザイクかけてみたけどこれも流石にどうかと思う。

本当にありがとうございました。


その他

税金で食う飯はうまい。


f:id:pokutuna:20090818032328j:image:w300
この写真のロコモコ、BeafとPorkがあってmeatって何の肉だよ、と話題になる。
後日コロッケヒレカツセットではmixmeatの表記となり、尚のことmeatとは一体何の肉を用いたのか。
謎が深まる。


モバゲーの入ってるビルの1階のトイレ、おちんちんを水平よりそこそこ高く掲げなければならない位置にハエシールを貼っていた。少し無理がある感じだった。


id:amachangさんとid:hasegawayosukeさんの朝食中の会話。
「サイボウズラボは静か過ぎて遊びに行っても邪魔してる気がして30分と居れない」


「天野さんは本とか書かないんですか?」
「俺もう2回落としちゃったからね〜…」


ライフハックとして、

  • 名札ケースにタダメシカードとかを収納しよう、なくさない。
  • 修了証にサインをもらうとそのまま飾れてグッド
  • 名刺にアイコンを印刷する

f:id:pokutuna:20090818032325p:image:w300
アイコンを印刷すると相手が覚えててくれるので、同じ人に何枚も配ると相手が教えてくれるので非常に便利ですね。
事前にfollowしあってる人だと、あああの人、って気づいてもらえるのもよい。


来年の参加者へ

これに行かないのは本当にもったいないですよ!