From 0e319b90bde380fcc04784b4d2aae315d90ecd2b Mon Sep 17 00:00:00 2001 From: Udomomo Date: Fri, 9 Nov 2018 23:47:22 +0900 Subject: [PATCH 01/24] initial commit --- kadai1/Udomomo/changeExt.go | 74 ++++++++++++++++++++++++++++++++++ kadai1/Udomomo/main.go | 6 +++ kadai1/Udomomo/test.jpg | Bin 0 -> 1613 bytes kadai1/Udomomo/test/test2.jpg | 0 4 files changed, 80 insertions(+) create mode 100644 kadai1/Udomomo/changeExt.go create mode 100644 kadai1/Udomomo/main.go create mode 100644 kadai1/Udomomo/test.jpg create mode 100644 kadai1/Udomomo/test/test2.jpg diff --git a/kadai1/Udomomo/changeExt.go b/kadai1/Udomomo/changeExt.go new file mode 100644 index 0000000..68045e1 --- /dev/null +++ b/kadai1/Udomomo/changeExt.go @@ -0,0 +1,74 @@ +package main + +import ( + "io/ioutil" + "log" + "os" + "path/filepath" +) + +type Conf struct { + From string + To string +} + +func SetConf(from, to string) Conf { + return Conf{ + From: from, + To: to, + } +} + +//カレントディレクトリ: os.Getwd() +//名前を変える: os.Rename() +//再帰探索する +//ユーザ定義型を作る: fromとtoをstructにまとめ、changeExtメソッドを関連づけてみる + +// rootDirにあるファイルの一覧を探索。 +// ディレクトリがあれば再帰処理する。 +func SearchFile(rootDir string, conf Conf) { + files, err := ioutil.ReadDir(rootDir) + if err != nil { + log.Fatal(err) + } + + for _, file := range files { + path := rootDir + "/" + file.Name() + if file.IsDir() { + SearchFile(path, conf) + continue + } + + willChange, newPath := generateNewExt(path, conf) + if willChange == false { + continue + } + + convFile(path, newPath) + + } +} + +func generateNewExt(path string, conf Conf) (willConv bool, newPath string) { + ext := filepath.Ext(path) + + //変換したい拡張子でなければ何もしない + if ext != conf.From { + return false, path + } + + //変換する必要がなければ何もしない + if conf.From == conf.To { + return false, path + } + + return true, path[:len(path)-len(ext)] + conf.To +} + +func convFile(path, newPath string) { + err := os.Rename(path, newPath) + // 変換に失敗した場合も、エラーを出力するだけで次のファイルに移る + if err != nil { + println(err) + } +} diff --git a/kadai1/Udomomo/main.go b/kadai1/Udomomo/main.go new file mode 100644 index 0000000..21055f1 --- /dev/null +++ b/kadai1/Udomomo/main.go @@ -0,0 +1,6 @@ +package main + +func main() { + conf := SetConf(".jpg", ".png") + SearchFile("/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/", conf) +} diff --git a/kadai1/Udomomo/test.jpg b/kadai1/Udomomo/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8cff29e516202572f43687cdca2c8c88737fc2d1 GIT binary patch literal 1613 zcmb`HX;9Ng7{>Qc5)vYU(c;tybmUYn2O%J|#0rEfU<3&uAQVA@AVm%Vk$SaS2n~=y zKn|foL5KzoX$VXJfvOZxGMI!b92O88F1Zpp)HIn|{oGEUeRuYqdG`73e%M+0p!@~c z=HcS*0w4$iZi)fqV&DW+AV^ss1Vg}-Qia1|2&5_!shlXaEovwf8ihonx1!No)D=Ri zX=rX$*HHFKh%&BBDM}rML@9UtJIUJs1_cU00SwXuDi{ccf#i<>7C-=|yzM8cDsBTu zD7*vP0Hin)4&VqF;%^^Pfx!`q4H&iUJNA60XL(p_mw$oK&e8Q)KuSGFk=d<4!4$+# zIPf8(F!y301yKc|g8XPJOw1ljIAXi^l^uGA!{X_;S&Q;vpspaOU|<+<2y}b{o6ElU zG4S6Sj1{d7*jF|JxaW~JuX=aP#K+OmSp5g`AcrjT)e}j9VvYlPs$ntjwQ_ zEr>}3_EG+lmeiugy^3UTWZpG(XqkKcjxOEKr&%(~8<7LdaKkE&dUZwH{(G}Q(X#== ziYw0osnm@p9&&(Yos8sg}vdA*5Fky{RtZ!xcY8-o{8cU<9RVKAIW57vuU-d5-6G*1h6q8lf(%Z*yr17sa* zbPRO>PvJeu6iXbEIY-ya%VaZ`e0Oa|_r3Me;W90Rqk<4lT)@S`;c?cRy#@yq_t zM=j!Ni~Y$Y&s=@)ThzKldW~?xIoh~YBR1HUz<75<{50H}e|}AZJ@04o^hr~YmQDnx zM@`r;gtNsyj$ye)`+Qk|N&c<2Mlw@VMCSrIL$8yo2>! z{iW{W8+lzWj8*}crPJ~5t5RcBMy8FKIBP7wThG2CiFUd)JoQn`7bJtHla}U`_?f=@ z)}w}dafG64_K{NTFO7m(IZ(YlAE?E4cWI=~&5 zVx?NL*)x?M=+i|`BsY3TPWr8u2P|4>(LxB>?u~SR7I#&HBL}?}a`5Ozr{Q|&mdN5d zGQo0(mL~;MZ_1#!=YkZ^f8I9$JN;gAy>b^Sc;3$wd;i#t%H-J8XCA@!(wKdmG0Ph`S8i6-XP7DjK)h`uiA_4Da#&IbLsS8gM`6J zRQpj^;Ca24)w%dNvuU3>#$_-(v(L~}G#@avq(3&0qSrzmE6m=Pdn&H*tZapvB4{l; zh9gG!N`DpNYKS!5(m%;;qd1Fi3B>Czg)Uw18Ez8o-qp}_Sv+4ncZx<9rRM~nLrd~s za?^TbPH83l<0pKkjvJ+*gd1mR(Krk<#v9wu!6<}U#If6l*mhh`=RDuuS(7_SO$fi| z`&Pq*$q|nw%T+yMUpjH^s_3n0?FFs(q%X2q-OZ_+yobCTLNvtT`FfXSjFZ2H&VKkr K{?7%H5B&u{9(j!b literal 0 HcmV?d00001 diff --git a/kadai1/Udomomo/test/test2.jpg b/kadai1/Udomomo/test/test2.jpg new file mode 100644 index 0000000..e69de29 From 046503cdf5529969fd89fd0b9df98c94f62235be Mon Sep 17 00:00:00 2001 From: Udomomo Date: Sun, 11 Nov 2018 16:07:07 +0900 Subject: [PATCH 02/24] modify the code to change img format, not just expression --- kadai1/Udomomo/changeExt.go | 74 ----------------------------- kadai1/Udomomo/convimg.go | 87 ++++++++++++++++++++++++++++++++++ kadai1/Udomomo/main.go | 3 +- kadai1/Udomomo/test.jpg | Bin 1613 -> 0 bytes kadai1/Udomomo/test.png | Bin 0 -> 11002 bytes kadai1/Udomomo/test/test2.jpg | 0 kadai1/Udomomo/test/test2.png | Bin 0 -> 11002 bytes 7 files changed, 88 insertions(+), 76 deletions(-) delete mode 100644 kadai1/Udomomo/changeExt.go create mode 100644 kadai1/Udomomo/convimg.go delete mode 100644 kadai1/Udomomo/test.jpg create mode 100644 kadai1/Udomomo/test.png delete mode 100644 kadai1/Udomomo/test/test2.jpg create mode 100644 kadai1/Udomomo/test/test2.png diff --git a/kadai1/Udomomo/changeExt.go b/kadai1/Udomomo/changeExt.go deleted file mode 100644 index 68045e1..0000000 --- a/kadai1/Udomomo/changeExt.go +++ /dev/null @@ -1,74 +0,0 @@ -package main - -import ( - "io/ioutil" - "log" - "os" - "path/filepath" -) - -type Conf struct { - From string - To string -} - -func SetConf(from, to string) Conf { - return Conf{ - From: from, - To: to, - } -} - -//カレントディレクトリ: os.Getwd() -//名前を変える: os.Rename() -//再帰探索する -//ユーザ定義型を作る: fromとtoをstructにまとめ、changeExtメソッドを関連づけてみる - -// rootDirにあるファイルの一覧を探索。 -// ディレクトリがあれば再帰処理する。 -func SearchFile(rootDir string, conf Conf) { - files, err := ioutil.ReadDir(rootDir) - if err != nil { - log.Fatal(err) - } - - for _, file := range files { - path := rootDir + "/" + file.Name() - if file.IsDir() { - SearchFile(path, conf) - continue - } - - willChange, newPath := generateNewExt(path, conf) - if willChange == false { - continue - } - - convFile(path, newPath) - - } -} - -func generateNewExt(path string, conf Conf) (willConv bool, newPath string) { - ext := filepath.Ext(path) - - //変換したい拡張子でなければ何もしない - if ext != conf.From { - return false, path - } - - //変換する必要がなければ何もしない - if conf.From == conf.To { - return false, path - } - - return true, path[:len(path)-len(ext)] + conf.To -} - -func convFile(path, newPath string) { - err := os.Rename(path, newPath) - // 変換に失敗した場合も、エラーを出力するだけで次のファイルに移る - if err != nil { - println(err) - } -} diff --git a/kadai1/Udomomo/convimg.go b/kadai1/Udomomo/convimg.go new file mode 100644 index 0000000..d026870 --- /dev/null +++ b/kadai1/Udomomo/convimg.go @@ -0,0 +1,87 @@ +package main + +import ( + "image" + _ "image/jpeg" + "image/png" + "io/ioutil" + "log" + "os" + "path/filepath" +) + +//再帰探索する +//ユーザ定義型を作る: fromとtoをstructにまとめ、changeExtメソッドを関連づけてみる +//探索と変換をそれぞれ別パッケージにした方がよいかも + +// rootDirにあるファイルの一覧を探索。 +// ディレクトリがあれば再帰処理する。 + +func SearchFile(rootDir, from, to string) { + files, err := ioutil.ReadDir(rootDir) + if err != nil { + log.Fatal(err) + } + + for _, file := range files { + path := rootDir + "/" + file.Name() + if file.IsDir() { + SearchFile(path, from, to) + continue + } + + willChange, newPath := generateNewExt(path, from, to) + if willChange == false { + continue + } + + convFileToPng(path, newPath) + + } +} + +func generateNewExt(path, from, to string) (willConv bool, newPath string) { + ext := filepath.Ext(path) + + //変換したい拡張子でなければ何もしない + if ext != from { + return false, path + } + + //変換する必要がなければ何もしない + if from == to { + return false, path + } + + return true, path[:len(path)-len(ext)] + to +} + +func convFileToPng(path, newPath string) { + println(path) + file, err := os.Open(path) + if err != nil { + print("open failed") + log.Fatal(err) + } + defer file.Close() + + decoded, _, err := image.Decode(file) + if err != nil { + print("decode failed") + log.Fatal(err) + } + + out, err := os.Create(newPath) + if err != nil { + print("create failed") + log.Fatal(err) + } + defer out.Close() + + if err := png.Encode(out, decoded); err != nil { + print("encode failed") + log.Fatal(err) + } + + os.Remove(path) +} diff --git a/kadai1/Udomomo/main.go b/kadai1/Udomomo/main.go index 21055f1..223e513 100644 --- a/kadai1/Udomomo/main.go +++ b/kadai1/Udomomo/main.go @@ -1,6 +1,5 @@ package main func main() { - conf := SetConf(".jpg", ".png") - SearchFile("/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/", conf) + SearchFile("/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo", ".jpg", ".png") } diff --git a/kadai1/Udomomo/test.jpg b/kadai1/Udomomo/test.jpg deleted file mode 100644 index 8cff29e516202572f43687cdca2c8c88737fc2d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1613 zcmb`HX;9Ng7{>Qc5)vYU(c;tybmUYn2O%J|#0rEfU<3&uAQVA@AVm%Vk$SaS2n~=y zKn|foL5KzoX$VXJfvOZxGMI!b92O88F1Zpp)HIn|{oGEUeRuYqdG`73e%M+0p!@~c z=HcS*0w4$iZi)fqV&DW+AV^ss1Vg}-Qia1|2&5_!shlXaEovwf8ihonx1!No)D=Ri zX=rX$*HHFKh%&BBDM}rML@9UtJIUJs1_cU00SwXuDi{ccf#i<>7C-=|yzM8cDsBTu zD7*vP0Hin)4&VqF;%^^Pfx!`q4H&iUJNA60XL(p_mw$oK&e8Q)KuSGFk=d<4!4$+# zIPf8(F!y301yKc|g8XPJOw1ljIAXi^l^uGA!{X_;S&Q;vpspaOU|<+<2y}b{o6ElU zG4S6Sj1{d7*jF|JxaW~JuX=aP#K+OmSp5g`AcrjT)e}j9VvYlPs$ntjwQ_ zEr>}3_EG+lmeiugy^3UTWZpG(XqkKcjxOEKr&%(~8<7LdaKkE&dUZwH{(G}Q(X#== ziYw0osnm@p9&&(Yos8sg}vdA*5Fky{RtZ!xcY8-o{8cU<9RVKAIW57vuU-d5-6G*1h6q8lf(%Z*yr17sa* zbPRO>PvJeu6iXbEIY-ya%VaZ`e0Oa|_r3Me;W90Rqk<4lT)@S`;c?cRy#@yq_t zM=j!Ni~Y$Y&s=@)ThzKldW~?xIoh~YBR1HUz<75<{50H}e|}AZJ@04o^hr~YmQDnx zM@`r;gtNsyj$ye)`+Qk|N&c<2Mlw@VMCSrIL$8yo2>! z{iW{W8+lzWj8*}crPJ~5t5RcBMy8FKIBP7wThG2CiFUd)JoQn`7bJtHla}U`_?f=@ z)}w}dafG64_K{NTFO7m(IZ(YlAE?E4cWI=~&5 zVx?NL*)x?M=+i|`BsY3TPWr8u2P|4>(LxB>?u~SR7I#&HBL}?}a`5Ozr{Q|&mdN5d zGQo0(mL~;MZ_1#!=YkZ^f8I9$JN;gAy>b^Sc;3$wd;i#t%H-J8XCA@!(wKdmG0Ph`S8i6-XP7DjK)h`uiA_4Da#&IbLsS8gM`6J zRQpj^;Ca24)w%dNvuU3>#$_-(v(L~}G#@avq(3&0qSrzmE6m=Pdn&H*tZapvB4{l; zh9gG!N`DpNYKS!5(m%;;qd1Fi3B>Czg)Uw18Ez8o-qp}_Sv+4ncZx<9rRM~nLrd~s za?^TbPH83l<0pKkjvJ+*gd1mR(Krk<#v9wu!6<}U#If6l*mhh`=RDuuS(7_SO$fi| z`&Pq*$q|nw%T+yMUpjH^s_3n0?FFs(q%X2q-OZ_+yobCTLNvtT`FfXSjFZ2H&VKkr K{?7%H5B&u{9(j!b diff --git a/kadai1/Udomomo/test.png b/kadai1/Udomomo/test.png new file mode 100644 index 0000000000000000000000000000000000000000..7a1cede3efbfb01446d001e8dcf26a0fa7faac31 GIT binary patch literal 11002 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 IqDDdg2U*TaI{*Lx literal 0 HcmV?d00001 diff --git a/kadai1/Udomomo/test/test2.jpg b/kadai1/Udomomo/test/test2.jpg deleted file mode 100644 index e69de29..0000000 diff --git a/kadai1/Udomomo/test/test2.png b/kadai1/Udomomo/test/test2.png new file mode 100644 index 0000000000000000000000000000000000000000..7a1cede3efbfb01446d001e8dcf26a0fa7faac31 GIT binary patch literal 11002 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 IqDDdg2U*TaI{*Lx literal 0 HcmV?d00001 From 4a0b1d6b8ce56fc4f843aabf2032c9931f55930d Mon Sep 17 00:00:00 2001 From: Udomomo Date: Sun, 11 Nov 2018 23:22:41 +0900 Subject: [PATCH 03/24] implemented image converter --- kadai1/Udomomo/converter.go | 44 ++++++++++++++++++++++++++++++++++ kadai1/Udomomo/convimg.go | 38 +++++++++++++++++++---------- kadai1/Udomomo/main.go | 2 +- kadai1/Udomomo/test.jpg | Bin 0 -> 1999 bytes kadai1/Udomomo/test.png | Bin 11002 -> 0 bytes kadai1/Udomomo/test/test2.jpg | Bin 0 -> 1999 bytes kadai1/Udomomo/test/test2.png | Bin 11002 -> 0 bytes 7 files changed, 71 insertions(+), 13 deletions(-) create mode 100644 kadai1/Udomomo/converter.go create mode 100644 kadai1/Udomomo/test.jpg delete mode 100644 kadai1/Udomomo/test.png create mode 100644 kadai1/Udomomo/test/test2.jpg delete mode 100644 kadai1/Udomomo/test/test2.png diff --git a/kadai1/Udomomo/converter.go b/kadai1/Udomomo/converter.go new file mode 100644 index 0000000..66f7a21 --- /dev/null +++ b/kadai1/Udomomo/converter.go @@ -0,0 +1,44 @@ +package main + +import ( + "image" + "image/gif" + "image/jpeg" + "image/png" + "io" +) + +type Converter interface { + convimg() error +} + +type jpgConverter struct { + dist io.Writer + img image.Image +} + +type pngConverter struct { + dist io.Writer + img image.Image +} + +type gifConverter struct { + dist io.Writer + img image.Image +} + +func convert(c Converter) error { + return c.convimg() +} + +func (c jpgConverter) convimg() error { + return jpeg.Encode(c.dist, c.img, nil) +} + +func (c pngConverter) convimg() error { + return png.Encode(c.dist, c.img) +} + +func (c gifConverter) convimg() error { + return gif.Encode(c.dist, c.img, nil) +} diff --git a/kadai1/Udomomo/convimg.go b/kadai1/Udomomo/convimg.go index d026870..b651c28 100644 --- a/kadai1/Udomomo/convimg.go +++ b/kadai1/Udomomo/convimg.go @@ -3,17 +3,12 @@ package main import ( "image" _ "image/jpeg" - "image/png" "io/ioutil" "log" "os" "path/filepath" ) -//再帰探索する -//ユーザ定義型を作る: fromとtoをstructにまとめ、changeExtメソッドを関連づけてみる -//探索と変換をそれぞれ別パッケージにした方がよいかも - // rootDirにあるファイルの一覧を探索。 // ディレクトリがあれば再帰処理する。 @@ -35,7 +30,7 @@ func SearchFile(rootDir, from, to string) { continue } - convFileToPng(path, newPath) + println(convFile(path, newPath)) } } @@ -56,8 +51,7 @@ func generateNewExt(path, from, to string) (willConv bool, newPath string) { return true, path[:len(path)-len(ext)] + to } -func convFileToPng(path, newPath string) { - println(path) +func convFile(path, newPath string) string { file, err := os.Open(path) if err != nil { print("open failed") @@ -65,11 +59,10 @@ func convFileToPng(path, newPath string) { } defer file.Close() - decoded, _, err := image.Decode(file) + decoded, format, err := image.Decode(file) if err != nil { - print("decode failed") - log.Fatal(err) } + println(format) out, err := os.Create(newPath) if err != nil { @@ -78,10 +71,31 @@ func convFileToPng(path, newPath string) { } defer out.Close() - if err := png.Encode(out, decoded); err != nil { + var c Converter + switch format { + case "jpeg", "jpg": + { + c = &jpgConverter{out, decoded} + } + case "png": + { + c = &pngConverter{out, decoded} + } + case "gif": + { + c = &gifConverter{out, decoded} + } + default: + { + log.Fatal("Can't generate converter: illegal format") + } + } + + if err := c.convimg(); err != nil { print("encode failed") log.Fatal(err) } os.Remove(path) + return newPath } diff --git a/kadai1/Udomomo/main.go b/kadai1/Udomomo/main.go index 223e513..95aa449 100644 --- a/kadai1/Udomomo/main.go +++ b/kadai1/Udomomo/main.go @@ -1,5 +1,5 @@ package main func main() { - SearchFile("/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo", ".jpg", ".png") + SearchFile("/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo", ".gif", ".jpg") } diff --git a/kadai1/Udomomo/test.jpg b/kadai1/Udomomo/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c3ef43a8d5ae5a45936f6a956521a3aa221e0c5 GIT binary patch literal 1999 zcmd7Sdo|pynT-Qo;VqLIxIZm zOeEvyxC`+Ki5HX7eoeoek(rf!CBNWC;mx93#Uv~$ah>AhW8!r_{Si(XIkmlRg=TY^%Ak^-P_HKovDS3 zehv0F>@syXS8j?N_dn6Sk!XPto`AIEx z&iq@C?}Yia1*VCRMZ8(Q_KO(ioO#WLO^u?V3Zwe^m-S2MQ;eQ}7`?x_BZh7IYFUvd z>P|ZSqfGrqocXIo~Pir12Fg&|vQ2=CiZ%EGE%Dx3l`;gg-T4 zro|$q=l;o_2~V=1sMkzRm7T%I#}}MmnA|cwQ2YoxH0|)wM0ILyGu=M9V3L0`6BpmG zzhbsW{^{GCATeqhg%2G)Mm3I>dH)`dk&tpij zk6L>ZZ2Drl#V&fw>VgXwI17@)bS38ACabtm&T2VxhCp;QeuirsC?MSN{Eb=DSwSvo zVj1N?BD`?S@Ddfq@WVoX9=I&@K1%8MFgV+6L3A!Uw|%zoP486%*Hg7UIbym%xl&k3 z`IIA>f7i8tOi;>Ce48{?t&s1_U>Es_?%pE?1mGQ8+I$R&Oo*@+mg7uvJufE(QoF6C zz&+ukIgJAr2|-rtNbx3S4!7%Ieni_SD%rOZo!1JiYTz=oA8hcAXt3|CmMc1GAhMM2 z3KB(RMNGrS)6XW2gb63Ewuo|^#OosZv<~(qf?4fB)F_Dy{TZ{`Q-(ivHahrtSim;F zGc3W;MdV0LWS7tA*rf(*E?1J0jLmd%T2L}*JpLf|i5X`~0t5a&g zbFr^cxyXt);6&xU9JY%Jo@y(lua6|1 zjp>>4px@`0LglH+!3)XYD?E%x4;kHGh})~ z7I}8D)m=>YO5ZK literal 0 HcmV?d00001 diff --git a/kadai1/Udomomo/test.png b/kadai1/Udomomo/test.png deleted file mode 100644 index 7a1cede3efbfb01446d001e8dcf26a0fa7faac31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11002 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 IqDDdg2U*TaI{*Lx diff --git a/kadai1/Udomomo/test/test2.jpg b/kadai1/Udomomo/test/test2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c3ef43a8d5ae5a45936f6a956521a3aa221e0c5 GIT binary patch literal 1999 zcmd7Sdo|pynT-Qo;VqLIxIZm zOeEvyxC`+Ki5HX7eoeoek(rf!CBNWC;mx93#Uv~$ah>AhW8!r_{Si(XIkmlRg=TY^%Ak^-P_HKovDS3 zehv0F>@syXS8j?N_dn6Sk!XPto`AIEx z&iq@C?}Yia1*VCRMZ8(Q_KO(ioO#WLO^u?V3Zwe^m-S2MQ;eQ}7`?x_BZh7IYFUvd z>P|ZSqfGrqocXIo~Pir12Fg&|vQ2=CiZ%EGE%Dx3l`;gg-T4 zro|$q=l;o_2~V=1sMkzRm7T%I#}}MmnA|cwQ2YoxH0|)wM0ILyGu=M9V3L0`6BpmG zzhbsW{^{GCATeqhg%2G)Mm3I>dH)`dk&tpij zk6L>ZZ2Drl#V&fw>VgXwI17@)bS38ACabtm&T2VxhCp;QeuirsC?MSN{Eb=DSwSvo zVj1N?BD`?S@Ddfq@WVoX9=I&@K1%8MFgV+6L3A!Uw|%zoP486%*Hg7UIbym%xl&k3 z`IIA>f7i8tOi;>Ce48{?t&s1_U>Es_?%pE?1mGQ8+I$R&Oo*@+mg7uvJufE(QoF6C zz&+ukIgJAr2|-rtNbx3S4!7%Ieni_SD%rOZo!1JiYTz=oA8hcAXt3|CmMc1GAhMM2 z3KB(RMNGrS)6XW2gb63Ewuo|^#OosZv<~(qf?4fB)F_Dy{TZ{`Q-(ivHahrtSim;F zGc3W;MdV0LWS7tA*rf(*E?1J0jLmd%T2L}*JpLf|i5X`~0t5a&g zbFr^cxyXt);6&xU9JY%Jo@y(lua6|1 zjp>>4px@`0LglH+!3)XYD?E%x4;kHGh})~ z7I}8D)m=>YO5ZK literal 0 HcmV?d00001 diff --git a/kadai1/Udomomo/test/test2.png b/kadai1/Udomomo/test/test2.png deleted file mode 100644 index 7a1cede3efbfb01446d001e8dcf26a0fa7faac31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11002 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 IqDDdg2U*TaI{*Lx From 8ec77d2ffabac1d263c2439cdf06ebe7bc60fb68 Mon Sep 17 00:00:00 2001 From: Udomomo Date: Mon, 12 Nov 2018 00:34:40 +0900 Subject: [PATCH 04/24] change directory tree --- kadai1/Udomomo/.DS_Store | Bin 0 -> 8196 bytes kadai1/Udomomo/cmd/main.go | 40 +++++++++ kadai1/Udomomo/convimg.go | 101 ---------------------- kadai1/Udomomo/{ => convimg}/converter.go | 2 +- kadai1/Udomomo/main.go | 5 -- 5 files changed, 41 insertions(+), 107 deletions(-) create mode 100644 kadai1/Udomomo/.DS_Store create mode 100644 kadai1/Udomomo/cmd/main.go delete mode 100644 kadai1/Udomomo/convimg.go rename kadai1/Udomomo/{ => convimg}/converter.go (97%) delete mode 100644 kadai1/Udomomo/main.go diff --git a/kadai1/Udomomo/.DS_Store b/kadai1/Udomomo/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f93491ee1d60b4d39e06a15eeed9000d90abc148 GIT binary patch literal 8196 zcmeHMTTC2P7(U+u?F`J?1GE(=ZB~hYye_0SHA3 z5ESZj(IHHPm<(}NBF#{N3?-DI2vZEmaIz;tzhsEB5@k3;n0z4I8DWNkV0T(S5x6rX zB}Q$;K*Ydu2E^l2%6w)rkNJ!9_w0mid46;AJYprKWvf;zYI#LPMR^6UEWa~7=1!%3 z-JkS2_54UMvJ5jD_Iq`Itk~~!U3;OgXZtO4D#O=yxsI<}j+tK+IyzuEhC9{iPCAA+ znwIMgScX5A;p=+yW`RO`b;sq z$k|1NXz?q$QeA6zYZ+c8E^z;ZZ@G@wZ{|J13}53BQ$0D?34cI_SLSp(H)-p>*weQ4$hr39xZ?@$T;8?qUe~k4GDCyDdBhh!%ccg0JvZ-n1%ZPWtuMX!q-Wk?(&ARZ zOwkq|hpL=dQ?v1^Yp-wKzVqfeURhPWcAcgT6TOaa-EEoq15<+IA>GTFj$t{61`2{; z+w61nakCQ7sOnsGWfj-z;`J*3SQ#~F-F>bhVvS%XUKdX&%80OcjgPO#mHozkXMeCi**U~ef- zv|$I@u?xF#3-+J~w_yN-7{&;6+=Igyhl2th#4H}hBRGm@@f=>ji+Beg;v<~ISNH}$ zVqRWUtf5ZaEm>$fy+ zvOrf-IDw#wf(dkczDjHBHq^&AX^En=mrDKs>CrqA2#l|u3%p6ZLRnmq!_DzVg~ZQe z!BE>0-zucdOXO@ISwrPza+bs@WX?@JN&x>x0^=IZM<)FwMLjWhXNiJi2~@d{P> zAL{&$&9PqsW&Xwf#%gG&#nq(8X6!@~9Y~QLyU~l=kwzc-k-E5C~CE};WDlMe* zj_o>!$W~PK`R>u^qA*Y*cdZfm|L&E)|6i1Ai#ClIh#0sq44^cXPIb~=E4`gXuAQKI zkg6!cZ&qRuLQRm469(xx;ldw=)K8GBh)ISxE0HWzF8GH4+l Date: Mon, 12 Nov 2018 00:36:57 +0900 Subject: [PATCH 05/24] add convimg --- kadai1/Udomomo/convimg/convimg.go | 101 ++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 kadai1/Udomomo/convimg/convimg.go diff --git a/kadai1/Udomomo/convimg/convimg.go b/kadai1/Udomomo/convimg/convimg.go new file mode 100644 index 0000000..86ad36b --- /dev/null +++ b/kadai1/Udomomo/convimg/convimg.go @@ -0,0 +1,101 @@ +package convimg + +import ( + "image" + _ "image/jpeg" + "io/ioutil" + "log" + "os" + "path/filepath" +) + +// rootDirにあるファイルの一覧を探索。 +// ディレクトリがあれば再帰処理する。 + +func SearchFile(rootDir, from, to string) { + files, err := ioutil.ReadDir(rootDir) + if err != nil { + log.Fatal(err) + } + + for _, file := range files { + path := rootDir + "/" + file.Name() + if file.IsDir() { + SearchFile(path, from, to) + continue + } + + willChange, newPath := generateNewExt(path, from, to) + if willChange == false { + continue + } + + println(convFile(path, newPath)) + + } +} + +func generateNewExt(path, from, to string) (willConv bool, newPath string) { + ext := filepath.Ext(path) + + //変換したい拡張子でなければ何もしない + if ext != from { + return false, path + } + + //変換する必要がなければ何もしない + if from == to { + return false, path + } + + return true, path[:len(path)-len(ext)] + to +} + +func convFile(path, newPath string) string { + file, err := os.Open(path) + if err != nil { + print("open failed") + log.Fatal(err) + } + defer file.Close() + + decoded, format, err := image.Decode(file) + if err != nil { + } + println(format) + + out, err := os.Create(newPath) + if err != nil { + print("create failed") + log.Fatal(err) + } + defer out.Close() + + var c Converter + switch format { + case "jpeg", "jpg": + { + c = &jpgConverter{out, decoded} + } + case "png": + { + c = &pngConverter{out, decoded} + } + case "gif": + { + c = &gifConverter{out, decoded} + } + default: + { + log.Fatal("Can't generate converter: illegal format") + } + } + + if err := c.convimg(); err != nil { + print("encode failed") + log.Fatal(err) + } + + os.Remove(path) + return newPath +} From 24e7e4028cca0eb65072c5b0d4b23f56039617d4 Mon Sep 17 00:00:00 2001 From: Udomomo Date: Mon, 12 Nov 2018 00:59:14 +0900 Subject: [PATCH 06/24] added flag --- kadai1/Udomomo/convimg/convimg.go | 1 - kadai1/Udomomo/{cmd => }/main.go | 14 ++++++++------ kadai1/Udomomo/{test.jpg => test.gif} | Bin 1999 -> 1999 bytes kadai1/Udomomo/test/{test2.jpg => test2.gif} | Bin 1999 -> 1999 bytes 4 files changed, 8 insertions(+), 7 deletions(-) rename kadai1/Udomomo/{cmd => }/main.go (53%) rename kadai1/Udomomo/{test.jpg => test.gif} (88%) rename kadai1/Udomomo/test/{test2.jpg => test2.gif} (88%) diff --git a/kadai1/Udomomo/convimg/convimg.go b/kadai1/Udomomo/convimg/convimg.go index 86ad36b..ee57860 100644 --- a/kadai1/Udomomo/convimg/convimg.go +++ b/kadai1/Udomomo/convimg/convimg.go @@ -62,7 +62,6 @@ func convFile(path, newPath string) string { decoded, format, err := image.Decode(file) if err != nil { } - println(format) out, err := os.Create(newPath) if err != nil { diff --git a/kadai1/Udomomo/cmd/main.go b/kadai1/Udomomo/main.go similarity index 53% rename from kadai1/Udomomo/cmd/main.go rename to kadai1/Udomomo/main.go index ad6fb65..231bb8f 100644 --- a/kadai1/Udomomo/cmd/main.go +++ b/kadai1/Udomomo/main.go @@ -2,9 +2,10 @@ package main import ( "flag" - "log" + "fmt" + "os" - "convimg" + "github.com/Udomomo/dojo4/kadai1/Udomomo/convimg" ) func main() { @@ -16,15 +17,16 @@ func main() { t string ) - flag.StringVar(&f, "str", "jpg", "format before conversion (default: jpg)") - flag.StringVar(&t, "str", "jpg", "format after conversion (default: png)") + flag.StringVar(&f, "f", "jpg", "format before conversion") + flag.StringVar(&t, "t", "png", "format after conversion") flag.Parse() path := flag.Arg(0) - if contains(suffix, f) != false || contains(suffix, t) != false { - log.Fatal("Invalid suffix: %s, %s", f, t) + if contains(suffix, f) == false || contains(suffix, t) == false { + fmt.Printf("Invalid suffix: %s, %s", f, t) + os.Exit(1) } convimg.SearchFile(path, "."+f, "."+t) diff --git a/kadai1/Udomomo/test.jpg b/kadai1/Udomomo/test.gif similarity index 88% rename from kadai1/Udomomo/test.jpg rename to kadai1/Udomomo/test.gif index 2c3ef43a8d5ae5a45936f6a956521a3aa221e0c5..13c75232ab61ce6ebf40fccc12a5b37b9df9534c 100644 GIT binary patch delta 33 rcmV++0N(%456=&(b delta 33 pcmX@lf1ZECOlC&g$+MV4850(NU}j(b delta 33 pcmX@lf1ZECOlC&g$+MV4850(NU}j Date: Mon, 12 Nov 2018 01:01:00 +0900 Subject: [PATCH 07/24] remove DS_Store --- kadai1/Udomomo/.DS_Store | Bin 8196 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 kadai1/Udomomo/.DS_Store diff --git a/kadai1/Udomomo/.DS_Store b/kadai1/Udomomo/.DS_Store deleted file mode 100644 index f93491ee1d60b4d39e06a15eeed9000d90abc148..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMTTC2P7(U+u?F`J?1GE(=ZB~hYye_0SHA3 z5ESZj(IHHPm<(}NBF#{N3?-DI2vZEmaIz;tzhsEB5@k3;n0z4I8DWNkV0T(S5x6rX zB}Q$;K*Ydu2E^l2%6w)rkNJ!9_w0mid46;AJYprKWvf;zYI#LPMR^6UEWa~7=1!%3 z-JkS2_54UMvJ5jD_Iq`Itk~~!U3;OgXZtO4D#O=yxsI<}j+tK+IyzuEhC9{iPCAA+ znwIMgScX5A;p=+yW`RO`b;sq z$k|1NXz?q$QeA6zYZ+c8E^z;ZZ@G@wZ{|J13}53BQ$0D?34cI_SLSp(H)-p>*weQ4$hr39xZ?@$T;8?qUe~k4GDCyDdBhh!%ccg0JvZ-n1%ZPWtuMX!q-Wk?(&ARZ zOwkq|hpL=dQ?v1^Yp-wKzVqfeURhPWcAcgT6TOaa-EEoq15<+IA>GTFj$t{61`2{; z+w61nakCQ7sOnsGWfj-z;`J*3SQ#~F-F>bhVvS%XUKdX&%80OcjgPO#mHozkXMeCi**U~ef- zv|$I@u?xF#3-+J~w_yN-7{&;6+=Igyhl2th#4H}hBRGm@@f=>ji+Beg;v<~ISNH}$ zVqRWUtf5ZaEm>$fy+ zvOrf-IDw#wf(dkczDjHBHq^&AX^En=mrDKs>CrqA2#l|u3%p6ZLRnmq!_DzVg~ZQe z!BE>0-zucdOXO@ISwrPza+bs@WX?@JN&x>x0^=IZM<)FwMLjWhXNiJi2~@d{P> zAL{&$&9PqsW&Xwf#%gG&#nq(8X6!@~9Y~QLyU~l=kwzc-k-E5C~CE};WDlMe* zj_o>!$W~PK`R>u^qA*Y*cdZfm|L&E)|6i1Ai#ClIh#0sq44^cXPIb~=E4`gXuAQKI zkg6!cZ&qRuLQRm469(xx;ldw=)K8GBh)ISxE0HWzF8GH4+l Date: Mon, 12 Nov 2018 08:24:36 +0900 Subject: [PATCH 08/24] modified path --- kadai1/Udomomo/convimg/convimg.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/kadai1/Udomomo/convimg/convimg.go b/kadai1/Udomomo/convimg/convimg.go index ee57860..7e58adb 100644 --- a/kadai1/Udomomo/convimg/convimg.go +++ b/kadai1/Udomomo/convimg/convimg.go @@ -2,16 +2,13 @@ package convimg import ( "image" - _ "image/jpeg" "io/ioutil" "log" "os" "path/filepath" ) -// rootDirにあるファイルの一覧を探索。 -// ディレクトリがあれば再帰処理する。 - +//SearchFile :rootDirにあるファイルの一覧を探索。ディレクトリがあれば再帰処理する。 func SearchFile(rootDir, from, to string) { files, err := ioutil.ReadDir(rootDir) if err != nil { @@ -19,7 +16,7 @@ func SearchFile(rootDir, from, to string) { } for _, file := range files { - path := rootDir + "/" + file.Name() + path := filepath.Join(rootDir, file.Name()) if file.IsDir() { SearchFile(path, from, to) continue From f6cfb35c7b7e07fb543cb5fb656cf6d7803a0f3c Mon Sep 17 00:00:00 2001 From: Udomomo Date: Mon, 12 Nov 2018 08:29:36 +0900 Subject: [PATCH 09/24] add comment to func --- kadai1/Udomomo/convimg/converter.go | 1 + kadai1/Udomomo/convimg/convimg.go | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/kadai1/Udomomo/convimg/converter.go b/kadai1/Udomomo/convimg/converter.go index 3b48c63..8dd6623 100644 --- a/kadai1/Udomomo/convimg/converter.go +++ b/kadai1/Udomomo/convimg/converter.go @@ -27,6 +27,7 @@ type gifConverter struct { img image.Image } +//convert : ファイルの形式に合わせて、変換を行うメソッドを呼び分ける func convert(c Converter) error { return c.convimg() } diff --git a/kadai1/Udomomo/convimg/convimg.go b/kadai1/Udomomo/convimg/convimg.go index 7e58adb..904920b 100644 --- a/kadai1/Udomomo/convimg/convimg.go +++ b/kadai1/Udomomo/convimg/convimg.go @@ -8,7 +8,7 @@ import ( "path/filepath" ) -//SearchFile :rootDirにあるファイルの一覧を探索。ディレクトリがあれば再帰処理する。 +//SearchFile : rootDirにあるファイルの一覧を探索。ディレクトリがあれば再帰処理する。 func SearchFile(rootDir, from, to string) { files, err := ioutil.ReadDir(rootDir) if err != nil { @@ -32,6 +32,7 @@ func SearchFile(rootDir, from, to string) { } } +//generateNewExt : 変換が必要な場合、変換後のパスを生成して返す func generateNewExt(path, from, to string) (willConv bool, newPath string) { ext := filepath.Ext(path) @@ -48,6 +49,7 @@ func generateNewExt(path, from, to string) (willConv bool, newPath string) { return true, path[:len(path)-len(ext)] + to } +//convFile : 変換を実行する func convFile(path, newPath string) string { file, err := os.Open(path) if err != nil { From bbedb802d65de2535c52cc3fdde96ae195b5ef12 Mon Sep 17 00:00:00 2001 From: Udomomo Date: Mon, 12 Nov 2018 08:43:21 +0900 Subject: [PATCH 10/24] add README --- kadai1/Udomomo/README.md | 43 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 kadai1/Udomomo/README.md diff --git a/kadai1/Udomomo/README.md b/kadai1/Udomomo/README.md new file mode 100644 index 0000000..ac2d4ac --- /dev/null +++ b/kadai1/Udomomo/README.md @@ -0,0 +1,43 @@ +## 課題1 + * 次の仕様を満たすコマンドを作って下さい + - ディレクトリを指定する + - 指定したディレクトリ以下のJPGファイルをPNGに変換(デフォルト) + - ディレクトリ以下は再帰的に処理する + - 変換前と変換後の画像形式を指定できる(オプション) + + * 以下を満たすように開発してください + - mainパッケージと分離する + - 自作パッケージと標準パッケージと準標準パッケージのみ使う + - 準標準パッケージ:golang.org/x以下のパッケージ + - ユーザ定義型を作ってみる + - GoDocを生成してみる + + ## コマンド + * jpeg, png, jpg, gifに対応 + + ## インストール + ``` + $ go get github.com/Udomomo/dojo4/kadai1/Udomomo/convimg + $ cd $GOPATH/src/github.com/Udomomo/dojo4/kadai1/Udomomo/convimg + $ git checkout kadai1-Udomomo + $ git fetch && git merge + $ git install +``` + +## ビルド + ``` + $ go build -o conv main.go + ``` + + ## コマンド + ``` + $.conv [options] [directories] + ``` + + ### オプション + ``` +-f string + format before conversion (default "jpg") +-t string + format after conversion (default "png") + ``` \ No newline at end of file From 38505bb615ae7143bf470ce0be748db5b34dc5a6 Mon Sep 17 00:00:00 2001 From: Udomomo Date: Mon, 12 Nov 2018 08:54:11 +0900 Subject: [PATCH 11/24] modified build command --- kadai1/Udomomo/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kadai1/Udomomo/README.md b/kadai1/Udomomo/README.md index ac2d4ac..009c307 100644 --- a/kadai1/Udomomo/README.md +++ b/kadai1/Udomomo/README.md @@ -26,12 +26,12 @@ ## ビルド ``` - $ go build -o conv main.go + $ go build -o bin/convimg main.go ``` ## コマンド ``` - $.conv [options] [directories] + $./bin/convimg [options] [directories] ``` ### オプション From f786dab25a3eaf1279025f930f496d2a79f42f3f Mon Sep 17 00:00:00 2001 From: Udomomo Date: Sun, 18 Nov 2018 16:08:22 +0900 Subject: [PATCH 12/24] modified searchFile to return a slice of processedPath --- kadai1/Udomomo/convimg/convimg.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/kadai1/Udomomo/convimg/convimg.go b/kadai1/Udomomo/convimg/convimg.go index 904920b..133b665 100644 --- a/kadai1/Udomomo/convimg/convimg.go +++ b/kadai1/Udomomo/convimg/convimg.go @@ -9,7 +9,10 @@ import ( ) //SearchFile : rootDirにあるファイルの一覧を探索。ディレクトリがあれば再帰処理する。 -func SearchFile(rootDir, from, to string) { +func SearchFile(rootDir, from, to string) []string { + + processedPaths := make([]string, 0) + files, err := ioutil.ReadDir(rootDir) if err != nil { log.Fatal(err) @@ -27,9 +30,12 @@ func SearchFile(rootDir, from, to string) { continue } - println(convFile(path, newPath)) + processed := convFile(path, newPath) + processedPaths = append(processedPaths, processed) } + + return processedPaths } //generateNewExt : 変換が必要な場合、変換後のパスを生成して返す From 2c6ce3a6df47298e757285369d3c63a8b2095a96 Mon Sep 17 00:00:00 2001 From: Udomomo Date: Sun, 18 Nov 2018 16:52:09 +0900 Subject: [PATCH 13/24] change import path --- kadai1/Udomomo/main.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/kadai1/Udomomo/main.go b/kadai1/Udomomo/main.go index 231bb8f..5cbd38d 100644 --- a/kadai1/Udomomo/main.go +++ b/kadai1/Udomomo/main.go @@ -5,12 +5,13 @@ import ( "fmt" "os" - "github.com/Udomomo/dojo4/kadai1/Udomomo/convimg" + "github.com/gopherdojo/dojo4/kadai1/Udomomo/convimg" ) func main() { - var suffix = []string{"jpg", "jpeg", "png", "gif"} + SUFFIX := []string{"jpg", "jpeg", "png", "gif"} + SEPARATOR := "." var ( f string From fc99b2552e6651ec4665a92b03467c241d29aaf2 Mon Sep 17 00:00:00 2001 From: Udomomo Date: Sun, 18 Nov 2018 16:52:46 +0900 Subject: [PATCH 14/24] changed the way printing processed paths --- kadai1/Udomomo/main.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kadai1/Udomomo/main.go b/kadai1/Udomomo/main.go index 5cbd38d..8c9cd40 100644 --- a/kadai1/Udomomo/main.go +++ b/kadai1/Udomomo/main.go @@ -25,12 +25,15 @@ func main() { path := flag.Arg(0) - if contains(suffix, f) == false || contains(suffix, t) == false { + if contains(SUFFIX, f) == false || contains(SUFFIX, t) == false { fmt.Printf("Invalid suffix: %s, %s", f, t) os.Exit(1) } - convimg.SearchFile(path, "."+f, "."+t) + processedPaths := convimg.SearchFile(path, SEPARATOR+f, SEPARATOR+t) + for _, p := range processedPaths { + println(p) + } } func contains(su []string, fl string) bool { From 5d7574b0e2431d43c3c338cce8580456f7e04646 Mon Sep 17 00:00:00 2001 From: Udomomo Date: Sun, 18 Nov 2018 17:25:18 +0900 Subject: [PATCH 15/24] modified to store processedPath into array --- kadai1/Udomomo/convimg/convimg.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/kadai1/Udomomo/convimg/convimg.go b/kadai1/Udomomo/convimg/convimg.go index 133b665..239bacd 100644 --- a/kadai1/Udomomo/convimg/convimg.go +++ b/kadai1/Udomomo/convimg/convimg.go @@ -8,10 +8,14 @@ import ( "path/filepath" ) -//SearchFile : rootDirにあるファイルの一覧を探索。ディレクトリがあれば再帰処理する。 func SearchFile(rootDir, from, to string) []string { - processedPaths := make([]string, 0) + processedPaths = searchFile(rootDir, from, to, processedPaths) + return processedPaths +} + +//searchFile : rootDirにあるファイルの一覧を探索。ディレクトリがあれば再帰処理する。 +func searchFile(rootDir, from, to string, processedPaths []string) []string { files, err := ioutil.ReadDir(rootDir) if err != nil { @@ -21,7 +25,7 @@ func SearchFile(rootDir, from, to string) []string { for _, file := range files { path := filepath.Join(rootDir, file.Name()) if file.IsDir() { - SearchFile(path, from, to) + processedPaths = searchFile(path, from, to, processedPaths) continue } @@ -32,9 +36,7 @@ func SearchFile(rootDir, from, to string) []string { processed := convFile(path, newPath) processedPaths = append(processedPaths, processed) - } - return processedPaths } From a91298894f296e4e7ac9c98475c8a7fe0511202a Mon Sep 17 00:00:00 2001 From: Udomomo Date: Mon, 19 Nov 2018 08:28:44 +0900 Subject: [PATCH 16/24] move os.Remove for make tests easier --- kadai1/Udomomo/convimg/convimg.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/kadai1/Udomomo/convimg/convimg.go b/kadai1/Udomomo/convimg/convimg.go index 239bacd..a41c3a6 100644 --- a/kadai1/Udomomo/convimg/convimg.go +++ b/kadai1/Udomomo/convimg/convimg.go @@ -1,6 +1,7 @@ package convimg import ( + "fmt" "image" "io/ioutil" "log" @@ -8,6 +9,7 @@ import ( "path/filepath" ) +//SearchFile : searchFile関数が出力する変換後のパスを貯めておき、返り値として返す。 func SearchFile(rootDir, from, to string) []string { processedPaths := make([]string, 0) processedPaths = searchFile(rootDir, from, to, processedPaths) @@ -36,6 +38,7 @@ func searchFile(rootDir, from, to string, processedPaths []string) []string { processed := convFile(path, newPath) processedPaths = append(processedPaths, processed) + os.Remove(path) } return processedPaths } @@ -61,18 +64,20 @@ func generateNewExt(path, from, to string) (willConv bool, newPath string) { func convFile(path, newPath string) string { file, err := os.Open(path) if err != nil { - print("open failed") + fmt.Println("open failed") log.Fatal(err) } defer file.Close() decoded, format, err := image.Decode(file) if err != nil { + fmt.Println("decode failed") + log.Fatal(err) } out, err := os.Create(newPath) if err != nil { - print("create failed") + fmt.Println("create failed") log.Fatal(err) } defer out.Close() @@ -98,10 +103,9 @@ func convFile(path, newPath string) string { } if err := c.convimg(); err != nil { - print("encode failed") + fmt.Println("encode failed") log.Fatal(err) } - os.Remove(path) return newPath } From 693b34a81f8f57c7d55039d7a88cd7e672fd72b0 Mon Sep 17 00:00:00 2001 From: Udomomo Date: Mon, 19 Nov 2018 08:29:05 +0900 Subject: [PATCH 17/24] modified Print to Println --- kadai1/Udomomo/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kadai1/Udomomo/main.go b/kadai1/Udomomo/main.go index 8c9cd40..588573c 100644 --- a/kadai1/Udomomo/main.go +++ b/kadai1/Udomomo/main.go @@ -26,7 +26,7 @@ func main() { path := flag.Arg(0) if contains(SUFFIX, f) == false || contains(SUFFIX, t) == false { - fmt.Printf("Invalid suffix: %s, %s", f, t) + fmt.Printf("Invalid suffix: %s, %s\n", f, t) os.Exit(1) } From 3d930737b63fea7bd4c0aa7a7ceacb3597eeb498 Mon Sep 17 00:00:00 2001 From: Udomomo Date: Mon, 19 Nov 2018 09:15:31 +0900 Subject: [PATCH 18/24] separated search and conv --- kadai1/Udomomo/convimg/convimg.go | 38 ++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/kadai1/Udomomo/convimg/convimg.go b/kadai1/Udomomo/convimg/convimg.go index a41c3a6..0e42754 100644 --- a/kadai1/Udomomo/convimg/convimg.go +++ b/kadai1/Udomomo/convimg/convimg.go @@ -11,13 +11,27 @@ import ( //SearchFile : searchFile関数が出力する変換後のパスを貯めておき、返り値として返す。 func SearchFile(rootDir, from, to string) []string { + processingPaths := make([]string, 0) + processingPaths = searchFile(rootDir, from, to, processingPaths) + processedPaths := make([]string, 0) - processedPaths = searchFile(rootDir, from, to, processedPaths) + for _, p := range processingPaths { + e := filepath.Ext(p) + np := p[:len(p)-len(e)] + to + processedPaths = append(processedPaths, convFile(p, np)) + os.Remove(p) + } + + //os.Remove後の結果はユニットテストしづらいので、ここで簡易的に確認する + if len(processingPaths) != len(processingPaths) { + fmt.Println("len of conv results is wrong") + os.Exit(1) + } return processedPaths } //searchFile : rootDirにあるファイルの一覧を探索。ディレクトリがあれば再帰処理する。 -func searchFile(rootDir, from, to string, processedPaths []string) []string { +func searchFile(rootDir, from, to string, processingPaths []string) []string { files, err := ioutil.ReadDir(rootDir) if err != nil { @@ -27,37 +41,35 @@ func searchFile(rootDir, from, to string, processedPaths []string) []string { for _, file := range files { path := filepath.Join(rootDir, file.Name()) if file.IsDir() { - processedPaths = searchFile(path, from, to, processedPaths) + processingPaths = searchFile(path, from, to, processingPaths) continue } - willChange, newPath := generateNewExt(path, from, to) - if willChange == false { + willConv := validateIfConvNeeded(path, from, to) + if willConv == false { continue } - processed := convFile(path, newPath) - processedPaths = append(processedPaths, processed) - os.Remove(path) + processingPaths = append(processingPaths, path) } - return processedPaths + return processingPaths } //generateNewExt : 変換が必要な場合、変換後のパスを生成して返す -func generateNewExt(path, from, to string) (willConv bool, newPath string) { +func validateIfConvNeeded(path, from, to string) bool { ext := filepath.Ext(path) //変換したい拡張子でなければ何もしない if ext != from { - return false, path + return false } //変換する必要がなければ何もしない if from == to { - return false, path + return false } - return true, path[:len(path)-len(ext)] + to + return true //path[:len(path)-len(ext)] + to } //convFile : 変換を実行する From 23ef06afc080fb80d02375c6c4bc764975d440a8 Mon Sep 17 00:00:00 2001 From: Udomomo Date: Mon, 19 Nov 2018 22:16:55 +0900 Subject: [PATCH 19/24] Found mistake in the condition of generating converter --- kadai1/Udomomo/convimg/convimg.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/kadai1/Udomomo/convimg/convimg.go b/kadai1/Udomomo/convimg/convimg.go index 0e42754..72fca7a 100644 --- a/kadai1/Udomomo/convimg/convimg.go +++ b/kadai1/Udomomo/convimg/convimg.go @@ -18,7 +18,7 @@ func SearchFile(rootDir, from, to string) []string { for _, p := range processingPaths { e := filepath.Ext(p) np := p[:len(p)-len(e)] + to - processedPaths = append(processedPaths, convFile(p, np)) + processedPaths = append(processedPaths, convFile(p, np, to)) os.Remove(p) } @@ -69,11 +69,11 @@ func validateIfConvNeeded(path, from, to string) bool { return false } - return true //path[:len(path)-len(ext)] + to + return true } //convFile : 変換を実行する -func convFile(path, newPath string) string { +func convFile(path, newPath, toExt string) string { file, err := os.Open(path) if err != nil { fmt.Println("open failed") @@ -81,7 +81,7 @@ func convFile(path, newPath string) string { } defer file.Close() - decoded, format, err := image.Decode(file) + decoded, _, err := image.Decode(file) if err != nil { fmt.Println("decode failed") log.Fatal(err) @@ -95,16 +95,16 @@ func convFile(path, newPath string) string { defer out.Close() var c Converter - switch format { - case "jpeg", "jpg": + switch toExt { + case ".jpeg", ".jpg": { c = &jpgConverter{out, decoded} } - case "png": + case ".png": { c = &pngConverter{out, decoded} } - case "gif": + case ".gif": { c = &gifConverter{out, decoded} } From 2c07b82bc346f8b3785bf90b4caf0e86107f731c Mon Sep 17 00:00:00 2001 From: Udomomo Date: Mon, 19 Nov 2018 22:39:46 +0900 Subject: [PATCH 20/24] modified convFile to return error --- kadai1/Udomomo/convimg/convimg.go | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/kadai1/Udomomo/convimg/convimg.go b/kadai1/Udomomo/convimg/convimg.go index 72fca7a..3fad06c 100644 --- a/kadai1/Udomomo/convimg/convimg.go +++ b/kadai1/Udomomo/convimg/convimg.go @@ -18,7 +18,12 @@ func SearchFile(rootDir, from, to string) []string { for _, p := range processingPaths { e := filepath.Ext(p) np := p[:len(p)-len(e)] + to - processedPaths = append(processedPaths, convFile(p, np, to)) + + pp, err := convFile(p, np, to) + if err != nil { + log.Fatal(err) + } + processedPaths = append(processedPaths, pp) os.Remove(p) } @@ -73,24 +78,21 @@ func validateIfConvNeeded(path, from, to string) bool { } //convFile : 変換を実行する -func convFile(path, newPath, toExt string) string { +func convFile(path, newPath, toExt string) (string, error) { file, err := os.Open(path) if err != nil { - fmt.Println("open failed") - log.Fatal(err) + return newPath, fmt.Errorf("Original file open failed. Path: %s", path) } defer file.Close() decoded, _, err := image.Decode(file) if err != nil { - fmt.Println("decode failed") - log.Fatal(err) + return newPath, fmt.Errorf("Original file decode failed. Path: %s", path) } out, err := os.Create(newPath) if err != nil { - fmt.Println("create failed") - log.Fatal(err) + return newPath, fmt.Errorf("New empty file creation failed. Path: %s", newPath) } defer out.Close() @@ -110,14 +112,13 @@ func convFile(path, newPath, toExt string) string { } default: { - log.Fatal("Can't generate converter: illegal format") + return newPath, fmt.Errorf("Can't convert to illegal format: %s", toExt) } } if err := c.convimg(); err != nil { - fmt.Println("encode failed") - log.Fatal(err) + return newPath, fmt.Errorf("Encode failed from %s to %s", path, newPath) } - return newPath + return newPath, nil } From f9613f8337de892198b4ab5fc9dd6f98cb3373e8 Mon Sep 17 00:00:00 2001 From: Udomomo Date: Wed, 21 Nov 2018 22:45:16 +0900 Subject: [PATCH 21/24] modified validation case --- kadai1/Udomomo/convimg/convimg.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/kadai1/Udomomo/convimg/convimg.go b/kadai1/Udomomo/convimg/convimg.go index 3fad06c..92f0087 100644 --- a/kadai1/Udomomo/convimg/convimg.go +++ b/kadai1/Udomomo/convimg/convimg.go @@ -28,9 +28,8 @@ func SearchFile(rootDir, from, to string) []string { } //os.Remove後の結果はユニットテストしづらいので、ここで簡易的に確認する - if len(processingPaths) != len(processingPaths) { - fmt.Println("len of conv results is wrong") - os.Exit(1) + if len(processingPaths) != len(processedPaths) { + log.Fatal("len of conv results is wrong") } return processedPaths } From b7acf2645f9ee75319e45c8a6358d80d6f834244 Mon Sep 17 00:00:00 2001 From: Udomomo Date: Wed, 21 Nov 2018 22:59:02 +0900 Subject: [PATCH 22/24] added test and testdata --- kadai1/Udomomo/convimg/convimg_test.go | 144 ++++++++++++++++++++++++ kadai1/Udomomo/testdata/broken.gif | Bin 0 -> 904 bytes kadai1/Udomomo/testdata/test.gif | Bin 0 -> 904 bytes kadai1/Udomomo/testdata/test.jpg | Bin 0 -> 2539 bytes kadai1/Udomomo/testdata/test.png | Bin 0 -> 1342 bytes kadai1/Udomomo/testdata/test2/test2.jpg | Bin 0 -> 2539 bytes 6 files changed, 144 insertions(+) create mode 100644 kadai1/Udomomo/convimg/convimg_test.go create mode 100644 kadai1/Udomomo/testdata/broken.gif create mode 100644 kadai1/Udomomo/testdata/test.gif create mode 100644 kadai1/Udomomo/testdata/test.jpg create mode 100644 kadai1/Udomomo/testdata/test.png create mode 100644 kadai1/Udomomo/testdata/test2/test2.jpg diff --git a/kadai1/Udomomo/convimg/convimg_test.go b/kadai1/Udomomo/convimg/convimg_test.go new file mode 100644 index 0000000..6a30135 --- /dev/null +++ b/kadai1/Udomomo/convimg/convimg_test.go @@ -0,0 +1,144 @@ +package convimg + +import ( + "image" + "os" + "testing" +) + +func TestSearchFile(t *testing.T) { + t.Helper() + expProcessingPath := []string{ + "/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/testdata/test.jpg", + "/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/testdata/test2/test2.jpg", + } + + processingPath := searchFile("/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/testdata", ".jpg", ".png", make([]string, 0)) + for _, p := range expProcessingPath { + if contains(processingPath, p) == false { + t.Errorf("searchFile failed: %s is not searched", p) + } + } + + if len(processingPath) != len(expProcessingPath) { + t.Errorf("searchFile failed: result is longer than expected: %v", processingPath) + } +} + +func contains(su []string, fl string) bool { + for _, s := range su { + if s == fl { + return true + } + } + return false +} + +func TestValidateIfConvNeeded(t *testing.T) { + t.Helper() + jpgPath := "/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/testdata/test.jpg" + if validateIfConvNeeded(jpgPath, ".jpg", ".gif") == false { + t.Error("validate failed: file should be converted") + } + if validateIfConvNeeded(jpgPath, ".png", ".gif") == true { + t.Error("validate failed: fromExt difference is ignored") + } + if validateIfConvNeeded(jpgPath, ".jpg", ".jpg") == true { + t.Error("validate failed: from and to are equal") + } +} + +func TestConvFile(t *testing.T) { + t.Helper() + var testCase = []struct { + path string + newPath string + toExt string + expFmt string + wantErr bool + }{ + //正常ケース png->jpg + {"/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/testdata/test.png", + "/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/output/test.jpg", + ".jpg", + "jpeg", + false, + }, + //正常ケース jpg->gif + {"/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/testdata/test.jpg", + "/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/output/test.gif", + ".gif", + "gif", + false, + }, + //正常ケース gif->png + {"/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/testdata/test.gif", + "/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/output/test.png", + ".png", + "png", + false, + }, + //異常ケース 存在しないファイルパスの場合 + {"/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/testdata/hogehoge.gif", + "/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/output/test.png", + ".png", + "png", + true, + }, + //異常ケース ファイルが壊れている場合 + {"/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/testdata/broken.gif", + "/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/output/test.png", + ".png", + "png", + true, + }, + //異常ケース 書き込み先の権限がない場合 + {"/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/testdata/test.gif", + "/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/output/permission/test.png", + ".png", + "png", + true, + }, + //異常ケース 変換先の拡張子が不正な場合 + {"/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/testdata/test.gif", + "/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/output/test.pmg", + ".pmg", + "png", + true, + }, + } + + if err := os.Mkdir("/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/output", 0755); err != nil { + t.Fatal(err) + } + defer os.RemoveAll("/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/output") + + //書き込み先に権限がない場合のテスト用にディレクトリを作っておく + if err := os.Mkdir("/Users/naoya/Golang_practice/dojo4/kadai1/Udomomo/output/permission", 0555); err != nil { + t.Fatal(err) + } + + for _, tc := range testCase { + processedPath, err := convFile(tc.path, tc.newPath, tc.toExt) + if err != nil && tc.wantErr == false { + t.Errorf("Case %s should succeed but returned error: %#v", tc.path, err) + } + + if err == nil && tc.wantErr == true { + t.Errorf("Case %s should fail but succeeded", tc.path) + } + + if err == nil { + file, err := os.Open(processedPath) + if err != nil { + t.Errorf("processed file can't open. Path: %s", processedPath) + } + defer file.Close() + + if _, fmt, _ := image.Decode(file); fmt != tc.expFmt { + t.Errorf("fmt is wrong: expected %s but actually %s", tc.expFmt, fmt) + } + } + } + +} diff --git a/kadai1/Udomomo/testdata/broken.gif b/kadai1/Udomomo/testdata/broken.gif new file mode 100644 index 0000000000000000000000000000000000000000..4a4da00030446ff2aaed58c242846befe46ed198 GIT binary patch literal 904 zcmV;319$vLNk%v~VU_@v0E7SloSK}>&djv7wCw8atg5Ws-rU5(#Ps&`q@twM*3`Vd zy!7()w6e71=H$%E%>4fRoSvN2($u`VyzK7mtgfu&;^f4}#QggFq^6|Y+S~vD00000 z000000000000000EC2ui0G0rj000I4ARvxpX`X1Ru59bRa4gSsZQppV?|kq7z@TtQ zEE41ejE#{0JOoh0+;d_547Iy^faksR{|bAd6@z*LtzlzJBOP1J;-MQ9zcki z#61XrK?DQ=1^SIRh%w_aU=98{esdU*6NU&AE*zLpfZ~V-4UDPU$+PFG3FJ&*(3LBI z2@3;U1>mIvf(4)_h7vtsv;^^tm!37k9hvJ?`TLdi!=*6wKU(&tt z`T!(gfkyy{Q&m0BmHsf3h>a#S&UQc7?pY>Sofle4;X*~KLHHzSUEt- zMx+QvmatWgFwRvL2@09UUrGRApw5#g954U?1YGdji3)BxLYKyXDW-Jf0hpEo`9078 zZ?+wCfQcg{0M;tktsvx`dG1LZ`EED(kGY)@tjmxaO+suDtf@>#x8DE9|hu7HjOW$R?}ovdlK? e?6c5DEA6z@5LRpLwb*8>?Y7)@>uo0?0029Pf2=?N literal 0 HcmV?d00001 diff --git a/kadai1/Udomomo/testdata/test.gif b/kadai1/Udomomo/testdata/test.gif new file mode 100644 index 0000000000000000000000000000000000000000..6c8595125c3c637d1d0ad8788423d70fd246cd47 GIT binary patch literal 904 zcmV;319$vKNk%v~VU_@v0E7SloSK}>&djv7wCw8atg5Ws-rU5(#Ps&`q@twM*3`Vd zy!7()w6e71=H$%E%>4fRoSvN2($u`VyzK7mtgfu&;^f4}#QggFq^6|Y+S~vD00000 z000000000000000EC2ui0G0rj000I4ARvxpX`X1Ru59bRa4gSsZQppV?|kq7z@TtQ zEE41ejE#{0JOoh0+;d_547Iy^faksR{|bAd6@z*LtzlzJBOP1J;-MQ9zcki z#61XrK?DQ=1^SIRh%w_aU=98{esdU*6NU&AE*zLpfZ~V-4UDPU$+PFG3FJ&*(3LBI z2@3;U1>mIvf(4)_h7vtsv;^^tm!37k9hvJ?`TLdi!=*6wKU(&tt z`T!(gfkyy{Q&m0BmHsf3h>a#S&UQc7?pY>Sofle4;X*~KLHHzSUEt- zMx+QvmatWgFwRvL2@09UUrGRApw5#g954U?1YGdji3)BxLYKyXDW-Jf0hpEo`9078 zZ?+wCfQcg{0M;tktsvx`dG1LZ`EED(kGY)@tjmxaO+suDtf@>#x8DE9|hu7HjOW$R?}ovdlK? e?6c5DEA6z@5LRpLwb*8>?Y7)@>uo0?0029L_pCnv literal 0 HcmV?d00001 diff --git a/kadai1/Udomomo/testdata/test.jpg b/kadai1/Udomomo/testdata/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dc98d7574a228312194e3b73348e6877bba0cd8c GIT binary patch literal 2539 zcmb_ec{J2*8~%+Me#6L;HA`iQoEnV6NXW57w#rA0B_df8!pICsy=BV~4JC#eyHJd= zjI>|~nd~(aSu&G7M2L63@one(=lkP3=e?f$xzByhbzS%KJbygr+}uyxaX{>hrL`ph zfj|H&-U7HRzzpDnKz8F_fbv6kApnCx`9T2?+}&_NgdiL)1P4K(JwieVVIDw15z#%u zBD?i&lU@6+ixl#0$VRkT4^1eQ|AGs*KF z&+GVKEdj_sO*~RVoJT^Sd@up%zfXkli9?l8u)U_|yyGP#m35xJd^_=j%LIgZx8hOa zfC=!$ni>iP05E_B8!P;JdpZU+1otzM$= zQ(^U8g?@LFd{$86>AM%#M~a&?ZUoy#a)D&(CDE6oxpc68q?Sb1BzQ!1s zkmuPj`zqGc#;sWYx7m;Fdu-b}Iq7!200xAuLjo2D4Np3%RVr(NredP|JBk8g3O8}&@( zKMlV%@$~7Ln3;iY{Me|TkL;2kW7)=NeaO)GQVw`tN7E(FzRzq}?VxxIJ7O_iyp z==s%-J(}#kRC{W5`_p*CP{&dJ)_H_a6m(r>z9!;{J>fY9Urk!zbX`faMo#Uw-Kj&q z@YKgwpuEv*9QnG7a{+#&uTt#dGdC8m)5o~Ly`=fnsW0pV>4dd_+0$M(K;p;XO!kS@ zsNMQv66RUP?Jv8pT=x1yk`=p1~6VvB6rCgJSY=Syxrbd(q=HGkjmrvV% zD$LBU)J`{Oj&q<@pX@w9XSfap2F#6|$vkjzDvp!5=3JL_fAd7H3Al!tYA+uC8RemS zM=bxmuJPBP%1ou(IoU#bnB>Pxi%SQ}^?T*K2^yY@1TgbW=yr30Frlhi{ws$ISeh(i zU+Zx=UQuL6cJp zbnge93c`Hk{dk#6_=?UFW-+SfPwT6B4Gr>Z;fxK z8#_H{ayUeL*&21g%^{opdA}&pN2f!0_{i1D;`)IG-73X``%U{=<3;AVfLCbLVEwH| z98+evn1Di8g&jjpw~WoTwO!s|3Gfr5)mPxNJ(&`8%A5d&IsMuf8{?U>5i4aR1w-!D zL$g*|k8FVrVoPjv8cFI&ee65`sy}u6^DUN62$tZYQ~mbOVRh48H1hb@KRC_d%L+?N zIosCZIm1~EfcpePg;>A^ZlCwuPXD4&K<#s>UBI#mmztRqR|?wW%2Ph8KplQsx!MYX zobiSgck8*|?IO_dp6v$#x-A)`xHeXeY?Typ7UP|q{dih)2YvM#n7_V7yshOCY&aX@ z$uy_0)*EguPx?rR&pum22v!c*Zfz3W@3@6^EJ{f;3%(X)?NgNB*r6S-Qgm^ncF#mY zBXLjSo@N;MS4UqSp0M9w9F4g?Y@=eelNdU2p`t&)wl~+Vu~l+KS-CS_Tuh2sPAlrv zjWeYT*e^z4{f{;|DbfvXf4)4!ERXjvRLdUYSg~mdmQb8-E?@NgO{c)*?14(Qnh(L` zVwntes5$YE8A6R*Mup01QPc0=TFAk4^xCzO zPPJ&7ZQuZ5)QcV#qtmWYT0lpoxCLkBL?<5Xp5$a_W0DAq-J}5tD~2 zEj#rgW|}O!DHJJL-rg=`5aB!AOc+Yn2`oR-d_BWvS~x@hF~)uJGqg1x-x7y%lGAu? zS9J9Q*?=C~U|2NWQJVxDm-u<$R3THNLIw#AZTlRjm|8eSwrf88g|VuThe@L}RoU=~-0o zvRHU7n_|SN)>H)yRJSX2FRxxGKgU95_{vf<{Wgtqq)knUzAlu=?5^1M8ffu4kTg^X$$HQJ|c8|M*Ra zbNol`;{xzjT!bQSZR3JpBwONq&Ai`^-Bo%74e@$9qMF=t89k=cg;-;%bAeDB$I-7^ pTN!l9>I(ei(Pzmaef}2}hf*7CF<#~tHKl*$bnw3i4HNF?zXMfLj*9>Q literal 0 HcmV?d00001 diff --git a/kadai1/Udomomo/testdata/test.png b/kadai1/Udomomo/testdata/test.png new file mode 100644 index 0000000000000000000000000000000000000000..f90edd049768b6a539150e95387ce3186e6128ce GIT binary patch literal 1342 zcmZ`%X;9J$9Q~)YmTsG6?sgZ`u`@N6bgXHbfshztii$_x_pu%b<}DuJk&<~^SguDN zXqcwunQ1C!-i3G|B8ey7f+%83A9tF4^M3Em`^~&>FW%5Vcfb5Gc>nmguhsb~DS zy|PkO7?13e+HO|}3IYHXNebKcd!+e{BLa;AfZz)N5J3chE$J&_1_1n30btG!05q}y z;1A#IIwMU0*fnOTZvxl4<6HTr{rmUtuI@=#T*e(8zXUS%D}y5th=fAXAammJlQP7; zz_m4DG^qfNc-YfB+S|v{zaP@t_BAKBrl)5VX%JHOs%2wiGcEnKm2Iq{akxmdRa(}J zHX#%hzwh|O+}sq`H+1I})Jr5g!J*GX!*e7OiKkZzlQ}_(d6}ACJ~hR^4Z%*&EFw|C z3k$0+a^AhEqK~q8P#Dg}K0Yuw+sz|M8-i_a=`Sv6`q11L6p}3#Z`;_#d1KS;9Uncg ziSfavH@6J%`77Jo688A?yV_0*E7AmaHZnRdikQ#g%+%F)X+!;By8e^Ac}jM*o9C1G zgyPjzfge5-=byE*vc9;qmYhm^S=303DPXgw9tJ+Uj}8k6qOitzj?Rf&TjG$g7qs$^ zx%qYUj=>GlrjrY~p|K||!Z*yDXZFkS)uI^zd9A85H z;NYBqv4~DeepOi1xUjfN_R6A47qH6#sSA^FQ3!RC206SQ3NFW0P?F!b*O%%u2>>!S zdN7Dd;K;&Pu`Sa6gxoT{=t62D=nLa;Y8lk{^4aT|UGgf0WuMO-1!Wq70}j@v-6E9Y zgnWLsP57`n-BUY^-K5#Op*hZ+7L2KvYe5wc{sf-GzN-`&H+jZDMU~rATu{YX0_g6g zdsVIJ35TppC&Q~R*@Esa-sn5Tbg<4fp_#u>tRg!#Ni$TcT5vLoMLhP=Nae56 z`QJsI#My&CCe0bJeb7)KD^;-%4{S1*!Y)k%=6$%xl`M0mY^Lam&Q92X#}C<%rCrekYA71DJ`E1 z)o~U=^~nsJ`^~WW>jyZMif1jk%7NsC{7y=ZhgxfwxrGF=)po-w)AX=)yH3C%$Ak5t zjP{Fi-f@(g^QFHf9zWnC=F~c>wGNnfHqFv%imVep9=VZ?V$o$a*GCn=*9M(xKx<#} zvOJW*`kyZ*>c%Y65n3ypl14>ipZTLLy$r^R%oS3ga*Jp6GsrTT%|ajdQ1aJO*b*?1akdy2gP>|8BE05HOq!d z3OB;(+r-N4WstpAE8m>!%3DXkZOIQXsTJU&Yl6?dxxHNu7aBLo+GLDQ+|QUHh!m8y z6VRC(oFmfloyWt?@lN)5XAMU`XQ=^KRlzq^z+e@yx(QfaLsiO~mwu>fw0yhZKLsxz ZCwG^i|1YeXh3iQRfF9fcMuXZ#{R=}Qr`!Ml literal 0 HcmV?d00001 diff --git a/kadai1/Udomomo/testdata/test2/test2.jpg b/kadai1/Udomomo/testdata/test2/test2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dc98d7574a228312194e3b73348e6877bba0cd8c GIT binary patch literal 2539 zcmb_ec{J2*8~%+Me#6L;HA`iQoEnV6NXW57w#rA0B_df8!pICsy=BV~4JC#eyHJd= zjI>|~nd~(aSu&G7M2L63@one(=lkP3=e?f$xzByhbzS%KJbygr+}uyxaX{>hrL`ph zfj|H&-U7HRzzpDnKz8F_fbv6kApnCx`9T2?+}&_NgdiL)1P4K(JwieVVIDw15z#%u zBD?i&lU@6+ixl#0$VRkT4^1eQ|AGs*KF z&+GVKEdj_sO*~RVoJT^Sd@up%zfXkli9?l8u)U_|yyGP#m35xJd^_=j%LIgZx8hOa zfC=!$ni>iP05E_B8!P;JdpZU+1otzM$= zQ(^U8g?@LFd{$86>AM%#M~a&?ZUoy#a)D&(CDE6oxpc68q?Sb1BzQ!1s zkmuPj`zqGc#;sWYx7m;Fdu-b}Iq7!200xAuLjo2D4Np3%RVr(NredP|JBk8g3O8}&@( zKMlV%@$~7Ln3;iY{Me|TkL;2kW7)=NeaO)GQVw`tN7E(FzRzq}?VxxIJ7O_iyp z==s%-J(}#kRC{W5`_p*CP{&dJ)_H_a6m(r>z9!;{J>fY9Urk!zbX`faMo#Uw-Kj&q z@YKgwpuEv*9QnG7a{+#&uTt#dGdC8m)5o~Ly`=fnsW0pV>4dd_+0$M(K;p;XO!kS@ zsNMQv66RUP?Jv8pT=x1yk`=p1~6VvB6rCgJSY=Syxrbd(q=HGkjmrvV% zD$LBU)J`{Oj&q<@pX@w9XSfap2F#6|$vkjzDvp!5=3JL_fAd7H3Al!tYA+uC8RemS zM=bxmuJPBP%1ou(IoU#bnB>Pxi%SQ}^?T*K2^yY@1TgbW=yr30Frlhi{ws$ISeh(i zU+Zx=UQuL6cJp zbnge93c`Hk{dk#6_=?UFW-+SfPwT6B4Gr>Z;fxK z8#_H{ayUeL*&21g%^{opdA}&pN2f!0_{i1D;`)IG-73X``%U{=<3;AVfLCbLVEwH| z98+evn1Di8g&jjpw~WoTwO!s|3Gfr5)mPxNJ(&`8%A5d&IsMuf8{?U>5i4aR1w-!D zL$g*|k8FVrVoPjv8cFI&ee65`sy}u6^DUN62$tZYQ~mbOVRh48H1hb@KRC_d%L+?N zIosCZIm1~EfcpePg;>A^ZlCwuPXD4&K<#s>UBI#mmztRqR|?wW%2Ph8KplQsx!MYX zobiSgck8*|?IO_dp6v$#x-A)`xHeXeY?Typ7UP|q{dih)2YvM#n7_V7yshOCY&aX@ z$uy_0)*EguPx?rR&pum22v!c*Zfz3W@3@6^EJ{f;3%(X)?NgNB*r6S-Qgm^ncF#mY zBXLjSo@N;MS4UqSp0M9w9F4g?Y@=eelNdU2p`t&)wl~+Vu~l+KS-CS_Tuh2sPAlrv zjWeYT*e^z4{f{;|DbfvXf4)4!ERXjvRLdUYSg~mdmQb8-E?@NgO{c)*?14(Qnh(L` zVwntes5$YE8A6R*Mup01QPc0=TFAk4^xCzO zPPJ&7ZQuZ5)QcV#qtmWYT0lpoxCLkBL?<5Xp5$a_W0DAq-J}5tD~2 zEj#rgW|}O!DHJJL-rg=`5aB!AOc+Yn2`oR-d_BWvS~x@hF~)uJGqg1x-x7y%lGAu? zS9J9Q*?=C~U|2NWQJVxDm-u<$R3THNLIw#AZTlRjm|8eSwrf88g|VuThe@L}RoU=~-0o zvRHU7n_|SN)>H)yRJSX2FRxxGKgU95_{vf<{Wgtqq)knUzAlu=?5^1M8ffu4kTg^X$$HQJ|c8|M*Ra zbNol`;{xzjT!bQSZR3JpBwONq&Ai`^-Bo%74e@$9qMF=t89k=cg;-;%bAeDB$I-7^ pTN!l9>I(ei(Pzmaef}2}hf*7CF<#~tHKl*$bnw3i4HNF?zXMfLj*9>Q literal 0 HcmV?d00001 From 2217bd65534d899a046454d1be45a25ad94a4f21 Mon Sep 17 00:00:00 2001 From: Udomomo Date: Wed, 21 Nov 2018 23:03:42 +0900 Subject: [PATCH 23/24] added README --- kadai2/README.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 kadai2/README.md diff --git a/kadai2/README.md b/kadai2/README.md new file mode 100644 index 0000000..fc22d5b --- /dev/null +++ b/kadai2/README.md @@ -0,0 +1,42 @@ +# 課題2-1 io.Readerとio.Writerについて +## 何に使われているか +使われているパッケージは多い。一例として以下のようなものがある。 +- os.File +- strings.NewReader +- http.Request.Body +- bytes.Buffer +- ioutil.ReadAll + +これらのメソッドで、引数として使われていることが多い。 + +## どのような利点があるのか +最大の特長は、対象を限定せずに「読む/書く」という処理を抽象化したことにある。文字列だけではなく、ファイルやhttpリクエストもio.Reader・io.Writerで処理することができる。 +こうすることで、読み書きのみを責務として担う関数を使いまわすことができる。Golangのinterfaceは型の一種なので、例えば後ろから一定の文字数だけ読むtailという関数があった場合、引数をio.Readerにすれば、文字列もファイルも同じtail関数で読めるようになる。テストするときも、読み出し部分のテストは1つのメソッドについて行えばよい。 +また、より効率の良い読み方を求めて新しいnewTail関数を作ったとしても、その関数以外の部分に手を加える必要がなく、リファクタリングが最小限で済む。 +このように、interfaceを上手に定義しておくことで、読む/書くための関数とそれ以外の関数をより疎結合に近い状態にしやすくなる。 + +上記はinterface一般にいえるメリットだが、io.Reader・io.Writerならではの良い点は、interfaceの中に定義されている関数が1つしかなく、それでいて意味的にも関数1つで過不足がないことにある。よけいな関数を定義しすぎてinterfaceが肥大化すると、後々そのinterfaceを使った新しいstructを定義するときに、必要性の薄い関数も改めて書かなければならず足を引っ張ることになりやすい。io.Reader・io.Writerは、Read/Write関数を定義しさえすれば使えるので、コードを書く側にとってもほとんど邪魔にならない。 + +# 課題2-2 +## リファクタリング +- 画像変換の入り口のメソッドであるsearchFile関数に返り値を持たせた。 + - もともとは返り値を持たず、変換を実行するconvFile関数の返り値(=新しいパス)を最後にprintlnするだけだったが、新しいパス自体を返り値とする方が、searchFile関数の結果を取得してテストする処理を書きやすい気がした。 + +- 変換用関数convFileをテストしやすくするために、os.Removeを変換用の関数から外に出した(元ファイルが消えてしまうので非常にやりにくい) + +- ファイルの再帰的探索と変換処理とを分離させた。これまでは一つファイルを見つけてはその場で変換をしていたが、変換対象のファイルを全部見つけた後にまとめて変換することで、探索と変換の両方をテストしやすくした。 + +- 関数内でエラー時にlog.Fatalですぐ終了しまうのをやめ、errorを返り値として返し、呼び出し元でエラーの中身を見て終了するようにした + - すると、関数の戻り値としてエラーを受け取ってテストできる。どのエラーになったかもテストしやすい。 + +## ヘルパー関数 +- 各テスト関数に設置した。 + +## テーブル駆動テスト +- convFileのテストで使用している。 + +## カバレッジ +``` +go test -coverprofile=cover.out +go tool cover -html=cover.out -o cover.html +``` \ No newline at end of file From b5661d1ab18e14c1bedc31a1c1e531097eaf595e Mon Sep 17 00:00:00 2001 From: Udomomo Date: Wed, 21 Nov 2018 23:03:53 +0900 Subject: [PATCH 24/24] change testdata --- kadai1/Udomomo/test.gif | Bin 1999 -> 0 bytes kadai1/Udomomo/test/test2.gif | Bin 1999 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 kadai1/Udomomo/test.gif delete mode 100644 kadai1/Udomomo/test/test2.gif diff --git a/kadai1/Udomomo/test.gif b/kadai1/Udomomo/test.gif deleted file mode 100644 index 13c75232ab61ce6ebf40fccc12a5b37b9df9534c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1999 zcmd7Sdo58XJH1d}8v2cDktrQdo zgR2|J$Xhxg4xdoapvEE z0KlN03NaE(-MLW!Q(eXmW`b!ih$a{S?Ue}k9qok};6}#&$s|n7Z=PXG)=}OGqEmra2oYit$83NJ4gjud#h=6e0=Qn0ucO|*B zg=LfriSorUBTH2nqxXw~c;K?o?;xe?!|;5o1<|$m%=Y=B*Zo%zTp!iWl&G0PU%twKQngI(+|x^tHp9E^8v>+m-uG9kixSgtF{RbswJ){DPekF3)*zwX&3b(haGY6gP2LXMep-h!K5@4^G6x(P7An+G*m>n{89xowk3Rgk zrzF6rLS)4oa-s5GaB6<(W>(&@Ks$!FFj#dV__D5$<9?`7)uQVMJndsnOm~#gH$;<8 z$M#L#HxlU5#6en|elAjt(!OSJ`DmiWs41Z=#>2I4a8Y^F-AQUMWe*cD1I*Ax)@U6w zq5e^^`$SvftZ1o^u!d@;s zZWUvmy_jZgtXRKc@X9&;tP;_a`kQ^j_7&Gc?bBC9mvZ)S7a%>K7AoK8^?b~C4!pqj z$2|wSTUZtfUb^R2FIp09CVL%f`AKlrt4V=*7b`nxh-B>$e?TmY+S0SzE98UUESa8| zO`d<-eppQR;nBT$uWHYgj(CiajV>S0Yw1*EzZw*f`=CR5?B#(@rycPJx1qHQZhp@n L+TU-JlRo|vcCBAl diff --git a/kadai1/Udomomo/test/test2.gif b/kadai1/Udomomo/test/test2.gif deleted file mode 100644 index 13c75232ab61ce6ebf40fccc12a5b37b9df9534c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1999 zcmd7Sdo58XJH1d}8v2cDktrQdo zgR2|J$Xhxg4xdoapvEE z0KlN03NaE(-MLW!Q(eXmW`b!ih$a{S?Ue}k9qok};6}#&$s|n7Z=PXG)=}OGqEmra2oYit$83NJ4gjud#h=6e0=Qn0ucO|*B zg=LfriSorUBTH2nqxXw~c;K?o?;xe?!|;5o1<|$m%=Y=B*Zo%zTp!iWl&G0PU%twKQngI(+|x^tHp9E^8v>+m-uG9kixSgtF{RbswJ){DPekF3)*zwX&3b(haGY6gP2LXMep-h!K5@4^G6x(P7An+G*m>n{89xowk3Rgk zrzF6rLS)4oa-s5GaB6<(W>(&@Ks$!FFj#dV__D5$<9?`7)uQVMJndsnOm~#gH$;<8 z$M#L#HxlU5#6en|elAjt(!OSJ`DmiWs41Z=#>2I4a8Y^F-AQUMWe*cD1I*Ax)@U6w zq5e^^`$SvftZ1o^u!d@;s zZWUvmy_jZgtXRKc@X9&;tP;_a`kQ^j_7&Gc?bBC9mvZ)S7a%>K7AoK8^?b~C4!pqj z$2|wSTUZtfUb^R2FIp09CVL%f`AKlrt4V=*7b`nxh-B>$e?TmY+S0SzE98UUESa8| zO`d<-eppQR;nBT$uWHYgj(CiajV>S0Yw1*EzZw*f`=CR5?B#(@rycPJx1qHQZhp@n L+TU-JlRo|vcCBAl