2023,江端さんの忘備録

私が自分のブログで、頻繁に、短いプログラムをアップロードしているのは、マニュアル読んだって、APIの使い方が分からないからです。

I frequently upload short programs on my blog because I don't know how to use the API even after reading the manual.

このようなマニュアル読んでもさっぱり分からないし、サンプルプログラムは、私のやりたいこととズレています。

I have no idea what I'm doing by reading these manuals, and the sample programs are out of sync with what I want to do.

ですので、以下のように、

So, as shown in the following

golangによるcsvファイルのライン単位での書き出し方法

実際に、自分で書いて動いたコードを、小まめに残するようにしています。

In reality, I try to keep a small code that I have written and worked with.

他の人の役に立つかどうかは、二の次です。

Whether it is useful to others is secondary.

この方法に名前をつけるとすれば「具体例ベース」というのかもしれません。

If I had to give a name to this method, it might be called "concrete example-based".

それはさておき。

Aside from that.

-----

イベントの招待状などで、『平服にてご参加下さい』という文言が入っていることがありますが ――

In invitations to events, you may see the phrase, "Please attend in plain clothes.

私に言われれば、これは、最低最悪のホスピタリティです。

If you ask me, this is hospitality at its worst.

つまり『礼服はやめてね』と言っているだけで、カジュアルのレベルの判断をゲストに押しつける、無責任極まりない要求であるからです。

In other words, he/she is simply saying, 'Please don't wear formal wear,' and you are forced to judge the level of casual wear. This is an extremely irresponsible request.

ゲスト(招待客)は、カジュアルのレベルを間違えて、会場で恥しい思いをするかもしれません ―― しかし、そういう配慮をするホスト(主催者)には、滅多にお目にかかることができません。

Guests (invitees) may be embarrassed at the venue because of the wrong level of casualness -- but I rarely see a host (organizer) who takes such considerations into account.

-----

先日、父と母の納骨供養の案内を出しました。

I recently sent out information about the event laying their ashes to rest for my father and mother.

江端一夫・瑤子 納骨供養のご案内(公開版)

その中で、私は、ドレスコードを以下のような文章で、正確に規定しました。

In it, I have defined the dress code precisely in the following sentence.

『ご都合がよろしければ、平服にて御気軽にお立ち寄りをご検討頂ければ幸いです』

I hope you will consider stopping by in plain clothes if it is convenient for you.

『(私(智一)は、ジーパンとスニーカーと数珠持参で参加予定です)』

I (Tomoichi) will wear jeans, sneakers and prayer beads.

このように、ホストが、ホスト自身のドレスコードを具体的に提示することで、ゲストの負担を減らすことができます。

In this way, the host can reduce the burden on the guests by providing them with a specific dress code for themselves.

これが、「具体例ベース」です。

It is "concrete example-based".

-----

今後、「平服」を具体例で示さないホストには、このブログのURLをメールで送りつけようと考えています。

In the future, I will email the URL of this blog to hosts who do not provide specific examples of "plain clothes".

2023,江端さんの技術メモ

Keyword: golang csv write 書き出し ライン

package main

import (
	"database/sql"
	"encoding/csv"
	"fmt"
	"log"
	"os"

	_ "github.com/lib/pq"
)

func main() {
	file, err := os.Open("yamaguchi_area.csv")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	r := csv.NewReader(file)
	rows, err := r.ReadAll() // csvを一度に全て読み込む
	if err != nil {
		log.Fatal(err)
	}

	str := "SELECT ST_Covers(st_geomfromtext('POLYGON(("

	// 行ごとに
	for i, row := range rows {
		if i == 0 {
			continue // CSVのヘッダー行を無視
		}

		str += row[1] + " " + row[2] + ", " // rowのままで取り出せば、文字列になっている

	}
	str1 := str[:len(str)-2] + "))'),st_geomfromtext('LINESTRING(" // 上記の最後の", "を削除して、文字列を追加

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

	///////////////////////////////////////

	file2, err2 := os.Open("20220518weekday.csv")
	if err2 != nil {
		log.Fatal(err2)
	}
	defer file2.Close()

	r2 := csv.NewReader(file2)
	rows2, err2 := r2.ReadAll() // csvを一度に全て読み込む
	if err != nil {
		log.Fatal(err2)
	}

	file3, err3 := os.Create("testtest.csv")
	if err3 != nil {
		panic(err)
	}
	w := csv.NewWriter(file3)

	for _, row := range rows2 {
		//if i == 0 {
		//	continue // CSVのヘッダー行を無視
		//}

		str2 := str1 + row[0] + " " + row[1] + ", " + row[2] + " " + row[3]

		str2 += ")'))"

		//fmt.Println(str2)

		rows1, err := dbMap.Query(str2)
		if err != nil {
			log.Fatal(err)
		}
		defer rows1.Close()

		//var dt string
		var dt bool

		for rows1.Next() {
			if err := rows1.Scan(&dt); err != nil {
				fmt.Println(err)
			}
			// fmt.Println(dt)
			if dt {
				output := []string{row[0], row[1], row[2], row[3], row[4]}
				//fmt.Println("output:", output)

				if err = w.Write(output); err != nil {
					log.Fatal(err)
				}
			}
		}

		err = rows1.Err()
		if err != nil {
			panic(err)
		}

		defer w.Flush()

		if err := w.Error(); err != nil {
			log.Fatal(err)
		}

	}
}

重要なのは、以下のコード

file3, err3 := os.Create("testtest.csv")
if err3 != nil {
panic(err)
}

w := csv.NewWriter(file3)

output := []string{row[0], row[1], row[2], row[3], row[4]}
//fmt.Println("output:", output)

if err = w.Write(output); err != nil {
log.Fatal(err)
}

defer w.Flush()

2023,江端さんの技術メモ

簡単にできるみたいです。

package main

import (
	"fmt"
	"os"
)

func main() {
	//fmt.Printf("args count: %d\n", len(os.Args))
	//fmt.Printf("args : %#v\n", os.Args)

	// これでも拾えるし
	for i, v := range os.Args {
		fmt.Printf("args[%d] -> %s\n", i, v)
	}

	// こんな風にダイレクトにも取れる
	fmt.Println(os.Args[1])
	fmt.Println(os.Args[2])

}

出力結果

PS C:\Users\ebata\yamaguchi\src_try1\others> go run main7.go test1 test2
args[0] -> C:\Users\ebata\AppData\Local\Temp\go-build2152603201\b001\exe\main7.exe
args[1] -> test1
args[2] -> test2
test1
test2

2023,江端さんの技術メモ

keyword: postgres postgis st_geomfromtext ST_Covers POLYGON LINESTRING

早い話、

postgres=# \c yama_db
psql (13.4, server 12.5 (Debian 12.5-1.pgdg100+1))
You are now connected to database "yama_db" as user "postgres".

yama_db=# SELECT ST_Covers(st_geomfromtext('POLYGON((34.15131035 131.5194525, 34.16270729 131.5152409, 34.16516798 131.5115994, 34.16898442 131.5047413, 34.17907707 131.5010998, 34.18354557 131.4989149, 34.18561453 131.5025188, 34.18856404 131.5058416, 34.18909138 131.5050188, 34.19687848 131.5103978, 34.19927298 131.5072766, 34.20121465 131.510747, 34.20300086 131.5120785, 34.20536452 131.5096798, 34.20975399 131.5068729, 34.20709501 131.5009018, 34.20388724 131.5048315, 34.20194564 131.5047294, 34.19785124 131.4988093, 34.20194564 131.4969721, 34.20528011 131.4932975, 34.20114366 131.4948286, 34.19802009 131.4962576, 34.19894873 131.4931955, 34.19705211 131.4916877, 34.19973769 131.4886834, 34.19579714 131.490747, 34.19717761 131.4888048, 34.19802009 131.4962576, 34.20061613 131.483555, 34.19383935 131.482506, 34.19306821 131.4800321, 34.18962489 131.4802896, 34.20041552 131.4735871, 34.19870882 131.4691668, 34.19193378 131.4719122, 34.19281714 131.4631425, 34.18750372 131.4649829, 34.18208468 131.4692086, 34.17814677 131.4619382, 34.18089338 131.4606752, 34.18352048 131.465583, 34.18537135 131.4575717, 34.18358019 131.4532773, 34.17689286 131.4597008, 34.17568909 131.4574644, 34.17805351 131.453254, 34.18115671 131.4490436, 34.18094562 131.4462621, 34.17766341 131.4457491, 34.17637565 131.444856, 34.17452943 131.4472807, 34.17400259 131.4457099, 34.1745741 131.4435783, 34.17591761 131.4391215, 34.17349927 131.4370465, 34.171469 131.4367036, 34.17997306 131.4313284, 34.17831615 131.4270193, 34.16993073 131.4276566, 34.17045141 131.4197235, 34.16662955 131.4242344, 34.17054098 131.4093664, 34.16585321 131.4150321, 34.16292695 131.4256418, 34.16209086 131.4305497, 34.15853738 131.4324262, 34.1555247 131.431539, 34.1368104 131.4231705, 34.13155312 131.4262604, 34.13252285 131.4303061, 34.12981919 131.4361751, 34.12994592 131.4412276, 34.13256509 131.4488319, 34.13167796 131.4539864, 34.13486474 131.4591635, 34.13933143 131.4660729, 34.14099198 131.4710403, 34.14447279 131.4734114, 34.14677254 131.4766944, 34.14983145 131.488296, 34.14860698 131.5025144, 34.15034783 131.5173554, 34.15131035 131.5194525))'),st_geomfromtext('LINESTRING(34.17282136235268 131.4810495539796, 34.17234106467595 131.47746432882846)'));

というSQL文をGoプログラムで作る。

(1)csvファイル(84点)からなる領域を作っておいて、エリアデータ
(2)ODデータを直線として取り込み、直線データ
(3)上記(2)の直線が、上記(1)の領域に入っているかどうかを調べて、入っている場合は標準出力で出力する


// ~/yamaguchi/src_try1/others/main6.go

package main

import (
	"database/sql"
	"encoding/csv"
	"fmt"
	"log"
	"os"

	_ "github.com/lib/pq"
)

func main() {
	file, err := os.Open("yamaguchi_area.csv")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	r := csv.NewReader(file)
	rows, err := r.ReadAll() // csvを一度に全て読み込む
	if err != nil {
		log.Fatal(err)
	}

	str := "SELECT ST_Covers(st_geomfromtext('POLYGON(("

	// 行ごとに
	for i, row := range rows {
		if i == 0 {
			continue // CSVのヘッダー行を無視
		}

		str += row[1] + " " + row[2] + ", " // rowのままで取り出せば、文字列になっている

	}
	str1 := str[:len(str)-2] + "))'),st_geomfromtext('LINESTRING(" // 上記の最後の", "を削除して、文字列を追加

	dbMap, err := sql.Open("postgres",
		"user=postgres password=password host=192.168.0.23 port=15432 dbname=yama_db sslmode=disable")
	// log.Println("------------------ map db open ------------------")
	if err != nil {
		log.Fatal("OpenError: ", err)
	}
	defer dbMap.Close()

	///////////////////////////////////////

	file2, err2 := os.Open("20220518weekday.csv")
	if err2 != nil {
		log.Fatal(err2)
	}
	defer file2.Close()

	r2 := csv.NewReader(file2)
	rows2, err2 := r2.ReadAll() // csvを一度に全て読み込む
	if err != nil {
		log.Fatal(err2)
	}

	for _, row := range rows2 {
		//if i == 0 {
		//	continue // CSVのヘッダー行を無視
		//}

		str2 := str1 + row[0] + " " + row[1] + ", " + row[2] + " " + row[3]

		str2 += ")'))"

		//fmt.Println(str2)

		rows1, err := dbMap.Query(str2)
		if err != nil {
			log.Fatal(err)
		}
		defer rows1.Close()

		//var dt string
		var dt bool

		for rows1.Next() {
			if err := rows1.Scan(&dt); err != nil {
				fmt.Println(err)
			}
			// fmt.Println(dt)
			if dt {
				output := row[0] + "," + row[1] + "," + row[2] + "," + row[3] + "," + row[4]
				fmt.Println(output)
			}

		}

	}
}

2023,江端さんの技術メモ

まずGISのDBにアクセスしておきます(必要なのかどうかは不明です)。

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=# \c kitaya_db
psql (13.4, server 12.5 (Debian 12.5-1.pgdg100+1))
You are now connected to database "kitaya_db" as user "postgres".
(1)領域の中に領域が含まれている場合です。

kitaya_db=# SELECT ST_Covers(st_geomfromtext('POLYGON((35.66776966314929 139.6895046225338,35.657947599160494 139.69091202947678,35.65865130959591 139.70318173103095,35.66885441403114 139.70307346895845,35.66776966314929 139.6895046225338))'), st_geomfromtext('POLYGON((35.66527761205352 139.6953146870933,35.66246296668681 139.69387119279278,35.66316663733071 139.70036691714503,35.66527761205352 139.6953146870933))'));
st_covers
-----------
t
(1 row)

(2)領域の中に領域が含まれていない場合です。

kitaya_db=# SELECT ST_Covers(st_geomfromtext('POLYGON((35.66776966314929 139.6895046225338,35.657947599160494 139.69091202947678,35.65865130959591 139.70318173103095,35.66885441403114 139.70307346895845,35.66776966314929 139.6895046225338))'), st_geomfromtext('POLYGON((35.66527761205352 139.6953146870933,35.66246296668681 139.69387119279278, 35.662818 139.7050018, 35.66527761205352 139.6953146870933))'));
st_covers
-----------
f
(1 row)

(3)領域の中に点が入っている場合です。

kitaya_db=# SELECT ST_Covers(st_geomfromtext('POLYGON((35.66776966314929 139.6895046225338,35.657947599160494 139.69091202947678,35.65865130959591 139.70318173103095,35.66885441403114 139.70307346895845,35.66776966314929 139.6895046225338))'), st_geomfromtext('POINT(35.66527761205352 139.6953146870933)'));
st_covers
-----------
t
(1 row)

(4)領域の中に点が入っていない場合です。

kitaya_db=# SELECT ST_Covers(st_geomfromtext('POLYGON((35.66776966314929 139.6895046225338,35.657947599160494 139.69091202947678,35.65865130959591 139.70318173103095,35.66885441403114 139.70307346895845,35.66776966314929 139.6895046225338))'), st_geomfromtext('POINT(35.662818 139.7050018)'));
st_covers
-----------
f
(1 row)

以上

 

2023,江端さんの忘備録

経済産業省出身の秘書官(55)が、3日夜、性的少数者(LGBTなど)や同性婚に関し「見るのも嫌だ。隣に住んでいたらやっぱり嫌だ」と、述べたそうです。

A secretary (55) from the Ministry of Economy, Trade, and Industry (METI) said on the evening of March 3, "I don't even want to look at sexual minorities (LGBT, etc.) and same-sex marriagem", and "I would also hate it if I lived next door".

―― またか

"Not again"

と思いました。

I thought that.

-----

2つあります。

There are two issues.

(1)性的少数者(LGBTなど)や同性婚を、そのようなことに慣れてこなかった私たちジジイやババアが理解するのは難しいです。

(1) It is difficult for us old geezers and old ladies to understand sexual minorities (e.g. LGBT) and same-sex marriage, as we have not been used to such things.

だから、感覚で理解できないのであれば、ニュース、ドキュメンタリー、コンテンツ(マンガから論文に至るまで)から知識を得て、理解するしかないのです。

So if you can't understand it by feel, then you have to gain knowledge and understanding from news, documentaries, and content (ranging from comics to papers).

■「高齢者を組織のトップから、ナチュラルに排除」する技術

長い時間をかけて、少しずつでも勉強し続けることで、自分のもっている感性(「偏見」を含む)を変えていくことはできます。

Over a long period of time, by continuing to study, even gradually, you can change the sensibilities (including "prejudices") that you have.

私(江端)は「できた」と思います(この件に関してだけですが)。

I (Ebata) think I did it (only in this case).

逆にいえば、それをやらずに、自分の感性に固執しつづける人間は ―― 勉強をしていないのです。

Conversely, those who don't do it and continue to cling to their own sensibilities -- they are not studying.

-----

私は、誰もが、辛い勉強をしなければならないとは思っていません。

I do not believe that anyone should have to learn the hard way.

が、

However,

―― 日本国総理大臣の秘書官

"Secretary to the Prime Minister of Japan"

は、不断の勉強を続けなけばならない人間の一人だと思っています。

is one of those who must continue to study tirelessly.

故に、彼が「無知」で居続けたことは「罪」です。

Hence, his continued "ignorance" is "harmful".

-----

(2)"オフレコ"を前提として自分の考えを語ってしまったようですが、正直『脇が甘いなぁ』と思いました。

(2) He spoke his mind on the premise of "off the record," but to be honest, I thought he was a bit naive.

一サラリーマンに過ぎない私ですら、「オフレコ」なんぞ信じていません。

Even I, a just businessman, do not believe in "off the record".

例えば、会社で実施されるアンケートには、本当のことは書きません。

For example, we do not write the truth in questionnaires conducted by the company.

一例ですが、JMI(心の定期健康診断)では、『宇宙から声が聞こえる』という質問に、毎回「はい」と答えています。

As an example, at JMI (periodic mental health checkup), I answer 'yes' to the question 'I can hear voices from the universe' every time.

JMI(心の定期健康診断)

今年もやってきました。私の神経を逆撫でする、あの"JMI"が。

ましてや、会社の方針の批判なんぞ、論外です ―― まあ、会社の方針は、比較的、私には納得できるものが多くて助かっていますが。

Criticism of company policy is out of the question -- well, I'm glad to say that many of the company's policies are relatively acceptable to me.

----

『性的少数者(LGBTなど)や同性婚に関し「見るのも嫌だ。隣に住んでいたらやっぱり嫌だ」』という自分の思いを、(自分の勉強不足で)晒した点は、正直なところ

He was exposed to his own feelings of "I don't even like to look at them and I would still hate it if I lived next door", through my lack of study. To tell you the truth, I had to think,

―― "お坊ちゃん"だなぁ

"He was a little boy"

と思わずにはいられませんでした。

-----

『自分の仕える主人(例:首相)の主張に反することは、(どう考えていようが)口にしない』――

"I will not say anything that contradicts the claims of my master (e.g. the prime minister), no matter what I think"

これは、サラリーマンの金科玉条(きんかぎょくじょう)です。

This is the golden rule for businessmen.

2023,江端さんの技術メモ

宿題が出ました。

A Homework is coming .

交通量の少ない通り(200台/時程度)を信号のない場所から選ぶ。
1時間の間に車がある地点を通過する時刻を記録する。時刻は1秒か2秒の単位で 秒単位で記録する。
1. 時刻tまでに観測点を通過した車両の累積台数A(t)を描画する。図の横軸は時間 図の横軸は時間、縦軸はA(t)とする。
2. A(t)のうち、ほぼ線形(平均到着率が一定)の部分を選択する。この時間帯のカウント数から この時間帯のカウントから、1分間と5分間の連続したカウントのヒストグラムを作成する。そして、そのヒストグラムをポアソン分布と比較する。

Select a street with low traffic volume (about 200 cars/hour) from a location without a traffic light.
Record the time at which a car passes a certain point during a one-hour period. Record the time in seconds, in increments of 1 or 2 seconds.
Draw the cumulative number of vehicles A(t) that passed the observation point by time t. The horizontal axis of the figure is time, and the vertical axis is A(t). 2.
Select a portion of A(t) that is nearly linear (constant average arrival rate). From the counts during this time period. From the counts during this time period, create a histogram of consecutive counts for 1 minute and 5 minutes. The histogram is then compared to the Poisson distribution

Translated with www.DeepL.com/Translator (free version)

近日中に防寒着を着込んで、道路の近くで自動車の通過時刻をノートにメモすることになりそうです。
I will be putting on my winter clothes in the coming days and noting down in my notebook the time of passing cars near the road.

―― これをノートに記載するのは面倒くさいな
-- I can't be bothered to note this.

―― この手のアプリは絶対にあるはずだ
-- there should definitely be an app for this kind of thing.

と思ったのですが、iPad用のアプリが見つからず、しぶしぶ自分でJavaScriptを組み出しました。
But I could not find an app for the iPad, so I reluctantly put together my own JavaScript.

しかし、表示が上手くいかず、今度はiPadに限定せずに探し捲りました。
However, the display did not work, and this time I searched around without limiting myself to the iPad.

で、見つけたのがこれです。
This is what I found

時刻カウンター (タイムスタンプの記録ができるカウンター)
Time counters (counters that can record time stamps)

アイコン画像

Android端末専用でしたが、私の部屋にはSIMカードの入っていないスマホがゴロゴロしていますので、そのうちの一台にインストールしました。
It was for Android devices only, but I have a bunch of phones without SIM cards in my room, so I installed it on one of them.

2画面のイメージはこちらです(6画面までできるようです)
Here is an image of two screens (it seems to be possible to have up to 6 screens)

これで、左方向、右方向バラバラで台数計測できそうです。
This will allow me to measure the number of units in the left and right directions separately.

交通量を計測するので、計測時間は十分に短くないと困ります。
Since I am measuring traffic, the measurement time must be short enough.

ですので、[設定]→[再カウントまでの時間]を1000ms→10msに変更しました。
Therefore, I changed [Settings] -> [Time until recount] from 1000 ms to 10 ms.

[音をならす]、[振動させる]も解除しておきました。
I also deactivated [Make Sound] and [Vibrate].

で、計測結果をメールで自分のアドレスに送ってみました
And I emailed the measurement results to my address.

1,1,"カウンター1",2023-01-24 23:19:03,2023,1,24,23,19,3,0
2,2,"カウンター2",2023-01-24 23:19:06,2023,1,24,23,19,6,0
3,1,"カウンター1",2023-01-24 23:19:09,2023,1,24,23,19,9,0
4,1,"カウンター1",2023-01-24 23:19:12,2023,1,24,23,19,12,0
5,2,"カウンター2",2023-01-24 23:19:14,2023,1,24,23,19,14,0
6,1,"カウンター1",2023-01-24 23:19:19,2023,1,24,23,19,19,0
7,2,"カウンター2",2023-01-24 23:19:26,2023,1,24,23,19,26,0
8,2,"カウンター2",2023-01-24 23:19:28,2023,1,24,23,19,28,0
9,2,"カウンター2",2023-01-24 23:19:29,2023,1,24,23,19,29,0
10,1,"カウンター1",2023-01-24 23:19:31,2023,1,24,23,19,31,0

csv形式というのもいいです。加工しやすそうです。
I also like that it is in csv format. It seems to be easy to process.

これでフィールドワークはなんとかなりそうです。
So, I will able to do my homework.

 

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/12,江端さんの技術メモ

https://www.nikkoken.or.jp/pdf/project/2021/A-854.pdf

これまで述べてきたように、MATSimは移動の均衡をモデル化するための統合シミュレーションツールキットとして設計されました。このため、MATSimは交通需要と供給の両方をモデル化できる必要があります。の部分をモデル化する必要があります。この目的のために、MATSimは図2.3に示すように、均衡に収束するための共進化反復ループを採用しています。図2.3に示すとおりである(p.19)。

このループは、各個人の1日の行動とトリップチェーンという形で、最初の旅行需要から始まります。ループが始まる。このアクティビティとトリップチェーンは、Mobsimの段階で道路ネットワークにロードされる。一日のシミュレーションが終わると を計算し,その結果をもとに,各エージェントのアクティビティ・チェーン(計画)のスコアを計算する.最後の このとき,各エージェントは,以前の計画から生成された計画の集合を所有し を持つことになり,そのスコアに基づいて次の反復で実行するものを選択しなければならない.
ネットワーク負荷の部分では、MATSimのデフォルトとしてトラフィックフローモデルQSimが採用されている。この QSimは計算効率の良い待ち行列ベースのアプローチを適用している。基本的に、車両が道路セグメントに進入する際 を計算することができる.次に、その車両は道路の待ち行列の最後尾に挿入される。第二に,車両は道路の待ち行列の最後尾に挿入され,最後に,道路の流出能力に応じて道路を離れます.ここで、流出速度は各道路に固有であり、容量属性で指定される。

スコアリングとリプランニングの部分では、各エージェントにとって「より良い」プランと「より悪い」プランを区別する基準を提供するために、一般化された効用様式でスコアが定式化される。再計画では、このスコアをもとに、過去の計画、すなわち特定のエージェントが行った計画をもとに、完全に新しい計画を「品種改良」する遺伝的アルゴリズム(または進化的アルゴリズムと呼ばれる)を適用する。一般に、突然変異と選択という二つの演算子が使われる。突然変異演算子は、以前に実行された計画中の特定のコンポーネントを変更し、この変更された(すなわち、突然変異)計画を次の反復に使用する。次の反復処理に採用する。
MATSimで使用できるセレクタは、使用する平衡状態によって複数種類あります。
る平衡状態によって異なる。ベストリプライセレクタは、前回の反復からベストプランを選択するものです。
MNLセレクタは、プラン選択のアプローチを離散的選択の方法で適用し、エージェントの行動における以下の確率を考慮する。エージェントの行動には確率がある。

MATSim OSS & フリー Google Scholar(GS) 5750
http://bin.t.u-tokyo.ac.jp/kaken/pdf/2014_wakabayashi1.pdf
インプットデータ
・1日のスケジュール
・道路ネットワーク
・モデルのパラメータ
2. 1日のスケジュール効用を計算
𝑈𝑎𝑐𝑡 : 活動の効用 𝑈𝑡𝑟𝑎𝑣𝑒𝑙 : 移動の効用 𝑖:1回の活動
1. シミュレーションの実行
3. プランの変更
・出発時刻
・交通手段
・経路
・目的地
・駐車場
1~3を効用(Score)が収束するまで繰り返す
https://progsoft.net/ja/software/matsim

MATSimは、Javaで実装されたアクティビティベースの拡張可能なマルチエージェントシミュレーションフレームワークです。
これはオープンソースであり、インターネットからダウンロードできます(MATSim、2016; GitHub、2015)。
フレームワークは大規模なシナリオ向けに設計されています。つまり、対象となる機能を効率的に処理するために、すべてのモデルの機能が取り除かれています。
並列化も非常に重要です(例:Dobler and Axhausen、2011; Charypar、2008)。 たとえば、ネットワーク負荷シミュレーションの場合、キューベースのモデルが実装され、非常に複雑で計算コストの高い自動車追従動作が省略されます(セクション1.3を参照)。
現時点では、MATSimは、アクティビティベースのモデルの分析の一般的な単位である1日をモデル化するように設計されています(たとえば、Bowmanによるレビュー、2009aを参照)。
それにもかかわらず、原則として、複数日モデルを実装することができます(Horni and Axhausen、2012年)。

SUMO OSS & フリー 交差点解析などに使われている様子  GS 35700
https://kudzuyu.github.io/SUMO-wiki-ja/SUMO_at_a_Glance/

  • シミュレーション
    • 連続空間かつ離散時間での車の動き
    • 複数の自動車の種類
    • 車線変更のある複数車線道路
    • 異なった右側通行ルールや信号
    • 高速なopenGL GUI
    • 数万単位の枝(道路)を含むネットワークの制御
    • 高速起動(1GHzマシンにおいて10万台までの車を1秒以内に更新)
    • 起動中の他のアプリケーションとの相互利用性
    • ネットワーク範囲での道路、車、検知器基準の出力\
    • 人基準のマルチモーダル移動のサポート
      -

交通シミュレーションの研究をやっていることから、MATSimの調査を行っています。

もう、昨日から本当にドタバタやっているのですが、MATSimの環境構築について、記載されているドキュメントが、非常に乏しく、日本語のものはゼロと言って良いと思います。

いろいろやって、現時点で上手くいかなかったこと

> git clone https://github.com/maptic/matsim-docker.git

> docker-compose build

> docker-compose upで、"docker-compose build" は成功したのですが、"docker-compose up" は以下ようにになってしまいました。

あきらめてhttps://www.matsim.org/downloads/からアプローチしてみた

>docker run -v /opt/matsim/data/input -v /opt/matsim/data/output maptic/matsim:latest

Vscode以外のIDEは入れたくないが、IntelliJ IDEA を入れろと言われたので、入れることにする(Dockerで手早く片づけたかったが)、アプローチがさっぱり分からんので仕方ない。

「The Multi-Agent Transport Simulation MATSim」を読むことにしました。


から、C:\Users\tomoi\matsim-14.0 に展開しておきました

つぎにここから「The Multi-Agent Transport Simulation MATSim」を落してきました。

で、

の、

のこれを出せるかどうかが、勝負だと見ました。

まず、javaをインストールしました。
私は、https://adoptopenjsk.net から、64bit版WindowsJDKのZIP版をダウンロードしました。
1. Choose a Version では、OpenJDK11 を、2. Choose a JVMではHotSpotを選択、Other platformsのボタンをクリックしました。
Windows, x64, .zip でダウンロードして、C:\Program Files\Java\jdk-11.0.17+8\bin にパスを通しておきました。

:\Users\tomoi\matsim-14.0>java -jar matsim-14.0.jar を起動すると、以下の画面が表示されます。


で、先程展開した、C:\Users\tomoi\matsim-14.0のサンプルの中にあるconfig.xmlを使うと、何か計算をしているようです。

2023-01-01T00:33:27,301 INFO IOUtils:215 Resolved C:\Users\tomoi\matsim-14.0\examples\berlin\config.xml to C:\Users\tomoi\matsim-14.0\examples\berlin\config.xml

ただ、今のところ、エラー終了してしまうようです。

上記の問題については、https://github.com/matsim-org/matsim-code-examples/issues/736 の方に記載されていました。
内容はこんな感じでした。

残念ながら、これはまだ修正されていないバグです。GUI クラスを実行する代わりに、RunMatsim クラスを直接実行することもできます。

java -cp matsim-example-project-0.0.1-SNAPSHOT.jar org.matsim.project.RunMatsim
デフォルトの設定ファイルとは別の設定ファイルを使用したい場合は、コマンドが変わります。

java -cp matsim-example-project-0.0.1-SNAPSHOT.jar org.matsim.project.RunMatsim /path/to/your/config.xml となります。

こんにちは、私は同じエラーに遭遇し、それはWindowsにリンクされているように見えた。このバグが修正されるかどうか、またいつ修正されるか知っていますか?

Windows の MATSimGUI で AccessDeniedException が発生する matsim-org/matsim-libs#2052

matsim-org/matsim-libs#2052 にissueを作成しました。ご指摘ありがとうございました。

JDKのバージョンを確認してください。この問題は、jdk 17 以降で発生するようです。JDK11でmatsim-14.0.jarを動かしてみてください。がんばってください。

も、私、jdk11を使っているんだけどなぁ?

続きがありました。

私もJDK11を使用していますが、同じ問題に遭遇しました。なぜなら、私が知る限り、LegHistogramChartクラスはpngを保存するために適切なローカルパスを送っていますが、jfreechartはC:³³に一時ファイルを作成しようとし、パーミッション問題に遭遇しています。簡単な回避策は、<param name="createGraphs" value="false" />を追加して、グラフをオフにすることです。をconfig.xmlのcontrollerモジュールに追加することです。そうすれば問題なく実行できます。もちろん、グラフは表示されませんが、その他の出力や解析はすべて可能です。

ということのようです。

で、C:\Users\tomoi\matsim-14.0\examples\berlin\config.xml の中をちょっくら弄ってみました。

<module name="controler">
<param name="outputDirectory" value="./output/berlin" />
<param name="firstIteration" value="0" />
<param name="lastIteration" value="0" />
<param name="createGraphs" value="false" />
</module>

の赤字の一行を追加したら、エラーで止まることはなくなりました。

さて、多分、ここ(C:\Users\tomoi\matsim-14.0\examples\berlin\output\berlin)にできているファイルを使って、シミュレーションの見える化をするのだろうと思います。


https://www.matsim.org/downloads/の

Visualization の翻訳

シミュレーションが実行されると、その出力ディレクトリに多くのファイルが作成されます。GUIには出力ディレクトリに到達するためのボタンがあることに注意してください。そのうちの1つは、いわゆるイベントファイルで、通常10回目のイテレーションごとに生成されます。0回目の繰り返しのイベントファイルは .../ITERS/it.0/...0.events.xml.gz に格納されています。これには可視化できる情報がたくさん含まれています。

MATSimの出力を視覚化する最も簡単な方法は、VIAを使うことです。エージェントの数に制限のある無料版がダウンロード可能です。VIAを起動すると、大きな黒い領域が表示されるはずです。ここがトラフィックを可視化する場所です。このエリアの左側に、上部に4つのアイコンがある小さなエリアがあります(「コントロール」)。最初のアイコン(Data Sources)をクリックします。このセクションにファイルをドラッグ&ドロップするか(例:network.xml、events.xml.gz)、下部の「+」をクリックして追加するファイルを選択できます。いずれかの方法で、まずnetwork.xmlを利用可能なデータのリストに追加し、次にevents.xml.gzを追加します。これでビジュアライザーがデータを認識し、どのようにビジュアル化するかを指示することができます。

次に、コントロールセクションの 2 番目のアイコン ("レイヤー") をクリックします。初期状態では、背景レイヤーのみが表示されています。をクリックして、表示させたいデータを選択します。読み込んだnetwork.xmlでネットワークを視覚化するよう既に提案されているはずなので、「Add」をクリックします。しばらくすると、ネットワークが可視化エリアに表示されるはずです。をもう一度クリックし、今度はレイヤーの種類として「ビークル」を選択します。event.xml.gzファイルはすでに選択されています。追加]をクリックします。イベントに依存するレイヤと同様に、レイヤタグの下部に「データを読み込む」ボタンが表示されます。これをクリックすると、イベントから車両の位置が抽出されます。


VIAというビューアについて調査中

https://simunto.com/via/download