「壁」計画
石膏ボード 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
ERROR: function pgr_dijkstra(unknown, start_vid => bigint, end_vid => bigint, directed => boolean) does not exist LINE 7: pgr_dijkstra ( ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. で、ずっと悩んでいる件について
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 がキャストの書式?
トライアンド&エラーでやろうとすると、こういう目にあう、という良い教訓として下さい。
SAIで黒いアイコンを赤くする方法
(Step 1) アイコンをコピー → [ファイル]→[クリップボードからキャンパス作成]→
(Step 2) [レイヤー]→[輝度を透明度に変換]
(Step 3) [合成モード]→[カラー2値化]
(Step 4) [不透明度]→80%くらい
(Step 5) [不透明度保護]くりっく
(Step 6) 赤を指定して、2値ペンで塗りたくる
以上
http://www.kobore.net/diary_techno/?date=20170204
Keyword: SAI 赤 赤色
インスタンスをすべて停止しているのに Amazon EBS に課金される
AWSから「AWS Free Tier limit alert」という脅迫・・ではなくて、警告メールが来て怖い思いをしています。
EC2を全部止めているのに、なぜ?と思っていたのですが、どうやら、スナップショットを置いてあると、それだけで課金されることが分かりました。
で、まあ、消してもいいかな、と思って消そうと思ったら「スマップショット削除中のエラー」が発生して消すことができませんでした。
この場合、連携しているAMI(私は未だに、このAMIという奴が良くわからんのですが)の登録解除をすると消せました。
EC2(AWS)は小まめに落しましょう
先月、AWSから、こんな請求書が来て青冷めました。
練習用のEC2を立ち上げておいただけで、5000円以上持っていかれました。
そもそも仕事で使うAWSの練習用のAWSで、5000円以上も自腹を切らわされるのは、なんとも業腹です ―― しかし、会社の飲み会で、まずい飯とつまらん会話で8000円支払わされること思えば、圧倒的に安いとは思いますが。
で、面倒なので、練習をしていない時は、EC2を落すようにしました(下記参照)
今月の支払いは、以下のようになりました。
まあ、200円弱くらいならいいかな、と思いました。
勉強や練習でEC2を使っている人は、こまめにEC2を落しましょう。
DockerのbashからSQLファイルを実行する方法
docker start -a ebata_db_1
docker container exec -it ebata_db_1 bash
で、SQLファイル(create_tables.sql)が、/db_data に入っている場合
psql -f /db_data/create_tables.sql(フルパス) -U postgres(ユーザ名) -d ca_sim(テーブル名)
で、実行可能。
フルパスにしないと、/db_dataの中から実行しても、"そんなファイルないよ"と(平気で)言われるので注意のこと
PostgreSQLの基本的なコマンド
内容 | コマンド例 |
サービスの起動 | postgres -D /usr/local/var/postgres |
デフォルトのテーブルに接続 | psql -d postgres |
直接データベースに接続 | psql -d テーブル名 |
データベース一覧の表示 | \l |
データベースへの接続 | \c データベース名 |
テーブルの作成 | create table テーブル名 ( counter int primary key, present_station int, departure_station int, present_time time ); |
データの書き込み | INSERT INTO テーブル名(counter, present_station, departure_station, present_time) VALUES(1, 2, 3, '12:23:34'); |
データの上書き | UPDATE テーブル名 set present_time = '23:34:45' WHERE counter = 1; |
テーブル一覧の表示 | \dt; |
テーブル構造の表示 | d テーブル名; |
テーブル内のデータを一覧 | select * from テーブル名; |
指定したカラムの内容を小さい順に表示 | select * from テーブル名 order by カラム; |
指定したカラムの内容を大きい順に表示 | select * from テーブル名 order by カラム desc; |
表示数指定 | select * from テーブル名 limit 数; |
表示の開始位置指定 | select * from テーブル名 offset 数; |
カラム内の任意の文字を表示 | select distinct カラム名 from テーブル名; |
カラム内の合計値 | select sum(カラム名) from テーブル名; |
カラム内の最大値 | select max(カラム名) from テーブル名; |
カラム内の最小値 | select min(カラム名) from テーブル名; |
カラム内の平均値 | select avg(カラム名) from テーブル名; |
データの更新 | update テーブル名 set 更新内容; |
全データの削除 | delete from テーブル名; |
テーブル本体の削除 | drop table テーブル名; |
データの削除 | delete from テーブル名 where 条件; |
テーブルのオーナーの変更 | alter table テーブル名 owner to オーナー名; |
文字数 | select length(カラム名) from テーブル名; |
文字列連結 | select concat(文字列, 文字列, ...) from テーブル名; |
カラムの追加 | alter table テーブル名 add カラム名 データ型; |
カラムの削除 | alter table テーブル名 drop カラム名; |
カラム名の変更 | alter table テーブル名 rename カラム名 to 新カラム名; |
カラムのデータ型を変更する | alter table テーブル名 alter カラム名 type データ型; |
インデックス追加 | create index インデックス名 on テーブル名(カラム名); |
インデックス削除 | drop index インデックス名; |
viewの作成 | create view ビュー名 as viewに指定するコマンド; |
view一覧の確認 | \dv; |
viewの使用方法 | select * from ビュー名; |
viewの削除 | drop view ビュー名; |
SQL文を外部ファイルに書いて実行する時に使う | \i ファイル名 |
osm_railway_linestring はどこにあるの?
osm_railway_linestringの場所がさっぱり分からないので、とりあえずOpenMapTilesがあやしいので、「OpenMapTiles Map Server を使ってサイトに地図を埋め込む」を、そのまま真似てみる
https://qiita.com/kmdsbng/items/fe9239e96afe29eb893c をそのまま実行
タイルデータをダウンロードする
https://openmaptiles.com/downloads/
Downloads > Asia > Japan > Tokyo から 東京エリアをダウンロードする
OpenMapTiles Map Serverを起動する
タイルデータを置いたディレクトリで以下の docker コマンドを実行
docker run --rm -it -v $(pwd):/data -p 8080:80 klokantech/openmaptiles-server
C:\Users\ebata\Desktop\hirohakama_sim>docker run --rm -it -v $(pwd):/data -p 8080:80 klokantech/openmaptiles-server
Unable to find image 'klokantech/openmaptiles-server:latest' locally
latest: Pulling from klokantech/openmaptiles-server
c5e155d5a1d1: Pull complete 221d80d00ae9: Pull complete 4250b3117dca: Pull complete 3b7ca19181b2: Pull complete 425d7b2a5bcc: Pull complete 69df12c70287: Pull complete ea2f5386a42d: Pull complete d421d2b3c5eb: Pull complete da30b29849e7: Pull complete 737fbec6f196: Pull complete e4745ce6fed7: Pull complete 28b22a8cf232: Pull complete Digest: sha256:1a6fec0108fa78cf778d385205b4b0197b8c599fb91f9e08a1f114af9df75584
Status: Downloaded newer image for klokantech/openmaptiles-server:latest
docker: Error response from daemon: create $(pwd): "$(pwd)" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path.
あ、Windows10のコマンドプロンプトでは、$(pwd)が解釈できないみたいなので、
C:\Users\ebata\Desktop\hirohakama_sim>docker run --rm -it -v ~/data -p 8080:80 klokantech/openmaptiles-server としてみたら
C:\Users\ebata\Desktop\hirohakama_sim>docker run --rm -it -v ~/data -p 8080:80 klokantech/openmaptiles-server
/usr/lib/python2.7/dist-packages/supervisor/options.py:298: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
'Supervisord is running as root and it is searching '
2020-06-29 15:43:52,652 CRIT Supervisor running as root (no user in config file)
2020-06-29 15:43:52,652 INFO Included extra file "/etc/supervisor/conf.d/openmaptiles.conf" during parsing
2020-06-29 15:43:52,655 INFO Creating socket tcp://localhost:8081
2020-06-29 15:43:52,656 INFO Closing socket tcp://localhost:8081
2020-06-29 15:43:52,663 INFO RPC interface 'supervisor' initialized
2020-06-29 15:43:52,663 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2020-06-29 15:43:52,664 INFO supervisord started with pid 1
2020-06-29 15:43:53,669 INFO spawned: 'wizard' with pid 8
2020-06-29 15:43:53,674 INFO spawned: 'xvfb' with pid 9
Starting OpenMapTiles Map Server (action: run)
2020-06-29 15:43:54,196 INFO success: wizard entered RUNNING state, process has stayed up for > than 0 seconds (startsecs)
2020-06-29 15:43:54,196 INFO success: xvfb entered RUNNING state, process has stayed up for > than 0 seconds (startsecs)
Config file not found!
Starting installation…
Installation wizard started at http://:::80/
List of available downloads ready.
で、このまま、で停止した状態。
ブラウザで http://localhost:8080/ にアクセス
"CONTINUE"を押下
"CONTINUE"を押下
"SAVE & RUN THE SERVER"を押下
Click here to get the download keyを押下
上記のKeyをコピペして、"START DOWNLOAD"を押すと
てな画面がでてくる。
"OPEN MAP SERVER"を押下した後、http://localhost:8080/をすると以下の画面が出てくる。
疲れた。今日はここまで。