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

Go関連のことを調べてみた2020年01月19日
目次

grpcurlを使ってGitHub Actions上でgRPCなAPIのテストを実行する

# はじめに

[grpcurl](https://github.com/fullstorydev/grpcurl)というgRPCサーバをコマンドラインで叩けるツールを利用し、それをGitHub Actions上で動かしてひとまず正常動作確認まで試せたのでここに記録を残します。

# 環境

go version go1.13.1 darwin/amd64
grpcurl version: v1.4.0

# Main Contents

## プロジェクト内のGo製ツールの管理はtools.goファイルを生やす

[grpcurl](https://github.com/fullstorydev/grpcurl)はGo製のツールなので`go install`でコマンドを落とすことができます。

Go製のツールのバージョンもGo Moduleの`go.mod`にて管理するための方法を探しました。

すると公式の[Go Modulesに関するこちらのリンク](https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-d

元記事を表示

golangの並行処理のための言語要素に対応するCSPの記述を理解して形式検証の実践を開始しよう(検証編:クリティカルセクション)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101445/ad72965b-15c8-f0f7-d7d7-af82c3c83602.png)

# はじめに

単純ですが具体的な例を示したいと思います。今回題材とするのは、「クリティカルセクション問題」です。これは並行処理のプログラムが資源を共有したりする場合に出くわす問題です。

今回、検証に使うツールはモデル検査ツール**PAT(Process Analysis Toolkit)**とします。利用の際にところどころツールの画面などができますが、ツールそのものの使い方の詳細は省かせていただきます。もちろん、同等の機能を持つ別なツールを使っても同様の検証が可能です。

# クリティカルセクション問題

この問題は並行動作する2つのスレッドに対して、以下の要求が満たされているアルゴリズムを構成することです。

– **要求1** : 排他制御。あるスレッドがクリティカルセクションを実行中は他のスレッドのクリティカルセクションを実行する事

元記事を表示

VSCodeでGo Toolsにビルドタグを渡す方法

## 背景

VSCodeのGo拡張を使用している際、異なるビルドタグを持ったファイルにある変数や関数等を参照しようとするとコード補完が上手く働かずundeclaredになってしまいます。これはLanguage Serverであるgopls[^1]がタグ無しの状態で参照しているため起こる事象なのでタグを渡してあげる必要があります。

“`go:lib_util.go
// +build test

package lib

var (
testUtil = “test util”
)
“`

“`go:lib.go
package lib

import (
“fmt”
)

func p() {
fmt.Println(testUtil) // undeclared name: testUtil
}
“`

## 対処法

`settings.json` に以下のような形で追記してやることでgoplsを含む各種Go Toolsにビルドタグを渡せます。プロジェクト毎に変更したい場合はWorkspaceレベルで設定してやると良いでしょう[^2]。

適用後はVSCodeを再

元記事を表示

IntellijでGolangやるときの設定Tips

Gakuです。
Intellijで新規Golang PJを作成した際、いつも忘れるので、自分用の備忘録として残しておきます。

# go rootの設定(必須)
Preference > Language & Frameworks > Go > GOROOT

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47132/6337f61f-388f-ba16-4529-2601e9a59f64.png)
でGOROOTを設定する。

# go modを有効にする
pj rootフォルダで

“`
gakumbp:ddd-golang gaku$ go mod init
go: creating new go.mod: module github.com/gaku3601/ddd-golang
“`
上記を実行し、go.modを作成する。
Go Modulesの設定をしていないと、実行は可能だがコードがエラーの状態になってしまう。
![image.png](https://qiita-i

元記事を表示

スクリプト言語の比較しながらGoのお勉強 〜 環境構築編(MacOS)

# ごあいさつ
はじめまして。@kuroseetsと申します。
2000年からフリーランスで仕事を始め開発12年、インフラ8年経験してきたオッサンです。
皆さんはどのプログラミング言語、スクリプト言語が好きですか?または仕事などで何をよく使っていますか?
開発をされている方だとJavaが多いのかな?またはC#?Ruby?PHP?
事務系でスクリプトを組む方などはVBScriptなども現役ですよね。
私は現在インフラ運用構築側にいますので、私を含めて周辺でよく使われているのが、Python, Ruby, Perl, Bash辺りが多く、最近ではさらにGolangが増えてきている印象です。(あくまで個人的主観で、ですよ
それぞれ好みはあるとは思いますが、環境や現場による制約で使えるもの使えないものがありまして、私もその都度現場でキャッチアップしてスキルを身に付けてきました。
現在では`Infrastructure as Code`と謳われるだけあって、構成管理の設定ファイル以外でも手を動かすことも増えてきたと身を以て感じています。
今回個人的にGolangを勉強しようと思っているのですが、

元記事を表示

インフラ構築あるあるをGoで解決する!

Goにはまってるインフラエンジニアです。`インフラ構築あるある`をGoで解決したいと思ってます。

# 背景
その昔のワタシと後輩の電話
※後輩は現地のマシンルーム、ワタシは事務所にいました。

後輩:コマンド間違えました!よくわからんコトになってます!
ワタシ:よくわからんって何や!ログ見て!
後輩:マシンルーム圏外やから外から電話してます!ログ見れないっす!
ワタシ:とりあえずSSHでログ見るか…
ワタシ:何やったのかさっぱりわからぬ\(^o^)/
ワタシ:現地行くか….

ってことがよくありましたね。こういうときのミスない遠隔HELPって何かできないかな〜と思って、
chatサーバ作るぜ!って思いました。

巷にはwebsocketを使ったchatはあったのですが、↑みたいな場面ってSSHしかできないようなケースあるんで、
普通のsocketで作りました。あまり先行事例がなくて、結構ムズかったです。ゴルーチンとチャネルが難しい….

超絶参考にさせていただきました↓
https://blog.logicky.com/2017/06/16/go-%E3%83%81%E3

元記事を表示

GoCVを用いてGoで集めた画像で壁紙を作ってみました

# 概要
集めた画像からGo言語を用いて集めた画像から壁紙を作ってみようと思います。ライブラリとしてはGoCVを利用してみました。
以前、同じことをPythonとJuliaで行いました。

– [集めた画像からJuliaで壁紙を作る](https://qiita.com/reinsF82/items/560ce8bde2270ba7faef)
– [集めた画像からPythonとOpenCVで壁紙を作る](https://qiita.com/reinsF82/items/2ba347b1eaa941eb9d94)

実際にコードを書いてみた私的な感想としては、PythonやJuliaで書いたほうが書きやすかったですね…( *´艸`)

# 実行環境
– Windows10 Pro
– go version go1.13.1 windows/amd64
– OpenCV 4.1.2
– GoCV

# GoCVのインストール方法
画像を操作するためにGoCVを利用するために事前に準備する必要があります。以下の公式サイトのインストール手順に従っていけばインストールできると思います。

元記事を表示

ClickHouseとは【2020年1月最新】【サンプルあり】

スクリーンショット 2020-01-02 16.09.11.png
[ClickHouse](https://clickhouse.yandex/)の使い方について、これを読めば運用できるはずです
ClickHouseは、主に集計などに最適化されたDBです。
容量削減と高速化が期待できます。
書く内容は、「dockercompose,migration,go-clientサンプル」「テーブルの作成テクニック」「パーティション、ORDER BY」「レプリケーション」などを載せます。

# 2020/01最新
ネットに上がってる記事では、ClickHouseはupdateできないと書いてありますが、updateできるようになってます。これによってテーブルの持ち方などが変わります。

# ClickHouse概要
・集計な

元記事を表示

Goの環境構築

# Go 開発環境構築

最近Goの勉強をはじめました。
このあたりは、ググったら同じような記事が出てくるので、自分の備忘録も兼ねて記事にしています。
便利なパッケージ等があったら更新していくかもしれません。
ほんの少しでも、Goを始めようと思っている方への力になれたら幸いです。

## 環境

– macOS Mojave (10.14.6)
– zsh
– Homebrew 2.2.1
– IntelliJ IDEA

## Go のインストール

1. Homebrew でインストール

“`
% brew install go
“`

2. バージョン確認

“`
# バージョンの確認
% go version
go version go1.13.5 darwin/amd64

# GOROOTの確認
% go env GOROOT
/usr/local/Cellar/go/1.13.5/libexec

# GOPATHの確認
% go env GOPATH
/path/to/gopath
“`

## IntelliJ の設定

1. プラグインのインストール

元記事を表示

Go×CloudWatchでファイル取得状況をカスタムメトリクス化する

今回はAWS-SDKを用いて、大量のデータを取得するEC2インスタンスの1時間当たりのファイル取得量をCloudWatchでカスタムメトリクス化して取得状況を監視するシステムを作成したので、一部をご紹介します。

AWS関連の部分以外はGoの標準パッケージのみで作るシンプルなものになっています。

# Goでファイル取得数を計算する

下記のプログラムで現在のファイル取得数と経過時間を計算します。
コード自体はとてもシンプルです。

“`go

package calculator

import (
“fmt”
“io/ioutil”
“math”
“os”
“path/filepath”
“sort”
)

func GetFetchSpeed() (float64, error) {
dir := `取得したいディレクトリ`
//ディレクトリからファイルを取得
files, err := ioutil.ReadDir(filepath.Dir(dir))
if err != nil {

元記事を表示

【Golang wire】なんとなく理解した備忘録

# Git
https://github.com/google/wire/tree/master/_tutorial

# 何をしているか
struct間の依存関係を記述するのを自動で生成してくれる。

# 作るべきファイル
1. 依存関係を実装しているファイル(main.goとか)
2. 自動生成するにあたってヒントを与えるファイル(wire.go)

↓を実行

“`bash
$ wire gen
“`
3. 同じディレクトリにwire_gen.goが出来上がっている。

多分、実際の処理で利用していくファイルはwire_gen.goを使って処理をしてくはず。
`wire gen`を実行するまではmain.goのInitialEventが無いっておこられているから。
wire_gen.goが出来上がるとそのエラーはなくなる。

4. 結果

“`
src
main.go
wire.go
wire_gen.go // wire getで生成されたファイル
“`

“`main.go
package main

import (
“fmt”
)

type Event

元記事を表示

Google App Engine に Go言語 1.13 の複数サービスを deploy する

# はじめに
ちょうど3日前に Google App Engine (GAE) と Go言語を初めて触ってみました。
Go言語がバージョン 11 以降、少し勝手が違ったことで、構築時に若干迷ったので記事にしてみました。

いろんなドキュメントを見て判断はしていますが、なんせ経験が浅いので間違い等あれば指摘ください。

# はじめる前に…
Go言語と GAE について私が学んだサイト等まとめておきます。

– 下記サイトで Go言語の学習
– [はじめてのGo言語](http://cuto.unirita.co.jp/gostudy/)
– [Quickstart](https://cloud.google.com/appengine/docs/standard/go/quickstart?hl=ja)
– [Building a Go App on App Engine](https://cloud.google.com/appengine/docs/standard/go/building-app/?hl=ja)

# 環境
## OS
– Windows 10

## 言語

元記事を表示

【Golang】mockgen で生成した *_mock.go のせいで Build がコケる場合の対処法

# 対象読者
– Go の mockgen で生成した *_mock.go ファイルのせいで Build がコケている人
– 自分

# 忙しい人のための結論
Build failed 時に、怒られているコード内の該当箇所を消せばよい。

# 事例
REST API を golang で書いていた。
テストコードを書くべく、mockgen でモックを生成したところ、それらのファイルにいちゃもんをつけられて Build が通らなくなった。

“`
# hoge/fuga
fuga | hoge/fuga_mock.go:**:*: m.ctrl.T undefined (type *gomock.Contr
oller has no field or method T)
“`

m.ctrl.T で怒られるのは gomock の code generation が悪いからではないかと推測される。下記リンクによると gomock の version が関係していそう。
参考:https://github.com/openshift/openshift-azure/

元記事を表示

Goで超簡易版Twitterを作ってみました(初心者向け)

#はじめまして
最近Goの勉強を始めたばかりで何か開発してみようと思い、簡単なアプリを開発しました。
twitterもやってます[@khm_itac](https://twitter.com/khm_itac)

##見た目
![スクリーンショット 2020-01-16 11.57.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492455/f2d51833-f551-2afb-4a29-6659fab5d413.png)
##出来る事
・フォームから投稿する事が出来ます
・投稿をデータベースに保存する事が出来ます
・保存されている投稿を表示してくれます
・投稿を消す事も出来ます

はい、それだけです。
めちゃくちゃ低レベルですが、UIからサーバーにデータを送りDBへ保存、DBのデータをビューに表示するというのは全てのアプリの基本的な部分だと思いますので、これが出来るとようやくエンジニアレベル1達成です!
僕と同じようにこれからGoの勉強を始める方の少しでも役に立てればと思い記事を投稿しました。

元記事を表示

gRPCメモ

自身のメモとしてgRPCをまとめてみました。

# gRPCとは
protocol buffersをMessage interchange format(メッセージのI/Oに使うための形式)として使えるリモートプロシージャコールシステムです。

### protocol buffersとは
IDL:Interface Definition Language (インタフェース定義言語)を用いたファイルフォーマットです。

### gRPCで何ができるのか
クライアントが別のマシンにあるメソッドをまるでローカルにあるかのように使えるようになります。
下の図のように様々なプログラミング言語に対して実装できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270964/7b45a2d4-117f-b81c-5b49-3a85cf1f50fa.png)

#### 雑に言うと
今までjsonなどを介してAPIを叩いていたようなところを、もっと確固たる定義をもった上でより高パフォーマンスでやりと

元記事を表示

フロントエンジニア(仮)がGO言語で簡単なスクレイピング処理を実装するまで

はじめまして。kenalog210と申します。
ある事情によりGo言語でのスクレイピング処理方法を色々調べてたんですが、無事お流れとなりました。
もったいないのでQiitaに上げさせていただきます。
今回は下記のサイトをサンプルとして使用させて頂きました。
https://wiki.hackerspaces.org/

使用したフレームワーク

Colly
http://go-colly.org/
https://github.com/gocolly/colly

スターが1万近くついてるスゴイやつです。
リポジトリにサンプルがいっぱいあるので、基本的なケースなら自分の応用したいパターンに合わせて
サンプルをちょっといじくり回せば使えそうです。
この記事もサンプルをちょっと応用しただけのものです。

やりたかったこと

・マッピング情報を渡したらうまいことインスタンス化してくれるようなものを組みたい
・インスタンス化出来たら、JSON文字列化してコンソールで出力
・構造体とのマッピング用スクリプトはめんどいので組みたくない

構造体を定義

元記事を表示

Goのgo-sql-driver/mysqlでMySQLとタイムゾーンがずれる

#
go-sql-driver/mysqlを使ってMySQLにSQLを投げて、その結果をあれこれするAPIを作成していたときにちょっとはまったことのメモ。

## 問題の発覚

MySQLのタイムゾーンの確認。

“`
show variables like ‘%time_zone%’
=>
|Variable_name|Value|
|system_time_zone|UTC|
|time_zone|SYSTEM|
“`

MySQLのタイムゾーンがUTCなのにgo-sql-driver/mysqlを使ったSQLの実行結果を見るとJSTで返ってきてしまっていた。

“`
MySQL: 2020-01-01 00:00:00 UTC
SQL実行結果のパース: 2020-01-01 00:00:00 JST
“`

そこでmain.goに下記を書いて、Goアプリケーションでのタイムゾーンを確認。

“`main.go
fmt.Println(time.Now())
=> 2020-01-15 13:46:07.4988314 +0000 UTC m=+1.180576601

元記事を表示

Google Cloud Functions上でログレベル付きのStackdriver Loggingを利用する

Google Cloud Functions(以下Cloud Functions)でログレベルを分けたいことあります。

よく Go (go111) で Cloud Functions を利用するのですが、標準のlogパッケージを利用しても、ログレベルを出し分けできません。

– https://cloud.google.com/functions/docs/monitoring/logging#functions-log-helloworld-go
– https://cloud.google.com/logging/docs/setup/go

上記ドキュメントを参考にすると、 Cloud Functions では以下のような書き方になります:

“`go
func ExampleLogging(w http.ResponseWriter, r *http.Request) {
ctx := context.Background()

projectID := os.Getenv(“GCP_PROJECT”)

client, er

元記事を表示

Go AWS Lambda の init, main, handler のライフサイクルについて

# はじめに
Go AWS lambdaでRDSに接続する処理を書く必要が出てきた際
connectionを作るのは `init()` で良いのですが果たして `close` をいつどこで行えば良いのか悩み、[公式のリファレンス](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/go-programming-model-handler-types.html
)を参照しましたが肝心のライフサイクルについて具体的な記載が見当たらないため、実際に各func内の実行回数のcountを取って調査しました。

# 検証

`init()` `main()` `Handler()` それぞれの実行countをグローバルに保持しその値を出力する検証コードを作成して実行してみます。

“`Go
package main

import (
“fmt”
“github.com/aws/aws-lambda-go/lambda”
“log”
)

var invokeCount = 0
var initCount = 0
var mainCoun

元記事を表示

poiとfzf(peco)でプロジェクトに爆速で移動できるっぽい〜

## ことのはじまり

普段のお仕事でも趣味でも、僕は頻繁にプロジェクトを `cd` コマンドで移動します。Androidのプロジェクトは `~/AndroidProjects` に置いてますし、Goのプロジェクトは `~/go/src` に置いてあります。
業務はWindowsで、パスの長さ回避のためにCドライブ直下に顧客ごとにディレクトリを切ったりしてその中にプロジェクトがたくさんあったりします。OSSコードを読んだりプルリクエストを送るために別の人のプロジェクトをcloneすることもたくさんあります。

そんなこんなでいろいろなディレクトリでソースコードを管理していると移動が大変面倒なわけです。

そこで[ghq](https://github.com/motemen/ghq)と言うツールがあります。
ghqはGo製のコマンドツールで、リモートリポジトリを一元管理するためのツールです(ネーミングセンスやばくない?
ghqを使うことによって所定のディレクトリでプロジェクトを管理するようになり、またfzfやpecoなどのツールと連携することで爆速で移動もできるようになると言うものです

元記事を表示

OTHERカテゴリの最新記事