@@ -93,13 +93,23 @@ created_on: 2025-01-27
93
93
94
94
* 録画: https://example.com/
95
95
96
- 僕は、Ruby そして Rails からキャリアを始めた都会っ子です。
96
+ moznion さんの発表内容は、Rails と Perl の違いを比較しながら、それぞれの特徴をもとにした開発スタイルに焦点を当てたものでした。
97
+ それらの違いを「Simple vs Easy」の構図で語っていた点が印象的です。
97
98
98
- キャリアの最初は Rails の easy 具合がイマイチ掴めていなかったんですが、キャリアを経て違う言語を触ってみることで Rails ってほんとに便利だなと気づいたことを思い出しました。
99
+ 例えば、Rails は、規約があるフルスタックなフレームワークで Easy に作れる仕組みがある一方、隠蔽されている部分が複雑です。
100
+ 一方で、Perl などの Simple 組み合わせでは、必要なものだけを組み込めたり、自分たちのベストプラクティスを作れたりする柔軟性があります。
101
+ とはいえ、Simple と Easy は完全に相反するものではないという点が重要なポイントです。
99
102
100
- 話を聞きながら、Rails が詳細を隠蔽しており、クオリティコントロールが容易な面やオンボーディングが楽という側面は、ビジネスを進める上でコスト感が見積りやすく採用しやすい部分はあるよなあと思っていました。
103
+ Rails と Perl などの Simple 組み合わせは、それぞれが Easy と Simple を両立しています。
104
+ Rails は、作るための仕組みは Easy ですが、ビジネスロジックは Simple に実現できます。
105
+ 一方、Perl などの Simple 組み合わせは、最大公約数的な Easy ではなく、ドメインに特化した Easy を Simple とともに得られます。
101
106
102
- 逆に Rails が easy だからこそ中身が気になってしまう人が多いのではなかろうかなども。
107
+ 私は Simple 組み合わせ村の経験はあまりありませんが、自社のドメイン知識をベースにシステムを考えていくことで、確かにドメインに特化した Easy と Simple が得られるのだろうと感じました。
108
+ 逆に Rails は "Rails Way" という言葉があるように、最大公約数的な Easy と Simple を目指しているのだなという気づきも得られました。
109
+
110
+ 特に印象的だったのは、「Simple 組み合わせでは自分たちに最適化したベストプラクティスを作れるので、レールを外れることを恐れなくて良くなる」という部分です。
111
+ Rails を書いている身としては、レールに沿っているかを気にする場面があるので、確かにと共感しました。
112
+ レールに沿ったものがベストプラクティスであるため、ベストプラクティスを考える手間はある程度省けており、ドメインロジックの実現に集中できるということなのだと思いました。
103
113
104
114
改めて Rails の立ち位置を考える機会となった発表でした!
105
115
@@ -112,17 +122,71 @@ created_on: 2025-01-27
112
122
113
123
* 録画: https://example.com/
114
124
115
- PDF の構造は知らなかったので、知見となることも多く、自分だったらどう書くんだろうと思いながら拝見させていただきました。
116
-
117
- どんどん適度な粒度で抽象化されていく過程を楽しく眺めていました。
118
-
119
- PDF の位置指定は結構めんどくさい気がするので、ご自身のスライドの調整もちょっと苦労されたのかなあと勘ぐったりしました。
120
-
121
- 業務で使っているツールなどをハックして再実装するなどの試みは、そのツールとの機能差分が比較できてより理解が深まって良いですよね!
122
-
123
- 自分も何か Ruby で再実装できないかなあと思いました。
124
-
125
- 発表のスライド自体もご自身が書いた DSL で生成するというオチも素晴らしかったです(笑)
125
+ Ogawa さんは、Ruby DSL を使って PDF を生成するという内容でした。
126
+
127
+ PDF の仕様の話をすると、ヘッダー / ボディー / クロスリファレンステーブル / トレイラー の4つで構成されているようです。
128
+ その内、ボディー部のオブジェクトの構造は下記のようになっています。(一部省略)
129
+
130
+ ```
131
+ 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj
132
+ 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj
133
+ 3 0 obj << /Type /Page /Parent 2 0 R /MediaBox [ 0 0 720 405 ]
134
+ /Resources 4 0 R /Contents 5 0 R >> endobj
135
+ ...
136
+ xref
137
+ 0 6
138
+ 0000000000 65535 f
139
+ 0000000009 00000 n
140
+ 0000000058 00000 n
141
+ 0000000115 00000 n
142
+ 0000000227 00000 n
143
+ 0000000319 00000 n
144
+ ```
145
+
146
+ この構造を見ると、Catalog -> Pages <-> Page -> コンテンツストリーム という流れが見えてきます。
147
+ Catalog がエントリポイントとなり、Pages が描画するページを探し、Page で実際のコンテンツをたどる流れです。
148
+
149
+ また、数字の羅列はクロスリファレンステーブルというもので、ファイル内の各オブジェクトの位置を一覧化した情報です。
150
+ 例えば ` 0000000009 00000 n ` という記述は、「このオブジェクトは PDF ファイルの 9 バイト目にある」ということを示しています。
151
+
152
+ この情報があることで、PDF の任意のページにランダムアクセスが可能になります。もしこの情報がなければ、目的のページにアクセスするために 1 ページ目から順に読む必要があるでしょう。
153
+ しかし、人間がこの計算を行うのは難しいため、DSL 側でオフセット計算をしながら PDF を組み立てる仕組みになっていました。
154
+
155
+ ``` ruby
156
+ class OffsetIO
157
+ attr_reader :offset
158
+ def initialize (io )
159
+ @io = io
160
+ @offset = 0
161
+ end
162
+ def << (b )
163
+ @io << b
164
+ @offset += b.bytesize
165
+ end
166
+ end
167
+
168
+ code do
169
+ content <<~RUBY , style: JotPDF ::Tokyork12 ::Highlighter ::Ruby
170
+ def obj
171
+ @io << " obj "
172
+ yield
173
+ @io << " endobj"
174
+ end
175
+ RUBY
176
+ list x: 350 , y: 150 , size: 25 , color: 0xffffff do
177
+ item " Ruby にはブロックがある"
178
+ end
179
+ end
180
+ ```
181
+
182
+ 紹介のあったコードの一部を抜粋しましたが、` << ` メソッドを使ってクロスリファレンステーブルのバイトサイズを計算しつつ、content ブロック内で PDF の中身を組み立てる構造になっています。
183
+ ブロック構文を利用することで階層構造が視覚的に明確になり、code ブロックの中に content の内容や list の内容が含まれるという構図がわかりやすくなっています。
184
+
185
+ 適度な粒度で抽象化されていく DSL の構築過程をとても楽しんで拝見しました。
186
+ 業務で使っているツールなどをハックして再実装する試みは、そのツールとの機能差分を比較でき、より深い理解につながるので良いですよね!
187
+ 私も何か Ruby で再実装できないかと考えさせられました。
188
+
189
+ さらに、発表のスライド自体もご自身が作った DSL で生成されていたというオチも素晴らしかったです(笑)。
126
190
127
191
(dak2)
128
192
0 commit comments