Seiichi Yonezawa

“How creativity is helped by failure”

2017-03-13

開発日記 #39

今週は更新するネタもなく、それどころかやる気というか根本的なモチベーションが全くありませんでした。しかし、2日も休んだ罪悪感からか、平日にやる気が戻ってきました。何かやろうと予定するとうまくいかないものですが、適当な作業ならそこそこ続く不思議。今に始まった話ではありませんが。さて、今週はサイトを何か作るのに仮の画像を用意しようと思ったのですが、毎回適当な画像をどこから拾ってこようか悩みます。単一色の画像や、Placehold.itの画像もいいのですが、やはりそれっぽい画像がいい。かといって、画像をいちいちダウンロードするのも面倒です。

何かあるたびにスクレイピングのスクリプトを書くのは楽しいのですが、今回はLorem Pixelからいくつか画像をダウンロードしてみました。ここは画像のバリエーションも多いし、基本的にいうことはないのですが、何枚か重複画像が出てしまいました。さて、前置きが長くなりましたが画像の重複をどうやって解消するかというのが今回のネタです。

RubyにはArray#uniqがあるので、もし配列上なら画像は簡単に整理できるのですが、なんせ画像です。じゃあいちいち画像をImageMagickのようなライブラリで読み込んでやる必要がある?いえいえ、インターネットからファイルをダウンロードする場合はハッシュアルゴリズムというものがあって、その画像が本物かどうかを確かめることができましたね。つまり、画像だろうが基本的にファイルサイズをもとに重複があるかどうか調べる事ができるわけです。

原理がわかったので早速書いて見ました。あまり綺麗なコードではありませんけど、なんとなくコード片を残したいと思ったので……。

Dir["*.jpg"].each do |file|
  next unless File.exists?(file)
  filesize = File.size(file)
  targets = Dir["*.jpg"].select { |target| File.size(target) == filesize && file != target }
  targets.each { |e| File.unlink(e) if File.exists?(e) }
end

非常に手続き型ですね。もうちょっと綺麗に書く方法は他にあるだろうと思いつつも、今日はこのあたりで。