開発環境
- macOS Mojave - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
- Go (プログラミング言語)
プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES) (Alan A.A. Donovan(著)、Brian W. Kernighan(著)、柴田 芳樹(翻訳)、丸善出版)の第1章(チュートリアル)、1.7(ウェブサーバー)、練習問題1.12の解答を求めてみる。
コード
package main import ( "fmt" "image" "image/color" "image/gif" "io" "log" "math" "math/rand" "net/http" "strconv" ) var palette = []color.Color{ color.RGBA{0, 0, 0, 0xff}, color.RGBA{0xff, 0, 0, 0xff}, color.RGBA{0, 0xff, 0, 0xff}, color.RGBA{0, 0, 0xff, 0xff}} func main() { handler := func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) if err := r.ParseForm(); err != nil { log.Print(err) } else { form_cycles, bln := r.Form["cycles"] if !bln { lissajous(w, float64(5)) } else { cycles, err := strconv.Atoi(form_cycles[0]) if err != nil || cycles < 1 { lissajous(w, float64(5)) } else { lissajous(w, float64(cycles)) } } } } http.HandleFunc("/", handler) log.Fatal(http.ListenAndServe("localhost:8000", nil)) } func lissajous(out io.Writer, cycles float64) { const ( res = 0.001 size = 100 nframes = 64 delay = 8 ) freq := rand.Float64() * 3.0 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), uint8(rand.Intn(len(palette)-1)+1)) } phase += 0.1 anim.Delay = append(anim.Delay, delay) anim.Image = append(anim.Image, img) } gif.EncodeAll(out, &anim) }
入出力結果(Terminal, cmd(コマンドプロンプト))
iMac:ch1 kamimura$ go run sample12.go / / /?cycles=5 /?cycles=5 /?cycles=10 /?cycles=10 /?cycles=5 /?cycles=50 /?cycles=5 /?cycles=2 /?cycles=10 /?cycles=10 /?cycles=5 /?cycles=5 /?cycles=0 /?cycles=5 /?cycle=5 /abcde /?cycles=a C-c C-csignal: interrupt $
0 コメント:
コメントを投稿