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
180
go-thumber-imagick
Go-Thumber に ImageMagick をつなげた話
yoya
March 14, 2017
Tweet
Share
More Decks by yoya
See All by yoya
resize_nitpick
yoya
1
150
ImageFluxBinary
yoya
2
2.8k
HEIF-kaisetsu
yoya
4
3.3k
chokaizomae
yoya
2
570
wildimagebinary
yoya
1
220
goimagicksyokai
yoya
2
1.1k
GoImagickThumbnail
yoya
0
1.6k
sushigazou
yoya
0
12k
twitterimgupload
yoya
0
380
Other Decks in Technology
See All in Technology
2025年になってもまだMySQLが好き
yoku0825
8
4.5k
企業の生成AIガバナンスにおけるエージェントとセキュリティ
lycorptech_jp
PRO
2
140
機械学習を扱うプラットフォーム開発と運用事例
lycorptech_jp
PRO
0
220
エラーとアクセシビリティ
schktjm
1
1.2k
おやつは300円まで!の最適化を模索してみた
techtekt
PRO
0
290
AWSを利用する上で知っておきたい名前解決のはなし(10分版)
nagisa53
9
2.9k
生成AIでセキュリティ運用を効率化する話
sakaitakeshi
0
440
人工衛星のファームウェアをRustで書く理由
koba789
11
6.5k
COVESA VSSによる車両データモデルの標準化とAWS IoT FleetWiseの活用
osawa
1
250
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
8.7k
AI時代に非連続な成長を実現するエンジニアリング戦略
sansantech
PRO
3
1.2k
Aurora DSQLはサーバーレスアーキテクチャの常識を変えるのか
iwatatomoya
0
140
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.6k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
131
19k
KATA
mclloyd
32
14k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.4k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
We Have a Design System, Now What?
morganepeng
53
7.8k
jQuery: Nuts, Bolts and Bling
dougneiner
64
7.9k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.6k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
The Cult of Friendly URLs
andyhume
79
6.6k
Site-Speed That Sticks
csswizardry
10
810
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 みたいなクラウドサービス もあるよ