人類にとって必携の技術である ImageMagick 。その利用環境も、できるだけ人類にとって優しいものであってほしい。小ネタです。
最近の Google App Engine(GAE・Standard Environment)では第2世代のランタイム環境が使えるようになっており、そこではいくつかのシステムパッケージがサポートされている。利用可能なパッケージはここに記載されているのだけど、そのなかに imagemagick
が含まれている。
ちなみにいきなり脱線するのだけど、上記リンクは Go 1.12 以降の場合に利用可能なパッケージ一覧。Go 1.11 については ここ に掲載されていて、それ以前の環境になると、第1世代ということでシステムパッケージは含まれていない。
なるほど、じゃあ Go の 1.11 からが第2世代なのね、というと、実はそうではなく、App Engine スタンダード環境のランタイム | Google App Engine スタンダード環境のドキュメント によると、Go だと 1.12 からが第2世代ということになっている。ここらへんの解説は GAE Go 1.11 ランタイムが公式には 2nd gen ではなくなった件について - Qiita が詳しいので、気になる方はこちらを読まれたし。
話は戻って、ではシステムパッケージが含まれる環境で ImageMagick を使うにはどうすればいいか、というと、シンプルに外部コマンド呼び出しをすることになる。
err := exec.Command("convert", "-geometry", size, srcFilePath, destFilePath).Run()
ちなみに、いつからなのかは知らないが(第2世代から?それとももっと前かな)、GAE では /tmp
へのファイル書き出しもおこなえるようになっている。
なので、あなたの要件が許せば、ImageMagick に掛ける対象のファイルを /tmp
に書き出し、それに対して convert
をした結果も /tmp
に出力する、ということも可能。そういったコードを Go で書くなら TempDir、TempFile を使うとよさそう。ただし、上記ヘルプにも書いてあるとおり、 /tmp
に書き出されたものの実体は全てその GAE インスタンスの RAM にある感じなので、メモリも消費するし揮発もする、他のインスタンスとの共有もできない、などのことは考慮にいれておく必要はあります。
話題としては以上ですが、これを愚直にやってみているコードへのリンクを置いておきます、誰かの参考になれば。内容は、他所からとってきたSVGをPNGに変換して返す、というものになります。
grass-graph/convert.go at master · a-know/grass-graph · GitHub
なんかまずそうなところがあったら issue や Pull Request、その他なんでもいいので教えてくれると助かります。
ちなみに、Cloud Functions でも同様のことはできそうです。用途に合わせて使い分けられると良さそうですね。
Google Cloud Platform 実践Webアプリ開発 ストーリーで学ぶGoogle App Engine
- 作者:トップゲート
- 発売日: 2019/10/25
- メディア: 単行本