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

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

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サーバからFiresto

元記事を表示

【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のラッパー的なのを作っていたのでそれをライブラリと

元記事を表示

gonum.org/v1/plot が良かった話

# はじめに

この記事は Go Advent Calendar 2021 の 14 日目の記事です。(執筆時点で 15 日になりそうなのは内緒)
今回は以前簡易的なグラフを作る際に良かった `gonum.org/v1/plot` の紹介をしたいと思います。

# 背景

普段は Go を使ってバックエンドの開発を行っているのですが、たまにグラフをプロットするときがあります。
この辺のプロット周りのライブラリはどの言語にもあると思いますが、Go でも簡単にできないかなと思い探したところ、この plot に出会いました。
細かいグラフを出すのは結構たいへんですが、自分が思っているような簡単なグラフはすぐ生成できました。

# gonum.org/v1/plot で作ったグラフ

まず最初にこの plot で作成したグラフを紹介します。

### 近似数値微分法 を使った 3・5・7・9 点近似数値微分の誤差

![image_08-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216929/c02

元記事を表示

Goで使用しない戻り値、引数は無視しよう

### 戻り値を無視する
この方法は結構使いますね。
関数から受け取った戻り値を使用せず放置すると、コンパイルエラーになってしまいます。

“`go
func main() {
s, ok := plus(1, 2)
println(s)
}
“`
ビルドしてみると

“`go
./main.go:4:5: ok declared but not used
“`

このような時に、使用しない戻り値を無視すると、問題なくビルドが通るようになります。

“`go
func main() {
s, _ := plus(1, 2)
println(s) // => 3
}
“`

## パラメータを無視する
戻り値を「\_」を使って無視するのと同様に、関数の引数も「\_」を使って無視することができます。

“`go
func doSome(_ int, _ int) int {
return 100
}
doSome(1, 2) // => 100
“`

では、一見無駄なように見えるこの機能は、どのようなケースで使われるのでしょうか。

実は、Goには「インターフェ

元記事を表示

Terraform Provider AWSのテストの書き方

[terraform provider aws](https://github.com/hashicorp/terraform-provider-aws)におけるテストの書き方について調べたのですが、Terraform自体のテストの書き方じゃなくてproviderの開発の話はあまりみつからなかったのでまとめました。

# 参考ドキュメントについて
公式の[Acceptance Tests](https://www.terraform.io/docs/extend/testing/acceptance-tests/index.html)
を読んで理解を深めました。

## そもそもどういうテストが行われているのか?
プルリクエストを作成するときにはAcceptanceTestがパスしていないといけないのでAcceptanceTestの書き方を主に記載します。
このAcceptanceテストではterraformのコマンドを実際に実行してAWS providerならAWS上にリソースの作成を行っていました。
なので内部ではterraformのスクリプトを用意してリソースの作成を行います。

元記事を表示

Go言語にジェネリクスが入りそうなのでモナドを作って遊んでみた

この記事は [Applibot Advent Calendar 2021](https://qiita.com/advent-calendar/2021/applibot) 14日目の記事です。
前日は @naotoritty さんの「[Goでのベンチマークツールを作ろうとした話](https://qiita.com/naotoritty/items/3766d2d1aeef7fd17904)」という記事でした。

# はじめに

こんにちは。 (株)Applibotに勤める**型理論信者**エンジニアです。
現在、Goにジェネリクスを導入する動きが進んでいます。
ジェネリクスが入ることでGoは**「ダックタイピングなインタフェース」と「ジェネリクス」を持つ言語**になります。
静的型付けの言語としてはなかなか面白い特徴だと思ったので、モナドを題材にしてこれらがどのように機能するか試してみることにしました。

※この記事は「モナド」と「ジェネリクス(パラメータ多相)」を理解している方向けです

## Goのジェネリクス

はじめに、Goに導入されるであろうジェネリクスについてざっくりと

元記事を表示

GoシングルバイナリDockerイメージビルドでハマったこと

こんにちは、株式会社medibaでバックエンドエンジニアをしている @mdbr92 です。
この記事は [mediba Advent Calendar 2021](https://qiita.com/advent-calendar/2021/mediba) の14日目です。
※記事の内容はあくまで個人の発信であり、会社を代表する意見や見解ではありません。

この記事では
Go 言語で記述した HTTP サーバプログラムを AWS ECS などで動かすために
シングルバイナリ Docker イメージを作成しようとした際に
ハマってしまったことを書きたいと思います。

# なぜシングルバイナリイメージにしたいのか?

Go言語で記述したプログラムはシングルバイナリ
(ランタイムを必要とせず単体で実行できるファイル)にビルドできます。

この実行ファイルのみを scratch(Docker の予約済みの最小限のイメージ)に乗せて
ビルドすると 10MB 前後の小さな Docker イメージを生成することができます。

イメージのサイズが小さいことで、
AWS ECR のようなレジストリへの保

元記事を表示

Goのソースコードのファイル名の末尾が_ios.goだとビルド対象にならない

# 問題
Goで以下のファイル名を使うと多くの場合に問題が生じます。
なぜでしょうか?

“`
hoge_ios.go
“`

# 解答
ファイル末尾の `_ios.go` がbuild constraintだとみなされるため。
Goにはビルド対象の環境毎にソースコードを変えることができるbuild constraintという仕組みがあります。

https://pkg.go.dev/go/build#hdr-Build_Constraints

そのため、Windows環境でのみ利用できる機能とLinux環境でのみ利用できる機能を混在させることもできます。
この指定はファイルの先頭に以下のように書くことができますが、ファイル名で指定することもできます。

“`go
// +build windows
“`

ファイル名で指定する場合は、ファイル名の末尾を `_windows.go` とすると、上記と同じ効果が得られます。

windowsやlinuxなどは良く知られたものなので、目にする機会も多いかと思います
しかし、このbuild constraintに指定できる対象は意

元記事を表示

OTHERカテゴリの最新記事