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

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

Go: Starttls でメールの送信

こちらと同じことを Deno で行いました。
[Python3: Starttls でメールの送信](https://qiita.com/ekzemplaro/items/c248b52a6f36947af080)
hi-ho.ne.jp で試しました。

“`go:hi-ho.go
// —————————————————————
//
// hi-ho.go
//
// Jul/07/2020
// —————————————————————
package main

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

func main() {

fmt.Fprintf (os.Stderr,”*** 開始 ***\n”)

err := godotenv.Load(“.env”)
if err != nil {

元記事を表示

Golang 設定ファイルライブラリ 「Viper」 README翻訳 2020年7月

# はじめに

[spf13/viper: Go configuration with fangs](https://github.com/spf13/viper)の翻訳
すでに翻訳されている方[[翻訳+α] Go言語の設定ファイルライブラリ Viper – Qiita](https://qiita.com/hachi8833/items/fe3d5d6b1285c5ef1821)がいたので、それを元に現在のREADMEとの差分だけ付け足しました。
差分:https://github.com/spf13/viper/compare/30ce444..13df721
README_jp.mdとしてプルリク送りますが、マージされない可能性もあるのでQiitaとgistで公開しておきます。

変更箇所は、利用プロジェクト紹介、INI、envfileのサポート、一部APIの変更、追加、コード例の追加、くらいでした。

—————-
# Viper Readme

**Go言語の設定ファイルがついに牙を剥く!**

多くのGoプロジェクトがViperを使って構築されています。

元記事を表示

golangci-lintに自作linterを追加する

## はじめに
[golangci-lint](https://github.com/golangci/golangci-lint)は、`golangci-lint run` とするだけで、様々な有名なlinterを実行することができます。

これには以下のメリットがあります。

– 各linterの導入方法や設定方法を覚える必要なく、共通の設定で管理できる
– 自分でlinter探さなくても、良いlinterが日々追加されていく
– 誤検出がある場合に、linterによらず共通の設定方法でその結果を無視することができる

この記事では、golangci-lintに自作linterを追加する方法を公式ドキュメントと実際に[sonatard](https://twitter.com/sonatard)がPRを出したファイルを参考にして紹介します。
[golangci/golangci-lint – Add Noctx #1179](https://github.com/golangci/golangci-lint/pull/1179)

他にも日本の方では [timakin](http

元記事を表示

context.ContextなしでHTTP Requestを送信しているコードを発見する `noctx`

## はじめに

https://github.com/sonatard/noctx/

noctxは `context.Context` なしでHTTPリクエストを送信しているコードを発見します。

もしあなたがライブラリ開発者であるなら `context.Context` をHTTPリクエストに渡していないと、ライブラリを利用するユーザはHTTPリクエストのキャンセルやトレース情報の取得ができません。

そのためライブラリの中でHTTPリクエストを送信している場合には `noctx` を利用することで、そのような問題を防ぐことができます。

特に会社からAPIのGo SDKを公開している場合には、noctxを利用することで多くのユーザが安心して利用することができるようになります。

##インストール方法

“`sh
$ go get -u github.com/sonatard/noctx/cmd/noctx
“`

## 使い方

“`sh
$ go vet -vettool=`which noctx` main.go
./main.go:6:11: net/http.Ge

元記事を表示

go修行17日目 Webサーバ

## 参考サイト
https://echo.labstack.com/guide
https://rightcode.co.jp/blog/information-technology/golang-introduction-rest-api

### パッケージインストール

“`
go get -u github.com/labstack/echo/…
“`

### コード
– localhost:1323で起動する

“`golang
package main

import (
“net/http”

“github.com/labstack/echo”
)

func main() {
e := echo.New()
e.GET(“/”, func(c echo.Context) error {
return c.String(http.StatusOK, “Hello, World!”)
})
e.Logger.Fatal(e.Start(“:1323”))
}
“`

“`
PS C:\Users\yuta\go\src\server>

元記事を表示

Goの標準ライブラリだけでルーティングするの億劫ですよね。静的解析してコード生成しません?

Goは標準ライブラリが豊富で、Webアプリが簡単に書けていいですよね。

ひと通りの機能は多少冗長でも標準ライブラリだけで実装できます。

しかし、パスパラメータが複数のときのルーティングは標準ライブラリだけだと面倒です。

Webフレームワークを導入すればいいという声が聞こえてきそうですが、世の中標準ライブラリだけで実装する需要が少なからずあるみたいなので、ルーターのコードを生成するツールを作って見ました。

# ルーティングのお話

本題に入る前にフレームワークと標準ライブラリのルーティング方法を比較していきましょう。

## 単純なパスのとき

パスパラメータを扱わない、単純なパスをルーティングするときは次のようにできます。

“`go:標準ライブラリ
http.HandleFunc(“/users”, UsersHandler) // HTTPメソッドの判定など、関数内で工夫が必要
“`

ちなみに軽めのWebフレームワーク・ライブラリで有名なgin、echo、gorilla/muxなどはこんな感じです。

“`go:gin
r := gin.Default()
r.GE

元記事を表示

【Go】Goroutine使った並列処理サンプル – API呼び出し

# はじめに

はじめまして。Go初学者です。

関わっているプロダクト的にも、自身のスキル的にも、並列処理そのものもあまり書いてこなかったこともあり、使い方も使い所もいまいちわからなかったゴルーチンですが、真面目に勉強中です。
今回は試しにゴルーチンを利用してみたので、同じ境遇の方に向けて、実装例と共にご紹介させていただきます。

# 作ったもの

– Qiita APIを実行し、自分自身の投稿情報を取得していいね率等を表示するCLIツール

[githubはこちら](https://github.com/wataboru/aggregate-my-qiita)

## 簡単な処理フロー

1. 実行引数にて、userIDとQiitaのアクセストークンを渡す
2. [ユーザーの記事一覧をAPI](https://qiita.com/api/v2/docs#get-apiv2usersuser_iditems)で取得
3. 各記事ごとに、[記事単体を取得するAPI](https://qiita.com/api/v2/docs#get-apiv2itemsitem_id)を叩く
4.

元記事を表示

Goでガンマ補正してみる

[前回の投稿](https://qiita.com/wattak777/items/73fd189da7cf87a3dafe) でセットアップしたGo+GoCV環境においての演習としてガンマ補正を行うプログラムを作ってみました。

##考え方

GoCVには、というより、OpenCVにはガンマ補正のライブラリ関数はないのでCVにあるLUT(LookUpTable)の仕組みを用いてガンマ補正用のルックアップテーブルを作って変換させる方法です。

###ガンマ補正の計算式
入力の画素値を$I(x, y)$、出力の画素値を$I'(x, y)$、画素の最大値を$I_{max}$、ガンマ補正値を$\gamma$とすると以下の式で与えられます。

“`math
I’(x, y) = I_{max}\times\Bigl(\frac{I(x, y)}{I_{max}}\Bigr)^{1/\gamma}
“`
そして、上記の式を画素ごとに適用するのではなく、0~255の出力画素値を計算しておいたルックアップテーブルを用意し、LUT関数を用いて変換をかける形で実行していきます。

##Goのソース

元記事を表示

もうgolangci-lintなんていらねいさ 歌おう別れの歌を

## tl;dr

– go vet (go/analysis/passes) がとても充実している
– 惰性でgolangci-lintに頼っているかもしれない
– 何が必要で何がいらないのか見極めが必要そう
– go vetをannotationsに飛ばすGitHub Action作ったよ

## 背景

### go の静的解析と群雄割拠のlinter群

過去のgo界隈では、様々な開発者が `go/types` や `go/ast` を駆使して思い思いのI/Fのlinterを作り、今でもそれらの多くは生き残っています。
それらのI/F差を吸収・統合する目的で `gometalinter` などが作られてきました。
今は `gometalinter` は後継の `golangci-lint` にその座を譲り、 `golangci-lint` のほぼ一強となっています。

### `go/analysis` の登場

ですがそれも昔の話。
@tenntennさんなどがもうさんざんいろいろな[記事](https://qiita.com/tenntenn/items/65b9a39e6

元記事を表示

Azure botで質問をするGoのサンプルコード

## 公式

– https://docs.microsoft.com/ja-jp/azure/cognitive-services/qnamaker/quickstarts/publish-kb-go

## ソース

“`golang
package main

import (
“bytes”
“fmt”
“io/ioutil”
“net/http”
“strconv”
)

func main() {
// Represents the various elements used to create HTTP request URIs
// for QnA Maker operations.
// From Publish Page: HOST
// Example: https://YOUR-RESOURCE-NAME.azurewebsites.net/qnamaker
var host string = “https://qa-bot-service.azurewebsites.net/qnamaker”

// Authorization en

元記事を表示

go修行16日目 time関数など

## time関数

– RFC3339がよく使われる Postgresqlなどで

“`golang

package main

import (
“fmt”
“time”
)

func main() {
t := time.Now()
fmt.Println(t)
fmt.Println(t.Format(time.RFC3339))
fmt.Println(t.Year(), t.Month(), t.Day(),
t.Hour(), t.Minute(), t.Second())
}
“`

“`
2020-07-05 13:33:12.5673789 +0900 JST m=+0.002000201
2020-07-05T13:33:12+09:00
2020 July 5 13 33 12
“`

## 正規表現

– WebサーバのバックエンドでURLによって処理を判定する場合などに使う

“`golang

package main

import (
“fmt”
“regexp”
)

func main() {
// プログラ

元記事を表示

Gormのエンティティのiotaの扱い

## gormでiotaな型をモデルのフィールド値にしたい時

iotaのままモデルに突っ込めると定数で分岐できたり、変化球が突っ込まれることがなくなるのでiotaされている型をフィールドに定義したかった。

## 結論

iotaな型はゼロ値がnilとして扱われるので、gormのタグオプションの`not null`を指定してあげて、ゼロ値をnilでなく、0とさせる。またはiotaのスタートを1などにしてあげる。

↓1はじめ

“`go
type Gender int

const (
// Male is man
Male Gender = 1 + iota // 1
// Female is woman
Female // 2
)
“`

gormエンティティ

“`go:user_info.go
// Gender is sex of human
type Gender int

const (
// Male is man
Male Gender = iota
// Female is woman
Female
)

type (

元記事を表示

fatal error: newproc: function arguments too large for new goroutine

※メモです
#問題

###fatal error: newproc: function arguments too large for new goroutine
goroutineを実行している部分でエラー

“`go
go hogehoge()
“`

#解決策
#####ポインタレシーバを使う

“`go
go func() {
go hogehoge()
}()
“`
#参考
https://www.coder.work/article/204560

元記事を表示

【Golang】GCP用のフォーマットでログ出力する

# 概要
GCPにはログ管理用プロダクトCloud Logging(旧Stackdriver Logging)があります。
GKEやCloud Runを使う場合、標準出力で出したログを自動で収集してくれてとても便利です。

“” 2020-07-04 18.28.16.jpg

これだけでも全然嬉しいのですが、GCPの定義しているフォーマットで構造化したログを出力すればもう少しいい感じに出来るので試してみます。

# GCPのログについて
https://cloud.google.com/logging/docs/agent/configuration#special-fields
GCPのfluentdではこの「構造化ペイロード」のJSONフォーマットで出力すれば、
Cloud Loggingのログ構造であるL

元記事を表示

名古屋で開催されている技術イベント・勉強会

## はじめに
この度、名古屋を離れ、関東へ引っ越すことになりました。名古屋(東海圏)エンジニアを増やして地元を盛り上げていくという夢が叶わなくなってしまいました。

名古屋でもエンジニアコミュニティを盛り上げようと頑張っている企業さんや、エンジニアさんがたくさんいることを多くの人に共有したくこの記事を書いています。

名古屋へのUターンを考えていたり、リモートができるようになり都心を離れようかなぁと考えている人は、ぜひ次の拠点として名古屋を選択に入れる参考にしてみてください。

*以下イベント情報の概要はリンクページから一部引用させていただいています。

## 定期開催編
以下、定期開催されている勉強会です。
##[Yahoo! JAPAN Nagoya](https://yahoo-nagoya.connpass.com/)
主催:Yahoo! JAPAN
概要:ヤフー株式会社の名古屋オフィスで開催するクリエイター向け勉強会コミュニティ。 多種多様なクリエイター同士が交流できる場所として、開発スキルやノウハウについて学びながら、社内外のクリエイターがアウトプット/インプットできる機

元記事を表示

【Go言語】contextパッケージを理解する-概要編-

Go言語でAPI開発をしていて、一番多く使う標準パッケージと言っても過言ではないcontext。

その動作はなんとなく理解はしているものの、実際のコードを読んで深く理解したことがなかったため、今回は実際にコードやGoDocを読んで中身をまとめていこうと思います。

# 概要
contextは、Go1.7から標準パッケージに組み込まれています。

まずはGo公式ブログのcontextについてまとめられた記事のイントロをそのまま訳してみます。

>In Go servers, each incoming request is handled in its own goroutine. Request handlers often start additional goroutines to access backends such as databases and RPC services. The set of goroutines working on a request typically needs access to request-specific values such a

元記事を表示

Golang+Docker+herokuで何か作ろうとした話

#記事概要
Golang+Docker+herokuで何か作ろうとしてハマった事とか色々まとめるだけの記事。

## 筆者について
– Golang初見。
– herokuはPHPとRailsで触った事がある。
– Dockerは便利すぎてハマりだしてる。

## 採用したもの
– gin
– Webサーバライブラリ。
– Realize
– ホットリロード。
– 後述。

## リポジトリ
https://github.com/YanaPIIDXer/QiitaLineBot
試行錯誤の経緯とかはここのコミットログを見れば大体分かる・・・かも。
ちなみに今回ブランチ分岐は無しの方向。

# Golangのホットリロード
「コードを書き換えると自動でビルドが走って、後はブラウザを更新するだけ」と言う機能。

## 導入
[Realizeを使ってGoでホットリロードを実現する](https://qiita.com/godgarden/items/f73e4a717f1a27b9a3b0)
上記記事を参考にRealizeを導入。
・・・が、Realize起動時のビルドは走って

元記事を表示

GO言語学習メモ ~ Embeddedについて~ GOには継承がない

# はじめに
完全初心者で、GO言語の学習を進めています。
学んだ事のメモとし記事を投稿します。

理解できていない部分が、多くありますが随時編集しますのでお手柔らかにお願いします。

##継承について再確認
あるクラスに定義されたメソッドを、別の新規クラスで利用できるようにした上でクラスを定義することを継承と言う。

クラスの継承には、親クラスと子クラスの関係があり、元となるクラスを親クラス、親クラスのメソッドを引き継ぎ新しく作成するクラスを子クラスと呼ぶ。

**簡単なイメージ図**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622835/50863e3d-4810-d445-ddd5-86de2e23f23d.png)

ずっとrubyを使っていので、rubyでイメージ式

“`ruby:ruby
class 子クラス名 < 親クラス名 end ``` #Goで継承みたいな事する GO言語にはクラスがないので、上に書いた様な事ができないって事。 Goで継承で継

元記事を表示

go修行15日目 サードパーティ製パッケージを使う

## サードパーティパッケージのインストール
– 株価分析のためのパッケージ

https://github.com/markcheno/go-talib

### インストール

“`
go get github.com/markcheno/go-talib
go get github.com/markcheno/go-quote
“`

### インストールされる場所

“`
PS C:\Users\yuta\go\src\github.com> ls .\markcheno\

ディレクトリ: C:\Users\yuta\go\src\github.com\markcheno

Mode LastWriteTime Length Name
—- ————- —— —-
d—– 2020/07/03 8:45 go-talib

“`

#

元記事を表示

fluentdでdockerコンテナのログをファイルごとに出し分けてみたお話

# fluentdとは
fluentdとはログ収集ツールです。
様々な形式のinputからログを収集でき、それを必要に応じて整形・加工してログ出力できます。

# 環境
– OS:debian 10.3
– docker:19.03.11
– docker-compose:1.16.1
– fluentd:1.3.2

# 今回の目標
今回の目標はサーバーのログを標準出力からファイル出力へ切り替えることです。
さらに、ファイル出力も全てのログを出力するログファイルと、エラーログのみを出力するエラーログファイルの2種類作成していきます。

# fluentdの設定ファイルについて
デフォルトでは、 `/fluentd/etc/fluent.conf` が読み込まれます。

## tag
fluentdでは**ログをtagというもので管理**していきます。
このtagを使って設定を任意のログのみに適用できたりします。

## ディレクティブ
**fluentdの設定はディレクティブと呼ばれるもので設定**していきます。
ディレクティブには下記のようなものがあります。

– source:

元記事を表示

OTHERカテゴリの最新記事