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

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

protobufのoneofを使う【Go + gRPC】

[Protocol Buffers](https://developers.google.com/protocol-buffers)のoneofを使って実装しようとしたときに微妙に悩んだので、使用方法を備忘録として残しておきます。

Protocol Buffers、Go、gRpc、どれも触り始めて数ヶ月なので、変な箇所がありましたら指摘していただけると大変助かります。

## oneofとは

あるメッセージで複数のフィールドを定義して、「このフィールドのうち、**最大でどれか1個だけ**がセットされてるよ!」と宣言できる機能です。

“`
message SampleMessage {
oneof test_oneof {
string name = 4;
SubMessage sub_message = 9;
}
}
“`

上記のようにメッセージを定義すると、「`SampleMessage`には`name`フィールドか`sub_message`フィールドのどちらかが入っている。どちらのフィールドも入ってない場合もある」ということになります。
ただし、

元記事を表示

Go言語のテンプレート機能について

#概要
go言語に標準で搭載されているテンプレート機能について紹介します。
テンプレート機能を使うことで、ロジックとデザインを分離することが出来ます。
変数の埋め込み、ループ、条件分岐などが出来ます。

ただし、それほど多機能ではないため使い所は限られるでしょう。
例えばメールではJavascriptが使えないため使用に適しています。

複雑なことはできませんが独自関数を作成できるため、何かをやろうとする場合は逐次独自関数を作成していくことになります。

##packageについて
Go言語には組込みのテンプレート・パッケージとして、 `text/template` と `html/template` パッケージが搭載されています。
`html/template` パッケージは`text/template` をラップしたもので、同じインターフェースを提供し、コードインジェクション対策を施した安全なHTMLを生成します。
出力が HTML の場合は常に `html/template` を用いるべきです。

##基本的な使い方
“`go
//テンプレートを用意
tex

元記事を表示

IntelliJにてgoenvで落としているGoを指定

# やること

[goenv](https://github.com/syndbg/goenv)を使ってGoのVersionを管理してIntellijを利用する場合の手順です。

“`
$ cd YOUR_PROJECT
$ go env GOROOT
/Users/YOUR_NAME/.goenv/versions/1.11.0
“`

上記のように出たならば、以下スクショのように設定してあげましょう。

スクリーンショット 2019-11-07 18.27.40.png

以上。

元記事を表示

go lang 任意の場所に要素を追加するのロジック説明

https://qiita.com/egnr-in-6matroom/items/282aa2fd117aab9469bd
こちらの記事の

“`
pos := 追加する位置
// slice , slice[pos] = append(slice[:pos+1], slice[pos:]…), 追加する要素
slice = append(slice[:pos+1], slice[pos:]…)
slice[pos] = 追加する要素
“`

このロジックがようわからんかったので軽く解説。

———————————–

“`go
slice = [0 ,1 ,2 ,3 ]
2まで取得 |——–| => [0,1,2]
2から取得 |—–| => [2,3]

//appendの第一引数でsliceの[0,1,2]を取得
//appendの第二引数でsliceの[2,3]を取得
//それらをsliceに代入 or 再定義する。
//すると、slice = [0,1,2,2

元記事を表示

Goのmodules を使い始めたばかりでbuild出来ずに困った話

# Go moduleを使い始めたばかりで`build`が通らず困った話
Hello Worldを終えて、少しすると、`main.go`で定義していた関数を別のディレクトリに切り出したくなる時がくると思います。
その時に`build`通らず、解決するのに時間がかかりました。
`go module`を使わず、`GOPATH`配下にプロジェクトのディレクトリを作る際と、`goのmodules`を使う時で外部パッケージの呼び出し方のパスの指定方法に違いがあります。現状、Web上の情報も古い情報の方が多く、
結構、盲点であると思いましたので、覚書として残します。

“`bash:Goのバージョン
$ go version
>> go version go1.13.4 darwin/amd64
“`

## 何が困ったか?

“`bash
piyo
├── go.mod
├── go.sum
└── main.go
“`

“`go:main.go
package main
import “fmt”

main(){
hoge()
fuga()
return

元記事を表示

Goでシンプルに単体テストを書く

`Go`の標準ライブラリである`testing`を使ってテストを書くお話です。

いわゆる**単体テスト**と呼ばれるレベルでのテストを書いていきます。

## テストするコード

テストコードを書くお題には次のような関数を使いました。

“` color.go
package main

import (
“fmt”
)

func showColor(fruit string) (string, error) {
fruitBasket := map[string]string{
“banana”: “yellow”,
“apple”: “red”,
“melon”: “green”,
}

if color, ok := fruitBasket[fruit]; ok {
return color, nil
} else {
return color, fmt.Errorf(“%s does not exist in Fruit Basket”, fruit)
}
}
“`

果物の名前を放り込むと何色かを返してくれる関数ですね。(フルーツ

元記事を表示

OpenID Connectを使ったアプリケーションのテストのためにKeycloakを使ってみる

ユーザーの認証と認可を行う方法としてはOpenID Connectがメジャーですよね。ローカルで簡単にテストするために、ローカルで[Keycloak](https://www.keycloak.org/)をDockerで起動してテストしてみます。外部システムはモックを使う、というのがセオリーですが、気軽に使える本物のサービスを使った方が楽ですよね、ということで。

なお、認証周りのGoのアプリケーションコードは超簡易実装なので、本番実装に入れちゃダメですよ。

# Keycloakとは

KeycloakはIBM傘下のRedHat傘下のJBossが作成している認証のすごいソフトウェアです。

* 自分自身でユーザーIDとパスワードを管理するID Provider機能を持つ
* OpenID Connect、OAuth2、SAML経由でユーザー認証ができる(OIDCなどのサーバーになれる)
* LDAPやActive Directoryで管理しているユーザー情報を取り込める
* GoogleやTwitterなどの外部のSNSを使った認証ができる(OIDCなどのクライアントになれる)

元記事を表示

CLI の愚痴投稿ツールを作ってみた

# 愚痴投稿 CLI ツール guchi を作成しました
CLI から愚痴を吐くツールを作りました。ここ最近ストレス溜まってたのでね。。なお、愚痴は私が用意している以下ページ (というかただのテキスト) に吐かれます。もちろん CLI コマンドでも取得可能。
https://guchis.site/guchis

リポジトリは以下です。舐め腐ったツールですがよかったら使ってみてください。
https://github.com/daiching/guchi

動作確認は WSL (Ubuntu) と CentOS7 で実施しています。残念ながら Mac はわかりません (もし試した方がいて、動作報告していただけたら大変有り難いです!)

取得方法としては、以下でイケるはずです。

“`bash
# 実行バイナリのみ
$ wget https://github.com/daiching/guchi/raw/master/guchi
$ sudo chmod +x ./guchi
$ ./guchi

# go get する場合
$ go get github.com/daiching/g

元記事を表示

はじめての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]の Google 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
“`

元記事を表示

OTHERカテゴリの最新記事