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

https://teratail.com/questions/370090?nli=619ad631-d4fc-405f-a649-44670a040506#reply-502318

もの凄く助かりました。

nobonoboさんに心からの感謝を

C:\Users\ebata\goga\3-10

/*
いっせいブロードキャストをするのに一般的に使われているのはPubSubと呼ばれる方式です。
サブスクライブを複数あらかじめおこなっておき、パブリッシュでメッセージを送ると
複数のサブスクライブ先に同じメッセージを配信するというものです。
おそらくこの方式は発見済みで、想像するに複数のサブスクライブ先をループで巡って
複数回送信することでブロードキャスト相当を実現するのではなく、もっと真に
ブロードキャストしたいということが質問者さんの意図なのかなと。

そういうものを実現するのに「sync.Cond」という標準ライブラリ機能があります。
これの活用方法は実はちゃんとした実例が見つけにくいです。たいてい前者のやり方で済まして
しまっているのと、sync.Condの挙動は若干わかりづらいです。

すこし解説は端折りますが、以下のように記述することで実現できると思います。

ポイントは

タイミングだけをsync.CondのBroadcastで伝える
複数のタスクには共有メモリを通して渡したいメッセージを伝えます
送る方も受ける方も排他ロックを併用するのがCondの使い方でロック期間であれば
共有メモリをコンフリクトなくアクセスできます

この方法はPubSubにくらべ、共有メモリをすべてのgoroutineタスクに伝播したか
どうかを保証する仕組みがないです
つまり、この方法は「低頻度のイベントを大量のタスクに配信」するか、もしくは
「最新の値さえ受け取れればOK」という用途向けです。
*/

package main

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

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
}

var (
	broadcaster = &BroadCaster{
		cond: sync.NewCond(&sync.Mutex{}),
	}
)

func task(i int) {
	log.Println("task:", i, " start")
	defer log.Println("task:", i, " stop")
	last := int64(0)
	for {
		id, msg := broadcaster.Recv(last)
		last = id
		log.Println("task:", i, msg)
	}
}

func main() {
	for i := 0; i < 3; i++ {
		go task(i)
	}
	for i := 0; i < 3; i++ {
		time.Sleep(1 * time.Second)
		broadcaster.Send(fmt.Sprintf("hello, world: %d", i))
	}
	time.Sleep(1 * time.Second)
}

Keyword sync.Cond, sync.Broadcast,

参考文献: sync.Cond/コンディション変数についての解説

2022/03,江端さんの技術メモ

参考文献

時々、vscodeの日本語化が外れるので、直し方をメモっておきます。

日本語化のための拡張機能をインストールする(2)

displayと入力して

これで、"jp"を選べば、日本語化が戻ります。

2022/03,江端さんの忘備録

今回のロシア軍によるウクライナ侵攻(ここでは、各種メディアに合わせて「侵攻」を使います)に関して、

With regard to the recent Russian military invasion of Ukraine (we use "invasion" here, in keeping with the various media outlets), there is an opinion that

―― 到底、勝目のない戦争。国内の犠牲者が出るだけだから、早くウクライナは降伏すべきである

"A war that cannot possibly be won. Ukraine should surrender as soon as possible, as it will only result in domestic casualties"

という意見があります。

かつて、日本も同じような状況になったことがあります。

Japan has had similar situations.

太平洋戦争時、我が国の最高戦争指導会議は、この判断(無条件降伏)ができませんでした。

During the Pacific War, our Supreme War Leadership Council was unable to make this decision (unconditional surrender).

その結果、多数の非戦闘員(民間人)が殺害され、国土を原爆の実証実験に使われました。

As a result, many non-combatants (civilians) were killed and our country was used to demonstrate the atomic bomb.

そのように考えた場合、このような「降伏優位論」には、一定の説得力があります。

When considered in this light, such a "surrender superiority theory" has a certain persuasiveness.

-----

しかし、その一方で、

However, on the other hand,

(今回のウクライナ侵攻ではなくて)前回のクルミア半島併合の時のシナリオを、我が国を使ったユースケースとして考えてみると、

If I consider the scenario of the previous annexation of the Kurmian peninsula (instead of the current invasion of Ukraine) as a use case with our country,

■「北海道の在留ロシア人がロシアへの併合を希望している」から、

- "The Russians living in Japan in Hokkaido want to annex Hokkaido to Russia.

■ロシア大統領が『北海道をロシアに併合する』と宣言して、

- The Russian president declares, "Hokkaido will be annexed to Russia.

■一方的に軍事侵攻をしてきて、

- Unilateral military invasion of Hokkaido

■北海道より北部の我が国の領土を実効占拠した

- They effectively occupy our territory north of Hokkaido.

としたら、

, and when we were told the following

『到底、勝目のない戦争。国内の犠牲者が出るだけだから、日本は、北海道をロシアに譲るべきだ』

"It's a war that can never be won. Japan should cede Hokkaido to Russia because it will only result in domestic casualties."

と言われて、私たちは、納得するでしょうか。

Will we be convinced ?

-----

私、絶対的な意味において、愛国者ではありませんが、それでも、

I'm not a patriot in the absolute sense of the word, but I thought,

―― 命をかけて戦える

"I can fight for my life."

と思いました。

私の場合、「愛国心」なんかなくったって、「理不尽に対する激怒」で戦えます。

For me, though I don't need "patriotism" to fight, I can fight with "rage against unreason".

-----

上記のユースケースは、私が思いついたもので、多分、あまり妥当なものではないと思います。

The above use case is just something I came up with and probably not very good.

誰か、これような「我が国を使ったユースケース」で上手く説明してくれる方、いらっしゃいませんか?

Can someone please explain well with a "use case using our country" like this?

そういうことを考えている人は、沢山いると思うんです。

I think there are a lot of people who are thinking about that.

2022/03,江端さんの技術メモ

readme

readme

C:\Users\ebata\goga\3-23に格納されている(絶対忘れると思ったので、アップしておく)

対向サーバは、〜/go_template/tests/server23.go

2022/03,江端さんの技術メモ

【Golang】structのField名で気をつけるところ

「小文字で始まるField名は外部パッケージからのアクセスできない」 って、どんな言語仕様なんだ・・・

いや、privateとかpublicなんぞ使うよりずっといいって思うよ。

でも、こんなことでvscodeから怒られているとは思わなかったよ。

 

2022/02,江端さんの技術メモ

ソースコードが長くなってくれば、ソースコードを分割するのは当然ですが、Golangでは、この「当たり前」の情報が全然見つからなくて、本当に困っています。

これまで出てきたエラー一覧

  • build command-line-arguments: cannot find module for path _/C_/Users/....
  • # command-line-arguments
  • repeated module statement

「もう、これだから、新しい言葉を覚えるのは嫌なんだよ」と、何十回目かの泣き言を言っています。C/C++で1000万くらいのスレッドが、サクっと作れれば、別にGolangでなくたって・・・と思うのですが、ないものをねだっても仕方がありません。

こちらの記事(https://leben.mobi/go/configuration_and_package/start-go/)を丸パクリさせて頂きました(ちょっとだけ変えています)。

$ tree
.
├── hello
│   ├── greet.go
│   └── hello.go
└── main.go

てな構造でディレクトリを掘って、ファイルを作ってください。

で、

$ go mod init m   ← "m"でもなんでも、好きな文字列を(ここでは"m"とします)
go: creating new go.mod: module m
go: to add module requirements and sums:
        go mod tidy

下↓が必要はどうかは不明

$ go mod edit -replace=m/hello=../hello

として、

.
├── go.mod

を作ります。

$ more main.go
package main

import (
    "fmt"

    "m/hello"  // ← ここ重要
)

func main() {
    fmt.Println(hello.SayHello()) // パッケージ名 + 最初が大文字の関数
    fmt.Println(hello.Greet())
}
$ more hello/hello.go
package hello // ← ここ重要

func SayHello() string { // 最初は大文字
    return "Hello World!"
}

$ more hello/greet.go
package hello // ← ここ重要

func Greet() string { // 最初は大文字
    return "How are you?"
}

とすると、

$ go run main.go
Hello World!
How are you?

と、ちゃんと、動くようになりました。

来週の私へ(メモ) #後で消す

が、全然消せない。

2022/03,江端さんの忘備録

私は、これまで、母の胃ろう器具交換のサポートの為に、4ヶ月ごとに、一人で帰省してきました。

I have been returning home alone every four months to support my mother in changing her gastroduodenal appliance.

そして、帰省の度に、コンビニで売られている「ゴルゴ13」などのマンガを1冊づつ購入していました。

And every time I returned home, I would buy one copy each of "Golgo 13" and other manga sold at convenience stores.

-----

先日、母の四十九日の法要の為に、家族全員で実家に帰省しました。

Recently, my entire family returned to my parents' home for my mother's 49th day memorial service.

法要後、お坊さんから、コロナでお亡くなりになった方のお話を聞きました。

そこで、長女が、私が購入したマンガを読んでいました。

There, my senior daughter was reading a comic book I had purchased.

長女は、

She was muttering,

「『ルールは常に征服者の都合で決まる』・・・か」

"'The rules are always determined by the convenience of the conqueror.'..."

と、呟いていました。

(*)ゴルゴ13 Vol.191 1万キロの狙撃

(*)Golgo 13 Vol.191 10,000 km Sniper

-----

社会人1年生の、長女の琴線に触れたようです。

It seems to have tugged at the heartstrings of her, a first-year working adult.

2022/03,江端さんの技術メモ

みなさん。 golang の ":="は、変数宣言せずに変数を使える便利な奴ですが、スコープ(有効範囲)を間違えて、二重使用すると「地獄」を見ますよ。

/////a_Point := liPoint
	a_Point := liPoint

	for {
		/////b_Point := a_Point // aがスタート、bがゴール
		b_Point := a_Point // 現在のゴールをスタートにする

		a := <-ch3 // センタからch3待ち(ゴールを教えてもらう)
		if a != -1 {
			a_Point = li[a.(int)]

この最後の行を、

a_Point := li[a.(int)]

となっていて、訳の分からない変数の追跡で、数時間失いました。

未分類

(翌日)

  • 熱は出ていない(36.6度)
  • 関節という関節が痛い。全身がダルい。鉄棒にぶらさがるのは無理そう。
  • ウォーキングに出たら、もっとも遠い地点で不調Maxになった。フラフラしながら歩いていた。
  • 3月分のコラムの編集が「できないほどの不調ではない」ので、クスリを接種して、現在、原稿を作成中
  • 嫁さんは、「腕が痛い」のみ

ちなみに、鉄棒で「懸垂1回のみ」ができるようになった。
飛び付いた勢いを使っているので、公式の懸垂回数にならないことは、認識済み。

部屋に鉄棒を作ってみた


(翌々日)

完全復活。むしろ、睡眠時間が十分すぎて、ここ暫く体験したことがない、絶好調の体調。

コロナワクチンの副反応で苦しんでいる世界中の人に、大変申し訳がないような気持ちになる。

でも

―― なんで、副反応に、こんなにも個体差があるんだろう?

ということについても、調べてみたくなりました。


新型コロナワクチン接種後に熱が出るほど抗体価が上がる? 日本から複数の研究結果が報告

副反応に苦しんだ人は、そのメリットを得られる ―― ということになるのかな?

以上

2022/03,江端さんの技術メモ

以前、こちらの日記に、

―― VR(Virtual Reality)のエロが凄い

という内容を掲載しました。

あの時は、会社での飲み会だったので、あまり詳しい話が聞けませんでした。

この度、私のコラムをご愛読して頂いている読者のMさんより(EE Times JapanのMさん(Ms.M)とは別の方)、詳細なレポートを頂きました。

VRを理解する上で、優れたコンテンツと思いましたので、Mさんの許諾を得て、以下に公開させて頂きます。

====== ここから =====

VRの最大の特徴は「人は視覚と聴覚を仮想されると、それを現実として認識する」です。

VRとの出会いはゲームでした。

独身一人暮らし時代、VRでバイオハザードという一人称視点のホラーゲームをプレイしていました。

プレイ中にムービーがあったんですが、その内容は

「自分が椅子に拘束され、両手首も前手で拘束された状態から、チェーンソーで両手首を切断される」

というものでした。

(自分自身もソファに座って、コントローラーを持っていたので、ムービーと全く同じ体制を取っていました)

仮想現実の自分が、両手首を切断されたとき、いの一番に自分は叫びました。

「痛ッッたくない!!!」

-----

VRでをしばらく装着すると、「ここが仮想現実である」という認識がどんどんなくなって、「仮想現実が現実化」します。

その時チェーンソーで切られた手首は間違いなく自分の手首であり、「痛くない」ことで、これがVRだったことを思い出すほどにです。

また、エースコンバットという戦闘機のフライトシミュレーションゲームのVR版をプレイした時は、ヴァーティゴに陥り、VRがなければ戦闘機パイロットでしか経験できないであろう経験をしました。

VRは現実です。

ゲームプレイ後、VRを外して見える自分の部屋を見て

「なんで俺は(洋館やコックピットでなく)ここにいるんだ?」

と一瞬思うほどには現実です。

-----

そしてVRのAVです。("ここから本論" by 江端)

先述のとおり、「VRをしばらく装着していると仮想現実が現実化」します。

僕はワクワクしながら「紗倉まなのVRAV」を購入し視聴を開始しました。

部屋の中でベッドに仰向けになっていたところ(この瞬間、僕も体勢を「座り」から「仰向け」に変えました)、部屋のドアが開き、紗倉まなが入ってきました。

自分にのしかかり、キスをしてきます。

(その際、相手の唇が少しずれるくらいなら脳が補正してくれます。)

また、立体音声でささやかれるのも、主観視点もあいまって「紗倉まながそこにいる」と錯覚させるものに十分なものでした。

しかし、ついに紗倉まなが自分のズボンを下ろしたとき、その光景のせいで、途端に自分の脳が仮想現実であることを認識してしまいました。

「俺の脚じゃない」

ズボンを脱がされて出て来た(VR上の)自分の脚が、(実際の)自分の脚より細く、一気に仮想現実であることを突きつけられました。

その後パンツを脱がされたあと、もちろんモザイクが入ってましたが、正直、脚の細さで冷静になれていましたので、そこで特にショックはありませんでした。

-----

その後自分がVRAVを購入する際に気をつけていた点は2つです。

・ズボンを脱がされない(主観側がチャックを下ろすのみの露出)

・陰茎が「模型」(男優の陰茎ではなく陰茎の模型であることにより、抽象度が増すことで脳が騙されやすい)

-----

今は妻もいますので、VRAVを利用することは全くなくなりました(VRを装着したまま自慰行為に励む姿を絶対に妻に見られたくない)が、

―― あれは、自分にとって、エロのパラダイムシフトでした。

====== ここまで =====

以上、非常に秀逸なレポートを、ありがとうございました。