From 8353479476e6898a1f8a59f705f249b983909567 Mon Sep 17 00:00:00 2001 From: Antoine Date: Wed, 11 Nov 2020 02:22:43 +0100 Subject: [PATCH] Feat : add generic Makefile for build all binary by go source filename --- .gitignore | 2 + Makefile | 29 ++++++++ bin/.gitkeep | 0 defer.go | 18 +++++ docker-credential-extractor.go | 21 ++++++ test.go => employee-test.go | 5 +- example.go | 23 ------ go.mod | 7 ++ go.sum | 2 + goroutine.go | 26 +++++++ gtrad.go | 124 +++++++++++++++++++++++++++++++++ 11 files changed, 231 insertions(+), 26 deletions(-) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 bin/.gitkeep create mode 100644 defer.go create mode 100644 docker-credential-extractor.go rename test.go => employee-test.go (94%) delete mode 100644 example.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 goroutine.go create mode 100644 gtrad.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5112714 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +bin/ +!bin/.gitkeep diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6f5d44b --- /dev/null +++ b/Makefile @@ -0,0 +1,29 @@ +.PHONY: all + +#OPT_VERBOSE=-v +OPT_VERBOSE= + +# Basic go commands +GOCMD=go +GOBUILD=$(GOCMD) build +GOCLEAN=$(GOCMD) clean +GOTEST=$(GOCMD) test +GOINSTALL=$(GOCMD) install $(OPT_VERBOSE) +GOGET=$(GOCMD) get $(OPT_VERBOSE) + +SRCS := $(wildcard *.go) +# This is a substitution reference. http://www.gnu.org/software/make/manual/make.html#Substitution-Refs +BINS := $(SRCS:%.go=bin/%) + +all: $(BINS) + +$(BINS) : bin/% : %.go | bin + @echo "constructing : $@" + @$(GOBUILD) -o "$@" "$^" + +clean: + $(GOCLEAN) + rm -f ${GOPATH}/bin/$(PROGRAM_NAME) + +get: + $(GOGET) github.com/docker/docker-credential-helpers/client diff --git a/bin/.gitkeep b/bin/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/defer.go b/defer.go new file mode 100644 index 0000000..cc34679 --- /dev/null +++ b/defer.go @@ -0,0 +1,18 @@ +package main + +import "fmt" +import "strconv" + +func t(i *int) *int { + *i+=1 + fmt.Println("world : "+ strconv.Itoa(*i)) + return i +} + +func main() { + a := 2 + defer t(&a) + + a = 6 + fmt.Println("hello : " + strconv.Itoa(a)) +} diff --git a/docker-credential-extractor.go b/docker-credential-extractor.go new file mode 100644 index 0000000..c3e9343 --- /dev/null +++ b/docker-credential-extractor.go @@ -0,0 +1,21 @@ +package main + +import ( + "fmt" + + "os" + osx "github.com/docker/docker-credential-helpers/client" +) + +func main() { + + p := osx.NewShellProgramFunc("docker-credential-desktop") + + creds, err := osx.Get(p, os.Args[1]) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + fmt.Printf("Got credentials for user `%s` in `%s` with secret `%s` \n", creds.Username, creds.ServerURL, creds.Secret) +} diff --git a/test.go b/employee-test.go similarity index 94% rename from test.go rename to employee-test.go index fc1bce0..da1ee28 100644 --- a/test.go +++ b/employee-test.go @@ -1,13 +1,12 @@ package main import ( - "fmt" - //mathRand "math/rand" cryptoRand "crypto/rand" + "fmt" "math/big" "time" - "main/employee" + "antoine-roux.ml/projects/go/test/employee" ) var a, b int = 1, 2 diff --git a/example.go b/example.go deleted file mode 100644 index 2d1d53a..0000000 --- a/example.go +++ /dev/null @@ -1,23 +0,0 @@ -package main - -import ( - "fmt" - //mathRand "math/rand" - cryptoRand "crypto/rand" - "math/big" - "time" -) - -func main() { - fmt.Println("Hello, playground", time.Now()) - nBig, err := cryptoRand.Int(cryptoRand.Reader, big.NewInt(27)) - if err != nil { - panic(err) - } - n := nBig.Int64() - - //b := []byte{0} - //r := cryptoRand.Reader.Read(b) - fmt.Println("r", n) - //fmt.Println("Random", mathRand.Seed(r).Intn(9)) -} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..b2f2324 --- /dev/null +++ b/go.mod @@ -0,0 +1,7 @@ +module antoine-roux.ml/projects/go/test + +go 1.15 + +require github.com/docker/docker-credential-helpers v0.6.3 // indirect + +replace antoine-roux.ml/projects/go/test/employee => ./employee diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..2568342 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= diff --git a/goroutine.go b/goroutine.go new file mode 100644 index 0000000..52cb29a --- /dev/null +++ b/goroutine.go @@ -0,0 +1,26 @@ +package main + +import "fmt" + +var battle = make(chan string) + +func warrior(name string, done chan struct{}) { + select { + case opponent := <-battle: + fmt.Printf("%s beat %s\n", name, opponent) + case battle <- name: + // I lost :-( + } + done <- struct{}{} +} + +func main() { + done := make(chan struct{}) + langs := []string{"Go", "C", "C++", "Java", "Perl", "Python"} + for _, l := range langs { + go warrior(l, done) + } + for range langs { + <-done + } +} diff --git a/gtrad.go b/gtrad.go new file mode 100644 index 0000000..35e8d7f --- /dev/null +++ b/gtrad.go @@ -0,0 +1,124 @@ +package main + +import ( + "bufio" + "encoding/json" + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "net/url" + "os" + "strings" +) + +func main() { + // Declare cli supported flag + sourceLang := flag.String("f", "auto", "Source lang from traduction") + targetLang := flag.String("t", "fr", "Target lang to traduction") + flag.Parse() + flag.Usage = func() { + fmt.Fprintf(flag.CommandLine.Output(), "Usage of %s:\n", os.Args[0]) + flag.PrintDefaults() + iso, err := GetIsoCode() + if err != nil { + log.Fatalln(err) + } + fmt.Printf("Supported lang are : %v \n", strings.Join(iso, ", ")) + } + + sentence := flag.Args() + // assert sentence is pass for traduction + if len(sentence) < 1 { + log.Println(errors.New("Too few argument pass sentence to traduct")) + flag.Usage() + os.Exit(-1) + } + + // Parse and read args for reading original sentence from stdin if necessary + var strSentence string + if sentence[0] == "-" { + byteSentence, err := ioutil.ReadFile(os.Stdin.Name()) + Check(err) + strSentence = string(byteSentence) + } else { + strSentence = strings.Join(sentence[:], " ") + } + + // Prepare http parameter + domain := "translate.googleapis.com" + schema := "https" + params := url.Values{ + "client": {"gtx"}, + "sl": {*sourceLang}, + "tl": {*targetLang}, + "dt": {"t"}, + "q": {strSentence}, + } + url := fmt.Sprintf("%s://%s/translate_a/single?%s", schema, domain, params.Encode()) + + // Made http Get request + resp, err := http.Get(url) + Check(err) + defer resp.Body.Close() + + fmt.Println(ParseAnswer(resp.Body)) +} + +// ParseAnswer parsing google traduction response +func ParseAnswer(data io.Reader) string { + var res []json.RawMessage + err := json.NewDecoder(data).Decode(&res) + Check(err) + + var resSentence [][]json.RawMessage + err = json.Unmarshal(res[0], &resSentence) + Check(err) + + var finalSentence string + // Print traducted sentence + for _, e := range resSentence { + // Extract traducted sentence from json response + var r string + err = json.Unmarshal(e[0], &r) + Check(err) + finalSentence += r + } + return finalSentence +} + +// Check error handling +func Check(err error) { + if err != nil { + log.Println(err) + flag.Usage() + os.Exit(-1) + } +} + +// GetIsoCode return list of all iso 639-1 langage abreviation +func GetIsoCode() ([]string, error) { + // File returned had following format aar||aa on multiline + resp, err := http.Get("http://www.loc.gov/standards/iso639-2/ISO-639-2_utf-8.txt") + if err != nil { + return []string{}, err + } + defer resp.Body.Close() + + var iso []string + sc := bufio.NewScanner(resp.Body) + for sc.Scan() { + langAbr := strings.Split(sc.Text(), "|")[2] + if langAbr != "" { + iso = append(iso, langAbr) + } + } + if err := sc.Err(); err != nil { + return []string{}, err + } + + return iso, nil +}