RubyからFFIを使ってみた

Yukimitsu Izawa
Yukimitsu Izawa株式会社クルウィット
「安心・安全・安定・信頼」できるインターネットサービスを
株式会社クルウィット
井澤 志充
RubyからFFIを使ってみた
2014/3/15 (Sat)
Kanazawa.rb #19
@Cafe? IKAGAWA DO
「安心・安全・安定・信頼」できるインターネットサービスを
じこしょうかい
• (株)クルウィットの取締役  兼  北北陸陸⽀支社⻑⾧長  
• 博⼠士(情報科学)
!2
• ネットワークの委託研究・⾃自社サービス開発など  
• 井澤  志充  (いざわゆきみつ)
@Yukimitsu_Izawa
「安心・安全・安定・信頼」できるインターネットサービスを
じこしょうかい
• (株)クルウィットの取締役  兼  北北陸陸⽀支社⻑⾧長  
• 博⼠士(情報科学)
!2
• ネットワークの委託研究・⾃自社サービス開発など  
• 井澤  志充  (いざわゆきみつ)
• 最近、提督に就任しました  
@Yukimitsu_Izawa
「安心・安全・安定・信頼」できるインターネットサービスを
FFIとは
• FFI  (A  Portable  Foreign  Function  Interface  Library)  
!
• libffi  
• https://sourceware.org/libffi/  
!
• ffi  をサポートしている⾔言語  
• Python,  Java,  javascript,  Common  Lisp,  Scheme,  
Ruby
!3
「安心・安全・安定・信頼」できるインターネットサービスを
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
「安心・安全・安定・信頼」できるインターネットサービスを
install
!
% gem install ffi
Itʼ’s  very  simple  :)
!5
※SWIGと違って、ライブラリごとにnative  codeを  
compileして*.bundleをインストールする必要がない
「安心・安全・安定・信頼」できるインターネットサービスを
利用例
• 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 */
};
「安心・安全・安定・信頼」できるインターネットサービスを
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
「安心・安全・安定・信頼」できるインターネットサービスを
実行してみる
(前略)
:
protoent = Libc.getprotobynumber(41)
myent = Libc::Protoent.new(protoent)
p myent[:p_name]
!
#=> "ipv6"
!8
「安心・安全・安定・信頼」できるインターネットサービスを
実行してみる
(前略)
:
protoent = Libc.getprotobynumber(41)
myent = Libc::Protoent.new(protoent)
p myent[:p_name]
!
#=> "ipv6"
!8
簡単じゃね?
「安心・安全・安定・信頼」できるインターネットサービスを
使える型
• 代表的なもの
!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  
「安心・安全・安定・信頼」できるインターネットサービスを
まとめ
• native  libraryを簡単に使うにはFFIがお⼿手軽  
!
• getprotobynumber(3)を使った例例を紹介  
!
• 続きはWebで。(おググりくださいの意)
!10
「安心・安全・安定・信頼」できるインターネットサービスを
One more thing
• 最近、USBメモリを買いました。
!11
「安心・安全・安定・信頼」できるインターネットサービスを
なかなか面白いUSBメモリ
!12
• 中⾝身はSSDらしい。  
• 書き込みちょーはやいらしい  
• (公称  R:260MB/s,  W:240MB/s)  ←  ホント?
「安心・安全・安定・信頼」できるインターネットサービスを
なかなか面白い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)  ←  ホント?
「安心・安全・安定・信頼」できるインターネットサービスを
なかなか面白い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 ←ほぼ公称値出てる!
「安心・安全・安定・信頼」できるインターネットサービスを
• VMいれてそこから起動したり出来そう  
!
• Sandisk  USB3.0  超⾼高速  USB  128GB  Extreme  PRO  
Read  260MB/s  SDCZ88-‐‑‒128G  サンディスク  海外パッ
ケージ品  でおググりください  
• 市場価格で20,000円ぐらい
!13
「安心・安全・安定・信頼」できるインターネットサービスを
• Thank  You!  
• If  you  have  any  comments,  
• please  send  to:  
• Mail:  izawa@izawa.org  /  izawa@clwit.co.jp  
• Twitter:  @Yukimitsu_̲Izawa
!14
1 of 18

More Related Content

Similar to RubyからFFIを使ってみた(20)

IoTタグで遊んでみようIoTタグで遊んでみよう
IoTタグで遊んでみよう
Yukimitsu Izawa1.7K views
NTPを使ったDDoSについてNTPを使ったDDoSについて
NTPを使ったDDoSについて
Yukimitsu Izawa2.6K views
Sakura infini band-20180424Sakura infini band-20180424
Sakura infini band-20180424
さくらインターネット株式会社6.5K views
最新プロトコル HTT/2 とは最新プロトコル HTT/2 とは
最新プロトコル HTT/2 とは
Yukimitsu Izawa1.6K views
クラウドセキュリティ基礎クラウドセキュリティ基礎
クラウドセキュリティ基礎
Masahiro NAKAYAMA7.7K views
[Dots.]taiga[Dots.]taiga
[Dots.]taiga
Tatsunori Nishikori7.7K views
About AI(Machine Learning)About AI(Machine Learning)
About AI(Machine Learning)
SAKURA Internet Inc.1.2K views
docxをmdで書こうdocxをmdで書こう
docxをmdで書こう
Yukimitsu Izawa15.6K views
クラウドセキュリティ基礎 #seccampクラウドセキュリティ基礎 #seccamp
クラウドセキュリティ基礎 #seccamp
Masahiro NAKAYAMA4.6K views

More from Yukimitsu Izawa

テストとはテストとは
テストとはYukimitsu Izawa
1.9K views17 slides
RubyでDSLRubyでDSL
RubyでDSLYukimitsu Izawa
12.1K views33 slides
PowPow
PowYukimitsu Izawa
947 views11 slides
TryTry
TryYukimitsu Izawa
1.3K views32 slides

More from Yukimitsu Izawa(9)

RubyでオートマトンRubyでオートマトン
Rubyでオートマトン
Yukimitsu Izawa4.8K views
テストとはテストとは
テストとは
Yukimitsu Izawa1.9K views
RubyでDSLRubyでDSL
RubyでDSL
Yukimitsu Izawa12.1K views
PowPow
Pow
Yukimitsu Izawa947 views
RVM with Server EnvironmentRVM with Server Environment
RVM with Server Environment
Yukimitsu Izawa2K views
TryTry
Try
Yukimitsu Izawa1.3K views
rvm でbundlerと仲良くするrvm でbundlerと仲良くする
rvm でbundlerと仲良くする
Yukimitsu Izawa1.6K views
SWIGでRubyバインディングSWIGでRubyバインディング
SWIGでRubyバインディング
Yukimitsu Izawa3K views

RubyからFFIを使ってみた