- 1. Go言語の特徴
- 2. 【個人開発】読みたい記事をストックするLINE Bot作ってみた
- 3. ドラ🔵もんで依存性の注入と依存性逆転の原則を理解する!!
- 4. 【Golang入門】Gemini APIをGoで呼んでみた
- 5. GitHub Actions で Go のテスト実行
- 6. global-bundle.pemを使用しているのにfailed to verify certificate: x509: certificate signed by unknown authorityが出る
- 7. Go: ヘッダーを考慮した csv ファイルの読み込み
- 8. 【Go言語】go run main.goを使うな
- 9. Intellij IDEAでtypo検出の緑の波線を消す方法
- 10. Cloud Run + Gorm + Cloud SQLで詰まった
- 11. missing go.sum entry for module providing package github.com/golang/protobuf/proto (imported by github.com/gin-gonic/gin/binding); to add: の解決
- 12. 【Go言語】ビルドタグgo:buildの使い方
- 13. Goのbuildtinをサクッとリードしてみる。
- 14. golangci-lint(gci)を使ってGoコードをチェックしよう
- 15. Goのクリーンアーキテクチャ振り返り
- 16. GoのNamed Return Valueとそのうまい使い方
- 17. 【Go】スライスはちゃんと理解しておかないと危険だよという話
- 18. [Go] 自分専用のAIチャットボットサイト
- 19. GoでRedisを使ったときの基本の備忘録
- 20. オウム返しするLINE BotをGoで実装する(LINE Messaging API・Webhook)
Go言語の特徴
# はじめに
ソフトウェア開発の世界には、多くのプログラミング言語があります。
Python、JavaScript、C、Ruby、最近ではRustやKotlinなど、それぞれ特徴があります。
様々なプログラミング言語に触れてきました。その中でも私が特に印象に残っているGo言語について解説したいと思います。
# Go言語とは
“**Go**”という名前にもあるようにGoogleが開発した言語です。
2009年に発表され、現在では様々なサービスに利用されています。[^1]
日本のサービスだと、メルカリやクックパッドなどがあります。
![スクリーンショット 2024-06-06 160725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809382/2075dcef-9ad5-e3ed-9f04-dfe5fde9b159.png)
# 特徴
特徴は大きく分けて3つほどあります。後ほど順に解説します。
* コンパイラ型
* 記述がシンプル
* 未使用の変数、モジュールはエラーになる## コンパイラ型
ま
【個人開発】読みたい記事をストックするLINE Bot作ってみた
## はじめに
この度「あとで読むゼッタイ君」というLINE Botを個人で開発し、リリースしてみました。
その機能の紹介や技術的な話、感想等をつらつらと書いていきたいと思います。ちなみに「あとで読むゼッタイ君」は、[こちらのリンク](https://lin.ee/WvHi3bx) or 以下のQRコードから友達追加が可能なので、ぜひ使って頂けると嬉しいです!
![あとで読むゼッタイ君.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526830/49daa827-b910-b19c-392c-eea1ffb375ca.png)
## どんなアプリ?
後で読みたいなーと思ったWebページを管理(登録・閲覧・削除)できるだけの超絶シンプルなLINE Botです。
具体的には、ユーザーが送ったメッセージ内容に応じて、以下の機能が利用できます。– URLのみを送信すると、後で読みたい記事(WebページのURL)をブックマークとして登録できる
– 「読む」というメッセージを送信すると、ブックマー
ドラ🔵もんで依存性の注入と依存性逆転の原則を理解する!!
# はじめに
依存性の注入(Dependency Injection, DI)は、習得するのは難しいですが、理解すると簡単にできるようになります。また、依存性の注入と間違えやすい概念として、SOLID原則の一つである依存性逆転の原則(Dependency Inversion Principle, DIP)があります。
今回は、依存性の注入と依存性逆転の原則という概念をドラ🔵もんで分かりやすく解説したいと思います。
ちなみにスライドもあります。(スライドにはコード例は載ってません)
# 依存性の注入(DI)
## DIをドラ🔵もんで解説する
の○太はドラ🔵もんに依存しています。ドラ🔵もんを他のロボットに変えるとの🟡太は死にます。生死がドラ🔵もんにかか
【Golang入門】Gemini APIをGoで呼んでみた
OpenAIのAPIをコネコネやるのが流行っているようです。それに変な対抗意識を持って、あえてGeminiAPIを使ってGolangコネコネしてみました。3Gということ(勝手に私が言ってるだけです)でGCPにデプロイしようかなと思っていたりいなかったり。
そんな備忘録として書いておきます。
なお、実装についてはこちらを参考にしました。
とてもわかりやすいです。またしっかりチュートリアルも用意されているため、このチュートリアルも参考にしても良いかと思います。
https://ai.google.dev/gemini-api/docs/get-started/tutorial?lang=go&hl=ja#set-up-api-key
## Geminiって?
一応Geminiについて軽く説明させていただきます。
Geminiとは、Googleの生成AIサービスです。Geminiは2023年12月に高性能AIモデルとして発表され、現在では以下の3つのモデルが存在します。
### Gem
GitHub Actions で Go のテスト実行
CI の一環として、GitHub のデフォルトブランチに PR を作成した時と、マージをした時に UT を行う GitHub Actions を作成します。
### ファイル構成
“`
.github
├─ actions
│ └─ go-ut
| └─ action.yml
└─ workflows
└─ ci.yml
json
├─ go.mod
├─ go.sum
├─ pretty_print.go
└─ pretty_print_test.go
.gitignore
“`
最終的にはリリースも GitHub Actions から行うため、UT の実行は action.yml に記載しています。
今回は、Go 言語の UT を対象にしており、json フォルダの下にコードおよび、テストコードが置かれています。### Action
“` .github/actions/go-ut/action.yml
name: Go UT
description: Run go unit testinputs:
g
global-bundle.pemを使用しているのにfailed to verify certificate: x509: certificate signed by unknown authorityが出る
## TL;DR
使ってる`global-bundle.pem`が古かったです。
再度以下から取得しなおしたら解決しました。
https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem## 検証方法
RDSの認証機関に`rds-ca-rsa2048-g1`を使用しています。
そこで、`RDS Root 2019 CA`が含まれているかを確認します。
以下を実行して、何も出力されなければダメです。### Javaのランタイムがこちら
“`console
keytool -printcert -v -file global-bundle.pem | grep -A2 “RDS Root 2019 CA”
“`### Go langでやりたい方はこちら
“`go:main.gopackage main
import (
“crypto/x509”
“encoding/pem”
“fmt”
“log”
“os”
“strings”
)func main() {
pemData
Go: ヘッダーを考慮した csv ファイルの読み込み
こちらのプログラムを[リートン](https://wrtn.jp/)で変換しました。
[Python3: ヘッダーを考慮した csv ファイルの読み込み](https://qiita.com/ekzemplaro/items/aabc6e3b9ac71e242d06)## プログラム
“`go:csv_header.go
package mainimport (
“encoding/csv”
“encoding/json”
“fmt”
“os”
)func main() {
if len(os.Args) < 3 { fmt.Println("Usage: go run csv_to_json.go“)
return
}inputCSVFile := os.Args[1]
outputJSONFile := os.Args[2]// Open the CSV file
csvFile, err := os.Open(inputCSVFile)
if err !=
【Go言語】go run main.goを使うな
# はじめに
一番初歩的な話ですが、海外の記事で話題になっていたのでまとめました。
# 結論
`go run main.go` より `go run .` を使いましょう。
# なぜ`go run .`の方がいいのか?
`go run main.go`だと、以下のようにmainパッケージが2つに分かれているとコンパイルエラーになる可能性がある。あと、短い。
“`go:main.go
package mainfunc main() {
hello()
}
“`“`go:hello.go
package mainimport “fmt”
func hello() {
fmt.Println(“Hello!”)
}
“`“`shell-session
$ go run main.go
# command-line-arguments
./main.go:4:2: undefined: sayHello
“``go run .`を使うと、正しく実行される。
“`shell-session
$ go run .
Hello!
“`ファイ
Intellij IDEAでtypo検出の緑の波線を消す方法
## 症状
![スクリーンショット 2024-06-23 14.26.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3172801/2b43ba70-e7ae-bbd5-4011-3902661687c2.png)
邪魔ですね。
## 対策
Settings(command + ,) → Editor → Inspections → Proofreadingのチェックを外せばオーケーです。
![スクリーンショット 2024-06-23 14.29.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3172801/f0129423-e192-6e8f-be4f-7b3011534982.png)
![スクリーンショット 2024-06-23 14.33.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3172801/
Cloud Run + Gorm + Cloud SQLで詰まった
## 前提
`Go` + `Echo` + `Gorm`で作成したWebアプリを`Google Cloud Run`にデプロイしました。その際に、`Cloud SQL`との接続に詰まりました。## 詰まったところ
### DB接続
DBが中々接続できずに公式ドキュメントを読みましたが、
https://cloud.google.com/sql/docs/mysql/samples/cloud-sql-mysql-databasesql-connect-connector?hl=ja
以下の2つのライブラリを用いるものでした。
“`go
import (
“cloud.google.com/go/cloudsqlconn”
“github.com/go-sql-driver/mysql”
)
“`
私の場合には`Gorm`のSQLドライバーを使っていたので、大幅な改修が必要そうなこの方法を回避したかったので調べてみると以下のページに解決方法が載ってました。
https://qiita.com/sky0621/items/d91ffd1faf63dbf34e77
g
missing go.sum entry for module providing package github.com/golang/protobuf/proto (imported by github.com/gin-gonic/gin/binding); to add: の解決
# エラー内容
C:\Users\user\go\pkg\mod\github.com\gin-gonic\gin@v1.7.7\binding\protobuf.go:11:2: missing go.sum entry for module providing package github.com/golang/protobuf/proto (imported by github.com/gin-gonic/gin/binding); to add:
go get github.com/gin-gonic/gin/binding@v1.7.7
C:\Users\user\go\pkg\mod\github.com\gin-gonic\gin@v1.7.7\binding\yaml.go:12:2: missing go.sum entry for module providing package gopkg.in/yaml.v2 (imported by github.com/gin-gonic/gin/binding); to add:
go get github.com/gi
【Go言語】ビルドタグgo:buildの使い方
# ビルドタグとは
ビルドタグとは、Goファイルの先頭にある特別なコメント。ビルドタグの後には1行の空行が入る。*Build Constraints* とも呼ばれる。ちなみに、`//`と`go`の間にスペースを入れると普通のコメントとみなされる。
“`go
//go:build foopackage hoge
“`:::note
Go1.17以前では `//go:build` ではなく、 `//+build`が使えわれていました。
:::## なんのためにビルドタグを使うのか
– [ビルドタグとは](#ビルドタグとは)
– [なんのためにビルドタグを使うのか](#なんのためにビルドタグを使うのか)
– [ビルドオプションの指定](#ビルドオプションの指定)
– [テストの分類](#テストの分類)
– [参考文献](#参考文献)以下のようにすると、cgoが有効な場合にのみソースファイルを含む。
“`go
//go:build cgo
“`## ビルドオプションの指定
例えば、以下のように **windows** を指定すると、window
Goのbuildtinをサクッとリードしてみる。
builtin.goはGolangのリポジトリの`src/builtin/builtin.go`に書かれている。
このファイルにはGoで使われる定数、type、関数が定義されている。
当たり前に使っている定数や関数がどのように定義されているかをいくつか見てみましょう。
## bool
Goにおけるbool型は`true`と`false`の2つの値を持つ。
それぞれは`true`と`false`という定数で定義されている。
“`go
const (
true = 0 == 0 // Untyped bool
false = 0 != 0 // Untyped bool
)
“`(VSCodeのGoの拡張機能で`true`と`false`にホバーするとこの定義に飛べて、初めて見たときは驚いた)
## make
makeは以下のように定義されている。
“`go
func make(t Type, size …IntegerType) Type
“`makeはslice、map、channelに対しするメモリの確保を行う。
Ty
golangci-lint(gci)を使ってGoコードをチェックしよう
### はじめに
Go言語の静的解析ツールであるgolangci-lint(gci)は、コードの品質を向上させるために役立ちます。この記事では、gciの基本的な使い方と、実際のコード例を通じてどのように役立つかを紹介します。
### gciのインストール
まずは、gciをインストールします。Windowsでのインストール方法は以下の通りです。
1. **Chocolateyを使用してインストールする方法**:
管理者権限を持つ PowerShell で以下のコマンドを実行します。
“`powershell
powershellコードをコピーする
choco install golangci-lint
“`インストールが完了したら、次のステップに進みます。
### gciの基本的な使い方
1. **コードの静的解析**:
gciを使ってコードの静的解析を行います。
“`powershell
powershellコードをコピーする
Goのクリーンアーキテクチャ振り返り
# はじめに
こんにちは!2012年にGoがリリースされてから、2024年時点で12年。
基礎となるクリーンアーキテクチャについて、簡単に振り返ってみます。### 1. なぜクリーンアーキテクチャが必要なの?
これを疑問に感じた方は、少なくないはず。
構造をそこまで意識する必要があるのか?
比較的小規模なプロダクトであれば、そんなに意識しなくてもいいと思います。
マイクロサービスとして活用している場合など、なおさら感じるのではないでしょうか。しかし、比較的大規模なサービスなどで機能が増えて大きくなっていくと、変更が難しく、新しい機能を追加するのも大変になってきますね。
そこで登場するのが「クリーンアーキテクチャ」です。
クリーンアーキテクチャは、プログラムを役割ごとに整理することで、
* **変更に強くなる**
* **テストしやすくなる**
* **チーム開発がスムーズになる**などのメリットがあります。
機能が増えていく前提で考えると、分かりやすいかもしれませんね。
### 2. 玉ねぎ🧅で理解するクリーンアーキテクチャ
クリーンアーキテクチャは、
GoのNamed Return Valueとそのうまい使い方
Goには関数/メソッドを定義する時に返り値を名前をつけて関数の内部で初期化することなく変数を作ることができる仕組みがある。
これをNamed Return Valueと言う。
本記事ではNamed Return Valueのメリットデメリットと使い所を解説していく。
## Named Return Value
こちらにかかれている。
https://go.dev/doc/effective_go#named-results
参考のコードは以下のようになる。
“`go
func sampleNamedReturnValue() (value int) {
value = 2
return
}
“`この返り値valueはint型で扱われ、ゼロ値(intでは0)で初期化される。
また関数内ではreturnだけ書くことでvalueにセットされている変数を返すことができる。
### メリット
個人的には2つあると考えている。
– 命名から返り値が何かが予測しやすい
– 少し短く書けるまず命名については言うまでもなく、返す値がどのような役目をするの
【Go】スライスはちゃんと理解しておかないと危険だよという話
# はじめに
どうもODです。
転職でWEBバックエンド開発を始めて約3ヶ月、これまで存在や概念だけは知っていたような技術のオンパレードでドタバタしております。
今回は業務でもよく登場するスライスのことについてお話ししようと思います。# スライスとは
まずGo言語には`配列`と`スライス`の2つがあります。
どちらとも同じ型の複数の要素をまとめるためのものですが、
* 配列(array):固定長
* スライス(slice):可変長と言う違いがあります(とんでもなくざっくりした説明ですが…)
私は処理の中で要素数が固定であれば配列を、変わりそうであればスライスを使う、といった具合に使い分けをしております。# スライスの定義
Goにおけるスライスの定義は下記の通りになっています。
“`Go
type slice struct {
array unsafe.Pointer
len int
cap int
}
“`
https://go.dev/src/runtime/slice.go
つまり、スライスは内部的に配列(基底配列)を参照するもの、ということです。
[Go] 自分専用のAIチャットボットサイト
# はじめに
皆さん、こんにちは!
AIチャットボット、どんどん進化してますね。
今回は、Go言語を使って、自分だけのAIチャットボットを作成・管理できるWebアプリを作ってみました。# 完成イメージ
最初に完成イメージを載せてた方が分かりやすいですよね。
(今度からそうしよう)# 要件
– 役割を設定したAIを複数作ることができる
– 入力欄にプロンプトを入力して「Run」ボタンをクリックすると、AIが回答を生成する
– 履歴は画面中央に表示され、スクロールする# 技術スタック
– Go: 軽量かつ高速なプログラミング言語
– Gin: GoのWebアプリケーションフレームワーク / 今回はテンプレートを使います
– Tailwind CSS: utilityファーストなCSSフレームワーク
– Op
GoでRedisを使ったときの基本の備忘録
本記事は業務で利用したGoとRedisを使ったときの備忘録です。
AWSのElaticacheを使い、GoのRedisクライアントは`github.com/go-redis/redis/v8`を使うのが一般的のようだったのでその使い方をまとめる。
(Get、Setの基本のみ書くため、詳細は公式ドキュメントを参照してください)
## GoでRedisを使う
大まかな流れは
1. Redisクライアントを作成
1. Redisの操作という超シンプルな流れです。
### Redisクライアントを作成
go-redis/redisのクライアントを作成するには、`NewClient`を使います。
“`go
import (
“context”
“fmt”
“github.com/go-redis/redis/v8”
)func NewRedisClient() *redis.Client {
rdb := redis.NewClient(&redis.Options{
Addr: “localhost:6379”,
オウム返しするLINE BotをGoで実装する(LINE Messaging API・Webhook)
LINE Messaging APIのGoの公式SDKを使って超簡単に実装する。
https://github.com/line/line-bot-sdk-goGoの環境構築、プロジェクト作成までは割愛。
“`go:main.go
package mainimport (
“log”
“net/http”
“os”“github.com/joho/godotenv”
“github.com/line/line-bot-sdk-go/linebot”
)func main() {
// .envファイルを読み込む
err := godotenv.Load()
if err != nil {
log.Fatal(“Error loading .env file”)
}bot, err := linebot.New(
os.Getenv(“LINE_CHANNEL_SECRET”),
os.Getenv(“LINE_CHANNEL_TOKEN”),
)
if err != nil {
log.Fatal(err)
}ht