diff --git a/README.md b/README.md index 6503a43..baa4eb1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # #1 Gopher道場 + #1 Gopher道場用のリポジトリです。 connpass: https://mercari.connpass.com/event/83139/ @@ -7,9 +8,9 @@ connpass: https://mercari.connpass.com/event/83139/ 1回目の課題を提出する場合は次のようにコードを書いて下さい。 -* ブランチ名を`kadai1-tenntenn`のようにする -* `kadai1/tenntenn`のようにディレクトリを作る -* READMEに説明や文章による課題の回答を書く -* PRを送る - +- ブランチ名をkadai1-tenntennのようにする +- kadai1/tenntennのようにディレクトリを作る +- READMEに説明や文章による課題の回答を書く +- PRを送る + ※FBには時間がかかる可能性があります。 diff --git a/kadai1/go.sum b/kadai1/go.sum new file mode 100644 index 0000000..e69de29 diff --git a/kadai1/supermarine1377/README.md b/kadai1/supermarine1377/README.md new file mode 100644 index 0000000..65a241c --- /dev/null +++ b/kadai1/supermarine1377/README.md @@ -0,0 +1,13 @@ +# はじめに + +これは、Gopher道場 課題1の回答です。 + +# 使い方 + +`./main {jpgファイルを格納したディレクトリ名}` + +とすると、指定したディレクトリ上のjpgファイルを再帰的に検索し、pngファイルに変換します。 + +`./main {jpgファイルを格納したディレクトリ名} {画像拡張子名}` + +とすると、jpgファイルを指定した拡張子ファイルに変換します。 diff --git a/kadai1/supermarine1377/go.mod b/kadai1/supermarine1377/go.mod new file mode 100644 index 0000000..ac0a3ef --- /dev/null +++ b/kadai1/supermarine1377/go.mod @@ -0,0 +1,3 @@ +module supermarine1377 + +go 1.17 diff --git a/kadai1/supermarine1377/images/.DS_Store b/kadai1/supermarine1377/images/.DS_Store new file mode 100644 index 0000000..812e137 Binary files /dev/null and b/kadai1/supermarine1377/images/.DS_Store differ diff --git a/kadai1/supermarine1377/images/Cat03.jpg b/kadai1/supermarine1377/images/Cat03.jpg new file mode 100644 index 0000000..a588450 Binary files /dev/null and b/kadai1/supermarine1377/images/Cat03.jpg differ diff --git a/kadai1/supermarine1377/images/Convert-JPG-to-PNG-Step-20.jpg b/kadai1/supermarine1377/images/Convert-JPG-to-PNG-Step-20.jpg new file mode 100644 index 0000000..3dd9fce Binary files /dev/null and b/kadai1/supermarine1377/images/Convert-JPG-to-PNG-Step-20.jpg differ diff --git a/kadai1/supermarine1377/images/inside/Cat04.jpg b/kadai1/supermarine1377/images/inside/Cat04.jpg new file mode 100644 index 0000000..a588450 Binary files /dev/null and b/kadai1/supermarine1377/images/inside/Cat04.jpg differ diff --git "a/kadai1/supermarine1377/images/\343\203\200\343\202\246\343\203\263\343\203\255\343\203\274\343\203\211.png" "b/kadai1/supermarine1377/images/\343\203\200\343\202\246\343\203\263\343\203\255\343\203\274\343\203\211.png" new file mode 100644 index 0000000..9fc083f Binary files /dev/null and "b/kadai1/supermarine1377/images/\343\203\200\343\202\246\343\203\263\343\203\255\343\203\274\343\203\211.png" differ diff --git a/kadai1/supermarine1377/main b/kadai1/supermarine1377/main new file mode 100755 index 0000000..9fdf453 Binary files /dev/null and b/kadai1/supermarine1377/main differ diff --git a/kadai1/supermarine1377/main.go b/kadai1/supermarine1377/main.go new file mode 100644 index 0000000..9de4c20 --- /dev/null +++ b/kadai1/supermarine1377/main.go @@ -0,0 +1,56 @@ +/* This command convert jpg image to png, gif, tif, etc. + +Command options + +- Directory name + +You must place jpg images in this directory. All jpg image in this direcotory is to be converted. + +- Extenstion + +A extension name you want images to converted. + +Example + +./main images png + +*/ +package main + +import ( + "fmt" + "io/ioutil" + "log" + "os" + "supermarine1377/processes" +) + +func main() { + var dirName string + var extention string + args := os.Args + if len(args) <= 1 { + fmt.Println("no argument passed, exiting...") + os.Exit(1) + } + dirName = args[1] + if len(args) >= 3 { + extention = args[2] + } else { + extention = "png" + } + if _, err := ioutil.ReadDir(dirName); err != nil { + log.Printf("no dir %s found, exiting...", dirName) + os.Exit(1) + } + images, err := processes.GetImages(dirName) + if err != nil { + log.Println("error occured during reading images", err) + } + for _, image := range images { + if err := processes.Convert(image, extention); err != nil { + log.Println(err) + } + log.Printf("finished converting %s", image.FileName) + } +} diff --git a/kadai1/supermarine1377/processes/convert.go b/kadai1/supermarine1377/processes/convert.go new file mode 100644 index 0000000..83dfc65 --- /dev/null +++ b/kadai1/supermarine1377/processes/convert.go @@ -0,0 +1,83 @@ +// Package processes implements converting JPG image. +package processes + +import ( + "errors" + "image" + "image/jpeg" + "log" + "os" + "strings" + "supermarine1377/types" +) + +// convert a Myimage (see types package) passed as a argumaent. +func Convert(arg types.Myimage, extension string) error { + log.Printf("started to convert %s to %s", arg.FileName, extension) + + if arg.Extention != "jpg" { + err := errors.New(arg.FileName + "is not .jpg") + return err + } + reader, err := myopen(arg.FileName, arg.Path) + if err != nil { + return err + } + + m, err := mydecode(arg.FileName, reader) + if err != nil { + return err + } + + if err := myencode(m, arg.FileName, extension); err != nil { + return err + } + + return nil +} + +func myopen(name string, path string) (*os.File, error) { + log.Printf("opening %s", name) + reader, err := os.Open(path) + if err != nil { + return nil, err + } + return reader, err +} + +func mydecode(name string, reader *os.File) (image.Image, error) { + log.Printf("decoding %s", name) + m, _, err := image.Decode(reader) + if err != nil { + return nil, err + } + return m, nil +} + +func myencode(m image.Image, name string, extension string) error { + log.Printf("encoding %s to %s", name, extension) + new, err := newname(name, extension) + if err != nil { + return err + } + c, err := os.Create(new) + defer c.Close() + if err != nil { + return err + } + jpeg.Encode(c, m, &jpeg.Options{Quality: 100}) + + return nil +} + +func newname(old string, extenstion string) (string, error) { + log.Printf("renaming %s", old) + var result string + var position = strings.LastIndex(old, ".") + if position == -1 { + err := errors.New("This name has no dot") + return result, err + } + result = old[0:position] + "." + extenstion + return result, nil +} diff --git a/kadai1/supermarine1377/processes/get-images.go b/kadai1/supermarine1377/processes/get-images.go new file mode 100644 index 0000000..067945d --- /dev/null +++ b/kadai1/supermarine1377/processes/get-images.go @@ -0,0 +1,40 @@ +package processes + +import ( + "io/fs" + "path/filepath" + "regexp" + "supermarine1377/types" +) + +// implements getting image as a slice of Myimage (see types package). +func GetImages(dirName string) ([]types.Myimage, error) { + var images []types.Myimage + err := filepath.WalkDir(dirName, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() { + return nil + } + var image types.Myimage + name := d.Name() + + match, err := regexp.MatchString("..+jpg", name) + if err != nil { + return err + } + if !match { + return nil + } + image.FileName = name + image.Path = path + image.Extention = "jpg" + + images = append(images, image) + + return nil + }) + + return images, err +} diff --git a/kadai1/supermarine1377/types/image.go b/kadai1/supermarine1377/types/image.go new file mode 100644 index 0000000..77a9ff2 --- /dev/null +++ b/kadai1/supermarine1377/types/image.go @@ -0,0 +1,10 @@ +/* +Package types implements Myimage type, which is used by other packages to represent a image file. +*/ +package types + +type Myimage struct { + FileName string + Path string + Extention string +} diff --git a/kadai1/toshi0607/extchanger/README.md b/kadai1/toshi0607/extchanger/README.md deleted file mode 100644 index 72eedb2..0000000 --- a/kadai1/toshi0607/extchanger/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# コマンドの実行 - -``` -$ cd $GOPATH/src/github.com/toshi0607/gopher-dojo/extchanger/ -$ go run main.go extension(from) extension(to) sourcedir - -or - -$ extchanger extension(from) extension(to) sourcedir -``` - -# GoDocの確認 - -``` -$ godoc -http=:6060 -$ curl http://localhost:6060/pkg/github.com/toshi0607/gopher-dojo/extchanger/converter/ -``` \ No newline at end of file diff --git a/kadai1/toshi0607/extchanger/converter/converter.go b/kadai1/toshi0607/extchanger/converter/converter.go deleted file mode 100644 index f8f113b..0000000 --- a/kadai1/toshi0607/extchanger/converter/converter.go +++ /dev/null @@ -1,135 +0,0 @@ -// Package converter is for image transformation. -package converter - -import ( - "os" - "image" - "fmt" - "image/jpeg" - "image/png" - "io" - "strings" - "path/filepath" - "io/ioutil" - "strconv" - "errors" -) - -// ConvertExt converts image files to specified extension in the src directory. -func ConvertExt(src, from, to string) (int, error) { - from = strings.ToLower(from) - to = strings.ToLower(to) - - if err := validateArgs(from, to); err != nil { - return 0, err - } - - fileNames := make(chan string) - go func() { - walkDir(src, from, fileNames) - close(fileNames) - }() - - fileCount := 0 - uniqueCheck := make(map[string]int) - for fn := range fileNames { - file, err := os.Open(fn) - if err != nil { - return fileCount, err - } - defer file.Close() - img, _, err := image.Decode(file) - if err != nil { - return fileCount, err - } - - fileName := fileName(fn) - if _, ok := uniqueCheck[fileName]; !ok { - uniqueCheck[fileName] = 0 - } else { - uniqueCheck[fileName]++ - fileName = fileName + "(" + strconv.Itoa(uniqueCheck[fileName]) + ")" - } - - dstfile, err := os.Create(fmt.Sprintf("output/%s.%s", fileName, to)) - if err != nil { - return fileCount, err - } - defer dstfile.Close() - - switch to { - case "jpeg", "jpg": - err = jpeg.Encode(dstfile, img, nil) - case "png": - err = png.Encode(dstfile, img) - } - if err != nil { - return fileCount, err - } - - _, err = io.Copy(dstfile, file) - if err != nil { - return fileCount, err - } - fileCount++ - } - return fileCount, nil -} - -func walkDir(dir, ext string, fileNames chan<- string) { - ue := strings.ToUpper(ext) - for _, entry := range dirents(dir) { - if !strings.HasSuffix(entry.Name(), ext) && - !strings.HasSuffix(entry.Name(), ue) && - !entry.IsDir() { - continue - } - if entry.IsDir() { - subdir := filepath.Join(dir, entry.Name()) - walkDir(subdir, ext, fileNames) - } else { - fileNames <- filepath.Join(dir, entry.Name()) - } - } -} - -func dirents(dir string) ([]os.FileInfo) { - entries, err := ioutil.ReadDir(dir) - if err != nil { - return nil - } - return entries -} - -func fileName(path string) string { - return filepath.Base(path[:len(path)-len(filepath.Ext(path))]) -} - -func validateArgs(from, to string) error { - ae := allowedExt{"jpg", "jpeg", "png"} - - if to == from { - err := errors.New("converter: from and to should be different") - return err - } - if !ae.contains(to) { - return fmt.Errorf("converter: from should be %s, your to is %s", ae, to) - } - if !ae.contains(from) { - return fmt.Errorf("converter: from should be %s, your to is %s", ae, from) - } - - return nil -} - -type allowedExt []string - -func (ae allowedExt) contains(item string) bool { - set := make(map[string]struct{}, len(ae)) - for _, s := range ae { - set[s] = struct{}{} - } - - _, ok := set[item] - return ok -} diff --git a/kadai1/toshi0607/extchanger/extchanger b/kadai1/toshi0607/extchanger/extchanger deleted file mode 100755 index fdff3df..0000000 Binary files a/kadai1/toshi0607/extchanger/extchanger and /dev/null differ diff --git a/kadai1/toshi0607/extchanger/main.go b/kadai1/toshi0607/extchanger/main.go deleted file mode 100644 index 506f44f..0000000 --- a/kadai1/toshi0607/extchanger/main.go +++ /dev/null @@ -1,56 +0,0 @@ -package main - -import ( - "os" - "flag" - "io" - "github.com/toshi0607/gopher-dojo/extchanger/converter" - "fmt" -) - -type CLI struct { - outStream, errStream io.Writer -} - -func main() { - cli := &CLI{outStream: os.Stdout, errStream: os.Stderr} - os.Exit(cli.Run()) -} - -func (c *CLI) Run() int { - flag.Usage = usage - flag.Parse() - if len(os.Args[1:]) != 3 { - usage() - return 1 - } - - if err := os.MkdirAll("output", 0777); err != nil { - fmt.Fprintln(c.errStream, err) - return 1 - } - from := flag.Arg(0) - to := flag.Arg(1) - srcdir := flag.Arg(2) - - count, err := converter.ConvertExt(srcdir, from, to) - if err != nil { - fmt.Fprint(c.errStream, err) - return 1 - } - if count == 0 { - fmt.Println("Files with extension you specified not found") - } else { - fmt.Printf("%d files converted! see under ./output\n", count) - } - - return 0 -} - -func usage() { - fmt.Println("Usage:") - fmt.Println(" main extension(from) extension(to) targetdirectory") - fmt.Println("") - fmt.Println("All of the args are requred.") - flag.PrintDefaults() -} \ No newline at end of file diff --git a/kadai1/toshi0607/extchanger/sample/dojo1.png b/kadai1/toshi0607/extchanger/sample/dojo1.png deleted file mode 100644 index 065ae41..0000000 Binary files a/kadai1/toshi0607/extchanger/sample/dojo1.png and /dev/null differ diff --git a/kadai1/toshi0607/extchanger/sample/dojo2.png b/kadai1/toshi0607/extchanger/sample/dojo2.png deleted file mode 100644 index 065ae41..0000000 Binary files a/kadai1/toshi0607/extchanger/sample/dojo2.png and /dev/null differ diff --git a/kadai1/toshi0607/extchanger/sample/sample2/dojo3.png b/kadai1/toshi0607/extchanger/sample/sample2/dojo3.png deleted file mode 100644 index 065ae41..0000000 Binary files a/kadai1/toshi0607/extchanger/sample/sample2/dojo3.png and /dev/null differ diff --git a/kadai1/toshi0607/extchanger/sample/sample2/dojo5.jpg b/kadai1/toshi0607/extchanger/sample/sample2/dojo5.jpg deleted file mode 100644 index 647e2cd..0000000 Binary files a/kadai1/toshi0607/extchanger/sample/sample2/dojo5.jpg and /dev/null differ diff --git a/kadai1/toshi0607/extchanger/sample/sample2/sample3/dojo4.png b/kadai1/toshi0607/extchanger/sample/sample2/sample3/dojo4.png deleted file mode 100644 index 065ae41..0000000 Binary files a/kadai1/toshi0607/extchanger/sample/sample2/sample3/dojo4.png and /dev/null differ diff --git a/kadai1/toshi0607/extchanger/sample/sample4/dojo2.png b/kadai1/toshi0607/extchanger/sample/sample4/dojo2.png deleted file mode 100644 index 065ae41..0000000 Binary files a/kadai1/toshi0607/extchanger/sample/sample4/dojo2.png and /dev/null differ diff --git a/kadai1/toshi0607/extchanger/sample/sample4/dojo3.jpg b/kadai1/toshi0607/extchanger/sample/sample4/dojo3.jpg deleted file mode 100644 index 647e2cd..0000000 Binary files a/kadai1/toshi0607/extchanger/sample/sample4/dojo3.jpg and /dev/null differ diff --git a/kadai1/toshi0607/extchanger/sample/sample4/dojo5.png b/kadai1/toshi0607/extchanger/sample/sample4/dojo5.png deleted file mode 100644 index 065ae41..0000000 Binary files a/kadai1/toshi0607/extchanger/sample/sample4/dojo5.png and /dev/null differ diff --git a/kadai1/toshi0607/extchanger/sample/sample4/sample5/dojo6.PNG b/kadai1/toshi0607/extchanger/sample/sample4/sample5/dojo6.PNG deleted file mode 100644 index 065ae41..0000000 Binary files a/kadai1/toshi0607/extchanger/sample/sample4/sample5/dojo6.PNG and /dev/null differ