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”);

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

ウィンドウが非アクティブの時にタスクバーで点滅させる

.NET Framework のクラスライブラリではタスクバーでの明滅が提供されていない(Form.Activate() は非アクティブの時呼ぶとウィンドウが再前面になる)ため、Win32API の FlashWindow() を利用します。

using System.Windows.Forms;
using System.Runtime.InteropServices;
 
public class Form1 : Form {
    // 点滅用 Win32API のインポート
    [DllImport(“user32.dll”)]
    private static extern bool FlashWindow(IntPtr hwnd, bool bInvert);
    public static void FlashWindow(System.Windows.Forms.Form window) {
        FlashWindow(window.Handle, false);
    }
     
    // ウィンドウを点滅させる
    // (ウィンドウがアクティブな時は何もおこらない)
    private void ExecExample(){
        FlashWindow(this);
    }
}

 
参考:
FlashWindow(user32)(pinvoke.net)
Win32 APIやDLL関数を呼び出すには?(@IT)

makexmldocomomap の出力を PEAR の Net_UserAgent_Mobile で使えるようにするパッチ

単純に makexmldocomomap を実行すると <terminal … modeil=”SH902I” … > のように出力されたのですが、PEAR では <SH902I … >という形式を期待していて、そのまま DoCoMoMap.xml に適用すると動作しなくなったため次のように書き換えました。(Net_UserAgent_Mobile 0.27.0 で確認 cpan のほうは失念)
 
$ diff /usr/local/bin/makexmldocomomap{.bak,}

 21,22c21,22
 < push @{$map{terminal}}, {
 < model => uc($model),
 —
 > push @{$map{uc($model)}}, {
 > width => $width,

また、出力時にiモード HTML シミュレータの情報が書かれていないため、エミュレータでも利用するためには

  <ISIM0301 color=”1″ depth=”262144″ height=”320″ width=”240″ />
  <ISIM70 color=”1″ depth=”4096″ height=”182″ width=”163″ />

としてエミュレータの端末情報を指定する必要があります。
 
メモ:
SO902iWP+ 端末が

<SO902IWP+ color=”1″ depth=”262144″ height=”256″ width=”240″ />

となり、XML 的にエラーで次要素以降が読まれなくなるのは何か対処法あるんでしょうか。。
# 現在一番下に移すことで回避中。もちろんこれでは SO902i WP+ 自体は対応されないでしょうね(いろいろ未確認)。

関数, メソッドを動的に実行する

C の関数ポインタや、Java のリフレクションのように任意の関数、メソッドを呼び出すには次のようにします。

<?php
function greet(){ echo “Hello world!”;}
 
// 変数に () を付ける記法(関数のみ可)
echo “0: “;
$func=”greet”;
$func();
 
// call_user_func() を使った関数よびだし
echo “\n1: “;
$func=”greet”;
call_user_func($func);
 
// call_user_func() を使った静的メソッドよびだし
echo “\n2: “;
class Foo{
   function doit(){
      echo “static method called”;
   }
}
$method=array(“Foo”, “doit”);
call_user_func($method);
 
// call_user_func() を使った非静的メソッドよびだし
echo “\n3: “;
class Foo2{
  var $name;
  function Foo2($name){
    $this->name = $name;
  }
  function doit(){
    echo “non static method called (“.$this->name.”)”;
  }
}
$o=new Foo2(“abc”);
$method=array($o, “doit”);
call_user_func($method);
 
echo “\n”;
?>

上のコードを実行すると結果は次のようになります。

0: Hello world!
1: Hello world!
2: static method called
3: non static method called (abc)

参考:
call_user_func()