〜2001年4月下旬〜
CygwinでUnixのpermissionをemulateするにはふたつ方法がある。 nteaとntsecだ。名前の通りWin9x/MEじゃなくてWinNTとWin2kのみ有効。
歴史的にはnteaが先に実装されたので、ずーっとこれを使っていた。 NTFSならNT Extended Attributesってとこにその情報が収まるので特に問題はない。 だがFATな領域になにか書き込むと"EA DATA. SF"という属性専用のファイルをroot directoryに作る。 これがどんどん大きくなる。 いつのまにか10MBを越えてたりする。 全部NTFSで使っていればいいんだけど、MOはやっぱそういうわけにもいかない。 特にMOで10MBが無駄になるのは大きい。
というわけでntsecだ。 あ、どうやって設定するかというと環境変数CYGWINに追加する。
% export CYGWIN='tty binmode ntea'
とか
% export CYGWIN='tty binmode ntsec'
のように。どっちにしても
% chmod 0600 ~/.netrc
もちゃんと設定できるようになる。 ただntsecに変えた直後はすべて0777に見える。 これはアクセス権がEveryoneに対してフルコントロールになってるから。 getfacl commandを実行するとわかる *1。
ruby:/d/gcc-2.95.2 % ls -l total 37 drwxrwxrwx 3 watanabe ruby 4096 May 28 2000 bin drwxrwxrwx 2 watanabe ruby 69632 Apr 4 2000 doc drwxrwxrwx 4 watanabe ruby 0 Apr 4 2000 i386-mingw32msvc drwxrwxrwx 3 watanabe ruby 0 Apr 4 2000 include drwxrwxrwx 3 watanabe ruby 0 Apr 4 2000 lib -rwxrwxrwx 1 watanabe ruby 260 Apr 4 2000 mingw32.bat -rwxrwxrwx 1 watanabe ruby 304 Apr 4 2000 mingw32.sh ruby:/d/gcc-2.95.2 % getfacl mingw32.bat # file: mingw32.bat # owner: 1000 # group: 513 user::--- group::--- mask::--- other::rwx ruby:/d/gcc-2.95.2 % id uid=1000(watanabe) gid=513(ruby) groups=513(ruby) ruby:/d/gcc-2.95.2 % chmod 0644 mingw32.bat ruby:/d/gcc-2.95.2 % ls -l mingw32.bat -rw-r--r-- 1 watanabe ruby 260 Apr 4 2000 mingw32.bat ruby:/d/gcc-2.95.2 % getfacl mingw32.bat # file: mingw32.bat # owner: 1000 # group: 513 user::rw- group::r-- mask::r-- other::r-- ruby:/d/gcc-2.95.2 %
これはext/pty/script.rbの"/bin/csh"のとこを変更して取った。
この状態で
Everyone -- 特殊なアクセス権(R) watanabe(WATANABE Hirofumi) -- 特殊なアクセス権(RWDPO) なし -- 特殊なアクセス権(R)
という感じになる。そのまま
watanabeがuser なしがgroup Everyoneがother
に相当すると考えられる。
administratorの権限をつけてるとファイルの所有者はadministratorになってしまう。 が、WinNTでつけないで使ってる人などいない気もする。 Win2kならrunasがあるからつける必要はないんだけど。 Cygwinしか使ってないおいらの場合はつけてない。
print 'Just another Ruby hacker,'.scan(/./).pack'a'*25
0777のままじゃいやだよね。ってわけで
% find ~ -type d | xargs chmod -v 0755 % find ~ -type f | xargs chmod -v 0644
として、~/binは+xし直したりした。その他の必要なとこは個別にchmodし直し。 ついでに/usr/localも同じようにchmodした。 c:/cygwinから一気にやってもいいんだけど、 それなら再インストールしたほうがよさそう。こっちはいずれ。
ここで
% ruby -rsocket -e0
がエラーになることに気づく。 straceしてみるとLoadLibrary自体がエラーになっている。 違いはsocket.soを0644に変えただけ。試しにchmod +xしてみたら問題ない。 そうか、そんなとこまで関係するのか。なかなか奥が深い。 実を言うとmodruby-ja MLのX-Mail-Count: 00019はそういう意味だったりする。
というわけでそのパッチをあてて更新。 小さいから--enable-sharedにしてもあまり意味がないと思う。 Apache 1.3.20が出たら考えよう。
UNIX USERにDebianがついてきたので、試そうかと思ったらDVDだった。 2枚組にどうやって収めたんだと疑問だったがそういうことか。 ってDVD-ROM driveなんてうちにはないよ。 いいかげんPCの買い換え時か。
Alphaなマシンには縁がないのになぜに?と、改めて これ を見て納得。
え?一ヶ月前に実装したよね。
date: 2001/03/13 05:48:58; author: aamine; state: Exp; lines: +5 -2 aamine * lib/net/http.rb: add HTTPRequest#basic_auth.
'Just another Ruby hacker,'.send 'yalpsid'.reverse.intern
samba上のファイルがいったい誰のファイルなんだ状態になって困る。
% ls -l hoge -rw-r--r-- 1 3232 Administ 0 Apr 23 13:18 hoge
これはLinux上ではおいらのファイルなんだけど、 てゆうかnteaでは問題なく書き込めてたんだけど、なじぇ? 調べてみるとsmbntsecってのがあってnoにすればいいらしい。
% CYGWIN='ntsec nosmbntsec' ls -l hoge -rw-r--r-- 1 watanabe ruby 0 Apr 23 13:18 hoge
なるほど。もちろんsmb.confでは
sucurity = server
にしてる。あ、いや、もちろんでもないが。と思ったら
sucurity = DOMAIN
になってた。いつのまにそんな設定にしてたんだ、おれは。
センチバっていつのまにか解散したのか? hitomiのINNER CHILDが 元センチバのアキノリの作曲と紹介されてた。
print %w.Just another Ruby Ruby Ruby hacker,..uniq.join ' '
-no-cygwin
問題は直ってる。
diff
を取ってみるとspecs関係が結構変更されてる。
.winnt.c.swpとか残しとかないように。
-2に比べて小さくなったなと思ったら、
objcがごっそりなくなってる。いいのかそれで?
おいらは使わないからいいけど、というより使ったことがない。
{}.fetch(:x){'Just another Ruby hacker,'}.display
Cygwinのsetup.exeのソースは
CVS
か、snapshotsのcygwin-src-xxxxxxxx.tar.bz2の中にしかないです。
cinstallというディレクトリがそれ。
たしかにこれを使うのはけっこういいかもしれないなあ。
まねしちゃおうかな。
なぜかいきなり1.3.1に。mingw, w32apiもやっと更新された。 /usr/lib/mingw/libstdc++.aは忘れさられたようだ。 お約束の如くRubyも通らなくなった。
missing/strftime.cはどうしようかな。 ほんとはこれを使う必要もないんだけど。 defines.hに#undef HAVE_TZNAMEを入れるのがいいかと思ったら、 strftime.cはこれをincludeしてない。 configure.inでac_cv_var_tzname=noするしかないか。
dllwrapは内部的に-nostartfilesしてるから -L/usr/lib -L/usr/lib/w32apiが指定されなくなる。 よって-luser32が見つからない。 もうちょっとテストしてからリリースしてよ。
% dllwrap -o foo.dll
でわかるし。
--target=mingwのときは-nostartfilesしてないから、
そもそもそんなオプションをつけなくてもいいんだよね。
とはいうもののdllwrap自体は元々そういう仕様だったし、
gccの挙動が変わったのか?
対策としては-L/usr/lib/w32apiをつけるのが簡単。
根本的にはgcc -sharedでDLLを作るのがいいんだろう。
Ruby 1.6.4に入れるべき?
{}.delete(:x){'Just another Ruby hacker,'}.display
だいたいけりはついた。
出たみたいだ。試せるのは明日だな。
The new gcc release fixes a problem where /usr/local/lib was not being searched by default. It also forces a search of /usr/lib/w32api when linking regardless of whether -nostdlib is specified or not. binutils is basically an update release but there is one additional feature. 'ld' searches both /usr/lib and /usr/lib/w32api by default. Hopefully, this will rectify some of the dlltool problems that are being reported.
とりあえずRubyのほうはconfigure.inだけいじっとこう。
ついに出たか。
print [:x].map{'Just another Ruby hacker,'}
Rubyは無事makeできた。 binutilsはまだ不具合あったらしく早くも-2へ。 Cygwin 1.3.2も近々出るらしい。
{'Ruby hacker,'=>'Just another'}.each{|x|print x.reverse.join ' '}
O1, B1, D2, A3で申し込んで受講票が来た。来たのは25日だが。
会社に置いといても遊んでるだけなので、連休中は家で遊ぶことにした。 どっちにしても遊んでる。 それはそれとして、ここには最新のCygwinを入れることにしよう。
print [].unshift('Ruby hacker,').unshift('Just another').join ' '
最近多すぎる。原因はmascotか。基本的にどうでもいい話で盛り上がってる。 ruby-talkが多いとなぜかruby-listに書くのを控えたくなる。
VAIOのためにDHCP serverを立ち上げた。
1台しかないから常に固定なんだけど、
てゆうかクロスケーブルだから1台しかつながらないんだけど、
いちいち手動で設定すると再起動しろとか言われそうだし。
/var/log/messageを見ると5分に1回の頻度でリクエストを出している。
ちと多すぎないか?あ、
default-lease-time 600;
のせいか。
default-lease-time 1200;
にしたら10分になった。なぜ半分の時間なのかは依然として謎ではあるが。
/usr/include/GL/gl.hには
/* Version */ #define GL_VERSION_1_1 1 #define GL_VERSION_1_2 1
とあるが、opengl-1.1.0-3.tar.gzという名前からわかるようにどう考えても 1.2ではない。
{3=>'Ruby ',2=>'another ',4=>'hacker,',1=>'Just '}.indexes(1,2,3,4).display
そのまま作ると/bin/glut32.dllに依存したものができあがる。 つまりopengl-1.1.0-3.tar.gzもインストールしてくれって話になる。 もう静的にリンクするとかやめようかな。 opengl-1.1.0-3-src.tar.gzはとっても面倒なソースになってるし。
% tar xfvz binutils-20010425-2-src.tar.gz % cd binutils-20010425-2 % mkdir obj; cd obj % CFLAGS=-Os CXXFLAGS=-Os \ ../configure \ --target=i686-pc-cygwin \ --prefix=/usr/local/cygwin % make % sudo make install
% tar xfvz gcc-2.95.3-4-src.tar.gz % cd gcc-2.95.3-4 % mkdir obj; cd obj % CFLAGS=-Os CXXFLAGS=-Os \ ../configure \ --target=i686-pc-cygwin \ --prefix=/usr/local/cygwin \ --enable-languages=c,c++ % make <途中略> _muldi3 ../../gcc/libgcc2.c:41: stdlib.h: No such file or directory ../../gcc/libgcc2.c:42: unistd.h: No such file or directory make[1]: *** [libgcc2.a] Error 1
う?-I/usr/local/cygwin/i686-pc-cygwin/includeが原因か。前回は
% make install tooldir=/usr/local/cygwin
したので/usr/local/cygwin/i686-pc-cygwin/includeは存在しない。 しょうがない。cygwin-1.1.8-2を使おう。
% tar xfvz cygwin-1.1.8-2-src.tar.gz % mkdir build; cd build % lndir ../cygwin-1.1.8-2 % ln -s ../gcc-2.95.3-4/{gcc,libio,libstdc++} . % mkdir obj; cd obj % CFLAGS=-Os CXXFLAGS=-Os \ ../configure \ --target=i686-pc-cygwin \ --prefix=/usr/local/cygwin \ --enable-languages=c,c++
今回はこうしてみた。
% make build_tooldir=/usr/local/cygwin \ FLAGS_FOR_TARGET='\ -L$$r/$(TARGET_SUBDIR)/winsup \ -L$$r/$(TARGET_SUBDIR)/winsup/cygwin \ -L$$r/$(TARGET_SUBDIR)/winsup/w32api/lib \ -isystem $$s/winsup/include \ -isystem $$s/winsup/cygwin/include \ -isystem $$s/winsup/w32api/include \ -isystem $$s/newlib/libc/sys/cygwin \ -isystem $$s/newlib/libc/sys/cygwin32 \ -nostdinc \ -B$$r/$(TARGET_SUBDIR)/newlib/ \ -isystem $$r/$(TARGET_SUBDIR)/newlib/targ-include \ -isystem $$s/newlib/libc/include \ -B$(prefix)/i686-pc-cygwin/bin/ \ -B$(build_tooldir)/lib/ \ -isystem $(build_tooldir)/include'
なにが違うかというとbuild_tooldir=/usr/local/cygwinにして
-B$(build_tooldir)/bin/ \
を
-B$(prefix)/i686-pc-cygwin/bin/ \
に変更してちゃんとbinutilsが使われるようにした。 でもだめだった。やっぱbinutilsもいっしょにmakeすることにしよう。 ひょっとしたらcygwin-1.3.1を使わないとだめかなあ。
正月にもらった無料レンタル券2枚が今日期限切れになることが判明。 よく今日気づいたな。 というわけでM:I-2とパーフェクト・ストームだ。 M:I-2は最後の一本だった。ラッキー。