Nginxのimage_filterのパッチを作った

先日の記事で書いたNginxでの画像サーバーの構成は順調稼働中。
ただ、一つだけ変更したいなという点が出てきた。

構成3

image_filterモジュールなのだが、
resizeやcropの指定サイズが元画像より大きい時は、
画像に手を加えずにそのまま返すようになっているようだ。

無駄なリソース使わないためはそうなるよね、
と思うのだけど、jpegのqualityを指定したい時には、
その指定も無視されてしまう。

そもそも元画像のクオリティ落とせばいいんじゃない?
と言われそうだけど、一応quality高い画像を保持しておいて、
表示する時にだけquality落としたい時もある。
そこで、ngx_http_image_filter_module.cに手を入れることにする。

だいぶ前に書いた、
nginxを一台のサーバーで複数動かす
で、8080ポートでもう一つNginxを動かしているので、
そちらのソースコードを修正して、
ログを出すようにして問題箇所を探る。
(今回のバージョンは1.5.13)

545行目~の


if (rc == NGX_OK
    && ctx->width <= ctx->max_width
    && ctx->height <= ctx->max_height
    && ctx->angle == 0
    && !ctx->force)
{
    return ngx_http_image_asis(r, ctx);
}

と、773行目~の


if (!ctx->force
    && ctx->angle == 0
    && (ngx_uint_t) sx <= ctx->max_width
    && (ngx_uint_t) sy <= ctx->max_height)
{
    gdImageDestroy(src);
    return ngx_http_image_asis(r, ctx);
}

が原因だね。

resizeやcropで指定されたサイズが元画像より大きい時に、
処理を止めてしまうのが原因のようだ。

そこで、元画像より大きくても、
nginx.conf中のimage_filter_jpeg_qualityの指定と同じ個所で、

image_filter_jpeg_quality_force 1

と指定してやることで、jpegのquality指定が効くようにするパッチを作ってみた。

ngx_http_image_filter_module.c-1.5.13.patch

やっていることは、image_filter_jpeg_quality_forceの指定の追加と、
指定があれば、上に書いた条件分岐を回避するようにしただけ。

こういうのできるのが、オープンソースの面白いところだよね。
ApacheやNginxの仕組みを調べたり、
簡単なモジュールを自作してみたりすると、
開発する時の考え方やアプローチが変わってくると思うので、
やったことない人は、勉強がてら遊んでみるといいと思うよ。

…ちなみに社内で

「image_filterモジュールのパッチ作って」

と言ったらドン引きされたので、
仕方なく自作したのは内緒です。

面白い仕事だと思うんだけどなぁ。

「2019年までXP継続」って大変だろうなぁ

東京電力、「2019年までXP継続」の報道に対しコメント

こんな感じのイメージなんだろうなぁ。

a0002_002882

老朽化したシステムの入れ替え。
システム管理の担当者が頭を悩ませる仕事。

確かに大変な労力を使うのだけど、
僕は結構好きな仕事だったりする。
社内でもちょうどその話をしていたところ。

多くの人の意見を聞くと大概面倒なことになる。
だから2019年になっちゃうんだろうなぁと想像。

大企業の場合はいろいろと違う問題があるのだろうし、
会社によってはいろいろな事情があるでしょうから、
他社さんのことは何も言いません。

そこで、自社案件などで、
僕がシステムのリプレイスを短期間で行うコツと思っていることを。
それは、

必要だと思われるものしか移行しないこと

既存のシステムの完全移行をしようとせず、
新しい環境を作って、そこに必要なものだけを移すことだ。
で、移行期間を作って一定の短期間古いものを残しておく。

何年かシステムやPCに改変を加えていくと、
古くて使ってないものや、
サポートされていないソフトウェアなどが出てくる。

そういうのは無理に移行して、全て動くようにするよりは、
「新しい環境作っといたから、そっちで設定し直して」
くらいの方がいい。

「必要ですか?」と聞くと「一応必要」と言われるのだけど、
実際は全く使われてないものが多数。

なので、必要と思われるものだけ移しちゃって、
「足りないものあったら今月中に言ってください」
くらいでよかったりする。

もし本当に必要なものなら、
すぐに「あれが動かない!」と言われるので、
その時きちんと対応すればいいんだから。
何も言われないものは、そもそも不必要ってことだしね。

仕事をしていて、よく、
「古いバージョン使っている人もいるから、
それもそのまま動くようにしておいて」
と言われることがあるけど、
iOSの開発環境やTwitter、FacebookのAPIなどのように、
「○○日までにこのAPI終了だから対応してね」
とバッサバッサ切っていくスタンスの方が好き。

※システムについては古いものはどんどん切りますが、
古くからの友達は割と大事にする方だと思います、たぶん。

プログラミングダイエット

プログラミングをしながら痩せるわけではないです。

diet

順調に体重を落としているのですが、
きちんと数字を管理してやってます。
ダイエットプログラムをきちんと組んでいるということで。

何をやっているかというと、
カロリー計算をきちんとしているだけ。

成人男性の1日の消費カロリーは、2200~2300kcal。
7日間で約1万5000kcal。

脂肪1kgを燃焼させるのに必要なのは7000kcal。

一週間単位で考えて、

15000 + 運動での消費カロリー – 摂取カロリー = 3500kcal。

としていくと、一週間で500gずつ落ちる計算になる。
これを繰り返していけばいい。

やり方については、よく世の中で言われていることと、
自分で考えていることが違うことがいくつかあるので、
僕の見解を書いてみる。
(専門家でないので、正否の判断は自己責任でお願いします)

__________________________________________________________
1. 運動したらやせる

確かにやせるのですが、相当の量が必要になります。
最初に載せたグラフの期間内に、
僕が走った距離は80kmちょっとしかない。

だいたい6分弱/kmで走っているので、
時速10km(運動強度 10メッツ)、
この期間の平均くらいの体重73kgで計算してみると、
80km走るのには8時間なので、

1.05 × 10 × 8 × 73 = 6132kcal。

つまり、運動で落としている分は1kgにも満たないのですね。

よく、「今日はジムに行ったから」と、
ご褒美的なものを飲み食いしている人がいますが、
逆に太るんじゃないかなと思う。

2. ○○したから1kg落ちた!

上の説明読めばわかるよね。そんなに簡単に変動しない。

胃腸の内容物や、体内の水分量によって、
1kgくらいの変動は毎日あるので、
単にそれが減っただけ。
質量保存の法則だね。

なので、1日単位で数値を見て一喜一憂するよりも、
7日くらいの移動平均を指標にした方がいいかと。

3. 我慢が必要

僕の知り合いに裏を取ってもらえばわかりますが、
この期間中、普通に何度か飲みに行って、
しっかり飲み食いしている。

7日単位で考えているので、
まぁそういう日はしょうがないよねと。
その分他の日に落とすか、その分走ればいい。

あとは、消費カロリーしか気にしていないので、
食べたいものを食べてます。

油使ったものだったり、炭水化物だったり取っても、
きちんと消費すればいい。

摂取する総量(総カロリー)は気にするけど、
その中身はほとんど気にしてない。

あと、僕は「何かを我慢する」だと続きにくいので、
逆に3500kcalをどうやって積み立てるか?との発想でやってます。

4. 1日2食は太りやすい?

よく2食だと基礎代謝が減るとか言われますが、
100kcal/日 も変動しないと思うのですよね。
(これに関しては調べてないので間違ってたらすみません)

摂取カロリーを抑えるなら、
個人的には食事回数が少ない方が楽。

1日2食だと、600kcalというのがマジックナンバーかと。
1食をそれくらいに抑えられれば、
もう1食は何も気にせず食べても、
間食をなくして、飲み物での摂取カロリーを0にすれば、
1日で500kcal落とせる計算。
お酒飲みたければ、その分もう少し減らせばいい。
__________________________________________________________

一応こんな感じでやってるけど、
数字が大好きな僕にしか向いてないかなーと。
パスタ茹でる前に重さ計ったりするくらいなので。

何人かに聞かれて、やり方話したけど、
「そもそもそれ管理できる人は太らないよね」
とのことです。

明日は肉のヒマラヤに登頂する予定です。