unhurried

コンピュータ関連ネタがほとんど、ときどき趣味も…

bashrcとbash_profileの使い分け

読み込みタイミング

  • ログイン時
    • .bash_profile.bashrc の順に実行される
  • bash起動時
    • .bashrc のみ実行される

用途

参考

EclipseでのSpring Bootアプリケーション開発

EclipseでSpring Bootアプリケーションを開発するときのTipsをまとめました。

はじめに:Spring Tool Suite(Eclipseプラグイン)を導入する

Eclipseで開発するのであればSTS(Spring Tool Suite)を使うのが常套手段である。

  • ヘルプEclipse マーケットプレース の順に選択する。
  • 検索でSpring ツール(Spring IDE and Spring Tool Suite)を探してインストールする。

新規プロジェクトを作成する

  • ファイル新規その他Spring スターター・プロジェクト の順に選択する。
  • プロジェクト設定ダイアログに必要な設定値を入力する。

アプリケーションを実行(デバッグ)する

  • プロジェクトを右クリック → 実行 もしくは デバッグSpring Boot アプリケーション

補足:Gradle依存関係を解決する

build.gradleに依存ライブラリを追加したときには以下の操作が必要となる。

  • プロジェクトを右クリック → GradleGradleプロジェクトのリフレッシュ

GridSearchCVの結果をヒートマップで表示する

scikit-learnでGridSearchCVを使ってパラメータをチューニングする際に、各パラメータでの結果をヒートマップで表示して観察することがよく行われる。このヒートマップをGridSearchCVオブジェクトから簡単に作成する方法を調査した。

ヒートマップを簡単に作成する方法

GridSearchCV.cv_results_(グリッドサーチの結果が格納されている)を一度pandas.DataFrameに変換して、seaborn.heatmapに渡してヒートマップを表示する。

  • DataFrameに変換することでヒートマップに軸名を別途指定する必要がなくなる。
  • cv_results_をDataFrameに変換するときには必要なキーのみ抽出すること。(cv_results_に含まれる非推奨のキーを参照することで警告が出るのを防ぐため。)

実装例

# GridSearchCVの結果をヒートマップで表示する。
def plot_heatmap_from_grid(grid):
    # チューニング対象のパラメータを特定する。
    params = [k for k in grid.cv_results_.keys() if k.startswith('param_')]
    if len(params) != 2: raise Exception('grid has to have exact 2 parameters.') 

    # ヒートマップの行、列、値に使うキーを定義する。
    index = params[0]
    columns = params[1]
    values = 'mean_test_score'

    # gridから必要なキーのみを抽出する。
    df_dict = {k: grid.cv_results_[k] for k in grid.cv_results_.keys() & {index, columns, values}}

    # dictをDataFrameに変換してseabornでヒートマップを表示する。
    import pandas as pd
    df = pd.DataFrame(df_dict)
    data = df.pivot(index=index, columns=columns, values=values)
    import seaborn as sns
    sns.heatmap(data, annot=True, fmt='.3f')

JerseryのリソースクラスでSpring AOPを使うときの注意点

JerseyのリソースクラスをSpringコンポーネントとして定義をするときに、Springの @ComponentではなくJSR-330の @Name を使うと、@Transactional@Aspect を使ったSpring AOPが効かない。

Jerseyの公式リファレンスによると、リソースクラスには以下のいずれかのアノテーションを使う必要があるとのこと。

  • @Component
  • @Service
  • @Controller
  • @Repository
実装例
@Component // @NamedではAOPが効かない
public class SampleResource { ...

参考

Spring Bootの依存性注入(DI)設定方法

Spring Frameworkの依存性注入(Dependency Injection)を設定する方法をまとめました。

コンポーネントのスキャン対象指定

デフォルトでは @ComponentScan が付与されたクラスのパッケージと同階層以下のパッケージをスキャンする。その他のクラスをスキャン対象にしたい場合はscanBasePackageにパッケージ名を指定する。

// @SpringBootApplicationなどの複合アノテーションに指定することもできる。
@ComponentScan(scanBasePackages={"com.example"})

依存性注入(DI)設定

Springアノテーションを使う場合

依存するオブジェクトを private final なメンバとして定義して、コンストラクタで依存オブジェクトを引数で受け取るコンストラクタを定義する。Lombokを使う場合は下記のように記載できる。

コンポーネント定義
@Component
class ComponentA { ...
DI設定
@RequiredArgsConstructor
class ClassA {
    // @Autowiredは省略できる。
    private final ComponentA componentA;
    ...

以前はfinalでないメンバもしくはそのSetterに@Autowiredを指定するのが主流であった。

class ClassA {
    @Autowired
    private ComponentA componentA;
    ...
class ClassA {
    private ComponentA componentA;
    @Autowired
    public void setComponentA(ComponentA componenA) {
        ...

コンストラクタを利用することには以下のメリットがあるため、現在はこちらが推奨されている。

  • DIなしでも利用可能なモジュールになる。(利用側でコンストラクタで依存関係を設定すればよい。)
  • final 修飾子を付けられる。(DIオブジェクトを格納する変数を書き換えることは通常ない。)

JSR-330アノテーションを使う場合

Java標準なので他のDIコンテナに乗り換えやすい。

コンポーネント定義
@Named // もしくは@ManagedBean
class ComponentA { ... }
DI設定

コンストラクタ(もしくはSetter)に@Injectを指定する。(Setterでも可。)

@RequiredArgsConstructor(onConstructor=@__(@Inject))
class ClassA {
    private final ComponentA componentA;
    ...

もしくは、メンバに@Injectを指定する。

class ClassA {
    @Inject
    private ComponentA componentA;
    ...

参考

Javaカバレッジ計測ライブラリ

Javaのテストカバレッジを計測できるオープンソースライブラリの現状を調査してみました。

要約

Coberturaは開発が停止しているため、今後はJaCoCoもしくはCloverが主流となりそう。ただしCloverは最近オープンソース化されたため、今後の継続開発(=コミュニティの活発度)はあまり見えていない。

主要な3ライブラリの概要

JaCoCo

  • 最新版は2018年1月リリースのバージョン0.8.0(2018年3月時点)。
  • 実行時に計測(on-the-fly instrumentation)できないクラスに対して、クラスファイルに計測処理を事前に追加する(offline instrumentation)ことができる。

Cobertura

  • 開発は2015年2月で止まっている。
  • Java 8に未対応でLambda式などの記法があるとその部分の計測ができない。
  • 他のライブラリでは対応していない複数のモジュールから構成されるプロジェクトに対する計測レポートの集約に対応している。

Clover

その他のライブラリなど

EclEmma

JMockit

参考

Spring Boot DBコネクションプール

Spring Boot(Spring Data JPA)でコネクションプールを設定する方法をまとめました。

ライブラリの自動選択

コネクションプールライブラリは以下の順序で選択される。(クラスパスにライブラリがあるか確認し、あればそのライブラリを選択し、なければ次のライブラリを確認する。)

  1. HikariCP
  2. Tomcat JDBC Connection Pool
  3. Commons DBCP2

spring-boot-starter-jdbc もしくは spring-boot-starter-data-jpa を利用している場合は、HikariCPが依存関係として解決されるため、何も設定していなければHikariCPが選択される。

ライブラリの指定方法

application.properties(もしくはapplications.yaml)の spring.datasource.type プロパティに利用したいライブラリのDataSource( javax.sql.DataSource 継承クラス)を指定することで変更ができる。

HikariCPの場合

設定可能な項目はConfigurationを参照。

spring:
  datasource:
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost/request_log
    username: user
    password: password
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      maximum-pool-size: 20
      minimum-idle: 10
Tomcat JDBC Connection Poolの場合

設定可能な項目はCommon Attributesを参照。

spring:
  datasource:
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost/request_log
    username: user
    password: password
    type: org.apache.tomcat.jdbc.pool.DataSource
    tomcat:
      max-active: 20
      min-idle: 10

参考