■_
PSPとか
いやー新型PSP(2000)軽いですね。
まるでおもちゃのようだ
(初めからそうです)w。
カレンダーをよくチェックしなおしてみると、実は5/10の土曜日は出勤日だったという罠。
確か次のRHG読書会は5/11だったよなあ。
んーどうしたもんか喃。
PostgreSQL。
今まで8.1とかその辺をインストールして放置しっぱなしだったので、
最新のもの(8.3.0)に入れ替えました。
いやー、インストーラがずいぶん良くなって(わかりやすく)なってますね。
インストーラで表示する言語も起動してから切り替えられるし、
ライセンス関係のものもちゃんと日本語で表示される
(GPLとかだと仕方がない面はあると思うのですが、英文のライセンスを見せられても
ビビる人が大半なんじゃないですかねえ。まあ日本語にしたからといって
読まれるかどうかという問題があるわけですが :)。
rssリーダーで redditの新規エントリが上がってこないなあと思ってよくよく確かめてみたら
ブロックされてやがる。
もうね(以下自主検閲により削除)
■_
How to fix a bug
“How to fix a bug”と書くと「バグの直し方」という感じがするなのだけど、
「どのようにバグを直すか」という意味を強く出すにはどのような英文にすればいいんだろう?
それはさておき。
ruby-dev:34492 でakrさんが報告したバグに関して
ruby-dev:34537 でワナベさんが提示しているパッチは↓のようになっているんだけど
Index: re.c
===================================================================
--- re.c (revision 16218)
+++ re.c (working copy)
@@ -1255,7 +1255,7 @@
{
int result;
VALUE match;
- static struct re_registers regs;
+ struct re_registers regs;
char *range = RSTRING_PTR(str);
regex_t *reg0 = RREGEXP(re)->ptr, *reg;
int busy = FL_TEST(re, REG_BUSY);
@@ -1271,6 +1271,7 @@
if (!reverse) {
range += RSTRING_LEN(str);
}
+ MEMZERO(®s, struct re_registers, 1);
result = onig_search(reg,
(UChar*)(RSTRING_PTR(str)),
((UChar*)(RSTRING_PTR(str)) + RSTRING_LEN(str)),
static に確保しているせいでスレッドを跨いだときにおかしくなるんだろうから
自動変数にするというのは良いけど、
こういう初期化はMEMZERO(実体は memset)を使ってやるんじゃなくて
struct re_registers regs = {0}
のように記述して行うべきじゃないのか。
いや、そもそも
regs は onig_searchの中で初期化してから使っているのだからこの初期化自体
いらないんじゃね? と思って static キーワードだけつぶしてビルドしてみると
ruby 1.9.0 (2008-04-28 revision 0) [i386-mswin32_71]
.\miniruby.exe -I./../lib ./../enc/make_encdb.rb ./../enc encdb.h.new
./../enc/make_encdb.rb:27: [BUG] Segmentation fault
ruby 1.9.0 (2008-04-28 revision 0) [i386-mswin32_71]
-- control frame ----------
c:0010 p:---- s:0030 b:0030 l:000029 d:000029 CFUNC :===
c:0009 p:---- s:0028 b:0028 l:000023 d:000027 IFUNC
c:0008 p:---- s:0026 b:0026 l:000025 d:000025 CFUNC :each
c:0007 p:---- s:0024 b:0024 l:000023 d:000023 CFUNC :grep
c:0006 p:0011 s:0020 b:0020 l:000013 d:000019 BLOCK ./../enc/make_encdb.rb:27
c:0005 p:---- s:0020 b:0020 l:000019 d:000019 FINISH :method_added
c:0004 p:---- s:0018 b:0018 l:000017 d:000017 CFUNC :open
c:0003 p:0066 s:0014 b:0014 l:000013 d:000013 TOP ./../enc/make_encdb.rb:27
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH :private_class_method
c:0001 p:0000 s:0002 b:0002 l:000001 d:000001 TOP <dummy toplevel>:257
---------------------------
DBG> : "./../enc/make_encdb.rb:27:in `each'"
DBG> : "./../enc/make_encdb.rb:27:in `grep'"
DBG> : "./../enc/make_encdb.rb:27:in `block in <main>'"
DBG> : "./../enc/make_encdb.rb:27:in `open'"
DBG> : "./../enc/make_encdb.rb:27:in `<main>'"
なンでっ!?
面倒なのでこれの原因は追いかけないけど、初期化はんーどうなんだろうねえ。
参考までにMEMZERO で grepしたときの結果はこんな感じ。
array.c:3158: MEMZERO(stack, long, n);
ext/json/ext/parser/parser.c:1696: MEMZERO(json, JSON_Parser, 1);
ext/ripper/ripper.c:14189: MEMZERO(p, struct parser_params, 1);
ext/ripper/ripper.c:14579: MEMZERO(p, struct parser_params, 1);
ext/socket/socket.c:804: MEMZERO(&sin, struct sockaddr_in, 1);
ext/socket/socket.c:905: MEMZERO(&hints, struct addrinfo, 1);
ext/socket/socket.c:1621: MEMZERO(&sockaddr, struct sockaddr_un, 1);
ext/socket/socket.c:1967: MEMZERO((char*)&cmsg, char, sizeof(cmsg));
ext/socket/socket.c:3224: MEMZERO(&hints, struct addrinfo, 1);
ext/socket/socket.c:3297: MEMZERO(&hints, struct addrinfo, 1);
ext/socket/socket.c:3447: MEMZERO(&sockaddr, struct sockaddr_un, 1);
ext/stringio/stringio.c:678: MEMZERO(RSTRING_PTR(ptr->string) + olen, char, pos - olen);
ext/stringio/stringio.c:1193: MEMZERO(RSTRING_PTR(string) + plen, char, l - plen);
ext/strscan/strscan.c:178: MEMZERO(p, struct strscanner, 1);
ext/syck/emitter.c:273: S_MEMZERO( e->buffer, char, e->bufsize );
ext/syck/emitter.c:372: S_MEMZERO( header, char, 64 );
ext/syck/emitter.c:1230: S_MEMZERO( anchor_name, char, strlen( anc ) + 10 );
ext/syck/rubyext.c:620: MEMZERO((void *)obj, RVALUE, 1);
ext/syck/rubyext.c:746: S_MEMZERO( parser->bonus, struct parser_xtra, 1 );
ext/syck/rubyext.c:1888: S_MEMZERO( emitter->bonus, struct emitter_xtra, 1 );
ext/syck/syck.c:37: S_MEMZERO( new, char, len + 1 );
ext/syck/syck.c:124: S_MEMZERO( p->buffer, char, p->bufsize );
ext/syck/syck.c:161: S_MEMZERO( p, SyckParser, 1 );
ext/syck/syck.h:58:#define S_MEMZERO(p,type,n) memset((p), 0, sizeof(type)*(n))
gc.c:656: MEMZERO((void*)obj, RVALUE, 1);
include/ruby/ruby.h:699:#define MEMZERO(p,type,n) memset((p), 0, sizeof(type)*(n))
io.c:4392: MEMZERO(fptr, rb_io_t, 1);
io.c:6830: MEMZERO(&st, struct copy_stream_struct, 1);
iseq.c:103: MEMZERO(iseq, rb_iseq_t, 1);
iseq.c:174: MEMZERO(iseq->compile_data, struct iseq_compile_data, 1);
marshal.c:1280: MEMZERO((char *)digits + len * 2, char,
parse.c:14121: MEMZERO(p, struct parser_params, 1);
parse.c:14511: MEMZERO(p, struct parser_params, 1);
proc.c:69: MEMZERO(proc, rb_proc_t, 1);
process.c:1627: MEMZERO(e, struct rb_exec_arg, 1);
re.c:781: MEMZERO(match->rmatch, struct rmatch, 1);
re.c:1748: MEMZERO(names, struct backref_name_tag, num_regs);
ruby.c:1276: MEMZERO(&opt, opt, 1);
ruby.c:1501: MEMZERO(&opt, opt, 1);
string.c:2803: MEMZERO(RSTRING_PTR(str) + RSTRING_LEN(str), char, -len);
thread.c:1698: MEMZERO(fds->fdset, fd_mask, howmany(fds->maxfd, NFDBITS));
time.c:379: MEMZERO(tm, struct tm, 1);
util.c:434: MEMZERO(p, struct PathList, 1);
vm.c:1509: MEMZERO(vm, rb_vm_t, 1);
vm.c:1857: MEMZERO(th, rb_thread_t, 1);
win32/win32.c:1048: MEMZERO(tmpcurr, NtCmdLineElement, 1);
ほとんどがメモリを別途確保しておいてからそれを0埋めしているというパターン。
今回のパッチのような使い方に該当するのは ruby.c で opt に対してやっているのと
io.c で st に対してのもの、そしてext/socketでやっている数箇所。
現在のRubyはC99は要求しないけど、ANSI(ISO)準拠のコンパイラは必須のはずなので
自動変数の(0埋めをしての)初期化は自分で memset呼び出してやるよりは
= {0} してやった方が良いと思うのだけど
MLで主張すべきかどうかと昨日から悩んでいる俺ガイル(笑)
■_
それは蔑称なんですかね
スクリプトの初恋はLispの味 - みねこあ
というか、スクリプト言語と呼び貶めないで Lightweight Language と読んで欲しいです。彼ら
が「スクリプト言語」でデビューを果たしたのは、そこが一番デビューしやすいからで、スクリ
プト言語になるために生まれてきた訳じゃないのもいっぱいなのです。
まあわたしは一貫して「スクリプティング言語」という表記(と読み)を使っているので
それは「スクリプト言語」ちゅーものと別物かもしれませんけど :)
というかわたしにとっては
LLなんてのはWeb2.0みたいな×× (好きな表現を入れてください :) wordなんじゃないかと思えるのですが。