2014年7月19日土曜日

Rubyでrequire 'pasori' したい話

ICカードリーダ/ライタ PaSoRi(RC-S320)を購入したので、libpafeをlibpafe-rubyでなんやかんやしてRubyで require 'pasori' したいなって思ったら苦労した話です。


環境とか

・Ubuntu 14.04 LTS(64bit)
・PaSoRi(RC-S320)
・ruby 2.1.2p95

ちなみに2014年7月19日です。

入力した内容

libpafe→libpafe-rubyの順番でコンパイルしていきます。

libpafe
$ sudo apt-get install libusb-dev

$ mkdir ~/tmp # 適当なディレクトリで

$ cd ~/tmp
$ wget http://homepage3.nifty.com/slokar/pasori/libpafe-0.0.8.tar.gz
$ tar zxvf libpafe-0.0.8.tar.gz
$ cd libpafe-0.0.8
$ ./configure
$ make
$ sudo make install

次にudevの設定をします。
$ cd /lib/udev/rules.d
と移動し、以下の内容を「pasori.rules」として保存します。($ sudo vim pasori.rules とかやって)
ACTION!="add", GOTO="pasori_rules_end"
SUBSYSTEM=="usb_device", GOTO="pasori_rules_start"
SUBSYSTEM!="usb", GOTO="pasori_rules_end"
LABEL="pasori_rules_start"

ATTRS{idVendor}=="054c", ATTRS{idProduct}=="01bb", MODE="0664", GROUP="plugdev"
ATTRS{idVendor}=="054c", ATTRS{idProduct}=="02e1", MODE="0664", GROUP="plugdev"

LABEL="pasori_rules_end"
それが完了したら、
$ sudo ln -s ../pasori.rules 010_pasori.rules
$ sudo udevadm control --reload-rules
とすることで、plugdev グループに属しているユーザであれば pasori を利用できるようになるようです。



libpafe-ruby
$ cd ~/tmp
$ wget http://homepage3.nifty.com/slokar/pasori/libpafe-ruby-0.0.8.tar.gz
$ tar zxvf libpafe-ruby-0.0.8.tar.gz
$ cd libpafe-ruby/
$ ruby extconf.rb
$ make
$ sudo make install

これでコンパイルは終了。
上記の操作だけでうまくいけばよいのですが、自分はうまくいきませんでした。

試しにirbでrequire 'pasori'したら以下のようなエラーメッセージが
LoadError: libpafe.so.0: wrong ELF class: ELFCLASS32 - /home/user/.rbenv/versions/2.1.2/lib/ruby/site_ruby/2.1.0/x86_64-linux/pasori.so
    from /home/user/.rbenv/versions/2.1.2/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /home/user/.rbenv/versions/2.1.2/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from (irb):3
    from /home/user/.rbenv/versions/2.1.2/bin/irb:11:in `<main>'

 

よくわからないので「wrong ELF class: ELFCLASS32」で調べます。

XAMPP for LinuxでXDebugを入れたら”wrong ELF class: ELFCLASS64”と言われる時の対処
Ubuntu 64bit で32bit バイナリのコンパイル

どうやらlibc6-dev-i386パッケージをインストールすれば、何もかもうまくいくらしいです。
あと、CFLAG=-m32というふうに環境変数をセットすると、これまたよいらしいです。
よって
$ sudo apt-get install libc6-dev-i386
とした後それぞれ同じ手順をやり直し、コンパイルする部分だけ以下のようにしてみます。

libpafe
$ CFLAGS=-m32 CPPFLAGS=-m32 ./configure
$ CFLAGS=-m32 CPPFLAGS=-m32 make
$ sudo make install CFLAGS=-m32 CPPFLAGS=-m32
libpafe-ruby
$ ruby extconf.rb
$ CFLAGS=-m32 make
$ sudo make install

結果、、、、、、、



うおおおおおおおおおおおおおおおおおおおおおおおおおおおお!!!!
できたああああああああああああああああああああああああああああ!!!!
✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

初心者なのでこれに2日間ぐらい悩みました…。疲れました…。


使用例

使用例はlibpafe-rubyのsampleディレクトリにあったりしました。
https://github.com/rfujita/libpafe-ruby/tree/master/sample

他にもラズパイでやってる方がいたので、ありがたく参考にさせていただきました。
Raspberry Piで交通系ICカードの残高を表示する
https://gist.github.com/Akkiesoft/6450764


おわりに

libpafeの方がうまくいかなかったらlibpasoriってやつを試そうと思ってました。

Ruby で PaSoRi 使ってみる
libpasori
libpafeはlibpasoriをもとに作られたらしいです。


参考ページ

Linux(Ubuntu)でPasoriを使う (ICOCA残高を読み取る)
libpafe GitHub
libpafe-ruby GitHub

0 件のコメント:

コメントを投稿