2023,江端さんの忘備録

本当に一所懸命やっているんだけど、法律で定められている時間内では、仕事の量と質から考えても絶対に間に合わない ――

I am working hard, but I will never make it within the legal time frame, given the quantity and quality of the work I have to do.

これって、誰のせい?

Whose fault is this?

私(の無能)のせい?

Is it my (incompetence) fault?

-----

10年前、30年前、そして、有史以来、人類がずっと問い続けてきたことを、リタイアをスコープに入ってきている今でさえ、自分の問題として、自問していることに腹が立ちます。

I am angry that even now, as I am scoping my retirement, I am asking myself the same question humanity has been asking since ten years ago, 30 years ago, and since the beginning of time, as my problem.

もしかしたら、『人間って、本質的にバカなの?』と思ってしまいます。

Perhaps, 'Are humans inherently stupid?' I think.

太陽にブラックホールが突っ込んでくる日が、明日やって来たとしても、今の私は歓迎します(by さよならジュピター(故小松左京先生))。

Even if the day when a black hole crashes into the sun comes tomorrow, I would welcome it now (by Byebye Jupiter (the late Sakyo Komatsu)).

さよならジュピター

2023,江端さんの忘備録

今日、丸一日かけて苦労して実装したプログラムが

Today, after a full day of hard work, the program that I implemented,

- 予想通りに、動いたのだけど、

- As expected, it worked,

- 予想通りのパフォーマンスを発揮しませんでした。

- It did not perform as expected.

残念ながら、この実装は却下になりました。

Unfortunately, I have had to dismiss the implementation.

時間のない中での、こういう一日は ―― 本当に痛い。

In the absence of time, a day like this really hurts.

2023,江端さんの技術メモ

Go言語で、redisを使って2つの型の異なるデータをブロードキャストしている場合、その受信している部分を1つのswitchで受けとるにはどうしたら良いですか

を、異なるエージェントで、異なるメッセージを受信できるか試してみた件。

 

// C:\Users\ebata\tomioka3B\src\others\main28.go
// 2つのクロック(goroutine)を用意して、異なるエージェントで受けとれるかどうかの実験

package main

import (
	"encoding/json"
	"fmt"
	"sync"
	"time"

	"github.com/gomodule/redigo/redis"
)


type Clock_Info struct {
	VirtualTime time.Time
	RealTime    time.Time
}

type SubClockInfo_2 struct {
    // 異なるデータ型のフィールドをここに追加
    SomeField string
    AnotherField int
}

func BaseClock() {

	// 接続
	conn, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	// スタート時刻を指定
	startTime := time.Date(2023, 10, 1, 7, 0, 0, 0, time.UTC)

	// 1秒値を保持する変数
	seconds := 0

	var ci Clock_Info

	// ループを開始
	for {
		// 現在の時刻を計算
		ci.VirtualTime = startTime.Add(time.Duration(seconds) * time.Second)
		ci.RealTime = time.Now()

		// 現在の時刻を表示
		// fmt.Println("シミュレータの時刻:", ci.VirtualTime.Format("2006/01/02 15:04:05"))
		// fmt.Println("現在の時刻:", ci.RealTime.Format("2006/01/02 15:04:05")) // "2006/01/02 15:04:05"はフォーマットの形を真似るもので、内容に意味なし

		// パブリッシュ
		json_ci, _ := json.Marshal(ci)
		r, err := redis.Int(conn.Do("PUBLISH", "ClockInfo_1", json_ci))
		if err != nil {
			panic(err)
		}
		fmt.Println(r)

		// 5秒待つ (実際は、0.05秒くらいだが、確認用に長くしている)
		time.Sleep(5000 * time.Millisecond)

		// 1秒値を増加させる
		seconds++
	}
}


func SubClock() {  // 実験用に追加(時間ではなく、単なる文字列と数値を送り込むだけ)

	// 接続
	conn, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		panic(err)
	}
	defer conn.Close()


	// 1秒値を保持する変数
	seconds := 0

	var sci2 SubClockInfo_2

	// ループを開始
	for {
		// 現在の時刻を計算
		sci2.SomeField = "ebata is great"
    	sci2.AnotherField = seconds

		// パブリッシュ
		json_sci2, _ := json.Marshal(sci2)
		r, err := redis.Int(conn.Do("PUBLISH", "SubClockInfo_2", json_sci2))
		if err != nil {
			panic(err)
		}
		fmt.Println(r)

		// 7秒待つ (実際は、0.05秒くらいだが、確認用に長くしている)
		time.Sleep(7000 * time.Millisecond)

		// 1秒値を増加させる
		seconds += 1 
	}
}



func person_1(person_num int, wg *sync.WaitGroup) {
	defer wg.Done()
	// 接続
	conn, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		panic(err)

	}
	defer conn.Close()

	psc := redis.PubSubConn{Conn: conn}
	psc.Subscribe("ClockInfo_1") // 2つに増やした

	for {	
		switch v := psc.Receive().(type) { // redisのメッセージを受けとると、ここでロックが外れる

		case redis.Message:

			switch v.Channel{

			case "ClockInfo_1":  // ブロードキャスト"ClockInfo_1"のメッセージは、こっちでキャッチ
				ci := new(Clock_Info) 
        		_ = json.Unmarshal(v.Data, &ci)
        		fmt.Println("Person_1:", person_num, "VirtualTime (ClockInfo_1):", ci.VirtualTime)

			case "SubClockInfo_2": // ブロードキャスト"SubClockInfo_2"のメッセージは、こっちでキャッチ
        		subClockData := new(SubClockInfo_2)
        		_ = json.Unmarshal(v.Data, &subClockData)
        		fmt.Println("Person_1:", person_num, "SomeField (SubClockInfo_2):", subClockData.SomeField)
         		fmt.Println("Person_1:", person_num, "AnotherField (SubClockInfo_2):", subClockData.AnotherField)


    	}
		
		case redis.Subscription:
			fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)

		case error:
			return
		}
	}

}

func person_2(person_num int, wg *sync.WaitGroup) {
	defer wg.Done()
	// 接続
	conn, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		panic(err)

	}
	defer conn.Close()

	psc := redis.PubSubConn{Conn: conn}
	psc.Subscribe("SubClockInfo_2") // 2つに増やした

	for {	
		switch v := psc.Receive().(type) { // redisのメッセージを受けとると、ここでロックが外れる

		case redis.Message:

			switch v.Channel{


			case "ClockInfo_1":  // ブロードキャスト"ClockInfo_1"のメッセージは、こっちでキャッチ
				ci := new(Clock_Info) 
        		_ = json.Unmarshal(v.Data, &ci)
        		fmt.Println("Person_2:", person_num, "VirtualTime (ClockInfo_1):", ci.VirtualTime)

			case "SubClockInfo_2": // ブロードキャスト"SubClockInfo_2"のメッセージは、こっちでキャッチ
        		subClockData := new(SubClockInfo_2)
        		_ = json.Unmarshal(v.Data, &subClockData)
        		fmt.Println("Person_2:", person_num, "SomeField (SubClockInfo_2):", subClockData.SomeField)
         		fmt.Println("Person_2:", person_num, "AnotherField (SubClockInfo_2):", subClockData.AnotherField)
    	}
		
		case redis.Subscription:
			fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)

		case error:
			return
		}
	}

}


func main() {

	wg := sync.WaitGroup{}

	//wg.Add(1)
	//go BaseClock(&wg)
	go BaseClock()
	go SubClock()

	for i := 0; i < 5; i++ { // 5人
		wg.Add(1)
		go person_1(i, &wg)
	}

	for i := 0; i < 5; i++ { // 5人
		wg.Add(1)
		go person_2(i, &wg)
	}


	wg.Wait()
	fmt.Println("end of ... main()")
}

ちゃんと動くみたいです。

2023,江端さんの技術メモ

"SubClockInfo_2" チャンネルから受信したデータを処理するために、新しい構造体を定義します。異なるデータ型に合わせて構造体を定義し、Unmarshal でデータを解析します。

"SubClockInfo_2" チャンネルからのメッセージを受け取るために、person 関数内の switch ステートメントを更新します。具体的には、"SubClockInfo_2" チャンネルのデータ型に合わせて処理を分岐させます。

このようにすることで、"SubClockInfo_2" チャンネルから異なる型のデータを受信し、それに応じた処理を行うことができます。異なるデータ型ごとに適切な構造体を用意し、Unmarshal でデータを解析しましょう。

// C:\Users\ebata\tomioka3B\src\others\main27.go
// 2つのクロック(goroutine)を用意して、一つのswitchで受けとれるかどうかの実験

package main

import (
	"encoding/json"
	"fmt"
	"sync"
	"time"

	"github.com/gomodule/redigo/redis"
)


type Clock_Info struct {
	VirtualTime time.Time
	RealTime    time.Time
}

type SubClockInfo_2 struct {
    // 異なるデータ型のフィールドをここに追加
    SomeField string
    AnotherField int
}

func BaseClock() {

	// 接続
	conn, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	// スタート時刻を指定
	startTime := time.Date(2023, 10, 1, 7, 0, 0, 0, time.UTC)

	// 1秒値を保持する変数
	seconds := 0

	var ci Clock_Info

	// ループを開始
	for {
		// 現在の時刻を計算
		ci.VirtualTime = startTime.Add(time.Duration(seconds) * time.Second)
		ci.RealTime = time.Now()

		// 現在の時刻を表示
		// fmt.Println("シミュレータの時刻:", ci.VirtualTime.Format("2006/01/02 15:04:05"))
		// fmt.Println("現在の時刻:", ci.RealTime.Format("2006/01/02 15:04:05")) // "2006/01/02 15:04:05"はフォーマットの形を真似るもので、内容に意味なし

		// パブリッシュ
		json_ci, _ := json.Marshal(ci)
		r, err := redis.Int(conn.Do("PUBLISH", "ClockInfo_1", json_ci))
		if err != nil {
			panic(err)
		}
		fmt.Println(r)

		// 5秒待つ (実際は、0.05秒くらいだが、確認用に長くしている)
		time.Sleep(5000 * time.Millisecond)

		// 1秒値を増加させる
		seconds++
	}
}


func SubClock() {  // 実験用に追加(時間ではなく、単なる文字列と数値を送り込むだけ)

	// 接続
	conn, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		panic(err)
	}
	defer conn.Close()


	// 1秒値を保持する変数
	seconds := 0

	var sci2 SubClockInfo_2

	// ループを開始
	for {
		// 現在の時刻を計算
		sci2.SomeField = "ebata is great"
    	sci2.AnotherField = seconds

		// パブリッシュ
		json_sci2, _ := json.Marshal(sci2)
		r, err := redis.Int(conn.Do("PUBLISH", "SubClockInfo_2", json_sci2))
		if err != nil {
			panic(err)
		}
		fmt.Println(r)

		// 7秒待つ (実際は、0.05秒くらいだが、確認用に長くしている)
		time.Sleep(7000 * time.Millisecond)

		// 1秒値を増加させる
		seconds += 1 
	}
}




func person(person_num int, wg *sync.WaitGroup) {
	defer wg.Done()
	// 接続
	conn, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	psc := redis.PubSubConn{Conn: conn}
	psc.Subscribe("ClockInfo_1", "SubClockInfo_2") // 2つに増やした

	for {	
		switch v := psc.Receive().(type) { // redisのメッセージを受けとると、ここでロックが外れる

		case redis.Message:

			switch v.Channel{

			case "ClockInfo_1":  // ブロードキャスト"ClockInfo_1"のメッセージは、こっちでキャッチ
				ci := new(Clock_Info) 
        		_ = json.Unmarshal(v.Data, &ci)
        		fmt.Println("Person:", person_num, "VirtualTime (ClockInfo_1):", ci.VirtualTime)

			case "SubClockInfo_2": // ブロードキャスト"SubClockInfo_2"のメッセージは、こっちでキャッチ
        		subClockData := new(SubClockInfo_2)
        		_ = json.Unmarshal(v.Data, &subClockData)
        		fmt.Println("Person:", person_num, "SomeField (SubClockInfo_2):", subClockData.SomeField)
         		fmt.Println("Person:", person_num, "AnotherField (SubClockInfo_2):", subClockData.AnotherField)
    	}
		
		case redis.Subscription:
			fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)

		case error:
			return
		}
	}

	/*
	for {
		ci := new(Clock_Info)
		switch v := psc.Receive().(type) {
		case redis.Message:
			_ = json.Unmarshal(v.Data, &ci)
			fmt.Println("Person:", person_num, "VirtualTime:", ci.VirtualTime)
			//fmt.Println("Person:", person_num, "RealTime:", ci.RealTime)

		case redis.Subscription:
			fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)

		case error:
			return
		}
	}
	*/

}

func main() {

	wg := sync.WaitGroup{}

	//wg.Add(1)
	//go BaseClock(&wg)
	go BaseClock()
	go SubClock()

	for i := 0; i < 5; i++ { // 5人
		wg.Add(1)
		go person(i, &wg)
	}

	wg.Wait()
	fmt.Println("end of ... main()")
}

出力結果はこんな感じになり、期待した通りの動きをしているようです。

Person: 1 VirtualTime (ClockInfo_1): 2023-10-01 07:00:03 +0000 UTC
Person: 3 VirtualTime (ClockInfo_1): 2023-10-01 07:00:03 +0000 UTC
Person: 0 VirtualTime (ClockInfo_1): 2023-10-01 07:00:03 +0000 UTC
Person: 4 VirtualTime (ClockInfo_1): 2023-10-01 07:00:03 +0000 UTC
Person: 2 VirtualTime (ClockInfo_1): 2023-10-01 07:00:03 +0000 UTC
5
Person: 1 VirtualTime (ClockInfo_1): 2023-10-01 07:00:04 +0000 UTC
Person: 0 VirtualTime (ClockInfo_1): 2023-10-01 07:00:04 +0000 UTC
Person: 3 VirtualTime (ClockInfo_1): 2023-10-01 07:00:04 +0000 UTC
Person: 2 VirtualTime (ClockInfo_1): 2023-10-01 07:00:04 +0000 UTC
Person: 4 VirtualTime (ClockInfo_1): 2023-10-01 07:00:04 +0000 UTC
5
Person: 3 SomeField (SubClockInfo_2): ebata is great
Person: 3 AnotherField (SubClockInfo_2): 3
Person: 0 SomeField (SubClockInfo_2): ebata is great
Person: 0 AnotherField (SubClockInfo_2): 3
Person: 1 SomeField (SubClockInfo_2): ebata is great
Person: 1 AnotherField (SubClockInfo_2): 3
Person: 4 SomeField (SubClockInfo_2): ebata is great
Person: 4 AnotherField (SubClockInfo_2): 3
Person: 2 SomeField (SubClockInfo_2): ebata is great
Person: 2 AnotherField (SubClockInfo_2): 3
5
Person: 3 VirtualTime (ClockInfo_1): 2023-10-01 07:00:05 +0000 UTC
Person: 4 VirtualTime (ClockInfo_1): 2023-10-01 07:00:05 +0000 UTC
Person: 1 VirtualTime (ClockInfo_1): 2023-10-01 07:00:05 +0000 UTC
Person: 0 VirtualTime (ClockInfo_1): 2023-10-01 07:00:05 +0000 UTC
Person: 2 VirtualTime (ClockInfo_1): 2023-10-01 07:00:05 +0000 UTC
5
Person: 3 SomeField (SubClockInfo_2): ebata is great
Person: 3 AnotherField (SubClockInfo_2): 4
Person: 0 SomeField (SubClockInfo_2): ebata is great
Person: 4 SomeField (SubClockInfo_2): ebata is great
Person: 4 AnotherField (SubClockInfo_2): 4
Person: 1 SomeField (SubClockInfo_2): ebata is great
Person: 1 AnotherField (SubClockInfo_2): 4
Person: 0 AnotherField (SubClockInfo_2): 4
Person: 2 SomeField (SubClockInfo_2): ebata is great
Person: 2 AnotherField (SubClockInfo_2): 4
5

以上

2023,江端さんの忘備録

今年、大リーグで、日本人選手がホームラン王を獲得したことで、嫁さんがとても喜んでいます。

This year, a Japanese player won the home run king in the big leagues, which made my wife very happy.

嫁さんが喜んでいるのを見ると、私は幸せな気分になるので、私も一緒に喜んでいます。

Seeing my wife happy makes me happy, so I come to be pleased with her.

それに、日本や世界の人を幸せにしたことは、とても素晴しいことだと思っています。

Besides, I think it is wonderful that I have made people in Japan and worldwide happy.

子どもたちが、このようなヒーロに憧れを持つことも、大変良いことだと思っています。

I believe that it is also very good for children to have this kind of admiration for heroes.

本当です。

It is true.

-----

ただ、私は、自分の子どもであれば、

However, for my children,

こちらのアニメ(グラゼニ)も見せたい

I want to show them this anime (Grazeni) as well.

です。

今、YouTubeで無料配信しています。

The anime is now available for free on YouTube.

私は、子どもには、夢と現実のバランス感覚も持っていてもらいたいと思うのです。

I want my children to have a sense of balance between dreams and reality.

アイドルや芸人として喰っていける確率については、こちらのページとその次のページをご参照下さい。

For more information on the probability of making a living as an idol or comedian, please see this page and the following pages.

「夢」とは、結構な頻度で人生を潰しかねない「毒」にもなります。

"Dreams" can also be "poison" that can often destroy their lives.

そして、その現実を子どもに伝えるのは、大人の責務です。

And it is the responsibility of adults to communicate this reality to children.

『なぜ、本人の年齢や体力を配慮しない、ランナーの体を壊すようなことを"前提"とした走行計画を立案し、それを強行し、それを放映するのか』

2023,江端さんの忘備録

今も、抑うつに関して、調べ続けています。

I am continuing to research depression.

(1)他人の目を気にしない ―― しかし、そもそも、私、他人の目は気にしない方です。

(1) I don't care what other people think -- but to begin with, I don't care what others think.

(2)ジコチューになる ―― しかし、私は、文句なしの自己中心的な人間であると、他人から言われ、その自覚もあります。

(2) Self-centered -- However, others have told me that I am unquestionably self-centered and aware of it.

その他、運動をする、旅行にでる、ゆっくり休むなど、色々紹介されていますが、私については上手く行っていません。

Other things mentioned, such as exercise, travel, rest, etc., have not worked for me.

-----

ただ、私に関しては、

However, as for me, I feel that

■他人からの評価を気にする

"I care what others think of me."

というのは、当っている気がします。

is true.

無茶な量の仕事が来ている時でも、そうでない時でも、私は、精一杯やります ―― 私は、手の抜き方が下手です。

I do the best I can, even when an absurd amount of work is coming in, and even when it's not -- I'm not good at cutting corners.

しかし、無茶な量の仕事がきている時には、当然、その仕事のパフォーマンスが落ちます。

However, when an absurd amount of work is coming in, the performance of that work will naturally suffer.

パフォーマンスが落ちれば、仕事のアウトプットは質も量も悪くなります。

If performance declines, work output will be poor in quality and quantity.

となれば、他人から、江端は「無能」で「サボっている」と思われているかもしれません。

If this is the case, others may think Ebata is "incompetent" and "slacking off."

-----

しかし、私は、他人から『「無能」とか「サボっている」と思われているかもしれない』ことには、耐えられないのです。

However, I wouldn't say I like that others might think I am incompetent or slacking off.

特に、大嫌いな奴に関しては、

Especially when it comes to people I hate, I come to think that

『あいつにバカにされることだけは、どうしても我慢できない』

"I just can't stand it when he makes fun of me."

という気持ちになります。

-----

しかし、良く考えてみれば、この話は、上記(1)の「他人の目を気にしない」に含まれているような気がします。

However, on second thought, I think this story is included in (1) above, "not worrying about what others think."

そして、これは、私に外界の認識の誤認に基づいているような気がします。

And this seems to be based on a misperception of the external world.

間違いなく、肥大した自我による"被害妄想"です。

It is definitely "paranoia" caused by a bloated ego.

なぜなら、私を含め、私たちは、他人のことなんか、かなり「どーでもいい」はずですから。

Because we, including myself, should pretty much "not give a shit" about other people.

-----

上記から考えるに、私が乗り越えなければならない課題は、

From the above, the challenges I have to overcome are,

■自分が、他人から"無能"と思われる(かもしれない)ことを、気にしないこと

- Do not worry about what others think of me as "incompetent."

であり、さらに言えば、

and furthermore,

■自分は"無能"でいいし、そう評価されても構わない、と思えるようになること

- Come to think that it is okay to be "incompetent" and that it is okay to be evaluated as such.

かもしれない、と考え始めています。

I am beginning to believe that it might be.

-----

まあ、実際のところ、ここ十数年コラムを書き続けてきて、『自分の知らないことが、世の中には恐しい程ある』というということを、思い知っています。

After writing columns for over a decade, I have realized that "there is a frightening amount of things in the world that I don't know.

小さなこと一つのことを学ぶのに、膨大な量の本を読み、計算をし、考察をし、ロジックを組み立てなければならない、という事実に驚き続けてきました。

I have been continually amazed that to learn one small thing, one has to read vast amounts of books, do calculations considerations, and construct logic.

これらを鑑みるに、上記の考えを、さらにもう一歩進めて、

In light of the above, I think I should take the above picture one step further and raise our awareness to the level of

■人間は、誰もが"無能"であるので、誰もが他人に期待をしてはならない

"Everyone is "incompetent," so no one should expect anything from others.

というベレルまで、意識を高めるべきなのだろうな、と思っています。

-----

とまあ、ここまで論じた上で、以下のようにまとめるのも、どうかとも思うのですが、

And, well, after discussing this so far, I'm not sure if I can summarize it as follows,

結局のところ、私は

After all, the root of this problem lies in the fact that I can't get away from the thought,

『嫌いなヤツは、何をどうしようとも、嫌いである』

"I don't come to like someone I don't like."

という思考から離れられないところに、この問題の諸元があるんだろうなぁ、と思っています。

-----

一体、江端は何をしているんだ? と思われているかもしれません。

You may be thinking, "What in the world is Ebata doing?

実は、これ、抑うつの対応方の一つである「言語化」という作業の一つです。

This is one of the ways to deal with depression, a process called "verbalization."

『ITニグレクト』

2023,江端さんの忘備録

劣化した無線通信環境を作って実験する必要があったのですが、この「劣化した無線通信環境」というのが、なかなかに難しいのです。

It was necessary to experiment by creating a degraded wireless communication environment. However, this "degraded wireless communication environment" is quite tricky.

TCとかを使って、ちゃっちゃとやってしまえば簡単だと思うのですが、『自然な環境(?)』というのを試してみたいという意見もあり、今、ドタバタとやっています。

I think it would be easy to do it quickly using a TC, but some want to try a "natural environment(?)," and we are in the doldrums.

ジャンク箱に入っていたラズパイ3Bを引っ張り出して、速攻でネットワークエミュレータ(TC)を作ってみた件

終端装置を近い位置に置くと通信品質に差が出てこないし、遠い位置に置くと通信測定ソフト(iPerf3)が動かない。

If the terminating devices are close together, there is no difference in communication quality; if they are far apart, the communication measurement software (iPerf3) does not work.

色々試した結果、ベットマットレスや布団をを障害物につかうと、ギリギリ測定可能なレベルまで通信品質を落すことができることが分かりました。

After various trials, we found that using a bed mattress or futon as an obstacle could reduce the quality of communication to just barely measurable levels.

-----

ちなみに、アルミ箔やら、金属の箱を使って、通信中継装置や終端装置を包んだ実験では、

Incidentally, in an experiment using aluminum foil and metal boxes to wrap communication repeaters and terminating equipment,

―― 通信レベルが"改善"してしまいました

the communication level was "improved."

正直、頭を抱えました。

Frankly, I had my head in the sand.

-----

エンジニアではない多くの皆さんは、企業の実験は、潤沢な資金のある高度な装置を使ったテストをしていると思われているかもしれませんが ――

Many of you who are not engineers may think corporate testing is done with well-funded, sophisticated equipment, but

現場のテストのリアルなんて、こんなもんです。

the reality of field testing is like this.

2023,江端さんの技術メモ

[サーバ側] Windows10
https://iperf.fr/iperf-download.php#windows からダウンロード
インストールとかではなくて、バイナリが直接解凍される

[クライアント側] Ubuntu22.04
$ sudo apt install iperf3

使い方
[サーバ側] iperf3.exe -s
[クライアント側]iperf3.exe -c 192.168.11.167(サーバのIPアドレス等)


構成1

サーバ側の表示はこんな感じでした。

C:\Users\maoeb\iperf-3.1.3-win64>iperf3.exe -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 192.168.11.125, port 33940
[  5] local 192.168.11.167 port 5201 connected to 192.168.11.125 port 33946
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec  8.85 MBytes  74.2 Mbits/sec
[  5]   1.00-2.00   sec  5.86 MBytes  49.0 Mbits/sec
[  5]   2.00-3.00   sec  4.79 MBytes  40.2 Mbits/sec
[  5]   3.00-4.01   sec  5.13 MBytes  42.9 Mbits/sec
[  5]   4.01-5.00   sec  5.10 MBytes  42.8 Mbits/sec
[  5]   5.00-6.00   sec  8.65 MBytes  72.8 Mbits/sec
[  5]   6.00-7.01   sec  5.84 MBytes  48.7 Mbits/sec
[  5]   7.01-8.00   sec  5.06 MBytes  42.6 Mbits/sec
[  5]   8.00-9.01   sec  5.25 MBytes  43.9 Mbits/sec
[  5]   9.01-10.00  sec  8.37 MBytes  70.6 Mbits/sec
[  5]  10.00-10.02  sec   194 KBytes  84.6 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-10.02  sec  0.00 Bytes  0.00 bits/sec                  sender
[  5]   0.00-10.02  sec  63.1 MBytes  52.8 Mbits/sec                  receiver

構成2

C:\Users\maoeb\iperf-3.1.3-win64>iperf3.exe -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 192.168.1.15, port 39780
[  5] local 192.168.1.8 port 5201 connected to 192.168.1.15 port 39784
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec  11.2 MBytes  94.2 Mbits/sec
[  5]   1.00-2.00   sec  10.9 MBytes  91.2 Mbits/sec
[  5]   2.00-3.00   sec  11.3 MBytes  94.9 Mbits/sec
[  5]   3.00-4.00   sec  11.3 MBytes  94.9 Mbits/sec
[  5]   4.00-5.00   sec  11.3 MBytes  94.9 Mbits/sec
[  5]   5.00-6.00   sec  11.3 MBytes  94.9 Mbits/sec
[  5]   6.00-7.00   sec  11.3 MBytes  94.9 Mbits/sec
[  5]   7.00-8.00   sec  11.3 MBytes  94.8 Mbits/sec
[  5]   8.00-9.00   sec  11.3 MBytes  94.9 Mbits/sec
[  5]   9.00-10.00  sec  11.3 MBytes  94.9 Mbits/sec
[  5]  10.00-10.01  sec  85.5 KBytes  89.1 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-10.01  sec  0.00 Bytes  0.00 bits/sec                  sender
[  5]   0.00-10.01  sec   113 MBytes  94.5 Mbits/sec                  receiver

構成3

劣化通信環境を使う上での工夫

-----------------------------------------------------------
Accepted connection from 192.168.11.125, port 39260
[  5] local 192.168.11.167 port 5201 connected to 192.168.11.125 port 39270
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.01   sec  4.23 MBytes  35.0 Mbits/sec
[  5]   1.01-2.01   sec  3.69 MBytes  31.2 Mbits/sec
[  5]   2.01-3.00   sec  4.46 MBytes  37.4 Mbits/sec
[  5]   3.00-4.00   sec  4.41 MBytes  37.1 Mbits/sec
[  5]   4.00-5.00   sec  3.74 MBytes  31.4 Mbits/sec
[  5]   5.00-6.00   sec  4.13 MBytes  34.5 Mbits/sec
[  5]   6.00-7.00   sec  4.39 MBytes  36.9 Mbits/sec
[  5]   7.00-8.01   sec  4.14 MBytes  34.5 Mbits/sec
[  5]   8.01-9.00   sec  4.23 MBytes  35.7 Mbits/sec
[  5]   9.00-10.00  sec  5.12 MBytes  42.9 Mbits/sec
[  5]  10.00-10.02  sec   153 KBytes  74.3 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-10.02  sec  0.00 Bytes  0.00 bits/sec                  sender
[  5]   0.00-10.02  sec  42.7 MBytes  35.7 Mbits/sec                  receiver


安定した、劣化環境を作るのは、これで、なかなか難しい。

2023,江端さんの忘備録

私、プロ野球の仕組みについては、全く知らないと言っても過言ではありません。

I am not exaggerating when I know nothing about how professional baseball works.

ドラフト会議というものが、『巨人一強』という弊害から作られた、という話を聞いたことがあるくらいです。

I have heard that the draft conference was created out of the evils of the "Giants' monopoly."

なんでも、読売ジャイアンツが1965年(昭和40年)から1973年(昭和48年)まで、9年間連続してプロ野球日本シリーズを制覇していたそうです。

The Yomiuri Giants won the Japan Series of professional baseball for nine consecutive years, from 1965 to 1973.

で、私は、小学生の頃、巨人ファンの友だちに、『読売ジャイアンツがいかに強かったか』という話を、うんざりするほど聞かされました。

So, when I was in elementary school, my friends who were Giants fans told me stories about how strong the Yomiuri Giants were to the point that I was sick and tired of hearing them.

「選手が『監督。今日はどうしますか?』と尋ねると、巨人の監督が『うん。今日は勝て』と言った」

"When The players asked the Director, 'Director, what do you want to do today?' he said, 'Win today's game.'"

と、自慢気に語ってきました。

He bragged about it.

ただ、この話、現時点で裏が取れていません。ただ、私は、この話を、複数の人間から聞いたような気がします。

I have not been able to corroborate this story at this time. However, I think I have heard this story from more than one person.

-----

当時の私は、子ども心に『こんな醜悪は話は聞いたことがない』と、思いました。

At the time, I thought to myself as a child, 'I have never heard such an ugly story.'

当時の読売ジャイアンツが、その財力と人気によって、優秀な選手を集めて、プロ野球とゲームを一方的に支配していた、ということだからです。

This means that the Yomiuri Giants at that time attracted the best players and unilaterally dominated professional baseball through their financial power and popularity.

―― なんで、彼(友だち)はこんな話で、自慢ができるんだ? むしろ"醜聞"として隠すべきストーリだろう?

"How can he (my friend) brag about such a story? Isn't it instead an "ugly story" that should be hidden ?"

と、思ったものです。

I thought.

大相撲の八百長試合と同じことです。

This was the same story as the fixed Sumo game.

(こちらは論文)

(This is a paper)

-----

という訳で、この話("今日は勝て")は「架空の話が、勝手に一人歩きした」ものなのかもしれません。

So this story ("Win the today's game") may be a "fictional story that has taken on a life of its own."

どなたか、裏取りの済みの真偽をご存知の方は、御一報下さい。

If anyone knows the truth with evidence, please let us know.

―― あいつら、馬鹿

 

2023,江端さんの忘備録

ほうれんそうは、美味しいです。

Spinach is delicious.

私の昼食のハムエッグには欠かせない食材ですが ―― 最近、値段が高いです。

It's an essential ingredient in my lunch of ham and eggs -- but it's been pricey lately.

『一束400円は出せないなぁ』と、最近は、その隣りにある「小松菜(こまつな)」を手に取ってしまいます。

"I can't pay 400 yen for a bunch of Komatsuna," I say, picking up the komatsuna beside it.

小松菜の値段は、ざっくりほうれんそうの半額なのですが、どうしても味は、ほうれんそうには及びません。

Komatsuna is roughly half the price of spinach, but its taste is not as good.

ですので、小松菜の方は、1cm単位に切ってソテーして、味を曖昧にするようにしています。

So, for the komatsuna, I cut it into 1 cm pieces and saute it to obscure the flavor.

-----

―― 卵1個、ハム1枚、えのき、ほうれんそう、または、小松菜と、砕いた唐辛子1個でソテーしたハムエッグと、トースト1枚

"One egg, one slice of ham, enoki mushrooms, spinach, or komatsuna greens sauteed with one crushed red pepper and one slice of toast."

これが、私の、朝昼兼用の食事です。

This is my breakfast and lunch.

まあ、これくらいに抑えないと、在宅勤務で体重を維持し続けるのは難しいです。

I have to keep it down to this level while working from home to keep my weight down.

-----

ちなみに、メンタル不調になれば、この昼食すら抜いても大丈夫です。

By the way, if you have a mental breakdown, you can skip even this lunch.

いや、『大丈夫』ではないのですが。

No, this is not "okay".

ここ2~3日は、食事を取ることすら、面倒です。