スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Ruby で引数によって生成するインスタンスを変更する

ファイルの処理をしていると、ファイル形式によって生成するインスタンスのクラスを変えたいことがあります。

利用例としてはこんなイメージ。 ただ、ここで、 とすると、initializeメソッドは値を返さないので、Orderクラスのインスタンスがorderに格納されてしまいます。

したがって、以下のように振り分けます。 なんのことはない、クラスメソッドの定義を行なっているだけですが、自分が結構な時間ハマったのでメモとして。

ここで、Orderクラスのサブクラスにはポリモーフィズムが適用されている前提である事は言うまでもない。
スポンサーサイト

Ruby UTF-8 から Shift_JIS(Windows-31j) へ変換するときにエラー

残念ながら、世の中はWindowsを中心に回っているため、CSVをやりとりするときには、文字コードをShiftJISにすることが求められたりします。


RubyプログラムをLinuxで書いていると文字コードは基本的にUTF8になるので、文字コード変換をする必要が出てくるわけですが、kconvやString#encode(Ruby 1.9以降)を使ってSJISに変換する際にエラーを吐かれる文字がいくつかあります。

詳しくは、下記の参考ページに書かれていますが、全角チルダ(ウェーブダッシュ,wave-dash)やハイフン(hyphen)、セントやポンドなどの記号が当てはまります。
文字コードで言うと、U+301C、U+2212、U+00A2、U+00A3、U+00AC、U+2014、U+2016あたりですね。

参考:マニアックなプログラミング備忘録「文字化けについて」


というわけで、文字列をkconvやString#encodeに投げる前に、これらの文字をSJISに変換できるようにするメソッドを作ってみました。
# メソッドの命名難しいorz

String#exchangeでは、「変換したいSJIS非互換文字」と「変換先のSJIS互換文字」の文字コードをそれぞれ"U+XXXX"の形で引数として受け取って、String#to_codeとInteger#chrを用いて文字に変換し、String#gsubでレシーバに含まれる全ての非互換文字を互換文字に置換します。

String#to_codeでは、"U+XXXX"という形の文字コードの16進数部分XXXXを10進数として取り出して返しています。

String#sjisableでは、それぞれの非互換文字を順に置換しているだけです。


実際の使い方としてはこんな感じです。


やっつけですが、動くのでよしとしましょう。

【追記】
String#exchangeはハッシュで と書いたほうがキレイなのか? とも思いましたが、どっちのほうがいいんですかね……。

Ruby 標準CSVライブラリ ダブルクォーテーション

RubyのCSV標準ライブラリを出力する際に、項目をダブルクォーテーション(")で囲みたくなったときの方法。

こんなふうにハッシュで「:force_quotes => true」指定してあげるといけます。


巷では遅い遅いと言われている標準ライブラリのCSV。
たしかに遅いです。

ただ、fasterCSVとかではパースできないCSV(カラムに改行を含むデータとか)もパースしてくれるので、個人的には大好きです。便利に使わせてもらってます。

全てのCSVがきちんと書かれていれば、このライブラリも、もっと速く動くように作れるんですけどね。

Ruby RVM インストールエラー

RVMでRubyを入れたら、エラー。

It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby.
ERROR: Loading command: install (LoadError)
cannot load such file -- zlib
ERROR: While executing gem ... (NameError)
uninitialized constant Gem::Commands::InstallCommand



この状態でgem list --localしてみると、gemがひとつも入っていない。

とりあえず、言われたとおりにlibyamlとzlibを入れて、Rubyを再インストール。

$ sudo apt-get install zlib1g-dev
$ sudo apt-get install libyaml-dev
$ rvm remove 1.9.3
$ rvm install 1.9.3



あとは、ここを参考に進めればおkです。

Ruby で キーを指定して sha256 ハッシュを作成する。

AmazonMWSのためのプログラムを書いていて調べたこと。

Rubyでハッシュを作成する際には、普通は標準ライブラリに入っているDigestを使えば良いので、 とでもすれば良い。
実際、MWSのHTTPヘッダに埋め込むMD5(Content-MD5)はこれで作成した。

ただ、HTTPのリクエスト行に含める署名(Signature)は自分の秘密鍵をキーにして、sha256でハッシュを作成しないといけない。
すると、キーを指定できないDigestは使えないことになる。

というわけで、いろいろ調べた結果、OpenSSLライブラリを使えば解決できることがわかった。
opensslの使い方は以下の通り。 この例では、文字列hogeを指定した秘密鍵でsha256ハッシュにしている。

試していないが、sha256以外の形式にも対応している模様。

《参考》
StackOverflow「Ruby and PHP HMACs not agreeing」
Ruby 1.9.3 リファレンスマニュアル「library openssl」

Ruby の builder が便利すぎる。

RubyでXMLを出力する必要があったのでメモ。

require 'builder/xmlmarkup'

xml = Builder::XmlMarkup.new(:indent => 2)
xml.instruct!

xml = xml.Hoge(:class => "test1") {
 xml.hogehoge "test2"
}


出力結果

<?xml version="1.0" encoding="UTF-8"?>
<Hoge class="test1">
 <hogehoge>test2</hogehoge>
</Hoge>


となる。

instruct!で<?xml version="1.0" encoding="UTF-8"?>を挿入して、あとは任意のエレメントを記述していくだけ。
エレメントは当然ネストできるし、配列にeachを使ったりして任意の回数だけ繰り返すこともできる。

べんり!

Exerb 正規表現

またExerbでハマりました。
忘れないうちにメモ。

やりたいこと。

"abc123" =~ /([0-9]*)/
p $1 # => "123"




普通に考えてこれは実行できるし、ターミナルで実行したところ、欲しいものを返してくれました。
しかし、このコードをexerbでコンパイルしようとするとmkexyすると、"123"ではなくnilが出力される。

いろいろ試行錯誤したんですが、面倒なので結果だけ書くと、

p "abc123".slice(/[0-9]*/,1)



で無事出力できました。

原因はよくわかりません。
教えてエロい人。

ちなみに、"abc123" =~ /([0-9]*)/ でマッチさせると、3が帰ってくるし、if文等の分岐では正常に動いていたので、正規表現というよりはキャプチャの問題みたいです。

if文でマッチするかどうか評価してそのままキャプチャしたかったので、コードが少し冗長になってしまいますが、とりあえず動くので良しとします。

ダックタイピングどころか、"羽がついてたら鳥なんじゃね?"くらいの気持ちで書いてます。
ばーどたいぴんぐ!

Exerb ruby 前回の対策

前回の「なんとかかんとか.dll」が見つかりません」というメッセージについて。

普通にレシピファイル(.exy)に該当ファイルを追加したら大丈夫でした。いえー!

ちなみに、レシピファイルに関してはここが詳しいよっと。
http://exerb.sourceforge.jp/man/doc/recipe.ja.html

Ruby Exerb ライブラリが含まれない

ExerbでRubyプログラムをコンパイルしたところ、いつも通り正常に終了。

しかし、他のマシンで動かしたところ、

libiconv2.dllが見つかりません。
ssleay32-1.0.0-msvcrt.dllが見つかりません。

などのエラーが縦続けに発生。

Google先生に聞いてみるも、iconv.so関連のエラーばかりひっかかる……orz

とりあえず、その場しのぎとして該当ファイルをRuby/binからコピーしてきてexeファイルと同じディレクトリに置くことによって応急処置。

なんとかしないと……。

ruby exerb kcode 文字コード

Exerbでexeを作る際の注意。

mkexyで作ったレシピファイルは文字コード設定が

kcode: none

になっているので、sjisとかを使っている場合は、

kcode: sjis

を指定する必要がある。

コンパイル対象ファイルで文字コード指定してても、レシピファイルにも指定する必要があるみたい。

Ruby Mechanize https SSL なんかそのへん。

なんかこのへんを参考に。

http://jimneath.org/2011/10/19/ruby-ssl-certificate-verify-failed.html
http://martinottenwaelter.fr/2010/12/ruby19-and-the-ssl-error/


RubyでWebクライアントを立ち上げるライブラリMechanizeでhttps://〜なサイトに接続しようとすると、

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B:certificate verify railed (OpenSSL::SSL::SSLError)

なるエラーを吐かれる。

Chromeで落とした証明書がおかしいのかもしれないと思い、FirefoxやIEで落とした証明書を使ってみるが、同様のエラー。
(ちなみに、IEは起動時に右クリックから「管理者権限で起動」を選ばないと証明書が保存出来なかった。Operaにいたっては、まったく保存出来なかった)

というわけで、ネットの海から証明書を拾うため徘徊していると、上に貼ったURLで「ca-bundle.crt」なる証明書を発見。
とりあえずダウンロードしてhttpsを叩く。

すると、あっさり成功。

やっぱり、頼るべきはGoogle先生だね!

Exerb ruby コンパイル時の注意

処理対象のファイルによって読み込むライブラリやファイルを変える際の注意。
(こんな書き方が良いのかどうか甚だ疑問だが)

ちゃんと調べてないが、mkexyする際に読み込まないライブラリは設定ファイルに書き込まれず、exerbでコンパイルするときにもコンパイル対象から漏れるみたい。

Ruby 実行可能形式 .exe にする。

Rubyで作ったプログラムを実行可能形式にするプログラムExerbを試した。

参考にしたサイト:
http://labs.torques.jp/2009/11/17/651/

対応しているRubyのバージョンは1.8。
自分で書いたYAMLは通らなかったため、特に問題がなければYAMLは自分で書かずにmkexyで作成するほうが良いみたい。
exeの動作環境は32bitとなっているが、64bitのWindows7でも動いた。ただ、今回はごく簡単な処理しかしていないので、他の処理をさせるとどうなるのかはわからない。

tag : ruby exerb exe

カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
検索フォーム
カテゴリ
月別アーカイブ
最新記事
最新コメント
最新トラックバック
RSSリンクの表示
QRコード
QR
リンク
アクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。