2008年9月アーカイブ

老舗の看板

| コメント(3) | トラックバック(0)

僕は日本のバブルがはじける前にアメリカに移住していたので、大きな不況というのをこれまで一度も経験したことが無い。むしろ大学を卒業したときは就職売り手市場だったし、新入社員時代はちょうどバブルが到来した時期で、今振り返れば身分不相応な社会人生活を送っていた。

僕がアメリカに移り住んだとき、アメリカはすでに不動産バブルが始まったところで、住宅価格が年々激しく上昇していた。不動産価値は上がることはあっても下がることは無い、という神話を周りのアメリカ人は信じていたが、日本でのバブル崩壊で東京ですら土地価格の下落したのを知っていたので、それがたとえ世界に名だたる金融都市、New York であっても例外ではないとわかっていた。確かに米国が不景気になっても、たとえばヨーロッパやアジアが好況であれば海外の資本が New York を支えることはあるだろう。けれども New York には東京などと違って治安の問題があり、ひとたび不景気になり失業率が上がるようなことでもあれば、また犯罪率は上昇し治安の悪化を招き、ひいては都市としての魅力は失われ、投機の対象になるのは一部の地域だけになるだろう。


けれどもそこまでドラスティックに経済状況が悪化すると思っていなかったのだが、ここ最近急速に金融不安が広がり、それまでテレビコマーシャルをしていた金融機関が翌日には破綻したり、他の金融機関に吸収されるなどこれまでにない変化が訪れている。


土曜日も友人と Times Square 近くのバーレストランでたらふく飲み食いしたあと、コーヒーでも飲もうと近くの Starbucks に寄った。その Starbucks の目の前にあったのは旧 Lehman Brothers のオフィスビルである。
見上げるとちょうどそこには建築作業員がビルのに上におり、看板を取り外す作業をしていた。僕らが気がついたときはすでに 「 LEH 」 の文字しか残っていなかったが、Starbucks でコーヒーを飲みおって出る頃には最後の部分の撤去作業を急いでいた。


歴史の浅いアメリカという国にあって、Lehman Brothers は150年もの老舗を誇る証券会社だった。いまはその老舗であっても一夜で Times Square からかげもかたちも無くなってしまうのだった。


僕の人生で初めて体験する不況。僕も明日は我が身かもしれない。悲観しているわけでも、楽観視しているわけでもないが、世の中の変化を受け止めるだけの覚悟は必要だろう。
日本の友人が放った 「 アメリカは大きな不景気のあとに必ず戦争を起こす国である 」 という言葉がどうしても耳から離れない。



TAXI

| コメント(0) | トラックバック(0)
※ Canon EOS 1Ds MarkIII + EF70-200 f/2.8L IS USM


Queens。Yellow Cab の車庫。
Manhattan を黄色に埋め尽くすタクシーはこんなところにプールされているのだった。

なんだか今朝もこのブログにアクセスできない時間帯があったようだが、それは Movable Type のせいではなくどうやらサーバ側の障害のせいだったようだ。昨日からホスティング会社のこのサーバの Apache サーバが接続不可能になっており、かつ MySQL DB にもアクセスできない状態が続いていた。僕が利用しているこのホスティングサービスはテクニカルサポートも24時間体制で対応してくれるので、障害報告を出すとすぐに対応してくれるのだが、しばらくはブログがうまく動作しているかモニターしていく必要がありそうだ。


さて今回もその Movable Type 4.21 に関するブログを掲載する予定だったが、紹介するにはまだちょっと調査が必要なので一休みして、New York と写真の話題なぞ紹介しておこう。
写真、特にカメラの話となるとなかなか New York のトピックと重なる部分が少ないのだが、今回は珍しいことに、かつ見事にオーバーラップしているので、下のビデオを楽しんでみてもらえるだろう。


ほんのちょっと前まで、New York の観光名所で写真を撮っている人と言えば使い捨てカメラとかコンパクトデジカメを手にしている姿をよく見かけたのだが、ここ最近はデジタル一眼レフカメラを使っている人がだいぶ増えている。中には一眼レフカメラとビデオカメラを持ち歩く人もいて、そういう人は撮影機材で両手がふさがっている。
僕もかつてはビデオカメラを使っていたのだけれど、ここ何年も動画を撮っておらずここ10年はもっぱらスチル撮影ばかりである。とはいえときおり動画を撮ってみたいという欲も出て、そのたびごとにビデオカメラのトレンドを調べたりするのだが、結局あまりつかわないだろうという結論で買わずじまいである。

ところが時代は進み、いまやビデオカメラも皆デジタル化し、静止画(スチル)の撮影機能などあたりまえになった。携帯電話に着いている小型カメラもスチルと動画の両方が撮れる。またビデオカメラが静止画が撮れるようになったように、コンパクトデジカメは動画が撮れるようになった。デジタルになったおかげで動画、静止画を問わず機能の共有が進み、垣根が低くなってきたことの表れだろう。

一方デジタル一眼レフカメラでは今年になるまで動画が撮れる機種は無かった。もしかすると技術的にクリアしなくてはならない問題があったのかもしれないし、マーケティング上の理由によるものかもしれない ( それについては後述 )。またこれまでは銀塩一眼レフユーザがデジタルに移行するというシナリオがメインだったから、あまり動画機能に対する要求というのはあがってこなかったのだろう。
そこに来て先日ニコンが発表したデジタル一眼レフカメラの新製品にとうとう動画撮影機能が搭載された。これについて苦々しい思いをしているユーザもいるかもしれないが、僕は同じ一眼レフだからといってアナログ時代と同じ機能にとどまっている必要は無いと思うし、メーカーも差別化をはかるのに必死なのだろう。ただし動画撮影機能を搭載したことによって本来のスチル撮影に弊害が出るのは困るが。

そしてそれを追いかけるようにして、キヤノンも先日発表した EOS 5D MarkII に動画機能を搭載した。なんとなくニコンの後追いのようだが、開発期間を考えると二社ともかなり前から準備していたに違いない。むしろビデオカメラも販売しているキヤノンの方が先にこの機能を搭載するのは容易だったはずで、うがった見方をすればニコンが搭載したからキヤノンも今回の機種で搭載したのではないかと思える。先ほどマーケティング上の理由で搭載してこなかったのではないか、と書いたのはつまり同じ企業内の製品で共食いになるのを避けていたのではということからである。

その 5D MarkII だが、プロトタイプ機材を使用して撮影された動画が米国 Canon のサイトにアップロードされた。
(視聴には QuickTime が必要 )

そしてこのビデオは DUMBO や Long Island City、 Times Square など、New York が舞台となっている。観光で訪れた人なら見慣れたシーンが多いだろう。

http://www.usa.canon.com/dlc/controller?act=GetArticleAct&articleID=2086

このビデオを撮影したのは、Vincent Laforet という Photographer で、かつてピュリッツァー賞も受賞している。映像作家ではなく、報道を主にした写真家が撮ったというところがおもしろい。そのせいかどうかわからないが、一シーンごとにそれが一枚の写真であるかのような感じを受ける。構図などがそうさせているのだろうか。


またメイキングビデオも見ることができるが、こちらもどのようにして撮影したのかがわかるだけでなく、やはり街を行き交う人の反応などが見られてなかなかおもしろい。

http://vincentlaforet.smugmug.com/gallery/6021407_xEg87/1/#378479692_MRytZ-XL-LB
http://vincentlaforet.smugmug.com/gallery/6021407_xEg87/1/#378608891_Jd2CT-XL-LB

ちなみに Laforet 氏がアップした最新のブログ記事によると、このビデオに関して懐疑的な意見が寄せられているとのことで、米国時間26日に生の映像ファイルをアップロードする予定らしい。今回公開されている動画はオリジナルの画像を編集し、縮小しているようだがこれでも十分な画質を確保している。果たして Full HD の画質ではいったいダウンロードにどれくらい時間がかかることやら(笑)

ところでビデオを見て気がついたのは、撮影の時間帯が夜中心になっているということ。おそらくカメラの高感度をアピールするねらいがあったのだろう。それが功を奏して今までのビデオカメラとは次元の異なるレベルへと押し上げている。
上のメイキングビデオは同じくキヤノンのビデオカメラ XH A1 を使って撮影されたものだが、明らかにプロシューマモデルのビデオカメラより画質が上回っている。彼自身ブログの中で 「 僕がキヤノンのトップラインのビデオカメラをこき下ろすことになってしまったのをキヤノンはいったいどう思っているだろうか 」 などとコメントしている。


さてこのカメラは11月に日本を始め世界中で発売になるが、果たしてそれまでに購入するかどうかゆっくり考えることにしよう。今手持ちのカメラ機材を見れば、5D MarkII は不要なのだが、趣味で持ち歩きスチルと動画を撮る楽しみは、これまでとない楽しみ方ができるかもしれない。となると手持ちのカメラの一台を処分しないといけないか・・・。ふむ悩んでしまうな。

Vincent Laforet

Laforet 氏公式ブログ。他の作品へのリンクもここからたどることができる。
http://blog.vincentlaforet.com/


前回紹介したように、この New York Watch ブログを Movable Type 4.21 で運用していると書いたが、ここに至るまでこの MT4.21 を10回はインストールしただろうか。
旧バージョン、3.3x からのアップグレードではだいぶ悩まされたが、それもなんとかクリアしたので、少しずつ改造に乗り出すことにした。

まずはこのバージョンから正式にサポートされた captcha から取りかかろう。

captcha とは文字をノイズを乗せた画像にして表示させ、それを見た人間が入力することで認証を行う仕組みである。このブログでもコメントにスパムが投稿されることが多いので、旧バージョンのときから導入していたが、そのときに使用していた captcha は Movable Type 用に公開されているプラグインをインストールすることで実現していた。
今回 Movable Type が4.21のバージョンアップに伴い、この captcha が標準機能に組み込まれたので、サードパーティの captcha プラグインをインストールする必要は無くなった。

が今回搭載された captcha はコンピュータによる解析を不可能にさせるだけでなく、人間にとってもかなり判別しづらい画像を生成する。しかも以前は4桁の英数字で運用していたものが、MT4.21謹製 captcha は桁数が6桁もある。ということでもっと見やすいものに改造してしまえ! とインターネットで探してみると既に同じような考えを持っている人はいるもので、すでにその方法が公開されていた。

KUMA TYPE 「Captcha認証の画像を更に見やすくしてみた。」
http://blog.kumacchi.com/2008/08/captcha_2.html

このブログエントリーを参考にして、背景に付加されるノイズ部分を除去し、ついでに桁数も6桁から4桁に減らしてみた。
オリジナルのテンプレートからの変更点を赤色で示している。
ランダムに背景画像にノイズを載せる部分をコメントアウトしているので、その分このスクリプトのパフォーマンス向上にも役立っているはずだが、どうも僕が借りているサーバは captcha スクリプトの実行速度が芳しくないようだ。そのためコメントを送ろうとしてページを開き、コメント欄にマウスポイントを置くと captcha 画像が現れるはずなのだが、表示されるまでに数秒かかるようだ。
なかなか表示されない場合でも少し待ってみて欲しい。

ちなみにこの captcha 画像は、コメント欄や名前の欄に一度マウスカーソルが行かないと表示されないようになっている。当初はなぜだろうと思ったのだが、実はこれが Movable Type 謹製ならではの機能だった。
Movable Type 4.21 は様々な機能追加が行われたが、その一つがコメント投稿者のユーザ登録・認証であり、一度サインインしてしまうと名前やメールアドレス、それに capcha によるセキュリティコード入力も省略できるようになっている。
コメントを登録したい人が、このブログのデータベース管理によるユーザ登録をすることもできるし、また最近話題の OpenID を使って認証することもできるようになった。つまり Yahoo ID や mixi のアカウントでコメントが投稿できるということだ ( ただし mixi アカウントでのサインインとコメント投稿はまだ未テストなので、どなたか試してみてください(笑) )。特に mixi OpenID を使うとマイミクの人だけがコメントを残せる様にすることもできる。当ブログではそこまで限定せず、mixi OpenID があれば誰でも投稿できるようにしてある。もし captcha の入力が煩わしいという方は、このようにいくつかの認証をサポートしているので利用してみて欲しい。


結局人間にとって読みやすくすれば、その分セキュリティも強固でなくなるわけだが、そこまでしてスパム広告を送ってくる輩もまだここにはいないので、しばらくはこのぐらいでよいだろう。


ちなみに captcha で使われているキャラクターセットを英語アルファベットではなく、ひらがなにしてしまえば、たとえスパマーが画像を解析して captcha を破ったとしても、ひらがなの入力部分で一苦労することだろう。captcha 画像を簡易化したことで妙なスパムコメントがつくようになったら、次はひらがな一文字だけの captcha に切り替えるのもよいかもしれない。

変更するファイル:
$"your MT home directory"/lib/MT/Util/Captcha.pm
# Movable Type (r) (C) 2001-2008 Six Apart, Ltd. All Rights Reserved.
# This code cannot be redistributed without permission from www.sixapart.com.
# For more information, consult your Movable Type license.
#
# $Id: Captcha.pm 1952 2008-04-17 21:18:57Z bchoate $
 
package MT::Util::Captcha;
 
use strict;
use warnings;
use base qw( MT::ErrorHandler );
 
use constant READABLECHARS => '23456789abcdefghjkmnzpqrstuvwxyz';
use constant WIDTH  => 25;
use constant HEIGHT => 35;
use constant LENGTH => 4;
use constant EXPIRE => 60 * 10;
 
use MT::Session;
 
sub check_availability {
    my $class = shift;
 
    eval "require Image::Magick;";
    if ($@) {
        return MT->translate('Movable Type default CAPTCHA provider requires Image::Magick.');
    }
 
    my $cfg = MT->config;
    my $base = $cfg->CaptchaSourceImageBase;
    unless ($base) {
        require File::Spec;
        $base = File::Spec->catfile(MT->instance->config_dir, 'mt-static', 'images', 'captcha-source');
        $base = undef unless (-d $base);
    }
    unless ($base) {
        return MT->translate('You need to configure CaptchaSourceImageBase.');
    }
    undef;
}
 
sub form_fields {
    my $self = shift;
    my ($blog_id) = @_;
 
    require MT::App;
    my $token = MT::App->make_magic_token;
    return q() unless $token;
 
    my $cfg = MT->config;
    my $cgipath = $cfg->CGIPath;
    $cgipath .= '/' if $cgipath !~ m!/$!;
    my $commentscript = $cfg->CommentScript;
 
    my $caption = MT->translate('Captcha');
    my $description = MT->translate('Type the characters you see in the picture above.');
    return <<FORM_FIELDS;
<div class="label"><label for="captcha_code">$caption:</label></div>
<div class="field">
<input type="hidden" name="token" value="$token" />
<img src="$cgipath$commentscript/captcha/$blog_id/$token" width="100" height="35" /><br /><br />
<input name="captcha_code" id="captcha_code" value="" autocomplete="off" />
<p>$description</p>
</div>
FORM_FIELDS
}
 
sub generate_captcha {
    my $self = shift;
    my ($app, $blog_id, $token) = @_;
 
    my $code = $self->_generate_code(LENGTH());
 
    my $sess = MT::Session->new;
    $sess->id($code);
    $sess->kind('CA'); #CA == CaptchA
    $sess->start(time);
    $sess->name($token);
    $sess->save or
        $app->error($sess->errstr), return undef;
    my $image_data = $self->_generate_captcha($app, $code, 'png') or
        return undef; 
 
    return $image_data; 
}
 
sub validate_captcha {
    my $self = shift;
    my ($app) = @_;
 
    my $token = $app->param('token');
    my $code = $app->param('captcha_code');
 
    my $from = time - EXPIRE();
    MT::Session->remove({ kind => 'CA', start => [undef, $from] }, { range => { start => 1 }});
 
    my $sess = MT::Session->load({ id => $code, name => $token, kind => 'CA' });
    return 0 unless $sess;
    if ($sess->start() < (time - EXPIRE())) {
        $sess->remove;
        return 0;
    }
    $sess->remove;
    return 1;
}
 
sub _makerandom {
    my $size = shift;
 
    my $bytes = int($size / 8) + ($size % 8 ? 1 : 0);
 
    my $rand;
    if (-e "/dev/urandom") {
        my $fh;
        open($fh, '/dev/urandom')
            or die "Couldn't open /dev/urandom";
        my $got = sysread $fh, $rand, $bytes;
        die "Didn't read all bytes from urandom" unless $got == $bytes;
        close $fh;
    } else {
        for (1..$bytes) {
            $rand .= chr(int(rand(256)));
        }
    }
    $rand;
}
 
sub _generate_code {
    my $self = shift;
    my($len) = @_;
 
    my $code = '';
 
    my $genval = unpack('H*', _makerandom($len*2*8/2));
 
    # Cycle through the octets pulling off the lower 5 bits then mapped into
    # our acceptable characters
    foreach my $i (0..($len-1)) {
      my $byte = ord(pack('H2', substr($genval, $i*2, 2)));
      my $x = ($byte & 31);
 
      $code .= substr(READABLECHARS(), $byte & 31, 1);
    }
 
    return $code;
}
 
sub _generate_captcha {
    my $self = shift;
    my ($app, $code, $format) = @_;
    $format ||= 'png';
    my $len = LENGTH();
 
    my $cfg = $app->config;
    my $base = $cfg->CaptchaSourceImageBase;
    unless ($base) {
        require File::Spec;
        $base = File::Spec->catfile(MT->instance->config_dir, 'mt-static', 'images', 'captcha-source');
        $base = undef unless (-d $base);
    }
    return $app->error($app->translate('You need to configure CaptchaSourceImageBase.'))
        unless $base;
 
    require Image::Magick;
    my $imbase = Image::Magick->new(magick=>'png')
        or return $app->error($app->translate("Image creation failed."));
 
    # Read the predefined letter PNG for each letter in $code
 
   my $x = $imbase->Read(map { File::Spec->catfile($base, $_ . '.png') }
                          split(//, $code));
 
    if ($x) {
        return $app->error($app->translate("Image error: [_1]", $x));
    }
 
    # Futz with the size and blurriness of each letter
    foreach my $i (0..($len - 1)) {
        my $a = int rand int(WIDTH() / 14);
        my $b = int rand int(HEIGHT() / 12);
 
        $imbase->[$i]->Resize(width => $a, height => $b, blur => rand(3));
    }
 
    # Combine all the individual tiles into one block
    my $tile_geom    = join('x', $len, 1);
    my $geometry_str = join('x', WIDTH(), HEIGHT());
    my $im = $imbase->Montage(geometry => $geometry_str,
                              tile     => $tile_geom);
    $im->Blur();
    # Add some lines and dots to the image
#    for my $i (0..($len * WIDTH() * HEIGHT() / 14+200-1)) {
#        my $a = int rand($len * WIDTH());
#        my $b = int rand HEIGHT();
#        my $c = int rand($len * WIDTH());
#        my $d = int rand HEIGHT();
#        my $index = $im->Get("pixel[$a, $b]");
#
#
#        if ($i < ($len * WIDTH() * HEIGHT() / 14+200) / 100) {
#	    $im->Draw(primitive => 'line',
#                      stroke    => $index,
#                      points    => "$a, $b, $c, $d");
#        } elsif ($i < ($len * WIDTH() * HEIGHT() / 14+200) / 2) {
#            $im->Set("pixel[$c, $d]" => $index);
#        } else {
#            $im->Set("pixel[$c, $d]" => "black");
#        }
#    }
 
    # Read in the background file
#    my $a = int rand(5) + 1;
#    my $background = Image::Magick->new();
#    $background->Read(File::Spec->catfile($base, 'background' . $a . '.png'));
#    $background->Resize(width => ($len * WIDTH()), height => HEIGHT());
#    $im->Composite(compose => "Bumpmap",
#                   tile    => 'False',
#                   image   => $background);
    $im->Modulate(brightness => 105);
    $im->Border(fill     => 'black',
                width    => 1,
                height   => 1,
                geometry => join('x', WIDTH() * $len, HEIGHT()));
 
    my @blobs = $im->ImageToBlob(magick=>$format);
    return $blobs[0];
}
 
1;


まだ体裁など整っていないのだが、基本的な機能は特に不具合が見あたらないこともあり、このエントリーから Movable Type 4.21 でブログを公開していこう。
コメント投稿時に OpenID も使えるようなので ( 未テスト ) 、あらかじめサインインしておくことで楽に投稿ができるかもしれません。
今まで通りのコメント投稿 ( つまりサインインせずに、名前とメールアドレスを入力してコメントする方法 ) の場合には、数桁の英数字がランダムに表示されるので ( Captcha )、その通り入力して投稿ボタンを押してください。ときおりこのランダムの画像の表示が遅くなることがあるので、そのときは数秒待ってみてください。そのかわり背景をシンプルにして見やすくしてあります。






その他の近況。
NAS 内の HDD の調子が怪しいので、交換の前のバックアップを取っているところ。写真データが膨大なのでこれだけで結構時間を取られている。
久しぶりに鉄道で郊外へ。Dia:Beacon。久しぶりに汗ばむ晩夏。

Movable Type 4.21

| コメント(2) | トラックバック(0)

このところこのブログの更新がおろそかになっているが、それはブログを管理するシステムのアップグレードに手こずっていたせいである。
New York Watch は Movable Type というブログ管理システムを、僕が借りている共有サーバに構築して運用しているのだが、その Movable Type に大幅な変更が加えられ、久々のメジャーアップデートを果たしたということで最初のバッチが出たタイミングで現在のものから移行しようするつもりである。

ちなみに Movable Type 自身が変わっても、New York Watch では特に新機能を追加する予定は ( いまのところ ) ないので、「 見た目にデザインが変わったかな 」 程度にしか受け止められないのが悩ましいところである。
ならば、なぜ新しいバージョンに入れ替えるのかというと、リリースノートを信ずるならば再構築のパフォーマンスが向上したから、というのが表向きの理由で、個人的に魅力だったのはダイナミックパブリッシングとページ分割だろうか。
今までもダイナミックパブリッシングを Movable Type 3.35 のもとで使用していたのだが、4.2 になってそれが推し進められアーカイブページでもページ分割ができるようになった。
またコメント投稿時にスパムコメント防止の Captcha があるのだが、これも Movable Type 標準機能になった。

が今回 Movable Type 4.21 アップグレードで一番てこずったのが、この MT 内蔵 Captcha でどうやっても合成された画像が表示されなかった。
結局 nomeri.com を運用しているホスティングサービス会社のサポートとやりとりをして原因が判明し、動くようになった。
現行の New York Watch にはいろいろなスクリプトやらプラグインで機能を追加しているので、まだ全部移行は済んでいないのだが、めどがついたので近いうちにデータベースを移し替えて、MT 4.21 での運用に切り替える予定。

ちなみに Movable Type 3.x から最新の 4.21 にアップグレードするにはいくつか方法があるが、うまくいくのは旧 MT のデータを標準機能のエクスポートで保存し、MT 4.21 の設定が済んだ後でこのデータをインポートする方法のみだった。
Movable Type を使っている人なら知っていると思うが、mt-config.cgi を旧 MT ディレクトリから取り出して、MT 4.21 ディレクトリにコピーし、そのあとスクリプトを走らせることで自動的にアップデートすることもできるのだが、一見全てうまく処理が済んだように見えても、構築されるブログは新旧のテンプレートが入り交じっためちゃくちゃなページが表示される。
テンプレートの初期化、という機能があるのだがこれを試してもスタイルシートなどが旧来のままであるところから判断すると、どうやら DB ( 僕は MySQL を使用している ) へのマイグレーションがうまくいっていないのだろう。
MT 4.21 アップグレードの注意については、メモ的な意味も含めて改めて書くことにしよう。


ということでもうしばらくブログ更新をお待ちください。その間写真を掲載するぐらいの投稿になるかもしれません。

カレンダー

<  2008年9月  >
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

このアーカイブについて

このページには、2008年9月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2008年8月です。

次のアーカイブは2008年10月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.21-ja