/*
c:\users\ebata\tomioka3b\src\others\main41.go
2次元スプライン関数を使用して、緯度と経度のペアに対応する目的地までの時間を計算します。
*/
package main
import (
"fmt"
"sort"
)
// スプライン補間用の関数
func splineInterpolation(dataSet [][]float64) func(float64, float64) float64 {
n := len(dataSet)
// xの値を昇順にソートする
sort.Slice(dataSet, func(i, j int) bool {
return dataSet[i][0] < dataSet[j][0]
})
// トリディアゴナル行列を作成
h := make([]float64, n-1)
for i := 0; i < n-1; i++ {
h[i] = dataSet[i+1][0] - dataSet[i][0]
}
// 2階微分の値を計算
delta := make([]float64, n)
for i := 1; i < n-1; i++ {
delta[i] = (dataSet[i+1][1]-dataSet[i][1])/h[i] - (dataSet[i][1]-dataSet[i-1][1])/h[i-1]
}
// トリディアゴナル行列を解く
m := make([]float64, n)
l := make([]float64, n)
zArray := make([]float64, n)
l[0] = 1
for i := 1; i < n-1; i++ {
l[i] = 2*(dataSet[i+1][0]-dataSet[i-1][0]) - h[i-1]*m[i-1]
m[i] = h[i] / l[i]
zArray[i] = (delta[i] - h[i-1]*zArray[i-1]) / l[i]
}
l[n-1] = 1
zArray[n-1] = 0
c := make([]float64, n)
b := make([]float64, n)
d := make([]float64, n)
for j := n - 2; j >= 0; j-- {
c[j] = zArray[j] - m[j]*c[j+1]
b[j] = (dataSet[j+1][1]-dataSet[j][1])/h[j] - h[j]*(c[j+1]+2*c[j])/3
d[j] = (c[j+1] - c[j]) / (3 * h[j])
}
// 補間関数を返す
return func(xVal, yVal float64) float64 {
// xの範囲を確認
if xVal < dataSet[0][0] || xVal > dataSet[n-1][0] {
panic("x value is out of range")
}
// 対応するiを探す
i := 0
for i < n-1 && dataSet[i+1][0] <= xVal {
i++
}
// スプライン補間を計算
dx := xVal - dataSet[i][0]
return dataSet[i][2] + b[i]*dx + c[i]*dx*dx + d[i]*dx*dx*dx
}
}
func main() {
// データ点の定義
dataSet := [][]float64{
{35.7281578, 139.7680665, 73},
{35.7214573, 139.7754384, 63},
{35.7141672, 139.7748342, 57},
{35.7075171, 139.7564025, 67},
{35.698383, 139.7704968, 65},
{35.6997175, 139.7618655, 61},
{35.7020484, 139.7509267, 66},
{35.6918216, 139.7683569, 63},
{35.6812362, 139.7645499, 57},
{35.6750133, 139.7604455, 59},
{35.666379, 139.7557649, 55},
{35.6553809, 139.754554, 54},
{35.6457361, 139.7449875, 54},
{35.6284713, 139.7361848, 43},
{35.6208763, 139.7405387, 50},
{35.6147448, 139.7412068, 49},
{35.6086671, 139.7426731, 45},
{35.6052508, 139.7421627, 50},
{35.5983959, 139.7391046, 50},
{35.58754, 139.7355111, 51},
{35.5788485, 139.7348961, 40},
{35.5721351, 139.7318494, 53},
{35.5666392, 139.7281759, 53},
{35.5613144, 139.7215761, 33},
{35.5446458, 139.7493338, 46},
{35.5329877, 139.6982966, 30},
{35.5348941, 139.7449763, 42},
{35.5229857, 139.6889874, 41},
{35.5179115, 139.6811867, 40},
{35.5071467, 139.677526, 34},
{35.4998507, 139.6713032, 31},
{35.4923606, 139.6622968, 30},
{35.4852628, 139.6544734, 29},
{35.4846744, 139.6452731, 32},
{35.4808759, 139.6394986, 26},
{35.4763238, 139.631979, 30},
{35.4688634, 139.6268306, 32},
{35.4659811, 139.6194871, 20},
{35.4571602, 139.6199226, 27},
{35.4464751, 139.6235656, 25},
{35.436673, 139.6217708, 24},
{35.4334892, 139.6206713, 18},
{35.4314711, 139.6030542, 16},
{35.424238, 139.5927802, 17},
{35.4201765, 139.586678, 14},
{35.413768, 139.582819, 10},
{35.3819518, 139.6165374, 3},
{35.4091204, 139.5781752, 7},
{35.3966138, 139.6051573, 4},
{35.3645904, 139.6267988, 1},
{35.3428573, 139.6190711, 3},
{35.3314185, 139.6176347, 6},
{35.330416, 139.6295796, 17},
{35.3337822, 139.630869, 18},
{35.3407534, 139.6332478, 18},
{35.3400425, 139.6390968, 20},
{35.323276, 139.6151587, 13},
{35.2973885, 139.5758056, 31},
{35.3158184, 139.6222558, 15},
{35.312573, 139.6250891, 16},
{35.308405, 139.628248, 17},
{35.2825803, 139.6405151, 19},
{35.2916167, 139.6283632, 17},
{35.277848, 139.6379121, 21},
{35.2802815, 139.6599103, 19},
{35.2786985, 139.6674653, 20},
{35.2616259, 139.6679659, 26},
{35.2635438, 139.6841348, 23},
{35.2482969, 139.6775595, 25},
{35.2509382, 139.712402, 30},
{35.2315701, 139.699661, 29},
{35.2120725, 139.6824547, 33},
{35.2055645, 139.671602, 44},
{35.1986888, 139.663162, 37},
{35.1880928, 139.6507295, 39},
{35.1775554, 139.6306392, 42},
}
// スプライン補間関数を作成
interpolatedFunction := splineInterpolation(dataSet)
// 特定の座標で補間された値を計算
xValue := 35.4688634
yValue := 139.6268306
xValue, yValue = 35.7214573, 139.7754384
interpolatedValue := interpolatedFunction(xValue, yValue)
// 結果の出力
fmt.Printf("補間された値: %.2f\n", interpolatedValue)
}
2次元スプライン関数を使用して、緯度と経度のペアに対応する目的地までの時間を計算
Google Maps Platform を使ってみる(公開情報)
作業中のプロジェクト: ないしょ
番号: ないしょ
ID: ないしょ
自分のAPIキー AXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXE
困っていたこと
で、再度実行したら、こうなりました。
ところが、鉄道の情報が出てこない。
うまくいっていない理由確定
Google マップのルートサービスでは、交通機関の対象リストに記載されているすべての交通機関(日本を除く)をサポートしています。
ということで、日本で使用できるのは walking
と driving
の2モードのみのようです。
あかんやんか・・・
PostgresqlのGIS DBからとみおかーとルート情報のみを削除する
背景
現在、tomioka_db_cを中心にコーディングを展開していますが、とみおかーとのルートの入っていない(バスのルートだけが入っている)地図が必要となりました。
課題
JSONからとみおかーとのルートを取り除いて地図を作り直すこともできますが、ノード番号ずれが発生するという問題が生じます
課題を解決する手段
つまるところ、とみおかーとのルート情報だけを、tomioka_db_cから取り除ければいいのです。
実施例
まず、
で、実験用のtomioka_db_c_trialを作成しました。
現時点で分かっていること
(1)とみおかーとルート用のnode番号は、1~181の連番である。
(2)とみおかーとルート用のwayには、"TomioCart"の属性情報が入っている
(3)これを、単に、
public | ways_vertices_pgr | table | postgres
からDeleteすれば良いのかどうかは不明
nodeの削除(最初のトライアル) →失敗
DELETE FROM ways_vertices_pgr WHERE id >= 1 AND id <= 181;
すると、こんなメッセージを受けて、失敗します。
tomioka_db_c_trial=# DELETE FROM ways_vertices_pgr WHERE id >= 1 AND id <= 181;
ERROR: update or delete on table "ways_vertices_pgr" violates foreign key constraint "ways_source_fkey" on table "ways"
DETAIL: Key (id)=(1) is still referenced from table "ways".
削除操作を行う前に、この外部キー制約を解除する必要があります。"
とのことのようなので、最初はwaysの削除に変更をします。
wayの削除(最初のトライアル)
DELETE FROM ways WHERE name = 'TomioCart';
とこちらはサクっと消えました。
あれ? TomioCartが消えていない?
QGISからエントリーを削除して、再度読み込みをしたら
ちゃんとwayが消えていました。
nodeの削除(2回目のトライアル) →やはり失敗
chatGPTに相談したら、以下のような指示を受けました。
ALTER TABLE ways DROP CONSTRAINT ways_source_fkey;
しかし、
tomioka_db_c_trial-# ALTER TABLE ways DROP CONSTRAINT ways_source_fkey; ERROR: syntax error at or near "ALTER" LINE 2: ALTER TABLE ways DROP CONSTRAINT ways_source_fkey; と言われました
SELECT constraint_name, table_name, column_name, referenced_table_name, referenced_column_name
FROM information_schema.key_column_usage
WHERE table_name = 'ways_vertices_pgr';
ここから手をやきました。
多分、まだ1~181のノードを参照しているwaysのエントリーが残っているので、消せないのだろうと推測しました。
で、まずは、sourceに21番を持っているwayのエントリーを探してみました。
tomioka_db_c_trial=# select * from ways where source = 21;
gid | osm_id | tag_id | length | length_m | name | source | target | source_osm | target_osm | cost | reverse_cost | cost_s | reverse_cost_s | rule | one_way | oneway | x1 | y1 | x2 | y2 | maxspeed_forward | maxspeed_backward | priority | the_geom
------+--------+--------+------------------------+-------------------+------+--------+--------+------------+------------+------------------------+------------------------+--------------------+--------------------+------+---------+---------+-----------------+----------------+-------------+------------+------------------+-------------------+----------+--------------------------------------------------------------------------------------------
1258 | 104020 | 112 | 3.9727662820583996e-05 | 3.612272689729353 | | 21 | 899 | 102079 | 2958989369 | 3.9727662820583996e-05 | 3.9727662820583996e-05 | 0.2600836336605134 | 0.2600836336605134 | | 0 | UNKNOWN | 139.62560711503 | 35.36760885871 | 139.6256468 | 35.3676107 | 50 | 50 | 2.5 | 0102000020E6100000020000005C6636F9047461408EF09CCE0DAF41401B1B704C0574614070140FDE0DAF4140
(1 row)
で、このエントリーを消去しました。
tomioka_db_c_trial=# DELETE FROM ways WHERE source = 21;
DELETE 1
tomioka_db_c_trial=# select * from ways where osm_id = 102058;
gid | osm_id | tag_id | length | length_m | name | source | target | source_osm | target_osm | cost | reverse_cost | cost_s | reverse_cost_s | rule | one_way | oneway | x1 | y1 | x2 | y2 | maxspeed_forward | maxspeed_backward | priority | the_geom
-----+--------+--------+--------+----------+------+--------+--------+------------+------------+------+--------------+--------+----------------+------+---------+--------+----+----+----+----+------------------+-------------------+----------+----------
(0 rows)
たしかに消えています。
で、今度は、ways_vertices_pgr の方を消してみました
tomioka_db_c_trial=# DELETE FROM ways_vertices_pgr WHERE id = 21;
DELETE 1
tomioka_db_c_trial=# SELECT * FROM ways_vertices_pgr;
id | osm_id | eout | lon | lat | cnt | chk | ein | the_geom
------+------------+------+--------------+-------------+-----+-----+-----+----------------------------------------------------
(前略)
20 | 102078 | | 139.62563228 | 35.36755641 | | | | 0101000020E6100000C1D1FD2D05746140C4EAA8160CAF4140
22 | 102080 | | 139.62561830 | 35.36767727 | | | | 0101000020E61000000979AB1005746140ABEC760C10AF4140
(後略)
あっさり消えていました。
ということは、source またはtargetが 1~181に関するwayを全部消せば、ways_vertices_pgr の方も消せるはず
ちょっと怖かったけどやってみることにしました。
tomioka_db_c_trial=# DELETE FROM ways WHERE source >= 1 and source <=181;
DELETE 96
tomioka_db_c_trial=# DELETE FROM ways WHERE target >= 1 and target <=181;
DELETE 81
おお! 完全にwayが消えました。
では、ふたたび
DELETE FROM ways_vertices_pgr WHERE id >= 1 AND id <= 181;
を実施します
tomioka_db_c_trial=# DELETE FROM ways_vertices_pgr WHERE id >= 1 AND id <= 181;
DELETE 180
やっと消えました
tomioka_db_c_trial=# SELECT * FROM ways_vertices_pgr;
id | osm_id | eout | lon | lat | cnt | chk | ein | the_geom
------+------------+------+--------------+-------------+-----+-----+-----+----------------------------------------------------
182 | 102254 | | 139.62956343 | 35.36605302 | | | | 0101000020E61000007690336225746140082C51D3DAAE4140
183 | 102255 | | 139.62952386 | 35.36602637 | | | | 0101000020E6100000F1EB3A0F257461401A07C7F3D9AE4140
184 | 102256 | | 139.62949515 | 35.36599335 | | | | 0101000020E6100000F65C05D3247461403A74BFDED8AE4140
総括
postgresqlのpostGISのDBから新規に作成したnodeとwayを削除するには、以下の手順を踏むこと
(Step.1) waysから、新規node,wayに関する全部エントリーを削除すること。今回の場合は、以下の3つ
DELETE FROM ways WHERE name = 'TomioCart';
DELETE FROM ways WHERE source >= 1 and source <=181;
DELETE FROM ways WHERE target >= 1 and target <=181;
(Step.2)
ways_vertices_pgrからターゲットのNode情報を削除すること。今回の場合は以下の1つ。
DELETE FROM ways_vertices_pgr WHERE id >= 1 AND id <= 181;
(Step.3)
最後に、tomioka_db_c_trial を、tomioka_db_d に変更する(コピーしてから、tomioka_db_c_trialを消すこと)
Ubuntu16.04 でのアクセスポイント化
滅茶苦茶びっくりしたのですが、GUIだけでUbuntu16.04 でラズパイをWiFi-AP化できるようです。
もっと早く知りたかった。今迄の苦労は何だったんだ。
https://tatanaideyo.hatenablog.com/entry/2017/07/16/072209
でも、IPアドレスの指定など、まだやり方分からないけど、インターネットにも繋がるし、理屈もよく分からんし、セキュリティホールにもなりそうだけど(間違いなくなるな)、もう、これ以上ルータ買うの嫌だから、これでいいかな。
SSIDとパスワードは、ラズパイに張っておこう。
Welcome to emergency mode!
江端家のカメラ監視サーバ(16.04.7 LTS)が、こんな感じになってしまいました。
どうやら停電の影響を受けたようです。
ディスプレイに出力しないと分かりませんでした。
Welcome to emergency mode! After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reboot, "systemctl default" to try again
to boot into default mode.
Give root password for maintenance
(or type Control-D to continue):
で、ここで、パスワードを入力。
まずは、fstabを確認。
# cat /etc/fstab
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
で、
# umount /dev/mmcblk0p2
# e2fsck /dev/mmcblk0p2
で直る。
"/" がumountできるのはemergency modeだかららしいです。
普通はできません。
# ちなみに、カーネルのバージョンアップは諦めています。
WS-S2130RJUXを仮設置した件
工場出荷時のIPアドレスは、192.168.0.10です。Webから設定できます
WS-S2130RJUXは、天井に固定するタイプのカメラですが、勿論、実験機材なのでそんなことはません。
20年以上前に、プロジェクタスクリーン用のアタッチメントを取りつけていたので、そこに結束バンドで仮固定しました。
といっても、地震で落ちてきたら、機材と私の両方が壊れるので、縛り方には工夫を施しています。
まあ、自分の映像を写しながら、コーディングやチューニングをする、ということですね。やり方としては明快です。
結束バンドの場合、ニッパーでカットするだけで簡単に取り外せるというメリットもあります。
これで、私の部屋には5台のカメラが設置されることになりました。
刑務所の独房でも、これだけのカメラが設置されることはないだろうなぁ、と思っています。
temporary redirect が出てきたときの対応
curl http://localhost:8000/getHeartbeatInfo
curl http://localhost:8000/getHeartbeatInfo/
のように、行末に”/"を入れたり、入れなかったりしてみる。
親プロセス番号を入力して、親子のプロセスを全滅させるプログラム
import os
import sys
import signal
import errno
def kill_parent_and_children(parent_pid):
try:
# 親プロセスとその子プロセスのPIDを取得
parent_and_children_pids = [parent_pid] + get_child_processes(parent_pid)
# 親プロセスとその子プロセスを終了させる
for pid_to_terminate in parent_and_children_pids:
if pid_to_terminate is not None:
os.kill(pid_to_terminate, signal.SIGKILL) # プロセスを終了させる
except Exception as e:
print(f"Error terminating processes: {str(e)}")
def get_child_processes(parent_pid):
child_processes = []
try:
# /procディレクトリからプロセス情報を取得
proc_dir = '/proc'
for pid_entry in os.listdir(proc_dir):
pid_path = os.path.join(proc_dir, pid_entry)
if os.path.isdir(pid_path) and pid_entry.isdigit():
# プロセスのステータスを読み取り
with open(os.path.join(pid_path, 'status'), 'r') as status_file:
status_lines = status_file.readlines()
# PPid行から親プロセス番号を取得
for line in status_lines:
if line.startswith('PPid:'):
ppid = int(line.split()[1])
if ppid == parent_pid:
child_processes.append(int(pid_entry))
break
except Exception as e:
print(f"Error getting child processes: {str(e)}")
return child_processes
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python3 xxxx.py <parent_pid>")
sys.exit(1)
parent_pid = int(sys.argv[1])
# 親プロセスとその子プロセスをすべて終了させる
kill_parent_and_children(parent_pid)
Please use Internet Explorer が出たときの対応
出展はこちら→ https://content.connect.panasonic.com/jp-ja/fai/file/39018
admin/jvc で、 JVC HD IP Camera VN-H68 が出てくる
「設定」を押す。
以上