- blogs:
- cles::blog
ISO-2022-JP と CP50220 と Encoding::UndefinedConversionError
ruby
charset Ruby は 1.9 から文字エンコード周りが変更されているので、先月も Encoding::CompatibilityError ではまってしまいましたが、今回は Encoding::UndefinedConversionError というエラーにどっぷりはまってしまいました。メールスプールのファイルを読み込むプログラムが書きたかったのですが、メールが厄介なのはファイルを開いてヘッダを調べてみないと文字コードが判別できないということです。バイト列から文字コードを自動的に検出すればいいのかもしれませんが、それはそれで結構手間がかかる*1ようです。
具体的に躓いたのは下記のような、所謂機種依存文字を含むようなメールでした。
test.eml
† ISO-2022-JP じゃなくて CP50220 を使おう
結論だけ最初に述べると、メールのヘッダで ISO-2022-JP と指定されている場合には、Ruby ではエンコーディングとして CP50220 を使う必要があるということです。
これはちょうど Shift_JISとCP932 の違いの話の ISO-2022-JP 版ですね。
以下、作業メモ
バージョン指定で gem を使う
ruby gem で何か理由があって最新版以外のものを使いたいときには、下記のようにバージョンを指定してインストールことができます。
ところが、複数のバージョンの gem が導入されているときにそれを選択する方法がわからなくて困ったのでメモ。
こんな感じで gem というメソッドを使えばいいんですね。
ruby-solr から rsolr へ乗り換え
ruby
solr 久しぶりに Ruby から Solr を叩くプログラムを書こうと思って調べていたら solr-ruby が obsolete になっていた*1ので、後継として推奨されていた mwmitchell/rsolr を使うことにしました。
インストールは gem install rsolr で一撃です。
あとはこんな感じでプログラミングできるようです。
今回の Solr マシンは Basic 認証がかかっているのですが、URLを下記のようにすれば Basic 認証してくれるようです。
ocra で Ruby スクリプトを exe に変換する
ruby
windows OCRA (One-Click Ruby Application)というツールを使うと windows 上で動く Ruby スクリプトを exe に変換出来るようなのでメモ。ちょっとしたツールを Ruby で書いたとしても、それを他人に配布したいと思ったときに Ruby の環境を用意してもらうのが大変だったりするのでそんなときに役立ちそうです。同様のツールとしては Exerb があったものの、こちらは意外と変換出来ないスクリプトが多かったりしたのですが、こちらはそれよりも成功率は高いみたいです。
REQUIREMENTS:
Windows
Working Ruby installation, tested with:
One-Click Installer (187_27_rc2)
RubyInstaller (1.8.7p299, 1.9.1p249, 1.9.2p0)
MinGW Installation (when working with the source code only)
上記の要求に従って RubyInstaller for Windows で Ruby をインストールして DevKit もセットアップしておきます。ocra 自身のインストールは gem install orca とするだけです。
使い方は ocra example.rb とすれば、ディレクトリに example.exe ができるので、これを他人に配布することができます。圧縮されてはいますが、殆ど何もしないアプリでも 3M くらいの大きさになるのでファイルサイズはちょっと大きめ。--windows オプションをつけると ruby.exe → rubyw.exe を使うようになるので、起動時にDOS窓が立ち上がらないようにすることができます。
ruby から外部プログラムの標準入出力を使う
ruby
programming Ruby から外部のプログラムを起動して、標準入力にデータを渡して、標準出力からデータを受け取る方法が分からなくてハマったのでメモ。
IO.popen*1 を使えばいいみたいです。
テストとして awk の FizzBuzz を ruby から呼び出すサンプルを書いてみました。
awk_fizzbuzz.rb
なんの変哲もないコードですが、バッファされる関係があるので close_write を呼ぶのがミソですね。
これを呼ばないと、コマンドに標準入力が渡らないので、 io.gets の部分でだんまりになってしまいます。
Encoding::CompatibilityError と ISO-2022-JP
ruby
charset
programming Ruby 1.9 でハマると厄介と聞いていた Encoding::CompatibilityError にとうとうやられてしまいました。
どうも文字列を ISO-2022-JP にしてしまうと、文字列の結合等々が全くできなくなってしまうようです。
ちょっとこの動作が良くわからなかったので調べてみたところ、Rubyで ISO-2022-JP は Dummy Encoding として扱われていて結合や比較ができないんですね。
Rubyist Magazine - Ruby M17N の設計と実装
Dummy Encoding
ダミーエンコーディングは Ruby が名前を知っているだけのエンコーディングです。Ruby はただバイト列としてのみこれらを扱い、文字列としてのサポートは一切提供されません。もちろん ASCII のみの文字列との結合・比較等も行うことができません。もっぱらステートフルなエンコーディングがこれにあたり、Ruby 1.9.1 では ISO-2022-JP や UTF-7 がこれに該当します。これらのエンコーディングを Ruby で扱う場合は、stateless-ISO-2022-JP や UTF-8 に変換してから扱うことが推奨されます。
ちょっとこれはメールを扱うときなんかには注意が必要ですね。
Ruby が ISO/IEC 30170 に
ruby
ipa
standardization 昨年の3月に JIS X 3017 となっていた Ruby ですが ISO/IEC 30170 として承認されたようです。
ISO のページは 「ISO/IEC FDIS 30170 - Information technology -- Programming languages -- Ruby」 のようです。
情報処理推進機構:プレス発表:記事:プログラム言語Ruby、国際規格として承認
IPA(独立行政法人情報処理推進機構、理事長:藤江 一正)は、2008年にRuby標準化検討ワーキンググループ(委員長:中田 育男 筑波大学名誉教授)を設置し、Rubyの言語仕様の国際規格化へ向けた事業を進めてきましたが、この度、2012年3月31日に締め切られた国際規格承認のための最終投票の結果、Rubyが国際規格ISO/IEC 30170として承認されました。
数値文字参照をデコードするワンライナー
ruby
programming 先日、日本語が数値文字参照になってしまっている UTF-8 に戻す方法がないか尋ねられて、「これくらい気の利いたワンライナーでかけるはず・・・」と言ったものの、具体的なワンライナーが提示できずにちょっと悔しかったので、実際にワンライナーを書いてみました。こんな感じでしょうか。
† 動作テスト
† テストデータ
test.xml
† 参考
mikel/mail を使ってメールから添付ファイルを切り離す
ruby
programming 久しぶりに Ruby でマルチパートメールの処理をしようと思っていろいろ調べてみたら mikel/mail というライブラリを見つけたのでちょっとおためし。
Mail: An All New Ruby E-mail Library
To date, the main ways to send e-mails from Ruby have been Net::SMTP, TMail, and Rails' ActionMailer (which uses TMail). Now, however, there's a fourth option, the simply named "mail" by Mikel Lindsaar.
インストールは gem install mail で一撃なので楽チン。
基本的な使い方は README.md に書いてあります。
以下、プログラミングメモ。
GitHub から Action Required - SSH Key Vulnerability というメールが
ruby GitHub から Action Required - SSH Key Vulnerability というメールが届いていたのでびっくりして調べてみたら下記のようなことだったようです。
GitHubのセキュリティホールがふさがったのでSSH Keyを確認しよう - ただのにっき(2012-03-08)
先日、Railsアプリにありがちなセキュリティホールがあることが判明したGitHub。詳細は@sora_hによる「github の mass assignment 脆弱性が突かれた件」が非常によくまとまっているので参照のこと。脆弱性の内容そのものもだけど、開発者として脆弱性指摘をどのように受容、対応すべきかを考えさせられる事例だった。
GitHub からは Public Key Security Vulnerability and Mitigation GitHub というリリースが出ています。
mass assignment 脆弱性って確か php でも同じようなものがあったような。
- sadpkv
- CACHEMANAGER.phpというのはどうだろうかと
- pairb1m
- Lightning のToDoリストを複数のPCで共有できるアドオン
- majodca
- 九州旅行から帰ってきました
- majodca
- 九州旅行から帰ってきました
- hot534
- yum を使って OpenVPN をインストールする
- dresssu3
- NP_Trackbackを騙るトラックバックspamについて
- zippern7o
- NP_SpamBayesJP jp1b
- park81o
- Google Docs をメールフォームとして使う
- fogmpl
- なんで官庁の文章はPDFなんだろうか
- cutjw9
- 即席スライドショーを作る
- frightenlho
- 添付ファイルの容量を表示する「Attachment Sizes」
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(5064)
3 . GitHub が全ての公開リポジトリへのシークレットスキャンを有効に(4200)
4 . 年次の人間ドックへ(4132)
5 . 2023 年分の確定申告完了!(1つめ)(3990)
Academic[574]
Book[155]
Diary[522]
Disaster[101]
Foodlogue[1425]
Game[284]
Goods[805]
Healthcare[341]
Hobby[32]
IT[1195]
Military[343]
misc.[1570]
Mobile[510]
Music[38]
Neta[106]
News[95]
Photo[391]
RealEstate[120]
Security[1178]
SEO Contest[36]
Software[634]
Tips[1886]
Travelogue[1238]
Web[675]
Work[193]