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

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

[LINE Bot] LIFFとリッチメニューでも管理画面が作りたい! 2 -リッチメニュー切替-

この記事はこの記事の続きです
[[LINE Bot] LIFFとリッチメニューでも管理画面が作りたい! 1 -グループ管理-]()

# リッチメニューを作る
さて、前回はグループへの招待・退会で管理メンバーの追加・削除をできるようにしました。
その際にリッチメニューをユーザ用と管理者用に切り替えます。
今回はそのリッチメニューを作ります。

今回はユーザー用を 3 x 1 (1200 x 405)
管理者用を 3 x 2 (1200 x 810) のメニューを作ります。
動作確認のため、上の段はユーザと同じものにします

## Line Messaging APIでリッチメニューを作る
Line Account Managerで作成したリッチメニューは残念ながらAPIでは使えません。
画像を準備し、APIで作成する必要があります。
画像はpngかjpgで1MB以内です。

pythonで適当に書いたので、ライブラリをインストールします。

“`bash
pip install line-bot-sdk
pip install pyyaml
pip install boto3

元記事を表示

echo APIがGoのオリジナルエラーをハンドリングしてくれたよ

# 初めに
> Qiita…初カキコ…ども…
> 俺みたいな中3でログ見てる腐れ野郎、他に、いますかっていねーか、はは
> it’a true wolrd.狂ってる?それ、400ね。

と言う訳で,駆け出しエンジニアのすなるQiita記事というものを書いてみたいと思います!
(お手柔らかにお願いします……)

# 動機
エラーのハンドリングを全体でカスタマイズする動機は,大きく分けて以下の2つがあると思われます.
1. Webページで,独自のエラーページに誘導したい
2. APIで,独自エラーをハンドリングしたい

恐らく2.に関してはアドホックにその場で対応すれば十分な場合が多く,あまり恩恵は得られないかもしれません.
どちらかというと,大規模なWebページを作る際に独自のエラーページを使用する事が多く,
また独自エラーハンドリングの書き方で調べて出て来るのが[^1]でしたので,
1の需要が大きい様に思われます.

しかし,**「APIが大規模化した場合」**且つ**「独自エラーをハンドリングしたい場合」**は重要性が高まると期待されます.
他の方の記事でも近いものがありま

元記事を表示

AWS X-Ray+Goを使ってSQSでのメッセージングを観測する

## 概要
タイトルの遠り、AWS X-Rayを使って、SQSでのメッセージングを観測します。X-Rayを使えば、複数のアプリケーション間で「どこからどこにメッセージが送られているか」が図示されるため、アプリ間通信の仕様や障害発生箇所の把握がしやすくなります。今回は、Go言語を使って実装します。

結論(ソース)はページ下部にあります。

## 環境

– Go言語 1.14.3
– aws-sdk-go
– aws-xray-sdk-go
– Mac OS X 10.15.4

前提として、aws-sdk-go, aws-xray-sdk-goは`go get`コマンドでインストール済みとします。

## この記事の対象読者
– AWSの有名どころサービスなら開発したことがある。AWS CLIも設定済み。
– SQSは知識があるがX-Rayはあまり知らない。X-Rayの概要や実装方法を知りたい
– (実装部分については)Go言語はそれなりに読める

## X-Rayの概要
アプリから情報を収集して、以下のような__サービスグラフ__を作成したり、リクエストの実行時間を計

元記事を表示

Go言語 + QtでGUIアプリ開発する時の環境構築

# 概要
Go + QtでGUIアプリ開発する環境を整えてみたのでメモを残しておきます。環境構築してサンプルを動かしただけで、開発はまだ全然進んでません。

# Qtとは?
マルチプラットフォームなアプリケーション開発フレームワークです。GUI開発で有名だそうです。
Wikipediaによると登場したのは1992年となかなか歴史が長く、最新版の5.15が出たのが2020年5月26日(記事執筆日の25日前)と現在も活発に開発が進められている、いい感じのフレームワークです。

本来はC++で開発するようなのですが、他の言語でも使えるように多くのバインディングが提供されています。それでGoにも対応しているというわけです。

# なぜGo?
macOSとWindowsの両方で動作し、なおかつランタイム不要なGUIアプリを作りたいと考えていたのですが、「マルチプラットフォーム」で「ランタイム不要」となるとGoだろうという先入観があり、調べてみたらQtとの組み合わせでいけそうだったので使ってみることにしました。
最近流行っているのはElectronでしょうし、Electronでも要件は満たせるわけ

元記事を表示

Golang – 本番環境に向けたDockerfileの書き方

# Dockerfile

本番環境で動くGoアプリのためのミニマルdockerfileを記す。

“`dockerfile:dockerfile
FROM golang:1.14.4 as builder

WORKDIR /go/src

COPY go.mod go.sum ./
RUN go mod download

COPY ./main.go ./

ARG CGO_ENABLED=0
ARG GOOS=linux
ARG GOARCH=amd64
RUN go build \
-o /go/bin/main \
-ldflags ‘-s -w’

FROM scratch as runner

COPY –from=builder /go/bin/main /app/main

ENTRYPOINT [“/app/main”]
“`

## 補足

“`dockerfile:レイヤー1
FROM golang:1.14.4 as builder
“`
ベースイメージには、golangのバージョン 1.14.4 を使いbuilderと名付けた。
後で[マ

元記事を表示

[Go,Rust,React] AWS APIGatewayでもCORSがしたい

# CORS = ブラウザからAPI叩く時にいつも引っかかるやーつ
WebページとAPIがポート番号も含めて同じであれば何も問題ないですが、
そうでない場合はクロスオリジンドメイン関連の設定しないとブラウザがエラーを表示します。
なお、APIのアクセス自体は飛んでいることもあります。

### 開発環境
– Rust 1.4.3
– Go 1.12
– React 16.13
– Serverless Framework

細かい設定や構成はこっち -> [[AWSLambda x LINEBot] GoとRustでも連携がしたい](https://qiita.com/alivelime/items/274966b10df905920d89)

# 結局、何が必要なのか
### ブラウザ側
CORSオプションをつける必要があります。
意外とこれを忘れていたりしてハマったりします。

“`typescript
fetch(
`${process.env.REACT_APP_API_HOST}/${env}/api/hoge/fuga`,
{
metho

元記事を表示

Goでよく見るコードやイディオムを書いとく

# 複数の変数を定義する場合

“`go
//varで変数定義をまとめる書き方(こっちを使おう!)
var (
n = 1
s = “string”
b = true
)

//暗黙的な定義を並べる書き方
n := 1
s := “string”
b := true

“`

この場合は前者の方が、変数定義のブロックを目立たせる事が出来るため前者の方が良い。(普段は暗黙的な定義を積極的に使って、Goの型推論というメリットを享受した方が良いけど)

# 関数とエラー処理について

“`go
//varで変数定義をまとめる書き方
result, err := doSomething()
if (err != nil) {
//エラー処理
}
“`

Goには例外機構がないため、その処理が成功したかどうかを何らかの形で返してあげる必要がある。
Goの関数が複数の戻り値を返す事ができるというメリットを活用して、errを追加してあげるのが良い。
上記の書き方は死ぬほど頻出するので、Goのイディオムとして覚えておく。

ここでerrという名前にしているのも、一

元記事を表示

『Golang』 closureは何?

#目次
ー挨拶
ーclosureは
ーclosureの例え
ーなぜClosureを使う?
ーまとめ
#挨拶
こんにちは。
2020年から日本で働いているキムと申します。
今回初めてqiitaに投稿しようと思います。
まだ苦手な日本語ですか宜しくお願い致します。

#closureは
Closureは関数の外側にある変数を参照する事を言います。
この時の関数は外側に存在している変数をまるで関数の中に引き込んだように、その変数を読み込んだんり書き込んだりすることができます。

#closureの例え
“`
package main

import “fmt”

func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}

func main() {
pos := adder()
for i := 0; i < 10; i++ { fmt.Println("posの値>", pos(i))

元記事を表示

[LINE Bot] LIFFとリッチメニューでも管理画面が作りたい! 1 -グループ管理-

# bot用の管理機能を作るのは面倒だからLIFFでしたい!
LINEBotで色々開発をしていると、当然管理者用のAPIが生えて来たり、管理者用のリッチメニューが欲しくなったりしますよね。
今までの開発方法だと、管理者用のシステムを一つ作って、そこにソーシャルログインを連携させて、メンバー管理画面を作って、、、と平気でひと月やふた月飛んでいきます。
そこで、今回は、
1. 管理画面はLIFFで作る
2. 管理者用のLINEグループを一つ作る
3. そこにメンバーを招待したら管理者にする (DBにユーザIDを追加)
4. そこからメンバーを退出させたら管理者から除外する (DBからユーザIDを削除)
5. ついでにリッチメニューもユーザー用と管理者用で切り替える
6. LIFFでアクセストークンを取得してサーバ側で認証する (アクセストークンからユーザIDを取得し、DBにあるかチェックする)

||よくあるパターン|新しいやつ|
|—|—|—|
|管理仮面|PCorスマホ用管理画面|LIFF|
|アクセス方法|URLを教える|リッチメニューからアクセス|
|ログイン方法|ソー

元記事を表示

main.go

package main

import “fmt”

func main() {
totalScore := 0
// 引数にtotalScoreのポインタを渡してください
ask(1, “dog”,&totalScore)
ask(2, “cat”,&totalScore)
ask(3, “fish”,&totalScore)

fmt.Println(“スコア”, totalScore)
}

// 渡されるtotalScoreのポインタを受け取るように変更してください
func ask(number int, question string, scorePtr *int) {
var input string
fmt.Printf(“[質問%d] 次の単語を入力してください: %s\n”, number, question)
fmt.Scan(&input)

if question == input {
fmt.Println(“正解!”)
// ポインタを使って加算してください
*scorePtr += 10

} else {
f

元記事を表示

Goのjsonのomitemptyや-(ハイフン)の挙動

Goの`omitempty`オプションや`-`タグの挙動がいまいちわからなかったので確認してみました。

“`golang
type Hoge struct {
Foo string `json:”foo,omitempty”`
Bar string `json:”-“`
}
“`

## 結論

結論としては次のような挙動になるようでした。ドキュメントにも書かれてますが。。。

* `omitempty`オプションは、フィールドの値が空の値(false, 0, nil、 空配列、空マップ、空文字など)の場合、エンコーディング時にフィールドを省略する
* `”-“`タグは、エンコーディング、デコーディング時に常にフィールドを省略する

## 検証結果

### ドキュメント確認

まずは、[公式ドキュメント](https://golang.org/pkg/encoding/json/)を読むとそれぞれ次のように記載されています。

> The “omitempty” option specifies that the field should be omitted fr

元記事を表示

main.go

package main

import “fmt”

func main() {
ask()
// もう一度ask関数を呼び出してください
ask()
}

func ask() {
var input string
fmt.Println(“次の単語を入力してください: dog”)
fmt.Scan(&input)
fmt.Printf(“%sと入力されました\n”, input)
}

main 関数 ask()2回呼び出す

元記事を表示

main.go

package main

import “fmt”

func main() {
// 変数inputを定義してください
var input string

// 「次の単語を入力してください: dog」と出力してください
fmt.Println(“次の単語を入力してください:dog”)

// Scanで入力を受け取ってください
fmt.Scan(&input)

// 受け取った値を出力してください
fmt.Printf(“%sと入力されました”,input)
}

元記事を表示

main.go

package main

import “fmt”
// 「math/rand」パッケージと「time」パッケージをインポートしてください
import “math/rand”
import “time”

func main() {
// 指定されたコードを貼り付けてください
rand.Seed(time.Now().Unix())

// for文を作成してください
for i:=1; i<=3; i++{ fmt.Printf("%d回目のおみくじ結果:",i) number := rand.Intn(6) switch number { case 0: fmt.Println("凶です") case 1, 2: fmt.Println("吉です") case 3, 4: fmt.Println("中吉です")

元記事を表示

Go Moduleの更新を公式ミラーに素早く反映させる

# はじめに
Go Moduleの作成方法については、既に多くの記事が書かれているので取り上げないことにしました。
ここではモジュールの更新をミラー(レジストリ)に反映させる方法について述べます。

https://pkg.go.dev/ で検索可能なGoのモジュールは公式のミラー兼プロキシサイトである https://proxy.golang.org/ 経由で取得されています。
自作のモジュールを更新したときなど、すぐに反映されない場合は、このミラー経由でモジュールを取得するリクエストを送ればいいようです。

# やり方

以下の2通りのやり方があります:

1. HTTPでGETリクエストを送る
例: `GET https://proxy.golang.org/example.com/my/module/@v/v1.0.0.info`
2. `GOPROXY=https://proxy.golang.org/` を指定して、module-aware[^1]な `go get` を行う
例: `GOPROXY=”https://proxy.golang.org” GO111M

元記事を表示

golangのgenericsでB+ Treeを書いてみた

2020/06/19時点での情報です。

# golangのgenerics

先日、golangのgenericsに進展が有りました。

https://blog.golang.org/generics-next-step

### contractは無くなりinterfaceでconstraintを指定するように変更

https://tenntenn.dev/ja/posts/contract-interface/
こちらのブログによると以前からcontractを無くすという話はあったようですね。

### [go2向けgo playground](https://go2goplay.golang.org) でgenericsが試せるように

お手軽なので、試しに書きたいという方におすすめ

### go2をgo1にコンパイルするツール

goのgitレポジトリのdev.go2goブランチからビルドしたgoバイナリを使用するとgo2をgo1にコンパイルできます。
そのまま実行することも可能です。

“` bash
# 実行
go tool go2go run x.go2

元記事を表示

まっさらなSSDにmint20betaをインストール

まず、editorなににしようかな?
この時間って、かなり至福な時間。

emacsとか、むかしのSSDもあるので、そこから.emacsを引っ張ってくれば
すぐに設定は終わると思いきや。。

まず、ちょうひさしぶりのosインストールから、さらにはeditor
時代が変わりすぎていた。

aptでとか思ったら、いまはsnapd? , flatpak?
なんじゃそれ?
なにげジェネレーションギャップを感じた

また、mintだけsnapdは、拒否られているさまw
あとからしらべてやっとわかったのだが、自分もsnapdのような文化はいやかもw
mintが拒否るのもしかたないというか、良い方向かもw

aptでなく、今回はgimpとemacsは、flatpakでいれてみた。

また、ここでジェネレーションギャップが。。
/usr/local/binあたりにemacsがあるのかな?と思ったら、
ちがうじゃんw

しかたないから、デスクトップにemacsをピンとめして、
そのファイルを見て、どこから起動してるかしらべるところからw

また、ここで、びっくりw
/usr/bin/flatpak そ

元記事を表示

Go言語でHelloWorldを実行しようとしたらエラーになった

# Hello world が出来なかった話
業務でGolangを使用する機会がありました。
本格的には触らなかったので、とりあえず自習しようとしました。

– とりあえず`hello.go`を作ってhello worldを表示しようとします。

“`sh
$ go run hello.go
exec: “C:\\Users\\xxxxx\\AppData\\Local\\Temp\\go-build929698758\\b001\\exe\\hello”: file does not exist
“`

ああ??なんだこれ?hello World で死ぬか?普通?ってなったわけです。

# 失敗した原因
とりあえず build だけやってみる

“`shell
xxxxx@xxx MSYS /c/Users/xxxxx/Documents/test/go
$ go build hello.go

xxxxx@xxx MSYS /c/Users/xxxxx/Documents/test/go
$ ls
hello hello.go
“`
– バイナリ?が windows のじ

元記事を表示

go修行8日目 Panicとか

## エラーハンドリング

“`golang

package main

import (
“fmt”
“log”
“os”
)

func main() {
file, err := os.Open(“./tt.go”)
if err != nil {
log.Fatalln(“Error”)
}
defer file.Close()
data := make([]byte, 100)
// errは上書きでinicializeしている
count, err := file.Read(data)
if err != nil {
log.Fatalln(“Error”)
}
fmt.Println(count, string(data))
}
“`

“`
2020/06/19 08:37:42 Error
“`

## パニック

– 例外エラーの中の例外
– 何をしたらいいかわからない状態なのでなるべくエラーハンドリングするとよい

“`golang

package main

import “fmt”

// DB接続パッケージ

元記事を表示

Vue.jsからaxiosでGoにパラメータ渡せなくてつまり続けたが、Echo導入したら即解決した

Vueで入力された値をJson形式でGoに渡して処理をさせたかった。
うまい感じに渡せず、詰まったがEcho導入したら即解決した。

## やりたいこと
– VueからPost(非同期)でパラメータを渡して、Goで処理をさせたい。
– とりあえず、Axiosで送信したparamsがGoで受け取れていることを確認したい。

## VueとAxios
あるボタン押下時にtestを実行して、data1とdata2をjson形式でpostする。
Goの処理結果をconsoleに表示する。

**axiosはpost時、以下のように渡せば自動的にjson形式にしてくれるらしい。**

“`ruby:vue.js(一部抜粋)