読者です 読者をやめる 読者になる 読者になる

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")) { // エラー…

サーブレット仕様の認証を使わずにgetRemoteUserやisUserInRoleを使う。

JavaのWebアプリでユーザ認証を行う場合、サーブレット仕様で決められた認証機能を使うか、独自の認証機構を実装するか、いずれかであると思う。サーブレットの認証機能を使うとHttpServletRequestのisUserInRoleやgetRemoteUserが有効になるのが地味に嬉し…

SAStruts ActionのJUnit

これはSAStruts 1.0.2の話です。1.0.3以降は知らんですよ。SAStrutsはアクションクラスにpublicなフィールドを書くだけで依存クラスを勝手にInjectしてくれる。便利。しかし、アクセスレベルがpublicでは問題があるという話が浮上してきたので、アクションの…

RequestUtil?

インターセプターからHttpServletRequestにアクセスするには、useLookupAdapterを何かごにょごにょしないとダメという感じだったけど、ActionMessagesThrowsInterceptorのソースを見ると public String handleThrowable(ActionMessagesException e, MethodIn…

何でもDIすればいいってモノじゃない

またSAStrutsネタ。S2Container先生が何でもDIしてくれるからって、SessionスコープやApplicationスコープのインスタンスをむやみやたらにロジックやらサービスにインジェクトすると後悔するかも、という話。SAStrutsでセッションにデータを格納したい時は、…

ライブラリが吐くLog4jログを黙らせる

2008-07-23 - きしだのはてなrootカテゴリにNullAppenderを設定すると幸せになれるらしい。log4j.xmlに以下のように設定 <appender name="empty" class="org.apache.log4j.varia.NullAppender"> <param name="threshold" value="debug"/> </appender> <root> <level value="fatal" /> <appender-ref ref="empty" /> </root> 自分の作ったクラスのカテゴリには別のアペンダを設定

システムエラーページをケータイとパソコンで分ける

SAStruts話。ケータイとパソコンでシステムエラーページを変えたいそうだ。ケータイとPCでアクションは別なのだが、困った事にサービスクラスを共用している。このサービスクラス、内部でS2JDBCがSQLRuntimeExceptionを投げる可能性があるのだが、この例外を…

diconに書いたアプリ設定をブラウザで見る

「Seasar2でdiconにアプリ設定を書く - nullpo.printStackTrace();」の続きSAStrutsのアプリケーション設定をdiconに書いたのはいいが、サーバにデプロイしてしまうと、いちいちdiconファイルを開いて確認するのも面倒なのでブラウザ上で確認したい。dicon(…

ゆの in Java

ゆの in Javaって何ですかww? static { Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { public void uncaughtException(Thread t, Throwable e) { if(e instanceof AssertionError) System.out.println("ひだまりス…

匿名クラスでカッコよく初期化

Javaの匿名クラスを使ってかっこよくオブジェクトを初期化するテクニック - 矢野勉のはてな日記なるほど、通常の初期化なら大抵コンストラクタに書けば十分なので、インスタンス初期化ブロックはどういうケースで使われるのか分からなかったのだが、匿名クラ…

COOL Deployで自動コンポーネント登録ができない件

以下SAStruts-1.0.2(Seasar2.4.25)の話。Seasar2のHOT Deployではリクエスト毎にクラスローダを作るためライフサイクルをSingletonにしたり、Singletonパターンを使っても無駄、という事がわかったのでCOOL Deployに切り替えてテストしようとした。しかしH…

Seasar2でdiconにアプリ設定を書く

「SAStrutsでアプリの設定はどう書く」の続き <component class="java.io.File" name="tmpDir"> <arg>"/tmp"</arg> </component> ognlでシステムプロパティを取り出せるので、例えばTomcatのcatalina.homeを指定出来る <component class="java.io.File" name="tmpDir"> <arg>@java.lang.System@getProperty("catalina.home")</arg> <arg>"tmp"</arg> </component> 以下と同じ Fi…

Hudson運用中

Hudsonで定時ビルド、自動デプロイの環境ができました。これでいつでも最新のコードで機能テストができます。まだ開発初期なのでJUnitテスト自動実行ツールとなっていますが…。だけど、今はまだ自動的に仕事してくれるというだけでも楽しくて良い気分ですね…

maven2でwebdav経由deployできなかった

社内リポジトリを立てて、以前作成したライブラリをdeploy:deploy-fileしてみたのだが、できない。 PUT /maven2/inhouse-utils/inhouse-utils/1.0/struts-utils-1.0.jar HTTP/1.1" 403 380 "-" "Java/1.6.0"とログに残るので、/maven2/inhouse-utils/inhouse…

Cargo

Tomcat等のWebアプリを弄れるライブラリらしい。MavenやANTからサーバを操作できるらしいよ。 http://www.srcw.net/blog/2007/06/cargo_maven2_plugin.html http://www.atmarkit.co.jp/fjava/special/maven2_02/maven2_02_3.html とりあえず上のページとWEB+…

SAStrutsでアプリの設定はどう書く?

例えばファイル出力先のディレクトリパスなど、アプリケーションの設定をどう書くべきか。propertiesファイルに書いて読み込めばいいと思ったが、そんな必要もなさそう。コンテナに登録するコンポーネントは、インターフェースを実装したクラスである必要は…

S2Chronosって何ぞ?

Seasar2のSMART Deployに対応したタスクスケジューリングライブラリらしい。前にS2Quartzというのがあったような気がしたのだが、アレがS2Chronosになったのだろうか?事情は知らん。で、SAStrutsとかTeedaみたいなWebアプリの中で動かす方法がマニュアルに…

JavaでSHA2

SHA2の16進文字列を簡単に取得できるライブラリが無いので書いた。書いたと言ってもアルゴリズムはjava.security.MessageDigest 任せですよ。 import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * MD5やSHA-512等のD…

javaでsha2

javaでSHA256かSHA512が使いたくてライブラリをあさってみたのだが、javaユーザの強い味方、apache commonsのcodecで、sha2が使えるバージョン1.4が正式リリースされてない。ずーっとsha1までしか使えないバージョン1.3が最新版のままである。なにやらBASE64…

メモ S2JDBCでupdate or insert

S2JDBCには、ActiveRecordやDBICなどのupdate_or_create的なメソッドはないが、こうすればいいらしい。 int count = jdbcManager.update(employee).execute(); if (count == 0) { jdbcManager.insert(employee).execute(); } http://ml.seasar.org/archives/…

SAStrutsのセッション

http://sastruts.seasar.org/fileReference.html#context Tomcatを使っていて、ActionFormやDtoをセッションに格納するようにしている場合に、HOT deployが効かないことがあります。これは、Tomcatがセッション情報をシリアライズし、 Seasar2が関与できない…