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

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

Goで設定ファイルを扱う

# はじめに
本記事は、Goでアプリケーションで使用する設定値を外部ファイルから取得する方法についてのメモです。

## 設定ファイルのフォーマット
設定ファイルを定義するフォーマットとして、メジャーなものは以下のとおりです。

|フォーマット|特徴|
|:–|:–|
|ini|Windowsで主に使用。明確な仕様がないため実装に差異がある。|
|json|対応言語が多い。拡張性もあるが、コメントが書けない。[RFC4627](https://www.ietf.org/rfc/rfc4627.txt)に仕様が明記|
|yaml|JSON相当の汎用性があり、コメントが書ける。若干の学習が必要。|
|toml|新しいフォーマットでライブラリによる品質に差異がある。|
参考: [みんなのGo言語 改訂2版 ISBN978-4-297-10727-7](https://gihyo.jp/book/2019/978-4-297-10727-7)

どのフォーマットを使うかは好きなもので良いですが、オススメできそうなのはjsonかyamlです。

今回は、[以前の記事](https://qii

元記事を表示

【Go】log.Fatalは気軽に使わない

Goのエラーハンドリングでよく見る形のこんなコードを書いていました

“`go
if err != nil {
log.Fatal(err)
return err
}
“`

コレで試してみるとエラーのときに強制的にプログラム終了。。。

# 何が起こっていたか

`log.Fatal` の挙動を調べてみたらすぐに分かりました。

“`go
// Fatal is equivalent to Print() followed by a call to os.Exit(1).
func Fatal(v …interface{}) {
std.Output(2, fmt.Sprint(v…))
os.Exit(1)
}
“`

`os.Exit(1)` でプログラムが終了してしまうみたい。。。

# ついでにログレベルを調べてみた

| ログレベル | 説明 | 例 |
|:——-|:——|:—–|
| emergency |システムが使用不可能な状態||
| fatal |致命的なエラー|プログラムの異常終了を伴うよ

元記事を表示

Go-twitter で相互フォローを実装する

[Go-twitter で GET friendships/lookup](https://qiita.com/manymanyuni/items/8599c8397054a141fcc3) で作成した lookup API を利用して、go-twitter で相互フォローを実装してみます。

“`go:twitterut.go
package twitterut

import (
“bytes”
“context”
“fmt”
“net/http”
“strings”

“cloud.google.com/go/logging”
“github.com/dghubble/go-twitter/twitter”
“github.com/dghubble/oauth1”
“github.com/dghubble/sling”
)

type Client struct {
HTTPClient *http.Client
*twitter.Client
}

func NewClient() *Client {
config := oauth1.NewConfi

元記事を表示

gRPC: prototoolからbufへの道 ~ vol. 1 ~

# gRPC: prototoolからbufへの道 ~ vol. 1 ~

## Bufとは
Protobufが技術的なメリットの良い選択になるだけでなく、非常に使いやすく決定が簡単になることです

## 機能
– 自動ファイル検出
– prototoolとは違い、任意に指定も可能
– 正確なlintとbreaking checkersの構成が選択可能になる
– lint: 40 breaking checkers: 50
– エラー出力はどのエディターでも簡単に解析可能
– コンパイルの高速化
– protoc: 4.3sに対して 4コアでbuf: 0.8s
– protocのプロトコルプラグインとして使用

## Buf CLIツール

### サポートされている機能
– 優れたAPI設計の選択と構造を強制するリンター
– ソースコードまたはワイヤレベルでの互換性を強制する重大な変更検出器
– FileDescriptorSetsの拡張機能であるイメージを生成する構成可能なファイルビルダー

### インストール方法

“`
brew tap bufbuild/bu

元記事を表示

Go言語でWebAssemblyを使う際の型変換

ちょっとつまづいたので、忘れないようにメモ代わりに書いておきます。
実行環境
OS:Windows 10 64bit
言語環境:go version go1.14.1
ブラウザ:Firefox バージョン: 74.0

“`:index.html
該当部分だけ表示

結果

“`

“`:エラーになります
func act(this js.Value, i []js.Value) interface{} {

value1 := i[0]
value2 := i[0].String()
value3 := i[0].Int()
fmt.Println(reflect.TypeOf(value1)) //=> js.value
fmt.Println(reflect.TypeOf(value2)) /

元記事を表示

[Go] Realizeで実行ファイルを指定する

## Realizeとは
realizeが分からない人はぜひこちらのページをみてください
https://qiita.com/enta0701/items/9f60ad18600acab8c93d

## Ralizeでのディレクトリ指定
go言語にはディレクトリ構成のスタンダードがあり、実行ファイルはcmd配下、他のファイルはinternalなどの配下に保存するようです。
参考:https://qiita.com/sueken/items/87093e5941bfbc09bea8

しかし、プロジェクトルートでrealizeを起動したところ、以下のエラーが出てしまいました

“`console
$ realize start
[01:09:22][GO_BASE_REST] : Watching 7 file/s 15 folder/s
[01:09:22][GO_BASE_REST] : Install started
[01:09:23][GO_BASE_REST] : Install
build .: cannot find module for path .
“`

元記事を表示

Go言語によるWebアプリケーション開発 チャットアプリのその後

# 本記事について
[Go言語によるWebアプリケーション開発](https://www.oreilly.co.jp/books/9784873117522/)のチャットアプリでちょっと遊んでみます
チャットアプリを外部公開する方法と、なりすましについての説明があります。
後者は手元のサーバ以外に実施すると、法に触れる可能性があります。**悪用厳禁です**

## 外部公開
`ngrok`を使用し、指定したポートを外部に公開することができます。
(画像にある通り、セッションは8時間で途切れてしまうみたいなので。実用的ではないですね)

“`
$ ngrok http 8080
“`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542535/696c807d-f354-5a55-f740-39016b4de18f.png)
実行すると、URLなどの情報がでてきます。後でhttpの方を使用します。

本の手順でgoogle developer consoleを設定したら、
認証情報の*

元記事を表示

Go-twitter で GET friendships/lookup

[go-twitter](https://github.com/dghubble/go-twitter) で GET friendships/lookup.json を呼び出す際のサンプルです。
go-twitter は現在 GET friendships/show をサポートしていますが GET friendships/lookup はサポートされていないようです。

show だと
Requests / 15-min window (user auth) 180
Requests / 15-min window (app auth) 15
つまり最大 180 ユーザ

lookup だと
Requests / 15-min window (user auth) 15
up to 100 are allowed in a single request.
つまり最大 15*100=1500 ユーザ

と一回の API コールで取得できるユーザ数が全然違うため、なるべくなら lookup を使いたいため頑張って実装してみました。

“`go:twitterut.go
package t

元記事を表示

なぜサーバAPIプログラムはJavaではなくGoなのか?

# 背景

最近、プロジェクトのアプリケーション開発で選択する言語で迷う事が多い。
今一度なぜGoでアプリケーションを書くべきなのかをアーキテクトな視点でまとめてみる。
特に、既存あるいは新規プロジェクトで、サーバアプリケーションをjavaで開発すべきかGoで開発すべきか、という議論から始まる事が多い。
特にサーバサイドをコンテナ化していく、という際にAPI用プログラムにGoを選択する。
JavaではなくGoを選択する理由とは何なのか。

# なぜ、「ナウいGo使おうぜ」では満足しないのか

もちろん、新しい技術を採用し知見を溜めたい。
今後の潮流にのっかるために、目の前のプロジェクトをお試しとしてGoを選択する、という案もある。
一方で、既に技術者や知見が残っている、安全性の高い言語で目の前のプロジェクトを安全に終わらせたい、という人間も少なからずいる。
そういった人間を説得しなければならず、そういった人たちには「新しいこと」は害悪である。
彼らは分からないことが怖い。新しい技術だからこそ、採用を見送りたく思うのである。
だから、新しい言語を選択したときに考慮しなければならない点、デ

元記事を表示

OSSに参加にする敷居を下げるコマンドgossを作ったよ

#ご挨拶
こんにちは。
職業は盛り上げマスター(MM)です。
盛り上げマスターとは、最近新しくアジャイルな開発で導入され話題になっている役割で(嘘)
チーム内の居心地の良さを最大化することが仕事です。要はワイガヤ担当。

Goを最近勉強しています。Go歴は1ヶ月です。
間違っている箇所など優しくご指摘いただけると嬉しいです。

そしてGo初心者が作った物なので、このコマンドを実行して何か問題が発生しても自己責任でお願いします。

#作った物

https://github.com/kankanSunaga/goss

#何を作るか考えた
最近これ話題になってますよね。
https://github.com/tokyo-metropolitan-gov/covid19
東京都のコロナ対策アプリです。

私もプルリクを出しましたが、案の定マージはされませんでしたw
でもこういった取り組みに参加できて良かったなと思っています。

参加して思ったのが、もっとOSSの文化が根付ばいいな〜と思いました。
そこでできるだけOSSの参加の敷居を下げたいと思い、
コマンド一発で、fork,clone,

元記事を表示

【LIFF入門?】LIFFでLINE Offical Account(旧LINE@)上に予約フォームを作成する

# はじめに
## こんな感じの作ります
canova.PNGcanova.PNGcanova.PNG

## 使用技術
– LIFF (LINE Front-en

元記事を表示

GoでGET/POST

Go の勉強がてら http リクエストを行うプログラムを作成したので適当に貼っておきます。
検索して引っかかってきた人の一助になれば幸いです。

“`go:httput.go
package httput

import (
“context”
“fmt”
“io”
“io/ioutil”
“net/http”
“net/http/cookiejar”
“net/url”
“strings”
“time”

“golang.org/x/text/encoding”
“golang.org/x/text/transform”
)

const UserAgent = “My User Agent” // FIXME

type HTTPClient struct {
http.Client
CookieJar http.CookieJar
UserAgent string
}

func NewClient(ctx context.Context, timeout time.Duration) (*HTTPClient, error) {
cookieJ

元記事を表示

How to print struct variables data?

“`
package main

import “fmt”

type Employee struct {
Id int64
Name string
}

func main() {
emp := Employee{Id:1200, Name: “hoge fuge”}
fmt.Printf(“%+v\n”,emp) // Print with Variable Name
fmt.Printf(“%v\n”,emp) // Without Variable Name
fmt.Printf(“%d\n”,emp.Id)
fmt.Printf(“%s\n”,emp.Name)
}
“`

元記事を表示

Go言語でKibana(Elastic Cloud)へのプロキシを作成する

この記事では App Engine Standard Environment(2nd gen) を用いて Kibana へのプロキシを作成する方法について紹介しています。

Elastic Cloud の一番安いプランで一つデプロイを持っているのですが、今回そこで可視化しているダッシュボードを不特定多数に公開したくなりました。
そこで困ったのが、Elastic Cloud には Anonymous ユーザ機能がない・・・。
ダッシュボードにアクセスさせるにはユーザにログインしてもらう必要があり、しかしパスワードとかは勝手に変更されないようにしなければならないので、みなさんどうやってるのか調べた結果、

* nginx や Apache でリバースプロキシ
* Bearer basic ヘッダーで自動でログイン
* https://{ユーザ名}:{パスワード}@yoursubdomain.yourdomain/kibana では自動ログインできないので、ヘッダーで送る必要がある(ただ、ヘッダーの方がユーザパスワードを iframe の url に書かなくていいので安心できそう
*

元記事を表示

gRPC: そもそもRPC って何?

# gRPC: そもそもRPC って何?

今回gRPC を学ぶ上で`RPC`の説明をできるようにするためにRPCとはについてご説明します。

## 概要

リモートプロシージャコール(RPC)は、分散コンピューティングのサブルーチンです。

RPCのリモート実装はローカル呼び出しに似ていますが、通常は同じではありません。

RPCでは通常、オブジェクト名、関数名、またはパラメーターがリモートサーバーに渡され、 サーバーは処理された結果をクライアント側に返します(要求/応答)。

RPCは、TCP、UDP、またはHTTPプロトコルを介して通信できます。

## Go での実装

今回はGoで server / client を実装して体験します。
Goでは、[公式ドキュメント](https://golang.org/pkg/net/rpc/)にあるように
明示的なCodecの指定をしない限り、`gob`を使用してマーシャリングされます。

### サーバーの実装
“`
package main

import (
“fmt”
“log”
“net”
“net/rpc”

元記事を表示

Go言語でのインターフェースの遅さ

## TL;DR

Go 言語において:

1. 関数のパラメータに構造体を渡したい場合、実体コピーで渡すよりポインタを使用したほうが速い。
2. ポインタのダウンキャストはオーバーヘッドが存在する。
3. インターフェースを介したメソッド呼び出しはかなり高コスト。

これらはどれも C/C++ や Java で同様の思い当たることがあるだろう。3 に関しては少し影響が大きいように見受けられ、パフォーマンスを目的として Go 言語を採用したのであればオブジェクト指向や責務の分担といった設計と両立が難しいコストとなるかもしれない。

なお筆者は Go 言語やランタイムの構造にあまり詳しくない点に注意。

## 経緯

以下のようなコードでパラメータの型 `Image` が比較的大きな構造体のポインタとなるインターフェースの場合にパフォーマンスはどうなのかという話がまずあり。

“`go
func (n Entity) LessThan(other Image) bool {
return n.Value < other.(*Entity).Value } ``` Go 言語でのス

元記事を表示

[Golang] S3へファイルをアップロードするLambda関数をSAMで書く

# はじめに

この記事は、AWS SAMを用いてファイルをS3にアップロードするLambda関数を作成する記事です。

# やりたいこと

今回は、何かしらのファイル(本記事ではJSON)をS3にアップロードする処理を、AWS SAMを用いてCloutWatchイベントから定期的に発火させる、ということをやっていきます。
![スクリーンショット 2020-04-05 23.50.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264906/0831c4ce-9697-a768-098b-27c6b111db09.png)

# 開発環境

– macOS Catalina
– vim
– Golang (1.12.6)
– aws-sam-cli
– Minio

# SAMの設定

今回は[AWS SAM](

元記事を表示

goで作ったツールインストールするの面倒くさい

## goでツール作ろう

「まくる」と言うほどには作ってないけど。
ところで、go製のツールいっぱいあるけど、管理だるくない?

install は楽ちん。

“`
$ go get github.com/foo/bar
“`

で、一月ほど経った頃に、 `bar` がアップデートしたらしいことを知る。
さて、なんだっけなと思いながら

“`console
$ go get github.com/bar/bar
“`

あれ、通らねえやとなる。しょうがないので、調べてああそうだ、fooさんだったこれ、となる。
…ならまだしも、変なツールインストールしちゃったりしたら目も当てられない。

そしてさて、新しい環境作るかな、となるとこれをインストールしたツール分繰り返す。
だるい。

## homebrewっぽくしたい

作った。
https://github.com/kyoh86/gordon

“`console
$ gordon install foo/bar
$ which bar
/home/kyoh86/.local/bin/bar
$ gordon update
$

元記事を表示

PostgreSQLのNotifyを使ってGraphQL Subscriptionを実装する(バックエンド構築編)

# 前置き
**前提**

– prisma2インストール済み
– docker環境インストール済み
– 記事内のgqlgenはエイリアスに登録して使っています。
– gqlgenとprisma2のliftをある程度使っている人向け

**サンプル**
https://github.com/graphql-lab/subscription-with-postgres-notify

**こんな感じの作っていきます**
最終的にpythonのスクリプトを叩くと
異なる端末の画面がリアルタイムに更新されるというもの
これを応用すればスクレイピングした結果を定期的にwebサイトにつぶやかせる、というbotが
作れるかと
![subscription.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224153/764903ec-199e-224e-6ae3-b07de328deea.gif)

# 下準備
`gqlgen init`からビルドし、必要なディレクトリを作って…とやっても良いのですが
今回は

元記事を表示

S3バケット別概算コスト算出ツールを作ってみた

# はじめに

S3って安価なストレージなので、容量気にせずとりあえずなんでも格納して放置なんてことが多いですよね?
将来的に分析するかもってことでデータレイクに蓄積して結果使わないなんてことも多い。(my観測範囲)

で、新型コロナウィルスの影響で先行き不安な状況なので、収束まではどうにか支出を抑えて凌ぎたいという
人も多いと思い、要否判断(&不要であれば削除)しやすいように、S3バケットごとに使用量/概算コストを
一覧表示するツールを作ったので、紹介します。

# ツール概要

一言で言えば、
`全リージョン/全バケット別にオブジェクト数/使用バイト数/概算月額料金を出力するツール`
です。(誰かが作ってそうなんですが探してもなかったので作りました)

[CloudWatchからバケットサイズなど取得できる](https://dev.classmethod.jp/articles/s3-cloudwatch/)ようになってるので、それを実行すればawscliでも取得できる
のですが、リージョン指定しないといけないとか、メトリクス/ディメンションを指定するのがダルイので
そこらへんう

元記事を表示

OTHERカテゴリの最新記事