- 1. [Go言語] ポインタの使い方メモ
- 2. sago35/tinygo-keyboard を用いて自作キーボードを作ろう
- 3. Goのfor-rangeのkeyはコピーであることが分かった
- 4. [Go言語]簡単なWebサーバの立て方(ListenAndServe関数)
- 5. goenvでGoインストール
- 6. 【VScode】Go言語で定義元にジャンプできないときの解決方法
- 7. シェル(zsh・bash)切り替え・VIM
- 8. golangの公式の構造化ロガー「slog」でシンプルなログを出す
- 9. GCP Cloud Bigtable機能と実装
- 10. Go によるsessionの処理
- 11. 【2024】Go言語おすすめライブラリ15選
- 12. Go の開発環境構築(Mac)
- 13. 【個人開発】草生えてないと怒ってくれるBOTを作った
- 14. WidowsやLinuxでGoCVを使用したGOプログラムをstatic buildしたい話
- 15. GoのContextをわかりやすく解説したい
- 16. Go環境構築
- 17. 【即席】自分だけのAI公式ラインbotを作ろう
- 18. Avroスキーマを使ってCloud Pub/Subを使用する
- 19. クリーンアーキテクチャについて考える 自動生成編
- 20. GoとテストとインプロセスDB(GoCon mini 2023 in KYOTO)
[Go言語] ポインタの使い方メモ
## ポインタ
ポインタとかアドレスとか調べてわかった気にはなったけど実際のコード見てもよくわからん!!となったので自分なりに簡単にメモします。## 使用例
“`golang
type Server struct {
srv *http.Server
l net.Listener
}func NewServer(l net.Listener, mux http.Handler) *Server {
return &Server{
srv: &http.Server{Handler: mux},
l: l,
}
}
“`
例えばこういうNewなんちゃらで新しい構造体を生成する関数をよく見ます。## Server構造体
`Server`構造体の`srv`にはポインタが使われていて、`l`には使われていません。
理由は`http.Server`は
“`golang
type Server struct {
Addr string
Handler Handler
// 以下略
}
“`
というような構造体なのに対して、`net
sago35/tinygo-keyboard を用いて自作キーボードを作ろう
この記事では TinyGo + Wio Terminal を用いて sago35/tinygo-keyboard を使った自作キーボードを作るための情報をまとめます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63649/a22afd85-8f64-5e91-5f1d-55006087addd.png)
sago35/tinygo-keyboard は TinyGo で自作キーボードを作るための package です。レイヤー対応や各種スイッチ読み取り方式への対応、 Vial 対応等が含まれます。
https://github.com/sago35/tinygo-keyboard
## 前提知識
以下の書籍 「基礎から学ぶ TinyGoの組込み開発」を読んでおくとスムーズです。
※[電子書籍は 2024/01/22 まで 40% オフで購入](https://book.mynavi.jp/manatee/books/detail/id=134168)することができますh
Goのfor-rangeのkeyはコピーであることが分かった
## 概要
Goのfor-rangeで渡される第2引数はコピーであることが分かったので投稿します。Go: 1.21
## 実例
以下の例だと、`for i, v := range people`のvの値はpeopleの1つ目の要素のコピーなので、vの値を変えても、大元のpeoleの値は変更されません。
コピーなので`fmt.Println(&people[i] == &v)`のメモリアドレスの比較でもfalseになります。“`go
package mainimport (
“fmt”
)type person struct {
name string
}func main() {
people := []person{
{name: “aだよ”},
}for i, v := range people {
fmt.Println(&people[i] == &v) // false
v.name = “名前変わったよ”
fmt.Println(v.F()) // 名前変わったよ
}
fmt.Println(people) // [{
[Go言語]簡単なWebサーバの立て方(ListenAndServe関数)
今回は初心者向けにGo言語において超簡単なWebサーバを実装します。最終的なコードは最後に載せているので、それだけ見たい方は下まで飛ばしてください!
# ListenAndServe関数
`http.ListenAndServe`関数を用いることでサーバを起動することができます。
“`golang
http.ListenAndServe(“:8080”, nil)
“`
`http.ListenAndServe`の中身を見てみましょう。VSCodeであれば`fn+F12`で関数の定義に飛ぶことができます。もちろん、[Github](https://github.com/golang/go/blob/master/src/net/http/server.go#L3172)でも確認できます。
“`golang
// ListenAndServe always returns a non-nil error.
func ListenAndServe(addr string, handler Handler) error {
server := &Server{Addr: addr,
goenvでGoインストール
♦︎goenvインストール
♦︎GOENV_ROOTの設定
♦︎GOPATH,GOROOTの設定
♦︎GOインストール“`
goenv install
“`
本来のバージョンが表示されず下記になる
“`
:frowning2:
zsh: command not found: goenv
“`“`
exec $SHELL を入力
“`
(又は$ source ~/.zshrc)
“`
$ goenv -v
“`
goenv 2.1.11など任意のバージョン)がでればOK“`
goenv install
“`-l/–list List all available versions
インストールできるバージョンは以下のコマンド
“`
$ goenv install -l
“`
最新バージョン探す
“`
goenv install 1.21.5
“`
インストール実行
“`
goenv versions
> 1.21.5
“`
“`
goenv global 1.21.5
“`
※プロジェクトごとに指定したい場合「g
【VScode】Go言語で定義元にジャンプできないときの解決方法
### 解決方法①
setting.jsonに次のコードを追加。
“`
“go.useLanguageServer”: true,
“`### 解決方法②
vscodeの拡張機能「Go」を入れた後に、command + shift + Pで「Go Install/Updates」を選択し、全てのチェックボックスにチェックを入れてupdate!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562304/e8ba7171-8b5c-ab8a-4ea8-d93cf574efc5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562304/1276a07e-c3b9-9c01-655a-7fce79b80bf3.png)
定義元にジャンプできるようになりました。
### 解決方法③
goplsをダウンロードした際に、次のようなエラーが出た場合、Goのバージョン
シェル(zsh・bash)切り替え・VIM
・GOENV_POOTの設定
“`
//使えるShell一覧が表示されます。
cat /etc/shells//現在のシェルパス確認
echo $SHELL
“`
//bashに変更する場合
chsh -s /bin/bash“`
zshに変更する場合
chsh -s /bin/zsh
“`
“`
//エラー
chsh: no changes made
“`
上記、エラーになり zshに変更出来ない場合
:clap:.ターミナル > 環境設定から一般__________________________________
直接またはターミナルから編集隠れ
“`
vim .zshenv
“`
編集する時にまず「a(半角英数)」を押します。するとファイルを編集できるようになるので編集したい内容を入力してください。
編集が終わったら「※Esc」を押してコマンドラインモードに切り替え
そして「:wq」強制保存「:wq!」を押せばファイルが保存されます。
編集している時ですが絶対にファイルを「x」ボタンを押すなどの強制終了はしないでください。
golangの公式の構造化ロガー「slog」でシンプルなログを出す
go1.21から公式の構造ロガー「slog」が標準搭載されましたが、シンプルにログを出すことができなかったので、工夫したことをブログにします。
#### やりたいこと
1.ログレベルを指定できる
2.以下のように時間、レベル、メッセージがテキストで印字できる
“`
[2024-01-04 18:47:47.234] [ INFO] メッセージ
“`#### slogだけだと何が駄目か?
パッケージにある関数を直接呼び出す `slog.Info(“info msg”)` という方法だと、レベル指定ができない
TextHandler だと、レベルを指定できが、印字される文字が以下のように`キー=バリュー`という以下のような文字列になり、読みにくい
“`
time=2024-01-04T18:20:16.149+09:00 level=INFO msg=メッセージ
“`他の言語にあるFormatterなどを用いた指定もできない。
#### どうしたか
シンプルにログを出せる `SimpleHandler` を作った
以下、作ったコードです。そのまま動きま
GCP Cloud Bigtable機能と実装
# GCPのCloud Bigtableの概要と機能
## 概要
Google Cloud Platform(GCP)のクラウドデータベースサービスであるCloud Bigtableは、大規模なデータセットをリアルタイムで処理するための高性能なデータベースです。Apache HBaseデータベースのモデルに基づいており、可搬性や拡張性、高可用性を提供します。## 機能 / 詳細
以下にCloud Bigtableの主要な機能と詳細を示します:### 1. スケーラビリティ
Cloud Bigtableは、十億を超えるレコードとペタバイト単位のデータを効率的に処理できるスケーラブルなデータベースです。データマスターとリージョンサーバーと呼ばれるノードによって構成され、自動的に拡張および縮小します。### 2. ヘネシーに基づく分散設計
Cloud Bigtableは、Googleのヘネシーと呼ばれる分散ファイルシステムに基づいています。この設計により、高速なデータの読み込み・書き込みが可能で、データの分散処理も容易になります。### 3. データモデリング
Cloud
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