SWIGでRubyバインディング

2,527 views

Published on

Kanazawa.rb #4 LT資料

Published in: Technology

SWIGでRubyバインディング

  1. 1. SWIG で rubyバインディング Kanazawa.rb #4 LT 資料 井澤 ゆきみつ 「安心・安全・安定・信頼」できるインターネットサービスを12年12月2日日曜日
  2. 2. rubyバインディング • 特定のライブラリをrubyから使えるよう にすること。 • OpenCVもQtもなんでもかんでもrubyか ら使えるよね。 • 気になるライブラリがあるのに、rubyの gemが無いみたい…。 「安心・安全・安定・信頼」できるインターネットサービスを 212年12月2日日曜日
  3. 3. rubyバインディング • 特定のライブラリをrubyから使えるよう にすること。 • OpenCVもQtもなんでもかんでもrubyか ら使えるよね。 • 気になるライブラリがあるのに、rubyの gemが無いみたい…。 そんな時は、SWIG  で作っちゃおう!! 「安心・安全・安定・信頼」できるインターネットサービスを 212年12月2日日曜日
  4. 4. SWIGってなに? • Simplified  Wrapper  and  Interface  Generator • http://www.swig.org/ • 最新版は、2.0.8 • 対応⾔言語: C#,Java,Perl,PHP,Python,Ruby,Tclなど • brew  install  swig  でインスコできます。 「安心・安全・安定・信頼」できるインターネットサービスを 312年12月2日日曜日
  5. 5. 試しに使ってみましょう。 • libpuzzleをruby  から使えるようにしてみ ます。 「安心・安全・安定・信頼」できるインターネットサービスを 412年12月2日日曜日
  6. 6. libpuzzleとは? • 画像の類似度度を計算するライブラリ • http://www.pureftpd.org/project/ libpuzzle 「安心・安全・安定・信頼」できるインターネットサービスを 512年12月2日日曜日
  7. 7. libpuzzleとは? (2) • ライブラリの最新版は、0.11 • brew  install  libpuzzleでインスコできま す。 • /usr/local/include/puzzle.h • /usr/local/lib/libpuzzle.{a,so,dyld} 「安心・安全・安定・信頼」できるインターネットサービスを 612年12月2日日曜日
  8. 8. puzzle.i ファイルを作成する • ライブラリの関数をメソッドに変換するた めの情報を記述する。 %module  puzzle %{ #include  "/usr/local/include/puzzle.h" %} %include  /usr/local/include/puzzle.h 「安心・安全・安定・信頼」できるインターネットサービスを 712年12月2日日曜日
  9. 9. SWIGを実行する • swigコマンドを実⾏行行して、ライブラリ・ ラッパー⽤用のソースを⽣生成する。 %  swig  -‐‑‒ruby  puzzle.i →puzzle_̲wrap.c  が⽣生成される。 「安心・安全・安定・信頼」できるインターネットサービスを 812年12月2日日曜日
  10. 10. extconf.rb ファイルを作成する • そのマシンのruby  ⽤用のMakefileを作るた め。 require  "mkmf" $CFLAGS  +=  "  -‐‑‒Wall  " $LOCAL_̲LIBS  +=  "  -‐‑‒lpuzzle  " create_̲makefile("puzzle") 「安心・安全・安定・信頼」できるインターネットサービスを 912年12月2日日曜日
  11. 11. Makefileを生成する • ruby  で  extconf.rb  を実⾏行行して  Makefile を⽣生成する。 %  ruby  extconf.rb →Makefile  が⽣生成される。 「安心・安全・安定・信頼」できるインターネットサービスを 1012年12月2日日曜日
  12. 12. ラッパー・ライブラリを生成する • make  を実⾏行行してコンパイルする。 %  make →puzzle.bundleが⽣生成される。 %  make  install →puzzle.bundleがruby  のsite_̲rubyの下に インスコされる。 「安心・安全・安定・信頼」できるインターネットサービスを 1112年12月2日日曜日
  13. 13. 実験:二つの画像の類似度を測ってみる • lena画像を⼆二つ⽤用意する lena-256x256.jpg lena-inpaint.jpg 「安心・安全・安定・信頼」できるインターネットサービスを 1212年12月2日日曜日
  14. 14. まずはC言語でライブラリを使ってみる #include  <puzzle.h> int  main(int  argc,  char  *argv[])  {    PuzzleContext  context;    PuzzleCvec  cvec1,  cvec2;      double  d;    puzzle_̲init_̲context(&context);    puzzle_̲init_̲cvec(&context,  &cvec1);    puzzle_̲init_̲cvec(&context,  &cvec2);    puzzle_̲fill_̲cvec_̲from_̲file(&context,  &cvec1,  "lena-‐‑‒256x256.jpg");    puzzle_̲fill_̲cvec_̲from_̲file(&context,  &cvec2,  "lena-‐‑‒inpaint.jpg");    d  =  puzzle_̲vector_̲normalized_̲distance(&context,  &cvec1,  &cvec2,  1);    printf("%fn",  d);        return  0; 「安心・安全・安定・信頼」できるインターネットサービスを 13 }12年12月2日日曜日
  15. 15. まずはC言語でライブラリを使ってみる (2) • コンパイルして実⾏行行する。 %  gcc  -‐‑‒I/usr/local/include  -‐‑‒L/usr/local/lib  test.c    -‐‑‒o   puzzle  -‐‑‒lpuzzle %  ./puzzle 0.379903 「安心・安全・安定・信頼」できるインターネットサービスを 1412年12月2日日曜日
  16. 16. 同じコードをRubyで書いてみる require  puzzle context  =  Puzzle::PuzzleContext.new                                                             cvec1  =  Puzzle::PuzzleCvec.new                                                                       cvec2  =  Puzzle::PuzzleCvec.new Puzzle::puzzle_̲init_̲context(context)                                                 Puzzle::puzzle_̲init_̲cvec(context,  cvec1)                                                     Puzzle::puzzle_̲init_̲cvec(context,  cvec2)                                                     Puzzle::puzzle_̲fill_̲cvec_̲from_̲file(context,  cvec1,  "lena-‐‑‒256x256.jpg")         Puzzle::puzzle_̲fill_̲cvec_̲from_̲file(context,  cvec2,  "lena-‐‑‒inpaint.jpg")     d  =  Puzzle::puzzle_̲vector_̲normalized_̲distance(context,  cvec1,  cvec2,  1) puts  d.to_̲s 「安心・安全・安定・信頼」できるインターネットサービスを 1512年12月2日日曜日
  17. 17. 同じコードをRubyで書いてみる (2) • 実⾏行行する。 %  ruby  test.rb 0.3799032317485305 「安心・安全・安定・信頼」できるインターネットサービスを 1612年12月2日日曜日
  18. 18. 同じコードをRubyで書いてみる (2) • 実⾏行行する。 %  ruby  test.rb 0.3799032317485305Ruby  から  libpuzzle  を使えるようになった!! 「安心・安全・安定・信頼」できるインターネットサービスを 1612年12月2日日曜日
  19. 19. • Thank  You! • If  you  have  any  comments, • please  send  to: • Mail:  izawa@izawa.org  /  izawa@clwit.co.jp • Twitter:  @Yukimitsu_̲Izawa 「安心・安全・安定・信頼」できるインターネットサービスを 1712年12月2日日曜日

×