Hatena::ブログ(Diary)

¬¬日常日記 RSSフィード

2010年05月09日

linux における google chrome でのSSL証明書のバックアップ方法

ひっさびさにはてなに書くから記法がわかりません!

市民権もすっかり剥奪されて奴隷階級に身をやつしております今日この頃、皆様お元気でしょうか。母の日にはベタにカーネーション送りましたよ!!そんなわけで google chrome でのSSL証明書バックアップ方法についてです。

なんで?って、そりゃ StartSSL で証明書を取得したのはいいけど、google chrome で取得してみたら、どうやってクラアント証明書のバックアップをとっていいのか途方に暮れてしまったからです。windows だとどうか分からないけど、linuxchrome だと、「オプション」→「高度な設定」→「セキュリティ」→「証明書の管理」をたどると下記の絶望的なページに飛ばされます。

http://code.google.com/p/chromium/wiki/LinuxCertManagement

さて、つまりは「GUIなんてまだ用意してねーぜ!」ということ(2010年5月現在)だそうなので、自分で頑張って NSS Shared DB と格闘してくれよ!ハハハ!!という話です。さすがは「高度な設定」を名乗るだけはあるよねー。ではどうせすぐに忘れちゃう私のために以下にバックアップ方法をまとめておきます。

まずは準備だ!

最早すっかり Ubuntu っ子になったので、下記で何も考えずに libnss3-tools をインストールしましょう。

sudo apt-get install libnss3-tools

他のディストロの場合は上の LinuxCertManagement のやり方に従うこと。

証明書の一覧を眺めるよ

とりあえず証明書としてどんなものが入っているか確認するよ。私の場合、他の証明書は入れてないから、StartSSLで作成した証明書だけが入ってるからとっても分かり易い感じです。

keita% certutil -d sql:$HOME/.pki/nssdb -L                        [/home/keita]


Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

StartCom Free Certificate Member's StartCom Class 1 Primary Intermediate Client CA ID u,u,u

というわけで、「StartCom Free Certificate Member's StartCom Class 1 Primary Intermediate Client CA ID」がニックネームです。このニックネームというのがなんだか重要そうだから、覚えておいてね!

いよいよバックアップを!!

必要なニックネームを取得したから、次のようにして、バックアップを取り出します。

keita% pk12util -d sql:$HOME/.pki/nssdb -o backup.p12 -n "StartCom Free Certificate Member's StartCom Class 1 Primary Intermediate Client CA ID"
Enter password for PKCS12 file: 
Re-enter password: 
pk12util: PKCS12 EXPORT SUCCESSFUL

これで backup.p12 というファイルがお手元に作成されます。パスワードを聞かれるけど、空でも一応大丈夫みたい。万一失くした時に備えて設定しておいた方がいいと思いますけどねー。ちなみにこの .p12 なファイルってなに?と思ったので調べてみたら、PKCS #12 という鍵と証明書をパッケージしたファイルフォーマットなのだそうです。SSL関係は用語がむずかしくて覚えられそうにない...

http://ja.wikipedia.org/wiki/PKCS

まとめ

さて、これでバックアップがとれて安心ですね。firefox でやればこんな苦労はしないで済むのに...と思うでしょうが、私の場合、そう思った時には手遅れだったの仕方ないのです。だってこの手順を踏まないと firefox に証明書を移すこともできないわけで。

ちなみにこの証明書を firefox に移すためには、「設定」→「詳細」→「暗号化」→「あなたの証明書」→「インポート」で作成した .p12 なファイルを読み込んで下さい。多分他のブラウザも似たようなところから読み込めるんだと思います。

2008年09月23日

石見銀山に行ってきました!

せっかくの世界遺産ということで石見銀山に行ってきました。とても自然の美しい所で楽しかったのです!でも、うーんどうなんだろう、と思うところもあったのでまとめておきます。

良かった点

  • 町並みが美しいので、天気の良い日にぼーっと眺めると最高だと思います。なるべく高いところから一望するとなお良いと思います(途中の少し小高いところにあるお寺?から見ると全体を眺められました)。
  • 熊谷邸は外から見たら一見地味なのですが、いざ中に入るととても楽しい。家広いし階段急だし、トイレも風呂場も見れて、昔の偉い人はこんなところに暮していたんだな、という生活感を身近に感じられました(というか、つい最近まで実際そこで家の人が生活してたんだって!)。是非見るべきだと思います。おまけに係員の人の説明が丁寧だし親切で言うことありませんでした。お茶のサービスもあったのですが、これがまたおいしくて満足。
  • 銀の採掘場というか掘ってた穴(場所)を間歩というのだそうですが、中がとても楽しい!こんなところで作業してたんだ、とワクワクしました。後ろを歩いてたおばさんが「こんなところで作業してたら早死にするよね」としゃべっていましたが、確かによく分かります。途中横穴が一杯あって思わず覗き込んでしまいます。なお間歩はちょっと寒いくらいに涼しいので、お気をつけ下さい。

なんだかなぁと思った点

  • バスをもう少し増便してもいいのではないでしょうか。
  • お土産屋さんがいまいちな感じ。石見銀山だから銀を買う!ってワケにはいかないので、他にもなんかそれっぽい名物か何か用意して下さると嬉しいです。正直何を買っていいものか分かりませんでしたので、何も買えませんでした。バス停の前に煎餅屋さんがあったから煎餅だけは買ったけど、これ京都のお店なの?とってもおいしかったけど石見銀山京都はなにか違うと思いました。
  • 各雑貨屋さんに統一感が感じられないので石見銀山らしさというが見つけられずこれまた何も買うことが出来ず。
  • 食べ物屋さんはちょっと冷たい感じだったので残念。
  • 間歩が一箇所しか公開されていないのは多少寂しい気がします。もちろんこれは銀山の保存を考えたら仕方ないのだろうと思います。でもなぁ。
  • 見所が熊谷邸と間歩の二箇所、という感じ。うーん、五百羅漢もあるけど、私はあまり印象に残りませんでした。なんだか寂しい。

まとめ

全体としてとっても地味です。観光地としてはまだまだこれからなのかなぁと思いました。確かに楽しい所なのは間違いないのですが、なんというか、物足りなさばかりが目立ってしまうところが残念でした。私ばかりがこう思うだけならとにかく、帰り掛けの人がブツブツと言ってるのを聞いた感じでは、不満が残った人はそれなりに居たようですよ。

世界遺産という名前の期待はもの凄いものがあると思いますので、そうした期待とのギャップがもの足りなさを感じさせてしまうのでしょうが、もう少し改善できるところはありそうです。というか現在まさにそうした改善の真っ最中で試行錯誤をしているように感じました。今後観光地として少しづつ洗練されていくのでしょうから、うーん地味だなぁ物足りないなぁ、という印象をぬぐえる日がいつか来るのだろうと信じています。磨けば光る原石状態?

2008年09月19日

KM で遊ぼう!

さて今日も眠れないので、KM について書いておこうと思います。KM ってなに?と思う人がほとんどのことかと思われますが、これは F-Logic の仲間みたいなものです。つまり知識をあーだこーだして遊ぶための枠組みです。"The Knowledge Machine"という格好の良い(しかしあまりにも大胆な)名前で覚えるといいみたいです。

KM: The Knowledge Machine

とか言っておきながら私も全然詳しくないので、他の人も一緒になって KM であーだこーだして下さるととっても嬉しいなと思います。むしろ色々教えて欲しいくらいですから、どなたか一緒に勉強して知見を共有しませんか?

なお、私は Action の扱いについてとても興味があります。そういう目的ですが、正直 Action をうまいこと扱うのって絶対難しいだろうとは思いますから(言語学の経験上、その辺を真面目に考えると、砂漠の荒野をさまよって死ねるよね!)、結局日和って class 周りをつついているだけになってしまうかも知れません。KM については今後も眠れない時にちまちま書いていく予定ですが、そうなったら誰かしかってやって下さい、よろしくお願いします。

まずは動かす

KM は lisp で書かれているそうです。私は scheme しか知らないので、というかそういう括弧の世界は gauche しか触ったことが無いダメな子なので、まず動かそうとした時点で躓きました。同様にダメな人はまず lisp 環境から導入しておいて下さい。Ubuntu の人は次のようにすれば大丈夫。

% sudo apt-get install clisp

次に km-2-2-19-packaged.lispダウンロードします。ただしこのまま clisp で処理するとなぜか変な文字列があるからエラーだよ、と怒られるようなので、とりあえずやっつけ的に次のようにして対処しておきます(正しい方法を知っている方教えて下さい)。

% nkf -w km-2-2-19-packaged.lisp > km.lisp

これでようやく動かすことが出来ます。

% clisp -repl km.lisp
(COMMENT: Resetting KM...)
      ====================================================
      KM - THE KNOWLEDGE MACHINE - INFERENCE ENGINE v2.2.16
      ====================================================
Copyright (C) 1994-2008 Peter Clark and Bruce Porter. KM comes with ABSOLUTELY
NO WARRANTY. This is free software, and you are welcome to redistribute it
under certain conditions. Type (license) for details.

Documentation at http://www.cs.utexas.edu/users/mfkb/km/
Type (in-package :km) then (km) for the KM interpreter prompt!
[1]> 

ただしこの時点ではまだ KM 環境の中に入っていないので、指示通りに次のように打ち込んでおきましょう。

[1]> (in-package :km)
#<PACKAGE KM>
KM[2]> (km)
KM> 

というわけでこれで遊ぶ準備が整いました。ではとりあえず猫を二匹登場させてみましょう。

KM> (a Cat)
(_Cat1)
(1 inferences and 35 KB accesses in 0.0 sec [250 lips, 8750 kaps]))

KM> (a Cat)
(_Cat2)
(1 inferences and 27 KB accesses in 0.0 sec [250 lips, 6750 kaps]))

なんだかとっても分かり易くて親切ですね。

読むべきもの

さてとりあえず動いて大変目出たいところですが、色々試す前に次のものは読んでおいた方が良いと思います。全体像がなんとなく把握できます。

http://www.cs.utexas.edu/users/mfkb/km/km-overview.script

あとはクイックリファレンスシートを印刷して手元に置いておきましょう。

http://www.cs.utexas.edu/users/mfkb/km/km-reference-sheet.doc

ただこのリファレンス、一箇所間違いがあって、真ん中くらいに allof が上下に並んでいるところがあると思うのですが、これ下のは oneof なので印刷する前に修正しておいた方がいいと思います。私は印刷してから気付いたのでとても悔しいです。

で、あとはマニュアルを読むべきでしょうけれども、いきなり頑張ると疲れるので私はいずれゆっくりと読むことにしました。

じゃあ遊びます

まずは無難なところでクラスでも作ってみましょうか。

KM> (Cat has (superclasses (Animal)))
(Cat)
(1 inferences and 21 KB accesses in 0.0 sec)

KM> (Animal has (superclasses (Mammal)))
(Animal)
(1 inferences and 21 KB accesses in 0.0 sec)

じゃあ早速サブクラスを問合せしてみます。

KM> (the subclasses of Mammal)
(Animal)
(1 inferences and 3 KB accesses in 0.0 sec)

KM> (the subclasses of Animal)
(Cat)
(1 inferences and 3 KB accesses in 0.0 sec)

うん、いい感じですね。じゃあタクソノミを表示しちゃいましょう。

KM> (taxonomy)
Removing redundant superclasses...
Removing redundant subclasses...
Computing subclasses of Thing...
Thing
   Mammal
      Animal
         Cat
(t)
(7 inferences and 102 KB accesses in 0.0 sec [583 lips, 8500 kaps]))

おおなんと便利なことでしょうか。なんだかワクワクしてきますね!あれれ、さりげなく Animal と Mammal の順序おかしくない?とか簡単に気付けるのもこうして可愛らしく表示してくれたおかげですね(私はうっかり屋さんだからこういう間違いをよくやります、うっかり屋さんにも優しい KM ということです)。素晴らしいと思います。

循環継承

いつも通りに循環継承に挑戦してみます。KM では循環継承はどう扱われるのでしょうか。楽しみですね。

KM> (Dog has (superclasses (Dog)))
(Dog)
(1 inferences and 20 KB accesses in 0.0 sec [250 lips, 5000 kaps]))

おお、なんとあろうことか、知識として認められてしまいました。大丈夫?

KM> (a Dog)
ERROR! Cycle in the KB! Dog is its own superclass!
	-------------------------
	**Switching on debugger** 
Options include:
  g: to see the goal stack
  r: to retry current goal
  a: to abort
  o: to switch off debugger
  A: abort & off - return to top-level prompt AND switch off tracer
  ?: to list more options
	-------------------------

ERROR! Cycle in the KB! Dog is its own superclass!1 <- (_Dog1)                               [(a Dog)](_Dog1)   ; (WARNING: Errors occurred during reasoning)
(1 inferences and 25 KB accesses in 0.0 sec [250 lips, 6250 kaps]))

ほらやっぱり大丈夫じゃないよ!とっても残念な感じですね。

まとめ

以上のように、KM はとっても素敵なおもちゃですから、皆で一緒に遊びましょう。今回は書きませんでしたが、なんと Situation とかあるんですよ。その辺と Action との絡みはとっても楽しみですよね。今からもうワクワクしてます。

「Rubyの普及を目指した自治体基幹業務システム構築」成果報告書をざっと読みました

以下の記事を読んで興味を持ったので「Rubyの普及を目指した自治体基幹業務システム構築」成果報告書をざっと読みました。

この報告書見て、一体何人がRoRを使おうと思うか興味津々なんです。 - ぐらめぬ・ぜぷつぇんのはてダ

報告書は以下からダウンロード出来ます、とっても親切な世の中ですね。

IPA 独立行政法人 情報処理推進機構:2007年度「自治体等におけるオープンソースソフトウェア活用に向けての導入実証」成果 Rubyの普及を目指した自治体基幹業務システム構築

私としては興味深く思ったのは 63 ページ以降の「4.3 人材育成の取組みについての検証」の箇所です。ここにはたった5日間で COBOL の人を Ruby の人に変えてしまおうという驚くべき計画が書かれていて、その結果 7 人中なんと 4 人は大体のところ Ruby を理解できてしまったようです(いやもちろん私のグラフの読み方はかなり恣意的ですけど)。私はこれまでの経験上新しい言語を学ぶのには大体一週間かかると考えていたのですが、たったの 5 日間で Ruby は学習できてしまうのですね。これはなんとも素晴しい事ではないでしょうか!この成果を活かして世の中の COBOL の人をわっしわっしと Ruby の人に転化させてしまえばいいんじゃないのかなぁ、と思いました。嘘です。

ただ、「オブジェクト」を理解できた人が6人居るのに、「クラス」を理解できた人が4人と、2人足りていない所に一抹の不安を感じます。クラスを理解できなった人は果たして本当にオブジェクトを理解できたのでしょうか?

2008年09月15日

1.9 trunk の proc{}[1,] 問題

先日は各種 1.9 対応用パッチを投げましたが、Ramazeさんへのパッチは追記したようにどうにもマズいものでした。

各種1.9対応パッチ投げますよ! - ¬¬日常日記

これを受けて manveru さんが ruby-core に投げたメールは次のものです。

[ruby-core:18560] Re: [ANN] Ruby 1.9.1 feature freeze

このメールにある例はちょっと長いのでより分かりやすいように最小の例を挙げておきます。

[1,] #=> [1]
proc{}[1,] # => syntax error, unexpected ']'

つまり、#[ ] によるメソッド呼び出しの場合、引数の末尾に","を付けると統語違反になってしまうのがどうなのかが問題提起されているわけです。もちろん通常どのメソッドも末尾に","を付けると統語違反なのですが、#[ ] については、配列記法から類推してまるで首尾一貫しない統語規則になっているかのように見えてしまうことが問題です。しかも 1.8 においては #[ ] の時には引数の末尾に","を付けても統語違反になりませんから、その点からも 1.9 の振舞いは不満となるわけです。

ruby-core には現在のところこれに対する答えが出ていないので、parse.y を読むことにしたいと思います。ざっと見た感想を書きますと、parse.y は複雑で大変な感じですね。私は果たしてこれを把握できるでしょうか。

私にも出来るPPA

なにか良く分かっていないのですが PPA って便利そうですね。だから私もやってみることにしました。

下のが私のアカウントです。

Keita Yamaguchi in Launchpad

で、アカウント登録日が 2005-11-09 となっているのですが、私はいつの間に launchpadアカウントを作っていたのでしょうか。正直あまり記憶がないのですが気にしないことにします(あ、でも昔、なんかしようとしてアカウントを作って、そのまま忘れ去ってしまったような)。

ちなみに上に挙げた記事はとっても分かり易くて素晴らしいと思いました。特にCoC書名は手順がわりと複雑なので、分かり易いガイドを書いて下ったおかげでとても助かりました。ありがとうございました!あときっと続編を書いて下さると信じていますのでよろしくお願いします。そういうわけですから、皆さんも是非やってみて下さい。私にも(少なくともここまでは)出来たから他の人もきっと出来るよ!

でも、PPAで何公開したらいいのかな?なにか適当に野良パッケージでも作ってアップロードして良いのでしょうか。それにしても、RPM は結構作った経験があるのですが、deb パッケージは一度も作ったことがないんですよね。大丈夫かな。

あとついでに反省ですけれども、私は linux をそこそこ長く使わせてもらってるくせに、全くと言っていい程 linux 系のコミュニティには貢献した事がないので、そろそろなんとかしたいと思います。手順とかしきたりとかが分からないからやらないわけで、だからそういうのを少し学びたいと考えています。今は Ubuntu 使ってるから(Ubuntu 楽だもんね!)、Ubuntu でなんかすればいいのかな?何が出来るかな?

2008年09月14日

Rubinius は出来る子!という話

以下の記事を読みました。

lambdaの動作 - はてなかよっ!

それはさすがにどうだろう、と思うわけですが、でも我々には Rubinius という素晴らしい武器があるではないですか!

class Foo
  Map = {
    'key1' => lambda { |bar|
      puts bar
      p MethodContext.current.sender.sender.receiver
    }
  }

  def baz(key, bar)
    Map[key].call(bar)
  end
end

foo = Foo.new
foo.baz('key1', foo.object_id.to_s)

#=> 9
#=> #<Foo:0x9>

てなわけで、出来なくはありません。でもこういうのを使うと世間様に怒られそうな気がします。

追記

id:miura1729 さんの Binding.of_caller はとってもタメになるので是非読みましょう。CRuby でもこんな方法で出来るんですね、ありがとうございました!

CRubyも出来る子!という話 - miura1729の日記

Binding.of_caller のことを今まで知らなかったのですが(出自は Rails なのかな、それとももっと前からあるのかな?)、おお、なんと見事な set_trace_func でしょうか。return してから line に入ったタイミングで binding を取得するわけですね。賢いなぁ。set_trace_func は注目したことがなかったのでなにか楽しい活用方法を考えてみたいと思いました。

OSC島根2008雑感

スタッフの皆様大変お疲れ様でした。ありがとうございました。私はダラダラ話を聞くだけでお気楽に生きててごめんなさい!そんなわけでOSC島根2008の感想をメモしておきます。

12日

  • 最初の対談は遅刻したから聴いてません!
  • 教育:誰に教えるかで立場も目的もバラバラなので難しそうです。高専とか大学はオープンソースはまぁそりゃいいけど、小中高だと扱い切れない大変さがあるのでしょうか。それならば暇な人が何かを手伝える道筋をどこかに分かり易く示しておけば良いのでしょうかね。あと「オープンソースリテラシー」という言葉が出ていたように記憶しているのですが、それは何なの?とか思いました。また、よしだともこ先生かっこいい!という印象が残りました。女子大で emacs とか一切妥協しないところが素晴しい。
  • 地域コミニティの話:福岡と大分が住みやすくて良いらしいことが分かりました。誰か私を雇って下さい!マジで。すぐに引っ越しますから。
  • まつもとさんに会えた!おお。

13日

  • 午前は行けませんでした!
  • 9arrowsとSKIP:9arrowsは途中から聴いたから全体像が良く分かりませんでした、ごめんなさい。SKIPのキャラクター、かわいいですね!
  • Railsで基幹:COBOLの人をRubyにコンバート、という話がとても興味深く面白いお話でした。COBOL のままで延命とかそういうことは考えないんだ。RailsMVCCOBOL と似てるよ!ということだそうですが、COBOLを知らないから分かりませんが、そうなのですか。それはとっても便利。世界中のCOBOLの人がRailsの人になって万歳!な感じですね。素晴しい。
  • Rubyの課題:おお前田さん、さわやか。Ruby遅いよの話は実際のところほとんどの人は気にしてないんじゃないのかと思いました。そして1.9は速いけど遠いですね。私はどうしても昔ながらの牧歌的Rubyのイメージをひきずっているので、ISO化の話を聞くとまるで別世界かのように感じました。
  • 用事があってライトニングトーク聴けなかった!無念!

まとめ

島根県Rubyでビジネスをしようと本気で考えているのだなぁ、ということが分かりました。本気の本気なんですね、ちょっと驚きました。Rubyで遊びたい人と仕事をしたい人のバランスをとるのはとても難しいことだと思いますが、皆にとって幸せな未来があることを祈っております。

で、改めて Rails ってすごいなぁと思いました。だってここまで来てもなお枯れることなく前進しているわけでしょう。実は人気の秘密は永遠に枯れる気がしないことなんじゃないか?と考え込んでしまいました。

あと、OSCだから当然「オープンソース」という言葉が多かったわけですが、「フリー」という言葉を使っていた人も中には居ましたね。自由のことも時々思い出してあげるとより良い未来があるのではないかなと思いました。

2008年09月12日

各種1.9対応パッチ投げますよ!

ruby1.9 に対応してる gem は少な過ぎると思うわけです。いや、だって trust/untrust 使いたいんだから(せっかく作ってもらったのに使わなかったらもったいない!)、1.9 じゃなきゃダメなの。そういうわけだからあちこちパッチ投げますよ!

Ramaze さん

Ramazeさんは 1.9 対応してるハズなのに!なんてこった動かないよ!あわてて直しておきます(持ってて良かったコミット権(追記:実はこれは trunk のバグじゃないかという噂で私の早とちり、持っててごめんなさいコミット権))。

http://github.com/manveru/ramaze/commit/85724c13ab64b5dbb63793b85f571f3c75a85da6

配列の最後に "," を付けるのはヤメましょう。

と思ったらこれって 1.9 trunk のバグだ(と思います、きっと)。やっちまったよ!ごめんなさいと上のコミットにコメントしておきました。

いやだって 1.9 はきれいな ruby だから配列の "," を認めないに違いないと思ったのですよ。本気で。でも実際は次のように 1.9 trunk は通常は配列末の "," を認めるので単なるバグでしょう。(追記:この書き方自体が大嘘だ!と気付きました、ごめんなさい)

keita% ruby1.9 -e "p [1,2,3,4,5,]"
[1, 2, 3, 4, 5]

ていうか ruby-core にこれを問題提起したのは Ramaze 作者の manveru さんで、時間的に考えて、ほぼ間違いなく私のコミットが疑問の発端ですよね。お手間をとらせてしまって本当にごめんなさい。

追記:この問題が本当はどういうものなのかについて次にまとめました。興味のある方は是非ご覧下さい。

1.9 trunk の proc{}[1,] 問題 - ¬¬日常日記

ruby-git

case 文の時にコロン使うのはやめましょう。

          case type
          when /blob/:   Blob
          when /commit/: Commit
          when /tree/:   Tree
          end

というわけで ":" を ";" に修正。その上で rake test してみると...。

keita% ruby1.9 -S rake test                 [/home/keita/Repos/GitHub/ruby-git]
(in /home/keita/Repos/GitHub/ruby-git)
Loaded suite /usr/bin/rake
Started
EEEEEEEE..E........E.EEEE.EEEE...E....E....E.......EEEE..F.E.EEE.EEEEEE
Finished in 7.035092285 seconds.

# 以下エラーの山

なんてこった、絶望的だ!

ruby-git は全体としてコードが汚ないので色々直したくなる心をぐっと抑えつつ、最小限のパッチを作っていきます。エラーは以下の二種類の繰り返しみたいなもの。

  • TypeError: cannot assign nil; use Hash#delete instead
  • NoMethodError: undefined method `to_a' for "-a":String

前者のは ENV['A'] = @var みたいな形になっているらしくって、@var がたまたま nil だからエラーになっているみたいです。え、ENVに nil 入れちゃダメなの?これは知りませんでした。直し方はメッセージの通り Hash#delete を使うだけで大丈夫です(このためにちょっと記述が煩雑になるのですが、どうしてこういう風に変更になったんでしょうかね? 追記:答えは [ruby-list:40865] Re: Ruby without false or nil にありました)。後者のは、確か String#to_a って 1.9 ではなくなるんでしたよね。配列に変換したいなら Kernel#Array を使いましょう。

そんなわけでこの二点を直しました。そしたら次のような新たなエラーが。

  • NoMethodError: undefined method `each' for "HEAD":String

おお、String#each も 1.9 にはないのでしたね。それはいいんだけど、これは別に1.9対応云々がどうじゃなくって、単純なユニットテストの記述ミスですよ(tests/units/test_tree_ops.rb:83)。

        c = g.commit_tree(tr, :parents => 'HEAD')

これは parents と複数形になっていて、こっちを使う時には配列で渡すべきことを期待してるはず(String#each がなくなってこういうバグが発見しやすくなりましたね、素晴しいと思います)。でも実際こうしてミスしてるんだから、配列じゃなくても良いように勝手に修正しておくことにしましょう。

以上の修正を加えて再度テストを実行します。

keita% ruby1.9 -S rake test                 [/home/keita/Repos/GitHub/ruby-git]
(in /home/keita/Repos/GitHub/ruby-git)
Loaded suite /usr/bin/rake
Started
fatal: Not a valid object name
.F........F..............................................F.............
Finished in 19.287180246 seconds.

まだ失敗してるじゃないの!と思うかも知れませんが、これは元々失敗する項目どもですので気にしないことにします。思うにこれらはただのテストの記述ミスか、もしくは作者さんの環境において限定的に成功するという禍々しいテスト項目なのです。

では以上の成果をプルしてもらえるようにリクエストしておきます。GitHub が出来てから本当にパッチが送り易くなりました!GitHub さんとってもとってもありがとう!!

Commits ? keita/ruby-git ? GitHub

ついでにプチ情報ですが、ruby-git は rubyforge の gem を更新する気がないような気がします。README では以下のように GitHub から直接ダウンロードすることを推奨しています。

sudo gem install schacon-git --source=http://gems.github.com

だから古い gem を入れて苦しまないようにご注意あれ。

RedCloth

1.9 trunk では gem からインストールしようとしても次のように make できません(RedCloth 4.0.3)。

keita% gem1.9 install RedCloth
Building native extensions.  This could take a while...
ERROR:  Error installing RedCloth:
	ERROR: Failed to build gem native extension.

/usr/local/bin/ruby1.9 extconf.rb install RedCloth
creating Makefile

make
gcc -I. -I/usr/local/include/ruby-1.9.0/i686-linux -I/usr/local/include/ruby-1.9.0 -I. -D_FILE_OFFSET_BITS=64  -fPIC  -O2 -g -Wall -Wno-parentheses -O2   -o redcloth_attributes.o -c redcloth_attributes.c
ext/redcloth_scan/redcloth_attributes.rl: In function ‘redcloth_attributes’:
ext/redcloth_scan/redcloth_attributes.rl:68: error: ‘struct RString’ has no member named ‘ptr’
ext/redcloth_scan/redcloth_attributes.rl:68: error: ‘struct RString’ has no member named ‘ptr’
ext/redcloth_scan/redcloth_attributes.rl:68: error: ‘struct RString’ has no member named ‘len’
ext/redcloth_scan/redcloth_attributes.rl: In function ‘redcloth_link_attributes’:
ext/redcloth_scan/redcloth_attributes.rl:77: error: ‘struct RString’ has no member named ‘ptr’
ext/redcloth_scan/redcloth_attributes.rl:77: error: ‘struct RString’ has no member named ‘ptr’
ext/redcloth_scan/redcloth_attributes.rl:77: error: ‘struct RString’ has no member named ‘len’
ext/redcloth_scan/redcloth_attributes.rl:78:2: 警告: ファイル末尾に改行がありません
make: *** [redcloth_attributes.o] エラー 1

まずはレポジトリを clone してきます。

http://github.com/jgarber/redcloth/tree/master

それで rake compile すると Ragel 6.2 以上が必要ですよと言われたので Ragel をアップデートします(私の環境には6.0が入っていました)。

Ragel State Machine Compiler

最新版 6.3 をインストールしてから rake compile に再挑戦します。そうしたら今度は

keita% ruby1.9 -S rake compile
rake aborted!
uninitialized constant PLATFORM

だそうです。こいつはあまりに obsolete だぜ!早速"RUBY_PLATFORM"に修正します。

no title

でも、これを直したところでやはり rake compile に失敗するのは変わりがありません。gem をインストールしようとした時と同じエラーが表示されます。ragel をアップデートしたら勝手に直るのかな、と甘い期待を抱いていたのですが、そういうものでもないようです。

しかしエラーを見る限りでは修正は難しくないものと思います。というのも "error: ‘struct RString’ has no member named ‘ptr’" って良く見ますからね。RSTRING(str)->ptr はダメですよ!README.EXT.ja には次のようにあります。

構造体からデータを取り出すマクロが提供されています.文字列

strの長さを得るためには「RSTRING_LEN(str)」とし,文字列strを

char*として得るためには「RSTRING_PTR(str)」とします.配列

場合には,それぞれ「RARRAY_LEN(ary)」,「RARRAY_PTR(ary)」と

なります.

だからこっちを使いましょう。ext/redcloth_scan/redcloth_attributes.rl だけでなく他にもいっぱい RSTRING(str)->ptr しちゃってるところがありますので、こういうのをあらかた直してしまいます。この修正後、きちんとコンパイルできました。rake gem して gem 作成に成功!

no title

でも rake test してみるとテストに失敗してしまいます。

  1) Failure:
test_smiley(TestExtensions) [/home/keita/Repos/GitHub/redcloth/test/test_extensions.rb:29]:
<"<p>You&#8217;re so silly! <img src='/images/emoticons/58_80.png' title=':P' class='smiley' /></p>"> expected but was
<"<p>You&#8217;re so silly! <img src='/images/emoticons/:_P.png' title=':P' class='smiley' /></p>">.

  2) Failure:
test_html_threshold_lang_attribute(TestFormatters) [/home/keita/Repos/GitHub/redcloth/test/helper.rb:17]:
<"<p lang=\"fr-fr\">En français.</p>"> expected but was
<"<p lang=\"fr-fr\">En fran\xC3\xA7ais.</p>">.

4926 tests, 4928 assertions, 2 failures, 0 errors

まず 1) についてですがこれはテスト(test/test_extensions.rb)自体に問題があります。

    def refs_smiley(text)
      text.gsub!(/(\s)~(:P|:D|:O|:o|:S|:\||;\)|:'\(|:\)|:\()/) do |m|
        bef,ma = $~[1..2]
        filename = "/images/emoticons/"+(ma.split(//).collect{|l| l[0] }.join('_'))+".png"
        "#{bef}<img src='#{filename}' title='#{ma}' class='smiley' />"
      end
    end

これはありがちな非互換性問題ですね。filename のところ collect の "l[0]" がマズい。1.8 なら指標位置の文字に対応する数値を返していたわけですが、1.9 では文字を返すんですよね。こう時には String#unpack で堪え忍びます。

no title

次に 2) ですが、これは単純に ruby1.9 -EUTF-8 とかすると解決するのかな、と思ったら違って困った!眠くなってきたから原因がよく分からないので誰か直して下さい!

ひょっとして 1.9 trunk をコンパイルし直したらこれ解決するのかも、と期待してやってみたら、もっとエラー増えた!もう知らん、寝る!!(追記:結局この増えた分のエラーというのは、単純に RedCloth を再コンパイルしたら直りました)

まとめ

今回は Ramaze, ruby-git, RedCloth の Ruby1.9 対応を試みました(残念ながら Ramaze については足を引っ張っただけになっちゃいましたが)。何が問題で、どうやって直したのかを、割と詳しく書いてみたつもりです。理由は、他の方がライブラリを 1.9 対応しようと思った時に少しでも役に立てばいいなと思ったからです。

正直なところ、直さなきゃならないライブラリとその修正箇所は山ほどあるのだと思います。でもみんなで直せば怖くないよ!皆さんも一緒に 1.9 対応パッチを各所に投げまくりましょう!!

追記

RedCloth にパッチが取り込まれました。4.0.4 がリリースされればこれで大体のところ 1.9 でも動くようになるかと思われます。しかし結局まだテストが一つ失敗したままなので、誰か直して!

Fixed compatibility issues with Ruby 1.9. [Keita Yamaguchi] ? jgarber/redcloth@3ca59c9 ? GitHub

2008年09月11日

Rubinius のコミット権をもらっちゃうよ!な話

先日 Rubinius にパッチを送りました。

Rubinius に Module#include のパッチ送ってみました - ¬¬日常日記

パッチは無事に採用されたようです、ありがとうございました。なんか色々と勘違いしているような気がして心配していたのですが、取り込まれて良かった良かった。

それで、Rubinius ではパッチを一つでも送った人にはもれなくコミット権をあげちゃう方式だそうですので、私もコミット権をもらえるそうです(ちなみに Ramaze さんも同様の方針、私はしばらくそれを無視してパッチを送り続けてました)。貧乏人だからもらえるものはもらっておこうというわけで、遠慮なくもらっちゃうよ!

If you do not have commit rights yet, make sure you have a Github user account and contact evan.

とのことですから、もちろんもう GitHubアカウントは持っているので、あとは evan さんに連絡すればいいだけですね。ドキドキです。

OSC2008島根に行きます!宣言

行きます!というかあるのをすっかり忘れてました!!

オープンソースカンファレンス2008 Shimane - いらっしゃいっ

忘れてたくらいだから何がなんだか良く分かってないけどとりあえず眺めてきます。一番興味があるのはこれです。

オープンソースカンファレンス2008 Shimane - イベント案内 | 2008-09-13 (土): Rubyの課題と取り組み

課題ってなんでしょうかね。そういうことを知るために行ってきます。

あとはなにかなぁ、9Arrows & SKIP の話を聞きに行こうかなぁ。Rails 分からないからそういう方々の空気に触れてくるつもりで。

オープンソースカンファレンス2008 Shimane - イベント案内 | 2008-09-13 (土): Rubyオープンソース9Arrows & SKIPご紹介

そうそうライトニングトークもあるみたいですけれども、まだ申し込めるのでしょうか。空きがあるのなら Ramaze か Selfish か RTask か Wusagi(簡易な分散CMSっぽいヤツ、もちろん Ramaze アプリ!) でやろうかな。と思ったわけですが、土曜日ってもうすぐじゃないですか!今日の夜に申し込んでも間にあうかな?