- 1. Go によるsessionの処理
- 2. 【2024】Go言語おすすめライブラリ15選
- 3. Go の開発環境構築(Mac)
- 4. 【個人開発】草生えてないと怒ってくれるBOTを作った
- 5. WidowsやLinuxでGoCVを使用したGOプログラムをstatic buildしたい話
- 6. GoのContextをわかりやすく解説したい
- 7. Go環境構築
- 8. 【即席】自分だけのAI公式ラインbotを作ろう
- 9. Avroスキーマを使ってCloud Pub/Subを使用する
- 10. クリーンアーキテクチャについて考える 自動生成編
- 11. GoとテストとインプロセスDB(GoCon mini 2023 in KYOTO)
- 12. [Golang]JWTを実装してみる
- 13. Goで機密情報の出力を簡単マスキング
- 14. Goのgorilla/sessionsでセッションIDが自動で振られない問題を解決した
- 15. 強化学習入門を果たした際の備忘録
- 16. GoとReactによるWebSocket通信でルームID付きのチャットルームを作る
- 17. goroutineをわかりやすく解説したい
- 18. [Golang]Googleログインを実装してみる
- 19. クリーンアーキテクチャについて考える DI編
- 20. [Golang]Lambda+APIGatewayでミドルウェアを作るには?
Go によるsessionの処理
## はじめに
Goでのsessionの扱いについてわかりやすく説明することを目標に記事を書きました。## そもそもsessionとは?
・DBではなくサーバーに保存される情報で、容量はサーバーの容量に依存する。
・key,valueを設定して好きな値を保存できる。
・sessionに保存されるid でクライアントのcookieと結びつく。
・ログイン後はログアウトするまで基本的に消さないデータ。有効期限を設定しているなら、それを超えたら消える。## Goでのsessionの扱い
sessionを保存するのに便利なパッケージのgorilla sessionを使用してsessionの扱いを紹介します。
https://github.com/gorilla/sessionsまずsessionを保存するためのstoreを作成します。
“`
var cs *sessions.CookieStore = sessions.NewCookieStore([]byte(“secret-key-xxxxx”))
“`
ここの引数の[]byte(“secret-key-xxxxx”) は
【2024】Go言語おすすめライブラリ15選
# Go言語ライブラリ15選
Golangのおすすめのライブラリを**15個**(+おまけ1個)紹介します。ライブラリの特徴、インストール方法、使い方を徹底解説していきます。
## [cmp](https://pkg.go.dev/github.com/google/go-cmp/cmp)
テストで等価性を調べるために使うライブラリ。`reflect.DeepEqual`ははオブジェクトが完全一致していないと *false* になるが、**cmp** を使うとスライスの順番を無視できたり、一部のフィールドを比較対象から除外したり、様々なオプションを追加することができる。また、`diff`で差分を出すこともできる。
“`go:main.go
package mainimport (
“fmt”
“reflect”“github.com/google/go-cmp/cmp”
“github.com/google/go-cmp/cmp/cmpopts”
)func main() {
slice1 := []int{1, 2, 3}
slice2 := []
Go の開発環境構築(Mac)
## 手順
Go の開発環境構築を Mac で行う場合は、Homebrew を使い、下記のコマンドでインストールできます。
“`
$ brew install go
“`下記のコマンドでバージョンが表示されれば、インストール完了です。
“`
$ go version
go version go1.21.5 darwin/amd64
“`## 注意点
brew install コマンドを実行してもターミナルに何も表示されない、もしくは下記が表示される場合は、Homebrew の更新に時間がかかっているため、しばらく待つ必要があります。
“`
Updating Homebrew…
“`また、下記のエラーが出る場合は、Frameworks フォルダに書き込み権限が無いため、ターミナルに表示された `sudo chown -R [user name] /usr/local/Frameworks` コマンドで、フォルダのオーナーを変更する必要があります。
“`
Error: The following directories are not writable by
【個人開発】草生えてないと怒ってくれるBOTを作った
明けましておめでとうございます。
新年早々少し個人で開発したのでそのアウトプットとして投稿させていただきます。
全てのツールを無料枠で抑えて作ることができるので、個人で開発してデプロイまでしてみたいと思っている人に参考になれば良いなと思います。
## 作ったもの
草(commit)がされていない場合にはその日の夕方に通知を送ってくれるLineのBOTを作りました。
**Githubリンク**
https://github.com/yuta-2001/go-no-commit-notify
## 作成動機
– 新たな年が始まって、より成長できる年にしたく継続を促せるようなものを作りたかった。
– これまで触れていないものを使って何か作ろう、自分の技術の幅を広げようと思ったから。(Goも含めて全て開発で使ったことはなかったです。)## 使用技術・構成
– AWS Event Bridge (cron)
– AWS Lambda
– Line Notify
– Github GraphQL
– Golang(コンテナ化(Docker)は図に乗っていますが、現在進行
WidowsやLinuxでGoCVを使用したGOプログラムをstatic buildしたい話
# 背景
自分の開発PC(Windows)上でGoCVを使ったプログラムを書いて「よっしゃ!ビルドして`.exe`を作って、他のWindowsユーザにも配布や!」と思ったとき、うまくいかなくてハマりました。
# 現象
開発PCには下記の記事の作業手順に従って環境構築を行いました。
https://qiita.com/Nekonun
ビルド対象のGoのプログラム(プログラム中でGoCVを使用している)があるフォルダで下記コマンドでビルドすると、同じフォルダ内に`.exe`ファイルが出力されます。
“`
> go build .
“`ここで生成された`.exe`ファイルをそのまま他のWindows環境 (GoCVの環境未構築) に配布してその上で実行しても、途中でエラーが発生してアプリケーションが落ちます。具体的には **GoCVを使用した処理が走った時点で落ちます**。
## 理由
どうやら下記の二つが原因だったようです.
– OpenCVのビルド時に静的ライブラリ(.a)ではなく動的ライブラリ(.so)を生成してしまっていたこと
– goプログラムのビルド
GoのContextをわかりやすく解説したい
## はじめに
Goのcontextついてわかりやすく説明することを目標に記事を書きました。## 要点
・contextはAPIの境界を越えて、デッドライン、キャンセルシグナル、その他の値を運ぶ。
・Goにおいてはcontextを使用せずにキャンセル内容を知る術がない。
・contextはReactのpropsに近い存在で、contextは子で変更して親に返すということはできない。(CancelFuncの型の値は引数に渡せる)## そもそもContextとは?
Goのhttp.Request型の中身を見てみると、下記のプロパティが存在します
“`
ctx context.Context
“`
context.Contextの説明文を見てみると
>A Context carries a deadline, a cancellation signal, and other values across API boundaries.
Context’s methods may be called by multiple goroutines simultaneously.ま
Go環境構築
golangの環境構築方法をメモに残します。
## Goコンテナ作成
goenvを使ってバージョンを指定します。
バージョンは1.16.4です。“`terminal
goenv install 1.16.4
“`“`terminal
goenv local 1.16.4
“`## DBコンテナ作成
golangのコンテナを作成します。
またdocker-compose up時にmain.goが実行されるようにします。“`yaml
version: ‘3’
services:
app:
image: golang:latest
volumes:
– ./app:/app
working_dir: /app
ports:
– “8081:8080”
command: go run main.go
“`## db container
次にDBのコンテナを作成します。
DBにはmysqlを使いました。“`yaml
db:
image: mysql:latest
conta
【即席】自分だけのAI公式ラインbotを作ろう
**「自分がカスタマイズしたAIが応答してくれるラインBot(LINE公式アカウント)があったら面白いのではないか?」**
そんな思いがふと頭をよぎったので実行に移してみました。丁度、個人的に下記のような背景があったこともあり、年末年始の暇な時間に作業するモチベーションが大きかったというのもあります。
– 個人的に秘書AIボットにラインでマネジメントしてもらえると便利かな、と思っていた
– 最近Go言語に興味をもっていたので何かを作りながらGoに慣れたかった
– 会社のプロダクトでLine Messaging APIを扱いはじめたので、それに慣れたかった一番目の理由について少しだけ詳しく話しておきましょう。
私は山の手線で通勤しているのですが、先日いざ出勤しようとしたときに山の手線が運休していて困ったことがありました。
「こんな時に、マネージャー的な何かが自分に『今日は山の手線遅れてますよ』と教えてくれたらな〜」とその時思いました。
勿論「山手線が遅延しているかどうか」という情報自体はJRのサイトを見ればすぐ分かりますが、家を出る前に毎日わざわざ調べるのは現実的でない気
Avroスキーマを使ってCloud Pub/Subを使用する
## はじめに
この記事は [GCP(Google Cloud Platform) Advent Calendar 2023](https://qiita.com/advent-calendar/2023/gcp) 8日目の記事です。
メッセージキューを用いた非同期処理において、パブリッシャーが誤ったメッセージスキーマを用いている場合でも、**サブスクライバからパブリッシャーへのエラー通知が難しい**という問題があります。
**スキーマを事前定義可能なApache Avroを利用しCloud Pub/Subトピックを構成することで、スキーマと異なったメッセージがパブリッシュされた際パブリッシャーへエラーを通知する**ことが出来ます。
本記事では実際にGolangのコードでPub/Subへメッセージを送受信しスキーマ検証の効果について検証します。
また、Avroには**メッセージをシリアライズすることでサイズを圧縮可能**という魅力があります。圧縮効果に関しても効果を検証します。## Cloud Pub/Subとは
Google Cloud マネージドな非同期メッセージング
クリーンアーキテクチャについて考える 自動生成編
## 目的
フレームワークにEchoを使いながら、クリーンアーキテクチャの実現を簡易的に目指すためにdigを使った依存性逆転まで実現させる方法まで考えた。しかし、単純に開発者が守るべきルールとしては決まった作業が多く感じる。
そこで、Golangには自動生成する文化があるのでデフォルトの部分は自動生成して開発者が実装部分に注力しやすい環境を用意する。## 実現に向けて
今回はあくまでも自動生成にのみできることを目指す。作成済みのファイルをコマンド1つで修正できるといったことは目指さない。
自動生成は[Jennifer](https://github.com/dave/jennifer)を使います。
また、作成にあたりdigの取りまわしも考えます。なぜ考えるのかは自動生成で作成したあとの取りまわしをよくするためです。詳細は後述させていただきます。## Jennifer
### 採用の経緯
JenniferはGolangのための自動生成モジュールになります。
そもそもGolangにはgo generateという自動生成コマンドが存在しています。
生成コードの管理が大変そう
GoとテストとインプロセスDB(GoCon mini 2023 in KYOTO)
去る12月2日に京都で開催されたGo Conference mini 2023 Winter IN KYOTOにて、 「GoとテストとインプロセスDB」という発表(LT)をしてきました。
https://makiuchi-d.github.io/2023/12/31/goconmini2023-in-process-db.ja.html
[Golang]JWTを実装してみる
## 必要なライブラリ
“`
go get github.com/dgrijalva/jwt-go
“`## 色々な動作確認
“`golang
package mainimport (
“fmt”
“time”“github.com/dgrijalva/jwt-go”
)func CreateToken(secretKey string) (string, error) {
claims := jwt.MapClaims{}
claims[“authorized”] = true
claims[“user_id”] = “sample”
claims[“exp”] = time.Now().Add(time.Second * 2).Unix() // 有効期限を1時間に設定token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return token.SignedString([]byte(secretKey))
}func ValidateToken(tokenStri
Goで機密情報の出力を簡単マスキング
突然ですが、コーディングをする時にマスキングしていますか?
本番運用の際、機密情報がログへ出力されてしまい、内容を知る必要のない人に知れ渡ってしまう…なんてことが無いように
情報漏えいのリスクは最小限に抑えたいところです。
この記事では、Goの`fmtパッケージ`の下記インタフェースを満たすことで、機密情報がログへ出力されることを防止する方法を紹介します。“`go
// %#v の時に使用される
type GoStringer interface {
GoString() string
}// %#v を除く、いかなる時にも使用される
type Stringer interface {
String() string
}
“`実際のコードは以下のようになります。
サンプルでマイナンバーを機密情報に見立ててみました。“`go:main.go
package mainimport (
“encoding/json”
“fmt”
)type User struct {
ID int
Username string
MyNumber
Goのgorilla/sessionsでセッションIDが自動で振られない問題を解決した
# はじめに
## 問題の背景
わたしはGo言語の初心者で、ソフトウェアエンジニアではあるが、非Web系のエンジニアであり、転職のためにGo言語でのバックエンド実装を勉強している。
サービスの開発の勉強で、ログイン状態管理のためのセッション管理の実装をおこなうところタイトルのような問題に遭遇した。## 検証結果
結論を最初にいうと、gorilla/sessionsではセッション生成時にSession.IDを自動で振られるはずだが、どうしてもIDが空になるため、プログラムで手動でIDを割り当てるようにした。試したコードは[gorilla/sessions GitHubページ](https://github.com/gorilla/sessions)の公式サンプルを再現した。こちらはセッションIDの生成と代入部分のみ
“`go
if session.ID == “” {
// Generate a random session ID key suitable for storage in the DB
session.ID = string(securecooki
強化学習入門を果たした際の備忘録
## 概要
そこそこ長くデータサイエンティストとして働いてきたけど避けてきた(触れる機会がなかった?)強化学習にようやっと入門したので自分の取ったスタディパスと概要を残しておく。これから強化学習に入門する人の参考になるかも?## お前誰?
ブラジルでデータサイエンティスト/機械学習エンジニアとして働いています。## 強化学習
教師あり、教師なしと並んでデータサイエンスの一大分野。色々なところで名前は聞くけれど、個人的には『ゲームくらいでしか使わなくね?』と思っていてキャリアの構築によっては正直ノータッチでも行けると思ってる。勉強コストの割に使う頻度が著しく少なそうなのでこれまでは完全にノータッチだった。## どこまで行った?
数式を追って、自分で書いておおよそ理解したつもりになってるのは以下のもの
* DP
* MC
* TD
* on/off policy
* SARSA
* DQN
* REINFORCE
* Actor-Critic
* etc..## 所感
入門してみての感想は『数学で押せる』だった。そんなに多くない数の式とその周辺の式を理解してコードに落とし込
GoとReactによるWebSocket通信でルームID付きのチャットルームを作る
# はじめに
ブラウザゲームでよくある、合言葉を入力して部屋に入室するタイプのルームの作り方が気になったので、とりあえず簡単なルームID付きのチャットルームを作ってみました。リポジトリはこちら
https://github.com/empelt/websocket-sample
# 実装
まず、最終的なディレクトリ構成は以下のようになっています。
“`
websocket
├── client
| ├── src
| | ├── types
| | | └── Message.ts
| | ├── App.tsx
| | ├── Home.tsx
| | ├── main.tsx
| | ├── Room.tsx
| | └── index.html
| ├── …
| └── package.json
|
└── server
├── cl
goroutineをわかりやすく解説したい
## はじめに
Goのgoroutineついてわかりやすく説明することを目標に記事を書きました。## 要点
・goの並行処理goroutineの実装は至って簡単で、並行処理させたい関数の前に go をつけるだけ。
・並行処理はメインスレッドとは異なるスレッドで同時に実行する。メインスレッドが終了したら実行中のgoroutineも強制終了
・goroutineを必ず実行させたいなら、WaitGroupなどの機能を利用しよう。## 実際にコードを見てみよう
“`
package mainimport (
“fmt”
“time”
)func rush(shout string) {
for i := 0; i < 4; i++ { fmt.Println(shout) time.Sleep(time.Second) } } func main() { go rush("無駄") rush("オラ") } ``` これで上のコードを実行すると、下の結果になります。 ``` オラ 無駄 無
[Golang]Googleログインを実装してみる
Golangのシンプルさと強力な機能を組み合わせて、Googleログインを実装する方法を学びます。このガイドでは、コード例と実践的なアドバイスを通じて、認証プロセスの設計と実装のコツを掴んでいきます。初心者でも理解しやすいように、基本的な原則から始めます。
## Googleログインの仕組み
Googleに限らず、多くのシングルサインオンは以下のようになっています。
1. GoogleアカウントにログインするページにコールバックするURLを踏めてリダイレクトする
2. ログインする
3. codeのクエリーパラメータとともにコールバック用のページに飛ぶ
4. codeをClientIDとClientSecretを使ってアクセストークンを取得する
5. Userテーブルを必要に応じて作成
6. JWTを作成して必要な情報含めてフロントに返す今回はGoogleログインができることさえ確認が出来れば良いの4までを実装する
## 必要なライブラリをインストール
“`
go get golang.org/x/oauth2
go get golang.org/x/oauth2/g
クリーンアーキテクチャについて考える DI編
## 目的
GolangのAPIのみのバックエンドプログラムを考えるときのクリーンアーキテクチャ実現のための依存性の注入をdigを使って実現する。
## 要約
クリーンアーキテクチャの実現において依存性の注入は必須になる。
Golangにおいて依存性の注入には有名な手法として[wire](https://github.com/google/wire)がある。
とても有名な手段であるのだが、現在更新が止まっている(最終が2021年)。
使っている状態であったとしてもこれだけ更新が止まってしまっていると継続利用に躊躇するレベルだと思っている。
今回は、[dig](https://github.com/uber-go/dig)を使って依存性の注入を行います。## digのメリットとデメリット
digはDIコンテナを提供するモジュールとなっており、コンストラクタをコンテナに登録することで必要なインスタンスを提供します。
メリットとしては、引数などの情報なしにコンストラクタを登録するのみなので依存関係の解決が柔軟になっています。
デメリットとしては、暗黙的に依存関係を解決しようとする
[Golang]Lambda+APIGatewayでミドルウェアを作るには?
ここ最近はあまりAPIGateway+LambdaのRestAPIを作ることはありませんでしたが昨年からGolangに仕事の言語が切り替わったこともあり、改めて作ってみることにしました。
そこで今回はミドルウェアを作ります。
ECSなどでやるのであればGinなどのWebフレームワークのミドルウェアを作れば良いのですが今回はそうはいかないので自分で作って見ます。
## なぜミドルウェアを作るのか?
Lamdbaに限らず、Webアプリではほぼ全てのAPIに使う共通的な処理があります。
例えばハンドラーのところの実行前に認証をしたり、入口と出口のロギングなどですね。
他の開発同様に共通処理の部分を作れるように2つのミドルウェアを用意します。
## 固定の共通処理の場合
速度測定のロギングなどやエラーハンドリング、認証で使うことが多いです。
“`golang
func middleware(next func(context.Context, events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, er