2010-07-02
■ [ruby] myrurema 0.0.2をリリースしました
「find」とかで検索したときに、候補がたくさん出てきて打ち直すのがめんどいので、
% rurema find Enumerable#find Find.#find Pathname#find TkCanvas#find TkcTagAccess#find
「1」とかで1番目にヒットしたものを表示するようにしました。
/Users/yhara/webdb/2 % rurema find 1 searching Enumerable#find Enumerable#find --- find(ifnone = nil) -> Enumerable::Enumerator --- detect(ifnone = nil) -> Enumerable::Enumerator (略)
■ [ruby] Ruby 1.9.2 rc1インストール中にtkがコンパイルできない
rc1が出たようなので
$ rvm install ruby-1.9.2-rc1
としてみたら、
Error running 'make ', please check /Users/yhara/.rvm/log/ruby-1.9.2-rc1/make*.log There has been an error while running make. Aborting the installation.
と表示されて止まってしまった。
$ tail /Users/yhara/.rvm/log/ruby-1.9.2-rc1/make.error.log
でエラーログを見ると
/usr/local/include/tk.h:23:3: error: #error Tk 8.5 must be compiled with tcl.h from Tcl 8.5
と出ている。
IRCの%rubyで聞いてみたら、「MacPortsなら/opt/localじゃないと」というヒントをもらった。
ということは、こうですか?
$ rvm install ruby-1.9.2-rc1 -C "--oldincludedir=/opt/local --with-opt-dir=/opt/local"
駄目でした。
/opt/local/include/tk.h:23:3: error: #error Tk 8.5 must be compiled with tcl.h from Tcl 8.5
(続く?)
2010-07-10
■ [ruby] Ruby 1.9と波ダッシュ問題に関するメモ
ややこしすぎるのでメモ
参考資料:
超参考書: 477414164X
- UnicodeにはWAVE DASH(U+301C)という文字がある(波ダッシュ)
- 波ダッシュは、「0時から6時」みたいなときに使われるアレ
- UnicodeにはFULLWIDTH TILDE(U+FF5E)という文字もある(全角チルダ)
- チルダは、ダイアクリティカルマーク*1の一種。スペイン語でnの上に付いたりするやつ
- 見た目はだいたい同じ
- フォントによっては、波打ち方が逆になってることもある
- Shift_JISで使われる符号化文字集合は、JIS X 0201*2とJIS X 0208(第一第二水準漢字)
- JIS X 0208の1区33点に、波ダッシュという文字がある
- JIS X 0208に全角チルダはない
- EUC-JPは、JIS X 0102・0208・0212(補助漢字)の文字を扱える
- …のだけど、0212(補助漢字)はソフトウェアによっては実装されてなかったりするらしい*3。
- JIS X 0212には「ダイアクリティカルマークとしてのチルダ」がある。おいおい、JIS X 0102に半角チルダと被ってんじゃねーか
おわかりいただけただろうか?(筆者はいただけてない)
図
irb-1.9で試行錯誤した結果を図にしてみる。

これを見ると、Ruby 1.9は基本的に波ダッシュ間で変換するが、Windows専用エンコーディングに関してはWindowsの流儀にならって全角チルダと変換するらしい。
(流儀っていうか歴史的経緯っぽいな。明確に間違いだとする説も)
矢印のない部分はUndefinedConversionError(例えば全角チルダをShift_JISに変換しようとするとか)。
ちなみにJIS X 0212のチルダがどうなるかというと、EUC-JPの"\x8f\xa2\xb7"は半角チルダ(ASCIIの)になる。ふーん。eucJP-msの場合は、波ダッシュと同様全角チルダになる。 CP51932は3バイトEUC非対応。
波ダッシュ問題
http://gihyo.jp/dev/serial/01/ruby/0004 には"WindowsのシフトJISをUnicodeへと変換する際には,必ずWindows-31Jを指定するようにしましょう"とある。なぜだろうか。
Mac OS XのターミナルではWAVE DASHもFULLWIDTH TILDEも表示できたが、WindowsのソフトではWAVE DASHが表示できなかったり、普通と逆に波打ってたりすることがあるらしい。
だからWindows上ではFULLWIDTH TILDEに変換した方が安全だよねーってことか。なるほどね。
(追記:iOSでも、http://favotter.net/status.php?id=18132572781 の波ダッシュがAeroReaderで文字化けしてた。WAVE DASHさん…)
マジコメ
どうしてもソースコードをSJISにしたいんです!というプロジェクトがあった場合にマジコメは「coding: shift_jis」とすべきか「coding: windows-31j」とすべきか。
文字列リテラル内に全角チルダがあって、それをUTF-8とかで出力する場合、shift_jisだとWAVE DASHが出る。windows-31jだとFULLWIDTH TILDEが出る。
MacやLinuxだとどっちも見れるみたいだから、Windowsのことを考えてwindows-31jにしとくのが無難か。
余談
ruby-1.9.1-p378 > dash.encode("euc-jpms").dump
Encoding::ConverterNotFoundError: code converter not found (UTF-8 to euc-jpms)
エンコーディング名がまちがってる時にこのエラーが出ると「UTF-8からEUC-JPmsには変換できないのかー」と勘違いしてしまうので、force_encodingのように「ArgumentError: unknown encoding name」って出してほしいな(あとでRedmine)
2010-07-17
■ [ruby] LDRのピンをRead It Laterに突っ込むRubyスクリプトを書いた
最近LivedoorReaderのピンが溜まっているので、Read It Laterに登録してiPadで読もうという魂胆。
ソース:
どちらのサービスもWeb APIがあるので簡単。(API KEYはldr2rilのために取得したものなので、何か別のものを作る場合は別のAPI KEYを取得してください)
動かし方:
RILのサーバが岡崎市にないことを確認する(librahack) $ gem install json mechanize pit $ export EDITOR=vi #必要なら $ ruby ldr2ril.rb <LDRのログイン情報を入力(初回のみ)> <RILのログイン情報を入力(初回のみ)> ピンの情報を取りに行く 順番にRILに登録する
2010-07-20
■ [ruby] geminaboxで「俺専用gem配布サーバ」を立てる
gem配布サーバといえばrubygems.orgなわけだけど、クローズドな環境でプライベートなRubyライブラリをgemで管理したいとかいうとき には、自前でgemサーバを立てると便利かも知れない。
インストール
$ gem install geminabox
サーバの起動
以下のようなconfig.ruを書いて「rackup config.ru -p 9292」とかするとgemサーバが起動する。
require "rubygems" require "geminabox" Geminabox.data = "/var/geminabox-data" # …or wherever run Geminabox
gemの追加
geminaboxはWeb UIを持ってるので、ブラウザでlocalhost:9292とかを開くと管理画面が表示される。ここからgemファイルをアップロードすることができる。
または、
$ gem inabox foo-0.1.2.gem
としてもいい (初回は「Host:」と聞かれるので、「http://localhost:9292/」などと入力する)。
gemのインストール
$ gem sources -a http://localhost:9292/
のようにして、自前のgemサーバを追加する(この情報は~/.gemrcに保存されている)。
感想
Sinatraはえらい。
個人的には、RubyStationのテストをオフラインでできるようにするのに使う予定。
2010-07-29
■ [ruby] FiberをRuby 1.8にバックポートするfiber18
Ruby 1.9のFiberを、1.8のThreadを使って実装したものらしい。
1.9のThreadはネイティブスレッドだけど、1.8のThreadはグリーンスレッド(自前実装)なので、実は1.9のFiberとよく似てるのである。
違いと言えば、Threadは勝手に切り替わるけど、Fiberは明示的にFiber.yieldを呼ばないと切り替わらない。後者で前者を実装することはできないが、逆は可能であると。
ソースはこちら:
threadライブラリのQueueクラスを使っているようだ。 Queueは、ただのキューではなく、空のときにpopしようとするとブロックする。
参考
□ okkez [refe にもその機能欲しいかもー]