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

Go の channel 処理パターン集

func main() {
	ii := 10

	queue := make(chan int, 100)
	defer close(queue)

	for i := 0; i < 5; i++ {
		go worker(i, queue)
	}

	for {
		//k := rand.Intn(1000)

		for i := 0; i < 200; i++ {
			queue <- ii
		}

		time.Sleep(1 * time.Second) // 2秒待つ

		ii++
		go worker(ii, queue)

	}

}

func worker(i int, queue chan int) {
	for j := range queue {
		fmt.Println(i, ",", j)
	}
}

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

Goの複数のgoroutineに対して、一斉ブロードキャストを行いたい

を教えて貰って、喜んでいたのですが、私のようなカルトな使い方をしているケースでは、正しくデータ送信ができない場合があるようです。

動的に登場して、自動的に消滅するような複数の(かなりの数の)goroutineに対しては、受信データの値が変な値になるようです。

下記は、データ送信元のオブジェクトが、自分の位置情報を撒き散らしながらbroadcast送信をしています。

下記は、この途中からgoroutineをバラバラに30個くらい作って受信したものの一つです。

なんども調べてみたのですが、やはりバグが原因ではないようです。

本日、バグを発見しました! 構造体に送信元のオブジェクトを指定する変数が入っていなかった為、全部同じブロードキャストとして受信先が受信をしてしまっていました(03/18)。

ここから得られる結論は、Sync.Cond、broadcastを使うには、

・broadcast、sync.cond は、最初からgoroutineができあがっている場合

・少量、低速にデータ配信を行う場合

でないと、安定的に動作させるには厳しいようです。

これは、まあ、間違ってはいませんです。

====  追記 =====

そういえば、ブロードキャストの送信者が1であった場合は問題がなかったけど、今回は、送信者が3になったところから、変な動きをしだしたことから鑑みて、

送信者、受信者は1:Nの関係でないとだめ

なのかもしれないです。

これは確定です。詳しくは以下をご覧下さい↓

Goの複数のgoroutineに対する一斉ブロードキャストを、まだ諦めきれない

以上

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

1. サーバの方の改造
(a) POPUP int `json:"popup"` の追加

// GetLoc GetLoc
type GetLoc struct {
	ID    int     `json:"id"`
	Lat   float64 `json:"lat"`
	Lng   float64 `json:"lng"`
	TYPE  string  `json:"type"` // "PERSON","BUS","CONTROL
	POPUP int     `json:"popup"`
	//Address string  `json:"address"`
}

(b) javascriptに、this.popup = popup;を追加

function obj(id, lat, lng, type, popup){
	this.id = id;
	this.lat = lat;
	this.lng = lng;
	this.type = type;
	this.popup = popup;
}

(c) javascriptに、

var i = obj.popup;

popup: "Person " + i,

を追加

var i = obj.popup;

		if (obj.id == 0) {
			if (obj.type == "PERSON"){
				var marker = new PruneCluster.Marker(obj.lat, obj.lng, {
					popup: "Person " + i,
					icon: L.icon({
						iconUrl: 'http://localhost:8080/static/person-icon.png', 
					})
				});
			}
			else if (obj.type == "BUS"){
				var marker = new PruneCluster.Marker(obj.lat, obj.lng, {
					popup: "Bus " + i,
					icon: L.icon({
						iconUrl: 'http://localhost:8080/static/bus-icon.png', 
					})
				});

			}

2. クライアントの方の改造

(1)以下はサーバと同じ
// GetLoc GetLoc
type GetLoc struct {
	ID    int     `json:"id"`
	Lat   float64 `json:"lat"`
	Lng   float64 `json:"lng"`
	TYPE  string  `json:"type"` // "USER","BUS","CONTROL
	POPUP int     `json:"popup"`
	//Address string  `json:"address"`
}
gl := ldarp.GetLoc{
		ID: 0, // "0"としなければならない
		//	Lat:  35.64553503, // 初期の場所
		//	Lng:  139.78468208,
		TYPE: "PERSON", // "PERSON","BUS","CENTER"のいずれかが選べる
	}

	// glの要素を外出し
	gl.Lat = person.Destination.Lat
	gl.Lng = person.Destination.Lon
	gl.POPUP = person_num

keyword ポップアップ PruneMobile PruneCluster  Golang JavaScript

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

参考文献  【レッツカスタマイズ】Visual Code StudioにGo言語の開発環境を整えてみよう!

1. Goの開発環境をインストール

2. setting.jsonにgopathを書き込む

Windowsの場合は、"C:\go"は、"C:\\go"と書かないと動かない(みたい)

3. (Ctr+Shift+P)でショートカットで検索バーを表示し、「GO: Install/Update tools」を入力してヒットしたメニューをクリック

全部選んで、インストールする

4. VSCodeを離れて、コマンドプロンプトから、以下のコマンドを実行する

$ go get -u -v github.com/go-delve/delve/cmd/dlv

5. launch.jsonに以下のように書き込む

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${fileDirname}",
            "env": {},
            "args": []
        }
    ]
}

これで、

GO_1_could not launch process: not an executable file_CC课堂-CSDN博客

加えて、(バカみたいな感じもするが)ライブラリのコードでブレークする場合であっても、main.goのウインドウの方をアクティブにしておかなければならないみたい

これで、エラーは出てこなくなる(みたい)。

 

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

参考文献

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

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

displayと入力して

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

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/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)]

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

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を装着したまま自慰行為に励む姿を絶対に妻に見られたくない)が、

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

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

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