tdiaryなどのレガシーウェブアプリをruby1.9で動かす方法

97
tDiaryなどの レガシーウェブアプリを Ruby1.9で動かす方法 藤岡岳之(xibbar)/(有)ラビックス 日本Rubyの会/Rails勉強会@東北 Open Source Conference 24 Jan. 2009

Upload: xibbar

Post on 19-Jan-2015

3.852 views

Category:

Art & Photos


6 download

DESCRIPTION

 

TRANSCRIPT

Page 1: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

藤岡岳之(xibbar)/(有)ラビックス日本Rubyの会/Rails勉強会@東北

Open Source Conference24 Jan. 2009

Page 2: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

まずご容赦

今日発表する4人の中で唯一著作を持っていないことに気がついた大したヤツではありませんm(_ _)mつーか、3人(組)とも著作を持っているなんてすげーよ

おそらく、よくわからんマニアックな内容をグダグダと話すに違いないtDiaryがまじめに対応しそうなので、セッションのタイトルがピンチ

Page 3: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

自己紹介

福島市在住秋田県出身福島大学教育学部出身有限会社ラビックス社内では何でも屋もう7年もやってますRuby on Railsでソフト作っています

生粋の東北人です

Page 4: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

ちょっと本業の宣伝

中規模向けの携帯連絡網システム販売代理店を募集中収益の一部をRuby財団に寄付します(そんな組織ないけど)

Page 5: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

Rubyの活動

Matz Rubyのコミッタcgi.rbの担当のためだけのコミッタです(現状は)M17N関係のバグ報告はそれなりにしているつもり

Rails勉強会@東北日本Rubyの会関係に出没

Page 6: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

今日は福島から来ました

Page 7: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

牛タンのために

Page 8: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

Ruby会議のために

Page 9: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

というわけでアジェンダ

第1章 いかに1.9のcgi.rbが腐っていたか第2章 改良した結果、cgi.rbはこうなった第3章 1.9.1のM17Nはこうなった第4章 レガシーアプリはこうやって動かせ

Page 10: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

第1章

第1章 いかに1.9のcgi.rbが腐っていたか第2章 改良した結果、cgi.rbはこうなった第3章 1.9.1のM17Nはこうなった第4章 レガシーアプリはこうやって動かせ

Page 11: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

きっかけはReject会議

yuguiさんのセッション

Page 12: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

1.9を使ってみてください

RejectKaigiでのyuguiさんの布教活動バグレポートと人柱を必要としている

そろそろ使ってみようかな

Page 13: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

Redmineもあるし

バグの報告・機能拡張の提案ができるチケットに自動的になるMLに自動的に流れる誰かが担当者に振り、作業することになるcgi.rbだと、担当者が私になります

Page 14: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

1.8のcgi.rb

みんな使っているRuby on Railsでも使っている一応ちゃんと動く

Page 15: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

cgi.rbって何ぞや?

CGIアプリの開発を支援するライブラリこれがないと、Content-Typeなんとかと自力で出力する羽目になるこれがないと、「id=123&id=456&id=&str=%40h+%3D%7E+%2F%5E%24%2F」こんなのをオレオレunescapeする羽目になる

その他、機能いろいろあるけど省略

Page 16: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

みんなdisっているkwatchcgi.rb がイケてない 12 の理由(るびま)

Matzruby-listとかruby-devにて

mputruby-devあたりで

kakutani札幌Ruby会議にて

咳さん自分のブログで

Page 17: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

1.8のcgi.rbはここがダメ

テストがないマルチパートの時のデータの受け取り方が酷すぎる@cgi[‘name’].readみたいなやつ

遅い

これらは改良したいなぁ

Page 18: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

1.9のcgi.rb誰も使っていない積極的メンテナがいない2006年には捨てたいと言われている

Page 19: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

まだcgi.rbを使いたい

既存のアプリがあるcgi.rbのお手軽さもよく知っている

世の中の流れはRackに行っているけど、Rackにはないお手軽さもあるよRack => Web Server Gateway Interface

Page 20: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

cgi.rbでhello world

Page 21: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

コンソールで実行すると

素直でいい子だこの挙動がcgiの基本だと思う

Page 22: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

そして、1.9で使ってみる

Page 23: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

まず、hello world

お、出るじゃん♪

Page 24: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

次、日本語

単純に日本語にして、実行してみる

Page 25: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

いつものエラー

いつものエラー。こんな時はコンソールだ。

Page 26: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

コンソールでデバッグ

これって、M17Nのエラー気を取り直して、ソースコードのエンコーディングを教えてやるマジックコメントを追加

Page 27: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

マジックコメントを追加

マジックコメントを追加し、ソースのEncodingを教えてやる

Page 28: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

例外は回避したけど、

肝心の牛タンが表示されていない!

Page 29: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

正しくはこう

コンソールで見てみよう

Page 30: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

コンソールでの出力結果

予想通り、1.9の方のContent-Lengthの値がおかしい

fujioka@dhcp155:~/cgi-bin% ruby hello_world3.rb </dev/nullContent-Type: text/htmlContent-Length: 79

<HEAD><TITLE>Hello World</TITLE></HEAD><BODY>こんにちは、牛タン</BODY>%

fujioka@dhcp155:~/cgi-bin% ruby19 hello_world3.rb </dev/nullContent-Type: text/htmlContent-Length: 61

<HEAD><TITLE>Hello World</TITLE></HEAD><BODY>こんにちは、牛タン</BODY>%

Page 31: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

ここまでの感想

この程度のことも修正されていないなんて、本当に誰も使っていないんだなcgi.rbは1.9.1のリリース前に削除されてしまうのではないだろうか?こんな動かないライブラリ、ない方がいいでしょ?

Page 32: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

早速行動

IRCに報告usaさんがfix

でも、まともに動かすには大幅なテコ入れが必要だkwatchさんのcgialtを参考に入れ替えたいこっそり、1.8のテストも入れたい

Page 33: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

テコ入れのステップ

まず、cgi.rbにテストを導入改造する前にテストを書け by naruseさんでも、これは手間取った1.8とテストは共通では無理

cgi.rb本体をファイル分割その他、問題を修正する改善できる機能を改善する

Page 34: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

第1章完

Page 35: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

第2章

第1章 いかに1.9のcgi.rbが腐っていたか第2章 改良した結果、cgi.rbはこうなった第3章 1.9.1のM17Nはこうなった第4章 レガシーアプリはこうやって動かせ

Page 36: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

cgi.rbを読んだ感想

チャレンジなコードが多い気がするRubyはこんな変な機能があるから使っておけ!みたいな(例えば、継承の方がいいのに、Delegateを使ってみたり)

スピードのことは丸っきり考慮がない当時は、スピードが要求される場合はRubyを使ってはいけなかったんだと思う“aaa”+“bbb” => “aaa”<<“bbb” の方が早い

Page 37: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

大まかな変更点テストが追加(使う人は関係ないかも)CGI.newするときに受け取るエンコーディングを指定する(デフォルトはUTF-8)CGI.newにブロックを与えて、例外処理を行うことができるマルチパートのデータの受け取りは、IO型ではなくなった救済措置として、readメソッドをくっつけている

CGI#outでencodingの変換はしなくなったスピードアップをがんばった

Page 38: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

テストが追加

今後もメンテナンスされていく上で、最も重要なポイントkwatchさんのCGIAltのコードを大分参考にしている

CGIというのは標準入力からデータを受け取り、標準出力に出力する

横取りする

Page 39: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

横取り方法

標準入力の横取り

Page 40: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

UTF8なCGIアプリ

挙動を実演(hello_world4.rb)

Page 41: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

EUC-JPなCGIアプリ

挙動を実演(hello_world5.rb)

Page 42: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

Internal Server Error

受け取るデータのencoding error

/Users/fujioka/local/lib/ruby19/1.9.1/cgi/core.rb:600:in `block (2 levels) in initialize_query': Accept-Charset encoding error (CGI::InvalidEncoding) from /Users/fujioka/local/lib/ruby19/1.9.1/cgi/core.rb:595:in `each' from /Users/fujioka/local/lib/ruby19/1.9.1/cgi/core.rb:595:in `block in initialize_query' from /Users/fujioka/local/lib/ruby19/1.9.1/cgi/core.rb:594:in `each' from /Users/fujioka/local/lib/ruby19/1.9.1/cgi/core.rb:594:in `initialize_query' from /Users/fujioka/local/lib/ruby19/1.9.1/cgi/core.rb:752:in `initialize' from hello_world5.rb:4:in `new' from hello_world5.rb:4:in `<main>'

Page 43: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

encodingを指定する

受け取るencodingを指定する必要があるオプションはHashで指定するようにした

hello_world6.rb

Page 44: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

例外じゃいやだencodingの例外を入れておく器

encodingの例外を入れる処理をブロックで渡してしまう

encodingをチェックし、変換できそうだったら変換

hello_world7.rb

Page 45: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

面倒になった気もするが、

Page 46: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

UTF-8で書いておけ

Page 47: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

multipart form on 1.8

受け取ったデータはIO型であることに注目この仕様はひどすぎると思う

hello_world8.rb

Page 48: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

multipart form on 1.9

ある程度、互換性は保ちたいでも、この酷い仕様はやめてStringにする

そーだ、String型にselfを返すreadを特異メソッドでくっつけてしまおう

define_method(:read){self}

Page 49: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

受取データはString

Stringになったので、これだけでOK

hello_world9.rb

Page 50: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

CGI#filesでファイル一覧

CGI#filesでHash形式でアップロードされたファイルを一式取得できる

hello_world10.rb

Page 51: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

好き放題やっている

cgi.rbはコミッタの間で利用者が少ない特に、タグ生成メソッドあたりは好き放題できるライバルはhamlだと思っている

RSSの配信なんかもcgi.rbでささっと出力するのが楽だと思うもっと早くしたいもっとよくしたい(会社が暇な時期に)

Page 52: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

第2章完

Page 53: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

第3章

第1章 いかに1.9のcgi.rbが腐っていたか第2章 改良した結果、cgi.rbはこうなった第3章 1.9.1のM17Nはこうなった第4章 レガシーアプリはこうやって動かせ

Page 54: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

文字数をカウントする1.8の時代

"牛タン".split(//u).size=> 3

1.9の時代irb> "牛タン".size=> 3irb> "牛タン".bytesize=> 9

Rubyは真の国際言語へ!

Page 55: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

重要なこと

RubyのM17Nの大前提です

StringのインスタンスがEncoding情報を持つようになった

irb(main):001:0> "ほげ"=> "ほげ"irb(main):002:0> "ほげ".encoding=> #<Encoding:UTF-8>

Page 56: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

1.9のString型

String#encoding # 現在のEncodingString#force_encoding(encoding) # エンコーディングを強制変更String#encode(encoding) # 文字列をエンコードString#valide_encoding? # エンコーディングがあっているかチェックString#ascii_only? # 7bit ASCIIのみかどうかチェック

Encoding情報を持つようになった

Page 57: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

Encodingクラス

Encoding.list # 有効なEncoding一覧Encoding.find(encoding) # encodingが有効かどうか調べるEncoding.default_external # デフォルト外部エンコーディングEncoding.default_internal # デフォルト内部エンコーディング(xibbarは説明できない)

デフォルトエンコーディングは代入できるのだが、あまりしない方がいいと思う

Page 58: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

Encodingの種類

US-ASCII # ABab123などの7bit ASCII文字列ASCII-8BIT # バイナリだと思ってOKUTF-8、EUC-JP、SJISなど(説明省略)

Page 59: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

外部Encoding

Encoding.default_externalのこと1.9ではファイルをオープンする時にEncoding情報を与える省略された場合はEncoding.default_externalが採用される

irb> Encoding.default_external=> #<Encoding:UTF-8>irb> open('/tmp/hoge.rb','r:euc-jp').read.encoding=> #<Encoding:EUC-JP>irb> open('/tmp/hoge.rb','r').read.encoding=> #<Encoding:UTF-8>

Page 60: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

外部Encodingをキメる

コマンドラインで与えるshebang行で指定する代入する(非推奨だと思う)環境変数(LANGとか)

% ruby19 -Eeuc-jp sample.rb

#!/usr/bin/ruby19 -Eeuc-jp #<=shebang行

Encoding.default_external=

Page 61: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

String#encode

文字列をencodeする破壊的に変換するので注意

irb> "ほげ"=> "ほげ"irb> "ほげ".encoding=> #<Encoding:UTF-8>irb> "ほげ".encode("EUC-jp")"?ۿ?" <=

Page 62: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

String#force_encoding

Encoding情報を強制変換破壊的に変換するので注意バイト列自体は変化しない間違ったEncoding情報の文字列を生成できる

irb> "ほげ".force_encoding("EUC-JP")=> "\xE3\x81??\x81\x92"irb> "ほげ".force_encoding("ASCII-8BIT")=> "\xE3\x81\xBB\xE3\x81\x92"irb> "ほげ".force_encoding("US-ASCII")=> "\xE3\x81\xBB\xE3\x81\x92"

Page 63: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

String#valid_encoding?

Encoding情報が正しいかをチェックする

irb> "牛タン".valid_encoding?=> trueirb> "牛タン".force_encoding("EUC-JP").valid_encoding?=> false

Page 64: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

合体 その1

同じEncoding同士は連結できる基本的に違うEncodingは連結できないただし、7bit ASCIIしかない場合は連結できる

irb> "ほげ"+"ふが"=> "ほげふが"irb>"ほげ"+"ふが".force_encoding("US-ASCII")Encoding::CompatibilityError: incompatible character encodings: UTF-8 and US-ASCII> "abc"+"ふが".force_encoding("ASCII-8BIT")=> "abc\xE3\x81\xB5\xE3\x81\x8C"

Page 65: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

合体 その2

7bit ASCIIしかないASCII-8BITは連結できるEncoding情報は柔軟に判断される下の挙動はバグだとさ(発見してしまった)

irb> ("abc".force_encoding("ASCII-8BIT")+"def").encoding=> #<Encoding:UTF-8>irb> ("abc".force_encoding("US-ASCII")+"def").encoding=> #<Encoding:US-ASCII>

Page 66: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

文字列dump

上2つはただのバイト列で、ScriptのEncodingに依存するMarshal.dumpはEncoding情報がつく

irb> "ほげfuga".dump=> "\"\\u{307b}\\u{3052}fuga\""irb> "ほげfuga".inspect=> "\"ほげfuga\""irb> Marshal.dump("ほげfuga")=> "\x04\bI\"\x0F\xE3\x81\xBB\xE3\x81\x92fuga\x06:\rencoding\"\nUTF-8"

Page 67: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

マジックコメント

ソースコードのエンコーディングを明示するこれがないとRubyはソースに埋め込んである文字列のencodingがわからない1.8の時はバイト列扱いだった

2種類あるemacs方式(# -*- coding: utf-8 -*-)vim方式(# vim:fileencoding=UTF-8)

Page 68: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

まとめ

Stringは常にEncoding情報を持っていることを意識しようStringをファイルなりDBなりに保存するときは、データを保存したいのか、Encodingごと保存したいのかを考えよう日本語を含む場合はマジコメ(マジックコメント)を忘れずにつけよう

Page 69: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

第3章完

Page 70: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

第3章

第1章 いかに1.9のcgi.rbが腐っていたか第2章 改良した結果、cgi.rbはこうなった第3章 1.9.1のM17Nはこうなった第4章 レガシーアプリはこうやって動かせ

Page 71: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

藤岡岳之(xibbar)/(有)ラビックス日本Rubyの会/Rails勉強会@東北

Open Source Conference24 Jan. 2009

Page 72: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

tDiaryが1.9に対応しそうだ

Page 73: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

あっさり転身

Page 74: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

tDiary HikiなどのレガシーウェブアプリをRuby1.9で動かす方法

Open Source Conference24 Jan. 2009

藤岡岳之(xibbar)/(有)ラビックス日本Rubyの会/Rails勉強会@東北

Page 75: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

Hikiとは?Before Rails世代のwikiRubyだけで動く

Page 76: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

とりあえず1.8で動かす

svn co むにゃむにゃしhikiのためにとりあえずwebrick serverを用意hikiconf.rb.sampleをhikiconf.rbにコピーdataフォルダとcgiファイル名だけ設定

Page 77: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

1.8ではあっさり起動

1.8.6で起動している

Page 78: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

1.9ではどうかというと

日本語が入ったソースはマジックコメント必要

Page 79: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

というわけで追加

1行目にマジックコメントを追加する

--- hikiconf.rb.sample 2009-01-19 16:56:34.000000000 +0900+++ hikiconf.rb 2009-01-22 13:39:06.000000000 +0900@@ -1,3 +1,4 @@+# -*- coding: euc-jp -*- # $Id: hikiconf.rb.sample,v 1.20 2006-07-31 13:43:20 fdiary Exp $ # Copyright (C) 2002-2003 TAKEUCHI Hitoshi <[email protected]>

Page 80: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

Page 81: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

同じ類いのエラー

ちょいちょいとマジコメをつける

Page 82: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

エラーが出なくなるまでマジコメる

Page 83: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

別のエラーが出た

EUC-JPとASCII-8BITは合体できません

Page 84: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

外部encodingを変更

Encoding.default_externalのことIO型を開いたときに、読み込んだデータのencodingのデフォルト値ruby -Eeuc-jp sample.rbとオプションを渡す#!/usr/bin/ruby -Eeuc-jp とshebangで指定Encoding.default_external= で指定

これをつけると、open(“hoge”).readが自動的にEUC-JPになる

Page 85: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

WEBRickの設定を変更

hikiserver.rbで外部encodingを指定

rubybin = "#{ENV['HOME']}/local/bin/ruby19"

rubybin = "#{ENV['HOME']}/local/bin/ruby19 -Eeuc-jp"

Page 86: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

表示された

これだけで表示だけはされた

Page 87: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

表示はできるようだ

1.8で作成し、1.9での表示まではOK

Page 88: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

新規ページを作ってみる

新規ボタンを押すと、、、

Page 89: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

予定通りエラー

EUC-JPなんだから、CGI.newするときに受信するencodingを教えてあげるCGI::newでinitializeしてた。grepかけても見つからない訳だ。。。

Page 90: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

ページの作成

こんなエラーが出た

Page 91: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

探ってみると、hiki/db/tmarshal.rb の中を見ると

Array#to_sを使っている

Page 92: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

Array#to_sが違う

map/collectした結果をto_sとかやらないようにArray#joinを使うこと

% ruby -e 'puts ["aaa\nbbb","ccc\nddd"].to_s'aaabbbcccddd

% ruby19 -e 'puts ["aaa\nbbb","ccc\nddd"].to_s'["aaa\nbbb", "ccc\nddd"]

Page 93: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

PStoreの独自拡張

Hikiはpstoreを独自拡張して、オレオレtransactionを作成しているPTstore#transactionを丸ごとコメントして無効にしてやったら動いた

undefined method `commit_new' for #<PTStore:0x40bcbc>Please back to FrontPage.

Page 94: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

ひととおり動くように

wikiのページの閲覧、作成ができた

Page 95: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

まとめ

マジコメ(マジックコメント)をつけるEncoding.default_externalを指定するUTF-8以外の時は、CGI.newする時に:accept_charsetを指定するそれ以外は地道につぶすString#eachとか?

Page 96: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

第4章完

Page 97: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法

全体的なまとめ

cgi.rbも一応動くようにはなっているM17Nでハマらないように