ソフトウェアエンジニアの日常の雑記

日々思ったことをまとめます

JavaのEnumとSwitch式の良い関係

はじめに 今回は、私が好きで多用しているEnumとSwitch式の良い関係を書きます。 enum Enumは、Java1.5(Tiger)のときに入った機能で、EffectiveJava(第3版)でも、第6章 enumとアノテーション とアノテーションとセットですが、1章を割かれるくらいの機能に…

MavenプロジェクトをGradleプロジェクトに変換する

MavenのプロジェクトをGradleのプロジェクトに変換したいときがあります。 変換する 変換前ディレクトリ 下記のディレクトリをGradleプロジェクトに変換したい $ ls README.md cdk.json pom.xml src 変換する pom.xmlがあるディレクトリで、 gradle init を…

flywayのmultiple databases migration の設定メモ

本家はこちらflyway でdb migrateしているが、公式ドキュメントではmultiple schemaは記述の仕方でなんとかなるんだけど、DBが分かれた場合は、地道にタスクを書くしかないっぽくて、そんなの嫌なのでちょっとメモ。 全体構成 一旦こんな感じのディレクトリ…

記事の効率的な読み方を試行錯誤

本家はこちら最近、追う記事が多くてキャッチしきれなくなってきたので、スタイルを変えてみた。 もともと TechCrunchとかはてぶとかTwitterとかで流れているものを、いちいち中身を追ってました。しかし、この方法だとどんどん流れるし、読んでて調べないと…

MyBatisが色々てんこ盛りになっていい感じになっている件

本家はこちら久しぶりにSpringBootの環境構築をやろうかと思い、ORMをどうするか選定していたところ、MyBatisが結構進化していたので、メモ。 MyBatis3DynamicSql XMLが不要になる コード量が小さくなる JavaでタイプセーフにSQLがかける(JOOQみたい) https:…

GraalVMのnative-imageを少し試してみる

本家はこちらGraalVMのnative-imageがそろそろ色々使えそうなので、試してみる。 Javaやってる人は SDK Man は入ってると思うので、それ前提でメモします。 (SDK Man のインストールはこちら -> https://sdkman.io/ ) GraalVM のインストール まずは、GraalV…

MyBatisが色々てんこ盛りになっていい感じになっている件

本家はこちら久しぶりにSpringBootの環境構築をやろうかと思い、ORMをどうするか選定していたところ、MyBatisが結構進化していたので、メモ。 MyBatis3DynamicSql XMLが不要になる コード量が小さくなる JavaでタイプセーフにSQLがかける(JOOQみたい) https:…

NginxのCache設定

本家はこちらNginx + SpringBoot の構成で環境を構築している。 まだ、静的ファイル(.css,.js,.jpg,.gif,.map) はCDNを使わない感じでなんとでもなる規模だが、アクセス数が増えていくと、ちょっとSpringBootだけだとレスポンスが遅くなってきたので、対策す…

IntelliJでNuxt.jsのdebugできるようにする(chrome/opera)

本家はこちらIntelliJでNuxt.jsをdebug(breakpoint)できるようにしたくて、設定するメモ。 nuxt.config.jsを変更する 下記の3行を追加する extend(config, ctx) { if (ctx.isDev && ctx.isClient) { //追加 config.devtool = 'eval-source-map' //追加 } //…

IntellijのNuxt.jsでimportのailiasを設定したい

本家はこちらIntellijのvueとかjsのサポートがかなりよくなってきたので、1IDEで完結した欲求がでてきました。 vscodeだとある程度勝手に認識してくれるんだけど、Intellijはできないみたいで設定してあげる必要がある模様。 nuxt.config.jp module.exports …

Intellijでdebug実行すると warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

本家はこちらwarning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended ブートストラップクラスパスが追加されているため、共有はブートローダークラスでのみサポートされます ということらしいが、intel…

intellijでdebugするとこの警告がでてくる warning: forcing TieredStopAtLevel to full optimization because JVMCI is enabled

本家はこちらOpenJDK 64-Bit GraalVM CE 19.3.0 warning: forcing TieredStopAtLevel to full optimization because JVMCI is enabled JVMCIが有効になっているため、TieredStopAtLevelを完全に最適化する こういうことらしいが、gradle bootRun では発生し…

Vue.jsのcomputedで引数を使いたい

本家はこちらVuejsで便利なcomputedですけど、引数取りたいって思うタイミングがあり検証。 ちなみに引数とりたいタイミングは、ループでテーブル作成してるときとかです。 lambda式(アロー関数)を使えばできました。 <template> <div id="app"> <p>sample('a'):{{sample('a')}}</p> // <- </div></template>…

mapとflatmapのメモ

本家はこちらmapとflatmapのメモ. map: 個数が変わらない。2個渡したら2個返ってくる flatmap: streamに変換させて、それを合成する。戻ってくるのはstreamが1つ。flatmapはstreamを合成してくれる感じのいいやつ。 @RunWith(JUnit4.class) public class Sam…

mapとflatmapのメモ

本家はこちらmapとflatmapのメモ. map: 個数が変わらない。2個渡したら2個返ってくる flatmap: streamに変換させて、それを合成する。戻ってくるのはstreamが1つ。 @RunWith(JUnit4.class) public class SampleTest { @Test public void test() { // map Arr…

Vuejsでselect boxにdefault valueを設定するには?

本家はこちらVuejsでselectboxにdefault valueを設定するのにいつも覚えられないので、メモ <select v-model="args"> <option :value="null" disabled>Please select...</option> <option :value="'A'">A</option> <option :value="'B'">B</option> </select> :value="null" disabled を入れるっていうのを毎回調べてる気がする。。。

Spring webfluxでGETパラメータが長いときの ステータス413(Request Entity Too Large)の対処

本家はこちらSpring webfluxでGetパラメータが長いときに、HTTPステータス413(Request Entity Too Large)が発生して少々ハマった。 application.yamlとかで解決はできない感じで下記ソースにて解決 なお、SpringBoot@2.0.7 @Component public class NettySer…

Mockitoでprivateメソッドのテストっぽいこと

本家はこちらReflectionTestUtilsを使用する fieldの場合 ReflectionTestUtils.setField を使う public Sample SampleRepositoryImpl{ private String parameter; } @Runwith(SpringRunner.class) class SampleRepositoryImplTest(){ @InjectMocks private S…

Mockitoでprivateメソッドのテストっぽいこと

本家はこちらReflectionTestUtilsを使用する fieldの場合 ReflectionTestUtils.setField を使う public Sample SampleRepositoryImpl{ private String parameter; } @Runwith(SpringRunner.class) class SampleRepositoryImplTest(){ @InjectMocks private S…

JavaのFunction<T,R>の合成はかなり便利

本家はこちらJava8から導入されたFunctionインターフェースはかなり便利な機能で多用している。特に関数合成が便利なので、ぜひ利用してほしい。 Functionインターフェース define Function<String, Integer> string2Integer = s -> Integer.valueOf(s); Functionインターフェ</string,>…

Vue.jsでファイルをdrag and dropする

本家はこちらVue.jsでファイルのdrag and drop をするときにdomイベントをどうやって渡すんだ?ってなったので、メモ。 公式のドキュメントに書いてあったので イベントハンドラ でそれを参照する。 $event を使うことででDOMイベントを渡すことができる。 …

Vue.jsでファイルをdrag and dropする

本家はこちらVue.jsでファイルのdrag and drop をするときにdomイベントをどうやって渡すんだ?ってなったので、メモ。 公式のドキュメントに書いてあったので イベントハンドラ でそれを参照する。 $event を使うことででDOMイベントを渡すことができる。 …

Intellijのgoogle-java-format plugin を外した.

本家はこちらちょっと思うところがあって、google-java-format plugin を外した。 このプラグインがあると、結構強制力が強くて、indent4 にしたいときにできなかったり、import文を変えたかったりしたときにできなかったりとか・・・あったので、外しました…

Java8の@FunctionalInterfaceを使う

本家はこちら関数インターフェースのPredicateとかFunctionがあるのであんまり使わないけど、引数とか3つ以上のものはないのでつくる必要がある。 基本的に抽象メソッドを1つしかもっていなければOK。defaultメソッドはいくつもっていてもOKです。(ラムダ式…

Javaの関数インターフェース再入門

本家はこちらJavaのよく使ってる関数インターフェース群をまとめようかとおもう。 現場ごとに説明のためのドキュメントを書くのがしんどくなってきたからというのが本音かも。 predicate 断言するって意味。戻り値はBoolean。 引数1つとって Predicate<String> matc</string>…

springboot devtools のauto restart を疑似高速化する

本家はこちらきっかけ springbootとintellijなどIDE使ってると、コードの補完はめちゃされるし、Javaって便利だなーとか先人の方たちありがとう!って気持ちでコード書いてるんですけど、コード変更時に変更内容がHotswapで反映されるならいいんですけど、そ…

springboot devtools のauto restart を疑似高速化する

本家はこちらきっかけ springbootとintellijなどIDE使ってると、コードの補完はめちゃされるし、Javaって便利だなーとか先人の方たちありがとう!って気持ちでコード書いてるんですけど、コード変更時に変更内容がHotswapで反映されるならいいんですけど、そ…

mybatisでカスタムクエリをxmlで書くのは辛いので、freemarker templateにする

本家はこちらmybatisでカスタムでクエリ書くときに、標準だとxml形式で書かなきゃいけなくて、結構しんどい。 カンタンに書くと下のような感じ <mapper namespace="jp.sample.MapperCustom"> </mapper>

mybatisでカスタムクエリをxmlで書くのは辛いので、freemarker templateにする

本家はこちらmybatisでカスタムでクエリ書くときに、標準だとxml形式で書かなきゃいけなくて、結構しんどい。 カンタンに書くと下のような感じ <mapper namespace="jp.sample.MapperCustom"> </mapper>

SpringReactive(webflux)でAOPする際に@EnableReactiveMethodSecurityの@hasAuthoritiesを使うとうまくいかないのを回避する

本家はこちら下記のようにcontrollerでのリクエストのログを認証情報付きで出力しようとする。 @AfterReturning(value = "execution(* xxx.xxx.controller..*.*(..))") public void execNormalControllerMethod(JoinPoint jp) { /// ログ出力処理 } しかし、…