- 発端
「スクリプトを書いてくれ」
最初はそう言われたのだった。
しかし、話を聞くうちに分かってきた。
これはスクリプトでは済まない。
そこで、使用する言語をPowerShellから急遽Javaに変更した。近頃、Javaで書くシステムはWebシステムが多かったが、仕事でコンソールプログラムを書く事になった。
- ライブラリ
HTMLをパースする。XMLをパースする。パースというのは解析という事で、プログラムがHTMLを解釈してデータを取得するのである。XMLも同じである。
これはJavaの標準機能ではできない。ライブラリを使う事になった。
[Jsoup]
これでHTMLをパースした。出力も出来る。お世話様だ。
[dom4j]
これはね、最初はJava標準のXMLパーサでいけると思ってたんだ。ところがどっこい、読み取りはまぁいいんだけど、書き込みができない。
全然できない訳じゃないんだけど、ちょっと難しそうだったんだ。
因みに標準は、javax.xml.parsersというのらしいんだけど、うまく使えなかった。時間がかかりそうだったので、ネットで評判の良さそうなdom4jにした。
[jaxen]
これはdom4jに必要なライブラリだったんだけど、XPathというものを使えるようにするライブラリだ。このXPathというのが、今回自分には大きな発見だったんだな。
詳しくはググって欲しいんだけど、以下のMicrosoftのページが分かりやすいな。
要は、SQLのように、XMLから指定した集合を抽出できる言語が、XPathだ。これは誰かが勝手に考えたという訳ではなくて、 標準化団体W3Cで開発されたという事で、それなりに権威があるというか、公式な感じの言語だと思う。
これがまぁ面白いね。
先のMicrosoftのサイトにある例で、
x[1]/y[2] → 最初の <x> の 2 番目の子要素 <y>。
とある。SQLっぽいと言いつつ、順序も扱える所、なかなか。
- plist
iOS系の開発をする人は知っていると思うんだけど、plistというのは、XML形式のファイルで、iOSで使っている設定ファイルだ。これを今回生成する事になった。
iOSで使うファイルをWindows上で動くJavaで生成する。
俺は何をやっているんだ。plistを生成しているんだ。
そんな事を開発中に考えてしまったよ。
- 環境
個人的というか、要件は「ちゃんと出力しろよ」というだけだから、使うツールや環境に殆ど制約のない開発だった。それでJava8を使ったんだけど、使い慣れていないものだから、あまり新機能、ラムダ式とか使えなくて、残念だった。でも、Java7から入った、ファイル操作系のクラス、「Files」「Paths」なんかはガンガン使わせてもらった。初めてtry resourcesも使って便利だったよ。やっぱりバージョンアップは大事だな。自慢にならないけど、ついこの間まで、Java1.4だったんだ。Java6に上がって嬉しかったんだけど、もう8の時代だ。ようやく時代に俺が追い付いたって感じかな。
-- 追記 2015/04/19 --
このツールに機能を追加する事になった。
具体的には、Androidで使うpreferences.iniファイルを生成する。
このpreferences.iniというのは、設定ファイルだ。key=valueという形式で値が書いてある、簡易なデータベースといった所。テキストで扱える。
ええと、こいつを読み込んで編集するのか。どうしようかな。ライブラリ、だな。これは確か標準ライブラリにクラスがあったな。あったあった、これだ。Propertiesクラス。
。。。ちょっと違うな。
セクションが扱えないのではないか?
セクションというのは「[」と「]」で囲んだセクション名を見出しのように置くと、設定項目の組を作れるというものである。例えば、以下である。
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
[Animal]
fox=3
rabbit=1
cat=7
[bird]
pigeon=2
peacock=3
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
preferences.iniではセクションを使っているから、セクションが扱えないと駄目だ。
また外部ライブラリかよ。別にいいけど。
標準ライブラリのPropertiesクラスを諦めて、これを使いました。ini4j。ちっちゃいライブラリで可愛い。
それで、まぁつまらないこだわりなのですが、INIファイルを生成した時、自分の意図した通りの順番で上からセクションを並べたい。Androidのpreferences.iniは手で編集する事も充分あり得るから、綺麗に出力したいのです。しかし、このライブラリはMapというデータ構造で、INIファイルを読み込むのですな。Mapというのは、KeyとValueを紐付けて一組とし、これをたくさん保持するのですが、基本的に順序性はないのですよ。Javaの場合、TreeMapというクラスがあって、これなら、順序も扱えるのですがね。まぁそれで無駄に悩みました。
...
そうだ、一から値を格納していけば、きっと格納した順序で出力されるに違いない。設定ファイルからini4jに読み込んだ状態で編集して、そのまま書き出そうとするのではなく、一旦値を全部ini4jからアプリに取り出して編集し、ゼロクリアした状態のini4jに編集後の値を入れ、書き出してみよう。
そうやって書いちゃいました。
今は動いています。今後は知りませぬ。いざとなれば、ライブラリを使わずにアプリで書き出すしかないが、今の所うまく動いているので、そのままである。