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

■全部のDockerを止める
C:\Users\ebata>docker ps -aq | xargs docker stop

■全部のDockerを消す
C:\Users\ebata>docker ps -aq | xargs docker rm (これやると、これまでの設定も全滅するので注意)

(ちなみに2つを纏めてやる方法は、>docker prune と教えて貰いました )

■作りなおす
C:\Users\ebata>docker run -d --name postgres122 -e POSTGRES_PASSWORD=test -p 5432:5432 postgres:12.2

■確認(スキップしてもいい)
C:\Users\ebata>docker container ls

■確認(シェルに入れることを確認する(しなくてもいい))
C:\Users\ebata>docker exec -ti postgres122 bash

■ファイルコピー(やらなくてもいいが、やらないと後の話に繋がらない)
C:\Users\ebata>docker cp c:\routing-20200221.sql postgres122:/tmp/

■コンテナに入る(やらなくてもいい)
C:\Users\ebata>docker exec -i -t postgres122 /bin/bash

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

■ローカル(例えば C:\Users\ebata)に以下の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

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

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

■postgisのインストール(これが失敗するみたい)
C:\Users\ebata>docker-compose exec db psql -h db -U postgres -d routing -c 'CREATE EXTENSION pgrouting CASCADE; CREATE EXTENSION hstore;'

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

■作られたDockerの確認
C:\Users\ebata>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
64101530c199 pgrouting/pgrouting:v3.0.0-dev-postgresql_12 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:15432->5432/tcp ebata_db_1
f5ae64d47096 busybox "sh" About a minute ago Exited (0) About a minute ago ebata_db_data_1
d7838161c2f9 postgres:12.2 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:5432->5432/tcp postgres122

----- ここから次のフェーズに入る ------

■ログインする
C:\Users\ebata>docker container exec -it ebata_db_1 bash

■psqlに入る
C:\Users\ebata>docker container exec -it ebata_db_1 bash
root@64101530c199:/#
root@64101530c199:/#
root@64101530c199:/# psql -U postgres
psql (12.0 (Debian 12.0-2.pgdg100+1))
Type "help" for help.

postgres=#

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)

■d1というDBを作る
postgres=# CREATE DATABASE d1;

■d1に接続
postgres=# \c d1
You are now connected to database "d1" as user "postgres".

■postGISのインストール
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の最短コストが出てくる。

--------- Dockerで作ったpgRoutingにosmファイルをインポートする ---------

(一回psqlをログアウトしてから、再度 psql -U postgres でログインした)

■データベース新規作成
psqlでデータベースを新規作成する(以下、データベース名をca_simとする)。
postgres=#CREATE DATABASE ca_sim;

■データベース拡張
psqlに入って次のコマンドを実行する。

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

■kashiwanoha.osmを読み込む
C:\Users\ebata\Desktop\20190327_casim_final\environment>docker cp kashiwanoha.osm ebata_db_1:/db_data

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

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

■kashiwanoha.osmをインポート

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

■sqlファイルをシェルから実施する(これ実施中→うまくいなかいが、後の処理で回収できる(はず))

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

--------- QGISでの表示の為のパスワードの設定 --------

■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

この後、間違っても、"docker ps -aq | xargs docker rm"なんぞやらんように。ここまでの設定が吹き飛ぶ

===== このままPCを落して寝ると、次の日、DBが落ちているので、立ち上げ直す

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

次は、ebata_db_1の方を使えるようにする。

C:\Users\ebata>docker start -a ebata_db_1 ← pgRoutingで作ったDockerのDB
C:\Users\ebata>docker container exec -it ebata_db_1 bash ← ログインできる

root@19e323b3f7c1:/# psql -U postgres

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

C:\Users\ebata>docker stop ebata_db_1

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

これで、QGIS3 や pgAdmin4からアクセスできるようになる(というか、"なった")

------- PostgresのpostGISに、鉄道情報も入れる --------

omsのデータには、鉄道情報入っていません(と思う osm2pgrouting にtrainを取り出すオプションがなかったので) ―― ので、国土地理院からダウンロードする

https://nlftp.mlit.go.jp/ksj/index.html から 鉄道時系列(ライン)(ポイント)を探して、ここからファイル(N02-08.zip)をPCにダウンロードして解凍する。中身はKS-META-N02-08.xmlと、N02-08.xml が入っている。

ところが、xmlファイルは、postgresにインポートできないのでshpファイルに変換する必要がある。

で、https://nlftp.mlit.go.jp/ksj/jpgis/jpgis_tool.html にある、「国土数値情報XML-シェープ変換ツール」をダウンロードしてインストールする。私の場合、64Bit版OSに対応した変換ツールはこちらからダウンロードできます。(ksjtool_64_v1.8.zip 約18MB)をダウンロードした。

で、先程のN02-08.xmlを変換すると、N02-08_EB02.dbf、N02-08_EB02.shp、N02-08_EB02.shx、N02-08_EB03.dbf、N02-08_EB03.shp、N02-08_EB03.shx が生成される。

(どういう訳か、shp2pgsqlがなくて、apt-get install shp2pgsql にも失敗するので)、QGIS3を使って、PostgresのDBにつっこむ。

N02-08_EB02 を選んで、OKを押下して、さらにN02-08_EB03を選んで、OKを押下する(2つインポートする)

以下を見ると、N02-08_EB02は路線情報が、N02-08_EB03は駅の情報が入っているみたい

ただ、selectしようとすると、変なエラーがでるので、テーブルの名前を変更した方がいい(が、今日は疲れたので、ここまで)

selectでは、テーブルの名前は小文字で、"-"も使えないようである。QGISから、以下のように変更した。

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

(昨日の続きです)

(Continuation from yesterday)

COCOAのセキュリティや個人情報の流出が心配なら、いっそのこと Contributorとして参加させて貰えばいいかな、と思いつきました。

If I am worried about COCOA's security and the release of your personal information, I came up with the idea that I might as well go to Contributor.

まあ、ソースコード開発は無理としても、テスターくらいなら役に立つかもしれません。

Well, even if I can't do source code development, it might be useful, at least for testers.

とは言え、もうリリースされているし、今後バージョンアップでもない限り、私がでしゃばる場面はないかもしれません。

However, it's already released, and unless it's an upgrade in the future, there may not be a situation where I'm going to be stuck with it.

まだソースコードをちゃんと読んでいる訳ではないのですが、オープンソースとして公開されているという時点で、「個人情報が抜かれる」とか「政府に監視される」とかをチェックするのが面倒くさくなってきたのです。

I haven't read the source code properly yet, but I am tired of checking for "personal information being pulled out" or "government surveillance" just because it's published as open source.

これは、「テスト前に、人のノートのコピーを取っただけで安心してしまう」という、あの心理に似ています。

This is similar to a peace of mind of "just getting a copy of someone's notes before a test".

そもそも、私は、オープンソースの開発者は信じることができきます(これは理屈ではありません)。

To begin with, I can believe (not in theory) that open source developers are believable.

それと、政府首脳の、あの絶望的なITリテラシーを見ている限り、

And, as far as the heads of government are concerned, that hopeless IT literacy, I have a tremendous amount of trust in the government that

『現政府に、ITを使った陰謀を企てられるほどの知性も度胸もない』

"The current government lacks the intelligence and nerve to pull off an IT conspiracy"

という、政府に対する絶大な信頼があります。

最近、巷で騒がれている元大臣の選挙違反事件についても、そのIT情報の取り扱い(証拠隠滅)は、酷いものです。

According to the election fraud case of a former minister, their handling of IT information (destruction of evidence) is terrible.

地検によってパソコンから証拠のデータを復元させられるなど ―― 私なら、その事実で、恥かしくて転げ回りそうです。

"The district attorney's office can have evidence recovered from your computer"、If I were him, I would be so embarrassed with crying.

-----

COCOAのインストールは個人の自由ですが、私はインストールをお勧めしたいと思います。

Installing COCOA is a personal choice, but I would recommend that you install it.

特に、接客業の人には、感染リスクを見える化できる、という点で、働き方の工夫へのモチベーションが上がると思います。

Particularly for those in the hospitality industry, I believe that the ability to visualize the risk of infection will increase motivation to devise new ways of working.

また、通勤通学での電車やバスを利用する人などは、「やっぱりラッシュ時の乗車は怖いんだなぁ」と怖い思いをすることで、時差出勤や、在宅勤務や、あるいは、自転車やバイクを使った通勤などの検討のきっかけになるかもしれません。

Also, people who use trains and buses to commute to work or school can be afraid of riding at rush hour. This may lead you to consider staggered work, telecommuting, or even biking or biking to work.

加えて、長期間の多くの人の利用によって「これはヤバい」「これはヤバくない」が、ハッキリとしてくるかもしれません。

In addition, the use of many people over a long period of time may make it clear that "this is bad" or "this is not bad".

なにより、PCR検査や抗体検査ほどに面倒ではない、という点がいいです(インストールするだけです)。

The best part is that it's not as cumbersome as PCR or antibody testing (just install it).

-----

もし、私から陽性反応が出るようなことがあれば、即座に登録します。

If I get a positive reaction from me, I will register it immediately.

もちろん、「市民としての義務と貢献」という観点もあります。

Of course, there is also the perspective of "civic duty and contribution".

加えて、「エンジニアとしての義務と興味」という気持ちもあります。

In addition, there is a feeling of "duty and interest as an engineer".

部屋に閉じ込もっている2週間の間、私のスマホから出ている通信メッセージのハックを続ける予定です。

During the two weeks I'm locked in my room, I will continue to hack the communication messages coming out of my phone.

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