題名:Java Diary-61章

五郎の入り口に戻る

日付:2005/6/10

目次に戻る


SmartCalendar-X-Part2

週表示がなんとかできると、今度は細かいところをあれこれ直し出す。あまり細かいからここでいちいち書いていられないくらいのことだが、とにかく直す。大幅になおしたはずの「次の週」「前の週」にもなんだかバグがあるようなので直す。

そのうち写真の拡大機能が欲しくなってきた。小さな画像で全体を眺めているうち、

「これを拡大してみたい」

と思うことが多々ある。さてどうしたものでしょう。

理屈から言えば話は簡単。マウスカーソルがある場所にある写真を拡大すればよい。そしてこの機能のお手本とすべきプログラムも存在していた。zphotoというのがそれである。しかしこの「お手本が存在している」事がその後数日間に渡り妙に私を苦しめるのであった。

4月の9日にまたもやシンポジウムがあった。これは大変面白く、私も怪しげなプログラムを造るよりは、メモを取る方に忙しかった。しかしそうした質の高い中にも必ず穴はある。一人実につまらない話をする人がおり、その時間を利用してあれこれ作る。

(後で解った事だが)私は物事を難しく考えすぎてきた。一つの写真の上で、カーソルが一定時間以上止まったとき、写真をアニメーションつきで拡大する、というのを目指していたのである。あれこれ考えて「カーソルが一定時間以上止まったとき」というのが検知できるようになった。次にはアニメーションだが、これは一筋縄ではいかない。画面を全部書き換えるのは時間がかかるので、必要な時しか書き直さない。ところがアニメーションするためにはその部分だけは短い間隔で書き直す必要があるのだ。

ええっと別にタイマーを用意してループを回してとあれこれいじくりまわした結果なんとか動くようになった。何度も何度も動かしてみる。しかし事実は動かしがたい。とても「スムーズ」とは言えない代物なのだ。がたがたっと大きくなる。確かに作った方は

「ほーらアニメーション付きだよ」

と言えるが、使う方にしてみればただ鬱陶しいだけである。ため息と共に私はその効果をお払い箱にする。さらに何度かカーソルを動かし写真を拡大したあげく「カーソルが一定時間以上止まったら」という条件も外してしまった。こうするとぴょこぴょこ写真が拡大されたり元に戻ったりするが結局これが一番使いやすいと解った。

無意味な思いこみで遠回りしたことを知りいささかげんなりする。しかしめげては居られない。まだ難問はいくつもある。iPhotoはオリジナルの写真の他に、サイズを小さくしたサムネイルを作成する。オリジナルの大きなファイルは読み込むのにも表示にも時間がかかるから(と思っていた。実際Javaだけを使っていたときはそうだったのだ)サムネイルを方を主に用いる。しかし元が小さいから拡大するとあらが見える。というわけで有る程度以上大きく表示する際にはオリジナルを用いる必要がある。さて、どうやったものか。

当初はこのように考えていた「最初はサムネイルを拡大したものを表示しておき、裏でオリジナルの写真を読み込み、準備ができたところで表示し直す」と。ところがアニメーションで無駄足を踏んだ私は用心深くなっている。そもそも本当にそんなに読み込みって遅いのか?えいやっと小細工無しに表示すると結構早い。もういいや。これで行こう。

しかしそう簡単には話が進まない。結局ここらへんの関係は3度くらい作り直すことことになった。そのたびに何かを学んで進んではいるのだが、如何せん造りながら仕様を考えているから

「うむ。こうしたいのであれば構造をこうせねば」

ということが頻繁に起こる。とはいってもその度予想より改修範囲は小さくて済んでいるのがオブジェクト指向の有り難さ、というものかもしれない。

さてそのうち「ダウンロードサイトを作りました」という連絡が美崎さんから来る。SmartCalendar-Xは?と問われたので出せます、と答える。こう答えるまでにもう一つ改修を行っていた。このソフトの面白いところは、普段はあまり意識していないデジカメに記録されている情報を活用できるところにある。具体的には撮影の時間を読み取りそれを利用した表示を行うことで、一日どのような行動をしたかが解るのだ。しかしそのためにはExifというタグ情報を読まなければならない。

Exifの仕様は公開されているが自分で読み込むことなど思いもよらない。誰かそのためのソフトを書いていないかしら、と探してみるのが昨今の正しい姿であろう。するとJavaのライブラリが見つかった。やれうれしや、と組み込んで観たがある問題に気がつく。結構読み込みに時間がかかるのである。

まあJavaだからしょうがないか、と思っていたのだがそのうち問題がそれだけではないことに気がつく。実家のiMacにSmartCalendar-Xをインストールしてみるとどうも特定の日を表示させたところで異常終了する。何のメッセージも出さずおなくなりになるから勘に頼って直すしかない。自分でもどうしてそう考えたのかわからないが、どうもExifを読むためのライブラリに問題があるのではないかと考え出す。

そう疑うようになると従来は目をつぶってきた遅さも耐え難くなってくる。元々全てJavaで書くことに固執していたのはWindows/Macで動作することを目指していたからだ。しかし大分前にその野望は捨てた。となるとC or C++で書かれたものであってもmac上でコンパイルできればいいことになる。さて、何かいいライブラリはないでしょうか。

探してみると数種類存在していることが解る。しかしまたもや問題にぶつかる。ここ数年Javaばっかりでプログラム書いていたこともあり、CだかC++のプログラムをどうやってコンパイルするのかさっぱりわからなくなっているのだ。別の裏プロジェクト(この言葉が何を意味するかはそのうち説明する)でJNIというものを使い、Windows上であればJavaからCのライブラリを呼ぶ方法を学んだのだがMacでどうすればよいのかさっぱりわからない。えーっとえーっとどうしたものかとあさることしばらく。あるMac上で動くプログラムにぶつかった。調べてみるとそのプログラムはCでコンパイルされたコードを外部プログラムとして動かしているようだ。この方法だと変数の引き渡しに結構手間がかかるのだが、動く可能性はかなり高い。よし、これだとごりごりコードを書く。読み取りたいデータは日付だから数値データで受け取れるはずだ。しかし外部プログラムとして起動した場合には、一旦文字列に変換された状態でしか受け取れないので、また文字列から数値に変換しなおしてやる必要がある。ええい、面倒だと思うがここをなんとかしないことには父のマシンで動かない。

のろいの言葉をはきながら苦闘することしばらく。どうやら正常に動いているようである。期待したように一瞬で読み込めるわけではないが、Javaよりはずっと早い。さらに重要なことに実家のマシンでも動くようになったのである。これであれば公開してもいいかもしれない。

さて、SmartCalendar/Writerプロジェクトのサイトでプログラムが公開されてすぐ「SmartCalendar-X動作不具合報告書」が届く。何でもアイコンをダブルクリックしても何もおこらないのだそうな。コンソールにでたメッセージを観れば最初にiPhotoのデータを読むところでこけている。しかしそれ以上細かいことはわからない。

さて、4月25日の月曜日、私は午後から出張なのをいいことに午前中は映画を観ていた。これが実につまらない上に平日の初回と言うこともあり映画館の中にいるのは私一人である。あまりに退屈だからパソコンを取りだしあれこれやり始める。さて、このどこで問題が起こっているのだろう。

間もなく「これが問題なのかもしれない」と思える箇所を見つけた。そこに問題回避のコードを追加し、ついでにそれがはずれた場合でも少しは手がかりになるようなメッセージを追加する。アップデートしたプログラムVer0.11を美崎さんに送る。すると翌日には「動くようになったそうです」というメッセージが届く。やれうれしや。不思議な事だがこのプログラムに関しては何よりもたよりにならない私の勘が当たっているような気がしてくる。

それが終わるとまた写真の拡大表示周りをいじり出す。今度は写真にコメントをつけられるようにしよう、と考えたところから生じた改修だ。前になおしたとき

「ふふふ。大幅に変えたからこれで大抵の事には対応できるはず」

などと思ったのはやはり甘かった。またごっそり改修することしばらく、コードは動くようになった。しかし本当にコメントが表示されるかどうか試験するためにはコメント入力部分のインタフェースを作らなくてはならない。

これはかなり私を悩ませた問題だった。いや、凝らなければメッセージ入力を促すダイアログを表示すればいいのだが、どうもそれは格好良くない。だいたいダイアログを開いている間元の写真が見られないと何を書いたらいいかわからず困るではないか。

これを避けるためには、、とあれこれ考えたあげく、Macでは簡単に作ることができる透明ウィンドウを使うことにする。あれこれやっていると思ったよりも簡単に動き出した。そしてこれを書いている時点ではそのインタフェースを使っているのだが近い将来之は変更される気がする。自分でもどこかしっくり来ていないのだ。

さて、コメント入力ができたーと思ったら次は「選んだ写真をiPhotoで編集する機能」にとりかかる。これができると、「例えば写真をメールで送るとか複製を書き出すとかは全部iPhotoでやってください」と開き直ることができるのである。しかしこれをやるためには他のアプリケーションとの連携が必要、ということでApplescriptにたよることになる。

そういえばGLBrowserで使ったことがあったよなあとコードを調べてみるが最終的に没になったためかでてこない。まあいいや、とiPhotoに対し、Applescriptで何ができるかを調べる。こういう時頼りになるのはサンプルだ。いくつか見ていくと

「コメントもiPhotoから読んだり書いたりできるのではないか」

と思い出す。それまで写真に付けるコメントは独自にフォルダを作って管理していたのだが、この方法だと

「今までiPhotoで一生懸命入力したコメントが見られんではないか」

という文句がでるであろうことは目に見えていた。でもやり方わかんないもーんと開き直ろうとしていたのだが、その問題も解決するかも知れない。最も私が調子にのって入力したいくつかのコメントは無駄になるが、損するのは私だけだし。一旦公開してしまったら人様に迷惑をかけることになる。

というわけでごそごそやり出す。そのうち動くようになったのだが、如何せんスピードが遅い。Applescriptだからしょうがないとも言えるのだがやっぱり遅い。ええい、気にしないことにしようとできたことにしてしまう。

そのうちボタンに付けるものとかアプリケーションにつけるアイコンを作り出した。これらの作業はとても時間がかかるワリにろくな物ができない、という特徴がある。GW中珍スポット巡りに出かけたのだが行き帰りの電車の中でずーっとアプリケーションにつけるアイコンを作っていた。しかしどれも気に入らず全部没。時々ふと我に返り

「もうちょっと生産的な事をせねば」

と反省する。

ここらへんからVer0.2の公開を意識しだしあれこれ細かいけれど必要な機能を付加し出す。もうそろそろいいだろう、と思い出したところで

「最後に一つ小さなやつを」

と足を踏み出しそして私は泥沼にはまったのである

前の章 | 次の章


注釈