Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
MU
Uploaded by
Masashi Umezawa
361 views
SmalltalkBoltでUFFI入門
PharoからCで書かれた共有ライブラリの関数を呼び出すUFFIの使い方について、例を交えて解説します
Software
◦
Read more
0
Save
Share
Embed
Embed presentation
Download
Download to read offline
1
/ 29
2
/ 29
3
/ 29
4
/ 29
5
/ 29
6
/ 29
7
/ 29
8
/ 29
9
/ 29
10
/ 29
11
/ 29
12
/ 29
13
/ 29
14
/ 29
15
/ 29
16
/ 29
17
/ 29
18
/ 29
19
/ 29
20
/ 29
21
/ 29
22
/ 29
23
/ 29
24
/ 29
25
/ 29
26
/ 29
27
/ 29
28
/ 29
29
/ 29
More Related Content
PDF
今からでも遅くないSmalltalk入門
by
Masashi Umezawa
PPTX
高速なソートアルゴリズムを書こう!!
by
masakazu matsubara
PDF
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
by
NTT DATA Technology & Innovation
PDF
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
PDF
Smalltalkだめ自慢
by
Masashi Umezawa
PDF
論文紹介 Amortized bayesian meta learning
by
Xiangze
PPTX
レベルを上げて物理で殴れ、Fuzzing入門 #pyfes
by
Tokoroten Nakayama
PPTX
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
今からでも遅くないSmalltalk入門
by
Masashi Umezawa
高速なソートアルゴリズムを書こう!!
by
masakazu matsubara
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
by
NTT DATA Technology & Innovation
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
Smalltalkだめ自慢
by
Masashi Umezawa
論文紹介 Amortized bayesian meta learning
by
Xiangze
レベルを上げて物理で殴れ、Fuzzing入門 #pyfes
by
Tokoroten Nakayama
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
What's hot
PDF
MySQLのバックアップ運用について色々
by
yoku0825
PDF
Where狙いのキー、order by狙いのキー
by
yoku0825
PDF
混合ガウスモデルとEMアルゴリスム
by
貴之 八木
PDF
GAN(と強化学習との関係)
by
Masahiro Suzuki
PDF
Oss貢献超入門
by
Michihito Shigemura
PDF
40歳過ぎてもエンジニアでいるためにやっていること
by
onozaty
PDF
Python 3.9からの新定番zoneinfoを使いこなそう
by
Ryuji Tsutsui
PDF
SSII2019TS: 実践カメラキャリブレーション ~カメラを用いた実世界計測の基礎と応用~
by
SSII
PDF
Apache NiFi の紹介 #streamctjp
by
Yahoo!デベロッパーネットワーク
PDF
Prometheus monitoring from outside of Kubernetes 〜どうして我々はKubernetes上のPromet...
by
whywaita
PPTX
【修正版】Django + SQLAlchemy: シンプルWay
by
Takayuki Shimizukawa
PPTX
Python用ゲームエンジンPyxelで遊んでみた
by
Hirofumi Watanabe
PDF
ChatGPTは思ったほど賢くない
by
Carnot Inc.
PDF
論文紹介:Dueling network architectures for deep reinforcement learning
by
Kazuki Adachi
PDF
今日から使おうSmalltalk
by
Sho Yoshida
PDF
DPDKによる高速コンテナネットワーキング
by
Tomoya Hibi
PDF
深層強化学習入門 2020年度Deep Learning基礎講座「強化学習」
by
Tatsuya Matsushima
PDF
Hokkaido.cap#1 Wiresharkの使い方(基礎編)
by
Panda Yamaki
PDF
第5章混合分布モデルによる逐次更新型異常検知
by
Tetsuma Tada
PDF
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
by
kiki utagawa
MySQLのバックアップ運用について色々
by
yoku0825
Where狙いのキー、order by狙いのキー
by
yoku0825
混合ガウスモデルとEMアルゴリスム
by
貴之 八木
GAN(と強化学習との関係)
by
Masahiro Suzuki
Oss貢献超入門
by
Michihito Shigemura
40歳過ぎてもエンジニアでいるためにやっていること
by
onozaty
Python 3.9からの新定番zoneinfoを使いこなそう
by
Ryuji Tsutsui
SSII2019TS: 実践カメラキャリブレーション ~カメラを用いた実世界計測の基礎と応用~
by
SSII
Apache NiFi の紹介 #streamctjp
by
Yahoo!デベロッパーネットワーク
Prometheus monitoring from outside of Kubernetes 〜どうして我々はKubernetes上のPromet...
by
whywaita
【修正版】Django + SQLAlchemy: シンプルWay
by
Takayuki Shimizukawa
Python用ゲームエンジンPyxelで遊んでみた
by
Hirofumi Watanabe
ChatGPTは思ったほど賢くない
by
Carnot Inc.
論文紹介:Dueling network architectures for deep reinforcement learning
by
Kazuki Adachi
今日から使おうSmalltalk
by
Sho Yoshida
DPDKによる高速コンテナネットワーキング
by
Tomoya Hibi
深層強化学習入門 2020年度Deep Learning基礎講座「強化学習」
by
Tatsuya Matsushima
Hokkaido.cap#1 Wiresharkの使い方(基礎編)
by
Panda Yamaki
第5章混合分布モデルによる逐次更新型異常検知
by
Tetsuma Tada
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
by
kiki utagawa
Similar to SmalltalkBoltでUFFI入門
PDF
ffi for rubyists
by
nanki
KEY
Objc lambda
by
matuura_core
PDF
RubyからFFIを使ってみた
by
Yukimitsu Izawa
PDF
sbtマルチプロジェクトビルドの使いどころ
by
Kazuhiro Hara
PPT
"Formalizing Architectural Connection" 紹介
by
Tadayoshi Sato
PDF
Objectie-C de ラムダ
by
Akihiko Matuura
PPTX
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワル
by
CODE BLUE
PDF
.NET Micro Framework の基礎
by
Yoshitaka Seo
ffi for rubyists
by
nanki
Objc lambda
by
matuura_core
RubyからFFIを使ってみた
by
Yukimitsu Izawa
sbtマルチプロジェクトビルドの使いどころ
by
Kazuhiro Hara
"Formalizing Architectural Connection" 紹介
by
Tadayoshi Sato
Objectie-C de ラムダ
by
Akihiko Matuura
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワル
by
CODE BLUE
.NET Micro Framework の基礎
by
Yoshitaka Seo
More from Masashi Umezawa
PDF
第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション
by
Masashi Umezawa
PDF
FileManで楽々ファイル操作
by
Masashi Umezawa
PDF
TruffleSqueakの紹介
by
Masashi Umezawa
PDF
TaskItの紹介
by
Masashi Umezawa
PDF
Smalltalk勉強会 - 過去、現在、そして未来へ のその後
by
Masashi Umezawa
PPTX
Revealing ALLSTOCKER
by
Masashi Umezawa
PDF
TarandocでJSONを永続化
by
Masashi Umezawa
PPTX
Dockerizing pharo
by
Masashi Umezawa
PDF
Tarantubeでメッセージキューを使い倒す
by
Masashi Umezawa
PDF
VerStixの紹介
by
Masashi Umezawa
PDF
Oldtalk - あのころの処理系は今
by
Masashi Umezawa
PDF
Pyonkeeを鳴らす
by
Masashi Umezawa
PDF
Smalltalk勉強会 - 過去、現在、そして未来へ
by
Masashi Umezawa
PDF
Tarantalk
by
Masashi Umezawa
PDF
Smalltalkと型について
by
Masashi Umezawa
PDF
Introduction of Pharo 5.0
by
Masashi Umezawa
PDF
Why!? Smalltalk
by
Masashi Umezawa
PDF
Pillarの紹介
by
Masashi Umezawa
PPT
Scrumの紹介とXPプロジェクトへの適用(Scrum and XP)
by
Masashi Umezawa
PDF
NanoStrand
by
Masashi Umezawa
第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション
by
Masashi Umezawa
FileManで楽々ファイル操作
by
Masashi Umezawa
TruffleSqueakの紹介
by
Masashi Umezawa
TaskItの紹介
by
Masashi Umezawa
Smalltalk勉強会 - 過去、現在、そして未来へ のその後
by
Masashi Umezawa
Revealing ALLSTOCKER
by
Masashi Umezawa
TarandocでJSONを永続化
by
Masashi Umezawa
Dockerizing pharo
by
Masashi Umezawa
Tarantubeでメッセージキューを使い倒す
by
Masashi Umezawa
VerStixの紹介
by
Masashi Umezawa
Oldtalk - あのころの処理系は今
by
Masashi Umezawa
Pyonkeeを鳴らす
by
Masashi Umezawa
Smalltalk勉強会 - 過去、現在、そして未来へ
by
Masashi Umezawa
Tarantalk
by
Masashi Umezawa
Smalltalkと型について
by
Masashi Umezawa
Introduction of Pharo 5.0
by
Masashi Umezawa
Why!? Smalltalk
by
Masashi Umezawa
Pillarの紹介
by
Masashi Umezawa
Scrumの紹介とXPプロジェクトへの適用(Scrum and XP)
by
Masashi Umezawa
NanoStrand
by
Masashi Umezawa
SmalltalkBoltでUFFI入門
1.
SmallBoltでUFFI入門 PharoからCの共有ライブラリを使う 2020 Smalltalk勉強会 Masashi Umezawa
2.
UFFIとは? ● Unified FFI ○
外部関数呼び出しインターフェース (FFI) ■ Squeak, Pharoで複数あったFFIを統一化したもの ○ 共有ライブラリの公開関数を呼びだせる ○ コールバックを受けることも可能 ● 既に便利なライブラリが存在する時に有効 ● 速度が気になる低レイヤの処理をさせるにも便利
3.
チュートリアル ● "Unified FFI
- Calling Foreign Functions from Pharo" ○ Pharo Booksの一つ ○ 基本的なcall outはできるようになる ○ callback(call in)の解説はない
4.
UFFI適用例 ● "SmallBolt" ○ Neo4j
Boltドライバ ■ 定番Graph DBのNeo4jにアクセスするためのドライバ ■ Cで書かれたBoltプロトコルのライブラリSeaboltをFFIで 呼び出している ■ 従来のREST(http)によるドライバ(Neo4reSt)に比べて 3倍程度速い
5.
SmallBoltのインストール Metacello new baseline: 'SmallBolt'; repository:
'github://mumez/SmallBolt'; load. ● Metacelloで入れる ● 共有ライブラリファイル(libseabolt)もダウンロードされる ○ イメージファイルのディレクトリにファイルが置かれるのでPharo からロード可能
6.
Neo4jのインストール ● Neo4j Download
Centerにアクセス ○ https://neo4j.com/download-center/#community ■ tar.gzかzipを取得して展開 ■ bin以下のneo4j(.bat)を起動 > neo4j console
7.
SbSeaboltFFIをブラウズ Object subclass: #SbSeaboltFFI instanceVariableNames:
'' classVariableNames: '' poolDictionaries: 'SbBoltConstants' package: 'SmallBolt-FFI' ● FFI呼び出し用のメソッドがまとめられたクラス ○ 外部ライブラリファイルごとにクラスを作成することが多い ■ 今回はlibseaboltの関数群が対象 ● SbBoltConstants プールについては 後述
8.
最初の例: SbSeaboltFFI >>
startup startup ^ self ffiCall: #( void Bolt_startup() ) ● 引数も戻り値もない関数の例 ○ void Bolt_startup() を呼び出すための記述 SbSeaboltFFI new startup ○ Playgroundで以下のようにして呼び出せる
9.
共有ライブラリファイルへの参照はどこ? FFILibrary subclass: #SbSeaboltLibrary instanceVariableNames:
'' classVariableNames: '' package: 'SmallBolt-FFI' ● FFILibraryのサブクラスを作成してファイル名などを記述 ○ win32LibraryName, macLibraryName, unixLibraryName のメソッドでファイル名 (libseabolt.dllなど)を返す ffiLibraryName ^ SbSeaboltLibrary ● SbSeaboltFFI>>ffiLibraryName で上記クラスを指定 ○ ファイル名を意識せずに 外部関数を呼ぶことが可能 になる
10.
ロードされた共有ライブラリ群を確認 Smalltalk vm listLoadedModules ○
libseabolt.dllなどが含まれる デフォルトでは ● VMのプラグインディレクトリ ● イメージの置かれているディレクトリ ● 環境変数PATH、LD_LIBRARY_PATHで 指定したディレクトリ で検索が行われる
11.
引数や戻り値のある呼び出し (1) BoltValue* BoltAuth_basic(const
char* username, const char* password, const char* realm) ● BoltAuth_basicで認証してみる ○ Cのシグネチャ ● BoltValue* や const char* の扱いはどうなるのか?
12.
引数や戻り値のある呼び出し (2) authBasic: userName
password: password realm: realm ^ self ffiCall: #( SbBoltValue BoltAuth_basic(String userName, String password, String realm) ) ● SbSeaboltFFI >> authBasic:password:realm: として定義 ● Cの型はSmalltalkのクラスとしてマッピングできる ○ BoltValue* => SbBoltValue (FFIExternalObjectのサブクラス) ○ const char* => String (マッピングがあらかじめ定義されている)
13.
引数や戻り値のある呼び出し (3) boltValue :=
SbSeaboltFFI new authBasic:'neo4j' password:'neoneo' realm: nil. credentials := boltValue value. boltValue destroy. credentials inspect. ● 通常のSmalltalkのメッセージ送信で呼び出せる ○ C <-> Smalltalk の変換が自動的に行われる
14.
ポインタ渡しによる書き換え (1) int32 BoltValue_to_string(SbBoltValue
aBoltValue, char* dest, int32 length, SbBoltConnection aSbBoltConnection) ● BoltValue_to_stringでSmalltalk側からポインタを渡すには? ○ Cのシグネチャ ○ SbSeaboltFFI >> toString:fromValue:length:onConnection: onConnection::password:realm: toString: dest fromValue: aBoltValue length: length onConnection: aSbBoltConnection ^ self ffiCall: #( int32 BoltValue_to_string(SbBoltValue aBoltValue, char* dest, int32 length, SbBoltConnection aSbBoltConnection) )
15.
ポインタ渡しによる書き換え (2) debugShortString | strAddress
size | strAddress := (ExternalAddress allocate: 64) autoRelease. size := self ffi toString: strAddress fromValue: self length: 64 onConnection: SbBoltConnection null. ^ strAddress readString ● SbBoltValue >> debugShortString で使用 ○ SmalltalkのExternalAddressでCのヒープにallocate ○ ポインタを受け取ったCが書き込み ○ Smalltalkで値を得る
16.
ポインタ渡しによる書き換え (3) boltValue :=
SbSeaboltFFI new authBasic:'neo4j' password:'neoneo' realm: nil. boltValue debugString inspect. ● SbBoltValue>>debugShortStringを送ってみる ○ C側で生成されたデバッグ用文字列を得られる
17.
コールバックの起動 (1) ● C側に関数ポインタにマッピングされるSmalltalkの オブジェクトを渡す ○
Smalltalk側で設定したブロックが実行される ● FFICallbackのサブクラスを作成 ○ SbBoltLogCallback ■ ライブラリ からのLogを 受ける FFICallback subclass: #SbBoltLogCallback instanceVariableNames: '' classVariableNames: '' package: 'SmallBolt-FFI'
18.
コールバックの起動 (2) ● C側の関数ポインタの定義 typedef
void (* log_func)(void* state, const char* message); ● SbBoltLogCallbackにクラスメソッドを定義 fnSpec ^ 'void ( void* state, String message )' on: aBlock ^ self signature: self fnSpec block: aBlock
19.
コールバックの起動 (3) ● Cのデバッグログ設定用関数 void
BoltLog_set_debug_func(BoltLog* log, log_func func); ● SbSeaboltFFI >> setDebugCallback:onLog: setDebugCallback: aBoltLogCallback onLog: aBoltLog ^ self ffiCall: #(void BoltLog_set_debug_func(SbBoltLog aBoltLog, SbBoltLogCallback aBoltLogCallback)) ○ 関数ポインタ部分がSbBoltLogCallbackとなっている
20.
Cからのコールバックの起動 (4) ● Debugログ出力のコールバックを設定してみる client
:= SbClient new. [ client configBuilder: [ :config :settings | config log: (client libraryLogger debugCallback: (SbBoltLogCallback on: [ :state :message | self traceCr: message ]))]. client connect. ] ensure: [ client release] ○ connect時の ログが表示 される
21.
定数の利用 (1) SharedPool subclass:
#SbBoltConstants instanceVariableNames: '' classVariableNames: 'BOLT_ACCESS_MODE_READ BOLT_ACCESS_MODE_WRITE BOLT_CONNECTION_STATE_CONNECTED BOLT_CONNECTION_STATE_DEFUNCT BOLT_CONNECTION_STATE_DISCONNECTED BOLT_CONNECTION_STATE_FAILED BOLT_CONNECTION_STATE_READY BOLT_SCHEME_DIRECT BOLT_SCHEME_NEO4J BOLT_TRANSPORT_ENCRYPTED BOLT_TRANSPORT_PLAINTEXT' package: 'SmallBolt-FFI' ● Cでtypedefされている定数 ○ Smalltalk側ではSharedPoolとして表す
22.
定数の利用 (2) initialize BOLT_TRANSPORT_PLAINTEXT :=
0. BOLT_TRANSPORT_ENCRYPTED := 1. ... ● SbBoltConstants class >> initialize 経由で初期化 usePlainTextTransport self ffi setTransport: BOLT_TRANSPORT_PLAINTEXT onConfig: self ● SbBoltConfig >> usePlainTextTransport ○ Constantsを使う指定をしておけば、マジックナンバーを 書かずに済む
23.
Enumの利用 (1) FFIEnumeration subclass:
#SbBoltType ... ● FFIEnumerationのサブクラスを作成する ○ クラスメソッド enumDecl をCの定義に合わせて追加 ○ SbBoltType initializeでプールの初期化が行われる
24.
Enumの利用 (2) enumDecl ^ #(BOLT_NULL
0 BOLT_BOOLEAN 1 BOLT_INTEGER 2 BOLT_FLOAT 3 BOLT_STRING 4 BOLT_DICTIONARY 5 BOLT_LIST 6 BOLT_BYTES 7 BOLT_STRUCTURE 8) ● SbBoltType class >> enumDecl FFIEnumeration subclass: #SbBoltType instanceVariableNames: '' classVariableNames: 'BOLT_BOOLEAN BOLT_BYTES BOLT_DICTIONARY BOLT_FLOAT BOLT_INTEGER BOLT_LIST BOLT_NULL BOLT_STRING BOLT_STRUCTURE' package: 'SmallBolt-FFI' ○ SbBoltType initializeすると変数が 定義され初期化されている
25.
Enumの利用 (3) enum BoltType
BoltValue_type(const BoltValue* value); ● SbSeaboltFFI >> getTypeOnValue: getTypeOnValue: aBoltValue ^ self ffiCall: #( SbBoltType BoltValue_type(SbBoltValue aBoltValue) ) ● BoltValue_typeでenumを返している ○ SbBoltTypeのインスタンスが返される ■ item (シンボルが返る) ■ value (値が返る) などのメッセージに答えられる
26.
Enumの利用 (4) boltValue :=
SbSeaboltFFI new authBasic: 'neo4j' password: 'neoneo' realm: nil. type := boltValue type. {type item. type value} inspect. ● BoltValue >> type 経由でgetTypeOnValue:を呼んでみる
27.
その他UFFIの適用例 ● Pharo-SQLite3 ○ SQLiteへのコネクタ ●
PunQLite ○ UnQLite(KVS)へのコネクタ ● libtensorflow-pharo-bindings ○ TensorFlowバインディング ● pharo-protobuf ○ gRPC及びProtocol Buffersのサポート
28.
UFFI向けお勧めライブラリ ● libvips ○ 高速な画像処理がPharoで可能に! ●
librdkafka ○ Kafkaにつないで分散ストリーム処理 などなど
29.
まとめ ● Unified FFIを使うと既存のCの共有ライブラリを使ってPharo を拡張できる ●
C <-> Smalltalkのマッピングが定義されており楽 ● コールアウト、コールインの両方がサポートされている いろいろなライブラリを呼び出してPharoを気軽に拡張してい きましょう!
Download