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

おそらくAmazonで購入できる、日本で(世界でも?)もっとも安価な3Dプリンタの一つを購入しました。

お世話になっている同僚から「迷っているようなら、一番安いものを、とっと買って試した方がいい」と言われたことに因ります。1日の勉強代としてペイするくらいの値段です。

で、まあ、このメモを読んで、購入する人もいると思いますので、最初に申し上げると、「添付マニュアルの記載はゴミです(日本語ページも5Pしかない)ので、これを日本語字幕ONにして、このビデオクリップのまま実施することをお勧めします。

こっち↓が公式ですが、上の方が分かりやすいと思う(日本語字幕をONにすれば)

台座の位置調整が大切で、「A4の紙が入る程度」と説明されていますが、「A4の紙を入れるとちょっと抵抗がある程度の調整する」ほうが良いです。

これをいい加減にやると、

になります。

で、この調整の際に、電源外して、台座を動かすのですが、これが「固く」て結構怖いですが、力づくで動かして下さい(電源外していることが重要です)。

現時点では、パソコンから直接印刷することができなくて(できるのかしれないけど、まだ分からん)、SDカードから読みとらなければなりません。

今日一日で分かったこと

■3Dプリンタの印刷時間が半端なく長い。キーホルダー程度のブツに、約1時間
■この格安プリンタのできあがりは、シャレにならないくらいキレイ
■アームやら台座やらは、ある程度力づくで動かしてもOK(キャリブレーションがずれるということもなさそう)

で、今日一日の結果として、経験的に分かったことを、記載しておきます(多分、私だけしか分からん内容)。

これが、印刷中の外観。

で、大切なのが「操作の順番(手順)」


SDカードしか使えないのであれば、『このUSBケーブルは一体何の為にあるんだろう? 』と思っていますが、今日は、この辺で切り上げたいと思います。

で、今日の成果(失敗も多かったですが)です。右の舟を作っている途中で、添付した溶剤(フェラメント)が無くなりました。

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のウインドウの方をアクティブにしておかなければならないみたい

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

 

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,江端さんの技術メモ

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,江端さんの技術メモ

みなさん。 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)]

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