rabbit-slide-kou-rubykaigi-2016 2016.9.9.0 → 2016.9.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/config.yaml +1 -1
- data/how-to-create-bindings-2016.rab +44 -18
- data/pdf/rubykaigi-2016-how-to-create-bindings-2016.pdf +0 -0
- metadata +2 -4
- data/Ruby bindings 2016.pdf +0 -0
- data/a.md +0 -48
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aaad7c50239345be4fa66b50bb5ba832679a1227
|
4
|
+
data.tar.gz: 133a0c807d707d695c9dd63e8c570f1e9060bf9b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bea7a145f663da3fd24d0666a81b782bc6aae650e40a8a0f1e9dbfd92f6decf154712e67aaa483b8def1d926f9e86421633595b20df92e6cd089b4a9a3bb1b66
|
7
|
+
data.tar.gz: 75abae58270af38d9ced801cf60afacdbf18bc9ba96a87e0afcaafa654c24595900a2178307c359631cf59cfa1ec54ccbcd4ce0744a7643ff380b00358792a5f
|
data/config.yaml
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
: content-source
|
11
11
|
RubyKaigi 2016
|
12
12
|
: date
|
13
|
-
2016-09-
|
13
|
+
2016-09-09
|
14
14
|
: allotted-time
|
15
15
|
35m
|
16
16
|
: theme
|
@@ -31,11 +31,11 @@
|
|
31
31
|
|
32
32
|
(('tag:center'))
|
33
33
|
(('tag:large'))
|
34
|
-
You
|
35
|
-
|
34
|
+
You become\n
|
35
|
+
a new bindings developer
|
36
36
|
|
37
37
|
(('tag:center'))
|
38
|
-
(('note
|
38
|
+
(('note:あなたが新しくバインディング開発者になること'))
|
39
39
|
|
40
40
|
= Bindings?\n(('note:バインディングとは'))
|
41
41
|
|
@@ -59,7 +59,7 @@ how to create bindings
|
|
59
59
|
: enable-title-on-image
|
60
60
|
false
|
61
61
|
|
62
|
-
=
|
62
|
+
= Why should I become?\n(('note:なんでバインディング開発者になるの?'))
|
63
63
|
|
64
64
|
* (('wait'))To use Ruby in more cases\n
|
65
65
|
(('note:Rubyをもっといろんな場面で使うため'))
|
@@ -159,7 +159,7 @@ How powerful auto generated bindings\n
|
|
159
159
|
(('note:libffiを使ったライブラリー'))
|
160
160
|
* (('wait'))Provides ((*Ruby*)) API\n
|
161
161
|
to implement bindings\n
|
162
|
-
(('note:バインディングを実装するためのRuby
|
162
|
+
(('note:バインディングを実装するためのRubyのAPIを提供'))
|
163
163
|
|
164
164
|
= libffi and bindings\n(('note:libffiとバインディング'))
|
165
165
|
|
@@ -362,8 +362,8 @@ How powerful auto generated bindings\n
|
|
362
362
|
= Wrap up2: Ext\n(('note:まとめ2:拡張ライブラリー'))
|
363
363
|
|
364
364
|
* On maintenance\n
|
365
|
-
e.g.: New functions\n
|
366
|
-
(('note
|
365
|
+
e.g.: New functions, enums\n
|
366
|
+
(('note:メンテナンス時:(例:新しい関数・列挙値が追加された)'))
|
367
367
|
* (('wait'))By hand: Need more works\n
|
368
368
|
(('note:手動:追加作業あり'))
|
369
369
|
* (('wait'))By generation: No more works\n
|
@@ -492,8 +492,8 @@ How powerful auto generated bindings\n
|
|
492
492
|
= Wrap up2: libffi\n(('note:まとめ2:libffi'))
|
493
493
|
|
494
494
|
* On maintenance\n
|
495
|
-
e.g.: New functions\n
|
496
|
-
(('note
|
495
|
+
e.g.: New functions, enums\n
|
496
|
+
(('note:メンテナンス時:(例:新しい関数・列挙値が追加された)'))
|
497
497
|
* (('wait'))By hand: Need more works\n
|
498
498
|
(('note:手動:追加作業あり'))
|
499
499
|
* (('wait'))By generation: No more works\n
|
@@ -501,12 +501,24 @@ How powerful auto generated bindings\n
|
|
501
501
|
This is a large benefit!\n
|
502
502
|
(('note:これは大きな利点!'))
|
503
503
|
|
504
|
+
= Impl. by generation\n(('note:生成ベースでの実装方法'))
|
505
|
+
|
506
|
+
# RT
|
507
|
+
|
508
|
+
, Ext★, SWIG, FFI, GI☆
|
509
|
+
|
510
|
+
Base\nTech, Ext, Ext, lib\nffi, lib\nffi
|
511
|
+
Impl.\nby, Hand, ((*Generate*)), Hand, ((*Generate*))
|
512
|
+
|
513
|
+
(('note:★ Extension library(拡張ライブラリー)'))\n
|
514
|
+
(('note:☆ GObject Introspection: Recommended(オススメ)'))
|
515
|
+
|
504
516
|
= SWIG⇔GI: When\n(('note:SWIG⇔GI:生成タイミング'))
|
505
517
|
|
506
518
|
* When are bindings generated?\n
|
507
519
|
(('note:バインディングの生成タイミング'))
|
508
520
|
* (('wait'))On build⇔Runtime\n
|
509
|
-
(('note
|
521
|
+
(('note:ビルド時⇔実行時'))
|
510
522
|
* (('wait'))SWIG: Need to build for new ver.\n
|
511
523
|
(('note:新しいバージョンがでたらリビルドが必要'))
|
512
524
|
* (('wait'))GI: No more works for new ver.\n
|
@@ -514,10 +526,10 @@ How powerful auto generated bindings\n
|
|
514
526
|
|
515
527
|
= SWIG⇔GI: Maintenance\n(('note:SWIG⇔GI:メンテナンス'))
|
516
528
|
|
517
|
-
* SWIG: Maintain .i file for each bindings\n
|
518
|
-
(('note
|
519
|
-
* GI: Maintain annotations for all bindings\n
|
520
|
-
(('note
|
529
|
+
* SWIG: Maintain .i file for each language bindings\n
|
530
|
+
(('note:各言語バインディング用に.iファイルをメンテナンス'))
|
531
|
+
* GI: Maintain annotations for all language bindings\n
|
532
|
+
(('note:全言語バインディング用にアノテーションをメンテナンス'))
|
521
533
|
* (('wait'))We can work together with other language bindings maintainers
|
522
534
|
|
523
535
|
= SWIG: Overview (reprise)\n(('note:SWIG:概要(再掲)'))
|
@@ -573,7 +585,7 @@ How powerful auto generated bindings\n
|
|
573
585
|
|
574
586
|
= Wrap up2\n(('note:まとめ2'))
|
575
587
|
|
576
|
-
* Bindings
|
588
|
+
* Bindings increase cases that Ruby can be used\n
|
577
589
|
(('note:バインディングはRubyを使えるケースを増やす'))
|
578
590
|
* Because they provide existing good features to Ruby\n
|
579
591
|
(('note:バインディングは既存のよい機能をRubyで使えるようにするから'))
|
@@ -594,11 +606,25 @@ How powerful auto generated bindings\n
|
|
594
606
|
Let's becoming a bindings developer!\n
|
595
607
|
(('note:バインディング開発者になろう!'))
|
596
608
|
|
609
|
+
= Advertisement\n(('note:宣伝'))
|
610
|
+
|
611
|
+
* OSS Gate
|
612
|
+
* Helps people who want to be an OSS developer (but not yet)\n
|
613
|
+
(('note:OSS開発者になりたいけど一歩踏み出せていない人を支援'))
|
614
|
+
* ClearCode booth(('note:(クリアコードブース)'))
|
615
|
+
* You can discus about OSS Gate and more technical details\n
|
616
|
+
(('note:OSS Gateやもっと技術的な話や雑談をできる'))
|
617
|
+
|
618
|
+
= Wrap up (reprise)\n(('note:まとめ(再掲)'))
|
619
|
+
|
620
|
+
Let's becoming a bindings developer!\n
|
621
|
+
(('note:バインディング開発者になろう!'))
|
622
|
+
|
597
623
|
= Things not talked\n(('note:話さなかったこと'))
|
598
624
|
|
599
625
|
* Bindings are difficult to install on Win. Any idea?\n
|
600
626
|
(('note:Windowsでインストールが大変。どうすれば?'))
|
601
|
-
* Performance\n
|
602
|
-
(('note
|
627
|
+
* Performance・Annotation\n
|
628
|
+
(('note:性能・アノテーション'))
|
603
629
|
* Details of each bindings create method\n
|
604
630
|
(('note:それぞれのバインディング作成方法の詳細'))
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rabbit-slide-kou-rubykaigi-2016
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2016.9.9.
|
4
|
+
version: 2016.9.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kouhei Sutou
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rabbit
|
@@ -49,8 +49,6 @@ files:
|
|
49
49
|
- ".rabbit"
|
50
50
|
- README.rd
|
51
51
|
- Rakefile
|
52
|
-
- Ruby bindings 2016.pdf
|
53
|
-
- a.md
|
54
52
|
- bindings-as-extension-library.rab
|
55
53
|
- config.yaml
|
56
54
|
- fat-gem.rab
|
data/Ruby bindings 2016.pdf
DELETED
Binary file
|
data/a.md
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
# [Ruby][会社] クリアコード:RubyKaigi 2016にスピーカー・スポンサーとして参加予定
|
2
|
-
|
3
|
-
9月8日から10日の3日間[RubyKaigi 2016](http://rubykaigi.org/2016/)が開催されます。
|
4
|
-
|
5
|
-
クリアコードは例年RubyKaigiのスポンサーをしています。去年の[RubyKaigi 2015のスポンサー](20151209)に引き続き、[RubyKaigi 2016もスポンサー](http://rubykaigi.org/2016/sponsors#clear-code)になりました。今年はブースを出します。ブースでは[OSS Gate](https://oss-gate.doorkeeper.jp/)とクリアコード自体のことを紹介する予定です。クリアコードが気になる人は遊びに来てください。
|
6
|
-
|
7
|
-
また、須藤と沖元がスピーカーとして話します。どちらも[2日目の9月9日](http://rubykaigi.org/2016/schedule/#sep09)です。須藤は[10:30からのセッション](http://rubykaigi.org/2016/presentations/ktou.html)で最新のバインディングの作り方について話します。沖元は[14:20からのセッション](http://rubykaigi.org/2016/presentations/okkez.html)でRubyリファレンスマニュアルについて話します。
|
8
|
-
|
9
|
-
ところで、8月21日にリリースされた[Rubyist Magazine 0054号](http://magazine.rubyist.net/?0054)では[東京 Ruby 会議 11 運営記録](http://magazine.rubyist.net/?0054-TokyoRubyKaigi11OrganizeReport)がよかったです。この記事の中に事前インタビューの目的が書いてあります。4つ目の目的として「発表者に事前インタビューすることで、発表の内容を事前に考えて貰う」が挙がっています。RubyKaigi 2016では事前インタビューはありませんが、ここに発表内容を事前にまとめることで同じ目的を達成できるはずです。ということで、須藤の発表内容を紹介します。
|
10
|
-
|
11
|
-
## 2016年のバインディングの作り方
|
12
|
-
|
13
|
-
バインディングとはRuby以外の言語(主にC言語とC++言語)で実装された機能をRubyで使うためのライブラリーです。バインディングを使うと、Rubyでその機能を実装しなくてもその機能を使えるようになるため、短時間で高品質の機能を手に入れ(られることがあり)ます。また、C言語での実装はRubyでの実装よりも10倍100倍速いことがざらにあるので、性能面でも有利です。画像処理・動画処理・音声処理・全文検索・機械学習・統計処理・暗号処理などは実装コスト・性能の両面からバインディングを利用して既存実装を活用するのが向いている分野です。
|
14
|
-
|
15
|
-
というような背景があり、RubyをWebだけでなく様々な分野で活用するためにはバインディングは重要です。そんなバインディングの作り方を紹介するのが須藤の話です。
|
16
|
-
|
17
|
-
バインディングを作るために使える仕組みが拡張ライブラリーです。拡張ライブラリーはC言語で実装された機能をRubyに組み込む仕組みです。C言語で既存の機能をラップする拡張ライブラリーを作ることでバインディングになります。
|
18
|
-
|
19
|
-
拡張ライブラリーの難点の1つに「インストールするためにはCコンパイラーが必要なこと」があります。拡張ライブラリーを使うためにはコンパイルする必要があるため、Cコンパイラーがないと拡張ライブラリーを使えません。GNU/LinuxやBSD系などCコンパイラーを用意しやすいOSもあればそうでないOSもあります。たとえば、WindowsではCコンパイラーを用意することの敷居が高く、インストールが難しいです。
|
20
|
-
|
21
|
-
この問題を解決する方法としてfat gemというやり方があります。これはgemの中にビルド済みバイナリーを入れるというやり方です。こうすることにより、ユーザーの環境にCコンパイラーがなくても拡張ライブラリーを使えるようになります。fat gemはWindowsユーザー向けだけに用意すればよいです。Windows以外のよく使われている環境ではCコンパイラーを用意することは比較的簡単だからです。
|
22
|
-
|
23
|
-
拡張ライブラリーの難点はもう1つあります。バインディング対象の機能数に応じて実装コストがあがる点です。Rubyが拡張ライブラリー用に提供しているAPIは比較的使いやすいため、拡張ライブラリーとしてバインディングを作ることは技術的にそれほど難しくありません。ただし、対象機能を1つずつラップするため、対象機能が多いとその分手間がかかるのです。
|
24
|
-
|
25
|
-
この難点を解決する方法としてバインディングを生成する方法があります。拡張ライブラリーによるバインディングの実装にはある程度パターンがあるので生成することができるのです。[SWIG](http://www.swig.org/)というツールはそれを実現するためのツールです。
|
26
|
-
|
27
|
-
SWIGを使うと(多くの場合は)少ない記述でバインディング用の拡張ライブラリーのコードを生成できます。これで、少ない手間でたくさんの機能のバインディングを作ることができます。ただ、SWIGを使った場合でもいくつか難点があります。
|
28
|
-
|
29
|
-
SWIGも拡張ライブラリーを使ったバインディングなのでインストールが難しい問題があります。これはfat gemというやり方で解決できるのは前述のとおりです。しかし、SWIGを使った場合は別の問題もあります。インストール時にCコンパイラーとSWIGが必要になる点です。通常、SWIGはシステムにインストールされていないので別途インストールする必要があります。インストール時にSWIGが必要なくする方法もあります。SWIGで生成した拡張ライブラリーのコードをgemに含める方法です。こうすることでインストール時にSWIGは必要なくなります。ただし、gemに含めたときに生成した機能しか含まれません。gemに含めたときの対象ライブラリーはバージョン1で、ユーザーがインストールしようとしたときはバージョン2になっていた、という場合、バージョン2で追加された機能は使えない、ということです。
|
30
|
-
|
31
|
-
性能面でも幾分オーバーヘッドがあります。手書きでシンプルに実装したバインディングとSWIGで自動生成したバインディングではシンプルに実装したバインディングの方が高速です。バインディングのメソッドを大量に呼び出す(何万回とか)場合は影響があるでしょう。
|
32
|
-
|
33
|
-
これまでのバインディングの作成方法ではインストールの難しさが難点としてでていました。これはC言語を使っていることが原因です。つまり、C言語を使わずにバインディングを作れればインストールが簡単になります。その方法はFFI(Foreign Function Interface)を使う方法です。なお、最近のRubyで使えるFFIの実装はすべてlibffiというライブラリーを使っています。
|
34
|
-
|
35
|
-
FFIを使うとRubyでバインディングを書くことができます。拡張ライブラリーでやっていたことをRubyで書けるようになっただけで、1つずつ機能をラップしていかなければいけない点は変わりませんが、それをCではなくRubyで書けるようになることで書きやすくなっています。
|
36
|
-
|
37
|
-
バインディングにC言語を使わなくなったことによりバインディングのインストールは確かに簡単になるのですが、バインディングが動くためにはラップ対象のライブラリーは依然として必要です。そのため、Windowsユーザーがインストールしにくいという点はそれほど解決されていません。
|
38
|
-
|
39
|
-
また、バインディングを書く言語がCからRubyになっているので手間は減ってはいますが、対象の機能がたくさんあると結局手間なのは変わりません。
|
40
|
-
|
41
|
-
さらに、FFIを使うとSWIGを使ったときよりも性能が落ちます。
|
42
|
-
|
43
|
-
TODO
|
44
|
-
|
45
|
-
|
46
|
-
## まとめ
|
47
|
-
|
48
|
-
クリアコードは9月8日から10日にかけて開催されるRubyKaigi 2016にスピーカー・スポンサーとして参加します。この機会に多くの人と交流できることを期待しています。それでは、RubyKaigi 2016で会いましょう。
|