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
[Roppongi.rb#20] groverのコードをなんとなく読んでみた
Search
ryichk
July 11, 2024
Programming
210
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
[Roppongi.rb#20] groverのコードをなんとなく読んでみた
Roppongi.rb#20
でLTしたスライドです!
ryichk
July 11, 2024
More Decks by ryichk
See All by ryichk
OAuth2.0、JWT 入門 / Introduction to OAuth2.0 and JWT
ryichk
0
100
「入門 監視」を読んでみた / I read "Practical Monitoring"
ryichk
0
100
Lambdalithという選択肢を検討中 / Considering the option of Lambdalith
ryichk
1
700
Other Decks in Programming
See All in Programming
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
120
Webプラットフォームで議論されているセキュリティ課題 / Security issues being discussed on Web Platforms
petamoriken
0
240
RSSとCodexを使ってX投稿自動化してみた
ochtum
0
110
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
130
デプロイ直後のレイテンシスパイクを調べたら、 Railsの仕様にたどり着いた
nhsykym
0
110
アクセシビリティから考える情報設計
high_g_engineer
0
300
Foundry Localでエージェント開発
seosoft
0
150
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
信頼性の目標を誰も求めてない
shubox
0
490
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
120
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
140
XHTMLが残したもの
yosuke_furukawa
PRO
2
440
Featured
See All Featured
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
560
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
660
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
370
Abbi's Birthday
coloredviolet
3
9.8k
How to make the Groovebox
asonas
2
2.4k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.1k
Google's AI Overviews - The New Search
badams
0
1.6k
Technical Leadership for Architectural Decision Making
baasie
3
560
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
270
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
840
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
230
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Transcript
groverのコードを なんとなく読んでみた Ryo Ichiki
自己紹介 3社目:HRテック系ベンチャー(現在) Ruby, TypeScript 2社目:不動産テック系ベンチャー Ruby, PHP, JavaScript 1社目:小さい受託開発会社 C#
大学:理学部(情報系ではない) C, R, Ruby GitHub:ryichk X:@ryichk_dev
groverとは? HTMLをPDFやPNG画像、JPEG画像に変換できるgemです。 内部でPuppeteerとChromiumを使って変換しています。 PuppeteerはChromeを操作するNode.jsのライブラリです。 なのでgroverを使うためにはNode.jsの環境も必要です。 https://github.com/Studiosity/grover
groverを知ったきっかけ HTMLをPDFに変換するメジャーなgemとしてwicked_pdfがあります。 このwicked_pdfを別のgemにリプレイスする必要がありました。 wicked_pdfは内部でwkhtmltopdfというライブラリ(gemではない)を使っています。 wkhtmltopdfは2023/1/2にアーカイブされておりメンテが終了している状態です。 EC2のOSをAmazon Linux 2023へアップグレードした際に動かなくなるリスクがあり、仮 に動いたとしても...
groverの他にも候補がありました ・ferrum ・prawn
Groverの使い方 https://github.com/Studiosity/grover?tab=readme-ov-file#usage
Railsで使う場合 https://github.com/Studiosity/grover?tab=readme-ov-file#from-a-view-template
Grover#to_pdf を見ていく
Grover#to_pdf 〜
Grover::Processor#convert
Grover::Processor#convert
Grover::Processor#spawn_process
Open3.#popen3について popen3(*cmd) -> [IO, IO, IO, Thread] 外部プログラムcmdを実行し、そのプロセスの標準入力、標準出力、標準エラー出力に 接続されたパイプと実行したプロセスを待つためのスレッドを4要素の配列で返す。 https://docs.ruby-lang.org/ja/latest/method/Open3/m/popen3.html
Open3.#popen3 を使って別プロセスを立ち上げ、 Node.js 経由で processor.cjs を実行している
Grover::Processor#convert
Grover::Processor#ensure_packages_are_initiated
Grover::Processor#ensure_packages_are_initiated 要はNode.jsのプロセスが問題なく起 動しているか確認している
Grover::Processor#convert
Grover::Processor#call_js_method
Grover::Processor#call_js_method
Grover::Processor#call_js_method つまり、 processor.cjsに method, url_or_html, options を渡している method = :pdf
processor.cjs(超ざっくり) 1. puppeteerでChromeブラウザを起動し、接続する 2. 引数で渡されたURL or HTML文字列をブラウザで読み込む 3. puppeteerのPage.pdf()メソッドを実行 a.
読み込んだページの PDFを生成する 4. 生成されたPDFを標準出力に書き出す 5. Chromeブラウザの接続を閉じて終了
まとめ・感想 ・groverはpuppeteerというNode.jsのライブラリを Ruby経由で無理やり操作するためのgemという感じ ・やっていることはシンプル。 ・だけど細かく見ていくと複雑 ・Ruby経由でNode.jsのライブラリを実行できるなら他にも色々できそう (Node.jsに限らず)
ご清聴ありがとうございました