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

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

Go で Slack Bot を作る

シンプルな Slack Bot を Go 言語で作ってみます。
順を追って作り方を解説していくので「サンプルコードだけ見たいよ」という方は [こちら](#終わりに) に記載されているものをご参照ください。

## 作るもの

下図のように Bot に対しメンションをつけて `ping` と送ると `pong` と返してくれるだけのシンプルなものです。

![slackbot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586035/dca85675-4c76-0be8-6cec-44d3b853b62b.png)

Slack からのイベント受信には [Events API](https://api.slack.com/events-api) を使用します。同様に Slack からのイベントを受信する方法としては WebSocket でやり取りする [RTM API](https://api.slack.com/rtm) があり、こちらであれば App 側から Slack に接続しにいくのでサーバー

元記事を表示

[Golang] windows用にtouchコマンドを作ってみた

# 概要

windowsでtouchが使えないので、以下の機能を持つtouchコマンド作ってみた。

1. 複数ファイルを一度に作る (例) touch file1 file2 file3
2. 既存ファイルは上書きしない

もっと綺麗に書ける案があれば教えてください。
[githubレポジトリ](https://github.com/youk-h/golang-cli)

## mainコード

mainコード

“`main.go

package main

import (
“errors”
“flag”
“os”
“sync”
)

func main() {
flag.Parse()
execute(flag.Args())
}

func execute(fileNames []string) {
wg := sync.WaitGroup{}
for _, name := range fileNames {
wg.Add(1)
go touch(name, &wg)

元記事を表示

置換をBSTに入れる

# Go Data Structures: Binary Search Tree
https://flaviocopes.com/golang-data-structure-binary-search-tree/

# Generate all permutations
https://yourbasic.org/golang/generate-permutation-slice-string/

元記事を表示

Go バイナリファイルの読み書き

# Go バイナリファイルの読み書き

今回は、Goで固定長と可変長なデータがあるバイナリファイルを読み書きしてみたいと思います。

## やりたいこと

複数個ファイルを1つのバイナリファイルにする。(結合)

バイナリファイルを複数ファイルに書き戻す。(分割)

## データ構造

下記のデータ構造を1つのファイルとして扱い、連結していく。

Offset: 00 01 02 03 04 05 06 07
00 ファイル名サイズ
(4 byte 固定: BigEndian)
ファイルサイズ
(4 byte 固定: BigEndian)
08 ファイル名
(可変長: Lit

Golang mockery/testifyで高階関数をmockする

golangでテストを書く際、[vektra/mockery](https://github.com/vektra/mockery)による[stretchr/testify](https://github.com/stretchr/testify)で使用できるmockの自動生成が非常に便利なのですが、双方クイックリファレンス以外の細かいドキュメントがあまり存在せず特殊な関数をmockしようとする結構悩みます。

最近調べまくったもので**「無名関数で書かれた高階関数のmock」**はズバリの解決方法が検索してもtestifyのissueくらいしか出てこなかったので同じく悩める人のためにここに残しておきます。

# 高階関数のtestify mockサンプル

シンプルに書こうと思いまいしたがテスト容易にするDIのためのinterface定義を必ず書く都合上結構記述量が多くなりました。
[githubにコード公開](https://github.com/tomtwinkle/go-mockery-mock-sample/tree/master/anonymous_func)しておいたので

Go Windows GUI Walk examples

# Go Windows GUI Walk examples

GoでWindowsのGUIを作るときは、
`lxn/walk` というpackageを使っています。

## lxn/walk

GitHub – lxn/walk: A Windows GUI toolkit for the Go Programming Language
https://github.com/lxn/walk

上記のリポジトリ内に `examples` というフォルダがあり、
いろいろなコード例が入っています。

https://github.com/lxn/walk/tree/master/examples

“`text
./examples
├─actions
├─clipboard
├─databinding
├─drawing
├─dropfiles
├─externalwidgets
├─filebrowser
├─gradientcomposite
├─imageicon
├─imageview
├─imageviewer
├─img

[Go]1行加えるだけで interface の実装を強制するテクニック

## 本記事の目的

Go の interface を使って抽象的にオブジェクトを扱いたいときにメソッドの実装漏れってないでしょうか?
抽象化したい構造体が多くかったり、interface のメソッドの定義を変更した場合に簡単に発生しちゃうことだと思います。

今回はその問題を起こさないために、Goコンパイラに interface の実装漏れを伝えてもらえるようになる簡単なテクニックを共有します。

## 説明

具体例に `Do()` というメソッドを実装するだけで `Doer` になれる interface を定義してみました。
`Person` は `Doer` の `Do()` メソッドを実装しているので `Doer` です。

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

“`go
type Doer interface {
Do()
}

type Person struct {
Name string
}

func (p Person) Do() {
fmt.Printf(“My name is %s. I am Doer!!!!

Goaの設定中に「”protoc”: executable file not found in $PATH:」と出たときの対処法

# 筆者の環境
– macOS Catalina 10.15.3
– Go言語 1.14
– Goa v3.0.10

# Go言語でGoaを使うところに躓いたところ。
ネットの日本語記事はバージョンが古かったりカオスだったので、公式ドキュメントを見ながら進めていきました。

Getting Started · Goa :: Design first.
https://goa.design/learn/getting-started/

ドキュメントを見ながら進めて以下のコマンドを実行したところ、エラーを出しました。

“`zsh:zsh
goa gen calc/design
failed to run protoc: exec: “protoc”: executable file not found in $PATH:
“`

落ち着いてドキュメントの上の方を見るとこんなことが書いてありました。
https://goa.design/learn/getting-started/#prerequisites
> The service makes use of gRPC a

Go text/template で文字列作成

# Go text/template で文字列作成

みなさん、こんにちは!
Go書いてますか?

今回は、`text/template` を使って ひな形 から 文字列 を生成する方法をご紹介します。

## text/template

公式が作成している 標準package なので すぐに使えます。

* template – The Go Programming Language
* https://golang.org/pkg/text/template/

似たようなpackageで `html/template` というのがありますが、
これはコードインジェクションに対して安全なHTML出力を生成するものなので
そういった目的がないときは、 `text/template` を使用しましょう。

* template – The Go Programming Language
* https://golang.org/pkg/html/template/

ちなみにどちらも使い方は、同じです。

## 使ってみる

文字列のひな形 と データ を入れ込むことによって、目

go:mapstructureを使ってJSONファイルを開いて構造体を返す汎用的な関数

# やりたいこと
* いろんなファイルを読み込む必要がある
* いちいちそのファイル専用の関数を作りたくない
* JSONファイルパスと構造体を渡すだけで済む汎用的な関数を作りたい

# コード
“`json:config.json
{
“ip_addresses”: [“127.0.0.1”, “127.0.0.2”, “127.0.0.3”]
}
“`

“`go:main.go
package main

import (
“fmt”
“github.com/mitchellh/mapstructure”
“encoding/json”
“io/ioutil”
)

type Conf struct {
// ここ重要。アンダースコア必要
Ip_Addresses []string `json:”ip_addresses”`
}

func main() {
const confPath = “./config.json”
var conf Conf
convertJsonFileToStruct(confPath, &con

意外と知らない並列処理のメリット

Quoraの[並列処理のメリットは何ですか?](https://qr.ae/pNtlKE)を参考にしてます。

処理の前後関係がないアルゴリズムを同時に実行できる。

単純にN個の並列化で処理時間がN分の1になるわけではないことに注意

日本のスーパーコンピュータ『京』も並列コンピュータです。

【初心者に最適】なぜ我々はRPAに頼るのか。いまだに誰も教えてくれないエンジニアが使うべき自動化ベストプラクティス(2020年03月時点)

[なんでこんなクド過ぎるタイトルなのかは前回をご参照ください。](https://qiita.com/ykato/items/03306aaa55d091d61d9b)

記事としては**業務経験に漬け込んだ自動化のツール作ったので見てマサカリでも良いから感想欲しいです!という内容**です。*興味無ければそっ閉じお願いします。*

とりあえず、こんなの作ったので見て!

[opsapi](https://github.com/yasutakatou/opsapi)

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/2f1d60da-be12-552d-043b-fef169730151.gif)

 リポジトリに書いてありますが、オジサンが中学生英語で書いたものをさらにオジサン意訳しますね!

## 前説

 定期的な申請とかeラーニングみたいなただ手を動かすメンドクサイ仕事ありますよね?
あなたは人力でどうにかしなきゃならないし、また同僚もおんなじタスクをしなきゃならない

[ネタ]Excel方眼紙の上に好きな画像を正方形にペイントするツールをGoで作ってみた

# 概要

日本の文化圏にいれば、どこかで「[Excel方眼紙](https://ja.wikipedia.org/wiki/Excel%E6%96%B9%E7%9C%BC%E7%B4%99)」に出会うことがあるでしょう。
このエントリでは、Excel方眼紙にお気に入りの絵をペイントして眺めてみるツールを作ってみました。

|![lenna_rendered.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/6a54c551-808c-06c2-f30f-574b75813b68.png)|
|:—|
|図:[コンピュータで画像系のサンプルでよく使われるLenna様](https://en.wikipedia.org/wiki/Lenna)をペイント|

# TL;DR;

リポジトリはこちら[https://github.com/hrkt/xlspaint](https://github.com/hrkt/xlspaint)です。
ご自身でビルドするか、[リリースのページから実行形式xls

Neovimでpopup-menuを実装できるプラグイン

## Neovim用のpopup-menuを実装できるプラグインを作りました
[Vim8にはpopup_menu()という関数があり](https://vim-jp.org/vimdoc-ja/popup.html#popup_menu())、ユーザー独自のpopup-menuを利用した機能を作ることができるのですが、これまで残念ながらNeovimには同じ機能は実装されていませんでした。

これは時々問題になることがあります。例えば、プラグイン作者が軽い気持ちで`popup_menu()`を利用すると、Neovimでは`popup_menu()`に相当する機能がないため、Neovimで全く同じ機能を実装するのは一苦労することになります。

今回これを解決すべく、**popup-menu.nvim**というプラグインを作成しました。

https://github.com/kamykn/popup-menu.nvim

## 利用イメージ
見た目はこんな感じです。
top.png【GO】logrusでわかりやすいログを

## ログ基盤
ログについてメモしていきます。

## ログ設計基本事項
主に下記を参考にしています。
下記記事をみておけば、かなり理解が進みます!
[ログ設計指針 – Qiita](https://qiita.com/nanasess/items/350e59b29cceb2f122b3)
[開発者が運用を経験すべき一つの理由 | Developers.IO](https://dev.classmethod.jp/planning/recommend-operation-for-bigoted-developers/)
[PSR-3: Logger Interface – PHP-FIG](https://www.php-fig.org/psr/psr-3/)

### 気をつけること
#### DBの情報は記載しない
>ログには「氏名」「住所」など特定の個人を識別する情報や「電話番号」や「メールアドレス」「SNSのアカウント情報」などインターネットにおいて個人と連絡を

#### FATALとERRORの違い
>FATAL – アプリケーションを異常終了させるような非常に深刻なイ

初心者レベルでも気づく、JavaとGoのswitch文の記述の違い

# 基本的な`switch`文の記法

“`java:Java
switch rank {
case 1:
System.out.println(“金メダル!”);
break;
case 2:
System.out.println(“銀メダル!”);
break;
case 3:
System.out.println(“銅メダル!”);
break;
default:
System.out.println(“メダルを獲得できませんでした”);
break;
}
“`

“`go:Go
switch rank {
case 1:
println(“金メダル!”)
case 2:
println(“銀メダル!”)
case 3:
println(“銅メダル!”)
default:
println(“メダルを獲得できませんでした”)
}
“`

Javaの`switch`文の場合、暗黙的にfall-throughであ

[Golang] gorilla/muxのCORS対処法

golangでサーバーを立てるときに、ルーターとして、gorilla/muxを使っている方もいると思います。gorilla/muxでCORSの問題を解決するとき、ハマってしまったので、まとめておきます。

[このサイト](https://asanchez.dev/blog/cors-golang-options/)を参考にして以下のようなミドルウェアを挿入してみましたが、No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
エラーが出てしまいます。

“`router.go
package router

import (
“fmt”
“log”
“net/http”
“github.com/gorilla/mux”
)

// CORSのためのミドルウェア
func forCORS(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Re

obsのストリーミングをとりあえず動作確認

nginxじゃなくてGoのプログラムに向かってobsでストリーミングをしたかったので,Goのrtmpサーバーを探しました。

https://github.com/netroby/go-rtmp-server

かなりわかりやすく動作確認することができました!

# 動機
iOSアプリからRTMPでデータをストリームしたかったので,ちゃんと動くRTMPサーバーを手に入れてわかりやすく動作を確認しようと思ったのがきっかけでした。

# OBSを入れる
https://obsproject.com/ja/download
僕はMacでやっているので,MacにOBSを入れます。

# GoのRTMPサーバーを導入する
“`
go get -u -v github.com/netroby/go-rtmp-server
“`
これでサーバーを導入します。
`go get`がちゃんと動作してくれないときは,Go自体の環境をつくればいいと思います。

# サーバーを起動する
“`
~/go/bin/go-rtmp-server -l :8089 -k longSecurityKey
“`

【Go言語】FirebaseAuthのユーザーを全て削除する

# 概要

FirebaseAuthを検証で使ってたら `example1@example.org` みたいなユーザーが大量に増えてしまったので一括で削除を行いたいが、Firebaseのコンソールからは出来ないみたいだったので Firebase Admin SDK で一括削除を行うことにした。該当記事が見つけられなかったので自分用メモも兼ねて記事を書いた。

今回は Go 言語で削除処理を書いたが、下記の言語も対応している模様。

– Node.js
– Java
– Python
– C#

参考: [サーバーに Firebase Admin SDK を追加する](https://firebase.google.com/docs/admin/setup?hl=ja#next_steps)

# 前準備

1. `go get firebase.google.com/go` で Firebase Admin SDK を導入
2. Firebaseコンソールからサービスアカウントキーを取得する

サービス アカウント用の秘密鍵ファイルを生成するには:

“`
1. Firebase

Go言語 + GVM + GoModules + GoLandを利用する際の初期設定

# 概要

Go言語でパッケージ管理をGo Modules、IDEでJetBrains製のGoLandを利用する際の初期設定についての自分用メモ。1年前(2019年春)から始めた構成なのでもしかしたらもう古いかもしれない。

gvmはすでにインストール済みとする。

# GoModuleの有効化

Goバージョンは1.12以上ならなんでも良い(はず)。

1. `gvm use go1.12` で Go 言語のバージョンを指定
2. `export GO111MODULE=on ` で Go Modules 有効化 (.zshrcとかに書いとくと良い)
3. `git init` で git 管理対象にすることで、`go mod` にモジュール名を認識させる
4. `go mod init` で Go Modules の初期化

# GoLandの設定

1. GoLand 2018.3.4 以上をインストール
2. Preferences を開いて、Go > Go Modules(vgo) を有効化する。(下記画像の通り)
3. [vgo integration support |