Go関連のことを調べてみた2021年02月14日

Go関連のことを調べてみた2021年02月14日

絵文字生成する slack コマンド作成

先日、絵文字生成を行なうコマンドとサーバを作成したため、それに合わせて slack のコマンドを作成してみました。軽いツールの説明と導入手順を書いていきます。

## ツール説明

### 絵文字作成ツール

まず、絵文字作成ツールです。
https://github.com/komem3/wordimg

入力したテキストから絵文字を作成してくれるコマンドラインツールが欲しいと思い作成しました。 Go で作ったのでコマンドとサーバのどちらも作成してみました。サーバの URL は https://wordimg-otho5yxlgq-an.a.run.app/wordimg です。[絵文字ジェネレーター](https://emoji-gen.ninja) のコマンドライン版みたいのを作りたいなというモチベーションで作成しましたが、あちらの完成度が高いのでまだまだ改良の余地があるなと感じております。

ちなみに、`https://wordimg-otho5yxlgq-an.a.run.app/wordimg?text=helloworld` というURLを見ると以下のようになります。更新

元記事を表示

AtCoder Regular Contest 112のメモ

# 前置き

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

# 問題

https://atcoder.jp/contests/arc112

# A

“`Q_A.go
package main

import (
“bufio”
“fmt”
“os”
“strconv”
)

var sc = bufio.NewScanner(os.Stdin)

func nextInt() int {
sc.Scan()
i, e := strconv.ParseInt(sc.Text(),10,32)
if e != nil {
panic(e)
}
return int(i)
}

func main() {
sc.Split(bufio.ScanWords)

var T int
fmt.Scanf(“%d”, &T)

var L, R int
var count int

counts := make(

元記事を表示

Paizaでも好きなエディタ使いたい!

Qiita初投稿です。
今回は自作のCLIツールを紹介します。

## TL;DR

– Paizaのスキルチェックを始めたが、Webページ上のエディタは使いづらいので、ローカルのエディタでコーディング&テストできるようなCLIツールを作ってみた

## 制作物

[![pz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565704/2ffbaef2-b79a-c51d-e554-85edc7a6654c.png)](https://youtu.be/FTqw5-lfkNE)
(↑クリックするとYouTubeへジャンプします。)

リポジトリはこちら → [reeve0930/pz](https://github.com/reeve0930/pz)

## なぜ作ったか

ものすごく個人的な話なので、興味のない人は読み飛ばして下さい…

最近、[AtCoder](https://atcoder.jp/)で競技プログラミングを始めました。
AtCoderで過去問を解いて色々と勉強していたのですが、
[P

元記事を表示

15rep – 独自Errorの作成 ~ 備忘録

# 書いた理由
– API作成しているときにエラーって返すと思います。その際に独自でErrorを定義し返すというよくある内容をメモ化(作り込まず簡易)

# 独自エラーの定義
– 独自のエラー型を定義するやり方
– Goの組み込みのエラー型(error)は以下のような型です。
(errorインタフェース)

“` go
type error interface {
Error() string
}
“`
– func Error() string を実装した型は全てerrorインターフェースが実装されているものとみなす。(便利)

# 実際に書いてみた
“` go
package main

import (
“fmt”
“net/http”
“encoding/json”
)

type ErrorMessage struct {
Code int
Message string
}

// Errorメソッドさえ定義されていれば良い
func (e *ErrorMessage) Error() string {
return e.Message
}

元記事を表示

【Go】一体いつからappendの引数に与えた変数が不変だと錯覚していた?

# 結論

“`go
slice = append(slice[:idx], slice[idx+1:]…)
“`

上記のようにできない場合で、どうしても元のスライスを保持したいときはmake&copyしましょう

“`go
slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
newSlice := make([]int, len(slice))
copy(newSlice, slice)
“`

https://play.golang.org/p/T9su3lB5xi5

# はじめに
スライスを使うときに無意識でappendを使うかと思います。
単純に追加するだけであれば、至って普通の挙動を示しますが、とある条件の時に
想定しない挙動になることがあります。

# 実験内容
配列の中から特定のインデックスにある値を削除する処理です。
例えば以下のようなコードがあった場合はどうでしょうか?

“`go:main.go
package main

import “fmt”

func main() {
slice := []in

元記事を表示

Hugo を導入する過程で go の環境とか作る

github の hugo を clone して docker build すれば docker の環境は出来るので、書くまでもないと言えば書くまでもない。

# TL;DR
正式版と Draft 版の二つの Hugo サーバを立ち上げ、Draft でうまくいったら git をつかって、正式版から pull して反映するという環境を作りたい。

そのために hugo + git の docker 環境 + ホスト側に同じバージョンの hugo が必要になった。go の環境はあまり関係なかった、、、

# まずは出来た Docker のイメージを使う
sinby/hugo-git:0.80.0 で公開しているので

“`
% sudo docker run –rm -v =0/site:/site sinby/hugo-git:0.80.0 new site .
“`

こんな感じでまずは site を構築する。=0 は tcsh の機能なので、bash 使っている人とかは $(pwd) とかに置き換えることになるでしょう。

ところで、いったいこれはなにをしているのか?

##

元記事を表示

【Go Lang】WebFrameWork使ってみた1 Gin

# はじめに

筆者について。
– SIer界隈の人
– 東京以外の地方都市在住
– 30代後半

GoLang案件がなんだか増えてきた。
ということで導入のテンプレートになるWebFWを作りたい。
そのベースとなるWebFrameWorkについて、実際に使ってみて導入の検討をしていくことにする。
観点は以下!

– 人気
– 学習しやすさ
– 特徴

# 使ってみるWebFrameWork
[GitHubリポジトリのスター数でOSSランキングを作成する](https://qiita.com/loftkun/items/5ea5b9577347505729f6)
を参考にGitHubリポジトリのスター数をカウントしてみた。
※jqはダウンロードしてきてpathを通す必要あり

“`
$ set LANGUAGE=go
$ set KEYWORD=web+framework
$ set STAR=10000
$ set USER=yusuke-nomura-cosmoroot
$ set PASS=20130401_cosmo
$ set page=1
$ curl –anyauth

元記事を表示

faker ダミーデータ生成ライブラリ Go

人名や住所などのダミーデータをランダムに生成するGoライブラリ。英語ですが。

[faker](https://github.com/jaswdr/faker)

“`golang
package main

import (
“fmt”

“github.com/jaswdr/faker”
)

func main() {
faker := faker.New()

fmt.Println(faker.Person().Name())

fmt.Println(faker.Address().Address())

fmt.Println(faker.Lorem().Text(100))
}
“`

ループで使用する場合。

“`
p := faker.Person()

for i := 0; i < 10; i++ { fmt.Println(p.Name()) } ``` 実行結果 ``` Ms. Kaitlin Johnston II 7 Balistreri Crossing Apt. 728 Loychester, DE 29058 ali

元記事を表示

strings.Replace と strings.Replacer はどっちが早い

# 概要
複数の文字を置換するときは `strings.Replacer` でまとめて置換した方が早そうな印象がありました。
しかし `strings.Replace` のコードの方が `-bench` の結果がよい状況に出会したので改めて確認しました。

# 用語

## やりたいこと
`ABCDE` の `A` を `1` に `BC` を `23` に置き換えたいとき

## 用語

(用語に自信がないので以下の使い方で書きます)

* 「文字」
* 上記やりたいことでいうところの、`A`
* 「文字列」
* 上記やりたいことでいうところの、`BC`
* 「置き換えたい文字(列)」
* 上記やりたいことでいうところの、`A` や `BC`
* 「置換対象文字列」
* 上記やりたいことでいうところの、`ABCDE`

# さっそくまとめ

以下の場合は `strings.Replace` を複数回実行した方が早そうです。

* 「置き換えたい文字(列)」が少ないとき
* 「文字列」を置き換えたいとき
* 「置換対象文字列」に、「置き換えたい文字(列)

元記事を表示

Apache/Nginx 自動再起動付き監視デーモンを golang で作ろう

## はじめに
モダンな監視ツールを導入できない環境向けに簡単な監視デーモンを golang で簡単に実装してみます。
クロスコンパイルでほとんどの環境で動作するデーモンを作れるのでこういう時に golang は本当に頼りになります。

## やってみよう

#### 必用なもの
* golang

#### 仕様
監視対象URLにポーリング → エラー回数が上限を超え → 任意のコマンドを発行
上記のデーモンを golang で実装する
監視対象URLやエラー時に発行するコマンドなどを環境変数にから読み込む

#### 実装

まずは必要な変数を定義します。

“`go:main.go
var (
CheckUrl string // 監視対象URL
CheckTimeout int64 // 監視のタイムアウト
CheckInterval int64 // 監視間隔(秒)
RetryCount int64 // リトライ最大回数
StopCmd string // エラー検知時のApache/Nginx停

元記事を表示

【Go】標準入力 / bufio.Scanner

競プロとかをやっていると標準入力を受け取って処理をすることが多いと思います。
記事も多いので、あまり理解せず書いていたコードをドキュメントを参照しながらまとめようと思います。

Go勉強し始めて日が浅いので色々ご容赦ください…mm

## 標準入力を受け取るよくある書き方。
“`go
package main

import (
“bufio”
“fmt”
“log”
“os”
)

func main() {
sc := bufio.NewScanner(os.Stdin)
sc.Scan()

if err := sc.Err(); err != nil {
log.Fatal(err)
}

fmt.Println(sc.Text())
}
“`

## 一つずつみていく
まず、`bufio.Scanner`を[みてみる](https://golang.org/pkg/bufio/#Scanner)。今回使ってるメソッドが大体載ってますね。

“`go
// ファクトリ関数
func NewScanner(r io.Reade

元記事を表示

GoプロジェクトにSonarScannerをかけてみる

# What’s?

SonarQubeでは、Goも解析対象となっているようなので試してみようかなと。

# SonarQubeでGoを使う

SonarQubeのGoに関するドキュメントは、こちら。

[Go](https://docs.sonarqube.org/8.6/analysis/languages/go/)

SonarScannerを使うようです。

SonarScannerは64ビットのWindows、macOS、Linuxで動作し、Go自体のインストールはカバレッジを取得しなければ不要のようです。

> * SonarQube Scanner should run on a x86-64 Windows, macOS or Linux 64bits machine
> * You need the Go installation on the scan machine only if you want to import coverage data

Goに対する解析ルールは、こちら。

[Go static code analysis](https://rule

元記事を表示

Go – error handlingにおけるnilでハマった

## 前提
この記事は以下環境で調査した結果を元に記載しております。
– OS : MacOS BigSur11.2
– Go : ver 1.15.6
– IDE : Visual Studio Code
*プログラミング初学者が書いた記事なので、もしご指摘などございましたらコメント頂けると嬉しいです!

## ハマった問題
“`
err := (*gorm.DB).GetErrors()
if err != nil{
return A
} else {
 return B
}
“`
でエラーハンドリングをした際に、errには何もエラーが発生しておらず、綺麗に動作しているつもりでもAが返り値として戻ってきてしまっていた。
“`log.Println(err)“`ログを出力してみると、出力は“`[]“`
“`log.Printf(“%T\n”, err)“`で出力すると、出力は“`[]error“`

ここで私はerrがnilではなく、型がついているものらしく、どうやら型が一致していないとイコールで判定されない?と気づく。
詳細は[quoll00](https:

元記事を表示

godotenvを使って.envから環境変数を読み込む

## リポジトリ
https://github.com/joho/godotenv

## envファイルを用意

“`.env
AZURECLIENTID=f81b5350-09dc-480e-8c03-1xxxxxxxxxxxxxxxxx
“`

## 例

“`golang
package main

import (
“fmt”
“os”
“github.com/joho/godotenv”
)

func main() {
err := godotenv.Load(fmt.Sprintf(“%s.env”, os.Getenv(“GO_ENV”)))
if err != nil {
}

ID := os.Getenv(“AZURECLIENTID”)
fmt.Println(ID)
}
“`

## 使い方

“`
yuta:~/go-env $ go run main.go
f81b5350-09dc-480e-8c03-xxxxxxxxxxxxxxx
“`

元記事を表示

14rep – gRPC クライアントの keepalive 自分メモ用

# 書いた理由
– gRPC Serverは書いたがClientは書いたことないな….と思い自分メモ

## keepalive は 2 種類

### TCP レイヤーの keepalive
– これは TCP ソケットの SO_KEEPALIVE オプション
– 細かい設定をアプリケーションから行えないので、アプリケーションレイヤーの実装が提供されている

### アプリケーションレイヤーの keepalive
– http/2 の PING フレームを定期的に送ってタイムアウトしたら再接続する
– クライアントのバッテリーや DDos 配慮のため、アクティブなストリームがない場合は PING フレームを送らないオプションが提供されている

“` golang
package client

import (
“log”
“time”

“google.golang.org/grpc”
“google.golang.org/grpc/keepalive”
)

const (
// GRPCClientKeepaliveTime 活動がなくなってから PING を送

元記事を表示

プロファイラ HTTP Server-Timing のGoパッケージ go-server-timing

サーバサイドの処理のプロファイリングを`ChromeのDevtool`で可視化するライブラリです。
[go-server-timing](https://github.com/mitchellh/go-server-timing)

## そもそも論として

HTTPプロトコルヘッダーには、`Server-Timing` というものがあります。ここにサーバ側で計測した値をセットして、HTTPレスポンスに一緒に仕込んでブラウザに返せば、`Chrome Devtool`がいい感じに可視化してくれるわけです。

こんな感じに。

![Screen Shot 2021-02-08 at 14.21.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75231/d5ce5df0-daa2-8542-23d0-e6deb0d217f7.png)

## コードサンプル

実行したソースコードです。(README.mdからママ)

“`go
package main

import (
“fmt”
“mat

元記事を表示

Go言語のバージョンを切り替えるためのgoenvをインストールする方法

“`
git clone https://github.com/syndbg/goenv.git ~/.goenv
“`
として`~/.goenv`を作成する。その後`.zshrc`に環境変数とgoenvの初期化を追加する。

“`bash
export GOENV_ROOT=”$HOME/.goenv”
export PATH=”$GOENV_ROOT/bin:$PATH”
eval “$(goenv init -)”
“`

記述したら、`source ~/.zsrhc`として設定を再読込する。この状態でgoenvが使えるようになる。

次にgo 1.14.14をインストールする。

“`
goenv install 1.14.14
“`

詳細なgoenvのインストールは、[goenv/INSTALL.md at master · syndbg/goenv](https://github.com/syndbg/goenv/blob/master/INSTALL.md#installation) を参照すること。

元記事を表示

Go の context

Go を書くときに何となく書いてしまっている `context` を運用可能に持っていく。

# お題

Context を使って、リクエストを投げている時に、一定の時間がたったらグレースフルにリクエストを停止するプログラムを書く。リクエストを処理する関数の方では、Context の Value を取得すること

上記のお題をさっと書けるように、いろいろ調べてみよう。

# Context とは

Go Lang のコンテキストは、デッドライン、キャンセレーションシグナル、他のリクエストスコープのバリューを伝播させるものである。 C# とかでいうところの、CancellationToken に近い雰囲気を持っている。これを理解していこう。

* [Go Context Package](https://golangdocs.com/golang-context-package#:~:text=GoLang%20context%20package%20defines%20the%20Context%20type,%20which,function%20calls%20between%20

元記事を表示

奉行クラウドのタイムレコーダー打刻を自動化するためのツールを作った

# Motivation
弊社の出勤退勤では奉行クラウドを利用していますが、奉行クラウドは公式からデスクトップクライアントを提供していないのでタイムレコーダーの打刻のためにわざわざブラウザから奉行クラウドのページを開いて打刻のボタンを押す必要があります。
この作業が実に面倒くさいし外出/再入などは結構忘れる事が多いのでどうにかならんもんかなと思って自動化することにしました。

# TL;TD

マルチプラットフォーム環境に対応したCLIで奉行クラウドで打刻できるClientを作成しました。
[bugyo-client-go](https://github.com/tomtwinkle/bugyo-client-go)
こんな感じで使えます。

“`bash
# 出勤
bugyoclient punchmark –type in

# 退出
bugyoclient punchmark –type out

# 外出
bugyoclient punchmark –type go

# 再入
bugyoclient punchmark –type return
“`

Windo

元記事を表示

【Go】mongo-go-driverのFindで特定フィールドのみ取得

## 概要
MongoDBでもRDBのSELECT分同様に、特定のフィールドのみ取得する機能が用意されています。[How to select fields in a document in MongoDB](https://learnwithparam.com/blog/how-to-select-fields-in-a-mongo-query/)の記事にある通り、findメソッドの引数で取得するフィールド名を指定します。
今回はこの操作をmongo-go-driverでどのように実装すれば良いかというのを書きます。

## 対応
[remove a field from mongodb query result in golang](https://stackoverflow.com/questions/64145702/remove-a-field-from-mongodb-query-result-in-golang)の記事にある通り、`options.FindOne().SetProjection`のメソッド(複数行取得の場合は`Find()`)に取得フィールドを指定します。指

元記事を表示

OTHERカテゴリの最新記事