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)

}


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

うーん、もっとスマートな方法はないかなぁ

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println("Start!")
	// boolの型でchannelを作成する
	ch1 := make(chan bool)
	ch2 := make(chan bool)
	ch3 := make(chan bool)

	// goroutineを生成して、サブスレッドで処理する

	go func() {
		time.Sleep(2 * time.Second)
		// chに対してtrueを投げる(送信)
		ch1 <- true
		ch2 <- true
		ch3 <- true
	}()

	go func() {
		fmt.Println("func2 start")
		<-ch1
		fmt.Println("func2 end")
	}()

	go func() {
		fmt.Println("func3 start")
		<-ch2
		fmt.Println("func3 end")
	}()

	//isFin := <-ch // <-chだけでもブロック出来る
	fmt.Println("before	time.Sleep(10 * time.Second)")
	time.Sleep(10 * time.Second)
	fmt.Println("after time.Sleep(10 * time.Second)")

	<-ch3

	// chをクローズする
	close(ch1)
	close(ch2)
	close(ch3)

	// 受信した値をprintする
	//fmt.Println(isFin)
	fmt.Println("Finish!")
}

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

以前、非代替性トークン(Non-Fungible Token、NFT)についてのコラムを書きました。

I wrote a previous column about Non-Fungible Token (NFT).

そのコラムの中で、『YouTubeで解説されていたNFTの内容について技術的に検証した結果』の概要を記載しました。

In that column, I outlined the results of a "technical review of the content of the NFT as explained on YouTube.

ちなみに、『私が間違っていれば、是非教えて欲しい』というメッセージも付けておきました。

By the way, I also added a message saying, 'If I misunderstand them, please let me know'.

-----

コラムがリリースされた後、再度YouTubeを確認したら、私が参照したコンテンツが、全部削除されていました。

After the column was released, I checked YouTube again and found that all the content I referred to had been removed.

やっぱり、

Well,

『所感 : "バカ言ってんじゃねーよ"』

"Comment: "Don't be stupid."

などと書かれると、怖くなるのかもしれません。

They may be scared when they read the lines.

いや、『恥をかかされた』と、私を恨んでいるかもしれません。

Rather, they might resent me for 'humiliating' them.

しかし、私は『NFTに関する技術的な解説が間違っている』と言っただけで、NFTそのものを否定している訳ではありません。

However, I just said that the technical explanation of NFT is wrong, not that I am denying NFT itself.

『NFTを通貨として取り扱う世界が、絶対に来ない』とも思っていません。

I don't think that "the world where NFTs are used as currency will never come".

この感じを一言で説明するのであれば、

If I had to describe this feeling in one word, it would be,

『NFTが将来どうなろうが、どーでもいい』という感じです。

"I don't care what the future holds for NFT"

-----

NFTで儲けて幸せになれる人がいれば、素直に「おめでとう」と言います。

If someone can make money with NFT and be happy, I will honestly say "Congratulations".

加えて、NFTで損して不幸せになる人がいなければ、素直に「素晴しい」と言います。

In addition, if no one loses money and becomes unhappy with NFT, I will honestly say "it is great".

ともあれ、私は、

Anyway,

―― 通貨の概念のない未開の地において、コインや紙幣を見せられた原住民程度にしか、"NFT"を理解できないのです

My understanding of NFT is that of a native who was shown coins and paper money in an uncivilized land without concept of currency.

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

「ここ1ヶ月間のコロナ死者の7割がワクチン未接種、2回のワクチン接種後の死亡者は2%」というニュースが、昨日からニュースサイトに掲載されています。

News sites have been reporting since yesterday that "70% of coronary deaths in the past month were unvaccinated, and 2% of deaths occurred after two doses of vaccine.

でもって、このニュースの内容自体が、マスコミと政府の陰謀と信じている人もいるだろうなぁ、と思っています。

And, I'm sure there are people who believe that this news story itself is a conspiracy of the media and the government.

『政府の陰謀は普通にあると思っているけど、コロナウイルスワクチンに関する陰謀に関しては、ステークホルダーがいないから成立できない』

"I believe that government conspiracies are common, but for the conspiracies about coronavirus vaccines, it is impossible because there are no stakeholders"

という話を、簡単なシミュレーション結果と一緒に、こちらに書いておきました。

I've written about it here, along with the results of a simple simulation.

興味のある方は、ご一読下さい。

If you are interested, please read on.

-----

逆に、今回、私が無理矢理捻り出した、真逆の陰謀論「ワクチン非接種者殺害計画」の方が、現実味を増してきたような気がします。

On the contrary, I feel that the backwards conspiracy theory that I forced myself to come up with this time, the "plan to kill non-vaccinated people," is becoming more realistic.

しかし、こちらも、陰謀論としては『弱い』です。

However, this one is also 'weak' as a conspiracy theory.

例えば、一昨日、政府が「第6波対策の方針」を明確して、この陰謀論を、政府自身が潰しました。

For example, the day before yesterday, this conspiracy theory was squashed by the government itself, as the government clarified its policy on the 6th wave.

-----

総じて、「陰謀のPDCA」は、そもそも、P(Plan)からして難しく、D(Do)は絶望的に難しいです。

In general, the "PDCA of conspiracy" is difficult, just for P (Plan), and D (Do) is hopelessly difficult.

陰謀を実施するだけの価値のある潤沢な資金のあるステークホルダーといえば ―― そうですね、やっぱり「軍需産業のコングロマリット」クラスでないと厳しいのではないかなぁ、と思っています。

Speaking of stakeholders with ample funds worthy of carrying out a conspiracy -- well, I guess it would have to be a "military conglomerate" class.

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

私は、勉強に勉強を重ねることで、自分の中の差別的な意識を乗り越えるように試みています。

I am a person who want to overcomes my own sense of discrimination by studying and studying.

しかし、このような頭でっかちなロジックでは、現実世界の差別意識との乖離を乗り越えられないことがしばしばあります。

However, I am afraid that this heady logic often fails to overcome the disconnect with real-world discriminatory attitudes.

例1:

Example 1:

おばさんの服を着た、外見が酷い(不潔感MAX)、肥満で、髭の生えた、清潔感がマイナスに振りきれているおっさん(おばさん)が、ソバを食べている私の横に座った時 ―― 加えて、すさまじい凄い体臭で、私の食欲がゼロになってしまった時、

When the old person in aunt's clothes, who looked terrible, obese, bearded, and had a negative sense of cleanliness, sat down next to me eating buckwheat, in addition to that, when my appetite was reduced to zero due to her tremendous, terrible body odor.

『気持ち悪い』『不快』という感情だけで私の脳のパフォーマンスは100%に振り切れて、そのおっさん(おばさん)の前では、"LGBT"という概念は、吹っ飛びました。

Just the feeling of "disgusting" and "uncomfortable" was enough to push my brain performance to 100%, and the concept of "LGBT" was blown away in front of that person.

コミックや小説や映画の「美しい」世界は、現実の世界とは、随分違うものであり、今の私は、その2つの距離を補完する媒介を持ち合わせていません。

The "beautiful" world of comics, novels, and movies is very different from the real world, and right now I don't have a medium to complement the distance between the two.

例2:

Example 2:

「ホモ」と「ゲイ」では、「ゲイ」の方が、差別的な呼称であると長いこと思っていましたが、それが、全く逆であったことを知ったのは2年前です。

For a long time, I thought that "gay" was the more discriminatory term between "homo" and "gay," but it wasn't until two years ago that I learned that it was quite the opposite.

で、その違いをロジックで説明されても理解できず、感覚的にはずっと、「???」という状態が続いていました。

So, even when the difference was explained to me in terms of logic, I couldn't keep understanding it.

ある時、『「ホモ」という言葉は「ニグロ」という差別的用語と同じ意味合いである』と聞いて、ようやく肚の底から納得できました。

One day, I heard that the word "homo" has the same meaning as the discriminatory term "negro," and I was finally convinced from the bottom of my heart.

今では、私は「ホモ」という言葉は使わずに、「ゲイ」で統一しています。

Now I don't use the word "homo", but rather "gay" as a unifying term.

ただ、この話は「ニグロ」という言葉の意味合いが分からなければ、分かりません。

However, you can't understand this story unless you understand the connotation of the word "negro".

実際、嫁さんに、上記の話をしても「???」という感じでした。

In fact, when I mentioned the above to my wife, she looked like "what's what?"

-----

とは言え、私のような「頭でっかちなロジック派」は多いと思うのです。

However, I think there are many "heady logicians" like me.

私のような奴を、「"LGBT"分ったフリ派」とでも言うのでしょうか。

I guess you could call people like me the "LGBT pretenders".

とりあえず、「"LGBT"は分からん、と堂々という奴」よりは、「"LGBT"分ったフリ派」は、ほんのちょっとだけマシですが、やっぱり、まだまだ遠いと思います。

At any rate, the "LGBT pretenders" are only a little bit better than the "people who proudly say they don't understand LGBT".

残念ですが、「この問題を一気に解決する方法」というのは、期待できないと思います。

Unfortunately, I don't think we can expect to find "a way to solve this problem all at once".

LGBTが少しづつ日常的になることで、コミックや小説や映画の「美しい」世界と現実の世界の乖離が、少しづつ埋められていくことが必要なのだろう、と考えています。

I believe that the gap between the "beautiful" world of comics, novels and movies and the real world will be bridged little by little as LGBT people become more and more commonplace.