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

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

[golang]gooseでrake db:migrateみたいな事をやる

Go言語でマイグレーションどうやんの…というところで色々試したうちの1つ。
Railsの`rake db:migration`みたいな事ができるので、Railsに慣れている人には比較的使いやすいのではないかと思う。

– [pressly/goose: Goose database migration tool – fork of https://bitbucket.org/liamstask/goose](https://github.com/pressly/goose)

## 環境

go 1.13.4

## gooseが記事執筆時点で対応しているデータベース

– postgres
– mysql
– sqlite3
– mssql
– redshift

## gooseのインストール

“`sh
go get -u github.com/pressly/goose/cmd/goose
“`

## 各種コマンド

### databaseを作る

db:create相当のコマンドは無い

### マイグレーションファイルを作る

“`sh
$ goose mysql

元記事を表示

【Go】【xorm/reverse】MySQLのINT UNSIGNEDに対応する!

はいどうも~:clap:

新人のプルリクに、選択肢を2つ与えつつ「自分のチカラで考えてみそ」とレビューしたら、なぜか新米部長から横レスで「じゃあお前が決めろよ、ちなみに選択肢Bは俺的に無しだから」と来て、何が琴線?に触れたのか不明ですがとりまLGTMで済ませた昨今、いかがお過ごしでしょうか:sunglasses::v:

今回は、↓でご紹介した`xorm/reverse`を改造したお話です。

* ありの~ままの~DBスキーマを、go言語ソースコードに自動変換【xorm/reverse】
https://qiita.com/yagrush/items/cc60166d85befbcbf3d6

# 何を変えたの?

MySQL DBリバース

Go言語のstructコード

INT UNSIGNEDカラムが、ただのint型structフィールドになってしまう

uint型になってほしい

改造

# 変更点

## まずは、最新版`xorm/reverse`と`xorm/xorm`の帳尻合わせ

`xorm/reverse`は`xorm/xorm`(xor

元記事を表示

golang,docker,mysqlの環境をherokuにデプロイする

# はじめに
言語: golang
コンテナ: docker-compose
RDB: mysql
ORM: gorm
マイグレーション: migrate

な環境をherokuにデプロイするまで結構ハマったので残す。

# コード
https://github.com/pokotyan/study-slack

# 実行したherokuのコマンド一覧

“`terminal
$ cd /hoge/huga # アプリケーションのコードがあるところに移動
$ heroku container:login # ログイン
$ heroku create -a app_name # herokuアプリの作成
$ heroku git:remote -a app_name # herokuリポジトリをgit登録
$ heroku addons:add cleardb:ignite # mysqlのアドオンを追加
$ heroku config # CLEARDB_DATABAS

元記事を表示

AOJ(Go)でよくわからんエラーが出た

Aizu online judgeのgo言語での提出において、
“17 0 37 0.00user 0.00system 0:00.00elapsed 50%CPU (0avgtext+0avgdata 1120maxresident)k 0inputs+8outputs (0major+615minor)pagefaults 0swaps“
のようなエラーが出た時の対処法を書いておきます。
# 1つ目(fmtパッケージを使わずそのままprint)
僕の環境ではそのままprintを書いてもコンパイルが通ってしまったので気付きにくかったのですが、
**追記(訂正):**print関数は標準のエラーに書き込まれるそうです。AOJでは標準出力を答えとして受け取るため、ビルドでエラーが発生されるのではないかと考えられます。
Print(“hoge”)などと書いてしまうと上記のようなエラーが出ることがあります。
代わりに、
fmt.Print(“hoge”)と書けば、上記のエラーを避けることができます。

——

まだ1つ目までしかかけていませんが、また違う原因で同じようなエラーが発

元記事を表示

Go言語と螺旋本で学ぶデータ構造とアルゴリズム(その0)

## はじめに

「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造」(通称:螺旋本)をGo言語で解いていくシリーズです。個人の勉強が目的で、主な目標は以下のとおりです。

* Go言語に慣れる
* アルゴリズムとデータ構造の理解を深める
* 上記を理解した上で、競技プログラミング用のライブラリを作成する

なお、Go言語の基本文法については特に細かく書かないつもりです。

## 標準入出力

競技プログラミングをやる上で避けては通れないのが標準入出力だと思うので、今回はここについてまとめたいと思います。

簡単な問題であれば[前回の記事](https://qiita.com/mahiro4ds/items/c8c96b90c056b673cc52)でご紹介した`fmt.Scan()`及び`fmt.Println()`で十分なのですが、入出力の数が多くなると問題が発生するようなので、今回は別の方法を紹介します。

### 標準入力

`bufio.Scanner`を使います。
使い方としては、まず`Scan()`で1行を読み取ります。`Scan()`は標準入力があればtru

元記事を表示

grpc-gatewayでgRPCサーバをREST APIで疎通できるようにする

## はじめに
今回はgrpc-gatewayを用いて、gRPCサーバをREST APIに対応させてみます。
成果物は[こちらのgithub](https://github.com/KatsuyaAkasaka/grpc-gateway-sample)においてありますので合わせてご確認ください。

## grpc-gatewayとは
grpc-gatewayのリポジトリには
>The grpc-gateway is a plugin of the Google protocol buffers compiler protoc. It reads protobuf service definitions and generates a reverse-proxy server which ‘translates a RESTful HTTP API into gRPC. This server is generated according to the google.api.http annotations in your service definitions.

https://gi

元記事を表示

【GO/DDD】レイヤードアーキテクチャの整理

もうすでに詳しい記事が色々ありますが、自分の知識の整理として書いていきます。

## レイヤードアーキテクチャ
下記の図の構成になります。
Presentation層(handler)→Application層(usecase)→Domain層(domain)→Infrastructure層(infrastructure)の順番で、一つの方向に依存して構成になっています。
またそれぞれの層に`interface`, `struct`を定義しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148392/c312d492-e2c2-5854-c7e7-4bb7ec3aca1e.png)

### Presentation層
http通信などを書きます。

### Application層
CRUDを行う場所。
MVCでいうViewとControllerの間にいるやつ。

### Domain層
ビジネスロジックを書きます。
具体的には下記の例がわかりやすい。
ドメインモデルで実

元記事を表示

gRPC-Web + React Hooks + Go でリアルタイムチャットをつくる

## 概要

分散システムを学ぶうちにgRPCに興味を持った。きくところによると、gRPC-Webというものもあるらしい。

この記事では、gRPC-Web + React Hooks + Goを用いてリアルタイムチャットを作りながら、実装の流れを書いてみようと思う。

コードだけ見たいという方は↓へ、

– [okmttdhr/grpc-web-react-hooks](https://github.com/okmttdhr/grpc-web-react-hooks)

gRPC-Webってなんやねん?という方は↓へどうぞ!

– [3分でわかるgRPC-Web – Qiita](https://qiita.com/okmttdhr/items/fb7a8bc0c8afd4e2f4c1)

## 全体像

サービスの全体像は以下のようになる。

![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22875/ac11dd0a-92c0-9c23-e17c-5179634

元記事を表示

3分でわかるgRPC-Web

## gRPCとは

gRPCの概要を簡単にまとめる。

– HTTP/2による高速な通信
– IDL(Protocol Buffers)でデータ構造とRPCを定義
– 多言語対応のソースコード自動生成
– Streamingを用いた双方向通信が可能

詳細は以下へ。

– [What is gRPC?](https://grpc.io/docs/guides/)

## gRPC-Webとは

gRPC-WebによってgRPC通信をWebでも使うことができる。以上!

といえればいいのだが、実際は、ブラウザの制限にあわせたプロトコルを定義している。

– [grpc/PROTOCOL-WEB.md at master · grpc/grpc](https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-WEB.md)

そのため、現時点だと、プロトコル間の微調整を行うためのプロキシが必要で、公式ではEnvoyを推奨していたりする。

### ブラウザの制限

前述したブラウザの制限とは、例えば以下のようなものだ。

– HTTP/2

元記事を表示

zmq4でFizzBuzzする

# 初めに

Goのすごい人がついったーで`gophernotes の pure go zeromq 対応が入った。`とツイートしてた。
すごい人が言ってるんだから使っておいて損無いハズ。

5分ぐらい考えた結果、FizzBuzzすることに決めた。
プログラマならFizzBuzzとか数列とか使いたくなるんだからしょうがない。

# できたもの

![dekita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/c9c78ca2-00ba-d820-d45b-042640df79de.png)

斬新なFizzBuzz結果

# zeromqとは

ブローカーなしのメッセージング。ブローカー不要が何より嬉しい。
どうせ通信相手そんなにいないのに、いちいちサーバ立てたくない。
詳しくは[ZeroMQ](https://zeromq.org/)参照。

# FizzBuzzとは

よくやる奴。割愛。

# 【非検証】gophernotes

元記事を表示

Go言語初心者が「Go言語によるWebアプリケーション開発」を読みながら開発してみた

# はじめに
**「Go言語によるWebアプリケーション開発」**という本はオライリー社から出版されている技術書です。

Webアプリケーション開発をする機会があったので、

**「せっかくならGo言語使ってやってみっか!」**
ということで「Go言語によるWebアプリケーション開発」を読みながら開発しました ~~(現在進行中)~~

今回はその**感想**だったりつまづいたところ等を紹介できればなと思います。

購入ページ :[amazon](https://www.amazon.co.jp/Go%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8BWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-Mat-Ryer/dp/4873117526/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8

元記事を表示

go-redisでIncr

“`golang
package main

import (
“fmt”
“strconv”
“time”
“github.com/go-redis/redis”
)

func getRedisClient() (*redis.Client) {
client := redis.NewClient(&redis.Options{
Addr: “localhost:6379”,
Password: “”, // no password set
DB: 0, // use default DB
})
return client
}

func check(key string) {
rc := getRedisClient()
v := rc.Incr(key)
fmt.Printf(“key:%v,v(

元記事を表示

GolangでPKI入門 – 3

#1.この記事の対象の人
– Go で、USBトークンを操作してみたい人
– Go で、PKCS#11 を使ってみたい人

ハードウェアと鍵を操作するので、念のために以下を記載しておきます。
**この記事の情報をあなたが利用することによって生ずるいかなる損害に対しても、当方は一切責任を負いません。**

**・USB トークンとは**
この記事では、 USB 形態のセキュリティトークンで PKCS#11 が使えるデバイスとします。
Amazon や量販店で気軽に買えるのは[ YubiKey ](https://yubikey.yubion.com/)ですね。
今回は YubiKey 5 NFC使います。(以下 YubiKey )

**・PKCS#11 とは**
[暗号トークンへの汎用インタフェースを定義する API](https://ja.wikipedia.org/wiki/PKCS) です。
詳しくは、[PKCS#11仕様書](http://docs.oasis-open.org/pkcs11/pkcs11-ug/v2.40/cn02/pkcs11-ug-v2.40-cn02.

元記事を表示

multiple-value in single-value context

“`go:main.go
package main

import “fmt”
import “strconv”

func main() {
str := “12”
num, _ := strconv.Atoi(str) + 1
fmt.Println(num)
}
“`

##本日のエラー
multiple-value strconv.Atoi() in single-value context
(一つの値が来るべきコンテキストに複数の値があるよ)

strconv.Atoi()は複数の戻り値を返すので、その実行結果に同文内で直接演算しようとしても当然できない。
戻り値を複数返せない言語を主に扱ってきた人は案外引っかかってしまうかも。(はい、私です。)

##対処
“`go
num, _ := strconv.Atoi(str)
num++
“`

##ちなみに

“`go
num := getNum() + 1

func getNum() int {
return 12
}
“`

元記事を表示

VSCode Remote DevelopmentでGolangの開発環境を爆速で構築する

この記事は[株式会社クロノス](https://www.kronos.jp/)の「~2020年春~勝手にやりますアドベントカレンダー」の10日目の記事です。

「~2020年春~勝手にやりますアドベントカレンダー」インデックスは[こちら](https://qiita.com/beeeyan/items/342d51fa301bcf81e9c0)(随時更新)

[前回の記事](https://qiita.com/maroKanatani/items/7ca85205430cead76817)で作成したカレンダーは[こちら](https://ad-calendar-992c5.firebaseapp.com/view-calendar/RJjcAaxRFnD5IPDw2bDq)

# はじめに
開発環境、どうやって構築していますか?
ローカルに色々インストールしちゃう人も多いと思いますが、言語のバージョン違いや環境変数などで、**「自分の環境では動くんやけど、他人の環境では動けへん。なんでや・・・」**みたいな光景を開発者であれば一度は目にしてきたのではないでしょうか。
解決方法はいくつか

元記事を表示

言語別AWS SDKのパフォーマンスの一検証

# 背景
## タグについて
AWSはリソースに[タグ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Using_Tags.html)の付与が可能です。AWSにおけるタグはリソースの管理や[コスト配分](http://blog.serverworks.co.jp/tech/2019/07/29/cost-alloc-tags-basic/)の用途で用いられ、タグの付与設計はAWSの運用において非常に重要なポイントとなります。
特に大規模な環境や組織になるとリソースに付与するタグは非常に多くなる傾向があります。

## AWS SDK for Rubyのパフォーマンス
[こちらの記事](https://qiita.com/kure/items/19b1c17a56d81e2bb955)でも言及したようにAWS SDK for Ruby では、リソースにタグが大量に付与されている場合、一度に大量のリソースを取得に大幅に時間がかかることがあります。
以下はEBSを例に、タグ付与のあり・なしとで、リソースの取得(descr

元記事を表示

【Go】バイナリファイルからContent-Typeを取得する

# ファイルからContent-Typeを検出

バイナリの先頭ヘッダ`512byte`を読んで取得後、ポインタをもとに戻す

“`.go
func DetectFileContentType(file *os.File) string {
// 最初の512bytesを読む
buffer := make([]byte, 512)
file.Read(buffer)

// 有効なMIMEタイプでない場合は「application/octet-stream」が返る
contentType := http.DetectContentType(buffer)

// 読み取りポインターをリセットする
file.Seek(0, 0)

return contentType
}
“`

ファイルタイプを調べるライブラリ([h2non/filetype](https://github.com/h2non/filetype))によっては[先頭`261byte`だけ読んでる](https://github.com/h2non/filetype#file-header)のとかあった

元記事を表示

【Go環境構築】go getのプロキシ設定

# はじめに
社内でGo環境構築中に、go getのプロキシ突破で少し手こずったので備忘録。

# 環境
* windows10
* 社内ネットワーク(プロキシ環境下)

# プロキシ設定なしの場合のgo getエラーメッセージ
“`
C:\Users\xxxx>go get github.com/gin-gonic/gin
# cd .; git clone — https://github.com/gin-gonic/gin C:\Users\xxxx\go\src\github.com\gin-gonic\gin
Cloning into ‘C:\Users\xxxx\go\src\github.com\gin-gonic\gin’…
fatal: unable to access ‘https://github.com/gin-gonic/gin/’: OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443
package github.com/gin-gonic/gin: exit

元記事を表示

Golangで作成されたVimプラグインの配布方法について調べた

# まえがき
Golangのクロスコンパイルは非常に魅力的だと思うのですが、Vimのプラグインとして配布する場合に少し悩んだので、調査した内容を残しておきます。

## 配布方法1: ユーザーにビルドしてもらうパターン
ユーザーにGoのビルドをしてもらうケース。

基本的にREADME.mdのInstallationの項目に

“`shell
$ cd /ビルド可能なパス && go get -d && go build
“`

と書いておけばすむので、用意する側はかなり気楽です。

ユーザーに`go build`してもらえれば必ずその環境にあったバイナリが出来上がるのでこの点はメリットになりうるのですが、ユーザー側にGoの環境がなければいけないため、もしGoの環境がなければ使う側は少しハードルが高くなるかもしれません。

[参考: Go で Vim プラグインを書く – http://haya14busa.com/vim-go-client/](http://haya14busa.com/vim-go-client/)

## 配布方法2: バイナリを配布するパターン
バイナリ配

元記事を表示

bashのコードメトリクス測定ツールをgolangで実装してみた

# 何の話?
シェルスクリプトって、速度重視でついつい適当に書いちゃいますよね。
プロダクション環境に納品するものであっても、動けばいいや感もあったり。
で、こんな現状を打開すべく、なんかいいツールなり何なりないかな?って思って探してみました。

# codestyle
Googleの[styleguide](https://google.github.io/styleguide/shellguide.html)がしっくりきました。
日本語訳していただいている、すばらしい[記事](https://qiita.com/laqiiz/items/5f72ca668f1c58176644)もあります。(ちょっと古いかも)

# shellcheck
上述のstyleguideでも記載されていますが、規模の大小問わず、[shellcheck](https://github.com/koalaman/shellcheck)はしましょうと言っています。完全同意。
最初は指摘がうっとうしいな〜と思うのですが、慣れてくると問題ないかと。

# comment
Googleのstyleguideにおける

元記事を表示

OTHERカテゴリの最新記事