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


