Rubyで遊んだ日々の記録。あくまで著者視点の私的な記録なので、正確さを求めないように。
Rubyと関係ない話題にはその旨注記しているはず。なので、一見関係無いように見える話題もどこかで関係あるのかもしれません。または、注記の書き忘れかもしれません...
_ ぼんやりとruby-talkを眺めていたら、[ruby-talk:62057]で[ruby-dev:19370]の話が出ていた(気付くの遅い)。
_ このスレッドでは「RPMみたいなバイナリパッケージでインストール先が変わったら困るじゃんかよー」とか言われている。
あー、そうかー、これがデメリットかもなぁ、と思ったけど、なかださんがあっさりと反論していらっしゃるのであった。
ま、そりゃそうだわなぁ。
_ ... 今気付いたけど、一番困るのは自分のような気がしてきた。
どうするかなぁ。ドキュメントに「irb.batとerb.batの中身は自分の環境に合わせて書き換えてね」とでも書いておく? そりゃひどいかも。
_ とある要件でruby-devを調べていて、[ruby-dev:18080]を再発見。
あうー、試そうと思って忘れたままだった。5ヶ月も経ってるよ。すみません。
_ いきなりパッチを適用して場当たり的なテストをやっても仕方ないので、rubiconを参考にまずはいくつかテストケースを用意してみる。
で、現状で全てのテストを通過することを確認。
ではパッチを適用して、いざテスト。
...
こんなんで固まっちゃいます。
ruby -e "IO.popen('cat', 'w') do |r| r.puts('hoge') end"
_ 固まっちゃう理由は、パイプのRuby側を閉じてもcat側でEOFが検出されないから。
よってcatはいつまでも待ち続け、Rubyもcatの終了を待ち続けるので固まってしまう。
ん? どっかで聞いたような話だな。
_ 調べてみたら2001年の11月26日の日記にまったく同じことを書いていた(*1)。
で、その時はSDKのヘルプを参考にして解決した、とか書いてある。
で、そのとき参考にしたSDKのヘルプ(*2)というのはどうやらこれらしい。
これによると、
The parent process uses the other ends of the pipes to write to the child process's input and read the child process's output. The handles to these ends of the pipe are also inheritable. However, the handle must not be inherited. Before creating the child process, the parent process must use DuplicateHandle to create a duplicate of the application-defined hChildStdinWr global variable that cannot be inherited. It then uses CloseHandle to close the inheritable handle.
ということだそうで、やはりDuplicateHandle()は必須ということか。つーか一度調べたことを忘れないように>自分
_ というわけで、DuplicateHandle()は仕方ないとして、CreateChild()の後ろの三つの引数を使ってもうちょっと整理できるんじゃないか、という気は確かにする(そもそもそのために用意した引数だったような)。
でもなぁ、このサンプルもSTARTUPINFOのhStd*は使ってないんだよね...
_ [RAA:win32_popen]も眺めたりして考えてみた。
あ、SetStdHandle()するのをやめて、標準ハンドルになるべきハンドルをCreateChild()に渡せばいいのか。当たり前といえば当たり前。
んじゃ実験実験... ふむ、うまくいくような雰囲気。
_ 全テストケースも通って、特にリークなどもなさそうだったのでcommit。
これでCreateChild()の後ろ三つの引数も意味が出てきた。よかったよかった。
あ、ChangeLogに由来を書くの忘れた...
(*1) 書いていた
当時の日記はもうオンライン上にはありません。
(*2) SDKのヘルプ
[ruby-dev:18081]で「MSDNのサイトを辿ると404になる」とか当時は書いてたけど、今日調べたらちゃんと見つかった。
_ 久し振りに家のサーバでcoreった。
ちと長いけど、こんなん。
% gdb /usr/local/bin/ruby ruby.core
GNU gdb 5.0nb1
Copyright 2000 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386--netbsdelf"...
Core was generated by `ruby'.
Program terminated with signal 4, Illegal instruction.
Reading symbols from /usr/libexec/ld.elf_so...done.
Loaded symbols for /usr/libexec/ld.elf_so
Reading symbols from /usr/local/lib/libruby.so.16...done.
Loaded symbols for /usr/local/lib/libruby.so.16
Reading symbols from /usr/lib/libcrypt.so.0...done.
Loaded symbols for /usr/lib/libcrypt.so.0
Reading symbols from /usr/lib/libm387.so.0...done.
Loaded symbols for /usr/lib/libm387.so.0
Reading symbols from /usr/lib/libm.so.0...done.
Loaded symbols for /usr/lib/libm.so.0
Reading symbols from /usr/lib/libc.so.12...done.
Loaded symbols for /usr/lib/libc.so.12
Reading symbols from /usr/local/lib/ruby/1.6/i386-netbsdelf1.6K/digest/md5.so...
done.
Loaded symbols for /usr/local/lib/ruby/1.6/i386-netbsdelf1.6K/digest/md5.so
Reading symbols from /usr/local/lib/ruby/1.6/i386-netbsdelf1.6K/digest.so...
done.
Loaded symbols for /usr/local/lib/ruby/1.6/i386-netbsdelf1.6K/digest.so
Reading symbols from /usr/local/lib/ruby/1.6/i386-netbsdelf1.6K/nkf.so...done.
Loaded symbols for /usr/local/lib/ruby/1.6/i386-netbsdelf1.6K/nkf.so
Reading symbols from /usr/local/lib/ruby/1.6/i386-netbsdelf1.6K/socket.so...
done.
Loaded symbols for /usr/local/lib/ruby/1.6/i386-netbsdelf1.6K/socket.so
#0 0x481ab0c2 in memcpy () from /usr/lib/libc.so.12
(gdb) up
#1 0xb4c3815b in ?? ()
(gdb) up
#2 0x48083b71 in stack_extend (th=0x0, exit=1208942592)
at ../ruby-1.6.8/eval.c:7505
7505 rb_thread_restore_context(th, exit);
(gdb) up
Initial frame selected; you cannot go up.
stack_extend()はrb_thread_restore_context()からしか呼ばれておらず、thもexitもrb_thread_restore_context()からそのまま渡されている。
一方、rb_thread_restore_context()は数ヶ所から呼ばれているが、exitは定数であり、1から6までしかありえない。
と、いうことは、スタックが壊れてるということなのかな。
_ # Rubyとぜんぜん関係ないです。
某IRCチャンネルにて
>unak< 朝日新聞乱心中 http://www.asahi.com/tech/apc/K2003012400468.html >unak< ここはZDNetでつか? <H****> 赤いからじゃないか?
def File.native_path(path)
if defined?(File::ALT_SEPARATOR)
path.gsub(Regexp.compile(Regexp.quote(File::ALT_SEPARATOR)), File::SEPARATOR)
else
path.dup
end
end
_ File.relative_path
先日の[ruby-list:36983]のネタに近い(下記は[ruby-list:36985]のパクリ)。
def File.relative_path(abs_path, from = Dir.pwd)
sep = /#{File::SEPARATOR}+/o
base = File.expand_path(from).split(sep)
target = File.expand_path(abs_path).split(sep)
while base.first == target.first
base.shift
target.shift
end
File.join([".."] * base.size + target)
end
_ 昨夜のことになっちゃうけど、無事行われました。
今回も楽しかったです。例によってRubyネタ少なかったけど...
報告などはこちら。
<C言語>とはANSI/ISO/JIS Cであるとする
_ x ^ 2は、二進数表現の下から2桁目だけが必ず変化するので、x ^ 2は必ずxよりも2大きいか2小さい値となる。
ところが、x * x - xを考えると、xが2より大きい場合、その差は常に2より大きくなる。
よって、題意を満たす数xについて、-2 <= x <= 2が成り立つ。
そこで、条件を満たす全ての整数について考えると、
xが-2の場合、-2 ^ 2 = -4, -2 * -2 = 4。よって不成立。 xが-1の場合、-1 ^ 2 = -3, -1 * -1 = 1。よって不成立。 xが 0の場合、 0 ^ 2 = 2, 0 * 0 = 0。よって不成立。 xが 1の場合、 1 ^ 2 = 3, 1 * 1 = 1。よって不成立。 xが 2の場合、 2 ^ 2 = 0, 2 * 2 = 3。よって不成立。
となる。
ゆえに、題意を満たす整数xは存在しない。
_ ってことでいいのかな。
上の3つの条件の1や3を外すと、なんでもありになる(そういう処理系を想定すればよい)。
上の条件の2を外すと、浮動小数点値で条件を満たすxがあるかもしれないし、マクロで条件を満たすxを作り出すことも可能らしい。
_ ANSI/ISO/JIS Cでは、最小の整数型はchar(厳密に言うとsigned char)で、許される最小のビット幅は8です... って調べてて思ったんだけど、8bitって決まってたっけ?
7bitとかでもかまわなかったような記憶があるんだけど、5.2.4.2.1には8bit以上だと明記されているように読める。
_ charより小さいビット幅の型を作り出す方法としてビットフィールドがありますが、((x ^ 2) == (x * x))という条件だと暗黙の型変換でintに格上げされてしまうので、残念ながら条件を満たすことはできなくなります。
_ 先日も書いたけど、1.4.2が初めて触ったRubyのバージョン。
でも、これ以前からRubyの存在自体は知ってたはずなんだよなぁ。いつ、どうやって知ったんだろう? 雑誌? ネットワーク?
Perlを始めて触ったのが1995年で、それよりは後のはず。というか、RubyがNetNewsに登場したのが1995年12月ということだから、Perlを始めて触ったときはRubyを知る由もなかったということのようだ。
_ なんとなく発見してしまったので反応。
requireの件は$:.unshift(File.dirname(__FILE__))とか入れておくと吉、という話でしょうか。
なんかつい最近2chで見たような話題ですね。
_ 文字コード違いのスクリプトをrequireすると、というのは、1.6.8でも変わってないし、1.8でもおそらく変わらないでしょう。
_ 国内初のBREW本格対応端末登場なんだそうだけど、C/C++で書いたソフトが動くようなので、Rubyが移植できるかも、と思ってちょっと調べてみた。
ぜんぜん中身がわからないので、移植実現性などはなんとも言えないんだけど、互換性テストの価格を見てしょぼーん。
ひょっとして、バイナリを更新するたびにこれだけ払わないとダメですか?
これじゃ移植が可能だとしても配布できないじゃん...
_ というわけで、夢は一瞬で消え去ったのであった。
ユーザを増やしたかったら、フリーなソフトウェアの取り込みも考慮すべきですよ>クアルコムさん
_ そうか、オーバーフローですか。ふつー(?)に条件を満たすxは存在するんですね。
ぜんぜんダメじゃん>自分。
_ 間違えてCygwin環境をふっ飛ばしてしまった。くすん。
まぁ、以前から少しおかしかったから、入れなおすいい機会ではあるか。
_ ebanさんのmingw32版にgdbm.soが同梱されているんだから、当然どこかに利用可能なGDBMのライブラリがあるのだと思うけれど、探しても探しても見当たらない。
根本的に探すべき場所を間違えてる?
curses.so・dbm.so・readline.soも作らなくちゃだわ。
_ お仕事で以前に作った拡張ライブラリを久し振りにコンパイルしてみたところ、extconf.rbのお行儀が悪くてはまる。
わかっててやってるからたちが悪いよなあ。手抜きは程々に。
_ 昨日ふっとばした環境はいちおう復旧した。
副作用でいろいろバージョンが新しくなっちゃったな。
_ とりあえずCygwin版Rubyとmingw32版Rubyを作ってみたところ、だいたいちゃんと動くんだけど、どちらもWin32API.soだけ落ちる。
ふと思い立って、gccのバージョンを落として(*1)Win32API.soを作り直してみたら、どちらも無事動いた。
ふーむ、やはりバージョンが上がりすぎたのが原因かなあ。
まあいいか、ヒマな時に考えよう。
(*1) gccのバージョンを落として
3.2 20020927 → 2.95.3-10
被捕捉アンテナ類
[\ay antenna (testing)]
[Ant]
[Antenna-Julia]
[LayserあんてなV2]
[nAntenna]
[nuance de Antenna]
[Rabbit's Antenna]
[Read List]
[Ruby hotlinks 五月雨版 (るるりん。)]
[してたま (私的アンテナ with たまてばこ)]
[ただのあんてな]
[ちゃらんぽらん]
[でこぽんリンク]
[なよろアンテナ]
[にっきトレーサー]
[偽善者あんてな - 2nd season -]
[湘南日記放送局(SDB)]
[はてなの各アンテナ]