〜2003年8月中旬〜
LL土曜でApacheのログの話のときにtime.rbが使えないかという質問があったけど、 だめだねえ。 ParseDate::parsedateがというかDate::_parseが対応してない。
Date::_strptimeを使えば以下のように書ける。
% ruby -rdate -rpp \ -e 'pp Date._strptime(ARGV[0], "%d/%b/%Y:%T %Z")' \ '11/Aug/2003:22:36:08 +0900' {:zone=>"+0900", :sec=>8, :year=>2003, :hour=>22, :offset=>32400, :mday=>11, :min=>36, :mon=>8}
これをTimeオブジェクトにするにはparsedateのようにvalues_atを使うのが簡単。
% ruby -rdate -e ' p Time.mktime(*Date._strptime(ARGV[0], "%d/%b/%Y:%T %Z"). values_at(:year, :mon, :mday, :hour, :min, :sec, :zone))' \ '11/Aug/2003:22:36:08 +0900' Mon Aug 11 22:36:08 JST 2003
実はun.rbにはワイルドカードを展開する処理が入っている。 これはmkmf.rbで作られたMakefileの中に
CLEANOBJS = "*.{o,a,s[ol],pdb,bak}"
という記述があることからもわかるように、 shellに依らないワイルドカードを使いたいがためである。 でもshellに展開されないようにquoteしなきゃいけないってのは、 ちょっと気持ち悪いかもしれない。
UTF-8に変換するなら、pack("U")を使う手もある。
% ruby -e 'p [0xf1].pack("U")' "\303\261" % ruby -riconv -e 'p Iconv.iconv("UTF-8", "ISO-8859-1", "\xf1")' ["\303\261"]
raa:ruby-serialportの バイナリが欲しいという話なので、1.8用を用意しとこう。で、ここではたと気づく。 今現在うちで作っている環境のインポートライブラリはcygruby18.dllに依存しているから、 これで作ってしまうと1.8のリリース版では使えないってことになる。 うーむ。リリース版に逆forwarding DLLを含めるべきか。
今頃になってまとめるのもなんだけど、なんとなく形になってきた。 アイディアとしてはRUBY_PLATFORMと$LOAD_PATHのmswin32をmingw32に置き換えて、 $prefix/lib/ruby/i386-mingw32に偽のrbconfigを置けば、
% ruby -rfake-mingw32 extconf.rb
で、いけるはずだという算段。fake-mingw32.rbはこんな感じ。
class Object platform = RUBY_PLATFORM.dup remove_const :RUBY_PLATFORM platform.sub!(/mswin32/, "mingw32") RUBY_PLATFORM = platform if defined? PLATFORM remove_const :PLATFORM PLATFORM = RUBY_PLATFORM end $LOAD_PATH.each do |x| x.gsub!(/mswin32/, "mingw32") end end
でrbconfig.rbはこんな感じ。
require File.join(RUBY_PLATFORM.sub(/mingw32/, "mswin32"), "rbconfig") module Config no_isocext = nil open(File.join(CONFIG["archdir"], "win32", "win32.h")) do |win32| no_isocext = win32.find do |x| /__NO_ISOCEXT/ =~ x end end if RUBY_VERSION < "1.7" MAKEFILE_CONFIG["LDSHARED"] = "dllwrap --target=mingw32 -mno-cygwin -s" MAKEFILE_CONFIG["CFLAGS"] = "-DNT -Os" MAKEFILE_CONFIG["DLDFLAGS"] = "" else MAKEFILE_CONFIG["LDSHARED"] = "gcc -mno-cygwin -shared -s" MAKEFILE_CONFIG["CFLAGS"] = "-Os " MAKEFILE_CONFIG["DLDFLAGS"] = " -Wl,--enable-auto-import,--export-all -L$(bindir)" end MAKEFILE_CONFIG["CPPFLAGS"] << " -D__NO_ISOCEXT" unless no_isocext MAKEFILE_CONFIG["LDFLAGS"] = "-Wl,--stack,0x02000000" MAKEFILE_CONFIG["LIBS"] = "-lwsock32" MAKEFILE_CONFIG["CC"] = "gcc -mno-cygwin" MAKEFILE_CONFIG["CPP"] = "gcc -mno-cygwin -E" MAKEFILE_CONFIG["GNU_LD"] = "yes" MAKEFILE_CONFIG["CPPOUTFILE"] = "-o conftest.i" MAKEFILE_CONFIG["OUTFLAG"] = "-o " MAKEFILE_CONFIG["YACC"] = "bison -y" MAKEFILE_CONFIG["RANLIB"] = "ranlib" MAKEFILE_CONFIG["AR"] = "ar" MAKEFILE_CONFIG["ARFLAGS"] = "" MAKEFILE_CONFIG["NM"] = "nm" MAKEFILE_CONFIG["DLLWRAP"] = "dllwrap" MAKEFILE_CONFIG["AS"] = "as" MAKEFILE_CONFIG["DLLTOOL"] = "dlltool" MAKEFILE_CONFIG["WINDRES"] = "windres" MAKEFILE_CONFIG["LN_S"] = "" MAKEFILE_CONFIG["SET_MAKE"] = "" MAKEFILE_CONFIG["OBJEXT"] = "o" MAKEFILE_CONFIG["XLDFLAGS"] = "" MAKEFILE_CONFIG["CCDLFLAGS"] = "-DIMPORT" MAKEFILE_CONFIG["DLEXT"] = "so" MAKEFILE_CONFIG["DLEXT2"] = "dll" MAKEFILE_CONFIG["LIBEXT"] = "a" MAKEFILE_CONFIG["LINK_SO"] = "" MAKEFILE_CONFIG["LIBPATHFLAG"] = " -L%s" MAKEFILE_CONFIG["LIBARG"] = "-l%s" MAKEFILE_CONFIG["LIBRUBYARG_SHARED"] = "-l$(RUBY_SO_NAME)" MAKEFILE_CONFIG["LIBRUBYARG_STATIC"] = "-l$(RUBY_SO_NAME)-static" MAKEFILE_CONFIG["STRIP"] = "strip" MAKEFILE_CONFIG["LIBRUBY_A"] = "lib$(RUBY_INSTALL_NAME).lib" MAKEFILE_CONFIG["LIBRUBY_SO"] = "$(RUBY_SO_NAME).dll" MAKEFILE_CONFIG["LIBRUBY_ALIASES"] = "" MAKEFILE_CONFIG["LIBRUBY"] = "$(RUBY_SO_NAME).lib" MAKEFILE_CONFIG["LIBRUBYARG"] = "-L. -l$(RUBY_SO_NAME)" MAKEFILE_CONFIG["TRY_LINK"] = "" MAKEFILE_CONFIG["COMPILE_C"] = "" MAKEFILE_CONFIG["COMPILE_CXX"] = "" MAKEFILE_CONFIG["COMPILE_RULES"] = "" MAKEFILE_CONFIG["COMMON_LIBS"] = "m" MAKEFILE_CONFIG["COMMON_MACROS"] = "WIN32_LEAN_AND_MEAN=" MAKEFILE_CONFIG["COMMON_HEADERS"] = "windows.h winsock.h" MAKEFILE_CONFIG["SOLIBS"] = "$(LIBS)" MAKEFILE_CONFIG["configure_args"] = "--enable-shared" MAKEFILE_CONFIG["sitearch"] = "i386-msvcrt" remove_const :CONFIG CONFIG = {} MAKEFILE_CONFIG.each{|k,v| CONFIG[k] = v.dup} CONFIG.each_value do |val| Config::expand(val) end CROSS_COMPILING = nil unless defined? CROSS_COMPILING end
基本はmingw32のrbconfig.rbを読んで差分だけを置き換えるという方針。 一応1.6,1.7にも対応してる(はず)。win32oleで試してみたら、これでrequireもできた。 よさげだ。
今回はちゃんとopensslを認識。
今日も寒い。10月下旬の陽気。
fake-mingw32に簡単なinstallerをつけよう。 fileutilsを使って書き上げてから、1.6だとだめだと気づいた。 ftoolsで書き直せばいいんだけど、どうせならでっちあげるか。
require 'ftools' module FileUtils def self.makedirs(d, opt={}) File.makedirs(d, opt[:verbose]) end def self.install(s, d, opt={}) File.install(s, d, opt[:mode], opt[:verbose]) end end
インストール用ならこの程度で十分でしょ。
Windows 2000にはNTPサーバはないけど、時刻同期なら
> net time /setsntp:NTPサーバ
で可能。Windows Timeはこの同期を裏でやってくれるサービスなので、 これも動かしておく必要がある。
mingw,bcc32用のバイナリを用意。
zipファイルを用意。
Gentoo Linuxのgccを-vつきで実行してたら
存在しないディレクトリ "/usr/local/include" を無視します
が気になった。 prefixを/usrにしたら/usr/local/includeは最初から見ないはずなのにどうなっているのか? もう一度よく見るとconfigure時に
--with-local-prefix=/usr/local
と指定されてるようだ。こんなオプションがあったのか。 なるほどねえ。
なるほど。 ASRはヘッダとライブラリがついてこないわけですね。 インポートライブラリが全部noになるのはmsvcrt-ruby18-static.libがないからです。 mkmf.logで確認してください。
> copy $ACTIVESCRIPTRUBY\bin\msvcrt-ruby18.dll $ACTIVESCRIPTRUBY\lib\msvcrt-ruby18-static.lib
とすればごまかすことも可能です。
結局おれが原因だったわけだよ。まぬけすぎ。
fake-mingw32をraccで試してみた。
ruby -rfake-mingw32 setup.rb config
と実行しても、setup.rbから呼ばれるrubyに-rfake-mingw32がつかない。 できあがったMakefileはmswin用になってしまう。 まあ、そんなに凝る必要もないので、環境変数RUBYOPTで対応。
ENV['RUBYOPT'] = 'rfake-mingw32'
をfake-mingw32.rb自身に追加することにしよう。
70通を越えた。凄まじい感染力だ。