2020/06,江端さんの忘備録,江端さんの技術メモ

このページをまるまる試しました。

Roaming Geofences - Tile38

Roaming Geofences

Tile38 1.2では、geofencesを動的に使用できる強力な新機能が導入されました。これにより、1つ以上の移動体が近くにある場合のリアルタイム監視が可能になります。

一般的な使用例としては、次のようなものがあります。

  • 車両ピックアップサービス: ピックアップを待っている人が近くにいるとき、または人が車に近づいたとき、または車が近くにいるときに瞬時に通知されます。

  • 近接型ソーシャルアプリ: 常にデータベースを照会しなくても、2人のユーザーが近くにいるかどうかを確認する必要がある場合に非常に便利です。


簡単な例:

NEARBY people FENCE ROAM people * 5000

これは people コレクションのローミングフェンスを開きます。フェンスは、同じコレクション内の他のオブジェクトから5000メートル以内にあるオブジェクトを監視しています。

テストするには、2つの端子を開きます。:

ターミナル1

Tile38サーバーに接続し、fenceコマンドを入力します。

$ tile38-cli

localhost:9851> NEARBY people FENCE ROAM people * 5000

ターミナル2

peopleコレクションに2点を追加します。2つ目のsetコマンドは、もう一方の端末に表示されるフェンスイベントをトリガーします。

$ tile38-cli

localhost:9851> SET people bob POINT 33.01 -115.01

localhost:9851> SET people alice POINT 33.02 -115.02

イベントはターミナル1に表示され、以下のようになります。

{

"command":"set",

"detect":"roam",

"hook":"",

"key":"people",

"id":"alice",

"time":"2016-05-24T09:19:44.08649461-07:00",

"object":{"type":"Point","coordinates":[-115.02,33.02]},

"nearby":{

"key":"people",

"id":"bob",

"meters":1451.138152186708

}

}

アリスが更新されてボブは1,451メートル離れていることがわかります。

他にもいくつかの例があります。

# アリスボブがお互いに100メートル以内にいるかを見張ります。

NEARBY people MATCH alice FENCE ROAM people bob 100

# 'a'で始まるオブジェクトは、友達のコレクション内の任意のオブジェクトの100メートル以内にいるかを見張ります。

NEARBY people MATCH a* FENCE ROAM friends * 100

また、webhooksを使用している場合は、このようなフェンスを割り当てることができます。

SETHOOK myhook http://10.0.1.5/hook NEARBY people FENCE ROAM people * 5000

NODWELL Keyword

副次的な効果としては、2つの場合に近くの通知がたくさん届くことがあります。 オブジェクトがお互いに近くに存在し続けます。これが問題であれば nodwellキーワードを使います

tile38-cli> NEARBY people FENCE NODWELL ROAM people * 5000

これにより、2つの接続オブジェクトに対して、近くの通知と遠くの通知が繰り返されるようになります。

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

これをやられると、コマンドのコピペをする時に、困ったことになるので、対応を探していたら、"WordPress 半角の「"」や「'」が、全角に変換されてしまう件"と同じ対応したら上手くいったので、メモを残しておきます。

remove_filter("the_content", "wptexturize");
remove_filter("the_excerpt", "wptexturize");
remove_filter("the_title", "wptexturize");

の3行をまとめてfunctions.phpに追記したら、上手くいきました。

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

基本的には、https://tile38.com/topics/geofencing/ と同じことをやっただけ

(Step 1)サーバを立ち上げる
C:\Users\ebata>docker run -p 9851:9851 tile38/tile38

(Step 2)1つ目のターミナルを上げる
F:\しゅらばしゅう\tile38-master>docker run ----net=host -it tile38/tile38 tile38-cli
127.0.0.1:9851> SETCHAN warehouse NEARBY fleet FENCE POINT 33.462 -112.268 6000
{"ok":true,"elapsed":"41.5µs"}
127.0.0.1:9851> SUBSCRIBE warehouse
{"ok":true,"command":"subscribe","channel":"warehouse","num":1,"elapsed":"4.4µs"}

(Step 3)2つ目のターミナルを上げる
$ winpty docker run --net=host -it tile38/tile38 tile38-cli

(Step 4)2つ目のターミナルから座標を入力する
127.0.0.1:9851> SET fleet bus POINT 33.460 -112.260
{"ok":true,"elapsed":"61.7µs"}

1つ目のターミナルに以下が表示される。
{
"command":"set", ← (A)
"group":"5ed3c9a30a24b900011ea4a8",
"detect":"enter", ←(B)
"hook":"warehouse",
"key":"fleet",
"time":"2020-05-31T15:13:39.296483124Z",
"id":"bus",
"object":{"type":"Point","coordinates":[-112.26,33.46]}
}
(A)
del:フェンスで囲まれているコレクションからオブジェクトが削除されたことをクライアントに通知します。
drop:コレクション全体が削除されたことをクライアントに通知します。
set:オブジェクトが追加または更新されたことをクライアントに通知します。
(B)
inside:オブジェクトが指定された領域の内側にあるときです。
outside:オブジェクトが指定されたエリアの外にあるときです。
enter:以前はフェンスの中にいなかったオブジェクトがエリアに入ったときです。
exit:以前フェンスの中にいたオブジェクトがエリアから出たときです。
cross:以前はフェンスの中になかったオブジェクトがエリアに入り、エリアを出たときです。

ところで、
$ SETCHAN warehouse NEARBY fleet FENCE DETECT inside,outside POINT 33.462 -112.268 6000
とか、指定することを可能。
また、例えば COMMANDS オプションを使用することで、どのコマンドを返すかをマスクすることも可能です。以下は、これは、setコマンドのenter検出のみを行うことを指定します。
$ SETCHAN warehouse NEARBY fleet FENCE DETECT enter COMMANDS set POINT 33.462 -112.268 6000

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

[tile38のdockerのインストール]

docker pull tile38/tile38
(これは1回で良い)

[tile38サーバのdockerの起動]
Windows10のコマンドプロンプト立ち上げて
docker run -p 9851:9851 tile38/tile38

で、サーバ起動

C:\Users\ebata>docker run -p 9851:9851 tile38/tile38


てな表示が出てきて、表示がロックされる

[tile38クライアントのdockerの起動]

F:\tile38-master>docker run --net=host -it tile38/tile38 tile38-cli
127.0.0.1:9851>

(ちなみに、"docker run -it tile38/tile38 tile38-cli"だと、"Could not connect to Tile38 at 127.0.0.1:9851: Connection refused"が連続で出てくる)

なんだかよく分からないが、https://tile38.com/topics/command-line-interface/ に記載されている内容を入力すると、こうなった。

127.0.0.1:9851> SET fleet truck1 POINT 33.5123 -112.2693
{"ok":true,"elapsed":"45.7μs"}
127.0.0.1:9851> SET fleet truck2 POINT 33.4626 -112.1695
{"ok":true,"elapsed":"8.9μs"}
127.0.0.1:9851> SCAN fleet
{"ok":true,"objects":[{"id":"truck1","object":{"type":"Point","coordinates":[-112.2693,33.5123]}},{"id":"truck2","object":{"type":"Point","coordinates":[-112.1695,33.4626]}}],"count":2,"cursor":0,"elapsed":"56.7μs"}
127.0.0.1:9851> NEARBY fleet POINT 33.462 -112.268 6000
{"ok":true,"objects":[{"id":"truck1","object":{"type":"Point","coordinates":[-112.2693,33.5123]}}],"count":1,"cursor":0,"elapsed":"37.2μs"}
127.0.0.1:9851> GET fleet truck1
{"ok":true,"object":{"type":"Point","coordinates":[-112.2693,33.5123]},"elapsed":"8.8μs"}
127.0.0.1:9851> DEL fleet truck2
{"ok":true,"elapsed":"5.5μs"}
127.0.0.1:9851> DROP fleet
{"ok":true,"elapsed":"1.9μs"}
127.0.0.1:9851> q
(error) unknown command 'q'
127.0.0.1:9851> quit

というように、とりあえずDockerのtile38サーバの起動を確認。

========

ちなみに、ダウンロードしてきた"tile38-master.zip"からDockerを作ろうとしましたが、上手くいきませんでした。
(Docker使うなら、上記の手順と同じことになります)

ただ、手順は間違っていないと思うので、書き残しておきます。

tile38-master.zipを解凍して、tile38-masterの中で、makeを実施(Goのインストールは前提)。

すると、tile38-masterの中に、
tile38-benchmark
tile38-cli
tile38-server

ができる。

あとは、docker build .
で、Docker Imageができる。

が、このImageの中に上記の3つが入らなくて、頭を抱えて週末が終わった。

(結局、"docker pull tile38/tile38" ,"docker run -p 9851:9851 tile38/tile38"だけで足ることが分かったのは、日曜日の夜だった)

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 をインストール(が、できると思わなかったので、かなり驚いた)

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,江端さんの技術メモ

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 ***

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

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

「DockerのpostgreSQLの起動方法」で、postgreSQL(ポスグレ)サーバは作れたのは良かったのですが、クライアント(例 pgAdmin4)からアクセスできないことが分かりました。どうやら原因は、パスワードがない、ということのようです。fe_sendauth: no password suppliedが消えません。

私は、CとかGoのプログラムから、ポスグレを使おうとしていますが、pgAdmin4からアクセスできないとなると、多分、「CとかGoのプログラムからは動せない」と思いました。

ロールやらなんやらを追加する方法もあるようですが、私は、ポスグレの運用は、できるだけ手を抜きたいし、そもそもポスグレを外部公開する予定はないので、セキュリティもスカスカでかまいません(もちろん、SSHなんぞも不要)。

そこで、Dockerのポスグレにパスワード("c-anemone")を追加しました。

C:\Users\ebata>docker start -a postgres122

C:\Users\ebata>docker container exec -it postgres122 bash

root@19e323b3f7c1:/# psql -U postgres

とした状態で、

postgres=# alter role postgres with password 'c-anemone';

と打ち込んだ後、psqlからログアウトして、別のコンソールから、

C:\Users\ebata>docker stop postgres122

C:\Users\ebata>docker start -a postgres122

と再起動をしました。

その後、pgAdmin4のCreateの設定画面にパスワードを入力したら、

さくっとログインできました。