Ruby言語やLinuxのネタが多いです。
August 01, 2002 [おもひで]
■ [Misc] 会社のPCにVMWareを入れてみた
んでもってFreeBSDをゲストOSとして入れてみたんだけど、なんか恐ろしく遅い。ブートとかはある程度早いんだけど、コンソール(というかshell?)が異様に遅いので作業にならない。
VMWareもFreeBSDも初めて入れたけど、こんなに遅いもんなのかな。それとも設定が悪いのかな。うーむわからん。
August 06, 2002 [おもひで]
■ [tDiary] 本日のリンク元表示プラグイン-2.0.0 is out!
文章で説明するのはちょっと難しいんだけど、こいつをpluginディレクトリに置くだけで、サーチエンジンの検索文字列だけ下にまとめて表示されるようになる(Linuxビボ〜ろくの日別表示の本日のリンク元を参照)。表示内容は
ヒット件数 x 検索文字列種類数 検索文字列1, 検索文字列2, ...
という感じ。検索エンジンからの検索がやたらヒットする人にお勧め。
■ 実はLinuxビボ〜ろくも日別で表示すると、本文より本日のリンク元の方が行数あったりするようになってしまっているので、少しでも本日のリンク元をコンパクトにまとめたいなぁと思ってたんだよね。
1.x系でUTF-8の文字化けが減っただけでだいぶ良くなったんだけど、今度は妙に左の空間が空いてしまっているのがもったいない感じがして今回のように検索結果だけまとめるようにした...というわけだ。
ただ、version-1.x.x系と大幅に機能(というか考え方)が変わるのでバージョンは2.0.0としてみた。オレがリリースするツールで2.0.0なんていうのは初めてだ(^^;)。
■ もちろん、1.x系と同様な表示ができるようなオプションも残したけど、1.x系で十分な人はバージョンアップする必要はない。
■ そうそう、バージョンアップする場合Uconvをインストールし直す必要はなくて、その場合はdisp_referrer.rbだけ入れ替えればOK!
■ しかし、ソースコード、あまり時間をかけなかったせいもあるけどだいぶ汚くなってしまった。まぁ、おいおい直していくことにしよう。
にしてもよく動いてるな〜こんなんで(^^;)。
■ [tDiary] 本日のリンク元表示プラグイン-2.0.1 is out!
っていうか、やっぱバグってました。すんまそん。
August 07, 2002 [おもひで]
■ [tDiary] 本日のリンク元表示プラグイン
なるほど、そのアイデア(smbdさん)いただきます。
■ にしてもコード複雑すぎ(自分で言うのもなんだが...(^^;))。全然Rubyっぽくない。もうちょっと書き直そう(でもだめだったりして(^^;))。
August 08, 2002 [おもひで]
■ [tDiary] 本日のリンク元表示プラグイン-2.1.0 is out!
また表示方法を変えました。検索エンジン単位に表示する形にしてあります。すっきり。
2.0.1と互換性を持たせようと思ったんだけどやめました。どーしても前の方が良いという方はバージョンアップしないようにしてください。
ソースの方もゴッソリ書き換えました。(前に比べると)だいぶマシになったと思います。
それから、smbdさんのご要望にも対応しました。更新画面では全てのリファラが表示されます。
■ さ、Ruby-GNOMEに戻るか...。
August 09, 2002 [おもひで]
■ [tDiary] 本日のリンク元表示プラグインメモ
あ、そうか。これ、HEADに入れちゃマズイですね。次にCVSいじるときに直します。個々の検索キーワードのリンクもできれば対応したいなと思います。
それから、antibot-referer.rbがどういうものかわかったので、これと同等の機能も入れようと思います。確かにわざわざCPUパワーを浪費してまで検索ロボットに教えてあげる必要はないですもんね。
あとGoogle検索の改善と他の検索エンジンへの対応かな。あとはメジャーどころはNetscape位かと思ってますが他にもあります?
#とっても件数が少ない場合は検索エンジンといえど通常の処理をした方がCPU負荷を考えると良いんですけどね。
August 13, 2002 [おもひで]
■ [Ruby] Ruby-GNOME2のコーディング中に
ふと、RClassあたりにクラス自身のではなくて、ラッパする構造体のmark, free, sizeの情報を持っているとうれしいかもと思った。
■ [Ruby] そーや、トムソーヤなんや(遅すぎ?)
Ruby/LibGladeが動かんぞ!とか言ってたのでコード送ってもらってdebugしてあげたんだよね。
で、他愛もないものだったからすぐ間違いを指摘できたんだけど、その時に
「Ruby/LibGladeのドキュメントが少ない今、他の人のknowledgeになるかもしれんからruby-talkにフィードバックして」
って書いた(つもりな)んだけどその後音沙汰無し。あれじゃ、ruby-talkの人はトムソーヤのバグなのかRuby/LibGladeのバグなのか判断できないじゃないか。
といって、オレがフォローメールをruby-talkに投げるわけにも行かず。debug時間より時間かけて辞書を片手にリプライ書いたというのに。うき〜っ!
August 14, 2002 [おもひで]
■ [Ruby] 続トム・ソーヤ
今度はマルチポスト(ruby-talkとruby-gnome-users-en)。
質問の内容も教えて君レベル。具体的にはGladeのGUIの使い方の質問だったんだけど、そんなのちょこちょこいじってればわかるだろ〜普通っていうレベル。
ちょっとカチンときたのでマルチポストすんなとリプライ。
おかげでオレ様の大人げなさと度量の狭さっぷりを世界中にアピールしてしまった格好だ。なんかものすげー損した気分。
■ [Misc] robotよけ
Hena Hena日記経由で GRAPHIC WIZARD'S LAIRとさらに、robotはぢきについてを参考にさせていただいてLinuxビボ〜ろくにもロボットよけを適用してみた。これで少しはCPU負荷率が下がるかな。
August 18, 2002 [おもひで]
■ [Ruby] Allocation Frameworkで悩む
Ruby-1.7系の場合、メソッドnewは allocate -> initializeという順番で初期化を行って行くんだけど、じゃぁ、いったいallocateでは何をしてinitializeでは何をすべきか、というところではまった。
具体的にはRuby/GTK2のGdk::Cursor用コード(の抜粋版)。
static VALUE gdkcursor_s_allocate(klass)
VALUE klass;
{
GdkCursor c;
return Data_Make_Struct(klass, GdkColor, 0, free, c);
}
static VALUE
gdkcursor_initialize(argc, argv, self)
int argc;
VALUE *argv;
VALUE self;
{
VALUE source, mask, fg, bg, x, y;
rb_scan_args(argc, argv, "15", &source, &mask, &fg, &bg, &x, &y);
DATA_PTR(self) = gdk_cursor_new(NUM2INT(source));
return self;
}
■ 今のCVS版だと上記の(ような)実装になってるのだけど、これだと、allocateの方で生成したGdkColorが無駄になってしまう。
うーん、どうすれば良いんだ....と思ってruby-devの過去メールをあさると立石さんが同様の問題で悩まれていたようで、そのものずばりのスレッドがあった。ホント、読んでないよね<オレ。
■ で、この辺の情報ってどこかにまとまってないのかなぁ、と思いつつスレッドの内容をまとめてみた
Allocation Frameworkは「allocationのやり方がオブジェクトごとに異なっていて、どこにフックをかけたらよいのかわからない」という問題を解決するもの。 これにより、
「すべてのクラス」で「未初期化のRubyオブジェクト」を返すべき。
allocateはごくまれに生成されるインスタンスのタイプや構造を知るためにも使われるので、できるだけなにもしない「空のRubyオブジェクト」を返したほうが良い。
initializeはサブクラスでオーバーライドされる可能性がある
と統一されたので、生成と初期化について一貫性ができた。しかも、やや間接的ではあるが、クラスからそのクラスのインスタンスの「型」を知る方法ができたという副次的な効果もできた。
T_DATAの場合にはptrを0としてData_Wrap_Structするのがよい。で、initializeで DATA_PTR(obj) = ptr と初期化する。 それ以外の「型」については個別に対応する必要があるが、「型」を自分で定義する機会は滅多に無いはず。
■ ということは、T_DATAである上記コードは以下のように書けば良いのかな。
static VALUE gdkcursor_s_allocate(klass)
VALUE klass;
{
return Data_Wrap_Struct(klass, 0, free, 0);
}
initializeの方は同じ。
■ んでもって
また,allocateで使用不能なオブジェクトを作ったことで,すべてのメソッドでその使用不能状態を検出する作業が必要になるなどの場合があると思います.このような場合でもallocateで使用不能状態を作るべきかでちょっと悩んでしまいます.
これはinitializeする前だけでなく、たとえばcloseされたIOなんかにも当てはまる話です。Rubyが静的な(変数でなく)オブジェクトのスコープ(というよりライフスパンといったほうが適切?)を持たない以上、対応は必須だと思います。
ProcやThreadのように使用不能な状態の存在しないクラスもありますので、絶対にだめとは言えませんが、従っておいたほうがユーザに親切ではないだろうかとは思います。ProcやThreadも将来的には対応させようと思ってますし。
これって、あおきさんみたいにinitializeしていない場合はエラーを返すようにしないといけないということかな。となると上記のように単純にData_Wrap_Struct使うだけじゃダメだね....。
■ とここまで考えてさかいさんのRuby/GLibのコードを読み直す
gobj_holderが良い感じだ。そうか、こうすれば良いのか。さすがさかいさん...。
■ それにしても
まったく、ここまで何も理解してないでメンテナやってるオレもすごいな(^^;)。
August 26, 2002 [おもひで]
■ [tDiary] アクセスカウンタ表示プラグイン
またしてもpstoreでエラー。pstoreは使わないようにすべきなのだろうか。うーむ。
August 30, 2002 [おもひで]
■ [tDiary] アクセスカウンタ表示プラグイン-1.6.0をリリースしました
本質的な改善ではないのですが、カウンタデータが壊れた場合に自動で1つ前の状態に復旧させるようにしました。おそらくこの機能だけでエラー画面が表示されることはなくなると思うのですが、さらに1つ前のデータも壊れていた場合は、カウンタ値を0とすることによりエラー画面は出ずに日記だけは表示できるようになりました(この場合は手動で復旧するまでカウンタは機能しないことになります)。
なお、バックアップデータは7つあるのですが自動復旧は1つ前のもののみです。1つ前のデータが壊れていた場合は手動でさらに過去のデータから復旧する必要があります。といっても、アルゴリズム的には1つ前のデータが壊れている場合というのは無いはずなのですが....。

▲ smbd [ありがとうございます〜]