トップ «前の日記(2013-05-31) 最新 次の日記(2013-06-02)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2013-06-01

_ RubyKaigi2日目

・'High Performance Rails' - Issei Naruta

link_to 'foo', urllink_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は手には取られるけど……とのことで残念だ)

_ コンカレント耐性があるHash

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 List Results { 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を使う
}
本日のツッコミ(全3件) [ツッコミを入れる]
_ jmuk (2013-06-01 05:08)

java.util.concurrent.ConcurrentHashMapでputIfAbsent(key, value)などとすればよいのでは?

_ iwadon (2013-06-01 07:11)

二日目にC#本を買った者ですw 買った時おねーさんが「やったー!」と喜んでました。C#初心者なのでこの本で勉強したいと思います。

_ arton (2013-06-01 07:30)

jmukさん、それは正しいツッコミですね。僕はconcurrentをろくに触ってないので、全く思いが及んでないです。既にJavaはconcurrentでAPIを再生しているので、参考になるはずですね。<br>iwadonさん、どうもお買い上げありがとうございます。それにしても目に浮かぶようです。>「やったー!」と喜んで


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|

ジェズイットを見習え