From eb63323a3dbbb1df3169b846c83d63d001d178da Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Thu, 16 Sep 2021 23:59:17 +0900 Subject: [PATCH 01/19] :tada: Initial Commit --- kadai1/hiroya-w/.gitignore | 1 + kadai1/hiroya-w/README.md | 1 + kadai1/hiroya-w/go.mod | 3 +++ 3 files changed, 5 insertions(+) create mode 100644 kadai1/hiroya-w/.gitignore create mode 100644 kadai1/hiroya-w/README.md create mode 100644 kadai1/hiroya-w/go.mod diff --git a/kadai1/hiroya-w/.gitignore b/kadai1/hiroya-w/.gitignore new file mode 100644 index 00000000..e660fd93 --- /dev/null +++ b/kadai1/hiroya-w/.gitignore @@ -0,0 +1 @@ +bin/ diff --git a/kadai1/hiroya-w/README.md b/kadai1/hiroya-w/README.md new file mode 100644 index 00000000..b71e4765 --- /dev/null +++ b/kadai1/hiroya-w/README.md @@ -0,0 +1 @@ +# 課題1 diff --git a/kadai1/hiroya-w/go.mod b/kadai1/hiroya-w/go.mod new file mode 100644 index 00000000..9945cf1a --- /dev/null +++ b/kadai1/hiroya-w/go.mod @@ -0,0 +1,3 @@ +module imgconv + +go 1.17 From c3e74536458fb02079b6f06ec54f208664a12e87 Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Thu, 16 Sep 2021 23:59:44 +0900 Subject: [PATCH 02/19] :sparkles: Parse command line arguments. --- kadai1/hiroya-w/Makefile | 11 +++++++++++ kadai1/hiroya-w/README.md | 10 ++++++++++ kadai1/hiroya-w/main.go | 31 +++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 kadai1/hiroya-w/Makefile create mode 100644 kadai1/hiroya-w/main.go diff --git a/kadai1/hiroya-w/Makefile b/kadai1/hiroya-w/Makefile new file mode 100644 index 00000000..7c2f285f --- /dev/null +++ b/kadai1/hiroya-w/Makefile @@ -0,0 +1,11 @@ +.PHONY: build +build: + go build -o bin/imgconf main.go + +.PHONY: run +run: + go run main.go + +.PHONY: clean +clean: + rm -rf bin/main diff --git a/kadai1/hiroya-w/README.md b/kadai1/hiroya-w/README.md index b71e4765..39bc32de 100644 --- a/kadai1/hiroya-w/README.md +++ b/kadai1/hiroya-w/README.md @@ -1 +1,11 @@ # 課題1 + +## usage + +``` +対応拡張子: jpg, png +usage: imgconv [options] + + --input-type=TYPE [jpg|png] (default: jpg) + --output-type=TYPE [jpg|png] (default: png) +``` diff --git a/kadai1/hiroya-w/main.go b/kadai1/hiroya-w/main.go new file mode 100644 index 00000000..df5f9997 --- /dev/null +++ b/kadai1/hiroya-w/main.go @@ -0,0 +1,31 @@ +package main + +import ( + "flag" + "fmt" + "log" +) + +var ( + inputType string + outputType string +) + +func init() { + flag.StringVar(&inputType, "input-type", "jpg", "input type") + flag.StringVar(&outputType, "output-type", "png", "output type") +} + +func validateArgs() error { + flag.Parse() + if flag.Arg(0) == "" { + return fmt.Errorf("directory is required") + } + return nil +} + +func main() { + if err := validateArgs(); err != nil { + log.Fatalln(err) + } +} From b5aee43a10473c03a631920108107d9cb9f948b3 Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Fri, 17 Sep 2021 22:36:39 +0900 Subject: [PATCH 03/19] :+1: Validate inputType, outputType --- kadai1/hiroya-w/main.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/kadai1/hiroya-w/main.go b/kadai1/hiroya-w/main.go index df5f9997..04093ccf 100644 --- a/kadai1/hiroya-w/main.go +++ b/kadai1/hiroya-w/main.go @@ -3,12 +3,14 @@ package main import ( "flag" "fmt" + "imgconv/imgconv" "log" ) var ( inputType string outputType string + directory string ) func init() { @@ -16,11 +18,38 @@ func init() { flag.StringVar(&outputType, "output-type", "png", "output type") } +func validateType(t string) error { + switch t { + case "jpg": + fallthrough + case "png": + return nil + default: + return fmt.Errorf("invalid type: %s", t) + } +} + func validateArgs() error { flag.Parse() + + if inputType == outputType { + return fmt.Errorf("input and output type can't be the same") + } + + if err := validateType(inputType); err != nil { + return err + } + + if err := validateType(outputType); err != nil { + return err + } + if flag.Arg(0) == "" { return fmt.Errorf("directory is required") + } else { + directory = flag.Arg(0) } + return nil } From 61709bb8a228b977c37f8d6df1d43ce81beaff1f Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Fri, 17 Sep 2021 23:37:00 +0900 Subject: [PATCH 04/19] :sparkles: Impliment Cenverter function --- kadai1/hiroya-w/imgconv/imgconv.go | 20 ++++++++++++++++++++ kadai1/hiroya-w/main.go | 4 ++++ 2 files changed, 24 insertions(+) create mode 100644 kadai1/hiroya-w/imgconv/imgconv.go diff --git a/kadai1/hiroya-w/imgconv/imgconv.go b/kadai1/hiroya-w/imgconv/imgconv.go new file mode 100644 index 00000000..fb3cca3d --- /dev/null +++ b/kadai1/hiroya-w/imgconv/imgconv.go @@ -0,0 +1,20 @@ +package imgconv + +import ( + "fmt" + "os" + "path/filepath" +) + +func Converter(directory, inputType, outputType string) error { + fileNames, err := getFiles(directory, inputType) + if err != nil { + return err + } + + for _, file := range fileNames { + fmt.Println(file) + } + return nil +} + diff --git a/kadai1/hiroya-w/main.go b/kadai1/hiroya-w/main.go index 04093ccf..c6a2f1cc 100644 --- a/kadai1/hiroya-w/main.go +++ b/kadai1/hiroya-w/main.go @@ -57,4 +57,8 @@ func main() { if err := validateArgs(); err != nil { log.Fatalln(err) } + + if err := imgconv.Converter(directory, inputType, outputType); err != nil { + log.Fatalln(err) + } } From c7e88d1e1e19ef18598ca591b721963c2142c573 Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Fri, 17 Sep 2021 23:37:24 +0900 Subject: [PATCH 05/19] :sparkles: Implement getFiles function --- kadai1/hiroya-w/imgconv/imgconv.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/kadai1/hiroya-w/imgconv/imgconv.go b/kadai1/hiroya-w/imgconv/imgconv.go index fb3cca3d..16107864 100644 --- a/kadai1/hiroya-w/imgconv/imgconv.go +++ b/kadai1/hiroya-w/imgconv/imgconv.go @@ -18,3 +18,25 @@ func Converter(directory, inputType, outputType string) error { return nil } +func getFiles(directory, inputType string) ([]string, error) { + var fileNames []string + err := filepath.Walk(directory, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if info.IsDir() { + return nil + } + if filepath.Ext(path) == "."+inputType { + fileNames = append(fileNames, path) + } + return nil + }) + + if err != nil { + return nil, err + } + + return fileNames, nil +} + From 33dd0ef2695dabc97e6e36efa10dce63be54a06a Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Fri, 17 Sep 2021 23:38:01 +0900 Subject: [PATCH 06/19] :+1: Modify run target --- kadai1/hiroya-w/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kadai1/hiroya-w/Makefile b/kadai1/hiroya-w/Makefile index 7c2f285f..3581da57 100644 --- a/kadai1/hiroya-w/Makefile +++ b/kadai1/hiroya-w/Makefile @@ -4,7 +4,7 @@ build: .PHONY: run run: - go run main.go + ./bin/imgconf -input-type=png -output-type=jpg testdata .PHONY: clean clean: From f8d11db018b2414eca0c11179c203f948e5bad41 Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Fri, 17 Sep 2021 23:38:20 +0900 Subject: [PATCH 07/19] :+1: ADD DS_Store --- kadai1/hiroya-w/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/kadai1/hiroya-w/.gitignore b/kadai1/hiroya-w/.gitignore index e660fd93..00b41c66 100644 --- a/kadai1/hiroya-w/.gitignore +++ b/kadai1/hiroya-w/.gitignore @@ -1 +1,2 @@ bin/ +.DS_Store From ef951e8f3999efe7de50fdb37a7b71fa72db1541 Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Sun, 19 Sep 2021 10:44:10 +0900 Subject: [PATCH 08/19] :+1: Check if directory exists. --- kadai1/hiroya-w/imgconv/imgconv.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/kadai1/hiroya-w/imgconv/imgconv.go b/kadai1/hiroya-w/imgconv/imgconv.go index 16107864..c0ffc709 100644 --- a/kadai1/hiroya-w/imgconv/imgconv.go +++ b/kadai1/hiroya-w/imgconv/imgconv.go @@ -20,6 +20,13 @@ func Converter(directory, inputType, outputType string) error { func getFiles(directory, inputType string) ([]string, error) { var fileNames []string + + if f, err := os.Stat(directory); err != nil { + return nil, err + } else if !f.IsDir() { + return nil, fmt.Errorf("%s is not a directory", directory) + } + err := filepath.Walk(directory, func(path string, info os.FileInfo, err error) error { if err != nil { return err From cc7634b9f2a0c12fd4f8c5f6a5add9c10987c49c Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Sun, 19 Sep 2021 10:50:39 +0900 Subject: [PATCH 09/19] :recycle: Change the var name to imgPaths --- kadai1/hiroya-w/imgconv/imgconv.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/kadai1/hiroya-w/imgconv/imgconv.go b/kadai1/hiroya-w/imgconv/imgconv.go index c0ffc709..19ec9605 100644 --- a/kadai1/hiroya-w/imgconv/imgconv.go +++ b/kadai1/hiroya-w/imgconv/imgconv.go @@ -7,19 +7,19 @@ import ( ) func Converter(directory, inputType, outputType string) error { - fileNames, err := getFiles(directory, inputType) + imgPaths, err := getFiles(directory, inputType) if err != nil { return err } - for _, file := range fileNames { - fmt.Println(file) + for _, path := range imgPaths { + fmt.Println(path) } return nil } func getFiles(directory, inputType string) ([]string, error) { - var fileNames []string + var imgPaths []string if f, err := os.Stat(directory); err != nil { return nil, err @@ -35,7 +35,7 @@ func getFiles(directory, inputType string) ([]string, error) { return nil } if filepath.Ext(path) == "."+inputType { - fileNames = append(fileNames, path) + imgPaths = append(imgPaths, path) } return nil }) @@ -44,6 +44,6 @@ func getFiles(directory, inputType string) ([]string, error) { return nil, err } - return fileNames, nil + return imgPaths, nil } From 8a189cca1bb1aff7e7c77f20779ceca3bdf2f429 Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Sun, 19 Sep 2021 11:34:52 +0900 Subject: [PATCH 10/19] :sparkles: Create convert function --- kadai1/hiroya-w/imgconv/imgconv.go | 59 +++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/kadai1/hiroya-w/imgconv/imgconv.go b/kadai1/hiroya-w/imgconv/imgconv.go index 19ec9605..71d7fde6 100644 --- a/kadai1/hiroya-w/imgconv/imgconv.go +++ b/kadai1/hiroya-w/imgconv/imgconv.go @@ -2,6 +2,10 @@ package imgconv import ( "fmt" + "image" + "image/gif" + "image/jpeg" + "image/png" "os" "path/filepath" ) @@ -13,7 +17,9 @@ func Converter(directory, inputType, outputType string) error { } for _, path := range imgPaths { - fmt.Println(path) + if err := convert(path, outputType); err != nil { + return err + } } return nil } @@ -47,3 +53,54 @@ func getFiles(directory, inputType string) ([]string, error) { return imgPaths, nil } +func convert(filePath, outputType string) error { + f, err := os.Open(filePath) + if err != nil { + return err + } + defer f.Close() + + img, _, err := image.Decode(f) + if err != nil { + return err + } + + fileName := filepath.Base(filePath) + output, err := os.Create(fileName + "." + outputType) + if err != nil { + return err + } + defer output.Close() + + switch outputType { + case "jpg", "jpeg": + return convertJPG(img, output) + case "png": + return convertPNG(img, output) + case "gif": + return convertGIF(img, output) + default: + return fmt.Errorf("%s is not a supported output type", outputType) + } +} + +func convertJPG(img image.Image, output *os.File) error { + if err := jpeg.Encode(output, img, nil); err != nil { + return err + } + return nil +} + +func convertPNG(img image.Image, output *os.File) error { + if err := png.Encode(output, img); err != nil { + return err + } + return nil +} + +func convertGIF(img image.Image, output *os.File) error { + if err := gif.Encode(output, img, nil); err != nil { + return err + } + return nil +} From 43b378daeea5d1a96849354dac5e4b8be0bcee4a Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Sun, 19 Sep 2021 11:36:14 +0900 Subject: [PATCH 11/19] :sparkles: Support for jpeg type --- kadai1/hiroya-w/main.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/kadai1/hiroya-w/main.go b/kadai1/hiroya-w/main.go index c6a2f1cc..1d3f40b8 100644 --- a/kadai1/hiroya-w/main.go +++ b/kadai1/hiroya-w/main.go @@ -20,9 +20,7 @@ func init() { func validateType(t string) error { switch t { - case "jpg": - fallthrough - case "png": + case "jpg", "jpeg", "png", "gif": return nil default: return fmt.Errorf("invalid type: %s", t) From f9dd8d7ab0457b9416107d3d79a8f0381bd2b001 Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Sun, 19 Sep 2021 15:55:50 +0900 Subject: [PATCH 12/19] :bug: Change the file extension. --- kadai1/hiroya-w/imgconv/imgconv.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/kadai1/hiroya-w/imgconv/imgconv.go b/kadai1/hiroya-w/imgconv/imgconv.go index 71d7fde6..4675d58f 100644 --- a/kadai1/hiroya-w/imgconv/imgconv.go +++ b/kadai1/hiroya-w/imgconv/imgconv.go @@ -65,8 +65,8 @@ func convert(filePath, outputType string) error { return err } - fileName := filepath.Base(filePath) - output, err := os.Create(fileName + "." + outputType) + outputPath := renameExt(filePath, outputType) + output, err := os.Create(outputPath) if err != nil { return err } @@ -84,6 +84,10 @@ func convert(filePath, outputType string) error { } } +func renameExt(filePath, newExt string) string { + return filePath[:len(filePath)-len(filepath.Ext(filePath))] + "." + newExt +} + func convertJPG(img image.Image, output *os.File) error { if err := jpeg.Encode(output, img, nil); err != nil { return err From 69ce4bca7af2b9a465365ffd99ad728de70c7111 Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Sun, 19 Sep 2021 15:56:56 +0900 Subject: [PATCH 13/19] :wrench: Generate test images --- kadai1/hiroya-w/Makefile | 6 +++++- kadai1/hiroya-w/testdata/.gitignore | 4 ++++ kadai1/hiroya-w/testdata/init.sh | 9 +++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 kadai1/hiroya-w/testdata/.gitignore create mode 100755 kadai1/hiroya-w/testdata/init.sh diff --git a/kadai1/hiroya-w/Makefile b/kadai1/hiroya-w/Makefile index 3581da57..9c4a6e4f 100644 --- a/kadai1/hiroya-w/Makefile +++ b/kadai1/hiroya-w/Makefile @@ -6,6 +6,10 @@ build: run: ./bin/imgconf -input-type=png -output-type=jpg testdata +.PHONY: test +test: build run + .PHONY: clean clean: - rm -rf bin/main + -rm -rf bin/main + -rm testdata/*.jpg testdata/*jpeg testdata/*.png testdata/*.gif diff --git a/kadai1/hiroya-w/testdata/.gitignore b/kadai1/hiroya-w/testdata/.gitignore new file mode 100644 index 00000000..e90edb82 --- /dev/null +++ b/kadai1/hiroya-w/testdata/.gitignore @@ -0,0 +1,4 @@ +*.png +*.jpg +*.jpeg +*.gif diff --git a/kadai1/hiroya-w/testdata/init.sh b/kadai1/hiroya-w/testdata/init.sh new file mode 100755 index 00000000..d9f06158 --- /dev/null +++ b/kadai1/hiroya-w/testdata/init.sh @@ -0,0 +1,9 @@ +#!/bin/sh +curl https://avatars.githubusercontent.com/hiroya-w -o hiroya-w.png + +for i in {1..10} +do + cp hiroya-w.png image$i.png +done + +rm hiroya-w.png From 0aa061f12dd94616878bd9126c3be86b48e51ed1 Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Sun, 19 Sep 2021 16:16:43 +0900 Subject: [PATCH 14/19] :recycle: Use User-defined type --- kadai1/hiroya-w/main.go | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/kadai1/hiroya-w/main.go b/kadai1/hiroya-w/main.go index 1d3f40b8..8ec43468 100644 --- a/kadai1/hiroya-w/main.go +++ b/kadai1/hiroya-w/main.go @@ -7,15 +7,17 @@ import ( "log" ) -var ( +type Options struct { inputType string outputType string directory string -) +} + +var opt Options func init() { - flag.StringVar(&inputType, "input-type", "jpg", "input type") - flag.StringVar(&outputType, "output-type", "png", "output type") + flag.StringVar(&opt.inputType, "input-type", "jpg", "input type") + flag.StringVar(&opt.outputType, "output-type", "png", "output type") } func validateType(t string) error { @@ -30,22 +32,22 @@ func validateType(t string) error { func validateArgs() error { flag.Parse() - if inputType == outputType { + if opt.inputType == opt.outputType { return fmt.Errorf("input and output type can't be the same") } - if err := validateType(inputType); err != nil { + if err := validateType(opt.inputType); err != nil { return err } - if err := validateType(outputType); err != nil { + if err := validateType(opt.outputType); err != nil { return err } if flag.Arg(0) == "" { return fmt.Errorf("directory is required") } else { - directory = flag.Arg(0) + opt.directory = flag.Arg(0) } return nil @@ -56,7 +58,7 @@ func main() { log.Fatalln(err) } - if err := imgconv.Converter(directory, inputType, outputType); err != nil { + if err := imgconv.Converter(opt.directory, opt.inputType, opt.outputType); err != nil { log.Fatalln(err) } } From f2315e4df758f4bd6a9814d409685a5f9b4cff06 Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Sun, 19 Sep 2021 16:17:25 +0900 Subject: [PATCH 15/19] :recycle: Fix Makefile --- kadai1/hiroya-w/Makefile | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/kadai1/hiroya-w/Makefile b/kadai1/hiroya-w/Makefile index 9c4a6e4f..63311648 100644 --- a/kadai1/hiroya-w/Makefile +++ b/kadai1/hiroya-w/Makefile @@ -1,15 +1,19 @@ +SRC := main.go imgconv/imgconv.go + .PHONY: build -build: - go build -o bin/imgconf main.go +build: bin/imgconv + +bin/imgconv: $(SRC) + go build -o bin/imgconv . .PHONY: run run: - ./bin/imgconf -input-type=png -output-type=jpg testdata + ./bin/imgconv -input-type=png -output-type=jpg testdata .PHONY: test test: build run .PHONY: clean clean: - -rm -rf bin/main + -rm bin/imgconv -rm testdata/*.jpg testdata/*jpeg testdata/*.png testdata/*.gif From 0bf67f497b2e5b5250e1080b636f3ca7c975dacf Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Sun, 19 Sep 2021 17:05:52 +0900 Subject: [PATCH 16/19] :recycle: Error checking when file closing --- kadai1/hiroya-w/imgconv/imgconv.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/kadai1/hiroya-w/imgconv/imgconv.go b/kadai1/hiroya-w/imgconv/imgconv.go index 4675d58f..1227bead 100644 --- a/kadai1/hiroya-w/imgconv/imgconv.go +++ b/kadai1/hiroya-w/imgconv/imgconv.go @@ -6,6 +6,7 @@ import ( "image/gif" "image/jpeg" "image/png" + "log" "os" "path/filepath" ) @@ -58,7 +59,11 @@ func convert(filePath, outputType string) error { if err != nil { return err } - defer f.Close() + defer func() { + if err := f.Close(); err != nil { + log.Printf("Error closing file: %s\n", err) + } + }() img, _, err := image.Decode(f) if err != nil { @@ -70,7 +75,11 @@ func convert(filePath, outputType string) error { if err != nil { return err } - defer output.Close() + defer func() { + if err := output.Close(); err != nil { + log.Printf("Error closing file: %s\n", err) + } + }() switch outputType { case "jpg", "jpeg": From 9761ec7431924bc5fb3e03aca5dd7d3568ea58ed Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Sun, 19 Sep 2021 17:08:07 +0900 Subject: [PATCH 17/19] :+1: Update Makefile --- kadai1/hiroya-w/Makefile | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/kadai1/hiroya-w/Makefile b/kadai1/hiroya-w/Makefile index 63311648..38bc02ca 100644 --- a/kadai1/hiroya-w/Makefile +++ b/kadai1/hiroya-w/Makefile @@ -11,7 +11,15 @@ run: ./bin/imgconv -input-type=png -output-type=jpg testdata .PHONY: test -test: build run +test: build testdata-gen run + +.PHONY: testdata-gen +testdata-gen: + cd testdata && ./init.sh + +.PHONY: check +check: + errcheck ./... .PHONY: clean clean: From a10764f8542ebbf062071d7a2581a31a55d2cb5c Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Sun, 19 Sep 2021 22:09:49 +0900 Subject: [PATCH 18/19] :books: Write godoc --- kadai1/hiroya-w/Makefile | 4 ++++ kadai1/hiroya-w/imgconv/imgconv.go | 11 +++++++++++ kadai1/hiroya-w/main.go | 2 ++ 3 files changed, 17 insertions(+) diff --git a/kadai1/hiroya-w/Makefile b/kadai1/hiroya-w/Makefile index 38bc02ca..5ca8e708 100644 --- a/kadai1/hiroya-w/Makefile +++ b/kadai1/hiroya-w/Makefile @@ -21,6 +21,10 @@ testdata-gen: check: errcheck ./... +.PHONY: doc +doc: + godoc -http=:8080 + .PHONY: clean clean: -rm bin/imgconv diff --git a/kadai1/hiroya-w/imgconv/imgconv.go b/kadai1/hiroya-w/imgconv/imgconv.go index 1227bead..68db7245 100644 --- a/kadai1/hiroya-w/imgconv/imgconv.go +++ b/kadai1/hiroya-w/imgconv/imgconv.go @@ -1,3 +1,7 @@ +/* + Package imgconv provides image converter functions. + JPG, PNG, and GIF are supported. +*/ package imgconv import ( @@ -11,6 +15,7 @@ import ( "path/filepath" ) +// Converter converts the inputType format images in the directory to outputType format. func Converter(directory, inputType, outputType string) error { imgPaths, err := getFiles(directory, inputType) if err != nil { @@ -25,6 +30,7 @@ func Converter(directory, inputType, outputType string) error { return nil } +// getFiles returns a list of file paths in a directory with the file extension specified by inputType. func getFiles(directory, inputType string) ([]string, error) { var imgPaths []string @@ -54,6 +60,7 @@ func getFiles(directory, inputType string) ([]string, error) { return imgPaths, nil } +// convert converts the image at filePath to the outputType format. func convert(filePath, outputType string) error { f, err := os.Open(filePath) if err != nil { @@ -93,10 +100,12 @@ func convert(filePath, outputType string) error { } } +// renameExt renames the file extension of the file at filePath to newExt. func renameExt(filePath, newExt string) string { return filePath[:len(filePath)-len(filepath.Ext(filePath))] + "." + newExt } +// convertJPG converts the image to the JPEG format. func convertJPG(img image.Image, output *os.File) error { if err := jpeg.Encode(output, img, nil); err != nil { return err @@ -104,6 +113,7 @@ func convertJPG(img image.Image, output *os.File) error { return nil } +// convertJPG converts the image to the PNG format. func convertPNG(img image.Image, output *os.File) error { if err := png.Encode(output, img); err != nil { return err @@ -111,6 +121,7 @@ func convertPNG(img image.Image, output *os.File) error { return nil } +// convertJPG converts the image to the GIF format. func convertGIF(img image.Image, output *os.File) error { if err := gif.Encode(output, img, nil); err != nil { return err diff --git a/kadai1/hiroya-w/main.go b/kadai1/hiroya-w/main.go index 8ec43468..c1c3f682 100644 --- a/kadai1/hiroya-w/main.go +++ b/kadai1/hiroya-w/main.go @@ -20,6 +20,7 @@ func init() { flag.StringVar(&opt.outputType, "output-type", "png", "output type") } +// validateType validates the type of the image func validateType(t string) error { switch t { case "jpg", "jpeg", "png", "gif": @@ -29,6 +30,7 @@ func validateType(t string) error { } } +// validateArgs validates the arguments func validateArgs() error { flag.Parse() From 451291273222055b5bc8087b779025683d6a00d4 Mon Sep 17 00:00:00 2001 From: Hiroya-W Date: Sun, 19 Sep 2021 23:06:56 +0900 Subject: [PATCH 19/19] :books: Update README.md --- kadai1/hiroya-w/Makefile | 2 +- kadai1/hiroya-w/README.md | 52 ++++++++++++++++++++++++++++++++++++--- kadai1/hiroya-w/main.go | 4 +-- 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/kadai1/hiroya-w/Makefile b/kadai1/hiroya-w/Makefile index 5ca8e708..76bd0add 100644 --- a/kadai1/hiroya-w/Makefile +++ b/kadai1/hiroya-w/Makefile @@ -7,7 +7,7 @@ bin/imgconv: $(SRC) go build -o bin/imgconv . .PHONY: run -run: +run: build ./bin/imgconv -input-type=png -output-type=jpg testdata .PHONY: test diff --git a/kadai1/hiroya-w/README.md b/kadai1/hiroya-w/README.md index 39bc32de..9178dd31 100644 --- a/kadai1/hiroya-w/README.md +++ b/kadai1/hiroya-w/README.md @@ -1,11 +1,55 @@ # 課題1 +## 画像変換コマンドを作成する + +- 次の仕様を満たすコマンドを作って下さい + - ディレクトリを指定する + - 指定したディレクトリ以下のJPGファイルをPNGに変換(デフォルト) + - ディレクトリ以下は再帰的に処理する + - 変換前と変換後の画像形式を指定できる(オプション) +- 以下を満たすように開発してください + - mainパッケージと分離する + - 自作パッケージと標準パッケージと準標準パッケージのみ使う + - 準標準パッケージ:golang.org/x 以下のパッケージ + - ユーザ定義型を作ってみる + - GoDocを生成してみる + - Go Modulesを使ってみる + ## usage ``` -対応拡張子: jpg, png -usage: imgconv [options] +.bin/imgconv -h +Usage of .bin/imgconv: + -input-type string + input type[jpg|jpeg|png|gif] (default "jpg") + -output-type string + output type[jpg|jpeg|png|gif] (default "png") +``` + +基本的なコマンドは `Makefile` で利用できます。 + +### build + +ビルドすると `bin` フォルダに `imgconv` のバイナリが生成されます。 + + +``` +make build +``` + +### run + +`testdata` ディレクトリ内にあるPNG画像ファイルをJPG画像ファイルに変換します。 - --input-type=TYPE [jpg|png] (default: jpg) - --output-type=TYPE [jpg|png] (default: png) +``` +make run +``` + +### test + +`testdata` にテスト用の画像を生成してから、 `make run` を実行します。 +画像データを用いた実行を行うだけで、テストを行っているわけではありません。 + +``` +make test ``` diff --git a/kadai1/hiroya-w/main.go b/kadai1/hiroya-w/main.go index c1c3f682..6239e03e 100644 --- a/kadai1/hiroya-w/main.go +++ b/kadai1/hiroya-w/main.go @@ -16,8 +16,8 @@ type Options struct { var opt Options func init() { - flag.StringVar(&opt.inputType, "input-type", "jpg", "input type") - flag.StringVar(&opt.outputType, "output-type", "png", "output type") + flag.StringVar(&opt.inputType, "input-type", "jpg", "input type[jpg|jpeg|png|gif]") + flag.StringVar(&opt.outputType, "output-type", "png", "output type[jpg|jpeg|png|gif]") } // validateType validates the type of the image