2008年04月
2008年04月30日
Rubyで有理数を扱うrationalというライブラリがある。この中で定義されているRationalクラスは、分子と分母の整数値をペアにして保存して分数を表している。
Rationalクラスにはインスタンスメソッドとしてto_fが定義されており、これを用いることで有理数を浮動小数点数に変換できる。しかしその方法は
# from rational.rb in Ruby 1.8.6 def to_f @numerator.to_f/@denominator.to_f end
と、単に分子・分母をそれぞれ浮動小数点数(Cのdouble型)に変換して割るだけなので、分子や分母がCのdouble型に収まらない範囲の場合、正しい計算結果が得られない(警告も出る)。
そこで、分子や分母が大きくてもto_fが計算できるよう、to_fを再定義してみた。
使いたいプログラムの先頭に以下のコードを書いておくと、分子や分母がCのdouble型に収まらない範囲にあっても、to_fの計算が可能となる。
require 'rational'
class Rational
def to_f
# 分子と分母で絶対値の大きいほうを取得
n = @numerator.abs
d = @denominator.abs
max = (n > d ? n : d)
# 分子・分母のどちらかでもCのdouble型に収まらない場合
# その範囲に収まるよう分子・分母を割る
if max >= Float::MAX.to_i
dec = max / Float::MAX.to_i
n = (@numerator / dec).to_i
d = (@denominator / dec).to_i
else
n = @numerator
d = @denominator
end
# 実際に割り算して浮動小数点数を得る
n.to_f / d.to_f
end
end
ちなみに、分子・分母のどちらかでもCのdouble型に収まらない場合の処理は、精密さをあまり考慮せずに計算している。もし問題があればお知らせ願います。
2008年04月26日
本日、Ruby勉強会@札幌-8に行ってきた。私は初めての勉強会参加だった。
本日のトピックは上記リンクを参照いただくとして、今日扱われた言語はRubyのみならずPythonやSmalltalkなどにも及び、濃密な1日になった。
特に気に入ったのは、島田さんによる、RubyでDSLを作成するというもの。DSL(Domain Specific Language:ドメイン特化言語)とは、特定の用途の文言を容易に記述するための言語であり、RubyではRSpecやRuby on Railsがこれに当てはまるようである。さてRSpecを例にとると、RSpecのスペックファイルには、実際に使われるプログラムが満たすべき条件が記述される。その際にスペックファイルには例えば
# multiset.rbに対するスペックファイルより lambda{ Multiset.parse("hoge\npiyo\n") }.should raise_error(ArgumentError)
のような書き方をする。これは見ての通りなのだが、「lambda{ ... }の内容がエラーを起こすべき(should raise_error)」という内容を示している。Rubyはこのような「見ての通り」の書き方が出来るようにクラスやメソッドを定義するのが得意なので、それを利用してDSLを作るというものであった。
さて、そのようなRubyの性質が面白いと思い、試しに世界のナベアツプログラムをDSL的に書いてみた。
require "nabeatsu" # 後述
nabeatsu = Nabeatsu.new
nabeatsu.status "アホ", :rule => [3.no_baisu_no_toki, 3.no_tsuku_toki]
nabeatsu.status "犬", :rule => 5.no_baisu_no_toki
nabeatsu.say 1..40 do |number, status|
if status
print "#{number}(#{status.join(' ')})"
else
print number
end
print " "
end
puts
これを実行すると
1 2 3(アホ) 4 5(犬) 6(アホ) 7 8 9(アホ) 10(犬) 11 12(アホ) 13(アホ) 14 15(アホ 犬) 16 17 18(アホ) 19 20(犬) 21(アホ) 22 23(アホ) 24(アホ) 25(犬) 26 27(アホ) 28 29 30(アホ 犬) 31(アホ) 32(アホ) 33(アホ) 34(アホ) 35(アホ 犬) 36(アホ) 37(アホ) 38(アホ) 39(アホ) 40(犬)
のように、上記のプログラムで指定した通り「3の倍数と3のつくときは"アホ"」「5の倍数のときは"犬"」が表示される。
このnabeatsu.rbの内容はここで公開しています。 世界のナベアツプログラム on Ruby
※この手の問題、一般にはFizzBuzzと言われているそう。
2008年04月24日
はてなスターの設定ページを辿り、はてなによるスター設置解説ページ(2007-07-07)に辿りつく。しかしそのページの方法を取ってもうまくスターが表示されない。それどころかJavaScriptにエラーが発生する。
検索してみると、このページが見つかった。
人力検索はてな / ブログにはてなスターが搭載できません。現在、LivedoorBlogを利用しているのですが…
とりあえずこのページの方法に従い、スターの取り付けは完了。
その後そのページを読み進めると、以下のページが紹介されていた。
はてなスターのサイトごとのカスタマイズ方法が変わります(2007-09-21)
ん?
はてなスターの設定ページから辿ったリンクは、古い仕様のほうだったってこと!!??
はてなさん、そりゃないですよ…
2008年04月23日
gooにもブログを持っているのですが、あまり使い勝手が良くないため、livedoorにもブログを立ててみました。
少し使ってみて、使いやすいようならこちらを継続して使っていきたいと思います。
maraigue: PerlやRubyはruby -e "script"でスクリプト実行できるけど、Pythonはshとかと同じでpython -c "script"なのね。
http://twitter.com/maraigue/statuses/794964644
gan2: @maraigue Perl や Ruby の -c は Python では何になってるのか気になる
http://twitter.com/gan2/statuses/794965707
PerlやRubyでは、コマンドラインで「ruby -c myscript.rb」のように入力することで、スクリプトの文法のチェックのみを行うことができる。
ところがPythonでは、そのような機能はpythonインタプリタには無いようなのである(文法チェック用の外部ツールは存在する)。
そこで簡易的な文法チェックスクリプトを作ってみた。
以下のシェルスクリプトを適当な名前のファイル(例えば pysyntax)に保存し、実行権限を与える。(※全角の円記号は半角に直して下さい)
#!/bin/sh
( echo "import sys¥nsys.exit()"; cat $1 ) | python -
その上で、シェル上で
$ ./pysyntax myscript.py
のように入力すると、文法に問題がなければ何も表示されず、文法に問題があればそのエラーが表示される。
なお、引数に与えるスクリプトがカレントディレクトリにない場合、ひょっとしたら上手くいかないかもしれません。
仕組みはいたって簡単で、引数に与えたファイルの先頭に
import sys
sys.exit()
の2行を付け加えたうえで、pythonインタプリタに実行させているのである。sys.exit()以下は実行はされないが、スクリプトの解析の対象にはなるため、そこで文法エラーがあればpythonインタプリタがエラーメッセージを出してくれる、という仕組みである。
2008年04月20日
ということで、ふと思い立って地図にしてみた。

[追伸]
北九州市の初音町へ突入した方、現在も継続的に初音地名の情報を集めているようです。是非こちらもご覧下さい。(w
[4/22追記]
VOCALOIDファンの集まるSNS「にゃっぽん!」に加入しました。w
2008年04月16日
Twitterで、ある人とある人が共通でfollowしている人を出力するサービス「Twitter friends lister」を立ち上げました。
いくつか使い方はあると思いますが
・新たにfollowする人を探すため、自分と親しい他の人が誰をfollowしているかリストアップする
・誰が自分とfollowingの傾向が似ているか調べる
・見知らぬ人が自分をfollowしたとき、その人と自分のfollowingの共通部分を見て、「あ、この人経由で来たんだな」と推測する
なんてところでしょうか。
他に良い使い方を思いついた方がいらっしゃったら教えて下さい。また機能についての要望もありましたらお知らせ願います。
【余談】
このプログラムは、エセAjaxによって実現されています。
何がエセかというと、XMLHTTPRequestとかprototype.jsとか巷でいうAjax関連のものは一切使わず、ほとんどiframeで済ませているのです。
2008年04月11日
「体重を記録し続けること自体がダイエットにつながる」というもの。さらにそれを他人にも見せることで、長続きするようにするという。周りの数人が登録していたので、私も登録することにした。
私の場合、おそらく「必要以上に食べるので体重が減らない」状況なので、hakatterを使うことで効果は出そうな気がする。ただそれがストレスになる可能性も否定できないので、とりあえず6月中旬に控えている学会発表まではまじめには使わないことにした。それまでの期間は「減ればいいかな」程度に捉えます。
ちなみに名前はTwitterから取ったのでしょうが、単にUIが似ているだけのようです。
※5/6追記:気分でアカウント名を「maraigue」から「h_hiro」に変えました。
2008年04月06日
なんとなく「明日風のまち」ってネーミングもそれっぽいし。
http://www.sumouteine.com/images/asukaze_h2.jpg