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

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

Google App Engine + Go + Angular + Firebase Authentication でログイン画面の実装

# はじめに

* Go と Angular で実装したクライアント・サーバーアプリケーションで Firebase Authentication を使ってログイン機能を実装します。
* また、実装したアプリを Google App Engine 環境へデプロイします。

# 手順概要

1. Firebase Authentication の設定
1. クライアントサイドのアプリケーションを作成
1. サーバーサイドのアプリケーションを作成
1. ローカル環境で実行して動作を確認
1. Google App Engine 環境へデプロイして動作を確認

# Firebase Authentication の設定

* Firebase Authentication を利用できるようにするため、Firebase のプロジェクトを作成し、Authentication の設定を行います

## 手順

1. Firebase Console にログイン
1. プロジェクトを作成
1. `開発 > Authentication` に移動し `ログイン方法 > Google` で Goog

元記事を表示

ニフクラ用の Terraformカスタムプロバイダを書いてみる

## 概要

AWS に触れるようになってから、なるべくインフラ構築はコードで管理したい、と思うようになりました。
業務では主に Terraform を利用しています。
AWS や vSphere はプロバイダがあるため、それを利用させていただくだけだったのですが、ニフクラも同じように構築したい、と思ったところ、プロバイダが見当たりませんでした。
諦めきれずにいろいろと調べていたら、いつのまにかカスタムプロバイダを書いていたので、その記録を残しておこうと思います。
なお、セールスエンジニアが見様見真似でこういうことをやった、という記録のため、あまり技術的なものではありませんので、ご了承ください。

## 結果

完成してはいませんが、[ここ](https://github.com/shztki/terraform-provider-nifcloud)までできました。
中途半端ですが、本日現在の状態でいったん `v0.0.1` のタグをつけています。
Goの環境が必要ですが、以下の流れで利用することができます。

“`
$ mkdir -p $GOPATH/src/github.com

元記事を表示

Goのpackageを作ろうとしたらgo.modの作り方で30分ほど困った件

# おことわり
とても恥ずかしいミスだったのですが、即解決のダイレクトな記事がなかったので残しておきます。

# 結論
packageのルートディレクトリ(ex. my_package)で、`GO111MODULE=”on”`になるようにしてから

“`
go mod init my_package
“`
を実行する。

ルートディレクトリ内で、ルートディレクトリ自身の名前を指定することがパッと思いつかなかった。
あと`touch`とかで自分で勝手に作っちゃダメ!(やってしまった)

# 状況
– アプリケーション(=main.goがある)リポジトリばかり触っていた
– フレームワークのプロジェクトgenerateコマンドがgo.modを勝手に作ってくれてた

今までこんな状況だったので、いざ自分がpackageを0から作るとなった時に、
pacakge内で`go test`ひいては`go get`を実行できなかった。

# 参考
[GoのWiki](https://github.com/golang/go/wiki/Modules#why-does-installing-a-to

元記事を表示

Goで空のスライスを作る時

## Goにおける空スライスの作り方
Goでは空のスライスを作る方法が二種類あります。
型Typeについて
1. スライスリテラル記法による作成 `[]Type{}`
2. Goのビルトイン関数による作成 `make([]Type, 0)`

正直どっちも対してやってることは変わらないだろうと思い習慣的に使っていた`make`による作成をあらゆる場面で使っていました。というのも、`make`はキャパシティ指定ができるので後から`append`することを想定した場合にキャパシティ確保分の時間をセーブできるだろうと思っていました。しかしある時にベンチマークを眺めていると`runtime.mallocgc`がやたらと時間を食っていたため掘っていくと`make`の行にたどり着いたため、「もしや」と思い空のスライスリテラルに書き換えてみたらパフォーマンスが改善しました。

## ベンチマーク
こうなってくると実際にどの程度実行時に影響があるのかが気になります。そこで次のようなベンチマークを書いてみました。

“`go
func BenchmarkSliceAllocation(b *testi

元記事を表示

初見でGo言語Webアプリケーションをやってみる(パラメータを受け取る編)

# はじめに
Go初心者が、初見でWebアプリケーションを作るまでの過程をつづっていきます。

[前回:初見でGo言語Webアプリケーションをやってみる(Hello World編)](https://qiita.com/yutaka_m03/items/1f2ecbca987a6222d51c)の続き
今回は、検索などでよく使う「URLパラメーター」の受け取りを実装してきます。

## 環境
macOS:Catalina
goバージョン:go1.12.9

## URLパラメーターを受け取る
`localhost:8080/hello/yutaka0m`でアクセスすると、`Hello yutaka0m`と表示し、
`localhost:8080/hello/hoge`でアクセスすると、`Hello hoge`と表示できるように、
URLパスをパラメーターとして受け取ります。

その場合、`Param`関数を利用します。

“`go:url_path.go
package main

import (
“github.com/gin-gonic/gin”
“net/http”
)

元記事を表示

GAE Standard(Go 1.12)でCloud SQL(PostgreSQL)に接続する

# GAE Standard(Go 1.12)でCloud SQL(PostgreSQL)に接続する

## 概要
GAEからCloud SQLに接続する際の情報が[公式ドキュメント](https://cloud.google.com/sql/docs/postgres/connect-app-engine?hl=ja)では、2019/11/13現在、PythonとJava、Node.jsまでしかなく、Goがどこ行った・・・?
この記事はそんなGo(1.12)でGORMを使って接続する際の情報を記載します。

## 結論
ホストに
`/cloudsql/[Cloud SQLがあるプロジェクトID]:[Cloud SQLがあるゾーン]:[Cloud SQLのインスタンス名]`
例:`/cloudsql/sampleproject:us-west1:postgresql`
を指定すればできます。それを以下で接続する。

“`golang
db, err = gorm.Open(“postgres”, fmt.Sprintf(“user=%s password=%s host=%s dbn

元記事を表示

【Golang】 開発環境設定〜HelloWorldまで

来年転職する会社でgolangを使うとのコトで、少しでも慣れておこうと勉強はじめました。

なお、私のgolangの勉強は、基本的に「[スターティングGo言語(松尾愛賀 著)](https://www.amazon.co.jp/%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0Go%E8%A8%80%E8%AA%9E-CodeZine-BOOKS-%E6%9D%BE%E5%B0%BE-%E6%84%9B%E8%B3%80/dp/4798142417/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2A1R4MA4F6Q67&keywords=%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0go%E8%A8%80%E8%AA%9E&qid=1573571940&sprefix=%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%86%E3%8

元記事を表示

【解答】Go言語初心者向けハンズオン #2

※これは解答です。どうしても課題が解けない場合、ご利用ください。

# 課題1 – 基本問題

“`golang
package main

import (
“fmt”
“math/rand”
“time”
)

const (
PAA = 1
GUU = 2
CHOKI = 3
)

func main() {
COUNT := 1000000
rand.Seed(time.Now().UnixNano())

result := [3]int{}
for i := 0; i < COUNT; i++ { a := yukpiz() b := kent() switch { case a == b: result[0]++ case a == PAA && b == GUU, a == GUU && b == CHOKI, a == CHOKI && b == PAA: result[1]++ case a == PAA && b == CHOKI, a == GUU && b == PAA, a == CHOKI

元記事を表示

初見でGo言語Webアプリケーションをやってみる(Hello World編)

# はじめに
Go初心者が、初見でWebアプリケーションを作るまでの過程をつづっていきます。

## 環境
macOS:Catalina
goバージョン:go1.12.9

## Go言語のWebフレームワークは何か?
私は普段`Kotlin`を使っているので、Webフレームワークは[SpringFramework](https://spring.io/projects/spring-framework)を使用しています。

SpringFramework的な、Go言語におけるWebフレームワークのスタンダードは何なのでしょうか?

https://qiita.com/loftkun/items/1a9951d1864bebdc51e1
上記の記事を発見し、[gin](https://github.com/gin-gonic/gin)がよく使用されているようなので、そちらを使っていきたいと思います。

## ginフレームワークをいれる
前提としてGoがインストールされている必要があります。
そのうえで、ginのREADMEの通りに、インストールをします。

“`
$ go get

元記事を表示

Go Compilerのインライン展開についてまとめた

## はじめに

Go は末尾再帰が最適化されない。というかあえて最適化しない、という選択を採用しているようです。

[Goで再帰使うと遅くなりますがそれが何だ](https://ymotongpoo.hatenablog.com/entry/2015/02/23/165341)

そもそも私はあまりコンパイラの気持ちになったことがなく、関数呼び出しのときにインライン展開されるということがどういうことかわかりませんでした。

本記事では以下の 2 点についてまとめてみます。

– 関数のインライン展開とはどういうことか
– インライン展開されることでどのような効果があるのか

## 関数のインライン展開とはどういうことか

### インライン展開とは

> インライン展開(インラインてんかい、英: inline expansion または 英: inlining)とは、コンパイラによる最適化手法の1つで、関数を呼び出す側に呼び出される関数のコードを展開し、関数への制御転送をしないようにする手法。これにより関数呼び出しに伴うオーバーヘッドを削減する。特に小さくて頻繁に呼ばれる関数では効

元記事を表示

Goで自分のqiita投稿記事一覧を見れるコマンドラインツールを作ってみた。

# Goで自分のqiita投稿記事一覧を見れるコマンドラインツールを作ってみた。

Go言語の勉強をしたので、Cliアプリケーションを作成してみます。
何番煎じ目か知れませんが、QiitaのAPIを叩いて自分のqiitaの投稿記事一覧を見れるコマンドラインツールを作ってみます。
これが出来た暁には、qiitaを書く意欲がもりもりと湧いてくる筈である。

## 作ったもの
“`bash
$ qi myqi
“`
と打つと、
スクリーンショット 2019-11-12 17.21.51.png
と出力されるというコマンドラインツール。
githubはこちらです。:https://github.com/yujiteshima/qi

## 使用するフレームワーク

`urfave/cli`というCLIアプリケーション

元記事を表示

mongoDB公式のGoのDriverを使ってみた

## 概要
[mongoDB公式のGo用のDriver](https://github.com/mongodb/mongo-go-driver)触ったので、そのまとめ

## 環境
go 1.12.5
go.mongodb.org/mongo-driver v1.1.2
mongoDB 3.1

## 用語
[わかりやすくまとめてくれてる方がいた](https://qiita.com/yuji0602/items/c55e2cb75376fd565b4e#rdb%E3%81%A8mongodb%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0%E3%81%AE%E6%AF%94%E8%BC%83)

– table → collection
– row → document
– column → field

## 接続
公式ドキュメントの[Usage](https://github.com/mongodb/mongo-go-driver#usage)見た方が早い気がしやすが一応

“`go
import (
“contex

元記事を表示

アドベントカレンダーに向けてMarkdown に埋め込まれた Go のソースコードに gofmt をかけてくれるツールを作った

こんにちは pon です。みなさんアドベントカレンダーは参加しますか?僕も今年は Go や Rust、Elasticsearch のアドベントカレンダーに参加する予定です。

僕はQiitaの記事を書く際には手元でMarkdownファイルを作ってそこに下書きするのですが、gofmtをかけるのが正直面倒でした。もちろん、既存コードからコピペする分には良いかもしれませんが、記事向けにコードを修正したり補足を入れた時にgofmtがかかっていない状態になることがありました。

そこで来たるアドベントカレンダーに向けて Markdown に埋め込まれた Go のソースコードに gofmt をかけてくれるツールを作ったので、ツールの紹介と作り方を記事にしました。

## gofmtmd

作ったツールはこちら

aws-lambda-go/cmd/build-lambda-zipをgo get時のエラー

何をしていたか
————-

* https://qiita.com/shunp/items/52ee20278e02e29ef3e8

此方の記事を参考に、sam cliにてgolang, API gateway を試用していたところ、エラーに遭遇しました。

環境
——

* windows10 Pro

“`
>sam –version
SAM CLI, version 0.31.0
“`

詳細
——-

* https://qiita.com/shunp/items/52ee20278e02e29ef3e8#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E5%AE%9F%E8%A1%8C

ローカル実行は問題無し。API gatewayからRequestしたところ、502エラーが出ました。

[もろもろの記事][1]を見ると、`build-lambda-zip` をbuild時に実行し、zipファイルをS3へuploadすればよさそうです

元記事を表示

【Go】コーディングTips

# はじめに

Goを書いていて便利だと思ったコーディング方法を溜めていきます。

# 構造体をフィールド名付きでPrintする

ただ `fmt.Println` するとフィールド名が付かないので見づらいときに。

[The Go Playground](https://play.golang.org/p/JNYf0-ygQ1n)

“`go
fmt.Printf(“%+v\n”, data)
“`

“`
{name:山田太郎 age:23}
“`

# 長さがNの文字列を生成する

文字数制限のメソッドをユニットテストしたいときに。
「1000文字も手打ちできないよ〜」みたいなときに。
ちなみに長さは指定した分になるけど、値は空っぽ。

[The Go Playground](https://play.golang.org/p/e-J8S7HOXja)

“`go
str := string(make([]rune, 1000))
“`

# ある文字をN個生成したい

デバック中、見たいログを目立たせるときに。

[The Go Playground](https:

元記事を表示

ゲームボーイのエミュレータをGoで作った話

## 前置き

1か月ほど前にbokuwebさんの[ゲームボーイエミュレータをGo言語で書いた](https://blog.bokuweb.me/entry/gopher-boy)というブログ記事を見ました。

ゲームボーイ世代(正確にはGBC)であったのとGOで何かしたいと思っていたのもあって、僕もゲームボーイのエミュレータに取り掛かってみることにしました。

## できあがったもの

元記事を表示

golang error handling (Go1.13)

# 初めに
自分で簡単なWebサービスを作っていくにあたり、どこでどういうエラーが起こったのかわかりにくく、エラー解消に多くの時間を割くということがおきた。そのため、エラーハンドリングを学び、この問題を解消したいと考えた。

#version
go version go1.13.3

#対象読者
* エラーハンドリングって何?という人
* エラーハンドリングをやっていきたいが、何が正解かわからない人
* 一緒にエラーハンドリングについて考えてくれる方

# 躓いたところ
GolangのVersionが上がりライブラリerrorsに変更が加えられた。そのため、今までのエラーハンドリングと違うやり方になったらしい。それでは、どういう場合にどういうエラーハンドリングを採用すればいいかというところで沼にハマってしまった。
[Go1.13 ライブラリerrors](https://blog.golang.org/go1.13-errors)
# エラーハンドリングをする意義
*初めに*で書いたように、エラーハンドリングは「どこに」「何をきっかけに」「どういう」エラーが起こったのかをサーバー側で判

元記事を表示

Wireを用いたGoのDI

アプリケーション開発において、ある処理を実装するときに、複数のコンポーネントを組み合わせて実装することがよくあると思います。DIとは、ソフトウェアのデザインパターンの1つで、制御の反転を実現します。コンポーネントの作成時に依存するコンポーネントを注入する考えです。

[google/wire](https://github.com/google/wire) を用いて DI を実現する例を考えてみます。

Wire が作られた背景などは [Compile-time Dependency Injection With Go Cloud’s Wire](https://blog.golang.org/wire) が詳しいです。

## ナイーブな実装

例として、以下のような構造を持つ、ユーザのパスワードを登録するアプリケーションを考えてみます。
ユーザから、名前とパスワードをうけとって、パスワードをハッシュ化して、永続化する…というシーンを想定します。

![Wire.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.

元記事を表示

MacにDockerでGolang環境を作ってみる – vol.2 Docker起動?

今回の記事は、以下を参考に作成しました。
で、自分なりに「あれ?」って詰まったところ?を捕捉しつつ記載します。

こちらの記事にお世話になりました。
メインのやった内容はこちらなので、
並行して読んでいただけるとありがたいです。
https://qiita.com/yonaimineakio/items/0990648bbce64de7edfa

# 作業ディレクトリ作成 & ファイル配置
 今までHomeにいたので、任意の場所に移動して、ディレクトリを作ってみました。

“`
  $ mkdir go_doc
  $ cd go_doc/
“`

 ここで移動した「go_doc」ディレクトリに、以下のファイルを作成します。
 (元記事参照)
  ・main.go
  ・Dockerfile

 つまり、階層はこんな感じ。

   **任意の階層**
   **  ∟ go_doc**
**       ∟ Dockerfile**
**       ∟ main.go**

## Dockerfile って何書いてんの?
で、この状態から、以下のDocke

元記事を表示

Go言語でシンプルなgRPCサーバーを構築する

## まえがき

この記事は以下の順序で組み立てられています。

1. gRPC用のコードを自動生成する
2. APIとして呼び出される関数の実装をする
3. gRPCサーバーとして起動する
4. CLIツールを使って呼び出してみる

記事を書くために動作確認をしている環境は“Ubuntu18.04“です。
ただしMacやその他のOSでも、ツールのインストール周りを公式のドキュメントに差し替えて頂ければ動かせるかと思います。

間違いなどありましたら、コメントや編集リクエストなどを貰えると嬉しいです。

## gRPC用のコードを自動生成する

#### 1. リクエストとレスポンスの構造を定義する

まずはProtocol Buffersと呼ばれる、構造を定義する為の言語を使って、リクエストやレスポンスを定義していきます。

*“example.proto“*

“`protobuf
syntax = “proto3”;

package pb;

message HelloRequest {
int64 id = 1;
string name = 2;

元記事を表示

OTHERカテゴリの最新記事