2019年1月14日月曜日

開発環境

プログラミング言語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 コメント:

コメントを投稿