K.Sasada's Home Page

Diary - 2006 December

研究日記

師走

_31(Sun)

def foo msg = yield
  p msg
end

foo{
  "foo"
}

今日出来て感動したこと。


A Fine Time, Oh Yes!

ワンライナーと言われたから短くしたのに、みんな長いよ!


http://www.mylets.jp/

いいなぁ、と思ったやつはどちらも完売だった。


ドキドキ。

_30(Sat)

何事も無かったかのように職場にきたら、正面玄関が閉まっていた。


大学のサークルの同期と忘年会で5千円のランチ。今年一番の贅沢? 蟹ってあんなに食べるの楽だったんだ。


http://www.atdot.net/sp/view/p5w2bj/graph

simple paste にグラフ生成機能を追加。主に俺しか便利にならない。

これは、こんなプログラムで要素数を変えていったもの:

require 'benchmark'

def m
  print Benchmark.measure{
    yield
  }.real, "\t"
end

def main n
  ary = nil
  sum = max = nil
  n = n.to_i

  m{
    ary = Array.new(n){|i|
      ((i % 2) == 0 ? -1 : 1) * i
    }
  }
  
  m{
    sum = ary.sum
  }
  
  m{
    max = ary.max
  }

  p [sum, max] if $DEBUG
end

####################################

class Array
  def sum
    s = i = 0
    len = self.length
    while i<len
      s += self[i]
      i += 1
    end
    s
  end
end

main(*ARGV)

もうちょっと人の役に立つものは作れないかねぇ。


職場。空調が入らないのでとても寒くなってきた。

_あだむ(Sat Dec 30 18:23:31 JST 2006)

 オンラインサービスでひとつネタがあるんだが、どうかね?

_ささだ(Sat Dec 30 20:08:18 JST 2006)

 どんなんよ。それはともかく合コン。

_kou(Sun Dec 31 12:22:20 JST 2006)

 ささださんが飢えてる♪

_nishio(Sun Dec 31 21:41:19 JST 2006)

 っ[恋するプログラム 〜Rubyでつくる人工無脳]

_29(Fri)

考えてみると、Ruby でパイプライン処理を行っていくようなものって思いつかないんだよな。そんなものイラネ、なのかなあ。


map reduce の map って hash だよなぁ。やっぱ ruby っぽく hash で ...。うーん。

パイプラインじゃないけど。


計算時間の謎。

require 'benchmark'

def m
  print Benchmark.measure{
    yield
  }.real, "\t"
end

n = ARGV[0]
ary = nil
sum = max = nil
sign = 1

ary = Array.new(n.to_i){|i| sign *= -1; i * sign}

m{
  sum = ary.inject{|r, e|
    r + e
  }
}

こんなプログラム、つまり、配列の要素の総和をとる、というプログラム。

計算時間の結果: http://www.atdot.net/fp_store/5wg0bj.file/graph.png

計算時間を見ると、どうやら2次関数(以上?)に近似しているように見える。なんで?

[-1, 2, -3, 4, ...] という配列なので、総和が Bignum になることもないので Fixnum で収まっているように見える。

inject で配列を見ていくとき、なんかへんなことしてるのかしら。


なんだGoogleAlertって。YARVという単語にひっかかってまつもとさんの itmedia の記事の内容が飛んできたんだが。こんな設定した覚えが無いなあ。

勝手にgmailの内容や検索結果からアラート対象単語を抽出していたら、それはとても恐ろしい気がする(しかし、YARVで俺検索しないしな)。たとえば、エロサイトばかり見ていたら(略)。

気づかないうちに登録してたのかなぁ。


GC か! と思ったけど、さっきのプログラムで GC は起こらないしな。


そういえば GC が起こる! inject では、繰り返しのたびに毎回配列を作っているような気がする!


ハッシュとか考えないで、Rinda でいいんかいな。そんな気がする。


てか、今やってるやつって Rinda を使えばスグにできたような気がするなぁ。凹むなあ。


というわけで、やり直し。

結果: http://www.atdot.net/fp_store/luv0bj.file/graph.png

#########################################################
# Ruby
require 'benchmark'

def m
  print Benchmark.measure{
    yield
  }.real, "\t"
end

n = ARGV[0]
ary = nil
sum = max = nil
sign = 1

m{
  ary = Array.new(n.to_i){|i| sign *= -1; i * sign}
}

m{
  sum = ary.inject{|r, e|
    r + e
  }
}

#########################################################
# Ruby2
require 'benchmark'

def m
  print Benchmark.measure{
    yield
  }.real, "\t"
end

n = ARGV[0].to_i
arys = ary = nil
sum = max = nil
sign = 1
div = 4

m{
  ary = Array.new(n){|i| sign *= -1; i * sign}
  arys = (0...div).map{|i|
    s = i * n/div
    e = (i+1) * n/div
    ary[s...e] || []
  }
}

m{
  sum = arys.map{|ary|
    ary.inject{|r, e|
      r + e
    } || 0
  }.inject{|r, e|
    r + e
  }
}

#########################################################
# Ruby3
require 'benchmark'

def m
  print Benchmark.measure{
    yield
  }.real, "\t"
end

n = ARGV[0]
ary = nil
sum = max = nil
sign = 1

m{
  ary = Array.new(n.to_i){|i| sign *= -1; i * sign}
}

m{
  sum = 0
  i = 0
  len = ary.length
  while i < len
    sum += ary[i]
    i += 1
  end
}

Ruby2 は4分割してみただけ。4分割することで、GCの範囲がn/4になるかと思ったら、そういえばn/4 が 4 個あるんだから変わらないか。

Ruby3 は while でまわす(inject を使わない)ので GC は起きない。別に each でも良かったか。

結果は圧倒的に Ruby3(injectを使わない)が速い。

というわけで、GCのせいで O(n^2) になっていたってことでいいんだろうか:

  • n*Ci + (n * Pg) * Cg * n = n(Ci + Pg*Cg*n)
    • (Ci: 繰り返しごとのコスト、Pg:GC 発生確率、Cg: 1要素におけるGCのコスト)で O(n^2)。

こういうのを見ると、世代別GCを入れたくなりますねぇ。


一応 RubySum の要素ごとの差(Ai+1 - Ai)を見てみる。

http://www.atdot.net/fp_store/7zw0bj.file/graph.png

なんとなく等加速しているような気がする。


しかし、これは Ruby の実装を知らないとわからないよな。恐るべし Ruby。


ところで、Excel のマクロを作って fpc でアップロードするようなものを作って、1クリックでウェブ上にアップするようなものを作ったのだけれど、これをどのブックでも使えるようにする方法がわからない。

Excelでは、マクロはブック(Excelのファイル)に属する、ということで、Excelアプリケーション自体の拡張ではないらしい。だけど、このマクロはどんな場合でも使いたい。

さて、どのファイルについても同じマクロを使いたい場合、どうすればいいんでしょう。毎回インポートするのは嫌だ。


ちなみに、そのマクロ(選択しているグラフを z:\graph.png というファイルに export してから fpc でアップロードする):

Sub saveg()
  ActiveChart.Export ("z:\graph.png")
  Shell ("ruby.exe fpc.rb z:\graph.png")
End Sub

出来た。マクロの保存先を「個人用(Personal.xls)」というものにしておけばいいらしい。


each と while では、each のほうが速かった> sum

ブロックの実行は、まだまだ駄目やなぁ。


load と dump をうまいこと書けば、うまいこと Rinda と組み合わせることが出来そうだなあ。

_maeda(Fri Dec 29 13:54:29 JST 2006)

どうやら2次関数(以上?)に近似しているように見える。

そうかなあ。後のほうだけ見るとほぼ直線なような。 飛び飛びで良いから、もっと大きな値まで測るとわかるかも。 単に、小さいときはキャッシュがヒットして速いとか?

_素人zunda(Fri Dec 29 13:57:55 JST 2006)

 手元で測定してみました http://zunda.freeshell.org/d/20061228.html#p03 配列のインデックスの型などが関係してたりはしませんか?

_maeda(Fri Dec 29 23:46:59 JST 2006)

inject では、繰り返しのたびに毎回配列を作っているような気がする!

ゑ! そうなの?

作る配列のサイズがnに比例するんなら、そりはGC関係なくO(n^2)でしょう。

_ささだ(Sat Dec 30 01:14:52 JST 2006)

 ブロックを呼び出すためにブロック引数を渡すときに利用する配列(この場合2要素の配列)を作ります。

_nishio(Sat Dec 30 20:02:25 JST 2006)

 若手の会で僕がGRINEditを登録していることを言った気がするんで、その時に登録したのでは。←グーグルアラート

_ささだ(Sat Dec 30 20:07:46 JST 2006)

 う、全然覚えてない。

_maeda(Mon Jan 01 15:15:00 JST 2007)

n*Ci + (n * Pg) * Cg * n

GC回数がnに比例し、1回のGCのコストが生きてるオブジェクトのサイズ合計に比例するってことね。

そういう場合は、生きてるオブジェクトのサイズ合計の比率が一定になるように、nに応じてヒープサイズを増やしてやればよいのだが。

_28(Thu)

初めて神田食堂に行ってみた。


初めて dRuby をまともに使ってみた。いや、まともじゃないか。まだ toy。


で、テストがかけないんだよな。どうしたものか。


http://www.rubyist.net/~matz/20061221.html#p01

なんか、こんなのを今作っていたりする。お仕事で。Ruby で。

パイプライン処理が出来ないんだよな。どうしよう。うーん。もう一つプリミティブが必要だ。キューかなぁ?


ハッシュなんてどうかなぁ。新しそうだが、何するのかよくわかんないな。やっぱりキューかなぁ。

_27(Wed)

FUSE + gpg で暗号化ファイルシステム。ただし復号は出来ません。

なんてのを考えてみた。


echo foo | ssh ... cat

みたいなことが出来るというのは知らなかった。へーー。


http://www.dadd9.com/tech/networkadmin_02.html

dd をはさむ理由が、やっぱりよくわからなかった。

_26(Tue)

ううむ、GCでsegv。

_25(Mon)

RHG で、重複したモジュールの include 問題について聞いてみた。

  1. 重複しても include すべきだよ派
  2. 重複していたら例外出そうよ派
  3. 重複して欲しい場合として欲しくない場合があるから、別物にしようよ派
    1. 特殊なmoduleをつくろうよ派
    2. 特殊なincludeをつくろうよ派
      1. include するとき dup するようなメソッドをつくろうよ派
    3. 特殊なメソッド定義をつくろうよ派(メソッドによって異なる)
  4. 実装が大変だから、今のままでいいよ派(俺)

大体こんな感じだった。

1 が楽でいいよな。多分、従来のものからたくさん例外が出てきそうだが。

実装を言い訳にするつもりは無いので、「やっぱりこういうのが使いやすい」というふうに議論してもらいたいものである。


今年はクリスマスなテーマのtDiaryな日記を見なかったような気がする。なんでだろ。


女子大の先生って色々大変なんだろうなぁ。


PGP秘密鍵のパスフレーズを忘れてスゲーあせる。で、思い出す。なんてパスフレーズ付けるんだ俺。


CGI でアップロードしたファイルを gpg で暗号化して送るというようなものをちょっと作る。www-data 用に鍵輪を用意しているのがとても気持ち悪い。


最近、まつもとさんは何所にでもいるような気がするなぁ。イベントに呼びたいような、まつもとさんレベルの開発者が、他にほとんどいないってことなのか。

_24(Sun)

とても寝てしまった。ラッキー。

_23(Sat)

今日は RHG 読書会で JavaScript のお勉強をします。

RHG読書会::東京 入門JavaScript


まぁ要するにRHG忘年会なわけです。


YARVソースコード勉強会(1-9)

いやー、素晴らしい。

defined? は、実は本当はもうちょっと頑張らないといけないような気がするんだけど、てきとーでいいや、という場合は、

begin
  expr
rescue Exception
  false
end

みたいな実装になっていたりする。


RHG。

JavaScript は改行と空白は違うものらしい。return expr は、return の後ろに改行してはいけないらしい。

  return x;
  return
    x; // return の意味(x は無視)

は意味が違うということに驚愕。なんだこれは。


a = b = "1"
a + b - a * 1

これは凄い。


"1"+"1"-1

こういう意味。


"1"+"2"

+"1"+"2"

+("1"+"2")

とか。

_みずしま(Sat Dec 23 16:17:51 JST 2006)

 よくわからないんですけど、Rubyも同じじゃないんですか? > returnの解釈

_ksm(Sun Dec 24 00:14:40 JST 2006)

 セミコロンが入りそうな文脈だったらセミコロンがあることになってしまう、ってトコですね

_斎藤ただし(Sun Dec 24 00:21:12 JST 2006)

 Rubyと部分一致(改行!=空白)するから「驚愕」ということでは>みずしまさん

_とおる。(Mon Dec 25 11:19:31 JST 2006)

 JavaScript だと +"1" は 1 になるんですか。Awk とか Perl といっしょですね。Flash の ActionScript では明示的に parseInt を呼ばないとだめみたい。数値→文字列の暗黙の変換は ActionScript でもやってくれます。

_22(Fri)

面白い == わかりやすい、なんだろうか。

ということは、私は面白くない研究をしているんだよなぁ。

わかりやすくする努力は、少なくとも必要だよな。目標と結果がわかりやすいことも、多分重要だ。

_zunda(Fri Dec 22 17:16:52 JST 2006)

 面白くてわかりにくいものもありますよね。例えばRHGとか。…あー。例が良くなかったです。わかりにくさを複雑さだと思うと、本質的に複雑で、かつ、面白いものもあると思います。

_21(Thu)

先日、勝手に改造の最終巻を見たんだけど、アレはいったいなんだったんだ。

_20(Wed)

cvs2svn Statistics:
------------------
Total CVS Files:              3030
Total CVS Revisions:         48491
Total Unique Tags:             165
Total Unique Branches:          19
CVS Repos Size in KB:        71559
Total SVN Commits:           11401
First Revision Date:    Fri Jan 16 21:13:04 1998
Last Revision Date:     Mon Dec 18 08:37:49 2006
------------------
Timings:
------------------
pass 1:    58 seconds
pass 2:     0 seconds
pass 3:    19 seconds
pass 4:     0 seconds
pass 5:     5 seconds
pass 6:    18 seconds
pass 7:     0 seconds
pass 8:     0 seconds
pass 9:  1343 seconds
total:   1446 seconds

うーむ。


なんか qmail 環境が腐った?


qmail が localhost というアドレスの解決が出来なくなっていたらしい。なんで?


lithium というのが ruby 開発用のマシンなんだけど、ほとんどの ruby コミッタは cvs 限定で利用できるものらしい。しらなかった。ので、変なメールを打ってしまった。

ruby-committers という ML もあるらしい。そっちでやれば良かったのに、と言われたけど、知らんし。そもそもコミッターじゃねーし。

コミッターじゃないのに、こんなに色々するほうが悪いってことなんだろうか。そうかも。


とりあえず、焦っただけ意味が無かったらしい。あんまり、マージとか考えず、粛々と開発を進めろって感じか。


結局新マシンになるまで svn はお預けということになりました。


.htaccess / .htpasswd だと、メンバー管理がやっぱり大変(一元管理がすごくしづらい)。素直に db というか rails 使えばよかったか。デプロイが大変だった。


テスト 0 だしな ...。

_19(Tue)

いろんなことがうまくいかない日だった。

って、いつもか。

_18(Mon)

Rubyの本読書会 第三回

木曜日です。さすがに年の瀬で人が少ないかな。


まるごとPerlはもうすぐまるごと見れなくなるらしい。

_17(Sun)

http://www.rubyist.net/~matz/20061205.html#c06

真のスレッドってなんですかね。


http://www.rubyist.net/~matz/20061206.html#p05

(Common) Lispは、真の言語を取り扱えない劣った人々がアイディアを取り込んでくる言語である

(Common) Lisp 以外の「真の言語」を取り扱えない劣った人々が〜 というように読んでしまった。つまり、(Common) Lispを使っている人 == 劣った人々。

どうにも文脈と違うよなぁ、と思って、気づくわけですが。

_16(Sat)

_15(Fri)

http://q.hatena.ne.jp/1164980977#a645621

さっき卜部君に聞いた。いやー、これで満足な回答なのか。素晴らしい。

perlすら出来ない俺はダメダメ。だからRubyなんかで(ry


どこぞで学会なんてなんで必要なの、論文なんてウェブで勝手に上げればいいじゃん、という話があった。うーん、そうかも、と思う反面、とてもいい加減な情報ばかりが出回っている(出回らせている一人かもしれない)現状では、それ(ウェブで勝手に)でいいとは思えない。

といいながら、最近はURLを参考文献に含めることが多くなってきたな。もうすぐWikipediaを参考文献にひくこともあるんだろうか...。

少なくとも、ほってんとり==貴重な情報、信頼できる情報ではないという感想。


もちろん、分野によるとは思います。


YARVソースコード勉強会 (8)

毎度毎度素晴らしい。

長くなったのでこちらでコメントを。

superとメソッド呼び出しとの違いは、おおまかには、invokesuper命令を使うかsuper命令を使うか、だけです。なので流れは先週と一緒ですね。コンパイル後の命令列は、以下の順番です。

 -> invokesuper命令 or send 命令

ローカル変数は書き換わるかもしれないですが、その場合は書き換わった値が渡る...

仕様が整理されました。

前回の宿題として、「この parent_block & 1 ってなんだろう?」が残ってました。じつは未だによくわからないんですけど、これは ブロックと Proc オブジェクトの分離 関係、かな。

ここは盲腸みたいなコードだったので整理しました(消しました)。NODE構造が変わったので。

::ありの場合は少しややこしいですが、定数も基本は getconstant 1命令へコンパイルされます。ただし、「定数インラインキャッシュ」の最適化が有効になっていると、こんな感じの3命令になります。

http://jp.rubyist.net/magazine/?0010-YarvManiacs 参照。実は、getconstant 命令は1命令にはなりません。前にスタックに一つ詰まれていることが前提になります。

insns.def より

/**
  @c variable
  @e
   get constant variable id. if klass is Qfalse, constant
   is able to access in this scope. if klass is Qnil, get
   top level constant. otherwise, get constant under klass
   class or module.
  @j
   定数を得る。klass が Qfalse なら、そのスコープで得られ
   る定数を得る。Qnil なら、トップレベルスコープを得る。
   それ以外なら、klass クラスの下の定数を得る。
 */
DEFINE_INSN
getconstant
(ID id)
(VALUE klass)
(VALUE val)
{
    val = eval_get_ev_const(th, GET_ISEQ(), klass, id, 0);
}

ここでいう「スタックに一個つまれている」というのは、二個目の括弧内にある klass ですね。

で、getinlinecache 命令に失敗すると、nil が積まれます。

って、これコメント逆だ。nil ならカレントスコープから検索。

組み込み変数(Rubyリファレンスマニュアル - 組み込み変数)のうち、ほとんどはgetglobal命令で値のとれる、グローバル変数です。ただし、正規表現マッチで使われる$1,$2,...だけは他のグローバル変数とは区別されて、getspecialというYARV命令に落ちるようです。

厳密にはグローバル変数ではなく、組み込み変数(メソッドローカル)なんですね。あと、$~ なども同様ですね。

変数の項でまとめる話じゃないかもしれませんが、resuce節で変数と例外のクラスを宣言した場合、NODE_ERRINFOというノードがくっついてきます。詳細略ですが、getglobal $! して、クラスチェックをした後変数vにsetdynamicするコードにコンパイルされています。

関係ないんだけど、getglobal $! なんて出てきたっけ?(自信のない作者) ... $! って NODE_ERRINFO にならないのか! なんてこった! パーサ変わったのかな。

それはともかく、この部分は面倒ですね。とりあえず、setdynamic するコードにはコンパイルしません。クラスもチェックしてないんですよね。

begin
  raise
rescue Exception => e
end

#=> compile

0000 getinlinecache   <ic>, 7                                         (   4)
0003 getconstant      :Exception
0005 setinlinecache   0
0007 getdynamic       #$!, 0
0010 send             :===, 1, nil, 0, <ic>
0016 branchunless     25
0018 getdynamic       #$!, 0                                          (   5)
0021 dup                                                              (   4)
0022 setlocal         e
0024 leave
0025 getdynamic       #$!, 0
0028 throw            0

しかし、こんなんでよく動いていたな。$! へのアクセスは NODE_ERRINFO になるとばかり思っていた。ガーン。コンパイル時にチェックするようにしようかな。

というわけで、こういう簡単なループがブロックで書かれているときは、while文に変換されます。

実はされません。とても微妙なバグがあるため、この機能はオフになっています。ただ、3.times みたいなのは決めうちで while にしてもいいのかもしれませんね。そうしちゃおうかなぁ。

x.times{...}

#=>
  eval x
  timescheck Fixnum, times, lnormal
    # x が Fixnum で、Fixnum#times が再定義されていないかチェック
  3回while loop
  jump lend
lnormal:
  send :times, ...
lend:

みたいな。こんな単純には行かないかも。


しかし、俺今日未踏のキックオフで喋らないといけないんだが、こんなことしてていいんだろうか。


発表終わり。なんか、締切りドリブン。

_hzkr(Fri Dec 15 12:08:42 JST 2006)

こんにちは!コメントありがとうございます。毎度ツッコミビリティ高くてすみません。 クラスチェックというのは(用語が正しいかどうかよくわからないのですが)、rescue Klass => e のときの、Klass===$! かどうかの判定

0010 send             :===, 1, nil, 0, <ic>
0016 branchunless     25

を指すつもりで書いてました。この意味ではチェックしてますよね。

_nishio(Fri Dec 15 23:42:16 JST 2006)

論文とウェブのいいとこ取りがあればいいんだと思う。 ウェブで発表するときにある程度きちんと概要とかキーワードとか参考文献を書いて、学会が論文別刷り代より安価な金額で専門家によるレビューをしてどれくらいの有用度かを評価・保証してくれるサービスを提供して、文科省や大学がそのウェブ発表も業績として評価するようになればいい。

まだそんな時代は来ないと思うけど。特に3番目が厳しそう。

学会に頼らないでもソーシャルブックマークにマイナス点と評価者の評価を入れればいいのかもなぁ。でもそういうサービスだと「どこの誰が評価したかわからないから参考にならない」って言われそう。

_おびなた(Sun Dec 17 03:23:48 JST 2006)

 常にコンテンツが書き換えられる可能性があるWikipediaが参考文献ってどうなんでしょうね。リファレンスのさいはリビジョンまで指定すれば済むのかなぁ・・・。

_ささだ(Sun Dec 17 11:09:20 JST 2006)

 サイトへのリンクも、同様の問題があるのですよねぇ。

_14(Thu)

samidare が新しいRubyスレを捕捉してくれた

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

うーむ、YARV の話、というか未踏の話が出ている。

未踏取りすぎ、というのは自分でもその通りだなぁ、と思わなくも無い感じです。すみません。いや、すみません、じゃなくて、税金出した分は納得してもらえるだけの成果を出したいと思っております。

ただ、未踏は成果を無理やり出すために本末転倒なことにはならないので、欠点にはならないと思います。というか、ちょうどいい締め切り効果になって、良い感じです。


さて、私は未踏を取ったほうがよかったでしょうか。それとも、良くなかったでしょうか。


とても久々に未踏スレを見てみた。

http://pc8.2ch.net/test/read.cgi/prog/1127857952/405

これの採択レベルがよーわからんのだけど Ruby2のランタイムエンジン作ってる人のレベルだと この企画のどこらへんのレベルなの?ぎりぎり?

ギリギリな予感。


未だに CGI というか、ウェブ関係のセキュリティについては勉強しないといけないなぁ、という感じなのですが、高木先生の日記を久々に見て、やっぱり自分はわかっていないなぁ、と思った。

http://takagi-hiromitsu.jp/diary/20061115.html

高木: やはりね。対策なんだけど、既存の秘密情報がパスワードしかない。ユーザ名はCGIの「HTTP_USER」で取れるんだけど、パスワードって取れないの?

「HTTP_USER」ってなんだろう orz

大岩くんは、CGIでBasic認証のパスワードを取得できないようになっている理由を説明した。

どこかに説明あるかな。ぐぐったら BASIC 認証をするための方法がわらわら出てきて orz

高木: そうだね。ただ、弱いキーが設定された場合はユーザの責任にできる。そうすると、Refererチェックの方がよい場合もあることになるんだけど……

そうすると、の接続がわからなかった。

大岩: Referer方式は、同じホスト上のページに罠があるとチェックになりませんね。tDiaryは日記ですから。でも、これは POSTに限定することで防げますね。

罠って何を想定してるんだろ。tDiaryは日記だから何だろ。

CSRFをきちんと理解していないだけなのかな。


もちろん、会話形式なので、厳密な議論を掲載するのが意図じゃないとは思うのだけど、わからないことばかりで、やっぱり自分がわかっていないことを再認識する結果になった。

世の中のプロ、というか外にサービスを出している人はこういうことを常に意識しているのだなぁ、というか、自分もサービスを書いていないことも無いので、きちんと意識しないといけない。というか、この日記大丈夫なのか。


最後のほうの議論で、Refererを改変できちゃうのは脆弱性か云々、というところ。何に対してどう脆弱なのかわからなかった。


cap

こないだたださんが撮っていた写真を上から。

というか、なんか踊っている人たちが居る。

_Tets(Fri Dec 15 10:58:41 JST 2006)

お節介ですみません。 http://www.ipa.go.jp/security/vuln/websecurity.html ここのpdfの資料がとても参考になると思います。

_13(Wed)

class C
  def ===(o)
    p o
  end
end

begin
  raise "foo"
rescue C.new
rescue
end
  1. さて、現状のRubyではどうなるでしょう。
  2. さて、現状のYARVではどうなるでしょう。
  3. では、理想的なRubyとしては、どうなるべきでしょう。

... ただ単にチェックをサボっているだけなんですが。やっぱりエラーになんなきゃだめでしょうか。


begin
  raise
rescue
rescue
end

って合法なんだね。知らなかった。


うささんからの出題。

begin; raise Object; rescue; p $!; end
begin; raise Object; rescue Class; p $!; end
begin; raise; rescue Class; p $!; end
それぞれどうなるでしょう。

http://www.rubyist.net/~matz/20061205.html

物書き

ちょっ。

_12(Tue)

マルチスレッドプログラムで fork は危険、というのは認識していたけど、「使えない」という認識は無かった。

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


void test(void);

void *
thread_func1(void *dmy)
{
    printf("thread_func1 start on %d\n", getpid());
    sleep(5);
    printf("thread_func1 finish on %d\n", getpid());
    return 0;
}

void
test()
{
    pthread_t tid;
    if (pthread_create(&tid, 0, thread_func1, 0) != 0) {
	perror("pthread_create return non-zero");
	exit(0);
    }
    sleep(1);
    // sched_yield();
    // pthread_join(tid, 0);
}


int
main(int argc, char *argv)
{
    int pid;
    test();
    pid = fork();

    if (pid == 0) {
	/* child */
	test();
    }
    else {
	wait();
    }
    pthread_exit(0);
    return 0;
}

マルチスレッドプロセス上で fork しているだけなんですが。

NetBSD では、子プロセスでの pthread_create が core を吐くそうです。うぇぇ。

これをされてしまうと、YARV では、NetBSD 上で fork が出来ない、という悲しい事態に。

_masterq(Tue Dec 12 21:42:57 JST 2006)

あー、それはNetBSD側がわるいんじゃないでしょうか。 NetBSDのスレッドライブラリは変態すぎます。

NetBSDはスレッドの管理をmmap領域の頭に置いて管理しています。 forkする時は「(mmap領域はそのまま放置して)スレッドスケジューラを停止させる」 みたいです。 forkした子供がpthread_createすると再び凍っていたスレッドスケジューラが息をふきかえすのですが、当然放置されていたmmap領域が悪さをすると思います。

NetBSDの場合、forkしてexecせずに再度スレッドを使う場面は想定していなさそーです。 あー。

_ささだ(Tue Dec 12 23:01:06 JST 2006)

 なるほど。ちなみに、他の環境でのレポートキボン。

_masterq(Wed Dec 13 11:02:25 JST 2006)

 FreeBSDもNetBSDに似たKSEってなのを使っているんですが、同様の症状が起きないか不安ギミとか

_11(Mon)

YARVソースコード勉強会 まとめが出来てる。素晴らしい。

しかし、Rails のコードを読めば、書籍への引き合いもあっただろうに、と思うと大変申し訳なく思わなくも無いです。


Google Developer Seminarに行ってきた。

目的のディナーがしょんぼりだった。

セミナーの内容は、まぁドキュメント読めばわかる内容か。

金田さんにお会いすることが出来た。

_10(Sun)

PS は成功したような。


Rubyが凄くなった原因というか遠因の一つは、仕様が実装にひっぱられていないことだと思うんですよねぇ。

_9(Sat)

また、とてもバカなことをやってしまった。

_8(Fri)

しかし、日本Rubyの忘年会って凄い。関東ローカルじゃなくて、日本。


if-pre-up.d が起動時に動かなかったのは shebang が無かったかららしい。


shebang は shbang では無いらしい。

_もろはし(Fri Dec 08 14:51:05 JST 2006)

 う、たしかに>日本 日本Rubyの会とかけたつもりだったんですけどやり過ぎ感がありますね。これで関西で開かれなかったりしたらやだなぁ

_向井(Fri Dec 08 16:20:33 JST 2006)

 shebang というのはふつうの英単語なのです。意味は小屋とか。ちなみにアクセントは後ろにあるので、ときどき見かける「しーばん」という読みは実は誤りくさいです。

_ささだ(Sat Dec 09 01:09:23 JST 2006)

 しばーん?

_nishio(Sat Dec 09 04:20:55 JST 2006)

 シャリバン?(違

_通りすがり(Sat Dec 09 10:55:20 JST 2006)

 英辞郎によると「sharp + bang」(# + !) と言うことで、発音はシバンだそうです。

_shiro(Sat Dec 09 18:10:31 JST 2006)

 へぇ。#を "sharp" って読ませるの、珍しいですね (USだと"pound sign"が普通。"sharp" と言って通じなくはないだろうけど、たぶん一瞬「へ?」って顔をされることが多いんじゃなかろうか)

_arton(Sat Dec 09 20:36:00 JST 2006)

 ハッシュバンっていう呼び方もするみたい(説明文ではnumber signと書いているところがおもしろい)。http://en.wikipedia.org/wiki/Shebang_(Unix)

_7(Thu)

Etch RC1 をインストールしてみたら、/etc/init.d/iptables が無くて困った。まだ困ってる。どうしよう。なんで無くなったんだろう。便利だったのに。

exim4 をそのまま使ってみるが、設定が全然わからない。なんだ、.conf.conf って。

あとは、特に苦労なく。あ、そもそも sarge が DELL マシンで SATA HDD だったので入らなかったというのがあった。

暗号化とか、セキュリティとかは、特に気にしないでいい、ということになったみたい。... いいのかなぁ。

暗号化ファイルシステムは導入してみたいが、どうやるんだろう。

_6(Wed)

cgi.rb でファイルのアップローダー。モデルも何もかも1クラス1ファイル。うーん。関数型(絶対違う)。

せめて、モデルは別クラスにしたほうがよかったかな。

Rails だと、erb部分(view)のテストとかもできるのかなぁ。どうなんだろ。


仮想化実装技術勉強会だった。

IA64版かー。どっちかというと、仮想化の前にコンパイラ技術な気もする。

_5(Tue)

Sunのまくにーり会長の講演会を聞く。さっぱりわからんかった。英語が。


RailsかCGIか悩むが、とりあえずCGIで作る。4時間くらい。どちらかというと content-type をどうするか、とかに悩んだ。


Rubyの本読書会。班分けはまずまず成功だったのではなかろうか。

しかし、やっぱりつらいな、これは。もっとゆるゆるとやる方法は無いだろうか。

_4(Mon)

まだ全然消化できていない.ヤバス.


2007年がどうの,っていうのは気にしないでも,こっちが勝手に2007年的だ! と解釈するような気がするので,ぜひともご応募お願いします>RubyKaigi2007


2006もRuby会議にしようって言ってたのを頑なに拒んでいた高橋さんは、どういう心変わりがあったんだろう。


休日は本当に休日でダラダラしていた。なんとも、申し訳ない。


偉い人の前でしゃべるのはつらいな。しかも、全然ここにいる意味がわからない俺が。


偉い人の偉い人である所以は、やはり受け答えが自信満々なことなんだろうなぁ。


カーネル読書会。ロシアのかたによるOpenVZなどの紹介。面白かった。ロシアの方の英語はとても聴きやすい。

生yooseeさんに会った。

_3(Sun)

スーツを受け取りにいくついでに髪を切る.その前に本屋で失踪日記,うつうつ日記,監督不行届をかう.失踪日記は,どっかで読めないかなーと思ってたんだけど,結局読めていないので買うことにした.さて,今の季節に研究室に置いておくのは,やっぱり問題があるだろうか.


明日はスーツか.気が重い.ネクタイ絞めれるんだろうか.


http://jp.rubyist.net/RubyKaigi2007/

RubyKaigi2007,やります.どうぞお楽しみに.プレゼン応募してね.こんなの考えてるんだけど,どうだろう,みたいな話があったらぜひご相談を.

とりあえず青木さん,応募しといて.

_みずしま(Mon Dec 04 12:14:30 JST 2006)

 僕もいつもネクタイを締めるのに苦労します。

_2(Sat)

ダビンチコードをつい全部読んでしまった.

gauche って左って意味なのか.


スーツを,結局半額のチラシが入っていた青山で買ってしまった.

4.5万円.もっと安いものでも良かったんだが.


某髪の毛がうねうねして踊ってるやつを見る.全然意味わからん.

_斎藤ただし(Mon Dec 04 04:35:30 JST 2006)

 ご存知かもしれませんが、あの業界はいわゆる不当価格表示が常識のようです。先日ビジネス用コートを探しに行ったのですが、「コートを買えばスーツが1000円」とあったので「スーツは持ってるから要らないんだけど」と言ったら「すぐに半額にします」とか。倍額になっていたスーツを割高の「半額」で買った、とかじゃないことを祈ります…

_ささだ(Mon Dec 04 08:12:54 JST 2006)

 あー,割高っぽいなぁ.

_1(Fri)

一段落ついたので溜まっていたことを消化しないと.


未踏の説明会,の後の交流会だけ参加.ただ飯を食いに行ったんだが,30分遅れたらすでにご飯がほとんど無かった.しくしく.

酒徳さんとか,松原さんとかとお話.

その後池田さんによる二次会.毛利さん,岡田さん,石原さん,竹内さん,杉山さんらと.なんか,日本や世界の各社社会とか,そういうめったに聴けない話が聴けた.だから未踏は面白い.

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