日付:2001/12/19
GBPut前回までのあらすじ:
「なんとか日々の更新を楽にしたい」という考えにとりつかれた男は、初挑戦のCocoa-Java環境での開発に苦しみながらもなんとか目的とするプログラムを作り上げる。しかし使ってみると「あまり使いやすくない」ということに気づき愕然とするのだった。
---
というわけで、私は怠けるためにさらに妙な方向に力を注ぎ込もうとしていた。
ファイルをファインダ上で探して(これはOS Xからカラム表示の大変使いやすいものになっている)そこからウィンドウにドラッグしていくのはどうしたって面倒だ。ではどうすればいいだろう。
たとえば、ファインダー上でファイルを選択し、ctrl+クリックしたらメニューがでる。そこから一気にFTPで送信できるなんてのはどうだろう?なかなかよさそうだが、とんでもなく面倒な気がする。ファインダの機能を拡張するなんてことははたして可能なのだろうか。仮に可能だとしても一歩間違えばとりかえしのつかないことになりそうだ。またそういう危険な作業をする際に自分がいかに信用がおけない奴であるかということは身にしみて知っている。
では別の策はないだろうか。ファインダを拡張しようとするからいけないのであって、ファインダもどきでファイルを参照できる画面を作り、そこからアップロードするファイルを選択する、というのはどうだろう。。。などと考えながらあれこれ探すとどうやらNSBrowserなる部品があり、これを使うとファインダのコラム表示と同様のことができるようだ。
例によって最初はインターネット上で情報をあさるところからスタートだ。あれこれ読んでみると、delegeteとかいう機構を使うと、二つ関数を定義するだけで簡単にできる、と書いてある。本当だろうかと思いながらいじること数刻。いきなりファインダのようにファイルが閲覧できるようになったのには正直驚いた。ディレクトリであれば選択した瞬間次の列にファイル一覧が表示される。こうした機能が、関数二つで。めちゃくちゃ楽ではないか。
Cocoaの前身というか母胎であるところのNext Stepが発表された当初から
「生産性の高さ」
はあれこれ宣伝されてきたところではある。宣伝の常としてその言葉を真に受けたりはしないのだが、これには驚いた。思えば1984年、卒業論文を書いていた頃はダイアログ(のようなもの)を一生懸命line文だけで作ろうとしていたなあ。。いまやこんな便利な部品がこんなに簡単に使えるとは、などと感傷に浸っている暇はない。ファイルの一覧が表示できただけでは問題は解決しない。まだまだ先は長いのだ。
そう考えるとひたすら前進である。基本的な機能は前作GFPutと同じだから話は早いだろう、、などと考えているとそうはならない。問題は二つあった。一つはいつもながらの
「作っている最中に仕様が発散していく」
現象との戦いである。頭が「使う立場」になると「あんな機能もいるし、こんな機能も便利そう」と考え出す。しかしいざ作り始めてみるとそれが結構時間を要することであることに気がつく。「もうここらへんで」と思うのだが、使用者モードの頭のほうは納得してくれない。
会社での仕事のように会議とかやらなくていいだけましだが、とにかくこの戦いを終わりにもっていかないことにはプログラムは完成しないわけだ。最近更新したファイルを上の方に表示すれば便利だよね。そのためにはファイルの更新日付を調べる方法を探し、次には配列の中身をソートする方法を探し。。このソートというのは以前SETI@Supportを作ったときに自分で作成したことがある。しばらくはそれを流用していたのだが、そのうちCocoaが用意している行列のクラスにはソートをしてくれる機能があることが解った。クラスライブラリがある時にはそちらを使え、というのが私の信条。4行書くだけですむライブラリ利用コードのほうが遙かに高速に動作してくれる。かくして自作ソートルーチンはまとめてゴミ箱行きとなった。
そうこうしているうちに機能はだいぶできあがってくる。最近とみにウィンドウ嫌い、引き出し(Drawer)愛好家となっている私は、すべての設定をDrawerで行うようにした。そして最後の、そして最大の困難はそのDrawerに起因していたのである。
これが最終的な画面。メインのウィンドウが「なんて簡単なの」と感激したNSBrowser。左と下にでているのが引き出しことDrawerである。
ブラウザ上でアップロードしたいファイルをダブルクリックすると、下の引き出しがにょろっと開き、リストに」追加される。送りたいファイルを全部選択したところで左下の「送信」ボタンをぽちっと押すとファイルがアップロードされる。これならばずりずりとファイルをドラッグする必要はない。ダブルクリックも面倒、という人のために「オプションキーを押しながらクリック」でも選択できるようにしようか、とか考えたが、やり方がわからないから断念した。
さて、送信が終わったファイルは引き出しのリストから削除されていく。最後のァイルを送信し終わり、通信が終了すると用済みになった引き出しはすいっと閉まる。と書くのは簡単なのだが、これがどうしてもうまくいかない。
通信を行う処理は別スレッドとして動かしている。スレッドたぁなんだといい始めると話が長くなるし、それよりも私自身が解っていないから割愛してしまうのだが、とにかく本体プログラムと平行して動けるように(つまり送信中であってもブラウザが操作できるように)してある。しかしその「別スレッド」というのがくせ者のようで、そこから
「引き出し閉じてくださいな」
とやってもなぜかそこで処理がどん詰まりになってしうのだ。
「どん詰まり」という表現はあまり聞こえがよくないし、おそらく適当ではないのだろうが、あれこれテストプログラムを作ったりして苦悩する私から見るとそうなっているとしか思えない。Cocoaには複数のスレッド間で「お知らせ」を出す機構もある、ということをどこかで読み、
「これはいけるかもしれない。そうだよ。きっとこれさえ実装すれば大丈夫なんだよ。ははははは」
と先走った笑い声などあげながらやってみるのだが、引き出しは頑として閉まろうとしない。この「引き出しをしめる」ためだけに作ったテストプログラムを見ると、方法その4くらいまでトライしたようだ。最後にはやけになって
「ええい、もう別スレッドはやめだ」
と叫び、実際にそうしたバージョンも作ってみた。すると確かに引き出しは閉まるのだが、ファイルをアップロードしている間、表示がいっさい変化しない。これでもいいじゃないかと自分に言い聞かせようとするのだが、送信ボタンを押した瞬間、プログラムが沈黙してしまうのは精神衛生上大変よろしくない。
あれこれ試すこと数日。解決策は別の方にあった。NSTimerなる機構が用意されており、これを使うと一定時間ごとにある関数を実行できることを知ったのである。これまでは
・別スレッドでアップロード処理
・終わると別スレッドから本体に「終わったよ」通知
・本体(もしくは別スレッド側)で引き出しをしめる
という処理をやろうとしていたのだが、このタイマーを使い、すべて本体側で面倒をみさせることにした。一定時間ごとにチェックに行き、ファイルがすべて送信されていれば引きだしを閉める。ためしてみるとこれがご機嫌にうごく。私はしばらく意味もなく引き出しの開閉ばかりやっていた。はたからみればさぞ異様に見えたことであろう。
さて、このほかにも
「ファイルが選択されたら、即時アップロードする機構もつけよう。あれ、だけどアップロードしている最中に別のファイルが選択されたらどうすればいいのかな。待ち行列を別に作る必要があるかな」
とかいう考えにもだいぶ悩まされたが最終的には「そんな面倒なことは考えない」と割り切り、作成に一応の区切りをつけた。
さて、ではいよいよ公開をするか、と思ったとき別の問題に突き当たった。名前をなんとすればいいのだ。最近私は自作プログラムの最初にGをつけたい、という願望にとりつかれている。五郎のGである。FileをPutするものだから、ということでGFPutという名前はすで使ってしまっている。。。どうしたものか、と悩むこと数分。Browserを使っているからGBputでよかろう、という安直な策に落ち着いた。
かくしてGBPutは2001年も押し詰まった12/28にサイト上で公開された。とはいっても今日に至るまでアクセス数は20程度である。Macintosh用のフリーソフトを紹介しているサイトとかに掲載依頼をだせばもっと多くの人に使ってもらえるのだろうが、そこまでやる気にもならない。
実はこのプログラムの完成(私にとっての)とほぼ時を同じくして、次のプログラムに私の興味および労力は移ってしまっていたのである。GBPutは毎日の更新に便利に使っている。しかし多くの人に使ってもらえる、ということはそれだけバグの発見確率が高まるということ。バグレポートをもらうことは精神衛生上あまりよろしくないし、それを直すのは結構たいへんだ。ということで、今の私はこのGBPutが密やかにサイト上で生息してくれることを望んでいるのである。では公開しなければいいではないか、とも思われるだろうが、そこが人間の心理の不可思議なところである。
さて、私の興味が移っていた先とはなんだ、と言えばこれが当初の目的であった
「メーラーの作成」
なのであった。
注釈