- 1. GORMのアソシエーションの自動更新で削除した関連が復活していた
- 2. ソースコードgrep地獄を助けるSourceGraph
- 3. M1 Mac において Go のリモートデバッグができない問題を解決し原因を考察した
- 4. 2022年の振り返り
- 5. gocsvですべてのセルをダブルクォーテーションで囲む
- 6. Amazon EventBridge API Destinationを使って外部API呼び出しを非同期的かつレートリミット内に収まるように行う(Slackで実装)
- 7. go にも decltype が欲しいよ、と思った話。
- 8. GoのDependency Injectionライブラリ(uber-go/dig, google/wire)を調査した話
- 9. Go言語をつかった Lambda関数の開発をもっと楽にしたい〜Codespacesを添えて〜
- 10. Go の Workspace を試す
- 11. 超初心者ワイ「Goルーチンが動かせない!ムキ! 」
- 12. GoでAPIのCRUDをつくりたい
- 13. Gomockはじめてみませんか
- 14. 最近読んだGo言語の本の紹介:100 Go Mistakes and How to Avoid Them
- 15. grpcurl をコードリーディング
- 16. Gormのバージョンアップ対応の詳細
- 17. Goでの日付比較チートシート
- 18. 効率的にツイッターから求人を探すサービスを開発
- 19. Golangでバッチとgoroutinesとgo channelsと比較してみましょ
- 20. Strategyパターンから理解するGo言語のinterface
GORMのアソシエーションの自動更新で削除した関連が復活していた
# 起きたこと
GORM(v1.9.16)を使っていて、アソシエーションの削除がうまくいかなかったときにハマったのでその時の調査メモです。
Productモデルと、そこに紐づくShopモデルを並行して更新するようなプログラムを作成していました。“`go:main.go
package mainimport (
“github.com/my-best/products.my-best.com/go/internal/models”
“golang.org/x/sync/errgroup”
)func main() error {
var product models.Product
eg := errgroup.Group{}
eg.Go(func() error { return updateProduct(&product) })
eg.Go(func() error { return updateProductShop(&product})
// 略
}
“``updateProductShop`の内部では不要になっ
ソースコードgrep地獄を助けるSourceGraph
# はじめに
コードを書いている時間と比較して、コードを「理解している」時間はどれくらいかかるのでしょうか?
[Software社が自社サービスのユーザ約25万人から集計した結果](https://www.software.com/reports/code-time-report)からは、以下のようになっていました。
* **コードを書いている時間:56%** (1日あたり平均52分)
* **コードを「理解している」時間:44%** (1日あたり平均41分)コードを「理解している」時間はコードを書いている時間に匹敵するほどになっていることがわかります。
このコードを「理解している」時間は、具体的には次のようなものがあります。
* コードを表示して「読んでいる」時間
* プルリクのレビューをしている時間
* コードの理解のためにドキュメントを読んでいる時間今回は上記のうち**コードを表示して「読んでいる」時間**を効率化できないか考えてみます。
# コードを「読んでいる」時間について
コードを「読んでいる」時間のよくあるケースとして、コード変更前の下調べ作業があります。
以降
M1 Mac において Go のリモートデバッグができない問題を解決し原因を考察した
本記事は HRBrain Advent Calendar 2022 の25日目の記事です。
https://qiita.com/advent-calendar/2022/hrbrain
# はじめに
こんにちは。今年の11月から HRBrain のエンジニアとして働いている清水です。
本記事では、特定のプロダクトの開発環境で起こっていた、M1 Mac において Go のリモートデバッグができない問題を解決し原因を考察しました。### 対象読者
– M1 Mac において Go のリモートデバッグができない方
– Go のデバッグや Tilt について理解を深めたい方上記のような方に読んでいただけると嬉しいです!
### 開発環境
– macOS 12.6
– チップ Apple M1
– Go 1.18.4
– Tilt 0.30.10
– Docker 4.13.1HRBrain では [Tilt](https://tilt.dev/) を使って、マイクロサービスをローカルの開発環境に構築しています。
開発環境や Tilt の詳細については、弊社のテックブログ
2022年の振り返り
この記事は筆者の[ソロ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/panda) 25日目の記事です。最後の記事になりますので2022年の振り返り的なものをして本年を締めようかと思います。
:::note warn
本記事は筆者が思ったことを雑に書き連ねるポエムです。間違ったこととかそれおかしいやろみたいなことがあるかもしれませんがその際はコメントください。
:::# 2022年開始時のスキル感
一応今年始まったくらいでのスキルセット的なものを箇条書き
– Java(母国語) 1年半くらいSpringで開発してた
– Ruby ポートフォリオ作るのに書いてたけどもはや書けないレベル
– JavaScript Springで管理画面全部作る時のJQueryとReactも書いてたけど2022年時点ではだいぶ古い書き方してたと思う。つまりほぼ素人
– AWS 管理画面ポチポチ。RDS, EC2, lambda, S3あたりを触ったことある程度。つまり雰囲気# 2022年触ってきた技術
## Kotli
gocsvですべてのセルをダブルクォーテーションで囲む
# 概要
gocsvで生成するCSVのすべてのセルをダブルクォーテーションで囲みたかった。
[ネットで見つけた記事](https://qiita.com/developer-kikikaikai/items/af278f52cb06cc0f430d)とは別パターンの実装をしてみた。# 実装
## 方針
ネットで見つけた記事では、生成したCSVをデコードして、各セルをダブルクォーテーションで囲った後、もう一度エンコードしている。自分は、以下の方法で実装してみた。
gocsvでは、デフォルトでは内部でencoding/csvのWriter構造体を使用している。そこで、
1. gocsvのCSVWriterインターフェイスを実装する構造体を作成する
2. ↑で作成した構造体に、encoding/csvのWriterの実装を参考に、すべてのセルをダブルクォーテーションで囲むWriteメソッドを生やす
3. ↑をgocsvのMarshalCSVメソッドに渡す### [gocsvのCSVWriterインターフェイス](https://github.com/gocarina/gocsv
Amazon EventBridge API Destinationを使って外部API呼び出しを非同期的かつレートリミット内に収まるように行う(Slackで実装)
この記事は[PTAのアドベントカレンダー](https://adventar.org/calendars/7539)24日目の記事です。
# 概要
– [EventBridgeのAPI Destination](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-api-destinations.html)という機能を使うと、外部API呼び出しを非同期的に実行できる。
– APIのレートリミット内に収まるように自動的に調整してくれる。
– SlackのAPIで実験してみました。# EventBridge API Destinationとは
EventBridge API Destinationは、EventBridgeのターゲットにHTTP APIの呼び出しを指定できる機能です。以下の特徴があります。
1. 自動リトライ
1. DLQにも対応
1. 3種類の認証方式に対応
1. APIのレートリミット内に収まるように自動的に調整# 実装
## 全体像今回は実験のために以下を実装します。
<
go にも decltype が欲しいよ、と思った話。
# これは何?
go を書いていて、初めて decltype ほしいよと真剣に思ったので、その記録。
decltype ってのは、C++ にある言語要素で、式からその式の型を得る機能。
“`c++:c++
using usec_t = decltype (timeval{}.tv_usec);
“`のようにすると、`usec_t` を 構造体 `timeval` のメンバ `tv_usec` の型にすることができる。便利。
# ほしいよと思った経緯。
そして。
https://qiita.com/advent-calendar/2022/go
にも参加しています。
## `unix.Timeval` を使いたい
go で `unix.Timeval` を使おうと思った。
まあ使おうと思った時点で負けという気もちょっとするけど、まあ使おうと思った。`float64` の値をゴニョゴニョして作った値で `unix.Timeval` を初期化したい。
`unix.Timeval` は、 `Sec` と `Usec` というメンバを持っていてこれに値を入れたい。
GoのDependency Injectionライブラリ(uber-go/dig, google/wire)を調査した話
# はじめに
普段Java、Spring Frameworkを使って開発していると、Goで開発する場合の依存解決には苦労することがあるように思います。
Dependency Injection(以下DI)をやるとして、階層の深い依存関係のある構造体を初期化しようとすると、あれもこれもとコンストラクタを呼ぶことになります。また、往々にしてそういった構造体は1つではないので、どでかい初期化処理が生まれることになります。
そこで、本記事では、GoにいくつかあるDependency Injectionをサポートするライブラリについて調べていきます。
## Goの依存解決の課題は何か
作成するアプリケーションや、開発体制が大きくなればなるほど、以下のような課題が出てきます。
1. コンストラクタをたくさん呼び出して、やっとこさ初期化できるインスタンス
2. 初期化の定義が大集合しがち。複数人が同じファイルをあれやこれやと編集することになる。
3. 構造体が実装しているインタフェースを明示的に記載しないので、後から読むと困る場合が多い。# DIライブラリを調べる
2022/12/
Go言語をつかった Lambda関数の開発をもっと楽にしたい〜Codespacesを添えて〜
メリークリスマス!
この記事は[朝日新聞社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/asahi)の24日目の記事です。## TL;DR
Dockerコンテナ上で RIE と air つかってサクサク開発環境を作りましょう
サンプルは https://github.com/duck8823/sample-lambda にあります。
[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new?hide_repo_select=true&ref=main&repo=581006091)## 今回の開発スタイル
こんな感じで開発するとしましょう。– スキーマをOpenAPIで管理したい
– Go でLambda関数を書きたい
– curl で動作確認したい
– ホットリロードほしい
– スキーマから生成されたクライアントを試したい## Lambda
Go の Workspace を試す
## はじめに
本記事は [株式会社 RetailAI X Advent Calendar 2022](https://qiita.com/advent-calendar/2022/retail-ai-x) の24日目の記事です。
昨日の記事は @takaomag さんの [threadと一貫性とAtomic](https://qiita.com/takaomag/items/cbf8301709024e6073fa) でした。
まだ見られていない方は是非ご確認を!## 何に関する記事か
Go 言語の Workspace について書いていきます。
この機能は Go 1.18 から導入されており、リリースされた2022年3月から正式に利用できています。
([こちらのリリースノート](https://go.dev/doc/go1.18#go-work) に載ってます)
ただ、同じタイミングで Generics や Fuzzing がリリースされており、
さほど調べずにここまできてしまったので、この機会にまとめてみます。
以下の内容は Go の基礎を知っていることが前提となっています。
超初心者ワイ「Goルーチンが動かせない!ムキ! 」
## 概要
当方Goを先日書き始めたもので超初心者です.そんな私がGoルーチンを使おうと思ったけど使えなかった内容を書きます.
## 該当のソースコード
“`go
package mainimport (
“fmt”
)func hi() {
fmt.Println(“hi”)
}func hello() {
fmt.Println(“hello”)}
func main() {
go hi()
go hello()
}
“`このコード,実行しても何も起きないんですよ.これがなぜなのか分からなくて頭を悩ませていました.
そしてなぜか他の人のコードは動く… うーん.なぜだ…
“`go
package mainimport (
“fmt”
“time”
)func main() {
fmt.Println(“main”)
go hoge() //goroutine
time.Sleep(time.Second)
}func hoge() {
fmt.Println(“hoge”)
}
“`https://
GoでAPIのCRUDをつくりたい
# はじめに
メリークリスマス!
クリーンアーキテクチャというものを参考にしつつ、簡単なAPIのCRUDを作成しました。
自分の理解を整理するためと今後も引き続いてAPIを作成していくことを踏まえ、簡単にまとめてみました。開発環境の構築は以前に出しているのでそちらを参考にしてください。
https://qiita.com/does_not_exist/items/b79b3fd51ea6ef39df23
## ディレクトリ構成
“`
go/src
┣ controller
┃ ┗ post_controller.go
┣ db
┃ ┗ db.go
┣ models
┃ ┗ post.go
┣ server
┃ ┗ server.go
┣ service
┃ ┗ post.go
┣ go.mod
┣ go.sum
┣ main.go
“`
# PostmanでAPIにリクエストを送る## GET(read)
最初はPostテーブルが空であることを確認します![l_9007702_170_6dc288d243da5280df3c7f8da1a3a2ed.p
Gomockはじめてみませんか
みなさんは、handlerやapplicationのテストをする際にモックをどうしていますか??
私は自作モックを使うこともありますが、Gomockを愛用しています!
Gomockは、たくさん記事がありますが私なりの使い方を共有できればと思います:tea:
導入を検討しているかたの参考になればと思います。# 前提
– Go v1.19.3
– github.com/golang/mock@v1.6.0
– github.com/golang/mock/mockgen
– github.com/labstack/echo@v4.9.1# サンプルコード
https://github.com/sgash708/gomock_qiita
# 使い方
`mockgen`をとおしてinterfaceを含んだファイル作成したら、あとはテストで自由に使うだけです。## 導入
“`bash
$ go install github.com/golang/mock/mockgen@latest
“`https://github.com/golang/mock
最近読んだGo言語の本の紹介:100 Go Mistakes and How to Avoid Them
これは、[Money Forward Engineering 2 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/moneyforward) 23日目の記事です。
最近読んだGoの本について感想と紹介を書きたいと思います
# 100 Go Mistakes and How to Avoid Them
読んだ本
https://www.manning.com/books/100-go-mistakes-and-how-to-avoid-them英語の本です
Amazonだと電子
grpcurl をコードリーディング
こんにちは、しゅん([@MxShun](https://twitter.com/MxShun))です。
今年11月にサイバーエージェントに中途入社、AI事業本部オペレーションテクノロジーに仲間入りしました。<宣伝>
? 同じく本日投稿の、CyberAgent Advent Calendar 2022「[私がやった Amazon S3 コストカット全ステップ](https://developers.cyberagent.co.jp/blog/archives/38950/)」よければご覧ください!
? 社内の方は、*#times_mxshun* よければ覗いてあげてください!\宣伝>
# grpcurl
gRPC 界隈では言わずと知れた、gRPC サーバに対して cURL できるコマンドラインツールです。> grpcurl is a command-line tool that lets you interact with gRPC servers. It’s basically curl for gRPC servers.
https://github.com/f
Gormのバージョンアップ対応の詳細
[クラウドワークス Advent Calendar 2022](https://qiita.com/advent-calendar/2022/crowdworks)の23日目です!
以前、クラウドワークスエンジニアブログで「**[Gormのv1からv2へバージョンアップした話](https://engineer.crowdworks.jp/entry/2022/11/14/194848)**」という記事を投稿させていただきました。
そちらの記事ではバージョンアップ対応時の施策の進め方について書かせていただきました。
今回は実装面でどのように修正していったかについて実際のサンプルコードも交えてご紹介させていただきます!!
# Defaultタグの挙動について
v2になりdefaultタグの挙動が変更されています。
v1ではデータベースのdefault値を利用するような動きになっていたのが、v2になりタグの値を正として動作するように変更されています。
どういう動きになるか具体的に紹介します。
まず下記のようなテーブルを用意しました。
age, memo, hogeにそれぞ
Goでの日付比較チートシート
# 概要
Goで日時を司る型はtime.Timeでナノ秒まで適用される。
このtime.Timeには比較演算子の`==`, `<`, `>`が使えず[After](https://pkg.go.dev/time#Time.After), [Before](https://pkg.go.dev/time#Time.Before), [Equal](https://pkg.go.dev/time#Time.Equal)メソッドを使って比較する必要がある。# チートシート
| 時間の関係 | 記述 | 返値 |
| —- | —- | —- |
| a > b | a.After(b) | true |
| a > b | a.Equal(b) | false |
| a > b | a.Before(b) | false |
| a = b | a.After(b) | false |
| a = b | a.Equal(b) | true |
| a = b | a.Before(b) | false |
|
効率的にツイッターから求人を探すサービスを開発
# はじめに
本記事は [個人開発 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/individual-developers) カレンダー2 の 23 日目の記事です。
本記事では [Twitter API](https://developer.twitter.com/en/docs/twitter-api) を使ってwebサービスをリリースした経緯や技術スタックなどをまとめています。# 出来上がったもの
集中してTwitterで仕事探しができる検索サービスを作りました[ツイジョブサーチ(https://twijob.spotstudy.net/)](https://twijob.spotstudy.net/)
※ブラウザによってSSLのエラーが表示するかもしれません![ツイジョブサーチ](https://twijob.spotstudy.net/img/twitter_ogp.png)
![ツイジョブサーチ](https://qiita-image-store.s3.ap-northea
Golangでバッチとgoroutinesとgo channelsと比較してみましょ
## はじめに
初めまして。HRBrainでソフトウェアエンジニアをしているビクトルと申します。
この記事はHRBrain Advent Calendar 2022カレンダー1の23日目の記事です。
https://qiita.com/advent-calendar/2022/hrbrain
今年の4月にスペインから日本へ引っ越しまして、はじめてアドベントカレンダーをやっていきます!
私はバックエンドとDevOpsが好きなのでGolangのgoroutinesとgo channelsのパーフォマンスについてお話したいと思っています。
比較する方法にGrafanaとPrometheusを使いたいと思っています。
https://github.com/ervitis/golang-performance
まず、簡単でchannelsとgoroutinesを紹介しています。
### channelsとは
[channels](https://golangdocs.com/channels-in-golang)はバッファーと同じ仕方をしています。channelを作成方法はこ
Strategyパターンから理解するGo言語のinterface
この記事は [Go Advent Calendar 2022](https://qiita.com/advent-calendar/2022/go) 23日目の記事です。
# はじめに
Go言語はJavaなどのオブジェクト指向のように明示的な継承関係がない分、interfaceをうまく使いこなせるかがカギになってくるように個人的に感じます。
そのinterfaceの使い方は、オブジェクト指向におけるStrategyパターンが参考になるよ、という話をしようと思います。
読者としてはGoに入門したばかりの初学者を想定しています。# Strategyパターン
Strategyパターンは「GoFのデザインパターン」のなかで紹介されている、クラスやインタフェースの使い方に関する設計パターンです。## 図式
Strategyパターンの説明については、[結城浩『Java言語で学ぶデザインパターン入門 第3版』](https://www.hyuki.com/dp/)に詳しいのでそのまま引用します。> strategyというのは、「戦略」という意味です。敵をやっつけるときの作戦、軍隊を動