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

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

gRPCの各言語向けパッケージ生成を一括管理する

この記事は [DeNA Advent Calendar 2021](https://qiita.com/advent-calendar/2021/dena) の10日目です

11/30にリリースした [PLAYBACK 9](https://playback9.jp/) では、クライアントとサーバーとのやり取りに gRPC を利用しています。
gRPCではIDLを利用してAPIを表現でき、クライアント及びサーバーのスタブコードを自動生成できるため非常に簡単に利用することができます。

しかしながら、生成したコードをどのように管理するかどうかは各自に委ねられており、ベストプラクティスが定まっているわけではありません。
インターネットでも様々な方法が公開されており、一番よく見かけるのは Git の Submodules を使い、共通の proto ファイルから各自コード生成を行うという方法です。

この方法は簡単ではありますが、

* コード生成の責務が各利用者に発生する
* 各言語で、どの時点のコードを利用しているか分かりづらい

といった問題があります。

この問題に対して、GitH

元記事を表示

Go 言語の reflect : 最初の一歩

reflect package に苦手意識がある人は多いのでは?と思います。
自分自身もあまり使ってなかったのですが、 encoding/json 的な package として excel に入出力するものを作った時にある程度理解が進みました。
ここでは、最低限のコードにより reflect package を少しだけ説明します。

# reflect package とは

> Package reflect implements run-time reflection, allowing a program to manipulate objects with arbitrary types. The typical use is to take a value with static type interface{} and extract its dynamic type information by calling TypeOf, which returns a Type.
>
> A call to ValueOf returns a Value representing

元記事を表示

gRPC-Goのサーバー実装を読む

この記事は[Mobility Technologies アドベントカレンダー2021](https://adventar.org/calendars/6771)の10日目です。

![スクリーンショット 2021-12-10 9.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148416/3c0065d6-3e69-a684-986c-dfe568d3e08c.png)

MoTではサーバーサイドのサービス間通信にgRPCを使用しています。
gRPCはprotobufのスキーマ定義から必要なコードが自動生成出来るため、
なんとなくで使えてしまうところがAPI作成の手間と難易度を下げてくれているのですが、
`なんとなく`の部分が気持ち悪くもあったためこの機会にGoのgRPCライブラリであるgrpc-goの実装を調べてみました。
ただし、この記事ではスキーマからのコード生成やアプリケーションでの利用方法については説明しません。

gRPCは通信プロトコルにHTTP/2を使用しており、バイナリフ

元記事を表示

Go の気になったコミット (2021 年 11 月)

[golang/go](https://github.com/golang/go) の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。

前回作成したリストはこちら。

https://qiita.com/sg0hsmt/items/c2c77653b3f5361b1aa1

軽く説明を追加していますが勘違いや誤りがあるかもしれません。

## Topic

– 既存の標準パッケージよりも改善された IP アドレス表現を提供する net/netip が追加されました。
– 新しい GC Pacer (GC をいつ動かすか決定するアルゴリズム) が実装され、デフォルトで有効になりました。
– 安全ではないとされている証明書の署名や TLS バージョンに対する扱いが変更されています。

## Commits

### 2021-11-02

https://github.com/golang/go/commit/a59e33224e42d60a97fa720a45e1b74eb6aaa3d0

既存の標準パッケージよりも改善された (小さく比較可

元記事を表示

[Go]Slackで古い投稿を一括削除する

この記事は [DENSO アドベントカレンダー 2021](https://qiita.com/advent-calendar/2021/denso) の10日目の記事です。

年末大掃除の時期となりました。古くなったSlackの投稿を一括削除して、気持ちよく新年を迎えるための機能をGo言語で実装しました。

# 概要
SlackのAPIトークンと、Slackチャンネル名を設定してプログラムを起動します。日付を入力し確定すると、入力した日付より古い投稿を削除します。

“`shell:
$ ./cleaner
This program delete SLACK messages older than the date you enter.
Enter date in the format like 2006/01/02: 2021/11/28
Are you sure you want to delete messages of Channels [“memo” “aws-cost”] older than 2021/11/28? (Y/n) >y
start.
Deleted.

元記事を表示

Go 1.18 で追加される `any` は `interface{}` のエイリアス

先日、次の Issue を教えてもらって「any って type parameters 専用じゃなかったの?」と驚いたので調べてみました。

https://github.com/golang/go/issues/49884

結論から書くと Go 1.18 で追加される `any` は `interface{}` のエイリアスとして事前定義された識別子なのでどこでも使えます。
最新の仕様 [^1] にも次のように記載されています。

> For convenience, the predeclared type any is an alias for the empty interface.

[^1]: https://tip.golang.org/ref/spec#Interface_types

## 型制約のための any (2021 年 1 月 12 日~)

https://go.dev/blog/generics-proposal

https://github.com/golang/go/issues/43651

Go でジェネリクスをサポートするための仕様変更は

元記事を表示

やらかしちまって自動販売機の前で泣いた話

こんにちは!入社3ヶ月目を迎えるザハです!こちらは金属加工プラットフォームを開発・運用するCatallaxyの[Catallaxy Advent Calendar 2021](https://qiita.com/advent-calendar/2021/catallaxy)の10日目の記事になります。9日目の記事はちいかわさんによる「[Reactではじめるキノコ狩り](https://qiita.com/catallaxy/items/17dc6327c10e2e3efc5e)」でした。

チャレンジングなアウトプットを虎視眈々と狙いながら、配属されたプロダクトでIssueをこなす毎日を過ごしていますが、いざ記事を書くとなると何を書いていいのやら。。。という訳で本日は、苦肉の策として、これまでの経歴でやらかしちまった&経験した話を赤裸々にお話ししたいと思います!

# 夏の秋葉原

遡ること2006年だか2007年だか、もはや昔過ぎて正確に覚えてはいませんが、レンタルサーバーが主流でサーバー操作をミスると、レンサバに電話して5000円払って、電源を入れてもらう時代の話です。はい、もちろ

元記事を表示

GraphQL(gqlgen)でのエラー定義とエラーコード化

# はじめに

最近筆者は GraphQL という言葉を耳にする機会が増えてきたなと感じています。新規開発として立ち上がったサービスでは GraphQL を使うというところも多いのではないでしょうか。
今回のこの記事では GraphQL サーバーにおいてエラーコードの概念を取り入れたときの実装 gqlgen における簡単な実装方法を紹介します。

# この記事の話

– GraphQL でエラーコード周りどう実装するのか
– gqlgen で実装すると スキーマでエラーコードを実装して、SetErrorPresenter で整形する

# GraphQL 上でエラーコードを使用する

GraphQL に限らず、REST など様々な形態の API ではクライアント側とエラーコードを予め決めておき、そのコードに応じてクライアント側の制御を行うといった手法が多く使われると思います。
具体的には発生するエラーに対して固有のコードを設定し、このエラーコードならこのメッセージを出そうとかこういう遷移をしようという使われ方をします。
Firebase では以下に示したリンク先のように固有のコードが

元記事を表示

Goのmonorepoとworkspace mode

僕はmonorepoが好きで、これまでGoのsingle-module構成とmulti-module構成どちらも実運用してきました。最近ではメルカリShopsがmonorepoを採用して話題になったりとにわかに盛り上がっていて嬉しくあります。
https://engineering.mercari.com/blog/entry/20210817-8f561697cc/

さて、来たるGo 1.18の目玉はやはりGenericsで影に隠れがちですが、multi-moduleの体験を向上させるworkspace modeという機能が入る予定です。
https://github.com/golang/go/issues/45713

この記事ではGoでmonorepoするときの一般的な構成であるsingle-moduleとmulti-module、そしてworkspace modeが入ったあとの世界について見ていきたいと思います。
※ workspace mode自体はまだ頻繁にCLが取り込まれていてリリースされるまでに変更が入る可能性が非常に高いです

また本記事での実行環境は以下の通りで

元記事を表示

GoとRepositoryパターンと集約またぎのトランザクションと

[Wano Group Advent Calendar 2021](https://qiita.com/advent-calendar/2021/wano-group) の記事です。

教義通りにRepositoryでトランザクション貼ってるDDDやらレイヤードアーキテクチャやら関心の分離やらの記事はあれど、**Repisitoryをまたいだトランザクション**のサンプルってそんなに多くないですね。

多くのスタートアップで現実的には向き合わなきゃいけなさそうな気もするんですが、みんな分散トランザクションの天才とかなのかしら…(
一部プロジェクトでやってるトランザクションのパターンを本稿では扱おうと思います。

# 要約

* トランザクションは主に各アプリのusecaseで貼ってる
* context.Contextにmutableなトランザクションオブジェクトを詰めてる
* repositoryにはcontextからORMのオブジェクトを復元する関数自体をDIしてる

# 前段:保存したいモデル/RDB上の構成/Goのパッケージ構成
こんなかんじのmodelで、この中

元記事を表示

Go の image/color パッケージの color.RGBA に透明度を正しく指定する&過ちの共有

# まえがき
これは[株式会社ピーアールオー(あったらいいな!を作ります) Advent Calendar 2021](https://qiita.com/advent-calendar/2021/pro-japan1) 2日目の記事です。
初日は [pro_matuzaki](https://qiita.com/pro_matuzaki) さんの「[周回遅れで試すNotion API](https://qiita.com/pro_matuzaki/items/43d492f6491410e68e5d)」でした。
また本記事の内容は[個人ブログの記事](https://blog.84b9cb.info/posts/go-colorcode-to-rgba/)の再編です。

**開発環境**
go version go1.16.5 linux/amd64
# 要約
Go の image/color パッケージの color.RGBA に設定する RGB 値は、透明度を 0 ~ 1 に正規化した値を RGB 値に掛け合わせた値を用います。
つまり R: 162, G: 173, B: 5,

元記事を表示

Go、ポインタにするか値にするかの方針を考えてみた

## はじめに
この記事は[2021年Goアドベントカレンダー(3)](https://qiita.com/advent-calendar/2021/go)の9日目の記事です。

ポインタにするか値にするか考え方針をまとめてみました。

この記事で書かれていることは既に多くの方が考えたり記事にしたりしていますが、どうするべきか迷うことがあり、例となるコード付きで方針をまとめたいと考え記事にします。(この記事の内容は個人的な方針です。サービスの特性などで変わる点はあると思います。)

以下の3つのパターンで記載しています。

– 構造体について
– 関数の引数について
– メソッドのレシーバについて

間違いなどありましたら教えていただけると嬉しいです。

### 構造体について
#### 方針
– 構造体のフィールドに、スライスやmap、ポインタなどの参照型を持つ場合はポインタ
– 変更不可な構造体として、運用する場合は値でも良い(コンストラクタを定義し必ずコンストラクタで生成するようにする、不変なオブジェクトなど)
– 迷ったらポインタ

構造体のフィールドに、スライスやmap、ポイ

元記事を表示

Go言語+Elasticsearchで簡易求人検索バックエンド構築

# Go 言語+Elasticsearch で簡易求人サイトバックエンド構築

この記事は、マイナビ Advent Calendar 2021 9 日目の記事です。

今回の記事のソースコードは、[GitHub](https://github.com/ekusiadadus/go-hr-backend)で公開しています。

フォルダ構成は以下のようになります。

“`
.
├── README.md
├── batch
│ ├── LoadData.go
│ ├── go.mod
│ ├── go.sum
│ └── test_data.xml
├── docker-compose.yml
├── es
│ ├── dic
│ │ └── test_dic.csv
│ ├── Dockerfile
│ ├── script
│ │ └── es_init.sh
│ └── sudachi
│ └── sudachi.json
├── search_api
│ ├── Dockerfile
│ ├── go.mod

元記事を表示

AWS SAMを触ってみた

こんにちは、HCB Advent Calendar 2021の8日目を担当する、take-2405です。
研究の都合上あまり時間を確保できず、とても雑な記事になってしまっています。

ごめんなさい!!

[HCB Advent Calendar 2021](https://qiita.com/advent-calendar/2021/hcb-2021)

今回は、AWS Lambdaのローカルでのテストを目的とし、AWS SAMのインストールとテンプレート作成までについてをメインに書いています。

注意:基本的なLambdaの作成方法などは省いています。

# はじめに
みなさんは普段AWS Lambdaを利用するでしょうか?
私は、割と頻繁に利用します。(体感週に2つはLambdaを作成している)

普段goでLambdaを作成するのですが、goでLambdaを作成する場合以下の手順を踏む必要があります。

“`
1. プログラムをコンパイルする(バイナリファイル化)
GOOS=linux go build -o バイナリファイル名 goファイル名

2. デプロイするためにバ

元記事を表示

Ubuntu で Go の最新版を使う

Ubuntu 20.04 にて Go の最新版を使う手順です。
Windows 10 WSL2 上の Ubuntu の場合は、下記手順となります。

## 最新の golang-go リポジトリを追加する

“`
sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt update
sudo apt install golang-go
“`

なお、 golang-go は 最新の Go をデフォルトのGoとしてインストールします。
代わりに golang-1.17 をインストールしたい場合、 `/usr/lib/go-1.17/bin` のバイナリを使用してください。

## パッケージを更新する
パッケージを更新したい場合は、いつもの手順でOKです。

“`
sudo apt update
sudo apt upgrade
“`

## Hello World

動作確認をしてみます。
hello フォルダを作成し、 go mod init にて hello フォルダに モジュールを作成します。
go

元記事を表示

きらめく星(の力で憧れの私)描くよ

この記事は、フラー株式会社 Advent Calendar 2021 の8日目の記事です。
担当は昨年フラーにサーバーサイドエンジニアとして合流しました@inoriko711です

7日目の記事は @jfurudo さんによる [Fastlane で AppStoreConnect にアップロードするまで](https://qiita.com/jfurudo/items/2f18cf392d307d770f65) でした。

## 背景
きっかけはアドベントカレンダーを担当することを宣言したときに、変換をミスったことでした。
むちゃぶり

そんなわけで、フラーのサーバーサイドが採用しているGolangを用いてきらめく星を描きたいと思います。
タイトルの意味がわからない方は[こちら](https://www.toe

元記事を表示

チームで内部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つはある法則で「変貌」する・・・。

**「バシ!」「ズブ!」「ブォグ!」**

そう、濁点をつけると、完全に **打撃音** なのだ。

#作ったもの

↓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

元記事を表示

OTHERカテゴリの最新記事