Last-Modified 2010/10/25 11:35:18

その日あった事ダス第229週


1月27日(日曜日)[前年][翌年]

今日は ruby 新年会。内容は他の人の日記参照…とは言えないな^^;

本日の大失敗は、名刺を印刷しようとして黒インクが切れたこと。うちのプリンタは ALPS だからそう簡単にインクは売ってない。売ってる店を探している間に遅刻しちゃうので名刺は断念。

新年会は予定通り14名。花心では4階に案内された。あ、袴じゃないんだ。いや、それ目的じゃないのでええんだけども。
自己紹介中に鍋から煙が出たり、どうやってすき焼き作るん? だったりしてかなりてんやわんや。結構話が弾んでたようなので気が楽だった。集合時は大きな輪になってお見合いしてたもんね。ほんとあの時はどうなることかと(汗;
会計で思ってたよりもはるかに高いお金を請求されて焦る。学生さんもいるのであまり高くしたくなかったのに…調査不足。ごめんなさい。

その後、田園に移動して更に1時間。これ以上いると私が帰れなくなるということで閉会^^;

また集まりたいっすね。なんかイベントがあると集めやすいんだけども、なんかないかなぁ。


1月28日(月曜日)[前年][翌年]

大悪司。気が付けば「あれ?アンリは?」てな状態で最短クリア更新。って、アンリ目的で進めてるのにこれはまずいということで部分やり直しで…えっとぉ(謎汗;

次はかまってあげるから許してね(ぉぃ

まあ、民華よりは良いかも<ひでー


1月29日(火曜日)[前年][翌年]

新年会のネタは RWiki の Ruby 新年会にまとまってます。まとめてくださった方、ありがとうございます。

むー、こうやって改めてみると、ruby に関係ないネタのほとんどに身に覚えがあるなぁ(汗; 誰がどの発言をしたか考えてみるのも面白いかも。って誰が参加したのかどこにも一覧ないな。

せっかくなので覚えている範囲で席順。いつもは itohy さんの仕事なのだが<それ集まり違う

Tosh 石井 sheepman 堀川 橋本 柳川 なかむら(う)
----------------------------------------------
----------------------------------------------
 あづみ 池上 うえの 福井 坂口 メンソール 佐藤

橋本さんと坂口さんは逆だったかも? うーむ、覚えてなくてごめんなさい。あとさすがに田園での席順は覚えてません^^;


1月30日(水曜日)[前年][翌年]

Module#include が private なのに悩む。今手元にあるソース(というか apachelog.rb なのだが)に、

klass = Class::new
klass.class_eval{ include ApacheLogModules::Initialize }

という部分があるのだが、普通に klass.include と書けても良さそうな気はする。まあ、class_eval でも1行だし、そうそうある用途でもなさそうだから良いか。

ruby 1.7 には Method#included というのがあるのだが、まあ、Method#include したときに self を引数に呼ばれるんだけども、これが 1.6 に欲しい。1.6 に実装するだけなら Method#include を上書きしてしまえば良いのだが、super では呼べないのであらかじめ別名で alias する必要がある。個人的にはコレが嫌い。名前を増やしたくない。

ならどうするか。Class#include を定義して super するという方法もあるが、すごく中途半端。ならいっそのこと必要な class の include だけ上書きするようにしちゃえ、という事で考えてみる。class の object から見て、Module#include は private class method になるのか。しかしここで private class method の定義方法が分からなくて悩む。Module#private だと無理だしなぁ。ということで悩んだ末に以下のように書いてみた。

mod = Module::new
mod.module_eval(<<-DEF,__FILE__,__LINE__+1)
  def include(*mod)
    mod.each do |m|
      super m
      m.included(self) if m.respond_to? :included
    end
  end
  private :include
DEF
klass.extend mod

こういったコードが好きとはいえ、これはちょっとやりすぎかも。

…と、ここで %ruby で質問してみたら gotoken さんから回答が。うお、Module#private_class_method なんてあるんかー(汗; 普通の public method だ。この辺の method はほとんど private だからそっちしか見てなかったよ…。

klass.class_eval(<<-DEF,__FILE__,__LINE__+1)
  def self.include(*mod)
    mod.each do |m|
      super m
      m.included(self) if m.respond_to? :included
    end
  end
  private_class_method :include
DEF

うむ。満足。

あ、よく見たら Module#included って private だ。これじゃ呼べないな。include される方で上書きして public になっちゃってたから気がつかなかった。
Object#initialize みたいに宣言されたら自動的に private になるように…までする必要はないかな…どうだろう。

Date2 に入っている Date::strptime の出力から Time オブジェクトを作るメソッドを作ってみる。%G や %V 辺りがよー分からん。今回はものすごく作りが怪しいので、ちょっとしたテストを書いてから実装。んで気がついたこと。

strftime("%s") と to_i って値が違うのね。

というか、gmtime.strftime("%s") と localtime.strftime("%s") の値が違うことに驚いた。てっきり "Thu Jan 01 00:00:00 UTC 1970" からの経過秒数だと思ってたのに。Time#strftime は単に strftime(3) を呼んでいるだけなのは知っていたので NetBSD の strftime(3) を眺めてみる。む、単に mktime(3) を呼んでるだけすか。

man 3 mktime の出力より。

  Mktime  converts  the broken-down time, expressed as local
  time, in the structure pointed to by tm  into  a  calendar
  time  value  with  the same encoding as that of the values
  returned by the time function.

ぐあー。expressed as local time だからか? こういう仕様なのは何か理由があるんだとは思うのだけど、何故だろう…。

とりあえず strptime で "%s" で得られた値をそのまま Time::at に食わせるとダメらしい。時差を計算して加算しないとダメか…。

うーん。最近の日記は「ゲームに飽きてきた自分」が良く分かるのう(汗;;;;


1月31日(木曜日)[前年][翌年]

昨日に引き続き Date::strptime 辺りをふにふに。%U や %W はともかく、%G や %V の仕様が良く分からん。理解はできるけど納得できないという感じか。ISO8601 あたりをちゃんと読まねばならんかのう。

NetBSD の strptime(3) に実装されている部分はそっちを参考に。実装されていないヤツは挙動からなんとかコードを起こしてみる。うーむ、後から読んでもさっぱりわけ分からんコードやのう。とりあえず 1980/01/01 から 2029/12/31 まで Time オブジェクトができることは確認。ちなみにむちゃくちゃ遅い。

  '[%d/%b/%Y:%H:%M:%S %Z]'
  '%Y %U %w %H %M %S %Z'
  '%Y %W %u %H %M %S %Z'
  '%G %V %u %H %M %S %Z'
  '%s %Z'

Pentium3-450MHz なマシンで上記5パターンを 1980/01/01 から 2029/12/31 まで全部チェック(約 90000 件)すると2分半ほどかかる。うーん、Apache の log のパースにこれを使うのは無謀だよなぁ。

せっかくなので公開。もちろん要 strptime.rb。Date2 はこちらから。ついでに RAA

う、今見たら Date2-2.5 が出てた。strptime.rb もちょこっと変更あったけど、これだったら全然影響ないな。

そういや最近 ruby-list で新しい Date クラスの話が出てるね。個人的には ISO8601Week クラスが気になる。機能ではなくて実装方法に^^; ちゃんと理解できてればもっとまともなコードが書けそうな気がする。

あまりに↑の Date::strptime を使った Time#parse2 が遅いので、素の strptime(3) を使うライブラリを書いてみた。こんな感じ。

static VALUE
rb_date0_strptime(klass,pattern,format)
    VALUE klass,pattern,format;
{
    time_t tt;
    struct tm tm;
    char *pat,*fmt;
    int plen,flen;
    memset(&tm,0,sizeof(tm));
    pat = rb_str2cstr(pattern,&plen);
    fmt = rb_str2cstr(format,&flen);
    if( NULL == strptime(pat,fmt,&tm) ){
        return Qnil;
    } else {
        tt = mktime(&tm);
        return rb_funcall(rb_cTime, rb_intern("at"), 1,INT2NUM(tt));
    }
}
void
Init_date0()
{
    VALUE cDate = rb_define_class("Date",rb_cObject);
    rb_define_singleton_method(cDate, "strptime", rb_date0_strptime, 2);
}

date0 なのは date だと require 'date' で date.rb とぶつかるから(汗;
初めて C の拡張ライブラリ書いたけど、この程度なら楽だね。

さすがにむちゃくちゃ速い。が、NetBSD の strptime(3) は "%Z" 解析しないし、mktime(3) の挙動を良く分かってないし、というか、

$ ruby -r date0 -e "p Date::strptime('2002 00 2 00 00 00','%Y %U %w %H %M %S')"
Mon Dec 31 00:00:00 JST 2001

なのは何故? なんで月曜日を返すねん。%w は 0 が日曜日ちゃうんか? やっぱ mktime(3) のソースも読むかなぁ。NetBSD 以外でも同じ結果になったので、多分何か見落としてるんだろう。

…だんだん最初の目的(Apache の log 解析)から離れていってるなぁ。まあ、もともと作り直そうと思った動機が「utf-8 な検索エンジンの referer がデコードできなかったから」程度だもんな。


2月1日(金曜日)[前年][翌年]

NetBSD の strptime(3) をよくみたら '%U' や '%W' って解析するけど捨てられてるやん。まあ、tm 構造体にその情報をセットするエリアないもんな。mktime(3) は関係なかった。でも mktime(3) は tm_wday 見てないよね。残念。

k-opti.com の光ファイバーのホームタイプの事前登録を済ませてみたり。本登録は 3/1 からなのね。ADSL で不満があるわけではないが^^; あ、サーバ設置不可だって。どういう利用用途だとサーバとみなされるんかな。マシンは5台まで。今現在で3台だから問題なし。

あと気になるのは NTT かな。うちの近辺が B フレッツの対象になるのはいつぐらいからだろうな。

本日夜から haun.org の IP が変更になるので、metainfo.haun.org も IP 変わります。変更直後はヲレアンテナにアクセスできないなどの症状が出るかと思います。ご注意くださいませ。

昨日作った C の拡張ライブラリ、Time::strptime になるようにして、Time#to_a と同じように配列を返すようにしてみた。
…この辺いじくるのにそろそろ飽きてきたので元の目的に戻るか。

↑とか言いながら newdate 眺めてたりして^^; あ、strptime 使って解析してるのね。:year,:month,:mday しか使ってないけど。多分これが正しいんだろうな。


2月2日(土曜日)[前年][翌年]

RagnarokOnline に興味があったのでβ版をダウンロードしてみる。って、実際の韓国のサイトには全然繋がらないので適当に検索して見つけたサイトから。パッチも大量にあるのね。ダウンロードは FIVA でやって、その間にデスクトップで WindowsUpdate …したらコードレスマウスが認識しなくなった(汗; PS/2 なマウスも繋いでるからなぁ。その辺が原因?

3時間ぐらいかけて環境作って…あ、アカウント作成する必要あるのか。こればっかりは韓国のサイトに繋ぎに行かないと、でもむちゃくちゃ重いのでしばらく放置プレイ。登録後 HTML メールが届いてそのメールのボタンを押さないとダメってのは新鮮だね:-)

うーん。何がなんだか。UO とかやってないので何していいか分からないな。とりあえず外に出て適当に戦って終わり。予想はしてたけど、重い。日本にサーバ置かないのかな、これ。このレスポンスだと製品版を買ってまでやろうかなとはちょっと思わないかな。

久々に PSO 起動。何ヶ月ぶり? 自分の日記の PSO の記述は去年の7月以降なさげなのでほぼ半年ぶりか。オンラインに繋ぐ前に VH 遺跡をオフラインで回ってリハビリしてみたり。


このページは基本的にリンクフリーです。

written by Shin'ya Adzumi 'あづみ しんや'
adzumi@denpa.org