- 1. 【即席】自分だけのAI公式ラインbotを作ろう
- 2. Avroスキーマを使ってCloud Pub/Subを使用する
- 3. クリーンアーキテクチャについて考える 自動生成編
- 4. GoとテストとインプロセスDB(GoCon mini 2023 in KYOTO)
- 5. [Golang]JWTを実装してみる
- 6. Goで機密情報の出力を簡単マスキング
- 7. Goのgorilla/sessionsでセッションIDが自動で振られない問題を解決した
- 8. 強化学習入門を果たした際の備忘録
- 9. GoとReactによるWebSocket通信でルームID付きのチャットルームを作る
- 10. goroutineをわかりやすく解説したい
- 11. [Golang]Googleログインを実装してみる
- 12. クリーンアーキテクチャについて考える DI編
- 13. [Golang]Lambda+APIGatewayでミドルウェアを作るには?
- 14. 爆速でGo言語の変数を説明する
- 15. Goのinterfaceをわかりやすく説明したい
- 16. JSON Web Tokens で GridDB REST API を保護する
- 17. Goで学ぶGraphQLサーバーサイド(12)ーGraphQLサーバーから返却されるエラーメッセージ
- 18. Go で Kong Gateway カスタムプラグインを作成する
- 19. go install時にis not in stdエラー
- 20. terminalでChatGPTを使いたい
【即席】自分だけの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
爆速でGo言語の変数を説明する
# はじめに
皆さんGo言語書いてますか?
私も最近Go言語を書き始めました。せっかく学習しているので、私が理解できたところは記事として残そうと思います。
今回はGoの変数についてです。※作成者はこの記事を爆速(2時間くらい)で作ったため、誤字脱字があると思います。ご了承ください。
※この記事では変数の全てを説明していないので、詳しく知りたい方は[公式ドキュメント](https://go.dev/doc/)をご覧ください。
# そもそもGo言語とは??
Go言語は、Googleによって開発されたプログラミング言語で、シンプルで効率的な設計が特徴です。Goは、コンパイル速度が速く、メモリ使用量が少ないため、大規模かつ分散したシステム向けの開発に適しています。また、静的型付けとガベージコレクションを組み合わせ、安全で信頼性の高いコードを容易に記述できるようになっています。Goは、シンプルな文法や強力な標準ライブラリなど、開発者が生産性を高めるための機能を提供しています。ってChatGPTが言ってます。
実際に書いてみて、コードをシンプルに書けると感じます。# [本題] G
Goのinterfaceをわかりやすく説明したい
## はじめに
何番煎じだという話ですが、Goのinterfaceついてどこよりもわかりやすく説明することを目標に記事を書きました。## 要点
### 1. インターフェースは特定のメソッドを持っている構造体をグループ化する仕組み
### 2. インターフェース内にメソッドを定義すると、同じインターフェースに属する構造体全てがインターフェース内のメソッドを使用可能## 実際にコードを見てみよう
下のコードを見てください。構造体GokuとKrikkinは両方ともメソッドのKamehamehaを使用できます。“`
package mainimport “fmt”
type Goku struct {
Power int
}func (g Goku) Kamehameha() {
str := fmt.Sprintf(“%d Kamehameha”, g.Power)
fmt.Println(str)
}type Krillin struct {
Power int
}func (k Krillin) Kamehameha()
JSON Web Tokens で GridDB REST API を保護する
これまでの記事で、GridDBと[Java][1]、[Node.js][2]、[Go][3]といった様々な技術を使ってREST APIを作る方法を取り上げてきました。また、以前簡単には触れることはありましたが、Webベースの認証でデータやエンドポイントを保護する方法について具体的な詳細には触れてきませんでした。
今回から2回に分けて、JSON Web Tokensとは何か、どのように実装するのか、GridDBのREST APIを保護するためにどのように利用するのかについて解説します。後編では、JSON Web Tokens を利用することで得られる詳細な情報を紹介します。記事が公開されたら、ぜひご覧ください。
この記事で紹介されている内容を実行するには、あなたのマシンにGoとGridDBとGridDB Go Connectorをインストールする必要があります。この記事のコードは、HTMLのテンプレートファイルを除き、すべてGoで記述します。
## 前提条件
上記で説明したように、以下のものが必要です。
* [GridDB サーバ (v5.3)][4]
* [Go v1
Goで学ぶGraphQLサーバーサイド(12)ーGraphQLサーバーから返却されるエラーメッセージ
こんにちは。
今回は「GraphQLサーバーから返却されるエラーメッセージ」について説明していきます。
# この章について
GraphQLサーバーからは、いつもリクエストに応じたデータが得られるとは限りません。
サーバー内でエラーが発生した場合や、そもそもリクエストが不正なものだった場合には、エラーメッセージという形でそれがクライアントに提示されます。
この章では、GraphQLがユーザーに返すエラーデータについて深く掘り下げていきたいと思います。# GraphQLが返すエラー
## エラーが持つフィールドGraphQLクライアントがサーバーから受け取るエラーの形式は、`github.com/vektah/gqlparser/v2/gqlerror`パッケージ内の`Error`構造体として定義されています。
“`graphql
type Error struct {
Message string `json:”message”`
Path ast.Path `json:”path,omi
Go で Kong Gateway カスタムプラグインを作成する
## この記事の目的
以下の記事で Kong Gateway の公式ドキュメントを読んで動作確認を行いました.
https://qiita.com/caunu-s/items/636aff1d04778fbbd779
こちらの記事では Kong Gateway のドキュメントから特にカスタムプラグイン作成について確認と検証をしてみます.
:::note info
こちらの記事を参考にして Kong Gateway (OSS) および Kong Gateway (Free) 用のカスタムプラグインを Go 言語を使って作成することができます.
::::::note warn
こちらの記事の動作確認は上記の記事による Kong Gateway 環境構築を前提としています.
:::## 動作確認環境
動作確認を行った環境情報を以下に示します.
| Name | Version |
|—-|—-|
| Windows 10 | 22H2 |
| Ubuntu (WSL2) | 20.04 LTS |
| Docker | 20.10.17 |
| Docker Co
go install時にis not in stdエラー
単純なミスに気が付かずにハマったので備忘録。
検証のためにGoのインストールやアンインストールを繰り返していたら下記エラーが出るようになった。“`zsh
$ go install golang.org/dl/go1.21.0@latest
../../go/pkg/mod/golang.org/dl@v0.0.0-20231219203010-00f4782d5d4c/internal/version/version.go:9:2: package archive/tar is not in std (/opt/homebrew/Cellar/go/1.21.5/src/archive/tar)
../../go/pkg/mod/golang.org/dl@v0.0.0-20231219203010-00f4782d5d4c/internal/version/version.go:10:2: package archive/zip is not in std (/opt/homebrew/Cellar/go/1.21.5/src/archive/zip)
../../go/pkg
terminalでChatGPTを使いたい
# GoでChatGPT
terminalから呼び出せるGPTクライアントをgolangで作成します。## main関数
“`go:main.go
package mainimport (
“bufio”
“fmt”
“os”“./gpt”
)func main() {
for {
fmt.Print(“> “)
scanner := bufio.NewScanner(os.Stdin)
if scanner.Scan() {
input := scanner.Text()
if input == “exit” {
fmt.Println(“exit!”)
break
}
gpt.Call(input)
}
}
}
“`exitと入力したら終了します。
“`go:gpt/call.go
package gptimport (
“bytes”
“encoding/json”
“fmt”
“io”
“log”
“net/http”
“os”“github.com/joh