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
go-thumber-imagick
Search
yoya
March 14, 2017
Technology
1
150
go-thumber-imagick
Go-Thumber に ImageMagick をつなげた話
yoya
March 14, 2017
Tweet
Share
More Decks by yoya
See All by yoya
resize_nitpick
yoya
1
130
ImageFluxBinary
yoya
2
2.4k
HEIF-kaisetsu
yoya
4
3k
chokaizomae
yoya
2
470
wildimagebinary
yoya
1
190
goimagicksyokai
yoya
2
990
GoImagickThumbnail
yoya
0
1.3k
sushigazou
yoya
0
11k
twitterimgupload
yoya
0
330
Other Decks in Technology
See All in Technology
私が trocco を推す理由
__allllllllez__
1
240
DMM.com アルファ室採用案内資料
hsugita
1
160
ExaDB-D dbaascli で出来ること
oracle4engineer
PRO
0
2.1k
どうするコスト最適化のトレードオフ
tetsuyaooooo
1
530
ServiceNow Knowledge Learning Rise up
manarobot
0
210
IaCジェネレーターとBedrockで詳細設計書を生成してみた
tsukasa_ishimaru
1
280
ChatGPT for IT Service Management (IT Pro)
dahatake
7
1.6k
Terraformあれやこれ/terraform-this-and-that
emiki
8
1.4k
Azure犬駆動開発の記録/GlobalAzureFukuoka2024_20240420
nina01
1
220
Janus
bkuhlmann
1
490
Kernel MemoryでAzure OpenAI Serviceとお手軽データソース連携
mitsuzono
1
260
Google Cloud Next '24でブログを10本書いた方法と勉強会を沸かせた方法
yasumuusan
0
300
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
302
110k
Fireside Chat
paigeccino
21
2.6k
Build The Right Thing And Hit Your Dates
maggiecrowley
24
2k
Intergalactic Javascript Robots from Outer Space
tanoku
266
26k
From Idea to $5000 a Month in 5 Months
shpigford
377
45k
Done Done
chrislema
178
15k
Navigating Team Friction
lara
178
13k
Being A Developer After 40
akosma
57
580k
The World Runs on Bad Software
bkeepers
PRO
61
6.7k
Designing for humans not robots
tammielis
248
25k
A Modern Web Designer's Workflow
chriscoyier
689
190k
The Brand Is Dead. Long Live the Brand.
mthomps
49
29k
Transcript
pixiv/go-thumber に ImageMagickをつなげた話 2017/03/14(Tue) “よや” <
[email protected]
> Go言語 GoImagick ImageMagick
はじめに pixiv/go-thumber をネタにした Go言語 と ImageMagick の話 ◦ Pixiv
さんの業務と直接関係ない話でごめ んなさい
もくじ pixiv/go-thumber について go-thumber + ImageMagick GoImagick
について ImageMagick 使用上の注意 画像プロキシ使用上の注意
pixiv/go-thumber とは https://github.com/pixiv/go-thumber by Google翻訳
go-thumber 資料 by pixiv サムネイルマスタとgo-thumber ◦ https://speakerdeck.com/harukasan/use- thumbnail-master-with-go-thumber
go-thumber の使い所 端末によって解像密度が違う (retina とか) ◦ Storage に全サイズの画像を置きたいか? Storage
に(大きめの) 画像がひとつあれば User の欲しいサイズ の画像を都度作る
go-thumber の構造 go の net/http + swscale(ffmpeg) + libjpeg
go-thumber thumberd go package net/http ffmpeg libswscale thumbnail libjpeg jpeg swscale mkthum cgo cgo HTTPプロキシ 縮小/拡大 JPEG入出力
go-thumber で物足りないとこ 案件によっては機能が足りない ◦ JPEGのみで、PNG, GIFが使えない ◦ 画像合成とかできない (ロゴとか)
◦ 文字入れできない (著作権表示とか) Gopher
go-thumber 改造案 辛い! (YUV とか JPEG 決め打ちの作りなので尚更) go-thumber thumberd
go package net/http ffmpeg libswscale thumbnail libjpeg jpeg swscale mkthum png gif libpng giflib libavfilter avfilter cgo cgo cgo cgo cgo 画像合成, 文字入れ 縮小/拡大
ImageMagick でOK (1/2) 画像を処理したいメソッドが大体揃っ ている ◦ リサイズ ◦ フィルタ
◦ 画像合成 ◦ 文字入れ Gopher
ImageMagick で OK (2/2) メジャーな画像フォーマットからマイ ナーなものまで100種類以上に対応して る http://www.imagemagick.org/script/
formats.php png jpeg gif inline sixel webp svg pdf 超メジャー 最近の キワモノ系 (Webの base64画像と か) ベクター画像 dcm 医療系 (DICOM等) 古いの sun
Go で ImageMagick を使うには 公式サイトを見る ◦ http://imagemagick.org/script/api.php#go MagickWand
と MagickCore の Go バ インディング ◦ GoImagick はMagickCore の定義を取り入 れるけど、関数は MagickWand だけ使う
GoImagick とは https://github.com/gographics/imagick MagickWand API (C言語)の Go バイン
ディング (thin ラッパー) ◦ Go 言語で ImageMagick の機能が大体使える
go-thumber + ImageMagick GoImagick でつなげる yoya-thumber thumberd go package net/http
GoImagick imagick thumbnail ImageMagick MagickWand cgo
yoya-thumber https://github.com/smartnews/yoya- thumber Yoya-thumberのOSS公開に寄せて ◦ http://developer.smartnews.com/blog/ 2016/12/19/yoya-thumber/
yoya-thumber と go-thumber ◦ http://blog.awm.jp/2017/01/01/yoya-thumber/
動作サンプル go-thumber と同じよ うなパラメータ
ImageMagick の注意点 沢山の画像形式に対応しすぎ ◦ 脆弱性が入り易い (マイナーな形式は危険 ◦ 形式を絞る必要がある
処理が重たい ◦ 画像データ全部をメモリ展開する ◦ 文字入れはじめの1回目がめっちゃ重たい
ImageMagick security policy Policy.xml で拒否する形式を指定 ◦ ブラックリスト形式でした (過去形)
漏れがあるかも。。 バージョンアップで新しい形式が増え たら? <policymap> <policy domain="coder" rights="none" pattern="MVG" /> <policy domain="coder" rights="none" pattern=”GIF" /> </policymnap>
Yoya-thumber では バイナリみて知らない形式を排除 https://github.com/smartnews/yoya-thumber/blob/master/thumbnail/ thumbnail_magick.go#L182
ImageMagick security policy改良 ◦ ImageMagick 6.9.7-7 で仕様追加 ホワイトリスト形式 <policymap>
<policy domain=”delegate” rights=“none” pattern=“*” /> <policy domain="coder" rights=”none" pattern=”*" /> <policy domain="coder" rights=”all" pattern=”{PNG,JPEG,GIF,WEBP}" /> </policymnap>
GIF アニメ辛い ImageMagick は全コマをメモリに展開 するので、すぐメモリ不足になる 仕方ないので、ImageMagick に GIF
バ イナリを渡す前に、バイナリを編集し て1コマのGIFアニメにする。
GIFアニメは1枚のみ(力づく) https://github.com/smartnews/yoya-thumber/blob/master/thumbnail/ thumbnail_magick.go#L232
画像 Proxy の注意点 サーバを素のまま晒すと危険 というか、F5 しなくても普通に死ぬ。 thumberd Client
F5連打 CPU が死ぬ!
Reverse proxy キャッシュを仕込む (F5 耐性) サーバ nginx thumberd reverse
proxy 8000 80 80,443 upstream Client
更に forward proxy サイズ違いでアクセスし直さない サーバ nginx thumberd reverse proxy
nginx forward proxy 8000 80 80,443 3128 upstream Client
はじめの一歩が辛い問題 URL 公開した時の①発めは cache が 効かない問題 サーバ nginx thumberd
Client 絶賛 処理中 やっぱり CPU が死ぬ!
Nginx proxy_cache_lock 処理中の URL アクセスは待たせる! サーバ nginx thumberd Client
絶賛 処理中
ImageProxy as A Service 画像プロキシのクラウドサービス ◦ 面倒ならそういうのを使った方が楽 https://www.sakura.ad.jp/services/
imageflux/
ImageFlux
まとめ go-thumber 改造楽しい GoImagick 結構いいよ Reverse proxy
大事 Nginx proxy_cache_lock すごい ImageFlux みたいなクラウドサービス もあるよ