10年ぶりにSwingでデスクトップアプリを開発し、いつのまにか本格的に実用に耐えるフレームワークに仕上がっていたのを知った。NetBeans IDEはとても快適で、API仕様の確認やAPIライブラリのソースコードの確認も簡単にできる。わからない部分があっても、Web検索をすればたいていのことが解説されているのを発見できた。しかし、それでもいくつか、解決策がすぐには見つからない点があった。せっかくなのでここに書き残しておく。
Swingでは、登場した当初からテキストコンポーネントでHTMLが使えるようになっていた。つまり、テキストの冒頭が「<html>」で始まっていると、それ以降のテキストがHTMLとして解釈される。IEでセキュリティ問題を引き起こしたのと同根のうざい仕様だ。JavaScriptは使えないのでXSS脆弱性になることはないものの、表示するデータの出所によっては予期しないみっともない結果が生じ得る(巨大な文字を表示させられるとか)。
こういう前世紀的な悪仕様は廃止してもらいたい(デフォルトで無効に)ところだが、既に使われているものはそうもいかないのか、コンポーネントごとに putClientProperty で "html.disable" を Boolean.TRUE にすることで解決する策が、JDK 1.5になって導入されていた(Bug ID 4652898)。JTableでは各セルでセットしないといけないので、TableCellRenderer で putClientProperty して解決した。
import javax.swing.table.DefaultTableCellRenderer; import java.awt.Component; import javax.swing.JTable; class HtmlDisabledTableCellRenderer extends DefaultTableCellRenderer { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); putClientProperty("html.disable", Boolean.TRUE); return this; } }
ところが、JTable の JToolTip にセルの内容を表示するようにしていたため、そっちも対策しないといけない。そこで、JTableをサブクラス化して createToolTip() メソッドをオーバーライドし、そこで putClientProperty するようにした。
import java.swing.JToolTip; public JToolTip createToolTip() { JToolTip tip = new JToolTip(); tip.setComponent(this); tip.putClientProperty("html.disable", Boolean.TRUE); return tip; }
外部入力に依存する部分か否かに関わらず全てに対して無効化したいところなのに、こういう泥縄なやり方では気持ち悪い。Bug ID 4652898のコメント欄で指摘されているように、一括で無効化する手段を用意してほしいものだ。
Windowsで日本語を使うとフォントのかっこ悪さにげんなり。awt.useSystemAAFontSettings プロパティをセットし、各コンポーネントのフォントをメイリオにすることで、奇麗にできた。
System.setProperty("awt.useSystemAAFontSettings", "lcd");
import javax.swing.UIDefaults; import javax.swing.UIManager; import java.awt.Font; UIDefaults ud = UIManager.getLookAndFeel().getDefaults(); ud.put("Panel.font", new Font("Meiryo", Font.PLAIN, 12)); ud.put("Label.font", new Font("Meiryo", Font.PLAIN, 12)); ud.put("TextField.font", new Font("Meiryo", Font.PLAIN, 11)); ud.put("TextArea.font", new Font("Meiryo", Font.PLAIN, 11)); ud.put("ToolTip.font", new Font("Meiryo", Font.PLAIN, 12)); ud.put("Button.font", new Font("Meiryo", Font.PLAIN, 12)); ud.put("Table.font", new Font("Meiryo", Font.PLAIN, 11)); ud.put("TableHeader.font", new Font("Meiryo", Font.PLAIN, 11)); ud.put("CheckBox.font", new Font("Meiryo", Font.PLAIN, 12)); (以下略)
参照
JLabelで表示するテキストがコンポーネントの幅を超えるとき、「…」で省略表示が出るようになっていて、通常、右側で省略されるようになっているが、これを左側で省略するようにしたい。
これがわからなかった。NetBeans IDEでもファイルのパス名表示で左側が「…」になっているのでできるはずなのだが、方法が見つからなかった。未だ解決していない。誰か教えて。
(解決策予定地) (追記)はてブコメントで教えて頂いた。以下の例のように、Rendererを自作するしかないみたい。
アイコンやロゴのデザインは外注した。今回はその他の費用を含めてけっこうな額の私財を投じてしまった。
デバッグは終了。あとは、コード署名用クラス2証明書を取得するための、StartCom CAからの本人確認の郵便物が届くのを待つのみ。間に合うのだろうか。*1
今回、Winnyプロトコル互換の閲覧ソフト「Nyzilla」を一般公開することにより、少なからず、Winnyネットワークの観測結果に影響を及ぼす可能性があります。すなわち、Nyzillaの利用者がWinny利用者として計数され、無視できない数に及ぶ可能性を否定しきれません。できるだけその影響を小さくするために、いくつかの工夫を施しています。
(1) Nyzillaは、標準設定ではPort0接続だけを使用するようになっています。Nyzilla利用者がデフォルト設定の『「Port0」接続だけを使用する(推奨)』のまま使用している場合には、そのNyzillaのIPアドレスとポートが、Winnyノードとして他のWinnyノード(接続先の隣のノード)に伝達されるという事態(コマンド4による伝達)は生じないはずです。したがって、アクティブ型クローラ(パッシブ型ではない)が、Nyzilla利用者をWinnyノードとして観測することはないはずと考えます。*2
(2) 利用者が設定を変更し、『「Port0」接続だけを使用する』をオフにした場合、Nyzilla利用者のIPアドレスとポートは、Winnyノードとして他のWinnyノードに伝達されます。その結果、複数のWinnyノードから、当該NyzillaノードのIPアドレスとポートを示すコマンド4が観測される事態になると思われます。ここで、コマンド4の内容からNyzillaであること(通常のWinnyでないこと)を判別できるよう工夫しておきました。リリースされたNyzillaのアクティブ接続の挙動をご確認ください。
(3) また、利用者が『「Port0」接続だけを使用する』をオフにすると、Nyzilla上で待ち受け接続(ポート番号は7743で固定)が開始されます*3。利用者がいわゆる「ポート開放」をしている場合、クローラは、Nyzillaノードにも接続することになります。このときも、(2)と同様の方法*4で、Nyzillaであること(通常のWinnyでないこと)を識別できるよう工夫しておきました。リリースされたNyzillaのパッシブ(待ち受け)接続の挙動をご確認ください。
この情報は、こちらで既に把握している関係者の方々には個別にご連絡します。*5
最近のWinnyノード数の推移を以下に示す。
今年は5月末から10月末にかけて、何者かによるランダムIPアドレスの注入行為があり、従来の測定方法ではノード数を正しく把握できない状態になっていた。黄色と赤のグラフが5万前後の幅で大きく変動している部分は、ランダムIPアドレス注入によるノイズである。このノイズを黄色のグラフから除去する再計算を施したのが緑のグラフであり(10月17日の日記参照)、10月18日以降は、クローラでリアルタイムに緑グラフの数もカウントして出力するようにしていた(10月23日の日記参照)。今回*1、9月19日までの分も再計算して表示した。
緑のグラフを眺めると、従前通りにノード数は減っていっているように見える。
ただし、本当のノード数は、緑のグラフと赤のグラフの値の間にある。緑は、観測したキーに含まれるノード情報だけから計数したもので、赤は、隣接ノード情報と検索クエリ上のノードを加えて計数したもので、赤の値は実際より多い値を示している疑いがある(8月22日の日記の「新方式でのノード数調査」の節を参照)。*2
なお、12月5日から5日ほどの間、異常なピークが赤のグラフにだけ現れた(黄色には現れていない)。ピンクのグラフは、赤のグラフからノイズを除去したものであるが、その方法ではこのノイズを除去できなかったことを示している。新手のノード水増し手法が登場した(か、あるいは新しい実験が始まったのか)と考えられる。今後もこういったことが起きる可能性があるので、注意が必要だ。
Nyzilla 1.0 をリリースした。
残念ながら、コード署名用の本人確認通知が StartCom CA からまだ届かないので、諦めて、コード署名は無しでリリースした。必要のある環境からは、SSL経由でダウンロードされたし。
趣旨説明の中でも引用しているが、10月8日のWinny作者事件の高裁判決後の記者会見で、金子勇氏が次のように語ったと、朝日新聞が伝えていた。
判決後、金子元助手は(中略)と話した。(中略)「ソフトウエアは万能ではない。ユーザーがソフトをどう使うかは自由だが、ちゃんと使っていただきたい。あまり迷惑をかけていただかない方が助かる」。違法コピーが横行するネット社会については、こう語った。
朝日新聞2009年10月8日夕刊
「迷惑をかけないようちゃんと使っていただきたい」とのことだが、どうやったら「ちゃんと」、つまり、合法に使えるというのだろう? BitTorrentやLimeWireならば、利用者の意思で合法に使うことができる。しかし、Winnyの場合は、Winnyネットワークに参加している全員が合法に使用しない限り、誰も合法に使うことができない構造に設計されている。
それなのに、「ちゃんと使って頂きたい」というのは、いったいどういう方法なのだろう? 本人に会う機会のある方々は、ぜひ本人からその回答を聞き出してほしい。私も、次の機会ではそうしたい。
takagi-hiromitsu.jpでは、1年前から(2008年12月21日の日記)、StartCom CAの無料のDV (Domain Validation) SSLサーバ証明書を取得して、https:// ページを用意していた。その時点では、WindowsのルートCAストアにStartCom CAが含まれていなかったため、WindowsのInternet Explorerなどでは使えない状況だった。それが、今年になって、StartCom CAがWindowsのルートCAストアに組み込まれるようになったため、Internet Explorerなどでもこのサイトを https:// で閲覧できるようになった。*1
また、これにより、Windows用の.exeファイル等に対するコード署名「Microsoft Authenticode」に使える証明書を、StartCom CAから取得できるようになった。
StartComは、企業向けにEV証明書の提供もする一方で、個人向けに「Class 2」レベルのvalidationに基づく、コード署名用証明書を発行している。今回、Nyzillaをリリースするにあたり、この証明書の取得を試みた。
StartCom CAの「Class 2」validationでは、本人確認のために、パスポートの写しと免許証などの写しをアップロードして、それに基づいて送付されてくる書留郵便を受け取り、そこに記載された確認コードをWebサイトに入力するようになっていた。
パスポートには住所が書かれていないし(私の場合、本籍地に現住所と異なる都道府県が書かれているし)、免許証などは日本語表記になっているわけで、これで取得できるのだろうかと不安に思ったので、StartComに問い合わせたところ、解決するので送ってくれとの返事だった。
そして、12月18日にそれを送信したところ、その日のうちに書留郵便を送付したとの通知があった。この書留郵便が届いたのが12月29日で、思ったより時間を要した。StartComはイスラエルの会社で、イスラエル郵便局が記したヘブライ文字が見える。
StartCom CAでは、証明書の発行ではなくvalidationに対して課金するという方式になっており、一度validationすると1年近くの間*2有効で、何枚でも証明書の発行が受けられる*3ようだ。おそらく、validationの有効期限が切れると、再び同じ(料金と)方法でvalidationを必要とするのだろう。けっこう時間がかかるので注意を要する。
また、StartCom CAを利用する最初のステップは、startssl.comにアカウントを作成するところからだが、ここで使用するメールアドレスが、その後に取得する証明書のメール欄に書かれることになる(証明書の種類によっては)ようなので、初めから公開に適したメールアドレスを使うようにしないといけないようだ。
StartCom CAから取得したコード署名用証明書でインストーラに署名した*4、Nyzilla 1.0.1をリリースした。
1.0.1では以下の4点のバグ修正と機能改善を施している。
*1 ただし、この日記を https:// で閲覧すると、いわゆる「mixed content」となって、正常な https:// 閲覧の状態にならない。これは、この日記では、はてなブックマークの「○○○ users」の画像を http:// で埋め込んでいることが原因であり、はてながこの画像を https:// で提供してくれていない(https:// でアクセスすると奇妙なエラーになって接続できない)ため、この状況となっている。はてなが https:// での提供を開始してくれないならば、https:// でアクセスしたときにはこの画像を外すように、対策を施そうと思っているところ。Nyzilla配布ページでは、さきほど、そのように対策した。なお、Googleの「Browser Security Handbook」にあるように、ブラウザによって、mixed contentに対する挙動にばらつきがある。この件については、何が問題なのか、いずれ書きたい。
*2 Class 1 validationの有効期限とClass 2 validationの有効期限の短い方?
*3 複数のcommon nameが許される種類の証明書ならば。Class 2のコード署名用ではcommon nameが氏名なので1枚だけのもよう。
*4 現在のところ、タイムスタンプは付けていない。証明書の有効期限自体がまだ2年あって、Nyzillaは脆弱性対応期限を現在のところ1年後までと限定しており、それを延長する際には新バージョンをリリースする予定であるので、現在の版にタイムスタンプを付ける必要がない。