題名:Java Diary-103章

五 郎の 入り口に戻る
日付:2012/1/15
目 次に戻る


Gorotte -Part4

まず取りかかったのはプログラムの改修である。投稿した状態で一応動いてはいた。Google App Engine側で文章を単語にちょんぎり、、それをiPadに転送する。ややこしい処理もサーバー側で行う。なぜこんな構成にしたかというと、形態素解析 処理はサーバーでしか行えないと思っていたからだ。

しかしその後、iPhone上でも形態素解析が行えるライブラリが公開されている事を知る。おまけにTF/IDFも最初はサーバーで 行っていたが、最終的にはiPad上で行うことにした。であれば、全部iPad上で完結しそうでは無いか。それでなくても Evernoteのサーバと、こちらのサーバー、またiPadの上との同期をとるのは面倒なのだ。

というわけで、iPad上で全部処理を行うVer2.を作り出す。まずiPhone上の形態素解析をあれこれやる。サンプルプログラム が、プロジェクトごと公開されているから簡単にいく、、などということはないのであった。あれこれ試行錯誤の結果なんとか動き出す。この 時点でまだ12月までは時間がある。少し余裕をもって開発を進める。次にはEvernoteのサーバーとの同期機能をiPad側に持たせ る。ありがたい事にiOSアプリでそうした機能を実現するサンプルソースが公開されている。それを参考に、今までサーバーでやっていた同 期処理をObjective-Cに移植する。最初から全部やると大変だから、少しのデータ数で試してみる。見事に動く。なーんだサーバー なんていらなかったんや。一人で悦にいる。これで動き出せば発表までにかなり使い込む事ができる。えへへへ。しかし例によってそうは進ま ないのであった。

さあ、これで全部のデータを同期して動かしてみよう、とおもう。あとは自動だから簡単だよね、と思ってしばらく動かす。順調に進んでい るようだ。この様子ならそう長くかからないだろう。何か別の事をする。もう終わっただろうと思って画面を見る。プログラムは何か言って止 まっている。うげげげげ。

まず最初に解ったのは、Evernoteのサーバーにある時間以上接続していると有効期限が切れてしまうということだ。まあそこは後に 回そう。そこは気にしないことにして、再度プログラムを動かす。するとよたよた、とプログラムが動き出す。そのうち動きがだんだん遅く なって行き、またプログラムが止まる。どうも問題はより深いところにありそうだ。

まあいい。とにかくいっぺん同期してみよう、ということで何度か繰り返す。そのうちようやく同期に成功する。しかしその次に類似文章を 探すための処理が走るのだが、それも途中で止まる。プログラムの動作がだんだん遅くなって行き動かなくなる。そのうち別のエラーが起こ る。「ハードディスクの容量がなくなりました」というエラーメッセージがシステムからでているのだ。これはどうしたことか。

ここに至ってハタと気がつく。プログラムが実行中にメモリをやたらと使っているのだ。この「だんだん遅くなってハタと落ちる」様子は遠 い昔に見た事がある。解放すべきメモリを解放しないプログラムがこんな風に動いていた。そのプログラムを作った男は

「いや、これはUNIXのプライオリティ制御が悪いのだ。長い間実行しているうちにプライオリティが下がりまくることが原因だから UNIXを使っているうちは回避できない」

と断言していた。メモリ解放をちゃんと行うようにしたらすいすい動き出したが。

さて、原因は解ったが解消は簡単ではない。明らかに悪いところは直したが、相変わらずお亡くなりになる。最後まで処理が進まない。あれ これ検索して、今回データの保存に使っているCore Dataの使用メモリを減らす方法を調べて実践してみるが、不思議なことに更に短い時間でお亡くなりになる。調べてみればメモリ使用量はものすごい勢いで 増えて行く。

あれこれやってみたがどうしてもiPad上だけで完結させることができない。もちろん私が悪いのだが、だんんだん残り時間がなくなって きた。こうなるととにかく動かす事が優先になる。ええい、もうデータはMacで作る事にしよう。MacならメモリもG単位で使えるし、 CPUだって強力だ。でもってそこで作ったデータをiPadに移動させればいい。多少面倒だが、とにかく日々動かすことが重要だ。今こう して書きながら考えれば「最初の構成に戻したら」と思うのだが、たいていの場合私は間違った方向に進む。Ver2で作ったソースコードを 使って、その一部をMac上で動くアプリケーションに作り直す。さて問題です。Mac上のアプリってどうやって作るものだったでしょう か。ここ数年Macアプリを作っていないので完全に忘れている。今探してみると、iPhoneアプリを作る話は山ほど出てくるが、Mac のアプリを作る方法は(比較的)少数しかでてこない。乏しい記憶を辿り、あれこれ思い出すが、今度はToolの方が変わっている。 XCodeも4.0になり大きく使い方が変わった。その使い方はどこに書いてあるのか。そうやってあれこれ探しながらプログラムはなんと かできそうだ。さて、あと難関は二つある。一つは文章を単語にちょんぎる形態素解析。もちろんそれ用のプログラムは公開されているからそ れを使えばいいのだが、それをアプリから使えるかどうかというのは別の問題なのだった。

使うのはMecabという形態素解析。それをMac OSのアプリからどうやってよび、そして結果を受け取ればいいのか。かなーり調べてみるとあるプログラムでそれを行っていることが解る。おまけにソースが 公開されている。わーい、これを使えば問題解決だ、と思うがもちろんそんなことはない。そのまま使うが結果が何もでてこない。そもそも動 いていないように見える。

それからあれやこれやの試行錯誤が続く。公開されているプログラムはMecabをシェルスクリプトから起動している。なんで、こんな面 倒な事をしているのか。直接起動すればいいではないか、と思い直接呼ぶようにする。動かない。あれこれ調べるとどうもシェルスクリプトか ら呼んだほうがいいようだ。シェルスクリプトを復活。パラメータをどうやって渡せばいいのか。これも数種類試したあげく、参考にしたプロ グラムの構成に戻る。あれこれ試すがとにかく動かない。そのうちハタと気がつく。文字コードが問題ではなかろうか。

細かい説明は省くが、数年前からUTF-8というありがたいものが登場した。いろいろ問題はあるのだろうが、それまで多数損じしていた JISとかShift-JISとかEUCとかEBSDICとかとにかくUTF-8にすれば万事解決だ、とか私のような人間は考えている訳 だ。だから今回Mecabの辞書はUTF-8にしていたし、パラメータの受け渡しもそれで行っている。それでうまくいくだろうと思ってい たのだが、どうもそこに問題があるらしい。とにかく動く実績がある(と言われているもの)を手元で動かしてみよう。MecabはEUCで 動かす。すると不思議な事にきちんと結果が返ってくる。

やれうれしや、ということで実際に使う処理に近づけてあれこれやる。これでようやく形態素解析ができるようになった。次にやることは、 Mac上のアプリケーションで作成したデータベースのファイルをiPad側に持って行く事だ。これはあっさり成功。よし。これでなんとか 間に合った。

などというのは愚か者の夢であることがわかるまでそう時間はかからなかった。よくよく観ると、カタカナとひらがなの濁点がおかしい。濁 点がつくべき文字についていないのだ。これはどうしたことか。

いや、この問題は以前に一度でくわしたことがある。遠い昔GMailを作っている際、どうみても同じ名前のフォルダなのだが、プログラ ム上では事アンル名称と判定される。そのとき知ったのは、Unicodeが濁点を扱う方法には二つあり、濁点つきの一文字として扱うほう ほうと、ひらがな+濁点の二文字として扱う方法があるということだった。

しかし何故その問題がおこる。検索エンジンの神様にお伺いをたてると、Mac OS Xのファイルシステムがちょっと変わった方法をとっていることはわかった。しかし今は別にファイルシステムを熱かっては居ない筈だが。。などとあれこれ考 えてもしょうがない。とにかく問題が生じているのだ。

再び検索エンジンの神様にお伺いをたてる。するといくつか解決方法らしきものが乗っている。やれうれしや、ということで実装をしてみる が問題は解消しない。濁点を分ける、分けないの文字列間の変換関数が定義されているらしいのだが、ありとあらゆる組み合わせをやってもそ れが期待通りに動かないのだ。

疲れきった私は原点に戻る。もともとMecabをシェルスクリプトで起動するプログラムを参考にしていたのだが、それはなぜかあるプロ グラムを経由してmecabにデータを渡していた。今思えばあれが鍵だったのではないか。

「なに?このプログラム。いらないよね」

と根拠もなく外してていたのだが、そのプログラムについてあれこれ調べる。するとまさしく私が期待していた

「濁点を二文字→一文字」

の変換をしてくれる事を知る。再びプログラムを改修し、そのプログラムを経由してやりとりするようになる。ちゃんとプログラムが動き出 す。

これでプログラムのほうは(面倒だが)とにかく動くようになった。データをアップデートするたびMac上のアプリでデータベースのファ イルを作り、iPadに手動で転送し、、とやらなくてはいけない。いつの日かこれは

「iCloud経由で自動同期」

にするのだ、などとiCloudの情報がのったページを保存したりするのだが、おそらくそれが日の目をみることはない。とにかくこれま で音楽を聴いたり、映像をみたり、と情報だだ漏れ状態だった

「通勤電車の中」

でこのプログラムを使う事にする。そして次の問題にかからなくてはならない。プレゼンをどうするかだ。

前の章 | 次の章


注釈