[ruby-list:25819]ってwarningがでる方の再現でかなり悩んだのに、 あっさり「バグです。」だったとは。
exciteのテキスト翻訳のクライアントを作ってみた。 間違えてPOSTのところをGETにしていたのに直接だと問題なく結果が得られていて、 proxy経由だと302になっていたのでかなり悩んだ。
#!/usr/bin/ruby -Ks -- =begin = Excite エキサイト : 翻訳>テキスト翻訳 クライアント copyright (c) 2000 ZnZ <VFC04155@nifty.ne.jp> == 使い方 * proxyを引数にしてnewする。 * enjaまたはjaenを翻訳したい文を引数にして呼び出すと翻訳結果の文字列を返す。 * 利用前に((<翻訳利用規約|URL:http://www.excite.co.jp/world/agreement/>))を ご覧ください。 =end require 'cgi' require 'socket' class ExciteWorldText def initialize(http_proxy=nil) @url = 'http://www.excite.co.jp/world/text/' if http_proxy if /^([^:]+):(\d+)$/ =~ http_proxy @host = $1 @port = $2 @path = @url else raise ArgumentError, 'http_proxy must be "host:port"' end else @port = 80 raise 'url error' unless /^http:\/\/([^\/]+)(\/.*)?$/ =~ @url @host = $1 @path = $2 || '/' if /^([^:]+):(\d+)$/ =~ @host @host = $1 @port = $2.to_i end end end def enja(before) post_text = encode(before, true) post(post_text) end def jaen(before) post_text = encode(before, false) post(post_text) end private def post(post_text) sock = TCPSocket.open(@host, @port) begin request = "POST #{@path} HTTP/1.0\r\n"+[ "Host: #{@host}", "Connection: close", "Referer: #{@url}", "Content-Type: application/x-www-form-urlencoded", "Content-Length: #{post_text.size}", ].sort.join("\r\n")+"\r\n\r\n"+post_text+"\r\n" sock.print request result = sock.read ensure sock.close end if /^HTTP\/1\.\d+\s+2/ =~ result result.scan(/<textarea\s[^>]+name="after"[^>]*>(.*)<\/textarea>/)[0] else result.split(/\r?\n/) end end def encode(before, enja=true) post_data = [] post_data << 'before='+CGI.escape(before) if enja post_data << 'trans_type=enja-ATL' else post_data << 'trans_type=jaen-ATL' end post_data.join('&') end end if $0 == __FILE__ if 1 < ARGV.size and ARGV[0] =~ /-(enja|jaen)/ ARGV.shift excite = ExciteWorldText.new(ENV['http_proxy']) case $1 when 'enja' puts excite.enja(ARGV.join(' '))[0] when 'jaen' puts excite.jaen(ARGV.join(' '))[0] end else puts "usage: #$0 -enja Text for translation." puts "usage: #$0 -jaen 翻訳用テキスト。" end end
nkfでfoldingだけしたい場合は'-SXxsf50'
だけじゃなくて'-SXxsf -m0'
と'-m0'
が必要だとわかったのでつけていなかったスクリプトを修正した。
<URL:http://www.jin.gr.jp/~nahi/RWiki/>にいろいろ書き始めてます。
?より。
ruby -e 'p false.nil? ? nil : false '
なるほど。
==
で比較するだけでもいいかもしれないけどnil?の方が速いのかな?
<URL:http://www.oishi.info.waseda.ac.jp/~takashi/rubikitch/diary/001108.html#1.1>
新しいの(95以降?)だとパワーポイント自体でHTMLに変換できるはず。 95は別途変換用のソフトをとってこないといけなかったかも。
<URL:http://www2.pos.to/~tosh/ruby/diary/2000/11/a.html#sec07_1>
多数の目があるということで誰かがチェックし忘れても他の誰かがチェックしてくれることがあるというオープンソースと同じメリットがあるような気がします。
オープンソースだとその言語やソースの内容がわからないとバグを見つけても直せないので、読めれば直せる(参加できる)という点でオープンソース以上のメリットがあるかもしれません。
ちょっとした明らかなtypoを見つけた程度なら匿名で黙ってなおしてしまえるようなこともメーリングリストには参加しづらい人でも参加しやすくて良さそうです。
逆に黙って改竄や削除ができてしまうと言うのがデメリットでもあるわけですが、不思議とうまくいっています。もしかしたら初めての時に書き込みにくいのと同じように荒らしにくいというのが一番の理由なのかも。
<URL:http://www2.pos.to/~tosh/ruby/diary/2000/11/a.html#sec08_1>
動的といえばevalですが以下のような感じでbindingを作るよりも@sandbox = Module.new
でモジュールを作って@sandbox.module_eval(s)
の方が安全なのでしょうか?
class Eval def initialize sandbox end =begin --- Eval#sandbox eval用のbindingを作るためのプライベートメソッド。 =end def sandbox @binding = binding end private :sandbox =begin --- Eval#evaluate(s) sをevalした結果、もしくは例外の内容をputsする。 =end def evaluate(s, fromHandle) binding = @binding result = '' th_aoe = Thread.abort_on_exception Thread::abort_on_exception = false th = Thread.start do $SAFE = 4 begin result = eval(s, binding).to_s rescue Exception result = $!.to_s end end th.join Thread.abort_on_exception = th_aoe end puts result end private :evaluate end
<URL:http://kirara.prec.kyoto-u.ac.jp/~tam/diary/index.cgi?2000-11#11-8:1>
ネスケでCSSを使うと普通のHTMLの解釈にも影響がでるのでそういうもの(バグだらけ)だと思ってあきらめるしか。
<URL:http://members.linuxstart.com/~sunnyone/cgi-bin/diary/?200011a&to=200011051#200011051>
ls -lが余分なstatとかしてて遅そうだったのでrubyとperlでsizeのみを取得するようなスクリプトを書いてみた。
#!/usr/bin/ruby size = 0 `rpm -ql #{ARGV.join}`.each_line do |fpath| size += File.size(fpath.chomp) || 0 end puts size #!/usr/bin/perl for (split /\n/, `rpm -ql @ARGV`) { $size += -s $_; } print "$size\n";
timeで実行時間を調べたらperl < ruby << bash+ls -l+awkという順番だった。 しかしperlとrubyは同じサイズがでてきたのにbashの結果の方が大きい数字になることがあるのが謎です。
いつの間にか10000越えてます。
rwiki-installer.shができました。まだβ版ですが。
日本語版もできたらRAAに入れてみようかな。
./rw.cgiだとエラーになるので色々環境変数を追加していって、「REQUEST_METHOD=GET SERVER_PORT=80 SERIPT_NAME=/rw.cgi QUERY_STRING='cmd=view&name=top' ./rw.cgi」で実行してみると「CGI exec failed.」となって、まだ動かない。 CGIとしてapache経由でアクセスしても「CGI exec failed.」とでる。 apacheのログには「Premature end of script headers」としか残ってないので情報無し。 ~/rwiki-1.1/log/RWikiCGIApp.logに残ったログは以下の通り。
# Logfile created on Sat Nov 11 05:31:03 JST 2000 by application.rb/1.11 I, [Sat Nov 11 05:31:03 JST 2000 557873 #4791] INFO -- RWikiCGIApp: Start of RWikiCGIApp. I, [Sat Nov 11 05:31:03 JST 2000 560847 #4791] INFO -- RWikiCGIApp: CGIApp#run: Accessed user 'anonymous@www'. I, [Sat Nov 11 05:31:03 JST 2000 567087 #4791] INFO -- RWikiCGIApp: Request: cmd: view, name: top, keys: [], rev: , src: F, [Sat Nov 11 05:31:03 JST 2000 771394 #4791] FATAL -- RWikiCGIApp: Detected an exception. Stopping ... getaddrinfo: No address associated with hostname (SocketError) /home/rwiki/rwiki-1.1/lib/drb/drb.rb:179:in `open' /home/rwiki/rwiki-1.1/lib/drb/drb.rb:179:in `send_message' /home/rwiki/rwiki-1.1/lib/drb/drb.rb:163:in `method_missing' rw.cgi:365:in `unknownError' rw.cgi:295:in `exec_proc_get_view' rw.cgi:65:in `send' rw.cgi:65:in `run' /home/rwiki/rwiki-1.1/lib/application.rb:336:in `start' rw.cgi:381 I, [Sat Nov 11 05:31:03 JST 2000 774859 #4791] INFO -- RWikiCGIApp: End of RWikiCGIApp. (status: false)
<URL:http://www.oishi.info.waseda.ac.jp/~takashi/rubikitch/diary/001110.html#2.2>
StarOfficeで読めるらしいですが。( http://www.linux24.com/linux/news/today/article/article266912-004.html )
wvWare(旧MSWordView)にPowerPointからの変換もあるかも、と思ったけどなさそう。
linkがあるとアクセスが一時的に一気に増えますね。 ls -lの落とし穴はディレクトリの中まで計算してしまってたからでしたか。
arr = [1,2,3,4,5]; print arr[-10..-1]
がnilになるのってバグっぽい気がする。
excite翻訳クライアントを以下のようにして使ってみた。 バッファリングの関係で入力と翻訳待ちが並列実行できるように見えて便利。 混ざると行編集はしにくいけど、短いものの連続だったら気にならない。
#!/bin/sh while read txt && [ ! -z "$txt" ]; do ./excite_world_text.rb -enja "$txt" | nkf -Se done
gooのfreemailからとってくるスクリプト。とってくるだけ。 削除はしないので別途ブラウザで削除する必要あり。 つまり連続で実行すれば同じものを重複してとってきます。
可逆になるように"\n.\n"区切り( /^\./
は'..'
に変換)にしている以外はとってきたまま。
Dateを加工してmamimiとかで見るといいかも。
#!/usr/bin/ruby require 'cgi-lib' require 'socket' require 'timeout' module Goo class FreeMail TIMEOUT = 60 def initialize(username, password) @username = username @password = password end def get(path='/') goo = TCPSocket.new('community.goo.ne.jp', 80) goo.print "GET #{path} HTTP/1.0\r\n" goo.print "\r\n\r\n" timeout(TIMEOUT) do return goo.read end end def post(path, data) if data.is_a? Hash data = data.collect do |k,v| CGI.escape(k)+'='+CGI.escape(v) end.join('&') end goo = TCPSocket.new('community.goo.ne.jp', 80) goo.print [ "POST #{path} HTTP/1.0", "Content-length: #{data.size}", "Content-Type: application/x-www-form-urlencoded", ].join("\r\n") goo.print "\r\n\r\n" goo.print data timeout(TIMEOUT) do return goo.read end end def recvbox data = post('/freemail/login.ghtml', { 'uname' => @username, 'pass' => @password, 'submit' => 'ログイン', }) unless /^Location:.*sess_id=(\w+)/ =~ data raise 'username or password error' end sess_id = $1 data=get("/freemail/index.ghtml?sess_id=#{sess_id}&mode=main&view=mail&mbox=1") msgs = data.scan(/<a href="\.\/index.ghtml\?sess_id=#{sess_id}&mode=main&view=mail_read&mbox=1&msg=(\d+)&sort=date">/) msgs.collect do |msg,| data = get("/freemail/index.ghtml?sess_id=#{sess_id}&mode=main&view=mail_read&mbox=1&msg=#{msg}&sort=date") to=from=subject=date=body=nil if /To<\/b> : ([^>]+)<\/font><\/td>/ =~ data to = $1 data = $' end if /<td><font size="-1"><b>From<\/b> : (.+) / =~ data from = $1 data = $' end if /<\/b> : <font color="\#003399"><b>([^<]+)<\/b><\/font><\/font><\/td>/ =~ data subject = $1 data = $' end if /<\/b> : ([^<]+)<\/font><\/td>/ =~ data date = $1 data = $' end if /<td bgcolor="\#ffffff">([\s\S]+?)<\/td>/ =~ data body = $1.gsub(/<br>/,'').gsub(/^\./,'..') end [ "To:#{to}", "From:#{from}", "Subject:#{subject}", "Date:#{date}", ].join("\n")+"#{body}\n.\n" end end end end # puts Goo::FreeMail.new(USERNAME,PASSWORD).recvbox
前回のエラーの原因はrw-config.rbのDRB_URIをそのままrw-cgi.rbの$RWIKI_URIに使っていたのがだめだったらしい。
というわけでdruby://:
だったらlocalhostを補うようにしてみた。
~/rwiki-1.1/log/RWikiCGIApp.logに残ったログは以下の通り。
# Logfile created on Mon Nov 13 23:46:20 JST 2000 by application.rb/1.11 I, [Mon Nov 13 23:46:20 JST 2000 919565 #19008] INFO -- RWikiCGIApp: Start of RWikiCGIApp. I, [Mon Nov 13 23:46:20 JST 2000 922854 #19008] INFO -- RWikiCGIApp: CGIApp#run: Accessed user 'anonymous@www'. I, [Mon Nov 13 23:46:20 JST 2000 929098 #19008] INFO -- RWikiCGIApp: Redirect to 'http://www.local/~rwiki/rw.cgi?cmd=view&name=top'. I, [Mon Nov 13 23:46:20 JST 2000 934146 #19008] INFO -- RWikiCGIApp: End of RWikiCGIApp. (status: 0) I, [Mon Nov 13 23:46:21 JST 2000 735118 #19009] INFO -- RWikiCGIApp: Start of RWikiCGIApp. I, [Mon Nov 13 23:46:21 JST 2000 738360 #19009] INFO -- RWikiCGIApp: CGIApp#run: Accessed user 'anonymous@www'. I, [Mon Nov 13 23:46:21 JST 2000 744604 #19009] INFO -- RWikiCGIApp: Request: cmd: view, name: top, keys: [], rev: , src: F, [Mon Nov 13 23:46:21 JST 2000 780416 #19009] FATAL -- RWikiCGIApp: Detected an exception. Stopping ... Broken pipe (Errno::EPIPE) /home/rwiki/rwiki-1.1/lib/drb/drb.rb:87:in `write' /home/rwiki/rwiki-1.1/lib/drb/drb.rb:87:in `dump' /home/rwiki/rwiki-1.1/lib/drb/drb.rb:107:in `send_request' /home/rwiki/rwiki-1.1/lib/drb/drb.rb:180:in `send_message' /home/rwiki/rwiki-1.1/lib/drb/drb.rb:163:in `method_missing' rw.cgi:365:in `unknownError' rw.cgi:295:in `exec_proc_get_view' rw.cgi:65:in `send' rw.cgi:65:in `run' /home/rwiki/rwiki-1.1/lib/application.rb:336:in `start' rw.cgi:381 I, [Mon Nov 13 23:46:21 JST 2000 784068 #19009] INFO -- RWikiCGIApp: End of RWikiCGIApp. (status: false)
同じ名前だと同じnameになってませんか?
ruby -d rwiki.rbで起動して調べるといいと教えてもらったので、調べてみると以下のようになっていることがわかった。
色々調べた結果、RAAからとってきたdRubyが古くてrwikiに一緒に入っているdRubyが新しいのが原因のような感じ。
Exception `TypeError' at /home/rwiki/lib/ruby/drb/drb.rb:119 - old marshal file format (can't read) #<TypeError: old marshal file format (can't read)> /home/rwiki/lib/ruby/drb/drb.rb:119:in `load' /home/rwiki/lib/ruby/drb/drb.rb:119:in `recv_request' /home/rwiki/lib/ruby/drb/drb.rb:237:in `proc' /home/rwiki/lib/ruby/drb/drb.rb:231:in `start' /home/rwiki/lib/ruby/drb/drb.rb:231:in `proc' /home/rwiki/lib/ruby/drb/drb.rb:216:in `run' /home/rwiki/lib/ruby/drb/drb.rb:213:in `start' /home/rwiki/lib/ruby/drb/drb.rb:213:in `run' /home/rwiki/lib/ruby/drb/drb.rb:55:in `start_service' rwiki.rb:425 Exception `TypeError' at /home/rwiki/lib/ruby/drb/drb.rb:119 - old marshal file format (can't read) #<TypeError: old marshal file format (can't read)> /home/rwiki/lib/ruby/drb/drb.rb:119:in `load' /home/rwiki/lib/ruby/drb/drb.rb:119:in `recv_request' /home/rwiki/lib/ruby/drb/drb.rb:237:in `proc' /home/rwiki/lib/ruby/drb/drb.rb:231:in `start' /home/rwiki/lib/ruby/drb/drb.rb:231:in `proc' /home/rwiki/lib/ruby/drb/drb.rb:216:in `run' /home/rwiki/lib/ruby/drb/drb.rb:213:in `start' /home/rwiki/lib/ruby/drb/drb.rb:213:in `run' /home/rwiki/lib/ruby/drb/drb.rb:55:in `start_service' rwiki.rb:425
Stringのscanにはめられた。配列だか文字列だかわかんないという。とりあえずString()で回避(笑)
String()よりもto_sの方がよく使うけど。後ろにつける方がオブジェクト指向っぽいし。
scanって確かに慣れないと難しそう。excite_world_text.rbを書いてるときも悩んだし。 正規表現の中に()を使ってるかどうかで配列になるか配列の配列になるかが違うのがポイントかも。 ブロック付きの時も()の有無で変わるはず。
ruby -Ke -I./lib rwiki.rbとしてrwiki.rbでも新しい方のdrbを使うようにしたらやっと動きました。
このdrbの問題が解決したらRWiki installerリリースかな。
RWiki installer完成です。 RAAに入れます。 英語が変じゃないか誰かにチェックしてほしいです(^^;
SugHimsiさんがなおしてくれたREADME.enを取り込んだ。
ドキュメントの修正だけなのでバージョンはそのままにしておく。
ライセンスはアーカイブの中になくてもリンクしているところに書いてあればいいかと思っていたらRAAだけでこっちには書き忘れていたので書いておいた。 アーカイブの中にないのは参考にしたRWikiのアーカイブの中で記述を見つけられなかったからという理由もあるけど。
1.6.1から1.6.2 (2000-11-17)への変更点をcvs diffを元に書いてみた。
書き終わってからHTMLをみて気づいた、RDの落とし穴。
箇条書きの入れ子がtabだとうまくいかなくてはまった。
例: * 外 * 中
が
となった。
なぜRubyスクリプトではなくシェルスクリプトにしたのかというと、最初の理由は インストール に書いてあるコマンドを並べていったのが始まりだから。
内部でもできるだけsedやawkを主に使っているのは速さのため。 以前にWindows上で短い処理をやらせたらperlやrubyが起動にかかる時間の間にawkは処理が終わっているということがあったので、短い処理――特に何度も起動するような処理の場合――は起動の速いawkやsedを使いたくなってしまうのです。 trなどのもっと細かいコマンドを覚えたら処理によってはもっと速くできるのかもしれませんが、とりあえずsedの's///'までが今使える限界のようです。
ICQでバックアップ用のシェルスクリプトをちょっと見てほしいと頼まれたので見てみた。 そして以下の点をアドバイスしてみた。
その後「PATH=/usr/local/bin:/bin: is not an identifier」というエラーで実行できなかったというメッセージが。 と言うわけでもう1点。
素のshというのはLinuxみたいに実はbashとかじゃないshという意味で使ってみたけど変かも。
require 'mathn'
をつけたら別のところの2で割っているところにRational
の影響がでました。
jcodeなどの組み込みのクラスを変更するライブラリは他への影響をよく調べないと危険のようです。
標準添付にするような汎用的なライブラリはこういうのがrequireされていても誤動作しないように確認する必要がありそう。
<URL:http://members.linuxstart.com/~sunnyone/cgi-bin/diary/?200011c&to=200011241#200011241>
Perl[45]とRuby共通なら/<body>([\s\S]*)<\/body>/
でいけるはず。
Perl5だけならmとsにあるようにsを使えばよさそう。
RWiki installerにごとけんさんのパッチがあったので取り込んで1.01にしてみた。
行く前にバックアップとっておこうと思って、バックアップとってWindowsの再インストールしてたらバックアップで手間取って予定より時間がかかってしまった。 復旧にも手間取ってかなり大変。