情報科学苦手の会に参加してきました

12/6に開催された情報科学苦手の会に参加してきた。
ちなみにこの会は、情報科学若手の会でネタとして言い出したら後に引けなくなって実際に開催されたもの。
でも自由に参加出来るので、若手の会に参加してなかった方も結構来ていたように思う。
多分、今回は社会人も多かったよね?

若手の会では比較的プログラミング言語自然言語処理関係の人が多かったような気がしてアウェイ感を感じていたのだが、今回はローレイヤーな発表が多くてあれっ?と思った。
やっぱり幾らか人が入れ替わってるせいかな?あるいはたまたまそういう内容の発表が多かっただけ?

どの発表も恐ろしく高レベルで興味深く、外野からも活発なツッコミ・野次・罵声の嵐(嘘)で議論が白熱していて面白かった。
が、そもそも「苦手な分野について語ろう、得意な人に聞いてみよう」というような趣旨であって、実際に議題はある程度苦手な人からのリクエストに応えて選ばれてるにも関わらず、議論のレベルが高くて分からない人が分からないまま置き去りになった感があったのは残念なところ。
もう一度やろう!という気運はあると思っているので、より改善された第二回を開催したい。
皆が乗り気なら多分やれるだろう。

あと、僕がのんびり会場に行ったせいでネットワーク構築が遅れたりUstが全然映らなかったりしてすみませんでした。ご迷惑をおかけしました。
しかも、録画できてると思って後からチェックしたら一部飛んでるという。むーん。
やっぱりこういうのはある程度機材を揃えて挑むか得意な人に丸投げすべきだな。

以下、各プレゼンに対する感想。

@shinhさん C++の吐く機械語

Cと変わんないよーって言ってたけど、いやいや、すごい色々増えてるじゃん!
まぁでも他の言語に比べれば一番近いのかな?

第一引数の所にthis入れとくとか、型情報などなど色々必要になる情報を保持する為のテーブルがあるとか、どうコンパイルしているのか概ね想像はついたけど、C++は殆ど使わないのでどういう言語しようなのだっけ…?などと考えながら聞いてたから、全ては理解しきれなかった。

アプリケーションを作るには便利そうだけれど、objdumpで逆アセンブルしながらネチネチデバッグしていくような用途(自分が考えてるのはカーネル開発)にはめんどくさいだけじゃないかなぁ、という感想。

やっぱりカーネルはCで良いよね。というのはC++を理解していない事の言い訳にはならないか、やっぱり。

そういえば、懇談会の時に@ucqくんが「manglingされた名前は、慣れれば幾つかの名前はdemangleしなくても読めますよ!」と爽やかな笑顔で語っていて全力で引いた。
その隣でSTL使ってる時に出るわけわかめコンパイルエラーも慣れれば読めるようになるという話を聞いてまた引いた。
C++こわい

あ、Exceptionのところで話してたsetjmp/longjmpってなんだっけ?
僕はどうもカーネルはいじってばかりでユーザランドをちゃんとやってないので標準ライブラリすら疎い。いかんなー。
manを読んだ感じでは、setjmp(env)で実行コンテキストをenvに保存して、longjmp(env, val)でenvを復帰しvalをreturn valueとしてセットする感じかな。
まぁコンテキストの保存するならsetjmp()は重いか。
その辺をバイナリに色々と工夫する事でやらずに済ます方法があって、今はそっちが使われてるよという事かな。

@yuyarin Road to the White House -Explore Recent Internet-

単純にISPから外にでて、海を渡ってホワイトハウスまでたどり着くまでの道のりをtraceroute結果を使って説明してくれるのかなとか思ってたら違った。
そうか、CDN(赤米さん)があるからホワイトハウスへは辿り着けないのか!
言われれば分かるけど、言われるまで素朴に海を渡る経路を想像してしまっていた。

そこからCDNの仕組みの解説に。
DNSをうまく利用して最寄のミラーへ転送しますよと。
yuyarinさんはお話が上手で楽しかった。
ネットワーク系の話題は比較的馴染みがあって理解しやすいけれども、あまり最近は勉強していないので大変ためになる。

質問コーナーで、Googleなら赤米に勝つるの?みたいな質問があって、そこで用意してきたのがこれ!とGoogle Public DNSの話に突入。
テンポ良すぎ。

@yuyarinさん Google Public DNS and IP Anycast

Googleがどこからアクセスしても近いDNSサーバをどうやって実現しているのかという話。
IP Anycastという技を用いているらしい。正直初めて聞いた。
DNSレベルで近いサーバへ振るんじゃなくて、一つのIPからBGPのルーティングレベルで振り分けを行うとのこと。

結局、Google Public DNS解説と個人的妄想:Geekなぺーじも読んでみてようやく理解したような気がするんだけど、そういえばそもそもBGPとか外部ルーティングの理解が怪しい。

8.8.8.0/24に対する最適な経路を世界中のISPにそれぞれ教えてあげるとして、こんな感じの理解で正しいのか?

  • 8.8.8.0/24に対するASは当然一つ
  • 一つのAS番号とネットワーク(Geekなページのanycastって図に書いてある赤丸で囲まれてるGoogleのネットワーク)は1:1 一つのAS番号を直接繋がってない複数のネットワークで共有する事はない(これ、合ってる?)
  • 他のASとの境界に立つノードは複数あっても良い
  • 他のASとの境界に立つノードが他のASに話す8.8.8.0/24に対する経路は、それぞれ違ってても良い(ここで最も近いサーバへ振ってる)

話を追っていて、最後まで一つのAS番号を例えば日本とアメリカでそれぞれ使っていて、その間に別のASが挟まってて良いのか、良くないのか、わからなかった。

@cubicdaiyaさん Diff

アルゴリズムの理論的な話が続いて理解が難しかった。
エディットグラフを用いて説明してたのは、
Wuのアルゴリズム
編集距離 = 要素1 - 要素2 + 削除数 × 2
という話の説明だったみたい。
削除数 Pの値で探索範囲も決まるよ、と。
ちゃんと理解するにはコード読まないとだめかもー。

光成さん 指数関数の高速な近似計算

そもそも指数関数ってなんだっけ?が分かってないからこの話は分かりようもなかった訳で。
数式怖いよ数式

まぁ要するに、近似値をテーブル引きすれば標準ライブラリのstd::expより速いよ!という事であるらしい。
しかしfloatの丸めに丁度いい命令(常に切り捨てて欲しい?)がSSE4.1にならないと存在しないとの事(roundssというやつらしい)。
cvttss2si命令というので近いことが出来るが、負の値では切り上がってしまうのが問題とか。絶対値で切り捨てて負の値に変換すれば良い?floatではそう簡単に行かない?どうなってるんだっけ。
ベンチマークではroundssが乗ってるCPUが無かったのでこれは試せてないとの事。
無いのに実装が終わってる!というところでウケてた。

@NetPenguinさん MVCの次は・・・

すごい地雷を踏みましたとご本人も仰ったほど激しいツッコミが相次ぐ。
デザインパターンって実装によっては理論と違ってきちゃう事もあるだろうし、何が正しいと言い切れるものではないから難しいんだろうね。
宗教論争との声も。
なんとなくBSDLinux界隈での何が正しいのか論争にも通ずるものを感じたけど、個人的にはあまり強いこだわりが無いので黙って聞いていた。
いや、他の発表でも僕はだいたいおとなしくしてましたけどね。皆さんと違って色々苦手なものが多いので;)

@syuu1228 SMP/Multithread

発表してからふと思ったが、そういえば若手の会でも似たような事はなしてましたね。かぶっちゃった。
スライドこそ1から作ってるんだけど、若手の会の人とか探検隊の人的にはまたかよな内容だったかも。
もっとネタをこさえておかないといかんですね。

適当に話してみたけど、SMT/HT/バレルプロセッサの説明が間違ってたみたい。
スレッドいっぱい作りたい→N:Mモデルとか言ってみるのはまだいいけど、その後からユーザスレッド・グリーンスレッドを説明するのは因果関係が違うだろうと話しながら思ったが後の祭り。

ローレイヤークラスタじゃない人たち的には、そもそもユニプロセッサな素朴なシステムがどのように動いているのかを理解している前提で話してしまったのでわかってもらえてない感あり。
まぁでも、どういう問題や議論があるのかについて断片的にでも体感してもらえたんじゃないだろうか?

@ucqくん goのアセンブリHello World

この子はとなりでなにやら延々とハックしてると思ったら、こんな変態的な事をしていたので思わず発表してよとリクエストしたら実現しました。

  • goの処理系は基本的にplan9ベースですよ
  • main関数の名前に何故か「・」とか使われててとってもキモイですよ
  • AXはgasのeaxの意だったりしてアセンブリの記述法が違うみたいですよ
  • goライブラリを叩くのは引数の型情報とか色々揃えないといけなくて、アセンブリでやるのは未だうまくいってないですよ

とまぁ、こんな感じらしい。
ucqくんの話は毎回濃くて面白い。
ローレイヤークラスタ以外の人々にも面白さが伝わっただろうか?

@yuyarinさん TCP/IP/Ethernet Overview

またまた登場yuyarinさん。昔専門学校で習った内容の復習っぽくて楽しかった。
物理層の仕組みとかすっかり丸忘れしてたけど、そういえばオシロで波形みて確認する授業を受けたなぁ。
10GbEとかどうなってるんすかねー?

質疑応答は割と本編の内容に関係なく、Linuxでシスコルータをノせないの?とか消費電力どうなの?とかいう話題で盛り上がったり。

Linuxルータ(或いはCPUがx86なルータ)でシスコをノすという話に関しては、一番エッジのルータは何使ってても別に構わないし、コアルータってどうせワイヤードロジックなんでCPUとかOSとかいう問題じゃなくね?と思ったんだけど、違う?
その場で聞いてみればよかったな。
つい議論が白熱してると聞く側に回ってしまう。

@hotpepsiさん FPGAとは何ぞや

ピザを食わせろという殺伐とした雰囲気のなかでFPGAのお話。

ものすごく単純に言うと、チップ内に存在する単純なロジックにそれぞれON/OFFスイッチがついててこれを切り替える事によってプログラムする、という事でいいのかな?

Dynamically reconfigurable deviceとして見てみるとFPGAだけでなくReconfigurable processor, GPGPUもこれに含まれ、FPGAがロジック単位、Reconfigurable processorがエレメント単位、GPGPUがストリーミングプロセッサ単位になるとか。
言わんとしていることは理解出来てるつもりなんだけど、そういえばGPUの内部アーキテクチャは全く知らない事に気がついたり。
更に粒度が上がるとLarrabeeになる?とか。

質疑応答では、ルータの中にFPGAがついてて経路情報をチップに落とし込んじゃうようなものすごいものがあるとかいう話も。

懇談会

ごめん、ピザ足りなかった(´・ω・`)
ついでにいうと、集金金額も微妙に足りなくて水島先生が肩代わりしてくれてる(´・ω・`)
次があったら、お礼に皆差し入れとか持ってくといいと思うよ。

反省

もうちょっと自覚的に運営に参加すれば良かった。コミットが中途半端だった。

ネタだと思って適当に考えてたけど、あれだけの規模/内容で開かれるとわかっていたらもう少し下準備しとけば良かったね。
まぁそれは皆もそう思ってるけど、誰も行ってみるまで気がつかなかったという事かな。

自分の発表についても、用意がいい加減だった。

苦手分野的には、アルゴリズムと数学がダメだという事を再認識した。
高校数学からやり直すしかない!?

お礼

幹事を務めてくれたみずしまさん、会議室を提供してくれたたけおかさん、ありがとうございました。
発表者・参加者のみなさん、お疲れ様でした。

はてなが「TBするときは言及しなさい」とうるさいのです。

してやんよ
http://d.hatena.ne.jp/kmizushima/20091206/1260118722