Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

Processingで内積・外積の勉強

f:id:fa11enprince:20200121024039j:plain ひょんなことから内積・外積をちゃんと学びなおしたいと思い…
文系であった自分はあまりなじみがないのです。物理も選択せず生物選択でした。
数学は嫌いではないんだけど、計算が得意でなかったです。
とはいえ行列をやっていた関係もあり、全く知らないというわけではないのです。
それに最近避けたいのに避けられない機械学習でもというかnumpyというか、dot、dot、dotばっかりな気がしていますので改めて復習。 グラフィカルに確認したいなと思い、いろいろ見てました。 そもそも何に使うか…

内積:矩形は別の判定方法が簡単に思いつくけど、三角形や円にたいしてある点が当たっているかどうか
    (衝突判定)とか2つのベクトルがわかっているときにその角度が鋭角か鈍角か求めたいとき  
外積:キャラがジャンプした時の高さを求める  

内積や外積が難しいのはそもそも何に使うんよ…ってのが分かりにくいからだと思います。 自分の理解したざっくり定義では、

内積:ある方向に引っ張ったときに元となるベクトルと方向を合わせて水平方向に引っ張れる力や量的な  
外積:ある方向に引っ張ったときに元となるベクトルと垂直方向に引っ張れる力や量的な  

と理解しました(あってんのか?)てかこれ物理とってたら習う?
ちなみにですが内積については類似度っていう考え方もあるみたいです。

www.slideshare.net

個人的にはここがわかりやすかったです。 marupeke296.com
んで、理屈だけわかっても仕方ないんで、「内積 衝突判定」でググってみました。
すると、なんかコード例が書いてて素敵!
mslabo.sakura.ne.jp なんだこのJavaっぽい言語は…一瞬TypeScriptにも見えるしな…と思い、調べたらProcessingでした。 自分もProcessingで書いてみました。ほうほう…内部でJavaのSwing使ってんのね。
余談ですがProcessing書いてるとPythonとかJavaScript(ES6以降)っぽいなーとうっすら思います。

ソースコード

class Point2D {
  float x;
  float y;
  Point2D(float x, float y) {
    this.x = x;
    this.y = y;
  }
  void disp(color c, float diameter) {
    stroke(c);
    strokeWeight(diameter);
    point(this.x, this.y);
  }
};

class Vector2D {
  float x;
  float y;
  float len;
  Vector2D(float x, float y) {
    this.x = x;
    this.y = y;
  }
  Vector2D(Point2D pointA, Point2D pointB) {
    this.x = pointB.x - pointA.x;
    this.y = pointB.y - pointA.y;
    this.len = dist(pointA.x, pointA.y, pointB.x, pointB.y);
  }
  Vector2D unit() {
    return new Vector2D(this.x / this.len, this.y / this.len);
  }
  float dot(Vector2D vec) {
    return this.x * vec.x + this.y * vec.y;
  }
  float corss(Vector2D vec) {
    return this.x * vec.y - this.y * vec.x;
  }
}

final color BLACK = color(0, 0, 0);
final color WHITE = color(255, 255, 255);
final color BLUE = color(0, 0, 255);
final color GREEN = color(0, 255, 0);
final color RED = color(255, 0, 0);
final float diameter = 20;
final float diameterCenter = 100;
Point2D pointA;
Point2D pointB;
Point2D pointP;

void setup() {
  size(300, 300);
  pointA = new Point2D(20, 20);
  pointB = new Point2D(260, 260);
  pointP = new Point2D(150, 150);
}

void draw() {
  background(WHITE);
  noFill();
  
  stroke(BLACK);
  strokeWeight(2);
  line(pointA.x, pointA.y, pointB.x, pointB.y);
  pointA.disp(BLUE, diameter);
  pointB.disp(GREEN, diameter);

  Vector2D vecAB = new Vector2D(pointA, pointB);
  Vector2D vecAP = new Vector2D(pointA, pointP);
  Vector2D vecBP = new Vector2D(pointB, pointP);

  color c;
  if (isCollision(vecAB, vecAP, vecBP)) {
    drawInnerPointOfCircle(vecAB, vecAP);
    c = RED;
  } else {
    c = BLACK;
  }
  drawCircle(c, pointP);
}

void drawInnerPointOfCircle(Vector2D vecAB, Vector2D vecAP) {
  Vector2D unit = vecAB.unit();
  float len = unit.dot(vecAP);
  Point2D pointX = new Point2D(pointA.x + (unit.x * len), pointA.y + (unit.y * len));
  pointX.disp(color(100,100,255), diameter);
}

void drawCircle(color c, Point2D pointP) {
  strokeWeight(2);
  stroke(c);
  ellipse(pointP.x, pointP.y, diameterCenter, diameterCenter);
}

boolean isCollision(Vector2D vecAB, Vector2D vecAP, Vector2D vecBP) {
  float lenAX = vecAB.unit().dot(vecAP);
  return shortestDistance(lenAX, vecAB, vecAP, vecBP) < diameterCenter / 2;
}

float shortestDistance(float len, Vector2D ab, Vector2D ap, Vector2D bp) {
  if (len < 0 ) {
    return ap.len;
  } else if (len > ab.len) {
    return bp.len;
  } else {
    return abs(ab.unit().corss(ap));
  }
}

void mouseDragged() {
  if (isDragged(pointA, diameter)) {
    pointA.x = mouseX;
    pointA.y = mouseY;
    return;
  }
  if (isDragged(pointB, diameter)) {
    pointB.x = mouseX;
    pointB.y = mouseY;
    return;
  }
}

boolean isDragged(Point2D point, float diameter) {
  return dist(mouseX, mouseY, point.x, point.y) < diameter / 2;
}

スクリーンショット

f:id:fa11enprince:20200121022851p:plain

ちなみにProcessingのダウンロードはこちら processing.org 最新版だとJava 8が内包されている様子。
github.com JavaFXは外部でメンテナンスだけどSwingは残りましたね…。

サクラエディタで特定のフォルダにYYYYMMDD_番号.txtで保存するマクロを作成

f:id:fa11enprince:20200117021408j:plain 最近の趣味はサクラエディタのPull Requestを眺めることです。 github.com

昔から愛用してきたサクラエディタですがマクロを使ったことはありませんでした。
ということで毎日よく簡易的にメモをテキストエディタに書いてYYYYMMDD.txtみたいな形式で保存するのですが、
日付を間違えたり、名前を変更するのをめんどくさがったり、保存先がデスクトップに散ったりなどがありがちなので
デスクトップのmemoというフォルダを用意してそこにフォルダ新規作成時orマクロ実行時にmemo配下に YYYYMMDD_[無題の後の番号].txtというので自動保存するマクロを作成しました。 古のWSH(JScript)が使えるんですね。

マクロの準備

次のコードをsaveByDate.jsという名前で%APPDATA%\sakuraフォルダに保存します。

// saveByDate.js
// see: https://gist.github.com/RYLSnmm/432a35eb3f885722a4f95e8f0ef9df6b
// デフォルトの設置場所:ユーザーごとにインストールなら
//   %APPDATA%sakuraに本ファイルを設置する
// 共通設定よりマクロを設定 文法はWSHに準拠(JScript)
// 新規/開ファイル後にチェックを入れて設定したほうが捗るかも
(function() {
    if (Editor.GetFilename() != "") { return; }
    
    var wsh_shell = new ActiveXObject("WScript.Shell");
    var DEFAULT = {
        savedir: wsh_shell.ExpandEnvironmentStrings("%USERPROFILE%") + "\\Desktop\\memo",
        filename_template: "{{YYYY}}{{MM}}{{DD}}_{{number}}.txt",
        charset: "UTF-8",
        linebreak: "CRLF"
    };
    var savedir = DEFAULT.savedir;
    var filename_template = DEFAULT.filename_template;
    var charset = DEFAULT.charset;
    var linebreak = DEFAULT.linebreak;
    
    var number = Editor.ExpandParameter("$n");
    var filename = createFromTemplate(filename_template, getNowForTemplate(), {number: number});
    var path = savedir + "\\" + filename;

    var fso = new ActiveXObject("Scripting.FileSystemObject");
    if (!fso.FolderExists(savedir)) {
        fso.CreateFolder(savedir);
    }
    
    Editor.FileSaveAs(path, charset, linebreak);
    
    function createFromTemplate(tstr /*, ...args*/) {
        var obj = mergeObjects(Array.prototype.slice.call(arguments, 1));
        return tstr.replace(/\{\{(.*?)\}\}/g, function(_, name) {
            return obj[name] || "";
        });
    }

    function mergeObjects(objects) {
        var result = {};
        for (var i = 0; i < objects.length; i++) {
            var obj = objects[i];
            for (var k in obj) {
                if (obj.hasOwnProperty(k)) {
                    result[k] = obj[k];
                }
            }
        }
        return result;
    }

    function getNowForTemplate() {
        var d = new Date();
        return {
            YYYY: padLeft(d.getFullYear(), 4),
            MM: padLeft(d.getMonth() + 1, 2),
            DD: padLeft(d.getDate(), 2)
        };
    }

    function padLeft(value, len, char) {
        char = char || "0";
        var padding = Array.apply(null, Array(len + 1)).join(char);
        return (padding + value).slice(-len);
    }
})();

設定

サクラエディタを立ち上げて、設定 > 共通設定 > マクロ タブを選択し、

名前:saveByDate
Id: 0
File: saveByDate.js
自動実行: 新規/開ファイル後にチェック

で右下の設定ボタンを押します。 f:id:fa11enprince:20200117023153p:plain

すると次回から新規作成時にmemoフォルダ配下にYYYYMMDD_[無題の後の番号].txtという名前で
ファイルを保存するようになります。

Anaconda3とAnaconda2のインストール(Windows)

f:id:fa11enprince:20200115005038j:plain 例によって備忘録です。ありふれた記事なのでGit Bashで使う方法も記載しました。 Python2のEOLが到来したというのに何をしているんだという感じですが、
いまだにNodeの安定板がPython2に依存しているっぽい(node-gypとか…)ので
とりあえず備忘録。はやくPython2滅んでくれ。
Nodeのインストーラーも相変わらず、
github.com てな感じですので…。 Anaconda2を環境変数付きでインストール Anaconda3を環境変数付きでインストール ちなみに私はどちらも64bit版を選んでいます。 環境変数は後にインストール(=上のほう)が優先されます。 あれ?順番はインストーラーによるかも。 とりあえず上のほうが優先されるのでできればPython3の環境変数群を上に持っていきます。

次のバッチファイルを作成します

@echo off
rem バージョンや環境によってはC:\Users\%USERNAME%\AppData\Local\Continuum\
rem https://docs.anaconda.com/anaconda/user-guide/faq/

cd %USERPROFILE%\Anaconda2
copy python.exe python2.exe

cd %USERPROFILE%\Anaconda2\Scripts
copy anaconda.exe  anaconda2.exe
copy anaconda-script.py  anaconda2-script.py
copy conda.exe  conda2.exe
copy conda-script.py  conda2-script.py
copy easy_install.exe  easy_install2.exe
copy easy_install-script.py  easy_install2-script.py
copy pip.exe  pip2.exe
copy pip-script.py pip2-script.py
copy spyder.exe  spyder2.exe
copy spyder-script.py  spyder2-script.py

pause

これで実行すると

> python2 --version
Python 2.7.16 :: Anaconda, Inc.
> python --version
Python 3.7.4

ちなみにConEmuとかでGit Bashを使っている場合は、

$ cd ~
$ echo "source $HOME/Anaconda2/etc/profile.d/conda.sh" >> .bashrc
$ echo "source $HOME/Anaconda3/etc/profile.d/conda.sh" >> .bashrc
$ echo "alias python2='winpty python2'" >> .bashrc
$ echo "alias python='winpty python'" >> .bashrc

としてください。 なんかwinptyってGit for Windowsで対話モードのコマンドがうまく動かないことがあるそうなのでそのための対処です。 ちなみにこの状態で.bash_profileがないとWARNINGとともに初回ログイン時に勝手に.bash_profileが作られますのでご安心を。
※バージョン?によっては$HOME/AppData/Local/Continuum/Anaconda2$HOME/AppData/Local/Continuum/Anaconda3になるっぽい。

npmの設定ファイルの場所

f:id:fa11enprince:20191129234333j:plain

npmの設定ファイルの場所

種別 Linux Windows
プロジェクト毎 /path/to/project/.npmrc C:\path\to\project\.npmrc
ユーザ毎 ~/.npmrc %USERPROFILE%\.npmrc
グローバル $PREFIX/npmrc %APPDATA%\npm\etc\npmrc
ビルトイン /path/to/install/npm/npmrc C:\path\to\install\npm\npmrc

普通はnpm config setでやると思うが、面倒な場合
プロジェクト毎かユーザ毎かのを書き換える

ちなみに
npm config setだとユーザ毎のファイルが
npm -g config setだとグローバルのファイルが書き換わる
紛らわしいがnpm install -gはビルトインのnode_modules 付けないときはプロジェクト毎。

参考

https://stackoverflow.com/questions/15536872/nodejs-npm-global-config-missing-on-windows/22847156
https://stackabuse.com/the-ultimate-guide-to-configuring-npm/

Maven + Eclipseでマルチモジュールプロジェクトを作成する

f:id:fa11enprince:20190723093752j:plain 良く忘れるのでメモ
様々な事情でプライベートリポジトリを立てられなかったりする場合や、 そもそもプライベートリポジトリ立てるまでもないよねというときに便利なマルチモジュールプロジェクトの構成を作ります。 お題目は、Spring Boot + MongoDB + PostgreSQLにしましょう。

最近のEclipseはコメントの日本語の先頭がなぜか文字化けするのでFontをMyrica Mに設定します。 STSもいれるのが本当はいいのですが、面倒なので割愛します。 ちなみにWindows前提です。Mac/Linuxも大して変わらないと思います。

書いてて思ったんですが、Maven手書きしたほうが早いっすね…。

ソフト バージョン 備考
Java 1.8
Maven 3.6.1
lombok 1.18.8
Eclipse 2019-06
Font Myrica M
PostgreSQL 10.9 Docker利用
MongoDB 3.6.13 Docker利用
Spring Boot 2.1.6

あと、Docker for WindowsとHyper-V(Windows 10 Pro)が必要です。 なければ、直接入れるなどしてください。 Eclipse IDE 2019‑12で日本語のコメント文字の不具合が修正されていましたのでフォントは不要です。

最終系

今回作成するものの完成品です。 github.com

下記は具体的な手順です。まさかのJavaのインストールから書いてます。

Javaのインストール

Adopt Open JDK等をインストールします。 インストーラーが準備されているので方法は割愛します。
AdoptOpenJDK - Open source, prebuilt OpenJDK binaries
Java 8のHotSpotがおすすめです。

Mavenのインストール

Maven – Download Apache Maven
よりapache-maven-3.6.1-bin.zipダウンロードします。
ダウンロードしたものを解凍しapache-maven-3.6.1をC直下に移動します。
Cに移動した後、binの位置が下記のようになっていればOKです。
C:\apache-maven-3.6.1\bin
環境変数を設定します。
M2_HOME%USERPROFILE%\.m2
さらに今回はシステム環境変数のほうに上記binのパスを設定します。
C:\apache-maven-3.6.1\bin

Proxy環境で虐げられている人は、まぁ調べてくださいというところですが、
ヒントはやり方は2通りあって、%USERPROFILE%\.m2\settings.xmlを作成するのが一番お手軽です。

念のためコマンドプロンプトにmvn -vを打って下記が表示されればOKです。

>mvn -v
Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T04:00:29+09:00)
Maven home: C:\apache-maven-3.6.1\bin\..
Java version: 1.8.0_192, vendor: Azul Systems, Inc., runtime: C:\Program Files\Zulu\zulu-8\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

私の環境ではZuleのJDKを使っていますが、たぶん、Adopt Open JDK HotSpotのほうがおすすめです。

フォントのインストール

Eclipse IDE 2019‑12で日本語のコメント文字の不具合が修正されていましたのでフォントは不要です。

プログラミングフォント Myrica / Estable | Myrica (ミリカ)は、フリーなプログラミング用 TrueType フォントです。
よりフォントをダウンロードして展開します。
展開したフォルダにMyrica.TTCがあるので Myrica.TTCを右クリックし、インストールします。

補足

Eclipseのここ1年くらいの新バージョンでバグで日本語がおかしくなる問題の対処です STS(Spring Tool Suite)と組み合わせたときに発生するらしい

選定基準はプロポーショナルでない等幅フォント

検討したのはまっとうに手に入れれらる下記3種

フォント インストール元
IPAフォント https://ipafont.ipa.go.jp/old/ipafont/download.html
Source Han Mono(源ノ等幅) https://github.com/adobe-fonts/source-han-sans/tree/release/SubsetOTF
Myrica M https://myrica.estable.jp/
Biz UD ゴシック Windows 10 October 2018 Update以降でデフォルトで入ってる
MS ゴシック Windwosで最初から入ってる

IPAフォントを試したが恐ろしく見た目やタブ幅が変わってしまったので断念
Source Han MonoはOK
Myrica Mのほうが個人的に好きだったのでこちらを採用

でもConsolas最強なんですよね
以外にConsolasに一番近いのはMS ゴシックかもしれません。

https://www.gwtcenter.com/eclipse-garbling-only-in-comments

PostgreSQLのインストール

PostgreSQL Database Download | EnterpriseDB よりダウンロードしてインストールしてもいいのですが、 docker-composeで入れることにします。 GitHubのReadMe.mdを参照してください。
initdbがうまくいかない場合は
File in docker-entrypoint-initdb.d never get executed when using docker compose - Stack Overflow
に記載してあるように

$ docker volume ls
$ docker volume rm docker_postgresql

として、この後docker-compose up -dをし直せばちゃんと動きます。 にしてもDocker For Windowsでvolumeが簡単にマウントできない問題とか
初回一発再起動しないとまともに動かない問題ってどうにかならないんだろうか。

MongoDBのインストール

Download Center: Community Server | MongoDB より3.6.13をダウンロードしてもいいのですが、 docker-composeで入れることにします。 GitHubのReadMe.mdを参照してください。

Eclipseのインストール

2019-06版を入手します。 https://www.eclipse.org/downloads/ ダウンロードした後、インストーラーを立ち上げて、
Eclipse IDE for Enterprise Java Developersを選択します。

いろいろAcceptを聞いてくるので受け入れます。

フォントの設定

特にSTS(Spring Boot Suite)と組み合わせると日本語文字化けが特にコメント周りで発生するので デフォルトフォントをMyrica Mに変更します。 Preference > General > Appearence > Colors and Fonts
Java Editor Text Fontを選択し、Edit Default
Myrica Mを選択します。下の文字セットは欧文のままでいいはず…。 STSをいれるかどうかはお好みで(あったほうが良い)

lombokのインストール

Java開発ならもはや必須です。標準に取り込んでほしいくらいです。
単なるGetter/Setterを書かなくていいばかりでなく、それ以上の恩恵があります。
https://projectlombok.org/download
よりlombok.jarをダウンロードし、jarをダブルクリックします。 しばらくするとecliseを検知するので、Install/Updateをクリックします。 そのあと、Eclipseを再起動します。

Maven Projectの作成

Eclipseを立ち上げて、
File > New > Maven Projectを選択します。
ひとまずNextを押します。 f:id:fa11enprince:20190728215501p:plain ArtifactIdがmaven-archetype-archetypeのを選びます。
実はどれでもいいです。あとで書き換えるので。
(実はいらないものが含まれてて後でEclipseからビルドパスを消したりしてます。
他にいいもの知っている方がいたら教えてください) f:id:fa11enprince:20190728215737p:plain

Group Id: com.example.multi-module
Artifact Id: multi-module-project-sample
Version: 0.0.1
Package: com.example.multiModule

としFinishを押下します。 f:id:fa11enprince:20190728223147p:plain

pom.xmlをダブルクリックし、開きます。
Spring Boot用に次のように編集します。 Spring Bootに加えよく使うものを依存関係に含めます

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <groupId>com.example.multi-module</groupId>
    <artifactId>multi-module-project-sample</artifactId>
    <version>0.0.1</version>
    <packaging>pom</packaging>
    <name>Archetype - multi-module-project-sample</name>
    <url>http://maven.apache.org</url>
    
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
    </dependencies>
</project>

このとき、packagingpomになっていることが重要です。
いらないフォルダができるので消しておきます。
(src/main/resourcesなど…)

共通モジュールの作成

commonという名前でモジュールを作成します。
プロジェクトエクスプローラーのmulti-module-project-sampleを右クリックし、
New > Other > Maven > Maven Moduleを選択します。
f:id:fa11enprince:20190728221559p:plain
multi-module-commonとModule Nameに入力します。 f:id:fa11enprince:20190728223336p:plain ArtifactIdがmaven-archetype-archetypeのを選びます。
f:id:fa11enprince:20190728221816p:plain 下記を入力します。

Group ID: com.example.multi-module-common
Package: com.example.multiModule.common

そしてFinishを押下します。 f:id:fa11enprince:20190729002139p:plain こうすると、親のpom.xmlに

 <modules>
        <module>multi-module-common</module>
    </modules>

が追加されます。 ここでmulti-module-project-commonのpom.xmlを次のように書き換えます。

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example.multi-module</groupId>
        <artifactId>multi-module-project-sample</artifactId>
        <version>0.0.1</version>
    </parent>
    <groupId>com.example.multi-module-common</groupId>
    <artifactId>multi-module-common</artifactId>
    <name>Archetype - multi-module-common</name>
    <url>http://maven.apache.org</url>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>
    </dependencies>
</project>

一旦ここで親プロジェクトから右クリック > Maven > Maven Installを実行します。

共通モジュールのソースコードを書きます。

最後に貼ってあるGitHubを参照してください。

メインのモジュールを作成

ここは実際にはWebAppだったりBatchだったりすると思うのですが、サンプルなので単純なバッチとします。 例によって、親プロジェクトを右クリックしてサブモジュールを追加します。 New > Other > Maven > Maven Moduleを選択します。
multi-module-batchとModule Nameに入力します。 f:id:fa11enprince:20190729003706p:plain ArtifactIdがmaven-archetype-archetypeのを選びます。
f:id:fa11enprince:20190729003823p:plain
下記を入力します。

Group ID: com.example.multi-module-batch
Package: com.example.multiModule.batch

f:id:fa11enprince:20190729003948p:plain pom.xmlからバージョンのみ消して下記のようになっていればOKです

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example.multi-module</groupId>
        <artifactId>multi-module-project-sample</artifactId>
        <version>0.0.1</version>
    </parent>
    <groupId>com.example.multi-module-batch</groupId>
    <artifactId>multi-module-batch</artifactId>
    <packaging>pom</packaging>
    <name>Archetype - multi-module-batch</name>
    <url>http://maven.apache.org</url>
</project>

ちなみに書き忘れてましたが、いらないフォルダができるので消しておきます。
(`src/main/resourcesなど…)
またこのモジュールもpomのpackaging指定にします。

さらにサンプル用モジュールを作成します。

先程作ったcom.example.multi-module-batchの配下にサンプル用のモジュールを作成します。 例によってこの配下にMaven Moduleを作成します。 キャプチャは飽きたと思うので

Module Name: sample-db-access
Group Id: com.example.sample-db-access
Package: com.example.multiModule.sampleDbAccess

とします。 pom.xmlからバージョン指定を消します。さらにdependencyに先程作成したcommonを追加してあげます。

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example.multi-module-batch</groupId>
        <artifactId>multi-module-batch</artifactId>
        <version>0.0.1</version>
    </parent>
    <groupId>com.example.sample-db-access</groupId>
    <artifactId>sample-db-access</artifactId>
    <name>Archetype - sample-db-access</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>com.example.multi-module-common</groupId>
            <artifactId>multi-module-common</artifactId>
            <version>0.0.1</version>
        </dependency>
    </dependencies>
</project>

この辺りでMavenが文句を言ってくるのでプロジェクトを右クリックして
Maven > Update Maven Project
を実行しますと黙ります。

ソースコードを書きます

前述のGitHubを参照してください。

おまけ Ecliseの設定

プロジェクトとパッケージを階層表示にする

インストール直後だとデフォルトでいろいろ嫌なところがあるので変更します。
トップの親プロジェクトをProject Explorerで選択し、▽マークのアイコンを押します。
Project Presentation > Hierarchical さらに
Package Presentation > Hierarchical にします。

空白、Tab、改行などを表示する

Window > Preferences > General > Editors > Text Editors
Show whitespace charactersをチェックしてOKを押下します。

フォント

このままだと日本語コメントが文字化けしてしまうのでフォントを設定します 日本語コメントは今回書いてませんが…。 気が向いたら書きます。

参考リンク

Eclipseでコメントの前の方だけ文字化けする - Qiita
3. Maven 入門 (7) | TECHSCORE(テックスコア)
GitHub - spring-projects/spring-data-examples: Spring Data Example Projects
GitHub - mbogner/spring-boot-multiple-databases
Compose ファイル・リファレンス — Docker-docs-ja 17.06.Beta ドキュメント
Docker for Windowsでpostgresのデータマウントができない人へ - Qiita
MongoDB + mongo-expressをDocker Composeでお手軽構築 - Qiita