2021/11,江端さんの忘備録

(昨日の続きです)

(Continuation from yesterday)

■国民のマイナンバーカードの取得率が低いのは、政府がメリットを提示できていないからです。

マイナンバーカードと運転免許証と保険証の統合をする程度のことに、何年かかっとるんだ? と思いますし、そこに、クレジットカードとSUICAも、機能アドインするくらいのことができんのかなぁ、と思っています。

The reason why people are not getting their own My Number cards is because the government has not been able to present the benefits. How many years is it going to take to integrate my number card with my driver's license and insurance card? I also wonder if it would be possible to add credit card and SUICA functions to the cards.

■私は、コロナ禍においてもリモートワークが進まなかった会社は、基本的に、社長一人が(×罰社員)がIT音痴である、ということを知っています。

社長は「できない」のではなく「やらない」ということも知っています。

社長が仕事のやり方を替えないのは「面倒くさい」からです。

I know that in companies where remote work was not promoted even during the Corona disaster, the president alone (not the employees) is basically IT illiterate. I know that it's not that the president "can't" do it, but that he "won't" do it. The reason why the president doesn't change the way he works is because it's too much trouble.

■IT統合が死ぬほど難しいことを、私は良く知っています。

ですから、私がシステムを作る時には、基本的にはスクラッチから作り直すことにします。

しかし、これは、私のシステムが、実験目的であり、組織的構造や社内政治圧力と無関係で作れる、という気楽さがあるからであることも分かっています。

I know very well that IT integration is deathly difficult, so when I build a system, I basically rebuild it from scratch. However I also know that this is because my systems are experimental, and I am comfortable building them independently of organizational structure and internal political pressure.

■それでも、銀行システムが2021年だけで6回停止するというのは、『異常事態』である、ということは分かります。

電子政府とか、官民連携とかを、本気で実現したいのであれば、システム開発部隊の長に、社長、あるいは、内閣総理大臣ですら口を出せない程度と、協力な権限を与えなければ不可能であることは、私には「手に取るように分かる」のです。

The fact that the banking system will be shut down six times in 2021 alone is an extraordinary situation. If you really want to realize e-government or public-private partnership, you have to give the head of the system development unit a degree of authority and cooperation that even the president or the prime minister cannot interfere with.

■権力のあるITオンチが、システム開発の最大のガン、であることは、私にだって分かります。

だって、どうせ、やつら『何だか分からんが、とにかく動かせ!止めるな! 予算を越えるな!!』って叫んでいるだけでしょう?

なんでそんなこと分かるかって?

そりゃ、あの政治家たちのITオンチぶりを見ていれば、分かりますよ。

I know that IT illiterates with power are the biggest cancer in system development. Because, anyway, they're like, "I don't know what it is, but just move it! Don't stop! Don't exceed the budget!" How do I know that? Well, you only have to look at how IT-illiterate those politicians are.

以上

That's all.

2021/11,江端さんの忘備録

11月号のコラムの原稿(月末リリースの予定)を見直ししていて、『冗長だな』と思い、やむなく削除したフレーズを、ここに、残しておきます。

I was reviewing the draft of my column for the November issue (to be released at the end of the month), and I thought it was redundant, so I had to delete some phrases.

■国内でTOEIC信仰に狂っているだけで、海外に出ていこうとれず、海外の人材を使いこなる器量もない私たちヘタレ日本人のことは、こちら(*)に山ほど書きました。

I've written a lot about those of us Japanese who are just crazy about the TOEIC in Japan, but don't want to go abroad and don't have the ability to use foreign talent

■今回の調査で、ようやく日本で始まった子どものIT教育が、イギリスや米国に20年近くビハインドであることを知って、ショックを受けましたし、日本のITのR&Dの予算のショボさに愕然としたりしました(*)

In this survey, I was shocked to learn that children's IT education, which has finally started in Japan, is almost 20 years behind that of the UK and the US, and I was also shocked at the small budget for IT R&D in Japan (*).

■日本人のノーベル受賞者って、ほとんど日本の大学に在籍していないんだけど、これで『日本の誇り』なんて言えるのかな、と思っています。

Most of the Japanese Nobel laureates have not been enrolled in Japanese universities, and I wonder how they can be called "proud of Japan".

■私の同僚で起業した奴は何人かいたけど(全員、不快な奴だったけど、確かに優秀ではあった)、その後、名前を聞いたことがないんだが、ちゃんと我が国は彼らを支援していたのだろうか、と今でも疑問です。

There were a few of my colleagues who started their own businesses (they were all unpleasant, but certainly brilliant), but I haven't heard their names since, and I still wonder if our country was supporting them properly.

■日本の企業でGAFAのようになれる可能性があったのは、NTTドコモの"i-mode"くらいだったような気がするんだけどなぁ、と思い返しています。

I think the only Japanese company that had the potential to be like GAFA was NTT Docomo's "i-mode".

■若い研究員の考える新しいネットサービスが、『市場規模と費用対効果の試算を出せ』という幹部の一言によって潰され、彼らが、エクセルの計算に疲れ張てて、士気を失なっていくのを、私は何度も見ました。

Many times I have seen young researchers' ideas for new Internet services crushed by a single word from a senior executive: "Give me an estimate of the market size and cost-effectiveness," and I have seen them become demoralized, exhausted by Excel calculations.

(続く)

2021/11,江端さんの忘備録

今週末は、原稿締切前の修羅場週なので、私の机の上の写真で勘弁して下さい。

This weekend is the week before my manuscript deadline, so please excuse the disclosure of the photo on my desk.

2021/11,江端さんの忘備録

『アンガーコントロール』というのは、私には難しい ―― という話は、これまでに何度もしてきました。

I've often said that "anger control" is difficult for me.

『怒りが発生したら、6秒待て』と良く書かれていますが、私の怒りは、その程度のライフタイムではありません。

It is often said, "When anger arises, wait six seconds," but my anger does not have that kind of lifetime.

私の場合、6日、60日は、怒りが軽く維持しますし、へたすると6年間以上、維持し続けることがあります。

In my case, my anger stays light for six or sixty days, and sometimes for six years or more.

私は、一瞬で「カーッ」となるような怒りは少ないです。

I have very little anger that can boil over in an instant.

ネチっこくて、ダラダラと長く、かつ、自分のロジックで、怒りを連鎖反応させて、臨界に達するような、たちの悪い怒り方をします。

In my case, I have a nasty anger that is persistent, lingering and long, and using my own logic, I can set off a chain reaction of anger that reaches critical mass.

まあ、はっきり言って、『私って、かなり最低』という自覚はあります。

Well, to put it bluntly, I'm aware that 'I'm pretty much the worst.

しかし、だからといって、自分の『自己肯定感』が揺らぐ、ということはありません。

However, this does not mean that my "self-esteem" will be shaken.

むしろ『他者否定感』を増大させます。

Rather, it increases the sense of denial of others.

つまり

It means,

―― 私は悪くない。世界が悪い

"It is not my fault but the world's fault"

です。

-----

私、メールの文面で、簡単に「カチン」と感じてしまう方です。

I'm the kind of person who gets easily "offended" by the text of an email.

ですから、こんな注意書きまで出しているくらいです。

That's why I even put out this warning.

とは言え、こんな注意書きに効果があるのは、利害関係にない人間だけです。

However, the only people who would benefit from such a warning are disinterested parties.

仕事においては、こんなことは日常茶飯事で、目くじらを立てていては、仕事になりません。

In my work, this kind of thing happens every day, and I can't do my job if I'm upset about it.

なぜなら、仕事とは、縦横無尽の面倒くさいリンクが張り巡らされたネットワークで成立しているからです。

This is because work is made up of a network of inexhaustible and tedious links.

その優位性は、仕事の内容で簡単にひっくり返ります。

That advantage can easily be turned upside down by the nature of the work.

具体的には、「動かせる"金"を、誰が持っているかどうか」で決まります。

Specifically, it depends on who has the "money" to make the move.

どんなに不愉快な奴でも、それが、いつか、自分にとっての"金主"になることがあります ―― 歳を取れば、こんなことは、日常的に、普通に、当たり前にあることが分かります(本当)。

No matter how unpleasant a person may be, he or she may one day become a "gold master" for you. As you get older, you realize that this is a normal, everyday thing.

-----

ですので、私の『アンガーマネージメント』は、腹が立った相手の顔を『札束』に見たてることです。

So, my "anger management" is to look at the face of the person I am angry with as a wad of cash.

私たちが相手にしているモノは、『人間』ではありません。

The thing we are dealing with is not a "human being".

あれは『札束』がしゃべっているのです。

The wad of cash is talking.

少なくとも私は、『札束』に対して、追従、忖度、甘受、従順、唯唯諾諾、土下座することに、1mmも抵抗はありません。

At least I don't have the slightest qualms about following, discerning, accepting, obeying, acquiescing, and getting down on my knees to "the wad of cash"

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

package main

import (
"fmt"
"time"
)

var ch chan int // チャネルを運ぶためのグローバルチャネル

func bus_func(i int) {
ch = make(chan int) // スレッドの中でチャネルを作っても動かない

ch <- 10
fmt.Println("After", ch)

time.Sleep(3)
}

func main() {

go bus_func(1)

fmt.Println(<-ch)

}

スレッドの中で(というかサブルーチンの中で)チャネルは厳しいのかな?

package main

import (
	"fmt"
	"time"
)

var ch chan int // チャネルを運ぶためのグローバルチャネル

func bus_func(i int) {

	ch <- 10
	fmt.Println("After", ch)

	time.Sleep(3)
}

func main() {

	ch = make(chan int) // メインで作った場合は動く

	go bus_func(1)

	fmt.Println(<-ch)

}

チャネルを定数で確保しない方法ってないかなぁ。

スレッドで、オブジェクトを実体化して、そこで送受信させる。

package main

import (
	"fmt"
	"sync"
	"time"
)

type BUS struct {
	number int
}

func bus_func(i int, wg *sync.WaitGroup, ch1 chan int, ch2 chan int) {
	defer wg.Done()

	t := time.NewTicker(1 * time.Second) // 1秒おきに通知

	bus := BUS{}
	bus.number = i

	pointer_bus := &bus

	fmt.Println(pointer_bus)

	// 待受
	for {
		select {
		case v := <-ch1: // 受信
			if v == -1 { //終了コードの受信
				return // スレッドを自滅させる
			} else {
				fmt.Println(v)
			}
		case <-t.C: // 送信 (1秒まったら、むりやりこっちにくる)
			ch2 <- i + 100
		}
	}

}

//var c = make([]chan int, 3) // 間違い
// var c []chan int  これは実行時にエラーとなる

var c1 [3]chan int // チャネルをグローバル変数で置く方法の、現時点での正解
var c2 [3]chan int // チャネルをグローバル変数で置く方法の、現時点での正解

func main() {
	var wg sync.WaitGroup
	defer wg.Wait()

	//c := make(chan int)

	// バスエージェントの生成 3台
	for i := 0; i < 3; i++ {
		wg.Add(1)

		c1[i] = make(chan int)
		c2[i] = make(chan int)
		go bus_func(i, &wg, c1[i], c2[i])
	}

	// バスエージェントにメッセージを送る

	c1[0] <- 50
	c1[1] <- 30
	c1[2] <- 10

	c1[0] <- 50
	c1[1] <- 30
	c1[2] <- 10

	c1[0] <- 50
	c1[1] <- 30
	c1[2] <- 10

	fmt.Println(<-c2[0])
	fmt.Println(<-c2[1])
	fmt.Println(<-c2[2])

	c1[0] <- -1 // スレッド終了コードの送信
	c1[1] <- -1 // スレッド終了コードの送信
	c1[2] <- -1 // スレッド終了コードの送信

}

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

これまでC/C++言語で作ってきたスケーラブルなエージェントシミュレーションを、golangで作りかえようとしています。

これまでもメイン関数に縛られずに、スレッドを自由に動き回すシミュレータは作ってきたのですが、C/C++のスレッドは、いかんせんメモリサイズが大きく、万の単位のエージェントには耐えられないという問題があります。

そんな感じで、golangに乗り換えしているのですが、色々文法が面倒くさいです。

例えば、スレッドの中で作った構造体と通信を行う方法として、go func() で返り値(return)が欲しいと思っていたのだけど、考えてみれば、スレッド化したfunc()は、それが終了するまでreturn値を返す訳ないと気がつきました。

だから,

go func_xxxx()

は、

go i:= finc_xxxx()

もダメだし

i := go func_xxxx()

もダメということで ―― では、スレッドの中の情報にどうやってアクセスすればいいかが、分かりません。

とすれば、スレッド側で送受信機能を持たせることになるのかなぁ、と思って、以下のようなコードを書いてみました。

package main

import (
	"fmt"
	"sync"
)

type BUS struct {
	number int
}

func bus_func(i int, wg *sync.WaitGroup, ch chan int) {
	defer wg.Done()

	bus := BUS{}
	bus.number = i

	pointer_bus := &bus

	fmt.Println(pointer_bus)

	for {
		select {
		case v := <-ch:
			fmt.Println(i, v)
		}
	}

}

func main() {
	var wg sync.WaitGroup
	defer wg.Wait()

	c := make(chan int)

	// バスエージェントの生成 3台
	for i := 0; i < 3; i++ {
		wg.Add(1)

		go bus_func(i, &wg, c)
	}

	// バスエージェントにメッセージを送る

	c <- 50
	c <- 30
	c <- 10

	c <- 50
	c <- 30
	c <- 10

	c <- 50
	c <- 30
	c <- 10

}

ただ、この場合、cチャネルは適当に投げられるので、どのオブジェクトにメッセージに届くか分からないので、もう少し工夫をしてみます。

package main

import (
	"fmt"
	"sync"
)

type BUS struct {
	number int
}

func bus_func(i int, wg *sync.WaitGroup, ch chan int) {
	defer wg.Done()

	bus := BUS{}
	bus.number = i

	pointer_bus := &bus

	fmt.Println(pointer_bus)

	for {
		select {
		case v := <-ch:
			fmt.Println(i, v)
		}
	}

}

//var c = make([]chan int, 3) // 間違い

var c [3]chan int // チャネルをグローバル変数で置く方法の、現時点での正解

// var c []chan int  これは実行時にエラーとなる

func main() {
	var wg sync.WaitGroup
	defer wg.Wait()

	//c := make(chan int)

	// バスエージェントの生成 3台
	for i := 0; i < 3; i++ {
		wg.Add(1)

		c[i] = make(chan int)
		go bus_func(i, &wg, c[i])
	}

	// バスエージェントにメッセージを送る

	c[0] <- 50
	c[1] <- 30
	c[2] <- 10

	c[0] <- 50
	c[1] <- 30
	c[2] <- 10

	c[0] <- 50
	c[1] <- 30
	c[2] <- 10

}

 

2021/11,江端さんの忘備録

(昨日の続きです)

(Continuation from yesterday)

以前の私なら、運転免許証の写真などを開示することには、もの凄い心理的抵抗がありました。

In the past, I would have had tremendous psychological resistance to disclosing things like my driver's license photo.

ワクチン接種証明書なんぞ、究極の個人情報です。

A vaccination certificate is the ultimate in personal information.

ですが、今の私は、かなり「どーでもよくなってきています」

But now I'm pretty sure I don't really care anymore.

実際、運転免許証とワクチン接種証明書の写真を送り込んで、アプリ登録を完了しています。

In fact, I sent in photos of my driver's license and vaccination certificate to complete the app registration.

(ただ、このアプリの提供するサービスを使う機会は、当面なさそうなのですが)

(However, I don't think I'll have the opportunity to use the services provided by this app in the foreseeable future.)

この情報が流出するようなことがあれば、もう、私の全ての個人情報が流出したのと同義でしょう。

If this information were to be leaked, it would be the equivalent of all my personal information being leaked.

-----

しかし、最近の私は、『個人情報の流出のリスク』よりも、『もっと便利で簡単な運用』の方に意識が向いています。

However, these days, I am more conscious of "more convenient and easier operation" rather than "risk of personal information leakage.

このようなアプリ登録は面倒なので、ワクチン接種証明は、とっととマイナンバーカードと紐付けて欲しいです。

Registering for such an application is a hassle, so I would like to see vaccination proof linked to my number card as soon as possible.

私の場合、カードリーダを自宅PCに接続していますが、今はスマホを使った読み込みもできるようなので、カードリーダーも不要でしょう。

In my case, I have a card reader connected to my home PC, but now I can use my phone to read the data, so I guess we don't need a card reader.

ワクチン接種ができない人の為に、PCR検査結果もマイナンバーカードとサクっと紐づけできるようにしておけば、有効期間経過後(例:3日後)に自動失効させるようにもできます。

For those who can't get vaccinated, PCR test results can also be quickly linked to the My Number Card, so that the card can be automatically revoked after its validity period (e.g., 3 days).

こうすれば、トラブルも少なくなりそうです。

This way, there will be less trouble.

ともあれ、私の『自分の個人情報を秘匿しようという意識』が薄れているのは事実です。

Anyway, it is true that my 'awareness of keeping my personal information confidential' is waning.

-----

私の個人情報の価値は、500円くらいなのでしょうが、ある一定の対象には、高値で取引される可能性があります。

The value of my personal information is probably about $500, but for certain targets, it could be worth a lot of money.

思いつくだけでも、「ビットコインの団体」「ダイエットの団体」「ネット詐欺の団体」「人工知能の団体」がありそうです。

Just off the top of my head, I can think of "Bitcoin groups," "diet groups," "internet scam groups," and "artificial intelligence groups.

あと「コロナワクチン拒否の団体または個人」は、私を直接狙うかもしれません。

Also, the "coronary vaccine rejecting groups or individuals" may target me directly.

いや、「命を狙う」てなことまでは考えないかもしれませんが、「自宅の庭に生ゴミを投げつけられる」くらいのことはされるかも、と覚悟はしています。

No, they may not think about "trying to kill me," but I am prepared for them to do something like "throwing garbage in my yard.

もしそういう事件が起ったら、みなさんに、直ぐにご報告します ―― 我が家の監視カメラの映像付きで。

If such an incident occurs, I'll let you all know right away -- with security camera video clip of my house.

2021/11,江端さんの忘備録

最近、クレジッドカード情報の流出事故が山のようにあります。

Lately, there have been a lot of accidents involving credit card information leaks.

江端家がこれらの事故から免れたとは思えません。

It is unlikely that the Ebata family was spared from these accidents.

しかし、その流出先から江端家の被害報告は勿論、詫び状一つ届いていませんが、被害がなかったのかどうか怪しいものです。

However, the Ebata family has not received a single letter of apology, let alone a report of damage, from the source of the leak, but it is doubtful that there was no damage

-----

ベネッセ個人情報流出事件で、江端家が受けた補償は、500円分の磁気カード1枚です。

The compensation the Ebata family received for the Benesse personal information leak was a single magnetic card worth 500 yen.

この流出後、娘たちには、予備校やら、専門学校やら、成人式の着物のレンタルやらのDMが山のように届いています。

After this leak, my daughters received a mountain of DMs from prep schools, vocational schools, and kimono rentals for their coming-of-age ceremony.

我が家の住所、氏名等の個人情報が無制限に拡散している状況は、もはや、止めようもありません。

There is no longer any way to stop the unrestricted spread of personal information, such as the name and address of our family.

------

もちろん、500円であったとしても、1万件流出すれば、500万円の損害賠償になります(被害者数は3504万件だったとか)。

Of course, even if the price is 500 yen, if 10,000 cases are leaked, it will result in 5 million yen in damages (the number of victims was 3.54 million).

しかし、その金額が、5000万だろうが、175億円だろうが、そんなこと、私たちの知ったことではありません。

But whether that amount is 50 million yen or 17.5 billion yen is none of our business.

問題は、これからも、私たちが知らない会社から、DMが届き続ける事実です。

The problem is the fact that we will continue to receive DMs from companies we do not know.

因果関係は証明しようがありませんが、江端家では『ベネッセが悪い』で統一されています。

There is no way to prove causality, but the Ebata family is unified in their belief that 'Benesse is to blame.

(続く)

(To be continued)

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

package main

// C:\Users\ebata\goga\3-12

import (
	"fmt"
	"sync"
	"time"
)

type BUS struct {
	number int
}

//var l sync.Mutex
//var c1 chan int

func (bus *BUS) bus_func_recv(lr *sync.Mutex, cr *sync.Cond) {
	// 受信(ブロードキャスト専用)
	fmt.Println("bus.number by recv:", bus.number)
	lr.Lock()
	defer lr.Unlock()
	fmt.Println("before cr.Wait")
	for {
		cr.Wait()          // ロック
		fmt.Println("hi ") // ここで受信処理を行う
	}

}

func (bus *BUS) bus_func_send(lb *sync.Mutex, ch1 chan int) {
	// 送信専用
	fmt.Println("bus.number by send:", bus.number)

	lb.Lock()
	defer lb.Unlock()
	ch1 <- bus.number
}

func main() {
	//wg := sync.WaitGroup{}
	l := sync.Mutex{}
	c1 := make(chan int)

	l2 := sync.Mutex{}
	c2 := sync.NewCond(&l2)

	for i := 0; i < 10; i++ {
		bus := BUS{i}
		go bus.bus_func_send(&l, c1)
		go bus.bus_func_recv(&l2, c2)
	}

	time.Sleep(time.Second)

	c2.Broadcast()

	for {
		select {
		case v := <-c1:
			fmt.Println(v)
		//default:
		//	fmt.Println("default")
		case <-time.After(3 * time.Second):

			return
		}
	}

	close(c1)

	//wg.Wait()

	//time.Sleep(3 * time.Second)




package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

type PERSON struct {
	lon_destination float64
	lat_destination float64
	lon_arrival     float64
	lat_arrival     float64
	bus             BUS
}

type BUS struct {
	lon_present float64
	lat_present float64
	//	person      []PERSON
}

func random(min, max float64) float64 {
	rand.Seed(time.Now().UnixNano())
	return rand.Float64()*(max-min) + min
}

func person(i int, wg *sync.WaitGroup) {
	defer wg.Done()
	person := PERSON{}
	// 出発座標、到着座標の入力
	person.lon_destination = random(139.480, 139.460)
	person.lat_destination = random(35.602, 35.586)
	person.lon_arrival = random(139.480, 139.460)
	person.lat_arrival = random(35.602, 35.586)

	fmt.Println(person, i)
}

func bus(i int, wg *sync.WaitGroup) {
	defer wg.Done()
	bus := BUS{}

	fmt.Println(bus, i)
}

func main() {
	var wg sync.WaitGroup
	defer wg.Wait()

	// バスエージェントの生成 3台
	for i := 0; i < 3; i++ {
		wg.Add(1)
		go bus(i, &wg)
	}

	i := 0

	for {

		time.Sleep(3 * time.Second)

		wg.Add(1)
		i++
		go person(i, &wg)
	}

}


package main

// C:\Users\ebata\goga\3-15

import (
	"fmt"
	"sync"
	"time"
)

// BroadCasterは管制システムのイメージに近い だから移動体のオブジェクトには含めない
type BroadCaster struct {
	cond *sync.Cond
	id   int64
	msg  string
}

func (bc *BroadCaster) Send(msg string) {
	bc.cond.L.Lock()
	defer bc.cond.L.Unlock()
	bc.id++
	bc.msg = msg
	bc.cond.Broadcast()
}

func (bc *BroadCaster) Recv(last int64) (int64, string) {
	bc.cond.L.Lock()
	defer bc.cond.L.Unlock()
	for bc.id == last {
		bc.cond.Wait()
	}
	return bc.id, bc.msg
}

// broadcaster_busをグローバルで実体化
var (
	broadcaster_bus = &BroadCaster{
		cond: sync.NewCond(&sync.Mutex{}),
	}
)

// broadcaster_personをグローバルで実体化
var (
	broadcaster_person = &BroadCaster{
		cond: sync.NewCond(&sync.Mutex{}),
	}
)

// 単一通信の構造体
type SingleCaster struct {
	ch   chan int   // 単一通信路
	lock sync.Mutex // 単一通信路のロック
}

// バス用単一通信の実体化
var (
	sc_bus = &SingleCaster{
		lock: sync.Mutex{},
		ch:   make(chan int),
	}
)

// 人間用単一通信の実体化
var (
	sc_person = &SingleCaster{
		lock: sync.Mutex{},
		ch:   make(chan int),
	}
)

// 人間用単一通信の実体化

type CONTROL struct {
	number int // 管制番号
}

func (control *CONTROL) control_start() {

	// バスへの一斉送信
	for i := 0; i < 2; i++ {
		time.Sleep(1 * time.Second)
		broadcaster_bus.Send(fmt.Sprintf("hello, bus world %d", i))
	}

	// 人間への一斉送信
	for i := 0; i < 2; i++ {
		time.Sleep(1 * time.Second)
		broadcaster_person.Send(fmt.Sprintf("hello, person world %d", i))
	}

	for {
		select {
		//		case v := <-c1:
		case v_b := <-sc_bus.ch:
			fmt.Println("catched from bus send", v_b)
		case v_p := <-sc_person.ch:
			fmt.Println("catched from person send", v_p)

		//default:
		//	fmt.Println("default")
		case <-time.After(3 * time.Second):

			return
		}
	}
}

type BUS struct {
	number int // バス車両番号
}

func (bus *BUS) bus_func_recv() {
	last := int64(0)
	for {
		id, msg := broadcaster_bus.Recv(last)
		last = id
		fmt.Println("broadcaset recv:", bus.number, msg)
	}
}

func (bus *BUS) bus_func_send() {
	// 送信専用
	fmt.Println("bus.number by send:", bus.number)

	sc_bus.lock.Lock()
	defer sc_bus.lock.Unlock()
	sc_bus.ch <- bus.number
}

type PERSON struct {
	number int  // 人間番号
	live   bool // 存在フラグ 存在:true 消滅:false
}

func (person *PERSON) person_func_recv() {
	last := int64(0)
	for {
		if person.live {
			return
		}

		id, msg := broadcaster_person.Recv(last)
		last = id
		fmt.Println("broadcaset recv:", person.number, msg)
	}
}

func (person *PERSON) person_func_send() {
	// 送信専用
	fmt.Println("person.number by send:", person.number)

	for {
		sc_person.lock.Lock()
		sc_person.ch <- person.number
		sc_person.lock.Unlock()
		time.Sleep(time.Second)

	}

}

func main() {

	// バス3台
	for i := 0; i < 3; i++ {
		bus := BUS{i}
		go bus.bus_func_send()
		go bus.bus_func_recv()
	}

	// 人間10人
	for i := 0; i < 10; i++ {
		person := PERSON{i, true}
		go person.person_func_send()
		go person.person_func_recv()
	}

	time.Sleep(time.Second)

	control := CONTROL{}
	go control.control_start()

	//close(c1)

	//wg.Wait()

	time.Sleep(10 * time.Second)
}


package main

// C:\Users\ebata\goga\3-17

import (
	"fmt"
	"sync"
	"time"
)

// BroadCasterは管制システムのイメージに近い だから移動体のオブジェクトには含めない
type BroadCaster struct {
	cond *sync.Cond
	id   int64
	msg  string
}

func (bc *BroadCaster) Send(msg string) {
	bc.cond.L.Lock()
	defer bc.cond.L.Unlock()
	bc.id++
	bc.msg = msg
	bc.cond.Broadcast()
}

func (bc *BroadCaster) Recv(last int64) (int64, string) {
	bc.cond.L.Lock()
	defer bc.cond.L.Unlock()
	for bc.id == last {
		bc.cond.Wait()
	}
	return bc.id, bc.msg
}

// broadcaster_busをグローバルで実体化
var (
	broadcaster_bus = &BroadCaster{
		cond: sync.NewCond(&sync.Mutex{}),
	}
)

// broadcaster_personをグローバルで実体化
var (
	broadcaster_person = &BroadCaster{
		cond: sync.NewCond(&sync.Mutex{}),
	}
)

// 単一通信の構造体
type SingleCaster struct {
	ch   chan int   // 単一通信路
	lock sync.Mutex // 単一通信路のロック
}

// バス用単一通信の実体化
var (
	sc_bus = &SingleCaster{
		lock: sync.Mutex{},
		ch:   make(chan int),
	}
)

// 人間用単一通信の実体化
var (
	sc_person = &SingleCaster{
		lock: sync.Mutex{},
		ch:   make(chan int),
	}
)

// 人間用単一通信の実体化

type CONTROL struct {
	number int // 管制番号
}

func control_init(wg *sync.WaitGroup) {
	defer wg.Done()

	// バスへの一斉送信
	for i := 0; i < 2; i++ {
		time.Sleep(1 * time.Second)
		broadcaster_bus.Send(fmt.Sprintf("hello, bus world %d", i))
	}

	// 人間への一斉送信
	for i := 0; i < 2; i++ {
		time.Sleep(1 * time.Second)
		broadcaster_person.Send(fmt.Sprintf("hello, person world %d", i))
	}

	for {
		select {
		//		case v := <-c1:
		case v_b := <-sc_bus.ch:
			fmt.Println("catched from bus send", v_b)
		case v_p := <-sc_person.ch:
			fmt.Println("catched from person send", v_p)

		//default:
		//	fmt.Println("default")
		case <-time.After(3 * time.Second):

			return
		}
	}
}

type BUS struct {
	number      int       // バス車両番号
	person_list []*PERSON // バスに乗っている人
}

func (bus *BUS) bus_func_recv() {
	last := int64(0)
	for {
		id, msg := broadcaster_bus.Recv(last)
		last = id
		fmt.Println("broadcaset recv:", bus.number, msg)
	}
}

func (bus *BUS) bus_func_send() {
	// 送信専用
	fmt.Println("bus.number by send:", bus.number)

	sc_bus.lock.Lock()
	defer sc_bus.lock.Unlock()
	sc_bus.ch <- bus.number
}

func (bus *BUS) add_person_list(person *PERSON) {
	bus.person_list = append(bus.person_list, person)
}

func (bus *BUS) del_person_list(number int) {
	for cnt := range bus.person_list {
		if number == bus.person_list[cnt].number {
			bus.person_list = append(bus.person_list[:number], bus.person_list[number+1:]...)
			return
		}
	}
}

type PERSON struct {
	number int  // 人間番号
	live   bool // 存在フラグ 存在:true 消滅:false
}

func (person *PERSON) person_func_recv() {
	last := int64(0)
	for {
		if person.live {
			return
		}

		id, msg := broadcaster_person.Recv(last)
		last = id
		fmt.Println("broadcaset recv:", person.number, msg)
	}
}

func (person *PERSON) person_func_send() {
	// 送信専用
	fmt.Println("person.number by send:", person.number)

	for {
		sc_person.lock.Lock()
		sc_person.ch <- person.number
		sc_person.lock.Unlock()
		time.Sleep(time.Second)

	}

}

func bus_init(wg *sync.WaitGroup, i int) {
	defer wg.Done()

	bus := BUS{number: i}
	go bus.bus_func_send()
	go bus.bus_func_recv()

}

func person_init(wg *sync.WaitGroup, i int) {
	defer wg.Done()

	person := PERSON{number: i}
	go person.person_func_send()
	go person.person_func_recv()
}

func main() {

	wg := sync.WaitGroup{}

	// バス3台
	for i := 0; i < 3; i++ {
		wg.Add(1)
		go bus_init(&wg, i)
	}

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

	time.Sleep(time.Second)

	// 管制センタ 1つ
	wg.Add(1)
	go control_init(&wg)

	//close(c1)

	//wg.Wait() //本来はこれだが、強制終了の為に
	time.Sleep(10 * time.Second)

}