野狐消暇録

所感を記す

会社で作ったJavaツール

  • 発端

スクリプトを書いてくれ」

最初はそう言われたのだった。

しかし、話を聞くうちに分かってきた。

これはスクリプトでは済まない。

そこで、使用する言語をPowerShellから急遽Javaに変更した。近頃、Javaで書くシステムはWebシステムが多かったが、仕事でコンソールプログラムを書く事になった。

  • ライブラリ

HTMLをパースする。XMLをパースする。パースというのは解析という事で、プログラムがHTMLを解釈してデータを取得するのである。XMLも同じである。

これはJavaの標準機能ではできない。ライブラリを使う事になった。

[Jsoup]

jsoup.org

これでHTMLをパースした。出力も出来る。お世話様だ。

[dom4j]

sourceforge.net

これはね、最初はJava標準のXMLパーサでいけると思ってたんだ。ところがどっこい、読み取りはまぁいいんだけど、書き込みができない。

全然できない訳じゃないんだけど、ちょっと難しそうだったんだ。

因みに標準は、javax.xml.parsersというのらしいんだけど、うまく使えなかった。時間がかかりそうだったので、ネットで評判の良さそうなdom4jにした。

[jaxen]

http://jaxen.codehaus.org/

これはdom4jに必要なライブラリだったんだけど、XPathというものを使えるようにするライブラリだ。このXPathというのが、今回自分には大きな発見だったんだな。

詳しくはググって欲しいんだけど、以下のMicrosoftのページが分かりやすいな。

XPath の例

要は、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ではセクションを使っているから、セクションが扱えないと駄目だ。

また外部ライブラリかよ。別にいいけど。

ini4j.sourceforge.net

標準ライブラリのPropertiesクラスを諦めて、これを使いました。ini4j。ちっちゃいライブラリで可愛い。

それで、まぁつまらないこだわりなのですが、INIファイルを生成した時、自分の意図した通りの順番で上からセクションを並べたい。Androidのpreferences.iniは手で編集する事も充分あり得るから、綺麗に出力したいのです。しかし、このライブラリはMapというデータ構造で、INIファイルを読み込むのですな。Mapというのは、KeyとValueを紐付けて一組とし、これをたくさん保持するのですが、基本的に順序性はないのですよ。Javaの場合、TreeMapというクラスがあって、これなら、順序も扱えるのですがね。まぁそれで無駄に悩みました。

...

そうだ、一から値を格納していけば、きっと格納した順序で出力されるに違いない。設定ファイルからini4jに読み込んだ状態で編集して、そのまま書き出そうとするのではなく、一旦値を全部ini4jからアプリに取り出して編集し、ゼロクリアした状態のini4jに編集後の値を入れ、書き出してみよう。

そうやって書いちゃいました。

今は動いています。今後は知りませぬ。いざとなれば、ライブラリを使わずにアプリで書き出すしかないが、今の所うまく動いているので、そのままである。