PerlでJPEGのEXIFを取得してファイルを整理する

気づけば2月も半ばになり、新年とは言えない時期になってしまった。今年最初のネタはプログラマらしい話から。

僕はデジカメのファイルを溜め込みがち。ときどき意を決して、デジカメからファイルを全部パソコンに転送して、エクスプローラでEXIFをみながら、日付とイベントで名前をつけたフォルダを作ってその中に移動して整理する。

# 「溜め込むなよ」とか「もっとましなツール使え」とか言われそう

この間もSDカードが一杯になったので整理をしていて、ふと「この作業ってプログラム向きだね」と考えてしまった。

というわけで、久々の日曜プログラマ。

CPANを探せば、EXIFをとってくるようなものがきっとあるだろうと思って探すと、いくつかありそう。今回はImage-ExifToolを使うことにした。Windows環境なので、ActivePerlを使って実装。

僕のカメラ(Canon PowerShot G7)だと「CreateDate」という属性に撮影日が入ってたので、それを使うことにした。EXIFの取り決めとかはあんまり興味ないので調べなかった。許して。

JPEGファイルを並べたフォルダ内で実行すると「YYYY-MM-DD」というフォルダを作ってその中にファイルを移動するように実装してみた。

実行環境やカメラによってはうまく動かないかも。なのでAS-ISということで。うっかりファイルが消えたりしても責任とれません。

use strict;
use Image::ExifTool;
use File::Copy;
# ExifToolの用意
my $exif_tool = new Image::ExifTool;
my @file = glob('*.jpg');
for my $file (@file) {
# exif情報の取得
my $exif_info = $exif_tool->ImageInfo($file);
my $create_date = $exif_info->{'DateTimeOriginal'};
# 日付情報の切り出し
if ( $create_date =~ /(\d+):(\d+):(\d+)/ ) {
my $year  = $1;
my $month = $2;
my $day   = $3;
# ディレクトリの作成と移動
my $dir_name = "$year$month$day";
mkdir($dir_name);
move($file, $dir_name);
print "$file is moved.\n";
} else {
print "$file is NOT moved.\n";
}
}

続きを読む →

Config::GeneralでUTF-8のファイルを読み込む方法

僕はPerlで設定ファイルなどを扱うのにConfig::Generalをよく使う。もっと良いものがあるのかもしれないが、特に難しいところもなく、直感的に使えるので気に入っている。
ところが、設定ファイル中に日本語(UTF-8)があると、期待通りに動作をしてくれないことに気がついた。文字によっては化けたりするのだ。今まで困らなかったのが不思議なくらいだが、これまで設定ファイルに日本語を埋めたことがなかったのだろう。
この現象を回避するには、Config::Generalを初期化するときに、-UTF8オプションを渡してあげれば良い。
例えば、こんな感じ(たぶん)。

my $conf = Config::General->new(-ConfigFile => ‘xxx.conf’, -UTF8 => 1);
my %config = $conf->getall;

ところが、少し古いConfig::Generalにはこの-UTF8オプションがない。例えばDebian 4.0の標準パッケージがそうなのだ。
しかたがないので、ファイルの中身をいったん読み込んで、読み込んだ内容をConfig::Generalに渡すことにした。これならうまく動いてくれる。

open(CONF, ‘xxx.conf’);
my $buf;
while (<CONF>) {
$buf .= $_;
}
close(CONF);
my $conf = Config::General->new(-String => $buf);
my %config = $conf->getall;

もっといい方法がありそうだと思いつつも、それほど時間がないし、わりとどうでもいいツールだし、なので動けばいいやということで妥協しつつ、備忘録をかねてエントリにしておいた。
ちなみに、呼び出す側のPerlスクリプトもUTF-8で書くことと、以下の記述を入れておくことを忘れずに。

use utf8;
binmode STDOUT, “:utf8”;
use open IN => “:utf8”;

Perl世界のことはまだよく分からないので、添削・批評など大歓迎です。

読書熱

読書熱が高まっている。
通勤時間が長くなったことと、引越し後の収集がようやくついてきたこともあって、このところ割と本を買っている。
数えてみると、今月に入ってから買った本はすでに10冊ある。さらに定期購読の雑誌が7、8冊届く。積ん読していた雑誌のバックナンバーなども読んでいるので、割とハイペースで読み続けている。
しかし本を読みっぱなしというのも、inputばかりで非常にバランスの悪いことのように感じる。なんだか頭の中にモヤモヤとしたものを感じるのだ。
ときどきはノートをつけるなり、感想文を書くなりのoutputが必要なのだろう。頭の整理にもなるだろうし、自分の経験と著者の主張を重ねたり離したりすることで、いっそう重層的な読み方ができるようになるかもしれない。
さらに、昔は一度読めばどの辺にどんなことが書いてあったか意識できていた。必要になれば本棚から必要な本を取り出して調べられたのだ。ところがこの頃それができなくなりつつある。
たんなる記憶力の弱まりといえばその通りかもしれないけれど、昔できていたことができなくなるのは少々悲しい。これからは、内容の良い本については、何が書いてあるかくらいのメモは残しておきたい。
そういうわけで、少しずつ、読書のしかたを変えていくようにしたい。

午前I試験免除にお気をつけあれ

先日は春の情報処理技術者試験に行ってきた。
今年「も」システム監査にて受験。昨年の秋試験ではシステムアナリストに合格したので、今回は初めての「午前I試験免除」となった。朝早く行かなくて済むのは非常に助かる。
会場は立命館大の衣笠キャンパス。建物が立派すぎず、ぼろすぎず、これぞ大学、という雰囲気で良い印象を受けた。また、日曜にもかかわらず、図書館で集中している学生さんもおられる。なかなか熱心ですねえ。
大学生活が非常に長かったこともあって、こういう場所にいるだけで、なんだか心が落ち着く。やっぱり会社員から学生に戻りたいな。なんとか大義名分が立たないかな。
大変いい陽気のお昼過ぎだったこともあり、半ばぼーっとしつつ席に着く。ここで受験票をちらっと見て、やっと気づいた。
「午前IIとは何だ」
マニアの人はご存じだろうけども、この春からの新試験では、上位区分の午前試験は「午前I」と「午前II」に分かれたようなのだ。「午前I免除」を「午前免除」と空目していた私は午後から参加したのだけども、「午前II」は受けないとダメだった。完全なポカだ。というわけで、午後試験を受ける前に敗退決定。。。
昔と違って問題もすぐPDFで手に入るし、ここにいる意味もないかと思い、残念ながら速攻退散。僕は何をしに京都まで行ったんだ。。。
受験票をまじめに読めばあり得ないミスだけど、この試験を何度も受けて慣れていた油断がかえって裏目に出たようだ。
そういうわけで、「午前I試験免除」にはお気をつけあれ。

引越し

ふたたび引越した。
今後は何もない限りしばらく定住する予定。
これまで駅徒歩25分(以上?)だったけど、これからは徒歩4、5分になる。スーパーもコンビニも近くなって、涙が出るほど便利になった。あ、最寄り駅はかわらず堅田です。

lenny登場

Debian GNU/Linux 5.0、コードネームlennyがリリースされました。
というニュースを数日遅れで知るなんて、もうダメダメ。
そういえば前バージョンのetchも、検証用のVMWareに何回かインストールしてみた程度で、あんまり真面目に使っていないな。
SI業してるとDebianよりはRHEL(しかも古いやつ)とかと仲良くなってしまうし。
関係者の皆様に感謝しつつ、またそのうち試してみます(永遠の先送り?)。

システムアナリスト合格

なぜかシステムアナリスト試験に合格していた。
去年に引き続き、今年も無理無理と思って受けてきたので、受かった本人が一番驚いている。
午後Iは、なんと書いていいのかはっきりしない問題が多い。テクニカルエンジニアみたいにすっきり「これだ」と書けないのが嫌な感じを受ける。終わった時には去年と同じくらいの感じか、と思っていたのに100点もスコアが上がっていて驚いた(去年は午後Iで敗退だった)。
実感はないけれど、この一年の間に「おっさん向け」の作文がうまくなったのかもしれない。日本の会社員としては悪くないことなのだろうけど、技術屋としてはどうなんだろうなあ。
午後IIの論文については、これは全くの捏造だ(ぉぃ)。といっても、実際に関わった案件について、自分の2階層くらい上の人たちを見てきたことをベースに作ったので、リアリティはあったかと思う。仕事場の皆さん、ありがとう。
今回、論文対策として通信添削に申し込んでいて、ずいぶんと批判されたので、それを意識しつつ書けたのも良かったと思う。
棚ぼた的な合格だけど、せっかくだしこれからはシステムアナリスト的な活動(?)を増やしていけたら良いな。

モバイルシステム技術検定2級合格

合格していた。
一応モバイル関係の仕事をしているので、知らないネタの勉強になれば…と思って受けた。でも勉強というよりは知識の羅列な感じで、広く浅くの試験だった。
例えば赤外線通信のプロトコルスタックとかは、こういう機会でもないと一生知らないままだったと思う。技術の名称は出るけど、その中身についてあまり触れないところが、技術屋としては気になった。
試験は4択から選ぶ形式で、技術的常識がある人なら外れの選択肢を消すだけで合格できるんじゃないだろうか。公式解説書を読了しておけばまず問題ない感じ。
携帯電話関係の単語を一通り知っておきたい人には良いかもしれない。

出張終了

12月頭からの東京出張、3週間で終わることになった。
毎週の新幹線移動、ホテル生活は徐々に疲れがたまる。ほとんど外食してるのが良くないのかな。

東京出張

先週から東京出張しています。
先週は風邪気味で、仕事以外はひたすらホテルにこもって何もしなかったけど、今週はずいぶんましになりました。
いつまで続くかわからないけど、今月はだいたい(平日だけ)東京で過ごしそうです。