映像の遅延を測定する為に時計を表示する
江端智一のホームページ
CREATE TABLE trips_test (
id serial PRIMARY KEY,
user_id integer,
distance double precision,
place point[],
speed double precision[],
prediction_type integer,
start_at timestamp,
end_at timestamp
);
INSERT INTO trips_test (user_id, distance, place) VALUES (1, 24.66249845798845, ARRAY[point '(34.7241, 135.1294)', point '(34.7241, 135.1294)', point '(34.7241, 135.1294)']);
moove=# INSERT INTO trips_test (user_id, distance, place)
moove-# VALUES (1, 24.66249845798845, ARRAY[point '(34.7241, 135.1294)', point '(34.7241, 135.1294)', point '(34.7241, 135.1294)']);
INSERT 0 1
moove=# select * from trips_test;
id | user_id | distance | place | speed | prediction_type | start_at | end_at
----+---------+-------------------+------------------------------------------------------------------+-------+-----------------+----------+--------
1 | 1 | 24.66249845798845 | {"(34.7241,135.1294)","(34.7241,135.1294)","(34.7241,135.1294)"} | | | |
(1 row)
上記のテーブルから、座標情報を一つ一つ取り出すにはどうしたら良いですか
SELECT id, user_id, unnest(place) AS single_point
FROM trips_test;
moove=# SELECT id, user_id, unnest(place) AS single_point
moove-# FROM trips_test;
id | user_id | single_point
----+---------+--------------------
1 | 1 | (34.7241,135.1294)
1 | 1 | (34.7241,135.1294)
1 | 1 | (34.7241,135.1294)
を参考にして頂きつつ、インストール実施中。
私は、根拠なく、
$ sudo apt-get install docker-ce=5:24.0.4-1~ubuntu.22.04~jammy
を選びました。
ラズパイ4、Ubuntu22.04、で"docker compose"も動いているようです ーー "docker-compose"は動きません。
-- カスタムプロトコルの識別子(任意の値を設定)
local NX_PROTOCOL = Proto("NXDlink", "nxdlink protocol dissector")
-- プロトコルのフィールド定義
local nx_protocol_fields = NX_PROTOCOL.fields
nx_protocol_fields.magic = ProtoField.string("nx_protocol.magic", "Magic Number")
nx_protocol_fields.message_length = ProtoField.uint32("nx_protocol.message_length", "Message Length")
nx_protocol_fields.source_address = ProtoField.uint32("nx_protocol.source_address", "Source Address")
nx_protocol_fields.destination_address = ProtoField.uint32("nx_protocol.destination_address", "Destination Address")
nx_protocol_fields.timestamp = ProtoField.uint32("nx_protocol.timestamp", "Timestamp")
nx_protocol_fields.message_number = ProtoField.uint32("nx_protocol.message_number", "Message Number")
nx_protocol_fields.m_ctl = ProtoField.uint32("nx_protocol.m_ctl", "M_CTL")
nx_protocol_fields.inq_id = ProtoField.string("nx_protocol.inq_id", "INQ_ID")
nx_protocol_fields.tcd = ProtoField.uint32("nx_protocol.tcd", "TCD")
nx_protocol_fields.ver = ProtoField.uint32("nx_protocol.ver", "VER")
nx_protocol_fields.gtid = ProtoField.string("nx_protocol.gtid", "GTID")
nx_protocol_fields.mode = ProtoField.uint32("nx_protocol.mode", "MODE")
nx_protocol_fields.pver = ProtoField.uint32("nx_protocol.pver", "PVER")
nx_protocol_fields.pri = ProtoField.uint32("nx_protocol.pri", "PRI")
nx_protocol_fields.cbn = ProtoField.uint32("nx_protocol.cbn", "CBN")
nx_protocol_fields.tbn = ProtoField.uint32("nx_protocol.tbn", "TBN")
nx_protocol_fields.bsize = ProtoField.uint32("nx_protocol.bsize", "BSIZE")
nx_protocol_fields.fui = ProtoField.uint32("nx_protocol.fui", "FUI")
-- nx_protocol_fields.fc = ProtoField.uint32("nx_protocol.fc", "FC", base.HEX)
nx_protocol_fields.fc = ProtoField.uint32("nx_protocol.fc", "FC")
nx_protocol_fields.field_x = ProtoField.uint32("nx_protocol.field_x", "FIELD_X")
nx_protocol_fields.field_y = ProtoField.uint32("nx_protocol.field_y", "FIELD_Y")
nx_protocol_fields.field_z = ProtoField.uint32("nx_protocol.field_z", "FIELD_Z")
-- カスタムプロトコルの識別子(任意の値を設定)
--local DATA_PROTOCOL = Proto("DATALink", "datalink protocol dissector")
-- プロトコルのフィールド定義
--local data_protocol_fields = DATA_PROTOCOL.fields
--data_protocol_fields.fc = ProtoField.uint32("data_protocol.fc", "FC")
-- パケット解析関数
function NX_PROTOCOL.dissector(buffer, pinfo, tree)
-- フレーム情報を表示
pinfo.cols.protocol:set("NX Protocol")
local subtree = tree:add(NX_PROTOCOL, buffer(), "NX Protocol Data")
-- "NUXM" ヘッダ文字列を確認
local data = buffer():string()
-- local offset = data:find("NUXM")
local offset = data:find("NUXM") -1 -- 1を引かないと、ずれる
if not offset then
-- "NUXM" が見つからない場合は解析を中止
return
end
-- ヘッダ情報を解析
subtree:add(nx_protocol_fields.magic, buffer(offset, 4))
subtree:add(nx_protocol_fields.message_length, buffer(offset + 4, 4))
subtree:add(nx_protocol_fields.source_address, buffer(offset + 8, 4))
subtree:add(nx_protocol_fields.destination_address, buffer(offset + 12, 4))
subtree:add(nx_protocol_fields.timestamp, buffer(offset + 16, 4))
subtree:add(nx_protocol_fields.message_number, buffer(offset + 20, 4))
subtree:add(nx_protocol_fields.m_ctl, buffer(offset + 24, 4))
subtree:add(nx_protocol_fields.inq_id, buffer(offset + 28, 12))
subtree:add(nx_protocol_fields.tcd, buffer(offset + 40, 2))
subtree:add(nx_protocol_fields.ver, buffer(offset + 42, 2))
subtree:add(nx_protocol_fields.gtid, buffer(offset + 44, 8))
subtree:add(nx_protocol_fields.mode, buffer(offset + 52, 2))
subtree:add(nx_protocol_fields.pver, buffer(offset + 54, 1))
subtree:add(nx_protocol_fields.pri, buffer(offset + 55, 1))
subtree:add(nx_protocol_fields.cbn, buffer(offset + 56, 1))
subtree:add(nx_protocol_fields.tbn, buffer(offset + 57, 1))
subtree:add(nx_protocol_fields.fui, buffer(offset + 60, 4))
subtree:add(nx_protocol_fields.fc, buffer(offset + 64, 2))
-- fcの値を取得
-- local fc_value = buffer(offset + 64, 2):le_uint() -- リトルエンディアンの場合
local fc_value = buffer(offset + 64, 2)-- リトルエンディアンの場合
-- デバッグ情報を表示
-- print("fc_value:", string.format("0x%04X", fc_value)) -- 16進数表示
-- fcの値に応じてフィールドを追加
-- if fc_value == 0x181 then
-- if fc_value == 385 then
if fc_value = 0 then
-- 0x181の場合、特定のフィールドを追加
subtree:add(nx_protocol_fields.field_x, buffer(offset + 66, 4))
elseif fc_value == 0x183 then
-- 0x183の場合、別のフィールドを追加
subtree:add(nx_protocol_fields.field_y, buffer(offset + 66, 4))
elseif fc_value == 0x188 or fc_value == 0x189 then
-- 0x188または0x189の場合、共通のフィールドを追加
subtree:add(nx_protocol_fields.field_z, buffer(offset + 66, 4))
else
-- その他の場合、何もしない
end
end
--function DATA_PROTOCOL.dissector(buffer, pinfo, tree)
-- フレーム情報を表示
-- pinfo.cols.protocol:set("DATA Protocol")
-- local subtree = tree:add(DATA_PROTOCOL, buffer(), "DATA Protocol Data")
-- subtree:add(data_protocol_fields.fc, buffer(64, 2))
--end
-- プロトコルをWiresharkに登録
local udp_table = DissectorTable.get("udp.port")
udp_table:add(10631, NX_PROTOCOL) -- UDPポート10631でカスタムプロトコルを解析
udp_table:add(40311, NX_PROTOCOL) -- UDPポート40311でカスタムプロトコルを解析
udp_table:add(40312, NX_PROTOCOL) -- UDPポート40312でカスタムプロトコルを解析
ラプラス分布は、ランデル分布とも言われて、交通工学のシミュレーションでは非常に重要な確率分布として使われているようです。
パラメータとして、平均(location parameter)を表す μ と尺度(scale parameter)を表すbを持ち、ラプラス分布の確率密度関数は、 f(x∣μ,b)=1/2b exp(−b∣x−μ∣) と表される。
でもって、
交通シミュレーションで使われる場面
■交通の到着間隔のモデリング → 乗客の到着間隔をモデル化するため
■トラフィックの所要時間の予測 → 自動車の移動時間やトラフィックの所要時間を予測するため
■信号制御の最適化 → 信号のサイクルタイムやフェーズの最適化を行うため
■交通事故の発生確率の評価 → 交通事故の発生確率を評価するため
と、まあ、ここまでは分かったのですが、この分布の数学的な意義が分かりません。(正規分布や指数分布などは、理解できていると思います)
未来を占う人工知能 ~人類が生み出した至宝の測定ツールhttps://t.co/fno5ZpjWTu pic.twitter.com/hjSbummE9r
— EE Times Japan編集部 (@eetimes_jp) January 31, 2018
ですが、ラプラス分布の数学的な意義が分かりません。
で、以下のように推察しているのですが、私のこの推察は正しいでしょうか?
ラプラス分布を使う理由(江端の私見)
■外れ値のモデル化の為
→ そもそも、バスの到着時間が、正規分布のように曖昧に分散していたらとても困る。情報通信についても同様。とは言え、外れ値を完全に無視することはできない。そこで、このような、交通、情報を扱う分布として、(積分して1になる関数として)便利なツールとして、ラプラス分布が使われている
どなたか、ご見解を頂ければ幸いです。
江端
Golangで、以下のXML分の中から、<tag k="route" v="bus"/>を発見した時に、refの要素を参照にして位置情報を取り出すプログラムを書いて
<osm>
<node id="2197214759" lat="35.5714149" lon="139.5880043" version="1" timestamp="2013-03-12T09:31:19Z" changeset="15336763" uid="1258339" user="k___0e0">
<tag k="highway" v="bus_stop"/>
<tag k="name" v="有馬第二団地前"/>
</node>
<node id="2197214762" lat="35.5715628" lon="139.5875429" version="1" timestamp="2013-03-12T09:31:19Z" changeset="15336763" uid="1258339" user="k___0e0">
<tag k="highway" v="bus_stop"/>
<tag k="name" v="有馬第二団地前"/>
</node>
<relation id="2814953" version="38" timestamp="2023-06-14T08:20:58Z" changeset="137316398" uid="1687166" user="U20">
<member type="node" ref="2197214759" role="backward_stop"/>
<member type="node" ref="2197214762" role="forward_stop"/>
<tag k="route" v="bus"/>
</relation>
</osm>
ChatGPTの回答
指定されたXMLデータから を検出し、それに対応する ref 要素を参照にして位置情報を取得するGolangのプログラムを以下に示します。このプログラムは、encoding/xml パッケージを使用してXMLを解析します。
package main
import (
"encoding/xml"
"fmt"
"log"
"strings"
)
type OSM struct {
XMLName xml.Name `xml:"osm"`
Nodes []Node `xml:"node"`
Relations []Relation `xml:"relation"`
}
type Node struct {
ID int64 `xml:"id,attr"`
Lat float64 `xml:"lat,attr"`
Lon float64 `xml:"lon,attr"`
Tags []Tag `xml:"tag"`
}
type Relation struct {
ID int64 `xml:"id,attr"`
Members []Member `xml:"member"`
Tags []Tag `xml:"tag"`
}
type Member struct {
Type string `xml:"type,attr"`
Ref string `xml:"ref,attr"`
Role string `xml:"role,attr"`
}
type Tag struct {
K string `xml:"k,attr"`
V string `xml:"v,attr"`
}
func main() {
xmlData := `
<osm>
<node id="2197214759" lat="35.5714149" lon="139.5880043" version="1" timestamp="2013-03-12T09:31:19Z" changeset="15336763" uid="1258339" user="k___0e0">
<tag k="highway" v="bus_stop"/>
<tag k="name" v="有馬第二団地前"/>
</node>
<node id="2197214762" lat="35.5715628" lon="139.5875429" version="1" timestamp="2013-03-12T09:31:19Z" changeset="15336763" uid="1258339" user="k___0e0">
<tag k="highway" v="bus_stop"/>
<tag k="name" v="有馬第二団地前"/>
</node>
<relation id="2814953" version="38" timestamp="2023-06-14T08:20:58Z" changeset="137316398" uid="1687166" user="U20">
<member type="node" ref="2197214759" role="backward_stop"/>
<member type="node" ref="2197214762" role="forward_stop"/>
<tag k="route" v="bus"/>
</relation>
</osm>
`
var osmData OSM
err := xml.Unmarshal([]byte(xmlData), &osmData)
if err != nil {
log.Fatal(err)
}
for _, relation := range osmData.Relations {
for _, tag := range relation.Tags {
if tag.K == "route" && tag.V == "bus" {
for _, member := range relation.Members {
if member.Type == "node" {
node := getNodeByID(member.Ref, osmData.Nodes)
if node != nil {
fmt.Printf("Bus Stop: %s\n", getNodeName(node))
fmt.Printf("Coordinates: Lat %f, Lon %f\n\n", node.Lat, node.Lon)
}
}
}
}
}
}
}
func getNodeByID(ref string, nodes []Node) *Node {
for _, node := range nodes {
if fmt.Sprintf("%d", node.ID) == ref {
return &node
}
}
return nil
}
func getNodeName(node *Node) string {
for _, tag := range node.Tags {
if tag.K == "name" {
return tag.V
}
}
return ""
}
このプログラムは、与えられたXMLデータから を見つけ、それに関連する ref 要素を参照してバス停の位置情報を取得して表示します。XMLデータは xmlData 変数に直接格納されていますが、実際のプログラムではファイルから読み込むこともできます。コード内のコメントに従って、XMLデータ構造やタグを調整してください。
世界が変わる
生成AIを使わない奴は、"死ぬ" ―― 文字通りの意味で。
>osm2pgrouting -f tsuzuki.osm -c mapconfig_for_cars_rail.xml -d tsuzuki_rail -U postgres -h 192.168.0.23 -p 15432 -W password
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<tag_name name="highway" id="1">
<tag_value name="motorway" id="101" priority="1.0" maxspeed="130" />
<tag_value name="motorway_link" id="102" priority="1.0" maxspeed="130" />
<tag_value name="motorway_junction" id="103" priority="1.0" maxspeed="130" />
<tag_value name="trunk" id="104" priority="1.05" maxspeed="110" />
<tag_value name="trunk_link" id="105" priority="1.05" maxspeed="110" />
<tag_value name="primary" id="106" priority="1.15" maxspeed="90" />
<tag_value name="primary_link" id="107" priority="1.15" maxspeed="90" />
<tag_value name="secondary" id="108" priority="1.5" maxspeed="90" />
<tag_value name="secondary_link" id="109" priority="1.5" maxspeed="90"/>
<tag_value name="tertiary" id="110" priority="1.75" maxspeed="90" />
<tag_value name="tertiary_link" id="111" priority="1.75" maxspeed="90" />
<tag_value name="residential" id="112" priority="2.5" maxspeed="50" />
<tag_value name="living_street" id="113" priority="3" maxspeed="20" />
<tag_value name="service" id="114" priority="2.5" maxspeed="50" />
<tag_value name="unclassified" id="117" priority="3" maxspeed="90"/>
<tag_value name="road" id="100" priority="5" maxspeed="50" />
</tag_name>
<tag_name name="railway" id="1">
<tag_value name="subway" id="101" priority="1.0" maxspeed="40" />
<tag_value name="rail" id="101" priority="1.0" maxspeed="40" />
</tag_name>
</configuration>
とりあえず、ちゃんと、JRと市営地下鉄が加えられている。
この後は、osmファイルを手作業で加工
がんばれ > 自分
JOSMを立ち上げる → osmファイルをドラッグする → 下の図の赤丸の部分をクリックする
下の図の赤丸をクリックする
カラムに、railway=subway と記入する
全部にチェックを入れる
こういう表示になる
ただ、この路線情報のみのセーブができていない
(未完)
鉄道路線の位置情報が欲しい場合
で、エディタに張りつける。
wkt_geom osm_id name highway waterway aerialway barrier man_made z_order other_tags
LineString (139.646476100000001 35.55342160000000007, 139.64405429999999342 35.55400130000000303, 139.64320960000000582 35.55409010000000336, 139.64267359999999485 35.55411110000000008, 139.64220109999999409 35.55405509999999936, 139.64194380000000706 35.55401379999999989, 139.64170240000001399 35.55397510000000239, 139.63902089999999134 35.55321440000000166, 139.63803740000000175 35.55292430000000081, 139.63748190000001159 35.55269659999999732, 139.63718030000001136 35.55254620000000187, 139.63689350000001355 35.55236419999999953, 139.63660690000000386 35.55215530000000257, 139.63493339999999421 35.55077779999999876, 139.63391659999999206 35.55019589999999852, 139.63362749999998869 35.55004329999999868, 139.63279969999999253 35.54961260000000323, 139.63221790000000055 35.54929349999999744, 139.63160369999999944 35.54899890000000084, 139.63125759999999786 35.54887020000000319, 139.63085000000000946 35.54871740000000102, 139.630045999999993 35.54843460000000022, 139.62955180000000155 35.54831149999999695, 139.62913320000001249 35.54824239999999946, 139.62852749999998991 35.54819439999999986, 139.62814629999999738 35.54818490000000253, 139.62771179999998594 35.54821979999999826, 139.62689000000000306 35.54832940000000008, 139.62461239999998952 35.54861619999999789, 139.6228170999999918 35.54887699999999739, 139.62208190000001196 35.54897940000000034, 139.621440199999995 35.54912439999999663, 139.62113059999998654 35.54921850000000205, 139.62073699999999121 35.54935820000000035, 139.62002659999998855 35.54965870000000194, 139.61967559999999366 35.54979120000000137, 139.61773930000001087 35.55062470000000019, 139.61604349999998931 35.55129320000000348, 139.61544639999999617 35.55153250000000043, 139.61400649999998791 35.55211620000000039, 139.61367699999999559 35.55227090000000345, 139.61328370000001087 35.55248559999999713, 139.61185470000000919 35.55324699999999893, 139.61138819999999328 35.55344060000000184, 139.61112099999999714 35.5535199999999989, 139.61089590000000271 35.55356050000000323, 139.61073719999998843 35.55360360000000242, 139.61040380000000027 35.55367590000000177, 139.60871710000000689 35.55388539999999864, 139.60811019999999871 35.55395479999999964, 139.60749329999998736 35.55399839999999756, 139.60640879999999697 35.55402310000000199, 139.60553089999999088 35.55406709999999748, 139.60464600000000246 35.55415109999999856, 139.604049300000014 35.55422970000000049, 139.60341280000000097 35.55433450000000306, 139.60273129999998787 35.55454660000000189, 139.60238100000000827 35.55471419999999938, 139.60221730000000662 35.55483360000000204, 139.60197869999998943 35.55500659999999868, 139.60174100000000408 35.55521579999999915, 139.60153339999999389 35.55542990000000003, 139.60133149999998636 35.55568569999999795, 139.60023530000000846 35.55735479999999882, 139.59981210000000829 35.55783720000000159, 139.59957539999999199 35.55808329999999984, 139.59932749999998691 35.55827450000000312, 139.59904430000000275 35.5584891999999968, 139.59858829999998875 35.55877279999999985, 139.597627899999992 35.55933660000000174, 139.59693609999999353 35.55972859999999969, 139.59623609999999871 35.56005269999999996, 139.59570759999999723 35.56026099999999701, 139.59530820000000517 35.56040039999999891, 139.59489759999999592 35.56054460000000006, 139.59435049999999023 35.56065370000000314, 139.59350760000000946 35.56081749999999886, 139.59251140000000646 35.56100130000000092, 139.59232270000001108 35.56102899999999778, 139.59212709999999902 35.5610691999999986, 139.59167899999999918 35.56116870000000318, 139.59126240000000507 35.5611801000000014, 139.5906812000000059 35.56112069999999648, 139.59032650000000331 35.56103509999999801, 139.5901608000000067 35.56098539999999986, 139.58982359999998835 35.56086419999999748, 139.58665070000000696 35.55936580000000191, 139.58363769999999704 35.55796550000000167, 139.58301539999999363 35.55764250000000004, 139.5822108000000128 35.55715810000000232, 139.58148120000001313 35.55673920000000265, 139.58096409999998855 35.55639310000000108, 139.58066579999999135 35.55618929999999978, 139.58024739999999042 35.55579379999999645, 139.57973240000001169 35.55525970000000058, 139.57922490000001403 35.55446140000000099) 230124642 讓ェ豬懷クょ霧蝨ー荳矩延?泌捷邱 -25 "colour"=>"#048D58","electrified"=>"contact_line","frequency"=>"0","layer"=>"-2","name:en"=>"Green Line of Yokohama Municipal Subway","name:es"=>"Lテュnea Verde del Metro Municipal de Yokohama","name:ja"=>"讓ェ豬懷クょ霧蝨ー荳矩延?泌捷邱?","name:zh"=>"讓ェ貊ィ蟶り是4蜿キ郤ソ","operator"=>"讓ェ豬懷ク?","railway"=>"subway","tunnel"=>"yes","voltage"=>"1500"
と、こんな感じで座標は得られる。
最近、イレクターパイプを切断したりしていたのは、実は、「立ちながらパソコンで仕事ができるテーブル」を作成する為でした。
リモートワークで運動不足なのですが、今、ウォーキングをすれば、熱中症で死亡しかねません。
「ならば、夜歩けばいい」と思う方も多いと思いますが、それでは「歩き読書」ができません。
とすれば、自宅内での運動ですが、現在、「懸垂」「腹筋」はやっているのですが、「歩行」が足りていないです。
幸いなことに、私のオフィスは、ディスプレイで一杯ですので、スタンディングワークができる環境になっています。
で、こんな感じに机の上に机を置いて、立ったままで仕事をしています(現在は、一日、1~2時間程度ですが)。
購入したものは以下の、ミニテーブルです。
ところが、この机で作業してみると、実際に4~5cmほど高さが足りず、キーボードの操作に難があることが分かりました。
で、机の上に木板を重ねたりしていたのですが、動かしにくく不便でした。
で、そこで、脚を長くしてやろう、と考えて、
を購入し、
を購入し、さらに、
も購入して、先程、完成しました。
脚部は、私の十八番である「結束バンド」を使っています(色を黒いしておけば、もっと見栄えよかったのですが、手元になかったので)。
意匠(デザイン、見栄え)完全無視の、コスト(値段)と効果のみを追求した、私に相応しい「スタンディングデスク」の完成です。
以上