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

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

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()`)に取得フィールドを指定します。指

元記事を表示

Go: JWT のペイロード部をデコード

こちらのプログラムを Go で書き換えました。
[Node.js: JWT のペイロード部をデコード](https://qiita.com/ekzemplaro/items/3e2c1e9cf9189a79b27c)
[Python3: JWT のペイロード部をデコード](https://qiita.com/ekzemplaro/items/e24d6af29ddc01683417)

“`go:decode_jwt.go
// —————————————————————
//
// decode_jwt.go
//
// Feb/07/2021
// —————————————————————
package main

import (
“fmt”
“os”
“strings”
“io/ioutil”
b64 “encoding/base64”
)

// ——————-

元記事を表示

Go とシグナルの検出

今日はとっても簡単なお題なのだけど、ちゃんと理解していないトピックとして、Go 言語でのシグナルのハンドリングについて書いてみたい。

# お題

タイマーと、go routine と、シグナルの割り込みのいづれか一番早く発生した内容表示して、プログラムを終了する。シグナルの場合はシグナルの内容を表示する。

# シグナルのハンドリング

次のサンプルがほぼすべてになります。

“`go
sig := make(chan os.Signal, 1)
signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT)

s := <-sig fmt.Printf("Signal received: %s \n", s.String()) ``` `os.Signal` のチャネルを作成します。その後、`signal.Notify`で監視すべきシグナルを列挙します。すると、そこに列挙されたシグナルが発生すると、作成したチャネルにメッセージが通知されます。`os.Signal` の Struct は `Value()` と、`String()` を持

元記事を表示

Golang の標準ライブラリのみで、時間や配列、カスタム構造体(独自の型)を引数として受け取れるようにする

## 想定読者
– **Go で CLI 作成時の引数処理に困っている人**
– 特に、コンマ区切りの配列や特定のjsonを受け取りたいケース
– Go の標準ライブラリに慣れ親しみたい人
– 特に flag を使ったフラグ付きの引数処理

## 要約

Go の標準ライブラリ(標準パッケージ) [flag](https://golang.org/pkg/flag/) を用いて `Value` インターフェースを実装することで、**時間や配列、カスタム構造体を引数として受け取る**実装を**シンプルに**実現できます。

日本語読むより、[こちらのレポジトリ](https://github.com/nrnrk/go-flag-example)を見ていただくのが早いかもしれません。

## flag パッケージ

[flag パッケージ](https://golang.org/pkg/flag/)とは、Go の標準ライブラリでコマンドラインのフラグをパースするツールです。 [viper](https://github.com/spf13/viper) という有名パッケー

元記事を表示

blackfriday/v2でlinkにrel=”noreferrer noopener”, target=”_blank”を付与する

# 説明
WordPressからオレオレブログ開発&移行しているのですが、blackflidayをv2にして表題の件を試みました。問題はほぼ無いのですが、特定状況下でハマったので合わせてメモしておきます。

# 環境
– Windows10
– Visual Studio Code
– go version go1.15.5 windows/amd64

# Code
“`go
package main

import (
// …省略
“github.com/russross/blackfriday/v2”
)

func main() {
// …省略

htmlFlag := blackfriday.NoopenerLinks | blackfriday.NoreferrerLinks | blackfriday.HrefTargetBlank
renderer := blackfriday.NewHTMLRenderer(blackfriday.HTMLRendererParameters{Flags: htmlFlag})
html := b

元記事を表示

Go: Firebase Auth のトークンの作成

“`go:get_token.go
// —————————————————————
//
// get_token.go
//
// Feb/06/2021
// —————————————————————
package main

import (
“fmt”
“os”
“io/ioutil”
“net/http”
“net/url”
“encoding/json”
“github.com/joho/godotenv”
)

// —————————————————————
func main() {

fmt.Fprintf (os.Stderr,”*** 開始 ***\n”)
email := os.Args[1]
password := os.Args[2]
fmt.Fprintf (os.S

元記事を表示

AWS × Nuxt.js × Go で初めて自作 Web アプリ作ってみた

## はじめに
業務では普段Javaの独自フレームワークやSVN、Db2といったあまり汎用性のない技術スタックで開発をしているため、新しい技術を自分で追っかけていたりするのですが、今回初めて使ってみたい技術を詰め込んで Web アプリを作ってみました。

記事を書くことにも不慣れなため、お見苦しい部分が多々あるかと思いますが、間違い等あればコメントいただけると泣いて喜びます。

## 使用した技術
### 言語
– バックエンド(Go, Gin-Gonic)
– フロントエンド(Nuxt.js)

### インフラ
– AWS(VPC, Route53, ALB, ACM, EKS, S3, CloudFront, CloudWatch)
– コンテナ(Docker, docker-compose)
– データベース(MySQL)
– Kubernetes
– Terraform
– CI/CD(GitHub Actions)

ソースコードは[こちら](https://github.com/nigoroku/amb-front)
※詳細は README.md にも載せています

##

元記事を表示

GoでJpegからWebpへの変換

# 開発環境
– Windows10
– Visual Studio Code
– go version go1.15.5 windows/amd64

# Code

“`go:main.go
package main

import (
“log”
“os”

“github.com/chai2010/webp”
“github.com/disintegration/imaging”
)

func main() {
img, err := imaging.Open(“haruchan.jpg”, imaging.AutoOrientation(true))
if err != nil {
log.Fatal(err)
}
file, err := os.Create(“haruchan30.webp”)
if err != nil {
log.Fatal(err)
}
defer file.Close()
options := webp.Options{Lossless: false, Quality: 30}
if err := webp.E

元記事を表示

Goの基礎知識(概念や、プログラミング言語共通の考え方)(自分リファレンス用)

#注意
更新型の記事です。
筆者の学習に合わせて更新されていきます。

## Goのインストール
[Golang](https://golang.org/)より、ファイルをダウンロードし、手順に従いインストール
(mac, windows, linux全てに対応)

## Goを始める
(Mac)
ターミナルで、絶対パスを利用し

“`terminal
cd /usr/local/go
“`
へ移動、goディレクトリで

“`ターミナル
go version
“`

と入力し、goのバージョンを確認できたら、インストールが完了している。

## 実際のコード
公式チュートリアルを参照
https://golang.org/doc/tutorial/getting-started

1. ホームディレクトリに移動し

“`terminal
mkdir hello
“`
と入力し、helloディレクトリを作成し、

“`
cd hello
“`

で、helloディレクトリへ移動

2.利用しているテキストエディター(vscodeやvimなど、ほとんどのテキストエディターに

元記事を表示

CentOS 8(CentOS 8 Stream)にGoをインストールする

# What’s?

CentOS 8に、Goを`dnf`でインストールしたい、ということで。

結果的に、CentOS 8 Streamに変換することになりましたが。

# 環境

確認した環境は、こちらです。

“`shell
$ cat /etc/redhat-release
CentOS Linux release 8.3.2011

$ uname -srvmpio
Linux 4.18.0-240.10.1.el8_3.x86_64 #1 SMP Mon Jan 18 17:05:51 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
“`

# CentOS 8にインストールできるGoの情報

Goのダウンロードページには、Linux向けの`tar.gz`ファイルが取得できるようになっています。

[Download and install ](https://golang.org/doc/install)

一方で、GoのGitHubリポジトリのWikiには各プラットフォーム向けの情報があるのですが、ここにCentOSやRHELのも

元記事を表示

OTHERカテゴリの最新記事