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.

 

2023,江端さんの技術メモ

出典を忘れてしまいましたが、どなたかが作られたコードを丸パクリさせて頂きました。→たぶん"これ"

ノード1 → "A", ノード2 → "B", ノード3 → "C", ノード4 → "D", ノード5 → "E" として取り扱います。

package main

import (
	"errors"
	"fmt"
)

// ノード
type Node struct {
	name  string  // ノード名
	edges []*Edge // 次に移動できるエッジ
	done  bool    // 処理済みかを表すフラグ
	cost  int     // このノードにたどり着くのに必要だったコスト
	prev  *Node   // このノードにたどりつくのに使われたノード
}

func NewNode(name string) *Node {
	node := &Node{name, []*Edge{}, false, -1, nil}
	return node
}

// ノードに次の接続先を示したエッジを追加する
func (self *Node) AddEdge(edge *Edge) {
	self.edges = append(self.edges, edge)
}

// エッジ
type Edge struct {
	next *Node // 次に移動できるノード
	cost int   // 移動にかかるコスト
}

func NewEdge(next *Node, cost int) *Edge {
	edge := &Edge{next, cost}
	return edge
}

// 有向グラフ
type DirectedGraph struct {
	nodes map[string]*Node
}

func NewDirectedGraph() *DirectedGraph {
	return &DirectedGraph{
		map[string]*Node{}}
}

// グラフの要素を追加する (接続元ノード名、接続先ノード名、移動にかかるコスト)
func (self *DirectedGraph) Add(src, dst string, cost int) {
	// ノードが既にある場合は追加しない
	srcNode, ok := self.nodes[src]
	if !ok {
		srcNode = NewNode(src)
		self.nodes[src] = srcNode
	}

	dstNode, ok := self.nodes[dst]
	if !ok {
		dstNode = NewNode(dst)
		self.nodes[dst] = dstNode
	}

	// ノードをエッジでつなぐ
	edge := NewEdge(dstNode, cost)
	srcNode.AddEdge(edge)
}

// スタートとゴールを指定して最短経路を求める
func (self *DirectedGraph) ShortestPath(start string, goal string) (ret []*Node, err error) {
	// 名前からスタート地点のノードを取得する
	startNode := self.nodes[start]

	// スタートのコストを 0 に設定することで処理対象にする
	startNode.cost = 0

	for {
		// 次の処理対象のノードを取得する
		node, err := self.nextNode()

		// 次に処理するノードが見つからなければ終了
		if err != nil {
			return nil, errors.New("Goal not found")
		}

		// ゴールまで到達した
		if node.name == goal {
			break
		}

		// 取得したノードを処理する
		self.calc(node)
	}

	// ゴールから逆順にスタートまでノードをたどっていく
	n := self.nodes[goal]
	for {
		ret = append(ret, n)
		if n.name == start {
			break
		}
		n = n.prev
	}

	return ret, nil
}

// つながっているノードのコストを計算する
func (self *DirectedGraph) calc(node *Node) {
	// ノードにつながっているエッジを取得する
	for _, edge := range node.edges {
		nextNode := edge.next

		// 既に処理済みのノードならスキップする
		if nextNode.done {
			continue
		}

		// このノードに到達するのに必要なコストを計算する
		cost := node.cost + edge.cost
		if nextNode.cost == -1 || cost < nextNode.cost {
			// 既に見つかっている経路よりもコストが小さければ処理中のノードを遷移元として記録する
			nextNode.cost = cost
			nextNode.prev = node
		}
	}

	// つながっているノードのコスト計算がおわったらこのノードは処理済みをマークする
	node.done = true
}

func (self *DirectedGraph) nextNode() (next *Node, err error) {
	// グラフに含まれるノードを線形探索する
	for _, node := range self.nodes {

		// 処理済みのノードは対象外
		if node.done {
			continue
		}

		// コストが初期値 (-1) になっているノードはまだそのノードまでの最短経路が判明していないので処理できない
		if node.cost == -1 {
			continue
		}

		// 最初に見つかったものは問答無用で次の処理対象の候補になる
		if next == nil {
			next = node
		}

		// 既に見つかったノードよりもコストの小さいものがあればそちらを先に処理しなければいけない
		if next.cost > node.cost {
			next = node
		}
	}

	// 次の処理対象となるノードが見つからなかったときはエラー
	if next == nil {
		return nil, errors.New("Untreated node not found")
	}

	return
}

func main() {
	// 有向グラフを作る
	g := NewDirectedGraph()

	// グラフを定義していく
	g.Add("A", "B", 2)
	g.Add("A", "C", 7)
	g.Add("A", "D", 5)

	g.Add("B", "D", 4)

	g.Add("C", "E", 2)

	g.Add("D", "C", 1)
	g.Add("D", "E", 4)

	g.Add("E", "C", 2)

	// "s" ノードから "z" ノードへの最短経路を得る
	path, err := g.ShortestPath("A", "E")

	// 経路が見つからなければ終了
	if err != nil {
		fmt.Println("Goal not found")
		return
	}

	// 見つかった経路からノードとコストを表示する
	for _, node := range path {
		fmt.Printf("ノード: %v, コスト: %v\n", node.name, node.cost)
	}
}

 

出力結果

C:\Users\ebata> go run .\dijkstra.go
ノード: E, コスト: 8
ノード: C, コスト: 6
ノード: D, コスト: 5
ノード: A, コスト: 0

ラベル修正法の練習(だけ)

2023,江端さんの技術メモ

「Golangでcsvファイルを読み出す」の記事は多いのですが、特定の行まで引っ張り出す情報があまりないので、メモを残しておきます。

/*
以下のcsvファイル(kai_20220522holyday18.csv)の中身を取り出す
id,age,type,departure_name,departure_number,departure_lat,departure_lng,arrival_name,arrival_number,arrival_lat,arrival_lng
0,43,resident,,,34.173408,131.470684,,,34.155862,131.501246
1,24,resident,,,34.179449,131.482543,,,34.164116,131.471791
2,42,resident,,,34.168739,131.470768,,,34.160989,131.491124
3,21,resident,,,34.169494,131.469934,,,34.173498,131.471351
4,58,resident,,,34.185295,131.47414,,,34.191481,131.49456
5,48,resident,,,34.150778,131.480747,,,34.16536,131.471872
6,56,resident,,,34.16536,131.471872,,,34.174066,131.479312
7,73,resident,,,34.155731,131.500845,,,34.16776,131.472831
8,47,resident,,,34.167237,131.471785,,,34.155775,131.476531
9,21,resident,,,34.154931,131.50468,,,34.156678,131.49581
10,37,resident,,,34.16727,131.472899,,,34.171253,131.471177
11,40,resident,,,34.147241,131.474921,,,34.150675,131.486268
12,67,resident,,,34.173683,131.476347,,,34.173643,131.471027
13,28,resident,,,34.183079,131.484303,,,34.174245,131.474592
14,46,resident,,,34.146154,131.472711,,,34.159611,131.491548
15,25,resident,,,34.162497,131.489283,,,34.147212,131.475984
*/

package main

import (
	"encoding/csv"
	"fmt"
	"log"
	"os"
	"strconv"
)

func main() {
	file, err := os.Open("kai_20220522holyday18.csv") // 先ほど入手した郵便番号データをos.Openで開く
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

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

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

		age := row[1]

		departure_lat, err := strconv.ParseFloat(row[5], 64)
		if err != nil {
			log.Fatal(err)
		}
		departure_lng, err := strconv.ParseFloat(row[6], 64)
		if err != nil {
			log.Fatal(err)
		}

		arrival_lat, err := strconv.ParseFloat(row[9], 64)
		if err != nil {
			log.Fatal(err)
		}

		arrival_lng, err := strconv.ParseFloat(row[10], 64)
		if err != nil {
			log.Fatal(err)
		}

		fmt.Println(age, departure_lat, departure_lng, arrival_lat, arrival_lng)

	}
}

 

出力結果

C:\Users\ebata\yamaguchi\src_try1\others> go run main5.go
43 34.173408 131.470684 34.155862 131.501246
24 34.179449 131.482543 34.164116 131.471791
42 34.168739 131.470768 34.160989 131.491124
21 34.169494 131.469934 34.173498 131.471351
58 34.185295 131.47414 34.191481 131.49456
56 34.16536 131.471872 34.174066 131.479312
73 34.155731 131.500845 34.16776 131.472831
47 34.167237 131.471785 34.155775 131.476531
21 34.154931 131.50468 34.156678 131.49581
37 34.16727 131.472899 34.171253 131.471177
40 34.147241 131.474921 34.150675 131.486268
67 34.173683 131.476347 34.173643 131.471027
28 34.183079 131.484303 34.174245 131.474592
46 34.146154 131.472711 34.159611 131.491548
25 34.162497 131.489283 34.147212 131.475984

 

2023,江端さんの忘備録

■自分の魅力や能力を、過去の実績で語っても無駄

- Talking about one's attractiveness and abilities in terms of past achievements is useless.

■自分の魅力や能力をを主張したいのであれば、まさに"今"の、"現在進行形"の自分の仕事や学業で見(魅)せなければならない

- If you want to assert your attractiveness and abilities, you must show them through your work and studies in the "present" and "ongoing" state.

―― と。

以前、私の娘に、自分の過去の経歴をメールで送ってきたおっさん(定年後)のことを思い出していました。

I was reminded of an old man (retired) who once emailed my daughter about his past career.

仕事やら海外赴任や自分の職歴やらの情報が書かれていて ―― この私ですら、その内容に"ドン引き"しました。

It contained information about my job, overseas assignments, his work history, etc. - even I was "taken aback" by the contents.

本件、娘から相談されたので、私が穏便な対応策(個人情報保護に関する事項)を娘にアドバイスして、事なきに至ったようですが。

Since my daughter consulted me on this matter, I advised her on how to deal with the matter (matters related to the protection of personal information) in a calm manner. After that it seemed to be resolved.

シニアの『"昔の武勇伝"ハラスメント』を叩き壊すのに、十分な、脅威(恐怖)だっただろうと思います。

-----

―― 自分のシニアを放置し続けると、どんどん自分を見苦しくすることになる

"If you continue to neglect "your old", you will make yourself look worse and worse"

ということを、私に実感させてくれた事件でした。

This was an matter who made me realize that.

しかし、『シニアになると、ジュニアの頃のパフォーマンス』が発揮できなくなるのは、本当です。

However, it is true that 'as you become a senior, you cannot perform as well as you did as a junior.

ですから、『過去の自分の栄光にすがりつきたい』『他の人に、過去の自分のスゴさを理解して貰いたい』というシニアの気持ちは、よく分かるのです。

Therefore, I understand the senior's desire to 'hang on to his past glory' and 'have others understand how great he was in the past.

-----

その点、私は、コラムなどで『過去の自分の栄光』を語れるフィールドがあって、かなり幸せだなぁ、と思っています。

In that respect, I am quite happy to have a field where I can talk about my 'past glory' in my columns and so on.

故に、今、私は、最大の感謝と忖度(そんたく)を込めて叫びます。

Therefore, I now want to exclaim with the utmost gratitude and condescension.

『EE Times Japan 編集部 万歳 !』

"Long live the editors of EE Times Japan!"

2023,江端さんの忘備録

昨日、留学生の一人から、「名前を日本語(カタカナとひらがな)で表記してくれ」、と頼まれました。

Yesterday, one of the international students asked me to write his name in Japanese (katakana and hiragana).

―― は?

"What?"

と思いましたよ。

I thought it.

外国人なら、自分の名前を外国語表記しても許されるだろう、と思っていました。

I thought that if I were a foreigner, I would be allowed to write my name in a foreign language.

それに、カタカナとひらがな表記の強要は、ちょっと外国の人に失礼ではないかな、と思うのですよ。

Besides, I think that forcing people to write in katakana and hiragana is a bit rude to people from other countries.

-----

ところが、日本の法律では、日本語表記が必須となっているのですよ ―― 例えば「特許法」。

However, Japanese law requires Japanese notation -- for example, "Patent Law".

例えば、特開昭55-043192の発明者は、

For example, the inventors of JP Shou 55-043192 was

『レ-ム・ゲゼルシヤフト・ミツト・ベシユレンクテル・ハフツング』さん

Mr. "Rehm Gesellschaft Mitut Beschurenkutter Haftung".

となっています。

この名前なら、なんとなく「ドイツ人」かな、と思えますし、ドイツ語は、日本語発音がしやすいのいいのですが ――

I think this name sounds somewhat "German," and German is easy to pronounce in Japanese, but--

中東、アフリカ、そして、東南アジア(日本を除く)の国々の人は、そもそも、ローマ字的に表記されていないので、文字から発音を推測することが、全くできないのです。

People in the Middle East, Africa, and Southeast Asia (excluding Japan) cannot guess the pronunciation from the letters because they are not written in the Roman alphabet.

-----

で、私は、文字を読んで日本語変換するのを諦めて、

And I gave up reading the letters and converting them to Japanese, and said

『ゆっくりと名前を発音してみてくれないかな?』

"Would you try to pronounce you name as slowly as you can ?"

といって、その音声を、そのまま、カタカナで書き下してみました。

I wrote down the sound in katakana as it is.

『あのさ、もし書類に記載する必要があるなら、私が、今、ここで書き込むよ?』

'You know what, if you need me to fill out the paperwork, I'll write it right here, right now'

と申し出たのですが、彼は「日本語の勉強にもなるから、自分でやる」と言いました。

I offered to do it, but he said he would do it himself because it would help him learn Japanese.

立派な心掛けだと思います。

I think it is an admirable mindset.

-----

その後、私が彼の日本での名付け親になったような気分になりました。

After that, I felt like I was his godparent in Japan.

2023,江端さんの忘備録

関東に来てから、私、ずっと蕎麦が好きです。

I have always loved soba since I came to Kanto area.

関東の蕎麦は、たいてい美味しいです。

Soba in the Kanto region is usually delicious.

駅に併設されている蕎麦屋(立食いソバ)も、ちゃんと美味しい。

―― 小田急の乗客の多くに愛され続けている「名代 箱根そば」について、熱く語れる女子高校生

The soba restaurant (even if it is a stand-up buckwheat noodle shop) attached to the station is also properly delicious.

-----

昨日、スーパー銭湯のレストランで食した「肉汁つけソバ」が美味しかったので、自分で作って、嫁さんに振る舞ってみました。

Yesterday, I enjoyed the "buckwheat noodles with gravy" that I had at a restaurant in a super public bathhouse, so I cooked it myself and served it to my wife.

参考にしたレシピはこちらです。

Here is the recipe I used as a reference.

『昨日に比べると味が薄い』と感じたので、つけ汁の素材を少しずつ増していきながら、味見をし続けました。

I kept tasting, gradually increasing the amount of ingredients in the dipping sauce, because I felt it was 'less flavorful than yesterday'.

その内、訳が分からなくなってきて、ある時点から味の修正ができなくなってしまいました。

Eventually, I lost the taste, and at some point I couldn't modify the taste.

料理にも「ポイント・オブ・ノーリターン」があります。

Cooking also has a "point of no return".

(脳死判定に使わている用語でしたが、最近は温暖化対策などでも使われているようです)

(The term used to be used for brain death determination, but recently it seems to be used for global warming countermeasures, etc.)

まあ、そこそこ美味しかったですし、嫁さんにも好評だったので、また作ってみようと思います。

Well, it was delicious there, and my wife loved it, so I will cook it again.

-----

今日の話は、次のコラムの前フリに使う予定のネタです。

Today's story is the one I plan to use as a preamble to my next column.

2023,江端さんの忘備録

人生を有意義に生きる方法として「やるべきことではなくて『やらないこと』を決める」という意見を、最近見かけます。

I have recently seen the opinion that one way to live a meaningful life is to decide "what not to do" instead of what to do.

また、「すでに完成しているものを、再度自力で作ること」を『車輪の再発明』という言い方をして、再三、エンジニア(特にソフトウェアエンジニア)に警告がされてきました。

Engineers (especially software engineers) have been warned again and again about "reinventing the wheel," a term that refers to "taking something that has already been completed and making it again on your own.

上記に対して、私の態度は昔から一貫しています。

My attitude toward the above has always been consistent.

―― ふうん

"hmm"

です。

-----

今日、講義で、紙とエンピツを使って、最短経路問題であるダイクストラ法と、修正ラベル法を解いていました。

Today, in lecture, we were solving Dijkstra and modified label methods as the shortest path problem, using paper and an empit.

久々に、その解法の美しさに感動していました。

After a long time, I was impressed by the beauty of the solution.

私は、ダイクストラ法も、ワーシャルフロイド法も、自力でコーディグしていたくらいです。

I had even coded both the Dijkstra and Warchal Floyd methods on my own.

ワーシャル-フロイド法 サンプルプログラム

ですが、このような経路問題アルゴリズムなど、ネットに山ほど落ちていますし、フリーのライブラリも充実しています。

However, there are plenty of such routing problem algorithms and others on the Internet, and there are also extensive free libraries.

GISをDIYで作ろう―PostGISを使い倒す

私のやっていることは、典型的な『車輪の再発明』です ―― だから、これは「無駄」なのでしょう。

What I am doing is typical 'reinventing the wheel' -- so I guess this is 'futile'.

-----

しかし、私は、それらのアルゴリズムを自力でコーディングしていたので、自由に改造ができました。

However, I had coded those algorithms on my own and was free to modify them.

その改造のおかげで、100万人都市の、飛び込み自殺による列車ダイヤの大混乱から収束までの経緯を5分間で計算するアルゴリズムを考案して、査読論文を一本通しました。

Thanks to that modification, I devised an algorithm to calculate how a city of one million people went from train schedule havoc caused by a suicide jump to convergence in five minutes, and got one peer-reviewed paper through.

また、私が、「やるべきことではなくて『やらないこと』を決める」てなことをしてしまったら、私がこれまで続けてきた日記やコラムは、その時点で、「即、終了」となってしまうでしょう。

Also, if I were to decide "what not to do" instead of what I should do, the diaries and columns I have been keeping would be "terminated immediately" at that point.

-----

まあ、私の人生は、無駄が多く、かつ、有意義でもないのでしょう ―― が、それならそれで、私は構いません。

Well, I guess my life is not very meaningful or meaningful -- but that's OK with me.

『本当に、意義のない、無駄な人生を生きてきたなぁ』と、つぶやきながら、私は死んでいくつもりです。

I will die muttering, 'I have truly lived a meaningless and futile life'.

2023,江端さんの技術メモ

公共交通指向型開発(TOD: Transit Oriented Development) - 公共交通機関に基盤を置き、自動車に依存しない社会を目指した都市開発。
「交通隣接型開発」(TAD:‘transit-adjacent development’) 公共交通拠点と隣接して、高密度、大規模開発を行うが、機能上に、互い協調的な開発モードが不足である。

未分類

ちょっと調べてみたところ、使えるみたいです
(いつ入手したのか忘れましたが、倉庫に入っていました)。

2023,江端さんの技術メモ

https://www.marble-lab.com/item_3412.html

を参考にさせていただき、自分用の手順書(マニュアル)を作成。

(Step 1) CSVファイルの作成
1行目に、各列の名前が入っていなければならない。
ファイルはこちら → test_user_list_14.csv

ファイルはこちら → test_user_list_14.csv

(Step 2) Google MAPの立ち上げ

(Step 3) Google MAPの立ち上げ

↓の赤丸をクリック

今は、こっちのインタフェースに、なっているようです。

(Step 4) 「マイプレイス」を選択

(Step 5) 「マイマップ」→「地図を作成」

(Step 6) 「インポート」を選択

(Step 7) ファイル(test_user_list_14.csv)をドラッグ

(Step 8) 緯度、経度を選択

(Step 9) マーカーのタイトルを選択

(Step 10) マーカーの色を変更する(→黒)

(Step 11) マーカーをクリックすると情報が表示される

以上

KeyWord: Google MAP、 マーカー、 アイコン、 csv, エクセル