Keiichi Oono's Weblog

All | cc | NetBeans | OpenSolaris | Personal
メイン | 次のページ »
20080812 2008年 8月 12日 火曜日

NetBeans 6.1 でウィンドウの背景色を黒色に、文字を白色にする

NetBeans のウィンドウの背景色を黒色に、文字を白色に変更する方法を探して色々と試してみたのですが、エディタ以外のウィンドウの背景色はシステムの設定に従うようでした。Windows XP で試してみた以下の画像は、次の設定によるものです:


クリックでリンク元画像を直接表示

 

Posted by keiichio ( 8月 12日 2008年, 03:01:24 午後 JST ) Permalink 投稿されたコメント [0]

20080430 2008年 4月 30日 水曜日

NetBeans 6.1 英語版リリース。日本語メーリングリストから報告されて修正されたバグなど

米国時間の 4/28 (月) に NetBeans 6.1 英語版がリリースされました。日本は運悪く 4/29 (火) の祝日にリリースされることになってしまいましたので、「気づいたらリリースされていた」となった方々がたくさんいるのではないかと思います。

リリース情報のページを訳しましたので、6.1 での新機能や改良された点などについては NetBeans IDE 6.1 リリース情報 を見てください。このページにおかしな点などありましたら、http://ja.netbeans.org/ の nbdiscuss_ja メーリングリスト宛に教えて頂けると嬉しいです。

6.0 移行修正されたバグを検索しようとしたら 4,000 件近くあり、長大なリストになってしまいました。旧来からのバグを直したものもあるでしょうし、6.1 の開発によって発生して修正されたものもあると思います。全体のリストを紹介することに意味はあまり無いような気がしますが、一応リンクを以下に記しておきます。表示にかなり時間がかかるとおもいますので注意してください:

日本語メーリングリストで報告された問題については 13 件が修正されています。動作上の質問やバグではないかと思われる点などありましたら、ぜひ 日本語サイトのメーリングリスト 宛にご連絡ください。

 
Posted by keiichio ( 4月 30日 2008年, 06:12:25 午後 JST ) Permalink 投稿されたコメント [0]

20080411 2008年 4月 11日 金曜日

NetBeans 6.1 リリース候補ビルド (RC1) 英語版が公開されました

NetBeans 6.1 のリリース候補ビルド (RC1) 英語版が公開されました。以後、英語版は新たに発見された深刻な問題以外は修正しませんので、ユーザーの方々からの問題の報告が無ければ、このままリリースされます。通常は必ずいくつかの報告が寄せられるので、それらの修正をした上でリリースとなります。

日本語化 zip ファイルも同時に更新しましたので、RC1 と一緒に使ってください。以下のページから 6.1 RC1 のダウンロードと日本語化 zip のダウンロードができます。

http://ja.netbeans.org/downloads/61/index.html

今現在の日本語化 zip には 6.0.1 の時点の日本語訳しか含まれていませんので、6.1 の新機能などは英語で表示されます。今回のリリースでの比較的大きな新機能は JavaScript 編集支援機能と、PHP 開発環境の提供ですので、これら 2 つ以外の機能では、ほとんどのメッセージは日本語で表示されます。

日本語版の進捗については 片貝さんのブログ にあるとおり、これから翻訳を開始するところです。今のところ以下のスケジュールを予定しています。

RC1 についてのフィードバックや、あるいは現在の NetBeans の日本語化されたユーザーインターフェースで修正して欲しいと思うところなど、何かありましたらぜひ nbdiscuss_ja メーリングリスト宛にコメントをお願いします。メーリングリストの購読などは以下のページを見てみてください。

http://ja.netbeans.org/lists/

 
Posted by keiichio ( 4月 11日 2008年, 05:01:45 午後 JST ) Permalink 投稿されたコメント [0]

20080402 2008年 4月 02日 水曜日

NetBeans のチュートリアルを OmegaT を使って日本語に翻訳する

NetBeans のチュートリアル翻訳プロジェクトに参加して、NetBeans プロファイルツールのチュートリアルを 2 つ翻訳してみることにしました。翻訳に当たってフリーの OmegaT という翻訳支援ツールを使うことにしました。この翻訳支援ツールは以下のことをしてくれます:

チュートリアル翻訳プロジェクトでは、OmegaT を使って翻訳するときのために「翻訳メモリ」と呼ばれるファイルも公開していますので、それをダウンロードして使います。「翻訳メモリ」とは翻訳文書が保存されているファイルで、新しいファイルを訳す際の類似の訳文は、この翻訳メモリから探されます。また場合によってまったく同じ英文がメモリ内に見つかることがあります。その時にはその英文に対する日本語訳をそのまま流用できます。

OmegaT のダウンロードとバグ修正

OmegaT のソースを変更してコンパイルしなくてはいけませんでした...
Solaris で使っているので、もしかしたら Windows や Linux では問題ないのかもしれないです。翻訳が終わったら OmegaT プロジェクトに報告しようと思っています。私と同じような修正を行う場合には、コンパイル済みバイナリのダウンロードは不要ですので、最新リリースの 1.7.3_1 のソースファイルのみをダウンロードします:

http://downloads.sourceforge.net/omegat/OmegaT_1.7.3_01_Source.zip

OmegaT の設定ファイルは $HOME/omegat.pref という名前で保存したいようなのですが、ファイルの区切り文字が挿入されていないので、/home/keiichio/omegat.pref としたいところが /home/keiichioomegat.pref となってしまっていて結局保存できません。ファイル名を組み立てるところに File.separator を挿入すれば良いだけの話ですので、修正はごく単純です。以下の 2 つのクラスを修正します:

もしかしたら必要な人がいるかもしれないので (いるのか?)、パッチファイルを添付しておきます。保存ファイル名を私の好みで .omegat で始まるように変更してありますので、そこら辺は適宜変更して使ってください:

修正したらソースファイルを展開したディレクトリで ant を実行すればビルドが完了します。私は手元にあった ant 1.7.0 でビルドしました。

  $ ant

起動はビルドされた jar ファイルを java に渡すだけです。ビルドすると dist ディレクトリに起動用の bash スクリプト OmegaT も用意されますが、使い勝手が良くないと思いました。これも後で OmegaT プロジェクトに報告しようかと思っています。

  $ java -jar dist/OmegaT.jar

私自身はフォントのアンチエイリアスの指定などがしたかったので、起動用のスクリプトを自分で作って使っています。参考までにスクリプトの内容を貼り付けておきます:

#!/bin/sh

myname=`basename $0`
a=`dirname $0`
bindir=`cd $a; pwd`

default_options="-client -Xss2m -Xms32m -Dawt.useSystemAAFontSettings=on"

java ${default_options} -jar $bindir/src/dist/OmegaT.jar $*

あとは OmegaT の以下のような画面で翻訳を進めていきます

 
Posted by keiichio ( 4月 02日 2008年, 12:34:22 午後 JST ) Permalink 投稿されたコメント [1]

20080328 2008年 3月 28日 金曜日

MySQL と Sun の初めてのセミナーが 4 月 9 日(水) に開催されます

MySQL と Sun の初めてのセミナーが 4 月 9 日(水) に開催されます。

春のMySQL祭り 2008 - Jumping to the Sun !

開催日時:2008 年4月9日(水) 13:30 から
開催場所:ウエスティンホテル東京
参加費用:無料(事前登録制)
主催:MySQL 株式会社、サン・マイクロシステムズ株式会社

会場へアクセス可能でご興味のあるかたは見てみてください。

 
Posted by keiichio ( 3月 28日 2008年, 02:15:17 午後 JST ) Permalink 投稿されたコメント [0]

20080319 2008年 3月 19日 水曜日

NetBeans 6.1 Beta, DTD ファイルから DOM ツリースキャナを自動生成させる

前のエントリで紹介した NetBeans 6.1 で復活予定の DTD から DOM ツリースキャナを生成する機能について具体的に見ていきたいと思います。あわせて紹介した SAX ドキュメントハンドラの自動生成については Beta ではうまく動かないので、バグ が修正されてから確認するつもりです。この機能は NetBeans 5.5.1 または NetBeans 6.1 Beta で試すことができます。

使用方法は単純で以下の手順を実行するだけです。

  1. 処理したい XML の DTD を準備
  2. DTD が無い場合には、NetBeans 上で XML ファイルをダブルクリックして「DTD を生成」を実行することもできます
  3. DTD をマウスの右ボタンでクリックして「DOM ツリースキャナを生成」を選択して、クラス名を指定して「了解」をクリックします

例えば、上記の手順で生成されたクラスを使用する主クラスを作れば DOM を使用したパーサーとして使うことができます。

サンプルファイルと実際のコード

サンプルとして次のような XML を定義する、ちょっとしたマシン管理カードのようなもののための DTD を例に使います:

XML の例 (simpletest.xml)

<?xml version="1.0"?>
<!DOCTYPE machine SYSTEM simpletest.dtd">

<machine cpu="UltraSPARC T2" memory="2GB">
  <drive type="HDD" size="300G">
  <dryve type="DVD">
  <peripheral>DAT DDS3</peripheral>
</machine>

上の XML のための DTD (simpletest.dtd)

<xml version="1.0"?>
<!ELEMENT machine (drive*, peripheral*)>
  <!ATTLIST machine cpu CDATA #REQUIRED>
  <!ATTLIST machine memory CDATA #REQUIRED>

<!ELEMENT drive EMPTY>
  <!ATTLIST drive type (HDD | CD | DVD | none) #REQUIRED>
  <!ATTLIST drive size CDATA #IMPLIED>

<!ELELMENT peripheral (#PCDATA)>

上記の simpletest.dtd を右クリックして DOM スキャナを生成させると、デフォルトでは SimpletestScanner.java が生成され、SimpletestScanner クラスには以下のメソッドが実装されます
メソッド名 用途
SimpletestScanner(org.w3c.dom.Document document) コンストラクタ
public void visitDocument() パースして処理する時に呼び出すべきメソッド
void visitElement_drive(org.w3c.dom.Element element) visitDocument() から呼び出される drive 要素用のメソッド
void visitElement_machine(org.w3c.dom.Element element) visitDocument() から呼び出される machine 要素用のメソッド
void visitElement_peripheral(org.w3c.dom.Element element) visitDocument() から呼び出される peripheral 要素用のメソッド

例えば、XML をパースして drive 要素の type 属性の値をプログラムから書き換える必要がある場合には、visitEelement_drive() メソッドに手を加えれば実現します。この例では visitElemnt_drive() は以下のようになっていたので、「ここに処理を追加」と私が追記した部分に必要な処理を書けば OK です。

void visitElement_drive(org.w3c.dom.Element element) {
    // 
// element.getValue();
    org.w3c.dom.NamedNodeMap attrs = element.getAttributes();
    for (int i = 0; i < attrs.getLength(); i++) {
        org.w3c.dom.Attr attr = (org.w3c.dom.Attr) attrs.item(i);
        if (attr.getName().equals("type")) {
            // ここに処理を追加
        }
        if (attr.getName().equals("size")) {
        }
    }
    org.w3c.dom.NodeList nodes = element.getChildNodes();
    for (int i = 0; i < nodes.getLength(); i++) {
...

完成した SimpletestScanner.java を使用するための主クラスは様々な書き方があると思います。一つの例として私が使ったきわめて単純なものを貼り付けておきます。コメントもエラー処理も何もない酷いソースですが、最低限の処理の例と言うことで ...

XML ファイルへのパスを引数として与えると、内容を標準出力に書き出します。StreamResult(System.out)) の部分を StreamResult(new FileOutputStream("/tmp/foo.xml")) などと書き換えるとファイルに出力するようになります。

package xmlsample;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;

public class RunSimpletestScanner {

    public static void main(String args[]){
        try{
            // 一つめの引数から Document オブジェクトを取得
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dbf.newDocumentBuilder();
            Document doc = builder.parse(new File(args[0]));
  
            // DOM ツリースキャナのインスタンスを取得して visitDocumnent() を呼び出して処理を行う          
            SimpletestScanner scanner = new SimpletestScanner(doc);
            scanner.visitDocument();
            
            // Transformer を準備して、DOM ツリーを標準出力に書き出す
            TransformerFactory tff = TransformerFactory.newInstance();
            Transformer tf = tff.newTransformer();
            tf.transform(new DOMSource(doc), new StreamResult(System.out));
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
}

 
Posted by keiichio ( 3月 19日 2008年, 02:29:16 午後 JST ) Permalink 投稿されたコメント [0]

20080318 2008年 3月 18日 火曜日

NetBeans 6.1 Beta, DTD ファイルから DOM ツリースキャナと SAX ドキュメントハンドラを自動生成

NetBeans 5.5.1 まではプロジェクト内の DTD ファイルを右クリックすると表示されるメニューの中に以下の 2 つが含まれていましたが、6.0/6.0.1 で無くなってしまいました。

これが 6.1 で復活することになりました。メニュー項目名の通り、これらは以下の機能を提供します:

DOM ツリースキャナを生成

DTD から、DOM ツリー内をスキャンするクラスが自動生成されます。生成されたクラスに少し手を加えると、XML の特定のノードの値を変更して出力するプログラムを作ることができます。

SAX ドキュメントハンドラウィザード

こちらも DTD ファイルを読み込んで、ContentHandler インターフェースを実装したドキュメントハンドラを生成します。DTD で定められた要素が見つかった時に、その内容を標準エラー出力に書き出すデバッグ用メソッドが自動生成されます。

これら 2 の機能は、XML を読み込んで動作するプログラムを作るときに便利だったので、ユーザーからの復活の要望が多く、6.1 で復活することになりました。機能を消したのもじつは、熟慮の結果というわけではなかったみたいです:
http://www.netbeans.org/issues/show_bug.cgi?id=90174

私自身、復活する前に使いたい時があって、その時は 5.5.1 でソースを生成させて 6.0.1 で編集しました。

ただ、SAX ドキュメントハンドラウィザードは 6.1 Beta で動かなかったので、さっきバグ登録をしました:
http://www.netbeans.org/issues/show_bug.cgi?id=130372

Beta でバグがあるとはいえ、便利だと思っていた機能が復活したのは嬉しかったです。

 
Posted by keiichio ( 3月 18日 2008年, 07:38:40 午後 JST ) Permalink 投稿されたコメント [0]

20080313 2008年 3月 13日 木曜日

NetBeans 6.0.1 日本語ドキュメントの一覧ページ

Sun 社内で進んでいた NetBeans 6.0.1 のドキュメントの翻訳作業が終わったので、今現在 Web サイト上にある 6.0.1 向けの全日本語ドキュメントへのリンクを集めて、見出しページを作りました:

http://ja.netbeans.org/docs/60/1/index.html

このページからリンクされているドキュメントには、Sun の翻訳したページだけではなくて、日本語サイトのプロジェクトメンバーが訳してくれたページへのリンクも含まれています。

すべての 6.0.1 向けのドキュメントを訳すことはできなかったので、まだ英語のまま残っているものもあります。暫定的なページですが、現在英語のまま残っているドキュメントはこのページにあります:

http://wiki.netbeans.org/TFNB6WebDocNotTranslatedYet

あらためて日本語サイトプロジェクト内で呼びかけがあるかもしれませんが、興味をもっている分野のドキュメントが英語のままで、調査もかねて翻訳してみようと思われたかたは、ぜひご連絡ください。詳しくは以下の wiki ページで説明されています。

http://wiki.netbeans.org/JaNetBeansTutorialTrans

プロファイラ関連のドキュメントが訳されていないのが残念 ... って他人事のように言える立場ではないのですが、プロジェクトはすでに 6.1 に軸足を移してしまっているので、コミュニティのメンバーとして自分で訳すかな、と思い始めているところです。

 
Posted by keiichio ( 3月 13日 2008年, 07:07:17 午後 JST ) Permalink 投稿されたコメント [0]

20080307 2008年 3月 07日 金曜日

NetBeans 6.1 Beta がリリースされました

NetBeans 6.1 Beta がリリースされました。英語版のみのリリースですが、6.1 で予定されている新機能を試すことができます。

NetBeans 日本語サイトと、メーリングリスト上でお知らせするために、リリース情報のページを翻訳して web サイトに上げました、新機能についての参考にしてください。

http://www.netbeans.org/community/releases/61/index_ja.html

このページを最初に公開したときには Spring が Sprint だったり、一通り読み返してからサイトに commit したつもりなのですが、全然ダメでした。メーリングリストで、間違いを指摘して頂いてホントにありがたかったです。

 
Posted by keiichio ( 3月 07日 2008年, 06:06:48 午後 JST ) Permalink 投稿されたコメント [0]

20080218 2008年 2月 18日 月曜日

DoJa-5.1 プロファイル向け i アプリ作成ツールと NetBeans 6.0.1 の連携

片貝さんたちとともに NetBeans の紹介をする 2 月の Java Hottopic セミナー で NetBeans のモバイル開発機能に関する話をするので、そのための下調べとして DoJa - 5.1 プロファイル向け i アプリ作成ツールと NetBeans 6.0.1 の連携を試してみました。

DoJa-5.1プロファイル向けiアプリ作成ツールは以下の URL からダウンロードすることができます:
http://www.nttdocomo.co.jp/service/imode/make/content/iappli/about/tool_foma5_1.html 大まかな手順は

  1. 作成ツールのインストール。NetBeans モジュールも一緒にインストール
  2. NetBeans のプラグインマネージャから DoJa プラグインをインストール

これで、DoJa 向けプロジェクトを NetBeans から作成し、エミュレーター上で実行することができます。途中ビルド用のプロパティファイルの変更が必要ですが、それ以外は特に特別な設定は必要ありませんでした。以下に具体的な手順を説明します。

インストール

インストール先はデフォルトのディレクトリ C:\iDKDoJa5.1\ を使用しました。インストールオプションとしては「カスタム」を選択し、

を選択しました。インストール中に、モジュールのインストール先と、NetBeans のアップデートセンターでインストールする旨を説明するダイアログが表示されました。その時にモジュールのインストール先を控えておきます。私の場合は: c:\iDKDoja5.1\plugin

作成ツールの実行

インストールされたので一度作成ツールを起動して操作してみましたが、すぐに NetBeans の設定をしてしまっても良いと思います。

NetBeans 6.0.1 にプラグインをインストール

NetBeans 6.0.1 でメインメニューから「ツール」>「プラグイン」を選択し、「ダウンロード済み」タブを選んで「プラグインの追加」をクリックします。先ほど控えたプラグインのインストール先を選択します。私の場合は: c:\iDKDoJa5.1\plugin/org.netbeans.modules.iappli.nbm
選択すると「コミュニティ貢献プラグイン」として表示されます。

インストールをクリックしてインストールします。ここで「妥当性検査の警告」ダイアログが表示されます。プラグインの作成時に署名が埋め込まれていない場合にこの警告が表示されます。ダウンロード元およびプラグインの動作などが明確な今回の場合には全く問題ありませんので、そのまま「継続」をクリックしプラグインのインストールを完了させます。インストール済み」タブを選択すると DoJa-5.1 が表示されるはずです。

プロジェクトの作成

インストール後は「新規プロジェクト」ウィザードに「DoJa」カテゴリと「DoJa-5.1 プロジェクト」が追加されるので、それを選択することで DoJa 向けのプロジェクトを作成することができます。

クラスの作成

実際に実行させてみるにはクラスを一つ作成する必要があります。手っ取り早いのは作成ツールが生成してくれるスケルトンコードを、NetBeans で作成したクラスにペーストする方法です。とりあえず動かしたかったので添付のようなクラスを mypacakge というパッケージに作りました。サンプルクラスファイル

Jam ファイルの編集

Jam ファイルにクラス名とアプリケーション名を記述します。「ファイル」タブを選択し bin/DoJaProject1.jam を開きます。ここでの DoJaProject1 というのは私の作成したプロジェクト名ですので、実際の Jam ファイル名はこれとは異なります。この Jam ファイルを開きアプリケーション名は自由に定義します。AppClass には最初に起動するクラスを記述します

  AppName = DoJaProject1
  AppClass = mypackage.MyClass

プロパティファイルの変更

あとは実行なのですが、プロパティファイルの変更を行わないと実行することができません。「ファイル」タブを選択し nbproject/doja.properties を開き doja.ant.classpath を以下のように変更します

元々は以下の定義が一行で記述されています (説明用に "\" を付けて改行を挿入しました)

doja.ant.classpath=${user.home}/.netbeans/4.1/modules/org.netbeans.modules.iappli.jar:\
${user.home}/.netbeans/5.0/modules/org.netbeans.modules.iappli.jar:\
${user.home}/.jstudio/Ent8/modules/org.netbeans.modules.iappli.jar:\
${user.home}/.jstudio/Ent81/modules/org.netbeans.modules.iappli.jar

これを以下のようにプラグインのインストールディレクトリを指定するようにします。

doja.ant.classpath=${user.home}/.netbeans/6.0/modules/org.netbeans.modules.iappli.jar

実行

IDE から実行させると、作成ツールに含まれるエミュレーターが起動しアプリケーションが実行されます。

 
Posted by keiichio ( 2月 18日 2008年, 04:36:19 午後 JST ) Permalink 投稿されたコメント [0]

20080208 2008年 2月 08日 金曜日

NetBeans 6.0.1 リリース

NetBeans 6.0.1 がリリースされました。
http://ja.netbeans.org/downloads/index.html

最後の最後にダウンロードサーバーにトラブルが発生するという、経験したことのない自体にみまわれましたが、無事リリースできました。いやはやドキドキしました。

引き続きドキュメントの日本語版を順次公開していくという作業が続きます。今現在揃っているものについては http://ja.netbeans.org に一覧を作ったのですが、まだ概要ページしか準備できていません。今のころ、2 月末、3 月初旬、3 月半ば、の 3 回のタイミングで日本語ドキュメントを公開していく予定です。

今回のリリースでは http://ja.netbeans.org のメーリングリスト から、たくさんのコメントをよせていただくことができました。日本語 UI に反映できたもの、6.0.1 で修正が行われたもの、6.1 で修正となったものなど色々あります:

次のリリースでもリリース前に様々なコメントがもらえて、今回以上に製品に実際に反映することができればと思っています。

 
Posted by keiichio ( 2月 08日 2008年, 02:47:39 午後 JST ) Permalink 投稿されたコメント [1]

20071023 2007年 10月 23日 火曜日

NetBeans 6.0 Beta 2 リリース

NetBeans 6.0 の Beta 2 が昨晩リリースされました。 日本語サイト のトップページを更新したところです。リリース情報のページ も更新されています。 ダウンロードはこちらから
http://download.netbeans.org/netbeans/6.0/beta2/

リリーススケジュール上では、次のターゲットは 11 月 3 日のコードフリーズで、その次は 11 月 12 日の RC1 リリースです。

 
Posted by keiichio ( 10月 23日 2007年, 01:38:11 午後 JST ) Permalink 投稿されたコメント [0]

20071016 2007年 10月 16日 火曜日

Java HTML Parser 2.0 に関するつづき。使った部分の Java コードを抜粋。

前回お話しした HTML Parser 2.0 についてもう少し

<head> タグ内でいくつかのタグの操作をするのですが、一番行いたかった処理は charset 属性の追加です。

  <meta http-equiv="content-type" content="text/html; charset=UTF-8">

というタグを追加することが目的でした。すでに既存の charset 属性がある場合には、それを "UTF-8" で上書きする必要がありました。以下は <meta> タグを追加する部分です charset 属性は String クラスのインスタンス charset を使用しています。

        // charset 属性を持った <meta> タグを作成
        tn = new TagNode();
        tn.setTagName("meta");
        tn.setAttribute("http-equiv", "\"content-type\"");
        tn.setAttribute("content", "text/html; charset=" + charset);

        // <head> タグ内の既存のすべての子ノードを取得
        nl = head.getChildren();

        // <head> タグが空 (すなわち  <head></head>) の場合、
        // 改行コード一つ持ったテキストノードを足す
        if (nl == null) {
            nl = new NodeList();
            nl.add(new TextNode("\n"));
        }

        // 新しく作った <meta> タグを先頭に挿入
        nl.prepend(tn);
        nl.prepend(new TextNode("\n")); // insert newline after <head>

タグを追加しているところだけを抽出すると、別段どうということもない処理です TagNode() クラスを生成して属性をセットした後に、あらかじめ準備しておいた <head> ノードのツリーに挿入しています。ノードツリーは Node クラスの getChildren() メソッドによって NodeList クラスとして取得できます。このノードリストクラスに add() メソッドや remove() メソッドがあり、ここでは prepend() メソッドを使っています。このメソッドは引数として渡した TagNode クラスを先頭に挿入してくれます。

<head> や <body> ノード準備は、私の作ったクラスのコンストラクタ内で行っています。この部分は Parser クラスの elements() メソッドで説明されているサンプルコードを下敷きにしました。基本的な作りは全くそのまま使いました。リンクのサンプルコードでは URL を Parser クラスの引数として与えていますが、これをファイルパスにすれば手元のファイルを開いてパースするコードになります。

いくつか気づいた点

1. MetaTag クラスが用意されていたが使わなかった

一番最初のコードの部分では TagNode クラスを作って、そのタグ名を "meta" に指定しています。MetaTag クラスが準備されているので new MetaTag() とすれば良さそうだったのですが <METAHTTP-EQUIV...> という具合にタグ名の後に属性名が空白無しで続いてしまったので使うのをやめました。使い方が悪かったのか HTML Parser 2.0 のバグなのか調べてないです。

2. テキストノードの isWhiteSpace() メソッドが使えるかと思ったけど、期待した動作とは違った

charset の挿入処理とは別の部分で、テキストノードが空白文字のみで構成されているかどうかを知る必要があり TextNodeisWhiteSpace() というメソッドを見つけて「これは好都合」と思ったのですが、期待通り動きませんでした。「空白文字のみなら true」だと思っていたら、「空白文字を含んでいたら true」と動くように見えました (それってほとんどすべてのテキストノードで true じゃないのか?)。これでは使えないので java.util.regex.Pattern を使いました。

    private Pattern whiteSpaces;
...
    whiteSpaces = Pattern.compile("^\\s+$");
...
    // 空白文字のみの場合は if 文の中に入らない
    // tn は TextNode クラスのインスタンス
    // TextNode クラスの getText() メソッドでテキストが取得できます
    if (!whiteSpaces.matcher(tn.getText()).matches()) {
    ...
    }
...

3. <html>、<body>、<head> タグを追加したときは setStartPosition("0") を実行する必要があった

今回の処理では、入力ファイルが <head> タグや <body> タグを持たないものがあったので、必要に応じてそれらを追加しましたが普通に追加しても追加したノードが最終結果 (私の場合は標準出力) に出てきませんでした。以下の部分は <head> タグを新たに作って <html> タグの子ノードとして追加しています。あたらに作った <head> タグには、一つの改行コードだけを持ったテキストノードを追加しています ( <head></head> というように一行になってしまうのがイヤだったので)。

        /**
         * Create <head> if it does not exist, and add <head> node into
         * the <html> node.
         */
        if (head == null) {
            // まずは空っぽの <head> ノードを作る
            HeadTag ht = new HeadTag();
            ht.setTagName("head");

            // 一つの改行コードだけを持ったテキストノードを作る
            nl = new NodeList();
            nl.add(new TextNode("\n")); // add newline after 
            tn = new TagNode(); // add  tag
            tn.setTagName("/head");
            nl.add(tn);

            // 作ったテキストノードを <head> の子ノードとする
            ht.setChildren(nl);

            // <html> ノードに作った <head> ノードを追加
            nl = html.getChildren();
            nl.prepend(head = (Node) ht);
            nl.prepend(new TextNode("\n")); // add newline after >html>

            // この行がイマイチわかっていない
            head.setStartPosition(0);
        }

最後の setStartPosition(0); という部分が、じつはよくわかっていないまま挿入してあります。こうすると最終結果に追加したノードが現れるのですが、この行がないと現れません。デバッグすると "0" としてここで設定している値は、"0" を設定しない限り "-1" になっています。

先のエントリでお話ししたとおり、この HTML パーサーはテキストの書式をすべて保持してパースしてくれるので、上記のコードを用いて charset 属性を持った meta タグを追加しても、他の部分の書式は (行頭の空白も含めて) まったく変更されません。これを実現するためなのか、各ノードにはテキストの開始位置が格納されています。あらたにノードを作ったら、その開始位置を "0" に指定しないと現れないようです。でもこれは <html> タグ、<head> タグ、<body> タグの場合だけで、<meta> タグを足した時には必要ありませんでした ... いまだ理解が足りないようです。

参考

 
Posted by keiichio ( 10月 16日 2007年, 12:18:19 午後 JST ) Permalink 投稿されたコメント [1]

20071012 2007年 10月 12日 金曜日

Java HTML Parser 2.0 を使ったプロジェクトと NetBeans

最近、HTML ファイルを少しだけ加工するためのプログラムを作る必要があり、HTML Parser 2.0 を使って、<head> 内の meta タグをしらべて必要に応じて挿入する処理を書きました。この HTML Parser を選んだのは、

というのも確かに大きな理由なのですが、使い方がイマイチ把握できずに他のパーサーに切り替えようかと悩んだりしても結局使い続けたのは、

という理由が大きいです。処理されたファイルを元のファイルと比較して、予期せぬ変更が一切無いことの確認を比較的簡単に行うことができました。

書式が大幅に変わっても構文エラーが無ければ確かにそれで良いのですが、元のファイルの書式が様々で、head タグの無いものや、極端な場合は html タグが無い単なるテキストに対して元のテキストを html タグと body タグで囲んだ上で、head タグを追加して meta タグを挿入する必要があるものもあったので、実際にファイルを変換させた後に全部のファイルについて返還後にファイルがどう変わったのか元ファイルと比較したいと思っていました。比較が簡単にできることが大事だったので、もとの書式を維持してくれたのは非常にありがたかったです。diff コマンドで比較してなんとかなりました。

NetBeans のウィザードでプロジェクトを作って、ライブラリマネージャーに HTML Parser 2.0 のコンパイル済み jar ファイルと、ソースファイルの zip、javadoc のディレクトリを追加して作業をしました。javadoc を登録しておいたのでコード補完の時にドキュメントの内容が表示されて楽チンだったのですが、プロジェクトディレクトリを tar でまとめて別の場所で開いたときにライブラリが参照ができなくなりました。参照を解決するのは簡単なのですが、開くたびにライブラリ参照を解決する必要があるのもあまり良くないですし、最終的には Subversion なり CVS を介して他のメンバーとファイルを共有するので、このままではうまくありません。

ライブラリ参照の情報を最初にプロジェクトを作った環境に依存しない形で保持したいのですが、今のところ良い方法が思いつかず、Ant スクリプトを作った上で NetBeans から「既存の Ant スクリプトを使用する Java プロジェクト」として開くように変更しているところです。

 
Posted by keiichio ( 10月 12日 2007年, 06:21:34 午後 JST ) Permalink 投稿されたコメント [0]

20071004 2007年 10月 04日 木曜日

GDB を使用する時の GUI デバッガとして、NetBeans C/C++ Pack

NetBeans 5.5.1 の時点から日本語版が提供されている C/C++ Pack ですが、5.5.1 では NetBeans に追加する形式のインストーラーだったのが、6.0 では C/C++ 機能のみを持った IDE がインストールされる C/C++ Pack として提供されています。6.0 Beta 1 または開発ビルドに片貝さんが提供してくださった 5.5.1 の日本語ファイルを追加すれば、ほとんどの部分が日本語表示されます。

C/C++ Pack を使用するには、マシンにあらかじめ gcc、GDB がインストールされている必要があります。gcc でコンパイルし、GDB でデバッグする作業を IDE から行うことができるのが NetBeans C/C++ Pack です。この C/C++ Pack を GUI デバッガとして使うのは悪くないと思います。例えば、

ソースの編集は emacs や vi 。make を実行したらデバッグするときは NetBeans C/C++ Pack

という使用方法です。IDE の GUI 上でステップ実行させたり、あるいはブレークポイントの設定やローカル変数の内容を参照ができます。

プログラミングを長いこと行っている方々は、きっとよく使うエディタは決まっているのではないかと思います。仕事がらプログラミングはさっぱり行わない私ですが、それでも時々読んだり書いたりすることがあり、その際には vi を使います。Java の場合には NetBeans のエディタが 6.0 で従来に増して高機能になったので、vi ではなくて NetBeans のエディタを使ってますが、C のソースを見たり書いたりするときは、やっぱり vi に戻ってしまいます ... 。でも、デバッグは IDE が断然便利だと思います (好みの問題ではありますが)。Solaris 上で動くプログラムを作ることが殆どですので、Sun Studio を GUI デバッガとして使い、編集は vi でというのが私のパターンですが、コンパイラとして日々 gcc を使い、GDB を使ってデバッガしている方々からみて、エディタは今現在使用しているものをそのまま使って、デバッグは NetBeans C/C++ Pack 上で...。というのはどうなんでしょう? emacs で全部できるからいらない、あるいは単体の GDB で十分。となるのでしょうか。もしかして Eclipse CDT? Eclipse CDT はデバッガはどうなってるんだろう...

GDB を使ったデバッグを GUI 上で行うツールとして NetBeans C/C++ Pack を試してみるのも悪くないのではないかと思い、こんなことを書いてみました。とは言え、まずは言っている本人がもっと使わないと ... Solaris でも Linux でも GDB でなくて dbx ばかり使っているので、dbx を使うなら Sun Studio だし ... いやいや、なるべく使うようにします。

Posted by keiichio ( 10月 04日 2007年, 07:17:20 午後 JST ) Permalink 投稿されたコメント [0]

Calendar

RSS Feeds

最近の 10 Entries

Links

Navigation

Search