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 に分があるかな。
と、現状の個人的解釈でした。