さっそくプロセスプログラミングを役立ててみた

結婚式の写真が届いたので親戚に届けたい。

けどこれが3MB*700枚=2GBくらいのデータ量となってしまって、これをいきなりダウンロードしてねというのはあまり相手の環境を考慮していないだろう。

塊は塊でダウンロードしてもらうこともできるとして、webブラウザで手軽に見れる方法があってもいいはず。

webブラウザで表示しようとすると全部は無理なのでページングするしかない。

ページングしたとしても一枚で3MBの画像が何十個と並ぶのもイマイチな感じがする。

webブラウザから見る分には画質をある程度落として手軽に見れるようにすると良さそうだ。

高画質版は別途ダウンロードしてねという感じ。

そのためには700枚の画像をimage magickで縮小すればいいけど、この作業も1回だけとは限らないのでプログラマならスクリプト化したい。

以上タテマエ。

以下完成した8並列で700枚の画像を20%にリサイズするスクリプト。

root_path = "../../app/assets/images"
from_dir = "all_image"
to_dir = "thumb"
pids = []

Dir.chdir root_path do
  Dir.glob("#{from_dir}/*") do |from_path|
    puts from_path
    pids << fork do
      Process.exec(['convert', '-geometry', '20%', from_path, from_path.sub(/all_image/, to_dir)].join(' '))
    end
    if 8 <= pids.length
      pid,status = Process.wait2
      unless pids.delete(pid)
        fail status.inspect
      end
    end
  end
end

Process.waitall

かなり適当だけど、これで最大プロセスを8個に抑えつつ並列で処理できる。 一個ずつの時より測ってないけど感覚的にはだいぶ速い。

この感じ、慣れるとスニペット的に使えそう。