最新 追記

高木浩光@自宅の日記

目次 はじめに 連絡先:blog@takagi-hiromitsu.jp
訪問者数 本日: 1734   昨日: 1295

2009年12月19日

久しぶりのSwing開発で躓いたところ

10年ぶりにSwingでデスクトップアプリを開発し、いつのまにか本格的に実用に耐えるフレームワークに仕上がっていたのを知った。NetBeans IDEはとても快適で、API仕様の確認やAPIライブラリのソースコードの確認も簡単にできる。わからない部分があっても、Web検索をすればたいていのことが解説されているのを発見できた。しかし、それでもいくつか、解決策がすぐには見つからない点があった。せっかくなのでここに書き残しておく。

1. テキストコンポーネントのHTML機能を殺す

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のコメント欄で指摘されているように、一括で無効化する手段を用意してほしいものだ。

2. Windowsでフォントを奇麗にする

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));
(以下略)

参照

3. JLabelで省略表示「…」を左側に出したい

JLabelで表示するテキストがコンポーネントの幅を超えるとき、「…」で省略表示が出るようになっていて、通常、右側で省略されるようになっているが、これを左側で省略するようにしたい。

これがわからなかった。NetBeans IDEでもファイルのパス名表示で左側が「…」になっているのでできるはずなのだが、方法が見つからなかった。未だ解決していない。誰か教えて。

(解決策予定地) (追記)はてブコメントで教えて頂いた。以下の例のように、Rendererを自作するしかないみたい。

本日のリンク元 TrackBack(0)

2009年12月20日

Nyzillaは12月23日公開予定

アイコンやロゴのデザインは外注した。今回はその他の費用を含めてけっこうな額の私財を投じてしまった。

画面キャプチャ
図1: Windows版 Nyzilla 1.0

デバッグは終了。あとは、コード署名用クラス2証明書を取得するための、StartCom CAからの本人確認の郵便物が届くのを待つのみ。間に合うのだろうか。*1

Winnyネットワーク観測関係者向けの連絡事項

今回、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

*1 間に合わなかったら、署名なしでリリースするかも。

*2 パッシブ型の観測が行われている場合、Nyzilla利用者が、そのIPアドレスとポートを指定してアクセスしたときには、それが観測されるでしょう。このとき、接続元がNyzillaであることを示す単純な仕掛けは用意していませんが、挙動で判別することは可能でしょう。

*3 コマンド33切断要求(BadPort0警告)による効率低下を回避するためのもの。

*4 同一ではありません。

*5 その他の関係者の方についても、お尋ね頂ければお答えする用意があります。(場合によってはお答えしないこともあります。)

本日のリンク元 TrackBack(0)

2009年12月22日

最近のWinnyノード数の推移

最近のWinnyノード数の推移を以下に示す。

グラフ
図1: Winnyノード数の推移(緑のグラフに注目)

今年は5月末から10月末にかけて、何者かによるランダムIPアドレスの注入行為があり、従来の測定方法ではノード数を正しく把握できない状態になっていた。黄色と赤のグラフが5万前後の幅で大きく変動している部分は、ランダムIPアドレス注入によるノイズである。このノイズを黄色のグラフから除去する再計算を施したのが緑のグラフであり(10月17日の日記参照)、10月18日以降は、クローラでリアルタイムに緑グラフの数もカウントして出力するようにしていた(10月23日の日記参照)。今回*1、9月19日までの分も再計算して表示した。

緑のグラフを眺めると、従前通りにノード数は減っていっているように見える。

ただし、本当のノード数は、緑のグラフと赤のグラフの値の間にある。緑は、観測したキーに含まれるノード情報だけから計数したもので、赤は、隣接ノード情報と検索クエリ上のノードを加えて計数したもので、赤の値は実際より多い値を示している疑いがある(8月22日の日記の「新方式でのノード数調査」の節を参照)。*2

なお、12月5日から5日ほどの間、異常なピークが赤のグラフにだけ現れた(黄色には現れていない)。ピンクのグラフは、赤のグラフからノイズを除去したものであるが、その方法ではこのノイズを除去できなかったことを示している。新手のノード水増し手法が登場した(か、あるいは新しい実験が始まったのか)と考えられる。今後もこういったことが起きる可能性があるので、注意が必要だ。

*1 5月分の計算が間に合わなかったので、計算終了次第、追加したグラフに差し替える予定。

*2 赤のグラフが、10月18日以降、全体として値が小さくなっているように読めるが、これは、赤の値についてのクローラの集計方法を変えてしまったことによるものである可能性があり、これについては、いずれ分析する予定。(10月18日より前の集計で、余分なカウントをしていた疑いがある。)

本日のリンク元 TrackBack(1)

2009年12月23日

Nyzilla 1.0 リリース

Nyzilla 1.0 をリリースした。

残念ながら、コード署名用の本人確認通知が StartCom CA からまだ届かないので、諦めて、コード署名は無しでリリースした。必要のある環境からは、SSL経由でダウンロードされたし。

趣旨説明の中でも引用しているが、10月8日のWinny作者事件の高裁判決後の記者会見で、金子勇氏が次のように語ったと、朝日新聞が伝えていた。

判決後、金子元助手は(中略)と話した。(中略)「ソフトウエアは万能ではない。ユーザーがソフトをどう使うかは自由だが、ちゃんと使っていただきたい。あまり迷惑をかけていただかない方が助かる」。違法コピーが横行するネット社会については、こう語った。

朝日新聞2009年10月8日夕刊

「迷惑をかけないようちゃんと使っていただきたい」とのことだが、どうやったら「ちゃんと」、つまり、合法に使えるというのだろう? BitTorrentやLimeWireならば、利用者の意思で合法に使うことができる。しかし、Winnyの場合は、Winnyネットワークに参加している全員が合法に使用しない限り、誰も合法に使うことができない構造に設計されている。

それなのに、「ちゃんと使って頂きたい」というのは、いったいどういう方法なのだろう? 本人に会う機会のある方々は、ぜひ本人からその回答を聞き出してほしい。私も、次の機会ではそうしたい。

本日のリンク元 TrackBack(1)

2009年12月30日

StartCom CAでコード署名用証明書を取得した

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はイスラエルの会社で、イスラエル郵便局が記したヘブライ文字が見える。

写真
図1: StartCom CAからの書留郵便

StartCom CAでは、証明書の発行ではなくvalidationに対して課金するという方式になっており、一度validationすると1年近くの間*2有効で、何枚でも証明書の発行が受けられる*3ようだ。おそらく、validationの有効期限が切れると、再び同じ(料金と)方法でvalidationを必要とするのだろう。けっこう時間がかかるので注意を要する。

また、StartCom CAを利用する最初のステップは、startssl.comにアカウントを作成するところからだが、ここで使用するメールアドレスが、その後に取得する証明書のメール欄に書かれることになる(証明書の種類によっては)ようなので、初めから公開に適したメールアドレスを使うようにしないといけないようだ。

Nyzilla 1.0.1リリース

StartCom CAから取得したコード署名用証明書でインストーラに署名した*4、Nyzilla 1.0.1をリリースした。

1.0.1では以下の4点のバグ修正と機能改善を施している。

  • バグ修正: 「他のホスト」タブの「ホスト」列でポート番号まで表示されてしまうバグ(1.0リリース直前のエンバグ)を修正。
  • バグ修正: 待ち受け接続で接続をちゃんと切断できていなかったバグを修正。
  • 機能改善: 「保持の真偽」メニューを切り替えたときにその意味を説明するダイアログを追加。
  • 機能改善: コマンドライン引数にURLを渡すとそれを「閲覧サイト」として起動する機能を追加。

*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年後までと限定しており、それを延長する際には新バージョンをリリースする予定であるので、現在の版にタイムスタンプを付ける必要がない。

本日のリンク元 TrackBacks(64)

最新 追記

最近のタイトル

2024年11月11日

2024年07月28日

2024年07月27日

2024年07月07日

2024年04月07日

2024年04月01日

2024年03月23日

2024年03月19日

2024年03月16日

2024年03月13日

2024年03月11日

2023年03月27日

2022年12月30日

2022年12月25日

2022年06月09日

2022年04月01日

2022年01月19日

2021年12月26日

2021年10月06日

2021年08月23日

2021年07月12日

2020年09月14日

2020年08月01日

2019年10月05日

2019年08月03日

2019年07月08日

2019年06月25日

2019年06月09日

2019年05月19日

2019年05月12日

2019年03月19日

2019年03月16日

2019年03月09日

2019年03月07日

2019年02月19日

2019年02月11日

2018年12月26日

2018年10月31日

2018年06月17日

2018年06月10日

2018年05月19日

2018年05月04日

2018年03月07日

2017年12月29日

2017年10月29日

2017年10月22日

2017年07月22日

2017年06月04日

2017年05月13日

2017年05月05日

2017年04月08日

2017年03月10日

2017年03月05日

2017年02月18日

2017年01月08日

2017年01月04日

2016年12月30日

2016年12月04日

2016年11月29日

2016年11月23日

2016年11月05日

2016年10月25日

2016年10月10日

2016年08月23日

2016年07月23日

2016年07月16日

2016年07月02日

2016年06月12日

2016年06月03日

2016年04月23日

2016年04月06日

2016年03月27日

2016年03月14日

2016年03月06日

2016年02月24日

2016年02月20日

2016年02月11日

2016年02月05日

2016年01月31日

2015年12月12日

2015年12月06日

2015年11月23日

2015年11月21日

2015年11月07日

2015年10月20日

2015年07月02日

2015年06月14日

2015年03月15日

2015年03月10日

2015年03月08日

2015年01月05日

2014年12月27日

2014年11月12日

2014年09月07日

2014年07月18日

2014年04月23日

2014年04月22日

2000|01|
2003|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|05|06|07|08|09|10|11|12|
2012|02|03|04|05|06|07|08|09|
2013|01|02|03|04|05|06|07|
2014|01|04|07|09|11|12|
2015|01|03|06|07|10|11|12|
2016|01|02|03|04|06|07|08|10|11|12|
2017|01|02|03|04|05|06|07|10|12|
2018|03|05|06|10|12|
2019|02|03|05|06|07|08|10|
2020|08|09|
2021|07|08|10|12|
2022|01|04|06|12|
2023|03|
2024|03|04|07|11|
最新 追記