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

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

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:

元記事を表示

[LINE Bot] LIFFとリッチメニューでも管理画面が作りたい! 3 -認証編-

この記事はこの記事の続きです
[[LINE Bot] LIFFとリッチメニューでも管理画面が作りたい! 2 -リッチメニュー切替-](https://qiita.com/alivelime/items/2d16441153af9c444619)

# ここまでのまとめ
さて、ここまでで「認証用のLINEグループを作る」「グループへの招待・退出」でメニューを切り替える、というところまでできました。
あとはLIFFで作った管理画面に飛ばせばOKですが、当然そのさきのAPIでも認証をかけないといけません。

#### 構成図
ちなみに構成は次のようになっています。

– LIFF : ユーザ用メニューと管理者メニュー (React)
– bot : linebotのロジック(Go)
– line_api : LIFFからLINEの認証などのLINE固有の処理をするAPI (Go)
– omoinas : アプリケーションのメインロジックやmodel・repository層など (Rust)

![image.png](https://qiita-image-store.s3.ap-north

元記事を表示

Jenkinsのgolang crawler問題。

Jenkinsで昨日になって急に起き始めたMalformedURLException

“`
java.net.MalformedURLException: no protocol: /dl/go1.14.2.linux-amd64.tar.gz
at java.net.URL.(URL.java:593)
at java.net.URL.(URL.java:490)
at java.net.URL.(URL.java:439)
at org.jenkinsci.plugins.golang.GolangInstaller.performInstallation(GolangInstaller.java:57)
at hudson.tools.InstallerTranslator.getToolHome(InstallerTranslator.java:72)
at hudson.tools.ToolLocationNodeProperty.getToolHome(ToolLocationNodeP

元記事を表示

DockerでGoを試す環境を作った話

# はじめに
[A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)をやろうと思ったんだけど、手元で試したいということがあったので、Dockerで開発環境を構築

# 完成図

“`
.
├── Dockerfile
├── docker-compose.yml
└── src
└── hello.go
“`

# 作成

準備するものは以下の通り。

“`
.
├── Dockerfile
└── docker-compose.yml
“`

ファイルの中身

“`.Dockerfile:Dockerfile
FROM golang:latest
WORKDIR /go/src/
“`

“`docker-compose.yml
version: “3”
services:
go:
build: .
tty: true
volumes:
– ./src:/go/src
“`

docker-composeを利用した理由は、マウントしたかったから。

# うごかす

元記事を表示

Goでサーバーとクライアントを実装してみた。

こんにちは。そうはぶです。
[「GoでAPIを使ってみたら心が3回くらい折れた話。」](https://qiita.com/souhub/items/0c5efd7fb6f7f3e12372)で書かせていただいたように一度API利用で挫折しました。再挑戦するときにHTTPの基礎を学んで、Goでサーバーとクライアントを実装してリクエストとレスポンスを体感してからだとAPIの理解が非常にスムーズになったので、Goによるサーバーとクライアントの実装をご紹介させてください。

##エコーサーバーの実装
とりあえずエコーサーバーを作ります。
これは通信内容をそのままコンソールに表示してくれます。
僕もでしたが、内容がよくわからなくてもとりあえずコピペしていただければ大丈夫です。

“`go:server.go
package main

import (
“fmt”
“log”
“net/http”
“net/http/httputil”
)

func handler(w http.ResponseWriter, r *http.Request) {
dump, err := ht

元記事を表示

WSL2+VSCode+Docker Desktop

windows10とVSCodeでWindows上のフォルダで作業をしながらDockerを利用したデバッグ開発ができるようになったので設定までの流れを書き留めます。
windowsの環境を開発ツールのインストールで汚すことがなくなりスッキリし、ワークフォルダ毎に開発環境を切り替えることができるようになります。

# WSL2を使用するためWindows10 2004にアップグレード (既にWindows10 2004の場合はスキップ)

https://www.microsoft.com/ja-jp/software-download/windows10

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641711/9f6b78a1-d283-6b50-8faa-ddf1bcf8b0cc.png)

# Linuxカーネルを更新する

https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel

# PowerShellを開いて既

元記事を表示

GO言語 複数のマップをマージ する

逆引きGolangには2つのマップをマージするやり方が書いてあったが、
今回は2つ以上のマップをマージする可変長引数関数を作ってみた。
これにより、マップを幾つでもマージしてくれる。

“`golang

func merge(m …map[string]interface{}) map[string]interface{} {
ans := make(map[string]interface{}, 0)

for _, c := range m {
for k, v := range c {
ans[k] = v
}
}
return ans
}
“`

## 参考文献
逆引きGolang (https://ashitani.jp/golangtips/tips_map.html#map_Merge)

元記事を表示

goland 設定go ModulesのEnable Vendoring Support automaticllyを外さないと

###問題###
JetBrain goland中に
テストコードを実行する時に以下のエラーが発生されました。

“`
./somefile.go:3:8: cannot find package “.” in:
/project/vendor/somepackage
“`

パッケージ先がgo moduleに指定されたあるはずですが、vendorに指定されて、vendorにパーケージがないから、見つからないエラーが発生されます。

###解決法###
設定
->go
->go Modules
->Enable Vendoring Support automaticllyを外したら、正常に戻ります。

スクリーンショット 2020-07-01 16.03.26.png

元記事を表示

OTHERカテゴリの最新記事