題名:Java Diary-62章

五郎の入り口に戻る

日付:2005/6/14

目次に戻る


SmartCalendar-X-Part3

月表示と年表示をしている時は画面左半分に写真が流れていく。こんなものはいらんと言われるかと思って取り外せるようなオプションまでこそこそ用意していたのだが、なかなか好評のようだ。

Ver0.11まででは動きが少しかくかくしていた。これは描画に時間がかかるせいだ、と当時の私は思いこんでいた。これを解決するにはどうすればいいか。

それまで流れていく写真を一枚一枚描いていた。これをやめ、大きな紙に必要なだけの写真を書き、その紙をずらしてはどうだろう。描画の回数が減るから早くなるのではなかろうか。と考えるとプログラムをしょこしょこ直す。この流れる写真の描画、というのはGoromiでも使ったのだがなかなか面倒である。いや、理論的に面倒ははずがないから何か私が馬鹿なことをやっているのだろうが、それでも面倒である。とかぶつぶつ言っている間にプログラムは動き始めた。

あれこれパラメータを調整するととてもスムーズに写真が流れ出した。やれうれしや。これで胸を張って公開できる、と安心するにはまだ早い。一つ試験が必要なのである。ここは「動いている」部分である。であるから果たして長時間動かした場合に問題がないか確かめておかねばならない。

というわけでしばらく立ち上げっぱなしにしておく。「改良」したスライドショーはスムーズに流れていく。どれくらいたっただろうか。スクリーンセーバーになっていた画面を元に戻そうとする。やたらと遅い。そのうち画面は元に戻ったが

「ディスクの空き容量が少なくなっています」

という観たこともないメッセージが出ている。

このプログラムを作り始めてからというもの、やたらと写真をとるようになった。であるからしてハードディスクの空き容量が大変心許なくなっていることには気がついていたのだ。しかしまだ1G位はあるはずだが、と思ってあれこれ調べる。するとSmartCalendar-Xが異常な量のメモリを使用している事に気がつく。なんだこれは。

OSのユーティリティにアクティビティモニタというものがあり、どのプログラムがどれくらいメモリを使用しているかを表示してくれる。それから今日に至るまで私はこのプログラムをほぼ常時起動している。起動状態でSmartCalendarを立ち上げる。最初は40Mくらいメモリを使うが、やがて20M代に減る。そのまましばらく推移するのだが、

「大きな紙の書き換え」

があるたび10Mくらい使用量が増える。しばらくすると5Mくらい減るのだが、全体としてみるとメモリ使用量は快調に増加している。

うげげげげ、と思い思いつく事をあれこれ調べてみる。しかしこの増加傾向は変わらない。おまけにこの作業は有る程度の時間動かさないと効果がわからないからやたらと時間を食う。

あれこれ調べてみたがどうしてもわからない。そのときMac OS Xのメーリングリストに同じような質問&回答が寄せられていた。曰くNSImageを使うとメモリーがリークします。というやつだ。そこにでていた対策コードを取り入れてみると少しましになった気がする。これはいける、と思いそこら中にそのコードを取り入れる。不合理と思っても入れると効果があった(と思えた)所には追加していく。

またその過程で、過去に採用していた「凝った部分」はどんどん没になる。例えば一度写真のファイルからNSImage(プログラム中で画像を扱う際にはこの型の変数にする)を作ったときは自分の中に持っておき、使い回しする-キャッシュする-、という機構を組み入れていた。これをやることで、いちいちファイルを読まなくてよくなるのでスピードが向上するのでは、と思ったのだ。とはいってもこれを実現するのは結構やっかいで、「この写真のNSImageをよこせ」といってきた相手事に保存しておく必要があるし、同じお客様でも違うサイズをよこせ、といってきたら作り直さなくてはならない。

結構な時間をかけてこの部分を作っていたのだが、この機構がない方がメモリ使用量が少ない気がしたためあっさり没とした。そして全く不本意なことにスピードはそんなに遅くならなかった。後で調べて解ったのだがOS自体に画像をキャッシュしておく機能があるためではなかろうか。

それでもメモリー増大の傾向は止まらない。最後にはあまたつっこんだ「メモリリーク対策コード」まで外してしまった。First Principles, SimplicityというくらいでとにかくSimpleにしてしまおう。

しばらくあれこれやったあげく、私は匙を投げた。今のバージョンではこれで我慢しよう。次のバージョンでこの部分をごそっと変えてしまおう、などと理屈を付けているがつまるところは根気が切れたのである。

他にも細かいところをどんどん直す。説明ページをつくり、そこにTo-do LISTを付け加える。そのリストを見ているうちに「ちょっと待て、これならすぐにできるではないか」と思うとプログラムを追加する。というわけでVer0.2を美崎さんに送ったのは(プロジェクトのページは美崎さんが管理しているのでこの時は勝手に公開できなかったのである)5/23だった。

送る前から既にあれこれ次の機能について考えていた。もともとこのSmartCalendarというのはPhoto Viewer + Schedulerのような機能を目標としていたようだが、次はいよいよSchedulerだ、と考えはじめるとその道のりの遠さに愕然とする。最初は

「スケジュールの入力はiCalで行い、SmartCalendarはそのデータを読み込み表示だけすればいいや」

と思っていたのだが、その表示もかなり大変な事が解る。例えば

「毎週火曜日に定期的に行われるイベント」

をどのように表示すればいいのだろう。いや、理屈はもちろんわかるのだが果てしなく面倒ではないか。そんなことを考えながら参考にならぬかとフリーウェアとして公開されているプログラムをいくつか見る。みんなよくこんなすごいものをフリーで作るなあと感心するが自分で作ろうという気はおきない。また仮に表示をがんばったところで入力が面倒ではないか。時間をきちんと指定して入力して貰えればそれはプログラムの側は有り難いしそのデータに基づいていろんなことができる。しかしユーザーは面倒だ。

そんなことを悶々と考えているうち「ええい、もう面倒な事は忘れて単にテキストのメモをつけるだけにしてしまえ」と思い切る。

そもそも実世界のカレンダーを見れば、そんなにたくさん書き込めたりしないではないか。「名古屋出張」とか「母が来る」とかそれくらい書ければそれなりに使えるはずだ。繰り返しのイベントとして「ゴミの日」を入力するという用途もあろうが別にそんな機能はなくても毎週きちんとゴミは出せている。

そう考えるとようやく前に進もうという気分になる。以前写真にコメントをつける機能を作った際、自分で独自にフォルダを作成しその中にテキストファイルを保存していた。iPhotoのコメントを活用するようになったからその機能は削っていたのだが復活である。(コードを残しておいてよかった)月表示で何もない日をクリックするとウィンドウが開き文字が入力できる。ウィンドウを開くのもやったばっかりだからなんとかなる。ただ入力された文字列を写真と同じように表示するのがちょっと面倒だがこれもなんとかなる。実際に使ってみるとなかなかご機嫌(少なくとも自分には)というわけでこの路線で行こうと決心する。

しかし考えなくてはならないこともいくつかある。基本的には一日につき一つのメモしか残せないようにしていたのだが、複数のメモがつけたくなることもあるような気がする。例えば一日表示でずわーっと並んだ写真の間にメモがはさまっていると結構いいかもしれない。

しかしそのためにはメモに時間のデータを付加しなくてはならない。どうやるか。人間に入力させようとすると、それの解釈をやるとかエラーがあった場合にどうするか、とか厄介な問題がでてくる。というわけでメモのファイル名に時間のデータを含めるようにする。ごそごそとファイルフォーマットを変えたのでそれまでに書いた何枚かのメモはゴミ箱行きになる。

まあ、これでよかろうと思っているとまたあることに気がつく。メモの公開度合いをいうものを設定すべきではなかろうか。誰に見せてもよいメモもあれば、あまり人にはみせたくないものだってあるに違いない。となるとまたファイル名にその情報を含めねば、というわけでまた作り直し、メモは何枚かゴミ箱行きになる。

さて、そうこうしているうちに有ることに気がつく。SmartCalendar-Xを立ち上げっぱなしにしていると、コンピューターの動作がなんだか遅い。これはどうしたことか、と思って調べてみればCPUを50%も使っている。ううむ。スムーズにスライドショーが動くからいいや、と思ったのだがこんなところに問題が。というわけで、一度は捨てた「スライドショーを一度に大きな紙に書いて紙だけずりずり動かす」を復活させる。すると処理負荷はどかっと低減され、裏で動かしっぱなしにしていても問題はなくなる。しかしどちらにしても問題は存在しているのだ。「あの」メモリーリークである。

最初は写真を表示する事がいかんのかと思ったが実は文字がいかんのではないかと思ったり。あれこれやるが結局のところ原因はよくわからない。しょうがないからとても姑息な手段を使うことにした。SmartCalendar-Xがバックグラウンドに来るとスライドショーを止めるオプションを付けたのである。これで立ち上げっぱなしにしておいてメモリーリークに悩むこともなければ不意の終了に怯えることもない。だって動いてないんだから。しかしプログラム作成者側の頭として考えていてもユーザー側の頭は別の事を考える。バックグラウンドにあっても何だかちらちら動いてないとつまんない。ええっとそれらの問題には前向きに対処することといたしまして、制限つきであっても早期にフィードバックを得たいと思うわけでございます、ということでVer0.3として公開することにした。

このように考え出したのは自分にとってそこそこ満足できる動きをするようになったことが一番大きな理由だが、他にも理由はある。2005年度は「裏プロジェクト」と称する物をいくつかやるつもりになっていた。このSmartCalendar-Xは「裏プロジェクトその2」なのだが、一時はお蔵入りにしかけていた「裏プロジェクトその1」が浮上しはじめたのである。

前の章 | 次の章


注釈