- 1. Goの初期設定周りまとめ
- 2. Goのnet/httpはクエリーパラメータもx-www-form-urlencodedが透過的に扱える
- 3. go の乱数を見て気づいたこと
- 4. 作って学ぶ動画広告配信システム
- 5. [Go]ローカル環境でのテスト自動実行スクリプトにより開発体験を向上する
- 6. TwilioとGolangで理解してサクッと作る発着信Webアプリ
- 7. クリスマスなので Clean Architecture 用の自動コード生成ツールを作りたくなった話
- 8. goroutine で os.Chdir() する際に注意すべきポイント
- 9. Go: stripe API 使い方 (List all customers)
- 10. Go ファジング入門
- 11. GORMでSQLインジェクションされるコードを書いてしまったので公式ドキュメントcontributeした
- 12. GoサーバからFirestoreにアクセスするときに、セキュリティルールを有効にする
- 13. 【Go言語】静的解析である構造体のフィールドを参照している機能を調べたい
- 14. Bigtableのデータ構造を理解しGoで読み書きする【図あり】
- 15. GoのDuck Typingを活用する
- 16. TODOコメントを埋もれさせない
- 17. Goで多段のファイル変換処理をしてみた
- 18. GoでGraphQLサーバを作る
- 19. 勉強する中で知った「Go言語には○○がない」を理解する
- 20. twitterで推しの漫画をより楽しむためのコマンドラインツール「imgdler」を作ってみた
Goの初期設定周りまとめ
## 概要
Go入門したので備忘録として、やったことや、理解したことをまとめる。実行時のバージョンは go1.17.2
## Goインストール
ここからインストール
https://go.dev/doc/install## $GOPATHを設定、/go/bin にPATHを通す
goプログラム内で`import`宣言が使われている場合、デフォルトで`$GOPATH/bin`を探しに行く仕様のため設定する必要がある。
`$GOPATH/bin`にはコンパイル後に生成される実行ファイル(バイナリファイル)が配置される。“`sh
# ~/.zshrcexport GOPATH=”$HOME/go”
export PATH=$PATH:$GOPATH/bin
“`
※任意のディレクトリを設定したい場合は`$GOBIN`で指定でき、これが指定されていない場合に上記の`$GOPATH/bin`が`import`宣言の探索先になる。## パッケージインストール
“`sh
# 最新版インストール
$ go get package_path# バージョン指定してインストー
Goのnet/httpはクエリーパラメータもx-www-form-urlencodedが透過的に扱える
[Goアドベントカレンダー](https://qiita.com/advent-calendar/2021/go)の欠番があったので穴埋めで書きました。
ちょっとウェブアプリケーション開発をがんばった経験がかなりある人であったり、Real World HTTPの熱心な読者であったり、Real World HTTPの熱心な読者の人であれば、フロントエンドからサーバーにデータを送信する手段が何種類もあることはご存知でしょう。
* クエリー(URL)
* ヘッダーフィールド
* ボディ本ではステータスコードも入れて4兄弟のように説明していたけど、サーバー→クライアント方向なのでここでは触れないでおきます。このうちヘッダーはメタデータなのでここで扱うのは2つですが、ボディを使うのは主にフォームのポスト(x-www-form-urlencodedとmultipart/form-data)と最近はJSONですね。
* クエリー(URL)
* ボディ
* x-www-form-urlencoded
* multipart/form-data
* JSONGoのAPIはJSO
go の乱数を見て気づいたこと
# これは何?
go の乱数の実装を見て気づいたことを書く。
扱うのは、数値シミュレーションとかで使う方の乱数。
ハードウェア乱数の話も暗号用途の話もしない。# 気づいたこと
## 生成
seed が 64bit しかない。64bit では足りない場面を見たことがあるので、えー64bit しかないのー、みたいな気分。
## スキップしたい
複数のプロセスや goroutine で大量の乱数を発生させるとき、みんな同じ種で作っておいて、「n番目のプロセスは、`rng.Uint64` を $n×2^{128}$ 回呼んだ後と同じ状態にしてからスタート」みたいなことができると便利だと思うんだけど、そういう機能はない模様。残念。
## Source64
math/rand に `Source64` というインターフェイスがあるけど、これの使い方が難しい。
ソースを見ると。
“`go:go
rng := rand.New(s)
“`みたいにするとき、`s` は math/rand の `Source` である必要があるわけだけど、 `s` が `Source64`
作って学ぶ動画広告配信システム
この記事は[CyberAgent PTA Advent Calendar 2021](https://adventar.org/calendars/6450)の18日目の記事です。
## はじめに
今年8月にABEMAにjoinし、広告配信システムの開発に携わらせてもらっています。
ABEMAはの広告配信システムは、[パーソナライズド配信](https://ad.abematv.co.jp/news/906/)や[プログラムマッチ](https://ad.abematv.co.jp/news/1007/)など、多機能で柔軟な広告配信を実現しており、システム自体の規模も巨大です。
一方で、個人的に動画広告の配信については全く知識がなかったため、joinした当初は、全体像を掴むのにかなり苦しみました。そこで、今回は動画広告配信システムのエッセンスだけ切り取り、実装してみることで、システムの全体像を掴むことを目標とします。
今後、動画広告配信に入門する人が全体像を掴むのに役立つ記事になればと思います。#### おことわり
– 本記事の全コードはこちら: https://git
[Go]ローカル環境でのテスト自動実行スクリプトにより開発体験を向上する
この記事は [DENSO アドベントカレンダー 2021](https://qiita.com/advent-calendar/2021/denso) の 18 日目の記事です。
Go で実装する際に使用している便利スクリプトを紹介します。
ファイルの編集保存の度にテストを自動実行し、色付けしたテスト結果を出力します。テストコマンド入力の煩わしさがなく、表示色で結果を判断できログを読む認知負荷が軽減します。コード編集に集中できるため、リファクタリング作業で重宝しています。# 動作デモ
デモではアサーションの期待する結果を編集して保存しています。ターミナルでスクリプトを一度実行した後は、エディタ内に留まったまま随時テスト結果を確認できます。
![Untitled.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/928808/fa808451-bded-f49a-63eb-8480c5f3a948.gif)# 準備
[reflex](https://github.com/cespare/refl
TwilioとGolangで理解してサクッと作る発着信Webアプリ
## はじめに
この記事は[Twilio Advent Calendar 2021](https://qiita.com/advent-calendar/2021/twilio)の18日目の記事です
https://qiita.com/advent-calendar/2021/twilio
みなさんTwilioを使っていますか?
Twilioは電話やSMSなどコミュニケーションに関するクラウドAPIを提供するSaaSで、プログラマティックに発着信・自動応答メッセージなどを扱うことができます
https://cloudapi.kddi-web.com/availability
Twilioは機能だけでなくドキュメントが充実している一方、豊富すぎて全体像が掴めず、当初自分はどこから手をつけてよいかわかりませんでした
またサーバーサイドの言語としてGolangを普段使用しているのですが、Twilioでは正式にサポートされていないので、チュートリアルや公式のSDKが存在しないので困った覚えがあります
そこで、そんな人達に向けてTwilioとサーバー連携の流れを理解しつつ、発着信
クリスマスなので Clean Architecture 用の自動コード生成ツールを作りたくなった話
# :christmas_tree: はじめに
この記事は [限界開発鯖 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/approvers)の18日目の記事です。前回(17日目)は[merunno](https://qiita.com/merunno)さんの[Discord APIに今後来る変更](https://qiita.com/merunno/items/605317e13d2ba111f36d)でした。
次回(19日目)は[kosakae256](https://qiita.com/kosakae256)さんの記事になります。# :raised_hands: 自己紹介
「ぬーべすと」と申します。Go言語を推してるただのオタクです。
好きなことは設計、嫌いなことは実装です。
設計だけしたら、誰かが勝手に実装してくれないかなと常に願っています。# :star2: 概要
もうすぐクリスマスですね。皆さんはクリスマスといったら何を連想しますか?
そうです!**クリスマス**と言ったらやっぱり ***
goroutine で os.Chdir() する際に注意すべきポイント
この記事は [Go Advent Calendar 2021](https://qiita.com/advent-calendar/2021/go) 18 日目の記事です。
題のような記事を日本語のウェブサイト/ブログで紹介されているのを目にしないため、題のテーマを選びました。
## 環境のバージョン
* Windows10
* go version go1.17.5 windows/amd64## goroutine で os.Chdir() を行うとこのようなことがおこる
まずは、実際に `goroutine` で `os.Chdir()` を実施するとどのような動きになるかを見てみましょう。
以下のようなサンプルプログラムを動かしてみます。“`main.go
package mainimport (
“fmt”
“os”
“path/filepath”
“sync”
“time”
)var wg sync.WaitGroup
func main() {
baseDir, _ := os.Getwd()
wg.Add(3)
for
Go: stripe API 使い方 (List all customers)
こちらのページの続きです。
[stripe API 使い方 (List all customers)](https://qiita.com/ekzemplaro/items/ed152ef41f1e81811519)#Go http でカスタマーの一覧を取得#
必要なライブラリーのインストール
“`bash
go get github.com/joho/godotenv
“`“`bash
go mod init get_customers_http
go mod tidy
“`“`go:get_customers_http.go
// —————————————————————
// get_customers_http.go
//
// Dec/17/2021
// —————————————————————package main
import (
“os”
“fmt”
Go ファジング入門
[QualiArts Advent Calendar 2021](https://qiita.com/advent-calendar/2021/qualiarts)、17日目担当のs9iです。
昨年も17日目を担当し、[Goのリフレクション](https://qiita.com/s9i/items/b835634d84bba5574d0a)について書きました。
今回はGo1.18で導入されるファジングについて、基本的な使い方や使用イメージを掴んでいただけるように書いていきたいと思います。# ファジングとは
ファジングは、プログラムへの入力を継続的に操作して、バグや脆弱性を見つけるソフトウェアテスト手法の一つです。セミランダムな入力を与えることで、予期しないエッジケースの不具合を見つけるのに有効な手段となります。GoではGo1.18で標準機能として提供される予定です。([2021/9/21にmasterブランチにマージされました](https://github.com/golang/go/commit/6e81f78c0f1653ea140e6c8d008700ddad1fa0a
GORMでSQLインジェクションされるコードを書いてしまったので公式ドキュメントcontributeした
どうも、社会人歴2年目のオチラルです。
初ブログ記事です。
この記事は、[フューチャー Advent Calendar 2021](https://qiita.com/advent-calendar/2021/future)の17日目の記事で、昨日は@hichikaさんの[Goで多段のファイル変換処理をしてみた](https://qiita.com/hichika/items/25b0fceea4761214b6e9)でした。##はじめに
タイトルの通り、GORMでSQLインジェクションが起こりうるコードを書いてしまいました。
幸いテスト期間中に発覚したので大事にはなりませんでしたが、原因究明中に公式ドキュメントがいけてないなと思ったので同じミスを他の人が侵さないように世のため人のため、~~OSSコントリビュート実績解除チャンスだとウキウキで、~~公式ドキュメントにコントリビュートした話をします。##GORMとは
[GORM](https://gorm.io/ja_JP/docs/index.html)は公式ドキュメントによると、“`text
デベロッパーフレンドリーを
GoサーバからFirestoreにアクセスするときに、セキュリティルールを有効にする
## TL;DR
サーバからFirestoreにアクセスするとき、ユーザのID Tokenを渡すことで、Firestoreのセキュリティルールにできる。
## やりたいこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196890/4409237e-7a21-bf28-dd1e-6dc907275087.png)
奇妙な構成だが、仕事の事情でこういう風にしたい。
問題は、APIサーバからFirestoreにアクセスするとき、Firestoreのセキュリティルールが適用されないこと。APIサーバではFirebaseのadmin SDKを使うが、通常の使い方だと、サービスアカウントとしてFirestoreにアクセスすることになるため。
Firestoreのセキュリティルールに相当する認証や認可処理を自分で実装しないといけない。実装自体はそれほど手間でないのだが、Firestore側で認証/認可をするのに比べて、処理時間が結構かかる。
だから、APIサーバからFirestore
【Go言語】静的解析である構造体のフィールドを参照している機能を調べたい
# 前置き
ある日顧客から、こんな依頼を受けました。
**「あるDBテーブルのカラムがそれぞれどの機能で参照されているか調べて欲しい」**
OR Mapper的な仕組みを利用している為、カラムは全てある構造体のフィールドとして定義されています。
参照されているコードの個所を調べるだけならばgrepでもある程度可能そうですが、grepには下記問題があります。– 同名の変数や他構造体の同名フィールドもhitしてしまう
– 参照されている箇所しか分からず、その処理(関数)を呼び出している関数を辿れないエディタやIDEの機能を使い変数参照元と関数呼び出し元を辿ることも出来そうですが、何しろ対象の構造体は **フィールド数が数百個ある** 為、手作業でやっていたら相当時間がかかりそうです(´・ω・`)
そこで、静的解析プログラムを作成して、構造体フィールドとそれを呼び出している機能(関数)を自動で出力することを思い立ちました。
# 解析対象プロジェクト(サンプル)
## パッケージ構成
“`
sample/
| api/
| | api.go
| domain/
| |
Bigtableのデータ構造を理解しGoで読み書きする【図あり】
この記事は [CyberAgent 22 新卒 Advent Clendar 2021](https://adventar.org/calendars/6671) 16日目の記事です。
# 概要
現在内定者バイトを行なっている部署でBigtableを使用する頻度が高かったので、今回は少しクセのあるBigtableのデータ構造とGolangでのBigtableのデータの読み書きについてまとめました。# そもそもBigtableとは
BigtableとはGCPのフルマネージドでスケーラブルな NoSQL データベース サービスです。
超大容量データをKey-Valueストアに格納するのに長けていたり、低レイテンシで高スループットという特徴があります。
もっと詳しく知りたい方はしたの公式ドキュメントを参照してください。### 公式Document
https://cloud.google.com/bigtable/docs/overview
# データ構造データ構造ですが大きな構成要素として
– **RowKey(行キー)**,
– **ColumnQualifier
GoのDuck Typingを活用する
本記事は Go Advent Calendar 2021 の16日目の記事です。
https://qiita.com/advent-calendar/2021/go
## はじめに?
Clean Architectureの概念にそって、GoでWebのBackend APIを開発する時に
依存性の注入が多く、特にデータのCRUD処理を行うRepositoryが課題になったので解決策を考えてみました。## Repositoryが多くなる問題
例えばECサイトでユーザーが購入をするユースケースの場合、
ざっくりと`売る人`, `商品`, `買う人`があって、そのデータたちの取得と保存をするRepositoryがそれぞれあるとします。その場合、購入のユースケースに必要なリポジトリは3つ以上になってDIするときもコードが長くなって可読性が落ちることや、機能追加時に必要なRepositoryが増えると、更にusecaseに追加するなどによって保守性が低くなります。
“`go
type ConsumerUsecase struct {
consumerRepo repository
TODOコメントを埋もれさせない
# はじめに
古いプロジェクトであればあるほど見つかるものがあります…
そう,**「忘れ去られたTODOコメント」**です…“`golang:main.go
// TODO: 後で共通化する
“`やろうとは思っていたものの工数が取れなかったり,単純に忘れてしまったりした結果,今日を迎えてしまったんでしょう.
そんな悲しいTODOコメントを生み出さないために,TODOコメントからGithubの
issueを自動生成するツールを作成しました.https://github.com/masibw/gifc
(Githubのissueが作られても埋もれるだろ!という反論は受け付けます)
## 概要
“`main.go
// TODO: implement this
“`
というTODOコメントがある場合,その.gitに登録されている1つ目のremoteに(多くの場合 origin)このようなissueが生成されます.![スクリーンショット 2021-12-06 23.17.07.jpg](https://qiita-image-store.s3.ap-n
Goで多段のファイル変換処理をしてみた
## はじめに
Go言語で圧縮ファイル展開処理やフォーマット変換処理などを`io.Reader`, `io.Writer`を使いストリーミングで処理できるサンプルを作ってみました。
ストリーミングでの処理をすることで処理元のデータサイズに依存せずに処理を行うことができます。## 処理内容
以下の一連の処理を行います。1. S3(Minio)からgzipファイルをダウンロード
2. gzipファイルを展開しJSONファイルを出力
3. ノーマライズ処理を行い、全角数字を半角に変換
4. JSONからCSVに変換
5. PostgreSQLに対しCOPYコマンドでバルクインサート![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102882/7badb63d-55f7-05fb-1d49-0bbfb9db3a48.png)
## 利用データ
以下の郵便番号データをJSONファイルに加工後、gzip圧縮をしたものをインプットデータとしました。
http://zipcloud.ibsn
GoでGraphQLサーバを作る
ハンズオン形式で、GoでGraphQLサーバを構築するための基礎知識を紹介します。
完成版は、[GitHub](https://github.com/KamikazeZirou/gql-example)に上げてあります。## GraphQLの導入
### GraphQLとはGraphQLは、Facebookが作ったAPI形式です。[公式ページ](https://graphql.org/learn/)から引用します。
“`
GraphQLは、APIのためのクエリ言語であり、データに対して定義した型システムを使ってクエリを実行するためのサーバーサイドランタイムです。
“`### GraphQLの使い方
まず、GraphQLのスキーマを定義します。
“`graphql
type Query {
me: User
}type User {
id: ID
name: String
profileUrl: String
}
“`次に、定義したスキーマを解釈して処理するGraphQLサーバを用意し、リゾルバを実装します。リゾルバはスキーマとデータソー
勉強する中で知った「Go言語には○○がない」を理解する
こんにちは。Goのアドベントカレンダー17日目の記事です。
普段はPHPをメインに開発していますが、せっかくの機会なので勉強中のGoで記事を投稿に挑戦してみました。Goを勉強していてPHPや他の言語に比べて2つの「○○がない」という言語仕様に戸惑いました。それは
– Go言語には継承がない
– Go言語には例外処理がない
です。この2つの仕組みは他の言語ではよく活用しており、可能なら使った方が良いと思って使い続けてきていたので、とても違和感がありました。
なぜGoにはこの2つの仕組みがないのでしょうか。少しでも言語理解を深めるために自分なりに調べてみました。# さきに結論
– 構造体の埋め込み、インターフェースを利用しよう
– errorインターフェースを利用しよう# Go言語には継承がない
## そもそも他言語で継承が使われている理由はなぜなのか?
「継承」とは、クラス定義に共通している部分を別のクラスとしてまとめる仕組みのこと。継承を利用することで同じようなクラスを一から作り直す手間がなくなり、共通している部分はまとめて変更するが可能になります。なので、継承を上
twitterで推しの漫画をより楽しむためのコマンドラインツール「imgdler」を作ってみた
はじめまして、駆け出しバックエンドエンジニアの[かず](https://github.com/kazdevl)です。
何気に自身の技術記事を公開するのは初めてなので多めにみてもらえるとありがたいです。twitterで推しの漫画をより楽しむためのコマンドラインツール「[imgdler](https://github.com/kazdevl/imgdler)」を作った話について記述します。
本記事は[CyberAgent22新卒Advent Calendar 2021](https://adventar.org/calendars/6671) 15日目の記事です。
https://adventar.org/calendars/6671
## 経緯
つい最近、開発に協力しているTwitter API v2のクライアントライブラリである[gotwtr](https://github.com/sivchari/gotwtr)がリリースされたので、宣伝も兼ねて何か作ろうな〜と考えていました。ちょうど、twitterに関連した課題を抱えていた私には、ちょうど良い機会でした。
その