2017年11月5日日曜日

Semantic-UIでCalendar UI

Semantic-UI-Calendarを使うと、Date Pickerが使えるようになる。

Semantic-UI-CalendarのJavaScriptとスタイルシートを読み込むようにする。
<script src="//cdnjs.cloudflare.com/ajax/libs/semantic-ui-calendar/0.0.8/calendar.min.js"
        type="text/javascript"></script>
<link rel="stylesheet" type="text/css"
      href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui-calendar/0.0.8/calendar.min.css"/>

日付項目を作る。
<div class="field ui calendar required">
  <label>日付</label>
  <div class="ui input left icon">
    <i class="calendar icon"></i>
    <input type="text" name="date" placeholder="日付">
  </div>
</div>

JavaScriptを使用してカレンダーのタイプを設定する。
typeにdateを設定しているので、日付の項目となる。
$('.ui.calendar').calendar({
  type: 'date'
})

これで、画像のような日付入力欄が作成できる。


なおデフォルトのフォーマットは画像のような形になる。


フォーマットの変更は、JavaScriptを使って行う。例えば、yyyy/mm/ddにしたい場合は、このようにする。
$('.ui.calendar').calendar({
  type: 'date',
  formatter: {
    date: function (date) {
      var day = ('0' + date.getDate()).slice(-2);
      var month = ('0' + (date.getMonth() + 1)).slice(-2);
      var year = date.getFullYear();
      return year + '/' + month + '/' + day;
    }
  }
})

これで、フォーマットがyyyy/mm/dd形式になる。

2017年10月22日日曜日

AssertJ Assertions Generatorを使ってクラス専用のアサーションを生成する

使い方や生成対象などは、AssertJ Assertions Generatorに書かれています。

MavenやGradleプラグインやshを使うパターンがあるみたいですが、Gradleプラグインを使った方法を試してみます。

build.gradle

Gradleプラグインの使い方は、Githubに書かれています。
自動生成したクラスは、置き場所を変えたほうが分かりやすいのでsrc-gen配下に出力しています。
plugins {
  id "com.github.opengl-BOBO.assertjGen" version "1.1.8"
}

// assertj-gen
ext {
  assertjGenPreConfig = [
      'assertjGenerator': 'org.assertj:assertj-assertions-generator:2.1.0',
      'sourceSets': ['main]
  ]
}

sourceSets.test.java.srcDirs += 'src-gen/test/java'

assertjGen {
  // test.Hogeがアサーションを生成するクラス。
  // パッケージ指定もできる
  classOrPackageNames = ['test.Hoge']
  outputDir = 'src-gen/test/java'
}

生成対象のクラス

package test;

public class Hoge {

    public final int hoge;

    public Hoge(final int hoge) {
        this.hoge = hoge;
    }
    
    public String getFuga() {
        return "fuga";
    }
}

アサーションの生成

assertjGenを使用してアサーションを生成します。

$ ./gradlew assertjGen 

> Task :assertjGen
07:22:13.289 INFO  o.a.a.g.c.AssertionGeneratorLauncher - Generating assertions for classes [class test.Hoge]
07:22:13.310 INFO  o.a.a.g.c.AssertionGeneratorLauncher - Generating assertions for class : test.Hoge
07:22:13.326 INFO  o.a.a.g.c.AssertionGeneratorLauncher - Generated Hoge assertions file -> /home/hoge/IdeaProjects/test-pj/src-gen/test/java/./test/HogeAssert.java

生成されたクラス

下の画像のようなアサーションクラスが生成されます。

生成されたクラスを使用する

@Test
void test() {
    final Hoge hoge = new Hoge(100);
    HogeAssert.assertThat(hoge)
            .hasHoge(10);
}

テスト結果もわかりやすく出力されます。
Expecting hoge of:
  <test.Hoge@3c72f59f>
to be:
  <10>
but was:
  <100>

2017年10月14日土曜日

[Oracle]データベースバッファキャッシュを明示的に破棄してみる

データベースバッファキャッシュは下のSQLで明示的に破棄できる。
alter system flush buffer_cache;

破棄されたことを確認する


破棄前の統計情報
SQL> select * from person where id = 1;

Elapsed: 00:00:00.01

Execution Plan
----------------------------------------------------------
Plan hash value: 1167617095

--------------------------------------------------------------------------------------------
| Id  | Operation      | Name    | Rows  | Bytes | Cost (%CPU)| Time    |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |     |  1 | 17 |  3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| PERSON    |  1 | 17 |  3   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN     | SYS_C0013811 |  1 |    |  2   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("ID"=1)


Statistics
----------------------------------------------------------
   0  recursive calls
   0  db block gets
   4  consistent gets
   0  physical reads
   0  redo size
 469  bytes sent via SQL*Net to client
 540  bytes received via SQL*Net from client
   1  SQL*Net roundtrips to/from client
   0  sorts (memory)
   0  sorts (disk)
   1  rows processed


データベースバッファキャッシュを破棄する。
SQL> alter system flush buffer_cache;

System altered.

同じ問い合わせを実行するとphysical readsが増えているので、データファイルからブロックが読み取られていることが確認できる。
SQL> select * from person where id=1;

Elapsed: 00:00:00.01

Execution Plan
----------------------------------------------------------
Plan hash value: 1167617095

--------------------------------------------------------------------------------------------
| Id  | Operation      | Name    | Rows  | Bytes | Cost (%CPU)| Time    |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |     |  1 | 17 |  3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| PERSON    |  1 | 17 |  3   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN     | SYS_C0013811 |  1 |    |  2   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("ID"=1)


Statistics
----------------------------------------------------------
   1  recursive calls
   0  db block gets
   4  consistent gets
  24  physical reads
   0  redo size
 469  bytes sent via SQL*Net to client
 540  bytes received via SQL*Net from client
   1  SQL*Net roundtrips to/from client
   0  sorts (memory)
   0  sorts (disk)
   1  rows processed

2017年9月29日金曜日

GradleでOracle Maven RepositoryからJDBCドライバを取得する方法

$HOME/.gradle/gradle.propertiesにOTNのアカウント情報を設定

OTNの自分のアカウント情報を設定する。
otn_user=hoge
otn_password=fuga

build.gradleにOracle Maven Repositoryの情報を追加

mavenリポジトリの設定とともに、credentialsを使用してリポジトリにアクセスするためのユーザ名とパスワードを指定する。
ユーザ名とパスワードは、gradle.propertiesに設定したものを参照する。
  maven {
  url "https://www.oracle.com/content/secure/maven/content"
  credentials {
    username otn_user
    password otn_password
  }
}

JDBCドライバの追加

使いたいバージョンを設定する。
compile 'com.oracle.jdbc:ojdbc8:12.2.0.1'

dependenciesで確認

参照できました。(UCPも落ちてくるのか)
\--- com.oracle.jdbc:ojdbc8:12.2.0.1
     \--- com.oracle.jdbc:ucp:12.2.0.1
          \--- com.oracle.jdbc:ojdbc8:12.2.0.1 (*)

2017年9月24日日曜日

sqlplusでプラガブルデータベースに接続する

sqlplus ユーザ名@プラガブルデータベース名/パスワードで接続する。

sqlplus hoge@pdb1/hoge@orcl

2017年9月4日月曜日

Spring BootのthymeleafでDate and Time api

Spring BootのThymeleafでDate and Time apiを使う手順

thymeleaf-extras-java8timeを依存に追加

gradleであれば下のように依存を追加する。
Thymeleaf 3.0以上の場合は、3系のバージョンを指定する。
compile 'org.thymeleaf.extras:thymeleaf-extras-java8time:2.1.0.RELEASE'

thymeleafでfomatなどを行う

temporals.formatを使ってフォーマットを行う。
<span th:text="${#temporals.format(nowDateTime, 'yyyy/MM/dd HH:mm:ss')}"></span>

その他

昔は、Java8TimeDialectをBeanとして登録しないとダメだったようですが、下のコミットの対応によりthymeleaf-extras-java8timeを依存に追加するだけでviewで利用できるようになったようです。

https://github.com/spring-projects/spring-boot/commit/c68ffa5ba059781ab2c0fb21eed7a541036e837d

2017年8月30日水曜日

thymeleafでdata-から始まる属性に値を設定する

th:httrを使う。
<div th:attr="data-sample=${sample.name}"></div>

複数ある場合はカンマで区切って列挙する。
<div th:attr="data-sample=${sample.name},data-sample2=${sample.name2}"></div>