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

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

[ネタ]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初心者レベルでも気づく、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 |

元記事を表示

Goでスプレッドシート情報を取得する

# 背景

こんにちは、@harhogefooです。

Google Apps Scriptを使ってスプレッドシートの情報を取得して何かやりたいことはあると思います。
ただ、GASを使うと並行処理が書けません。
なので、複数のスプレッドシートを参照して何かしたい場合、実行時処理時間がかかってしまいます。

そこで、今回はGolangのgroutineを使って、スプレッドシート情報を並行に取得する方法をまとめました。

## サービスアカウントを利用してスプレッドシート情報にアクセスする
前提知識を得ておくために公式ドキュメントのQuickstartを読んでおくことがおすすめです。
https://developers.google.com/sheets/api/quickstart/go
上記リンクに書いてある内容をまとめると

– Google APIsのSpreadsheet APIを有効化し、OAuthクライアントIDを発行
– このIDを利用してプログラムからスプレッドシートにアクセス
– プログラム実行時にブラウザが立ち上がりGoogleアカウントログインを求められ、ログイン

元記事を表示

SQSメッセージ受信時に送信時刻を含めて取得する

SQSからメッセージ受信時に送信時刻も含めて取得するサンプルです

### デフォルト(送信時刻は含まれない)

“`golang:main.go
package main

import (
“fmt”

“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/sqs”

“os”
)

func main() {
session := session.Must(session.NewSession(&aws.Config{Region: aws.String(“ap-northeast-1”)}))
sqsSvc := sqs.New(session)
queueURL := aws.String(os.Getenv(“SQS_URL”))
params := &sqs.ReceiveMessageInput{
QueueUrl: queueURL,
MaxNumberOfMe

元記事を表示

Go でリフレクションを使って struct をバリデーションする

Go 言語で、テストに必要な Variables がちゃんとセットされているか確認したいという要望があった。その Variables もいろんなところに分散していたら面倒なので、一か所で書きたかった。つまりこんなイメージ。

“`go
type Foo struct {
Bar string `env:”TF_VAR_hello”`
Baz string `env:”TF_VAR_world”`
}
“`
こんな感じで構造体を書いておくと、自動で、`TF_VAR_hello` と `TF_VAR_world` の環境変数を読み込んで、それをそれぞれのフィールドにセットしてほしい、そしてすべてのフィールドがちゃんとなんかしらの値がセットされていてほしい。

このような要件の時はリフレクションだけど、Goではやったことなかったので調べて試してみた。

# フィールドの読み込み

定義されたすべてのフィールドの読み込みは次のコードで可能になる。ちなみに、`s` は、ポインターでも実体でも良い。

“`go
func validate(s interface{}) {
val :=

元記事を表示

【Golang】Modules環境で相対パスimport (Go:1.13)

ちょっとハマったので自分用メモ。
Go Modules環境でローカルに配置した共有packageと、子packageを使う場合の指定の仕方。

# TL;DR
別moduleならgo.modに`replace`で相対パスを記載する。
同一moduleなら`import 自module名/ディレクトリ名`で指定する。

# フォルダ構成
“`
project_root
├── module_a
│ ├── go.mod
│ └── main.go … ここで common_module/common を使いたい

├── module_b
│ ├── go.mod
│ ├── main.go … ここで common_module/common と sub_package を使いたい
│ └── sub_package
│ └── sub.go

└── common_module
├── go.mod
└── common.go
“`

# ソースコード

元記事を表示

Goが他の言語と違ったところ

# まえがき
風邪をひいて会社を休んだので、この機会に前から気になっていたGoを勉強しようと思い、以下のサイトで勉強を始めた。
https://golang.org/doc/

学んでいくうちに、これは他の言語にはなかった機能だなと思ったものを書いていく。
「他の言語にはなかった機能」とは、私にとって初めて目にする機能である。以下のプログラミング言語はだいたい分かるはずなので、これらの言語には無い機能なはず。
`Pascal, C, Java, Perl, Python, TypeScript`
他の言語には同じような機能があるのかもしれないが、容赦して欲しい。

# スライスのcapacity
配列は、C言語と同じく固定長である。以下では、長さ6のint配列を定義をする。

“`go
arrayedPrimes := [6]int{2, 3, 5, 7, 11, 13}
“`

配列は固定長で使い勝手が悪いので、以下のようにスライスが多用される。

“`go
slicedPrimes := []int{2, 3, 5, 7, 11, 13}
“`

スライスにはlengthと

元記事を表示

error messageにコロンをつけたらlintに怒られた

Goを書いている時に怒られて何のことかわからなかったので、調べた覚書です。

# 起こったこと
“`
errors.New(“Not found.”)
“`
サンプルの記述ですが、上記の記述だと、下記のメッセージが出て記述を直すように言われます。

“`
error strings should not be capitalized or end with punctuation or a newline
“`
エラーの文字列は大文字にしたり、句点、改行で終わらせたらいけないらしいです。
なぜ、そんな事になっているのか気になったので、公式のwikiで調べました。

> Error strings should not be capitalized (unless beginning with proper nouns or acronyms) or end with punctuation, since they are usually printed following other context.

https://github.com/golang/go/wiki/Co

元記事を表示

fluentbitを使ってk8s上のGoアプリケーションのログやカスタムメトリクスを回収する

# この記事でやること

この記事では、fluentbitを用いてk8s上のアプリケーションのログを回収してElasticSearchに送る方法をまとめます。またログの中にカスタムメトリクスを出力して、それをKibanaで可視化も行います。

具体的にはGoアプリに以下のようなログを吐き出させるようにして

“`json
{“count”:0,”file”:”main.go:16″,”func”:”main.main”,”level”:”info”,”msg”:”sample log”,”text_sample”:”fooooo”,”time”:”2020-03-02T18:22:24+09:00″}
“`

Kibanaでちゃんとメトリクスとして扱えるように送信します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129577/192d94d0-be0e-aa7e-718c-3e9dd3edd456.png)

# fluentbitとは

![https://www.tre

元記事を表示

ゴリラに喋らせるコマンドを作った

こんにちは、ゴリラです。

みなさん`cowsay`ってコマンド知っていますか?
牛を喋らせることができるコマンドですが、それのゴリラ版が欲しくて作ってみました

https://github.com/skanehira/gorillasay

![](https://camo.githubusercontent.com/99f06e7e79533e127ad59a9f3be6a9fa4fa795d5/68747470733a2f2f696d6775722e636f6d2f5a70776235756a2e706e67)

## 使い方
`gorillasay`に引数を渡すだけです。
スペースで改行されるので、改行したくない場合は`”`で囲ってあげてください。

## 使いみち
ぱっと思いつかないのですが、`CI`とかに組み込むと楽しいかなと思います。

元記事を表示

embeded使い方【golang】

# embeded
– golangで継承のようなことをしたいときに使うembeded
– イマイチ理解できなかったのでまとめました。
– Javaなどのオブジェクト指向言語の継承と同じ使い方をすると`スーパークラスとして初期化する際のエラー`や`オーバーライドできない`などの問題が発生する
– ※キャプチャと本記事のコードとで初期化時の値が異なることがありますが本質的なところは変わらないのでご了承ください。

# embededの例
– まずは構造体に何らかのメソッドを持たせる
– Employees(従業員)とBoss(上司)にしてみる

“`go:main.go
type Employees struct {
name string
}

func newEmployees(n string) *Employees {
e := new(Employees)
e.name = n
return e
}

func (e *Employees) Hello() string {
return “名前:” + e.name // >>
}

元記事を表示

golintのcliの実装を読んでみる

Goでのプログラミングに欠かせない静的解析ツールgolintのソースコードリーディングをしてみました

リポジトリ: https://github.com/golang/lint
(2020/3/1 時点)

# ディレクトリ構成
“`
.
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── go.mod
├── go.sum
├── golint
│   ├── golint.go
│   ├── import.go
│   └── importcomment.go
├── lint.go
├── lint_test.go
├── misc/
└── testdata/
“`

パッケージが、ルートディレクトリ直下の**lint**パッケージとgolint/以下の**main**パッケージの2つに分かれています

– lint.go
静的解析のロジックはここに書かれています

– golint/golint.go
cliツールの実装が書かれています

– golint/import.go
golint.goで使う補助関数が書かれてい

元記事を表示

データ分析基盤構築入門 サンプルアプリエラー

[データ分析基盤構築入門](https://amzn.to/2TaD1oC)のサンプルアプリケーションを、Dockerで立ち上げる際にエラーが出て、うまく立ち上がらなかったので、色々ソリューションを試しました。

その中で、2020/3/1現在のソリューションを書きます。

## エラー内容

“`shell
$ docker-compose up –build
“`

dockerでelasticsearch fluentd goアプリケーションを立ち上げると、fluentdコンテナの立ち上げでエラーが出ます。

## ソリューション
### 1.fluentdのtd-agent-gemのバージョンをあげる。

`blog-sample/Dockerfile-fluentd`の中身を以下のように変更します。

“`
FROM debian:jessie

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get -qq update && apt-get install –no-install-recommends -y curl c

元記事を表示

Kotlin vs Go 処理時間を比較してみる

#1. はじめ
最近はどこもかしこもGoばっかり!
SE(笑)で化石のようなJavaを扱った経験を持つ人間としてはKotlinの方がしっくりくるのですが、なんだか肩身が狭いです。

そこで今回はGoとKotlinで同じようなコードを書いてみて処理時間という点でどれだけ差があるか実験してみました。

#2. 内容
・Kotlinはコンパイラでjarにした後、Amazon Corretto8のランタイムで動かす
・Goは公式でリリースされてる最新のものを使用(Go 1.14)

##1回目
・10万の要素を持つ配列に乱数で値をひたすら入れてみる
・とりあえずこれだけ

“`main.kt
import kotlin.random.Random

fun main(args: Array) {

val startTime = System.currentTimeMillis()

var listData: Array = Array(100000){it}
for (i in listData) {
listData[i

元記事を表示

Open状態のファイルに対して、Linuxだとos.Renameに成功するが、Windowsだとエラーになる

# 環境情報

この記事は以下の環境で稼働確認を実施しました。

– Windows
– Microsoft Windows [Version 10.0.19041.84]
– go version go1.13.5 windows/amd64
– Linux
– Ubuntu 18.04 LTS (Bionic Beaver)
– go version go1.13.8 linux/amd64

# 事象

Open状態のファイルに対して、`os.Rename`を呼び出すと、LinuxとWindowsでは結果が異なります。具体的にはLinuxでは`os.Rename`に成功しますが、Windowsではエラーになります。

以下はOpen状態のファイルに対して、`os.Rename`を利用するコマンドです。

“`go:main.go
package main

import “os”

func main() {
fp, err := os.Open(“old.txt”)
if err != nil {
panic(err)
}
defe

元記事を表示

OTHERカテゴリの最新記事