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

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

はじめてのGolang Webアプリケーション ~ テスト, Dockerコンテナ化まで

#

# 概要

こんにちは。kwashiです。最近、コンテナ関連の技術にハマリ気味で、Golangの勉強を始めました。いままで、Pythonばかり使っていたのですが、すっかり、Golangにハマってしまいました。そこで、復習も兼ねて、GolangのインストールからWebアプリケーションの作成、テスト、Dockerコンテナ化までを対象に記事にしてみました。Golangの構文はわかったけど、次どうしようと思っている方にはちょうどいいかもしれません。

Golangのメリットは、以下のようなことが挙げられます。

+ Dockerイメージが軽量
例えば、本記事で作成したアプリケーションは、以下のように22.6MBとかなり軽量です。

“`bash
REPOSITORY TAG IMAGE ID CREATED SIZE
kwashizaki/example-golang-rest-api v1.0.0

元記事を表示

【Hyperledger Fabric】GetHistoryForKeyを使って、StateDBのKeyに紐づくHistoryをGetしよう!!

## はじめに
みなさま、お久しぶりです。
どーも、のぶこふです。

プロキシという足枷に行く手を阻まれながらも、
どーにかこーにか、生きながらえております。

今回は、Hyperledger Fabricで履歴(History)を取得するやり方です。

諸事情により、Golangでの記述となりますが、Node.jsやJavaでも同様の方法で取得できるかと思います(未確認)。

なお、環境構築やその他チェーンコード箇所等については記載しませんのであしからず。

## 環境
* Windows10 Behind Proxy(ホストOS)
* VirtualBox
* CentOS7(ゲストOS)
* Hyperledger Fabric(HLF)1.4.3
* Golang

## 登場人物
`Fabric-Shim`の`GetHistoryForKey(key string)`
▼GoDoc
https://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim#ChaincodeStub.GetHistoryForKey

元記事を表示

GitLab Private Host環境におけるgoreleaserを利用したCI設定の留意事項

# はじめに

独自にホストしているGitLab環境化における[goreleaser](https://goreleaser.com/)の設定手順についてです。
下記のような人向けの内容となります。

– GitLabを独自のサーバーとして運用している。
– Golangで開発しており、 goreleaserを利用してビルドモジュールとタグでバージョン管理したい。

いつもはコンテナのimageとしてビルド結果を残していますが、ツールとして各環境向けの実行可能ファイルを残す必要がありました。
その際、ハマった点等記載しています。

# 前提

– GitLabのバージョンとしては、11.11.Xを利用していること。
– GitLab Runnerとして[Docker Executor](https://docs.gitlab.com/runner/executors/docker.html)を利用すること。
– GitLab RunnerのDocker Executorの[セットアップ](https://docs.gitlab.com/runner/install/)が既に行われている

元記事を表示

autodoc to swagger

誰かいいライブラリをください。
自作中
https://github.com/kajirikajiri/parse
リクエスト、レスポンスが表示されるくらいの完成度を目指す
rspec実行したら、swaggerが出力されるみたいな、、探したけど見つけれない

元記事を表示

20代エンジニア格付けチェックCODING ~定時後の勉強会スペシャル~ 開いてみた【社内勉強会・Paiza編】

前提

自分の現在の所属はシステム開発部、既存パッケージの改修・保守を行っている部署です。
かなり息の長い自社パッケージ(LAMP構成)を2か月に一度改修しリリースするサイクルで活動しています。
開発部メンバーは、エンジニアとしての経験が深い方から、新卒入社の社員まで様々です。

そんな中でPaizaを使って格付けチェックしてみたので、その報告と感想です。

なぜ勉強会をやろうと思ったか?

* 自社パッケージの改修・保守に傾注しているため、スクラッチでコードを書く機会がない
* 中途社員はともかく、新卒社員が自社パッケージの言語以外に触れる機会がない
* メンバー間で各人の得意なスキルを知る機会がない

やったこと

20代の開発メンバー5~6人に声をかけて、だいたい週2回のペースで[Paiza](https://paiza.jp/)の問題を解きました。
Paizaとは、出された問題をオンライン実行環境でコーディングし、コーディング速度と実行速度を計測できるサイトです。
オンライン実行環境が準備されており、ソフトのインストール不要でだれでもすぐ参加できるため、

元記事を表示

Go x Gin x GORMでToDoアプリを作成してみる

# はじめに
今年(2019年)の5月からチーム内の勉強会が週1〜2ペースで開催されるようになり、
モダンな言語を新たに習得したかったため積極的に参加して学習を進めてきました。
基本的なコードを読めるようになり、更なる理解を深めようと次のステップとして、
お決まりですがToDoアプリを作成したので手順などをまとめておきます。

今回GinとGORMを採用した理由は参考にできる記事や公式のドキュメントが充実しているからです。

# 勉強会について
半年で進めていた内容は以下の通りです。
– [A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)
→読書会形式で皆で内容を読み進め、playgrond上でコードをし挙動を確認し進めました。
– [Writing Web Applications](https://golang.org/doc/articles/wiki/)
→ 講義形式(ハンズオン)で実装を進めました。
– [GCPのチュートリアル](https://cloud.google.com/appengine/docs/st

元記事を表示

Goで画像処理アプリを作る

# はじめに
Goを勉強し始めて2週間ほどたったので何かアプリ作ってみることにしました。フロントエンドの知識がない筆者が、見て楽しいアプリを作るには画像がでかでかと表示するしかないと思い画像処理アプリの作成を決めました。

実際のアプリ:imageProcessor

2019-11-04 (2).png

勉強のためになるべく自分で考えるようにしたのでおかしなところなどたくさんあると思いますがご了承ください、、、

# アプリの機能
主な機能は以下の2つです。
・モザイク加工
・グレースケール
JPEG、PNGの両方を加工できます。

※知人にこのアプリで遊んでもらった

元記事を表示

Golangで始めるgRPC

# 概要

gRPCはあらゆる環境で実行できるモダンで高性能なオープンソースRPC(Remoto Protocol Call)フレームワークです。Protocol Buffersを使ってデータをシリアライズし、高速な通信を実現できるという利点がある。様々な言語やプラットフォームに対応しており、http/2を活かした双方向ストリーミングなどが可能である。Protocol Buffersを使用してシンプルにサービス(通信するデータや関数)を定義でき、APIの仕様を明文化できる。

※この章は[gRPC](https://grpc.io/)を参考にしています。

git: [k-washi/example-golang-gRPC](https://github.com/k-washi/example-golang-gRPC)

# スタートプロジェクト

## VSCodeの設定

+ vscode-proto3 & Clang-Format extensions をインストール

もし、自動でファイルをフォーマットしたいならば、以下も設定する。

+ Clang-Formatをインストー

元記事を表示

Go言語のゴルーチンとWaitGroupを使った並行処理

# 概要
Go言語で並行処理を実装する機会があり、勉強していたため、知識の整理もかねて記事を書きたいと思います。Go言語の特徴の1つとして、ゴルーチンを利用して並行処理が簡単に実装できることがあげられます。この特徴はGo言語が人気を集めている1つの要因かと思います。

今回はWaitGroupを利用したGo言語の並行処理について書きます。

# ゴルーチンについて
ゴルーチンはGo言語の実行の単位です。Go言語において並行処理を実装する際には、このゴルーチンを複数起動して関数を実行していきます。すべてのGo言語で記載されたコードはゴルーチンを利用して実行されます。例えば、main関数も1つのゴルーチンで実行されますので、意識していなくてもGo言語で書かれたコードを実行する場合にはゴルーチンが利用されています。

コードの中でゴルーチンを起動する場合は、下記のように実行する関数の前に`go`をつけることで実現できます。非常に簡単ですね。

“`
go dosomething()
“`

# ゴルーチンの実行順序
ゴルーチンによる並行処理を実装する際の注意点として実行順序があります。

元記事を表示

App Engine を布教したくて Go + Datastore の開発環境を Docker Compose でシュッと立ち上げた話

最新[^1]の App Engine Goランタイムの開発環境を Docker Compose で簡単に構築してみた話。
あるいはリーズナブルにサーバーを運用できる App Engine を布教する話。

[^1]: 2019/11/05現在
# TR;DR;

* 環境構築
* https://github.com/pistatium/appgengine-go112-datastore-docker-compose
* 動くサンプルはこちら。
* `docker-compose up -d` で開発環境が立ち上がります。
* プロジェクトのテンプレートにするなりご自由に。
* App Engine + Datastore の構成
* 非常に安価でのサーバー運用が可能。
* 第一世代から第二世代の移行はちょっとつらい。
* 今からやるなら第二世代の `Go 1.12` を使うと良さそう。

## App Engine よもやま話
最初にちょっとだけ脱線を。ローカルの開発環境のことだけ気になる方は次章まで読み飛ばして

元記事を表示

Go言語でiOS開発ツールを作成する:Localizable.stringsファイルからenumを生成する

# はじめに
 `Go言語でiOS開発ツールを作成する` というモチベーションは、まずGo言語が自分にとってとても興味深い言語であるいうところから始まっています。もともとLinux上でC言語を使って組込製品などを作ってきた人間にとっては、Go言語はすごく分かりやすくて便利な言語だという感触がありました。しかも高速(らしい)です。
 実は以前にSwiftでMacで動くiOS開発ツールは作った経験があるのですが、今回Go言語でチャレンジした感想は、Swiftに比べてもGo言語はとても優れているということです。(特にMacOSやLinuxで動くツールを作成する場合)

# 目標

“`:Localizable.strings

“clode_window” = “閉じる”;
“delete something” = “削除する”;
“cancel” = “キャンセル”;
“OK” = “OK”;
“_Only_this_” = “Only this”;
“`

例えば上記のような `Localizable.strings` から下記のようなswiftファイルを生成します。

“`swi

元記事を表示

VSCode + goenv + depでGo開発環境を整える

# はじめに
Go言語の開発環境を新規で構築するに当たり、自分用の備忘録とチーム展開するためにまとめました。
対象の環境はMacです。

Homebrewでgo自体をインストールしてしまうと最新バージョンになってしまい、
GCPで使えなかったりしたのでgoenvを導入しました。

## goenvの設定
### goenvのインストール
Go言語のコンパイラのバージョン管理を行ってくれるgoenv。Homebrewでインストールする。

“`
$ brew install goenv
“`

以下をシェルの設定ファイルに書き込む。

“`
export PATH=”$HOME/.goenv/bin:$PATH”
eval “$(goenv init -)”
“`

### goコンパイラのインストール
goenvでインストール可能なバイナリを確認する。

“`
$ goenv install -l
1.2.2
1.3.0
.
.
1.11.4
“`

任意のバージョンのバイナリをインストールする。

“`
$ goenv install 1.11.4
“`

元記事を表示

golangを試せる環境を気軽に作れるリポジトリを作りました

golangを試しにやってみたい人や今の環境を汚したくない人とか向けに気軽にgolangを試せる環境作成のリポジトリを作りました。

https://github.com/rspepe/docker-compose-go

docker-composeが動作する環境であれば動くと思います。
※Windowsは知らない。

READMEにあるとおりですが

“`
docker-compose up
“`

だけでライブリロードされる環境が立ち上がります。

main.goファイルを編集保存すると自動で再ビルドが走り、実行結果が標準出力でコンソールに表示されます。

お試しあれ

元記事を表示

deferが呼ばれるのはreturn前

“`golang
package main

import (
crand “crypto/rand”
“fmt”
“github.com/seehuhn/mt19937”
“math”
“math/big”
“math/rand”
“os”
)

func main() {
os.Exit(realMain())
}

func realMain() int {
seed, _ := crand.Int(crand.Reader, big.NewInt(math.MaxInt64))
rng := rand.New(mt19937.New())
rng.Seed(seed.Int64())
r := rng.Intn(2)
defer fmt.Printf(“1\n”)
if r == 0 {
return 1

元記事を表示

Go言語における文字列の「長さ」と「文字数」を取得する処理の違い

##Go言語で文字列の長さを取得する場合

Go言語の文字列の特徴として、**UTF-8エンコードされた「byte」配列**のように振る舞うことが出来る。

このため、配列と同様に**「len」組み込み関数**を使用して長さを取得し、インデックスを使ったアクセスなどが可能になる。

ちなみに「len」組み込み関数が返すのは**「文字数」ではなく「バイト長」**。
なので今回の例では、「len」組み込み関数を使ったパターンになる。

*なおここでは「配列」と表記しているが、実際にはスライス

“`go:string_len.go
package main

import “fmt”

func main() {
//string型の変数を宣言
var en string = “golang”
var ja string = “Go言語”

//文字列の長さ(バイト長)を出力
fmt.Println(en, “len:”, len(en))
fmt.Println(ja, “len:”, len(ja))
}
“`

実行結果

“`
user$ go run strin

元記事を表示

Golang によるfirebase AuthenticationにおけるJWT解析

# 概要

Firebase Authenticationの機能を使用した際、フロントエンドでJWTを取得できる。このJWTは、改ざんがされていないことを検知可能なので、バックエンドでは、このJWTを用いてユーザ情報を取得できる。

今回紹介するライブラリは、サーバーに送られてきた、以下の形式のJWTを分解し、そして、デコードすることでFirebaseにおけるユーザー情報を取得する処理をGolangで実装した。

“`bash
{base64エンコードしたhead1er}.{base64エンコードしたclaims}.{署名}
“`

発行者(今回は、Firebase)が鍵を使用して、JSONに署名することでトークンとして扱うことができる。また、鍵を使用して検証することで改善を検知できる。
claims部には、ユーザー名などの任意の情報を含めることができる。

git: [k-washi/jwt-decode](https://github.com/k-washi/jwt-decode)

# インストール

“`bash
go get -u github.com/k-washi/

元記事を表示

[WIP] 準備 Go 基本的環境

Install everything/tools use Homebrew

“` sh
brew install go
brew install dep
“`

`dep` is a the dependency management tool for Go

> https://github.com/golang/dep

### Setup $GOPATH

Add the following content to `.zshrc`

“` bash
# Go development
export GOPATH=”${HOME}/path/to/root/go”
export GOROOT=”$(brew –prefix golang)/libexec”
export PATH=”$PATH:${GOPATH}/bin:${GOROOT}/bin”
test -d “${GOPATH}” || mkdir “${GOPATH}”
test -d “${GOPATH}/src/github.com” || mkdir -p “${GOPATH}/src/github.com

元記事を表示

コールバック関数を使ってリソースリークを防ぐ

GoにはGCがあるのでメモリリークは基本発生しませんが、メモリ以外のリソースはリークします。
たとえばよくありそうなのがファイル閉じ忘れ。

https://play.golang.org/p/h7cOUtlLkIk

“`
package main

import (
“io/ioutil”
“log”
)

func main() {
f, err := ioutil.TempFile(“”, “tmp”)
if err != nil {
log.Panic(err)
}
// f.Closeしてない!
f.Write([]byte(“hoge”))
}
“`

f.Close()するのを忘れてるのでリークしちゃってます。
f.Close()忘れを防ぐために静的解析でチェックするというアプローチもあるかとは思うのですが、そもそも手動で解放するから忘れるのであって、自動で解放してくれる仕組みがあればclose忘れを完全に防げるはずです。
ということで今回は別の方法を考えてみました。

ioutil.TempFile()を直接使うのではなく、例えば次の例のようにラ

元記事を表示

Docker x Go x gRPCなサーバーを立てようじゃないの

## 前提とか
– goの実行環境
– dockerの実行環境
– mac os

## まずはGoを使ってgRPCサーバを立ててみる
##1. 必要なものをinstall
gRPCxGoは色々なところで書かれているので簡単に。

### GoのgRPCライブラリをinstall
“`
go get -u google.golang.org/grpc
“`
### Protocol Buffersをインストール
– IDL(インターフェイス定義言語)で書かれたファイルをコンパイルするのに必要。

“`
brew install protobuf
“`

## Protocol Buffersのプラグインをインストール
– IDLに書かれた定義をGo言語へ変換するのに必要。インターフェイスをGo言語で自動生成する。

“`
go get github.com/golang/protobuf/protoc-gen-go
“`
protoc-gen-goはPATHが通った場所に置く必要があるので、`.bash_profile`やらに、以下を記述してPATHを通してあげる。自分は`

元記事を表示

dockerでgoの開発環境を構築する

# dockerでgoの開発環境を構築する

本記事は以下の記事からのリンクとして作成されました。
以下の記事も是非ご覧ください!!

– [第三回開発合宿](https://qiita.com/fumiya-uehara/private/d5e10380299a22995c64)

## 本記事について

本記事は、Go言語の開発環境をdockerで構築するための方法を記した記事です。
ホストOSからコンテナ上で動作する実行ファイルをデバッグできることが目標です。

完成したリポジトリは以下です。
https://github.com/fumiya-uehara/go_dev

## 環境

– macOS Catalina ver 10.15
– go 1.13
– Docker version 18.09.2, build 6247962
– docker-compose version 1.24.0, build 0aa5906

## 事前準備

### Goのインストール

ホストOSにgoがインストールされていることを確認してください。

“`shell

❯ go v

元記事を表示

OTHERカテゴリの最新記事