『goのローカル開発環境でもo11yスタックを活用したい - GammaLab』
『goのエラーをスタックトレースも含めて構造化ログで残したい - エムスリーテックブログ』
AWS AmplifyでGo言語とNext.jsから成るアプリをビルドするアレ
version: 1
backend:
phases:
preBuild:
commands:
- wget --no-verbose https://go.dev/dl/go1.21.0.linux-amd64.tar.gz
- rm -rf /usr/local/go
- tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz
build:
commands:
- '# Execute Amplify CLI with the helper script'
- export PATH=$PATH:/usr/local/go/bin
- go version
- amplifyPush --simple
frontend:
phases:
preBuild:
commands:
- npm ci
build:
commands:
- npm run build
artifacts:
baseDirectory: .next
files:
- '**/*'
cache:
paths:
- node_modules/**/*
Go言語でちゃんと日時を変換
time_parsed, _ := time.Parse("2006-01-02 15:04 MST", "2023-09-25 18:33 JST")
fmt.Println(time_parsed.Unix())
Go言語で雑に日時を変換
time_parsed, _ := time.Parse("2020-09-25 16:33", "2023-09-25 18:33")
fmt.Println(time_parsed.Unix())
-62135596800
Go言語のAmplify functionでGraphQL APIを叩くコード(IAM)
var ENDPOINT = os.Getenv("API_AMPLIFY_GRAPHQLAPIENDPOINTOUTPUT")
func query(query_string string) string {
json_string := `{"query":"` + strings.Replace(query_string, "\n", "\\n", 100) + `"}`
req, err := http.NewRequest(
"POST",
ENDPOINT,
bytes.NewBuffer([]byte(json_string)),
)
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
//Authの設定によっては署名が必要
config := aws.Config{Region: aws.String("ap-northeast-1")}
sess := session.Must(session.NewSession(&config))
signer := v4.NewSigner(sess.Config.Credentials)
signer.Sign(req, bytes.NewReader([]byte(json_string)), "appsync", "ap-northeast-1", time.Now())
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
return string(body)
}
Go言語のAmplify functionでGraphQL APIを叩くコード(API Key)
var ENDPOINT = os.Getenv("API_AMPLIFY_GRAPHQLAPIENDPOINTOUTPUT")
var APIKEY = os.Getenv("API_AMPLIFY_GRAPHQLAPIKEYOUTPUT")
func query(query_string string) string {
json_string := `{"query":"` + strings.Replace(query_string, "\n", "\\n", 100) + `"}`
req, err := http.NewRequest(
"POST",
ENDPOINT,
bytes.NewBuffer([]byte(json_string)),
)
if err != nil {
panic(err)
}
req.Header.Set("X-Api-Key", APIKEY)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
return string(body)
}
『AWS AmplifyでReact(TypeScript)、GraphQL、Lambda(Go)なアプリを作ってみた』
あれ
AmplifyがGo言語と相性悪くてキレてる
『Calling AppSync Mutation from Lambda with Golang』
Windowsでcgoを使う設定
MSYS2をインストール
gccをインストール:pacman -S mingw-w64-ucrt-x86_64-gcc
環境変数にC:\msys64\ucrt64\bin
を追加
CGOを有効化:go env -w CGO_ENABLED=1
あれ
いや、「ベクトル検索ぐらいマネージドサービスあるやろ」とはなるんだけど、たけーのよ。Azure Cognitive Searchとか、一番安いので月額1万円以上する。
DynamoDBとLambdaでやりくりすれば、維持費をほぼ0円、処理があっても月額100円ぐらいで何とかなるはずなんや。
で、そのために文章をベクトル化(Sentence Embedding)する処理が必要だったのだけどもですね、世のSentence Embeddingするライブラリやら言語モデル(BERTとか)やらはファイルサイズが巨大で、Lambda関数に乗り切らんかったわけです。
そこで、BERTを小型化したALBERTでSentence Embeddingが取れるように学習してたんですけども、やっとこさそれらしい結果が出せるようになってきた。
となると、次の課題はベクトル検索のDB部分なわけです。今はJavaScriptのライブラリを使ってるので速くないので、Go言語とかでやりたい。
というか、JavaScriptでのSentence Embeddingの計算は遅いはずなので、そこもGo言語に切り替えるうまみがあるはず。
あれ
「ONNXならGo言語で動くし、AWS LambdaでSentence Embeddingの計算イケんじゃね???」と思われたが、そもそも日本語のSentence Embeddingに対応した小さいモデルが市井になかった。終わり。
「自分で作れや」というあれがある。GPUがねぇ。いい加減にGoogle Colaboratoryの有償契約をすべきか。
あれ
Go言語でMacOSのAccelerateを叩いて高速化しようとしてたら業務時間が終わってた。
なおAccelerateで関数自体の高速化はできたものの、全体的には遅くなった。
あれ
WebGPUをネイティブで動かす、wgpu-nativeという得体の知れないライブラリを使っている。
WebGPUならWindowsでもMacでも動いてお得なので。
そして、それを使って遺伝的プログラミングを動かそうとしている。おそらくWebGPUで遺伝的プログラミングは世界初だろう。ニッチすぎてやる人がいない。
あれ
Hugo
The world’s fastest framework for building websites
Hugo is one of the most popular open-source static site generators. With its amazing speed and flexibility, Hugo makes building websites fun again.