Java

社内勉強会で「Java8から17へ」というタイトルで発表しました

社内勉強会で「Java8から17へ」というタイトルで、Java9から17で入った新機能で、実際コード書く上で使いそうなもの紹介しました。 Java8から17へ from onozaty Zennで書いた下記の記事を元に加筆したものになります。 Java9から17で入った新機能ピックアップ

Flywayでマイグレーション完了時に決められたSQLを実行する

JavaのDBマイグレーションライブラリとしてFlywayを愛用していますが、マイグレーションが全て完了した後に、特定のSQLを流せないかなと調べてみたところ、Callbackという仕組みがあることがわかりました。 Callbacks - Callbacks - Flyway by Redgate • Dat…

WebDriverManagerを利用してSeleniumでのWebDriverの更新を楽にする

ブラウザでのテストだけではなく、ちょっとしたブラウザ操作の自動化にもSeleniumを利用するのですが、久しぶりに起動すると、各ブラウザのDriverが古くでエラーになる、、みたいなことが多々発生していました。 今更ながら、他の方々はどうやってこの問題を…

JUnitの結果をCSVファイルに変換するツール(junit-xml2csv)を作りました

JUnitの結果を一覧で見たいなーってことで、CSVファイルに変換するツールを作りました。遅いテストを探すのに、EXCELでソートしたかったからです。 JUnitの結果XMLファイルが配置されているディレクトリ(Gradleだとbuild/test-results/testとか)と、出力ファ…

FlywayのJavaコードによるマイグレーション

JavaのデータベースマイグレーションのライブラリであるFlywayですが、SQLファイルだけでなく、Javaのコードによるマイグレーションにも対応しています。 https://flywaydb.org/documentation/migrations#java-based-migrations やり方は簡単で、SQLファイル…

attendance-recorder という出退勤を記録、参照するアプリケーションを作りました

在宅勤務中の出退勤がもう少し見える化できないかなぁと思って、attendance-recorder という出退勤を記録、参照できるアプリケーションを作りました。 github.com Spring Bootで作ってます。 APIを叩いて出勤、退勤を記録して、それをWeb上で見れるような形…

自分で作ったライブラリをJCenterとMaven Centralで公開する

下記自作ライブラリをJCenterとMaven Centralに公開した際の手順を残しておきます。 (後から記憶をたどって書いているので、抜けがあったらすいません...) 公開の流れとしては、下記のようになります。 Bintrayにアップロード JCenterに公開 JCenterからMave…

PostgreSQL COPY Helper を作りました

PostgreSQLのCOPYコマンドをJavaで簡単に利用するためのライブラリとして、PostgreSQL COPY Helper を作りました。 登録したいデータの構造を表すクラスを定義しておいて、、 @Table("items") public class Item { @Column("id") private final int id; @Col…

java.sql.Timeとjava.time.LocalTime間の変換でミリ秒が破棄される

java.sql.Timeには、下記のようなLocalTimeとの間で変換を行うメソッドがあります。 public LocalTime toLocalTime() Time java.sql.Time.valueOf(LocalTime time) ただ、これらメソッドは秒までしか対象にしておらず、ミリ秒が破棄されています。 /** * Obt…

Spring BootでgRPCとRESTを比べてみる

前回gRPCを試したので、RESTとgRPCで同じAPIのパフォーマンスを比較してみます。 受け取ったメッセージをそのまま返す単純なAPIです。 REST package com.example.server; import org.springframework.web.bind.annotation.PostMapping; import org.springfra…

Spring BootでgRPCを試してみる

gRPCとRESTの比較をしてみたかったので、まずはgRPCを触ってみました。 Srping Bootだと、grpc-spring-boot-starterを使うと簡単にgRPCのサーバが実装できます。すばらしい。 GitHub - LogNet/grpc-spring-boot-starter: Spring Boot starter module for gRP…

HTTP(S)通信のテストに、OkHttpのMockWebServerを利用する

JavaのHTTPクライアントとして有名なOkHttpですが、関連プロジェクトにMockWebServerという機能があります。 okhttp/mockwebserver at master · square/okhttp HTTPサーバとしてモックを提供するものになります。手順としては、、 モックサーバとして返却す…

大きなリストを検索するときにArrayListではなくHashSetを使う (Java)

社内でも同じこと書いたのですが、こっちでも。 大きなリスト(例えば10万件を超えるようなもの)から一致するものを探す場合、ArrayList#containsを使うと、パフォーマンス的に問題になる場合があります。ArrayList#containsは、先頭からシーケンシャルに見て…

Lombokで生成されたメソッドをJacocoのカバレッジから除外する

Jacocoの0.8.0が2018年1月2日にリリースされ、待ち焦がれていたLombokで生成されたメソッドを除外する機能がはいりました。 JaCoCo - Change History Methods annotated with @lombok.Generated to better integrate with Lombok >= 1.16.14. Initial analys…

大量のテキストからトークンを切り出す際に、トークンをキャッシュしてメモリ使用量を抑える

大量のテキストからトークンを切り出す場合(形態素解析など)に、同じ内容のトークンが大量に発生することがあります。 このトークンが不変なオブジェクトであるならば、同じ内容のトークンは1つのオブジェクトを使いまわす、すなわちキャッシュすることによ…

Jackson 2.8.7 で、Lombokの@AllArgsConstructorと@NoArgsConstructorを指定していて、一部プロパティを@JsonIgnoreとしているとJsonMappingExceptionが起きる

下記のようなコードを書くと、Jackson 2.8.7 だとエラーとなります。 public class JacksonExample { public static void main(String[] args) throws IOException { ObjectMapper mapper = new ObjectMapper(); User userBefore = new User(1, "Taro", "pas…

社内勉強会で「Lombokの紹介」というタイトルで発表しました

社内勉強会でLombokについて発表してきました。 Lombokの紹介 from onozaty www.slideshare.net Lombok便利ですよね!もぅLombok無しには戻れません。

MyBatis にて size というパラメータ名を使うとintとしてマッピングされてしまう

追記@2017-07-02 下記Issueで既に対応していただいています。次のバージョン(3.4.5)に入る予定です。 When the parameter name is "size", it is always mapped with integer · Issue #1030 · mybatis/mybatis-3 · GitHub MyBatisのSQLへのパラメータ埋め込…

Spring Boot で WebSocket (STOMPではなく、TextWebSocketHandler)を試してみる

こないだSTOMP over WebSocketを試してみましたが、今度はSTOMPを使わずに、TextWebSocketHandlerを使ったWebSocketを試してみます。題材も同じくチャットです。 sandbox-spring-boot/spring-boot-websocket at master · onozaty/sandbox-spring-boot · GitH…

Spring Boot で STOMP Over WebSocket を試してみる

Spring BootでSTOMP Over WebSocketを使って、試しにチャットっぽいものを作ってみました。 sandbox-spring-boot/spring-boot-websocket-stomp at master · onozaty/sandbox-spring-boot · GitHub 同じルームに接続しているクライアントに、同じメッセージを…

Lombokの@Builder(toBuilder = true)で、オブジェクトの複製を作成する

前回の記事の続きで。 @Builder(toBuilder = true)とすると、オブジェクトからBuilderを生成できます。 どういうときに使えるかというと、オブジェクトの複製を作成して、一部のプロパティのみ変えたいといった場合です。 package com.example.lombok; impor…

Lombokの@BuilderでBuilderを簡単に作成する

多数のプロパティを持つクラスを生成するときに、Builderが有用だと思っているのですが、普通に書くとそれなりにコード書く必要があります。そこでLombokの@Builderです。 package com.example.lombok; import lombok.Builder; import lombok.ToString; publ…

Lombokで生成されたメソッドに対してアノテーションを設定する

毎回調べているような気がするのでメモ。 Lombok+Jackson(Spring MVCやJerseyなどで使ってたり)を使っている場合に、@JsonIgnoreで一部のフィールドを対象外にしたい場合に、privateなフィールドに設定してもうまく動きません。 Lombokで生成したsetterまた…

Spring Boot: Scheduledアノテーションを使用して、スケジュールされたタイミングでメソッドを実行する

Scheduledアノテーションを使うと、スケジュールされたタイミングでメソッドを実行することができます。 これで周期実行的なものは、簡単に実装できます。 Getting Started · Scheduling Tasks 34. Task Execution and Scheduling 実装方法 実行したいメソッ…

MyBatisのArrayTypeHandler使用時の注意点

MyBatisには、org.apache.ibatis.type.ArrayTypeHandlerがあって、java.sql.Arrayとのマッピングを行ってくれますが、パラメータ設定時と、結果取得時でマッピングが異なるので注意が必要です。 実際のコードを見たほうがわかりやすいので、現時点のコードを…

Spring Bootのspring-boot-starter-webでTomcatではなくJettyを使う

Spring Bootのspring-boot-starter-webのデフォルトだとTomcatがサーブレットコンテナとして組み込まれますが、設定を変えればJettyに切り替えられます。 70. Embedded servlet containers configurations { compile.exclude module: "spring-boot-starter-t…

Amazon Product Advertising APIを使ってISBNから書籍情報を取得する

ISBNから書籍の情報を取りたかったので、Amazon Product Advertising APIを使ってみました。 必要な情報 Amazon Product Advertising API を使うためには、下記の情報が必要になります。 アソシエイトタグ アクセスキー シークレットキー アソシエイトのアカ…

Spring BootでAssertJの3系を使う

Spring Boot(現在の最新の1.4系)はJava7もサポートしているため、spring-boot-starter-testで依存するAssertJは、Java8対応の3系ではなく、2系となっています。 upgrade assertj to 3.3.0 · Issue #5272 · spring-projects/spring-boot · GitHub 3系に変えた…

Spring Boot DevToolsを使って、コードを修正して確認といったサイクルを短くする

Spring Boot DevTools を使うことによって、コードを修正して確認といったサイクルを短くすることができます。 http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html 使い方 build.gradleやpom.xmlで依存関係を追加する…

MyBatisのMapperはGroovyで書くことにした

MyBatisのMapperでSQL書くにあたって、複数行に渡るSQL書くのにヒアドキュメントが使いたくて、まずはKotlinを試しました。 ただ、ElicpseでKotlinを書こうとすると、importの自動補完が効かず、ちょっと面倒だったので、Groovyを試しました。(本当は、Kotli…