BLOGTIMES
» ArchiveList (Tag for "ruby" )
«Prev || 1 · 2 · 3 · 4 · 5 · 6 · 7 · 8 ·... | | Next»
2012/06/03

ISO-2022-JP と CP50220 と Encoding::UndefinedConversionError

ruby  charset 

Ruby は 1.9 から文字エンコード周りが変更されているので、先月も Encoding::CompatibilityError ではまってしまいましたが、今回は Encoding::UndefinedConversionError というエラーにどっぷりはまってしまいました。メールスプールのファイルを読み込むプログラムが書きたかったのですが、メールが厄介なのはファイルを開いてヘッダを調べてみないと文字コードが判別できないということです。バイト列から文字コードを自動的に検出すればいいのかもしれませんが、それはそれで結構手間がかかる*1ようです。

具体的に躓いたのは下記のような、所謂機種依存文字を含むようなメールでした。

test.eml

$ cat test.eml | nkf -w Message-ID: <4FCAFC7A.7020105@example.jp> Date: Sun, 03 Jun 2012 14:56:10 +0900 MIME-Version: 1.0 Subject: test Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit 11壱①Ⅰ

ISO-2022-JP じゃなくて CP50220 を使おう

結論だけ最初に述べると、メールのヘッダで ISO-2022-JP と指定されている場合には、Ruby ではエンコーディングとして CP50220 を使う必要があるということです。
これはちょうど Shift_JISとCP932 の違いの話の ISO-2022-JP 版ですね。

以下、作業メモ

[ISO-2022-JP と CP50220 と Encoding::UndefinedConversionError の続きを読む]

at 16:34 |
2012/06/01

バージョン指定で gem を使う

ruby 

gem で何か理由があって最新版以外のものを使いたいときには、下記のようにバージョンを指定してインストールことができます。

gem install -v 2.4.0

ところが、複数のバージョンの gem が導入されているときにそれを選択する方法がわからなくて困ったのでメモ。
こんな感じで gem というメソッドを使えばいいんですね。

require 'rubygems' gem 'mail', '2.4.0' require 'mail'

    at 20:08 |
    2012/06/01

    ruby-solr から rsolr へ乗り換え

    ruby  solr 

    久しぶりに Ruby から Solr を叩くプログラムを書こうと思って調べていたら solr-ruby が obsolete になっていた*1ので、後継として推奨されていた mwmitchell/rsolr を使うことにしました。
    インストールは gem install rsolr で一撃です。

    あとはこんな感じでプログラミングできるようです。

    require 'rubygems' require 'rsolr' solr = RSolr.connect :url => "http://solr.example.jp:8080/path/to/core" solr.add :id => "1", :body => "body" solr.commit

    今回の Solr マシンは Basic 認証がかかっているのですが、URLを下記のようにすれば Basic 認証してくれるようです。

    http://user:password@solr.example.jp:8080/path/to/core

    at 19:44 |
    2012/05/04

    ocra で Ruby スクリプトを exe に変換する

    ruby  windows 

    OCRA (One-Click Ruby Application)というツールを使うと windows 上で動く Ruby スクリプトを exe に変換出来るようなのでメモ。ちょっとしたツールを Ruby で書いたとしても、それを他人に配布したいと思ったときに Ruby の環境を用意してもらうのが大変だったりするのでそんなときに役立ちそうです。同様のツールとしては Exerb があったものの、こちらは意外と変換出来ないスクリプトが多かったりしたのですが、こちらはそれよりも成功率は高いみたいです。

    ocra-1.2.0 Documentation

    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窓が立ち上がらないようにすることができます。


      at 16:21 |
      2012/04/13

      ruby から外部プログラムの標準入出力を使う

      ruby  programming 

      Ruby から外部のプログラムを起動して、標準入力にデータを渡して、標準出力からデータを受け取る方法が分からなくてハマったのでメモ。
      IO.popen*1 を使えばいいみたいです。
      テストとして awk の FizzBuzz を ruby から呼び出すサンプルを書いてみました。

      awk_fizzbuzz.rb

      IO.popen('awk \'{print $0 % 15 ? $0 % 5 ? $0 %3 ? $0 : "Fizz" : "Buzz" : "FizzBuzz"}\'', 'r+') do |io| (1..20).each do |i| io.puts i end io.close_write while line = io.gets puts line end end

      なんの変哲もないコードですが、バッファされる関係があるので close_write を呼ぶのがミソですね。
      これを呼ばないと、コマンドに標準入力が渡らないので、 io.gets の部分でだんまりになってしまいます。


      at 18:56 |
      2012/04/08

      Encoding::CompatibilityError と ISO-2022-JP

      ruby  charset  programming 

      Ruby 1.9 でハマると厄介と聞いていた Encoding::CompatibilityError にとうとうやられてしまいました。
      どうも文字列を ISO-2022-JP にしてしまうと、文字列の結合等々が全くできなくなってしまうようです。

      $ irb irb(main):001:0> str = "てすと" => "てすと" irb(main):002:0> str_iso2022jp = str.encode('iso-2022-jp') => "\e\x24\x42\x24\x46\x24\x39\x24\x48\e\x28\x42" irb(main):003:0> str_iso2022jp + "a" Encoding::CompatibilityError: incompatible character encodings: ISO-2022-JP and UTF-8 from (irb):3 from /usr/local/bin/irb:12:in `<main>' irb(main):004:0> str_iso2022jp.gsub(/a/,'b') Encoding::CompatibilityError: incompatible encoding regexp match (US-ASCII regexp with ISO-2022-JP string) from (irb):5:in `gsub' from (irb):5 from /usr/local/bin/irb:12:in `<main>'

      ちょっとこの動作が良くわからなかったので調べてみたところ、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 に変換してから扱うことが推奨されます。

      ちょっとこれはメールを扱うときなんかには注意が必要ですね。


        at 21:32 |
        2012/04/02

        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として承認されました。

          at 22:35 |
          2012/03/24

          数値文字参照をデコードするワンライナー

          ruby  programming 

          先日、日本語が数値文字参照になってしまっている UTF-8 に戻す方法がないか尋ねられて、「これくらい気の利いたワンライナーでかけるはず・・・」と言ったものの、具体的なワンライナーが提示できずにちょっと悔しかったので、実際にワンライナーを書いてみました。こんな感じでしょうか。

          動作テスト

          $ cat test.xml | ruby -pe 'gsub(/&#(?:(\d*?)|(?:[xX]([0-9a-fA-F]{4})));/) { [$1.nil? ? $2.to_i(16) : $1.to_i].pack("U") }' <?xml version="1.0" encoding="ISO-8859-1"?> <root>てすと</root>

          テストデータ

          test.xml

          <?xml version="1.0" encoding="ISO-8859-1"?> <root>&#12390;&#12377;&#12392;</root>

          参考


            at 21:22 |
            2012/03/09

            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 に書いてあります。
            以下、プログラミングメモ。

            [mikel/mail を使ってメールから添付ファイルを切り離す の続きを読む]

              at 20:47 |
              2012/03/08

              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 でも同じようなものがあったような。


                at 20:46 |
                «Prev || 1 · 2 · 3 · 4 · 5 · 6 · 7 · 8 ·... | | Next»
                » ArchiveList (Tag for "ruby" )