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

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

Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Yukimitsu Izawa
 
NTPを使ったDDoSについて
NTPを使ったDDoSについてNTPを使ったDDoSについて
NTPを使ったDDoSについて
Yukimitsu Izawa
 
オープンソースで作る動画配信サイト OSC2013名古屋
オープンソースで作る動画配信サイト OSC2013名古屋オープンソースで作る動画配信サイト OSC2013名古屋
オープンソースで作る動画配信サイト OSC2013名古屋
Masaki Goto
 

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

IoTタグで遊んでみよう
IoTタグで遊んでみようIoTタグで遊んでみよう
IoTタグで遊んでみよう
 
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
 
経営者・マネージャーが知るべき情報セキュリティ
経営者・マネージャーが知るべき情報セキュリティ経営者・マネージャーが知るべき情報セキュリティ
経営者・マネージャーが知るべき情報セキュリティ
 
IoT時代のセキュアなクラウドインフラ構築術 #seccamp
IoT時代のセキュアなクラウドインフラ構築術 #seccampIoT時代のセキュアなクラウドインフラ構築術 #seccamp
IoT時代のセキュアなクラウドインフラ構築術 #seccamp
 
クラウドセキュリティ基礎 @セキュリティ・ミニキャンプ in 東北 2016 #seccamp
クラウドセキュリティ基礎 @セキュリティ・ミニキャンプ in 東北 2016 #seccampクラウドセキュリティ基礎 @セキュリティ・ミニキャンプ in 東北 2016 #seccamp
クラウドセキュリティ基礎 @セキュリティ・ミニキャンプ in 東北 2016 #seccamp
 
NTPを使ったDDoSについて
NTPを使ったDDoSについてNTPを使ったDDoSについて
NTPを使ったDDoSについて
 
Sakura infini band-20180424
Sakura infini band-20180424Sakura infini band-20180424
Sakura infini band-20180424
 
どこでも安全に使えるIoTを目指して ~さくらインターネットのIoTへの取り組み~
どこでも安全に使えるIoTを目指して ~さくらインターネットのIoTへの取り組み~どこでも安全に使えるIoTを目指して ~さくらインターネットのIoTへの取り組み~
どこでも安全に使えるIoTを目指して ~さくらインターネットのIoTへの取り組み~
 
最新プロトコル HTT/2 とは
最新プロトコル HTT/2 とは最新プロトコル HTT/2 とは
最新プロトコル HTT/2 とは
 
Career - design, adaption and diversity - for EMC I&D event
Career - design, adaption and diversity - for EMC I&D eventCareer - design, adaption and diversity - for EMC I&D event
Career - design, adaption and diversity - for EMC I&D event
 
クラウドセキュリティ基礎
クラウドセキュリティ基礎クラウドセキュリティ基礎
クラウドセキュリティ基礎
 
[Dots.]taiga
[Dots.]taiga[Dots.]taiga
[Dots.]taiga
 
IoTとビッグデータについて学ぼう
IoTとビッグデータについて学ぼうIoTとビッグデータについて学ぼう
IoTとビッグデータについて学ぼう
 
About AI(Machine Learning)
About AI(Machine Learning)About AI(Machine Learning)
About AI(Machine Learning)
 
docxをmdで書こう
docxをmdで書こうdocxをmdで書こう
docxをmdで書こう
 
作って(壊して?)学ぶインターネットのしくみ サイバーエージェントの実験用ASの紹介 / Introduce experimental AS in ...
作って(壊して?)学ぶインターネットのしくみ サイバーエージェントの実験用ASの紹介 / Introduce experimental AS in ...作って(壊して?)学ぶインターネットのしくみ サイバーエージェントの実験用ASの紹介 / Introduce experimental AS in ...
作って(壊して?)学ぶインターネットのしくみ サイバーエージェントの実験用ASの紹介 / Introduce experimental AS in ...
 
簡便な大型幅広デジタルサイネージシステムとその自動運用システム
簡便な大型幅広デジタルサイネージシステムとその自動運用システム簡便な大型幅広デジタルサイネージシステムとその自動運用システム
簡便な大型幅広デジタルサイネージシステムとその自動運用システム
 
サーバーレス時代の システム設計ワークショップ
サーバーレス時代の システム設計ワークショップサーバーレス時代の システム設計ワークショップ
サーバーレス時代の システム設計ワークショップ
 
オープンソースで作る動画配信サイト OSC2013名古屋
オープンソースで作る動画配信サイト OSC2013名古屋オープンソースで作る動画配信サイト OSC2013名古屋
オープンソースで作る動画配信サイト OSC2013名古屋
 
クラウドセキュリティ基礎 #seccamp
クラウドセキュリティ基礎 #seccampクラウドセキュリティ基礎 #seccamp
クラウドセキュリティ基礎 #seccamp
 

More from Yukimitsu Izawa (9)

Rubyでオートマトン
RubyでオートマトンRubyでオートマトン
Rubyでオートマトン
 
テストとは
テストとはテストとは
テストとは
 
RubyでDSL
RubyでDSLRubyでDSL
RubyでDSL
 
Pow
PowPow
Pow
 
RVM with Server Environment
RVM with Server EnvironmentRVM with Server Environment
RVM with Server Environment
 
Try
TryTry
Try
 
rvm でbundlerと仲良くする
rvm でbundlerと仲良くするrvm でbundlerと仲良くする
rvm でbundlerと仲良くする
 
SWIGでRubyバインディング
SWIGでRubyバインディングSWIGでRubyバインディング
SWIGでRubyバインディング
 
MacRubyとHotCocoaでMacのアプリを作ってみた
MacRubyとHotCocoaでMacのアプリを作ってみたMacRubyとHotCocoaでMacのアプリを作ってみた
MacRubyとHotCocoaでMacのアプリを作ってみた
 

Recently uploaded

2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
ssuserbefd24
 

Recently uploaded (10)

2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
 

RubyからFFIを使ってみた