Go関連のことを調べてみた2020年05月14日

Go関連のことを調べてみた2020年05月14日

docker-composeで作ったgoサーバーを雑にawsのec2にデプロイする

# はじめに
以前docker-composeで作成したgoサーバを簡易的にデプロイする必要があるタイミングがあったのですが、いい感じにハマりまくって地獄を見たのでとりあえずでawsにデプロイする方法を簡単にまとめておきたいと思います

# ローカルでdocker-composeで動くgoサーバを作る
まずはソースツリーから、、、

“`
test-docker
│ 
├── docker
│   ├── app
│   │   └── Dockerfile
│   └── db
│   └── conf.d
│   └── mysql.conf
├── docker-compose.yml
├── go.mod
├── go.sum
├── main.go
├── models
│   └── init.go
└── start.sh
“`
## Docker周り

“`dockerfile:docker/app/Dockerfile
FROM golang:latest
RUN mkdir test-docker
WORKDIR /test-docke

元記事を表示

GoでDeque(両端キュー)

– Golangの標準ライブラリにDeque両端キューが見つからなかったので自作した
– sliceの先頭に追加する処理は(実装によるだろうが)遅かったので採用していない

“`golang
package main

import (
“fmt”
)

func newDeque() *deque {
return &deque{}
}

type deque struct {
prep []interface{}
ap []interface{}
}

func (d *deque) push(item interface{}) {
d.ap = append(d.ap, item)
}

func (d *deque) unshift(item interface{}) {
d.prep = append(d.prep, item)
}

func (d *deque) empty() bool {
return len(d.ap) == 0 && len(d.prep) == 0
}

func (d *deque) pop() interface{} {

元記事を表示

【Golang】Byte型

#【Golang】Byte型
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main
//バイト型
//ネットワーク系、ファイルの読み書き系で使われる

import “fmt”

func main() {
//バイト型 アスキーコード
//初期化
b := []byte{72, 73}
fmt.Println(b)
//>>72,73

//string() 文字列に変換
fmt.Println(string(b))
//>>HI

//バイトのスライスに変換
c := []byte(“HI”)
fmt.Println(c)
//>>72,73

//文字列に変換
fmt.Println(string(c))
//>>HI
}
“`

元記事を表示

Golang1.14でt.Logの出力がちょっと変わったらしいので今更試してみた

# □ 背景っぽいもの

最近golangの最新情報追えてないなーと思いながら、[golang1.14のリリースノート](https://golang.org/doc/go1.14
)を眺めていたらにこんな事が書いてありました。

> Testing
> go test -v now streams t.Log output as it happens, rather than at the end of all tests.

引用 https://golang.org/doc/go1.14

英語が苦手なニワトリが和訳に自信がなかったので、Google先生に頼んで翻訳してもらうと
*「go test -vt.Logすべてのテストの最後ではなく、発生時に出力をストリーミングするようになりました。」*
とのこと。

正直これを見て
「ほーん、なるほど(え?大して変わってなくない?)」
程度にしか感じていなかったのですが、何事も知ったかぶりは良くない。
慢心、ダメ絶対。

というわけで、「そうだ試してみよう」と思い立ったので試した結果をまとめていきます。

# □ 試してあそぼう

元記事を表示

【Go】脱Go初心者のためにGoでオンライン交流会に役立つツールを制作してみた

# はじめに
Go案件に携わりたいなと思い、お勉強のがてらこんなツールを作りました。
制作過程をまとめようと思っていたんですけど、つまづいたポイントをまとめただけになりました。。
合間を見てどんどん機能を追加していこうと思います!

・デモGIF
![gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113263/927f2061-54bd-c89d-d27c-b2b0567e5930.gif)

・URL
https://group-shuffle-app.herokuapp.com/

・Github
https://github.com/yagi-eng/group_shuffle_gui

# ツールの説明
以下の問題解決を目的としたツールです。

– 交流会などで、複数回参加者をシャッフルしてグループ分けする
– なるべく重複しないようにする

## おおまかな流れ
1. 参加者の組み分けをランダムに生成し、以下の評価方法に基づき評価
2. 1.を複数回繰り返し、一番評価が良い組み分けを最

元記事を表示

aws-sdk-goでS3のオブジェクトを取得しようとして「SignatureDoesNotMatch」と言われたら

# signed urlを使っているわけでもないのにSignatureDoesNotMatchと言われる

ACLを設定していない、signed urlも使っていないバケットに対して接続してオブジェクトの取得をするコードを実装したら、 `SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.` と言われてしまいました。
同じようなエラーにハマった人の手助けになれば幸いです。

## TL;DR

* バケット名に `/` を含めないようにする。

## コード

“`golang:コードは適当ですが雰囲気はこんな感じです.go
func hogehoge() error {
config := aws.Config{
Region: aws.String(os.Getenv(“REGION”)),
}
sess := session.New(&config)

元記事を表示

fizzfazzを噛み砕く

あんま噛み砕けてないわ・・・w
##近況報告
 一歩踏み出すことを助けてくれることば
・思い立った日が吉日,その日以降は凶日(トリコ)
・運命が僕を追いかけるくらいに清潔な衝動に正直でいたい(ポルノグラフィティ)
・本気でそれをなしたいと思えば世界があなたに味方をしてくれる(アルケミスト)
・選択しなかった道は最悪の結末が待っている(ラブホスタッフ上野さん)

やってから考える。死ぬこと以外かすり傷。

# 今日のお題
 while文を用いた演算処理

## 背景
某社のオンラインテストでボコボコにされたので勉強した

## ruby
### 1から100までの総和

“`
i = 1
def calc(i)
sum = 0
while i <=100 do sum += i i += 1 end puts sum end calc(i) ``` ### fizzfazz(3の倍数と5の倍数で) ``` def fizzFazz(i) while i <16 do if i%3 == 0 && i%5 == 0 puts "fi

元記事を表示

Goで3分「Hello world」

# はじめに
この記事は、筆者がGo入門の道中で、Helloworldを通してGo言語の基本的な使い方を
ちょっとだけ学んだので、忘れないようにメモです。
Pythonなど他の言語を学んだことのある方はスムーズに進められると思います。
# 実行環境
macOS 10.15.4
ターミナル 2.10
Go 1.14.2
# Goのインストールについて
もうインストールが済んでいる方対象です。
済んでいない方は、[こちら](https://qiita.com/yosemite2307/items/08dce692894c92ae08ee)の記事を参考にインストールしてからお読みください。
あと、パスも通しておいてください。
# プログラムファイルを作成
どこかに、Helloworld(名前は別になんでもいい)フォルダを作成してください。
それをテキストエディタで開き、その中に拡張子.goのファイルを作成してください。
筆者はhello.goで作成しました。
ここにプログラムを書いていきます。
# プログラム
“`go
package main //名前空間を分けるためらしいです。

元記事を表示

【Go言語】2つの日付間の日付リスト/月リスト/時刻リストを作成する

最近は(個人的な趣味により)分析タスクの前処理など、できるだけGoで書くようにしています。
PythonやRではかんたんに書ける処理ですしGoのベーシックな処理なので今更感もありますが、検索してすぐに見つからなかったので自分用のメモを兼ねて。

もっと良い方法があればコメントいただけると幸いです。

# 日付リストを出力

開始日と終了日を指定し、その間にある日付リストを表示します(開始日・終了日を含む、以降同様)。

“`golang
start, _ := time.Parse(“2006/01/02”, “2020/04/18”) // 開始日
end, _ := time.Parse(“2006/01/02”, “2021/05/05”) // 終了日

for d := start; !d.After(end); d = d.AddDate(0, 0, 1) {
fmt.Println(d.Format(“2006/01/02”))
}

// 2020/04/18
// 2020/04/19
// 2020/04/20
// …
// 2021/05/03
/

元記事を表示

golang でpostgresにinsert

### とりあえず一行をInsertしてみた。

“`
package main

import (
“database/sql”
“fmt”

_ “github.com/lib/pq”
)

const (
host = “localhost”
port = 5432
user = “postgres”
password = “1234”
dbname = “sample”
)

func main() {
psqlInfo := fmt.Sprintf(“host=%s user=%s password=%s dbname=%s sslmode=disable”, host,user,password,dbname)
fmt.Println(psqlInfo)
db, err := sql.O

元記事を表示

【Golang】マップ(辞書)

#【Golang】マップ(辞書)
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main
//map 連組配列 Pythonでいう辞書
//関数では参照渡しされるので、本体の値も変わる。配列とは違う。

import “fmt”

func main() {
//宣言
//mapを作成 pythonの辞書型のような感じ
//map[キーの型]値の型{中身}
m := map[string]int{“a”: 100, “b”: 200}
fmt.Println(m)
//>>map[a:100 b:200]
//値取り出し
fmt.Println(m[“a”])
//>>100

//宣言
//make(map[キーの型]値の型, キャパシティの初期値)
//make(map[キーの型]値の型)// キャパシティの初期値は、省略も可能
//初期化。空を作成
m2 := make(map[string]int)
fmt.Println(m2)
//>>

元記事を表示

[習作] シングルバイナリでWebサイト作りたかったのでGolangで画像抽出Webアプリ作ってみる

こんにちはみなさん

お仕事でWebサイト作るのであれば普通にPHP使うのですが、私のメイン機であるWindowsでかんたんに動かせるWebサイトとなると、環境が心もとないというか、動く環境と作る環境が違うとどうしてもちゃんと動くか不安になるというもの。
そういうときに、環境とか関係なくバイナリで動くWebサイトが作れれば強いなぁって思うわけです。

そんなわけで、Goの練習がてら、Webサイト作ってみます。

# 課題
まずは、どんなアプリを作るかを考えます。
今回はかんたんだけどいろんな技術を触れそうということで、以下のようなツールを作ってみます。

– ローカルで動くWebアプリである
– URLを入力する
– そのサイトに有る画像を抽出して画面に表示する
– 気に入った画像を選択してローカルに保存できる
– シングルバイナリで動く

え、何に使うかって?
そりゃ、あれですよ、あれ。

なんにせよ、作るものを決めたので、実際に作ってみるとしましょう。

# 成果物

https://github.com/niisan-tokyo/image-crawler

# 開発環境
まずは

元記事を表示

【Golang】スライス

#【Golang】スライス
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main
//スライス 可変長配列
//関数では参照渡しされるので、本体の値も変わる。配列とは違う。

import “fmt”

func main() {
//宣言
//スライス = 可変長配列
//[]にするとサイズ変更できる。
var a []int = []int{100, 200}

//宣言
b := [] string{“A”, “B”}
fmt.Println(b)
//>>[A, B]

//宣言
//[]を作る nil メモリーに確保しない。bとは違う。
//メモリーは深い領域なので、最初は、あまり気にしなくてもいい
var c []int
fmt.Printf(“len=%d cap=%d value=%v\n”, len(b), cap(b), b)
fmt.Printf(“len=%d cap=%d value=%v\n”, len(c), cap(c), c

元記事を表示

Go + Google Cloud SDK の環境を Docker で準備する

# なぜ Docker

詳しい理由は
[Cloud Functionsで消耗したくない人のために、開発環境のベストプラクティスをまとめていったらDockerに行き着いた話](https://qiita.com/pannpers/items/244a7e3c18d8c8422e4f)
こちらの記事が参考になりそうです。

軽くまとめると

– ローカル環境を汚さなくて良い
– コマンド一発で同じ環境ができるので楽
– Google Cloud SDK の認証情報をコンテナに閉じ込められる => 複数アカウント、プロジェクトの管理がしやすい

あたりの理由になるかなと思います。

ここで Node.js で説明されている部分を Go に置き換えたのがこの記事、くらいに思っていただければささっと読めるかもしれません。

# docker-compose で書く
docker-compose で書くのが好きなので、中身を置いておきます。

“`
version: “3.8”
services:
gcloud:
image: tktcorporation/google-clou

元記事を表示

Golang ゴールーチンで並列数を指定して実行

“`golang
package main

import (
“sync”
“time”
“fmt”
)

func sub(message string) {
fmt.Printf(“%s start\n”, message)
time.Sleep(5 * time.Second)
fmt.Printf(” -> %s end\n”, message)
time.Sleep(1 * time.Second)
}

func getMessages() (messages []string) {
messages = []string{
“a”,
“b”,
“c”,
“d”,
“e”,
“f”,
“g”,
“h”,
}
return
}

func main() {
// 並列数
concurrency := 4
// 並列キューを作成
limit := make(chan int, concurrency)
// Wa

元記事を表示

Goで「ネットワーク受信接続を許可しますか?」を回避する

スクリーンショット 2020-05-12 23.02.03.png

# はじめに結論
`goのサーバ起動のコードを修正すれば出さないようにできます。`
`他の言語でも同様のやり方で回避できるはずです。`
下のMacのファイアウォール設定を修正して出ないよう設定するのはおそらく無理です。
ファイアウォールのオフはやめておいたほうが良いです。
スクリーンショット 2020-05-13 0.31.50.png

# 環境
MacOS Mojave 10.

元記事を表示

唐突に筋トレ動画を再生するアプリを作成する

## 背景
各所、リモートワーク化が進んでいるかと思います。リモートワークを始めて感じるのが、**圧倒的な運動不足感**です。外に出る機会が減ったために、自律的に運動をしないといけなくなりました。ですが、行動習慣を変えるのは難しいことです。だったら、ランダムに、唐突に運動をせざるを得ない状況を作れば良いんじゃないか?と思い、**唐突に「みんなで筋肉体操」の動画を開いてくれるアプリ**を作ることにしました。仕事中は特に何もしなくても自動で起動していてほしいので、service化のライブラリが公開されていたGolangでやることにしました[^1]。本当はクロスコンパイルして配布したかったのですが、Mac上でクロスコンパイルしたプログラムがWindowで想定通りの挙動にならず、見送っています。

[^1]: というのは口実で、純粋にGolangの勉強がしたかっただけだったりする

### 「みんなで筋肉体操」について
NHKでたまに放映されている、短時間で割とキツめな筋トレができる番組です。NHK WORLD-JAPANのアカウントが[英語版の動画](https://www.youtube.

元記事を表示

golang test coverage 100%を目指してみる

# golangでtestを書いてみたら、coverageが75%だったので、100%を目指してみる

## そもそもどこが通ってないのか調べてみる

coverageをhtmlで可視化してくれるツールがあるので、それを流してみる。

“`
go test -coverprofile=cover.out
go tool cover -html=cover.out -o cover.html
open cover.html
“`

これで、coverしているところは緑色に、してないところは赤になる。

関数ベースでみることもできる
“`
$ go tool cover -func=cover.out
http2/http2.go:21: ServeHoge 100.0%
http2/http2.go:40: main 0.0%
total: (statements) 75.0%
“`

## mainが通ってなかったけど、どうするのこれ?

go でmainを並列処理にしてサーバを立てたあとに、Getを使って、サーバにアクセスすることでテストする。
deferでBodyを

元記事を表示

【Golang】配列

#【Golang】配列
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main
//配列
//サイズを変更できない。拡張性がない
//後から追加する場合は、スライスを使う

//関数では値渡しされるので、コピーが作成されて引数に取られる

import “fmt”

func main() {
//2つの配列を作る宣言
//[2]int が型になるため、サイズを変更できない
var a [2]int
fmt.Println(a)
//>>[0, 0]

//宣言
b := [3]int{1,2,3}
fmt.Println(b)
//>>[1 2 3]

//宣言
var arr[2] string = [2]string {“A”, “B”}
fmt.Println(arr[0], arr[1])
//>>A, B
fmt.Println(arr)
//>>[A B]

//宣言 要素数省略ver
//要素の数を自動でカウントしてくれる
arr

元記事を表示

Go の環境構築をしてそのまま Cloud Functions を使う with VSCode

初 Go & CloudFunctions にあたって、せっかくなので作業記録

# 前提
## 環境
– macOS Catalina

## インストール済み
– Homebrew

# Docker で環境構築
Docker で環境を用意する場合はこの手順([Go + Google Cloud SDK の環境を Docker で準備する](https://qiita.com/tktcorporation/items/956f4afd68d491fb6894))で。

VSCode に関連する Go のインストール部分は飛ばせないかもしれないが、 Google Cloud SDK まわりの環境は コンテナ内に閉じ込められる。

# Go の使用準備

## VSCode の設定を追加

ここでは workspace の設定に追加
([Go のインストールと vscode の環境構築](#go-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8-vscode-%E3%81%AE%E7%92%

元記事を表示

OTHERカテゴリの最新記事