2022/11,江端さんの技術メモ

楕円内の一様乱数

などと苦労しているのですが、結局のところ、私は地図のある領域を指定して、任意の緯度・軽度情報を出す乱数を作りたかったのです。

川の中から人が歩き始める」とか「山の中で人が消える」とか、シミュレーションと言えども、ちょっと許されない設定だと思いまして。

で、上記の記事を読まれた師匠のSさんから「こんなのがあるよ」と教え貰いました。

https://aginfo.cgk.affrc.go.jp/docs/pgisman/2.3.0/ST_GeneratePoints.html

適当なdbに接続して、例題を試してみました。

yama_db=# SELECT ST_GeneratePoints(ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 10, 'endcap=round join=round'), 12);
st_generatepoints
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
01040000000C0000000101000000BBA9D0DF47496240F87F69424E0E5F400101000000B7F51F68D5646240F55A898F1F17504001010000003572FBDA8A5F5F400F87342089BE5E400101000000D4A38750931D5C40ED72799B370B5E4001010000006667943B23885B4066E8F671D97C5B400101000000EBA3152848526340221E78F6C3965D400101000000113BA23198BF6240C7234B9EF33D5840010100000069499F8062745540FF88E6BF407355400101000000A581F43AC300624042D083BD5A2262400101000000636CD355C19E62404AD3293D4D904B40010100000045F7B8041DAA4E405A849AF069A34F400101000000DE1370CF02E5564050D2988109CE5940
(1 row)

geom形式で出されても全然分からんので、st_asTextでラッピングしてみました。

yama_db=# SELECT st_asText(ST_GeneratePoints(ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 10, 'endcap=round join=round'), 12));
st_astext
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
MULTIPOINT(147.766265850576 102.733187047914,84.0318650671786 83.712367636874,149.077046025334 68.9777848138994,107.54047530747 106.78013766944,121.059921872846 120.108716631886,137.475992983887 141.067784163524,145.074876095804 96.5277972374404,92.7965422941866 103.656943557244,66.0805226475207 56.7924152255781,72.3801321221102 71.3671567226799,145.087956158666 41.5121740980702,151.631108302923 156.218459065337)

なるほど、乱数が出力されているようです。

'LINESTRING(50 50,150 150,150 50)'), 10 → 座標 (50,50)(150,150)(150,50)で繋がれた幅10の直線上に

'endcap=round join=round'), 12));  →  12個の座標乱数を作れ

という意味のようです。

 


さて、実際の地図で試してみました。

kitaya_db=# SELECT st_asText(ST_GeneratePoints(ST_GeomFromText('POLYGON((35.66463989558893 139.69827111644202,35.663009879798764 139.6983247606236,35.663436999453225 139.7011571734108,35.665398233838545 139.7012966482829,35.66463989558893 139.69827111644202))'),12));

これは、以下の地図の4点で取り囲まれた地区で、任意の12点を抽出しろというSQL文になっています。

POLYGON((35.66463989558893 139.69827111644202,35.663009879798764 139.6983247606236,35.663436999453225 139.7011571734108,35.665398233838545 139.7012966482829,35.66463989558893 139.69827111644202))

ポリゴン(POLYGON)は、始点と終点(上の赤字)を同じ座標として閉じなればならないようなので、注意して下さい。

このSQL文のアウトプットは、以下のようになりました。

st_astext
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
MULTIPOINT(35.6638134136244 139.699085401991,35.6638440750173 139.700762425247,35.6634366319309 139.699705025931,35.6644917235626 ,35.66424835050 139.69868073913379 139.70025902483, 35.664689711471 139.700525986493,35.6635000403398 139.700601350665,35.6637472356065 139.698748086462,35.6641512918098 139.699288949827,35.6643791061995 139.701118277182,35.6636240715869 139.699272976596,35.6645803781279 139.699116246391)

エクセルで座標描いて、当ててみました。

全て領域の中に入っているようです。

さて、今度は、プログラム(go言語)でのこの座標の取り出し方です。

func main() {

	db, err := sql.Open("postgres",
		"user=postgres password=password host=192.168.0.23 port=15432 dbname=kitaya_db sslmode=disable")
	if err != nil {
		log.Fatal("OpenError: ", err)
	}
	defer db.Close()

	//rows, err := db.Query("select id, age, type, departure_name, departure_number, departure_lat, departure_lng, arrival_name, arrival_number, arrival_lat, arrival_lng from user_list")

	rows, err := db.Query("SELECT st_asText(ST_GeneratePoints(ST_GeomFromText('POLYGON((35.66404878 139.6931452,35.66051393 139.6943828,35.65878732 139.6973512,35.658431 139.6997472,35.66067562 139.705346,35.66404467 139.706768,35.66790807 139.7049654,35.66945399 139.702109,35.66672151 139.7018011,35.66475716 139.6987517,35.66362838 139.6955941,35.66641828 139.6934209,35.66404878 139.6931452))'),12))")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	var msg string

	for rows.Next() {
		if err := rows.Scan(&msg); err != nil {
			fmt.Println(err)
		}

		// まずはMULTIPOINTをバラバラに分解する
		arr1 := regexp.MustCompile("[() ,]").Split(msg, -1) // '('か、')'か、' 'か、","で分割する → "[中身]" という構造でまぎらわしい

		for _, s := range arr1 {
			fmt.Printf("%s\n", s)
		}
	}
}

出力結果

> go run main3.go
MULTIPOINT
35.6601418389163
139.702654481044
35.661087233013
139.694572689447
35.6617615089132

2022/11,江端さんの技術メモ

先日購入した持ち歩き用のPCですが、普段は、自宅で実験用のデータベースサーバとして使っています。

本日、とあるソフトをインストールしたら、psql(Postgresqlのクライアント)が繋がらなくなりました。

C:\Users\ebata>psql -U postgres -h 192.168.0.23 -p 15432
psql: error: could not connect to server: Connection timed out (0x0000274C/10060)
Is the server running on host "192.168.0.23" and accepting
TCP/IP connections on port 15432?

まあ、間違いなく、そのソフトのインストーラが、『頼みもしないセキュリティを勝手に設定していきやがった』のは確実です。
私はこういうソフトウェアに心底頭に来ています。
こちらは、少ないコンピュータリソースを四苦八苦しながら回しているので、こういう所業をしてくるソフトウェア会社の「保身」の無神経さを、許せません。

私が、自宅のドメインの中のシステムで、どういうセキュリティの設定をしようが、私の自由です。人の庭に勝手に手を入れるな! と怒鳴りたい気持です。
(江端家ネットワークのファイアウォールを破って侵入して、PCを乗っとられたら私の負けですので、その時は『負けました』といいます)

で、まあ、これからのこういうことがありそうなので、もう壮大にセキュリティを緩めてしまいました。

この後、名称を「全てのTCPのポートをオープン」とかして、登録しました。

で、この後、再度psqlでアクセスしてみたところ、無事に

C:\Users\ebata>psql -U postgres -h 192.168.0.23 -p 15432
Password for user postgres:
psql (13.4, server 12.5 (Debian 12.5-1.pgdg100+1))
Type "help" for help.
postgres=#
と、ログインできるようになりました。
こういう所業をしてくるソフトウェア会社の「保身」によって、私のPCの一台のセキュリティレベルが下がりました。
もし、江端家のシステムやPCがクラッキングを受けたら、この会社の責任です。
以上

2022/11,未分類,江端さんの技術メモ

[Control]+[Shift]でSKKが出てくる

[ALT] + [半角/全角漢字] で 日本語入力とアルファベット入力が切り変わる

 

モバイルPCとして購入した

を設定しているのですが、やっぱりEmacs+SKKが欲しくて、色々作業しています(やること山ほどあるけど、これをやらないと作業が捗らないので)

今回は、これまでと違って、SKKFEPというものを入れていみました(SKKのインストールで苦労するのが嫌だったからです)

今、動いているのですが、なんで動いているのか分からない状態なので、現時点で覚えていることを書き下しておきます。

参考にしたのはこちらのページ → SKK日本語入力FEP 今だ!インストールだ! (fc2.com)

Webサイト上の最新版の手動更新をブラウザでクリックして直接実行をすると、以下の画面がでてきて、設定してくれるようです。(管理者モードにしたかもしれないし、しなかったかもしれない)

で、次に、

SKK日本語入力FEP セットアップ処理一式 (Windows 7~10/Vista/XP)
β0+12i版 skkfep012_20220524.zip (92,698バイト) 追加ライブラリは不要です
異世界最新版のダウンロード
をダウンロードして、解凍して、その中にあったSETUP.jsを叩いた(ような気がする)

で、これで多分、SKKFEPが、この辺に表示されるだろう・・・と思ったのですが、これが出てこない。

のように、Microsoft IMEしかでてこなくて、頭を抱えました。

手当たりしだい、メニューを叩いて上記のように「言語バーのオプション」を叩いたら、以下の画面がでてきて、「キーの詳細設定」を選ぶとやっと、"SKK"という言葉がでてきました。

「シーケンスキーの変更」を押して、

のようにして、Ctrl+Shiftを押したら、やっとこさ、SKKのモードになりました。

少しインターフェースに戸惑うことがありますが、取り敢えず、後の設定は後で考えることにします。

以上

2022/11,江端さんの技術メモ

emacsやviに関する批評(というか”批判”ですね)は、数多くされていますが、これも前回、コンピュータ言語比較で論じた通り同様に『ばかばかしい』と思っています。

私のemacsで作成する文章の速度を越える人の数は、統計的には2σ以上(偏差値70以上)になると思いますので、これを捨てる必要はなかろうと思っています ―― emacsとSKKなしに、私の超長文コラムは製造できないと思います。

―― 自分の推しのプログラム言語のコラムをご希望の方。いつでもお仕事お引き受けします。


昨日、新しいマシンにWindowsに、手動で、もう誰も使っていないであろうemacs(Meadow)を手動でインストールしてみたのですが

これが、まだまだ、十分に動くんだなー(自分でも、かなりビックリしましたが)。
WindowsXPのころから使っているんだけど、凄いなー

という訳で、windowsが11,12,....とバージョンアップを続けても、動き続けるまで動かしてやろうと思っています。

で、

vscodeのemacsキーバインドマッピング 諦めました。

vscodeでは、emacsのキーバインドを完全に再現できそうにないことが分かってきましたし、vscodeは、Windowsタスクが重くなると頻繁にフリーズして、イライラさせられます。なので、コーディングは、全部Emacsで行うことにしました。

しかし、IDE (統合開発環境)としてのvscodeは完璧ですので、これを使わない手はありません。

で、今回、VSCodeのアドインの一つである、"Open in External Editor"というのを使って、(すったもんだありましたが)動いえているようなので、設定のメモを残しておきます。

拡張機能から、Open in Editorをインストールして、ギアをクリックします。

「拡張機能の設定」を選んで、メニューにある"setting.json"で編集をクリックします(どれをクリックしてもいい)

私の場合、最後の2行に以下を追加しました。

こうして、vscodeの方でファイル名の上で右クリックすると、"Open in Externl Editor"というメニューがでてくるので、これをクリックすると、emacsが立ち上がってきます。

vscodeの内容と、emacsの内容は、リアルタイムで連携しているようです(時々外れますが、その場合は、emacsを消してやりなおすと元に戻ることが多いです。

開発している様は無様でしょうが、コーディングでカッコつけても仕方ありません。
私は、このやり方で、押し通します。

以上

 

 

2022/11,江端さんの技術メモ

先程、シミュレータを動かそうとしたら、

ebata@DESKTOP-P6KREM0 MINGW64 ~/yamaguchi/src/PruneMobile
$ go run .
file cert.crt found switching to https
The process exited with https error: listen tcp :8080: bind: Only one usage of e
ach socket address (protocol/network address/port) is normally permitted.
exit status 1

が出てきたので、昨日インストールした、MSIPのサービスを停止したら、問題が解決した。

昨日、MSIPのサービスをインストールしたのだけど、その時ポート番号8080を使うようなパラメタの設定が少々気になったけど、デフォルトだったので、そのままにしておいた。

ポート番号を替えればいいのだろうけど、それはまたそれで、別の問題作りそうなので、当面は、サービスを止めて対応することにする(そのうち、シミュレータの方のポートを変更しようと思う)

 

 

 

2022/11,江端さんの技術メモ

VSCodeがなかなか立ち上がってこずに、プログラム開発が滞ってしまうほどでしたが、色々試してみた結果、悪い奴がoffice.comであることが分かりました。

ブラウザをchromeにしたりedgeにしてみたのですが、office.comを上げると、たちまちディスク0が100%になってしまうことが分かりました。その後、office.comのタブを消しても、100%が維持しつづけるようです(いずれ収まるようですが)。

office.comは便利なんですけど(iPadでもサクっと使えます)、意外なところで仕事の邪魔をされていました。

chromeの設定をクリアにしてしまったり、edgeを再インストールしたりと、酷い回り道をしてしまいました。
特に、chromeのアドインを全部消したのは、かなり痛いです。スクショくらい取っておけばよかった。

という訳で、これからoffice.comは、始業時、昼、就業時の3回だけ立ち上げるようにします。
江端に、至急の業務連絡をとりたい人はteamsでお知らせ下さい。

ちなみにvscodeも、立ち上げ時には、そこそこ鬱陶しいです。こんな感じ↓

こっちは、数分ほっておけば、こうなりますので、そこまで我慢します。

2022/11,江端さんの技術メモ

■PDFをブラウザで直接編集するサイト

https://smallpdf.com/jp/edit-pdf
一回実施すると、次の実施まで12時間かかるので、実質的には使えない

(T.B.D)

 

 

2022/11,江端さんの技術メモ

/*
C:\Users\ebata>psql -U postgres -h 192.168.0.23 -p 15432
Password for user postgres:
psql (13.4, server 12.5 (Debian 12.5-1.pgdg100+1))
Type "help" for help.

postgres=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-----------+----------+----------+------------+------------+-----------------------
 agent_db  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 postgres  | 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
 yama_db   | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
(5 rows)

postgres=# \c agent_db
psql (13.4, server 12.5 (Debian 12.5-1.pgdg100+1))
You are now connected to database "agent_db" as user "postgres".
agent_db=# \dt
           List of relations
 Schema |   Name    | Type  |  Owner
--------+-----------+-------+----------
 public | user_list | table | postgres
 public | user_log  | table | postgres
(2 rows)


agent_db=# select * from user_list;
 id  | age |   type   | departure_name | departure_number | departure_lat | departure_lng |     arrival_name     | arrival_number | arrival_lat | arrival_lng
-----+-----+----------+----------------+------------------+---------------+---------------+----------------------+----------------+-------------+-------------
   0 |  51 | tourist  | 山口駅         |             9324 |   131.4815191 |     34.172788 | 藩庁門               |           1396 |    34.18463 |  131.471535
   1 |  59 | tourist  | 山口駅         |             9324 |   131.4815191 |     34.172788 | 五重塔               |           7136 |   34.190132 | 131.4734607

*/

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/lib/pq" // ←これを追記
)

func main() {

	db, err := sql.Open("postgres",
		"user=postgres password=password host=192.168.0.23 port=15432 dbname=agent_db sslmode=disable")
	if err != nil {
		log.Fatal("OpenError: ", err)
	}
	defer db.Close()

	//rows, err := db.Query("select * from user_list")
	rows, err := db.Query("select id, age, type, departure_name, departure_number, departure_lat, departure_lng, arrival_name, arrival_number, arrival_lat, arrival_lng from user_list")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	var id, age, departure_number, arrival_number int
	var type1, departure_name, arrival_name string
	var departure_lat, departure_lng, arrival_lat, arrival_lng float64

	for rows.Next() {
		//if err := rows.Scan(&dt); err != nil {
		if err := rows.Scan(&id, &age, &type1, &departure_name, &departure_number, &departure_lat, &departure_lng, &arrival_name, &arrival_number, &arrival_lat, &arrival_lng); err != nil {
			fmt.Println(err)
		}
		fmt.Println(id, age, type1, departure_name, departure_number, departure_lat, departure_lng, arrival_name, arrival_number, arrival_lat, arrival_lng)
	}
}

/*
出力結果

C:\Users\ebata\yamaguchi\src_try1\others>go run .
0 51 tourist 山口駅 9324 131.4815191 34.172788 藩庁門 1396 34.18463 131.471535
1 59 tourist 山口駅 9324 131.4815191 34.172788 五重塔 7136 34.190132 131.4734607
2 55 tourist 湯田温泉駅 7247 131.4606901 34.1597909 ザビエル記念聖堂 2570 34.1796352 131.4728818
3 60 tourist 湯田温泉駅 7247 131.4606901 34.1597909 ザビエル記念聖堂 2570 34.1796352 131.4728818
4 42 tourist 山口駅 9324 131.4815191 34.172788 五重塔 7136 34.190132 131.4734607

*/

2022/11,江端さんの技術メモ

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now() // 
	time.Sleep(time.Second * 3)

	a := time.Since(now).Milliseconds()

	fmt.Printf("経過: %vms\n", a) // 

}

C:\Users\ebata\yamaguchi\src_try1\others>go run .
経過: 3008ms