著作一覧 |
・'High Performance Rails' - Issei Naruta
link_to 'foo', url
とlink_to 'foo', :controller => 'bar', :action => 'baz'
どちらが高速か?
なんとなく、宛先をきちんと指定しているのだから後者だろうなと思うと、10倍以上後者のほうが遅い。
・Keynote 'Concurrency in Ruby: In search of inspiration' - José Valim
キャッシュをHashに入れて、マルチスレッドで共用しているとする。困る。コンカレント耐性があるHashはどうあるべきか?
goのアクターモデルは良い。
・ 'Ruby on Windows -- the past, the present, and the future' - Usaku NAKAMURA
WindowsはUnixじゃねぇよ。MRI死守。後もう1つあったけど忘れた。追記:Windows特化機能には走らない(MRIのwin32.cに特殊な関数を入れたりはしないという意味)。
(LTでankiというツールの紹介があった。本を読む。95%は忘れる。それでいけば2/3は覚えているよ!)
・'How NougakuDo connect Windows Azure and Rails Application' - Daisuke Inoue
コンテナにサーバを詰め込んだ単位で設置する。
Q(AKR):壊れた場合はどうするんだ?
A:放置。まとめて交換する。
AKR注)Googleはラック毎交換するとかだったけど、MSはどうなんだろうな? と思って訊いた。
多分、コンテナ毎交換なんだろうなと想像する。
原始(PCになってからの話だ)、故障はマザーボード上のソケットの単位で交換していた(メモリとかCPUとか)。20年前はマザーボードを単位に交換していた。そしてラック単位の交換となり、コンテナ単位の交換となった。次は、家屋単位の交換となるだろう。
・ 'CRuby Committers Who's Who in 2013' - Tomoyuki,Chikanaga
ガチャピン先生は、Rubyを直さずにLinuxを直す。
・ジュンク堂
昨日長田さんに頼んで2冊持ってきてもらったおれのC#の本が1冊売れたそうだ。良かった! (あと、Haskell入門も売れたらしい。しかし、RealWorld HaskellとGaucheは手には取られるけど……とのことで残念だ)
JavaのHashtableは使い物にならず、HashMapと自力同期で処理するのがパターンだ。
というのは、リアルワールドではnullチェックが必須だからだ。
// ダメ(メソッド忘れたので正しいかどうかはわからない) Hashtable hash = new Hashtable(); ... if (!hash.hasElement(key)) { // 多分同期メソッド hash.append(key, value); // 同期メソッド }
// 正しい Hashtable hash = new HashTable(); ... lock (hash) { if (!hash.hasElement(key)) { // 既に同期済みなのでオーバーヘッド hash.append(key, value); }
// 望ましい HashMap hash = new HashMap(); ... lock (hash) { if (!hash.hasElement(key)) { hash.append(key, value); }
Hashtableは意味なかった。
同じことで、仮にRubyのHashMapが同期メソッドを用意してもいまいちな予感がする。
だったら、モンキーパッチライブラリでいいじゃん。
# sync_hash.rb require 'sync' class Hash include Sync_m def initialize() super end alias []= _[]= def []=(x, y) synchronize { _[]=(x, y) } end def []+=(x, y) # というのも定義できるようにする必要はあるなぁ。 synchronize { a = [](x); []=(x, a + y) } end def []||=(x, y) # というのも定義できるようにする必要はあるなぁ。 ... end
で、require 'sync_hash'
久野先生の本とかぶるのかな?
JoseのGoのアクターモデル呼び出しのやつを見ていて、ふと気付いたが、C#のasyncメソッドって正しく利用されるのだろうか?
とにかくインスタンス変数が好きで好きでたまらない人がいて、それはOOPのカプセルの考え方からは正しいのだが、privateがどうしたとかアクセサメソッドがどうしたとか、本質的なところから離れたところに拘泥して、結局、君たちグローバル変数が好きなんだね、という残念な利用法をそれなりに見ることがあるからだ。
async void Job() { var list = new List<Task<string>>(); for (var i = 0; i < 10; i++) { list.Add(Task.Factory.StartNew<string>(() => { ...... return result; } )); } var results = await Task<string[]>.WhenAll<string>(list.ToArray()); // resultsを使う }
だが、こんなことになるような予感が。
private ListResults { get; set; } // privateだし、プロパティ(アクセサメソッド)だよ! ... async void Job() { var list = new List<Task<string>>(); for (var i = 0; i < 10; i++) // こんな書き方せずに、配列に並べることになるし、ラムダ式ではなくデリゲートになるだろう(それは行数によっては正しいけど、配列に並べるのはどうだろうね? { list.Add(Task.Factory.StartNew(() => { ...... Results.Add(result); } )); } await Task.WhenAll(list.ToArray()); // 難解な<>が無くて可読性がすごく高い!(でも上の例は明示してるけど、いらなかったような) メソッドの行数も少ない! // Resultsを使う }
ジェズイットを見習え |
java.util.concurrent.ConcurrentHashMapでputIfAbsent(key, value)などとすればよいのでは?
二日目にC#本を買った者ですw 買った時おねーさんが「やったー!」と喜んでました。C#初心者なのでこの本で勉強したいと思います。
jmukさん、それは正しいツッコミですね。僕はconcurrentをろくに触ってないので、全く思いが及んでないです。既にJavaはconcurrentでAPIを再生しているので、参考になるはずですね。<br>iwadonさん、どうもお買い上げありがとうございます。それにしても目に浮かぶようです。>「やったー!」と喜んで