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

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

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()
“`

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

元記事を表示

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を通してあげる。自分は`

元記事を表示

[golang] gRPC の RESTful API を dockernize するにあたって苦労したところ

## TL;DR

– gRPC gateway 用と server 用で別のコンテナを立てて, オーケストレーションの方で組み合わせられるようにする

## 成果物

こちらの記事の内容を dockernize させていただきました
https://qiita.com/ryu3/items/b2882d4f45c7f8485030

コンテナ立てる

“`sh
$ docker-compose up api
Creating network “siiid-gke_default” with the default driver
Creating siiid-gke_api_gateway_1 … done
Creating siiid-gke_api_1 … done
Attaching to siiid-gke_api_1
api_1 | 2019/11/02 23:49:42 Received: nakata
“`

API叩く

“`sh
$ curl -vvv -X GET http://0.0.0.0:8765/v1/exa

元記事を表示

[Go]設定ファイルと環境変数の両方をいい感じに使う

##TL;DR
– 基本の設定を設定ファイルから取得してから、環境変数で上書きできるようにしよう

## アプリケーションと設定
`The Twelve-Factor App`の[III. Config](https://12factor.net/ja/config)には以下のように書いてある
>アプリケーションの 設定 は、デプロイ(ステージング、本番、開発環境など)の間で異なり得る唯一のものである。設定には以下のものが含まれる。
– データベース、Memcached、他のバックエンドサービスなどのリソースへのハンドル
– Amazon S3やTwitterなどの外部サービスの認証情報
– デプロイされたホストの正規化されたホスト名など、デプロイごとの値

Twelve-Factor Appは設定を 環境変数 に格納する。

これをみたときに環境変数に設定を全て格納すれば良いのかとも思えるが、よく読むと

>なお、この“設定”の定義には、アプリケーション内部の設定は 含まない ことに注意する。内部の設定とは、Railsにおけるconfig/routes.rbや、Sprin

元記事を表示

オブジェクト指向な人に捧ぐGO言語の特徴

# TL;DR

GO言語はOOP(オブジェクト指向)な思考回路で書くと割ととっちらかってしまうので、特徴的なところをピンポイントで抑えたいとおもいます。

# 多態性(ポリモーフィズム)はダックタイピングで実現

宣言的に親(あるいはインターフェイス)を記述しなくても、そのオブジェクトが実装条件を満たしていれば親(インターフェイス)として振舞うことができます。

こちらがインターフェイス。

“`go

type Hito interface {
walk() string
}
“`

`Hito`インターフェイスを満たすにはstructが`walk()`を持つように実装します。`Male`というstructを実装してみました。

“`go

type Male struct {
}

func (m Male) walk() string {
return “テクテク”
}
“`

`Male`は`Hito`インターフェイスを満たしているので`doWalk(h Hito)`に引数として渡せるようになります。

“`go

func main() {
male :=

元記事を表示

Go言語でポリモーフィズムとその便利さを理解する

継承・カプセル化・ポリモーフィズムはオブジェクト指向の3大要素と呼ばれています。そのうち今回の記事で扱うポリモーフィズムは日本語では多様性などと訳されますが、どのような概念なのかがいまいち分かりずらく、実装例を見ても何の役に立つのか自分には長らくピンと来ませんでした。
本記事では、ポリモーフィズムとは何か、何が便利なのかをGo言語での実装例と共に紹介していきたいと思います。

##ポリモーフィズムとは?
ポリモーフィズムを一言で言うと、**「同じインターフェイスを操作しても、それを実装するインスタンスによって違う動きをさせる仕組み」**であると自分は理解しています。

オブジェクト指向の本として有名な「オブジェクト指向でなぜ作るのか」では
>類似したクラスに対するメッセージの送り方を共通化する仕組み

と説明されています。Javaで言うと、同じクラスのメソッドを呼び出しても、そのメソッドを持つ親クラスを継承する子クラスによって実際の動きは異なってくるというところでしょうか。ポリモーフィズムはメソッドの呼び出し側で楽をするための仕掛けです。

※言葉で聞いただけでピンと来なくても、実装例

元記事を表示

gonum/matで単位行列を生成する

# コード

“`go
idSlice := make([]float64, n*n)
for i := 0; i < n; i++ { idSlice[i*(n+1)] = 1 } idMat := mat.NewDense(n, n, idSlice) ``` これでできる。 # サンプルコード `go get gonum.org/v1/gonum/mat`を実行して、コピペすれば動く。 ```go package main import ( "fmt" "gonum.org/v1/gonum/mat" ) func matPrint(X mat.Matrix) { fa := mat.Formatted(X, mat.Prefix(""), mat.Squeeze()) fmt.Printf("%v\n", fa) } func main() { n := 4 idSlice := make([]float64, n*n) for i := 0; i < n; i++ { idSlice[i*(n+1)] = 1 } idMat :=

元記事を表示

OTHERカテゴリの最新記事