2005年 12月 11日

.htaccess SetEnv RUBYLIB

$LOAD_PATH.unshift するのがめんどい。SetEnv なんてディレクティブ知らなかった。そんな感じなので SetEnv RUBYLIB /virtual/lowreal/lib/ruby:/virtual/lowreal/lib/ruby/i686-linux を public_html 直下の .htaccess に追記。ローカル環境の拡張ライブラリは普通にインストールするように。

Ruby on Rails を使う気になりたい

よくわからないセクションタイトルだけど、どうしても Ruby on Rails を使う気にならない。でも使えたほうが 2.0 っぽくてかっこよさそう、というか Ruby 書けるとか言うくせに Rails 触ったことないなんて言ったら怒られそうだし、嫌だなぁ。ていうか 2.0 っていうのが胡散臭くてどうも苦手っていうか、そういう方向は好きなんだけど、2.0って何よっていうか、Ruby 2.0 楽しみだなぁ。でもプログラムかいてて楽しいってバージョン 0.2 ぐらいじゃないですか、みたいな、よくわからない脳内回路。

まずバックエンドのデータベースが MySQL とか PostgreSQL とかだと、データの実態が見えなくて気持ち悪すぎ。SQLite はよさげなんだけど、なぜか上手くインストールできない。別に SQL とか DB 自体が嫌いとか苦手なんじゃないんだけど、データの管理方法が手の届かないところにあるのは耐えられない。

こう、Rails でものっすっげぇアプリケーションがあって、それが現状を何かしらすっごい勢いで面白くするなら、もうちょっと必死こいて使う気に (そのプログラムを読んで改造する気=ハックする気、に) なるのかもしれないんだけど、どうも開発が超ハヤイ!とか、MVC!とかデータベース超扱いやすいとかいう話ばっかりで、どんなアプリケーションがあるのかよくわからん。知ろうとしていないだけかもしれないけど、なんだかよくわからない。

2005年 11月 08日

ruby-xslt 0.9.1

ちゃんとエラークラス吐くバージョンがリリース。kiyoya さんのパッチ。

ruby extconf.rb --enable-error-handler して Makefile 作成。ちゃんと exslt もリンクさせるため、OBJS に /lib/libxml2.dll.a /lib/libexslt.dll.a /lib/libxslt.dll.a を追加。なんか知らんけど明示的に指定しないとリンクされなくて ld が怒る@cygwin (このバージョンに限らず)

XML::XSLT::XSLTError と、そのサブクラス XML::XSLT::ParsingError, XML::XSLT::TransformationError が追加される。変換用 XML ファイルのエラーなのか、XSLT ファイルのエラーなのかはわからなく。そのかわりエラー発生のタイミングが変わった。serve 時ではなく、xml= のときに出るようになった。だから問題ない。

エラーの message の意味がないっぽいので、--enable-error-handler 時には rb_raise 第2引数を STR2CSTR(rb_ary_to_s(rb_cvar_get(cXSLT, rb_intern("@@errors")))) とかにしたほうがいい感じ。--enable-error-handler は errors が定義されるのがキモイけど俺はそんなに気にならない。

第二引数を変えるだけだと以下のコードがダメ。

xslt = XML::XSLT.new()
xslt2 = XML::XSLT.new()
begin
xslt.xml = File.read("examples/fuzface.xml")
xslt.xsl = File.read("examples/fuzface.xsl")
out = xslt.serve()
print out;
rescue XML::XSLT::XSLTError => e
p XML::XSLT.class_eval("@@errors") #=> (1)
p e.message #=> (2)
end
p XML::XSLT.class_eval("@@errors") #=> (3)
begin
xslt2.xml = File.read("examples/fuzface.xml")
xslt2.xsl = File.read("examples/fuzface.xsl")
out = xslt2.serve()
print out;
rescue XML::XSLT::XSLTError => e
p e.message  #=> (4)
end

(3) で (2) のときと同じ (4) のとき前のエラーメッセージが紛れ込む。クラス変数使ってるからだろうけど、単純にインスタンス変数にしないのにはなんか理由があるんだろうからとりあえずそのままにして、

void xslt_raise(VALUE cError) {
#ifdef USE_ERROR_HANDLER
VALUE errors = rb_cvar_get(cXSLT, rb_intern("@@errors"));
VALUE error_str = rb_ary_to_s(errors);
rb_ary_clear(errors);
rb_raise(cError, STR2CSTR(error_str));
return;
#endif
rb_raise(cError, "");
}

とか作って経由させ、リセットさせてみる。XML::XSLT.errors は常に空の配列が返るようになって無意味になる。

ruby-xslt.0.9.1.error_message.patch

スレッドの切り替えってどういうタイミングなんだろう。

2005年 10月 30日

ruby-gd

 /tmp/ruby-GD-0.7.4
$ ruby extconf.rb
checking for main() in -lz... yes
checking for main() in -lpng... yes
checking for gdImagePng() in -lgd... yes   
checking for main() in -lm... yes
checking for gdImageColorResolve()... yes
creating Makefile                        
/tmp/ruby-GD-0.7.4
$ make
gcc -g -O2   -I. -I/usr/lib/ruby/1.8/i386-cygwin -I/usr/lib/ruby/1.8/i386-cygwin -I. -DHAVE_GDIMAGECOLORRESOLVE -I/usr/local/include  -c GD.c
gcc -shared -s -Wl,--enable-auto-import,--export-all  -L"/usr/local/lib" -L"/usr/lib" -o GD.so GD.o  -lruby -lm -lgd -lpng -lz  -lcrypt
/tmp/ruby-GD-0.7.4
$ make install
/usr/bin/install -c -m 0755 GD.so /usr/lib/ruby/site_ruby/1.8/i386-cygwin
/tmp/ruby-GD-0.7.4
$ ruby -ve 'require "GD"'
ruby 1.8.3 (2005-09-21) [i386-cygwin]
/usr/lib/ruby/site_ruby/1.8/i386-cygwin/GD.so: No such file or directory - /usr/lib/ruby/site_ruby/1.8/i386-cygwin/GD.so (LoadError)
from -e:1
exit 1

意味分からん。いつかはちゃんと動いていたのになぁ。拡張ライブラリが反抗期で僕は悲しい。

2005年 10月 24日

Ruby で XML をまじめに使いたい

標準添付の rexml は軽くやるぐらいなら十分だけど、名前空間関係がちょっと怪しい。今時 XML を真面目に使えないとなるとやばい。

RAA を検索してみると libxml-ruby がよさげなので試してみる。extconf.rb がなんだかしらんが全く通らないので該当部分でばっさりコメントアウト。extconf.rb の存在意義なし!!!

リファレンスの類が見当たらない。要素は ele = XML::Node.new(element_name[, content]) で作るみたい。便利だけど Node っていう名前にちょっと違和感が……属性は ele["attr_name"] = attr_valueDOM 実装を期待してたんだけど違うらしい。getElementsByTagName は Node#find みたいだし (find の引数は XPath なので全然違うが) あーやばい。コンテキストノードとカレントノードの違いを忘れそうだった。Node#find はトップレベルのコンテキストノードにレシーバを設定して云々、でいいのかな。カレントノードが XSLT のものだよなぁ。

名前空間関連はまだ調べてない。libxml だから大丈夫だと思う(てきとう。とりあえず学校へ。眠いっつうの。

2005年 10月 23日

ruby-xslt 0.8.2

新しくなっているのに気付いた。 ruby extconf.rb --enable-error-handler (off by default) とか書いてあるのでちょっと期待しつつ。

とりあえず cygwin で make できんので Makefile 修正。OBJS に /lib/libxml2.dll.a /lib/libxslt.dll.a を追加して強制リンキング。exslt ははずす。

いろいろやってみたんだけど、よくわからん。USE_ERROR_HANDLERXML::XSLT.errors が定義されるんだけどエラー起こしても特に何も入ってない。/* this is really quite inelegant */ とか書いてあって苦労してんなぁとかなんとか。

とりあえずさらに really quite inelegant なコードで解決を図る。Ruby 側で…

require '../xslt'
xslt = XML::XSLT.new
xslt.xmlfile = "fuzface.xml"
xslt.xslfile = "fuzface.xsl"
begin
err = STDERR.dup
pipe = IO.pipe
STDERR.reopen(pipe[1])
out = xslt.serve # raise RuntimeError
rescue RuntimeError => e
p XML::XSLT.errors #=> []
if e.message =~ /^(XSL|XML|Stylesheet) /
p e
p pipe[0].readpartial(4096) #=> エラーメッセージ
else
raise
end
ensure
STDERR.reopen(err)
end
__END__
起こりうるエラーたち (grep)
parser.c:53:      rb_raise( rb_eRuntimeError, "XSL parsing error" );
parser.c:59:      rb_raise( rb_eRuntimeError, "XSL Stylesheet parsing error" );
parser.c:65:      rb_raise( rb_eRuntimeError, "XSL Stylesheet parsing error" );
parser.c:84:      rb_raise( rb_eRuntimeError, "XML parsing error" );
parser.c:90:      rb_raise( rb_eRuntimeError, "XML parsing error" );
parser.c:97:      rb_raise( rb_eRuntimeError, "Stylesheet transformation error" );

tests/fuzface.rb の改造。xmlfile= は使うなという警告がでるけどとりあえず放置。$stderr じゃなくて STDERR にメッセージを吐くらしくめんどっちいことをやってる。readpartial は cygwin の ruby が 1.8.3 になったから使ってみた。便利よねコレ

ごちゃごちゃやってみたけど使わない。XREA に入れるのめんどいし……

これでドウダ

class XML::XSLT
class XSLTError < StandardError; end
class XSLParsingError < XSLTError; end
class XSLStylesheetParsingError < XSLTError; end
class XMLParsingError < XSLTError; end
class StylesheetTransformationError < XSLTError; end
alias __org__serve serve
def serve
ret = nil
err = STDERR.dup
pipe = IO.pipe
Thread.critical = true
STDERR.reopen(pipe[1])
begin
ret = __org__serve
rescue RuntimeError => e
STDERR.reopen(err)
Thread.critical = false
message = pipe[0].sysread(4096)
error_class = XSLTError
case e.message
when "XSL parsing error"
error_class = XSLParsingError
when "XSL Stylesheet parsing error"
error_class = XSLStylesheetParsingError
when "XML parsing error"
error_class = XMLParsingError
when "Stylesheet transformation error"
error_class = StylesheetTransformationError
end
raise error_class.new(message)
ensure
STDERR.reopen(err)
Thread.critical = false
end
ret
end
end
xslt = XML::XSLT.new
xslt.xmlfile = "fuzface.xml"
xslt.xslfile = "fuzface.xsl"
begin
xslt.serve
rescue XML::XSLT::XSLTError => e
p e
end

将来完璧な実装になっても消すだけ! これなら使えそう? ごめん嘘。エラークラス云々があるのでそのままじゃ無理。

ruby-xslt on XREA

make がうまくいったっぽいのでメモ。ちなみに数度要望の末 ruby-xslt を入れてもらってある (この過程で別の鯖と違う点があるかもしれない)。でもやっぱり自分でビルドできないかなぁという試行。

#!/bin/sh
PATH="/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:$PATH"
export PATH
ruby extconf.rb #1
#make #2
# test
#cd tests
#ruby fuzface.rb

みたいなのを make.sh として作って保存しとく。ちなみに AddHandler cgi-script-debug .sh してある。念のため一発でやらずに一行ずつ実行させる。

ruby extconf.rb は Permission Denied がでつつも一応通るので問題なしということにしとく。んで、make なんだけど libxml/* が見つからないとかいわれる。しかたないのでローカルの /usr/include/libxml2/libxml を同じディレクトリに転送する。エラー一切なく make が通った。テストもしてみたけど大丈夫っぽい。微妙だけど。

関係ないけど XREA に拡張ライブラリ置くとき怪しいことをすることにした。/virtual/username/lib/ruby/RUBY_PLATFORM を掘ってその中に入れる。ローカルは cygwin なので /virtual/username/lib/ruby/i386-cygwin/xml/xslt.so、XREA は /virtual/username/lib/ruby/i686-linux/xml/xslt.so。んで使う場合は $LOAD_PATH.unshift("/virtual/lowreal/lib/ruby", "/virtual/lowreal/lib/ruby/#{RUBY_PLATFORM}") しとく。もともと XREA 上の RSS パーサが古いのでアレしてコレした感じ。

s63.xrea.com 上で作った xslt.so。ちゃんと動くかは知らない。

ちなみに上のセクションのスクリプトは動かないです。1.8.2 なので。readpartial を sysread にすればとりあえず動きます。どっちでもよさげだから sysread にしとくのが吉か。

2005年 10月 03日

IRC の MODE をパースするのがめんどい

寝たり起きたりするうちになんとなく実装したのがソレっぽく動いた。睡眠回数が多いほうがアイデアが浮かぶに違いない。

positive_mode = []
negative_mode = []
mode = positive_mode
arg_pos = 0
message[1].each_byte do |c|
case c
when ?+
mode = positive_mode
when ?-
mode = negative_mode
when ?o, ?v, ?k, ?l, ?b, ?e
mode << [c.chr, message[2+arg_pos]]
arg_pos += 1
else
mode << [c.chr, nil]
end
end
mode = nil
# when message is ["#chokan", "-o+v", "chokan", "chokan"]
p negative_mode #=> [["o", "chokan"]]
p positive_mode #=> [["v", "chokan"]]

うっさい

CSS をテーマにするのはいいけれど @tDiary

構造が気持ち悪い。とりあえず tDiary の話。はてなにも言えるけどはてなはソースを変えられない時点で「諦め」があるので論外。

tDiary には CSS によるテーマ機能があって、(たぶん) それがウリなんだろうけど、そのせいで構造が変えにくい。「変えにくい」ってのはテーマを使いたいからでなく、スキンファイル (構造を決定するファイルってことにしてください。CSS は含みません。) が難読になっていたり、プラグインの吐くソースがキモかったりする。「どうせテーマを使ってもらうんだから構造は決めうち。スキンファイルは開発側が編集できればいいや」みたいな。

俺が tDiary を使っていたとき、そういう気に入らない構造の部分をざっくり修正して使っていたんだけど、バージョンアップしようと思ったときに死んだ。そしていろいろあって tDiary を使うのをやめた。使うのはやめたけど ML は読んでる。なんとなく。

少し前に「form 要素直下に input 置くと validator に怒られるので div で囲う」みたいなメールが流れてた。あはははって感じ。

誰もが納得できる構造にするのが一番いいんだけどそれは難しい。だから、スキンファイルをシンプルに。変なソースがあってもユーザが修正できるように。スキンファイルを編集しても別なところでエラーがでないように。バージョンアップのときにスキンファイルを変えなくてもいいように。

ちなみに「誰もが納得できる構造」であれば CSS によるテーマってのはすごく素敵なもんなんだよなぁ。というかおかしいんだよ。「誰もが納得できる構造」って何なんだ。

まぁでも、こんないちいちキモイ構造がどうとかいうのは strict ヲタクぐらいなもんだろう。

そもそもカテゴリが違うといえど blosxom はよろしいな。構造?なにソレ?ていうかボク HTML なんて知らないよ、みたいな。バージョンアップしねぇじゃんとかは禁句らしい。

放任したほうが楽ちん。やりたい人は tDiary 互換フレーバーとかあるしなぁ。よくわからんセクションになってるのは俺の頭が悪いうえに今眠いからです。

2005年 01月 29日

ruby 1.8.2

落ち杉。1.8.1 に戻すかとか思ったけど、既に 1.8.2 feature なの (NKF の UTF-8 変換とか) を使い始めちゃったりしてるのでめんどい。計算機がもう一台欲しい。それよりメモリ欲しい。coLinux を常に動かすのは無理です。

つーか Linux ってつかいにk(r GUI マンセーな僕には CUI のコマンドラインオプソンが覚えられません。--help するとオプション多すぎです。何の頭文字かわかんねーし。