Java

不思議なfizzbuzz

社内チャットにて > @here 面白いfizz buzz実装がありました。 https://gist.github.com/kazuho/3300555 > Javaではできなさそうなfizz buzzですね^^ > ですねぇ~(^ω^) https://gist.github.com/kazuho/3300555 innerクラスとか匿名クラス駆使すれば…

S2JDBCでJNDI経由でDataSourceを取得すると止まってしまう

久々にSAStrutsネタ、というかS2JTA、S2JDBCネタか? Tomcat 5.5.23 SAStruts 1.0.4 sp8 MySQL 5.1.38 な環境。Tomcatがかなり古いのは気にしない。発端はJDBCの設定をS2のダイコンではなく、Tomactのコンテキスト記述子に書こうとした事。こちらのエントリ…

JettyとiPhoneでWebSocketを試す

iOS 4.2のSafariがWebSocketに対応したらしい。以前JettyとGoogle ChromeでWebSocketを試すために書いたプログラムを使って、iPhoneのWebSocketを試したみた。WebSocketのプロトコルに変更があったようで、以前のプログラムではiPhoneはおろか最新のGoogle C…

JettyとGoogle ChromeでWebSocketを試す

JavaのサーブレットコンテナであるJetty 7には WebSocketServlet があり、HTML5 WebSocket アプリケーションのサーバサイドを簡単に実装できるようだ。試しにチャットの原型のようなプログラムを書いてみた。gitで公開しているのでcloneして試してみて。 git…

遅延初期化まとめ

遅延初期化するな、普通に初期化しろ。 どうしても遅延初期化が必要なら、メソッドをsynchronizedしろ。 どうしても遅延初期化が必要で、どうしても速度も必要なら、二重チェックイディオムを使え。 どうしても(略)ただしstaticフィールドの場合は、ホルダ…

二重チェックイディオム

以前、Javaではダブルチェックイディオムを使ってはいけないと言われていた。Effective Java第1版にもダメと書かれていたのだが、Effective Java 読書会 12 日目 「スレッド・セーフってなによ!!」 - IT戦記によると、第2版では遅延初期化の方法として掲…

今日の教えてクン

このJUnitのテストコードが通る実装を教えてください assertThat(クリスマス.予定, is(notNullValue())); ググレカス!

今日の謎コード

public class Hoge { private List<Fuga> fugaList; public static boolean exec(Hoge hoge) { boolean result = false; List<Fuga> fugafuga = hoge.fugaList; for (Fuga fuga: fugafuga) { // 何か処理 } return result; } } 何故 static メソッド???</fuga></fuga>

SoftReferenceでキャッシュ

キャッシュを自作するときは、SoftReferenceを使うのが定番らしい。 public class SimpleCache<K, V> { private ConcurrentHashMap<K, SoftReference<V>> map = new ConcurrentHashMap<K, SoftReference<V>>(); public V get(K key) { SoftReference<V> ref = this.map.get(key); if (ref == null) { return nu</v></k,></k,></k,>…

過去のコード資産なんて負債

もう文章まとめるの面倒くさいので思いつきの断片そのままJavaは冗長だからダメ、という意見を良く聞くけど、たぶん本当にJavaがダメな理由はコード記述の冗長性なんかじゃなくて、フレームワークが巨大だったり重量級で取り回しが面倒って事じゃないだろう…

コーディング規約

この規約は、たぶん意外と良い立場で書かれているのではと思った。コーディング規約は守られるべき法律じゃなくて、良いコードのためのパターン集であるべき。デザインパターンのように、コーディングパターンと言うべきか。確かにそうですね。このISIDの規…

使い道があったかも

Java で可変長引数をそのまま返す関数を作ると配列作成のコードがちょっと短くなるかもというエントリを書いたところ String[] a = {"ぬ", "る", "ぽ"}; で良くね?とコメントで突っ込まれました。はい、全くその通りです。すみませんでした!ていうかあまり…

Java で引数をそのまま返す関数を作ったけど、あんまり便利じゃなかった

PHP で引数をそのまま返す関数を作っておくと便利 - IT戦記 を見て思いついた一発ネタ。スクリプトっぽく配列を作成するメソッド。 public static <T> T[] a(T... args) { return args; } 使い方 public class Main{ public static void main(String[] ほげ) { </t>…

JSR 303 Bean Validator

The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 303JSR 303というのが策定中らしい。これは Javaオブジェクトのプロパティ値のバリデーションに関する仕様で、アノテーションを使って値の取るべき範囲や条件を…

アノテーションの書き方

@PrimaryKey private Long id; のように一行で書けるのは知っていたが… @ PrimaryKey private Long id; こんな感じに @ の後に空白改行があってもコンパイルが通るとは知らんかった。

GAE/Jでタグ

Google App Engine Javaでタグのようなデータを実現するには、どのようにデータを保存すればいいのか考えていたのだが、考える必要もないほど簡単だった。タグの文字列を一つずつ普通にList型に値を入れて保存するだけでいいらしい。以下のようなエンティテ…

vmファイルへの直アクセスを防ぐ

続きVelocityのテンプレートを指定の場所に置けるのはいいのだが、結局vmファイルに直接アクセス(実際にはVelocityViewServletへのアクセス)できてしまうのであんまり意味が無い。サーブレットからのフォワードだけ許可するにはフィルタを使えばいい。こん…

Velocityテンプレートの置き場所を指定する

VelocityViewServletでテンプレートの置き場所を指定する方法。velocity.propertiesに webapp.loader.resource.path = /WEB-INF/template/とするとテンプレートは /WEB-INF/template 以下から取得されるようになる。 http://localhost:8080/context-path/hog…

Cookieの使えないケータイは爆発しろ

久々にSAStrutsねた。SAStrutsに限らずWebアプリ一般で、データの更新・作成処理と表示処理を分割するためにリダイレクトが使われる。HogeAction#saveで保存が完了した後に、FugaAction#indexへリダイレクトするようにした。 public class HogeAction { @Exe…

VelocityServletのエラー画面

例えばvmファイルが無い等によってエラーになると、スタックトレースがダラダラ表示されたエラー画面が表示される。「VelocityViewServlet : Error processing」でググってみると、そんな恥ずかしいエラー画面がたっぷり出てくる。これではイカンというわけ…

研修じゃないのか…

ふと、printStackTraceで検索すると、どんな結果がでてくるのか気になって検索したてみた。こんなのが出てきた 基本的にはこのようにします。 catch (Exception e) { e.printStackTrace(new PrintWriter(new FileWriter("log.txt"))); throw e; } 思わずらめ…

JJUGクロスコミュニティカンファレンス

一言でまとめると、時代はクラウド。JJUGは「じぇいじゃぐ」と発音すると今日知った。 scala scalaは面白い言語だと思った。俺はGroovyより好きだぞ。RubyとJavaを知っていればたぶんすぐに使いこなせるようになる。記述がキモイと言われているらしいが、確…

Calendarにsetした値は遅延評価される

今日のつまんないバグ。 Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo")); cal.set(Calendar.YEAR, 2009); cal.set(Calendar.MONTH, 5); cal.set(Calendar.DATE, 12); cal.set(Calendar.HOUR_OF_DAY, 13); cal.set(Calendar.MINUT…

Mavenでwebdavにdeploy-file

mavenで、hogehoge.jarをwebdavを通して俺リポジトリにdeploy-fileしようとした。 $ mvn deploy:deploy-file \ -Dfile=hogehoge.jar \ -DgroupId=jp.paulownia \ -DartifactId=hogehoge \ -Dversion=1.0.8 \ -Dpackaging=jar \ -DgeneratePom=true \ -Drepos…

流れるようなインターフェースで日付操作

流れるようなインターフェースはメソッドの名前が命。 そこで、最近はまっているのがラッパークラスを作る方法です。 Seasar2 付属の S2JDBC や、JavaScript ライブラリの jQuery でも採用されている方法です。 更新系のメソッドで this を戻り値で返してい…

HTTPメソッドを制限するインターセプタ

Java屋はブログ界隈でもコードスニペットあまり書かないよね、と不名誉な事を言われているような気がする。気がするだけで実際そんなことは無いのだが、お堅いJava界隈ではそういう事をするとこいつ下っ端コーダwwとか下流wwと見下す人がまれにいたりす…

Errorをthrowする例。

以上のように、Errorをthrowしている例も少なからず存在します。特定の条件さえ満たせば、Errorをthrowすることも問題がないと考えています。Errorを投げる身近な例というか、一般的なプログラマでも書きそうなシチュエーションというとCloneableをimplement…

空文字チェック

http://itpro.nikkeibp.co.jp/article/COLUMN/20081125/319810/ http://d.hatena.ne.jp/Yoshiori/20081202/1228193692 どう書く?という話題は定期的に上りますね。状況にも因るので一概にどれが正解とは言えないと思いますが、Webアプリなら私もcommonsのSt…

SAStrutsでファイルダウンロード

追記 ひがさんから指摘されて実験してみたのですが、自分の勘違いだったのか拡張子なしでも特に問題なかったようです。訂正します。SAStrutsでは、ResponseUtil#download(String, byte[])を使えばダウンロード処理をカンタンに記述できるそうです。ひがさん…

最近見た面白Javaコード

一部抜粋 try { // tryの中が全部で300行ぐらい DBRtn = ... if (DBRtn.equals("")) { ErrorCode = "E00001"; throw new Exception(); } // ..この後も同じような処理がダラダラ続く } catch (Exception e) { } if (ErrorCode.equals("E00001")) { // エラー…