From 808b11e261cbe95f93af605b1ff30174fbfe5d2d Mon Sep 17 00:00:00 2001 From: dshirae Date: Sun, 2 Jun 2019 11:28:44 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=E8=AA=B2=E9=A1=8C1=E6=8F=90=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai1/dshirae/README.md | 43 +++++++++++++++++++ kadai1/dshirae/chimgs.go | 35 +++++++++++++++ kadai1/dshirae/convert/PixFile.go | 71 +++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 kadai1/dshirae/README.md create mode 100644 kadai1/dshirae/chimgs.go create mode 100644 kadai1/dshirae/convert/PixFile.go diff --git a/kadai1/dshirae/README.md b/kadai1/dshirae/README.md new file mode 100644 index 0000000..de6065f --- /dev/null +++ b/kadai1/dshirae/README.md @@ -0,0 +1,43 @@ +# 開発内容 + +## 課題1 + +画像変換コマンドを作ろう + +### 次の仕様を満たすコマンドを作って下さい +- ディレクトリを指定する +- 指定したディレクトリ以下のJPGファイルをPNGに変換(デフォルト) +- ディレクトリ以下は再帰的に処理する +- 変換前と変換後の画像形式を指定できる(オプション) + +### 以下を満たすように開発してください +- mainパッケージと分離する +- 自作パッケージと標準パッケージと準標準パッケージのみ使う +- 準標準パッケージ:golang.org/x以下のパッケージ +- ユーザ定義型を作ってみる +- GoDocを生成してみる + +## 提出内容 + +`$ chpics dirname [-i=imgs -o=imgs]` + +### default動作 +指定されたdirectory内に含まれる全てのjpg画像をpng画像に変換する + +### option +- imgs : jpg/png/gif + +### + +## 課題の提出方法 + +``` +1回目の課題を提出する場合は次のようにコードを書いて下さい。 + +ブランチ名をkadai1-tenntennのようにする +kadai1/tenntennのようにディレクトリを作る +READMEに説明や文章による課題の回答を書く +PRを送る + +※FBには時間がかかる可能性があります。 +``` diff --git a/kadai1/dshirae/chimgs.go b/kadai1/dshirae/chimgs.go new file mode 100644 index 0000000..65f9a87 --- /dev/null +++ b/kadai1/dshirae/chimgs.go @@ -0,0 +1,35 @@ +package main + +import ( + "flag" + "fmt" + "os" + "path/filepath" + + "./convert" +) + +// e.g.) chimgs dir [-i=jpg/png] [-o=png/jpg] +func main() { + + var ( + src = flag.String("i", "jpeg", "string flag") + dest = flag.String("o", "png", "string flag") + ) + flag.Parse() + + if (flag.NArg() == 0) && (flag.NFlag() == 0) { + fmt.Println("Usage: chimgs DIR [-i=imgext] [-o=imgext]") + os.Exit(1) + } + dirname := flag.Arg(0) + + filepath.Walk(dirname, + func(path string, info os.FileInfo, err error) error { + if info.IsDir() { + return nil + } + err = convert.PixFile(path, *src, *dest) + return err + }) +} diff --git a/kadai1/dshirae/convert/PixFile.go b/kadai1/dshirae/convert/PixFile.go new file mode 100644 index 0000000..13431ce --- /dev/null +++ b/kadai1/dshirae/convert/PixFile.go @@ -0,0 +1,71 @@ +package convert + +/* +画像変換コマンド + +次の仕様を満たすコマンドを作って下さい + + ディレクトリを指定する + 指定したディレクトリ以下のJPGファイルをPNGに変換(デフォルト) + ディレクトリ以下は再帰的に処理する + 変換前と変換後の画像形式を指定できる(オプション) + +以下を満たすように開発してください + + mainパッケージと分離する + 自作パッケージと標準パッケージと準標準パッケージのみ使う + 準標準パッケージ:golang.org/x以下のパッケージ + ユーザ定義型を作ってみる + GoDocを生成してみる +*/ + +import ( + "image" + "image/gif" + "image/jpeg" + "image/png" + "os" +) + +// picture file 変換関数 +func PixFile(org string, src string, dest string) error { + + // open file + file, err := os.Open(org) + if err != nil { + return err + } + defer file.Close() + + // image reading. + img, format, err := image.Decode(file) + if err != nil { + // not image + return err + } + + // 元ファイルが指定外ならスキップ + if format != src { + return nil + } + + // 出力先ファイル + savefile, err := os.Create(org + "." + dest) + if err != nil { + return err + } + defer savefile.Close() + + switch dest { + case "jpg", "jpeg": + opts := &jpeg.Options{} + jpeg.Encode(savefile, img, opts) + case "png": + png.Encode(savefile, img) + case "gif": + opts := &gif.Options{} + gif.Encode(savefile, img, opts) + } + + return nil +} From 2bfdc8f20b7b51ffb0c0c2499ce6285e5dbf970f Mon Sep 17 00:00:00 2001 From: dshirae Date: Mon, 10 Jun 2019 18:30:34 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=E8=AA=B2=E9=A1=8C2=E6=8F=90=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai2/dshirae/README.md | 23 ++++++++ kadai2/dshirae/chimgs.go | 36 ++++++++++++ kadai2/dshirae/convert/PixFile.go | 77 ++++++++++++++++++++++++++ kadai2/dshirae/convert/PixFile_test.go | 28 ++++++++++ 4 files changed, 164 insertions(+) create mode 100644 kadai2/dshirae/README.md create mode 100644 kadai2/dshirae/chimgs.go create mode 100644 kadai2/dshirae/convert/PixFile.go create mode 100644 kadai2/dshirae/convert/PixFile_test.go diff --git a/kadai2/dshirae/README.md b/kadai2/dshirae/README.md new file mode 100644 index 0000000..db32829 --- /dev/null +++ b/kadai2/dshirae/README.md @@ -0,0 +1,23 @@ +# 課題2 + +## テストを書いてみよう + +### 1回目の宿題のテストを作ってみてください +- テストのしやすさを考えてリファクタリングしてみる + 課題1に実装しなかった、`ユーザ定義型を作ってみる` を実装した +- テストのカバレッジを取ってみる + 課題提出時コードにて80% のカバレッジ + `$ go test -coverprofile=cover.out -run ''` + `$ go tool cover -html=cover.out` +- テーブル駆動テストを行う + 実装しました +- テストヘルパーを作ってみる + 実装したが、うまく使えてない気がする。(再調査) + +## io.Readerとio.Writer + +### io.Readerとio.Writerについて調べてみよう +- 標準パッケージでどのように使われているか + [WIP] +- io.Readerとio.Writerがあることでどういう利点があるのか具体例を挙げて考えてみる + 抽象化された事でOS間の違いが吸収される。標準出力(console)など diff --git a/kadai2/dshirae/chimgs.go b/kadai2/dshirae/chimgs.go new file mode 100644 index 0000000..303a0e0 --- /dev/null +++ b/kadai2/dshirae/chimgs.go @@ -0,0 +1,36 @@ +package main + +import ( + "flag" + "fmt" + "os" + "path/filepath" + + "./convert" +) + +// e.g.) chimgs dir [-i=jpg/png] [-o=png/jpg] +func main() { + + var pix convert.PixConv + + pix.Src = flag.String("i", "jpeg", "string flag") + pix.Dest = flag.String("o", "png", "string flag") + flag.Parse() + + if (flag.NArg() == 0) && (flag.NFlag() == 0) { + fmt.Println("Usage: chimgs DIR [-i=imgext] [-o=imgext]") + os.Exit(1) + } + dirname := flag.Arg(0) + + filepath.Walk(dirname, + func(path string, info os.FileInfo, err error) error { + if info.IsDir() { + return nil + } + pix.Path = path + err = convert.PixFile(data) + return err + }) +} diff --git a/kadai2/dshirae/convert/PixFile.go b/kadai2/dshirae/convert/PixFile.go new file mode 100644 index 0000000..dd8f404 --- /dev/null +++ b/kadai2/dshirae/convert/PixFile.go @@ -0,0 +1,77 @@ +package convert + +/* +画像変換コマンド + +次の仕様を満たすコマンドを作って下さい + + ディレクトリを指定する + 指定したディレクトリ以下のJPGファイルをPNGに変換(デフォルト) + ディレクトリ以下は再帰的に処理する + 変換前と変換後の画像形式を指定できる(オプション) + +以下を満たすように開発してください + + mainパッケージと分離する + 自作パッケージと標準パッケージと準標準パッケージのみ使う + 準標準パッケージ:golang.org/x以下のパッケージ + ユーザ定義型を作ってみる + GoDocを生成してみる +*/ + +import ( + "image" + "image/gif" + "image/jpeg" + "image/png" + "os" +) + +type PixConv struct { + Path string + Src string + Dest string +} + +// picture file 変換関数 +func PixFile(filedata PixConv) error { + + // open file + file, err := os.Open(filedata.Path) + if err != nil { + return err + } + defer file.Close() + + // image reading. + img, format, err := image.Decode(file) + if err != nil { + // not image + return err + } + + // 元ファイルが指定外ならスキップ + if format != filedata.Src { + return nil + } + + // 出力先ファイル + savefile, err := os.Create(filedata.Path + "." + filedata.Dest) + if err != nil { + return err + } + defer savefile.Close() + + switch filedata.Dest { + case "jpg", "jpeg": + opts := &jpeg.Options{} + jpeg.Encode(savefile, img, opts) + case "png": + png.Encode(savefile, img) + case "gif": + opts := &gif.Options{} + gif.Encode(savefile, img, opts) + } + + return nil +} diff --git a/kadai2/dshirae/convert/PixFile_test.go b/kadai2/dshirae/convert/PixFile_test.go new file mode 100644 index 0000000..6253c95 --- /dev/null +++ b/kadai2/dshirae/convert/PixFile_test.go @@ -0,0 +1,28 @@ +package convert + +import "testing" + +// picture file 変換テスト +func TestPixFile(t *testing.T) { + + testTables := []PixConv{ + {"./test.jpg", "jpeg", "png"}, + {"./test.jpg", "jpeg", "gif"}, + {"./test.png", "png", "jpeg"}, + {"./test.png", "png", "gif"}, + {"./test.gif", "gif", "jpeg"}, + {"./test.gif", "gif", "png"}, + } + + for _, testpix := range testTables { + testPixFile(t, testpix) + } +} + +func testPixFile(t *testing.T, testpix PixConv) { + t.Helper() + err := PixFile(testpix) + if err != nil { + t.Fatalf("failed test %#v", err) + } +} From 8c5407e96a0a7c08446911f121f615b10030fab1 Mon Sep 17 00:00:00 2001 From: dshirae Date: Tue, 18 Jun 2019 09:38:17 +0900 Subject: [PATCH 3/3] kadai3-1(typing) --- kadai3-1/dshirae/README.md | 13 ++++++ kadai3-1/dshirae/test.txt | 26 ++++++++++++ kadai3-1/dshirae/typing.go | 84 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100755 kadai3-1/dshirae/README.md create mode 100755 kadai3-1/dshirae/test.txt create mode 100755 kadai3-1/dshirae/typing.go diff --git a/kadai3-1/dshirae/README.md b/kadai3-1/dshirae/README.md new file mode 100755 index 0000000..a572dda --- /dev/null +++ b/kadai3-1/dshirae/README.md @@ -0,0 +1,13 @@ +# 課題3-1 + +## タイピングゲームを作ろう + +- 標準出力に英単語を出す(出すものは自由) +- 標準入力から1行受け取る +- 制限時間内に何問解けたか表示する + +### ヒント +- 制限時間にはtime.After関数を用いる + - context.WithTimeoutでもよい +- select構文を用いる + - 制限時間と入力を同時に待つ diff --git a/kadai3-1/dshirae/test.txt b/kadai3-1/dshirae/test.txt new file mode 100755 index 0000000..83443ee --- /dev/null +++ b/kadai3-1/dshirae/test.txt @@ -0,0 +1,26 @@ +animal +bird +cat +dog +eagle +frog +giraffe +horse +iguana +jaguar +koala +leopard +monkey +n +owl +panda +quail +raccoon +skunk +tiger +u +viper +wolf +x +yak +zebra \ No newline at end of file diff --git a/kadai3-1/dshirae/typing.go b/kadai3-1/dshirae/typing.go new file mode 100755 index 0000000..b13c0b4 --- /dev/null +++ b/kadai3-1/dshirae/typing.go @@ -0,0 +1,84 @@ +package main + +import ( + "bufio" + "flag" + "fmt" + "os" + "time" +) + +// result +type resultList struct { + questions int + collects int +} + +// test slice +func makeQuestionsList(file string) ([]string, error) { + var list []string + + f, err := os.Open(file) + if err != nil { + return nil, err + } + defer f.Close() + + s := bufio.NewScanner(f) + for s.Scan() { + list = append(list, s.Text()) + } + return list, nil +} + +// main +func main() { + qtime := flag.Int("t", 10, "set second") + qfile := flag.String("f", "test.txt", "word list") + flag.Parse() + + // test file open + qlist, err := makeQuestionsList(*qfile) + if err != nil { + fmt.Printf("file not exist:%s", *qfile) + return + } + + // 結果を準備 + rslt := &resultList{} + timeup := time.After(time.Duration(*qtime) * time.Second) + keyin := make(chan string) + + // keyboard input + go func() { + s := bufio.NewScanner(os.Stdin) + for s.Scan() { + keyin <- s.Text() + } + }() + + fmt.Printf("TYPING start\n\n") + + // check +LOOP: + for _, question := range qlist { + // Disp question + rslt.questions++ + fmt.Printf("-> %s\n", question) + + select { + case in := <-keyin: + if in == question { + rslt.collects++ + } + case <-timeup: + fmt.Println("Time UP!\n")ß + break LOOP + } + } + + fmt.Println("Typing Result\n") + fmt.Printf("- TOTAL : %d\n", rslt.questions) + fmt.Printf("- COLLECT: %d\n", rslt.collects) + fmt.Printf("- Second : %d\n", *qtime) +}