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

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

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など、ほとんどのテキストエディターに対応しているらしい)で、hello.goファイルを作成し、以下のコードを

元記事を表示

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のも

元記事を表示

Go: JWT の実装

こちらの記事の実装を Go で行ってみました。
[認証におけるJWTの利用](https://qiita.com/Naoto9282/items/8427918564400968bd2b#%E8%AA%8D%E8%A8%BC%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Bjwt%E3%81%AE%E5%88%A9%E7%94%A8)

次の3つの API を作成します。

|Method |URL |Parameter |Response |説明 |
|—|—|—|—|—|—|
|GET |/user |Authorization |ユーザ名を返す |ユーザ情報を返す |

|Method |URL |Body |Response |説明 |
|—|—|—|—|—|—|
|POST |/register |name, password,firstname,lastname |Tokenを返す |ユーザ登録を行う |
|POST |/login |name, password |

元記事を表示

Golangでひらがな、カタカナ、漢字を判定する

Golangで漢字を判定する必要があったので正規表現を使ってUnicodeの範囲を指定するみたいな事しないといけないのかなと思って調べていたんですが、[built inのunicode package](https://golang.org/pkg/unicode)に[Unicodeの範囲を示すRangeTable](https://github.com/golang/go/blob/master/src/unicode/tables.go#L3604)が既に用意されていたのでした。

というわけでunicode packageを利用してこんな感じで実装出来ます。

# ひらがなを判定する
“`go
import (
“unicode”
)

func IsHiragana(r rune) bool {
return unicode.In(r, unicode.Hiragana)
}
“`

# カタカナを判定する
“`go
import (
“unicode”
)

func IsKatakana(r rune) bool {
return unicode.In(r,

元記事を表示

Rで素数判定と効率化について(JavaScript,Python,Goを含む)

#はじめに

本記事は、学習途中の学生によって書かれております。
内容の正確性には十分に配慮いたしますが、誤りなどございましたら、ご連絡いただければ幸いでございます。
データ分析などでRを利用している方(特に他の学生さん)の手助けになれば嬉しいです。
はじめに、Rの文法で素数判定の仕方を学び、末尾にその他言語(JavaScript,Python,Go)での素数判定のコードを載せておきます。

#学べること
・Rによる素数判定の書き方
・素数判定に出てくる基礎文法
・JavaScript,Python,Goによる素数判定

#目次
1.素数判定とは
2.素数判定を作ってみよう
2-1.素数判定 ver.1.0
2-2.素数判定 ver.1.1
2-3.素数判定 ver.2.0
2-3.時間測定(効率化について)
3.発展系で遊んでみる
4.あとがき
5.その他言語による素数判定

##素数判定とは
はじめに素数とは
正の約数の個数が2である自然数とされます。
(1は約数が1つであるため含まれません)
より簡単に説明するなら、1とその数自身でのみ剰余が0となる自然数です。

素数判定とは、

元記事を表示

Go: 自作したモジュールの使い方

次のページを参考にしました。
[ローカル環境のみでの Go Modules と自作パッケージ](https://qiita.com/tkj06/items/a5f79417935100045650)

作業フォルダーの準備

“`bash
mkdir module_test && cd module_test
go mod init gin_work
go get -u github.com/gin-gonic/gin
“`

次のようにプログラムを作成

“`text
$ tree
.
├── go.mod
├── go.sum
├── main.go
├── module01
│   └── module01.go
├── module02
│   └── module02.go
└── module03
└── module03.go
“`

“`go:main.go
package main

import “github.com/gin-gonic/gin”
import “module_test/module01”
import “module_test/

元記事を表示

OTHERカテゴリの最新記事