- 1. ChatGPTを相手に英会話レッスンができるアプリを作成
- 2. ラズベリーパイにgoofysをインストールする
- 3. 【Golang】go mod を理解せず自作の package を動かす
- 4. GCP Cloud Dataprep機能/実装
- 5. A Tour Of Go Exercise
- 6. go言語 外部コマンドの備忘録
- 7. Golang + Reactで並び替えができる配列のDBテーブル・フォームを作ってみた
- 8. Goのポインタ使い所,使わなくていい所
- 9. テスト投稿
- 10. GoでSSG(静的サイトジェネレーター)を手作りしてみた
- 11. golang[Go言語]でインポート分のパスを指定する方法。
- 12. [Go言語] スライスを効率的にソートする方法
- 13. 【GO】Gormを使って子テーブルのデータを取得したい
- 14. 【Go言語】for文の奇妙な動作
- 15. ポートフォリオをGolang + Graphql + Next.jsで大改造した話
- 16. 【GO】コンパイラによるレシーバの暗黙的変換ってなに?
- 17. gorm gen を使用してデータベースから構造体を作成する
- 18. GoでgRPCサーバーを立ててみる3(repository.goの実装)
- 19. Protocol BuffersのOptionをGo側で読み取る方法を考える
- 20. 【Go】JWT認証をGinで必要最低限の実装をした
ChatGPTを相手に英会話レッスンができるアプリを作成
# 英会話レッスンを(ほぼ)無料でいつでもやりたい!
英会話レッスンを受けたいとき、お金がかかり時間も拘束される。
そこで、ほとんど無料でいつでもpcブラウザやスマホで英会話レッスンができるアプリが欲しいと思い開発することにした。
ほとんど無料である理由は、ChatGPTを呼び出すためにOpenAIのAPIにクエリを投げる際にごく少額の料金がかかるからである。(だいたい1会話0.1円未満)# アプリの構成
アプリはpcブラウザ、スマホからアクセスできアクセス元の環境に関係なく、前回までの会話を続けられるようにする。
会話の入力はpcブラウザ、スマホの音声入力APIを使って行い、入力に対するChatGPTの応答は音声読み上げAPIを使って読み上げることにより、会話ができる。
また、会話はルーム単位で管理する。
なお、今回は英会話レッスンをすることが目的であるため英会話のみに対応すれば十分であるが、音声入力APIと音声読み上げAPIは多くの言語に対応しているため、中国語、フランス語、スペイン語などAPIが対応している言語のレッスンも本アプリでは行うことができる。(ルーム単位で設定言語を
ラズベリーパイにgoofysをインストールする
– [kahing/goofys | GitHub](https://github.com/kahing/goofys)
# GOのインストール
ラズパイのOSが32bitか64bitかダウンロードファイルが異なります。
32bitなら `armv6l` 、 64bitなら `arm64` を選択します“`bash
# パッケージのダウンロード
# GOLANG_DL_URL=”https://go.dev/dl/go1.21.1.linux-arm64.tar.gz” # 64bit
GOLANG_DL_URL=”https://go.dev/dl/go1.21.1.linux-armv6l.tar.gz” # 32bit
wget -O /tmp/go.tar.gz $GOLANG_DL_URL
rm -rf /usr/local/go && tar -C /usr/local -xzf /tmp/go.tar.gz# パスを通す
echo ‘export PATH=$PATH:/usr/local/go/bin’ >> ~/.bashrc
source ~/.
【Golang】go mod を理解せず自作の package を動かす
【Golang】go mod を理解せず自作の package を動かす
# 概要
バージョンいくつかは知らんが、あるバージョンから go mod やらで既存の記述での自作 package が使えなくなってしまった。
go mod を理解して使おうという気は無いので、動けば OK 程度に既存の環境からの変更を記録する。# 環境
PC:M1 Macbook Sonoma
Go
“`
> go version
go version go1.21.6 darwin/arm64
“`# 既存環境(昔の記述:今これじゃ動かないよ(?))
## ディレクトリ構造
“`
> tree
.
├── main.go
└── testlib
└── testfunc.go2 directories, 2 files
“`
## ファイル記述
“`main.go
package mainimport “./testlib”
func main() {
println(“hello from main func”)
testlib
GCP Cloud Dataprep機能/実装
# GCPのCloud Dataprepの概要と機能
## 目次
– [概要](#概要)
– [Cloud Dataprepとは](#Cloud-Dataprepとは)
– [主な特徴](#主な特徴)
– [機能/詳細](#機能/詳細)
– [データ準備と変換](#データ準備と変換)
– [視覚的なデータ探索とプロファイリング](#視覚的なデータ探索とプロファイリング)
– [データ品質の監視と洞察](#データ品質の監視と洞察)
– [簡単なデータのシェアとコラボレーション](#簡単なデータのシェアとコラボレーション)
– [まとめ](#まとめ)
– [サンプルコード](#サンプルコード)## 概要
### Cloud Dataprepとは
Cloud Dataprepは、Google Cloud Platform(GCP)のデータプレパレーション(データ準備)サービスです。データのクリーニング、変換、統合などを視覚的に行うことができます。クラウド上で簡単にデータの事前処理や前処理を行い、データ分析や機械学習モデルのトレーニングに使用することができます。
A Tour Of Go Exercise
# A Tour Of GoのExercie集
https://go-tour-jp.appspot.com/list
# Exercise: Loops and Functions
https://go-tour-jp.appspot.com/flowcontrol/8
“`go
package mainimport (
“fmt”
)func Sqrt(x float64) float64 {
z := 1.0
for i := 0; i < 10; i++ { z -= (z*z - x)/(2*z) fmt.Println(z) } return z } func main() { fmt.Println(Sqrt(4)) } ``` # Exercise: Slices https://go-tour-jp.appspot.com/moretypes/18 ```go package main import "golang.org/x/tour/pic" func Pic(dx, dy int) [][]uint8 { ma
go言語 外部コマンドの備忘録
## Go言語の外部コマンドでハマった件の備忘録
### やりたかったこと
goの外部コマンドからconda activate 環境名で仮想環境のアクティベートしてpythonファイルを動かしたい“`
import (
“log”
“os/exec”
“fmt”
)func main(){
out, err := exec.Commond(conda activate 環境名).Output()
if err = nil{
log.Fatalln(err)
}
fmt.Println(string(out))
}
“`
これでいけるかと思ったがエラー( status exit 1 )しか返ってこない外部コマンドでconda仮想環境をアクティベートするときは
exec.Command()の引数を(“bash”, “-c”, “source activate 環境名”)とするらしいということで
“`
import (
“log”
“
Golang + Reactで並び替えができる配列のDBテーブル・フォームを作ってみた
## はじめに
前回はポートフォリオを大改造してデータをデータベースで管理するようにしました。https://qiita.com/piny940/items/f1a15f7a797c4d0f7461
今回は、前回やり残した「プロジェクトの並び替え」部分を実装した話を記そうと思います。
## 抱えていた問題
前回ポートフォリオのデータをデータベースで管理する方向性にシフトしたのですが、DB設計の段階で考え漏れていたことがありました。それは「プロジェクトの並び替え」です。
プロジェクトは現状、写真のようにスターがついたものが上に来るようになっているのですが、Starがついたプロジェクト同士 / Startがついていないプロジェクト同士の順序については操作ができない設計になっていました。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330232/6c0689e6-10b5-b54f-df1b-845fa0f4827e.png)
そこで今回は、順序を保存するカラムを追加
Goのポインタ使い所,使わなくていい所
# ポインタってどういう時に使うべき?
Goにおけるポインタの使い所は難しいと思います. というのも,Goはスライスやマップなど値かポインタかが初見では分かりづらいようなデータ構造があります.直感的に分かりづらく,ポインタでなければうまく動かない処理があったりします.Goのポインタ周りは感覚でコードを書くと,意外なエラーや,予想外の挙動に直面します.具体的には,以下のような状況において,私はポインタを使うかどうかよく迷います.
– 関数の引数(配列,スライス,マップ)は,ポインタと値どちらが適切か?
– 構造体をマップに格納する時,よくポインタが格納されているが値ではダメなのか?
– メソッドのレシーバ引数は値とポインタどちらが良いのか?
– Rangeループは配列やスライスの要素を書き換えられるか?今回の記事では,Goのポインタについて,宣言や値のポインタ化などの基礎構文から,ポインタの使い所を具体例を交えつつ,解説していきたいと思います.
# ポインタの基礎構文
## 宣言
cなどは変数名の前に\*をつけますが,Goでは型の前に\*をつけてポインタを定義します.“`
テスト投稿
これはテスト投稿です。
GoでSSG(静的サイトジェネレーター)を手作りしてみた
## 目的
この記事([Writing a Static Blog Generator in Go](https://www.zupzup.org/static-blog-generator-go/index.html))を読んでから自分でもやってみたいなと思っていたのでゴリっと作ってみました。
既存のSSGの置き換え等々は全く考えておらず、あくまでも興味駆動の開発になります。
## 作ったもの
https://github.com/K-Sato1995/go-simple-ssg
↑を使用して作った静的サイト
https://go-simple-ssg.vercel.app/
## 構成
やった事としては大枠
– マークダウン(記事のコンテンツ)+テンプレート(HTML)を元に静的なファイルを生成する部分
– CLIで↑を利用して誰でもプロジェクトの骨組みができるようにする部分だけなので大したことはしていないのですが全体感としては下記のようになりました。
“`
./
├── parser/ (MarkdownをパースしてHTMLに変換する部分)
│ ├
golang[Go言語]でインポート分のパスを指定する方法。
# 記事作成背景
import分変えたいなって思った時どこを変えたらよいか自分用のメモです。# 修正内容
go.modのmoduleを変える。
“`go:go.mod
module business←ここgo 1.15
require (
github.com/go-sql-driver/mysql v1.5.0
github.com/joho/godotenv v1.3.0
)puts ‘The best way to log and share programmers knowledge.’
“`
[Go言語] スライスを効率的にソートする方法
## はじめに
Go言語はそのシンプルさと効率の良さで人気を集めていると思っている。特に、スライス(動的配列)の操作はGoの重要な特徴の一つです。今回は、Go言語でスライスをソートする具体的な方法を、実用的な例を交えてご紹介しようと思います。## サンプルコードと説明
“`go
package mainimport (
“fmt”
“sort”
“time”
)type Article struct {
Title string // 記事のタイトル
CreatedAt time.Time // 記事が作成された日時
}// Articles は複数のArticleを含むスライスです。
type Articles []Article// SortByCreatedAt はArticlesをCreatedAtフィールドに基づいて昇順にソートします。
func (a Articles) SortByCreatedAt() {
sort.SliceStable(a, func(i, j int) bool {
return a[i].Cre
【GO】Gormを使って子テーブルのデータを取得したい
# はじめに
GORMを使って、親と子テーブルのデータを両方取得するのに苦労したので、備忘録として残しておきます。
GORMは[公式ドキュメント](https://gorm.io/ja_JP/docs/index.html)が丁寧に書かれているので、そちらも合わせてご覧いただくと良いかと思います。# 結論
`preload`を使って、子テーブルのデータを取得しました。
`preload`とは、Eager Loading(イーガーローディング)の一種で、メインのクエリと一緒に関連するデータを予め読み込む機能です。これにより、N+1問題を避けて子テーブルのデータを取得できます。
`JOIN`と`SELECT`を使うことでも子テーブルのデータを取得できたのですが、今回はより簡単に使える`preload`を採用しました。
以下の構造体を例に`Preload`の使い方を簡単に説明します。
“`go
// UserがOrderをhas manyで持つ
type User struct {
Name string
Email string
Orders []Order
}//
【Go言語】for文の奇妙な動作
# 奇妙な動作をするfor文
まず、最初に奇妙な動作をするコードの例を出します。
以下のコードでは、for文の中でgoroutineを実行している。 **main** のgoroutineが終了するのを防ぐために `sync.WaitGroup` を使用している。 (`sync.WaitGroup`を知らない人は[GoのWaitGroupを理解する](https://zenn.dev/yamato0211/articles/e3da679fd8dd6f)を参考)“`go
func main() {
var wg = &sync.WaitGroup{}
for i := 0; i < 10; i++ { wg.Add(1) go func() { fmt.Println(i) wg.Done() }() } wg.Wait() } ``` [Go Playground](https://go.dev/play/p/x7rCyVdyO3j) これを実行すると、 ```:実行結果 10 10 10 10 ・・・・ 10 10 ``` `i <
ポートフォリオをGolang + Graphql + Next.jsで大改造した話
## はじめに
先日ポートフォリオ(http://www.piny940.com )を大改修したため、その記録を残します。
http://www.piny940.com
完成したコードは以下のGithubで公開していますので参考程度にどうぞ。
https://github.com/piny940/portfolio
## 環境
– Next.js 14.1.0
– Golang 1.21.1## 抱えていた課題
今まで、ポートフォリオ上の「ブログ」や「技術スタック」「プロジェクト」のデータはすべてYAMLファイルで管理していました。
しかし、この方法には次の2つの問題点がありました。
– YAMLファイルに書かれたデータの整合性を保証できない
– データ更新にいちいちYAMLファイルを書き換える必要がある特に2点目の問題についてはかなり深刻で、現状だとデータを書き換えるのに毎回ファイルを書き換えてPull Requestを出して・・・という作業が必要で、結果的にポートフォリオの更新をさぼってデータが古いまま放置されてしまっているという実情がありました。
また、
【GO】コンパイラによるレシーバの暗黙的変換ってなに?
# はじめに
ありし日の自分は以下のコードが正常に動作することに疑問を感じてました。
“`golang
type Dog struct {
Name string
}func (d *Dog) Speak() {
fmt.Printf(“Woof, I am %s\n”, d.Name)
}func main() {
dog1 := &Dog{Name: “hoge”}
dog1.Speak() // => Woof, I am hoge
dog2 := Dog{Name: “fuga”}
dog2.Speak() // => Woof, I am fuga
}
“`
「`*Dog`というポインタ型に対して`Speak()`は定義されているけど、`Dog`という値型には`Speak()`定義されてないのだから、`dog2.Speak()`はpanicするはずでは?」と脳内にはてなマークを浮かべてました。
疑問を先輩にぶつけてみたところ、腑に落ちる説明を頂いたので備忘録としてまとめておきます。# 結論
「コンパイラによる暗黙的変換が行われているから」です。
ポ
gorm gen を使用してデータベースから構造体を作成する
# 背景
最近会社でGolangのプロジェクトに入りAPIを作成しています。その際にDBのデータを受け取る構造体を作成するのが非常に面倒でした。特に、gormタグの作成が面倒でスキーマに応じて変更する必要があります。
これを手作業で作成している時、先輩に`gorm gen`があるから使ってみたらと言われ少し触ってみたのでわかったことを書いていきます。https://gorm.io/gen/database_to_structs.html
# 特定のテーブルのみを作成する
“`go:main.go
users := g.GenerateModel(“users”)
articles := g.GenerateModel(“articles”)
g.ApplyBasic(users, articles)
g.Execute()
“`# スキーマと異なるテーブル名,カラム名にする
“`go:main.go
users := g.GenerateModelAs(“users”, “changedUsers”,
gen.FieldRename(“name”, “changedN
GoでgRPCサーバーを立ててみる3(repository.goの実装)
お疲れ様です。
今日は「repository.goの実装」について部分いたします。
articleサービスにおいてDBとやり取りをするrepository.goの実装を行なっていきます。
今回は簡易的なデータベースとしてsqlite3を使用するので、以下のパッケージをインストールしておきましょう。
“`terminal
go get github.com/mattn/go-sqlite3
“`インストールできたら、忘れずにimportしておきます。
“`article/repository/repository.go
package repositoryimport (
_ “github.com/mattn/go-sqlite3”
)“`
articleサービスでは、以下のようなarticlesテーブルにデータを格納していきます。
| id | author | title | content |
|:———-:|:—————:|:
Protocol BuffersのOptionをGo側で読み取る方法を考える
## はじめに
[Protocol Buffers](https://github.com/protocolbuffers/protobuf)では、Enumを宣言してGoのコードを生成すると、基本的には `string` ↔ `int32` の対応関係が生成される。しかし、この `string` に使える文字種は、[Specification](https://protobuf.com/docs/language-spec#enums)によると、 `[A-Za-z_]` の範囲に限られる。そのため、これ以外の文字種を使いたい場合は、他の方法で表現する必要がある[^1]。
[^1]: 例えば、認可グラントをEnumで表現したい場合、`urn:ietf:params:oauth:grant-type:jwt-bearer` のような値を設定することはできない。
変換ロジックを外部に置くことも出来るが、その場合は各言語で実装することになるため、対応関係に差異が生じる危険性がある。そこで、オプショナルな値をProtocol Buffers側で宣言し、各実装でオプションの値を取得する方法を
【Go】JWT認証をGinで必要最低限の実装をした
## やりたいこと
Ginでユーザーログイン機能を実装し、ログインユーザーだけがアクセス可能なエンドポイントをJWT認証を使って実装したい。## JWT認証の仕組み
### JWTとは
### JWT認証の仕組み## Ginで実装してみる
### “`main.go“`
“`go:main.go
import (
“net/http”
“time”“github.com/gin-gonic/gin”
“github.com/golang-jwt/jwt/v5”
)func main() {
r := gin.Default()r.POST(“/login”, loginHandler)
authGroup := r.Group(“/auth”)
authGroup.Use(authMiddleware)
authGroup.GET(“/”, func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{“message”: “you are authorized”})
})r.Run(“