GoLang

10分GO 17日目

今日は、テーマフリーのもくもく会にいってきました。

13:00 - 19:00 くらいまでもくもく。

参加者は、インフラエンジニアから、UnityでゲームやVRアプリ作っている人、アレクサスキルやっている人、とさまざまでした。

一緒の席にいた某メーカーのフルスタックエンジニアの人が、お仕事片手間に、困ってる人のために作っているアプリが素晴らしかったのでした。私も早速ダウンロードした。ユーザーと一緒になって作っていきたいそうで、志も素敵で感動しました。アプリのリリースタイミングについてとか、いま発生している障害に対して意見欲しいなんて言われて、お役に立てたようで良かったです。人の役に立てるって嬉しいですね。

 

リサジュー図形(リサジュー曲線)

互いに直交する二つの点が振動しながら軌跡を描く図形のこと。

 

GO

APIの続きをしようかと思ったけど、今日はこっち↓

プログラミング言語Go

GIFアニメーション
package main

import (
	"image"
	"image/color"
	"image/gif"
	"io"
	"math"
	"math/rand"
	"os"
	"time"
)

// color.White, color.Bloack は image/colorパッケージに属している
// []color.Color{...} コンポジットリテラル。
//     Goのコンポジット型のインスタンスを生成するための簡潔な表記
//     要素の値の並びから生成される(この場合はスライス)
var palette = []color.Color{color.White, color.Black}

const (
    whiteIndex = 0
    blackIndex = 1
)

func main() {
	rand.Seed(time.Now().UTC().UnixNano())
	lissajous(os.Stdout)
}

func lissajous(out io.Writer) {
	const (
		cycles = 5    // 周回の数
		res = 0.001
		size = 100
		nframes = 64  // フレーム数
		delay = 8     // 遅延
	)
	freq := rand.Float64() * 3.0
	// []gif.GIF{...} コンポジットリテラル。
	//     Goのコンポジット型のインスタンスを生成するための簡潔な表記
	//     要素の値の並びから生成される(この場合は構造体)
	anim := gif.GIF{LoopCount: nframes}
	phase := 0.0
	for i := 0; i < nframes; i++ {
		rect := image.Rect(0,0, 2*size+1, 2*size+1)
		img := image.NewPaletted(rect, palette)
		for t := 0.0; t < cycles*2*math.Pi; t += res {
			x := math.Sin(t)
			y := math.Sin(t*freq + phase)
			img.SetColorIndex(size + int(x*size+0.5), size+int(y*size+0.5), blackIndex)
		}
		phase += 0.1
		anim.Delay = append(anim.Delay, delay)
		anim.Image = append(anim.Image, img)
	}
	gif.EncodeAll(out, &anim) // エンコードエラーを無視
}

上記のコードをビルド

$ go build ch1-lissajous.go
$ ls
README.md               ch1-dup1.go             ch1-dup3.go             ch1-lissajous           dup2.txt
ch1--di.go              ch1-dup2.go             ch1-echo1.go            ch1-lissajous.go        go

ch1-lissajous って実行ファイルができているので

$ ./ch1-lissajous > out.gif

実行&出力結果をファイルに吐く。

動いてる〜!!

 

練習問題1.5

もっともらしくするために、リサジュープログラムのカラーパレットを背景を黒として緑の線になるように修正しなさい。ウェブカラー #RRGGBB を作成するために color.BGBA{0xRR, 0xGG, 0xBB, 0xFF} を使いなさい。

とりあえず、背景をチェンジしてみる

var palette = []color.Color{color.White, color.Black}

var palette = []color.Color{color.Black, color.White}

なんか、違う?あってる?

/*
var palette = []color.Color{color.Black, color.White}
*/
var palette = []color.Color{
	color.RGBA{0x00, 0x00, 0x00, 0xFF},
	color.RGBA{0x00, 0xFF, 0x00, 0xFF},
}

書き換えて、実行

こんな感じ・・

 

練習問題1.6

リサジュープログラムを修正してpaletteにもっと値を追加し、何らかの興味深い方法で SetColorIndex の第3引数を変更して複数の色で画像を生成するようにしなさい。

SetColorIndexを読んでみる。

func (p *Paletted) SetColorIndex(x, y int, index uint8) {
    if !(Point{x, y}.In(p.Rect)) {
        return
    }
    i := p.PixOffset(x, y)
    p.Pix[i] = index
}

よ・・読めないし!

挫折・・終了!!

 

追記

func (p *Paletted) この部分て何よ・・と思って、お世話になっているコミュニティに投げてみたところ、ご回答いただけました。

https://tour.golang.org/methods/4

レシーバーというらしい

Goでは、特定の型に関連づけられた関数を「メソッド」と呼ぶ
また、メソッドを呼び出される対象(型)のことを「レシーバ」と呼ぶ

構造体+レシーバー(の関数)・・オブジェクト指向でいうクラスみたいなモノ。

 

おわり

寝不足&不眠が続いて、ちょっと体調が悪いです。

メンタル面もよろしくない。辛い・・

ここ2、3ヶ月サボってた 苓桂朮甘湯 を飲んだ。

今日こそ早く寝よう。。

-GoLang