GPLv3が「とんでもない変更」になったら、それは十分に信義則違反で無効になりうるものなのよね*2。これだけ契約者の意思が明らかなものも滅多にないし。
*2:もちろんFSFと「契約した」人についての話であって、そもそも著作権を譲渡していない、自分の責任でライセンスをGPLにした著作権者は論外
javascript:(function(){ var Q = document.getSelection(); if(!Q){ Q = prompt("Enter ruby-*:000000", ""); } var arry = Q.split(':'); var result = window.open(); result.location.href = 'http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/' + arry[0] + '/' + arry[1]; void(0); })();
ruby-dev:25596 というのを選択してブックマークレットを実行すると blade に飛ぶ。選択していないとプロンプトで聞いてくる。
そうなんだよな。CUIの長所って結局履歴と補完なんだから。だったらzsh使わなきゃダメなんだよな。いつまで経っても今のbash使ってるようじゃ、リッチなGUI環境に勝てるわけねーんだよ。
バカが征く
お金があったら LL は捨てて .Net で VisualStudio でハアハアしますよ。.Net って何なのか未だにぼんやりとしか分かってないんですが。
ri の補完は ruby-talk に投げてみたけど、完全にスルーされました。Subject に as useful as viagra ぐらい入れておかないといけないのだろうか。
Eclipse を使ってみました。非常に重い。Emacs より重いエディタがこの世に存在したとは。それになんだか何も考えなくても楽できるというほどでもないようだ。拡張したい時は Java で plugin を書かないといけない。Java 知らないし。
hideshow.el の hs-hide-block の動作が Ruby スクリプトだとどうもおかしい。何が悪いんだろう。
録画しておいたプリキュアの最終回を見ようとしたら、何故かゾイドが録画されていました。
確かに少ないと僕は思います。標準ライブラリ関連が揃っていないと思います。で、リファレンスを時々書いたりしているわけですが。
リファレンスが読みにくいかどうかに関しては、先日から ri + zsh 補完が(僕の中で)標準になったので、まあどうでもいいかなと。
おもしろいのは、2ちゃんねるのスレでもドキュメントが少ないという声があって「そうだよなあ、ライブラリ関連のドキュメントって少ないよなあ」と思っていたら、どうも2ちゃんねるでドキュメントが少ないといっているのは主にチュートリアルのことらしいんです。これは盲点でした。聞いてみないと分からないもんです。
Ruby の入門書なんて本屋へ行けば良書が売っているわけだから、チュートリアルがないと騒いでいるなんて思いもよらなかったんです。どんなプログラミング言語でもそうだけどオンラインのチュートリアルだけで修得できるのかなあ?
現時点では http://www.ruby-doc.org/ とリファレンスでだいたいのライブラリがカバーできるはず。カバーできていないライブラリ。
www.ruby-lang.org への不満点を投稿しよう。なるべく具体的に。単に「ドキュメントがない」だけだと、あなたが欲しい分野のドキュメントは一番最後になってしまうかもしれない。
逆引きRubyは俺も大変お世話になった(というか現在進行形でなっている)。恩返しをするべく、まだ開いてるページ(CGIとかは欲しい人が多そうだなあ)を埋めてみようかと思いつくものの、ForntPageから察するに、たけうちさんの執筆物という形で作っているようだから、細部修正はともかくでっかくのっけるのは気が引ける…。
そこでやっぱり止まってしまうのか。Wiki なんだから他人のサイトだろうが自分が思うように編集して良いと思います。自由に編集されるのが嫌だったら認証を掛けるでしょうし。
個人の Wiki でさえ編集することが躊躇されるんだから、Ruby の公式リファレンスマニュアルの編集するまでに乗り越えるハードルはやっぱり高いんだろうか。どうやったら人が集まるだろう。
Wikipedia についてに関しては反応リンク集の先までは読んでないんだけど、思ったこと。間違いに気付いたら正しい記事を書けないまでも、「こことここは間違っている」と書くだけで、それは立派な貢献だと思う。また、ページの記述が全体的にどうしようもなかったら、全部削除して「間違いが多すぎたので削除。執筆者募集。」と書き換えるのもありだと思う。
正解自体は なひさんがコメントで書いているけど、どうやってこれを調べたら良いのかメモ。
RFC 2459 「インターネットX.509 PKI - 証明書と CRL のプロファイル」の 7.2.2 に ASN.1 で
Dss-Sig-Value ::= SEQUENCE { r INTEGER, s INTEGER }
と書いてある。だから、
require 'openssl' include OpenSSL sig = ASN1::Sequence.new([ASN1::Integer.new(r), ASN1::Integer.new(s)]).to_der
が正解なのか。
でも RFC 2459 は RFC 3280 により obsolete されている。かつ RFC 3280 には DSA の署名の ASN.1 構造が載っていない。正解にたどり着くのは結構難しい。
DSA 自体の仕様は ANSI X.9.30.1 を見るのが一般的らしい。ただし有料。$50。無料で仕様書を閲覧できるRFC というシステムは素晴らしいなと思った。
がんばって RFC とか仕様書とかを読んでみたけど、このページが一番分かりやすかった。
ちゃんとデコードされる。おもしろい。
$ ruby -ropenssl -rpp -e ' pp OpenSSL::ASN1.decode("0,\002\024C\e\317)%E\300NR\347}\326\374\261fL\203\317-w\002\024\v[\232$\021\230\350\363\206\220\004\366\010\251\341\215\245\314:\324") ' #<OpenSSL::ASN1::Sequence:0x40331224 @tag=16, @tag_class=:UNIVERSAL, @tagging=nil, @value= [#<OpenSSL::ASN1::Integer:0x40331288 @tag=2, @tag_class=:UNIVERSAL, @tagging=nil, @value=383122548009866097833353951919834639622095187319>, #<OpenSSL::ASN1::Integer:0x40331238 @tag=2, @tag_class=:UNIVERSAL, @tagging=nil, @value=64841693857718051568170099635345788375059413716>]>
irb を使っていると画面に入り切らないくらいの大量の出力があった時に、| less したくなることがある。というわけで、作ってみました。.irbrc に以下のように書く。rdoc を参考にしました。
require 'pp' class IRBLess def setup_pager for pager in [ ENV['PAGER'], "less", "more", 'pager' ].compact.uniq return IO.popen(pager, "w") rescue nil end end def less(obj) pager = setup_pager begin save_stdout = STDOUT.clone STDOUT.reopen(pager) pp obj ensure STDOUT.reopen(save_stdout) save_stdout.close pager.close end end end class Object def |(less) if less.is_a?(IRBLess) less.less(self) end end end class Array alias :orig_bar | def |(less) if less.is_a?(IRBLess) less.less(self) else orig_bar(less) end end end def less IRBLess.new end
使い方。以下のように使う。
irb(main):001:0> Array.new(100){ rand.to_s } | less
とても便利。
出た。
zsh だと複数行の履歴を一度に表示する機能があります。例えば、いま手元でCtrl-r で履歴 ./ruby を検索すると以下のように履歴に表示されました。
$ ./ruby -ve ' [1, 2].each{|v| Thread.start{ p v } } '
irb でも
irb(main):001:0> class Foo irb(main):002:1> def foo irb(main):003:2> "foo" irb(main):004:2> end irb(main):005:1> end
なんて入力した時は、履歴を検索した時に
irb(main):006:0> class Foo def foo "foo" end end
と表示してほしいですよね。以下のようなパッチで実現できます。
Index: irb.rb =================================================================== RCS file: /src/ruby/lib/irb.rb,v retrieving revision 1.7 diff -u -1 -r1.7 irb.rb --- irb.rb 10 Jun 2003 05:22:16 -0000 1.7 +++ irb.rb 19 Feb 2005 03:25:57 -0000 @@ -97,2 +97,3 @@ @scanner.exception_on_syntax_error = false + @hist_buf = nil end @@ -125,2 +126,8 @@ end + if indent == 0 + if @hist_buf and @hist_buf != Readline::HISTORY[-1] + Readline::HISTORY.push(@hist_buf) + end + @hist_buf = nil + end end @@ -131,2 +138,8 @@ print l if @context.verbose? + if @hist_buf + @hist_buf = @hist_buf + "\n" + + ' ' * @context.io.prompt.size + Readline::HISTORY.pop + else + @hist_buf = Readline::HISTORY.pop + end else
IRB.conf[:SAVE_HISTORY] を true に設定してファイルに履歴を保存するようにしている場合は、以下のようなパッチも必要。
Index: input-method.rb =================================================================== RCS file: /src/ruby/lib/irb/input-method.rb,v retrieving revision 1.5 diff -u -1 -r1.5 input-method.rb --- input-method.rb 7 Feb 2004 10:56:16 -0000 1.5 +++ input-method.rb 19 Feb 2005 03:02:11 -0000 @@ -96,3 +96,3 @@ open(file, 'w' ) do |f| - hist = hist.to_a + hist = hist.to_a.map{|s| s.gsub(/(?!\Z)$/, '\\')} f.puts(hist[-num..-1] || hist) @@ -111,3 +111,14 @@ - loader = proc {|f| f.each {|l| HISTORY << l.chomp}} + loader = proc {|f| + buf = '' + f.each {|l| + if /\\\n/ =~ l + buf << l.sub(/\\\n/, "\n") + else + buf << l + HISTORY << buf.chomp + buf = '' + end + } + } if hist = IRB.conf[:HISTORY_FILE]
irb を使えばオブジェクトと対話するだけでなく、オブジェクトの中に入ることもできます。
irb(main):002:0> class Foo irb(main):003:1> def initialize irb(main):004:2> @a = "I am an instance var." irb(main):005:2> end irb(main):006:1> end => nil
とクラス Foo を定義して以下のように実行します。
irb(main):007:0> irb Foo.new
すると以後 irb は Foo オブジェクトの中で実行されます。
irb#1(#<Foo:0x40444b28>):001:0> @a => "I am an instance var."
この機能と drb を一緒に使えば、リモートのオブジェクトの中にだって入れるかもしれません。ナイスなアイディアです。
以下のようにコマンドラインから実行して、
$ ruby -r drb/drb -e 'class Foo def initialize @a = "I am an instance var." end def foo "foo foo bar" end end DRb.start_service("druby://:12250", Foo.new) sleep '
別の端末から以下のように実行すると
$ irb -rdrb/drb irb(main):001:0> irb DRbObject.new(nil, "druby://:12250") irb#1(#<Foo:0x4022d5dc>):001:0> @a => nil
あら nil しか返ってきませんね。これは @a が Foo オブジェクトのインスタンス変数ではなく、DRbObject オブジェクトのインスタンス変数として実行されちゃうからです。でもメソッドなら呼び出せます。
irb#1(#<Foo:0x4022d5dc>):002:0> foo => "foo foo bar"
どうせならインスタンス変数も直接呼べるようにしたいですよね。
irb を適当に変更すれば、リモートのインスタンス変数を直接触ったり、メソッドを定義したり、実行したりする事は簡単にできます。ただ問題がひとつ出てきます。ローカルの irb のプロセスで定義されていないクラスのインスタンスを返り値として渡された時どうするかという問題です。これに関して『dRubyによる分散オブジェクトプログラミング』では次のように書かれています。
値渡しには大きな問題があります。オブジェクトを渡される側、つまり読み手の知らないクラスのオブジェクトは渡せません。読み手が Marshal.load できないためです。dRuby ではこれを解決する決め手が見つからず、あきらめています。値渡しをするアプリケーション間では、そのオブジェクトのクラスをお互いに知っているように注意してください。
『dRubyによる分散オブジェクトプログラミング』 P40-41
しかし、今回の場合はローカルの irb のプロセスにリモートのオブジェクトのコピーが必要というわけではありません。ローカルの irb のプロセスが知っておく必要があるのはオブジェクトを inspect した文字列だけです。これさえあれば、irb を操作している人間は、リモートのオブジェクトを本当に直接触っている感を得ることができます。
ここからが本題です。もし irb でリモートのオブジェクトを操作できるようになれば、それはデバッグに使えるはずです。ruby にも debug.rb というデバッガが付属しています。が、僕が愛用しているデバッガは print だとか p とかだったりするわけです。debug.rb はどうも難しくて使えません。たぶんそれは以下のような理由なんじゃないかなと思います。
ブレークポイントを設定するのにどうして直接ソースに書かないのか前から不思議に思っていました。コンパイルの必要な言語ならまだしも、コンパイルの必要のないスクリプト言語なわけですから、ソースなんて必要になったら書き直して良いはずです。この方法だと、やっていることは print デバッグと同じですから、人間に分かりやすいはずです。
というわけで、
というような仕組みを作ってみました。デバッガに drb を組み合わせるのは yard の真似です。
class Hoge attr_accessor :somevar end Thread.new{ loop do i = 'foo' j = 'another thread' IRBDB::SetBreakePoint(binding) if $DEBUG end } loop do i = rand() j = Hoge.new IRBDB::SetBreakePoint(binding) if $DEBUG i = 'hoge' IRBDB::SetBreakePoint(binding) if $DEBUG end
みたいなデバッグ対象のソース sample.rb を用意します。コマンドラインから以下のように実行します。
$ ruby -rdebuggee -d sample.rb
別の端末から以下のように実行します。
$ irb -r irbdb irb(main):001:0> irb DRbObject.new(nil, "druby://:12250") irb#1("sample.rb:8"):001:0>
sample.rb の8行目で止まっていることが分かります。例えばローカル変数を参照できます。
irb#1("sample.rb:8"):001:0> j => "another thread"
irbdb_c (or irbdb_continue) でスクリプトの実行を継続します。
irb#1("sample.rb:8"):002:0> irbdb_c continue ... => reach another break point irb#1("sample.rb:15"):003:0> j => #<Hoge:0x402186c8> irb#1("sample.rb:15"):004:0> j.somevar = "foo foo bar" => "foo foo bar" irb#1("sample.rb:15"):005:0> j.somevar => "foo foo bar"
ローカルの irb プロセスが知らない Hoge クラスのインスタンスも扱えます。メソッドも動的に定義できます。
irb#1("sample.rb:15"):006:0> def hoge irb#1("sample.rb:15"):007:1> 'hoge' irb#1("sample.rb:15"):008:1> end => nil irb#1("sample.rb:15"):009:0> hoge => 'hoge'
irbdb からゲットできるので試してみてください。一応デフォルトで drb/acl を使ってアクセス制御はしていますが、他の悪意あるマシンから drb サーバに接続された場合なんでも実行可能なので注意してください。参考。
この90行程度のスクリプトを作成するのに2回ほど print デバッグを行ないました。
binding_of_caller.rb すげえ。callcc と set_trace_func を使って、メソッドを呼び出した側の binding を取得する。some_method(binding) じゃ駄目ですかね。
少し皮肉っぽくなっているきらいはあるものの,大方の指摘は的確であると感じられる。 〇〇 というシステムそのものに対する批評と言うよりかは, 〇〇 コミュニティに対する批判の方が比重が重くなっている。 〇〇 を万能であると信じ込んでいる人々や,その万能性をうそぶく人々が,ここでの批判の対象だ。
基本的に 〇〇 は極端なコンセプトに基づいた △△ であり,決して万能な □□ ではない。この点は多くの人々の同意が得られるところであると思う。したがって,その特徴を良く理解して運用することが重要であると考えられる。しかし 〇〇 コミュニティの人々は,その適応性を拡大的に解釈してしまったり,あるいは,誤った思想によって問題を覆い隠してしまっている節があると氏は批判する。そのような懐疑的な視点の欠如を "〇〇philia" ― 「〇〇病」と呼び揶揄しているというわけだ。
2005年2月25日の読売新聞を読んでいると解説面で三浦潤一氏によるニッポン放送の新株予約権に関して以下のような解説があった。
株の価値を計る指標に、利益を発行済株式で割った一株当たりの利益がある。ニッポン放送の昨年の三月期決算での連結税引き後利益は34億5700万円で、一株当たりの利益は101.67円だった。だが、新株が発行され、株数が3280万株から8000万株になれば、一株当たりの利益は41円程度に下がり、株の価値は目減りする。
『読売新聞』 2005年2月25日付
これは間違っている。ニッポン放送が新株発行によって得た資金を何の事業にも投資しなかった場合には、一株当たりの利益は確かに減るだろう。しかし、一般的には新しく得た資金を、会社の事業拡大への投資に回して利益を増やそうとするはずだ。それが成功するかどうかは分からないけど、新株発行後の一株当たりの利益はその新事業の成否を加味して予想されないといけない。
株価も下がる。企業の価値を表す株式の時価総額(発行済み株式数に株価を掛けたもの)でみると、ニッポン放送の時価総額は24日の終値で(6280円)ベースで約2059億円だが、株式数が8000万株に増えれば、株価は理論上、2500円程度に下がる計算になる。フジ以外の株主にとって新株予約権の発行は損失につながる。
『読売新聞』 2005年2月25日付
これも間違っている。まず第一に新株を発行して増資した後には自己資本が増えるわけで、その分 株式の時価総額に反映される。2059億円/8000万株 = 約2574円/株 などという単純な計算は成り立たない。分子の2059億円が増資の分だけ増えるはずだ。
一般に、増資前と増資後の株価というのは、増資によって得た資金を会社がどれだけうまく投資するかという投資家の予想に左右される。事業拡大などにより、これまでどおりの一株当たりの利益を稼ぐなら株価は増資前と変わらない。一株当たりの利益が下がると予想したなら、株価は下がるし、一株当たりの利益が上がると予想したなら、株価は上がる。
またニッポン放送の株価が2500円程度まで下落したら一番損するのはフジだ。予約権を行使するならフジは一株当たり5950円で取得するわけだから、それが2500円程度にもし下がったとしたら大損ということになる。フジが予約権を行使したなら、それはニッポン放送が増資によって得る資金を有効に活用するとフジが予想したということだ。自分の予想が外れたら損するのは、まあそれが投資というものだ。
ポイズン・ピルは株式市場の効率を損なうだろうか。前にも書いたとおりポイズン・ピルはあってもなくても株式市場の効率を損なうことはないと僕は考える。しかし、企業が不当に安い行使価格の新株予約権を発行した場合は、敵対的買収の防衛が目的だろうが、単に増資が目的だろうが、市場の効率性を損なう。それは既存の株主から新規株主への所得の移転を意味する。要するに安い株価で株を取得できた新規株主は得するけど、その分 既存の株主は損をする事になる。
買収というの買収対象企業に対する投資だ。投資の基本はリスクの分散だ。巨大企業の買収は、ある特定企業の株式だけに投資を集中するのと同じ事だから、非常にリスクが大きい。失敗することが多いのも当然だ。
企業買収が成功したなら、それは運が良かったか、小さな企業を複数買収してリスクを分散した場合だろう。
自社株買いは株価対策だと説明されることがある。これは間違っている。正確には自社の株式に対する投資だと考えるべきだ。
一般企業は証券会社や投資銀行と違って、他の企業の情報を多くは持っていないし分析する能力もない。だから株式に投資するということは普通しない。しかし、ただ1社に関してだけ非常に正確な情報を持っている。自社に関しての情報がそれ。どんな企業だって、自社に関する経営実態に関してはどこよりも正確な情報を持っているだろう。そして、もし自分の持っている情報に比べて、自社の株価が低かったなら自社の株式は有利な投資先となりうる。株価が低い時に自社の株を買って、高くなってからまた売れば(あるいは増資すれば)、場合によってはそれは自分の本来の事業へ投資するよりも、良い投資先かも知れない。
さて、企業が自社株買いした時に株価が上がるとしたら、本質的には上で書いた仕組みが原因で起こる。一株当たりの利益がどうだとかは関係ない。つまり、どこよりも正確な情報を持っている企業自身が有利な投資先として自社株を買ったということは、現在の株価が低いというシグナルを市場に送ることになる。だから、株価は上昇する。
最近のコメント