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

* [Dockerのあれこれを断捨離する](https://qiita.com/ksato9700/items/b0075dc54dfffc64b999)
* [dockerでいらないimage,container,networkを一括削除する](https://qiita.com/mom0tomo/items/911b92cc18871f52a2a0)

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

コンテナを一括削除する

$ docker ps -aq | xargs docker rm

イメージを一括削除する

$ docker images -aq | xargs docker rmi

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

「COCOAが「まもりあいJapan」のコードをベースにしている」という誤記を記載して、現在、COCOAのコードを探していましたが、どうやら、https://github.com/Covid-19Radar/Covid19Radar がソースコードの場所のようです。

現在、パッケージ一式をダウンロードして、読んでいます。

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

ここを↓をご参照下さい

===================

Wikipediaによりますと、

まもりあいJapanとは、新型コロナウイルス感染症(COVID-19)において陽性患者と濃厚接触した恐れのある人に通知を送るアプリとしてコード・フォー・ジャパンが開発し、Github上に公開したもの。2020年5月8日に厚生労働省が「新型コロナウイルス陽性判定者との濃厚接触ほか各種関連情報を迅速に通知するスマートフォンアプリ」を公式に導入することを決定し、これを受けて開発を取りやめた

となっなっており、以下の「まもりあいJAPAN」のコードと同じか、ベースとしている という、以下の記事は間違っております。訂正してお詫び申し上げます。

以下は、私の記録の為に残しますが、取扱にはご注意下さい。

===================

ここから↓は無視して下さい。

新型コロナウイルス接触確認アプリ(COCOA) COVID-19 Contact-Confirming Applicationが公開されています。

このアプリのソースコードは公開されている、「まもりあいJAPAN」コードと同じか、ベースとしているもののようです。

簡単にコードレビュー(本当に概要だけですが)したので、公開します。

本当のことを言えば、政府による個人情報の収集などの機能が組み込まれていないか、位置情報のトラックなどされていないかが心配だったので、調べました。

現在のところ、COCOAが「まもりあいJAPAN」のコードに100%準拠しているか確認が取れていません(これは、私がサボっているからです)し、そもそも「まもりあいJAPAN」も、現時点では、コードを眺めただけ(私がサボっているからです)、という状況なので、確たることは言えませんが、現時点では大丈夫ではないか、という所感を持っています。しかし ――

私が「見張っている」ということは、気にしておいて下さいね > 関係者各位皆様

まあ、政府が、個人情報の収集なんぞをやっていることがバレたら(通信パケットだけなら、発見は簡単です)、内閣は勿論、与党も吹き飛ぶのは間違いないと思うので、そういう意味でも、まあ、大丈夫ではないかと思っています。

私(江端)は、先程ダウンロードを完了しました。

で、今、ちょっと触っているのですが、ふざけて「陽性情報の登録」をするような奴がいたら、私が、草の根分けても、そいつを探し出します

(もちろん、仕組みとしては「できない」ハズですけど、激怒している時の私であれば、何をしでかすか分かりません(色々なことを思い付くことがあります)。お忘れなきよう)

ちなみに、各国のアプリについては、こちらを御参照下さい。

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

c:\Users\ebata\Desktop\codelab-master>set GOOS=js
c:\Users\ebata\Desktop\codelab-master>set GOARCH=wasm
c:\Users\ebata\Desktop\codelab-master>go build -o main.wasm
package main

import (
    "fmt"
    "syscall/js"
)

type Test struct {
    Num int
}

func (t *Test) Print(this js.Value, args []js.Value) interface{} {
    fmt.Println(t)
    return nil
}

func (t *Test) Twice(this js.Value, args []js.Value) interface{} {
    t.Num *= 2
    return nil
}


func (t *Test) Add(this js.Value, args []js.Value) interface{} {
    t.Num += args[0].Int()
    return nil
}

func (t *Test) GetNum(this js.Value, args []js.Value) interface{} {
    return js.ValueOf(t.Num)
}

func registerCallbacks() {
    var test = &Test{
        Num: 1,
    }
    js.Global().Set("test", js.ValueOf(
        map[string]interface{}{
            "Print": js.FuncOf(test.Print),
            "Twice": js.FuncOf(test.Twice),
            "Add":    js.FuncOf(test.Add),
            "GetNum": js.FuncOf(GetNum),
        },
    ))
}

func main() {
    c := make(chan struct{}, 0)
    registerCallbacks()
    <-c
}
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>Go wasm</title>
</head>

<body>
    <script src="wasm_exec.js"></script>
    <script>
        const go = new Go();
        WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject).then((result) => {
            go.run(result.instance);
        });
    </script>
    <script>
        function getNum(){
            console.log(test.getNum())
        }
    </script>
    <button onClick="test.Print();" id="runButton" >print</button><br>
    <button onClick="test.Twice()" id="runButton">twice</button><br>
    <button onClick="test.Add(1)" id="runButton">add</button><br>
    <button onClick="test.GetNum()" id="runButton">get test.Num</button><br>
</body>
</html>

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(https://wp.kobore.net/wp-admin/theme-editor.php?file=functions.php&theme=luxech)に追記したら、上手くいきました。

ここを弄って、WordPressが立ち上がらくなって、青さめたことがあったので、動いている状態のログを取っておく。

ただ、動かなくなったら、この画面にすら行けなくなるので、ffftpの画面も付けておく

現時点でのfunctions.phpの中身は以下の通り。

<?php
/**
 * Luxeritas WordPress Theme - free/libre wordpress platform
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * @copyright Copyright (C) 2015 Thought is free.
 * @link http://thk.kanzae.net/
 * @license http://www.gnu.org/licenses/gpl-2.0.html GPL v2 or later
 * @author LunaNuko
 */

/* 以下、好みに応じて子テーマ用の関数をお書きください。
 ( Below here, please write down your own functions for the child theme. ) */
remove_filter("the_content", "wptexturize");
remove_filter("the_excerpt", "wptexturize");
remove_filter("the_title", "wptexturize");

ところで、驚くべきことが書かれていたのですが「PHPの最後の終了タグ ?> は付けないでおこう」だそうです。(事実、タグを付けたら、WPが動かなくなった)

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

うまくいなかかったときは、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