今回のコラム「あの医師がエンジニアに寄せた“なんちゃってコロナウイルスが人類を救う”お話」で、使わなかった図面。
でも、今後、「素材として使える」かもしれないので、忘れないようにアップしておく。
ファイル名は「ワクチン_ボツ図面.pptx」で、いつものところに置いておくので、忘れないように > 私
江端智一のホームページ
今回のコラム「あの医師がエンジニアに寄せた“なんちゃってコロナウイルスが人類を救う”お話」で、使わなかった図面。
でも、今後、「素材として使える」かもしれないので、忘れないようにアップしておく。
ファイル名は「ワクチン_ボツ図面.pptx」で、いつものところに置いておくので、忘れないように > 私
(注)以下の情報は、「轢断のシバタ」先生から御提供頂いた情報です。
■SARS-CoV-2(武漢由来のオリジナルの新型コロナ)の全ゲノム情報です(https://www.ncbi.nlm.nih.gov/nuccore/1798174254)
■スパイクタンパク質の形です(https://numon.pdbj.org/mom/246?l=ja)
■こちらはSARS-CoV-2のゲノムの解説です。この中のGene Sがスパイクタンパク、もしくはサーフェイスタンパクと呼ばれる物です。(https://plaza.umin.ac.jp/~OIO/blog/2020/05/23/full-genome-sequence-of-sars-cov-2/)
■下記が、S protein(spike protein, surface protein)のDNA配列とされる全長です。
atgtttgtttttcttgttttattgccactagtctctagtcagtgtgttaatcttacaaccagaactcaattaccccctgcatacactaattctttcacacgtggtgtttattaccctgacaaagttttcagatcctcagttttacattcaactcaggacttgttcttacctttcttttccaatgttacttggttccatgctatacatgtctctgggaccaatggtactaagaggtttgataaccctgtcctaccatttaatgatggtgtttattttgcttccactgagaagtctaacataataagaggctggatttttggtactactttagattcgaagacccagtccctacttattgttaataacgctactaatgttgttattaaagtctgtgaatttcaattttgtaatgatccatttttgggtgtttattaccacaaaaacaacaaaagttggatggaaagtgagttcagagtttattctagtgcgaataattgcacttttgaatatgtctctcagccttttcttatggaccttgaaggaaaacagggtaatttcaaaaatcttagggaatttgtgtttaagaatattgatggttattttaaaatatattctaagcacacgcctattaatttagtgcgtgatctccctcagggtttttcggctttagaaccattggtagatttgccaataggtattaacatcactaggtttcaaactttacttgctttacatagaagttatttgactcctggtgattcttcttcaggttggacagctggtgctgcagcttattatgtgggttatcttcaacctaggacttttctattaaaatataatgaaaatggaaccattacagatgctgtagactgtgcacttgaccctctctcagaaacaaagtgtacgttgaaatccttcactgtagaaaaaggaatctatcaaacttctaactttagagtccaaccaacagaatctattgttagatttcctaatattacaaacttgtgcccttttggtgaagtttttaacgccaccagatttgcatctgtttatgcttggaacaggaagagaatcagcaactgtgttgctgattattctgtcctatataattccgcatcattttccacttttaagtgttatggagtgtctcctactaaattaaatgatctctgctttactaatgtctatgcagattcatttgtaattagaggtgatgaagtcagacaaatcgctccagggcaaactggaaagattgctgattataattataaattaccagatgattttacaggctgcgttatagcttggaattctaacaatcttgattctaaggttggtggtaattataattacctgtatagattgtttaggaagtctaatctcaaaccttttgagagagatatttcaactgaaatctatcaggccggtagcacaccttgtaatggtgttgaaggttttaattgttactttcctttacaatcatatggtttccaacccactaatggtgttggttaccaaccatacagagtagtagtactttcttttgaacttctacatgcaccagcaactgtttgtggacctaaaaagtctactaatttggttaaaaacaaatgtgtcaatttcaacttcaatggtttaacaggcacaggtgttcttactgagtctaacaaaaagtttctgcctttccaacaatttggcagagacattgctgacactactgatgctgtccgtgatccacagacacttgagattcttgacattacaccatgttcttttggtggtgtcagtgttataacaccaggaacaaatacttctaaccaggttgctgttctttatcaggatgttaactgcacagaagtccctgttgctattcatgcagatcaacttactcctacttggcgtgtttattctacaggttctaatgtttttcaaacacgtgcaggctgtttaataggggctgaacatgtcaacaactcatatgagtgtgacatacccattggtgcaggtatatgcgctagttatcagactcagactaattctcctcggcgggcacgtagtgtagctagtcaatccatcattgcctacactatgtcacttggtgcagaaaattcagttgcttactctaataactctattgccatacccacaaattttactattagtgttaccacagaaattctaccagtgtctatgaccaagacatcagtagattgtacaatgtacatttgtggtgattcaactgaatgcagcaatcttttgttgcaatatggcagtttttgtacacaattaaaccgtgctttaactggaatagctgttgaacaagacaaaaacacccaagaagtttttgcacaagtcaaacaaatttacaaaacaccaccaattaaagattttggtggttttaatttttcacaaatattaccagatccatcaaaaccaagcaagaggtcatttattgaagatctacttttcaacaaagtgacacttgcagatgctggcttcatcaaacaatatggtgattgccttggtgatattgctgctagagacctcatttgtgcacaaaagtttaacggccttactgttttgccacctttgctcacagatgaaatgattgctcaatacacttctgcactgttagcgggtacaatcacttctggttggacctttggtgcaggtgctgcattacaaataccatttgctatgcaaatggcttataggtttaatggtattggagttacacagaatgttctctatgagaaccaaaaattgattgccaaccaatttaatagtgctattggcaaaattcaagactcactttcttccacagcaagtgcacttggaaaacttcaagatgtggtcaaccaaaatgcacaagctttaaacacgcttgttaaacaacttagctccaattttggtgcaatttcaagtgttttaaatgatatcctttcacgtcttgacaaagttgaggctgaagtgcaaattgataggttgatcacaggcagacttcaaagtttgcagacatatgtgactcaacaattaattagagctgcagaaatcagagcttctgctaatcttgctgctactaaaatgtcagagtgtgtacttggacaatcaaaaagagttgatttttgtggaaagggctatcatcttatgtccttccctcagtcagcacctcatggtgtagtcttcttgcatgtgacttatgtccctgcacaagaaaagaacttcacaactgctcctgccatttgtcatgatggaaaagcacactttcctcgtgaaggtgtctttgtttcaaatggcacacactggtttgtaacacaaaggaatttttatgaaccacaaatcattactacagacaacacatttgtgtctggtaactgtgatgttgtaataggaattgtcaacaacacagtttatgatcctttgcaacctgaattagactcattcaaggaggagttagataaatattttaagaatcatacatcaccagatgttgatttaggtgacatctctggcattaatgcttcagttgtaaacattcaaaaagaaattgaccgcctcaatgaggttgccaagaatttaaatgaatctctcatcgatctccaagaacttggaaagtatgagcagtatataaaatggccatggtacatttggctaggttttatagctggcttgattgccatagtaatggtgacaattatgctttgctgtatgaccagttgctgtagttgtctcaagggctgttgttcttgtggatcctgctgcaaatttgatgaagacgactctgagccagtgctcaaaggagtcaaattacattacacataa
上記のDNA配列をアミノ酸配列に翻訳すると下記のMFVFから始まる配列が得られます。それ用のソフトウェアや専用のホームページなど一瞬で変換されます。
この配列から立体構造を専門のソフトでシミュレーションした結果に得られた前述の画像などが、皆さんがニュースで見たことのあるスパイクタンパク質の絵です。
皆さんの身体にmRNAワクチンまたはウイルスベクターワクチンが投与されると、体内で下記のアミノ酸配列(=SARS-CoV-2のスパイクタンパク)の全部or一部が合成されます。
これに免疫系が反応して抗体が作られることになります。
MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQGFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFLLKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITNLCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCFTNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYNYLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPYRVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFGRDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAIHADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPRRARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTMYICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFGGFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFNGLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQNVLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGAISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMSECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAHFPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELDSFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELGKYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSEPVLKGVKLHYT
■2点間の距離の算出
float ST_Distance(geometry g1, geometry g2);
float ST_Distance(geography gg1, geography gg2);
============
139.46383010 35.6078055 と 139.48004430 35.58936550 の距離を求めろ
============
SELECT ST_Distance('SRID=4326;POINT(139.46383010 35.6078055)'::GEOGRAPHY,'SRID=4326;POINT(139.48004430 35.58936550)'::GEOGRAPHY);
st_distance
---------------
2518.87992511 (単位はメートル)
(1 行)
SELECT ST_Distance(ST_Transform(ST_GeomFromText('POINT(139.46383010 35.6078055)',4326),26986),ST_Transform(ST_GeomFromText('POINT(139.48004430 35.58936550)',4326),26986));
st_distance
-----------------
2534.9890933572 (単位はメートル)
(1 行)
============
点(139.46507, 35.59577)と source 608 の距離を求めろ
============
SELECT ST_Distance('SRID=4326;POINT(139.46507 35.59577)'::GEOGRAPHY, the_geom) from ways where source = 608;
st_distance
-------------
48.64958043 (単位はメートル)
(1 行)
■点と線の最短距離の算出
===================
点(139.46383010 35.6078055) と
線(139.47364070 35.59500190),(139.47500790 35.59561250),(139.47618950 35.59667510) の # 3点は繋がっている
最短距離を求めろ
===================
SELECT ST_Distance('SRID=4326;POINT(139.46383010 35.6078055)'::GEOGRAPHY,'SRID=4326;LINESTRING(139.47364070 35.59500190,139.47500790 35.59561250, 139.47618950 35.59667510)'::GEOGRAPHY);
st_distance
---------------
1667.13188667 (単位はメートル)
(1 行)
■任意の座標に近いノードを1つ抽出
SELECT source, x1 as longitude, y1 as latitude, ST_Distance('SRID=4326;POINT(139.78468208 35.64553503)'::GEOGRAPHY, the_geom) as dist FROM ways ORDER BY dist limit 1;
;
source | longitude | latitude | dist
--------+-------------+------------+-------------
742 | 139.7831864 | 35.6469072 | 20.44846388
(1 row)
■任意の座標に近いノードを抽出
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters);
===============
点(139.47500790 35.59561250)から半径300メートル以内の全部のノードを、近い順に出せ
===============
SELECT source, x1 as longitude, y1 as latitude, ST_Distance('SRID=4326;POINT(139.47500790 35.59561250)'::GEOGRAPHY, the_geom) as dist FROM ways WHERE ST_DWithin(the_geom, ST_GeographyFromText('SRID=4326;POINT(139.47500790 35.59561250)'), 300.0) ORDER BY dist;
source | longitude | latitude | dist
--------+-------------+------------+--------------
277 | 139.4742202 | 35.5952626 | 0
342 | 139.4737614 | 35.5960846 | 0
554 | 139.4750079 | 35.5956125 | 0
554 | 139.4750079 | 35.5956125 | 0
465 | 139.4756076 | 35.5956018 | 54.35238655
465 | 139.4756076 | 35.5956018 | 54.35883189
148 | 139.4753681 | 35.5942035 | 62.47683957
488 | 139.4755625 | 35.595278 | 62.47683957
277 | 139.4742202 | 35.5952626 | 78.20859781
309 | 139.4758617 | 35.5957534 | 78.9363046
309 | 139.4758617 | 35.5957534 | 78.9363046
163 | 139.4736407 | 35.5950019 | 81.2567669
597 | 139.4728928 | 35.5961536 | 81.2567669
406 | 139.4760808 | 35.5958841 | 101.79071989
211 | 139.4761077 | 35.5959027 | 104.73755527
580 | 139.4761706 | 35.5959419 | 111.52418485
201 | 139.4762056 | 35.5959637 | 115.32014973
(単位はメートル)
/*
google Mapの座標値から距離を求めるルーチン
2018-03-21(水) 14:41:31
gcc -c location_calc.cpp
*/
#include <math.h>
typedef struct location{
// ちなみに X,Y 軸座標は、→に+ ↑に+
double longitude; // 経度 東経 139.691 X軸
double latitude; // 緯度 北緯 35.698 Y軸
} LOCATION;
#define rad2deg(a) ((a)/M_PI * 180.0) /* rad を deg に換算するマクロ関数 */
#define deg2rad(a) ((a)/180.0 * M_PI) /* deg を rad に換算するマクロ関数 */
double distance_km(LOCATION* A, LOCATION* B, double *rad_up)
{
double earth_r = 6378.137;
double loRe = deg2rad(B->longitude - A->longitude); // 東西
double laRe = deg2rad(B->latitude - A->latitude); // 南北
double EWD = cos(deg2rad(A->latitude))*earth_r*loRe; // 東西距離
double NSD = earth_r*laRe; //南北距離
double distance = sqrt(pow(NSD,2)+pow(EWD,2));
*rad_up = atan2(NSD, EWD);
return distance;
}
LOCATION* new_location(LOCATION* D, double diff_p_x, double diff_p_y)
{
double earth_r = 6378.137;
double loRe = diff_p_x / earth_r / cos(deg2rad(D->latitude)); // 東西
double laRe = diff_p_y / earth_r; // 南北
double diff_lo = rad2deg(loRe); // 東西
double diff_la = rad2deg(laRe); // 南北
static LOCATION C;
C.longitude = D->longitude + diff_lo; // 東西
C.latitude = D->latitude + diff_la; // 南北
return &C;
}
double diff_longitude(double diff_p_x, double latitude)
{
double earth_r = 6378.137;
// ↓ これが正解だけど、
double loRe = diff_p_x / earth_r / cos(deg2rad(latitude)); // 東西
// 面倒なので、これで統一しよう(あまり差が出ないしね)
//double loRe = diff_p_x / earth_r / cos(deg2rad(35.700759)); // 東西
double diff_lo = rad2deg(loRe); // 東西
return diff_lo; // 東西
}
double diff_latitude(double diff_p_y)
{
double earth_r = 6378.137;
double laRe = diff_p_y / earth_r; // 南北
double diff_la = rad2deg(laRe); // 南北
return diff_la; // 南北
}
Golangのサブルーチン化って、結構面倒くさい
■mainの後に記載しないと、文句言われる(VSCodeから)
/* GAでTSP問題を解くときの超定番である、
「ルート表現から順序条件に変換するアルゴリズム」と
「順序表現からルート表現に変換するアルゴリズム (前記の逆変換)」に加えて、
「交叉:2つの遺伝子をランダムな位置で交叉させる」
「変異:遺伝子の中でランダムに2点を交換する」
「遺伝子を作る」をサブルーチンにしてみた件 */
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano()) //シード変更可
var sliceZ = [100][]int{} // 100固体
for i := 0; i < 100; i++ {
sliceZ[i] = getInitDNA()
fmt.Printf("sliceZ[%v]: %v\n", i, sliceZ[i])
}
var sliceX = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var sliceY = []int{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
sliceX = mutatePath(sliceX)
fmt.Printf("mutate sliceX: %v\n", sliceX)
//var sliceZ = []int{} // 念のための初期化
//var sliceW = []int{}
fmt.Printf("old sliceX: %v\n", sliceX)
fmt.Printf("old sliceX: %v\n", sliceY)
sliceX, sliceY = crossPath(sliceX, sliceY)
fmt.Printf("new sliceX: %v\n", sliceX)
fmt.Printf("new sliceX: %v\n", sliceY)
fmt.Printf("=======\n")
// ルート表現から順序条件に変換するアルゴリズム
var sliceA = []int{7, 8, 0, 4, 1, 6, 3, 9, 5, 2} // ルート表現
//var sliceB = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var sliceC = []int{} // 順序条件が入るところ
fmt.Printf("sliceA: %v\n", sliceA)
sliceC = encodePath(sliceA)
fmt.Printf("sliceC: %v\n", sliceC)
fmt.Printf("=======\n")
sliceA = []int{} // sliceAのリセット
sliceA = decodePath(sliceC)
fmt.Printf("sliceA: %v\n", sliceA)
}
// 遺伝子を作る
func getInitDNA() []int {
var sliceA = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var sliceB = []int{}
length := len(sliceA)
// 参考: http://okwave.jp/qa/q7687312.html
for i := 0; i < length; i++ {
k := rand.Intn(len(sliceA))
j := sliceA[k]
sliceA = append(sliceA[:k], sliceA[k+1:]...) // k番目の要素を削除
sliceB = append(sliceB, j)
}
return sliceB
}
// 変異:遺伝子の中でランダムに2点を交換する
func mutatePath(sliceA []int) []int {
length := len(sliceA)
pos1 := rand.Intn(length)
pos2 := rand.Intn(length)
tmp1 := sliceA[pos1]
tmp2 := sliceA[pos2]
sliceA[pos1] = tmp2
sliceA[pos2] = tmp1
return sliceA
}
// 交叉:2つの遺伝子をランダムな位置で交叉させる
func crossPath(sliceA []int, sliceB []int) ([]int, []int) {
length := len(sliceA)
pos := rand.Intn(length-1) + 1
fmt.Printf("pos: %v\n", pos)
sliceA1 := make([]int, length)
copy(sliceA1, sliceA)
sliceB1 := make([]int, length)
copy(sliceB1, sliceB)
var sliceC = append(sliceA1[:pos], sliceB1[pos:]...)
sliceA2 := make([]int, length)
copy(sliceA2, sliceA)
sliceB2 := make([]int, length)
copy(sliceB2, sliceB)
var sliceD = append(sliceB2[:pos], sliceA2[pos:]...)
return sliceC, sliceD
}
// パスを順序表現から戻す
func decodePath(sliceC []int) []int {
var sliceB = []int{}
// スライスBを作る 抜き出すための数値列 0,1,2,3,4,
for i := 0; i < len(sliceC); i++ {
sliceB = append(sliceB, i)
}
var sliceA = []int{} // 今からルート表現を入れるところ
for i := 0; i < len(sliceC); i++ {
k := sliceC[i]
j := sliceB[k]
sliceA = append(sliceA, j)
sliceB = append(sliceB[:k], sliceB[k+1:]...) // k番目の要素を削除
}
return sliceA
}
// パスを順序表現に符号化する
func encodePath(sliceA []int) []int {
var sliceB = []int{} // 抜き出すための数値列 0,1,2,3,4,
var sliceC = []int{} // 順序条件が入るところ
// スライスBを作る
for i := 0; i < len(sliceA); i++ {
sliceB = append(sliceB, i)
}
// ルート表現から順列表現に変換
for i := 0; i < len(sliceA); i++ {
for k := 0; k < len(sliceB); k++ {
if sliceA[i] == sliceB[k] {
sliceC = append(sliceC, k)
sliceB = append(sliceB[:k], sliceB[k+1:]...) // k番目の要素を削除
break
}
}
}
return sliceC
}
その他golangに関してVSCodeから文句を言われる項目としては、
■変数に"_"使うと怒られる
■記載方法にケチをつけられる
func subroutine()
{
...
}
と記載すると怒られる。
func subroutine(){
...
}
としなければならない
/*
GAでTSP問題を解くときの超定番である、
「ルート表現から順序条件に変換するアルゴリズム」と
「順序表現からルート表現に変換するアルゴリズム (前記の逆変換)」を
Golangで試してみた件
*/
package main
import "fmt"
func main() {
// ルート表現から順序条件に変換するアルゴリズム
var sliceA = []int{7, 8, 0, 4, 1, 6, 3, 9, 5, 2} // ルート表現
var sliceB = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
// 1111 var sliceC = [10]int{} // 順序条件が入るところ
var sliceC = []int{} // 順序条件が入るところ
// ルート表現から順列表現に変換
for i := 0; i < len(sliceA); i++ {
fmt.Printf("i: %v\n", i)
for k := 0; k < len(sliceB); k++ {
fmt.Printf("k: %v\n", k)
if sliceA[i] == sliceB[k] {
fmt.Printf("before Slice_A: %v\n", sliceA)
fmt.Printf("before Slice_B: %v\n", sliceB)
fmt.Printf("before Slice_C: %v\n", sliceC)
// 1111 sliceC[i] = k
sliceC = append(sliceC, k)
sliceB = append(sliceB[:k], sliceB[k+1:]...) // k番目の要素を削除
fmt.Printf("after Slice_A: %v\n", sliceA)
fmt.Printf("after Slice_B: %v\n", sliceB)
fmt.Printf("after Slice_C: %v\n", sliceC)
fmt.Printf("\n")
}
}
}
fmt.Printf("=======\n")
// 順序表現からルート表現に変換するアルゴリズム (上記の逆変換)
sliceA = []int{} // 今からルート表現を入れるところ
sliceB = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
// sliceCには、すでに順序表現が入っている
for i := 0; i < len(sliceC); i++ {
fmt.Printf("i: %v\n", i)
k := sliceC[i]
fmt.Printf("k: %v\n", k)
j := sliceB[k]
fmt.Printf("j: %v\n", j)
fmt.Printf("before Slice_C: %v\n", sliceC)
fmt.Printf("before Slice_B: %v\n", sliceB)
fmt.Printf("before Slice_A: %v\n", sliceA)
sliceA = append(sliceA, j)
sliceB = append(sliceB[:k], sliceB[k+1:]...) // k番目の要素を削除
fmt.Printf("after Slice_C: %v\n", sliceC)
fmt.Printf("after Slice_B: %v\n", sliceB)
fmt.Printf("after Slice_A: %v\n", sliceA)
}
fmt.Printf("\n")
}
作って頂いたものをメモ(「パクる」とも言う)
(1)"gintoyo_postgres_1 docker-entrypoint.sh Up 0.0.0.0:8910->5432/tcp" というDockerコンンポーネントが動作中であるとする。
(2)docker exec -it gintoyo_postgres_1 psql -U postgres -d ca_sim という方法で、"ca_sim"というDBに直接アクセスできるものとする。
(3)docker exec -it gintoyo_postgres_1 bash → psql -d ca_sim -p 8910 -U postgres という方法でも"ca_sim"というDBにアクセスできるものとする
ca_sim というDBと全く同じものを、ca_sim9という名前で作る
(Step.1) Dockerで直接DBには入らないで、シェルでログインする
C:\Users\ebata\20210203\gintoyo>docker exec -it gintoyo_postgres_1 bash