Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
MiniMagickの型を生成したい
Search
a_fujisaki
August 01, 2024
Programming
0
53
MiniMagickの型を生成したい
a_fujisaki
August 01, 2024
Tweet
Share
More Decks by a_fujisaki
See All by a_fujisaki
rbs-inlineを使ってみた
aki19035vc
0
47
Emacs × LSP × Steep
aki19035vc
0
88
最近追加した型の紹介とその振り返り
aki19035vc
0
310
Other Decks in Programming
See All in Programming
Ebitengineの1vs1ゲーム WebRTCの活用
ponyo877
0
370
Why Prism?
kddnewton
4
1.7k
A New Era of Testing
mannodermaus
2
130
GraphQLの魅力を引き出すAndroidクライアント実装
morux2
3
290
マイグレーションコード自作して File-Based Routing に自動移行!! ~250 ページの歴史的経緯を添えて~
cut0
1
250
GraphQL あるいは React における自律的なデータ取得について
quramy
11
2.7k
開発を加速する共有Swift Package実践
elmetal
PRO
0
380
What we keep in mind when migrating from Serverless Framework to AWS CDK and AWS SAM
kasacchiful
1
140
労務ドメインを快適に開発する方法 / How to Comfortably Develop in the Labor Domain
yuki21
1
250
The Future of Frontend i18n : Intl.MessageFormat
sajikix
1
2.5k
Understand the mechanism! Let's do screenshots tests of Compose Previews with various variations / 仕組みから理解する!Composeプレビューを様々なバリエーションでスクリーンショットテストしよう
sumio
3
350
Amazon Neptuneで始める初めてのグラフDB ー グラフDBを使う意味を考える ー
satoshi256kbyte
2
240
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
128
8.8k
It's Worth the Effort
3n
182
27k
Producing Creativity
orderedlist
PRO
340
39k
What’s in a name? Adding method to the madness
productmarketing
PRO
21
3k
Designing for Performance
lara
604
68k
Practical Orchestrator
shlominoach
185
10k
Raft: Consensus for Rubyists
vanstee
135
6.5k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
225
22k
WebSockets: Embracing the real-time Web
robhawkes
59
7.3k
Designing on Purpose - Digital PM Summit 2013
jponch
113
6.8k
In The Pink: A Labor of Love
frogandcode
139
22k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Transcript
MiniMagickの型を生成したい Roppongi.rb#21 2024-08-01 @aki19035vc
自己紹介 ❏ 藤崎 亮人 ❏ @aki19035vc ❏ 所属: イタンジ株式会社 ❏
バックエンドエンジニア ❏ 不動産物件データベースの基盤開発 ❏ 学生の頃からEmacs使ってます
今日話すこと ❏ MiniMagickの型の話 ❏ MiniMagickの基本的な型の追加と困ったこと ❏ ImageMagickのドキュメントから型を生成するGemの紹介 ❏ https://github.com/aki19035vc/rbs_mini_magick ※
前回の Roppongi.rb#20 で話した内容の続き ※ 型についての基本的な解説はしません
なぜMiniMagickに型をつけるのか ❏ 業務で書いているRailsアプリケーションでは型をほぼ100%書いている ❏ MiniMagickの型がなかったので、必要な部分は自前で書いていた ❏ 他のRailsアプリケーションでも使いたい事もある ❏ せっかくなのでコミュニティに還元していきたい
そもそもMiniMagickとは ❏ ImageMagickという画像を扱うソフトウェアのRubyバインディング ❏ 画像をリサイズしたりフォーマットを変換したりできる $ magick mogrify -resize 100x100
-format png -write output.png input.jpg require "mini_magick" image = MiniMagick::Image.open("input.jpg") image.resize "100x100" image.format "png" image.write "output.png"
MiniMagickの基本的な型を追加した ❏ MiniMagickのソースコードを読んで型を書く ❏ 人力型推論なので意外と大変 ❏ gem_rbs_collectionにPRを出す (自分でマージできる) ❏ 4.13:
https://github.com/ruby/gem_rbs_collection/pull/616 ❏ 5.0 : https://github.com/ruby/gem_rbs_collection/pull/629
困ったこと ❏ method_missing で黒魔術してる ❏ ImageMagickのコマンドを作るDSLが提供されているイメージ ❏ 使用可能なオプションが何百と存在するため、それら全てをメソッドとして定義するのは大 変 module
MiniMagick class Tool def method_missing(name, *args) option = "-#{name.to_s.tr('_', '-')}" self << option self.merge!(args) self end end end image.resize "100x100" image.format "png" image.write "output.png" #=> これらのメソッドは定義されていない
ドキュメントから型を生成する Gemを作った ❏ プロジェクトのsigディレクトリにMiniMagickの型を出力する ❏ 内部的にはImageMagickのhelpオプションで出力されるusageを使用 している ❏ インストールされているImageMagickのバージョンで利用できる オプションに応じた型を生成できる
(はず) $ bundle exec rbs-mini-magick generate https://github.com/aki19035vc/rbs_mini_magick
None
今後やりたいこと ❏ MiniMagickの5系以外のバージョンへの対応 ❏ 今はMiniMagick 5.0 しか対応していない (5.0は最近出たばかり) ❏ 最低でも4.13には対応したい
❏ 複数バージョンに対応できるようには作ってはある ❏ ImageMagickの7.1 系以外でも正しく動くことを確認 ❏ 今はImageMagick 7.1 でした動作確認をしていない ❏ 最低でも7.0では動くことを確認したい (6.9は気が向いたら) ❏ 業務で使用しているRailsアプリケーションの型検査で使ってみる