K.Sasada's Home Page

Diary - 2007 January

研究日記

睦月

_31(Wed)

http://www.cs.tuat.ac.jp/index.cgi?mode=each_html&each_no=71

なんとも恥ずかしい書かれ方である.多分,指導教員の先生が書いてくれたんだろう.何喋るか.


RubyKaigi2007 CFP ですが、延長も考えてたんですが、駆け込みが多かったので延長はなしの方向で。

もし卒修論などで忙しいとかあって、2月初旬に出したい! って人が居れば、先にご連絡ください。応相談です。ネタによる。


しかし,今回も「あっ!」という人が居て凄い良い感じ.これは行くね,俺は.

_n(Wed Jan 31 10:58:48 JST 2007)

 オス?あっ。ユウか :p

_nishio(Wed Jan 31 11:37:37 JST 2007)

 Rubyのメスってどんなのだろうw

_斎藤ただし(Wed Jan 31 15:14:30 JST 2007)

つ ジェンダー論 という感じではありますが、入学志望者急増の予感がします。 (これは行きます,俺が高校生だったら…)

_30(Tue)

http://pc10.2ch.net/test/read.cgi/tech/1164885714/668 ちゃんと全角スペースにしてるんだなぁ.


RubyKaigi 2007,プレゼンテーション応募してね.概要は後で〜...,でも,タイトルによっては可能かも.要するに何をやるかわかるものなら.審査でわかれば可能.それによって判断しますから.


うーん,正月にLingrのプロトコルを調べたのと比べて,いろいろ変わってるっぽいなぁ.素直にAPI使うかー.


Rubyは十分higher orderなので(と某hagya先生が言っていた),関数型は受けないってこたないんじゃなかろうか.硬派な(?)関数型言語はとっつきにくいってのはあるだろうけど.


rubykaigi2007 cfp をどこで宣伝するのが効果的なんだろう,と思ってみたけど,思い浮かばず.


そういえば,牧野先生のスーパーコンピューティングの将来の未読が大変たまっていた(夏から全然見ていなかったので)のをたまたま発見(あるキーワードでぐぐったら見つけた)したので,先日2,3日かけて読みふけってしまった.ほんとうに一日中.

なんか,もうね.自分が今お仕事でやらせてもらっている話に絶望しちゃって大変だった.まぁ,どちらかというとそっち方面に行かないように話をもっていくのがいいのかなぁ,という気がする.ちょっとだけ.

いやはや,しかし何時も思っていますが,世の中には凄い人が沢山居るものです.一度お話を聞いてみたいなぁ.

_29(Mon)

まつもとさんにコミットされてしまったけれど、tool/parser.rb だけじゃなくて、tool/compile.rb にも同じ問題があります。その辺は以前から知っていたんだけど、コミットしていなかった(最初は JRuby の連中に教えてもらった)。コミットたまってるんだよなぁ。ううむ。


NaCl@秋葉原に初めて行った。ベルが無いので入りづらかった。


おかげさまでだいぶ風邪は治った気がします。

_28(Sun)

http://eigenclass.org/

すげーー。

_ksm(Sun Jan 28 08:04:13 JST 2007)

 一瞬でロゴをエヴァと識別しちゃたよ...

_mfp(Tue Jan 30 19:48:15 JST 2007)

詰まらない事だけど、ロゴを描くのがけっこう楽しかった。 Tシャツを作らせようかなって(cafepress.com)

_ささだ(Tue Jan 30 20:14:43 JST 2007)

 わはは.ほしいかも.

_26(Fri)

仕事のためにタクシーを使ったけど、多分自費。


体中がだるい。

_25(Thu)

風邪がきつくて、熱でぼーっとしてしまう。しょうがないので、Ruby で STM を実装してみた。1 クラス限定、ネスト考慮なし。

require 'thread'

module STM   
  def stm_initialize
    @__stm_lock__ = Mutex.new
    @__stm_version__ = 0
    @__stm_log__ = nil
  end

  def atomic
    committed = false
    m = @__stm_lock__
    Thread.current[:__stm_log__] ||= {}

    until committed
      version = @__stm_version__
      log = Thread.current[:__stm_log__][self.__id__] = {}
      yield
      m.synchronize{
        if @__stm_version__ == version
          log.each{|k, v|
            instance_variable_set("@#{k}", v)
          }
          Thread.current[:__stm_log__][self.__id__] = nil
          @__stm_version__ = version.succ
          committed = true
        else
          # p :retry
        end
      }
    end
  end

  def self.included klass
    def klass.atomic_attr *args
      args.each{|arg|
        sym = arg.to_sym
        self.module_eval %Q{
          def #{arg}
            if Thread.current[:__stm_log__][self.__id__]
              Thread.current[:__stm_log__][self.__id__][#{sym.inspect}] || @#{sym}
            else
              @#{sym}
            end
          end
          
          def #{arg}=(v)
            if Thread.current[:__stm_log__][self.__id__]
              Thread.current[:__stm_log__][self.__id__][#{sym.inspect}] = v
            else
              @#{sym} = v
            end
          end
        }
      }
    end
  end
end

class AtomicClass
  def initialize
    stm_initialize
    @a = 0
  end

  include STM
  atomic_attr :a
end

class SynchronizeClass
  def initialize
    @a = 0
    @m = Mutex.new
  end

  attr_accessor :a

  def atomic
    @m.synchronize{
      yield
    }
  end
end

def test klass
  max = 10000

  x = klass.new
  t = Thread.new{
    max.times{
      x.atomic{
        x.a += 1
      }
    }
  }
  max.times{
    x.atomic{
      x.a += 1
    }
  }
  t.join
end

require 'benchmark'
include Benchmark

bm{|b|
  b.report{
    test AtomicClass
  }
  b.report{
    test SynchronizeClass
  }
}

まぁ、どう考えても今の Ruby には必要ないよな。使い方も難しい。atomic の中で副作用のあること(入出力)とかやっちゃうと、目もあてられない。

まぁ、要するにろっくふりーなわけです。多分。


ある region において、transaction の対象にしたいものは、多分だいたい決まっているので、ある特定のオブジェクト限定にするのは、それなりにりーずなぶるだと思う。んだけど、聞かない気がするな。研究する価値も無いって? それとも知らないだけか。もし無かったら、提案してみよう。

... つーか、オブジェクトだとメモリじゃないじゃん。オブジェクトを対象にすると何ていうんだろうな。これなら必ずありそうだよな。


先日の Intel のセミナーで HTM をサポートするって言ってたよなー、と思いながら、検索をかけてみらたら http://journal.mycom.co.jp/articles/2007/01/08/micro2/001.html がひっかかった。いやー、大変よくまとまっています。しかし、例が DB の Transaction そのまんまってのは、誤解を生むんではなかろうか。

この機構は、ll/sc の ll bit や投機実行で利用する reorder buffer(あれ、投機実行時のメモリの格納先って、違ったっけ。違うような気がするな。どこだったっけ>大和君、とか名指しで聞いてみる)、よりも高級(広範囲で利用可能)で、コンパイラ屋さんとか、ライブラリ屋さんがほしがっている TM 機構よりも低レベルなわけですな。このギャップをどう埋めるんだろう。

なお、他のプロセサにより書き換えが起こっていなくても、キャッシュラインがスワップアウトされるとマークビットがリセットされてしまうので、本当に書き換えが起こった場合と区別が付かないが、その場合には、STMに戻って、ソフトウェアでデータの値を比較して書き換えの有無をチェックする。

おお、STM は、ちゃんとやらないといけないのか。


たまには研究っぽいことも書いておかないと、赤黒木も知らないような素人に思われてしまうようなので、書いておこう。

... 人の読んでるだけだから、やっぱり全然素人と変わらない気がしてきた orz 赤黒木も、存在は知っているけどアルゴリズムはもう忘れてしまっているので、やっぱり素人です、ごめんなさい。balanced tree って作ったこと無いんだよな。


なんというか、転職も考えたくなるものです。


私の所属は創造情報というところなんですが、メールのヘッダとかで、創造情報助手の〜、って書くんですよ。そこを typo って、想像上助手の〜 と書いてしまうことが多い。やっぱり仮想就職だったのか。


前も書いたような気がするな、このネタ。


熱でどーしょーもなくつらいときに限って仕事が沢山。うううう。寝たい。でも、今週末もRubyKaigiミーティングだから休めない。日曜日は寝るぞ。

_nishio(Fri Jan 26 03:24:21 JST 2007)

 これ?>http://www.atdot.net/~ko1/diary/200607.html#d25

_24(Wed)

Googleの金田さんにご講演していただきました。大変興味深い内容でした。あれを一人でやるんだから、凄すぎるよなぁ。


Freenode#ruby-lang で、お前語彙増やせよ、といわれた orz


職場の下のほうで情報爆発なんとか、ってのがやってたので行ってみた。偉い先生方が勢ぞろいだった。こそこそとポスターを眺める。上田先生直々に LMNtal のお話を伺う。とてもプログラミングがしやすい、ということでしたが、はてさて。そういえば、住井さんにスルーされた。しょぼん。まぁ、わからないよね、顔とか。

全部面白そうだったけど、なかなか話が聞けず。うーん、積極性が足りない。

_23(Tue)

この日記にはエントリにタイトルをつけていない。というのは、日記なんぞにいちいちタイトルをつけるか、という理念による。というわけで、この日記は人様に見せる風体をなしていないということです。ただ、もしタイトルをつけるのなら、これは「Googleのレベル」とでも付けるんだろうなぁ。


Google さんからイベントのお知らせを頂きました。有難いことです。が、なんかたくさんメールアドレスがついて Cc してるんですけど。そーかー、あの人のところにも話が行ってるのねー、などと、いろいろ想像できて楽しい(妄想はしない)のですが、これはかなりありえない。Google さんでも、やっぱり中の人にはこういう人もいるのねー。

てゆーか、Googleさんに教えたのは職場の名刺にしか書いていないメールアドレスだよ。うーむ。

しかし、なるほど、こういうところに声かけまくってるんだな、という勉強にはなった。


このイベント自体は公開なんだか非公開なんだかわからんな。文面には招待、とあるが、案内サイトは認証ないしな。学生さんに勧めていいのかわからない。聞いてみるか。返信するとき、このCc アドレス全部に返信したら顰蹙だろうなぁ。


rubyco さんの日記のあれは、釣りだったんだろうか。釣られた? 釣られた?


プログラミングは難しいものであるのはその通りで、それを改善していくのもわれわれの仕事だけど、あんまり簡単になっちゃうと仕事がなくなっちゃうなぁ、なんて。


熱でぼーっとしている。

_22(Mon)

なんか、どーーっと寝てしまった。


明日、こんなことをするので、興味のある方はご参加ください。

第6回仮想化実装技術勉強会

日時:
 2007年1月23日 (火) 18:30 〜

場所:
 秋葉原ダイビル13F 東大秋葉原拠点 大会議室
 (http://www.i.u-tokyo.ac.jp/map/index.shtml#aki 定員 40 名)
題目:
 「単一システムイメージを提供するためVMMと、AMD-Vを対象とする軽量VMM」

講演者:
 グーグル株式会社
 金田憲二氏

講演概要:
 我々は、Virtual multiprocessorとTiny VMMという2つの仮想マシンモニタを
設計・実装した。
 Virtual multiprocessorは、クラスタ上に共有メモリ型マルチプロセッサマシ
ンを仮想的に構築する。この機能によって、クラスタを非常に簡便に利用するこ
とが可能となる。例えば、共有メモリ型マルチプロセッサマシン用の並列アプリ
ケーションを、無変更のままクラスタ上で実行することが可能になる。さらに、
マルチプロセッサをサポートする
 OS (例えはばLinux)を、少量の変更で仮想マシンにインストールすることが
できる。我々は、8 台の物理マシン上に仮想的に 8-way のマルチプロセッサマ
シンを構築した。そして、その仮想マシン上で互いに独立な粗粒度タスクを並列
に実行し、その実行時間を測定した。この実験の結果は、我々のアプローチで現
実的な性能を達成できることを示している。
 Tiny VMMは、AMD64のもつ仮想化支援機能を利用した仮想マシンモニタであ
る。設計・実装をシンプルにする事で、教育や研究のための基盤として利用可能
にすることを目標としている。約3000行のCプログラムで、簡単なプログラムを
仮想マシン上で実行できた。

同じ内容で話は聞いたんだけど、すげー面白かったですよ。とても小規模な勉強会なので、とても質問がしやすい感じです。


こういうのの案内ってどこに出すのがいいのかなぁ。

_a2c(Mon Jan 22 22:47:31 JST 2007)

 およよ〜、こんなのやってたんですか。YLUG行ってました。

_ささだ(Tue Jan 23 08:24:20 JST 2007)

 今日だよ。YLUG行きたかったなあ。

_21(Sun)

なんか 2ch でまたてきとーなことを言われているな。

http://pc10.2ch.net/test/read.cgi/tech/1164885714/508

508 :デフォルトの名無しさん :2007/01/20(土) 11:54:17 
>>506 
JRubyはじまったな 

Yなんとか涙目 

な、涙目なんかじゃな...うぅっ。


JVM は Sun からオープンソースで公開された(る? よく知らない)んだから、VMの性能で勝てるわけが無いわけですよ。つぎ込んでいる人材(人数や優秀さ)が違う。ライブラリも充実してるし、並列実行もサポートしている。唯一足りないのは Ruby を自然に表現するVMモデル。

ふむ、Ruby用にモディファイしたら最強だな。うーん、やってみたい。でも、JVMのソース読むだけで大変そうだ。誰か完全解説書いてくれないかな。


ちなみに、Olaとはchatで何度かいろいろと議論しました。多分、今度共同研究します。主に職場の政治的理由で。


http://pc10.2ch.net/test/read.cgi/tech/1164885714/513

まぁ彼らは前からバイトコードな人達だったわけだし、設計上最適化の余地があって、それをしてきたわけじゃまいか。

別に JRuby の連中は前からバイトコードじゃないと思ったんだけど、違うのかなあ。JRuby にJavaコンパイラ作ってる人たちがかんでるってのは聞いたことないし。今度聞いてみよう。


それよりも、昨日、初めて就職活動イベントに行って来ましたよ。主な目的は、まぁまつもとx鵜飼両氏を見に行くためだったんですが。

ちょっと遅れていったら立ち見ですよ。この俺を立たせやがってこれだけの人数を集める両氏は、やはりすごいです。まつもとさんのトークは言い訳が目立っていて聞く人の心をつかむ、いつもどおり素晴らしいものでした。

一言感想を言うとすれば、全然OSSと関係なくて、達人プログラマーやJoelとかで読んだような話だなーと思った感じ当たり前のことを権威のある人たちがきちんということで、世の中を良くしていくんだな、ということを再認識しました。

ところで、まつもとさんが心に残る素晴らしい言葉を言っていました。「嘘をつかない」。... いや、まつもとさんに言わせれば、「そのときはそう思ってたんだよ」ということなんだろう。


いや、ほんと、当たり前のことを権威のある人が言い続けることは大事だと思うし、それを当たり前と思わない人がたくさん居ることも今日のイベントを見ていてよくわかったので、やっぱりすごいなーと思うわけです。

当たり前じゃないことって、世の中にあんまり無いしね。

私は、どうも「当たり前」のことは当たり前だろうと思って言わないことが多いのです。何かに気づいたりしたとき、「これは当たり前だろう」と思って、よく私は口を噤むんです。でも、ほかの人がそれについて声に出して言うと、周りは「おー」と言うんです。で、議論が進む。お追従かなとも思っていたんだけど、何度もあるので、これはどうも口に出さない私が違うんだなぁ、という感じです。口に出すこと重要ですね。「おいしい」とか「いいね」とか、「ありがとう」も、きちんと口に出さないと通じないわけですよね。うん。

当たり前のことを当たり前に言う、大事ですね。教育ってそういうところもあるんでしょうね。


で、折角有楽町まで出てきたので就職活動してみる。任期が切れたら無職なので、就職活動はしないといけないわけです。

Googleのブースには、以前会社説明してくれた方がいたので挨拶。金田さんも居たけどほかの人の対応していたので挨拶はなしで。いいなぁ、Google。粗品はくれなかった。

フロアを回っていると、いろんな企業から声がかかる(手当たり次第、とにかくかけていた)。いくつかの企業でRubyの話を振ってみたけど、乗ってくれた人は居なかったなぁ。少し話しを聞いてみたけど、あんまり私の活躍できる職種はなさそう。

あと、なるべく「人事の人」に、技術の話を聞くってことをやってみた(どんな技術者がほしいんですか、って感じで)。やっぱり、ちょっとでも突っ込んだことに答えられた人は居なかったな。あ、東京エレクトロンの人は、もしかしたらよくわかっていたのかもしれない(私が質問が下手でうまく確認できなかった)。

なかなか新鮮な体験だった。企業の中のことを聞くというのは、ほとんど機会が無いので。

そういえば、エンジニアの人も、技術の詳細はあんまり教えてくれなかったな。そりゃそうか。ウェブアプリケーションの開発者の人に、キャリアパス的にJavaやC#しか使わない会社の方針があるのでRubyなんかは使わない(使えない)(個人的にはツールとして使っているらしい)という話を聞いた。


有楽町から秋葉原まで、歩こうと思って、神田まで行ったところで麻婆豆腐専門店(?)というのがあったので入った。3時くらい。たまにはいいね。1年に一度くらい。


atdot.net のメールサーバが「ディスクがいっぱい」と言って、またつながらなくなる。しょうがないので、svn リポジトリをほかのパーティションに移す。


須藤さんに誘われて、vincent(ヴァンサンと読むそうだ)さんの歓迎会に出席。武藤さんに初めてお会いする。ちょっとNaHiさんに似ていた。

いろいろ興味ぶかい話を聞くことができ、新宿見学ができた。


帰ってみると、またメールサーバがエラー出している。/var/spool の容量は大丈夫なはずなのになぁ、と思って調べてみると、inode数がいっぱいだったという罠 orz

犯人は rgrey だった。IPアドレスのデータベースに「ファイル名」を利用しているんだが、こいつが10万アドレス(要するに10万ファイル)ほどになっており、1GBの /var の inode がいっぱいになっていた。とりあえず全部消した。rm * で消せないので悩んだ。

rubyとdbm で rgrey 書き直そうかな。面倒そうだよなぁ。今だったら taRgrey かなぁ。


で、日記を久々にたくさん書いてみた。

明日は立石さんインタビュー。Wii やりたい。


そういえば、atdot.net をそろそろ次のマシンに変えようかなぁ(256MBメモリはつらい)と思っていたけど http://h50146.www5.hp.com/products/servers/proliant/campaign/proliant_50off.html を見て、次も ProLiant にしようと決意してしまった。


お、そういえば Java はブロック中のローカル変数の再定義(ブロックで、外のブロックのローカル変数を新しくローカル変数として導入する)のは駄目なのね。これは明快だな。やっぱ、エラーにするべきだな。

class SC {
  public static void main(String args[]) {
    int i = 0;
    if (true) {
      i = 1;
      int i = 2;
      i = 3;
    }
    System.out.println("" + i);
  }
}
#=>
sc.java:5: i は main(java.lang.String[]) で定義されています。
      int i = 2;
          ^
エラー 1 個

しかし、それは do |a; b| ... end を許せばいいだけで、var なんてやっぱり要らないなぁ。


外側を明示的に参照するなんてどうかな。

a = 1
iter do
  a = 2
  outer.a = 3
end
p a #=> 3

いや杉。


西尾さんちが大変なことに。ドメイン更新忘れた?

_kou(Sun Jan 21 11:38:19 JST 2007)

「好きです」も、きちんと口に出すとムフフなことになるかも♪

_向井(Sun Jan 21 13:29:31 JST 2007)

 わたしの使ってる postgrey ってやつは Berkeley-DB だったんですが、atdotはqmailで運用しているんでしたっけ?(postgreyはpostfix用)

_nishio(Sun Jan 21 15:59:34 JST 2007)

 ご心配をおかけしました。更新を忘れてもしばらくは他の人に取られないそうな。まぁあのドメインを取りたい人はあまりいないと思うけども。

_むとう(Sun Jan 21 18:56:51 JST 2007)

 わざわざお越しいただきありがとうございました。またよろしくです。

_oskimura(Sun Jan 21 22:43:29 JST 2007)

 ささださんはGoogleには行かないんですか?

_ささだ(Mon Jan 22 00:51:28 JST 2007)

 いやー、取ってくれるなら行きたいんですが。

_20(Sat)

:= みたいな、何かよくわからんもの導入するよりは、var foo のほうがいいな。

しかし、

foo = 1
var foo = 2

ってやったら、どうなるのかさっぱりわからん。エラー出すべきなんだろうな。JavaScript は動くらしいが...。


iter |; foo|

end

だけじゃ駄目な理由ってなんでしたっけ?


メールサーバがとてもやばい。


C++ だと、

int main(){
  int i = 0;
  if (1) {
    i = 1;
    int i = 2;
    i = 3;
  }
  printf("%d\n", i);
}

また JavaScript と違う。これはこれで気持ち悪い。

_nishio(Sat Jan 20 14:24:44 JST 2007)

 え、エラー出すべきなの?2番目のfooで1番目の「外のfoo」が隠されている状態になると思ったよ。

_ささだ(Sat Jan 20 16:18:46 JST 2007)

JavaScriptで、

      function test() {
        var foo = "a";
        function inner() {
          foo = "b";
          var foo = "c";
        }
        inner();
        return foo;
      }
      document.write(test());

とか。って、こういう挙動のことを言ってるのかな。これすげー気持ち悪いんだけど。

_nishio(Sun Jan 21 02:26:07 JST 2007)

 トラックバック>http://www.nishiohirokazu.org/blog/2007/01/pythonjavascript.html

_おびなた(Sun Jan 21 02:45:55 JST 2007)

 うーん、おいらも普通に自然な挙動に思えるのですが・・・

_ささだ(Sun Jan 21 03:00:33 JST 2007)

 どれの挙動が自然? 少なくとも、C++とJavaScriptは異なっているので。

_19(Fri)

名刺を持ち歩かない俺は駄目駄目。

_18(Thu)

なんというか。やっぱり研究って全然外に出てないよな。よろしくない。俺でもわかるようなすげー簡単なことだったりすることが、全然理解されていなかったり、知られていなかったりする。


ああ、社会人失格。


gccint-4.1.1.chm を作成。誰かこれ日本語に訳してくんないかな。


SPE Runtime Management Library - http://www-306.ibm.com/chips/techlib/techlib.nsf/techdocs/771EC60D862C5857872571A8006A206B/$file/libspe_v1.2.pdf

おーー。

_17(Wed)

http://staff.aist.go.jp/toru-nakata/sotsuron.html

大変よくまとまっていてすばらしい。自問自答している内容がいろいろ書いてある。工学的、とくに情報よりではないところでギャップがあるんだけれど。そして、ますます考えて、よくわからなくなる。


ところで、

「どうか真相を暴いてください。それだけが私の望みです」(前原圭一)

を見て唖然としたのは俺だけだろうか。


さて、修士論文を書いている学生さんに教えるべきだろうか。12月だったら間違いなく教えていた。あと10日の学生さんにこれを見せるのはどうなんだろう。見せないで、エッセンスだけ伝える方針で。


http://www.microsoft.com/japan/msdn/community/askexperts/ C#の偉い人のインタビュー。意外と突っ込んだ内容で面白かった。LINQは宣言的なので、PLINQという並列化プロジェクトをやっているって話が興味深かった。LINQにはそういう思惑もあったのか。なるほどー。

.NET に STM を入れるって、想像ができん。実際、どうなっていくんだろう。とりあえずプロセッサ待ちではないのか。

どんどん宣言的にしていきたい、という話が印象的だった。


http://itpro.nikkeibp.co.jp/a/it/plwatch/watch0112/watch_23.shtml

大体同意。

コンピュータの仮想マシン化もコンピュータ教育の表層化をもたらしている。

ここがよくわからんかった。


しかし、自分が体系的な思考・研究プロセスをぜんぜん持っていないことに、恐怖を感じる。うぅ。


血の気が引いてしまった。本当に、ご迷惑おかけしました orz

_青木(Wed Jan 17 17:42:13 JST 2007)

 VMの上だけいじってアセンブラとかOSをやらないってことじゃないかな > 表層化

_ささだ(Wed Jan 17 18:34:19 JST 2007)

 いや、VMの上ではOSもアセンブラ知識も必要ですから!

_masterq(Thu Jan 18 10:55:55 JST 2007)

 VMの上だと、プロセッサとの協調設計とかしないじゃん、とゆー崇高なツッコミなんでは?

_ささだ(Thu Jan 18 11:27:35 JST 2007)

 そこまで言うのなら、VM上で効率的に動作させるための何か、とかいろいろ研究分野が広がっている現在にそぐわないと思いますよ。

_おびなた(Sun Jan 21 03:07:02 JST 2007)

 もっと下のレイヤの電気回路やデバイスなどのレベルまで含めて体系化しましょうよ、ってことではないでしょうか。

_16(Tue)

ActiveRecord で、同じユーザ名(ここでは ko1)を許さないようにするには、transaction を使って select すればいいらしい。

2.times{|i|
  User.transaction{
    raise "account duplication" if User.find_cond(:first, "name" => "ko1")
    user = User.new
    user.name = 'ko1'
    p user.save
  }
}

なんとなく、DB のトランザクションってロックするってイメージがあんまりなかったけど、AR の場合はロックになっちゃうらしい。


http://www.rubyist.net/~matz/20070110.html#p06

何の注釈もつけずに map/reduce って言葉を使うのは、なんとも乱暴な気がするけれど(Ruby には map はあるし、reduce も inject があるし、みたいな)。

しかし、何度か書いたけど、今似たようなことを仕事でやっている。やってみてちょびっとわかったのは、結局メモリのほうがボトルネックになっちゃって、まずい。2 core でこれなんだから、100 core くらい乗せると、もう駄目駄目でしょう。やっぱり、そんなに単純じゃない。

じゃぁどうすればいいかっていうと、多分コンパイラががんばったりOSががんばったりしないといけないのではなかろうか。とりあえず、今の延長じゃむりぽ。

_もろはし(Tue Jan 16 14:11:34 JST 2007)

つ validates_uniqueness_of :name

トランザクションを使ってるってことは、実際には複数のモデルをまとめて save するとか、そのへんかもしれませんが。

_もろはし(Tue Jan 16 14:13:38 JST 2007)

 あ、的外れだったかも。書き込み時点の一意性を DB 側で制約をかけたりせずに保証したいってことですかね?

_ささだ(Tue Jan 16 18:08:25 JST 2007)

 リファレンスを読んでも、何がどう uniqueness を保障するのかわかりませんでした。もし、同じ名前を突っ込んだらどうなる? 例外?

_まつもと(Tue Jan 16 20:57:34 JST 2007)

まあ、あの文章の主要な対象は最上さんなんで。 で、やっぱりRuby(っポイ言語)でのmap/reduceは難しいんですね。 そう簡単だったらいいなあって思ったんですけど、甘くないのか。

_ささだ(Tue Jan 16 21:32:26 JST 2007)

 いや、100coreでやったことないからわかんないっすけどね。メモリローカリティを高くするための何らかの仕組みは要ると思います。ライブラリに全部吸収できるのが一番いいんですが(それが Fortress なので、Ruby でできないことは無いのかもしれません)。最近は、全部インライン展開できるような、プログラムを全部解析できるような言語仕様がいいなぁ、と思っています。でも、リフレクションは無いとつらそうだなぁ、とか。その辺のバランスが取れた、最適化しやすい言語を、ちょこっとだけ考えています。

_まつもと(Wed Jan 17 01:32:27 JST 2007)

 そこでNiagaraですよ。使ってみませんか?

_ささだ(Wed Jan 17 01:39:31 JST 2007)

 もちろん使いたいですねぇ。

_まつもと(Wed Jan 17 06:14:34 JST 2007)

 では、中の人に相談する方向で。東大なら受け皿はある、と

_もろはし(Wed Jan 17 10:04:16 JST 2007)

基本的にやってることはささださんのコードと一緒です。uniq制約をつけたカラムで select して、ヒットしなけりゃ OK ということで。ロックをかけてるかどうかはちょっと失念。すみません。

で、例で言えばすでに name が "ko1" なレコードがある場合にさらに name が "ko1" なモデルをsaveしようとする場合、

  • AR::Base#valid? でfalseになる
  • AR::Base#save で保存されず、返り値が false になる (validationに成功すれば保存される、当然)
  • AR::Base#save! で例外が発生する。(成功すれば保存される、当然)

さらに、AR::Base#errors で validation してみた結果のエラー詳細がとれます。

_15(Mon)

http://swikis.ddo.jp/umejava/38 が面白そうで、職場からも近い(地図上で見ると 0 m離れている)ので、申し込もうと思ったら、梅澤さんにメールが届かなかった(failureとなって返ってきた)ので断念。別の新年会もあるそうなので、そっちに行くことにした。大変楽しそうなので、メールを弾かれなさそうな人はぜひ行ってみるといいんじゃないかと思います。というか、行ってレポートして。

_14(Sun)

一日中ぐったりしていた。

_13(Sat)

RHG。この環境をいじるライブラリについては、どうなんだろうな。

property について誤解をしていたのが直った。しかし、コンパクトになるんだろうか。よくわかんない。

_12(Fri)

職場でWiiをやった。結構盛り上がった。

_あだむ(Fri Jan 12 22:30:59 JST 2007)

 仕事は?w

_11(Thu)

肩が痛い。


東京に戻ってきた。


http://www.amazon.co.jp/o/ASIN/4798111112/

うう、高い。が、買うか。人として。


買って来ちゃった。ついでにWrite Great Code vol.2 も。


るるりんが 2ch の補足が止まっていた(URLが変わっていた?)ので、見てなかったんだけど、http://pc10.2ch.net/test/read.cgi/tech/1164885714/372 に吹いてしまった。

_10(Wed)

ううむ。

_9(Tue)

http://www.astro.princeton.edu/~rhl/Tcl-Tk_docs/tcl/interp.n.html 読めといわれたので読まねば。

_8(Mon)

げんしけん9巻をなぜか1500円くらいで購入。楽しかった。

_サイロス誠(Mon Jan 08 22:28:07 JST 2007)

 おひさしぶりです。ああ、あっちの方を買われたんですね・・・(笑)。

_きむら(Tue Jan 09 17:20:30 JST 2007)

 まだそっちが残ってたんですか?

_7(Sun)

ゼルダ楽しすぎて沢山やってしまった。すみませんすみません。

明日は職場に避難しよう。


TRV とか TVM とか、なんか別のものに見える。

eban さんからは、YA に別の意味を探せば、と言われた。何がいいかな。


Exerb って、Ruby と分離しちゃったほうがいいんじゃねぇかなぁ。

_雪見酒(Sun Jan 07 22:42:56 JST 2007)

 YARV Ain't Ruby VM (じゃ、なんなんだ)

_sheepman(Mon Jan 08 00:14:33 JST 2007)

 YAT 安心! Ruby VM

_arton(Mon Jan 08 01:46:25 JST 2007)

 分離って具体的には? (スクリプト+スクリプトエンジンなんでもOKというような意味?)

_arton(Mon Jan 08 01:48:35 JST 2007)

 You Are Ruby V

_arton(Mon Jan 08 02:08:51 JST 2007)

 ああ、わかった。requireをGemみたいに後から変えるようにすりゃいいわけだからか。

_ささだ(Mon Jan 08 08:49:38 JST 2007)

 いや、そうじゃなくて。Exerb の本質は PE 弄るツール(そして、おまけの Ruby 関係ファイルまとめ機能)だと思ってるんだけど、それは Ruby とは無関係なものなんじゃないかと思うわけです。なので、PE 弄るツール(PE 弄ってファイルまとめるツール)として独立させて、Exerb はそれのフロントエンドにするのが良いのではないか、と。そうすると、Ruby に限らないで使えるようになるわけで。

_6(Sat)

親プロセスで作ったスレッドを fork 後の子スレッドが pthread_join したらどうなるのか。


#include <pthread.h>
#include <stdio.h>

void *func(void *p)
{
    sleep(10);
}

main(){
    pthread_t tid;
    pthread_create(&tid, 0, func, 0);
    if (fork()) {
	/* parent */
	//printf("parent/join: %d\n", pthread_join(tid, 0));
	sleep(10);
    }
    else {
	/* child */
	printf("child/join: %d\n", pthread_join(tid, 0));
    }
}

Darwin Kernel Version 8.8.0 だとブロックしっぱなし。Linux 2.6.17-1.2174_FC5 だとスグに 0 (成功)を返した。そして cygwin は ESRCH。cygwin が一番正しいという。

_5(Fri)

久々にさっぱりわからないバグが。


やっとわかった。けどどうやって解決したもんだか、わからない。


http://www.atdot.net/fp_store/b2febj.file/graph.png

Mac OS X on PPC での速度向上比。

_4(Thu)

svn リポジトリでストレスが溜まっているのでツールを作る日。

  • ChangeLog をイチイチ手で書くのは面倒くさい(手で書いていた)。なんとかしたい。
  • コミットログをChangeLogから作る。でも、svn ci したときにはエディタを出して欲しい。
  • 自動的に changeset をまとめて欲しい(細かく change set を作りたいとき)。でもStGIT の使い方を覚えるのは大変そうだ。そもそも、スタックは要るんだろうか? まとまっていれば要らないんじゃ?

ということでツールを作る。

mklog.rb

#!/usr/bin/ruby

CMD = ARGV.shift || "svn"
DIFFARG = ARGV.shift || "--diff-cmd=diff -x '-wpu'"
MSG = ARGV.shift || ''

files = []
file = nil
`#{CMD} diff #{DIFFARG}`.each{|line|
  case line
  when /@@.+@@\s+((\w+)|(?:\w+\s+(\w+)))\(/
    func = $2 || $3
    files << "#{file} (#{func})"
  when /\+\+\+ (.+)\t\(.+\)/
    file = $1
    files << $1
  end
  puts line
}

#"%Y-%m-%d(%a) %H:%M:%S %Z"
# "%a %b %e %H:%M:%S %Y"
puts "#{Time.now.strftime('%a %b %e %H:%M:%S %Y')}  Koichi Sasada  <ko1 at atdot dot net>"
puts
files.sort.each{|file|
  puts "\t* #{file} : #{MSG}"
  puts
}

cs-save.rb

#!/usr/bin/ruby
require 'tempfile'
require 'fileutils'

TMPDIR = "z:/"
EDITOR ='cmd /c "C:\app\uty\Hidemaru\Hidemaru.exe %A"'
CHANGESDIR = './changes'


#############################################
def list
  system("ls -la changes/")
end

#############################################
name = ARGV.shift || (list; exit)
file = File.join(CHANGESDIR, name)

# check override
if FileTest.exist? file
  puts "Already exist: #{file}"
  puts
  list
  exit
end

#############################################
# collect data

diff = `svn diff`
info = `svn info`
status = `svn status`

#############################################
# make cs data
tf = Tempfile.open('cs-save', TMPDIR)
tf.puts <<EOS__


===================================================================
[info]
#{info}

[status]
#{status}

[diff]
#{diff}
EOS__
tf.close

time = File.mtime(tf.path)
system(EDITOR.sub(/%A/, tf.path))
if File.mtime(tf.path) == time
  puts "Please write a comment."
  exit
end

#############################################
# prepare save directory
FileUtils.mkdir(CHANGESDIR) unless FileTest.exist? CHANGESDIR

#############################################
# write file
open(file, 'w'){|f|
  tf.open
  f.puts tf.read
}

#############################################
# revert current
system("svn revert -R .")

cs-commit.rb

#!/usr/bin/ruby

EDITOR = 'cmd /c "C:\app\uty\Hidemaru\Hidemaru.exe %A"'
ENV['TMP'] = 'z:/'

###
# 
require 'tempfile'
file = ARGV[0] || raise
body = ARGF.read

###
# parse log
log = ''
open('ChangeLog', 'r'){|f|
  raise "Write a ChangeLog entry" unless /ko1/ =~ f.gets
  while line = f.gets
    break if /^[^\s]/ =~ line
    next if /^\s*$/ =~ line
    log << line.strip << "\n"
  end
}

###
# prepare edit file
tf = Tempfile.open(file)
tf.puts log
tf.puts body
tf.close

###
#
time = File.mtime(tf.path)
system(EDITOR.sub(/%A/, tf.path))
if File.mtime(tf.path) == time
  raise "not editted"
end

###
#
open(file, 'w'){|f|
  f.puts File.read(tf.path)
}

俺の環境にべったり。


http://en.wikipedia.org/wiki/YARV

誰がこんなに詳しく編集しているんだ...。

_3(Wed)

if (value) return 0;

if (value) {
  return 0;
}

と書いて欲しい。


前から考えていたけれど、send/funcallの最適化をしたい。でも、sendって再定義される可能性がある(ネットワーク系とか)から、ちょっと嫌な気もするんだよな。

やるならどうやるだろ。まぁ、なんとかなる? 作るのはそんなに難しく無さそうだしな。スタックトレースで __send__ とか出なくても怒る人はいないよね? ね?

対応するメソッドは send, __send__, __send, funcall, __send! か。無駄に多いよなぁ。


そういえば、WiiもDSも、飯を食いながらはやりづらいなぁ。

_arton(Wed Jan 03 21:57:46 JST 2007)

 思うんだけど、send(strval)の場合にスタックトレースにsend, *strvalと出るのと、いきなり*strvalと出るのではずいぶんデバッグとかしにくくなるんじゃないかな?

_ささだ(Thu Jan 04 00:32:21 JST 2007)

 げげ、まじっすか。

_arton(Thu Jan 04 09:30:32 JST 2007)

 良く考えたら慣れだけかも。呼び先のメソッドがsendから呼ばれることを前提にトレースを読めば見えないsendがあるってことでOK。

_kou(Thu Jan 04 13:40:00 JST 2007)

飯を食いながらでもやりやすいゲーム機ってあるんですか?

_ささだ(Thu Jan 04 14:00:07 JST 2007)

 PC。

_ksm(Thu Jan 04 14:29:16 JST 2007)

 エンジン(違

_2(Tue)

締切りのあれがあるので、FF3は午前中だけ、と思ったら火のクリスタルまで行ってしまった orz すみません...。

しかし、FF3ってこんなんだったか。全然覚えてない。

_1(Mon)

あけましておめでとうございます。

昨年度は大変お世話になりました。本年度もどうぞよろしくお願いします。

2007年元旦 笹田耕一


去年の大晦日はずっとコミット準備だった。

今年はコミットから始まった。

やっと、YARV をマージしました。もう Yet Another では無いようです。


イトーヨーカドーで Wii が買えた(抽選)。とりあえず、はじめての〜 とゼルダを購入。前者のミニゲーム、面白かったけど、もうちょっと数があったほうがよかったなぁ。

ゼルダは凄い。

で、だめもとでトイザラスを覗いたら、DSが沢山売ってた。黒は無かったが、ネイビーがふつーに買えた。すげぇ。家族が欲しいと言った脳トレと、俺のやりたいFF3を買った。

脳トレ、色を声に出して言うやつが40代だった。


FF3、泣きそうになるほど良い。

_劉(Mon Jan 01 02:06:51 JST 2007)

お疲れ様です。 いいお年を。

_きむら(Mon Jan 01 02:58:38 JST 2007)

 お疲れ様でした。そしてあけましておめでとうございます。今年のより一層のご活躍をお祈り申し上げます。

_斎藤ただし(Mon Jan 01 23:26:13 JST 2007)

 おめでとうございます。新年もそうですが、マージ!! ほんとにお疲れさまでした。おめでとうございます。いよいよこれからですね。

Sasada Koichi / sasada@namikilab.tuat.ac.jp
$Date: 2003/04/28 10:27:51 $