2006年 02月 22日

Ruby.each

Ruby の each 系メソッドで一つ気に入らないというか、仕方ないんだけど面倒くさいことがある。なにかっていうと index を使いたければ自分で変数作ってインクリメントしないといけないこと。each だけに関しては each_with_index があるけど、他の Enumerable なメソッドにはない。そんなに必要なわけじゃないし、だいたいは他のもっといい書き方が存在するんだけど、prototype.jseach 系を見てから、ちょっと不便だなぁって思うようになった。

prototype.jseach 系は全て indexitem が両方渡される。でも、受け取る側の関数は仮引数を常に2個書かなくてもいい。ECMAScript は引数の数に無頓着だ。いくら渡しても怒られない。仮引数を書かなくても arguments で参照できる。

対して Ruby の yield はエラーこそ出さない (call は出す) ものの、こういうことすると警告してくれちゃう。別にそれが悪いわけじゃなくて、むしろいいんだけど、っていうか block.arity で場合わけすればいいんだけど。

なにがいいたいかわからんことに。

arity の数で場合わけしたらだめか。[[:a, :b]].each {|a, b|} みたいに使えないもんなぁ。

Ruby と雑誌と俺

そういえば、日経ソフトウェアの 2001-03 (ふるい) のスクリプト特集に Ruby が載ってるんだけど、今さっき読んだら当時さっぱり何言ってるのかわからんことも結構わかるようになったりしてて、なかなか面白い。Perl の記事はわからんけど :(。で、その記事のコラムで、Matz さんが実行速度でPerlを抜きたいって言ってるのが妙に印象に残ってた。そして今日その部分を YARV の記事を読んでて思い出したからこんなことを書いてるわけです。

日経ソフトウェアは2000-06 から 2001-06 までなんとなく買っていた雑誌で、結構お世話になった。扱いが荒いせいかボロボロだったり、コーラ溢して裏表紙が破けていたり、いやそんなのどうでもいい。XSLTDOM もよくよく考えるとこの雑誌で記事を読んだのが最初の出会いであるし、上で書いた Ruby もそうだったりする。

入門書として、いろんな言語がいっぱい載ってるこういう雑誌って結構いい感じ。なんとなくもういいかなって思ったらちょうど一年分だったりして。これ買うのやめてからは一冊もプログラミング関連の本を買ってない (大学の教科書は別として) 。なんかぐーぐる先生とこの雑誌一年分で十分な感じ。そんな感じで今さっき意外と雑誌の情報って死なないんだなぁと思った。

当たり前だけど、雑誌を読んでプログラミングをどうこうしていたのは楽しかったからに他ならず、それから VB をやったり Javascript をやったりして最近やっと形になるようなスクリプトを書けるようになった。今考えれば結構長かったけど、あんまり長いことやってる自覚はない (し、別に実際長いわけではない)。だから俺はプログラミングにおいて何か努力したとかそういうことがない。これから、そういう努力をするハメになるのか、それとも楽しいままプログラミングと付き合って行けるかがよくわからないけど、願わくば楽しいままやっていきたいと思う。言い換えれば、努力なんて一瞬たりともしたくない。

2006年 02月 20日

FCGI, Ruby, 変更なしで

エラー画面

以前CGI FastCGI, rubyとかいうセクションを書いたけど、ENV って普通に書き換えられることに気付いたのでもう一度やってみた。できたっぽい?

#!/usr/bin/ruby
require "fcgi"
FCGI.each do |fcgi|
$stdout = fcgi.out
$stdin = fcgi.in
ENV.replace(fcgi.env)
load(fcgi.env["SCRIPT_FILENAME"], true)
fcgi.finish
end
fastcgi.server             = (
".php" =>
( "localhost" =>
(
"socket" => "/tmp/fcgi-php.socket",
"bin-path" => "/usr/bin/php-cgi"
)
),
".rb" =>
( "localhost-rb" =>
(
"socket" => "/tmp/fcgi-ruby.socket",
"bin-path" => "/home/cho45/bin/ruby-fcgi.rb"
)
)
)  

ruby-fcgi.rb の位置がキモイけれど、これは共有ディレクトリを /home/cho45 以下しか設定してなくてめんどくさかったから。symlink 貼ればいいんだけど……

でもって以下のようなスクリプトでテスト

require "cgi"
puts "Content-type: text/plain\n\n"
@cgi = CGI.new
p @cgi
p @cgi.accept

全く普通の CGI と同じ形式。パッと見上手くいってる。POST のときどうなるか微妙だけどあとで追試。

ちなみに、これだとエラー出力がコンソールにでるけど、その辺は適当にログ残すようにすればいいかな。というか、load してるところの例外キャッチして美しいエラー画面を出すようにすればよろしそう。どうせログなんぞ見ない。

当たり前だけど、FastCGI 前提でプログラム書くならもっと最適化ができるので (リクエストごとに変わらない部分は共通にできる)、普通の CGI でもどっちでも使いたいという場合以外は積極的に使うようなもんじゃない。

ruby-fcgi.rb, エラーをスタックトレース付きで表示するようにした。

ENV.replace があった……

Dir.chdir するように修正。

hiki が一応動くっぽい。と、思いきや、リロードごとに 500 になったり 200 になったりする。なぞい。

$SAFE を設定されていたみたいだ。(リクエスト -> hiki でセーフレベルが設定される -> リクエスト -> セーフレベルがあがっているのでエラー終了 -> 見れない -> リクエスト -> fcgi プロセスが再起動される -> 見れるように) Thread 使って分離した。callcc 使うべきだなぁ。

2006年 01月 27日

Rails 事始め

Hello World をやって sqlite3-ruby とか入れて終わり。だめだ!

2006年 01月 26日

Ruby, Object#p method

class Object
def p
Kernel.p self
self
end
end
"aaa".p.gsub(/^a/, "b").p

みたいなのをたまに使う。self を返すので .p だけを付けたり消したりすればいい。たまに便利。殆どの場合上のコードを書くのさえ面倒くさくて結局 p obj とか一行書いてしまう。だめじゃん。

base64 の方法をよく忘れる

  • ruby -e 'puts [ARGF.read].pack"m"' filename
  • uuencode -m filename foobar
2006年 01月 17日

CGI FastCGI, ruby

既存のスクリプトを修正せず、そのまま fcgi 化したい。

Web Server 側の設定の変更だけでいきたい。

fastcgi.server             = ( ".rb" =>
( "localhost" =>
(
"socket" => "/tmp/fcgi-ruby.socket",
"bin-path" => "/usr/local/bin/ruby-fcgi.rb"
)
))

とか書くとして (仮定)、ruby-fcgi.rb を考えたい。しかしながら FastCGI の仕組みがいまいちわかってないのでとりあえず保留。

UNIX ソケットであらかじめ起動してある CGI 実行プロセスと通信する?みたいなのはわかるんだけど、実際のとこ、この bin-path に指定したプログラムと、実際にリクエストされたファイルの関係がわからない。普通の CGI は引数にリクエストされたファイルを渡すけど、FastCGI はどうなるんだろう。というところで、試そうと思うんだけど、ちょっと環境構築に手間取っている。

というか、できるなら既にそういう方法が発見できるはずなんだけど、ないってことはやっぱないんだろうか。Ruby に環境を保存しておく機能がないんだっけ。callcc ?

UNIX ソケットで、とは限らないようだ。TCP/IP でもできる (すなわち、別のサーバにもおける) みたい。

普通の CGI は引数にリクエストされたファイルを渡すけど って嘘つきすぎ(w

CGI はただたんにリクエストされたファイルを起動してるだけだ。shebang を混同してる。

うーん。よくわからん。FastCGI を使ったアプリケーションを作るたびに、HTTPD の設定ファイルも書き換えないといけないんだろうか。

ENV を書き換える方法がないから無理だなこれ。

2006年 01月 16日

Brainfuck on Ruby

Brainfuck インタプリタ。

arr = []
ptr = 0
soc = ARGF.read
pos = 0
while soc.size > pos
print soc[pos].chr if $DEBUG
p arr if $DEBUG
arr[ptr] ||= 0
case soc[pos]
when ?>
ptr += 1
when ?<
ptr -= 1
when ?+
arr[ptr] += 1
when ?-
arr[ptr] -= 1
when ?.
print arr[ptr].chr
when ?,
arr[ptr] = $stdin.getc
when ?[
if arr[ptr].zero?
n = 1
while n.nonzero?
pos += 1
case soc[pos]
when ?[
n += 1
when ?]
n -= 1
end
end
end
when ?]
n = -1
while n.nonzero?
pos -= 1
case soc[pos]
when ?[
n += 1
when ?]
n -= 1
end
end
pos -= 1
end
pos += 1
end
puts

mailto:>++++++++++[<++++++++++>-]<-. +++++. +++++++. >++++++[<---------->-]<+. +. >++[<+++++>-]<+. >++++[<++++++++++>-]<++++. +++. ++++++++. -----. -------------. ----. +++++++++++. >++++++[<---------->-]<--. >++++++[<++++++++++>-]<++++. ---------. +++++++++++++++. 途中式 もっと短くしろよとかね。知らないよ。1パターンしか使ってないしね。いやでも別にね。ね。

bfi.rb Brainfuck の Ruby 実装 ってのを見つけた。変数名以外殆ど同じ(w. 最後に puts つけてるのまで同じだ。おもろいなぁ。ちなみに最後の puts は zsh 対策です。

The Ruby BrainFuck Interpreter クラス使ってる

アルゴリズム自体は Brainf*ck で頭にいれ、テストもそのページで紹介されているプログラムを使った。

2006年 01月 09日

Ruby で先駆ってるところを知らない

Rails とかやけに話題だけど、なんか今流行ってるサービスとかで Ruby 使ってるところってあんまりないような。はてなも mixi も del.icio.us も Perl。Last.fm, gree は PHP 。Ruby 使ってるところってどこがあるんだろう。

人工無脳だとなぜか Ruby が多いんだよなぁ。謎だ。

2005年 12月 29日

素直シュールと SQLite

ちょっと似ていると思いませんか? 言葉の響きが。

SQLite + Ruby をしたいのでインスコ。on cygwin

  • SQLite Download Page から、sqlite-source-3_2_8.zip をダウンロードして展開。
  • cd sqlite-3.2.8 ; ./configure ; make でどーん。
  • sqlite3.la.lib/sqlite3.a/lib にコピー
  • RubyForge: SQLite-Ruby から sqlite-ruby-2.2.3.tar.bz2 をダウンロードして展開
  • sqlite3.h とかを sqlite3-ruby-1.1.0/ext/sqlite3_api にコピー
  • ruby setup.rb

インスコだけ。

というか XREA で SQLite 使えるだろうか。

ニャー速。:新ジャンル:素直シュール

女「クチャクチャ」
男「・・・」
女「クチャクチャ」
男「俺にもちょうだい」
女「クチャクチャ」
男「ガムちょうだい」
女「・・・」
男「・・・」
女「噛んでるふりでした」
男「・・・」
女「ガム噛んでるとおもった?」
男「・・・」

これやばいと思うんだ。久々に捉まれた気分。いや本当にやばいと思うんだよ。