- 1. 【Go】ルーティングライブラリgo-chiの使い方
- 2. MAC OSに言語(GO&Python)をインストール
- 3. revel(go)のアプリケーション環境を構築
- 4. go言語でHTMLをスクレイピングしてそれを送信するslackbotを作成する
- 5. Golang 基礎(並列処理) part3
- 6. 【Go】【Ginkgo】FizzBuzzをGinkgoでテストしてみる
- 7. nuxtのformからPOSTされたデータをgoのサーバで受け取る(私的メモ)
- 8. Go構造体の`json:hoge`の正体を探る
- 9. golang + sonarqube + codebuild
- 10. 【Go】ユニットテストのMock、Table driven Testとか
- 11. GoでバイナリからJPEG生成
- 12. Golang 基礎 (struct周り)part2
- 13. Golang 基礎 (環境構築など) part1
- 14. ProxyConnectHeaderを使ってhttp.ClientによるCONNECTメソッドにヘッダーを付加する
- 15. Go言語アプリのDockerイメージをscratchで軽量化してみた
- 16. Goを使ってコマンドプロンプト(cmd)のコマンドを実行
- 17. Goのfyneで日本語を文字化けさせない手っ取り早い方法
- 18. Github ActionsでGoのCI環境を作成する
- 19. Visual Studio Code + WSL2でGo開発環境構築
- 20. AzureでWebアプリを稼働させる「App Service」とGo
【Go】ルーティングライブラリgo-chiの使い方
# go-chi
– net/http
– go-chi
– gorilla
– echoとかがあると思います(他にもあるけど省略)が、go-chiやgorillaはその中でもフレームワークとして使いやすいながらにハンドラでは標準パッケージのnet/httpをそのまま使用できたり導入しやすい部類に入ると思います。実際に見ていきましょう。
“`
$ go get github.com/go-chi/chi
“`## 使っていきます
まずはハンドラを定義します。ハンドラ自体はnet/httpを使うので、ライブラリを消したくなった場合はルーティングの記述だけを変更すれば良いです。
“`go:handler.go
package handlerfunc Get(w http.ResponseWriter, req *http.Request) {
// ハンドラを記述
fmt.Println(“呼ばれた”)
return
}
“`ルーティングでハンドラを呼び出します。
“`go:router.go
package routertype R
MAC OSに言語(GO&Python)をインストール
## はじめに
今更ながらMacMini 2020を購入しため、プログラミングの勉強を最近行っているので、
備忘録も兼ねて言語のインストール履歴を記載しておきます。## HomeBrewのインストール
Mac OSのパッケージ管理システムで、CentOSで言うところのyumやdnfと同じです。
インストールにては以下コマンドを実行します。“`conseole
/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
“`私は現在GOとPythonを使ってプログラミング学習を行っているので、以下2つをインストールしておきます。
## GOのインストール
“`conseole
$ brew install go$ go version
go version go1.14.6 darwin/amd64
“`## Python 3系のインストール
“`conseole
$ brew install pyenv
$
revel(go)のアプリケーション環境を構築
goのアプリ開発するためのフレームワークがいくつかあります。
その中でも、revelがMVCの思想を深く取り入れているものの一つとされています。
本記事では、goをインストールしていない状態からrevelのアプリ起動までを行った際の手順を残していきます。# 前提
brew がインストールされていることが前提です。# brewをアップデートする
まず初めにbrewを最新のものにアップデートしましょう。“`
$ brew update
“`# goenvをインストールする
“`
# goenvをインストール
$ git clone https://github.com/syndbg/goenv.git ~/.goenv
“`利用しているシェルに環境変数を設定する。
“`~/.zshrc
export GOENV_ROOT=$HOME/.goenv
export PATH=$GOENV_ROOT/bin:$PATH
eval “$(goenv init -)”
“`設定が完了したら、シェルに反映させ、
goenvが利用できる状態になっているか確認します
go言語でHTMLをスクレイピングしてそれを送信するslackbotを作成する
# はじめに
普段はvueとかtypescriptとか使って、フロントエンドを書いています。
純粋に興味がありgo言語を1から勉強し始め、試しにスクレイピングして取ってきたデータを定時実行で送るslackbotを作成しました。
結構似たようなこと書いてる記事が多いのですがあまり最新の情報がなくメモのためでもあります。
go言語触り始めたばかりなのでコードが理解できず不要なのが混じっているかもしれませんがご了承ください。完成したのはこんな感じです、ローカルで試したときなので時間はおかしいです。
ソースコードは[こちら](https://github.com/mmmommm/unigurikun)にあります、よかったらstar押していってください!
Golang 基礎(並列処理) part3
[part2](https://qiita.com/mi11km/items/8b336736ed66ec48705c)の続き
## goroutine
goroutine: 並列処理。
go 処理 とかく。処理が終わらなくても、プログラムのコードは終了する。
対策①sync.WaitGroupを使う!“`golang
package mainimport (
“fmt”
“sync”
)func goroutine(s string, wg *sync.WaitGroup) {
defer wg.Done() // 並列処理が終了したと伝える
for i := 0; i < 5; i++ { fmt.Println(s) } } func normal(s string) { for i := 0; i < 5; i++ { fmt.Println(s) } } func main() { var wg sync.WaitGroup wg.Add(1) // 処理するべき並列処理を1つ追加する go goroutine("world"
【Go】【Ginkgo】FizzBuzzをGinkgoでテストしてみる
## はじめに
最近Goの勉強をしてて、簡単なWebサーバーを作ってみたり、コマンドラインで動作するツールを作ったり、、、としているんですけど、そういやテスト書いたことないなあと思って今回の記事を書くことにしました!## Ginkgoを選んだ理由
Ginkgoの書き方がなんとなくrspecに似てるからです。
昔Railsを書いていたことがあるので、簡単に書けるんじゃないかな〜っていう安易な発想です。## テストの準備
Ginkgoをインストールします。“`
go get github.com/onsi/ginkgo/ginkgo
go get github.com/onsi/gomega/…
“`ディレクトリとテスト用ファイルを作成します。
“`
mkdir fizzbuzz
cd fizzbuzz
ginkgo bootstrap
ginkgo generate fizzbuzz
“`## 実装
今回作成するテストケースは以下の通りとします。よく見るFizzBuzzですね。– 数値が3の倍数であれば「Fizz」を返す
– 数値が5の倍数であれば「
nuxtのformからPOSTされたデータをgoのサーバで受け取る(私的メモ)
## nuxt.js(vueファイル)
Vuetifyのコンポーネントを活用し、formを作成、validationとresetボタンを実装しました。
“`vue
Go構造体の`json:hoge`の正体を探る
# TL;DR
“`go:
type Person struct {
Name string `json:”name”`
}
“`– “ `json:”name”` “ は構造体のタグ
– `reflect.TypeOf(Person).Field(0).Get(“json”)`で取り出せる!# はじめに
Go言語でjsonを扱うとき、構造体定義にjsonのフィールド名を書くと思います。“`go:
type Person struct {
Name string `json:”name”`
Age int `json:”age”`
Address string `json:”address”`
}
“`おまじないと思って深く考えず使っていましたが、
– そもそも“ `json:”name”` “って何?
– ただのコメント?
– jsonのためだけの特別構文?という疑問がわいたので調べてみました。
# json:hoge は構造体のタグ
公式ドキュメントに早速答えがありました。~~ちゃんとふだんから読みなさ
golang + sonarqube + codebuild
https://qiita.com/fake-deli-ca/items/e01a42a9d04cf0bab8c4
の後にJenkinsじゃなくてCodeBuildも対応してみたんだけど、異様にわかりにくくて、時間かかった…。# 結論
最初に結論から。
関係する箇所のみ抜粋してある。“`buildspec.yml
version: 0.2env:
variables:
GO_VERSION : “”
PROJECT_VERSION : “”
# 本来はParameter-Storeにすべき
SONARQUBE_TOKEN : “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”phases:
install:
runtime-versions:
golang: ${GO_VERSION}
commands:
– type go && go version
– chmod +x ./gradlew
– export
【Go】ユニットテストのMock、Table driven Testとか
下記のコースのアウトプットになります。
[Unit testing for Go developers \| Udemy](https://www.udemy.com/course/unit-testing-go-developers/)参考にした記事
[Goでテストを書く(テストの実装パターン集) – Qiita](https://qiita.com/atotto/items/f6b8c773264a3183a53c)## Golang のテスト
### 実行コマンド
`go test ./…`詳細を知りたい場合は下記
`go test -v ./…`### メッセージ
TODO## Table driven Test
>Table Driven Testとは、それぞれの行が入力と期待する出力を含んだテストケースになっているテーブルを作り、それをループして実行する形式のテストです。
[DMMにおけるユーザーレビュー基盤の変革(Goのテスト技法編) – DMM inside](https://inside.dmm.com/entry/2019/03/28/
GoでバイナリからJPEG生成
Goでバイナリでファイルを受け取った際にそのまま加工したい時
結論
bytes パッケージを使おう
[Go言語 パッケージ bytes](https://xn--go-hh0g6u.com/pkg/bytes/)## ソースコード
“`golang:main.go
package main
import (
“bytes”
“fmt”
“image”
“image/jpeg”
“io/ioutil”
“os”
)func main() {
// ファイルの読み込み
buf, _ := ioutil.ReadFile(“input.jpg”)// バイナリファイルをReaderに読み込み
reader := bytes.NewReader(buf)// 画像変換
img, _, err := image.Decode(reader)
if err != nil {
fmt.Errorf(“err %v”, err)
}// ファイル作成
f, err := os.Create(“output.jp
Golang 基礎 (struct周り)part2
[part1](https://qiita.com/mi11km/items/ea76eeba32bff67b17a5)の続き
## makeとnewの違い
どちらも値を入れずメモリ領域を確保する。違いはポインタが返ってくるかどうか。“`golang
// 返ってこない
s := make([]int, 0)
m := make(map[string]int)
ch := make(chan int)// 返ってくる
var p *int = new(int)
var st = new(struct{})
“`cf. 中身はnil (メモリ確保していない)
“`golang
var s []int
var m map[string]int
var ch chan int
var p *int
“`## struct
“`golang
type Vertex struct {
X, Y int
S string
}
“`
v1とv2は同じ意味。v3とv4は同じ意味。“`golang
v1 := Vertex{} // {0 0 }
var v
Golang 基礎 (環境構築など) part1
# 前準備や基本情報
## パッケージ管理
ターミナルで実行。go.modファイルが作成される。“`
go mod init github.com/${GITHUB_USER}/${PROJECT_NAME}
“`
あとは go get するだけ。## 実行環境(docker)
main.goがあるディレクトリに以下を置く。(go.sumは1回でもgo getしてる場合のみCOPYする)“`dockerfile:Dockerfile
FROM golang:alpineWORKDIR /go/src/app
COPY go.mod .
# COPY go.sum .
RUN go mod downloadCOPY . .
“`
“`yml:docker-compose.yml
version: “3.7”services:
goapp:
build: .
tty: true
volumes:
– .:/go/src/app
“`
以下のコマンドでコンテナの中に入る。(goappはサービス名)“`
~%
ProxyConnectHeaderを使ってhttp.ClientによるCONNECTメソッドにヘッダーを付加する
## 事象
Go 1.14.2の環境で、認証Proxyを経由して任意のサイトにアクセスするHTTPクライアントを実装していたところ、接続先がHTTPSのときに認証proxyから407が返ってしまいました。“`go:再現コード(main.go)
func main() {
u, _ := url.Parse(“http://127.0.0.1:3128”) // ローカルにsquidを立て、認証Proxyとした
req, err := http.NewRequest(“GET”, “https://yahoo.co.jp”, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Add(“Proxy-Authorization”, “Basic“)
c := &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyURL(u),
},
}
resp, err := c.Do(req)
if err !=
Go言語アプリのDockerイメージをscratchで軽量化してみた
こんばんは、ねじねじおです。
Go言語で書いたアプリの Docker イメージを軽量化するには、マルチステージビルドを使って scratch をベースに構築するのがよいと聞いて、やってみました。
## 準備
まず、サンプルとして小さな Web API を echo で作ります。
“`sh
$ mkdir app
$ cd app
$ go mod init example.com/example
$ go get github.com/labstack/echo/v4
“`下記のディレクトリ構成で server.go と Dockerfie を追加します。
“`
-example
|-app
│-Dockerfile
│-go.mod
│-go.sum
|-server.go
“`“`golang:server.go
package mainimport (
“net/http”
“time”“github.com/labstack/echo/v4”
“github.com/labstack/echo/v4
Goを使ってコマンドプロンプト(cmd)のコマンドを実行
## GoはPythonみたいに使えてしかも環境に合わせたバイナリを作成してくれるやばい言語
最近Goにはまっていまして単純なことをしようとしてもちょっと詰まったりしたので
備忘録としてここに残しておきます。## Goを使ってコマンドプロンプト(cmd)のコマンドを実行
以下で実行できます。あらかじめcmdを**「cmd /C」**しておくところがポイントです。“` go
package mainimport (
“fmt”
“os/exec”
“time”
“log”
)func main() {
out, err := exec.Command(“cmd”, “/C”, “echo hello > test.txt”).Output()
if err != nil {
log.Fatal(err)
}else{
fmt.Println(out)
}
}
“`## 改訂履歴
– 2020/8/10 新規作成
Goのfyneで日本語を文字化けさせない手っ取り早い方法
## fyneでサンプルアプリを動かそうとしたら文字化けに遭遇
GOについて暇さえあれば勉強している私です。将来的にはGUIのアプリで設定ファイルを作成するものを製作し会社のサービスとして提供する予定です。
そのためによいGUIのライブラリはないかと探していたところ[fyne](https://github.com/fyne-io/fyne)を見つけました
早速以下のようなサンプルを以下の環境で作ったところフォントが文字化けしました。
– OS:Windows10
– Go:go version go1.14.7 windows/amd64“` go
package mainimport (
“fyne.io/fyne/widget”
“fyne.io/fyne/app”
)func main() {
app := app.New()w := app.NewWindow(“こんにちは”)
w.SetContent(widget.NewVBox(
widget.NewLabel(“こんにちは Fyne!”),
widget.NewButton(
Github ActionsでGoのCI環境を作成する
# はじめに
みなさんCIしてますか?
ちなみに僕はCIは大好きですが、それの環境構築をするのは大嫌いです。
毎回細かい設定をしたり、ごちゃごちゃといろんなことをやらなければいけないのは本当に憂鬱です。
ということで今回は新しくサービスを作成するときに必要であろうGoのアプリケーションのCIをGithub Actionsで簡単にやりたいと思います!# Github Actionsについて簡単に、、、
Github ActionsはGitHubが2019年11月に正式に公開したGitHub上のリポジトリやイシューに対するさまざまな操作をトリガーとしてあらかじめ定義しておいた処理を実行できる機能です。
これまでの– Circle CI
– Jenkinsの兄弟みたいな物だと思ってもらえるといいと思います!
またGithub Actionsは `.github/workflows/`配下にymlファイルを作成することで処理を実行してくれます
“`
├── .github
│ └── workflows
│ └── ci.yml
“`# 今回のゴール
Visual Studio Code + WSL2でGo開発環境構築
WindowsからTeraTerm等のターミナルソフトを使って、Linuxサーバにssh接続し、Linux上で開発をすることは、一般的に行っていると思う。しかし、Windows用のVS CodeのIntellisenseやdebug機能を使いたい!と思うこともよくある。そんなことが、WSL2を使うことで簡単にできちゃうので、紹介してみる。
## インストール
### Remote Development Extention
VS Codeの画面左側の`Extensions(Ctrl + Shift + X)`メニューで、`Remote Development`を検索し、インストール。とっても簡単。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253975/e1064208-ba60-ac63-65fe-aa650728f9c2.png)
### WSL2 + Linux Distribution
ググればわかりやすいページがたくさんヒットするので、頑張りましょう。なお、私も書いて
AzureでWebアプリを稼働させる「App Service」とGo
Azureには、Webアプリを稼働させるPaaSとして「App Service」が用意されています。
通常は、WebアプリをWindows上でネイティブに稼働させる「App Service(App Service on Windows)」となります。
– [App Service | Microsoft Azure](https://azure.microsoft.com/ja-jp/services/app-service/)
WebアプリをDocker化してLinuxコンテナーとして稼働させる「Web App for Containers(App Service on Linux)」も用意されています。
– [App Service – Web App for Containers | Microsoft Azure](https://azure.microsoft.com/ja-jp/services/app-service/containers/)
当初、Goは「App Service」にて実験サポートされていたのですが、2017年12月に対象外となりました(T_T)