RSS4J がうるさいのでパッチを当てました

RSS フィードを読むのに RSS4J(要 Xerces) を採用したのですが、なぜか

RssParser.parseRss( … );

を呼び出す都度、

date: 2006-11-24T14:09:40+09:00

のように、RSS feed 中の日付を出力するようになっていました。
煩いし、これはちょっと都合が悪いなので調べてみると…

$ grep -rn System.out.print rss4j
rss4j/src/churchillobjects/rss4j/model/DateLanguageUtil.java:202: System.out.println(“\n\n date: “+date);

と、churchillobjects.rss4j.model.DateLanguageUtil で System.out.println していたので、この行をコメントアウトし、このクラスだけ再コンパイルして対応しました。一応変更適用済のバイナリを置いておきますので、よろしければどうぞ。
 
rss4j092p.zip
 
参考:
Greenery – RSS4j v0.92-JAVA/RSS4j-Wiki
RSS4J, Feed Parser, Informa = Java の RSS ライブラリ(Goodpic)
@IT:Java TIPS — サーブレットでRSSフィールドを配信する

HTTP 接続の定石

よく忘れるので簡易コードメモ。
もちろんこのままでは動作しません。

final java.net.URL url = new java.net.URL(String sUrl); // 接続先指定(HTTPS, HTTP いずれも可)
final java.net.HttpURLConnection con = (java.net.HttpUrlConnection) url.openConnection(); // 接続開始
 
/* 必要であればここで con に対して接続設定(ex. User-Agent, キャッシュなど) */
 
// 以下(リクエスト送信と)結果取得
final int code = con.getResponseCode(); // 結果コード取得
if( code < 200 && 300 <= code){
    return; // HTTP レスポンスコードが 2XX 以外なら続行不可
}
 
// ページデータ取得(ヘッダ除く)
final BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(), “JISAutoDetect”);
 
String line;
while(null != (line = reader.readLine())){
    System.out.println(line);
}

 
参考:
java.net.HttpURLConnection
HTTP Status Code

文字エンコードを自動判別する

文字コードが不明な文字列を自動判別して変換するには、 JISAutoDetect を文字コードとして指定します。

// InputStreamReader の例
final BufferedReader reader =
        new BufferedReader(new InputStreamReader(in, “JISAutoDetect”)); // コンストラクタの第二引数で文字コードとして JISAutoDetect を指定
while(null != (line = reader.readLine())){
    System.out.println(line);
}

// String の例
final String src = “あいうえお”; // 任意の文字コードの文字列
final String str = new String(src.getBytes(), “JISAutoDetect”); // 文字コード自動変換
System.out.println(“str”);

 
JavaFAQS146-Q07 の前後あたりが参考になると思います。

Eclipse 3.1 から 3.2 にアップグレード

いまさらですが、リリースに気づいたので開発環境を Eclipse3.2 にアップグレードしました。
手順は次の通り。
 
Eclipse 公式サイトのダウンロードページから Eclipse SDK 3.2 をダウンロード(Windows版直リンク)
 
言語パックダウンロードページから NLPack1-eclipse-SDK をダウンロード(Windows版直リンク)。
 
– SDK を展開(eclipse フォルダができます)。
– NLPack1 を展開して SDK の展開先に上書き。
展開した eclipse フォルダを、既存の Eclipse 3.1 に上書き ←とするとだめでした。
– ワークベンチを既存のものに指定して、プラグインも導入。
  updateサイトについては、新規フィーチャーの検索とインストール→サイトのインポートから、3.1 の eclipse/configuration/org.eclipse.update/bookmarks.xml をインポートすることで簡単に移行できます。

J2EE でどのフレームワークを使うか。またデザインとの分離について

F’s Garage:日記
なかなか難しいなと常々思っているので、こういうの読むと安心。個人的には,突っ込みしてる方と同じで JSP + EL + Beans が多めです。loop についてはカスタムタグか、そのまま埋め込みかどちらか。これを読んで、カスタムタグも Java コードも使わない Plain Old HTML Pages で書けるのが一番デザインの分離ができそうな気がしてます。
 
参考:
Nirvana Wiki

C# で Java と同等のアクセス制限をかける

Java プログラマが C# を学ぶ際のメモその2。
 
– Java
public: どこからでもアクセス可
protected: 自クラス内と子孫クラス、または同一パッケージ内であればアクセス可(default 権限も兼用)。
default: 同一パッケージ内からのみアクセス可。アクセス修飾子を省略した場合のデフォルト。
private: 自クラス内からのみアクセス可。
 
– C#
public: どこからでもアクセス可(入れ子 enum,interface のデフォルト)。
protected internal: 同一アセンブリ(DLL ファイル, EXE ファイル等)内と子孫からアクセス可。
internal: 同一アセンブリ内からのみアクセス可(名前空間直下で宣言したコンテナのデフォルト)。
protected: 自コンテナ(クラス等)内と子孫からのみアクセス可。(Java と違い同一名前空間は不可)
private: 自コンテナのみからアクセス可(入れ子 class, struct のデフォルト)。
 
注意すべきは、protected の動作の違いと、default(Java) と internal(C#) の制限範囲の違いです。
Java では、パッケージレベルでの制限が可能ですが、言語で制限をかけただけだと外部ファイルからのパッケージへの侵入が可能です。
これを防ぐには JAR を作る時にシーリング機構を利用すれば、そのパッケージの利用者の侵入を制限することができます。
マニフェストの不正な書き換えを防ぐにはJARへの署名機能等を使えばよさそうです。
 
C# では、アセンブリ(プログラム, ライブラリ)単位でのアクセス制限が可能で、名前空間単位では制限できません。アクセス制限がソースファイル単位ではないことに注意してください。
参考:
C# プログラマーズリファレンス – アクセシビリティレベル
JARマニフェストのメイン属性
JavaHouse Brewers 19189 – Package Joining Attack(JDK1.2 での話)

Java で簡単に使える SMTP サーバパッケージ

Dumbster
Java 用のメール受信ができるパッケージ。
– メール送信処理の単体テストに使える。

SimpleSmtpServer server = SimpleSmtpServer.start(); // ローカルポート25 を Listen
// テストする処理: localhost 宛のメール送信処理
server.stop();
 
// 受信メール数
assertEquals(1, server.getReceivedEmailSize());
// 一通目のメールを取得する。
SmtpMessage email = server.getReceivedEmail().next();
// タイトル
assertEquals(“Test Subject”, email.getHeaderValue(“Subject”));
// 本文
assertEquals(“Test Body”, email.getBody());

Java な shell を使ってみる

OOo 2.0 で知った Java 言語シェルの BeanShell を使ってみた。

bsh% import java.util.*;
bsh% System.out.println(new Date() + “: Hello World!!”);
bsh% exit();

とか。
ちょっとしたコード書くときに面白いので

$ vi /usr/local/bin/bsh
#!/bin/sh
java -cp /usr/local/bsh/bsh-2.0b4.jar bsh.Interpreter
:wq
$ chmod 0755 /usr/local/bin/bsh

みたいにしておいた。
参考:
BeanShell(公式)
BeanShell ご紹介 – オブジェクトと遊ぶ(豆蔵)

よくある描画処理l。中心に描画する時の Tips

絵を中心に表示させたい時など、

int x = (nWidth – img.getWidth() ) / 2;

みたいなことをよくするが、人のコードを見ていて

int x = nWidth – img.getWidth() >> 1;

とかやってて、ビットシフトいいかもと思いました。優先順位が + – より低いのがミソ。使うかどうかは好み次第。