11月から駒沢大学のCTCに派遣されて、 某A空輸の次期予約サイトのMonkey Testをやらされているんですが、 screen shotとかuploadするのに、何故か20kbという制限があります。 そんなの、Gimpとかフリーソフト使えば簡単なんですが、 入れさせてくれないんですよね。 なので、screen shotを撮るにはALT + PrintScreen、 編集はMicro$oft謹製のペイント、 pngでsave出来るようになっただけマシではありますが、 64bit colorでしか保存できないので、 sizeが無駄に大きくなっちゃって、 20kbなんてすぐ超えちゃうんですよね。 ImageMagick使えばそんなの、 convert infile.png -colors 256 outfile.png
で済むのに。
仕方無いので、縮小したりしていたんですが、 縮小すると何が書いてあるかわからないし。 そうだ、Web Applicationならinstallしなくてもいい、 と気付いたんですけど、 巷間のserviceに外部秘の画像を上げるのは気が引けたので、 なら自分で作ろうと。
オンプレミスなserverも持ってますが、 イマドキじゃないのと、 よく見たらオンプレミスserverにはImageMagickも入ってないですし。 まぁそれはapt-get install
一発で行けるからいいんですけど、 shell scriptでconvertすればいいから、 cgiでちゃちゃっと書いちゃおう、と思ったんですが。 POSTされたfile dataをparseするのが面倒かな、 と思ったのと、あと443が開いてないんですね。 なので、herokuに上げよう、と。 そうなるとrubyかな、と思ったので、調べてやってみました。
herokuの公式ruby用sampleを元に作れそう、だったので、 調べて、sinatra使ってるってわかって、 あとImageMagickはherokuに元々入ってて、 rubyはrmagicを使えるらしいということで、やりました。
cf.
Heroku導入メモ ruby sample あと$ build
? 1
2
$ git commit -a
$ git push heroku master
rmagicを使うには、以下の作業が必要でした。
Gemfileにgem 'rmagick', '~>2.15.4', :require => 'RMagick'
c9上でsudo apt-get install imagemagick libmagick++-dev
POSTされたfile dataの取得は、
1
2
image_filename = "./#{params[:file][:filename]}"
imagedata = params[:file][:tempfile].read
image dataの取得は、
1
image = Magick::Image.from_blob(imagedata).first
fileとしてのreturnは、
1
2
content_type = 'image/png'
attachment image_filename
image dataのbinary data取り出しは、
256色への減色は、
とするだけで8bit colorで保存されます。
最終的には、
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
require 'sinatra'
require "rmagick"
get '/' do
erb :index
end
post '/' do
if params[:file]
image_filename = "./#{params[:file][:filename]}"
imagedata = params[:file][:tempfile].read
image = Magick::Image.from_blob(imagedata).first
image.format = "PNG8"
content_type = 'image/png'
attachment image_filename
image.to_blob
end
end
あぁ、erbってのも初めて使いました。 ここへpostするためのplain htmlが書いてあります。