トップ 最新 追記

Route 477



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

(続く?)

本日のツッコミ(全1件) [ツッコミを入れる]

okkez [refe にもその機能欲しいかもー]


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に半角チルダと被ってんじゃねーか
  • 一方WindowsはWindows_31J*4というShift_JISのスーパーセットを使った*5
  • さらに、WindowsにはeucJP-msとcp51932というEUC-JPの変種が2つあるらしい

おわかりいただけただろうか?(筆者はいただけてない)

irb-1.9で試行錯誤した結果を図にしてみる。

5289b464c58c8f653d2be08531ad2502.png

これを見ると、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)

*1 関係ないけどこの用語かっこいいよね

*2 ASCIIの0x5C(バックスラッシュ)を「円記号」に、0x7E(半角チルダ)を「オーバーライン」にして、半角カタカナを加えた文字集合

*3 0102の半角カタカナ部分もそうらしい

*4 CP932, MS932とも呼ばれる

*5 空き部分に、ローマ数字とかのいわゆる機種依存文字が入ってる


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しようとするとブロックする。

参考