- 1. FirebaseAuthの認証をつけたサーバサイドにPostmanからスタイリッシュにリクエストする方法
- 2. bytes.Buffer.ReadFromとかでpanicが出る場合があるよ
- 3. validator.v9(v10) で条件付き必須バリデーションする
- 4. パッケージシステムを意識した今時、Hello Worldを紹介してみたり
- 5. golang sql debug
- 6. Go言語で使用できる変数名、使用できない変数名
- 7. AlertmanagerのSilence作成をslackに通知する
- 8. GolangでのRootディレクトリ取得方法
- 9. Golang – How to Get Private Repository Module
- 10. Golangのコンストラクタとその利用方法についての考察
- 11. 「Go 1.4 “Internal” Packages」の挙動を確認してみる
- 12. Go言語*(ポインタ)を使う必要性の簡単な例
- 13. 日本語のオノマトペを3000個あつめてGAE/GoとFirebaseでサービスを作る
- 14. [Golang]strings.Join関数の中身を、初学者向けに解説してみた
- 15. Go言語のインストール方法(Mac)
- 16. 【Go】Qiita 週間ストック数ランキング【自動更新】
- 17. GKE上にwebアプリケーションを構築する方法
- 18. 【Go】AWS SSMパラメータストアの値を取得する
- 19. GCP – Google App Engine(GAE)入門
- 20. 【GitHub Actions】Go言語の自動テストからリリースまでを作ってみた
FirebaseAuthの認証をつけたサーバサイドにPostmanからスタイリッシュにリクエストする方法
Gakuです。
最近、サーバサイドはGolang(heroku)+FirebaseAuthで構成するようにしていて、jwtをheaderに付与して認証するようにしてます。(めちゃくちゃ手軽に認証機能作れるので、この構成おすすめです。そんなサーバサイドですが、動作確認を行うのにPostmanを使っていて、Postman上で認証させてリクエストする作業が面倒だったのでなんとかできないかと考えていました。
具体的には
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47132/3d34c7e6-6733-9165-6661-96a627f1b70e.png)
こんな感じのFirebaseAuthにログインするためだけの静的ページを作成して、ログインして出力されるaccess tokenを
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47132/eaa9b91c-3c74-6568-565c-
bytes.Buffer.ReadFromとかでpanicが出る場合があるよ
# まとめ
[bytes.Buffer.ReadFrom()](https://golang.org/pkg/bytes/#Buffer.ReadFrom)にダメなio.Readerを渡すとerrorを握りつぶした上で `slice bounds out of range` のpanic が発生する場合がある。
[こちらが端的な例](https://goplay.space/#QkiAe-0wilZ)。
# 起きたこと
aws-sdk-goを使用して暗号化されたS3オブジェクトを読み込むときに `slice bounds out of range` のpanicが稀に発生する状況があった(継続中)。
# 考察
[aws-sdkの暗号化されたS3オブジェクトを読むための io.Reader](https://github.com/aws/aws-sdk-go/blob/3dfcfc34e12ccbb66d72fb6ab6b87f61315d882d/service/s3/s3crypto/aes_gcm.go#L94) はたぶんよくない実装で、復号に失敗した場合に暗号文のほう
validator.v9(v10) で条件付き必須バリデーションする
# はじめに
Goのバリデーション用パッケージのvalidator.v9を使って、条件付き必須のバリデーションを実装したかったのですが、これまでrequired, min, maxくらいしか使っていなかったので、勉強しなおしました。
ちなみにvalidator.v10でも同じ模様です。[公式ドキュメント](https://godoc.org/gopkg.in/go-playground/validator.v9)に丁寧に書いてあるのですが、日本語でまとめられているものが無さそうなので書いておきます。
# validator.v9の使い方
この記事を読んでいる人であればおそらく説明の必要もないと思いますが、一応。
公式サンプルをチョットいじっています。“`go
package mainimport (
“fmt”“github.com/go-playground/validator/v9”
)type User struct {
Name string `validate:”required”`
Age u
パッケージシステムを意識した今時、Hello Worldを紹介してみたり
# Hello World!の次のステップHello Servants!
プログラミング学習を進める上の最初のステップ
「Hello World」
これは、今も昔も変わらずやりますよね?でも、モダンなプログラミングというのは
パッケージ、、、パッケージ
とにかくパッケージ
パッケージシステムを制する者は
モダンプログラミングを制すると言っても過言ではありません。ということで今回は、モダンプログラミング版「Hello World」ということで
「Hello Servants」という学習手法を提案したいと思います。# 流行りのGo言語
まずは、普通にHello World
“`go:main.go
package mainimport (
“fmt”
)func main() {
fmt.Println(“Hello World”)
}
“`“`
go run main.go
-> Hello World
“`それではパッケージシステム向け「Hello World」
「Hello Servants」をやってみます。
プロジェクトルートに「se
golang sql debug
“`
fmt.Printf(`SELECT * from ‘%v’` + strings.Replace(whereQuery, “?”, “‘%v'”, -1) + ` OFFSET %v`, param…)
“`
Go言語で使用できる変数名、使用できない変数名
Go言語では変数名に「nil」を使っても怒られない(コンパイルが通る)と知り、
じゃあ何が使えて、何が使えないのか気になったので確認しました。
(他にもあれば追記するかも知れません)##使用できる
###英数字で始まる
hoge, fuga, piyo2 など###\_ で始まる(ただし、 \_ 単体は不可)
\_hoge, \_fuga, \_piyo2 など
###定義済み識別子
| 識別子の種類 | 識別子 |
|:———–|:——————|
| 型 |bool, byte, complex64, complex128, error,
float32, float64, int, int8, int16, int32, int64,
rune, string, uint, uint8, uint16, uint32, uint64, uintptr
| 定数 | true, false, iota
| ゼロ値 | nil |
| 関数 | append, cap
AlertmanagerのSilence作成をslackに通知する
最近PrometheusのAlertmanagerを使う機会があったので、ちょっとしたツールを作ったのでメモ。
## 何が作りたかったか
AlertmanagerではSilenceを登録することで、発生したアラートの通知有無を制御することができる。
SilenceはActive, Pending, Expiredの3つのステータスを持っていて、指定時間が経過すると勝手にステータスが遷移する。
しかし、ステータス遷移は都度確認しないとわからないし、Expiredされて数時間経ったSilenceはGCにより削除されてしまうため、履歴も追えない。
これだとオペレーションを後追いできず、若干不便なので、Silenceのステータス変更をslackに通知するツールを作りたい。## 実行
内容はシンプルで、Alertmanager APIで定期的にSilenceを取得し、前回取得時との差分をSlackに通知しているだけ。https://github.com/m-masataka/alertmanager-silence-notifier/
APIでの取得先hostとかportとかを指定す
GolangでのRootディレクトリ取得方法
“`golang
package projectpathimport (
“path/filepath”
“runtime”
)var (
_, b, _, _ = runtime.Caller(0)
Root = filepath.Join(filepath.Dir(b), “../../../”)
)// —–
// projectpath.Root // root dir
“`GolangでRootディレクトリが簡単には取得できなかったのですが、上記方法で取得できます。
テスト実行時などでも機能します。
しかし、トリッキーですね?
Golang – How to Get Private Repository Module
# 410 Gone Problem
“`
$ go get -u gitlab.com/johnny/loggergo: finding gitlab.com/johnny/logger latest
go: downloading gitlab.com/johnny/logger v0.0.0-20190921175342-61a76c096369
verifying gitlab.com/johnny/logger@v0.0.0-20190921175342-61a76c096369
reading https://sum.golang.org/lookup/gitlab.com/johnny/logger@v0.0.0-20190921175342-61a76c096369: 410 Gone
“`# Solution
“`
$ go env -w GOPRIVATE=gitlab.com/johnny
“`https://medium.com/mabar/today-i-learned-fix-go-get-private-repository-
Golangのコンストラクタとその利用方法についての考察
#概要
golangにおけるモデル(struct)の初期化関数とその利用方法について考えたことの書き起こし。
ベストプラクティスではなく、あくまで個人的な考えなので「ウチではこうしてる」的な意見をいただけると助かります。#前提
この項目では当記事に用いる例の前提を書きます。ユーザーによる何かしらの投稿機能を想定してください。
投稿に用いるモデルはPostモデルでそれぞれ以下のプロパティを持ちます。“`golang:model
type Post struct {
Message string //=> テキストメッセージ。ユーザーによる任意の値。
Key1 bool //=> ユーザーに入力させる属性その1。システム投稿の際はtrue。
Key2 bool //=> ユーザーに入力させる属性その2。システム投稿の際はtrue。
Default1 bool //=> とあるデフォルト値その1。初期化時はtrue。
Default2 bool //=> とあるデフォルト値その1。初期化時はfalse。
}
“`また、システムに
「Go 1.4 “Internal” Packages」の挙動を確認してみる
## はじめに
Go の internal パッケージの仕様について実際にコードを動かして確認します。
[Go 1.4 “Internal” Packages](https://docs.google.com/document/d/1e8kOo3r51b2BWtTs_1uADIA5djfXhPT36s6eHVRIvaU/edit)
[Internal packages | Go 1.4 Release Notes](https://golang.org/doc/go1.4#internalpackages)## 要約
internal の一個上の階層のパスを見て、そのパスの下に配置されているパッケージからならアクセス可能です。たぶん。
**架空の例**
– github.com/xxxx/foo/internal/bar というパッケージがある
– internal の一個上は github.com/xxxx/foo
– github.com/xxxx/foo の下に属する全てのパッケージは github.com/xxxx/foo/internal/bar にアクセス可能
Go言語*(ポインタ)を使う必要性の簡単な例
##背景
– Go言語のプロジェクトでよく*(ポインタ)を見かける。
例1
“`golang
func setName(user *User,name string){
user.username = name
}
“`例2
“`golang
type (
Users []*User
)
“`– ではなぜそうなるでしょうか?
##結論
*(ポインタ)を使わないと構造体(struct)の値が編集できない ***###例1 *(ポインタ)を使わず、structを編集する
“`golang
type User struct {
username string
password string
}type (
Users []User
)func setName(user User,name string){
user.username = name
}func (user User) setName(name string){
user.username = name
}func main(){
changeTheValu
日本語のオノマトペを3000個あつめてGAE/GoとFirebaseでサービスを作る
[![logo_full_fill.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532297/fb144390-ea94-0370-423b-6c4cfb47b3f2.png)](https://matopee.com)
https://matopee.comFirebaseを管理画面側に、GAEを公開側に使って、日本語のオノマトペを集めて辞典などとして公開するサービスを作っています。まだまだ不足だらけですが、まずは3200件ちょっと集めた[オノマトペの五十音別全一覧](https://matopee.com/indexes/kana)を中心に公開しています。
[![“五十音全一覧のスクリーンショット。「あ」から「お」までのオノマトペの一部を抜粋している。”](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532297/152a0876-a217-3284-5a55-b5da602beba5.jpeg “オノマトペの五十音
[Golang]strings.Join関数の中身を、初学者向けに解説してみた
# はじめに
今日は、標準パッケージでもよく使われる関数、`strings.Join`関数について中身を見てみたいと思います。
# 公式のコード
まずは、コードを貼っておきます。
“`golang
// Join concatenates the elements of a to create a single string. The separator string
// sep is placed between elements in the resulting string.func Join(a []string, sep string) string { // => A
switch len(a) { // => B
case 0:
return “”
case 1:
return a[0]
}
n := len(sep) * (len(a) – 1) // => C
for i := 0; i < len(a); i++ { n += len(a[i]) } var
Go言語のインストール方法(Mac)
## はじめに
私の感覚ですが、Vimを使っている人はGo使いが多い気がします。
私もVimを使いたいのでGoを書くことにします。(手段が目的)## 「Go言語」とは?
Googleが2009年に発表した、オープンソースのプログラミング言語です。
## 環境
– OS:macOS Catalina 10.15
– Go:1.13.4## セットアップ
### インストール
公式サイトからパッケージファイルをダウンロードします。
https://golang.org/dl/パッケージファイルを実行し、ウィザードに従ってインストールします。
[続ける]をクリックします。
【Go】Qiita 週間ストック数ランキング【自動更新】## 他のタグ
– [【Python】Qiita 週間ストック数ランキング【自動更新】](https://qiita.com/kou_pg_0131/items/01127f188250a2d68dbf)
– [【Ruby】Qiita 週間ストック数ランキング【自動更新】](https://qiita.com/kou_pg_0131/items/6e5603cb6155c1d91f71)
– [【Rails】Qiita 週間ストック数ランキング【自動更新】](https://qiita.com/kou_pg_0131/items/e94bfc7467c96ff2c7f2)
– [【Go】Qiita 週間ストック数ランキング【自動更新】](https://qiita.com/kou_pg_0131/items/269fec563f49f0eb2bcd)
– [【Swift】Qiita 週間ストック数ランキング【自動更新】](https://qiita.com/kou_pg_0131/items/a6dc270783ec6e68e8a8)## 集計期間
2019年11月17日 –
GKE上にwebアプリケーションを構築する方法
記事の目的
– GKEについての紹介
– 簡単なwebアプリケーションを構築して、GKEにデプロイする方法の紹介# A. GKEの概要
Googleを中心に開発されているDockerコンテナの管理ソフトウェアKubernetes(k8s)のクラスタを簡単にデプロイできるサービスです。Dockerコンテナの実行にはGCE(Google Compute Engine)を利用します。
各基本概念
## クラスタ(Cluster)
クラスタは1つの小さいクラウドと考えることができます。なぜかと言うとクラスタの中でVMからネットワーク、アクセス権限など色々なリソースを設定とコントロールできるからです。
クラスタは複数Nodeで構成されて、各Node間に内部ネットワークがあります。
![devsamurai_gcp_gke_kubernetes_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535698/05332f9d-b053-d2d5-0552-34213172c8dc.png)
【Go】AWS SSMパラメータストアの値を取得する
## サンプルコード
今回はAWS SSM パラメータストアに以下のようなパラメータが作成してある。
| パラメータ名 | 値 |
| —————- | ———- |
| sample-parameter | HOGEHOGE!! |“`go
package mainimport (
“fmt”“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/ssm”
)func main() {
svc := ssm.New(session.New(), &aws.Config{
Region: aws.String(“ap-northeast-1”),
})res, _ := svc.GetParameter(&ssm.GetParameterInput{
Name: aws.String(“sample-para
GCP – Google App Engine(GAE)入門
# Google App Engine(GAE)
GAEはGoogleが提供するPaaS(Platform as a Service)サービスです。
PaaSとはアプリケーションが動作するためのハードウェアやOSなどのプラットフォーム一式を、インターネット上のサービスとして提供する形態のことを指します。メンテナンスやスケーラビリティなどを意識する必要がないためインフラ面の作業コストが削減され、アプリ開発に専念できる点が特徴です。# GAEの種類
GAEには以下の二つの実行環境が用意されています。– GAE SE(Google App Engine Standard Environment)
– GAE FE(Google App Engine Flexible Environment)## スタンダード環境(GAE SE)とフレキシブル環境(GAE FE)の違い
スタンダード環境(GAE SE)ではGoogleが管理する専用インスタンスを利用しますが、フレキシブル環境(GAE FE)ではGCE(※)上のDocker コンテナ上でアプリケーションを動作させます。メンテナン
【GitHub Actions】Go言語の自動テストからリリースまでを作ってみた
## はじめに
今回作成したのはGo言語リポジトリ用ワークフロー。
GitHubに指定されたタグがPushされた時点でテストを実行し問題が無ければ、クロスコンパイルを実施しリリースまで行う。
以下にアップロードしているので利用したい方はこちらからどうぞ。– [github-actions-workflows/release_go.yml at master · x-color/github-actions-workflows · GitHub](https://github.com/x-color/github-actions-workflows/blob/master/workflows/release_go.yml)
ワークフローの流れは以下となっている。
1. タグがPushされたことをトリガーにワークフローが起動
1. 依存したモジュールをダウンロード
1. テストを実施
1. テストに合格した場合、リリースプロセスが始動
1. ソースコードをzipにまとめリリース
1. クロスコンパイルを実施し、それぞれ生成物をzipにまとめてリリース以下が実際のworkfl