↓の話でした。
http://civic.xrea.jp/2006/10/12/jquery-ie/
今回はSAStruts使ってるプロダクトだったので、AJAXで呼んでる先の処理でこんな感じにContent-typeのencodingを書き換えました。
@Execute(validator = false) public String hoge() { try { RequestUtil.getRequest().setCharacterEncoding("shift_jis"); ResponseUtil.write("OK"); } catch (Exception e) { e.printStackTrace(); ResponseUtil.write("NG"); } return null; }
auの京セラ端末(他にもあるかもしれませんが)だと以下のようなformでis_checkedの値が受け取れなくてトラブりました。
<form name="example_form" method="post" action="/example/hoge/"> <textarea name="body" rows="3" cols="20"></textarea><br/> <input name="is_checked" type="checkbox" />京セラ端末<br/> <input type="submit" value="じっこー" /> </form>
is_chechedの値が"foo"だったらチェックされてる、みたいな判定をサーバサイドでやる感じで対応しました。
<input name="is_checked" type="checkbox" value="foo" />京セラ端末<br/>
JavaのSocket周りでは割とよくある感じですが、以下のコードだとconnectもreadもデフォルトで無限に待ち続ける挙動をします。
BufferedImage image = ImageIO.read(new URL(url).openStream());
Javadocをみると以下の通り。
Opens a connection to this URL and returns an InputStream for reading from that connection. This method is a shorthand for:
openConnection().getInputStream()
実際、jdk1.6u18のソースを見るとopenConnection()してすぐにgetInputStream()しています。
public final InputStream openStream() throws java.io.IOException { return openConnection().getInputStream(); }
以下は適切にtimeoutさせる実装例です。URL#openStream()を使うのはやめてopenConnection()で取得したURLConnectionオブジェクトのsetterでタイムアウト値を設定します。
URLConnection conn = new URL(url).openConnection(); conn.setReadTimeout(1000); conn.setConnectTimeout(1000); conn.connect(); BufferedImage image = ImageIO.read(conn.getInputStream());
connect、readともに1000ミリ秒でSocketTimeoutExceptionを投げるようになります。
svn: Repository UUID 'XXXXXXXXXXXXXXXXXXXXXX' doesn't match expected UUID 'YYYYYYYYYYYYYYYYYYYYY'
1.5系のsubversion clientで発生するようですが、以下のような状態になってしまうと基本的には「chekoutし直すしかない」という事のようです。
とはいえ、毎度毎度そんなのもやっていられないので、試しに.svn/entriesに'XXXXXXXXXXXXXXXXXXXXXX'が記録されているのを思い切って行ごと削除→svn updateとかしてみると手元では事象の解消を確認できました(1度だけですが)。
1.4系のclientでは無視している項目のようなので問題なさそうですが、あくまで体験談レベルということで。。
StringBuilderがStringBufferよりどれほど高速か、実際に少しパフォーマンス比較をしてみました。
useStringBuffer : 141 milsec. useStringBuilder : 125 milsec. useStringBuffer : 156 milsec. useStringBuilder : 125 milsec. useStringBuffer : 141 milsec. useStringBuilder : 109 milsec. useStringBuffer : 157 milsec. useStringBuilder : 109 milsec. useStringBuffer : 156 milsec. useStringBuilder : 110 milsec. useStringBuffer : 140 milsec. useStringBuilder : 125 milsec. useStringBuffer : 141 milsec. useStringBuilder : 109 milsec. useStringBuffer : 141 milsec. useStringBuilder : 109 milsec. useStringBuffer : 141 milsec. useStringBuilder : 110 milsec. useStringBuffer : 140 milsec. useStringBuilder : 110 milsec.
確かに速いです。が、原理主義者になるほどの差でもないので、リファクタリング時に見つけたら類似見直し、というくらいがちょうどいいかもしれません。
テストコードは以下です。
package example; import jp.sourceforge.javacpt.ComparativePerformanceTest; import jp.sourceforge.javacpt.ComparativePerformanceTestHelper; public class SBPerformanceTest { public static void main(String[] args) throws Exception { ComparativePerformanceTest test = ComparativePerformanceTestHelper.initialize( 1000, SBPerformanceTest.class); ComparativePerformanceTestHelper.invoke(test, "useStringBuffer"); ComparativePerformanceTestHelper.invoke(test, "useStringBuilder"); } public static String useStringBuffer() { StringBuffer sb = new StringBuffer(); for (int i = 0; i < 1000; i++) { sb.append("hoge"); } return sb.toString(); } public static String useStringBuilder() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000; i++) { sb.append("hoge"); } return sb.toString(); } }
例のごとく、以下のツールを使いました。