2020/05,江端さんの忘備録

PostgreSQLのDockerを作っていて、ようやくその「ラクさ」に気がつきました。

I've been building Docker for PostgreSQL and finally realized how easy it is.

それは「環境汚染から逃げられる」という一言につきます。

It can be summed up in one word: "I can get away with environmental pollution.

例えば、違うバージョンのPostgreSQLサーバを、1つのPCにインストールすることはできません。

For example, a different version of the PostgreSQL server cannot be installed on a single PC.

もちろんできない訳ではないのですが、大抵の場合、面倒な設定の衝突が発生し、どちらのサーバにも問題が発生します。

Of course, I can do it. In most cases, troublesome configuration conflicts occur, causing problems for both servers.

両方のPostgreSQLサーバをDockerで作っておいて、必要な時に必要な方だけを立ち上げれば、この問題が発生しません。

If I keep both PostgreSQL servers in Docker and only start up the one I need when I need it, I won't have this problem.

(まあ、正直に言えば、Docker自体、ホストOS(特にWindows)の上で変な動きをすることもあるので、世間で言うように、諸手を上げて「凄い」とまでは言えないのですが)

Well, to be honest, Docker itself can run weirdly on host OSes (especially Windows), so I can't say that it's "great" with all my hands, as people say....

-----

Dockerとは、要するに

Docker is, in short,

―― 別々のマンションに囲っておき、気が向いた時だけに尋ねることができる愛人

"a mistress you can keep enclosed in a separate condo and ask only when you feel like it"

この一言に尽きます。

I can sum it up in one word.

―― しかも、その愛人とマンションのコストが、恐しく安い

"What's more, the cost of the condo with the mistress is frighteningly cheap."

なぜ、多くの人は、この表現を用いてDockerを語らないのか、私には分かりません。

I don't know why so many people don't use this expression to talk about Docker.

-----

自分の品性が疑われるからかなぁ。

It may be because my character is questioned.

しかし、私のような「高潔な人物」でも思いつくメタファーなんですけどね。

However, it's a metaphor that even a " noble person " like me can come up with.

2020/05,江端さんの忘備録

我が家には、1Gの光ネットワークが敷設されています。

We have a 1G optical network in our house.

これまで、帯域の問題などは発生したことはなかったのですが、最近、しばしばネットワークが不調となることとがあります。

I have never had any bandwidth issues, but recently I have been experiencing frequent network malfunctions.

まあ、私が会社のリモート会議をして、嫁さんがAmazon PRIMEを見て、次女がリモート授業を受けて、長女が企業面接をやっている ――

Well, I'm doing corporate remote meetings, my wife is watching Amazon PRIME, my second daughter is taking remote classes, and my senior daughter is doing corporate interviews --

そんな状況が、同時に発生することになれば、スループットに問題が発生するだろうとは思います。

I think that if such a situation is to occur at the same time, there would be throughput problems.

-----

一方、ここにきて、「私(江端)の『無線は信用ならん』」のポリシーが上手く回っているように思います。

On the other hand, it seems that my (Ebata's) policy of "I don't trust radio" is working well here.

なにしろ、我が家は、自宅を建てた時に敷設した100Mイーサのネットワークがベースですし、その他、外壁や、庭の土の中にも、イーサネットが張り巡らされています。

After all, our house is based on the 100M Ethernet network that I installed when I built our house. There are also other Ethernet lines on the exterior walls and in the soil of the garden.

企業面接では、長女は、ノートPCに有線LANを接続しているようです。

In the company interview, my senior daughter seems to have a wired LAN connection to her laptop.

WiFiは通信品質の変動が激しいです。

WiFi is prone to fluctuating communication quality.

企業面接の途中で、通信リンクが切れたらシャレになりません。

It's no joke if she lose her communication link during the company interview.

-----

それにしても、『我が家のリビングで、就職面接が行なわれる時代がやって来ようとは』 ―― 誰が予想できたでしょうか。

By the way, who would have guessed that the era of job interviews in our living room would be coming ?

エンジニア、投資家、コンサル、ベンチャーの社長、政治家、人工知能(とか言う何かよく分からないもの)、誰も予想できなかった未来です。

It's a future that no one could have predicted, engineers, investors, consultants, venture presidents, politicians, artificial intelligence (or something I'm not sure).

(占い師とかカルト宗教団体は、厚顔甚しくも「私は予言していた」と言い出しかねないので、確認的に記載しておきます)。

I'll note this confirmatively, because fortune tellers and religious cults may say "I predicted it" with a thick face.

-----

スーツ姿でバッチリと決めた娘が、リビングで、自分のノートPCを使って面接している様は ――

My daughter, looking great in her suit, is interviewing in the living room on her notePC.

もちろん、面接中は、家族全員がリビングに立ち入りませんが、

Of course, the whole family won't be in the living room during the interview

もの凄い、非日常感です。

It's an amazing, extraordinary feeling.

2020/05,江端さんの忘備録

SNSの誹謗中傷によって、また誰かが自殺に追いやられたようです。

It seems that someone has been driven to suicide again by the slander on social media.

今さらですが、我が国において、この手の話は今回が初めてという訳ではありませんし、世界中でも同じ事件が起こっています。

I hate to say it now, but this is not the first time, and the same incidents are happening all over the world.

このような事件が発生する度に、私には不思議に思っています。

Every time an incident like this occurs, it makes me wonder.

―― 「SNSでの誹謗中傷はやめよう」とは言う人はいても、「SNSを使うのをやめよう」と言う人はいない

"There are people who say, "Let's stop slandering people on SNS," but there are no people who say, "Let's stop using SNS."

とても、不思議です。

It's very, very strange.

-----

この話、私には「銃規制」と同じ様に見えます。

This story, to me, looks a lot like "gun control".

我が国では、個人的な銃は「所持」しているだけで刑事罰の対象です。

In our country, personal "possession" of a gun is subject to criminal penalties.

日本国の法律は、銃の「殺傷」以外の効果(例えば「自衛力」)を個人の権利として認めていません。

Japanese law does not recognize the non-"lethal" effects of a gun (e.g., "self-defense") as an individual right.

しかし、我が国において、その「銃規制」の効果は絶大です。

However, in our country, that "gun control" has had a tremendous effect.

なにしろ、我が国では、銃による殺人事件は、「暴力あるいは暴力的脅迫によって自己の私的な目的を達しようとする反社会的集団」を除けば、ほとんど発生していません。

After all, we don't have any gun murders in this country with the exception of "an antisocial group that seeks to achieve its own private ends through violence or threats"

この反社会的集団が、一般市民に銃を使用したケースもありましたが、実行犯は勿論、組織は壊滅、組織の長も連座の罪となり、悲惨な人生を送り、その報いを受けています。

There have been cases where this anti-social group has used guns on civilians, but the perpetrators, of course, the organization has also been destroyed. The head of the organization has also been guilty of association. They had to live their miserable life, and are reaping the rewards.

勿論、1mmも同情する気にもなれませんが。

Of course, I'm not inclined to pity them at all.

-----

私は、「SNSを法律で規制せよ」などと言う気はありません。

I don't want to say that SNS should be regulated by law.

SNSによって形成される世論には、問題もありますが、有効な面もあると思っているからです。

The public opinion formed by social networking has its problems, but I believe that it also has an effective side.

ただ、「SNSでの誹謗中傷」の被害者に対して、本気の反省と同情と哀悼を「行動」として示すのであれば、

However, for victims of "slander on SNS," If we show real genuine remorse, sympathy and condolence as an "action",

「SNSをやめる」こと ―― それだけだと思うのです。

"To quit SNS" - I think that's it

正直、1人が「SNSをやめること」による社会への効果は絶無でしょう。

To be honest, the effect on society of one person quitting SNS will be negligible.

それでも、少なくとも「自分だけは行動した」と自分に言い切ることはできます。

Still, we can at least tell ourselves that "I am the only one who has acted"

-----

「SNSでの誹謗中傷はやめよう」と、SNSで叫び回る人間は、

People who go around shouting, "Stop slandering people on SNS!

私には、

I feel "vulgar" like

―― 銃をぶっぱなし続けながら「銃を規制すべきだ」と叫んでいる人間

"the person who keeps blasting guns and shouting "we should control guns!""

と同じ「品性のなさ」を感じるのです。

-----

ともあれ、今回の事件で、「SNSをやめる」という決断をした人がいれば、私にご一報下さい。

Anyway, if there is anyone who has decided to quit SNS because of this incident, please let me know.

ゆっくりとお話したいです。

I would like to take my time and talk to you.

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

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

postgres=#CREATE DATABASE ca_sim

  1. データベース拡張

psqlに入って次のコマンドを実行する。

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

  1. kashiwanoha.osmを読み込む

C:\Users\ebata\Desktop\20190327_casim_final\environment>docker cp kashiwanoha.osm ebata_db_1:/db_data

4.osm2pgrouting をインストール(が、できると思わなかったので、かなり驚いた)

うまくいなかかったときは、apt-get update; apt-get update をやってみる

root@70fa5aa3a11d:/# apt-get install osm2pgrouting

5.kashiwanoha.osmをインポート

root@70fa5aa3a11d:/# osm2pgrouting -f /db_data/kashiwanoha.osm -c /usr/share/osm2pgrouting/mapconfig_for_cars.xml -d ca_sim -U postgres

6.sqlファイルをシェルから実施する

root@70fa5aa3a11d:# psql -f /db_data/make_bus_route_table.sql -d ca_sim -U postgres

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

「YouTubeの張りつけ」テスト

■Subject(題目) Visualization of "Q-learning" progress using QGIS add-in "PosiVew" (QGISのアドイン"PosiVew"を使った、Q学習の進み方の視覚化)

■Outline(概要) The shorter the passenger pick-up to drop-off time, the higher the reward is given (乗客のピックアップからドロップオフまでの時間が短いほど、高い報酬を与えられる)

■Source codes and others(ソース、その他一式) http://www.kobore.net/diary_techno/?d...

■How to grasp the status(状態の認定方法) http://www.kobore.net/q_20190419.jpg

2020/05,江端さんの忘備録

私は、自動車のタイヤ交換(ノーマルタイヤ / スノータイヤ)を自分でやっています。

I have been doing my own car tire changes (stock tires / snow tires).

自分用のメモとして動画をYouTubeに上げています(注:音声が出ます)

I'm posting the video on YouTube as a note for myself (note: audio is available).

必要な機材の購入は、自動車ディーラーでのタイヤ交換1回分の料金で足り、大変コストパフォーマンスが良いからです。

The purchase of the necessary equipment is sufficient for the cost of one tire change at a car dealership, which is very cost-effective.

が、それ以上に、タイヤ交換というのは「楽しい」のです。

More than that, changing a tire is "fun".

まあ、年に2回しかやらないから、そう思えるのかもしれませんが(業務としてやるなら大変だと思います)。

Well, maybe the reason why I feel happy is that I only do it twice a year (it's hard work if I do it as a job).

「楽しいことなら、みんなと共有すべきだ」と思っています。

I think if it's fun, it should be shared with everyone.

そこで、嫁さんに「タイヤ交換のやり方」を教えようとしたら、丁重に断わられました。

However, when I tried to teach my wife how to change a tire, she politely refused.

-----

「そんなこと言って・・・私が死んだ後、どうするんだ!」

"You said that... what are you going to do after I'm dead!"

と言ったところ、私以外の家族全員が言いました。

After I said, the family members except me said

「どうするって・・・、普通にディーラーに行くよ」

"We are going to go to the dealership as normal"

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

pgRoutingをはじめて使ってみた」を、そのまま試させて頂いた

C:\Users\ebata>docker start -a ebata_db_1 ← pgRoutingで作ったDockerのDB
C:\Users\ebata>docker container exec -it ebata_db_1 bash ← ログインできる
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
routing | 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=# CREATE DATABASE d1; ← d1というログインできる
CREATE DATABASE
postgres=# \c d1 ← d1に接続
You are now connected to database "d1" as user "postgres".
d1=# CREATE EXTENSION postgis;
CREATE EXTENSION
d1=# CREATE EXTENSION pgrouting;
CREATE EXTENSION
d1=# CREATE TABLE edges (id serial, source int, target int, cost int); ← テーブルを作成する
CREATE TABLE
d1=# INSERT INTO edges (source, target, cost) VALUES (1, 2, 7), (1, 3, 9), (1, 6, 14), (2, 3, 10), (2, 4, 15), (3, 4, 11), (3, 6, 2), (4, 5, 6), (5, 6, 9); ← 端点ノード1、端点ノード2、コスト
INSERT 0 9
d1=# SELECT seq, node, edge, cost FROM pgr_dijkstra('SELECT id, source, target, cost FROM edges', 1, 5, directed:=false); ← ノード1からノード5までの最短コストを算出する
seq | node | edge | cost
-----+------+------+------
1 | 1 | 2 | 9
2 | 3 | 7 | 2
3 | 6 | 9 | 9
4 | 5 | -1 | 0
(4 rows)
1->3->6->5の最短コストが出てくる。

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

C:\Users\ebata>docker pull postgres:12.2
12.2: Pulling from library/postgres
bc51dd8edc1b: Pull complete
d2b355dbb6c6: Pull complete
d237363a1a91: Pull complete
ff4b9d2fde66: Pull complete
646492d166e7: Pull complete
828b1f103a3a: Pull complete
2ab9e3c9583f: Pull complete
4ab234e8a047: Pull complete
71b084e0c62f: Pull complete
bf30bd092a82: Pull complete
2aa61e9feb4e: Pull complete
aa5eca126d57: Pull complete
7046b64d69a3: Pull complete
a851dbb990ce: Pull complete
Digest: sha256:c5423e0febf82c33b5dc69aacd70d64418144db7bd355fa4ca30e6e5430b4123
Status: Downloaded newer image for postgres:12.2
docker.io/library/postgres:12.2

C:\Users\ebata>docker run -d --name postgres122 -e POSTGRES_PASSWORD=test -p 5432:5432 postgres:12.2
839317f0bb705daf5eac55cc6b4f74e0cbc49ff2f64e1efc9dd5e4d3f03e6515

C:\Users\ebata>docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
839317f0bb70 postgres:12.2 "docker-entrypoint.s…" 17 seconds ago Up 14 seconds 0.0.0.0:5432->5432/tcp postgres122

C:\Users\ebata>docker exec -ti postgres122 bash

2.準備
Windows10 BOX のC:\直下に、routing-20200221.sql を置いておく

3.ファイルのコピー
C:\Users\ebata>docker cp c:\routing-20200221.sql postgres122:/tmp/
でDockerの内部にコピー

4.コンテナに入る
C:\Users\ebata>docker exec -i -t postgres122 /bin/bash

5.コピーされているかを確認する
root@839317f0bb70:/# cd tmp
root@839317f0bb70:/tmp# ls
で、
routing-20200221.sql
が表示されたので成功

6.ローカルにdocker-compose.ymlを作成する

version: '3.7'

services:
  db:
    image: pgrouting/pgrouting:v3.0.0-dev-postgresql_12
    expose:
      - 5432
    ports:
    - 15432:5432
    volumes:
      - db_data
      - ./shared:/shared
  db_data:
    image: busybox
    volumes:
      - /data/db

8.次のコマンドを実施する
C:\Users\ebata>docker-compose up -d


9.DBの作成
C:\Users\ebata>docker-compose exec db createdb -h db -U postgres routing


10.postgisのインストール
C:\Users\ebata>docker-compose exec db psql -h db -U postgres -d routing -c 'CREATE EXTENSION pgrouting CASCADE; CREATE EXTENSION hstore;'


11.ダンプしたsqlの取り込み
C:\Users\ebata>docker-compose exec db psql -h db -U postgres routing -f /shared/routing-20200221.sql

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

can’t find package “github.com/lib/pq”

と、

Dockerで作ったpostgreSQLへの外部クライアントからのアクセス方法

を実施して、GoのプログラムからPostgreSQLサーバ(Docker版)にアクセスすることができました。

/*
go build -gcflags "-N -l" main.go

uft-8でセーブ

まず、以下の手順でテーブルを作っておく
 
C:\Users\yrl-user>psql -h localhost -U postgres	

postgres=# create database blogapp;

postgres=# \l		
postgres=# \connect blogapp(データベース名)
 
以下をコピペしてテーブルとその内容を直接書き込む
 
create table users (
	   id serial primary key,
	   name varchar(255),
	   score real,
	   team varchar(255)
					);
 
insert into users (name, score, team) values
('taguchi', 5.5, 'red'),
('fkoji', 8.3, 'blue'),
('dotinstall', 2.2, 'blue'),
('sakaki', 5.0, 'green'),
('sasaki', 4.6, 'red'),
('kimura', 4.7, 'green');
 
blogapp=# \dt
blogapp=# \d users(テーブル名)
 
データベースのテーブルの中身を確認する
blogapp=# select * from users; // 検索の基本形
 
*/



package main

import (
    "fmt"
    "database/sql"
    _ "github.com/lib/pq"
    "os"
)

// ----------------------------------------------------------------

func checkError(err error) {
	if err != nil {
		fmt.Fprintf(os.Stderr, "fatal: error: %s", err.Error())
		os.Exit(1)
	}
}

func main() {
    fmt.Fprintln (os.Stderr,"*** start ***")

	db, err := sql.Open("postgres", "user=postgres dbname=blogapp password=c-anemone sslmode=disable")

	checkError(err)
    defer db.Close()

	sql_str := "select id,name,score,team from users order by id"

    rows, err := db.Query(sql_str)
    if err != nil {
        fmt.Println(err)
        }

    defer rows.Close()

    for rows.Next() {
        var id string
        var name string 
        var score float32
        var team string 
        if err := rows.Scan(&id,&name,&score,&team); err != nil {
            fmt.Println(err)
        }
        fmt.Printf ("%s\t%s\t%f\t%s\n",id, name,score,team)
    }

    if err := rows.Err(); err != nil {
        fmt.Println(err)
        }

    fmt.Fprintln (os.Stderr,"*** end ***")
}

出力結果

*** start ***
1	taguchi	5.500000	red
2	fkoji	8.300000	blue
3	dotinstall	2.200000	blue
4	sakaki	5.000000	green
5	sasaki	4.600000	red
6	kimura	4.700000	green
*** end ***

ようやく一安心できました。