選挙行ってきた

 ずいぶん間が空いたけど生きてますよ…

 今度の日曜は仕事なので前日投票行ってきた。前回は仕事帰りにと思って、投票所に着いたのが午後8時ちょうどで、もう後片付け始めてて投票できなかったしな。

 世間っていうかマスコミが色々騒ぎ立ててるけどね。そんなんどうでもよくて昔から基本的に入れるところは変えてない。いつも投票するときに候補者名を覚えてなくて、適当に目星つけて入れて間違ってはいなかったが、今回はちゃんと下調べしてみた。

…出馬してねえ!

 もうね、例の2つの保守政党と、新興宗教の3人しか出てないの。ガッカリだよ。つくづくだよ。

 消去法で選べとか、白票を投じると与党に有利だのとか言われてるみたいだが、だからって自分の入れたくない人間に入れる方がよっぽど自分のポリシーに反するので×と書いて出してきた。本当は白票のつもりで麻雀牌の「白」でも描いておこうかと思ったけど、まあさすがに悪ふざけはイカンかな、と。

 ところで辞めさせたい裁判官に×つけろってあるけど、何の資料もなく、名前だけ並べて書けっていわれてもねえ。

OmniWeb


 よく誤解されるのだが、私はMac派ではない。コンピュータをいじり始めたのは Windows95 からだし、趣味でも仕事でもWindowsをいじっている方が多い。で、何が言いたいかと言うと、最近まで OmniWeb を知らなかったということ。

 OmniWeb とはMac用(元々はUNIX系NeXT用)のブラウザ。1994年からある老舗のブラウザなのだが、全く聞いたこともなかった。Macだって一応10年以上使っている上、一時はブラウザマニアと自負するぐらい変なブラウザ(WebTV Viewerとか書院ブラウザ)を集めていたぐらいなのに。何でだろうと思ったら、最近まで有料(シェアウェア)だったから。金払うと聞いたら興味の対象から外れるってことか。実際、昔よく使ってた iCab の開発ベータが終わって有償になった途端、すっかり興味がなくなってしまったし。よく使うソフトなら寄付ウェアでも3,000円ぐらいお金払うけど、滅多に起動しないものにはたとえ500円でもお金を払いたくないんだよね。

 で、無料版になって初めて使う OmniWeb なのだがインターフェイスが独特。タブはツールバー下でなく、横にニョキッとプレビュー画面で飛び出る。1024*768のiBookでは結構邪魔(非表示にもできるけど)。UAは Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US) AppleWebKit/525.18 (KHTML, like Gecko, Safari/525.20) OmniWeb/v622.6.1.0.111015(PPCなのにIntel Macとはこれいかに?)。Gecko エンジンを使用しているらしいが、少なくとも昨今のやけに動作の重い Firefox よりはいい感じ。

 使ってみると時間をかけて熟成した雰囲気で、環境設定の項目が非常に多く玄人っぽい印象。何せ広告ブロック機能がポップアップブロックだけじゃなく、他サイトのリソースもブロックできる。今日は OmniWeb から記事投稿しているのだが、うわっ、なんかスペルチェッカー(スペルの怪しい英単語に赤線表示で警告)までついている。

 今メインで使用しているブラウザは Opera なのだが、ちょっと乗り換えたくなってきた。

追記:
先ほどこの記事を投稿したときに、なぜか文章の途中が勝手に削除された。自分でコピペした時にうっかり消したのかなと思ったら、修正画面でPOST送信したら反映されなかったり。日本語か使用環境の問題なのかも知れないけど、ちょっとダメかも…

Perlのサムネイル生成

 暑いけど、色々動いてますた。盆休みはないけど、普段そんなに忙しくなかったり。

 さて、ここじゃ評判の悪いプログラムの話。備忘録的なこともあるけど、普段からサンプルスクリプトを公開している多くの人たちにヒントをもらっている(パクリとも言う)ので恩返し的な意味もあるからやりますよ。ギブ&テイクってやつ?

 今回はGDとImageMagick(PerlMagick)のPerlモジュールを使ったサムネイル生成について。単純にGIF/PNG/JPEG画像を指定の大きさに縮小してJPEGで別名保存するスクリプトである。透過GIF/PNGはJPEGに変換すると何故か透過部分が真っ黒になってしまうので、それを回避するために背景色を指定して塗りつぶせるようにした。いろいろ検索してもそういうのがありそうでなかったので自力で組んだ。ひいふう。

 大体私は人から「こうなんだよ」と言われても頭ン中じゃ納得せず、自分で動かして失敗してから納得する人。たとえ目的のスクリプトがあったとしても、自分がそれを理解できていないとそのまま使うことができない。そんな、損な性格。

#!/usr/bin/perl
 
$usemodule = 1; # GDを使う場合1、ImageMagickを使う場合2
$image = 'original.png'; # 元の画像、GIF/PNG/JPEG
$thumbimg = 'thumbnail.jpg'; # サムネイル画像名
$w_maxlimt = 250; # 縮小サイズ横
$h_maxlimt = 250; # 縮小サイズ縦(縦横どちらかがこの数値を超えていたらリサイズ)
$bgcolor = '#f4efdc'; # 元画像が透過GIF/PNGのときに塗りつぶす背景色、16進数指定
 
# GD
if ($usemodule == 1) {
  use GD;
  my $thumb = $image;
  $thumb =~ /\.jpe?g$/i and $thumb = GD::Image->newFromJpeg("$image");
  $thumb =~ /\.gif$/i and $thumb = GD::Image->newFromGif("$image");
  $thumb =~ /\.png$/i and $thumb = GD::Image->newFromPng("$image");
  my ($width, $height) = $thumb->getBounds(); # 画像サイズ取得
  my ($thumbW, $thumbH) = ($width, $height); # リサイズ前処理
  if ($thumbW > $w_maxlimt) {
    $thumbH = int ($thumbH * ($w_maxlimt / $thumbW));
    $thumbW = $w_maxlimt;
  }
  if ($thumbH > $h_maxlimt) {
    $thumbW = int ($thumbW * ($h_maxlimt / $thumbH));
    $thumbH = $h_maxlimt;
  }
  my $thumbnail = GD::Image->new($thumbW, $thumbH);
  if ($image !~ /\.jpe?g$/i) { # 背景色塗りつぶし処理(元画像がGIF/PNG)
    my (@clr,@clr2);
    my $bcolor = $bgcolor;
    $bcolor =~ tr/a-f/A-F/;
    $bcolor =~ s/#(..)(..)(..)/$1,$2,$3/;
    @clr = split /,/,$bcolor;
    for (my $i = 0; $i < 3; $i++){ $clr2[$i] = hex ("$clr[$i]"); }
    my $bgclr = $thumbnail->colorAllocate($clr2[0],$clr2[1],$clr2[2]);
    $thumbnail->transparent($bgclr);
  }
  $thumbnail->copyResized($thumb, 0, 0, 0, 0, $thumbW, $thumbH, $width, $height); # リサイズ
  open (OUT, ">$thumbimg"); # サムネイルの保存
  binmode (OUT);
  print OUT $thumbnail->jpeg;
  close (OUT);
 
# ImageMagick
} elsif ($usemodule == 2) {
  use Image::Magick;
  my $thumb = Image::Magick->new();
  $thumb->Read("$image");
  $thumb->Profile(name=>"*",profile=>""); # Exif情報削除
  $thumb->AdaptiveResize(geometry=>"$w_maxlimt x $h_maxlimt"); # リサイズ
  if ($image !~ /\.jpe?g$/i) {# 背景色塗りつぶし処理(元画像がGIF/PNG)
    my ($thumbW, $thumbH) = $thumb->Get('width', 'height');
    my $bgclr = Image::Magick->new(); # 背景画像生成
    $bgclr->Set(size =>"$thumbW x $thumbH");
    $bgclr->ReadImage("xc:$bgcolor");
    $bgclr->Composite(image=>$thumb, compose=>'Over'); # 背景色と元画像を合成
    $bgclr->[0]->Write(filename=>$thumbimg); # サムネイルの保存(元画像がGIF/PNG)
    undef $bgclr; # ImageMagickの場合、メモリに溜まった画像をクリアする
  } else {
    $thumb->[0]->Write(filename=>$thumbimg); # サムネイルの保存(元画像がJPEG)
  }
  undef $thumb; # ImageMagickの場合、メモリに溜まった画像をクリアする
}
exit;

 GDは元々ベクター系の画像生成モジュールなので機能はあまりない。その分ImageMagickより処理が長めになる。ImageMagickは画像生成に特化して何でも処理できるスグレモノだけど、かなりクセがあって動かなくて四苦八苦。ちなみにExif情報ってのは、デジカメや画像編集ソフトによってつけられる画像情報。ImageMagickだとそのまま元画像の情報を保持してその分画像が重くなるのでクリアにしておく。

 私の知識じゃあんまりスマートに打てなかったけど、動かしていて問題ないので多分大丈夫かと。使いたい人は適当にコピペして動かしてみたり改変してみてください。て、言ってもサムネイルに特化したPerlモジュールもいっぱいあるみたいだけどね。そっちを利用した方が早いかも。しかし私も掲示板運営でもしない限りGDやImageMagickに手を出すことはなかったと思うので、いい勉強になりますた。

 テスト環境(Perl 5.10.0/GD 2.44/PerlMagick6.5.3)を使って透過PNGのサムネイル生成結果を見ると、GDの方がサーバ負荷が少ないけど色が悪いしJPEGノイズが目立つしと画質は若干悪い。ImageMagickはシャープに出るけどファイルサイズが大きく、サーバのメモリも倍以上食うみたい。


元画像
(ブラウザのリサイズ/53.7KB

GD
(8.57KB)

ImageMagick
(12.4KB)

 そのうちこの日記にも導入しようと思ってはいるのだが、Nicky!ってかなり改造が難しいんだよね…(すでに色々いじってるけど)。

この先生、きのこれない

 庭にキノコが生えていた。なかなか毒々しくていい感じ。

 それはそうとUbuntuにOperaを入れてみたが、どうも芳しくない。文字とか化けるし、FlashPlayerも微妙に入らないし。今打っているフォームの画面なんか、句読点があり得ない位置に表示されてるし。

 でもOperaのスクロールのスムースさに慣れると、他のブラウザは使う気になれない。