覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Java

Class#newInstanceは非推奨になるようなので気を付けよう

Javaでリフレクションによるデフォルトコンストラクタ呼び出しでインスタンス生成する方法としてClass#newInstanceが挙げられると思います。 ただし、Class#newInstanceはJava9で非推奨(Deprecated)になるようです。(さらに以降のバージョンでAPI自体が削除…

MavenでOWASP Dependency CheckによるJavaライブラリの脆弱性をチェックする

OWASP Dependency Checkで使用しているJavaライブラリの脆弱性をチェックすることができます。 今回はMavenのpluginを使用します。 設定 pom.xmlに以下を追記します。 <plugins> ・・・ <plugin> <groupId>org.owasp</groupId> <artifactId>dependency-check-maven</artifactId> <version>2.0.0</version> <configuration> <assemblyAnalyzerEnabled>false</assemblyAnalyzerEnabled> …</configuration></plugin></plugins>

RxJava - RxJavaでHelloWorld

RxJavaを使いながらリアクティブプログラミングを理解していきたい。 とりあえずは、まず何を置いてもHello World! 準備 pom.xmlに以下の依存関係を追加します。Reactive Streamsにも対応しているバージョン2.Xを使います <dependency> <groupId>io.reactivex.rxjava2</groupId> <artifactId>rxjava</artifactId> <version>2.0.8</version></dependency>…

Lombok - @Builderでデフォルト値を指定する

Lombokの@Builderアノテーションは何かと便利なのですが、プロパティへ値をセットするためのBuilderのメソッドを呼ばないと対応するフィールドが初期値(数値なら0, booleanならfalse, オブジェクトならnull)になってしまいます。 このあたりの動きをv1.16.…

普通にコンストラクタ呼び出すのとリフレクション使うのとでどれだけ速度差あるの?

Javaでインスタンス生成する場合は、コンストラクタを実行するのが普通ですが、リフレクションでもやれます。 ただ、一般的にリフレクション使うと遅いというのが懸念点の一つとして上がってきます。 というわけで、普通にコンストラクタ実行するとのリフレ…

Javaでユニットテストを書く時に気を付けたいこと

Javaプログラムに対するユニットテスト(単体テスト)を書く際に気にしておきたいことを書いてみました。 以下、個人的な経験則と本で読んだ内容が混ざっています ユニットテスト作成時の原則 「このクラスはXXXの理由でユニットテストが難しいんです!」と…

Javaでプログラムを書く際に意識しておきたいこと

以下、個人的にJavaでプログラムを書く際に意識しておきたいことです。 ただし、学術的な裏付けなどがある内容でありません。あくまで私の経験に由来する内容となっています。 そもそもコンテキストによってはそぐわない内容もあると思いますので、その辺は…

コード品質特性を悪化させるには

プログラムのより良い設計を支える中心的概念としてコード品質特性があります。これに点数付けした場合に、悪い点をとるためにはどうすればいいかについて書きました。 以下内容のベースはJavaです そもそもコード品質特性とは ここでは、以下をコード品質特…

複雑なプログラムに現れる傾向や特徴

「ソースコードを汚くするには」に記載したようなコードを書いていると、結果的に複雑なプログラムになってしまいます。 ここでは複雑なプログラムに現れやすい傾向や特徴などについて記載しました 基本的にJavaをターゲットにして本エントリを記載していま…

Kotlinの特徴

「Kotlinスタートブック」を読み始めたので、とりあえずKotlinの特徴として押さえておきたい点をメモしておきます。 Kotlinスタートブック -新しいAndroidプログラミング作者: 長澤太郎出版社/メーカー: リックテレコム発売日: 2016/07/13メディア: 単行本(…

日付のフォーマット処理する時にどれだけメモリ消費するの?

業務アプリケーションを作成する上で、日時を取り扱うのは日常茶飯事だと思います。 例えば、生成した日付オブジェクトを特定のフォーマットパターンで文字列化する という処理の流れは大体どんなシステムでも実施されます。 これをJavaで実現する場合、現在…

KotlinでHello World

Kotlin流行ってますし、そろそろ勉強しようかなと思っている今日この頃。とりあえずHello Worldだけやってみました。 IntelliJ IDEAでKotlinのプロジェクトを作成して以下実行しています。 ■サンプルコード Kotlinのファイル(HelloWorld.kt)を新規作成して…

JSUG勉強会 2017年その2 ~ 脱Spring Boot初心者 に行ってきました

JSUG勉強会に参加してきました 以下自分用のメモ 概要 開催場所 : Pivotal Japan 開催日時 : 2017-02-27(月)19:00 - 21:00 Spring for Spring Boot -Spring Bootユーザーが知るべきSpringの基礎知識- 多田 真敏氏 (株式会社カサレアル、Pivotal認定講師)…

MBassador - サブクラスのメッセージ受信時の動き

MBassadorを用いてメッセージのハンドリングを行う場合のメッセージのサブクラスに対する動きを確認します。 本エントリでは、MessageObj とその子クラスの SubMessageObj を定義しました。これらをEventBusにpublishします。 ■メッセージクラスの定義 publi…

MBassador - 異なる型のメッセージを1つのHandlerでハンドリングする

MBassadorを用いてメッセージのハンドリングを行う場合、通常メッセージの型ごとにハンドラを用意することになりますが、@Envelopedアノテーションを使用することで複数の異なる型のメッセージを1つのハンドラでハンドリグすることが可能となります。 以下実…

MBassador - EventBus内で発生した例外をハンドリングする

MBassadorを用いてイベントのハンドリングを行っている場合、デフォルトではハンドラ内部で例外が発生しても何事も無かったようになってしまい、エラーが発生したことすら分からないような状態になってしまいます。 さすがにこれはまずいので、基本的にはエ…

String#joinで文字列連結

Java8で増えたString#joinを使うと配列やListの要素を文字列連結するのが楽です。地味に便利です。 Listをカンマで連結する例で動きの確認をしておきます 複数要素の場合 List<String> twoList = Arrays.asList("A", "B"); List<String> threeList = Arrays.asList("A", "B",</string></string>…

アプリ実行中に条件に合ったクラスを抽出する

前回のエントリでFastClasspathScannerを利用して特定のアノテーションが付与されたクラスを抽出するサンプルを実行しました。 FastClasspathScannerでは、他にも色々な条件でクラス等を抽出できます。いくつかサンプルを試してみます インターフェースクラ…

特定のアノテーションが付与されたクラスを実行時に抽出したい

Javaアプリケーションの処理内で、特定のパッケージ配下にあるクラスの中で、指定の条件を満たすものを抽出したい場合があります。 例えば、アプリ実行中に特定のアノテーションが付与されたクラスを探したい 等がこれに該当します。 このような場合、FastCl…

Guice - Listに名前を付けて@NamedでInjectionしたい

Guiceを使っている場合に@NamedでListに名前を付けて依存関係を解決するサンプルです。 今回のサンプルではList<String>の値に sample.list という名前を付けてInjection出来るようにします。 依存関係を記述 ■ListがInjectionされるクラス コンストラクタで@Named </string>…

GitHubでJavaの流行ってそうなライブラリを探す

私が、Javaの有用そうだったり流行ってそうなライブラリをGitHubで探す時の手順です。 (完全に個人的なやり方です) ■Trendingを確認する Trending Java repositories を確認します。 ページにアクセスすると、以下のような内容が表示されます。ここに新し…

size=1のListのメモリサイズってどの程度

先日、Arrays#asListで生成されるArrayListについてのエントリを書きました。 そのエントリ書いた後に、ふとメモリサイズの違いもあるかなと思ってJOLで測定してみました。 対象 生成するList 今回は条件を単純化して、生成するListを以下内容にしています。…

Arrays#asListで生成されるList

JavaでListをリテラルに記述して生成する方法が基本的にないので、文字列List等を作る際には基本的にArrays#asListを利用することが多いです。 ただし、Arrays#asListによってに生成されるクラスはArrayListという名前ですが、 いわゆるjava.util.ArrayList…

日時オブジェクトのサイズをJOLで確認してみる

以前、JMHで現在日時取得のベンチマークを取得してみました。 今回は色々な日時オブジェクトのメモリサイズをJOLで確認してみます 対象 今回の測定対象とするクラスは以下です java.util.Date java.util.Calendar java.time.LocalDateTime java.time.LocalDa…

Guava 21.0 がリリースされてた

Guavaの21.0がいつの間にかリリースされてました。 Release21 · google/guava Wiki · GitHub 今回からJava8必須になったようです。 色々変更があったようなので簡単に(ごく一部を)試してみます。 準備 pom.xmlに以下を追記します <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version></version></dependency>…

ND4J - 行列の演算

前回のエントリでND4Jを利用して、ベクトルの演算を試しました 今回は行列の演算を試してみます。 各種演算 行列の和 行列と行列の足し算です。 ■サンプルコード import org.nd4j.linalg.api.ndarray.INDArray; import org.nd4j.linalg.factory.Nd4j; INDArr…

ND4J - ベクトルの演算

前回のエントリでND4Jの利用準備をして、ベクトルと行列の定義だけしてみました 今回はベクトルの演算を試してみます。 各種演算 ベクトルの和 ベクトルとベクトルの足し算です。 ■サンプルコード import org.nd4j.linalg.api.ndarray.INDArray; import org.…

ND4J - Javaでベクトルとか行列を定義する

Javaでディープラーニングを試そうと思った場合に、名前があがっているライブラリはDeeplearning4J一択な気がします、現状は。 そのDeeplearning4Jの内部で使用されているのが、ND4J(N-Dimensional Arrays for Java)です。 ND4Jは、行列等のN次元配列を簡単…

Javaで仮想ファイルシステムを作る時に考慮すべき点

以前のエントリで仮想ファイルシステムを構築するためのfuseと、fuseからJavaにブリッジするためのfuse-jnaについて紹介しました。 実際にfuseとJavaを使って仮想ファイルシステムを構築する際に気にすべきポイントや懸念点があります。 それについてメモし…

MBassador - Handlerの優先順位を制御する

MBassadorで同じ型の引数を受け取るHandlerを複数定義した場合、発行したメッセージはすべてのハンドラに到着します。 その際に、メッセージがHandlerに到着する順序は不定です。 が、Handlerにおいてpriorityを指定することで、メッセージの到着順序を制御…

MBassador - メッセージをフィルタリングする

先日のエントリで、MBassadorでメッセージの型によって反応するハンドラが変わるサンプルを示しました。 MBassadorでは、同じ型のメッセージでもメッセージ内容をフィルタリングして受け取るハンドラを切り替えることができます。 概要 フィルタリングは大ま…

MBassador - Handlerの引数の型に合わせてメッセージが届く

以前のエントリでJava用の軽量なEventBusとして、MBassadorを紹介しました。 その際にはメッセージを受け取るハンドラを一つだけ定義しましたが、今回のサンプルでは複数のハンドラを定義してみます ■Handlerの定義 ハンドラとなるメソッドを3つ用意しまし…

MBassador - 軽量なhigh-performance Event Bus

JavaでPublish/Subscribe Patternをベースにした軽量なEventBusのライブラリとしてMBassadorというものが存在しています。 今回のサンプルではとりあえずHelloWorld的なことをやります。 準備 pom.xmlに以下の依存関係を追加します。本エントリではversionに…

Quartz - スレッド数の制御

Quartzで定期処理を行う場合、デフォルトでは10スレッドがpoolされて、そのスレッドを使って処理されます。 場合によっては、10スレッドもプールされている必要ないよ。という場合もあると思います。 その場合は以下の設定でスレッド数を変更することができ…

Quartz - DIを使ってJobにInjectionする

QuartzでJobの定義を行うことで簡単に定期処理を記述することができますが、 デフォルトではJobにメンバ(インスタンス変数)を持たせて、それを外側からセットするのは単純にはできません。 しかし以下のようにすることで外部から必要なインスタンスをDIコ…

Quartz - Jobを重複して実行しないようにする

Javaで簡単に定期処理を行うためのライブラリであるQuartzの紹介エントリを書きました。 その際に、100ミリ秒間隔で処理を行う例を書きましたが、実は対象のジョブが実行開始して100ミリ秒以内に処理をおえられない場合は、同一のジョブがさらに実行される状…

Javaslang を試してみた

Java Advent Calendar 2016の16日目の記事です。 ※追記: Javaslangは、名称がVavrに変更になりました Javaで関数型プログラミングを行うためのライブラリとしてJavaslangが存在しています。 Javaslangは、Scalaの長所をJava言語にできる限り導入することを…

Quartz - Javaで定期処理を行いたい

Javaで定期処理を書くのは、Java標準のAPIを使ってできるのはできますが、 ジョブスケジューラライブラリのQuartzというものが存在しています これを使ったほうがもっとシンプルに書けて、(たぶん)高機能なこともできます。 とりあえずまずは使ってみまし…

java.util.Optionalに対する理解

JavaのOptional(java.util.Optional)がどういうものであるかについて自分なり理解したので、それについてメモしておきます。 自分なりの理解ということで、細かい部分で正しくないところもあるかもしれません。 Optionalの役割 Optionalは、値があるかもしれ…

Mavenでfat jarを生成する

Mavenプロジェクトで開発している場合にfat jar(jarの中に依存するライブラリのjarもまとめた1つのjarファイル)を生成するためには、 pom.xmlに以下の内容を追記することで可能です <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.6</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-d…</descriptorref></descriptorrefs></configuration></plugin></plugins></build>

IntelliJ IDEA - ショートカット集

IntelliJ IDEAのショートカット集(IntelliJ IDEAを使い始めたばかりなので自分用のメモです) ちなみに自分の環境がWindowsなので以下全てWindows用のショートカットを記載しています。 便利なショートカット 使用頻度が特に高いショートカット 内容 ショー…

Spring Boot - アクセス元のIPアドレスをIPv4形式で取得したい

Spring BootでWebアプリを構築する際に、 仮に以下のようなコードがあった場合、WebAuthenticationDetails#getRemoteAddressでアクセス元のIPアドレスを取得することができます。 import lombok.extern.slf4j.Slf4j; import org.springframework.beans.facto…

JJUG CCC 2016 Fall 行ってきた #jjug_ccc

JJUG CCC 2016 Fallに参加してきました。 以下自分用のメモです。 概要 JJUG CCCは、春と秋に開催される日本最大のJavaコミュニティイベント。Java関連の技術や事例に関するセッションが行われる。 主催: 日本Javaユーザーグループ 日程: 2016/12/3(土) 10…

Groovy - Java上で定義した文字列をGroovyのScriptとして実行する

Java上で定義した文字列をGroovyのScriptとして実行するサンプルです 以下サンプルでは、Scriptで受け取った文字列をコンソールに出力して、"end"という文字列をreturnします。 ■pom.xml Mavenで取り合うことを前提として、pom.xmlには以下を追記します <dependency> <groupId>org</groupid></dependency>…

Spring Boot - Actuatorの機能用のEndpointのコンテキストパスを指定する

Spring BootのActuator機能のEndpointに関しては通常の機能とはコンテキストパスを別にしたい場合があります。 その場合はapplication.ymlで、以下のようにmanagement.contextPathにコンテキストパスを指定することで実現可能です。 以下では、management.po…

Spring Boot - Controllerで認証済みのユーザ情報を受け取る

Spring Bootを利用したアプリケーションを構築する際、 Spring Securityで認証を行ったあと、認証済みのユーザ情報を各Controllerで簡単に受け取ることができます。 WebSecurityConfigurerAdapterを継承したクラスに@EnableWebSecurityアノテーションを付与…

Spring Boot - 非同期処理を簡単に書く

Spring Bootでアプリケーション構築をする際に、@Async(org.springframework.scheduling.annotation.Async)アノテーションを利用することで簡単に非同期処理を記述することができます。 以下サンプルです 監査ログを書き込むためのAuditLoggerを定義して、…

Spring Boot - pom.xmlで設定したversion情報とかを取得したい

Spring Bootでアプリケーション構築した際に、pom.xmlで定義したバージョン情報等をアプリ側でも利用したい場合があります。 その際の利用方法は以下の通り。 以下は、pom.xmlの<project><artifactId>と<project><version>を利用する例です 今回利用するpom.xmlは以下のような内容になっているものと</version></project></artifactid></project>…

Spring Boot - コンテキストパスを設定する

Spring BootでWebアプリケーションを構築する際にコンテキストパスを指定するには、 application.yml で「server.contextPath」に値を設定します。 ■指定例 server: contextPath: /sample 仮にコンテキストパス指定なしの場合のアクセス先が以下の通りの場合…

Gson

JavaのJSONライブラリの一つであるGsonを用いたJSONデータの取り扱いサンプルです。 Java BeansとJSON文字列の変換 Java BeansとJSON文字列の変換を行う例です。 Javaオブジェクト ⇒ JSON文字列の変換にはGson#toJsonを使用し、JSON文字列 ⇒ Javaオブジェク…