[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の再インストールしてたらバックアップで手間取って予定より時間がかかってしまった。 復旧にも手間取ってかなり大変。