MavenプロジェクトをGradleプロジェクトに変換する
MavenのプロジェクトをGradleのプロジェクトに変換したいときがあります。
変換する
- 変換前ディレクトリ
下記のディレクトリをGradleプロジェクトに変換したい
$ ls README.md cdk.json pom.xml src
$ gradle init Welcome to Gradle 6.5! Here are the highlights of this release: - Experimental file-system watching - Improved version ordering - New samples For more details see https://docs.gradle.org/6.5/release-notes.html Starting a Gradle Daemon (subsequent builds will be faster) Found a Maven build. Generate a Gradle build from this? (default: yes) [yes, no] yes // <- yes と入力する
Mavenにしかないものとかは動かないと思うので、それは一つずつ対応していくいかないです。
flywayのmultiple databases migration の設定メモ
本家はこちら
flyway でdb migrateしているが、公式ドキュメントではmultiple schemaは記述の仕方でなんとかなるんだけど、DBが分かれた場合は、地道にタスクを書くしかないっぽくて、そんなの嫌なのでちょっとメモ。
全体構成
一旦こんな感じのディレクトリ構成にしてみる。
├── build.gradle
├── conf
│ ├── example-admin.conf
│ └── example.conf
└── src
└── main
└── resources
├── example
│ └── migration
│ ├── V201801060359__create_account_table.sql
│ └── V201801070137__create_table.sql
└── example-admin
└── migration
├── V201801060359__create_account_table.sql
└── V201801070137__create_table.sql
resourcesディレクトリ
SQLはsrc/main/resources配下にexampleとexample-adminの配下にマイグレーション用のSQLファイルがおいてある。
build.gradle
汚いけど、taskを動的生成する
build.gradle
repositories {
jcenter()
}
plugins {
id 'org.flywaydb.flyway' version '6.4.1'
id 'java'
}
["example", "example-admin"].each { name ->
task "${name}FlywayMigrate" (type: org.flywaydb.gradle.task.FlywayMigrateTask) {
configFiles = ["conf/${name}.conf"]
}
task "${name}FlywayBaseline"(type: org.flywaydb.gradle.task.FlywayBaselineTask) {
configFiles = ["conf/${name}.conf"]
}
task "${name}FlywayClean"(type: org.flywaydb.gradle.task.FlywayCleanTask) {
configFiles = ["conf/${name}.conf"]
}
task "${name}FlywayInfo"(type: org.flywaydb.gradle.task.FlywayInfoTask) {
configFiles = ["conf/${name}.conf"]
}
}
こんな感じで、タスクを動的生成するようにする
confディレクトリ
ここにはDBとスキーマの定義ファイルがおいてある confファイルはこんな感じ
conf/example.conf
flyway.url=jdbc:postgresql://localhost:5432/example
flyway.user=example
flyway.password=example
flyway.schemas=public
flyway.locations=filesystem:src/main/resources/example/migration
conf/example-admin.conf
記事の効率的な読み方を試行錯誤
本家はこちら
最近、追う記事が多くてキャッチしきれなくなってきたので、スタイルを変えてみた。
もともと
TechCrunchとかはてぶとかTwitterとかで流れているものを、いちいち中身を追ってました。しかし、この方法だとどんどん流れるし、読んでて調べないとわからないことを調べているとどんどん流れていってしまいます。見る範囲が狭いときは、この方法でもよかったが、プログラミング、AWS、AI、マーケティング、英語、ビジネス、IR... とか増えていったときに、もう多すぎて流れていってしまって見落としが多いことに気づき、やり方を見直しを行いました。
まず、読むだろう記事をPocketにストックしていくようにしました。以前はPocketを使っていたんですが、ここ2,3年全然つかっていなく、アップデートを確認してなかったんですが、音声再生の機能が格段にあがってました。コードが貼ってあるような記事はちょっと辛いのですが、それ以外のビジネス関係の読み物にはかなりあっていて、ほとんどこれで再生して聞いています。聞いている間に別の記事をストックしていくという感じで、短縮もできています。
Evernote or Notion
Pocketで格納した記事で残したいものは、さらにEvernoteとかNotionにシェアします。そうするとEvernote or NotionでWebクリップをしてくれるので残せます。
まとめ
気になったタイトルとかキーワードの記事はさっとPocketにためて、Pocketからまとめて読んだり、音声再生をして聞いたりして、残したいものはEvernoteかNotionにWebクリップすれば、かなりいいスクラップブックになるかなと思いました。他にもいいやり方があれば教えていただけるとー。
MyBatisが色々てんこ盛りになっていい感じになっている件
本家はこちら
久しぶりにSpringBootの環境構築をやろうかと思い、ORMをどうするか選定していたところ、MyBatisが結構進化していたので、メモ。
MyBatis3DynamicSql
- XMLが不要になる
- コード量が小さくなる
- JavaでタイプセーフにSQLがかける(JOOQみたい)
- https://mybatis.org/generator/quickstart.html
こんな感じでかけます。
List<TableCode> records = mapper.selectByExample()
.where(id, isEqualTo(3))
.build()
.execute();
List<TableCode> records = mapper.selectByExample()
.where(id, isEqualTo(3))
.or(description, isLike("f%"))
.build()
.execute();
List<TableCode> records = mapper.selectByExample()
.where(id, isLessThan(10), and(description, isEqualTo("foo")))
.or(description, isLike("b%"))
.orderBy(id.descending())
.build()
.execute();
JOOQみたいに、タイプセーフでSQLがかけるのはとてもすごい進化だと思います。
FreeMarker Tempalte
前に書いたとおりのFreeMarker Templateは健在。XMLがいやでFreeMarkerにしたけど、複雑なクエリはやはりJavaコードじゃなくて、素のSQLの方がいいイメージなので、継続して使用します。
sample.ftl
select
*
from
sample_table
where
id = <@p name="param.id" />
こんな感じでかける。
from句とかを別のftlファイルにして、includeして使うことも可能です。
Thymeleaf Template
Doma2とかでやっている2WaySQLがThymeleaf Templateで実現している。Doma2より書き方は野暮ったいけど、一応2waySQLはできる。
SELECT * FROM names
WHERE 1 = 1
/*[# th:if="${not #lists.isEmpty(ids)}"]*/
AND id IN (/*[# mb:p="ids"]*/ 1 /*[/]*/)
/*[/]*/
ORDER BY id
MyBatis Migrate
これは前からあったみたいなんだが、Flywayの陰に隠れて知らなかった。 機能的には十分っぽいので、試してみる。
詳細 => https://mybatis.org/migrations/
Mybatis Log Plugin (Intellijのみ)
これがあると、条件分岐があって、引数のバインドが全部終わったSQLを出力してくれるので、デバッグに便利です。 必需品かと思います。(Domaは標準でありますが)
https://plugins.jetbrains.com/plugin/10065-mybatis-log-plugin
最後に
タイプセーフでSQLかけるし、2WaySQLあるし、Migrateあるし、なんかMyBatisで全部OKなんじゃないかとおもいました。おそらくThymeleafは
GraalVMのnative-imageを少し試してみる
本家はこちら
GraalVMのnative-imageがそろそろ色々使えそうなので、試してみる。
Javaやってる人は SDK Man
は入ってると思うので、それ前提でメモします。
(SDK Man のインストールはこちら -> https://sdkman.io/ )
GraalVM のインストール
まずは、GraalVMのインストールを行う。
$ sdk install java 20.0.0.r11-grl
GraalVMを使ってnative-imageをinstallする
GraalVMのパッケージツールでnative-imageをinstallする。
$ gu install native-image
これでnative-image
のinstallが完了。
かんたんなJavaコードを書く
Sample.java
class Sample {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
$ javac Sample.java
コンパイルすると、classファイルができる。
Sample.class
native-imageでコンパイルする
$ native-image Sample sample // 最後のファイル名を指定しないと、デフォルトで小文字になる
下記、ファイルができる。
Sample
このファイルは実行できる。
./sample
比較する
JavaVMでの実行とnative-imageでの実行を比較する
$ time ./sample
real 0m0.007s
user 0m0.003s
sys 0m0.003s
======
$ time javac Sample
real 0m0.179s
user 0m0.110s
sys 0m0.035s
JavaVMの起動速度が入ってしまっていると思うが、結構違う。
JVMの起動後にどのくらい違うのかはまた次回。
あと、こんな1ファイルで使う人もいないと思うので、Jar
での作成方法もまた次回。
MyBatisが色々てんこ盛りになっていい感じになっている件
本家はこちら
久しぶりにSpringBootの環境構築をやろうかと思い、ORMをどうするか選定していたところ、MyBatisが結構進化していたので、メモ。
MyBatis3DynamicSql
- XMLが不要になる
- コード量が小さくなる
- JavaでタイプセーフにSQLがかける(JOOQみたい)
- https://mybatis.org/generator/quickstart.html
こんな感じでかけます。
List<TableCode> records = mapper.selectByExample()
.where(id, isEqualTo(3))
.build()
.execute();
List<TableCode> records = mapper.selectByExample()
.where(id, isEqualTo(3))
.or(description, isLike("f%"))
.build()
.execute();
List<TableCode> records = mapper.selectByExample()
.where(id, isLessThan(10), and(description, isEqualTo("foo")))
.or(description, isLike("b%"))
.orderBy(id.descending())
.build()
.execute();
JOOQみたいに、タイプセーフでSQLがかけるのはとてもすごい進化だと思います。
FreeMarker Tempalte
前に書いたとおりのFreeMarker Templateは健在。XMLがいやでFreeMarkerにしたけど、複雑なクエリはやはりJavaコードじゃなくて、素のSQLの方がいいイメージなので、継続して使用します。
select * from sample_table where id = <@p name="param.id" /> <pre><code>こんな感じでかける。 from句とかを別のftlファイルにして、includeして使うことも可能です。 ## Thymeleaf Template Doma2とかでやっている2WaySQLがThymeleaf Templateで実現している。Doma2より書き方は野暮ったいけど、一応2waySQLはできる。 </code></pre> SELECT * FROM names WHERE 1 = 1 /<em>[# th:if="${not #lists.isEmpty(ids)}"]</em>/ AND id IN (/<em>[# mb:p="ids"]</em>/ 1 /<em>[/]</em>/) /<em>[/]</em>/ ORDER BY id
MyBatis Migrate
これは前からあったみたいなんだが、Flywayの陰に隠れて知らなかった。 機能的には十分っぽいので、試してみる。
詳細 => https://mybatis.org/migrations/
Mybatis Log Plugin (Intellijのみ)
これがあると、条件分岐があって、引数のバインドが全部終わったSQLを出力してくれるので、デバッグに便利です。 必需品かと思います。(Domaは標準でありますが)
https://plugins.jetbrains.com/plugin/10065-mybatis-log-plugin
NginxのCache設定
本家はこちら
Nginx + SpringBoot の構成で環境を構築している。
まだ、静的ファイル(.css,.js,.jpg,.gif,.map) はCDNを使わない感じでなんとでもなる規模だが、アクセス数が増えていくと、ちょっとSpringBootだけだとレスポンスが遅くなってきたので、対策する。
静的ファイルはSpringBootで返して、Nginxでキャッシュする設定にする。
SpringBootは設定は特になし。
Nginxに下記の設定を行う。
server {
location / {
// 省略
proxy_ignore_headers Cache-Control Expires;
proxy_cache cachezone;
proxy_cache_valid 404 5m;
// 省略
add_header X-Cache $upstream_cache_status [always];
}
}
proxy_ignore_headers Cache-Control Expires;
この設定が必要です。
キャッシュがヒットしてるかどうかは、add_header
で確認できますが、HTTPステータスが正常系しか動作しません。
add_header
に always
をつけると、どのHTTPステータスでもでてくので、確認できます。
このようにすると、ある程度の規模までは、CDN使わずに、サクサクいけます。 最近ではHTTP/2でコネクション数の上限もほとんど気にしなくていいですし。