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

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

golang profiling

参考資料をメモするだけ
—-
– https://github.com/adjust/go-wrk
– https://golang.org/pkg/net/http/pprof/
– https://github.com/uber-archive/go-torch (すでにGo1.11から含まれてる)

# Video
– GopherCon 2019: Dave Cheney – Two Go Programs, Three Different Profiling Techniques https://youtu.be/nok0aYiGiYA
– Profiling and Optimizing Go(古いけど) https://youtu.be/N3PWzBeLX2M

元記事を表示

Cloud Pub/Subの「メッセージの順序指定」によりFIFOキューが実現できるのか?

# お題
[Cloud Pub/Sub](https://cloud.google.com/pubsub?hl=ja)使ってますか?
大量のメッセージを捌きたい時に使いますね。
これ、メッセージ投入時の順序、保証したい時、ないですか?
AWSの場合であればSQSの[FIFOキュー](https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html)を使うのかなと思います。
(過去に使おうとしたことがあったものの、まだ東京リージョンなかったのと1秒に最大3000メッセージという制約に尻込みして、結局使わなかった記憶が。。。)
SQSに相当するといったらGCPではCloud Pub/Subだと思いますが、残念ながらFIFOキューは無い。
と思っていたら、
(Beta版ですが)「[メッセージの順序指定](https://cloud.google.com/pubsub/docs/ordering?hl=ja)」という機能が出来ていたようで。
これで、メッセージがPu

元記事を表示

goのgqlgenでgqlgenコマンドが効かない

# 事象

– goでGraphQLを実装するのにgqlgenを使っていた
– https://github.com/99designs/gqlgen
– READMEに書いてあるコマンド `go run github.com/99designs/gqlgen [args]`が実行できたり、できなかったりした

# 発生条件
– go.modファイルに書いてあるgoのバージョンが1.12以下の人はおそらくREADME通りにやっても動作する
– go.modファイルに書いてあるgoのバージョンが1.13以上の人は`go mod vendor`後に実行するとおそらくエラーになる

# 対処方法
– `go get github.com/99designs/gqlgen`した段階でおそらく`$GOPATH/bin/gqlgen`が生成されているはず
– `gqlgen [args]`で実行できる。(`$GOPATH/bin`にパスが通っているはず)

# 最後に
– go run [package]は、実行する場所($GOPATH内かそうではないか)、go.modのバージョン、./vendo

元記事を表示

【続】tcpの仕様上、接続先がコネクションをcloseしているかはパケットを一度は実際に送るまでわからないよという話

# はじめに
以前、[tcpの仕様上、接続先がコネクションをcloseしているかはパケットを一度は実際に送るまでわからないよという話](https://qiita.com/behiron/items/3719430e12cb770980f3)という記事をかいたのですが、そのきっかけは

> 以前、アプリからDBにSQLを投げたところ、コネクションがinvalidだというエラーが起きました。この原因自体はとても簡単でサーバ側(DB側)のコネクションを保持するタイムアウト設定がクライアントよりも短かったというだけなのですが、「これってクライアントライブラリ側でソケットにwriteした時点でエラーになるんだからハンドリングしてコネクションプールに保持している他のコネクションをよしなに使ってよ!!」と思ったのでした。

でした。

これは[goのmysqlドライバー](https://github.com/go-sql-driver/mysql)を利用した場合に発生していたのですが、まさにこの問題をGitHubの中の人が去年に修正しており、それをテーマに[ブログ](https://github

元記事を表示

Golangのflagパッケージの使い方(最小限の知識)

flagパッケージはコマンドラインのフラグを解析するのに便利なパッケージです。

## flagパッケージをインポートする
“`go
import “flag”
“`

## フラグの値を格納する変数を定義する

### 関数外で定義する場合の書き方
“`go
var boolFlag bool
var intFlag int
var strFlag string
“`

### 関数内で定義する書き方
“`go
boolPtr := flag.Bool(“b”, false, “真偽値の値の例”)
intPtr := flag.Int(“i”, 0, “数値の場合の例”)
strPtr := flag.String(“s”, “”, “文字列の場合の例”)
“`

## フラグの初期化
init() はmain()が呼ばれる前に実行される。
main内に記述したflag.Parse()によって変数に指定されたフラグの値が入るが、initの時点ではまだ変数には値が入っていない状態。
そのためここではフラグの値を格納するためのポインタを予約するだけの挙動となる。

元記事を表示

Golangのerrorとpanic

#### The art of programing
業務ロジックにエラーブロックが沢山の場合がよく見られる
例えば以下の関数を順次に呼ぶ

“` go
func first() error {return nil}
func second() error {return nil}
func third() error {return nil}
func fourth() error {return nil}
func fifth() error {return nil}
“`

**error**を判断する書き方は、
なに?眩暈しちゃった。。。

“` go
func Do() error {
var err error
if err = first(); err == nil {
if err = second(); err == nil {
if err = third(); err == nil {
if err = fourth(); err == nil {

元記事を表示

Qiita APIをgoから叩いてみた

## はじめに
Go言語を勉強しなければという使命感にかられ、遊んでみることにしました。

## golang + Qiita API
### 環境
・ go version go1.13 darwin/amd64

### URIと機能
|Path |HTTPメソッド |機能 |
|—|—|—|
|/qiita/api/v1/user-info | GET |指定されたユーザの記事一覧を、作成日時の降順で返します。 |

### 使用パッケージ
**・ gin**
ginは、go製のWebフレームワークです。jsonレスポンス処理機能も持っている優れものです。

“`
go get github.com/gin-gonic/gin
“`

### ファイル構成

“`
❯ tree .
.
├── main.go
└── src
└── controller
└── controller.go

2 directories, 2 files
“`

### controller
mainから呼び出すタスク処理をまとめています。

`

元記事を表示

golandとDocker設定

# golandを使う人への参考記事まとめです。

## GolandでDockerを使う
[Docker – 公式ヘルプ | GoLand](https://pleiades.io/help/go/docker.html#using-docker-compose)
公式ページ。これだけでもいい人もいるはず。日本語が少し不自然。

[GolandでDocker上のサーバーをRemote Debug – Qiita](https://qiita.com/edelweiss452/items/2013b6f34be8ab6d4abd)
リモートデバッグの解説が日本語で書かれていて読みやすい。

[Docker上のGo製Webアプリケーションをリモートデバッグする – Qiita](https://qiita.com/keitakn/items/f46347f871083356149b#docker-compose%E3%81%AE%E8%A8%AD%E5%AE%9A)
実際に使用しているコードがわかります。

## golandの設定
[GoglandでオススメのGo快適開発環境構築方法

元記事を表示

AtCoder Regular Contest 105のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/arc105

# A

“`Q_A.go
package main

import (
“fmt”
)

func main() {
var a,b,c,d int
fmt.Scanf(“%d %d %d %d”, &a, &b, &c, &d)

flag := false

flag = (a == b+c+d || a+b == c+d || a+c == b+d || a+d == b+c || a+b+c == d || a+b+d == c || a+c+d == b )

var s string
if flag == true{
s = “Yes”
}else{
s = “No”
}
fmt.Printf(“%s\n”, s)
}
“`

# B
“`Q_B.go
package

元記事を表示

googleのsubcommandsでGCPのSecret Managerへの読み書きをラップ

# お題
GCPには[Secret Manager](https://cloud.google.com/secret-manager?hl=ja)というのがある。
Kubernetes知ってる人は「[Secrets](https://kubernetes.io/ja/docs/concepts/configuration/secret/)みたいなものか」思うかも。ただk8sのSecretsはBase64エンコードなので、(例えば元データの管理の名目としても)PublicなGitHubリポジトリにアップするわけにいかないけど、Secret Managerの方は暗号化されてるので(鍵を知らなければ)まさにSecret。

その他、ウリみたいなものについては以下参照。
https://cloud.google.com/blog/ja/products/identity-security/introducing-google-clouds-secret-manager

上記参考記事にも記載してあるけど、Secret Managerに限らずGCPのサービス群は[Cloud SDK](https

元記事を表示

[GoLand]コメントの先頭にスペースを設定する

# 1.はじめに
ググっても解決策(GoLandの公式ヘルプ)がなかなかヒットしなかったので書きました。
個人的にはGoLandを別のPCにインストールしたときという、たまにの機会に忘れていて結構困るためです。

## 1-1.この記事を読んだらどうなるのか
フォーマット時にコメントの先頭にスペースが自動的に入るようになって、楽になれる。

## 1-2.対象読者
GoLandでコメントの先頭にスペースを自動でいれられずに苦しんでいる人。

# 2.GoLandの設定
[こちら](https://pleiades.io/help/go/reformat-and-rearrange-code.html#configure-leading-spaces-in-comments)が公式のヘルプ
公式を引用させてもらいます。

> 1.設定ウィンドウ(ファイル | 設定)を開きます。
> 2.エディター | コード・スタイル | Goをクリックします。
> 3.その他タブをクリックします。
> 4.コメントに先行スペースを追加するチェックボックスを選択します。
> 5.コメントのスペースを除

元記事を表示

[Go]「…(ピリオド3つ)」の使い方

# 1.はじめに
これからGoを始める人のためになればと思って記事を書きました。
ソースコードで「…」を初めて見たときに、ググっても日本語で情報がまとまっているものがあまり無いので、私が業務でよく使っている「…」の使い方をまとめようとおもいました。

## 1-1.この記事を読んだらどうなるのか
「…」の使い方とポイントを理解できる

## 1-2.対象読者
Goの「…」がわからない人

# 2.「…」の使い方

## 2-1.関数のパラメータを可変長にしたいとき
関数のパラメータを可変長にすることができます。
たとえば、関数で複数のintを可変で受け取りたいときがあるとしたら、以下のように書くことができます。
ポイントは **…int** のように型の前に…を書くことです。

“`
// WriteInt はintを可変で受け取って出力する関数
func WriteInt(nums …int) {
for _, v := range nums {
fmt.Println(v)
}
}
“`

実行すると、以下の結果になります

“`
f

元記事を表示

QiitaのtagフィードをCLIで見るためのCLIツールをGo言語で書いた

[Zennのこちらの記事(フィードを取得する Go 言語パッケージ)](https://zenn.dev/spiegel/articles/20201003-feed-with-golang) を読んで、[gofeed](https://github.com/mmcdole/gofeed)という便利なツールがあることを知り、触ってみたくなったので、QiitaのtagフィードをCLI上で表示するだけの、シンプルなツールを作ってみました。

[qiita-tag-feed-reader-cli – CLI reader of Qiita tag feed.](https://github.com/shinshin86/qiita-tag-feed-reader-cli)

## qiita-tag-feed-reader-cliの使い方
上のリンク先にある[README](https://github.com/shinshin86/qiita-tag-feed-reader-cli/blob/main/README.md)のままの説明になりますが、下記のとおりです。

“`bash
#

元記事を表示

AtCoder HHKB プログラミングコンテスト 2020 参戦記

# AtCoder HHKB プログラミングコンテスト 2020 参戦記

## [HHKB2020A – Keyboard](https://atcoder.jp/contests/hhkb2020/tasks/hhkb2020_a)

2分で突破. 書くだけ.

“`python
S = input()
T = input()

if S == ‘Y’:
print(T.upper())
elif S == ‘N’:
print(T)
“`

## [HHKB2020B – Futon](https://atcoder.jp/contests/hhkb2020/tasks/hhkb2020_b)

3分で突破. 書くだけ.

“`python
H, W = map(int, input().split())
S = [input() for _ in range(H)]

result = 0
for h in range(H):
for w in range(W – 1):
if S[h][w] == ‘.’ and S[h][w +

元記事を表示

HHKB プログラミングコンテスト 2020のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/hhkb2020

# A

“`Q_A.go
package main

import (
“fmt”
)

func main() {
var s string
fmt.Scan(&s)

var t string
fmt.Scan(&t)

if s == “Y”{
if t == “a”{
t = “A”
} else if t == “b”{
t = “B”
} else if t == “c”{
t = “C”
}
}

fmt.Printf(“%s\n”, t)
}
“`

# B
“`Q_B.go
package main

import (
“fmt”
“strings”
)

func m

元記事を表示

DockerでのRailsアプリケーション構築

# 概要
Dockerの勉強会の際、作成したリポジトリがありそのまま埋めてるの勿体無いと思ったので記事にしました。
どなたかの参考になればいいなぁと思ってます。

https://github.com/yodev21/docker_tutorial_rails

# 作業手順

# ファイル作成
下記ファイルを作成

“`
Dockerfile
docker-compose.yml
Gemfile
Gemfile.lock
“`

“`Dockerfile
# イメージ名にRuby(Ver2.6.5)の実行環境のイメージを指定
FROM ruby:2.6.5

# パッケージのリストを更新しrailsの環境構築に必要なパッケージをインストール
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

# プロジェクト用のディレクトリを作成
RUN mkdir /myapp

# ワーキングディレクトリに設定
WORKDIR /myapp

# プロジェクトのディレクトリにコピー
C

元記事を表示

絶対に転職すると心に誓ったのでgolangで”hello word” してみた

自社開発web系企業へ転職したいSES、受託開発企業で働く20代男性です。
今のスキルが伸びにくい環境と給料に不満を覚えたので、文句ばかり言わないで行動に移そうと心に誓ったのでGo言語を勉強することにしました。
Qiitaへ記事を書くことの練習を兼ねております。

早速 hello word しましょう!

とりあえず準備

※エディター、homebrewはすでにインストールされていることを想定しております。
下記コマンドをターミナルに流す。

“`
# homebrewのアップデート
$ brew update

# goをインストール
$ brew install go
“`
以上でgoの準備は整いました。

コードを書いていこう

以下がコード

“`hello.go
package main

import (
“fmt”
)

func main() {
fmt.Println(“hello world”)
}
“`

以下コマンドで実行!

“`
$ go run hello.go
#以下、実行結果
hello world

元記事を表示

Go言語(net/http)でWebサーバーを作成(1)

当たり前ですが、webプログラミングが可能なgolang(Go言語)ではWebサーバーを立てることができます。

私もgolangで簡易webサーバーを作成し、サービスを開発した経験があります
その時は「gin」というwebフレームワークを使用しました。

ginは[コチラ](https://godoc.org/github.com/gin-gonic/gin)

今回はwebフレームワークに頼らなず、ライブラリのみ(純粋なgolang)でwebサーバーを作ってみたいと思います。
参考にしたのは公式ドキュメント[https://golang.org/doc/articles/wiki/](https://golang.org/doc/articles/wiki/)です。英語の原文で学習したい方は是非

なお、golangの基本文法をここでは取り上げません。あらかじめ勉強しておいてください。
私のおすすめはこちらも公式ドキュメントである「A Tour of Go」です。
リンクはコチラ →

元記事を表示

[Golang] 当番を乱数で決定するプログラム

## はじめに
名簿一覧から**x人組**作って欲しいという要望があったので折角だしgo言語で書いてみました。

“`go
package main

import (
“fmt”
“math/rand”
“time”

)

func main() {
list := […]string{“mano”, “hiori”, “meguru”,
“kogane”, “mmm”, “mitsumine”, “sakuya”, “kiriko”,
“kaho”, “choko”, “jyuri”, “rinze”, “natsuha”,
“amana”, “tenka”, “chiyuki”,
“asahi”, “huyu”, “mei”,
“toru”, “higuchi”, “pya”, “hinana”}

// 何等分するか
parse := 5
// 出現した乱数を保持するスライス
var slice []int
rand.Seed(time.Now().UnixNano())

for i := 1; i < len(list)+

元記事を表示

Qiitaの記事をZenn形式のMarkdownで保存して管理する

# 概要

Zenn で記事を GitHub に管理しているのですが、ここに昔 Qiita で書いた記事も加えたくて、Qiita の記事を Zenn 形式で保存するコマンドを作りました。

# インストール

“`shell-session
GO111MODULE=on go get -u github.com/ikawaha/qiita-zenn
“`

# 使い方

Zenn と連係しているレポジトリの `articles` の配下で以下を実行します。

“`shell-session
$ qiita-zenn -user ikawaha -verbose
https://qiita.com/api/v2/users/ikawaha/items?page=1
Goa v3 のテストをシュッとする
人生で何度目かのダブル配列TRIEを書いた
形態素解析器 kagome のユーザー辞書の使い方
goa でデザイン・ファーストをシュッとする
golang で string のポインタを取得する
Luceneで使われてるFSTを実装してみた(正規表現マッチ:VMアプローチへの招待)

元記事を表示

OTHERカテゴリの最新記事