Deep Dive into MyBatis

検証環境 java 11.0.1 2018-10-16 LTS MyBatis 3.4.6 サンプルコード 以下を実行しながら、処理の流れを追っていく。 複雑な箇所は適宜、シーケンス図を作成する。(メインの流れではないと判断したところは適宜省略して記載するので、正確さにはやや欠けます…

CentOS パッケージの更新履歴やバグを確認する

yum-cronでパッケージを自動更新していると、いつの間にかパッケージが思った動作をしなくなることがある。このとき、調べた方法のメモ。 検証バージョン ]$ uname -a Linux localhost.localdomain 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UT…

Java いまふたたびのJDBC

この記事は Java Advent Calendar 2018 の 9 日目のエントリーです。 流行をとらえた話題が多いなか、10~15年前感のあるコンテンツです。化石です。 しかし化石とはいえ、よく使う技術ではあります。 ということで、何気なく使ってたけど改めて勉強し直しま…

Micrometer Spring Boot アプリケーションのモニタリング

2018/10/31 の Spring Festで『Micrometer/Prometheusによる大規模システムモニタリング 〜ヤフーインターネット広告システムでの導入事例〜』というセッションを聴講し、興味を持ったので調べました。 Micrometerは、Spring Boot Actuatorが内部で利用して…

Spring MultipartFile アップロードが完了しないとControllerのメソッドは呼ばれないぞ!

MuitipartFileとは? MultipartFileとは、ファイルのアップロード機能をアプリケーションコード内で透過的に扱うためのクラスです。アップロード機能の実装は、Servlet 3.0のファイルアップロードか、Apache Commons Fileuploadから選ぶことができます。 具体…

BLOBをデータベースで管理する

はじめに 突然ですが、皆さんはアプリケーションで扱うBLOBデータをどこに保存しているでしょうか?大きく分けると、以下のいずれかになると思います。 ファイルストレージ データベース オブジェクトストレージ いずれも一長一短ありますが『SQLアンチパタ…

Rxjava ConnectableFlowable(Hotストリーム)のオペレータ

以下のバージョンで検証しました。 pom.xml <dependency> <groupId>io.reactivex.rxjava2</groupId> <artifactId>rxjava</artifactId> <version>2.1.14</version> </dependency> ConnectableFlowable ConnectableFlowableはHotなストリームで、複数のSubscriberに同じストリームを購読させるときに利用するクラス。 参考 ConnectableFlowable Javadoc p…

Rxjava subscribeOnとobserveOnで実行スレッドを指定する

課題 Rxjavaで以下のようなコードを実行すると、 @Test public void 実行スレッドを切り替える() throws InterruptedException { Flowable.just("hello") .doOnNext(val -> logger.info("emit")) .map(o -> o) .doOnNext(val -> logger.info("map")) .subscr…

Docker PostgreSQLイメージを利用する

目的 検証環境 PostgreSQLを起動する PostgreSQLに接続する ホストからアクセスする コンテナを利用してアクセスする パターン1 コンテナを利用してアクセスする パターン2 PostgreSQLコンテナの停止 PostgreSQLコンテナの再開 初期データを設定する Postgre…

Rxjava onBackpressureBufferはいつ溢れるか?

前提知識 RxJavaにはバックプレッシャと呼ばれる、流量制御の仕組みがある。 参考 詳解RxJava2:Backpressureで流速制御 onBackpressureBuffer PublisherがSubscriberの消費スピードよりも早くデータを作った場合、バッファに生成されたデータを溜めておきた…

Vuejs 追加と編集フォームを共通化する

課題 追加と編集フォームは同じデータを操作することが多い。そのため、各フォームを異なるコンポーネントとして作成するとほぼ同じ処理をするコンポーネントが2つできることになり、入力チェックやレイアウトの調整に2重のコストがかかる。そのため、追加と…

Makefile 動的な変数の使い分け

課題 Makefileのターゲット内で動的に変数を設定したい。 解決方法 変数がターゲット実行時に確定する場合 環境変数を利用する シェルのコマンド置換$(...)を利用する Makeのshell関数$(...)だと、ターゲット実行前に実行されるから 各行を;でつなげて、変数…

Vuejs formをサブミットするときのポイント

SPAの場合はformタグに任せてデータをサブミットすることは稀で、通常は自身で定義したハンドラを呼び出してAjax通信を行うことが多い。 課題 以下のように<button type="submit" @click="exec">を使ってボタン押下時のハンドラを実行するのは危ない。 <template> <form> <input type="text" placeholder="username" /> <input type="text" placeholder="password" /> <button type="submit" @click="exec">submit</button></form></template></button>

L7ロードバランサとL4ロードバランサ

ロードバランサとは DNSラウンドロビン DNSラウンドロビンでは対応できないこと L7ロードバランサ パケットの流れ L4ロードバランサ IPアドレス変換方式(NAT方式) パケットの流れ MACアドレス変換方式(DSR方式) パケットの流れ 構築してみる L7ロードバラン…

Vuejs APIアクセスはcreatedとmountedのどちらで行う?

created と mounted どちらもVuejsが提供するライフサイクルフック。たいていのサンプルでは、このライフサイクルフックのどちらかでAPIアクセスをするが、どんな違いがあるんだろう。 created インスタンスの初期化が済んで props や computed にアクセスで…

Docker-Compose の変数定義について

検証環境 docker-compose.ymlで利用できる変数 環境変数 .envファイル Dockerコンテナで利用できる変数 environment env_file docker-compose run -e XXX=YYY 変数の優先順位 コンテナ内の変数の優先順位 docker-compose.yml で参照するときの優先順位 動的…

RXJava 無限ストリームでdistinct使ったらどうなる?

検証バージョン Java 1.8.0_25 RxJava 2.1.14 distinct distinct はフィルタ系操作の一つで、重複要素を取り除くためのメソッドです。 重複要素を取り除くためにはどこかに比較対象が存在しないといけないわけで、じゃあ無限ストリームとかどうやって対応す…

Vuejs vue-tables-2 でテーブル表示

vue-tables-2とは サンプルコードについて 表示してみる 実装のポイント リンクを作る 実装のポイント カラムが多いとき データが多いとき カラムごとにフィルタを用意する 実装のポイント カラムごとに表示/非表示を切り替える 実装のポイント グルーピング…

Spring WebFlux の概要を理解する

Spring WebFluxに関する、いまの理解を整理する。 Spring WebFlux 以前の問題点 Javaスレッドでコンテキストスイッチ? Spring WebFluxで課題をどう解決するか? Spring MVC と Spring WebFlux を比較する 検証環境 シナリオ 実装の違い Spring MVC Spring W…

AWS Lambda と LINE Notify で毎朝のゴミ出しを促す

唐突ですが、我が家の課題に『ゴミ出しを忘れる』というのがあります。たまに、家に帰って扉開けたらやばいニオイがして、激しく後悔します。ということで、LINEへ毎朝のゴミ出しの通知をしてみました。という建前の AWS Lambda と LINE Notify 触ってみた系…

MyBatis 利用時に SQL で FULL OUTER JOIN するときの注意点

検証環境 mybatis 3.4.5 java 1.8.0.25 ハマったこと DBに以下のようなデータが入っているときに SQL で FULL OUTER JOIN すると、以下のようになる。 これに対応するJavaのBeanを用意して、 @Data public class Shelf { private Long id; private String na…

Jenkins Multibranch Pipeline の成果物の保存数を指定する

問題点 Muitibranch Pipeline のプロジェクトを利用すると、ブランチごとにジョブが作成される。 このとき、デフォルトだと、各ブランチごとの成果物の保存数は上限がない。 そのため、成果物がどんどん溜まってしまい、ディスクフルを起こす可能性がある。 …

Vuejs vue-router クエリパラメータの一部だけを取り除く

課題 Vuejs利用時に、以下のようにクエリパラメータを一部のみ取り除きたい 検索したらURLにクエリパラメータが付与される ボタンを押したら対応するクエリパラメータだけURLから削除される 検証環境 "dependencies": { "vue": "^2.5.2", "vue-router": "^3.…

Vuejs Axiosで共通的な例外をあつかう

課題 Vuejs利用時に、HTTPレスポンスの例外処理を共通化したい。 各画面の各リクエストごとに、例外処理を実装するのは避けたい。 解決方法 HTTPクライアントライブラリのAxiosの、interceptorsの仕組みを利用する。 検証環境 package.json "dependencies": …

Vuejs vue-router利用時にはアクティブなリンクに自動でクラスを振ってくれる

環境 package.json "dependencies": { "vue": "^2.5.2", "vue-router": "^3.0.1" }, 課題 vue-router利用時に、アクティブなリンクにcssのスタイルを適用したい。 このとき、Vuejsだけの知識で解決しようとすると、以下のように書ける。 <template> <div> <ul> <li :class="{ active : this.$route.path.match(/articles\/stark/) }"> </li></ul></div></template>

Vuejs <button type="reset"> の併用はアブナイ

<button type="reset">とは? HTMLのButtonのひとつで、Formを自動でクリアできる。 参考: button 要素 - HTML | MDN <html> <body> <form> <input type="text" placeholder="username" /> <input type="password" placeholder="password" /> <button type="reset">reset</button> </form> </body> </html> resetボタンをクリックするとFormが自動で…</button>

今年のふりかえり(ブログの運営について)

年の瀬でやる気もでないので、2017年をふりかえろうと思います。技術要素はゼロです。面白さもゼロです。 アクセス数 2016年から始めたブログですが、1年前と比べると2倍強のアクセス数になりました。 日本の総人口は1億2670万人らしいので、このペース(1年…

Tomcat リソース設定(maxThreads,maxConnections,acceptCount)のちがい

maxThreads リクエストを処理するスレッド数(workerスレッド)の上限 1リクエストを処理するために1workerスレッドを消費する コネクタ(HTTP1.1, AJPなど)ごとの上限 ただしスレッドプールをexecutorプロパティで指定した場合、この上限は無視される maxConne…

Vuejs vue-router コンポーネントインスタンスの再利用について

はじめに 検証環境 検証 プロパティが変更された場合 ソースコード 実行結果 いったん別のコンポーネントに切り替えた場合 ソースコード 実行結果 別URLに同一コンポーネントを割り当てた場合 ソースコード 実行結果 ネストしたビューでプロパティが切り替わ…

Spring Securityで特定ヘッダーがついてるときだけ認証をパスさせる方法

以下、Basic認証を例に取り上げる。 何をしたいか? アプリケーションに認証をかける。 $ curl -i -u 'user:pass' localhost:8080/api/sample HTTP/1.1 200 X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Cache-Control: no-cache, no-s…