今日は、テーマフリーのもくもく会にいってきました。
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ヶ月サボってた 苓桂朮甘湯 を飲んだ。
今日こそ早く寝よう。。