- 1. Golang 基礎 メモ part1
- 2. ProxyConnectHeaderを使ってhttp.ClientによるCONNECTメソッドにヘッダーを付加する
- 3. Go言語アプリのDockerイメージをscratchで軽量化してみた
- 4. Goを使ってコマンドプロンプト(cmd)のコマンドを実行
- 5. Goのfyneで日本語を文字化けさせない手っ取り早い方法
- 6. Github ActionsでGoのCI環境を作成する
- 7. Visual Studio Code + WSL2でGo開発環境構築
- 8. AzureでWebアプリを稼働させる「App Service」とGo
- 9. AtCoder Grand Contest初挑戦
- 10. Go言語のhttp.Handle、http.HandleFuncを雑に理解する
- 11. [Go] pprofの使い方を改めて整理した
- 12. AzureやGoの情報を絡めた私なりのde:code 2020のセッション紹介
- 13. golangのio.Readerは使い回しできない
- 14. レガシーエンジニアによるDocker入門
- 15. Goで画像をクリップボードに保存、読み取るライブラリを作った
- 16. 【GoネットワークプログラムでIPv6対応させる】自分のグローバルアドレスを知る方法
- 17. 【GoネットワークプログラムでIPv6対応させる】アドレス+ポート組み合わせの作り方
- 18. あなたのファイル、ソーシャルディスタンス保てていますか?
- 19. 【Go】Windowsでginフレームワーク触ってみた
- 20. Docker SDK & Go言語 を使ってAWS ECRのimageをpull & run する
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はサービス名)“`
~% docker-compose up
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)
AtCoder Grand Contest初挑戦
8/9(日)、初のAtCoder Grand Contestを挑戦いたしました。
勉強中のgo言語を利用して、「[C – Product Modulo](https://atcoder.jp/contests/agc047/tasks/agc047_c)」だけを実施したが、どうしても、実行時間が2秒以内に抑えず(実績:2205 ms)、初挑戦が失敗した。
“`golang
package main
import (
“fmt”
)func main() {
var n int
fmt.Scanf(“%d”, &n)
slice := make([]int,n,n)
for i := 0; i < n; i++ { fmt.Scanf("%d", &slice[i]) } total:=0 for i:=0;i0 {
for j:=1+i;j0 {
total += slice[i]*slice[j]%200003
}
Go言語のhttp.Handle、http.HandleFuncを雑に理解する
# はじめに
最近Goに入門しました。`http.Handle`、`http.HandleFunc`、`http.Handler`、`http.HandlerFunc`についてまとめられている記事は溢れていますが、結局何パターンの書き方があるのかまとまっている記事がなかったので、まとめておきます。対象は、筆者と同じぐらいのGo言語初心者を想定しています。# 実装
下の5パターンが考えられる全てだと結論付けました。他の方法を知っている方がいらっしゃいましたら教えていただきたいです。“`golang
package mainimport “net/http”
type one struct {
}func (h *one) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(“one\n”))
}func two(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(“two\n”))
}func three(w h
[Go] pprofの使い方を改めて整理した
# はじめに
Go言語でのプロファイリングといえば`go tool pprof`ですがコマンドの仕様と使い方がわかりづらく感じていたので不明瞭であった点をまとめました。
# TL;DR
* プロファイリング方法として1. go testのベンチマークで取る方法と、2. コードに追記する方法がある。
* 2. コードに追記する方法の中に、2-1. `”runtime/pprof”`と、2-2. `”net/http/pprof”`の2つがある。
* `pprof [-option] [binary]# プロファイリン
AzureやGoの情報を絡めた私なりのde:code 2020のセッション紹介
2020年8月8日(土)にオンラインで開催されたMicrosoft Open Tech Night主催の
– [de:code夏まつり ~よりコミュニティを楽しくするためのコミュニティのすすめ the FINAL
](https://msdevjp.connpass.com/event/183747/)にて「[I am gaining the skills I want! 〜What inspired me to take one step for being a “Go MVP” through de:code and summer festival〜](https://www.slideshare.net/qt-luigi/i-am-gaining-the-skills-i-want-what-inspired-me-to-take-one-step-for-being-a-go-mvp-through-decode-and-summer-festival)」というタイトルで発表をさせて頂きました。
[![thumbnail](https://image.slideshar
golangのio.Readerは使い回しできない
# はじめに
こんにちわ、すえけん(@sueken5)です。この記事ではgolangのio.Readerが使い回しができないことを紹介します。
# io.Reader
io.Readerはioパッケージで提供されているインターフェースです。([ドキュメント](https://golang.org/pkg/io/#Reader))
“`go
type Reader interface {
Read(p []byte) (n int, err error)
}
“`具体的にこのインターフェースを満たしているものを例に挙げると
– http.ResponseのBodyフィールド ([ドキュメント](https://golang.org/pkg/net/http/#Response))
– os.File ([ドキュメント](https://golang.org/pkg/os/#File))などが挙げられます。
いわゆるストリーム系のものがこのio.Readerインターフェースを満たしています。
# 使い回せない?
本題です。次の出力は何になるでしょうか?
レガシーエンジニアによるDocker入門
# 初めに
この記事は技術進化が5年前くらいで止まっている環境で働く私が、モダンな技術に触れる為に学習したことを記録したものです。
暇潰しに読んでいただければ幸いです
本記事では、– **Windows10 Home + WSL2の環境に、Dockerをインストール**
– **Golang + GitがインストールされているコンテナをDockerfileで立ち上げる**
– **VSCodeからコンテナに接続してHello World**の3つを行います。
# Dockerとは?
DockerはOracleVM等と同様、**仮想環境を提供するソフトウェアです。**OracleVMのようにOS全体を仮想化せず、OSの一部とアプリケーションの実行環境をまとめた**コンテナ**と呼ばれる仮想環境を提供します。コンテナは**Dockerfile**というテキストファイルを元に作成され、Dockerfileが同一であれば、どのOSでも同一の環境を作ることができます。
**Docker**と呼ばれるものは正確にはDocker engineを指し、Docker engineはDoc
Goで画像をクリップボードに保存、読み取るライブラリを作った
こんにちわ
ゴリラです画像をクリップボードにコピー、コピーした画像をクリップボードから読み取るGoのライブラリ [clipboard-image](https://github.com/skanehira/clipboard-image) をつくったので紹介します。
このライブラリはMac、Linux、Windowsで動作します。先日 [Goでソースコードを画像化するCLIを作った](https://qiita.com/gorilla0513/items/013aea9060bca1455137) で紹介したCLIではこのライブラリを使っています。
## 使い方
関数は2つのみ– `CopyToClipboard`
– `ReadFromClipboard`画像ファイルをクリップボードにコピーするときは `CopyToClipboard`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/598e7a39-59fc-fc35-9982-9093fefde5ff
【GoネットワークプログラムでIPv6対応させる】自分のグローバルアドレスを知る方法
# 理由
ネットワークプログラムで、自身のグローバルIPアドレスを知る必要がある場合がある。その場合のコード例をメモしておく# 参考コード
“`golang:main.go
package mainimport (
“fmt”
“github.com/skubota/extip”
)func main() {
addr,err := extip.GetIP()
if err != nil {
fmt.Errorf(“Address cannot get : %s\n”, err)
}else{
fmt.Printf(“Adress : %s\n”,addr)
}
}
“`– 結果(IPv6/IPv4対応クライアント)
“`
Adress : 2xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
“`– 結果(IPv4のみ対応クライアント)
“`
Adress : 2xx.xxx.xxx.xxx
“`## 解説
標準パッケージではないが、「skubota/extip」というIPv6対応のSTU
【GoネットワークプログラムでIPv6対応させる】アドレス+ポート組み合わせの作り方
# 理由
「IPアドレス:ポート番号」の文字列はいろいろな箇所で意味を持った使われ方をするので、よく利用する記法ではあるが、
Goで書かれたネットワークプログラムをIPv6に対応させるためには少し考慮する必要がある。その場合のコード例をメモしておく# 参考コード
– https://play.golang.org/p/4e5y1PHj9co“`golang:main.go
package mainimport (
“fmt”
“net”
)func main() {
// 対象のアドレスをスライスに入れる
addrs := []string{“2001:db8::1”, “192.168.0.1”, “2001:db8:0:0:1:0:0:1”, “::1”, “2001:db8:aaaa:bbbb:cccc:dddd:eeee:AaAa”, “2001:db8::aaaa:0:0:1”, “::192.0.2.1”}// スライスを1つづつチェック
for i, v := range addrs {
// 例として:80を付加していく
あなたのファイル、ソーシャルディスタンス保てていますか?
## 注意
__この記事は今の御時世に関係ありますが、まじめな記事ではございません。__# はじめに
最近コロナのせいで、いつも以上に電車やバスなどで他の乗客との距離感が気になったり、
ドラマや映画で密になっていたりすると「これめっちゃ密やん」って思ったりしますよね。__それと同じで、ファイルの中身を見ているとなにかムズムズしませんか?__
しますよね?
__それって行間のソーシャルディスタンスが保てていないからじゃないですか?__
__そんなムズムズを解消してくれるプログラムを GO で作ってみました!__
# ファイルがソーシャルディスタンスを保つ方法
ウェブサイトで推奨されているフォントサイズが__約 3 ~ 4 mm__ 、
日本の社会的距離の推奨距離である __2.0 m__ から、
__571 行__の行間を開けることで、ファイルに社会的距離を保たせることにしました。# 環境
* OS : Windows10
* Go : 1.14.6
* エディタ : Visual Studio Code# プログラム
プログラムのソースコードはこんな感じ。
Go
【Go】Windowsでginフレームワーク触ってみた
Go言語でのWEBアプリは、どうなもんか軽く触れてみようという事で、
簡単なログイン認証の機能を作ってみました。#参考
[公式](https://golang.org)
[goの環境構築](https://techfun.cc/go/golang.html)
[ginの環境構築](https://qiita.com/wsuzume/items/75d5c0cd2dd5a1963b9e)
[Go database/sql チュートリアル 01 – 概要 · golang.shop](https://golang.shop/post/go-databasesql-01-overview-ja/)#環境
windows10
go1.14.7
エディタ:VisualStdioCode#1.goの実行環境インストール
以下のサイトの通りに実施する事で、特にはまることも無く構築できました。
[goの環境構築](https://techfun.cc/go/golang.html)あと、インストーラがupdateされたのか、環境変数は手動で設定しませんでした。
インストール完了時点
Docker SDK & Go言語 を使ってAWS ECRのimageをpull & run する
「AWS ECRにログインして docker imageを pullし、docker runする」
このような作業はあまりプロダクションで手動でやることはありませんが、やるとすれば普通に “` aws-cli “`を使ってECRにLogin, 後は “` docker “`コマンドでの作業となるかと思います。
ところで、Go製であるDockerには公式SDKがあります。
今回とある事情があり、 “` github.com/aws/aws-sdk-go “` と “`github.com/docker/docker “` を使って**上記の作業をGoのコードのみでやる**機会がありました。[Develop with Docker Engine SDKs](https://docs.docker.com/engine/api/sdk/)
[Examples using the Docker Engine SDKs and Docker API](https://docs.docker.com/engine/api/sdk/examples/)ググっても出て