- 1. チームで内部API開発をするときのツール
- 2. gRPC + Locust + boomerで負荷試験をしてみた
- 3. 「はし」「スプーン」「フォーク」に濁点を付けると「バシ!」「ズブ!」「ブォグ!」という事実【ゲームアプリ】
- 4. Goのスライス式で遊ぶ
- 5. Goを使用するにあたり、ポインタとアドレスでつまづいたので覚書
- 6. beegoでOauthログイン機能サーバー開発
- 7. GO(gin)でlocalhstにアクセスできない
- 8. YouTube好き集合。Go言語でLIVEコメントをリアルタイム取得する
- 9. Goでいいね機能を実装してみた。
- 10. Goコードを生成するprotocプラグインに入門する
- 11. Lambda + Go + terraformでAWSの料金をSlack通知してみた
- 12. GraphQL Serverを実装してみた
- 13. Go Linter – Staticcheckを使ってみる
- 14. Rubyやってた人間がGo始めて思ったこと
- 15. fmtパッケージをインポートするとファイルサイズがどかんと増えてしまう理由
- 16. [Go言語] Airを使って最短でホットリロードを実現する
- 17. Go の log.Fatal は気軽に使ったあかん!
- 18. TDD+DDD実践:ゆめみさんの模試
- 19. Go言語でMentaの売上をfreeeに登録するCLI開発
- 20. 独自KVSデータベースを作ってみた
チームで内部API開発をするときのツール
# まえがき
– 最近はBFFアーキテクチャの採用により、サーバサイドは内部(Internal)APIとしてAPIを作成することが多い
– チームで開発するために、どのAPIが何を示しているかはわかりやすくしておきたい
– サーバ・フロントどちらを触るときでもAPI定義を見れば実装できるようにしたい
– 各エンドポイントが何をしているか、コードを見ればわかるけど毎回したくはない– チーム開発でAPI開発をするときにどのようなツールを利用していたかについて記載する。
# 前提
– いわゆるREST APIを採用 (gRPCではない)
– OpenAPI3.0 を仕様# VSCode拡張機能
– [Swagger Viewer](https://marketplace.visualstudio.com/items?itemName=Arjun.swagger-viewer)
– API定義をプレビューできる拡張機能
– 拡張機能名はSwaggerとついているが、OpenAPI3.0でも問題なくプレビューが可能
– いわゆるライブリロード機能があり、編集→反映が
gRPC + Locust + boomerで負荷試験をしてみた
# はじめに
この記事は[ミクシィアドベントカレンダー2021](https://qiita.com/advent-calendar/2021/mixi) 8日目の記事です。
こんにちは。
サービスのリリース前や大きなイベント前には皆さんも負荷試験をしているかと思います。今回はgRPCを使った新規サービスでboomerというツールを使って負荷試験をしたのですが、なかなか使い心地がよかったのでご紹介したいと思います。
またboomerの選定については先日までアルバイトで来て頂いていた方にメインやって頂いたのですが、非常に助かりました。
この場をお借り致しまして,お礼申し上げます。# boomerとは
LocustのシナリオをGoで書けるWorker Runnerです。
LocustのWorkerとして動作するため、別途Locust Masterは必要になります。
gRPCに特化したツールというわけではありません。https://github.com/myzhan/boomer
# ツールの選定理由
Locust + boomerは以下の理由で採用しました。
–
「はし」「スプーン」「フォーク」に濁点を付けると「バシ!」「ズブ!」「ブォグ!」という事実【ゲームアプリ】
[クソアプリ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/kuso-app) (カレンダー2)8日目の記事です。
歴史あるクソアプリアドベントカレンダーに初参加(Qiitaに初投稿)です。
#はじめに
私は気づいた。日々の食事で使う3つの道具。
箸、スプーン、フォーク。
この3つはある法則で「変貌」する・・・。
**「バシ!」「ズブ!」「ブォグ!」**
そう、濁点をつけると、完全に **打撃音** なのだ。
#作ったもの
「箸でバシ!」をリリースしました!
落ちてくる食べ物を「バシ(箸)」「ズブ(スプーン)」「ブォグ(フォーク)」で倒すゲームです!
全16ステージをクリアできるか!?#Golang + #Ebiten 製!↓Playストアhttps://t.co/boNxDJyyAj
↓ブラウザ版(インストール不要!)https://t.co/OXxGDKk3zK pic.twitter.com/FH0JUgnpb3
— Ichiban Kunio (@ku20298) December 7, 2021
↓Android版はこちらからダウンロードできます(レビューしてほしい)!
https://play.google.com/store/apps/details?id=com.ku20298.hashidebashi
紹介画像がなかなかクソですね。
↓こちらからはブラウザで遊べます。PCやiPhoneの方はこちらで遊んでみてください!
htt
Goのスライス式で遊ぶ
この記事は[2021年Goアドベントカレンダー2](https://qiita.com/advent-calendar/2021/go) 8日目の記事です。
# はじめに
Goにはslice(スライス)というデータ構造が提供されています。
可変長配列のようなもので、Goを触ろうとした人の中にはこのスライス操作で躓く人が多いのかもしれません。Goには他の言語のようにコレクションに対する便利な関数が提供されていないのは有名だと思いますが、基本的にGopherはこのスライスをfor文で愚直にイテレーションしたり `append`/ `copy` 関数を使って要素の追加や削除を行なっていきます。
おそらくですが、Wiki にある[SliceTricks](https://github.com/golang/go/wiki/SliceTricks) にお世話になった人は多いでしょう。そんなスライスですが、今回はスライス操作についてではなくスライス式の挙動について簡単に書いていこうと思います。
# スライス式(Slice expressions)とは
> Slice expressi
Goを使用するにあたり、ポインタとアドレスでつまづいたので覚書
Goでは値が初期化(定義)されると、値の内容の他にその値がメモリ上のどこにあるかを示すアドレスというパラメータが自動生成される。
### アドレスの仕組み
アドレスを確認する場合
~~~go
&value
~~~
というように、「&+値名」のように書くと、その値のアドレスを参照できる。~~~go:例1
func main() {
a := 5
b := &afmt.Println(a)
fmt.Println(&a)
fmt.Println(b)
fmt.Println(&b)
}
~~~~~~go:結果
5
0xc00001a060
0xc00001a060
0xc00000e028
~~~これは何が起こっているのかというと、aにbのアドレスを代入したので、fmt.Println(b)の戻り値はfmt.Println(&a)の戻り値となる。
また、bは新しく定義されたので、bには値としてaのアドレスがセットされたと同時に、bにはアドレスが割り振られた。### アドレスに値があれば、アドレスから値を参照することができる
(例1)では、bにはaの
beegoでOauthログイン機能サーバー開発
GoでOauthなログイン機能バックエンドサーバーを作りました。
実装内容とシーケンスは下記の記事を参考にさせていただきました。
https://dev.classmethod.jp/articles/persistent-login-for-mobileapp/# 環境
go v1.17
beego v1.12.1# 実装機能
バックエンドには下記機能を作ります。
・サインアップ
・ログイン
・ログアウト
・accessToken更新用のapi
・コンテンツ(hello worldを返すだけのapi)
・認証用のwebFilter機能全体のコードは下記になります。
https://github.com/fu-yuta/authentication_backend
ひとつずつ解説してきたいと思います。## DB
ユーザーの情報を保存するためのテーブルは下記になります。
ログインの認証用のユーザー名とパスワードと次のリクエストから認証に使用するアクセストークン、リフレッシュトークンを保存できるようにします。
また、アクセストークンの有効期限も保存し、リクエスト毎の検証
GO(gin)でlocalhstにアクセスできない
## はじめに
macでdockerを使ってgo言語のginを使ってテストサーバにアクセスできない問題を解消したので備忘録に置いておきます。
## 環境
– Mac(Monterey 12.0.1)
– GO 1.17.1## 結論
サーバ作成時に
“` err := router.Run(“127.0.0.1:8080”) “`
ではなく
“` err := router.Run(“0.0.0.0:8080”) “`
とする。## 問題
今回の環境では、dockerを用いてgoのサーバを建て、hostからgoサーバにアクセスしようとしたところで問題が起きた。
![env.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150694/364a7d0d-291d-ba5e-1d10-1450aef4cd2f.png)ブラウザで表示しても応答がない。
![404.png](https://qiita-image-store.s3.ap-northeast-1.a
YouTube好き集合。Go言語でLIVEコメントをリアルタイム取得する
# はじめに
こんにちは。サーバーサイドエンジニアです。アドベントカレンダーということでクリスマスカラーの赤色にちなんで
赤い動画配信サービスYouTubeのネタです。YouTubeは言わずと知れた動画配信サービスですが、最近ではLIVE配信によるサービスの盛り上がりを見せています。LIVE配信は動画配信者に対して視聴者がコメントで意思を伝えたりする双方向のコミュニケーションが可能になっています。
そんなLIVE配信のコメントですがAPIを利用して取得することができます。
今回はGo言語を利用して、簡単にLIVE配信のコメントを取得する方法をご紹介します。
![christmas_santa_sori.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540446/055944f6-479f-7202-6470-a7eb4cdaa7ff.png)
# 技術
言語: Go
フレームワーク: Gin
すぺしゃるさんくす: YouTube API# 準備
YouTube APIのページから事前に
Goでいいね機能を実装してみた。
この記事は Aizu Advent Calendar 2021 の5日目の記事です
夏休み中にgo言語でそんな感じのコードを書いていたので、自分の復習も込めて記事にしてみます。
全てのコードはこちら
=> https://github.com/wt128/dbapiBygo/
## フレームワーク等
gin/gorm/mysql## ER図とモデル![ergo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1504436/1a630627-5787-9e75-6315-5368ee7b959a.png)
– いいねのモデル“`
type Like struct{
ID uint `json:”id”`
PostID uint `json:”postid” gorm:”index:idx_name,unique”`
UserID uint `json:”userid” gorm:”index:idx_name,unique”`
User User `gorm:”forei
Goコードを生成するprotocプラグインに入門する
この記事は CyberAgent 22 新卒 Advent Calendar 6日目の記事です。
https://adventar.org/calendars/6671
# 概要
protoファイルのデータ定義を元に様々な言語のコードを生成できるのがすばらしい!
しかも、なにやらprotocプラグインなるものを使えばprotoファイルを元にコードを生成できるらしい!
というわけで、以前protocプラグインを調べたことがありまして、今回はその時のことをまとめてみました。Go言語でprotoファイルからGoのコードを自動生成するprotocプラグインに入門してみましょう。
Goのコードを自動生成したいなと考えている方などに参考になればと思います。# protocプラグインの仕組み
まずはprotocプラグインの仕組みについて学びましょう。
こちらに関しては、先駆者の方の記事がめちゃくちゃ参考になります。– https://qiita.com/yugui/items/87d00d77dee159e74886
– https://speakerdeck.com/popon01
Lambda + Go + terraformでAWSの料金をSlack通知してみた
## はじめに
この記事は[mixiアドベントカレンダー2021](https://qiita.com/advent-calendar/2021/mixi) 6日目の記事です。
みなさまはAWSで運用しているサービスに毎月どれくらいのコストがかかっているか、サービスのリソースごとにどれくらいの料金がかかっているかを確認していますでしょうか。
今回は、AWSの料金を毎日Slackに通知するシステムをLambda + Go + terraformで構築したのでそちらをご紹介させていただきます。## おすすめな人
– AWSにかかる料金を定期的に通知したい
– GoでLambdaをどう開発するか知りたい
– terraformでLambdaを管理する方法を知りたい## アーキテクチャー
![aws_billing_notification.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2334784/760f4f85-cfdb-8b57-bad4-8c4b0e4df04d.png)– Even
GraphQL Serverを実装してみた
# GraphQL Serverを実装してみた
次のプロジェクトで _GraphQL API_ を使おう!という話になったので、
GraphQL ServerをGolangで試しに作成してみました。Githubにサンプル実装のソースをコミットしましたので、ご参考下さい。
[tochukaso/graphql-server-sample]
## GraphQLとは
[GraphQL]とは、一言でいうと、
**SQL感覚で書けるAPI** である
[graphql.org]によると、以下の通り
“` text
GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data.
GraphQL provides a complete and understandable description of the data in your API,
gives clients the power to ask for exactly wh
Go Linter – Staticcheckを使ってみる
この記事は[Wanoグループ Advent Calendar 2021 5日目](https://qiita.com/advent-calendar/2021/wano-group)の記事になります
Goには様々なlinterが存在しています。
元々Go公式のlinterはGolintですが、色々否定的な意見は少なく、今年ついにアーカイブされました。代わりに使用するlinterとして GoやGoogleがサポートするStaticcheckが使ってみようかなと思います。
### 公式page (前身はGoSimple)
https://github.com/dominikh/go-tools
### Install
go 1.17なら、以下のcmdで実行 (過去versionの場合、go installじゃなくgo get使うかも)
“`
$ go install honnef.co/go/tools/cmd/staticcheck@latest
“`### 実行
早速使ってみる
“`
$ staticcheck ./……(略)
xxxxxx
Rubyやってた人間がGo始めて思ったこと
この記事は、[フラー株式会社 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/fuller-inc)の6日目の記事です。
5日目の記事は [@m-coder](https://qiita.com/m-coder) さんによる [DroidKaigi2021に登壇した話](https://note.com/m_coder/n/n74901d195d83) でした。
—
私は元々Ruby on Railsで開発をしていたのですが、最近転職しまして、Goに入門しました。
Goやり始めて「へぇ〜」と思ったことを書いてみます。## 型があるとうれしい
私は静的型付けの言語をこれまであまり触ったことがなかったのですが、型がちゃんと決まってるとありがたいですね。
エディタ(VSCodeを使っています)の補完機能がバリバリ効いて、
– この変数にどんな値が入っているのか
– この変数はどんなメソッドが使えるか
– このメソッドにどんな値を入れればいいかなどを教えてもらえるので、サクサクコードを書き進められ
fmtパッケージをインポートするとファイルサイズがどかんと増えてしまう理由
[Goアドベントカレンダー3](https://qiita.com/advent-calendar/2021/go)が穴が空いていたので小ネタを投稿してみます。
@masa_itoさんがGoConで、[Contextを完全に理解する](https://future-architect.github.io/articles/20211119a/)という発表をしました。その発表資料のP44に次のような記述があります。
![スクリーンショット 2021-12-06 1.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6105/bf47e197-d734-1381-1fa9-d6de91b8ed29.png)
会社のチャットで「fmtを使えば済みそうなところを、それを使わずに周りくどいことをしている」と発表資料を作っているときに@masa_itoさんが書いていて、僕が「fmtをインポートするだけでファイルサイズがかなり大きくなりますしね」と答えていたのですが、じゃあ何がでかくなるのかなってあたり
[Go言語] Airを使って最短でホットリロードを実現する
## 環境
以下の実行環境で動作を確認しています。
“`bash
$ go version
go version go1.15.4 darwin/amd64
$ docker -v
Docker version 20.10.10, build b485636
$ docker-compose -v
docker-compose version 1.29.2, build 5becea4c
“`## ホットリロードのライブラリといえば色々ありますが・・・
最近では[Air](https://github.com/cosmtrek/air)が1番流行っているようです。サクッと試してみます。
![スクリーンショット 2021-12-05 23.31.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217116/470f3cd1-2226-a53b-b4d9-aa064b530fde.png)
[Star History](https://star-history.com/#cosmtrek
Go の log.Fatal は気軽に使ったあかん!
## log.Fatalはアプリケーションの実行が終了されるので、気軽に使うのはやめましょう!
`log` pkgの中身は以下
“`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)` されてるので、アプリケーションの実行が終了される。
なのでとりあえずログに吐きたい時は `log.Println` などにしましょう。
`log.Println` だとexitされないです。`log.Println` のsrcは以下
“`go
// Println calls Output to print to the standard logger.
// Arguments are handled in the manner of fmt.Println.
func Println(v …in
TDD+DDD実践:ゆめみさんの模試
こんにちは、HCB Advent Calendar 2021の5日目を担当する、take-2405です。
[HCB Advent Calendar 2021](https://qiita.com/advent-calendar/2021/hcb-2021)ハッカソンの記事を書く予定でしたが、急遽変更してしまいました。ごめんなさい?
今回は、TDD、DDDを書籍で学んだのちに、実際にコードを書きながら理解を深めた過程を書きたいと思います。
# この記事について
この記事は、「TDDとDDDについて学んだから実践してみたい」ということでゆめみさんが公開している模試問題に取り組んでいます。
TDDの開発サイクルとオニオンアーキテクチャを意識して問題に解答しました。# 取り組んだ問題
今回取り組んだ問題は、ゆめみさんが公開している模試問題です。
内容は、とあるゲームのスコアログをソートし、上位10位のスコアに概要するプレイヤー一覧を表示するという問題です。詳細は下記ページをご確認ください。
https://www.yumemi.co.jp/serverside_recru
Go言語でMentaの売上をfreeeに登録するCLI開発
この記事では教育プラットフォームであるMentaの売上情報をダウンロードし、売上情報として会計サービスfreeeのAPIを利用し登録する流れを解説したいと思います。まだ連携先として追加されていない他のECサービス・収益化が行える配信サイト等を利用している方の参考にもなるかと思います。
Mentaとはプログラミング技術などを教える人・学習する人をマッチングするサイトです。私も1年以上メンターを行っており、累計50人近くの方に学習のサポートを行っています。現在調べてみたところ、このサイトの収益情報を自動登録できる会計ソフトは存在しないようなので、APIを通じてfreeeへ取引を登録するための簡単なCLIを作成しました。
https://menta.work/user/13264
成果物はこちらに掲載しています。
https://github.com/kamijin-fanta/freee-menta-importer
## freeeでの収支の入力方法を理解する
Mentaは入金から30日以上経過した売上について出金の申請が行なえます。契約者毎に支払タイミングが異なり、毎月支
独自KVSデータベースを作ってみた
# 初めに
オークファンの開発部に2021年新卒入社した@isodaです。
題名の通り、独自KVSデータベースの設計と開発(実装は途中)を行いました。# 経緯
通信プロトコル、ファイルシステム、バイナリなどの理解。
Goを使用した開発や1から設計を行う経験の為、研修の一環として、今回の独自KVSデータベースの設計と開発を行わせて頂きました。# 通信プロトコルの設計
通信はTCPを使用し、バイナリデータでのやり取りを行います。– DBサーバーへのリクエスト
– KeyとValueを送る際に、どこまでがKeyでどこまでがValueなどを識別するために、識別文字を入れる方法もありますが、
今回はバイナリセーフにしたいためKeyとValueのサイズを通信に内包する方法にしました
– DBサーバーからのレスポンス
– Create/Update/Deleteの際は正常を示す値(0x00) or 異常ならエラーコード
– Readの際は正常系はリクエストのKeyに対応するValueの値 or 異常ならエラーコードが返ってくる## Create/Upda