ブラウザでページを操作

– ブラウザのアドレスバーを使った遊び。日本語テキストたっぷりなページでを開いた後、次のコードをアドレスバーにいれて実行すると文章を書き換える。

javascript:varelm=document.getElementsByTagName(“body”)[0];elm.innerHTML=elm.innerHTML.replace(newRegExp(“。”,”g”),”にゃ。”);

堅苦しい言葉がトロ語に。replace 使うと Firefox だと化けるなぁ.. split(“from”).join(“to”); としたほうがいいかも。

document.getElementsByTagName(“body”)[0].innerHTML;

これがキモ。DOM メソッドを使って Body タグの全文章を取得/操作する。

追記[2005-06-22]:

document.getElementsByTagName(“body”)[0]

は、

document.body

でも参照可能らしい。某所にあったコードのほうが汎用的で簡素みたい。

JavaScript:document.body.innerHTML=document.body.innerHTML.split(‘。’).join(‘にゃ。’);focus();

focus() しないと、実行後が別ページ扱いになって相対パスの外部ファイル(画像, js, css)の読み込みに失敗して見ためが崩れるみたい。

ファイルアップロード "multipart/form-data" 処理のときに正しくパラメータを受け取るには

– form タグで ENCTYPE=”multipart/form-data” にすると ServletRequest.getParameter(Sting) 系ではパラメータを解釈できず全く値が渡って来なくなるため、Jakarta Commons FileUpload の org.apache.commons.fileupload.DiskFileUpload.parseRequest(…) 等を使うとよい。

// 適当に書いたコードなのでエラーあるかも。
DiskFileUpload o = new DiskFileUpload();
o.setSizeMax(-1);
o.setSizeThreshold(1024);
o.setRepositoryPath(“/tmp”);
o.setHeaderEncoding(“Windows-31J”);
List list = o.parseRequest(request); // FileItem のリスト
for(Iterator it = list.iterator(); it.hasNext();){
    FileItem param = (FileItem)it.next();
    if(!param.isFormField())
        continue();
    out.println(param.getFieldName() + “: ” + param.getString());
}

<http://www.jajakarta.org/commons/fileupload-1.0/ja/withoutPrimary/org/apache/commons/fileupload/DiskFileUpload.html#parseRequest(javax.servlet.http.HttpServletRequest,%20int,%20long,%20java.lang.String)>
– jajakarta.org: FileUpload API 1.0 (Ja)
<http://jakarta.apache.org/commons/fileupload/apidocs/org/apache/commons/fileupload/DiskFileUpload.html>
– Jakarta 公式: FileUpload API (current ver.)

Segmentation Fault が起こるプログラム外部要因

– ulimit -s で得られる、スタックの限界サイズを超えた場合、最初の代入を行った時点で Segumentation Fault (core dumped) になる。
例えば、

$ ulimit -s
65536

の時、次のようなコードで発生する。

/* オプティマイズされると処理がなくなるため、
 * gcc -O0 を付けてコンパイルすること。
 */
int main(int argc, char* argv[]){
    char ac[64 * 1024 * 1024];
    ac[0] = ‘\0’; // ここで発生
    return 0;
}

対策は、

ulimit -s [limit]

で十分なスタックサイズを確保することを許可すればよい。

ResultSet を Map に変換するには

ResultSet を Map に変換する方法として、Apache Commons の DbUtils に次のような便利なメソッドがあります。

org.apache.commons.dbutils.BasicRowProcessor#toMap(ResultSet) throws SQLException

ResultSet の行を Map へ変換します。 この実装では、大小文字を区別しないカラム名をキーとしたMapを返します。 例えば、map.get(“COL”) の呼び出しと
map.get(“col”) の呼び出しでは、 同一の値が返されるようになります。

Commons DbUtils: JDBC Utility Component
BasicRowProcessor javadoc

または、自前実装でこのような方法もあります。

public List resultSetToArrayList(ResultSet rs) throws SQLException{
  ResultSetMetaData md = rs.getMetaData();
  int columns = md.getColumnCount();
  ArrayList list = new ArrayList(50);
  while (rs.next()){
     HashMap row = new HashMap(columns);
     for(int i=1; i&lt;=columns; ++i){<br />
      row.put(md.getColumnName(i),rs.getObject(i));
     }
      list.add(row);
  }

return list;
}

参考: http://stackoverflow.com/questions/7507121/efficient-way-to-handle-resultset-in-java

ServletRequest インスタンスからリクエストされたパラメータのコレクションを抽出する

– サーブレットや JSP からクラスを抽出している際に、パラメータを使っているものを分離しようとして、 POJO に ServletRequest を渡すのはどうかなと思っていたところ、ちゃんとメソッドが提供されていた。
<http://java.sun.com/j2ee/sdk_1.3/ja/techdocs/api/javax/servlet/ServletRequest.html#getParameterMap()>
– ServletRequest#getParameterMap()

戻り値:
キーとしてパラメータ名、マップ値としてパラメータ値が格納された不変の java.util.Map。パラメータマップ内のキーは String 型。パラメータマップ内の値は String の配列型

たとえば次のコードが書かれたページ(test)にリクエストを送るとする:

// Arrays.toString(String[]) を利用しているため JDK5.0 以上でしか動かない。
out.println(“<table>”);
for(Iterator it = request.getParameterMap().entrySet().iterator(); it.hasNext();){
        Map.Entry entry = (Map.Entry) it.next();
        out.println(“<tr><td>”+entry.getKey()+”</td><td>”+Arrays.toString((String[])entry.getValue())+”</td></tr>”);
}
out.println(“</table>”);

結果は次の通り:

test?a=foo:
   a [foo]
test?a&b=boo&b=woo
   a []
   b [boo, woo]

UPDATE で同じ条件の任意数のレコードだけ更新したい

– ORDER BY と LIMIT を使えばよい。UPDATE にもあるとは知らなかった..迂闊。
<http://dev.mysql.com/doc/mysql/ja/update.html>
– MySQL リファレンスマニュアル :: 6.4.4 UPDATE 構文

 UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
    SET col_name1=expr1 [, col_name2=expr2 …]
    [WHERE where_definition]
    [ORDER BY …]
    [LIMIT row_count]

最初こういうことをやって、同じテーブルに対して更新と参照を同時にやるなと怒られた。

UPDATE footable SET name = ‘foo’ WHERE id = (SELECT id FROM footable
  WHERE gender = 1)

PreparedStatement, ResultSet で汎用性のある引数を与えたい

– クエリ処理用のメソッドなんかを作ってると、setXxx(), getXxx() を指定するのに任意型をとりたい時がある。
最初は setString(1, o.toString()), getString(1) で全て済ませようとしていたが、実装してみると OO らしからぬ処理になって微妙だったので調べてみたところ、ちゃんといい方法があった。
<http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/sql/PreparedStatement.html#setObject(int,%20java.lang.Object)>
– PreparedStatement.setObject(int, Object)
<http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/sql/ResultSet.html#getObject(int)>
– ResultSet.getObject(int)
– 以前から使い道を疑問に思っていたが、SQL 型に変換可能(かつ変換が曖昧でない)な型ならなんでも使えるとのこと。これは汎用化には便利。

C# ことはじめ

– C# が気になる今日この頃。Java やる前 … .NET 1.0 登場あたりに C# で遊んでた時期があったのだけど、OOP がほとんどできていなかったのと、当時は人気がなく情報がえらく少なかったので C++ やってた。.NET Framework なんていれてないユーザが大半だったしなぁ。また C# が気になり出しているのは、Mono が実用できそうになってきた事と M.Fowler がたびたび話題に出しているため。言語的には delegate が構文として用意されている点、プロパティの set/get 周りが簡単なのがいいかなと。Java はまだまだ捨てられませんが。
– C# が Java より優れている点は、Windows GUI では Java より、簡単にネイティブに近い動作をしてくれ(そうな気がす)る事。言語仕様のスマートさ。
– Java が C# より優れている点は、圧倒的な情報/技術リソースの量。AOP のプリプロセッサが開発されていること。開発環境の性能と価格の比率。SharpDevelop は優秀だが Eclipse に若干劣るし、VS.NET は市販なので。サーバサイドでもまだコストと実績で J2EE に分があるかな。
と、現状の個人的解釈でした。