Just another Ruby porter,

〜2002年8月下旬〜


<Prev(,) | Next(.)> | Recent(/)>> | RDF

2002-08-21 (Wed)

[Linux] diet libc 0.20

0.18からlibm2.Sが加わってfrexpが使えるようになった。 でもlibm2.Sはsqrtだの一緒くたになっていて、 同時に参照するとmultiple definitionになってしまう。 うーむ。また余計な仕事を増やしてくれるなあ。

% cat foo.c
#include <math.h>
main()
{
    int i;
    frexp(sqrt(1.0), &i);
}
% diet gcc foo.c -lm
/opt/diet/lib-i386/libm.a(libm2.o): In function `sqrt':
libm2.o(.text+0x7): multiple definition of `sqrt'
/opt/diet/lib-i386/libm.a(sqrt.o)(.text+0x0): first defined here
collect2: ld returned 1 exit status

あ、diet libcのfrexpを使わなきゃいいのか。

[Ruby] Log4r 1.0.2

更新。


2002-08-22 (Thu)

BitKeeper

BitKeeperってrepositoryごとcloneしなきゃいけないもんなんだろうか?


2002-08-23 (Fri)

Forwarding DLL

なんとなく 呼ばれたような気がした ので Forwarding DLL を用意してみた。

BitKeeper

Googleしてみたら この文書 が見つかった。やっぱcloneしなきゃだめなんだ。

変更セットのコンセプトの後に、さらに追い討ちをかけることにな
るが、複数のソーススリーのコピーを持つことに慣れてほしい。こ
れは、一部の人にとっては、*本当に*慣れるのが大変だ。ソースツ
リーを分けることは、BitKeeper では、メジャーおよびマイナーの
並行した複数の開発ラインを線引して管理することを意味している。 
CVSでいうブランチは、分離されたソースツリーになるが、
BitKeeperの用語では、"クローン"[Heh, or Star Wars]になる。

メール配送の遅れ

うーむ。17通もたまってるなあ。 攻撃されてる 影響だろうか?

helium:~ % mailq |grep eban|wc
     17      17    1003

2002-08-24 (Sat)

[Linux] GTK+ 2

xpad 1.5 をmakeしようとしたらGTK+ 2を要求された。 最近ちらほらそういうソフトも出てきたのでインストールすることにした。 1.2.xが上書きされたら困ると思っていたら、 -2.0がsuffixされてるので問題ないようだ。 その前にglib, atk, pangoが必要。

gtk+-2.0.6をmakeしてみたら、1時間経っても終わらない。 いや、最近のソフトはみんなでかいね。結局1時間半かかった。


2002-08-25 (Sun)

Judy

ruby-talk MLで話題になっているが、 JudySL というのがRubyのstより速いhashらしい。

最低限何が必要なのか調べてみる。

% cd src/JudySL
% gcc -I../JudyCommon -I.. -c JudySL.c
% nm --undefined JudySL.o|grep Judy 
JudyLDel
JudyLFirst
JudyLFreeArray
JudyLIns
JudyLLast
JudyLNext
JudyLPrev
__JudyLGet

結構依存してるんだな。


2002-08-26 (Mon)

[Cygwin] gcc 2.95.3-10

specsが間違ってるなあ。gcc-2 -mno-cygwinでRubyのwin32/win32.cがエラーになる。 _cdeclがエラーだ。__cdeclはエラーにならない。 specsのその部分はこうなっている。

%(cpp_cpu) %{posix:-D_POSIX_SOURCE} \
-D__stdcall=__attribute__((__stdcall__)) \
-D__fastcall=__attribute__((__fastcall__)) \
-D__cdecl=__attribute__((__cdecl__)) \
%{!ansi:-D_stdcall=__attribute__((__stdcall__)) \
  -D_fastcall=__attribute__((__fastcall__))}
  -D_cdecl=__attribute__((__cdecl__))} \
-D__declspec(x)=__attribute__((x)) \

2.95.3-5はこうなっていた。

%(cpp_cpu) %{posix:-D_POSIX_SOURCE} \
-D__stdcall=__attribute__((__stdcall__)) \
-D__fastcall=__attribute__((__fastcall__)) \
-D__cdecl=__attribute__((__cdecl__)) \
%{!ansi:-D_stdcall=__attribute__((__stdcall__)) \
  -D_fastcall=__attribute__((__fastcall__)) \
  -D_cdecl=__attribute__((__cdecl__))} \
-D__declspec(x)=__attribute__((x)) \

なるほど。これか。

  -D_fastcall=__attribute__((__fastcall__))}

ここで閉じてるからだ。 対応が取れてないんだからその時点でエラーになって欲しいね。

[Ruby] diet libc対応

diet-dynを使わないとdlopen(3)が使えないことが判明。 dietコマンドは-staticをつけるが、 diet libcにはlibdl.aはなくlibdl.soしかない。 でも、getenvでSEGVってしまうんだな。うーむ。


2002-08-27 (Tue)

[Ruby] diet libc対応

getenvが怪しいというわけで実験。

% echo 'main(){getenv("FOO");}' > foo.c
% diet-dyn foo.c
% ./a.out
zsh: segmentation fault  ./a.out

だめじゃん。diet-dynがバグバグってことはstaticにlinkするしかないか?

i386/getenv.Sじゃなくてlib/getenv.cを使ってみる。okだ。 i386/getenv.SはPICになってないってことか。

-ldlをlinkすると

libdl.so used.

と標準エラーに吐かれて非常に欝陶しい。

あ、今度はrubyを作るところで.endeがundefと文句言われた。

% nm -o /opt/diet/lib-i386/*.a|grep 'U \.ende'

してみるとcosh.o,sinh.o,tanh.oのようだ。ソースを見ると

.Lende:

.size    cosh,.ende-cosh

てな感じで、ラベル名が間違ってる。それぞれ

.size    cosh,.Lende-cosh

と変更してやっとrubyまでできた。

% ./ruby -v                                 
libdl.so used.
ruby 1.7.2 (2002-08-24) [i386-linux]

2002-08-28 (Wed)

[Ruby] AC_CHECK_TOOL, AC_CHECK_PROGS

どちらも同じ引数を取るような気もするが、 AC_CHECK_PROGSだけ複数形なのはやはり意味があったようだ。 というわけで

AC_CHECK_TOOL(AR, ar)
if test -z "$AR"; then
  AC_CHECK_PROGS(AR, aal, ar)
fi

としてみた。

[Linux] GCC 3.1でmakeしたkernel

10日以上経つがGCC 2.95.3でmakeしたkernelは快調だ。 やはりGCC 3.xだとまだやばいようだ。


2002-08-29 (Thu)

[Ruby] 1.7.3

偶然なのか結構いいタイミングでmswin32/mingw32のDLL共通化ができたようだ。

[Ruby] setup.ini

@ xmlrpc4r
[prev]
version: 1.7.11-1
install: ext/xmlrpc4r-1.7.11-1.tar.gz 63820
[curr]
version: 1.7.9-1
install: ext/xmlrpc4r-1.7.9-1.tar.gz 62938

と間違ってる。単純にsortしてるからだ。 こんなものを考えてみた。

% cat versions.rb
class Versions
  include Comparable
  def self.[](v)
    self.new v
  end
  def initialize(v)
    @version = v
  end
  def to_a
    @version.scan(/\d+/).map{|x| x.to_i}
  end
  def <=>(other)
    self.to_a <=> other.to_a
  end
end

if __FILE__ == $0
  require 'test/unit'

  class TC_Versions < Test::Unit::TestCase
    def test_01
      assert([1, 2], Versions["1.2"].to_a)
    end
    def test_02
      assert(Versions["1.2"] < Versions["1.10"])
    end
    def test_03
      assert(Versions["1.2.1"] < Versions["1.10"])
    end
    def test_04
      assert(Versions["1.02.1"] == Versions["1.2.1"])
    end
    def test_05
      assert(Versions["1.2"] < Versions["1.2.1"])
    end
  end
end

と、ここまで作って、 ほとんど同じもの が存在することに気づく。 []まで考えてるとこが同じというか、Test::Unitを使うとこまで同じか。 version.rb のほうはまじめに比較しているが、versions.rbは Array#<=>に帰着させている。

[Ruby] Judy

結局のところRubyには使えないってこと?


2002-08-30 (Fri)

uClibc 0.9.15

更新。

[Ruby] diet libc対応。

なぜかmakeがエラーになってしまう。

compiling dl
.../ext/dl/extconf.rb:148:in `initialize': [unknown error] - \
  "dlconfig.h" (Errno::E125)

[unknown error]あたりが謎だが、該当する行は

open(file){|f|f.read} == str

だ。なんで?

% ./miniruby -e 'p open("foobar")'
libdl.so used.
-e:1:in `initialize': [unknown error] - "foobar" (Errno::E125)
        from -e:1:in `open'
        from -e:1

errnoがおかしい。

% cat foobar.c
#include <stdio.h>
extern int errno;
main()
{
    fopen("foobar", "r");
    printf("%d\n", errno);
}
% diet-dyn gcc foobar.c
% ./a.out
0
% diet gcc foobar.c 
/opt/diet/lib-i386/libc.a(vprintf.o): In function `vprintf':
vprintf.o(.text+0x53): warning: the printf functions add several kilobytes of bloat.
/opt/diet/lib-i386/libc.a(fwrite.o): In function `fwrite':
fwrite.o(.text+0x4b): warning: your code uses stdio (7+k bloat).
% ./a.out
2

うーむ。diet-dynは使いものにならないな、こりゃ。 となるとdietコマンドを使わざるを得ないわけで、 Ruby/DLは使えないという結論に。だから sizeof(FILE)の件は気にしなくてもいいのかもしれない。でも気になる。

retrunの話

先週returnの話であちこち盛り上がっていたが、 returnってなぜかretrunと打ってしまうことが多い。 makeもmkaeやamkeになることがある。 これってどっちも右手左手交互に打つパターンなんだよね。 だからそのタイミングがちょっとずれると2回連続で同じほうの手で打ってしまい、 retrunやmkaeになるようだ。

retrunでgoogleするとこれまた山のようにヒットする。 もしやと思いRubyのChangeLogを調べてみると、やはりあった。

% grep retrun ChangeLog
        * process.c (rb_proc_times): need not to check retrun value from
          block retruns true for any of elements.

次の機会にでも直しておこう。


2002-08-31 (Sat)

Buildtool

autoconfの代わりになるものらしい。が、かなり趣きが違う。

□ Buildtool needs to be installed beforehand on any system before you can
   build a buildtool-ized package. This avoids the inclusion of really
   huge configure (autoconf) and Makefile.in (automake) scripts in your
   source package.

前もってインストールしておかないといけないの?

[vim] ChangeLog

vimにもstrftimeぐらいはあるだろうと調べたらやはりあった。 というわけでChangeLogのためのmapを書いてみた。

map ch 1Gi<C-R>=strftime("%a %b %e %X %Y  WATANABE Hirofumi  <eban@ruby-lang.org>\n\n\n\n")<CR><UP><UP><TAB>* 

<Prev(,) | Next(.)> | Recent(/)>> | RDF


WWW を検索 jarp.does.notwork.org を検索

わたなべひろふみ
Key fingerprint = C456 1350 085F A320 C6C8 8A36 0F15 9B2E EB12 3885
Valid HTML 4.01!