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型に収まらない場合の処理は、精密さをあまり考慮せずに計算している。もし問題があればお知らせ願います。



maraigue at 19:37コメント(0)トラックバック(1)プログラミング 

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と言われているそう。



maraigue at 21:51コメント(0)トラックバック(0)プログラミング 

2008年04月24日

livedoorブログでははてなスターの利用が可能であるとのことで、試してみることに。

はてなスターの設定ページを辿り、はてなによるスター設置解説ページ(2007-07-07)に辿りつく。しかしそのページの方法を取ってもうまくスターが表示されない。それどころかJavaScriptにエラーが発生する。

検索してみると、このページが見つかった。
人力検索はてな / ブログにはてなスターが搭載できません。現在、LivedoorBlogを利用しているのですが…
とりあえずこのページの方法に従い、スターの取り付けは完了。

その後そのページを読み進めると、以下のページが紹介されていた。
はてなスターのサイトごとのカスタマイズ方法が変わります(2007-09-21)


ん?


はてなスターの設定ページから辿ったリンクは、古い仕様のほうだったってこと!!??

はてなさん、そりゃないですよ…

maraigue at 00:35コメント(0)トラックバック(0)Webサービス 

2008年04月23日

Maraigueです。

gooにもブログを持っているのですが、あまり使い勝手が良くないため、livedoorにもブログを立ててみました。

少し使ってみて、使いやすいようならこちらを継続して使っていきたいと思います。


maraigue at 23:43コメント(0)トラックバック(0)一般 
事の発端は、Twitterでのこの発言。



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インタプリタがエラーメッセージを出してくれる、という仕組みである。


maraigue at 18:27コメント(0)プログラミング 

2008年04月20日

以前[初音ミク]三笠市の初音町に行ってみたなんて企画を敢行しましたが、全国にはまだまだ「初音」地名がある。

ということで、ふと思い立って地図にしてみた

全国の「初音」地名


[追伸]
北九州市の初音町へ突入した方、現在も継続的に初音地名の情報を集めているようです。是非こちらもご覧下さい。(w


[4/22追記]
VOCALOIDファンの集まるSNS「にゃっぽん!」に加入しました。w


maraigue at 16:32コメント(2)ローカルネタ 

2008年04月16日

Twitter friends lister (Beta)

Twitterで、ある人とある人が共通でfollowしている人を出力するサービス「Twitter friends lister」を立ち上げました。

いくつか使い方はあると思いますが
・新たにfollowする人を探すため、自分と親しい他の人が誰をfollowしているかリストアップする
・誰が自分とfollowingの傾向が似ているか調べる
・見知らぬ人が自分をfollowしたとき、その人と自分のfollowingの共通部分を見て、「あ、この人経由で来たんだな」と推測する
なんてところでしょうか。

他に良い使い方を思いついた方がいらっしゃったら教えて下さい。また機能についての要望もありましたらお知らせ願います。

【余談】
このプログラムは、エセAjaxによって実現されています。
何がエセかというと、XMLHTTPRequestとかprototype.jsとか巷でいうAjax関連のものは一切使わず、ほとんどiframeで済ませているのです。

maraigue at 21:12コメント(0)インターネット 

2008年04月15日

6月中旬に学会発表を行うことになりました。


新たに提案する手法が具体的に決まってない中、あと1ヶ月で論文を書き、さらにその後の1ヶ月で発表の準備をしなければなりません。

大変です。

しかし、新たな体験にワクワクもしています。


あと2ヶ月、たまにインターネット上の活動ペースが落ちるかもしれません。その時は学会発表の準備の方に力を注いでいるときですので、よろしくお願いします。

maraigue at 14:16コメント(0)総合 

2008年04月11日

hakatterを登録してみた。(私のアカウント

「体重を記録し続けること自体がダイエットにつながる」というもの。さらにそれを他人にも見せることで、長続きするようにするという。周りの数人が登録していたので、私も登録することにした。

私の場合、おそらく「必要以上に食べるので体重が減らない」状況なので、hakatterを使うことで効果は出そうな気がする。ただそれがストレスになる可能性も否定できないので、とりあえず6月中旬に控えている学会発表まではまじめには使わないことにした。それまでの期間は「減ればいいかな」程度に捉えます。



ちなみに名前はTwitterから取ったのでしょうが、単にUIが似ているだけのようです。

※5/6追記:気分でアカウント名を「maraigue」から「h_hiro」に変えました。

maraigue at 12:51コメント(0)インターネット 

2008年04月06日

ワロタ。ジェイ・アール北海道バス JHB 6台目の83より

明日風のまちのロゴって、ギャルゲーのロゴみたいだなw
なんとなく「明日風のまち」ってネーミングもそれっぽいし。

http://www.sumouteine.com/images/asukaze_h2.jpg


maraigue at 14:44コメント(0)ローカルネタ 
livedoor プロフィール

H. Hiro

  • ライブドアブログ