tokuhirom's blog

Java で JSON をテストケースに貼り付けた後でエスケープしてまわるのが辛いときに

http://javarevisited.blogspot.jp/2012/12/how-to-escape-text-when-pasting-as-String-Eclipse-tips.html

ここにあるように、Preferences -> Java -> Editor -> Typing の "Escape text when pasting into a String literal" をオンにすれば、文字列リテラル中に貼り付けた場合、自動的にエスケープされるようになって楽!

Java 10 ぐらいで raw string サポートされないかなあ。

Created: 2014-11-21 13:24:33
Updated: 2014-11-21 13:24:33

[java]2つのリストをマージする

    List<String> newList = Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList());

こんな感じで行けるようです。

http://stackoverflow.com/questions/189559/how-do-i-join-two-lists-in-java

Created: 2014-11-21 12:35:14
Updated: 2014-11-21 12:35:14

AngularJS 嫌いな人が多い昨今について

最近 AngularJS 嫌いという言説が多いですが、そういうことを仰る方々は主に先鋭的な JSer のように思います。

ただ、僕なんかの場合には、ユーザー向けの画面の構築などには AngularJS を使って書くことは最近はほとんどなく、JS を書くといえばもっぱら管理画面です。

管理画面の JS を書くにあたっては AngularJS way にのっかってやると非常に楽ですよね。管理画面を書いたりする上では vue-js とかで頑張って書くと見通しが悪くなったりしますし、こった動きなどは必要ないというところで angular.js ワリといいなと思っています。

もっといいものがあれば移りたいですが、コストをかけずに作りやすい管理画面を作るという意味ではやはり AngularJS にまだメリットがあるなあ、と思っています。


2.0 が出た時にこまるというのもありますが、実際は angularjs をすごく使いこなしているわけでもなく、そこまで移行にコストはかからないと考えているのと、angularjs 1.x をずっと使い続ければいいっちゃいいので、あまり悲観視していません。


世の中にはフルタイムデベロッパーがいる一方で、片手間にその分野を演る人たちもたくさんいるということです。

まとめ

AngularJS は

  • 管理画面を作る
  • 互換性が失われても気合でなおせばいい
    • むしろ管理画面とかしょっちゅう作り変えるのであまり気にならない
  • デザインへのこだわりとかをもたないでいい
  • Directive とかめんどくさいからつくらない

というようなケースではやはり非常に有用なので、今後も使っていこうと思っています。

vue.js ベースで angular ぐらいさっくり作り始められるというところまで rail が敷かれていると、いいんだけど。。 (vue.js で controller 当てる対象をクラス指定する機能あるけどあれよりも ng-controller のほうがうれしいとか、ね)


追記。

昔ながらの JS はピンポイントで使う管理画面を以前は作っていたのですが、最近はわりとある程度作りこむ必要があるのと、管理画面さわる人たちの目も肥えてきているので、画面遷移を無限にさせたりすると大変不評なのです。。

そしてまあ、今ボクがやっている環境だと管理画面触る人たちが数十人オーダーになることが珍しくないということもあって、ある程度動的にやる必要が出てきています。

Created: 2014-11-21 11:07:35
Updated: 2014-11-21 11:07:35

Google guava と Java 8

Google guava は Java 7 で使っていると便利なのだが、Java 8 の世界では使わないほうがよいように思う。

  • Java 7 の世界で独自で関数型プログラミングしようとした結果、読みにくいコードになっている面がある
  • Java 8 ととの機能の重複が多い
  • バイナリ互換性を失うような変更が行われるため、後々困ることがある
    • 自分のコードで guava に依存していると、ライブラリが要求している guava のバージョンにあわせられなくてつむことがある
  • guava なにげに色々詰め込みすぎてるのでバイナリサイズがわりとでかい
  • guava にある機能で java 8 にないものはわりとほとんど apache commons で代用できる。

そんな感じです。重要なのはバイナリ互換性まわりで、なにかとクラス削ったりしてくるのではまりがちですね!

Created: 2014-11-21 10:27:09
Updated: 2014-11-21 10:27:09

はじめての Spring Boot

@making さんから頂きました。Spring Boot の本は海外でも出てないということで注目度が高いようです。

Amazon のリンクをはろうとしたら、すでに在庫が切れているというところからも注目度の高さが伺えます。

インストールから顧客管理のアプリを作ってリリースするところまでが丁寧に解説されていて、よい本だと思います。

対象読者は Java にある程度慣れている人ということで、JavaEE の経験があったりする人がメインターゲットなのかな、という感じでした。

Spring を使ってる職場で新人に与える最初の一冊として良さそうだなー、と思いました。

Created: 2014-11-20 11:50:47
Updated: 2014-11-20 11:50:47

avans 0.36.0 を出しました

正式リリースに向けて、非互換な変更を入れています。

変更点はこちらです。 https://github.com/tokuhirom/avans/commit/7cdbc05d3a1441d3601477a3ca96af2289a9a634

詳細はこちらに記載されています。 https://github.com/tokuhirom/avans#0350

非互換の変更点がこのへんになってて、フックポイントを annotation に移してます。 まもなく 1.0 を出す予定で、以後は非互換の変更を行う場合には package 分けることになると思います。

Created: 2014-11-19 12:01:41
Updated: 2014-11-19 12:01:41

java における sticky session の話

このへん見てて考えたことのメモ。

実際、Java のシングルサーバーからスケールアウトさせる場合は「sticky session によるオンメモリキャッシュ → redis かなにかのバックエンド」に保存という形にするのはありだお思うのだけど、僕らのケースにはマッチしないように思った。

これは以下の理由による

  • 基本的にサービスを提供するサーバーは2台以上からスタートする
  • app server にローカルキャッシュを持つと GC 対象になる
    • できるだけ request をまたいだデータは持ちたくない
    • session データは長期間保持することになるので、、
  • そもそもうちのサービス規模だと local cache にヒットする確率が少なそう
  • ローカルキャッシュを蓄えれば高速化は可能だと思うけど、実際 DB とかのほうが遅いので、あまり頑張る意味がなさそう

すでにやってたりミドルウェアでサポートされてるならありだけど、自分たちで今から考慮する必要はないかなあ、という感じ。

Created: 2014-11-18 09:26:55
Updated: 2014-11-18 09:26:55

[java] web.xml から tomcat-embed をランダムポートで起動し、起動したポートを得る方法、または Java webapp のテスト手法について

一般的に web application のテストをするには application server を別スレッドで起動してそこにアクセスする方法と、http request を mocking して application code を直接呼ぶ方法があります。前者の方法は、app server の挙動を完全に再現できるし、http client も使い慣れたものを利用できるというメリットがあります。後者の場合には実行速度が速いというメリットがあります。

で、いろいろなメリット・デメリットを考慮した結果、今回は前者の方法でいこうとおもったわけです。

ここでは、maven 構成な一般的な webapp を tomcat で運用する場合のテストを前提とします。

とりあえず、pom.xml に以下のように記述しましょう。tomcat は 7 を使う無難さよ。

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>7.0.56</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-catalina</artifactId>
        <version>7.0.56</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jasper</artifactId>
        <version>7.0.56</version>
        <scope>test</scope>
    </dependency>

以下のように、tomcat-embed を起動すればいいだけです。めっちゃ簡単ですね。

Tomcat tomcat = new Tomcat();
tomcat.setPort(0);
org.apache.catalina.Context webContext = tomcat.addWebapp("/", new File("src/main/webapp").getAbsolutePath());
webContext.getServletContext().setAttribute(Globals.ALT_DD_ATTR, "src/main/webapp/WEB-INF/web.xml");
tomcat.start();

int port = tomcat.getConnector().getLocalPort();
String url = "http://127.0.0.1:" + port;
// url をつかってなにか処理する

めっちゃ簡単ですね!! Embedded tomcat 遅いと思うかもしれないですが、意外と起動はやいです。

出来てみると簡単ですが、意外とこういうことしてるコード見当たらなかったんで、書いてみた次第。

もっといいテスト方法あるよ! なんて方いたら教えてくだされ~

Created: 2014-11-14 21:28:20
Updated: 2014-11-14 21:28:20

jenkins のときだけ一部テストを走らせたくない

なんか一部だけすげー重いテストだから jenkins では走らせたくないとか、異常なミドルウェアに依存しているから jenkins では走らせたくないとか そういう事情なときに、一部テストをスキップさせたい。

そんな時は profile を分ければ良い。ということが stackoverflow 見てたらわかった。

http://stackoverflow.com/questions/4389744/is-there-a-way-to-tell-surefire-to-skip-tests-in-a-certain-package

<properties>
    <exclude.tests>nothing-to-exclude</exclude.tests>
</properties>
<profiles>
    <profile>
        <id>fast</id>
        <properties>
        <exclude.tests>**/*Dao*.java</exclude.tests>
        </properties>
    </profile>
</profiles>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <excludes>
        <exclude>${exclude.tests}</exclude>
        </excludes>
    </configuration>
</plugin>

のようにして、jenkins では以下のようにする。

mvn -Pfast test

これで平穏な生活を送ることができる。

Created: 2014-11-13 12:52:59
Updated: 2014-11-13 12:52:59

javadoc.io が便利

Maven central へのアップロードを無事に果たしたのはよいが、javadoc を見るにはどう>したらいいのか、、と思って探してみると、あった。ありました。javadoc.io

http://javadoc.io は maven central にあがってるプロジェクトの javadoc を表示してくれるサイト。

http://www.javadoc.io/doc/me.geso/mech2/ とかにアクセスすると、javadoc をいい感じに表示してくれる。今後は README.md にはこの URL を記載することにしよう。

(本来であれば search.maven.org でjavadocを表示してほしいのだが)

Created: 2014-11-07 08:27:34
Updated: 2014-11-07 08:27:34