shrapnelというライブラリのおはなし
Ciscoが開発した協調スレッドベースのネットワークライブラリのshrapnelというのがある。
https://github.com/ironport/shrapnel
こいつはeventletとかによく似てるんだけど、IO処理可能かどうかの通知をかなりkqueue(kevent)とかに依存してるみたい。
あとmain stackとcoro stackにわかれてて任意のタイミングでswapできるんだけど、two(or more) C stackって記述がよくわからない。
複数のcoro stackを持てるってことなんだろうが、どうやって実現してるんだろうか。
http://ironport.github.com/shrapnel/tutorial.html#how-it-works
ちょっと未来のことを考えてみる
http://norvig.com/21-days.html#answers
mutexのlock/unlockが25nanosecでmain memoryへのアクセスが100nanosecかかる時代だ。
isuconでユーザ空間にアクセスがいったら負けとかいってる間に、メインメモリにアクセスがいったら負けという時代がもうすぐそこにきている。
少し未来に思いを馳せてみる。
そう遠くない未来には個人の所有するコンピュータが100コアのCPUを積んでいるだろう。
そして各コアはそれぞれL1、L2キャッシュをもっているだろう。
そこで果たして100個のスレッドをうまく協調させながら並列に動かすことができるのだろうか。
なんとなくだけど各スレッドはスレッド固有のデータ領域を持つ前提で動いて、メッセージングでやりとりする方向に収束するんじゃないかなあ。
もちろん、未来では今とはまったく違うアーキテクチャになっているのかもしれないが。
大江戸Ruby会議に地味に参加していました
途中で用事があって抜けたりしたんですが、覚えてる範囲で適当につらずら書きます。
inoueさんの話
Londonでお仕事の話。政府からのお仕事の請負とか興味深かったです。 最近流行りのオープンシティとかの話も聞けたらよかったかなあ。
ささださんのGC話
かんたんにいうとこれまでのGCの歩みとか、今後のGCの話って感じでした。
そうですねー、キャッシュ載せるのは大事です。 聞いた話だとmutexとるのに25ns、メインメモリにアクセスするのに100nsかかるそうですから(しかも光速度的な限界も加味して) いかにキャッシュ載せるのが大事かっていう。 なのでbitmap-markingは効果あるんじゃないかと期待してます。 ただcopyingほどの効果はないでしょうね。 そういえば昔Rubyでmostly-copying GCを実装する研究とかありましたが、頓挫してしまったんでしょうか。 まあC拡張とか考えると移行コストがでかすぎる気しますが。
あとちょっと気になったのはlazy sweepとincremental GCをわけて紹介してた感じだったのですが、 これって別物だっけ?って感じになりました。 lazy sweepってメモリバリア使ってないのかな?
さらに余談でいうとsetjmp/longjmpがgccからなくなるみたいな話でどう対応するかとか聞きたかったです。 RubyのGC実装的にはアレないときつそう。。
mikutterの話
ぼくはmikutter使ってないけど、おもしろかったです。 ぼくはmikutter使ってないけど、ちょっと会場の場所ごとに温度差ある感じでしたね。若い人にはかなりうけていた感じでした。 ぼくはmikutter使ってないけど、とてもいい発表だったと思います。
morgan_randyさんの話
プレゼンすごく上手でした。 lunr.js使ってみたいです。
雑記
会場では超人的なコミュ障を発揮して誰とも会話せずぼっち飯でした。 まあ基本知り合い同士な雰囲気で話かけづらい感じを受けましたが、自分からもっと喋ってけばよかったなあ。。 あとなんかぼくいつも機嫌悪そうで喋りかけづらいとか言われるんですが、そんなことないですよ! よかったら@shitsyndromeとかkubo39@githubとかみかけたら声かけてみてほしいです。
tailコマンドをRubyで
tail -F だけやな
#!/usr/bin/env ruby class Tail def initialize tailed_file, &blk check_file_validity(tailed_file) @tailed_file = tailed_file if block_given? @callback = blk else @callback = lambda {|s| STDOUT.write s } end end def follow s=1 open(@tailed_file, 'r') do |f| f.seek(0, 2) while true curr_position = f.tell line = f.gets if line @callback.call(line) else f.seek(curr_position) end sleep s end end end def register_callback &blk @callback = blk self end private def check_file_validity file unless File.exists? file raise TailError, "File #{file} does not exist" end unless File.readable? file raise TailError, "File #{file} not readable" end unless File.ftype(file) != "directory" raise TailError, "File #{file} is a directory" end end end class TailError < Exception; end if __FILE__ == $0 t = Tail.new('/var/log/syslog').register_callback do |txt| puts txt end t.follow(5) end
New Year's Ruby Meme 2012
TLにこんな記事が流れてきた。
http://blog.ziade.org/2012/12/23/new-years-python-meme-2012/
年明けちゃったけど、おもしろそうなのでRubyでやってみよう。
1、What’s the coolest Ruby application, framework or library you have discovered in 2012 ?
padrinoはいいな、と思ったけどそれほど触れてない・・
2. What new programming technique did you learn in 2012 ?
低レイヤのネットワークI/Oやイベントドリブンなコードを触る機会が多かったので、それかな。
3. Which open source project did you contribute to the most in 2012 ? What did you do ?
Bossan https://github.com/kubo39/bossan
自作の非同期ウェブサーバです。
4. Which Ruby blog or website did you read the most in 2012 ?
うーん。。。
http://www.igvita.com/ と http://blog.udzura.jp/ ですかねえ。。。
5. What are the three top things you want to learn in 2013 ?
・padrino
・並列・分散アーキテクチャ
・リアルタイムウェブ(websocket/SPDY/...)
6. What is the top software, application or library you wish someone would write in 2013 ?