RubyからFFIを使ってみた

2,252 views
2,019 views

Published on

Using Ruby FFI (A Portable Foreign Function Interface Library)

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,252
On SlideShare
0
From Embeds
0
Number of Embeds
36
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

RubyからFFIを使ってみた

  1. 1. 「安心・安全・安定・信頼」できるインターネットサービスを 株式会社クルウィット 井澤 志充 RubyからFFIを使ってみた 2014/3/15 (Sat) Kanazawa.rb #19 @Cafe? IKAGAWA DO
  2. 2. 「安心・安全・安定・信頼」できるインターネットサービスを じこしょうかい • (株)クルウィットの取締役  兼  北北陸陸⽀支社⻑⾧長   • 博⼠士(情報科学) !2 • ネットワークの委託研究・⾃自社サービス開発など   • 井澤  志充  (いざわゆきみつ) @Yukimitsu_Izawa
  3. 3. 「安心・安全・安定・信頼」できるインターネットサービスを じこしょうかい • (株)クルウィットの取締役  兼  北北陸陸⽀支社⻑⾧長   • 博⼠士(情報科学) !2 • ネットワークの委託研究・⾃自社サービス開発など   • 井澤  志充  (いざわゆきみつ) • 最近、提督に就任しました   @Yukimitsu_Izawa
  4. 4. 「安心・安全・安定・信頼」できるインターネットサービスを FFIとは • FFI  (A  Portable  Foreign  Function  Interface  Library)   ! • libffi   • https://sourceware.org/libffi/   ! • ffi  をサポートしている⾔言語   • Python,  Java,  javascript,  Common  Lisp,  Scheme,   Ruby !3
  5. 5. 「安心・安全・安定・信頼」できるインターネットサービスを ruby-ffi • https://github.com/ffi/ffi   ! • 上記URLより:   • Intuitive  DSL   • Support  All  C  native  types   • C  structs  (also  nested),  enums  and  global  variables   • Callbacks  from  C  to  ruby   • Automatic  garbage  collection  of  native  memory   ! • FFIを使って、ダイナミックリンクライブラリをruby  から 呼べるってこと !4
  6. 6. 「安心・安全・安定・信頼」できるインターネットサービスを install ! % gem install ffi Itʼ’s  very  simple  :) !5 ※SWIGと違って、ライブラリごとにnative  codeを   compileして*.bundleをインストールする必要がない
  7. 7. 「安心・安全・安定・信頼」できるインターネットサービスを 利用例 • getprotobynumber(3)  をruby  から使ってみる。   • /etc/protocols  データベースを読む関数 !6 (manより抜粋)   LIBRARY            Standard  C  Library  (libc,  -‐‑‒lc)   ! SYNOPSIS            struct protoent * getprotobynumber(int proto); ! struct protoent { char *p_name; /* official name of protocol */ char **p_aliases; /* alias list */ int p_proto; /* protocol number */ };
  8. 8. 「安心・安全・安定・信頼」できるインターネットサービスを module Libc extend FFI::Library ffi_lib FFI::Library::LIBC # FFI::Library::LIBC #=> "libc.dylib" # or ffi_lib 'c' # or ffi_lib "/usr/lib/libc.dylib" ! attach_function :getprotobynumber, [:int], :pointer # or attach_function :my_func_name, :getprotobynumber, [:int], :pointer class Protoent < FFI::Struct layout( :p_name, :string, :p_aliases, :pointer, :p_proto, :int ) end end !7
  9. 9. 「安心・安全・安定・信頼」できるインターネットサービスを 実行してみる (前略) : protoent = Libc.getprotobynumber(41) myent = Libc::Protoent.new(protoent) p myent[:p_name] ! #=> "ipv6" !8
  10. 10. 「安心・安全・安定・信頼」できるインターネットサービスを 実行してみる (前略) : protoent = Libc.getprotobynumber(41) myent = Libc::Protoent.new(protoent) p myent[:p_name] ! #=> "ipv6" !8 簡単じゃね?
  11. 11. 「安心・安全・安定・信頼」できるインターネットサービスを 使える型 • 代表的なもの !9 :char and :uchar - 8 bit signed and unsigned values :short and :ushort - 16 bit signed and unsigned values :int and :uint - 32 bit signed and unsigned values :long_long and :ulong_long - 64 bit signed and unsigned values :string - C string, NULL terminated. :pointer - a C pointer 他にも :bool , :size_t, :in_addr_t とかいろいろ 参照:    https://github.com/ffi/ffi/wiki/Types  
  12. 12. 「安心・安全・安定・信頼」できるインターネットサービスを まとめ • native  libraryを簡単に使うにはFFIがお⼿手軽   ! • getprotobynumber(3)を使った例例を紹介   ! • 続きはWebで。(おググりくださいの意) !10
  13. 13. 「安心・安全・安定・信頼」できるインターネットサービスを One more thing • 最近、USBメモリを買いました。 !11
  14. 14. 「安心・安全・安定・信頼」できるインターネットサービスを なかなか面白いUSBメモリ !12 • 中⾝身はSSDらしい。   • 書き込みちょーはやいらしい   • (公称  R:260MB/s,  W:240MB/s)  ←  ホント?
  15. 15. 「安心・安全・安定・信頼」できるインターネットサービスを なかなか面白いUSBメモリ % ls -l FreeBSD-10.0-RELEASE-amd64-dvd1.iso -rw-r—r-- 1 izawa staff 2484742144 3 14 23:52 ! % time cp FreeBSD-10.0-RELEASE-amd64-dvd1.iso /Volumes/SANDISK ! 0.00s user 1.72s system 16% cpu 10.364 total !12 • 中⾝身はSSDらしい。   • 書き込みちょーはやいらしい   • (公称  R:260MB/s,  W:240MB/s)  ←  ホント?
  16. 16. 「安心・安全・安定・信頼」できるインターネットサービスを なかなか面白いUSBメモリ % ls -l FreeBSD-10.0-RELEASE-amd64-dvd1.iso -rw-r—r-- 1 izawa staff 2484742144 3 14 23:52 ! % time cp FreeBSD-10.0-RELEASE-amd64-dvd1.iso /Volumes/SANDISK ! 0.00s user 1.72s system 16% cpu 10.364 total !12 • 中⾝身はSSDらしい。   • 書き込みちょーはやいらしい   • (公称  R:260MB/s,  W:240MB/s)  ←  ホント? 2484742144 ÷ 10.364 =239747408.72250096487842531840 ≒ 239.7MB/s ←ほぼ公称値出てる!
  17. 17. 「安心・安全・安定・信頼」できるインターネットサービスを • VMいれてそこから起動したり出来そう   ! • Sandisk  USB3.0  超⾼高速  USB  128GB  Extreme  PRO   Read  260MB/s  SDCZ88-‐‑‒128G  サンディスク  海外パッ ケージ品  でおググりください   • 市場価格で20,000円ぐらい !13
  18. 18. 「安心・安全・安定・信頼」できるインターネットサービスを • Thank  You!   • If  you  have  any  comments,   • please  send  to:   • Mail:  izawa@izawa.org  /  izawa@clwit.co.jp   • Twitter:  @Yukimitsu_̲Izawa !14

×