Go関連のことを調べてみた2021年12月18日

Go関連のことを調べてみた2021年12月18日

作って学ぶ動画広告配信システム

この記事は[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 main

import (
“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に関連した課題を抱えていた私には、ちょうど良い機会でした。

その

元記事を表示

Go1.18からジェネリクスが導入されるらしいので、試してみた

**ジェネリクス**とは、データの型を束縛せず、型そのものをパラメータ化して扱う技術です。
利点としては、型を抽象化して利便性を上げつつ、静的型付け言語の安全性を保つことのできることが挙げられます。

### ジェネリクスを導入する前は
同一の処理をする関数であっても、型が違うだけでそれぞれ実装しないといけませんでした。
例えば、`int`と`float64`で和を求めるシンプルな実装をするとしましょう。
和を求める処理自体は同じなのに、型が違うだけの理由で似たような関数を二つ用意することになります。
https://go.dev/play/p/9uIhwWrlJK1

“`go
func main() {
sumInt := sumInt(1, 2)
fmt.Println(sumInt, ” is “, reflect.TypeOf(sumInt))

sumFloat64 := sumFloat64(1.0, 2.0)
fmt.Println(sumFloat64, ” is “, reflect.TypeOf(sumFloat64))
}

func sumInt(a

元記事を表示

GoでAtCoderをやる話

この記事は、[and factory.inc Advent Calendar 2021](https://qiita.com/advent-calendar/2021/andfactory)の 15日目 の記事です。
昨日は、@hagmonさんの「[【Flutter】アプリ起動時に未処理トランザクションを処理する方法](https://qiita.com/hagmon/items/18fa26307123de793d41)」でした。

# 概要
この記事では業務とは離れてますが、趣味で取り組んでいるAtCoderの話についてまとめてみたいと思います。始めてから半年ほどで、最近やっと水色になれました!この記事ではどんな感じでやっているか、水色になるまで、やって良かったことなどを雑多にまとめていきます。

https://atcoder.jp/users/GoSagawa
![Screen Shot 2021-12-14 at 22.20.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145904/2

元記事を表示

AutifyのWeb APIクライアントを作成しました

この記事は[Autify Advent Calendar 2021](https://qiita.com/advent-calendar/2021/autify)15日目です。

AutifyのWeb API用のクライアントライブラリを作成したの少しまとめます。
https://github.com/trknhr/autify-go

# Autifyとは
自動E2Eテスト支援ツールです。私の所属している会社で採用されているため私も業務の時間で触ることが多いです。

# このライブラリはなにをするか
Autify Web APIを直接叩く部分をラップします。ユーザーにとってはGoでAPIを呼び出してそのデータを取得するのではなく関数を呼ぶだけで該当のAPIを操作できることになります。
https://autifyhq.github.io/autify-api/#/schedule/post_schedules__schedule_id_

# なぜ作ったか

Autifyのシナリオの中身まで検索したい時がありその時に即興でWeb APIのラッパー的なのを作っていたのでそれをライブラリと

元記事を表示

OTHERカテゴリの最新記事