Ruby言語やLinuxのネタが多いです。
November 03, 2003 [おもひで]
■ [Ruby-GNOME2] Ruby/GDK完了
ようやくRuby/GDK(Ruby/GTKに含まれるGDK部分)が終わった...。ぱちぱち。
にしても、プロジェクト初めて1年たったというのに、オレが担当してる部分は一向に終わる気配が無いなぁ。すんまそ。
■ ちなみに1.0リリース時にはGTK+で必要とするコアライブラリを全部カバーするつもり。
ってことはつまり、あとGLib, GTK+, Pango, GdkPixbufを全部実装しないとならない。GLibは必要そうなのだけで良いとして、他が大変だなー。Atkも実装しないとだよなぁ。
うーん、先は長い....(T_T)。
■ 0.7.0リリースから2ヶ月が経ったのでそろそろ0.8.0をリリースしようと思う。今週末か遅くとも来週の末くらいが良いな。
#と決意表明して自分を追い込むことに(^^;)。
November 10, 2003 [おもひで]
■ [Ruby] wxrbbr
いよいよwxRubyも実用段階に入ったということか。Ruby-GNOME2 Projectをメンテナンスしている身としては、RubyでGUIプログラミングする人はみんなRuby-GNOME2を使ってくれればどんなに良いだろうと思ってるんだけど、Ruby界(?)としてみると他のGUI Toolkitが出て来るというのは良いことだろう。ライバル出現でオレのモチベーションもあがるかもしれんし...って今以上は無理か(-o-;)。
RubyCocoa版。ドキュメント表示部分がきれい。kimura wataruさん作。
■ たぶん、これで全部だと思うんだけど、他にあります?
November 12, 2003 [おもひで]
■ [Ruby] Ruby-GetText-Package-0.5.2 is out!
Win32環境でバグってたとruby-listで指摘を受けたのと、なぜかでruby-talkでちょっとだけ話題になったので、急遽修正してみた。
デグって無ければ良いのだけど。
#ま、それもいつものことか(^^;)。
それにしても、0.5.1ってうっかり八兵衛もビックリのコードだった。良く気づかなかったな...。お恥ずかしい。
■ そういや、なぜか今日に限ってRuby/GTKのしかも例のsetlocaleの件が話題になってる。なんか、オレ的に今日はl10nな日なのかも。ってかオレバグ(^^;)。
#Ruby/GTKも直した方が良いのかなぁ。ってもうあまり触りたくないんだけど...。
■ [Ruby] rb_assoc_new
なかださん: rb_ary_new3(2,x,y)よりもrb_assoc_new(x,y)のほうがいいかも。
なるほど。Ruby-GNOME2なんかでも前者使っちゃってるから今後直していこう。
November 16, 2003 [おもひで]
■ [Ruby-GNOME2] Ruby-GNOME2-0.8.0
リリースしました。今回のはすごいです(って実装したのはさかいさんなんですが)。とうとうRubyからGObjectを定義することができるようになりました。ってこれだけだと使う側はイマイチぴんと来ないかもしれませんが、要は独自のシグナル・プロパティを実装することができるようになりました。
これですっきりとしたイベントドリブン型のコードが書けるようになるでしょう。
是非お試しください。
■ Ruby/GDKも一段落したし0.8.0はなんか節目のリリースのような感じ。Ruby-GNOME2-0.1-pre1を出してから1年(と2日)が経つんだなぁ。継続は力なりと言うけど良く1年続いたもんだ。
November 17, 2003 [おもひで]
■ [Ruby-GNOME2] さっそくバグレポート
ってか、コンパイルエラーが3件。しくしく。
なるべく早いうちに0.8.1出しますんで他にもバグあったらレポートしてください。
GTK+-2.0の環境つぶしちゃったんだけど、また、どっかに用意しないとなー。
■ あー、はやくGTK+-2.0.xとRuby-1.6.x捨ててー。ってかライブラリありすぎ(T_T)。
■ [Ruby-GNOME2] ke-gtk2.rb
#!/usr/bin/env ruby
# http://www.meigaku.ac.jp/~watayan/prog/java/nanisource.html
# の「何もしない Java applet に毛のはえたやつ」をRuby/Tkに移植したもの
# http://znz.s1.xrea.com/t/?date=20031114#p01
# をRuby/GnomeCanvas2に移植したもの
require 'gnomecanvas2'
Gtk.init
c = Gnome::Canvas.new(true)
c.set_size_request(200, 200)
c.set_scroll_region(0, 0, 200, 200)
maxx, maxy = c.width, c.height
num = (ARGV.shift || 100).to_i
interval = (ARGV.shift || 0.5).to_f
num.times do
Thread.start do
x, y = rand(maxx), rand(maxy)
while true
dx = ((rand * 4.0 - 2.0) * 2).to_i
dy = ((rand * 4.0 - 2.0) * 2).to_i
dx = 0 if x + dx < 0 || x + dx > maxx
dy = 0 if y + dy < 0 || y + dy > maxy
Gnome::CanvasLine.new(c.root,
:points => [[x,y],[x+dx, y+dy]],
:fill_color => 'black',
:width_pixels => 1)
x += dx
y += dy
sleep interval
end
end
end
Gtk::Window.new.add(c).show_all
Gtk.main
■ わざとそのままThreadを使ってみたけど大丈夫のようだな。環境によっては再描画されないかも。
■ [Ruby-GNOME2] Ruby/GTK TreeView Tutorial
by Matthew Berg。まだ読んでないんですが複雑なGtk::TreeViewウィジェットの解説というだけあって期待大です。
元ネタのGTK+版を忠実に書き直したものではなく、Ruby版での使いやすさ・簡単さが表現されていると良いなー。
November 18, 2003 [おもひで]
■ [Ruby-GNOME2] ke_gtk2.rbのバグ
終了処理は入れてないのでウインドウを閉じたときに終了せずに止まってしまうのは問題ないです。SEGVはこちらの環境では起きないです....。
と、ふと、ZnZさんのところの話を読んで、しばらく放置してからウインドウを閉じてCtrl+Cをしてみたら、以下のようなメッセージが。
(ke_gtk2.rb:3833): GnomeCanvas-CRITICAL **: file gnome-canvas.c: line 3721 (gnome_canvas_request_redraw): assertion `GNOME_IS_CANVAS (canvas)' failed (ke_gtk2.rb:3833): GnomeCanvas-CRITICAL **: file gnome-canvas.c: line 3721 (gnome_canvas_request_redraw): assertion `GNOME_IS_CANVAS (canvas)' failed
■ こりゃいかん。やっぱりスレッドの中でWidget生成するのはまずいのかな....。うーむ。
■ ちなみに、なかださん、gdbの結果ってどうやって出すんでしょうか?
リリース版ではg_threadの関係でgdbを使えないなーって思ってたのですがひょっとしてg_thread使ってても使えるのでしょうか?
#ひょっとしてCVS版使ってるのかな。
■ [Ruby-GNOME2] Spam対策
こちらもZnZさん。指摘されたとおりにRuby-GNOME2 ML管理画面から
Restrict posting privilege to list members? (member_posting_only)
という項目があったのでとりあえずYesにしてみた。これで良いのかな?
ひとまず、enのみ対応。うまく動くようならjaも対応しよう。
■ [Ruby-GNOME2] Ruby-GNOME2-0.8.0のアナウンス on FootNotes
にしてもどうしてRuby関連のアナウンスがあると"Why Ruby?"というコメントがつくのだろう...。
どうせその後、"I love ruby because ..."につながるのはわかりきったことなので、醒めた目で見ると最初のPostも含めてRuby好きの茶番に見えてしまう。
November 24, 2003 [おもひで]
■ [Ruby-GNOME2] Ruby-GNOME2-0.8.1
リリースした。今回は0.8.0でGTK+-2.0.xな環境でコンパイルできなかった問題とかの修正版。
といっても、Gtk::TreeView周りでGTK+-2.2.x系のメソッドが追加されてたり何点かバグも修正されているので、できるだけバージョンアップしてください。
November 27, 2003 [おもひで]
■ [Misc] 某開発会社
サーバのスペックが低いんじゃボケーッ!ただでもっといいマシン持ってこーいっ!
とクライアント(アプリを開発してるのは別の会社)に言われたのですが、そんなわけないだろうと、こちらもその上に載っているアプリ(Weblogic + Oracle上で動くWWWアプリ)を調べさせてもらいました。
そしたら、なんと、1つのHTML(表)を生成するためにDBに(計算上)6,000 + 12,000 + 12,000回のアクセスしている画面がありました....。若干複雑な画面ではあるのですがなぜそこまで...。
WHERE句とかの存在を知らないんじゃないかとマジで疑ってしまいました。
■ よくよく聞くとそのうち12,000回のアクセスは不要だそうです...。え?
■ この画面ではないのですがソースも少し読みました。SQLは何かのツールで自動生成したらしくA4で1ページ以上あったりしてホントに必要な条件だけなの?と疑問に思ってしまいます。もちろん、IS NULLとかの遅くなりげな構文とかをふんだんに使っています。
■ ループで毎回DBに問い合わせをしているのはもちろんですが、StringBufferも知らないみたいです。惜しげもなくループの中でStringを使いまくりです。おかげで一時的とはいえ大量なメモリがおもしろいように消費されていきます。
PreparedStatementなんて論外です。そんなの彼らにはムズカシ過ぎです。
SQLの動的部分はもちろん文字列結合です。HTMLだけじゃないんです。文字列のエスケープだってループの中でやっちゃいます。6,000件の中から必要なキーを取得して次のSQLを生成しているのでそれもやむを得ません。
■ 負荷試験と称し、20同時アクセスさせたらDBサーバが死にました。といってもクラスタが切り替わっただけなのですが、それもこれもDBのCPU使用率がしばらく100%に張り付いた状態になり、その結果、ヘルスチェック機能がレスポンス無しと判断しクラスタを切り替えたのです。DBサーバとしては正常動作です。でもクライアントはそれをDBサーバの所為にするんです。
#もちろんサーバのスペックをあげれば症状は減るかもしれませんが...。
そんなわけで、我々はこの開発会社の作るアプリをDBへのDDOSアプリと名付けることにしました。でも、フロントエンドのサーバもかなりの高負荷になるのでトロイの木馬とした方が良いかもしれません。実際トロイし<オヤヂギャグ。試験したのが深夜(サービスインしたサーバ上)なのでそんなオヤヂギャグでも大盛り上がりです。
■ とりあえず、Stringで結合しているものをStringBufferに置き換えただけで数分の一の処理時間になりました。実際に置き換えたモノで実演したところ、さすがのクライアントも納得していただけたようです。
たぶん、12,000件の余分なDBアクセスを除けばもっと早くなると思います。
■ あ、ちなみに私はエンジニアではないので、上記解析およびレポートは弊社のエンジニア数名に対応してもらいました。あるエンジニアはソースを見た瞬間に頭痛がしたそうです。温厚な彼が言うのですから、私が見たらキレてるに違いありません。
■ もちろん、メモリ・CPU使用率・ソースコードの解析結果・改善点の指摘等の詳細なレポート付きです .... ここまでやって無料。うがーっ!!!
■ そんなわけで感想
最近のMS Windowsサーバってある意味スゴイね。よく頑張った。UNIXだったらもう少しがんばったかもしれないけど、そこまでするアプリでもないしね。
それにしてもアプリベンダもハードのスペックやOSの所為にしないで少しは反省して欲しい。
StringBufferとかPreparedStatementの件はオレも昔やらかしたことがあるからあまり人のこと言えないんだけどさ。150秒かかって表示される画面なんて誰も使えんよ。
ついでに、ここまでしないと納得してくれないクライアントって...とっとと退散したい。
■ ちなみにここで書いた内容は若干フィクションが入ってます。と言っておきます。
■ 次の日
別のアプリ(デーモン)でSocketExceptionが出ました。クライアントからアクセスされた後、reset by peerなんたらと出てその後の接続要求を受けつけなくなります。
アプリベンダ曰く、ソースに悪そうなところが見あたらないと言うことなのでネットワークのパケットをキャプチャして欲しい、というのです。
いろいろ言いたいことはあるのですがその部分のソースを見たわけではないのであまり疑うようなことも言えません。
そんなわけでさっそくパケットキャプチャを仕掛けました。今のところその症状は1回しか発生していないのでいつまでパケットフィルタを動かしっぱなしにするのかはわかりません。日々蓄積したデータはHDDを圧迫しないように手作業で破棄する予定です。
■ はー、オレは一体何をやってるんだ...。
November 29, 2003 [おもひで]
■ [Ruby-GNOME2] rbbr
アイコンビューアでGC絡みのSegmentation Faultが出ることに気づいた。
何が悪いのかRuby-GNOME2周りをいろいろと探してみたのだけどよくわからない。
■ んで、結局、起動時に読み込むライブラリをクリアしたら(gconf-editorで/apps/rbbr/のlibsという項目をクリア)、Segmentation Faultが出なくなった。
ってことはデフォルト以外で読み込んだライブラリにGC絡みの問題があるんじゃないかなぁ、と思うんだけど、とりあえずRuby-GNOME2が提供しているライブラリには問題ないし、何読み込んでたか覚えてないし、眠いからこれ以上調査するのはやーめよっと。
■ そういや、rbbrって対象にするライブラリを一度requireで読み込んじゃうんだけど、これが根本的にまずいんだよなぁ。
読み込んだライブラリ自体に思いっきり影響受けるし、Ruby-GNOME(1)みたいなライブラリ読み込んでもたぶんおかしくなるだろうし。
何か上手い方法ないかなぁ。対象とするライブラリをrbbrのプロセスとは別プロセスにするとかかな、やっぱり。それはそれで面倒くさそうだ。
November 30, 2003 [おもひで]
■ [Misc] Namazu検索停止
今日、Linuxビボ〜ろくでpstore周りのエラーが出てたのを見てちょっといやーんな気がしたのだが、何のことはないホントに容量オーバー(XREAは50MBまで)だったようだ。
テキスト主体のサイトで何がそんなに容量を食うんだろうと一度ファイルを全てローカルに落として調べてみたところ、tDiary関連のデータファイルがかなりな量を圧迫していると言うことがわかった。2002年が3.9M, 2003年が2.6M, cache/html/2002が1.2M, cache/html/2003が908K、tDiary用のNamazuデータが2.3Mでそれだけで10M程度消費している。
50Mの10Mってのはそれほど大したこと無いようにも見えるけど、他にもHikiだのなんだのがごにゃごにゃと入っているので少しでも使用量を減らしたい。
というわけで、NamazuのデータファイルとNamazu検索にしか使っていないcache/html/200[23](squeeze.rbで生成したデータ)を削除することにした。これだけで4.6M程度の節約だ。
■ tDiaryのデータしか増えないのであればあと2年くらいは持ちそうな計算だ。
でも、いずれ破綻するな...。何か考えねば。

▲ tanaka [音楽用メディアは価格に著作権料が含まれています。 また、音楽用のCDレコーダーがメディアを認識するための 信号も含ま..]
▲ むとぽん [なるほど。そういうことでしたか。 情報ありがとうございました。]