tdiaryなどのレガシーウェブアプリをruby1.9で動かす方法
DESCRIPTION
TRANSCRIPT
![Page 1: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/1.jpg)
tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法
藤岡岳之(xibbar)/(有)ラビックス日本Rubyの会/Rails勉強会@東北
Open Source Conference24 Jan. 2009
![Page 2: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/2.jpg)
まずご容赦
今日発表する4人の中で唯一著作を持っていないことに気がついた大したヤツではありませんm(_ _)mつーか、3人(組)とも著作を持っているなんてすげーよ
おそらく、よくわからんマニアックな内容をグダグダと話すに違いないtDiaryがまじめに対応しそうなので、セッションのタイトルがピンチ
![Page 3: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/3.jpg)
自己紹介
福島市在住秋田県出身福島大学教育学部出身有限会社ラビックス社内では何でも屋もう7年もやってますRuby on Railsでソフト作っています
生粋の東北人です
![Page 4: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/4.jpg)
ちょっと本業の宣伝
中規模向けの携帯連絡網システム販売代理店を募集中収益の一部をRuby財団に寄付します(そんな組織ないけど)
![Page 5: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/5.jpg)
Rubyの活動
Matz Rubyのコミッタcgi.rbの担当のためだけのコミッタです(現状は)M17N関係のバグ報告はそれなりにしているつもり
Rails勉強会@東北日本Rubyの会関係に出没
![Page 6: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/6.jpg)
今日は福島から来ました
![Page 7: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/7.jpg)
牛タンのために
![Page 8: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/8.jpg)
Ruby会議のために
![Page 9: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/9.jpg)
というわけでアジェンダ
第1章 いかに1.9のcgi.rbが腐っていたか第2章 改良した結果、cgi.rbはこうなった第3章 1.9.1のM17Nはこうなった第4章 レガシーアプリはこうやって動かせ
![Page 10: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/10.jpg)
第1章
第1章 いかに1.9のcgi.rbが腐っていたか第2章 改良した結果、cgi.rbはこうなった第3章 1.9.1のM17Nはこうなった第4章 レガシーアプリはこうやって動かせ
![Page 11: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/11.jpg)
きっかけはReject会議
yuguiさんのセッション
![Page 12: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/12.jpg)
1.9を使ってみてください
RejectKaigiでのyuguiさんの布教活動バグレポートと人柱を必要としている
そろそろ使ってみようかな
![Page 13: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/13.jpg)
Redmineもあるし
バグの報告・機能拡張の提案ができるチケットに自動的になるMLに自動的に流れる誰かが担当者に振り、作業することになるcgi.rbだと、担当者が私になります
![Page 14: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/14.jpg)
1.8のcgi.rb
みんな使っているRuby on Railsでも使っている一応ちゃんと動く
![Page 15: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/15.jpg)
cgi.rbって何ぞや?
CGIアプリの開発を支援するライブラリこれがないと、Content-Typeなんとかと自力で出力する羽目になるこれがないと、「id=123&id=456&id=&str=%40h+%3D%7E+%2F%5E%24%2F」こんなのをオレオレunescapeする羽目になる
その他、機能いろいろあるけど省略
![Page 16: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/16.jpg)
みんなdisっているkwatchcgi.rb がイケてない 12 の理由(るびま)
Matzruby-listとかruby-devにて
mputruby-devあたりで
kakutani札幌Ruby会議にて
咳さん自分のブログで
![Page 17: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/17.jpg)
1.8のcgi.rbはここがダメ
テストがないマルチパートの時のデータの受け取り方が酷すぎる@cgi[‘name’].readみたいなやつ
遅い
これらは改良したいなぁ
![Page 18: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/18.jpg)
1.9のcgi.rb誰も使っていない積極的メンテナがいない2006年には捨てたいと言われている
![Page 19: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/19.jpg)
まだcgi.rbを使いたい
既存のアプリがあるcgi.rbのお手軽さもよく知っている
世の中の流れはRackに行っているけど、Rackにはないお手軽さもあるよRack => Web Server Gateway Interface
![Page 20: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/20.jpg)
cgi.rbでhello world
![Page 21: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/21.jpg)
コンソールで実行すると
素直でいい子だこの挙動がcgiの基本だと思う
![Page 22: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/22.jpg)
そして、1.9で使ってみる
![Page 23: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/23.jpg)
まず、hello world
お、出るじゃん♪
![Page 24: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/24.jpg)
次、日本語
単純に日本語にして、実行してみる
![Page 25: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/25.jpg)
いつものエラー
いつものエラー。こんな時はコンソールだ。
![Page 26: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/26.jpg)
コンソールでデバッグ
これって、M17Nのエラー気を取り直して、ソースコードのエンコーディングを教えてやるマジックコメントを追加
![Page 27: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/27.jpg)
マジックコメントを追加
マジックコメントを追加し、ソースのEncodingを教えてやる
![Page 28: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/28.jpg)
例外は回避したけど、
肝心の牛タンが表示されていない!
![Page 29: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/29.jpg)
正しくはこう
コンソールで見てみよう
![Page 30: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/30.jpg)
コンソールでの出力結果
予想通り、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で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/31.jpg)
ここまでの感想
この程度のことも修正されていないなんて、本当に誰も使っていないんだなcgi.rbは1.9.1のリリース前に削除されてしまうのではないだろうか?こんな動かないライブラリ、ない方がいいでしょ?
![Page 32: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/32.jpg)
早速行動
IRCに報告usaさんがfix
でも、まともに動かすには大幅なテコ入れが必要だkwatchさんのcgialtを参考に入れ替えたいこっそり、1.8のテストも入れたい
![Page 33: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/33.jpg)
テコ入れのステップ
まず、cgi.rbにテストを導入改造する前にテストを書け by naruseさんでも、これは手間取った1.8とテストは共通では無理
cgi.rb本体をファイル分割その他、問題を修正する改善できる機能を改善する
![Page 34: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/34.jpg)
第1章完
![Page 35: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/35.jpg)
第2章
第1章 いかに1.9のcgi.rbが腐っていたか第2章 改良した結果、cgi.rbはこうなった第3章 1.9.1のM17Nはこうなった第4章 レガシーアプリはこうやって動かせ
![Page 36: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/36.jpg)
cgi.rbを読んだ感想
チャレンジなコードが多い気がするRubyはこんな変な機能があるから使っておけ!みたいな(例えば、継承の方がいいのに、Delegateを使ってみたり)
スピードのことは丸っきり考慮がない当時は、スピードが要求される場合はRubyを使ってはいけなかったんだと思う“aaa”+“bbb” => “aaa”<<“bbb” の方が早い
![Page 37: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/37.jpg)
大まかな変更点テストが追加(使う人は関係ないかも)CGI.newするときに受け取るエンコーディングを指定する(デフォルトはUTF-8)CGI.newにブロックを与えて、例外処理を行うことができるマルチパートのデータの受け取りは、IO型ではなくなった救済措置として、readメソッドをくっつけている
CGI#outでencodingの変換はしなくなったスピードアップをがんばった
![Page 38: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/38.jpg)
テストが追加
今後もメンテナンスされていく上で、最も重要なポイントkwatchさんのCGIAltのコードを大分参考にしている
CGIというのは標準入力からデータを受け取り、標準出力に出力する
横取りする
![Page 39: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/39.jpg)
横取り方法
標準入力の横取り
![Page 40: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/40.jpg)
UTF8なCGIアプリ
挙動を実演(hello_world4.rb)
![Page 41: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/41.jpg)
EUC-JPなCGIアプリ
挙動を実演(hello_world5.rb)
![Page 42: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/42.jpg)
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で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/43.jpg)
encodingを指定する
受け取るencodingを指定する必要があるオプションはHashで指定するようにした
hello_world6.rb
![Page 44: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/44.jpg)
例外じゃいやだencodingの例外を入れておく器
encodingの例外を入れる処理をブロックで渡してしまう
encodingをチェックし、変換できそうだったら変換
hello_world7.rb
![Page 45: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/45.jpg)
面倒になった気もするが、
![Page 46: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/46.jpg)
UTF-8で書いておけ
![Page 47: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/47.jpg)
multipart form on 1.8
受け取ったデータはIO型であることに注目この仕様はひどすぎると思う
hello_world8.rb
![Page 48: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/48.jpg)
multipart form on 1.9
ある程度、互換性は保ちたいでも、この酷い仕様はやめてStringにする
そーだ、String型にselfを返すreadを特異メソッドでくっつけてしまおう
define_method(:read){self}
![Page 49: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/49.jpg)
受取データはString
Stringになったので、これだけでOK
hello_world9.rb
![Page 50: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/50.jpg)
CGI#filesでファイル一覧
CGI#filesでHash形式でアップロードされたファイルを一式取得できる
hello_world10.rb
![Page 51: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/51.jpg)
好き放題やっている
cgi.rbはコミッタの間で利用者が少ない特に、タグ生成メソッドあたりは好き放題できるライバルはhamlだと思っている
RSSの配信なんかもcgi.rbでささっと出力するのが楽だと思うもっと早くしたいもっとよくしたい(会社が暇な時期に)
![Page 52: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/52.jpg)
第2章完
![Page 53: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/53.jpg)
第3章
第1章 いかに1.9のcgi.rbが腐っていたか第2章 改良した結果、cgi.rbはこうなった第3章 1.9.1のM17Nはこうなった第4章 レガシーアプリはこうやって動かせ
![Page 54: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/54.jpg)
文字数をカウントする1.8の時代
"牛タン".split(//u).size=> 3
1.9の時代irb> "牛タン".size=> 3irb> "牛タン".bytesize=> 9
Rubyは真の国際言語へ!
![Page 55: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/55.jpg)
重要なこと
RubyのM17Nの大前提です
StringのインスタンスがEncoding情報を持つようになった
irb(main):001:0> "ほげ"=> "ほげ"irb(main):002:0> "ほげ".encoding=> #<Encoding:UTF-8>
![Page 56: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/56.jpg)
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で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/57.jpg)
Encodingクラス
Encoding.list # 有効なEncoding一覧Encoding.find(encoding) # encodingが有効かどうか調べるEncoding.default_external # デフォルト外部エンコーディングEncoding.default_internal # デフォルト内部エンコーディング(xibbarは説明できない)
デフォルトエンコーディングは代入できるのだが、あまりしない方がいいと思う
![Page 58: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/58.jpg)
Encodingの種類
US-ASCII # ABab123などの7bit ASCII文字列ASCII-8BIT # バイナリだと思ってOKUTF-8、EUC-JP、SJISなど(説明省略)
![Page 59: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/59.jpg)
外部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で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/60.jpg)
外部Encodingをキメる
コマンドラインで与えるshebang行で指定する代入する(非推奨だと思う)環境変数(LANGとか)
% ruby19 -Eeuc-jp sample.rb
#!/usr/bin/ruby19 -Eeuc-jp #<=shebang行
Encoding.default_external=
![Page 61: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/61.jpg)
String#encode
文字列をencodeする破壊的に変換するので注意
irb> "ほげ"=> "ほげ"irb> "ほげ".encoding=> #<Encoding:UTF-8>irb> "ほげ".encode("EUC-jp")"?ۿ?" <=
![Page 62: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/62.jpg)
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で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/63.jpg)
String#valid_encoding?
Encoding情報が正しいかをチェックする
irb> "牛タン".valid_encoding?=> trueirb> "牛タン".force_encoding("EUC-JP").valid_encoding?=> false
![Page 64: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/64.jpg)
合体 その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で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/65.jpg)
合体 その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で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/66.jpg)
文字列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で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/67.jpg)
マジックコメント
ソースコードのエンコーディングを明示するこれがないとRubyはソースに埋め込んである文字列のencodingがわからない1.8の時はバイト列扱いだった
2種類あるemacs方式(# -*- coding: utf-8 -*-)vim方式(# vim:fileencoding=UTF-8)
![Page 68: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/68.jpg)
まとめ
Stringは常にEncoding情報を持っていることを意識しようStringをファイルなりDBなりに保存するときは、データを保存したいのか、Encodingごと保存したいのかを考えよう日本語を含む場合はマジコメ(マジックコメント)を忘れずにつけよう
![Page 69: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/69.jpg)
第3章完
![Page 70: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/70.jpg)
第3章
第1章 いかに1.9のcgi.rbが腐っていたか第2章 改良した結果、cgi.rbはこうなった第3章 1.9.1のM17Nはこうなった第4章 レガシーアプリはこうやって動かせ
![Page 71: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/71.jpg)
tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法
藤岡岳之(xibbar)/(有)ラビックス日本Rubyの会/Rails勉強会@東北
Open Source Conference24 Jan. 2009
![Page 72: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/72.jpg)
tDiaryが1.9に対応しそうだ
![Page 73: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/73.jpg)
あっさり転身
![Page 74: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/74.jpg)
tDiary HikiなどのレガシーウェブアプリをRuby1.9で動かす方法
Open Source Conference24 Jan. 2009
藤岡岳之(xibbar)/(有)ラビックス日本Rubyの会/Rails勉強会@東北
![Page 75: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/75.jpg)
Hikiとは?Before Rails世代のwikiRubyだけで動く
![Page 76: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/76.jpg)
とりあえず1.8で動かす
svn co むにゃむにゃしhikiのためにとりあえずwebrick serverを用意hikiconf.rb.sampleをhikiconf.rbにコピーdataフォルダとcgiファイル名だけ設定
![Page 77: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/77.jpg)
1.8ではあっさり起動
1.8.6で起動している
![Page 78: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/78.jpg)
1.9ではどうかというと
日本語が入ったソースはマジックコメント必要
![Page 79: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/79.jpg)
というわけで追加
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で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/80.jpg)
次
![Page 81: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/81.jpg)
同じ類いのエラー
ちょいちょいとマジコメをつける
![Page 82: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/82.jpg)
エラーが出なくなるまでマジコメる
![Page 83: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/83.jpg)
別のエラーが出た
EUC-JPとASCII-8BITは合体できません
![Page 84: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/84.jpg)
外部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で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/85.jpg)
WEBRickの設定を変更
hikiserver.rbで外部encodingを指定
rubybin = "#{ENV['HOME']}/local/bin/ruby19"
rubybin = "#{ENV['HOME']}/local/bin/ruby19 -Eeuc-jp"
![Page 86: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/86.jpg)
表示された
これだけで表示だけはされた
![Page 87: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/87.jpg)
表示はできるようだ
1.8で作成し、1.9での表示まではOK
![Page 88: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/88.jpg)
新規ページを作ってみる
新規ボタンを押すと、、、
![Page 89: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/89.jpg)
予定通りエラー
EUC-JPなんだから、CGI.newするときに受信するencodingを教えてあげるCGI::newでinitializeしてた。grepかけても見つからない訳だ。。。
![Page 90: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/90.jpg)
ページの作成
こんなエラーが出た
![Page 91: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/91.jpg)
探ってみると、hiki/db/tmarshal.rb の中を見ると
Array#to_sを使っている
![Page 92: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/92.jpg)
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で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/93.jpg)
PStoreの独自拡張
Hikiはpstoreを独自拡張して、オレオレtransactionを作成しているPTstore#transactionを丸ごとコメントして無効にしてやったら動いた
undefined method `commit_new' for #<PTStore:0x40bcbc>Please back to FrontPage.
![Page 94: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/94.jpg)
ひととおり動くように
wikiのページの閲覧、作成ができた
![Page 95: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/95.jpg)
まとめ
マジコメ(マジックコメント)をつけるEncoding.default_externalを指定するUTF-8以外の時は、CGI.newする時に:accept_charsetを指定するそれ以外は地道につぶすString#eachとか?
![Page 96: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/96.jpg)
第4章完
![Page 97: tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法](https://reader031.vdocuments.site/reader031/viewer/2022020115/54bd19124a7959135f8b45fb/html5/thumbnails/97.jpg)
全体的なまとめ
cgi.rbも一応動くようにはなっているM17Nでハマらないように