日々常々

ふつうのプログラマがあたりまえにしたいこと。

WeldとJava SEとGradleとIDEAと

Weldを使ってみようと思いました。普段DIはSpring一本槍なのですが、それもどうかと思ったので。

opengl-8080さんやKazuhiraさんのようないつもの方々が既にやられていることだし、すぐできるだろうと思ってました。

qiita.com d.hatena.ne.jp

やるまでは。甘かったです。すぐできなかった。でも、あーだこーだとやってたら一応解決したので書いておきます。

結論からいうと、*.classがあるディレクトリにbeans.xmlさんがいる必要があります。Gradleとかでclassesとresourcesとかディレクトリが分かれてると、resourcesにbeans.xmlさんが行っちゃうので、動かない。

気づいてみればよくある話なんだけど、だいたいそんなもんだよね(´・ω・`)

やったこと

  • とりあえずドキュメントの通りにやってみる
    • なんか動かない
  • CDIわかってないせいだと思ってJSR読んでみる
    • 特に解決しない
  • ざっくりWeldのソース読んでみる
    • 特に解決しない
  • ログ入れる
    • jclの警告は出てたけどdebugも出すよーにした
    • build/resources/main しか読んでないことに気づく
  • Gradleでコピる
    • 動いた
    • けどIDEAでrebuildしたら動かなくなる
  • beans.xml 無しで読むようにWeldいじる
    • 動きはした
    • けどまともな形にはならなかったし、やりすぎ感もある
    • やりたいのはCDIを一通り触ってみることであって、Weld本体をいじることではないんですよ!!!←
    • てかそのうち本体で対応するだろうし。。。
  • 実行時にコピるようにする
    • いまここ

ログは偉大だなとおもいました。まる。

まじめなことはGitHub

ブログに雑なこと書いて、GitHubのREADMEに真面目なことを書くというのはどうだろう。

と思ってREADMEみたけど、真面目でもなかった。棲み分け……。

jBatchをgradle使ってSE環境で動かしてみる

しおしおさんの書いたブログを見て、jBatch触ってみるかーという気になりました。

適当に書いてデプロイしたら動くとは思うんですが、EEサーバーどれにしようかとか面倒になったので、もうSEでやろうとなったわけです。 でまぁclasspathにjar突っ込むとかは面倒なので、gradleで出来んだろと。

てことで軽くやってみた。

たぶんミニマム構成。Batchletです。とりあえず動く感じ。 javax.inject入れてないのでフィールド書いた瞬間落ちたりするけど、この辺はおいおい見ていこうと思います。

TimeUnitという物体

小ネタ。

java.util.concurrent.TimeUnit というクラスはご存知だろうか。ご存知?なら回れ右してください。お疲れさまでした。またの機会によろしくお願いします。

...

さて、読み進めているならばご存知でないはずなので、まずJavadocのリンクをば。

J2SE 5.0 からいらっしゃるので、別段目新しくないどころか古参とも言えるクラスです。 クラスというかenumです。定義されている列挙はナノ秒、マイクロ秒、ミリ秒、秒、分、時、日の7種類。名前の通りTimeのUnitです。できることはその時間に応じた何かしら。

TimeUnitを使えば、3日が何時間かとかすぐに出せます。忘れがちな「1日が何秒か?」とかにも答えてくれます。

long 三日の時間数 = TimeUnit.DAYS.toHours(3);
long 一日の秒数 = TimeUnit.DAYS.toSeconds(1);

便利ですね!こんな使い方をしたことはありませんが。

...

なんで今回こんな記事を書いているか?それはこんなコードをなるべく見たくないからです。

// 3分スリープする
Thread.sleep(3 * 60 * 1000);

3分とかコメントに書いてしまうと、コードを変更する時にコメントも変更しなきゃいけないです。二重メンテですね。で、コメントは変更しなくても動くので忘れられがちですし、変更忘れに気づいても対応は後回しにされがちです。なので書く必要がないならば書かないほうがいい。(このあたりは過去の記事を参照くださいませ。)

に対して、それっぽく書けるのがTimeUnitさんです。

TimeUnit.MINUTES.sleep(3);

これならコメントも要らないですし、定型的な掛け算をしなくてもいいです。1000や60の意味を気にしなくて良くもなります。 掛け算せずに計算後の数字を180000とか書いて0の数を間違えたりして、「そこで数値リテラルのアンダースコアだ!180_000と書くんだ!」とか無理にProjectCoinを使おうとせずにTimeUnitを使ったほうがいいと思うんです。

そんな事態に遭遇したことはないですけど。