imagemagicで画像の一括リサイズ(名前も変更する)編

次のフォルダ構成に格納されている画像を

g
├── x001
│   ├── 0.png
│   ├── a.jpg
├── x002
│   ├── b.jpg
└── x003
    ├── 0.jpg
    ├── 1.jpg

こんな感じにしたい。

g
├── x001
│   ├── 0.png
│   ├── 0_300x300.png
│   ├── a.jpg
│   ├── a_300x300.jpg
├── x002
│   ├── b.jpg
│   ├── b_300x300.jpg
└── x003
    ├── 0.jpg
   ├── 0_300x300.jpg
    ├── 1.jpg
   ├── 1_300x300.jpg

次のようなコマンドになる。

find . -regex "\.\/.*\/[0-9]*\..*" | xargs -P8 -I{} convert {} -set filename:x "%d/%t_300x300.%e" -resize 300x300 "%[filename:x]"

それぞれ解説。

対象画像のリストアップ

findコマンドで正規表現を利用する - 屑プログラマの憂鬱 を参照

xargsを使ってImageMagickに渡す

pipeを利用すると、findの結果数が多くて処理が落ちてしまうので、xargsを利用してImageMagickに一つ一つ渡してあげます。

xargs -P8 -I{}

-P8 は、プロセスの並列数です。ImageMagickのconvertが並列で8つ立ち上がります。PCの性能が許す限り増やしていきましょう。

-I {} は、findの実行結果であるファイル名が入る置換文字列を利用するというオプションです。

ImageMagickでリサイズする

ImageMagickのconvertを利用します。基本的なリサイズ方法としては次のとおりです。アスペクト比を保ちつつリサイズしてくれます。

convert input_file -resize  (width)x(height)  output_file

ファイル名を変更する場合は、次のようになります。

-set filename:x "%d/%t_300x300.%e"で、filename:xという変数に"%d/%t_300x300.%e"を代入し、出力ファイル名として、\"%[filename:x]"(filename:xという変数そのままを出力結果とする)としています。

  • %dは、対象ファイルのディレクトリ名
  • %tは、対象ファイルのファイル名。ただし、ディレクトリと拡張子を除く
  • %eは、対象ファイルの拡張子

他にも属性は存在して、Format and Print Image Properties @ ImageMagick にまとまっています。

findコマンドで正規表現を利用する

次のようなフォルダ構成があります。

g
├── x001
│   ├── 0.png
│   ├── a.jpg
├── x002
│   ├── b.jpg
└── x003
    ├── 0.jpg
    ├── 1.jpg

0.jpgや0.pngのようなファイル名が数字のものをリストアップさせる場合、findで正規表現を利用します。

find . -regex "\.\/.*\/[0-9]*\..*"
./x001/0.png
./x003/0.jpg
./x003/1.jpg

なお、「./」もヒットさせる必要があることに注意。これで時間を無駄に使いました。

RubyでCSVファイルに記載されたURLの画像をダウンロードする

書捨てのプログラムを作成したので貼る。

require 'csv'
require 'fileutils'
require 'open-uri'

csv_data = CSV.read('image_url.csv')
puts "start..."

csv_data.each do |data|
  id = data[0]
  url = data[1]
  sleep(2) #2秒待つ

  FileUtils.mkdir_p("./images/#{id}")
  begin
    open(url) do |file|
      open("./images/#{id}/0.jpg", "w+b") do |out|
        out.write(file.read)
      end
    end
  rescue OpenURI::HTTPError => e
    p e
  end


  p data
end

puts "complete!"

ビジネスエアポート東京という皇居の濠端を臨むレンタルオフィス

business-airport.net

JR東京駅からも徒歩7分とアクセス抜群で、「移動に便利」「お客様を招きやすい」と好評です。皇居の濠端を臨むロケーションにあり、ラウンジから見える豊かな緑が癒しを与えてくれます。

皇居の濠端を臨むという最高なロケーションだったので利用してみた。

会員でなくても一日5000円で利用可能。

安くない金額だが、皇居の濠端を臨みながら行う仕事は、エリートになった気分です。ただ、安価でいい場所は他にもありそう。

Laravelのベストプラクティス

Laravelの開発におけるベストプラクティスがまとめられている。

It's not a Laravel adaptation of SOLID principles, patterns etc. Here you'll find the best practices which are usually ignored in real life Laravel projects.

github.com

有益な情報がコンパクトにまとまっていて良い。

知っている内容は多かったが、LaravelからJavascriptにデータを渡す際に次のようにするのは新しい知見だ。Jsのオーバーヘッドは気になるが、確かにJsonで渡せば型情報を渡せるわな。

<input id="article" type="hidden" value="@json($article)">
let article = $('#article').val();

vagrantでよく時間が狂うから時刻合わせをする

ntpdate -u ntp.nict.jp

RedHat7系以降の場合は、NTPサーバとしてchronycが利用されているので次のコマンド

chronyc makestep

qiita.com

テキストエディタの正規表現でWhere In句の一部を生成する

a001
a002
a003

といった文字列から

'a001', 'a002', 'a003'

みたいなのをテキストエディタで生成したい。

CotEditorの場合次のとおりになる。

検索条件

^(.*)\n

置換条件

'$1',