トップ «前の日記(2006-02-24) 最新 次の日記(2006-02-26)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2006-02-25

_ deployの訳

deploymentってのはコンポーネント化によって出てきた言葉みたく僕は思うんだけど(というのは1990年代の後半からやたら目につくようになったからだけど)、ちょっと日本語化しにくいし、かといってカタカナのままでもそれほど通りが良くない難しい言葉に思う。でもとりあえず訳語とし。ては配備とか配置とかを使い分けていたわけだ。

ところが、今日、とある資料を営業の人が訳したのを見たらdeployment planを導入計画としていた(同じ資料を僕は配備計画と訳してたわけだが)。わお、今まで見た中で日本語的には1番こなれた訳だ。

というわけで、日本語として通じなくなりそうな場合以外は導入を使おうかな、と思った。もっとも、システムについては良いけど、warみたいな単位だと導入って感じでもないな、とも思うのであった。

#あと導入とか展開とかは、初回のdeploy時には日本語的にしっくり来るけど、更新時のdeployに使うのはイマイチかも。追加時には投入ってのはどうだろうか。

_ time_t

どっかでtime_tが負になる話が出てたけどわかんなくなっちゃったし(ruby-devには無い)、まじめに調べるのも面倒になったので_USE_32BIT_TIME_Tを設定してRubyをビルドしたら、OpenSSLのほうはデフォルトのVC8で作っていたもので今度はOpenSSLのところでエラーになりまくり。

選択肢は、

1. OpenSSLも_USE_32BIT_TIME_Tを設定して作成する

2. time.cを見る(というか、NEGATIVE_TIME_Tを単に設定すれば良いだけなのか?)

どっちか。とりあえずNEGATIVE_TIME_Tを設定して_USE_32BIT_TIME_Tは外してみるか。

#これは問題外であった。

_ わかったけど……

time.c
struct time_object {
    struct timeval tv;
    struct tm tm;
    int gmt;
    int tm_got;
};
に対して
time_new_internal(klass, sec, usec)
    VALUE klass;
    time_t sec, usec;
{
    VALUE time = time_s_alloc(klass);
    struct time_object *tobj;
    GetTimeval(time, tobj);
    time_overflow_p(&sec, &usec);
    tobj->tv.tv_sec = sec;
    tobj->tv.tv_usec = usec;
    return time;
}
しかしstruct timevalは
struct timeval {
        long    tv_sec;         /* seconds */
        long    tv_usec;        /* and microseconds */
};

とwinsock.hで定義されている。time_tは64ビットだけどlongは32ビット、でも精度が落ちるわけではない(まだ)。winsockの定義が符号付longだから負値になるということだ。

missing.hのstruct timevalを使えればよいのだが、その時点では既にwinsock.hは読み込んでいるし#defineと異なりstructだからundefできるわけでもない。

#define TIMEVALをtime_objectで利用する(missing.h、time.cにまたがる修正)とかにするか、それともtime.cに出てくるすべてのtv_secをtime_tでキャストするか、どちらにしてもちょっと汚い感じになりそうな気がする。

追記:この話はこのことだったのかと今頃になって納得。

_ Rubyでデザインパターン

連載は続いていないみたいだけど機械猫さんがRubyでデザパタというのを書いている。

なんかるびまや---(良くわからない)向きの企画だなぁと思った。

まずリストがシンプルだから読みやすい。次にまあいろいろあるし既に10年たってもう古典(古典となると趣味人と研究者の世界に入ってしまう)の領分だから言語を変えることでちょっと見直しをかけられて良いかも、とかまあいろいろ。

_ うわ

eval.cやfile.cもstruct timevalを使ってるのか。

あ、でもこっちは変えてはならなかったり。

_ 結局

力任せにtimeval_tを導入してみた。
#if defined(HAVE_SYS_TIME_H)
#  include <sys/time.h>
   typedef struct timeval timeval_t;
#else
#if !defined(_WIN32)
  #define time_t long
  struct timeval {
#else
  struct win32_timeval {
#endif      
    time_t tv_sec;	/* seconds */
    time_t tv_usec;	/* microseconds */
};
#if !defined(_WIN32)
    typedef struct timeval timeval_t;
#else
    typedef struct win32_timeval timeval_t ;
#endif
#endif
結果は
1254 tests, 13349 assertions, 0 failures, 34 errors

昨日が1254 tests, 12940 assertions, 7 failures, 44 errorsだからそれなりの進展ぶりだが、問題は汚いことだな。

とりあえずdevに投げるか、それとも32ビットに戻すパッチのほうに挑戦してみるか、どうしようかな。

#missing/の下をいじればもっときれいにできそうだからやめとくか。

ちなみにこの時点ではこんなの(例:process.c)

static VALUE
rb_f_sleep(argc, argv)
    int argc;
    VALUE *argv;
{
    int beg, end;
#if defined(_WIN32)
    timeval_t tvalt;
    struct timeval tval;
#endif    
    beg = time(0);
    if (argc == 0) {
	rb_thread_sleep_forever();
    }
    else if (argc == 1) {
#if defined(_WIN32)
        tvalt = rb_time_interval(argv[0]);
        tval.tv_sec = tvalt.tv_sec;
        tval.tv_usec = tvalt.tv_usec;
	rb_thread_wait_for(tval);
#else        
	rb_thread_wait_for(rb_time_interval(argv[0]));
#endif        
    }
    else {
	rb_raise(rb_eArgError, "wrong number of arguments");
    }

missingの中を変えてそちらをtimeval_tを認めるようにすれば、_WIN32の場合そちらを参照することになるからいちいち本当のstruct timevalに詰め替える必要がなくなる(はず)。

#と思ったが、やはりその場合影響があまりに広範囲になる(eval.cの修正も必要になる)。time.cの中でtime_tにtv_secとtv_usecをキャストするのが当面は良さそうな予感。 #追記:その予感は正しくはないということはわかった。(キャストだけじゃどちらにしても符号拡張が先に来るからだめだけど、それだけでも不足)
本日のツッコミ(全2件) [ツッコミを入れる]
_ y-Aki (2006-02-26 07:12)

#includeの後ろがタグ扱いになって消えてますね。

_ arton (2006-02-26 08:00)

どうもありがとう。修正しました。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|

ジェズイットを見習え