2011-03-09
■ [ruby] rak 1.0を1.9に対応させる方法
gems/rak-1.0/bin/rakを直接編集して以下のパッチを当てるととりあえずエラーは出なくなる。
「これが最善かどうか分からないから」という理由でマージされてないけど。 まあ、オプションでエンコーディングを指定できるようにするのが良いんでしょうね。 デフォルトはEncoding.default_externalで。
■ [ruby] Rails2と3の起動コマンドを使い分ける方法
$ gem install rails $ gem install rails -v 2.3.11
とやるとRails 3.0.4と2.3.11が両方インストールされた状態になるんだけど、単にrailsコマンドを実行すると新しい方が優先されるので
$ rails -v Rails 3.0.4
となって、rails2のコマンドが使えなくなるように見える。
が、実はRubyGemsが自動生成する実行スクリプトは第一引数が「_(.*)_」という形式だったらバージョン指定とみなすという機能がある。
ので、上の例だと _2.3.11_ を頭につけることで、
$ rails _2.3.11_ -v Rails 2.3.11
のように古い方のrailsコマンドを実行することができる。
以下 cat `which rails` の出力。
#!/home/yhara/.rvm/rubies/ruby-1.9.2-p136/bin/ruby
#
# This file was generated by RubyGems.
#
# The application 'rails' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0"
if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
version = $1
ARGV.shift
end
gem 'rails', version
load Gem.bin_path('rails', 'rails', version)
2011-03-17
■ [prog] プログラミング言語J
APLの後継であるJ言語がオープンソースになったらしい。
とりあえずインストールしてみよう。
まずソースをダウンロードして展開。
$ cd jgplsrc $ less docs/readme.txt $ ./bin/jconfig $ ./bin/build_jconsole $ ./bin/build_libj
これでjconsoleができる。
$ ./j/bin/jconsole 1+1 2
プロンプトがない(というか空白)なのでびっくりするが、ちゃんと動いているようだ。
しかし下手なesolangよりesotericではないか…?
■ [ruby] 素数を数えるワンライナまとめ
見落としてるのがあれば教えてください。
素数を数えて落ち着きたいプログラマのためのワンライナ(Ruby 1.8/1.9)
$ ruby -e 'require "mathn"; Prime.new.each{|x| p x; sleep 1.5}'
[Twitter / @yhara (Yutaka HARA)より引用]
自分の。主にRuby1.8用 (1.9でも動く)@yhara さんは分かってると思うけど、1.9ではPrime.newはobsoleteなので
ruby -rprime -e 'Prime.each{|x| p x; sleep 1.5}'
を使ってくださいね。
[Twitter / @Yugui (Yuki Sonoda)より引用]
Ruby 1.9からは「require 'prime'」が推奨。@yhara 好きなイディオムを使ってあまり素数数えてなさそうな見た目のを…
ruby -e '("p"*999).scan(/p/){(p$&.size;sleep 1.5)if/^(?!(pp+)+$)pp+/=~$`}'
[Twitter / @shinichiro hamajiより引用]
正規表現を使ったパターン。
素数を数えるプログラム、面白いのが全然思いつかない。うーん
(1..23**45).inject{|*x|x[1,x.inject(&:%)].inject(method(:p),&:[]);x.inject(2,&:*)}
[Twitter / @Kazuhiro Inabaより引用]
method(:p)がすごい。
■ 素数を数えて寝る
s=q=1;loop{q+=1while 1>s%q*s*=q;p q;sleep 1.5}
[Just another Ruby porter, 2011-3-bより引用]
短い。
2011-03-29
■ [ruby] Ruby用のPEGパーサParslet
via @frsyuki
Ruby用のPEGパーサには既にTreetopがあるけど、エラー表示が改善されてたりするようだ。
Treetopは独自の文法だったけど、ParsletはRubyの内部DSLになっている。 また、Treetopは文法と同じところにアクションも書くけれど、Parsletは「Parser」と「Transformer」を別々に定義して組み合わせるというAPIになっている。
チュートリアルを見れば雰囲気はだいたい分かると思う。
とりあえず電卓(足し算だけだけど)。
Parserは構文木をHashとして返す。"1"@0みたいなのはParslet::Sliceのインスタンスで、0行目にある"1"という文字列を表している。.as(:foo)みたいに名前を付けたノードだけが構文木に含まれるようだ。
TransformerはHashに対しパターンマッチを行う。「simple」というのはHashでもArrayでもないもののことらしい。公式のチュートリアルでは各ノードごとにStructを定義していたけど、 簡単なものならTransformerに直接アクションを書けばいいと思う。
ところで、Struct.newの返り値を親クラスにするという発想はなかった。
class IntLit < Struct.new(:int)
def eval; int.to_i; end
end
これよりはまだ気持ち悪くないと思う。
IntLit = Struct.new(:int) do def eval; int.to_i; end end
2011-03-30
■ [ruby][sinatra] オープンソースの分散型Twitter「rstat.us」はSinatraで書かれている
rstat.usはTwitterのコア機能を再現したSiatraアプリケーションだが、Ostatusプロトコルを用いたマイクロブログと互換性がある。
[【コラム】シリコンバレー101 (408) 非公式クライアントの排除に乗り出したTwitter、その理由は? | ネット | マイコミジャーナルより引用]
rstat.usはオープンソースのTwitterクローンだ。分散型というのがどういう意味か分からないが、1ノードが故障しても動き続けるという意味なら頼もしい*1。
ソースはgithubで公開されている。
データベースはMongodb、テンプレートエンジンはhaml。テストはMiniTest。ソースコードは綺麗にディレクトリ分けされており、Sinatraで中規模のWebサービスを作る場合に参考になるだろう。
Gemfileを見ると知らないgemがけっこうあって面白そうだ。
*1 「Twitterが災害時に役に立った」と聞くと、クジラ状態でなかったのは幸いだったなと思う
□ ujihisa [s/sinatra/siatra/ gem install siatraするとちゃんとsiatraがインストールで..]
□ yhara [あれ俺typoしたっけ?と思ったら引用元ですねw]