# HG changeset patch # User pyon@macmini # Date 1475288191 -32400 # Node ID de451fa0c9cdff5a139209d79d7624705f1fb43d golang repository. diff -r 000000000000 -r de451fa0c9cd src/1sleep/1sleep.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/1sleep/1sleep.go Sat Oct 01 11:16:31 2016 +0900 @@ -0,0 +1,31 @@ +package main + +import( + "flag" + "fmt" + "time" + "os" +) + +func main() { + + // arguments + s := flag.Float64( "s", 0.99, "sleep N seconds" ) + v := flag.Bool( "v", false, "print time" ) + flag.Parse() + + if *s > 0 { + sec := time.Duration( *s * 1000 ) * time.Millisecond + if *v { + fmt.Println( time.Now() ) + } + time.Sleep( sec ) + if *v { + fmt.Println( time.Now() ) + } + } else { + fmt.Println( "bad time" ) + os.Exit( 1 ) + } +} + diff -r 000000000000 -r de451fa0c9cd src/IMGmanip.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/IMGmanip.go Sat Oct 01 11:16:31 2016 +0900 @@ -0,0 +1,215 @@ +/* Image Manipulator - ver 0.2 ( Last Change: 2016-08-21 Sun 09:51:52.) */ +package main + +import( + "errors" + "flag" + "fmt" + "image" + "image/jpeg" + "image/png" + "io" + "os" + "strings" + "strconv" +) + +func main() { + ver := "0.2" + + // arguments + kind := flag.String( "t", "", "file type : jpeg / png" ) + resize := flag.String( "s", "", "new size : 600x800 / 320x0 / ..." ) + crop := flag.String( "c", "", "crop size : 300x200+10+35" ) + angle := flag.Uint( "r", 0, "rotate : 90 / 180 / 270" ) + + flag.Parse() + if flag.NFlag() == 0 { + fmt.Fprintf( os.Stderr, "\n=== Image-Manipulator - version %s ===", ver ) + fmt.Fprintf( os.Stderr, "\n$ imgmanip [option parameter] < infile > outfile\n" ) + flag.PrintDefaults() + os.Exit( 1 ) + } + + // convert + if *kind != "" { + err := Convert( os.Stdin, os.Stdout, *kind ); if err != nil { + fmt.Fprintf( os.Stderr, "%s: %v\n", *kind, err ) + os.Exit( 1 ) + } + return + } + + // resize + if *resize != "" { + err := Resize( os.Stdin, os.Stdout, *resize ); if err != nil { + fmt.Fprintf( os.Stderr, "resize: %v\n", err ) + os.Exit( 1 ) + } + return + } + + // crop + if *crop != "" { + err := Crop( os.Stdin, os.Stdout, *crop ); if err != nil { + fmt.Fprintf( os.Stderr, "crop: %v\n", err ) + os.Exit( 1 ) + } + return + } + + // rotate + if *angle != 0 { + err := Rotate( os.Stdin, os.Stdout, *angle ); if err != nil { + fmt.Fprintf( os.Stderr, "rotate: %v\n", err ) + os.Exit( 1 ) + } + return + } +} + +func Convert( in io.Reader, out io.Writer, kind string ) error { + + img, _, err := image.Decode( in ); if err != nil { + return err + } + + switch kind { + case "jpeg": + return jpeg.Encode( out, img, &jpeg.Options{ Quality: 100 } ) + case "png": + return png.Encode( out, img ) + } + + return errors.New( "image-type is not supported") +} + +func Resize( in io.Reader, out io.Writer, size string ) error { + + img, kind, err := image.Decode( in ); if err != nil { + return err + } + srcW := img.Bounds().Max.X + srcH := img.Bounds().Max.Y + + wh := strings.Split( size, "x" ) + w, err := strconv.Atoi( wh[0] ); if err != nil || w < 0 { + return errors.New( "invalid width" ) + } + h, err := strconv.Atoi( wh[1] ); if err != nil || h < 0 { + return errors.New( "invalid height" ) + } + if w == 0 && h == 0 { + return errors.New( "invalid size" ) + } + if w == 0 { + w = h * srcW / srcH + } + if h == 0 { + h = w * srcH / srcW + } + + dst := image.NewNRGBA( image.Rect( 0, 0, w, h ) ) + for x := 0; x < w; x++ { + for y := 0; y < h; y++ { + dst.Set( x, y, img.At( x * srcW / w, y * srcH / h ) ) + } + } + + switch kind { + case "jpeg": + return jpeg.Encode( out, dst, &jpeg.Options{ Quality: 100 } ) + case "png": + return png.Encode( out, dst ) + } + + return errors.New( "image-type is not supported") +} + +func Crop( in io.Reader, out io.Writer, geo string ) error { + + img, kind, err := image.Decode( in ); if err != nil { + return err + } + srcW := img.Bounds().Max.X + srcH := img.Bounds().Max.Y + + buf := strings.Split( geo, "x" ) + w, err := strconv.Atoi( buf[0] ); if err != nil || w < 0 || w > srcW { + return errors.New( "invalid width" ) + } + buf = strings.Split( buf[1], "+" ) + h, err := strconv.Atoi( buf[0] ); if err != nil || h < 0 || h > srcH { + return errors.New( "invalid height" ) + } + x0, err := strconv.Atoi( buf[1] ); if err != nil || x0 < 0 { + return errors.New( "invalid x" ) + } + y0, err := strconv.Atoi( buf[2] ); if err != nil || y0 < 0 { + return errors.New( "invalid y" ) + } + + var dst *image.NRGBA + + dst = image.NewNRGBA( image.Rect( 0, 0, w, h ) ) + for x := 0; x < x0 + w; x++ { + for y := 0; y < y0 + h; y++ { + dst.Set( x, y, img.At( x0 + x, y0 + y ) ) + } + } + + switch kind { + case "jpeg": + return jpeg.Encode( out, dst, &jpeg.Options{ Quality: 100 } ) + case "png": + return png.Encode( out, dst ) + } + + return errors.New( "image-type is not supported") +} + +func Rotate( in io.Reader, out io.Writer, angle uint ) error { + + img, kind, err := image.Decode( in ); if err != nil { + return err + } + srcW := img.Bounds().Max.X + srcH := img.Bounds().Max.Y + + var dst *image.NRGBA + switch angle { + case 90: + dst = image.NewNRGBA( image.Rect( 0, 0, srcH, srcW ) ) + for x := 0; x < srcH; x++ { + for y := 0; y < srcW; y++ { + dst.Set( x, y, img.At( y, srcH - x ) ) + } + } + case 180: + dst = image.NewNRGBA( image.Rect( 0, 0, srcW, srcH ) ) + for x := 0; x < srcW; x++ { + for y := 0; y < srcH; y++ { + dst.Set( x, y, img.At( srcW - x, srcH - y ) ) + } + } + case 270: + dst = image.NewNRGBA( image.Rect( 0, 0, srcH, srcW ) ) + for x := 0; x < srcH; x++ { + for y := 0; y < srcW; y++ { + dst.Set( x, y, img.At( y, x ) ) + } + } + default: + return errors.New( "bad angle" ) + } + + switch kind { + case "jpeg": + return jpeg.Encode( out, dst, &jpeg.Options{ Quality: 100 } ) + case "png": + return png.Encode( out, dst ) + } + + return errors.New( "image-type is not supported") +} + diff -r 000000000000 -r de451fa0c9cd src/bh.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/bh.go Sat Oct 01 11:16:31 2016 +0900 @@ -0,0 +1,11 @@ +package main + +import ( + "bufio" + "os" +) + +func main() { + bufio.NewScanner( os.Stdin ) +} + diff -r 000000000000 -r de451fa0c9cd src/entai/entai.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/entai/entai.go Sat Oct 01 11:16:31 2016 +0900 @@ -0,0 +1,133 @@ +/****************************************************************************/ +/* Entai.go ( ver 0.1 ) */ +/* Last Change: 2016-09-30 Fri 20:15:52. */ +/****************************************************************************/ + +package entai + +import ( + "fmt" + "time" +) + +var rate0s, rate1s []float64 +var nyds []time.Time + +type Entai struct { + tax int // 税額 + ed int // 経過日数 + yd0 []int // 各年の 1カ月以内の日数 + yd1 []int // 各年の 1カ月超えの日数 + + due time.Time + paid time.Time + am time.Time +} + +func init() { + // 1カ月まで, 1カ月経過後, 元旦 + createRates( 4.3, 14.6, "20120101" ) // H24 + createRates( 4.3, 14.6, "20130101" ) // H25 + createRates( 4.3, 14.6, "20140101" ) // H26 + createRates( 2.9, 9.2, "20150101" ) // H27 + createRates( 2.8, 9.1, "20160101" ) // H28 +} + +func createRates( r0, r1 float64, y string ) { + t, _ := time.Parse( "20060102", y ) + rate0s = append( rate0s, r0 / 100 ) + rate1s = append( rate1s, r1 / 100 ) + nyds = append( nyds, t ) +} + +func ( e Entai ) String() string { + return "Entai....." +} + +func ( e Entai ) GetRate() string { + var str string + for i, n := range nyds { + str += fmt.Sprintf( " (H%d) ", n.Year() - 1988 ) + str += fmt.Sprintf( "%s :%4.1f / %4.1f\n", n.Format("2006.01.02"), rate0s[i] * 100, rate1s[i] * 100 ) + } + return str +} + +func ( e *Entai ) countDays() { + + for range nyds { + e.yd0 = append( e.yd0, 0 ) + e.yd1 = append( e.yd1, 0 ) + } + + // 1カ月後の算出 + for tmp := e.due; ; { + tmp = tmp.AddDate( 0, 0, 1 ) + for i, nyd := range nyds { + if tmp.Year() == nyd.Year() { + e.yd0[i]++ + } + } + if tmp.Day() == e.due.Day() { + e.am = tmp + break + } + } + + // 過ぎた日数の算出 + for i := 1; ; i++ { + tmp := e.due.AddDate( 0, 0, i ) + for j, nyd := range nyds { + if tmp.Year() == nyd.Year() { + e.yd1[j]++ + } + } + if e.paid.Sub( tmp ) == 0 { + for j, _ := range nyds { + e.yd1[j] -= e.yd0[j] + } + e.yd1[len(e.yd1)-1]-- + e.ed = i - 1 + break + } + } +} + +func ( e *Entai ) Set( d, p time.Time, g int ) { + e.due, e.paid = d, p + e.tax = g + e.countDays() +} + +func ( e *Entai ) Result() ( int, string ) { + + /* 税額の前処理 */ + if e.tax < 2000 { + return 0, "tax < 2000" + } + e.tax = int( e.tax / 1000 * 1000 ) // 端数処理 + + /* 本計算 */ + var tmp float64 + for i, _ := range nyds { + tmp += float64(e.yd0[i]) * rate0s[i] + float64(e.yd1[i]) * rate1s[i] + } + tmp *= float64(e.tax) / 365.0 + + /* 利息の後処理&端数処理 */ + var intrst int + if tmp < 1000 { + intrst = 0 + } else { + intrst = int( tmp / 100 ) * 100 + } + + /* 追加情報 */ + info := fmt.Sprintf( "%.2f,%d =", tmp, e.ed ) + for i, _ := range nyds { + info += fmt.Sprintf( ": %d %d ", e.yd0[i], e.yd1[i] ) + } + + return intrst, info +} + diff -r 000000000000 -r de451fa0c9cd src/entai/entai_test.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/entai/entai_test.go Sat Oct 01 11:16:31 2016 +0900 @@ -0,0 +1,45 @@ +/****************************************************************************/ +/* Entai_test.go ( ver 0.1 ) */ +/* Last Change: 2016-10-01 Sat 09:21:21. */ +/****************************************************************************/ + +package entai + +import ( + "time" + "testing" +) + +func TestEntai( t *testing.T ) { + + var tests = []struct { + due string + paid string + tax int + want int + }{ + { "20160731", "20160930", 29000, 0 }, + { "20150731", "20160930", 29000, 2900 }, + { "20140731", "20160730", 29000, 5700 }, + } + + for _, test := range tests { + test01( test.due, test.paid, test.tax, test.want, t ) + } +} + +func test01( due, paid string, tax, want int, t *testing.T ) { + + var e Entai + + layout := "20060102" + d, _ := time.Parse( layout, due ) + p, _ := time.Parse( layout, paid ) + + e.Set( d, p, tax ) + got, _ := e.Result() + if got != want { + t.Errorf( "want %v, but %v\n", want, got ) + } +} + diff -r 000000000000 -r de451fa0c9cd src/entai_app/entai_app.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/entai_app/entai_app.go Sat Oct 01 11:16:31 2016 +0900 @@ -0,0 +1,104 @@ +/****************************************************************************/ +/* Entai_app.go ( ver 0.1 ) */ +/* Last Change: 2016-09-30 Fri 22:09:50. */ +/****************************************************************************/ + +package main + +import ( + "flag" + "fmt" + "os" + "strconv" + "time" + + "entai" +) + +func main() { + + var entai entai.Entai + + // arguments + h := flag.Bool( "h", false, "help" ) + r := flag.Bool( "r", false, "print rate" ) + l := flag.Bool( "l", false, "1-liner mode" ) + v := flag.Bool( "v", false, "print verbose in 1-liner mode") + i := flag.Bool( "i", false, "print input in 1-liner mode") + s := flag.Bool( "s", false, "server mode" ) + p := flag.Int( "p", 80, "listen port in server mode" ) + + flag.Parse() + + if flag.NFlag() == 0 { + PrintTile() + flag.PrintDefaults() + fmt.Fprint( os.Stderr, "\n" ) + os.Exit( 1 ) + } + + if *h { + PrintTile() + fmt.Fprint( os.Stderr, "1-liner mode:\n" ) + fmt.Fprint( os.Stderr, "> entai_app -l 20160731 20161224 30000\n\n" ) + fmt.Fprint( os.Stderr, "> entai_app -i -l 20160731 20161224 30000\n\n" ) + fmt.Fprint( os.Stderr, "> entai_app -i -v -l 20160731 20161224 30000\n\n" ) + fmt.Fprint( os.Stderr, "server mode:\n" ) + fmt.Fprint( os.Stderr, "> entai_app -s -p 8080\n" ) + os.Exit( 0 ) + } + + if *r { + PrintTile() + fmt.Fprint( os.Stderr, entai.GetRate() ) + os.Exit( 0 ) + } + + if *s { + *p = 8080 + fmt.Fprint( os.Stderr, "server mode is not implemented.\n" ) + os.Exit( 0 ) + } + + if *l { + layout := "20060102" + + d, err := time.Parse( layout, flag.Arg(0) ); if err != nil { + fmt.Fprint( os.Stderr, "bad date format.\n" ) + os.Exit( 1 ) + } + p, err := time.Parse( layout, flag.Arg(1) ); if err != nil { + fmt.Fprint( os.Stderr, "bad date format.\n" ) + os.Exit( 1 ) + } + + t, err := strconv.Atoi( flag.Arg(2) ) + if err != nil || t < 0 { + fmt.Fprint( os.Stderr, "bad money format.\n" ) + os.Exit( 1 ) + } + + if *i { + fmt.Printf( "%v,%v,%d,", d.Format( layout ), p.Format( layout ), g ) + } + + // MAIN + entai.Set( d, p, t ) + result, detail := entai.Result() + // + + fmt.Print( result ) + + if *v { + fmt.Print( ",", detail ) + } + fmt.Print( "\n" ) + } +} + +func PrintTile() { + fmt.Fprint( os.Stderr, "\n==================================================\n" ) + fmt.Fprint( os.Stderr, " Entai_app ver 0.1 ( 2016.09.29 ) - since 2016\n" ) + fmt.Fprint( os.Stderr, "==================================================\n\n" ) +} + diff -r 000000000000 -r de451fa0c9cd src/httpsv/httpsv.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/httpsv/httpsv.go Sat Oct 01 11:16:31 2016 +0900 @@ -0,0 +1,68 @@ +package main + +import ( + "flag" + "fmt" + "html/template" + "log" + "net/http" + "os" +) + +type rate struct { + year int + rate0 float64 + rate1 float64 +} + +type rates []rate + +func main() { + + var s = flag.Bool( "s", false, "server mode" ) + var p = flag.Int( "p", 8080, "port") + flag.Parse() + + if *s { + host := "localhost:" + fmt.Sprintf( "%d", *p ) + fmt.Fprintf( os.Stderr, "starting server (%d)...\n", *p ) + + r0 := rate{ 2001, 0.1, 0.2 } + r1 := rate{ 2002, 0.2, 0.3 } + rt := rates{ r0, r1 } + + http.HandleFunc( "/", handler ) + http.HandleFunc( "/list", rt.list ) + log.Fatal( http.ListenAndServe( host, nil ) ) + + } else { + files := flag.Args() + + if len( files ) == 3 { + fmt.Println( "ok" ) + } else { + fmt.Fprintln( os.Stderr, "not ok" ) + } + } +} + +func handler( w http.ResponseWriter, r *http.Request ) { + + const tmpl = `
Hello, Template !
` + t := template.Must( template.New( "hoge" ).Parse( tmpl ) ) + err := t.Execute( w, nil ); if err != nil { + log.Fatal( err ) + } + fmt.Fprintf( w, "url.path = %q\n", r.URL.Path ) +} + +func ( r rate ) String() string { + return fmt.Sprintf( "%d年,%.2f %,%.2f %", r.year, r.rate0, r.rate1 ) +} + +func ( rt rates ) list( w http.ResponseWriter, r *http.Request ) { + for i, v := range rt { + fmt.Fprintf( w, "%d,%v\n", i, v ) + } +} + diff -r 000000000000 -r de451fa0c9cd src/tac.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/tac.go Sat Oct 01 11:16:31 2016 +0900 @@ -0,0 +1,49 @@ +package main + +import ( + "bufio" + "flag" + "fmt" + "os" +) + +func main() { + flag.Parse() + + files := flag.Args() + + var lines []string + + // Input + if len( files ) == 0 { + lines = ReverseLines( os.Stdin, nil ) + } else { + for _, arg := range files { + f, err := os.Open( arg ) + if err != nil { + fmt.Fprintf( os.Stderr, "tac : %v\n", err ) + continue + } + l := ReverseLines( f, nil ) + f.Close() + lines = append( lines, l... ) + } + } + + // Output + for _, line := range lines { + fmt.Println( line ) + } +} + +func ReverseLines( f *os.File, l []string ) []string { + input := bufio.NewScanner( f ) + for input.Scan() { + l = append( l, input.Text() ) + } + for i, j := 0, len(l) - 1; i < j; i, j = i + 1, j - 1 { + l[i], l[j] = l[j], l[i] + } + return l +} + diff -r 000000000000 -r de451fa0c9cd src/uq.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/uq.go Sat Oct 01 11:16:31 2016 +0900 @@ -0,0 +1,61 @@ +package main + +import ( + "bufio" + "flag" + "fmt" + "os" +) + +func main() { + var c = flag.Bool( "c", false, "count each items" ) + var l = flag.Bool( "l", false, "count items") + flag.Parse() + + files := flag.Args() + + count := make( map[string] int ) + var lines []string + + // Input + if len( files ) == 0 { + input := bufio.NewScanner( os.Stdin ) + for input.Scan() { + count[input.Text()]++ + lines = append( lines, input.Text() ) + } + } else { + for _, arg := range files { + f, err := os.Open( arg ) + if err != nil { + fmt.Fprintf( os.Stderr, "uq : %v\n", err ) + continue + } + input := bufio.NewScanner( f ) + for input.Scan() { + count[input.Text()]++ + lines = append( lines, input.Text() ) + } + f.Close() + } + } + + // Output + if *l { + fmt.Println( len(lines), "->", len(count) ) + return + } + + done := make( map[string] int ) + for _, line := range lines { + if done[line] == 0 { + if *c { + fmt.Printf( "%s,\t%d\n", line, count[line] ) + } else { + fmt.Println( line ) + } + } + done[line]++ + } +} +