Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kadai3 2 tamura #53

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions kadai1/tamura/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# 第1回課題 画像変換コマンド

## 使い方
### png変換
```
$ go rum main.go -f sample.png sample.jpg
```

### ディレクトリ配下をpng変換
```
$ go rum main.go -f jpg test/ "sample.png"
```
91 changes: 91 additions & 0 deletions kadai1/tamura/convert/cli.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package convert

import (
"bytes"
"flag"
"fmt"
"os"
"path/filepath"
"strings"
"text/template"
)

var (
format string
)

func init() {
flag.StringVar(&format, "f", "", "ディレクトリ指定の場合に、変換する画像ファイルのフォーマット(`png|jpeg|jpg`)")
flag.Parse()
}

type file string

func (f file) Ext() string {
return filepath.Ext(string(f))
}

func (f file) Dir() string {
return filepath.Dir(string(f))
}

func (f file) Name() string {
return strings.Replace(filepath.Base(string(f)), f.Ext(), "", -1)
}

func Run() error {
args := flag.Args()

if len(args) < 1 {
return fmt.Errorf("画像ファイルを指定してください。")
}

info, err := os.Stat(args[0])
if os.IsNotExist(err) {
return fmt.Errorf("画像ファイルが存在しません。%s", args[0])
}

if info.IsDir() {
t, err := template.New("dst").Parse(args[1])
if err != nil {
return err
}

return filepath.Walk(args[0], func(p string, info os.FileInfo, err error) error {
if err != nil {
return err
}

if info.IsDir() {
return nil
}

ext := strings.ToLower(filepath.Ext(p))

if format != "" {
if ext != "."+format {
return nil
}
} else if ext != ".png" && ext != ".jpg" && ext != ".jpeg" {
return nil
}

var buf bytes.Buffer
t.Execute(&buf, file(p))

imgConvert := Convert{
dst: buf.String(),
src: p,
}

return imgConvert.Convert()
})
}

imgConvert := Convert{
dst: os.Args[2],
src: os.Args[3],
}

return imgConvert.Convert()
}
43 changes: 43 additions & 0 deletions kadai1/tamura/convert/convert.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package convert

import (
"fmt"
"image"
"image/jpeg"
"image/png"
"os"
"path"
"strings"
)

type Convert struct {
dst string
src string
}

func (c *Convert) Convert() error {
sf, err := os.Open(c.src)
if err != nil {
return fmt.Errorf("画像ファイルが開けませんでした。%s", c.src)
}
defer sf.Close()

df, err := os.Create(c.dst)
if err != nil {
return fmt.Errorf("画像ファイルが書き出せませんでした。%s", c.dst)
}
defer df.Close()

img, _, err := image.Decode(sf)
if err != nil {
return err
}

ext := strings.ToLower(path.Ext(c.dst))
if ext == ".png" {
err = png.Encode(df, img)
} else if ext == ".jpeg" || ext == ".jpg" {
err = jpeg.Encode(df, img, &jpeg.Options{jpeg.DefaultQuality})
}
return nil
}
15 changes: 15 additions & 0 deletions kadai1/tamura/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package main

import (
"fmt"
"os"

"./convert"
)

func main() {
if err := convert.Run(); err != nil {
fmt.Fprintf(os.Stderr, "%s\n", err.Error())
os.Exit(1)
}
}
20 changes: 20 additions & 0 deletions kadai2/tamura/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# 第2回課題

# io.Readerとio.Writerについて調べてみよう
## どのように使用されているのか。

* 読み込みでio.Reader、書き込みでio.Writerが利用していた。
→ os.Stdin、os.File、net.Conn、bytes.Buffer

## io.Readerとio.Writerがあることで、どういう利点があるのか。

* 拡張性の実装
様々な出力先を抽象化出来る。少ない改修の規模で拡張可能。
* テストで出力先変更
io.Writerの引数抽象化で、標準出力に書き込み、テストはメモリのバッファに書き込むの切り替えができる
* コードを提供可能
io.Writer,io.Readerが使われているので、活用の幅が広い。

# テスト

作成中
91 changes: 91 additions & 0 deletions kadai2/tamura/convert/cli.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package convert

import (
"bytes"
"flag"
"fmt"
"os"
"path/filepath"
"strings"
"text/template"
)

var (
format string
)

func init() {
flag.StringVar(&format, "f", "", "ディレクトリ指定の場合に、変換する画像ファイルのフォーマット(`png|jpeg|jpg`)")
flag.Parse()
}

type file string

func (f file) Ext() string {
return filepath.Ext(string(f))
}

func (f file) Dir() string {
return filepath.Dir(string(f))
}

func (f file) Name() string {
return strings.Replace(filepath.Base(string(f)), f.Ext(), "", -1)
}

func Run() error {
args := flag.Args()

if len(args) < 1 {
return fmt.Errorf("画像ファイルを指定してください。")
}

info, err := os.Stat(args[0])
if os.IsNotExist(err) {
return fmt.Errorf("画像ファイルが存在しません。%s", args[0])
}

if info.IsDir() {
t, err := template.New("dst").Parse(args[1])
if err != nil {
return err
}

return filepath.Walk(args[0], func(p string, info os.FileInfo, err error) error {
if err != nil {
return err
}

if info.IsDir() {
return nil
}

ext := strings.ToLower(filepath.Ext(p))

if format != "" {
if ext != "."+format {
return nil
}
} else if ext != ".png" && ext != ".jpg" && ext != ".jpeg" {
return nil
}

var buf bytes.Buffer
t.Execute(&buf, file(p))

imgConvert := Convert{
dst: buf.String(),
src: p,
}

return imgConvert.Convert()
})
}

imgConvert := Convert{
dst: os.Args[2],
src: os.Args[3],
}

return imgConvert.Convert()
}
1 change: 1 addition & 0 deletions kadai2/tamura/convert/cli_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package convert
43 changes: 43 additions & 0 deletions kadai2/tamura/convert/convert.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package convert

import (
"fmt"
"image"
"image/jpeg"
"image/png"
"os"
"path"
"strings"
)

type Convert struct {
dst string
src string
}

func (c *Convert) Convert() error {
sf, err := os.Open(c.src)
if err != nil {
return fmt.Errorf("画像ファイルが開けませんでした。%s", c.src)
}
defer sf.Close()

df, err := os.Create(c.dst)
if err != nil {
return fmt.Errorf("画像ファイルが書き出せませんでした。%s", c.dst)
}
defer df.Close()

img, _, err := image.Decode(sf)
if err != nil {
return err
}

ext := strings.ToLower(path.Ext(c.dst))
if ext == ".png" {
err = png.Encode(df, img)
} else if ext == ".jpeg" || ext == ".jpg" {
err = jpeg.Encode(df, img, &jpeg.Options{jpeg.DefaultQuality})
}
return nil
}
1 change: 1 addition & 0 deletions kadai2/tamura/convert/convert_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package convert_test
15 changes: 15 additions & 0 deletions kadai2/tamura/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package main

import (
"fmt"
"os"

"./convert"
)

func main() {
if err := convert.Run(); err != nil {
fmt.Fprintf(os.Stderr, "%s\n", err.Error())
os.Exit(1)
}
}
3 changes: 3 additions & 0 deletions kadai3-2/tamura/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Kadai3-2

## 分割ダウンロードを行う
22 changes: 22 additions & 0 deletions kadai3-2/tamura/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package main

import (
"context"
"fmt"
"time"
)

func main() {
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()

errCh := make(chan error, 1)
errCh <- Run(ctx)

select {
case err := <-errCh:
if err != nil {
fmt.Printf("%v\n", err)
}
}
}
Loading