- 1. 強化学習入門を果たした際の備忘録
- 2. GoとReactによるWebSocket通信でルームID付きのチャットルームを作る
- 3. goroutineをわかりやすく解説したい
- 4. [Golang]Googleログインを実装してみる
- 5. クリーンアーキテクチャについて考える DI編
- 6. [Golang]Lambda+APIGatewayでミドルウェアを作るには?
- 7. 爆速でGo言語の変数を説明する
- 8. Goのinterfaceをわかりやすく説明したい
- 9. JSON Web Tokens で GridDB REST API を保護する
- 10. Goで学ぶGraphQLサーバーサイド(12)ーGraphQLサーバーから返却されるエラーメッセージ
- 11. Go で Kong Gateway カスタムプラグインを作成する
- 12. go install時にis not in stdエラー
- 13. terminalでChatGPTを使いたい
- 14. Go 1.21以降での、go.modを利用したバージョン固定可否の検証
- 15. Go入門したい人におすすめの学習方法6選
- 16. IPアドレスを隠蔽したいので、GolangでHTTPプロキシサーバーを作る
- 17. Go API(Gin)をCloud Functionsにデプロイする方法(CLI, Terraform)
- 18. Salesforce Pub/Sub API を利用してみる
- 19. OpenTelemetry 調査
- 20. 【GoとPython】異なる言語、共通する哲学
強化学習入門を果たした際の備忘録
## 概要
そこそこ長くデータサイエンティストとして働いてきたけど避けてきた(触れる機会がなかった?)強化学習にようやっと入門したので自分の取ったスタディパスと概要を残しておく。これから強化学習に入門する人の参考になるかも?## お前誰?
ブラジルでデータサイエンティスト/機械学習エンジニアとして働いています。## 強化学習
教師あり、教師なしと並んでデータサイエンスの一大分野。色々なところで名前は聞くけれど、個人的には『ゲームくらいでしか使わなくね?』と思っていてキャリアの構築によっては正直ノータッチでも行けると思ってる。勉強コストの割に使う頻度が著しく少なそうなのでこれまでは完全にノータッチだった。## どこまで行った?
数式を追って、自分で書いておおよそ理解したつもりになってるのは以下のもの
* 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
Go 1.21以降での、go.modを利用したバージョン固定可否の検証
今はプロジェクトでバージョンの固定にgoenvを利用しているが、
「Go 1.21以降では、go.modに記載されたgoのバージョンがインストールされていない場合、自動でダウンロードして指定のバージョンのgoで実行されるためGoenvが不要になる。」
という話を聞いたので、Go公式が用意したツールチェインを利用した方法で、
マイナーバージョンも含めてGoのバージョンをプロジェクトごとに固定出来るか、検証した。## 検証
### 事前準備
#### go1.21.1のインストール
“`zsh
$ go install golang.org/dl/go1.21.1@latest
$ go1.21.1 download
“`“`zsh
$ go1.21.1 version
$ go1.21.1 env GOROOT
/Users/mitsuaki.ihara/sdk/go1.21.1
$ go version go1.21.1 darwin/arm64
“`#### go.modの作成及び検証用ファイル作成
Goのプロジェクトを初期化する。
“`zsh
$
Go入門したい人におすすめの学習方法6選
## はじめに
こんにちは、もみです!大学で情報工学を学びながら、Web系エンジニアを目指している学部2年生です。
Go言語の学習を半年前に始め、学生であることの時間的利点を生かして、複数のGo言語学習リソースを学んできました。昨今、Go言語はそのシンプルさや大規模開発への適合性などさまざまな魅力から人気を集めています。
企業でも採用されることが増えており、Go言語を学び始める人も増えています。今回の記事では、これからGo言語に入門する人へ、私が実際に試してとくに良かった学習リソースを紹介します。
## 対象読者
– Goに入門したい人
– プログラミング初心者〜中級者
– 自分にあった学習リソースを探している人## プログラミング未経験者向け
[Progate Go](https://prog-8.com/courses/go)
– プログラミング未経験者でもつまずきにくい
– 環境構築が不要
– コードの自動採点がある
– イラストや図などを用いたわかりやすいスライド解説
– 基本的な内容、簡単な内容のみで構成されており、はじめの一歩に
IPアドレスを隠蔽したいので、GolangでHTTPプロキシサーバーを作る
# Goでプロキシサーバー
プロキシサーバーをGolangで作成してみます。# プロキシサーバー
ポート8080で作成します。リクエスト先のURLを取得し、代理でプロキシサーバーがリクエストを送信、レスポンスを複製して返しています。“`golang:main.go
package mainimport (
“fmt”
“io”
“log”
“net/http”“github.com/labstack/echo/v4”
“github.com/labstack/echo/v4/middleware”
)func handler(c echo.Context) error {
url := c.Request().URL.String()
req, _ := http.NewRequest(c.Request().Method, url, c.Request().Body)for name, values := range c.Request().Header {
for _, value := range values {
req.H
Go API(Gin)をCloud Functionsにデプロイする方法(CLI, Terraform)
## はじめに
Glolang WebアプリケーションGinを用いたサーバーレスアプリケーションをgcloud CLI, Terraformそれぞれを用いてCloud Functionsにデプロイします今回用いたコードは[GitHub](https://github.com/tomoish/gin-Cloud-Functions)で公開しています。
## 環境
Golang: 1.20.4
Terraform v1.6.6## ディレクトリ構成
“`
.
├── gin
│ ├── cmd
│ │ └── main.go
│ ├── function-source.zip
│ ├── gin_http.go
│ ├── go.mod
│ └── go.sum
└── infra
├── main.tf
└── terraform.tfvars
“`## Gin
### Gin Tutorial
今回は[Gin Tutorial](https://go.dev/doc/tutorial/web-service-gin)で作
Salesforce Pub/Sub API を利用してみる
※ これから記載する事項は、私が所属する会社とは一切関係のない事柄です。
今回は [Pub/Sub API](https://developer.salesforce.com/docs/platform/pub-sub-api/overview) の[サンプル](https://github.com/developerforce/pub-sub-api/tree/main/go/examples)を実行する方法を紹介したいと思います。
## Pub/Sub API では何ができるの?
Pub/Sub API は gRPC と HTTP/2 に基づいた API で、リアルタイムでイベントを介してデータのやり取りを行うことができます。公開されたイベントはイベントバスに 72 時間保存されるので、一時的に切断されていたとしても過去のイベントを再取得することができます。
ユースケースとしては外部システムとのデータの同期やオブジェクト変更時の通知といったようなことが挙げられます。
Trailhead の「[Pub/Sub API を使用する](https://trailhead.sal
OpenTelemetry 調査
# OpenTelemetryについて
## 目次
1. [概要](#概要)
2. [機能/詳細](#機能詳細)
3. [なぜ必要か](#なぜ必要か)
4. [サンプルコード](#サンプルコード)
5. [まとめ](#まとめ)## 概要
OpenTelemetryは分散トレーシングとメトリクスの観測性データを収集し、分析・監視・トラブルシューティングを行うためのオープンソースのツールキットです。分散システムのコンテキストをキャプチャし、リクエストの経路やパフォーマンスの問題を追跡するための一貫した手法を提供します。## 機能/詳細
OpenTelemetryには以下の主な機能があります:### トレーシング
分散トレーシングを使用して、リクエストの経路やリクエスト間のタイミング情報を収集します。これにより、アプリケーションのコンポーネント間の相互作用の可視化とトラブルシューティングが容易になります。### メトリクス
アプリケーションのパフォーマンスやリソース利用率を測定し、カスタムメトリクスを作
【GoとPython】異なる言語、共通する哲学
:::note info
この記事はAndrew Gerrand氏のGo and the Zen of Python[^1]を訳したものです。
:::
[^1]:https://go.dev/talks/2012/zen.slide#1## “Beautiful is better than ugly.”
Goは、C言語を彷彿とさせる軽量で規則的な構文を持っている
しかし、美しいか醜いかは、個人に依存する## “Simple is better than complex.”
メソッドはただの関数であり、特別な場所は無い
thisやselfなどのキーワードはなく、レシーバは他の関数引数と同じようなものである“`go
type Vector struct {
X, Y float64
}func (v Vector) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
“`## “Simple is better than complex.”
メソッドはクラスがなくても任意の名前付き型で宣