[2000/11/07]

ruby

bug

[ruby-list:25819]ってwarningがでる方の再現でかなり悩んだのに、 あっさり「バグです。」だったとは。

excite翻訳クライアント(excite_world_text.rb)

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

[ruby-list:25836]

nkfでfoldingだけしたい場合は'-SXxsf50'だけじゃなくて'-SXxsf -m0''-m0'が必要だとわかったのでつけていなかったスクリプトを修正した。

RWiki

<URL:http://www.jin.gr.jp/~nahi/RWiki/>にいろいろ書き始めてます。

[2000/11/09]

ruby

?

?より。

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は別途変換用のソフトをとってこないといけなかったかも。

RWiki

<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

ネスケでCSS

<URL:http://kirara.prec.kyoto-u.ac.jp/~tam/diary/index.cgi?2000-11#11-8:1>

ネスケでCSSを使うと普通のHTMLの解釈にも影響がでるのでそういうもの(バグだらけ)だと思ってあきらめるしか。

1つのrpmが使用しているファイルサイズを集計するscript

<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の結果の方が大きい数字になることがあるのが謎です。

counter

いつの間にか10000越えてます。

[2000/11/11]

ruby

RWiki installer

rwiki-installer.shができました。まだβ版ですが。

日本語版もできたらRAAに入れてみようかな。

RWiki at localhost

./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)

PowerPoint

<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

linkがあるとアクセスが一時的に一気に増えますね。 ls -lの落とし穴はディレクトリの中まで計算してしまってたからでしたか。

[2000/11/13]

ruby

arr

arr = [1,2,3,4,5]; print arr[-10..-1]がnilになるのってバグっぽい気がする。

excite_world_text.rb

excite翻訳クライアントを以下のようにして使ってみた。 バッファリングの関係で入力と翻訳待ちが並列実行できるように見えて便利。 混ざると行編集はしにくいけど、短いものの連続だったら気にならない。

#!/bin/sh
while read txt && [ ! -z "$txt" ]; do
  ./excite_world_text.rb -enja "$txt" | nkf -Se
done

goo-freemail.rb

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>&nbsp;:&nbsp;([^>]+)<\/font><\/td>/ =~ data
          to = $1
          data = $'
        end
        if /<td><font size="-1"><b>From<\/b>&nbsp;:&nbsp; (.+)&nbsp;/ =~ data
          from = $1
          data = $'
        end
        if /<\/b>&nbsp;:&nbsp; <font color="\#003399"><b>([^<]+)<\/b><\/font><\/font><\/td>/ =~ data
          subject = $1
          data = $'
        end
        if /<\/b>&nbsp;:&nbsp;([^<]+)<\/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

RWiki at localhost 2

前回のエラーの原因は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)

[2000/11/14]

ruby

同じ名前だと同じnameになってませんか?

RWiki at localhost 3

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

[2000/11/15]

ruby

String#scan

Stringのscanにはめられた。配列だか文字列だかわかんないという。とりあえずString()で回避(笑)

String()よりもto_sの方がよく使うけど。後ろにつける方がオブジェクト指向っぽいし。

scanって確かに慣れないと難しそう。excite_world_text.rbを書いてるときも悩んだし。 正規表現の中に()を使ってるかどうかで配列になるか配列の配列になるかが違うのがポイントかも。 ブロック付きの時も()の有無で変わるはず。

RWiki at localhost Work

ruby -Ke -I./lib rwiki.rbとしてrwiki.rbでも新しい方のdrbを使うようにしたらやっと動きました。

このdrbの問題が解決したらRWiki installerリリースかな。

[2000/11/17]

ruby

RWiki installer 1.0

RWiki installer完成です。 RAAに入れます。 英語が変じゃないか誰かにチェックしてほしいです(^^;

[2000/11/18]

ruby

RWiki installer 1.0 ちょっと変更

SugHimsiさんがなおしてくれたREADME.enを取り込んだ。

ドキュメントの修正だけなのでバージョンはそのままにしておく。

ライセンスはアーカイブの中になくてもリンクしているところに書いてあればいいかと思っていたらRAAだけでこっちには書き忘れていたので書いておいた。 アーカイブの中にないのは参考にしたRWikiのアーカイブの中で記述を見つけられなかったからという理由もあるけど。

[2000/11/19]

ruby

ruby-diff 1.6.1から1.6.2 (2000-11-17)

1.6.1から1.6.2 (2000-11-17)への変更点をcvs diffを元に書いてみた。

書き終わってからHTMLをみて気づいた、RDの落とし穴。

#!/bin/sh

RWiki installer は何故 #!/bin/sh か?

なぜRubyスクリプトではなくシェルスクリプトにしたのかというと、最初の理由は インストール に書いてあるコマンドを並べていったのが始まりだから。

内部でもできるだけsedやawkを主に使っているのは速さのため。 以前にWindows上で短い処理をやらせたらperlやrubyが起動にかかる時間の間にawkは処理が終わっているということがあったので、短い処理――特に何度も起動するような処理の場合――は起動の速いawkやsedを使いたくなってしまうのです。 trなどのもっと細かいコマンドを覚えたら処理によってはもっと速くできるのかもしれませんが、とりあえずsedの's///'までが今使える限界のようです。

on Solaris

ICQでバックアップ用のシェルスクリプトをちょっと見てほしいと頼まれたので見てみた。 そして以下の点をアドバイスしてみた。

その後「PATH=/usr/local/bin:/bin: is not an identifier」というエラーで実行できなかったというメッセージが。 と言うわけでもう1点。

素のshというのはLinuxみたいに実はbashとかじゃないshという意味で使ってみたけど変かも。

[2000/11/24]

ruby

落とし穴

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を使えばよさそう。

[2000/11/28]

RWiki installer 1.01

RWiki installerにごとけんさんのパッチがあったので取り込んで1.01にしてみた。

Perl/Ruby Con.

行く前にバックアップとっておこうと思って、バックアップとってWindowsの再インストールしてたらバックアップで手間取って予定より時間がかかってしまった。 復旧にも手間取ってかなり大変。


上へ indexへ
copyright © 2000 ZnZ