SlideShare a Scribd company logo
「安心・安全・安定・信頼」できるインターネットサービスを
株式会社クルウィット
井澤 志充
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

More Related Content

RubyからFFIを使ってみた