rabbit-slide-kou-railstokyo-2 2025.12.18.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2eab15d87caf0d1a6781641aa67ce02384de91d8af744277d4438a60697434a7
4
+ data.tar.gz: da5f94d51b7c81ce9f5ee4be5e036b14486d2ac6df730398e852440822c15c90
5
+ SHA512:
6
+ metadata.gz: 9cb6d90233ab49a03789dd05e0d4584d7661e44d72f9800e4038eb2fa083972546054ebcabe0cac01237096eb11bb48aba370fe8d632595e2ef25cf17eb6d2e4
7
+ data.tar.gz: 8107d20f2b888785fb48b363d4d91881f89dc68801d384ce2a9e3074e6a205ed0ab40755a527a68ffb3d769c124fbe64882e3748c31729b975706d8c8acb8c26
data/.rabbit ADDED
@@ -0,0 +1,2 @@
1
+ --size 960,540
2
+ active-record-adbc-adapter.rab
data/README.rd ADDED
@@ -0,0 +1,39 @@
1
+ = Active Record ADBC adapter
2
+
3
+ ((<ADBC|URL:https://arrow.apache.org/adbc/>))というApache Arrowを使った高速なDB接続APIがあります。Active RecordのAPIでADBCを使えるようにActive Recordのアダプターを開発しました。どんなときにうれしいのかを自慢して、このアダプターが必要なRailsアプリケーション開発者がいるのか確かめます。
4
+
5
+ == ライセンス
6
+
7
+ === スライド
8
+
9
+ CC BY-SA 4.0
10
+
11
+ 原著作者:須藤功平
12
+
13
+ ==== 株式会社クリアコードのロゴ
14
+
15
+ CC BY-SA 4.0
16
+
17
+ 原著作者:株式会社クリアコード
18
+
19
+ ページヘッダーで使っています。
20
+
21
+ == 作者向け
22
+
23
+ === 表示
24
+
25
+ rake
26
+
27
+ === 公開
28
+
29
+ rake publish
30
+
31
+ == 閲覧者向け
32
+
33
+ === インストール
34
+
35
+ gem install rabbit-slide-kou-railstokyo-2
36
+
37
+ === 表示
38
+
39
+ rabbit rabbit-slide-kou-railstokyo-2.gem
data/Rakefile ADDED
@@ -0,0 +1,17 @@
1
+ require "rabbit/task/slide"
2
+
3
+ # Edit ./config.yaml to customize meta data
4
+
5
+ spec = nil
6
+ Rabbit::Task::Slide.new do |task|
7
+ spec = task.spec
8
+ # spec.files += Dir.glob("doc/**/*.*")
9
+ # spec.files -= Dir.glob("private/**/*.*")
10
+ spec.add_runtime_dependency("rabbit-theme-clear-code")
11
+ end
12
+
13
+ desc "Tag #{spec.version}"
14
+ task :tag do
15
+ sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
16
+ sh("git", "push", "--tags")
17
+ end
@@ -0,0 +1,247 @@
1
+ = Active Record ADBC adapter
2
+
3
+ : author
4
+ 須藤功平
5
+ : institution
6
+ 株式会社クリアコード
7
+ : content-source
8
+ RailsTokyo#2【sponsored by 株式会社タイミー】
9
+ : date
10
+ 2025-12-18
11
+ : allotted-time
12
+ 15m
13
+ # : start-time
14
+ # 2025-12-18T19:20:00+09:00
15
+ # : end-time
16
+ # 2025-12-18T19:35:00+09:00
17
+ : theme
18
+ clear-code
19
+
20
+ = 私が今日実現したいこと
21
+
22
+ * Railsアプリ開発者の意見を聞きたい
23
+ * 私はRailsアプリをほとんど書かないから
24
+ * RailsアプリでDBと高速に大量データを\n
25
+ やりとりできるとうれしいかを知りたい
26
+ * バッチ処理でうれしいとかでもいい
27
+
28
+ = 背景
29
+
30
+ * Webアプリ以外でもRubyが使われるといいな
31
+ * たとえばデータ処理とか
32
+ * Red Data Tools: (('note:((<URL:https://red-data-tools.github.io/ja/>))'))
33
+ * Ruby用のデータ処理ツールを提供するプロジェクト
34
+ * Railsアプリ開発者向けのやつを\n
35
+ 提供するといいかも?
36
+
37
+ = Railsアプリでのデータの場所
38
+
39
+ データベースでしょ!
40
+
41
+ = Active Record ADBC adapter
42
+
43
+ (('note:((<URL:https://github.com/red-data-tools/activerecord-adbc-adapter>))'))
44
+
45
+ * Active RecordでADBCを使えるアダプター
46
+ * ADBC: Apache Arrowで高速データ交換
47
+ * ADBCもDB接続を抽象化!\n
48
+ (('note:Active Recordのアダプターと同じ'))
49
+
50
+ (('tag:margin-bottom * 10'))
51
+
52
+ # image
53
+ # src = images/active-record-adapter.svg
54
+ # align = right
55
+ # relative-margin-right = -10
56
+ # relative-margin-top = 20
57
+ # relative_width = 50
58
+
59
+ = ロード
60
+
61
+ * DB: PostgreSQL
62
+ * 数値カラム100個
63
+ * 1万行
64
+ * 低いほど速い
65
+ * 生SQLよりも約5倍速い\n
66
+ (('note:INSERT INTO VALUES'))
67
+ * PGアダプターより約40倍速い\n
68
+ (('note:insert_all'))
69
+
70
+ # charty
71
+ # backend = pyplot
72
+ # align = right
73
+ # vertical-align = top
74
+ # relative-margin-right = -10
75
+ # relative_height = 80
76
+ # type = bar
77
+ # x = Approach
78
+ # y = Elapsed time (sec)
79
+ Approach,Elapsed time (sec)
80
+ ADBC,0.075787
81
+ SQL,0.350767
82
+ Active Record,2.844029
83
+
84
+ = ダンプ
85
+
86
+ * DB: PostgreSQL
87
+ * 数値カラム100個
88
+ * 1万行
89
+ * 低いほど速い
90
+ * 生SQLよりも約2倍速い\n
91
+ (('note:SELECT *'))
92
+ * PGアダプターより約5倍速い\n
93
+ (('note:pluck'))
94
+
95
+ # charty
96
+ # backend = pyplot
97
+ # align = right
98
+ # vertical-align = top
99
+ # relative-margin-right = -10
100
+ # relative_height = 80
101
+ # type = bar
102
+ # x = Approach
103
+ # y = Elapsed time (sec)
104
+ Approach,Elapsed time (sec)
105
+ ADBC,0.067801
106
+ SQL,0.123201
107
+ Active Record,0.283621
108
+
109
+ = なぜ速いのか?
110
+
111
+ 変換が少ない・最適化されている\n
112
+ (('note:PostgreSQLならCOPYを使うとか'))
113
+
114
+ # RT
115
+
116
+ 手法, 変換, 最適化
117
+ INSERT, ((*少ない*))👍, なし
118
+ ADBC, ((*少ない*))👍, ((*あり*))👍
119
+ (({insert_all})), 多い, なし
120
+
121
+ = 生SQLで最適化すればいいんじゃない?
122
+
123
+ * 各自ががんばる?
124
+ * みんなで一緒にがんばって共有しない?
125
+ * Apache Arrowが目指している世界観
126
+ * ADBCでも同じ
127
+ * 言語を超えて共有したい
128
+
129
+ = 使い方
130
+
131
+ * 標準の複数データベース対応機能を使う
132
+ * メインのDB設定とは別にADBC用設定を用意
133
+ * ADBCは大量データ用
134
+ * レコード単位での操作は既存アダプターの方がよい
135
+
136
+ = 複数データベース対応機能:設定
137
+
138
+ # rouge yaml
139
+
140
+ production:
141
+ primary:
142
+ adapter: postgresql
143
+ ...
144
+ adbc:
145
+ adapter: adbc
146
+ driver: adbc_driver_postgresql
147
+ ...
148
+
149
+ = 複数データベース対応機能:モデル
150
+
151
+ # rouge ruby
152
+
153
+ # app/models/adbc_application_record.rb
154
+ class AdbcApplicationRecord < ActiveRecord::Base
155
+ include ActiveRecordADBCAdapter::Ingest # 高速ロード用
156
+ self.abstract_class = true
157
+ # :adbcは設定ファイル内のキーと合わせる
158
+ connects_to database: { writing: :adbc, reading: :adbc }
159
+ end
160
+
161
+ # app/models/adbc_event.rb
162
+ class AdbcEvent < AdbcApplicationRecord
163
+ # クラス名にAdbcをつけたのでテーブル名を指定
164
+ self.table_name = :events
165
+ end
166
+
167
+ = 使い分ける
168
+
169
+ # rouge ruby
170
+
171
+ # レコード単位での操作は通常のモデルを使う
172
+ Event.find(id)
173
+
174
+ # 大量データを扱うときはAdbcXXXモデルを使う
175
+ AdbcEvent.all.to_arrow
176
+
177
+ = 私が今日実現したいこと
178
+
179
+ * Railsアプリ開発者の意見を聞きたい
180
+ * 私はRailsアプリをほとんど書かないから
181
+ * RailsアプリでDBと高速に大量データを\n
182
+ やりとりできるとうれしいかを知りたい
183
+ * バッチ処理でうれしいとかでもいい
184
+
185
+ = 高速な大量データ以外のメリット
186
+
187
+ * ADBC対応DBに接続できる\n
188
+ (('note:((<URL:https://arrow.apache.org/adbc/current/driver/status.html>))'))
189
+
190
+ = ARでつなぎにくそうなADBC対応DB
191
+
192
+ * DuckDB
193
+ * 「DuckDB実践入門」がこの間出版されたよ!\n
194
+ (('note:((<URL:https://darashi.net/2025/09/19/duckdb-in-action-ja/>))'))
195
+ * Google BigQuery
196
+ * Snowflake
197
+
198
+ (('tag:center'))
199
+ これらはデータ分析用DB
200
+
201
+ = Active Recordで分析用DBにアクセス
202
+
203
+ * うれしい。。。の?
204
+ * ARのAPIは分析用SQL向けじゃない
205
+ * 1レコードを1オブジェクトで扱うAPIだから当然
206
+ * 分析用SQL:window関数とか
207
+ * ちょっとやってみたけど不便。。。
208
+ * 私のActive Record力不足?
209
+
210
+ = 事例
211
+
212
+ # image
213
+ # src = images/user.png
214
+ # relative_width = 70
215
+
216
+ (('tag:margin-bottom * -0.5'))
217
+ (('tag:center'))
218
+ (('note:ADBC経由でDuckDBをRailsアプリに組み込んだよ!'))
219
+
220
+ = 私が今日実現したいこと
221
+
222
+ * Railsアプリ開発者の意見を聞きたい
223
+ * 私はRailsアプリをほとんど書かないから
224
+ * RailsアプリでDBと高速に大量データを\n
225
+ やりとりできるとうれしいかを知りたい
226
+ * バッチ処理でうれしいとかでもいい
227
+
228
+ = お誘い
229
+
230
+ * Red Data Tools: (('note:((<URL:https://red-data-tools.github.io/ja/>))'))
231
+ * Ruby用のデータ処理ツールを提供するプロジェクト
232
+ * 一緒に開発したい人はチャットに来てね
233
+ * (('note:((<URL:https://app.element.io/#/room/#red-data-tools-ja:matrix.org>))'))
234
+ * 毎週水曜日の12:15-12:45にライブ開発\n
235
+ したりもしているよ
236
+ * Red Data Tools開発者に聞け!\n
237
+ (('note:((<URL:https://www.youtube.com/playlist?list=PLKb0MEIU7gvQOIACKgdgKuAE7cMPDuTE6>))'))
238
+
239
+ = お願い
240
+
241
+ * そろそろRuby 4.0.0リリースだよ
242
+ * 今のうちに触ってみて
243
+ * 問題があったら報告して
244
+ * リリースまでに直せるかも
245
+ * csv/strscan/stringio/rexml/rdoc/rubygems\n
246
+ あたりは私も見てるよ
247
+ * 口頭で相談でもいいよ
data/config.yaml ADDED
@@ -0,0 +1,26 @@
1
+ ---
2
+ id: railstokyo-2
3
+ base_name: active-record-adbc-adapter
4
+ tags:
5
+ - activerecord
6
+ - adbc
7
+ - apachearrow
8
+ - rabbit
9
+ presentation_date: 2025-12-18
10
+ version: 2025.12.18.0
11
+ licenses:
12
+ - CC-BY-SA-4.0
13
+ slideshare_id:
14
+ speaker_deck_id:
15
+ vimeo_id:
16
+ youtube_id:
17
+ width: 960
18
+ height: 540
19
+ source_code_uri: "https://gitlab.com/ktou/rabbit-slide-kou-railstokyo-2"
20
+ author:
21
+ markup_language: :rd
22
+ name: 須藤功平
23
+ email: kou@clear-code.com
24
+ rubygems_user: kou
25
+ slideshare_user:
26
+ speaker_deck_user: kou
@@ -0,0 +1,294 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ width="134.608mm"
6
+ height="67.047997mm"
7
+ viewBox="0 0 134.608 67.047997"
8
+ version="1.1"
9
+ id="svg1"
10
+ inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
11
+ sodipodi:docname="active-record-adapter.svg"
12
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
14
+ xmlns="http://www.w3.org/2000/svg"
15
+ xmlns:svg="http://www.w3.org/2000/svg">
16
+ <sodipodi:namedview
17
+ id="namedview1"
18
+ pagecolor="#ffffff"
19
+ bordercolor="#000000"
20
+ borderopacity="0.25"
21
+ inkscape:showpageshadow="2"
22
+ inkscape:pageopacity="0.0"
23
+ inkscape:pagecheckerboard="0"
24
+ inkscape:deskcolor="#d1d1d1"
25
+ inkscape:document-units="mm"
26
+ inkscape:zoom="1.0333895"
27
+ inkscape:cx="46.44909"
28
+ inkscape:cy="355.142"
29
+ inkscape:window-width="1906"
30
+ inkscape:window-height="1269"
31
+ inkscape:window-x="26"
32
+ inkscape:window-y="23"
33
+ inkscape:window-maximized="0"
34
+ inkscape:current-layer="layer1" />
35
+ <defs
36
+ id="defs1">
37
+ <marker
38
+ style="overflow:visible"
39
+ id="marker13"
40
+ refX="0"
41
+ refY="0"
42
+ orient="auto-start-reverse"
43
+ inkscape:stockid="Triangle arrow"
44
+ markerWidth="1"
45
+ markerHeight="1"
46
+ viewBox="0 0 1 1"
47
+ inkscape:isstock="true"
48
+ inkscape:collect="always"
49
+ preserveAspectRatio="xMidYMid">
50
+ <path
51
+ transform="scale(0.5)"
52
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
53
+ d="M 5.77,0 -2.88,5 V -5 Z"
54
+ id="path13" />
55
+ </marker>
56
+ <marker
57
+ style="overflow:visible"
58
+ id="Triangle"
59
+ refX="0"
60
+ refY="0"
61
+ orient="auto-start-reverse"
62
+ inkscape:stockid="Triangle arrow"
63
+ markerWidth="1"
64
+ markerHeight="1"
65
+ viewBox="0 0 1 1"
66
+ inkscape:isstock="true"
67
+ inkscape:collect="always"
68
+ preserveAspectRatio="xMidYMid">
69
+ <path
70
+ transform="scale(0.5)"
71
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
72
+ d="M 5.77,0 -2.88,5 V -5 Z"
73
+ id="path135" />
74
+ </marker>
75
+ <marker
76
+ style="overflow:visible"
77
+ id="marker13-7"
78
+ refX="0"
79
+ refY="0"
80
+ orient="auto-start-reverse"
81
+ inkscape:stockid="Triangle arrow"
82
+ markerWidth="1"
83
+ markerHeight="1"
84
+ viewBox="0 0 1 1"
85
+ inkscape:isstock="true"
86
+ inkscape:collect="always"
87
+ preserveAspectRatio="xMidYMid">
88
+ <path
89
+ transform="scale(0.5)"
90
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
91
+ d="M 5.77,0 -2.88,5 V -5 Z"
92
+ id="path13-3" />
93
+ </marker>
94
+ <marker
95
+ style="overflow:visible"
96
+ id="marker13-7-1"
97
+ refX="0"
98
+ refY="0"
99
+ orient="auto-start-reverse"
100
+ inkscape:stockid="Triangle arrow"
101
+ markerWidth="1"
102
+ markerHeight="1"
103
+ viewBox="0 0 1 1"
104
+ inkscape:isstock="true"
105
+ inkscape:collect="always"
106
+ preserveAspectRatio="xMidYMid">
107
+ <path
108
+ transform="scale(0.5)"
109
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
110
+ d="M 5.77,0 -2.88,5 V -5 Z"
111
+ id="path13-3-9" />
112
+ </marker>
113
+ <marker
114
+ style="overflow:visible"
115
+ id="marker13-0"
116
+ refX="0"
117
+ refY="0"
118
+ orient="auto-start-reverse"
119
+ inkscape:stockid="Triangle arrow"
120
+ markerWidth="1"
121
+ markerHeight="1"
122
+ viewBox="0 0 1 1"
123
+ inkscape:isstock="true"
124
+ inkscape:collect="always"
125
+ preserveAspectRatio="xMidYMid">
126
+ <path
127
+ transform="scale(0.5)"
128
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
129
+ d="M 5.77,0 -2.88,5 V -5 Z"
130
+ id="path13-36" />
131
+ </marker>
132
+ <marker
133
+ style="overflow:visible"
134
+ id="marker13-7-1-7"
135
+ refX="0"
136
+ refY="0"
137
+ orient="auto-start-reverse"
138
+ inkscape:stockid="Triangle arrow"
139
+ markerWidth="1"
140
+ markerHeight="1"
141
+ viewBox="0 0 1 1"
142
+ inkscape:isstock="true"
143
+ inkscape:collect="always"
144
+ preserveAspectRatio="xMidYMid">
145
+ <path
146
+ transform="scale(0.5)"
147
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
148
+ d="M 5.77,0 -2.88,5 V -5 Z"
149
+ id="path13-3-9-6" />
150
+ </marker>
151
+ </defs>
152
+ <g
153
+ inkscape:label="Layer 1"
154
+ inkscape:groupmode="layer"
155
+ id="layer1"
156
+ transform="translate(-58.254603,-37.930232)">
157
+ <text
158
+ xml:space="preserve"
159
+ style="font-size:8.46666969px;line-height:1.5;text-align:start;writing-mode:lr-tb;direction:ltr;text-anchor:start;fill:#000000;stroke-width:0.0127;-inkscape-font-specification:'Monospace, Normal';font-family:Monospace;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
160
+ x="63.085266"
161
+ y="80.677567"
162
+ id="text1"><tspan
163
+ sodipodi:role="line"
164
+ id="tspan1"
165
+ style="stroke-width:0.0127;-inkscape-font-specification:'Monospace, Normal';font-family:Monospace;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:8.46666969px;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
166
+ x="63.085266"
167
+ y="80.677567">AR</tspan></text>
168
+ <text
169
+ xml:space="preserve"
170
+ style="font-size:8.46666969px;line-height:1.5;text-align:start;writing-mode:lr-tb;direction:ltr;text-anchor:start;fill:#000000;stroke-width:0.0127;-inkscape-font-specification:'Monospace, Normal';font-family:Monospace;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
171
+ x="146.20622"
172
+ y="63.631893"
173
+ id="text2"><tspan
174
+ sodipodi:role="line"
175
+ id="tspan2"
176
+ style="stroke-width:0.0127;-inkscape-font-specification:'Monospace, Normal';font-family:Monospace;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:8.46666969px;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
177
+ x="146.20622"
178
+ y="63.631893">PostgreSQL</tspan></text>
179
+ <text
180
+ xml:space="preserve"
181
+ style="font-size:8.46666969px;line-height:1.5;text-align:start;writing-mode:lr-tb;direction:ltr;text-anchor:start;fill:#000000;stroke-width:0.0127;-inkscape-font-specification:'Monospace, Normal';font-family:Monospace;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
182
+ x="154.63055"
183
+ y="98.708618"
184
+ id="text4"><tspan
185
+ sodipodi:role="line"
186
+ id="tspan4"
187
+ style="stroke-width:0.0127;-inkscape-font-specification:'Monospace, Normal';font-family:Monospace;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:8.46666969px;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
188
+ x="154.63055"
189
+ y="98.708618">SQLite</tspan></text>
190
+ <text
191
+ xml:space="preserve"
192
+ style="font-size:8.46666969px;line-height:1.5;text-align:start;writing-mode:lr-tb;direction:ltr;text-anchor:start;fill:#000000;stroke-width:0.0127;-inkscape-font-specification:'Monospace, Normal';font-family:Monospace;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
193
+ x="154.68211"
194
+ y="81.371017"
195
+ id="text4-1"><tspan
196
+ sodipodi:role="line"
197
+ id="tspan4-5"
198
+ style="stroke-width:0.0127;-inkscape-font-specification:'Monospace, Normal';font-family:Monospace;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:8.46666969px;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
199
+ x="154.68211"
200
+ y="81.371017">DuckDB</tspan></text>
201
+ <text
202
+ xml:space="preserve"
203
+ style="font-size:8.46666969px;line-height:1.5;text-align:start;writing-mode:lr-tb;direction:ltr;text-anchor:start;fill:#000000;stroke-width:0.0127;-inkscape-font-specification:'Monospace, Normal';font-family:Monospace;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
204
+ x="165.53362"
205
+ y="49.823952"
206
+ id="text5"><tspan
207
+ sodipodi:role="line"
208
+ id="tspan5"
209
+ style="stroke-width:0.0127;-inkscape-font-specification:'Monospace, Normal';font-family:Monospace;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:8.46666969px;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
210
+ x="165.53362"
211
+ y="49.823952">DB</tspan></text>
212
+ <text
213
+ xml:space="preserve"
214
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666969px;line-height:1.5;font-family:Monospace;-inkscape-font-specification:'Monospace, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:start;writing-mode:lr-tb;direction:ltr;text-anchor:start;white-space:pre;inline-size:48.3906;display:inline;fill:#000000;stroke-width:0.0127"
215
+ x="96.268959"
216
+ y="34.30862"
217
+ id="text6"
218
+ transform="translate(-4.9853452,15.732291)"><tspan
219
+ x="96.268959"
220
+ y="34.30862"
221
+ id="tspan3">アダプター</tspan></text>
222
+ <text
223
+ xml:space="preserve"
224
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666969px;line-height:1.5;font-family:Monospace;-inkscape-font-specification:'Monospace, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:start;writing-mode:lr-tb;direction:ltr;text-anchor:start;fill:#000000;stroke-width:0.0127"
225
+ x="105.76666"
226
+ y="62.863792"
227
+ id="text7"><tspan
228
+ sodipodi:role="line"
229
+ id="tspan6"
230
+ style="stroke-width:0.0127;-inkscape-font-specification:'Monospace, Normal';font-family:Monospace;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:8.46666969px;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
231
+ x="105.76666"
232
+ y="62.863792">pg</tspan></text>
233
+ <text
234
+ xml:space="preserve"
235
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666969px;line-height:1.5;font-family:Monospace;-inkscape-font-specification:'Monospace, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:start;writing-mode:lr-tb;direction:ltr;text-anchor:start;fill:#000000;stroke-width:0.0127"
236
+ x="95.140991"
237
+ y="97.684479"
238
+ id="text8"><tspan
239
+ sodipodi:role="line"
240
+ id="tspan7"
241
+ style="stroke-width:0.0127;-inkscape-font-specification:'Monospace, Normal';font-family:Monospace;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:8.46666969px;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
242
+ x="95.140991"
243
+ y="97.684479">sqlite3</tspan></text>
244
+ <text
245
+ xml:space="preserve"
246
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666969px;line-height:1.5;font-family:Monospace;-inkscape-font-specification:'Monospace, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:0.0127"
247
+ x="109.97414"
248
+ y="83.090523"
249
+ id="text10"><tspan
250
+ sodipodi:role="line"
251
+ id="tspan10"
252
+ style="stroke-width:0.0127;-inkscape-font-specification:'Monospace, Normal';font-family:Monospace;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:8.46666969px;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
253
+ x="109.97414"
254
+ y="83.090523">ADBC</tspan></text>
255
+ <path
256
+ style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;marker-end:url(#Triangle)"
257
+ d="M 77.830632,73.193394 102.4076,62.135801"
258
+ id="path11"
259
+ sodipodi:nodetypes="cc" />
260
+ <path
261
+ style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;marker-end:url(#marker13)"
262
+ d="M 76.945688,80.274137 H 97.684482"
263
+ id="path12"
264
+ sodipodi:nodetypes="cc" />
265
+ <path
266
+ style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;marker-end:url(#marker13)"
267
+ d="m 76.945688,85.650863 15.128684,7.266946"
268
+ id="path14"
269
+ sodipodi:nodetypes="cc" />
270
+ <path
271
+ style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;marker-end:url(#marker13)"
272
+ d="m 118.42328,59.535344 h 23.55517"
273
+ id="path16" />
274
+ <path
275
+ style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;marker-end:url(#marker13-0)"
276
+ d="m 127.24561,95.044305 h 23.55517"
277
+ id="path16-6" />
278
+ <path
279
+ style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;marker-end:url(#marker13-7)"
280
+ d="M 121.15165,79.699333 144.70682,67.921748"
281
+ id="path16-2"
282
+ sodipodi:nodetypes="cc" />
283
+ <path
284
+ style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;marker-end:url(#marker13-7-1)"
285
+ d="m 121.10189,81.726769 29.7,7.425"
286
+ id="path16-2-8"
287
+ sodipodi:nodetypes="cc" />
288
+ <path
289
+ style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;marker-end:url(#marker13-7-1-7)"
290
+ d="m 122.79219,80.443916 27.39569,-1.280172"
291
+ id="path16-2-8-9"
292
+ sodipodi:nodetypes="cc" />
293
+ </g>
294
+ </svg>
data/images/user.png ADDED
Binary file
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-kou-railstokyo-2
3
+ version: !ruby/object:Gem::Version
4
+ version: 2025.12.18.0
5
+ platform: ruby
6
+ authors:
7
+ - 須藤功平
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 2025-12-18 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rabbit
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: 2.0.2
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: 2.0.2
26
+ - !ruby/object:Gem::Dependency
27
+ name: rabbit-theme-clear-code
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ description: "((<ADBC|URL:https://arrow.apache.org/adbc/>))というApache Arrowを使った高速なDB接続APIがあります。Active
41
+ RecordのAPIでADBCを使えるようにActive Recordのアダプターを開発しました。どんなときにうれしいのかを自慢して、このアダプターが必要なRailsアプリケーション開発者がいるのか確かめます。"
42
+ email:
43
+ - kou@clear-code.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".rabbit"
49
+ - README.rd
50
+ - Rakefile
51
+ - active-record-adbc-adapter.rab
52
+ - config.yaml
53
+ - images/active-record-adapter.svg
54
+ - images/user.png
55
+ - pdf/railstokyo-2-active-record-adbc-adapter.pdf
56
+ homepage: https://slide.rabbit-shocker.org/authors/kou/railstokyo-2/
57
+ licenses:
58
+ - CC-BY-SA-4.0
59
+ metadata:
60
+ source_code_uri: https://gitlab.com/ktou/rabbit-slide-kou-railstokyo-2
61
+ markup_language: rd
62
+ rdoc_options: []
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ requirements: []
76
+ rubygems_version: 4.0.2
77
+ specification_version: 4
78
+ summary: Active Record ADBC adapter
79
+ test_files: []