K.Sasada's Home Page

Diary - 2005 April

研究日記

卯月

_30(Sat)

推論システム難しい...。


RubyConf、5/27 が発表締め切りらしいので、喋りたい人はお気をつけを。

・・・どうしようかなぁ。

_Goldwasser(Sat Apr 30 20:09:54 JST 2005)

 Rubyを使って巨大整数のフェルマーテストを実行しているんですが、仮想記憶を30ギガ用意してもメモリゲットに失敗します。Rubyでメモリ制限があるのでしょうか?あるいはハード的(BIOS?)に認識できないんでしょうか。因みにシステムはLinuxカーネル2.4です。

_ささだ(Sun May 01 02:16:19 JST 2005)

 仮想メモリ空間の制限がたぶん2GB なので、1プロセスが30GBのメモリ領域を確保するのは無理なんじゃないでしょうか。

_rucila(Sun May 01 11:42:05 JST 2005)

 Opteron等64ビットプロセッサで64ビット向けにコンパイルされればプロセスのメモリ空間も広がります。16GB位は使ったことあります。

_29(Fri)

停電も終わって、ネットワークも無事だったらしい。素晴らしい。

学校に行かなくて済んだ。


  1. windows でファイルをアップロード
  2. Linux の CGI でファイルを受信

さて、ファイル名が取れない。というか、パスを抜くのが出来ない。どうすればいいんじゃろう。とりあえず正規表現でお茶を濁すか。


ドラえもんみた。うーん、別物。


IPAX の、私の発表の時間がちょっと移ったようです。

_28(Thu)

こんなんじゃ駄目だぼけー,と IRC でいわれたので,現実逃避気味に SimplePaste を改造してみる.ソースはこっち>http://www.atdot.net/sp/sp

なんとなく,ちょっと何かを作るために必要な機能が見えないことはないような気がしないでもない.

アトミックに扱える簡単なデータベースと,サービスのディスパッチャ,あと,ちょこっとの情報アクセス用の何か.


相変わらず眠い.


わーい.すぱーく.


わーい.出したー.


ここ最近はほんとに忙しかったので,GWは休むぞー.

YARV やろー.


そういえば学校で停電だそうで,atdot.net のサービスもとまるかもしれません.そのときはごめんなさい.

_27(Wed)

行ってきます。


行ってきました.


ミナミノミナミノ読了.まんまやん.


ミナミノミナミノはIPAに行って帰ってくる間に読めるのに,故郷から〜 は全然読めなかったなぁ.


ところ変われば論文スタイルも変わる.

論文の著者名では,私の場合

  • 自分
  • 貢献した人
  • 貢献したことになってる人
  • 偉い人

にしてるんですが,皆様のところではどうやってますか.

名前順? さすがに無いよな.


この日記を見ている人は猫好きが多いことがわかった.次は犬.

_び(Wed Apr 27 18:31:26 JST 2005)

 貢献した順、というところもある。偉い人が2番目とか。一番酷いのは誰が書いても偉い人が一番、2番目が発表するとか。サイテー

_ささだ(Wed Apr 27 19:42:20 JST 2005)

 それはヒドイですね・・・.

_てつたろ(Mon May 02 16:56:49 JST 2005)

 情報系分野では「貢献順」という解釈はかなり妥当だと思うんですが。大学で研究者DB開発してるんですが、分野によっては単にアルファベット順というところもあったりするので驚愕。

_通りすがりreservoir(Mon May 02 18:04:47 JST 2005)

 物理の実験系等やたら人数多い分野はアルファベット順になったりするようですね。

_通りすがり(Mon May 02 20:26:31 JST 2005)

 物理の理論系だったけど、2人とか3人でもアルファベット順だったなあ。

_26(Tue)

なんか,もう色々と,駄目.


ある何かについて,従来手法 A では a倍,提案手法 B では b倍高速化,という結果が出たとする.

さて,結果はなんと書くべきか.順当に言って,A は B に比べ b/a 倍高速化した,というべきなんだろうが.a が 3.0,b が 3.1 のとき,とても悲しい.

こういう比較をするのが間違いなんだろうか.


アーキテクチャの提案において,3% 性能向上というのはどの程度のものなんだろう・・・.


これだけ延々とサンプルプログラム書いてると,勘所というか,どこでどうやって並列化処理をはさめばいいか,ってわかるようになるなぁ.


LLDN はいいんだけど,あの女性は何者...


まつもとさんを NaCl としか書かずに出しちゃったんだけど,どっかの大学の肩書きは要らなかったんだろうか....


さて,論文がやっとある程度まとまったので(28締め切りである程度ってどういうこっちゃ),頭を ruby-mode に切り替えないと.

明日は大事な日だ.いろんな意味で.

_maeda(Tue Apr 26 15:14:39 JST 2005)

 2%クラブってのが無かったっけ。2%の向上を、5回やれば10%向上。

_shiro(Tue Apr 26 18:26:41 JST 2005)

 かりかりかりかりチューンしてくと、プロファイラの出力も上から"2%"がずらーと並ぶようになって、どこをどういじっても一回毎の改善が1%台ってことになっちゃうんだけれども。そのくらいの改善になるとノイズを排除するためにテストパターンも試行回数も無闇に増えて、検証にかかる時間ががんがん増えて行く。この耐久レースについて行けるのは、競争に勝つために開発リソースをがんがん増やせる大企業か、実質的に時間単価をがんがん減らせる学生か…

_ささだ(Tue Apr 26 20:17:52 JST 2005)

 ぅぁー

_25(Mon)

この部長のテンションの感じは駄目だと思う。もっと爽やかに「おっくれってるー」と言わないと。

全体的に勢いが足りないと思う。よろしくない。顔もなんか違う。

やっぱ文字で見るのがいいなぁ。 


鼠と竜のゲーム読了.なるほど,詩人かぁ.


投票を見ると,ナチのスパイはいないらしい.

水がどうの,じゃないから大丈夫か.


amazon さんキター.


http://www.hpcc.jp/swopp/swopp2005/cgi-bin/swopp_app_summary.cgi

  • PRO 16/10

16件を全部やろうとすると12時間(休みなし).3日で分けても一日4時間.


そういえば,Java プログラミングの処方箋を購入.いつサインをもらえばよろしいでしょうか :)


私のタイピングって非常にだめだめで,右手小指とか使えません.だからセミコロンも人差し指で打っている.ピリオドも人差し指で打ってるなぁ.人差し指大活躍.

直したら,もっと速く打てるようになるのかなぁ.


Java に volatile があるのを知らなかった.しかし,使用場面がわからん.いや,使用しなければいけないところはわかるんだけど,なんで必要なのかわからん.


そうか.Java bytecode 単位で考えてもわかんねーはずだ.JIT compile の話なのね.


うぅ,脱線事故がこんなにひどい事故だったとは知らなかった.

_arton(Mon Apr 25 21:03:57 JST 2005)

 おお、どうもありがとうございます。IPAXって平日だからな……

_24(Sun)

ちなみになぜ昨日の日記のバグに気が付いたかというと,シミュレータの上で走らせてるんですが,L1D キャッシュヒット(h),ミス(m) 回数が出るんですな.で,h+m の値がカナーリ違っていて.多少の違いはスタックとか,制御領域のアクセスがあるんで違うんですが,カナーリ違うとダメダメで.

いや,便利といえば便利.


空が白んできたよ.

論文よりも,長い目で見たらきっと大事なものの準備もしなくちゃだよ.

そして,真っ白(いや,背景色は黒な xyzzy だけどさ)な論文.

ウワーン.


#define FETCH_AND_DEC(var_addr) \
{ \
  asm volatile( \
                ".set noreorder\n"   \
                "li   $8, 1;"        \
              "1:;"                  \
                "ll   $2, (%0);"     \
                "sub  $2, $2, $8;"   \
                "sc   $2, (%0);"     \
                "beqz $2, 1b;"       \
                "nop;"               \
                : /* output */                      \
                : /* input  */  "r"  (var_addr)     \
                : /* broken */ "$2", "$8"           \
                );}

....

  FETCH_AND_DEC(&g_rest);
  if(g_rest== 0){
    バリア解除処理
  }

間違いを指摘せよ(3点).


いやー,よく動いてたな.感動.

・・・全部書き直し.


ぁぅぇぅ.


書きたいことは沢山あるんだけどなぁ.書ききれないなあ.


GW イベント目白押しだなぁ.

でも,家でずーっとだらだらしてそう.って,いつもと同じじゃん.


ふと,自分でレジスタ指定するよりも,全部 gcc に任せたほうがよかったなぁ,と思った.

#define FETCH_AND_DEC(var_addr, old_var) \
{ \
  asm volatile( \
                ".set noreorder\n"   \
                "li   $8, 1;"        \
              "1:;"                  \
                "ll   %0, (%1);"     \
                "sub  $2, %0, $8;"   \
                "sc   $2, (%1);"     \
                "beqz $2, 1b;"       \
                "nop;"               \
                : /* output */ "+r"  (old_var)      \
                : /* input  */  "r"  (var_addr)     \
                : "$2", "$8"                        \
                );}

よりも,

static int
FETCH_AND_DEC(int *addr){
  int old_var, tmp_var;
  asm volatile(".set noreoder\n"
              "1:;"
                "ll   %0, (%2);"
                "sub  %1, %0, %3;"
                "sc   %1, (%2);"
                "beqz %1, 1b;"
                "nop;"
                : "+r" (old_var),
                  "+r" (tmp_var)
                :  "r" (addr)
                   "r" (1));
  return old_var;
}

tmp_var は output に入れなくてもいいような気がするな.


目があかんくなってきた.

_23(Sat)

IPAX の大量の招待券が来た。これをどうしろというんだ。

誰か、要る? タイムインターメディアにどかっと持っていくかなあ。


学校の机の上が大変なことになっている。なんとか資料を整理しようと思ってるんだが・・・。

ちなみに、家の机の上はもっと大変なことになっているんだが、見ないふり。


そういえば、先日森さん(LSI-C 作った人)としゃべってたんだけど「高橋メソッドって(略)」と言われた。


花見で使ったシートを干していたのを忘れていて夜回収。


しまった。コーヒー切れてたんだ。


proc1(int self){
  int start = MAX/PC_NUM * self;
  int end   = MAX/PC_NUM * (self+1);
  TYPE result = 0;
  int i;
  
  for(i=start; i<end; i++){
    result += A[i] * B[i];
  }
}

と、

proc2(int self){
  TYPE result = 0;
  int i;
  
  for(i=self; i<MAX; i+=PC_NUM){
    result += A[i] * B[i];
  }
}

ベクトルの内積を求めるプログラムを並列化する proc1 と proc2(これらの関数が PC_NUM分並列に走る)ですが、どっちが速いでしょう。キャッシュのヒット率に気をつけて答えてください。

ちなみに、キャッシュは 2way set associative。

TYPE はとりあえず double。


いや、proc2 のほうが速いと思ったんだよー。なんで proc1 のほうが速いのー。何を間違えてるんだろう。俺。

proc1 よりも proc2 のほうが、キャッシュのミス回数が多い。なんで?


なんとなく、仮説はたったんだが、うーん。本当かなあ。


そういえば、「故郷から10000光年」やっと読み終わった。すげー読みづらかった。何個か飛ばしちゃったし。


すみません,大事なことを書き忘れていました.並列単位はそれぞれキャッシュを共有します.この条件がないと,全然違う話になっちゃいますね.


proc3(int self){
  TYPE result = 0;
  int i, t;
  
  for(i=ITER*self; i<MAX; i+=ITER*PC_NUM){
    for(t=0; t<ITER, i<MAX; t++, i++){
      result += A[i] * B[i];
    }
  }
}

でxx(論文ネタ)すると速いことが発覚.

まぁ,世の中そんなもんだよな.

あれ,おかしいな.こういうことを紹介する論文じゃなかったはずなんだけど・・・(というかか,こんなんじゃ駄目だろぅ).

というか,xxなんて,もう既にきっと発表されてるんだろうなぁ・・・.でも,探したところ,見つからなかったし.うーむ.


要するに,並列単位あわせてのワーキングセットを狭くしたいんですよ.キャッシュを共有するから.

で,ブロック分割型の並列化は,ワーキングセット広くなっちゃうよね,だから狭くしたほうがいいんだよ,というのが1997年の論文に出ているのです.

そんなこと気にしたくネーヨ,という人は,キャッシュなんか共有しちゃいけないのです.で,そうやってる Intel HyperThreading なプロセッサはダメダメなのです.いや,使う側が,って意味だけど.icc は随分この辺を頑張ってる(はず)なんだけどね.


で,proc1 よりも proc2 のほうが遅くなったのは,proc2 だと各並列単位で変なところを指しやすくなる(不確定)ので,ワーキングセットが大きくなるからだと思う.

では,なんで proc3 だと速くなるのか?


答え.各イテレーションが ITER だけ短くなるから.ウワーン.

正しくはこちら.

proc3modified(int self){
  TYPE result = 0;
  int i, t;
  
  for(i=ITER*self; i<MAX; i+=ITER*(PC_NUM-1)){
    for(t=0; t<ITER, i<MAX; t++, i++){ // ここで i+=ITER していた
      result += A[i] * B[i];
    }
  }
}
_mput(Sat Apr 23 23:13:55 JST 2005)

 そんなことより関数の型をちゃんと書いてください

_maeda(Sun Apr 24 01:12:03 JST 2005)

 ちゃんと考えてないけどproc1のほうがふつーに速いんじゃないのか、という気がするが。空間的局所性とか。false sharingとか。

_通りすがり☆(Sun Apr 24 01:17:58 JST 2005)

キャッシュラインサイズ(特に 2 次キャッシュの方)が分かりませんが、配列A[i], B[i] を read したときに配列の後続のデータもキャッシュ(prefetch)されますが、proc2 のように cyclic にアクセスすると、キャッシュ(prefetch)した効果がなくキャッシュミスが proc1 より多くなるかと。

_22(Fri)

みんなハッカーについてばかり書いていたのでつい。


論文は何時書くんだ・・・。


スゲェ! と思っていた手法が、実はぜんぜんすごくなく、ただの評価対象のミスだったことが発覚。

もうだめかも。自分がだめだっただけなんですが、かなりへこむ。


あれぇ、そのまんま Rails で合宿やるのか。Rails に対抗してなんか別のでって聴いた記憶があるんだけど。気のせいだったか。


VEE いきてー。シカゴー。いきてー。

注目はもちろんこれですな。

 Virtual Machine Showdown: Stack Versus Registers
 Yunhe Shi, David Gregg, Andrew Beatty, M. Anton Ertl
_たかはし(Fri Apr 22 20:32:36 JST 2005)

 ひょっとしてNitroですか?  http://nitro.rubyforge.org/ それは別の話だったような。

_ささだ(Fri Apr 22 21:16:44 JST 2005)

 いや、なんか全然別の、みたいな。青木さんから聞いただけなので全然違う話してたかも。

_青木(Fri Apr 22 23:53:07 JST 2005)

 あ、たぶんぼく自身が勘違いしてたからです。

_babie(Sat Apr 23 00:49:04 JST 2005)

 Rails の合宿???温泉ミーティングみたいなの?

_21(Thu)

Dynamic Languages Symposium 2005 かぁ。投稿締め切りは6月かぁ。微妙に現実的ではありそうなんだけれど。英語だしなぁ。そもそも、ページを見る限り、実装よりも理論系っぽい。でも、PCを見ると、実装の人が多いような。

見に行く気はまんまんなんだけど。

・・・行けるだろうか。


昼飯は食パン3枚。寂しい。


いろいろと、鬱。


10時。学校に戻り。


疲れすぎて倒れてた。お家に帰りたい。せめてご飯食べたい。

_20(Wed)

IPAX2005 で、YARV の話をするらしいんですが、こんな感じのようです。

日時
5月18日(水)15:30〜16:00(準備・転換含む)
場所
東京ビッグサイト 西2ホール IPAX2005会場内 プレゼンテーションコーナーB

初日なんて誰も来なさそうなので、好きなことが喋れそうです。

この日程なら、SACSIS の懇親会だけでも潜り込めるかなあ。


さて、猫好きはどれくらいいるのか(投票)。


IPAX 用にパネルを作る金なんて無いので(3万くらいかかる)、模造紙を持っていくことになるんだが、さて模造紙なんて貼ることはできるのか。


コードコンプリートの領収書を貰うのを忘れていたことに気づく。やっちまった。


無事貰うことができた。税金対策。


高橋さんが3人いた(高橋メソッドを知っていますか?)。


本棚.org に課題図書を移そうかと思って、ちょっとやってみたんだけれど、ぱっと見て使いづらそうなので、躊躇中。本の集合に対する見え方が弱い、ということだろうか。

_shiro(Wed Apr 20 14:48:13 JST 2005)

 文具店で売ってる、ディスプレイ用の5mm厚くらいのボード(中がスチロールで表面に紙が張ってあるやつ)とかは?

_ささだ(Wed Apr 20 17:41:28 JST 2005)

 探したんですが、A0サイズは無いですねぇ(あってもバカみたいに高い)。

_shiro(Wed Apr 20 20:16:59 JST 2005)

 貼り合わせるんじゃだめかしら。A1 x 2かA2 x 4。

_ささだ(Wed Apr 20 21:40:29 JST 2005)

 はい。多分そうすると思います。

_19(Tue)

うう。ついついブギーポップ・バウンディング ロスト・メビウスを読み終えてしまった。

なんだかよくわからなくなってるなぁ。そもそも、最初のほう覚えていないし(あの頃は立ち読みだったので)。しかし、よく続くよな。

しかし、なぜ皮の首輪>表紙


ふと、こんなものを考えてみた。

class Object
  def method_missing selector, *args
    if /is_a_(.+)/ =~ selector.to_s
      if eval($1) === self
        true
      else
        false
      end
    else
      super
    end
  end
end

p( ''.is_a_String) #=> true
p( 1.is_a_String)  #=> false
p( 1.is_a_Fixnum)  #=> true

使えそうにないなぁ。



class Object
  def self.inherited subclass
    Object.module_eval %Q{
      def to_#{subclass.name}
        self.to_s
      end
    }
  end
end

class C
end

p 1.to_C #=> "1"

どんなときに嬉しいんだろう。


SPEC CITN 92 が欲しいよう。


main(){
  int a[] = {0,1,2,3};
  printf("%d\n", a[1 ,2]); //=> 2
  return 0;
}
_mput(Tue Apr 19 22:22:43 JST 2005)

 a[] = { 'a', 'b', 'c', 'd' }; とかにしたほうが何が起こってるのか分かりやすいと思う

_こーのいけ(Wed Apr 20 23:11:44 JST 2005)

 なぜも何も元からあるはず。<首輪

_18(Mon)

20票はありえない。


ひとめあなたに、読了。読みやすかった。面白かった。

でも、アンテナがずれてたのか、強い衝撃は受けなかったなぁ。


読みやすい、と感じたのは「故郷から10000光年」を読んでいるからというのもあると思うのだけれど。「われらなりに、テラよ、奉じるはきみだけ」まで読んだけど、読んだ気がしない。読めた気がしない。


あんまり、「狂人」と言っている人たちが「狂人」に見えなかったからかも。


ipsj に投稿する論文は、自動生成じゃ難しいだろうなあ。


今日の生協。

  • コードコンプリート第二版上下(6100円x2)
  • ミナミノミナミノ
  • ロスト・メビウス
  • あなたは虚人と星に舞う

たけぇ。


http://www.itmedia.co.jp/news/articles/0504/18/news034.html

Adobe Flash かー・・・。


http://www.rubyist.net/~matz/20050415.html#c06。ウーム。

_17(Sun)

RHG 読書会から帰宅。楽しかったです。arton さん、本当にありがとうございました。

家に帰れなさそうだったので、学校に帰る。大量の課題図書とともに。


そういえば、IORCC ってどうなったんだろ。サイトにもつながらないし。


strlen とか、strcmp の並列化とか、そういうのをやっているところってあるんかな。

どっちもループの依存関係が(終了するかしないか以外ない)ため、並列化してもしょうがないか。

メモリアクセスとか直列化しそうではある。


評価の結果は、微妙。うーむ。

よくなってたりはするんだけれども。うーむ。

_16(Sat)

うあぁ、仕事が重なる重なる。泣きそう。

_15(Fri)

Intel も Dual core か。どんなアーキテクチャにするんだろうなぁ。


[langsmith:197] C#の匿名メソッド..なぜ、ローカル変数を共有するのか?

より、

delegate void D();
class Test
{
   static D[] F() {
       D[] result = new D[3];
       int x=0;
       for(int i=0;i<3;i++) {
           int y=0;
           result[i] = delegate { Console.WriteLine("{0} {1}",++x,++y); };
       }
       return result;
   }

   static void Main() {
       foreach(D d in F()) d();
   }
}

出力結果:
  1 1
  2 1
  3 1

まぁ、元の主張はともかく、y の値がこうなるのが意外だった。っていうか、C# の文法ってこんな感じなんだ。

prs = []
x = 0
3.times{|y|
  y = 0
  prs << lambda{puts "#{x+=1} #{y+=1}"}
}
prs.each{|e|
  e.call
}

#=>
1 1
2 1
3 1

と言われると確かにそうだなぁ、と思うのだけれど。

C っぽい文法でクロージャに見慣れてないってことかな。


arton 効果で凄い人数。


ありゃりゃ、ProtoObject が 6 票で最大だったのに、BasicObject (1票) が勝ってしまった。

個人的にも ProtoObject がいいなぁとは思ってたんだけれど。


家庭用メガスターいいなぁ。欲しい。


春っぽくしてみた。


停滞っていうか、なんか考えれば考えるほど駄目になっていく。


lock-free, wait-free アルゴリズムは、ロックを用いずに何かを操作する手法。さまざまなデータ構造について、これらの方式が研究されている。

で、この二つの違いが未だにわからん。

参考: いろいろ。Some Notes on Lock-Free and Wait-Free Algorithms とか。IBM dW : Java technology : Javaの理論と実践: アトミックで行く - Japan とか。

Lock-freeアルゴリズムとwait-freeアルゴリズム 他のスレッドに任意の遅れが生じても(あるいは失敗が起きても)、どのスレッドも継続して進行する場合には、そのアルゴリズムはwait-free と言われます。対照的にlock-free アルゴリズムでは、一部 のスレッドのみが継続して進行すればよいのです。(別の仕方で定義すると、wait-freeでは他のスレッドのアクションやタイミング、インターリーブ、またはスピードによらず、各スレッドはそのスレッドのステップとして指定された数の演算操作を正しく行うことが保証されている、ということです。この指定数は、システム中にあるスレッド数の関数になっている場合があります。例えば10のスレッドがそれぞれCasCounter.increment()操作を一度行うと、最悪の場合、各スレッドは増加操作を完了するまでに最大9回のリトライを行う必要があることになります。)

違い、わからん orz


CAS による fetch-and-add は lock-free だけれど、wait-free ではない。はて。

wait-free というのは、計算量がばしっと決まっているってこと?


http://c2.com/cgi/wiki?WaitFreeSynchronization

A wait-free implementation of a concurrent data object is one that guarantees that any process can complete any operation in a finite number of steps of finite time, regardless of the execution speeds of the other processes.


lock-free はわかるんだけどな。wait-free がわからない。原著論文を読もう。


CAS による fetch-and-add は、競合を起こすと無限の時間がかかる可能性があるから、wait-free といえない、ということだろうか。

たとえば、ハードウェアによってqueue かなんかでロックの機構が実装されていていれば、それは wait-free になるんだろうか。


lock
なんかするために、ロック。排他制御。他にやらせない。クリティカルセクションとか。
lock-free
なんかしたとき、成功するのはただひとつ。
wait-free

で、Wait-Free Synchronization (1993) を読んでみたら、証明する話なのね...。サパーリ。

レンマってメンマの親戚ですか。


うー、頭痛い。

_maeda(Sat Apr 16 11:43:09 JST 2005)
  • lockを使うものはブロッキング。クリティカルセクション。
  • ノンブロッキングなアルゴリズムは、アトミックな操作とそうでない操作を何段階か組み合わせてひとまとまりの操作(メモリ割り付けとか、キュー操作とか)を行う。途中で失敗して最初からやり直しになることも。
    • lock-free ノンブロッキングなアルゴリズムのうち、みんなが一斉にやったときでも、誰か一人は進み続けることが保証されているもの。他の人は途中で失敗したり、ずっとリトライしたり。
    • wait-free ノンブロッキングなアルゴリズムで、みんなが一斉にやっても、みんなが進み続けることができるもの。ずっと失敗し続ける可能性が無いと証明されてるもの。
_ささだ(Sun Apr 17 01:12:09 JST 2005)

 毎度ありがとうございます。納得しました。

_とおる。(Mon Apr 18 11:56:14 JST 2005)

 むしろサンマの親戚。

_14(Thu)

停滞中。


先日、OSC2005 のために作った(http://www.namikilab.tuat.ac.jp/~sasada/diary/200503.html#d21)写真を動画っぽく見るためのスクリプト。

まとめるのは面倒なので、貼っておく。

写真をアップロードするスクリプト。

UploadURL = 'どっか'

##########################
require 'net/http'
require 'uri'

Net::HTTP.version_1_2

def upload uri, file
  uri      = URI.parse(uri)
  if block_given?
    boundary = yield
  else
    boundary = '--------------------------' +
      Time.now.to_i.to_s(36) + '--' + rand(10000).to_s(36)
  end
  
  Net::HTTP.start(uri.host){|http|
    header = {
      'content-type' => "multipart/form-data; boundary=#{boundary}"
    }
    data = []
    data << '--' + boundary
    data << "content-disposition: form-data; name=\"upload_file\"; filename=\"#{file}\""
    data << 'content-type: application/octet-stream'
    data << ''
    data << open(file, 'rb'){|f| f.read}
    data << "--#{boundary}--"
    data << ''
    
    data = data.join("\r\n")
    res = http.post(uri.path, data, header)
    res.body
  }
end

while true
  begin
    Dir.glob("*.jpg"){|file|
      puts upload(UploadURL, file)
      p file
      File.unlink(file)
    }
  rescue Exception => e
    p e
    p e.backtrace
  end
  sleep 0.5
end

ファイルを受信する奴とかファイル名を送信するサーバとか。

#!/usr/bin/env ruby18

require 'cgi'
require 'erb'

class ThroughFlow < Exception
end

MAX_FILES = 10

class Mgr
  def initialize
    @cgi    = CGI.new
    dmy, @mode, @arg, *@args = (@cgi.path_info || '').split('/')
    @mode ||= 'view'
  end

  def start
    @cgi.out{
      dispatch.to_s
    }
  end

  def dispatch
    # [@mode, @arg, @args].inspect
    if self.respond_to? @mode
      self.__send__ @mode
    else
      raise "Unkown mode: #{@mode}"
    end
  end

  def view
    ERB.new(File.read('view.html')).result(binding)
  end

  def upload
    data, = @cgi.params['upload_file']
    fdata = data.read
    filename = 'ul/' + Time.now.to_i.to_s + '.jpg'
    open(filename, 'wb'){|f|
      f.write fdata
    }
    files = ul_files
    while files.size > MAX_FILES
      File.unlink(files.pop)
    end
    test_page "upload: #{fdata.size}", files.join(',')+''#fdata.inspect
  end

  def check
    files = ul_files
    file  = files[0]
    begin
      children = files.map{|child|
        "<file filename='#{child}' date='#{File.mtime(child).to_s}' />"
      }.join
    rescue Exception => e
      children = ''
    end
    @cgi.out('content-type' => 'text/xml',
             'Pragma' => 'no-cache',
             'Cache-Control' => 'no-cache'){
<<EOS
<?xml version="1.0" encoding="Shift_JIS"?>
<check id='check' filename='#{files[0]}' date='#{File.mtime(file).to_s}'>
#{children}
</check>
EOS
}
    raise ThroughFlow
  end

  def ul_files
    Dir.glob('ul/*.jpg').sort{|a, b| b <=> a}
  end
  
  def test_page title, content
    <<-EOS
    <html>
    <title> #{CGI.escapeHTML title} </title>
    <body>
    <pre>#{CGI.escapeHTML content}</pre>
    </body>
    </html>
    EOS
  end
end

begin
  Mgr.new.start
rescue ThroughFlow
  
rescue Object => e
  CGI.new.out{
    <<-EOS
    <html>
    <title> Error </title>
    <body> <h1> Error: #{CGI.escapeHTML(e.inspect)} </h1>
    <p> #{CGI.escapeHTML(e.to_s)} </p>
    <pre>#{CGI.escapeHTML(e.backtrace.join("\n"))}
    </pre>
    </body>
    </html>
    EOS
  }
end

ブラウザにみせるためのテンプレート。

<html>
  <title> View </title>
  
  
<script type='text/javascript'>
<!--
  
function setstate(st){
  document.getElementById('text1').innerHTML = st;
}

function loadXMLFile(url){
  var req = createXMLHttpRequest();
  req.open("GET", url, false);
  req.send(null);

  if (req.status == 200){
    var xmldoc = req.responseXML;
    var filename = xmldoc.documentElement.getAttribute('filename');
    var date     = xmldoc.documentElement.getAttribute('date');
    loaded(filename, date);
  }
  else{
   setstate("error");
  }
}

function createXMLHttpRequest() {
   return this.XMLHttpRequest ? 
      new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
}

  
function all_properties(obj){
  var names="attrs: ";
  for(var i in obj)
    names+=i+"\n";
  return(names);
}
  
  
function check(){
  loadXMLFile('./test.cgi/check');
}
  
var counter = 0;
  
function loaded(filename, date){
  document.image1.src = filename;
  setstate((counter ++) + ": " + 
    filename + " (" + date + ")");
}

function setCheckTimer(obj){
  var interval = Number(obj.value);
  if(!interval || interval < 1){
    interval = 1;
  }
  obj.value = interval;
  window.clearInterval(timerID);
  timerID = window.setInterval("check();", interval * 1000);
}

function setImgSize(obj){
  if(obj.checked){
    document.image1.width = 640;
  }
  else{
    document.image1.width = 320;
  }
}
  
  // -->
</script>
  <body
    onload   = 'timerID = setInterval("check();", 2000);'
    onunLoad = 'clearInterval(timerID);'>
    <p>
      <img src='start.jpg' name='image1' boarder='1'/>
    </p>
    
    <div id='text1'> start </div>
    <input type='button' onClick='check();' value='reload image' />
    <div>
    check interval (sec): 
    <input type='text'   name='checktimerinterval' 
      onChange='setCheckTimer(this);' value='2' />
    <input type='button' value='reflect' />
    <br>
    double size?
      <input type='checkbox' name='doublesize' 
             onChange='setImgSize(this);' />
    </div>
    
    <div id='children'></div>
    
  </body>
</html>

こいつらで、簡易動画配信ができる。帯域は食いまくるわけですが。

JavaScript の使えるブラウザさえあれば、動画っぽいものが見ることができる。


今回の投票は他の方からネタを貰いました。


積年のバグがなおった。

\" を escapeHTML すると \&quote; になって、そいつを gsub 第二引数にしてアボーン。


うう、29件か。激戦だ。


鼠と竜のゲームを読んでるんですが、なんか終わり方がよくわからない。


shiro さんが出るとかいうドラマ、みそこねた orz

_13(Wed)

CAS (compare-and-swap) と LL/SC (load-linked/store-conditional) 、どっちが実装しやすい、ハードウェア的に有利なんだろう。

論文を探してるんだけど見つからない。


lock-free algorithm でいう LL/SC 命令は、プロセッサに載ってる LL/SC 命令よりも強い命令だったのだなぁ。知らなかった。(後者を restrected-LL/SC -> RLL/RSC と称しているらしい)。

rll/rsc 命令は (i) ll/sc が成功していても失敗するかもしんない(プロセッサの都合) (ii) ll/sc 命令の間に(共有)メモリアクセス禁止 という制限がある。

プロセッサのつくりを簡単にするためには、まぁ、そうだなとは思うけれど。


RLL/RSC 命令にはレベルがあるのか。

  1. ll bit を持っている
  2. ll bit と ll addr を持っている

前者は ll addr を持たないため、どんなキャッシュ一貫性制御が働いても rsc は失敗する。後者はその ll addr へのなんらかの一貫性制御が働いたら rsc は失敗する。

その辺を記述した論文が見つからん・・・。


CAS の実装ってどうなってるのかなぁ。load と store を一緒にしないといけない(かもしれない)から、複雑になるような気がするんだけど。Sparc や Itanium は CAS 使ってるらしいし。


ll addr は、なんか微妙に考えてるのと違うかも。。。


どうにも、探しても compare-and-swap と ll/sc は同等の記述力(意味)を持つ、くらいしか書いてない。ハードウェアに実装する視点からこれら二つを比べたものは無いものか。


compare-and-swap って、どうやって load/store 間の一貫性を保証してるんだろうか。データバスをロックしてしまう?


sparc のアーキテクチャマニュアルに載っている fetch-and-add の例。

FetchAndAddCAS(address => %i0, increment => %i1)
retry:
  ld   [%i0], %l0   #=> %l0 = *%i0
  add  l0, %i1, %l1 #=> l1 = l0 + %i1
  cas  [%i0], %l0, %l1
  cmp  %l0, %l1
  bne  retry

ll/sc でやってみる。MIPS。

FetchAndAddLLSC(address => t1, increment => t2)
retry:
  ll   t3, (t1)
  add  t4, t3, t2 
  sc   t4, (t1)
  beqz t4, retry

うーん。ll/sc のほうがいろいろと有利な気がするんだけどなぁ。


Acquire 命令は、load/store を 1 命令で行うんだが、それは CAS でも同様。ならば、CAS を行う回路で、compare and sleep に変更するだけで実装可能なんだろうか。なんか、CAS が十分軽量に出来るのであれば、それはそれで非常にリーズナブルな気がしてきた。

うーん。どうしよう。

「Acquire は load/store を 1 命令で行うため、ll2/sc2 はいいものだ!」という主張が崩れる。どうしよう。

まぁ、命令の使いやすさは ll2/sc2 のほうがいいから、別に優位性は変わらないのだが。論文の書き方が変わってしまう。

どうしよう。


うーん。MIPS (か PowerPC)と Sparc (とか Intel 系)を同時に作ってる人に聞けば、そのよしあしがわかるね! って、そんな人いるのか。

キャッシュのコヒーレント制御プロトコルや、バスの設計にも依存する話だしな。どうしたもんだか。困った。

探しても探しても、CAS やら ll/sc を利用したアルゴリズムの話ばかり出てくる。


下位互換のために CAS にしてるのかなぁ。でも、Itanium の説明になってないな。

LL/SC から CAS はできるけど、CAS から LL/SC はできない。CAS が十分コストが少なければ問題ないんだけれど。はて。


IBM dW : Java technology : Javaの理論と実践: アトミックで行く - Japan

CASのような命令を使うと、もし他のスレッドが変数を変更するとCASがそれを検出(または失敗)し、アルゴリズムがその操作を繰り返すことができるので、他のスレッドが途中で変数を変更してしまう、という心配をせずにread-modify-writeシーケンスを実行するアルゴリズムが可能になります。リスト3はCAS操作の振る舞いを示しています(パフォーマンス特性は示していません)。しかしCASの真価は、ハードウェアで実装でき、しかも(大部分のプロセッサーでは)非常に軽量だということです。

非常に軽量なのかぁ・・・。


ll/sc の初出が A New Approach to Exclusive Data Access in Shared Memory Multiprocessors らしい。


きちんと「CAS などよりも latency とかの問題で優れてるし、RISC っぽくパイプラインシンプルになるぜ」って書いてある。

しかし、87年の論文の記述。さて、これを信用することができるのか。


cas の実装方法がどっかに載っていないものか。

cas で実装しか見つからない。


The dragon processor (ACM SIGARCH Volume 15 , Issue 5 (October 1987)) より。

CST: Conditonal Store

The implementation of CST is primarily in the cache; the IFU presents the cache with the ptr, old, and new words, issues a CST command, and receives the sample result word. Synchronization with other processors is not necessary unless the addressed cache line is shared and old equals sample.

キャッシュで追い出し禁止にしておけば済むから、バスは押さえなくてもいいってことか。

しかし、古い。

あとは、ll/sc と cas との比較が見つかればいいんだけれど(A New Approach to Exclusive Data Access in Shared Memory Multiprocessorsには載っているが、できれば最新の技術の元での比較)。


まだまだ Rubyist Magazine が Ruby Magazine だと思われている。まぁ、しょうがないか。


愛が冷めたのか知らん。


うーむ。CAS が十分速いプロセッサなら、SMT-block が簡単に適用できるような気がしてきたな。要するに、Acquire 命令にエラー処理加えるだけだから。そうなると、提案手法の意義が・・・。

まずいなー。

ロック獲得予約を前面に出せば、大丈夫だろうか。


QOLB ってなんだー。


コルビー


あー、今日はたくさん論文刷った。


むぅ、セーターの下が気になる。


Ruby と Smalltalk ってそんなに離れてないんだろうか。いろいろと大変そうだなぁというところは思いつくけど。別に否定はしませんが。楽しみではあります。


なんかえらそうだな、俺。

きっと俺より凄いので是非勉強させてください。

最近停滞中。

_12(Tue)

寒すぎ。


情報処理関連の学会などの広報は SWoPP ML がそれを代用している。しかし、ソフトウェア開発とか、その辺のイベントの広報を集約する場所は、たしかにないなぁ。と、mixi を見て。作るのは簡単だけれど。


うわー。IPAX と SACSIS の日程、まんま被ってるやんけー! しまったなぁ・・・。SACSIS を蹴るしかないのだけれど。うーん、いろいろと SACSIS で聞くことがあったのに。

うーん、どうしよう。しくしく。SACSIS の懇親会にも出たかったのだけれど、きっと被りそうだよな。あきらめるしかないか。


うおー。SIGPLAN いきてー。

First ACM/USENIX Conference on Virtual Execution Environments (VEE'05) 聞きてー。

_11(Mon)

ありゃぁ。電話してくれればよかったのに。


課題図書。YARV には全然関係ないけどさ。


4/16(土)の RHG 読書会は、arton さんをお招きして根掘り葉掘り聞き出そう会を予定しているので、暇な人も暇じゃない人も是非。

詳細は RHG読書会 ML にご参加して確認してみてください。

_arton(Mon Apr 11 21:35:25 JST 2005)

 ぎょぎょ

_babie(Tue Apr 12 01:09:44 JST 2005)

 うおぉー、録音 & podcasting キボンヌ、「Sound Stage」だし(笑)(

_ささだ(Tue Apr 12 12:24:19 JST 2005)

 まず iPod 買ってください(って、iPod は必要ないのかな、これ)。

_10(Sun)

花見は楽しかったです。しかし原宿渋谷、人多いな。


今日は YARV の記事を書いてしまおう。


http://www.sakura.ne.jp/rs/03_05.shtml

随分安いんだなあ。


ふと、プルタップのことを思い出して、昔は外れたんだよなぁ、とか思って、最近の奴は、と思い出そうとしたら、そういえばペットボトルのものしか買わないなぁ、と思った。


音声認識ソフトを利用してテープ起こしができないか?

録音テープを聞きながらオペレーターが発話する方法が効率的

目からうろこ。


英会話の学習法として、音声認識ソフトが認識してくれる英語が発音できるまで練習する、というのはどうだろう。


ククク、なんか想像どおりの行動が観察できた。やっぱそうなんだなぁ。

_斎藤ただし(Sun Apr 10 23:38:13 JST 2005)

 お花見でご一緒させていただいた者です。一つ質問を忘れていました。YARVってなんて読むんでしょう?

_なるせ(Mon Apr 11 01:11:23 JST 2005)

 音声認識技術を用いて発音を採点するってところまで既に行ってますよ。http://www.phonepassjapan.com/

_ささだ(Mon Apr 11 01:51:27 JST 2005)

 好きなように読んでもらって結構です。>YARV

_しゅ(Mon Apr 11 11:42:52 JST 2005)

 土曜日曜とテープ起こししてました。しんどいですよね。時間がかかるってのもあるけど、集中を続けるのがしんどい。

_9(Sat)

さて花見。

_8(Fri)

えーーと・・・。

産総研にいってインタビューしてきました。

12:00 に家を出ました。

12:40 に家に帰りました。

(ほぼ)インタビューしかしてません。

アリエネー。


International Obfuscated Ruby Code Contest (IORCC) で、投票をやっているらしいです。


そういえば、高橋課題図書「星を継ぐもの」読了。ミネルヴァがどこから出てきたのかわからんかった。


なんかやらなきゃいけないような気がしたのでアンケートを更新(78: Ruby: Object の 上の Kernel をインクルードしない「なにか」の名前)。長すぎ。


通学で利用する桜並木が満開に。大変綺麗。事故らないようにしないと。

_(う)(Fri Apr 08 09:20:40 JST 2005)

 40分間ですか。しかも移動時間混みで。それだったら確かにありえねーですね :)

_maeda(Sat Apr 09 13:38:43 JST 2005)

 俺も課題図書出したい! 残りは何?

_6(Wed)

やっぱ指切られるのかー。


1999年から見て 2005年(現在)について想像できなかったことを考えてみる。やっぱり博士後期課程なんかに進むのは想像できなかったなぁ。


情報処理学会の研究会に、学生は一個無料で入れるんだけれど、何に入ろうかなぁ。PRO は先生が入っているので、論文誌は届くから要らないし。ARC も OS も同様。

多分、すげーマイナーで面白そうなのがいいと思うんだが。どうしようかな。

_びびび(Wed Apr 06 21:38:39 JST 2005)

 漏れが入っていても、「あぁ、彼もとっていたのか」があるから、好きなの、選んだ方がいいぞよ

_5(Tue)

スタッフロールつきの夢を見た。


高橋さんの宿題シリーズ、地球幼年期の終り読了。上主は overload なんだなぁ。しかし、1953年にこんなもん書いてるってのは凄い。

某何のカカレンはこいつのパロだったのか。


そういえば、D2 なんだなぁ。


URL が変わったので一応。

require 'cgi'
require 'net/http'

data = ''
while line = ARGF.gets
  data << line
  break if /\x00/ =~ line
end

body = CGI.escape(data)

Net::HTTP.version_1_2
Net::HTTP.start('www.atdot.net', 80) {|http|
  response = http.post('/sp.cgi/commit/auto',
    'paste_body=' + body)
  puts response.body
}

最近、なんだか考えすぎて行動が全然起こせていない。

考えすぎて、論文を書いていない。アレもやらないとあかん、これが全然足りない、それの評価が全然駄目。

考えすぎて、プログラムを書いていない。設計が〜。アルゴリズムが〜。

どうにも、いけないことになっている気がする。


shred 初体験。そして、そんなときに限って必要なデータが。そうならないことを祈ろう。

_babie(Tue Apr 05 18:22:11 JST 2005)

 今度は tai-tyou ですね(笑) @Redhanded

_ささだ(Tue Apr 05 18:25:31 JST 2005)

 ぶは。茶を吹くところでした。

_4(Mon)

さて、遊んでないで本腰入れないと。論文書くぞー。


CooS。未踏の CLI を基本とする OS。

うーん、OS のアーキテクチャが一切書いてないので、イメージがよくわからないなぁ。ソース見るのは面倒だし。


langsmith ML、変な spam がたくさんきてるんだなぁ。Matz にっき効果恐るべし。


favicon なぞを付けてみる。


wanderlust を使ってみる。

imap フォルダ名に @ が入っていると、そのフォルダが見れないっぽい。どうしたものか。サーバ名と勘違いしてるんだろうなぁ。


イベントなどに行くと、名刺を頂く機会が多いんだけれど、名刺と顔がさっぱり結びつかない。デジカメに名刺リーダーつけて管理、なんてどうだろう。名刺リーダー付き携帯・・・は重そう。


と思ったら、ITmediaモバイル:Samsung、7メガピクセル携帯を開発

Samsungの「SCH-V770」は7メガピクセルのカメラを搭載、マニュアルフォーカスなどカメラ付き携帯には珍しい機能や、MP3再生機能、名刺リーダも備える。(IDG)

欲しいかも。でもでかそうだなぁ。他の機能要らんし。


うーん、花見どうしよ。

_おだか(Mon Apr 04 23:16:44 JST 2005)

 1枚の画像を左右半分ずつ別々に撮影できる(わかりにくい…名刺と顔写真を1枚の画像に記録できるようになってる)デジカメとかありますよ。

_ささだ(Tue Apr 05 09:19:38 JST 2005)

 それだと名刺管理には辛そうな気がする。

_3(Sun)

椅子キター。

_2(Sat)

正直なところ、「ルビま!」休刊、と書いて「Rubyist Magazine」休刊と読む人がこんなに居るとは思わなかった。世間様では「るびま」も「ルビま!」も同じようにパースされるんだろうか。


星界の戦旗 IV 読了。図書館でばったり会えた。


しかし、笑ってくれる人がいるっていうのは、ほっとするね。大変、ありがたいです。


グインサーガ 93, 94 読了。よく続くよな。しかし、93 はともかく 94 はテンポがよくてよかった。半分くらいが反復だったんじゃないかと。でも、それを読ませる筆力はさすがだなぁ。


俺的 4/1 の一番は You Know Sasada-san? (略)だった。ちとフライング気味だったけれど。あぁ、あと選挙ポスター。あれもフライングだったな。


ちなみに、私は尊師の靴持ちらしい。あれ、かばん持ちだったっけ。


で、マジで騙されたのは母親に「円形脱毛症が出来てる」といわれたこと。古典的だとは思ったけれど、最近大変だったから。いや、まだ大変か。


う、首藤さんにひかれてしまったらしい(http://www.shudo.net/diary/2005apr.html#20050401)。


ガーン。Zope.org - Zope3勉強会第一回のお知らせ。4/9 らしい。行きたかった。python の勉強に。


投票、更新しました。


懸念だったサーバの交換をやっとやる。


sp.cgi の場所が変わりました。

http://www.atdot.net/sp/ でどうぞ。


これで、一応移行完了か。一週間くらい様子を見よう。

_かん(Sun Apr 03 00:08:16 JST 2005)

 …ひかれちゃったのは私の責任大ではないかと

_しゅ(Sun Apr 03 00:44:36 JST 2005)

内容は僕にとってもとても楽しいです。 でも、アニメ好きぶり(→内輪ノリ)を前面に出すのは、RubyファンとかRuby自体にとってプラスにならないんじゃないかと。 って、ヒいちゃうような(内輪以外の)人は見に来ないか。

_maeda(Sun Apr 03 15:12:16 JST 2005)

 アニメファンといっても、たいていの人は限られた(自分が学生だったころの)年代の作品にしか興味ないので…「ネギま!」とか知ってる人は数%くらいしかいないと思われます。

_ささだ(Sun Apr 03 15:32:23 JST 2005)

 ちなみに、私はネギま!もプリキュアもよう知りません。

_maeda(Sun Apr 03 23:23:19 JST 2005)

 「知ってる人は数%くらいしかいない」のは「名前さえ」ね。

_ogino.(Sun Apr 03 23:39:08 JST 2005)

 ネギま!もプリキュアもRHG読書会で知りました。

_babie(Mon Apr 04 00:34:32 JST 2005)

 やるな、RHG読書会。関西も負けてられないな。何で対抗しようかな?w

_babie(Mon Apr 04 00:37:01 JST 2005)

 ちなみに「ネギま!」は知りません。プリキュアは娘がいるのでちょこっと。「ルビま!」書いてた人らもほとんど知らないんじゃないかな?

_1(Fri)

今年度の目標です。

  • YARV で HSP を動かす
  • YARV でなでしこを動かす

両プログラミング言語は、覚えやすい、使いやすいと評判で多くのユーザが居ますが、処理系としての完成度から見ると少々疑問が残ります。そこで、(多分それなりに頑張った)YARV で動作させれば、処理速度の問題は解決されます。

実は、昨日の未踏ソフトウェア創造事業への申請は「日本発のプログラミング言語を世界に」というテーマで応募してみました。内容は上記を実現するようなものです。

通るといいんですが。


まずは HSP となでしこの仕様を調べるところからはじめないとなぁ。

_shiro(Fri Apr 01 20:12:04 JST 2005)

 Rubyにtranslateするのかな。

_dan5(Sat Apr 02 00:46:20 JST 2005)

 あとプリキュアも動くようにお願いします

_かずひこ(Sat Apr 02 07:59:39 JST 2005)

 それは「YAHV」と「YAなV」ちゃうの?

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