Java コードリーディングのコツ

この記事は 品川 Advent Calendar 2019 の5日目です。 OB 枠での参加です。いったいどこの某弊社なんでしょうか… 。 本記事は Eclipse で Java ライブラリのコードリーディングを行うときのコツをまとめます。あくまでも「自分はこんな考え方やテクニックを…

Linux メモリ管理 徹底入門(プロセス編)

Linux カーネルのメモリ管理方法について、勉強したことをまとめる。プロセス編。 カーネル編はこちら。 www.kimullaa.com メモリ管理の特徴 連続したメモリ領域 プロセスごとに独立したアドレス空間 実行例 メモリの効率的な割り当て デマンドページング ス…

Linux ファイルシステム 徹底入門

検証環境 ファイルシステムとは何か? ファイルアクセスの詳細 ストレージデバイスの特徴 open inode dentry file dentry キャッシュと inode キャッシュの効果を測定する read ページキャッシュとバッファキャッシュ ページキャッシュ バッファキャッシュ di…

PostgreSQL WALログの仕組みとタイミングを理解したい

DB

普段はアプリケーションレイヤの仕事をしているため、「データベースはデータを入れておくただの箱」という発想でした。が、さすがにこれはまずいだろう、と思いたち、勉強中です。 とくにデータベースが専門領域というわけではないので、間違いがあれば教え…

Linux rpmパッケージのコードリーディングをしたい

デバッグ情報を付与するだけなら debuginfo-install を使えばいいが、今回は、ソースコードを閲覧または変更できるようにする。 参考 CentOS 7: デバッグシンボルでパッケージをデバッグする 検証バージョン ]$ cat /etc/redhat-release CentOS Linux releas…

Python for文とイテレータとジェネレータ

Python3 のチュートリアルを流してみたので、その際に面白いと感じたところのメモです。 参考 Python チュートリアル 動作環境 $ python --version Python 3.7.3 はじめに python の for 文は、イテレータから値を取り出して繰り返すだけ。 JavaやC言語のよ…

C言語がコンパイル~実行されるまで

記事の内容 以下のソースコードがコンパイル~実行されるまでに、何が行われるのかを理解する。 細かいオプションや処理の詳細は追わない。 #include <stdio.h> #define MESSAGE "hello world\n" int main(int argc, char *argv[]) { printf(MESSAGE); return 0; } 記</stdio.h>…

Java オブジェクトの比較に関するひっかけ問題

検証環境 ]$ uname -a Linux localhost.localdomain 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux ]$ java -version openjdk version "11.0.1" 2018-10-16 LTS OpenJDK Runtime Environment 18.9 (build …

Spring なぜMyBatisの実行したSQLがSpringの管理しているトランザクションで実行できるのか?

なぜMyBatisの実行したSQLがSpringの管理しているトランザクションで実行できるのか、を調べる。そのために、 mybatis-spring の実装を追っていく。 対象バージョン java version "11.0.1" 2018-10-16 LTS Spring Boot 2.1.2.RELEASE mybatis-spring-boot-st…

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…