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
190
go-thumber-imagick
Go-Thumber に ImageMagick をつなげた話
yoya
March 14, 2017
Tweet
Share
More Decks by yoya
See All by yoya
resize_nitpick
yoya
1
160
ImageFluxBinary
yoya
2
2.9k
HEIF-kaisetsu
yoya
4
3.5k
chokaizomae
yoya
2
600
wildimagebinary
yoya
1
230
goimagicksyokai
yoya
2
1.1k
GoImagickThumbnail
yoya
0
1.7k
sushigazou
yoya
0
12k
twitterimgupload
yoya
0
400
Other Decks in Technology
See All in Technology
Oracle Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
5
1.1k
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
6
71k
Databricksアシスタントが自分で考えて動く時代に! エージェントモード体験もくもく会
taka_aki
0
310
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
10k
メタデータ同期に潜んでいた問題 〜 Cache Stampede 時の Cycle Wait を⾒つけた話
lycorptech_jp
PRO
0
140
Introduction to Bill One Development Engineer
sansan33
PRO
0
380
Claude Cowork Plugins を読む - Skills駆動型業務エージェント設計の実像と構造
knishioka
0
250
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
95k
自動テストが巻き起こした開発プロセス・チームの変化 / Impact of Automated Testing on Development Cycles and Team Dynamics
codmoninc
1
980
Kaggleの経験が実務にどう活きているか / kaggle_findy
sansan_randd
3
400
LINE Messengerの次世代ストレージ選定
lycorptech_jp
PRO
19
7.2k
ソフトウェアアーキテクトのための意思決定術: Create Decision Readiness—The Real Skill Behind Architectural Decision
snoozer05
PRO
29
8.7k
Featured
See All Featured
Build your cross-platform service in a week with App Engine
jlugia
234
18k
How to build a perfect <img>
jonoalderson
1
5.2k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.1k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Thoughts on Productivity
jonyablonski
75
5.1k
Agile that works and the tools we love
rasmusluckow
331
21k
Practical Orchestrator
shlominoach
191
11k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.1k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
370
Being A Developer After 40
akosma
91
590k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
KATA
mclloyd
PRO
35
15k
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 みたいなクラウドサービス もあるよ