2020/08,江端さんの技術メモ

0. メモ

CREATE DATABASE ca_sim0; の逆で、DBの消去方法は DROP DATABASE ca_sim0;

  1. メイン

すでに地図DBは作ってきたが、今のうちに纏めておきます。ここでは東京の豊洲地区を例にして説明します。

なお、Dockerの利用を前提とし、それぞれの地区のDBはバラバラに管理するものとします。地区ごとに取り扱えるようにして、DBを切り替えて利用することを前提とする為です。

(Step1) (to-path)/toyosu というディレクトリを掘る

(Step2) そのディレクトリに、以下のdocker-compose.ymlを作ります。

version: '3.7'

services:
  db:
    image:  postgis-pgrouting:latest
    environment:
      POSTGRES_HOST_AUTH_METHOD: 'trust'
      POSTGRES_PASSWORD: 'postgres'
    expose:
      - 5432
    ports:
    - 15432:5432
    volumes:
      - db_data
      - ./shared:/shared
  db_data:
    image: busybox
    volumes:
      - /data/db

これに対して、

docker-compose up -d
Creating network "toyosu_default" with the default driver
Pulling db (postgis-pgrouting:latest)...
ERROR: The image for the service you're trying to recreate has been removed. If you continue, volume data could be lost. Consider backing up your data before continuing.

Continue with the new image? [yN]y
Pulling db (postgis-pgrouting:latest)...
ERROR: pull access denied for postgis-pgrouting, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
ubuntu@ip-172-26-13-137:~/toyosu$

てなものが出てきた時は、

image: postgis-pgrouting:latest

の代わりに、

image: pgrouting/pgrouting:v3.0.0-dev-postgresql_12

にしたら動いた(理由は不明だが、まあいいか)

DB(PostgreSQL)のアクセス用のポート番号は、15432としています。ローカルにPostgresがある場合にバッティングを避ける為です。

(Step3) そのディレクトリの中で、"docker-compose up -d"を実行する。

(Step4)"$ docker start -a toyosu_db_1"としてコンテナを起動する

(Step5)(winpty) "docker container exec -it toyosu_db_1 bash" でシェルに入る

(Step6) "psql -U postgres" で、DBのコンソールに入る

(Step7)psqlでデータベースを新規作成する(以下、データベース名をca_simとする)。

postgres=#CREATE DATABASE ca_sim

(Step8)次のコマンドを実行する

postgres=# \c ca_sim
postgres=# create extension postgis;
postgres=# create extension pgrouting;

(Step9) ここで、もう一つ、コンソール(2)をたちあげて、(to-path)/toyosuに入っておく

(Step10) https://www.openstreetmap.org/ から、豊洲地区を選んで地図DBをエクスポートする

ファイル名を"toyosu.osm"として、(to-path)/toyosuに保存する。

↓私が使っている、"toyosu.osm"

(Step11) コンソール2で、"toyosu.osm"を、コンテナに放り込む

>docker cp toyosu.osm toyosu_db_1:/db_data

(Step12)コンソール2で、"apt-get update"、"apt-get update" を実施した後、"apt-get install osm2pgrouting"を実施

(Step13)コンソール2で、"osm2pgrouting -f /db_data/toyosu.osm -c /usr/share/osm2pgrouting/mapconfig_for_cars.xml -d ca_sim -U postgres" を実施

これで、地図DBはできているハズだが、多分、一発で成功することはないので、いろいろ試してみて下さい。

(Step14) psqlでログインしているコンロールから、以下の操作をして表示ができれば、成功

postgres=# \c ca_sim
You are now connected to database "ca_sim" as user "postgres".
ca_sim=# \dt
List of relations
Schema | Name | Type | Owner
--------+-------------------+-------+----------
public | configuration | table | postgres
public | pointsofinterest | table | postgres
public | spatial_ref_sys | table | postgres
public | ways | table | postgres
public | ways_vertices_pgr | table | postgres
(5 rows)

ca_sim=# select * from ways;

以下のような表示がでてくれば、(多分)成功

QGIS3で接続すると、こんな感じのものが表示されるはず

以上

2020/07,江端さんの技術メモ

Docker commitで作ったイメージをアップしてみようと思って、docker pushを使ってみたんだけど、上手く動きませんでした。

ebata@DESKTOP-P6KREM0 MINGW64 ~/xxxxxxx_ride_hailing_go
$ docker push ebata_db_data_1_back2
The push refers to repository [docker.io/library/ebata_db_data_1_back2]
d103f95b4a98: Preparing
195be5f8be1d: Preparing
denied: requested access to the resource is denied

ebata@DESKTOP-P6KREM0 MINGW64 ~/xxxxxxx_ride_hailing_go
$ docker push ebata_db_data_1_back2
The push refers to repository [docker.io/library/ebata_db_data_1_back2]
d103f95b4a98: Preparing
195be5f8be1d: Preparing
denied: requested access to the resource is denied

なんで上手くいかないのかなー、とググッてみたら、イメージ名にルールがあったみたいです。ユーザ名がtomoichiならば、image作る時に、こういう名前にしなければダメみたい。

ebata@DESKTOP-P6KREM0 MINGW64 ~/xxxxxxx_ride_hailing_go
$ docker commit f5ae64d47096 tomoichi/ebata_db_data_1_back2
sha256:bf565f55a2cf06e0c9fe6ecb3460f7afe7228cf48886ae0a71cde6bf770ebf1c

ebata@DESKTOP-P6KREM0 MINGW64 ~/xxxxxxx_ride_hailing_go
$ docker commit 64101530c199 tomoichi/ebata_db_1_back2
sha256:6243b4ad2ea96bca6183b331a1c2c4467c9337ce2b305e40ca6a1d456b58df8d

でもって、

ebata@DESKTOP-P6KREM0 MINGW64 ~/xxxxxxx_ride_hailing_go
$ docker push tomoichi/ebata_db_data_1_back2
The push refers to repository [docker.io/tomoichi/ebata_db_data_1_back2]
d103f95b4a98: Preparing
195be5f8be1d: Preparing
d103f95b4a98: Pushed
195be5f8be1d: Pushed
latest: digest: sha256:e69eb3011f892fc5fe80530657f2ed0c1b59202cdca62788483315412a54be50 size: 734

みたいに成功するようです。

2020/08,江端さんの技術メモ

「パスワードの長さが足りん」とか言われるが、今さらログイン環境変えるのも恐しいので、なんかとできないか探ってみた。たまたま上手くいったのでメモを残しておく

と、9文字以上のパスワードが必要と言われたが、"Sing in"を押下する。

入れた様子。

Dockerの環境、ふっとぶとか考えるだけで怖いので、できるだけ何も変更しないで進めたい。

2020/07,江端さんの技術メモ

江端家では、2本の愛用包丁(南部鉄(*))があります 。これらの包丁は、長期の使用で私が修理を繰返して使い倒しています。

(*)鉄分補給がしやすい、という特徴があるそうですが、包丁(×鍋、×フライパン)でその効果が発揮できるのかは不明です

今回も柄が折れしまったので、Amazonで新しい柄を購入して修理することにしました。

で、こちらが解体した包丁。

解体に際に気を付けることは、包丁に力を加えないこと。包丁の金属の柄の部分は、すでに長期に渡って金属疲労が与えられ続けられており、簡単に「ポッキリ」いきかねないから。包丁の刃の柄が折れたら、もう再利用はできない

木の柄の部分と、プラスチック(黒)の部分を、ペンチやニッパーを使って、地道に破壊していくことが必要。

Amazonから届きました。

IMG-0608.JPG を表示しています

コンロで、刃の柄の先端が真っ赤になるまで加熱する。

IMG-0604.JPG を表示しています

あとは、鉄の柄を、木の柄に差し込むだけ。簡単にズブズブと刺さる。(私の場合)刃を立ててそのまま押し込みました。

IMG-0606.JPG を表示しています

本当は、この後、ロウを入れたりするらしいが、私は全部省略して、自然に冷えるのを待って作業を完了しました。

(追記)

その後、刃の柄が、木の柄にガッチリ固定されずに、グラグラしてしまうので、一度、刃の柄を出した後、木の柄の溝に木工用ボンドを投入して、一日程、放置した。

結果としては、固定されなかった。

これは、木工用ボンドが柄の中で固まらなかった為と思われる(多分、まだ液状になっているのだと推測)。

そこで、刃の柄を、木の柄に差し込んだ状態で、刃をコンロの火に晒してみた。これによって、木工用ボンドを強制的に乾燥させる為である。

上手く接着できたかどうかは、後日報告する。

以上

2020/07,江端さんの技術メモ

やりたいことではなかったのだが、結果的に見つけてしまったので、忘れない内にメモをしておく(やりたかったのは,railのosmデータの取得)

https://overpass-turbo.eu/ というページから欲しいエリアの地図を表示する

これで、export.osm というファイルできる。

あとは、QGISにドラッグすると、こんな感じの地図がでてくる

その付近のosmデータと合わせると、こんな感じ

駅周辺を拡大

これで駅の抽出ができる

node
[railway=station]
({{bbox}});
out;

2020/07,江端さんの技術メモ

docker-compose.ymlの内容

version: '3.5'

services:
app:
build:
context: ./
dockerfile: docker/app/Dockerfile
target: build
command: ./main
depends_on:
- db
- tile38
volumes:
- ./:/XXXXXX_ride_hailing_go
db:
image: postgis-pgrouting:latest
build:
context: docker/postgis-pgrouting

expose:
- "5432"
ports:
- "15432:5432"
volumes:
- data
- ./:/XXXXX_ride_hailing_go
data:
image: busybox
volumes:
- "/data/db"
tile38:
image: tile38/tile38:1.17.0
expose:
- "9851"
ports:
- "19851:9851"
volumes:
- tile38_data
tile38_data:
image: busybox
volumes:
- "/data/tile38"
nginx:
image: nginx:1.15-alpine
ports:
- "80:80"
links:
- app:app
volumes:
- "./nginx.conf:/etc/nginx/conf.d/default.conf"

でもって、

XXXXXX_ride_hailing_go/docker/postgis-pgrouting/ の直下の Dockerfileの中身

FROM postgres:11.2
LABEL maintainer="dev@connect.co.jp"

ENV POSTGIS_MAJOR 2.5 →これもコメントアウト
ENV POSTGIS_VERSION 2.5.2+dfsg-1~exp1.pgdg90+1 → これはコロコロ変わるので注意のこと
ENV PGROUTING_MAJOR 2.5 → 最近は"3"になっている
ENV PGROUTING_VERSION 2.5.2
→コメントアウト

社内から使う時には、以下のプロキシの設定がないと動かない
ENV http_proxy http://12.34.56.789:8080
ENV https_proxy http://12.34.56.789:8080 ("http://" なのか "https://"なのかを間違えないように)

RUN apt-get update \
&& apt-cache showpkg postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR \
&& apt-get install -y --no-install-recommends \
postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR=$POSTGIS_VERSION \
postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR-scripts=$POSTGIS_VERSION \
postgis=$POSTGIS_VERSION \
postgresql-$PG_MAJOR-pgrouting \
&& rm -rf /var/lib/apt/lists/*

RUN mkdir -p /docker-entrypoint-initdb.d
COPY ./initdb-postgis.sh /docker-entrypoint-initdb.d/postgis.sh
COPY ./update-postgis.sh /usr/local/bin
COPY ./initdb-pgrouting.sh /docker-entrypoint-initdb.d/routing.sh

VOLUME /XXXXXX_ride_hailing_go
WORKDIR /XXXXXX_ride_hailing_go

の赤字の部分が原因で、以下のようなエラーが出ているらしい、というところまで分かった。

Reverse Provides:
Reading package lists…
Building dependency tree…
Reading state information…
E: Version '2.5.2+dfsg-1~exp1.pgdg90+1' for 'postgresql-11-postgis-2.5' was not found
E: Version '2.5.2+dfsg-1~exp1.pgdg90+1' for 'postgresql-11-postgis-2.5-scripts' was not found
E: Version '2.5.2+dfsg-1~exp1.pgdg90+1' for 'postgis' was not found

Service 'db' failed to build: The command '/bin/sh -c apt-get update && apt-cache showpkg postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR && apt-get install -y --no-install-recommends postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR=$POSTGIS_VERSION postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR-scripts=$POSTGIS_VERSION postgis=$POSTGIS_VERSION postgresql-$PG_MAJOR-pgrouting && rm -rf /var/lib/apt/lists/*' returned a non-zero code: 100

さて、どうも最新バージョンの問題だな、というところまでは分かたけど、何を入れたら良いのか分からず、2時間ほどすったもんだしていた。

このバージョンだが、docker-compose buildの最中に登場するので、見逃さないように

Reverse Depends:
postgresql-12-postgis-3-dbgsym,postgresql-12-postgis-3 3.1.0+dfsg-1.pgdg100+1
postgresql-12-postgis-3-scripts,postgresql-12-postgis-3
postgis-gui,postgresql-12-postgis-3
Dependencies:
3.1.0+dfsg-1.pgdg100+1 - postgresql-12 (0 (null)) postgresql-12-postgis-3-scripts (0 (null)) libc6 (2 2.14) libgcc1 (2 1:3.0) libgdal20 (2 2.0.1) libgeos-c1v5 (2 3.7.0) libjson-c3 (2 0.11) libpcre3 (0 (null)) libproj13 (2 4.9.0) libprotobuf-c1 (2 1.0.1) libsfcgal1 (2 1.3.1) libstdc++6 (2 5) libxml2 (2 2.7.4) postgis (3 1.2.1) postgis (0 (null))
Provides:
3.1.0+dfsg-1.pgdg100+1 - postgresql-postgis (= ) postgresql-12-postgis (= )
Reverse Provides:
Reading package lists…
Building dependency tree…
Reading state information…
E: Version '3.0.2+dfsg-4.pgdg+1' for 'postgresql-12-postgis-3' was not found

そこで、最近構築したPostgreSQLにログインして、色々情報を探ってみたら、

ca_sim-# \dx
List of installed extensions
Name | Version | Schema | Description
-----------+---------+------------+---------------------------------------------------------------------
pgrouting | 3.0.0 | public | pgRouting Extension
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
postgis | 3.0.0 | public | PostGIS geometry, geography, and raster spatial types and functions
(3 rows)

ca_sim-# select postgis_version();
3.0 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)

ということが分かり、postgreSQLも、pgroutingも、postgisも、全部'3'になっていることが分った。そこで、docker-compose buildの画面に戻って、調べていたら、こんなメッセージを見つけた。

Reverse Depends:
postgresql-11-postgis-3,postgresql-11-postgis-3-scripts
Dependencies:
3.0.1+dfsg-4.pgdg90+1 - perl:any (0 (null)) postgresql-11-postgis-3 (0 (null)) postgresql-11-postgis-scripts (3 2.2.2+dfsg-3~)
Provides:
3.0.1+dfsg-4.pgdg90+1 - postgresql-postgis-scripts (= ) postgresql-11-postgis-scripts (= )
Reverse Provides:
Package: postgresql-11-postgis-3-dbgsym
Versions:
3.0.1+dfsg-4.pgdg90+1 (/var/lib/apt/lists/apt.postgresql.org_pub_repos_apt_dists_stretch-pgdg_main_binary-amd64_Packages.lz4)

なんか、これがクサいな、と思い、XXXXXX_ride_hailing_go/docker/postgis-pgrouting/ の直下の Dockerfileの中身を以下のように変えてみた。

FROM postgres:12.2
LABEL maintainer="dev@connect.co.jp"

ENV POSTGIS_MAJOR 3
ENV POSTGIS_VERSION 3.0.1+dfsg-4.pgdg100+1

# ENV PGROUTING_MAJOR 2.5
# ENV PGROUTING_VERSION 3.0.0
(上記2つの環境変数は、使われていないようだったのでコメントアウトしておいた)

この変更で、docker-compose build が無事通ることを確認した。

(あいかわらず、docker-compose.yml も Dockerfile も、よく分かっていないが、トライアンドエラーで何とかしている)

以上

=====

C:\Users\ebata\xxxxxxx_ride_hailing_go>docker-compose ps

xxxxxxx_ride_hailing_go_app_1 ./main Exit 1
xxxxxxx_ride_hailing_go_data_1 sh Exit 0
xxxxxxx_ride_hailing_go_db_1 docker-entrypoint.sh postgres Exit 1
xxxxxxx_ride_hailing_go_nginx_1 nginx -g daemon off; Up 0.0.0.0:80->80/tcp
xxxxxxx_ride_hailing_go_tile38_1 tile38-server -d /data Up 0.0.0.0:19851->9851/tcp
xxxxxxx_ride_hailing_go_tile38_data_1 sh Exit 0

となって、DBがどうしても動いてくれない問題発生。手動で起動を試みてみたら、こうなった。

C:\Users\ebata\xxxxxxx_ride_hailing_go>docker start -a xxxxxxx_ride_hailing_go_db_1
Error: Database is uninitialized and superuser password is not specified.
You must specify POSTGRES_PASSWORD to a non-empty value for the
superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".

You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
connections without a password. This is not recommended.

See PostgreSQL documentation about "trust":
https://www.postgresql.org/docs/current/auth-trust.html

そこで、PostgresのDockerImageに変更があって起動ができなくなった話 を参照させて頂き、docker-compose.yml に

  POSTGRES_HOST_AUTH_METHOD: 'trust'
  POSTGRES_PASSWORD: 'postgres'

を追加して、

  db:
    image:  postgis-pgrouting:latest
    environment:
      POSTGRES_HOST_AUTH_METHOD: 'trust'
      POSTGRES_PASSWORD: 'postgres'
    build:
      context: docker/postgis-pgrouting
    expose:
      - "5432"
    ports:
      - "15432:5432"
    volumes:
      - data
      - ./:/xxxxxxx_ride_hailing_go
  data:
    image:  busybox
    volumes:
      - "/data/db"

のようにしてみて、再度 docker rmでコンテナ潰しておき、$ docker-compose build $ docker-compose up -d で、(さらに上手く動かない場合は) docker-compose restartを実施してみたら

C:\Users\ebata\xxxxxxx_ride_hailing_go>docker-compose restart
Restarting xxxxxxx_ride_hailing_go_nginx_1       ... done                                                                                                                                                              Restarting xxxxxxx_ride_hailing_go_app_1         ... done                                                                                                                                                              Restarting xxxxxxx_ride_hailing_go_data_1        ... done                                                                                                                                                              Restarting xxxxxxx_ride_hailing_go_tile38_data_1 ... done                                                                                                                                                              Restarting xxxxxxx_ride_hailing_go_db_1          ... done                                                                                                                                                              Restarting xxxxxxx_ride_hailing_go_tile38_1      ... done                                                                                                                                                              
C:\Users\ebata\xxxxxxx_ride_hailing_go>docker-compose ps
                Name                               Command              State             Ports
--------------------------------------------------------------------------------------------------------
xxxxxxx_ride_hailing_go_app_1           ./main                          Exit 1
xxxxxxx_ride_hailing_go_data_1          sh                              Exit 0
xxxxxxx_ride_hailing_go_db_1            docker-entrypoint.sh postgres   Up       0.0.0.0:15432->5432/tcp
xxxxxxx_ride_hailing_go_nginx_1         nginx -g daemon off;            Up       0.0.0.0:80->80/tcp
xxxxxxx_ride_hailing_go_tile38_1        tile38-server -d /data          Up       0.0.0.0:19851->9851/tcp
xxxxxxx_ride_hailing_go_tile38_data_1   sh                              Exit 0

となり、xxxxxxx_ride_hailing_go_db_1 docker-entrypoint.sh postgres Up 0.0.0.0:15432->5432/tcp を確認できるようになるに至った。

docker-compose run db psql -h db -U postgres -d gis -c 'CREATE EXTENSION pgrouting CASCADE; CREATE EXTENSION hstore;' で失敗した

失敗のメッセージはこんな感じ

C:\Users\ebata\xxxxxxx_ride_hailing_go>docker-compose run db psql -h db -U postgres -d gis -c 'CREATE EXTENSION pgrouting CASCADE; CREATE EXTENSION hstore;'
psql: warning: extra command-line argument "EXTENSION" ignored
psql: warning: extra command-line argument "pgrouting" ignored
psql: warning: extra command-line argument "CASCADE;" ignored
psql: warning: extra command-line argument "CREATE" ignored
psql: warning: extra command-line argument "EXTENSION" ignored
psql: warning: extra command-line argument "hstore;'" ignored
ERROR: unterminated quoted string at or near "'CREATE"
LINE 1: 'CREATE

ので、pgAdminで、xxxxxxx_ride_hailing_go のエントリーを作って接続してみたら、一応繋げた。

試しに、C:\Users\ebata\xxxxxxx_ride_hailing_go>docker-compose run db psql -h db -U postgres をやってみたら、ログインできて、こうなった

C:\Users\ebata\xxxxxxx_ride_hailing_go>docker-compose run db psql -h db -U postgres
psql (12.2 (Debian 12.2-2.pgdg100+1))
Type "help" for help.

postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
gis | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)

postgres=# \c gis
You are now connected to database "gis" as user "postgres".
gis=# \dt
Did not find any relations.
gis=#

やっぱり何も入っていないか。

ここから直接、

CREATE EXTENSION pgrouting CASCADE;
CREATE EXTENSION hstore;

を実行したら成功した。

次は、

C:\Users\ebata\xxxxxxx_ride_hailing_go>docker-compose run app migrate -database 'postgres://postgres:@db:5432/gis?sslmode=disable' -path ./repository/postgresql/migrations up
Starting xxxxxxx_ride_hailing_go_tile38_1 … done
Starting xxxxxxx_ride_hailing_go_db_1 … done
error: database: parse 'postgres://postgres:@db:5432/gis?sslmode=disable': first path segment in URL cannot contain colon

うーん、「コロンを消せ」と言われているようだけど、まあ、試してみる

C:\Users\ebata\xxxxxxx_ride_hailing_go>docker-compose run app migrate -database postgres://postgres:@db:5432/gis?sslmode=disable -path ./repository/postgresql/migrations up
Starting xxxxxxx_ride_hailing_go_db_1 … done Starting xxxxxxx_ride_hailing_go_tile38_1 … done 1/u create_administrators (43.041999ms)
2/u create_worlds (84.101398ms)
3/u create_passengers (126.189996ms)
4/u create_services (169.342395ms)
5/u create_bus_stops (237.856592ms)
6/u create_service_bus_stops (277.409391ms)
7/u create_waypoints (320.23459ms)
8/u create_trips (386.509487ms)
9/u add_pickuped_at_to_trips (410.829887ms)
10/u add_dissatisfaction_to_trips (437.705386ms)

通った。(ただ、その後、コンテナの再構築したら「コロンを消せ」のメッセージが出てこなくなった)。


その後、何度http://localhost をしても動かないので、試しに、http://localhost/admin/login から、 admin-0/password でログインできた。

「デモ世界の管理」を選択すると

が出てくるので、「地図表示」を選択すると、例の画面が出てきた。

そういえば、データの生成は、以下のコマンドで。

docker-compose run app go run cmd/dummy_data_generator_concurrent_small/main.go

ああ、疲れた。(これで、ようやく眠れる)

==========

$ cd /path/to/hitachi_ride_hailing_go
$ docker-compose build
# 上記部分が完了するまで、はじめての場合はネットワーク環境により数分かかります
$ docker-compose up -d
$ docker-compose run db createdb -h db -U postgres gis
$ docker-compose run db psql -h db -U postgres -d gis -c 'CREATE EXTENSION pgrouting CASCADE; CREATE EXTENSION hstore;'
$ docker-compose run db psql -h db -U postgres gis < repository/postgresql/data/dump.sql
$ docker-compose run db psql -h db -U postgres -d gis -f repository/postgresql/data/postgis-vt-util.sql
$ docker-compose stop
$ docker-compose start
$ docker-compose run app migrate -database 'postgres://postgres:@db:5432/gis?sslmode=disable' -path ./repository/postgresql/migrations up
$ docker-compose run app go run cmd/dummy_data_generator_concurrent_small/main.go
$ docker-compose stop
$ docker-compose start

Windows10のコマンドプロンプトではなく、MinGW64のシェルを使うと調子がいい

==========

2020/07,江端さんの技術メモ

石膏ボード 600円 5+1 枚
4x2フォーム 3000円くらい

吸音ざい 910X910 6 = 4500 x 6 27000 → 18000円くらい

防音シート 5885円
https://item.rakuten.co.jp/pialiving/cz-12/?iasid=07rpp_10095___eh-kcng6x35-2p-d8c44078-682d-426b-96ad-33c9bf2dc05f

2020/07,江端さんの技術メモ

	m_conn->prepare(                    // HACK 1. 2文を1文に(PQExec仕様)、2. JOIN周り、 3. ORDER BYを消せないか?
		"find_shortest_path_by_dijkstra_calc",
		R"(
			INSERT INTO s_dijkstra_memoization (source, target, node, edge, length_m)
			
				SELECT
					$1, $2, d.node, d.edge, coalesce(ways.length_m, 0) AS length_m
				FROM
					pgr_dijkstra (
						'SELECT gid AS id, source, target, length_m AS cost from ways',
						start_vid:=$1::bigint, end_vid:=$2::bigint, directed:=false::boolean
					) as d LEFT JOIN ways ON ways.gid = d.edge
			
			WHERE NOT EXISTS (SELECT source, target FROM s_dijkstra_memoization WHERE source = $1 AND target = $2);
		)",
					//RETURNING node, edge, length_m;
		2
	);

のところで、問題が発生しているのは分かるのだけど、私にとっては上記な呪文であり、さっぱり分からない。

とりあえず、psql から地道に部分的に動かしてみて、問題点を探っている。

ca_sim=# SELECT gid, source, target, length_m AS cost from ways;

gid | source | target | cost
------+--------+--------+--------------------
1 | 55 | 23 | 121.17749638577058
2 | 844 | 1 | 710.1279290280786
3 | 4807 | 2 | 40.26044319993349
4 | 6296 | 3 | 251.21876036796243
5 | 22 | 4 | 2181.7785758382133
6 | 18 | 6 | 435.2439693722031
7 | 4304 | 6 | 950.7269653866767
8 | 6289 | 7 | 29.068747479235597

となるが、

ca_sim=# SELECT * FROM pgr_dijkstra(
'SELECT gid, source, target, length_m AS cost FROM ways',
2, 3
);
ERROR: Column 'id' not Found
CONTEXT: SQL function "pgr_dijkstra" statement 1

となる。pgr_dijkstraを実行する為には、パラメータの名前まで注意しなければなならないらしい。

ca_sim=# SELECT * FROM pgr_dijkstra(
'SELECT gid AS id, source, target, length_m AS cost FROM ways',
2, 3
);
seq | path_seq | node | edge | cost | agg_cost
-----+----------+------+------+--------------------+--------------------
1 | 1 | 2 | 342 | 224.26753559377073 | 0
2 | 2 | 229 | 8773 | 295.36268951709405 | 224.26753559377073
3 | 3 | 6359 | 8771 | 41.04204131422657 | 519.6302251108648
4 | 4 | 6357 | 344 | 136.12897946273213 | 560.6722664250914
5 | 5 | 231 | 8688 | 58.55503032553214 | 696.8012458878235
6 | 6 | 6294 | 8690 | 191.73693713817062 | 755.3562762133556
7 | 7 | 6296 | 4 | 251.21876036796243 | 947.0932133515262
8 | 8 | 3 | -1 | 0 | 1198.3119737194886
(8 rows)

くるしまぎれに、

start_vid:=$1::bigint, end_vid:=$2

の部分に、

1、2

を、実数でベタ書きしたら、エラーが取れて、シミュレーションが走りだした(原因不明)

しかし、

start_vid:=$1::bigint, end_vid:=$2 → $1, $2

では、

ERROR: function pgr_dijkstra(unknown, unknown, unknown, directed => boolean) is not unique
LINE 7: pgr_dijkstra(
^
HINT: Could not choose a best candidate function. You might need to add explicit type casts.

Error:ERROR: function pgr_dijkstra(unknown, unknown, unknown, directed => boolean) is not unique
LINE 7: pgr_dijkstra(
^
HINT: Could not choose a best candidate function. You might need to add explicit type casts.

となってしまう。


ブログを読んで頂いたからから、以下のアドバイスを頂いたので、その観点より挑戦。

上の箇所の$1や$2は、SQLインジェクションされないためのprepare文のプレースホルダーです。
ドキュメントの該当箇所は次のものです。
https://www.postgresql.org/docs/current/sql-prepare.html
$1と$2に該当するものをうしろから代入してあげれば動く(はず)と思います。
MySQLは、たしか「?」がプレースホルダで、SQLiteも「?」がプレースホルダ(https://docs.python.org/ja/3/library/sqlite3.html をみたら、合ってました)だったように覚えています。PostgreSQLは$+数字をつかうことになっています。

そこで、このページを印刷しながら、比較して、色々試してみた

                pgr_dijkstra(
                    (SELECT gid AS id, source, target, length_m AS cost from ways),
                    start_vid:=$1::bigint, end_vid:=$2::bigint, directed:=false::boolean
                ) as d LEFT JOIN ways ON ways.gid = d.edge

ERROR:  subquery must return only one column
LINE 8:       (SELECT gid AS id, source, target, length_m AS cost fr...
              ^

Error:ERROR:  subquery must return only one column
LINE 8:       (SELECT gid AS id, source, target, length_m AS cost fr...
            FROM
                pgr_dijkstra(
                    'SELECT gid AS id, source, target, length_m AS cost from ways',
                    (start_vid:=$1::bigint), (end_vid:=$2::bigint), directed:=false::boolean
                ) as d LEFT JOIN ways ON ways.gid = d.edge
ERROR:  syntax error at or near ":="
LINE 9:       (start_vid:=$1::bigint), (end_vid:=$2::bigint), direct...
                        ^

Error:ERROR:  syntax error at or near ":="
LINE 9:       (start_vid:=$1::bigint), (end_vid:=$2::bigint), direct...

すでに試してみたが、これもやってみた

                pgr_dijkstra(
                    'SELECT gid AS id, source, target, length_m AS cost from ways',
                    $1, $2, directed:=false::boolean
                ) as d LEFT JOIN ways ON ways.gid = d.edge
ERROR:  function pgr_dijkstra(unknown, unknown, unknown, directed => boolean) is not unique
LINE 7:      pgr_dijkstra(
             ^
HINT:  Could not choose a best candidate function. You might need to add explicit type casts.

Error:ERROR:  function pgr_dijkstra(unknown, unknown, unknown, directed => boolean) is not unique
LINE 7:      pgr_dijkstra(
             ^
HINT:  Could not choose a best candidate function. You might need to add explicit type casts.

なんかエラーが増えてきたようだ(unknownが3つになった)。

他の行と比較してみながら、start_vid と end_vid を消してみた(これが記載されていない別の行があったので)

            FROM
                pgr_dijkstra(
                    'SELECT gid AS id, source, target, length_m AS cost from ways',
                    $1::bigint, $2::bigint, directed:=false::boolean
                ) as d LEFT JOIN ways ON ways.gid = d.edge

これで動いた。

けど、理由はさっぱり分かりません。$1::bigint, $2::bigint がキャストの書式?

トライアンド&エラーでやろうとすると、こういう目にあう、という良い教訓として下さい。