rand.Seed()はdeprecated(Go lang)

VScodeでGo 1.20以降の環境では、rand.Seed()は使うなというwarningが出ます。

代わりに推奨されているのは、rand.NewSource()になります。

	rand.Seed(time.Now().UnixNano())
	rand.NewSource(time.Now().UnixNano())

理由は以下のポップアップメッセージですが、a dependency changes how much it consumes from …..の意味は理解できません。最後の一行を読むと、他のパッケージからもglobal random resourceにアクセスがあると期待したシーケンスで出力されなくなると読めるのでリソース(global random resource)を共有時の問題のようで、他のパッケージからアクセスできないrand.NewSource()を使えということなのでしょう。

stackoverflowのQAを見るとこの件がアップされていますね。

https://stackoverflow.com/questions/75597325/rand-seedseed-is-deprecated-how-to-use-newrandnewseed

 

admin

 

ChatGPT

公開されてからいくつかの質問をしていますが、無回答というのはなくてとりあえずハズレでも良いから回答するという特性があります。

ネットの記事にあった、円周率は3.05以上であることを証明しなさいというのを入力すると、円周率は3.14…だから3.05以上だという無意味な回答が出てきます。

内接する正多角形で考えると正六角形で3以上、正八角形でおよそ3.06、正十二角形でおよそ3.1というのが最大平方根の計算だけで求まるからというのがおそらく正しい回答で今の設問ならば正八角形で回答すれば良い。

下の手書きの絵は正十二角形での計算過程ですが、角度が60/45/30度ならば最大でも平方根の計算だけで求まります。

多分人間の思考とは違うので、こういう問題は苦手だろうと思います、簡単なアルゴリズムのコード化などはそれらしい結果が出てくるので。

だんだん賢くはなるだろうけれども、少なくとも創造はできないだろうから人間の思考の補助としての使い道でしょう。

 

admin

 

 

 

struct{}とstruct{}{}(Golang)

struct{}は型(type)を表現しているし、struct{}{}はstruct{}のインスタンス、従って変数の宣言時には型表現としてのstruct{}を使い、変数への代入時には値(インスタンス)としてのstruct{}{}を使わないといけません。

var empt struct{} 
empv := struct{}{}

考えてみればそうですが、混乱しやすいかもしれない

 

admin

doneパターン(Golang)

Goでの特徴的な機能の一つであるgoルーチンですが、その終了判定あるいはチャネルの選択時の一つのパターンがdoneパターンと言われるもの。

コードのベースは以下からですが、

https://github.com/mushahiroyuki/lgo/blob/main/example/ch10/ex1009.go

実はチャネルサイズが10なので、以下のgoルーチンのループでは11以降はチャネルへの書き込みができないので待ちになります。実質はmainルーチンが終了するとgoルーチンも終了されるので処理上の問題はないのですが、

ここでgoルーチン側で終了待ちをするためのdoneパターンを導入してみます。

close(done)がgoルーチンへの終了シグナルになりますが、goルーチン側ではselect/caseを使っています。チャネルの処理が継続できる条件が複数あるときに、継続可能となった処理をselect/caseで選択して実行するものです。select/case文の特徴的なところは、複数の条件が成立しているときにはランダムで継続可能処理を選ぶことでswitch文のように上から順番のような優先順位はつけないということです。

func main() {
	ch := make(chan int)
	var result []int

	done := make(chan struct{})

	go func() {  // 処理してもらう数値をchに入れる
		for i := 0; i < 100; i++ {
			select {
			case <- done:
				fmt.Print(". ")
				return
			case ch <- i:
			}
		}
	}()
	
	result = processChannel(ch)
	close(done)
	
	time.Sleep(1000)
	fmt.Printf("result: %d\n", result)
}

このサンプルでは確実にdone処理を実行するためにmainルーチンで1000nsの待ち時間を入れています。

実行すると、例えば以下のようになります。

ゴルーチン 起動完了
process: 0 0 0
process: 9 81 0
process: 5 25 2
process: 6 36 2
process: 4 16 0
process: 7 49 1
process: 1 1 2
process: 8 64 2
process: 2 4 1
process: 3 9 1
. result: [0 81 16 9 4 49 64 25 1 36]

 

admin

 

Fusion 360(Apple silicon)

https://knowledge.autodesk.com/support/fusion-360/troubleshooting/caas/sfdcarticles/sfdcarticles/Is-Fusion-360-supported-on-Apple-M1-System-Architecture.html

という情報を見たので、ダウンロードして立ち上げてみて、最初の二回は反応なくなったけど、3度目からは立ち上がるようになった。Intel版でも割と起きる現象だから、Apple silicon限定というわけでもない。

ただしFinderのアプリケーションからは見えず、ユーザディレクトリのApplications配下で見えるからDockに配置。

作成したパーツはクラウドに保存されているから、インポートとかは不要。

アプリ情報見てみるとrosetta2モードで動作しています、ネーティブ対応は今年の夏頃と言っていますから。

Intel Mac必須だった障壁また一つ乗り越えたから、そろそろApple silicon統一でも環境としては問題ないかもしれない。新規プラットホーム投入でも、二年半経過すると概ねそんな感じになるんだね。

P.S. 2023/3/14

アプリ立ち上げ時間比較(Dockのアイコンクリックから立ち上がり画面までストップウォッチ計測)

・2029 Intel i7 16GB 一回目:60秒、二回目:40秒

・M1 MacBook Air 16GB 一回目:33秒、二回目:36秒

ほぼ同じぐらいかと思っていたけど、M1の方がRosetta2にも関わらず高速立ち上がりだからApple siliconって優秀。

 

admin

依存性注入(Golang)

依存性注入(DI : Dependency Injection)は他の言語でもありますが、Goの場合にはより構造が単純化されると思います。

以下のコードは、

https://qiita.com/lostfind/items/cae2bca46d903bea167c

からですが、DIを使わないと電球の種類が変わる都度、部屋の工事が必要になるのですが、DI使って部屋にはソケットだけ用意して電球の種類はmain()ルーチンで簡単に変えられるようにしています。DIのメリットは変更発生時の変更範囲が分離されることと、テストが容易(関連するモジュールがなくてもできる)あたりがメリットになるでしょう。プログラムのライフサイクルで保守が大きな比重を占める訳なので、変更に強いコードと言えます。反面コードはその分冗長になります。

package main

import (
	"fmt"
)

func main() {
    lightOne := new(Incandescent) 	// only change these lines if new lighting is introduced
    lightTwo := new(LedLight)		//

    myRoom := NewRoom(lightOne, lightTwo) // DI or object Injection

    myRoom.SwitchOnOne()
    myRoom.SwitchOnTwo()
}

type LightSocket interface {
    LightUp() string
}

// room has two sokets
type Room struct {
    LightOne LightSocket		// prepare only socket, not bulb
    LightTwo LightSocket
}

// define switch on method of the two sockets
func (r *Room) SwitchOnOne() {
    fmt.Println("1番照明:", r.LightOne.LightUp())
}
func (r *Room) SwitchOnTwo() {
    fmt.Println("2番照明:", r.LightTwo.LightUp())
}

// Constructor Injection
func NewRoom(lightOne, lightTwo LightSocket) *Room {
    room := &Room{
        LightOne: lightOne,
        LightTwo: lightTwo,
    }
    return room
}

// Led light
type LedLight struct{}

func (*LedLight) LightUp() string {
    return "LEDが光るよ!"
}

// Filament bulb
type Incandescent struct{}

func (*Incandescent) LightUp() string {
    return "フィラメントが光るよ!"
}

DIはデザインパターンそのものです。

 

admin

 

Stringer interface(Golang)

今更ですが、fmtパッケージにはStringerインターフェースが定義されているので、StringerインターフェースのメソッドString()を独自に実装すると、実装したメソッドが有効となるのでその書式でPrintされます。

以下はGlangのAPIからのコードですが、String()を実装すればその書式になるし、未実装ならば構造体のままでプリントされています。

package main

import (
	"fmt"
)

// Animal has a Name and an Age to represent an animal.
type Animal struct {
	Name string
	Age  uint
}

// String makes Animal satisfy the Stringer interface.
func (a Animal) String() string {
	return fmt.Sprintf("%v (%d)", a.Name, a.Age)
}

func main() {
	a := Animal{
		Name: "Gopher",
		Age:  2,
	}
	fmt.Println(a)
}
<String() string実装>
Gopher (2)

<デフォルト>
{Gopher 2}

多少事情は異なりますがtime.Timeでは、time.Timeが独自のString()メソッドを実装しているから意図した通りにはならず独自のStringメソッドが補完してくれるようです。

https://tutuz-tech.hatenablog.com/entry/2019/11/28/091036

 

admin

 

M1 Macのミー文字

購入以来、いくら設定しても「龍安寺石庭」のような画像に戻ってしまっていましたが、おそらく最新のアップデートで設定がリセットされなくなりました。Apple siliconのソフトサポートもこんな感じで徐々にされて行くんでしょう。

 

admin