- 1. 【個人開発】AIがおすすめの飲食店を教えてくれるLINEチャットボットを作りました
- 2. Goでwebアプリケーションを作成してみよう!~webアプリケーションとは~
- 3. blastengineを使ってGo言語でメールを送信する
- 4. 今回のプロジェクトを終えて #02
- 5. 【Go言語学習】引数の参照渡しについて
- 6. Go gosimple S1016 警告について
- 7. 【Go言語】テンプレートエンジンでtableをレンダリングしてechoで表示してみた
- 8. 【Cloud Spanner】yoを使ってスキーマからGoの構造体を生成する
- 9. 【Go言語学習】chan struct{}
- 10. Goを基本からまとめてみた【基礎】
- 11. Go-for文で繰り返し処理
- 12. dockerでGoファイルを実行する方法
- 13. Go入門 : Go(Gin)で簡単にWebサーバーを作ってみる
- 14. 【Go言語学習】チャネルとミューテックス
- 15. Goで2進数の0,1の数を数えたい
- 16. 【Go言語学習】チャネル( Channel )
- 17. 【Golang】日付型を扱う時はsql-driverのparseTimeをTrueにしよう
- 18. 【Golang, PHP】PDFスライド画像変換&S3保存処理のパフォーマンス改善
- 19. Go未経験のバックエンドエンジニアがGoらしさに触れる(命名規則編)
- 20. 初心者視点で読むGoチュートリアル
【個人開発】AIがおすすめの飲食店を教えてくれるLINEチャットボットを作りました
# AI美食探訪というアプリを開発しました
Line上でやりとりできるAIチャットアプリです。
メッセージを送信すると、条件にあったお店を紹介してくれます。
(一応テスト版という状態です。実運用での入力データを集めること、それを精度向上に役立てることを目的としています)ここからLineの友達追加ができます。
スマホの通常のカメラで読み取れます。
![qr20240512113623589.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473706/08192e49-ec0b-a136-9290-e4ef463bb7a0.png)こちらからでも🙆♂
https://liff.line.me/1645278921-kWRPP32q/?accountId=234luzuw
ぜひ試してみて、フィードバックをいただけると大変嬉しいです。
お問い合わせ用
https://docs.google.com/forms/d/e/1FAIpQLSdLV7zaDC9U8YoiVPXwg3mpx_7pRw
Goでwebアプリケーションを作成してみよう!~webアプリケーションとは~
この記事では4回に分けてwebアプリケーションの作り方を説明していく
第1回
webアプリケーションの構成、仕組み(この記事)
第2回
[サーバーの立ち上げ](https://qiita.com/Yutosaki/items/fcd773a278e9b8663f36 “第2回”)
第3回
フロントエンドの実装(URL)
第4回
バックエンドの実装(URL)実際に作ったアプリケーション
https://github.com/Yutosaki/WiFiRader
# そもそもwebアプリケーションとは
webアプリケーションとは、高度な性能のwebサイトのような認識で大丈夫。・webサイト
webサイトは静的なコンテンツが提供され、何かを読んだり、動画を視聴できたりなどの比較的単純なインタラクションが行われる。頻繁に更新はされない。・webアプリ
webアプリは動的なコンテンツを提供し、ユーザーの情報に応じて、データベースやサーバーなどと連携し、リアルタイムで情報を更新、管理する。・モバイルアプリケーションとの違い
webアプリと違い、インストー
blastengineを使ってGo言語でメールを送信する
[blastengine](https://blastengine.jp/)はシンプルに使える開発者向けメールサービスを提供しています。何かと面倒なメール配信をシンプルに、かつ確実に送信先に届くようになります。
今回はblastengineを使って、Go言語でメール送信を行うまでの流れを解説します。
## ユーザ登録する
blastengineにユーザ登録します。管理画面に入るためのユーザID、パスワードが手に入るので、ログインします(ユーザIDは後で使います)。
![getting-started-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/5c6c8cb0-9ad1-0a6d-88fe-e24bc3ee7b17.jpeg)
## 送信元ドメインのSPFを設定する
送信元として利用するドメイン(自分で持っているもの)の設定をします。これは任意のドメイン管理サービスで設定できますが、TXTレコードに以下のSPFを追加します。
“`
txt @ v=spf1 incl
今回のプロジェクトを終えて #02
## プロジェクトの概要
私は所属するLTサークルで使用されるスライドを公開するウェブサイトを開発しました。このサイトは、サークルメンバーが作成したプレゼンテーションを広く共有し、アーカイブすることを目的としています。
## 動機
私たちのサークルでは毎週LTが開催されますが、これらの貴重なコンテンツが内部に留まり、外部の人々と共有する手段がありませんでした。このプロジェクトの主な目標は、知識の共有を促進し、学びをサークルの外に広げるためのプラットフォームを提供することです。
## 制作期間
このプロジェクトは初期バージョンを2週間で開発しましたが、ユーザーからのフィードバックを受けて現在も定期的にアップデートを行っています。## 使用技術とツール
### フロントエンド
・Next.js
・TypeScript
### バックエンド
・Echo
・Go
### その他
・GCP
・Vercel詳しくはGitHubのリポジトリをご覧ください
https://github.com/R1013-T/slide-share## 振り返り
### 成果
実際に機能するウ
【Go言語学習】引数の参照渡しについて
以下のコードは、セマフォを使って(あんま意味ないけど)、同時実行数を制限しているコードで遊んでいたのですが、do関数の引数について疑問が発生したのでメモ。
“`Go
package mainimport (
“context”
“fmt”
“log”
“time”“golang.org/x/sync/semaphore”
)func main() {
sem := semaphore.NewWeighted(5)go do(sem, func() { time.Sleep(1 * time.Second) }, 1)
go do(sem, func() { time.Sleep(1 * time.Second) }, 2)
go do(sem, func() { time.Sleep(1 * time.Second) }, 3)
go do(sem, func() { time.Sleep(1 * time.Second) }, 4)
go do(sem, func() { time.Sleep(1 * time.Second) }, 5)
Go gosimple S1016 警告について
go-golangci-lint(gosimple)で、以下のような警告が表示されました。
“`
S1016: should convert v
(type github.com/nanato-okajima/repository/internal/model.User)
to github.com/nanato-okajima/repository/internal/model.UserResponse
instead of using struct literal (gosimple)go-golangci-lint
“`## 構成
以下のような実装をしています。
DBから取得したデータをクライアントへ返却する際に
構造体同士の移し替えを行っています。
この際にgo(gosimple)で警告が表示されていました。“`go
// データベースから取得したデータを入れるDTO
type User struct {
ID uint64
Name string
Age uint64
}// クライアントへ返却するデ
【Go言語】テンプレートエンジンでtableをレンダリングしてechoで表示してみた
## はじめに
Goの標準で用意されているテンプレートエンジン(html/template)を使って、htmlのtableをレンダリングし、echoでwebサーバーを建てて表示してみました。## 環境
* macOS Sonoma 14.4.1
* Go 1.22.3 darwin-arm64## 表示したいもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787613/f942a972-c091-357e-590b-203da0c575aa.png)このようなテーブルを表示するhtmlを出力することがゴールとなります。
“`html:html
Table Rendering
【Cloud Spanner】yoを使ってスキーマからGoの構造体を生成する
# はじめに
本記事では、Cloud Spanner用のコード生成ツールである yo について説明します。
# Spannerについて
Cloud Spannerは、Google が提供するフルマネージド型の分散データベースです。従来のリレーショナルデータベース(SQL)のトランザクション正確性と整合性を維持しつつ、NoSQL データベースのように水平方向へのスケーラビリティを持つ NewSQL に該当します。
https://cloud.google.com/spanner?hl=ja
# **yoについて**
yoは[Cloud Spanner](https://github.com/xo/xo)のスキーマ定義から Go のコードを自動生成するツールで、次の特徴があります。
– Go の構造体をスキーマから生成
– CRUD 操作のための関数を生成
– CUD については、Mutation を返します
– セカンダリーインデックスに対応した取得関数を生成
– FindTableNameByIndexName みたいなメソッドが生成されますただし、J
【Go言語学習】chan struct{}
この意味不明なコードは何なんだ?
と思ったら、Go言語の仕様上、struct{}はゼロサイズのデータを表すものとのこと。
つまりメモリを消費しないものを表している。
ただし、変数やチャネルで使用した場合、これらを管理するためのメモリは当然消費される。
チャネルで使用する場合、目的はデータのやり取りで無く、ゴルーチンの同期が目的になる。“`Go
package mainimport (
“fmt”
“time”
)func main() {
doneCh := make(chan struct{})go func() {
time.Sleep(2 * time.Second) // 何かの処理を模擬
close(doneCh) // 処理が終了したらチャネルを閉じる
}()fmt.Println(“Waiting for the goroutine to finish…”)
<-doneCh // チャネルが閉じられるまで待つ fmt.Println("The goroutine has finished!") } ```
Goを基本からまとめてみた【基礎】
## go mod init
– go mod init は、新しいGoモジュールを初期化するためのコマンドで、このコマンドを実行すると、モジュール名をパラメータとして受け取り、その名前で新しいモジュールを作成する。
“`
go mod init booking-app
“`
– Goプログラミング言語のコマンドの一部で、これを使用すると、Goプログラムをビルドして実行できる。
“`
go run
“`“`
vim .zshenv※Press i to enter insert mode.
※Press Enter to add a new blank line.
※Press Esc to return to normal mode.
※Type :wq to save and exit.
“`## 参考サイト
[【Go言語マスター#2】現役エンジニアがGo言語を解説! 〜Goのプログラムを実行〜](https://www.youtube.com/watch?v=ZZf6Ogv4ONI&list=PLGqNraLKYNV
Go-for文で繰り返し処理
# Go言語のFor文の基本構文、実例を紹介します!
### for文の基本構文
以下がfor文の基本構文となります
“`go:sample.go
for 初期値 ; 条件 ; 後処理 {
}
“`
補足
:point_up:初期値はforループのスコープ内でのみ有効
:point_up:条件がtrueの間にforループが行われる
:point_up:後処理はイテレーション毎の最後に実行されます以下にコード例を示します
“`go:sample.go
package mainimport “fmt”
func main(){
for i := 0 ; i <= 5 ; i++ { fmt.Println(i) } } /* 出力 0 1 2 3 4 5 */ ``` ちなみに、初期値と後処理は任意となっています。 ```go:sample.go package main import "fmt" func main(){ i := 0 for i <= 5 { fmt.Print(i)
dockerでGoファイルを実行する方法
### コンテナ内に入る
“`bash
docker exec -it hogehoge /bin/bash
“`
※`hogehoge`はコンテナ名#### 結果
“`bash
root@123456789:/app#
“`
※`123456789`はコンテナID—
### Goファイルを実行
実行したいファイルが格納されているディレクトリに移動し、以下を実行
“`bash
go run hogehoge.go
“`
Go入門 : Go(Gin)で簡単にWebサーバーを作ってみる
# はじめに
Go言語でWebサーバーを立てる方法について、学習のメモとしてまとめていきます。
・version : go 1.22.2
# Webサーバーを実装
まず初めに、下記のコマンドでmoduleの初期化を行います。
“`
go mod init モジュール名
“`go.modファイルが作成されます。
次に、下記のコマンドで`main.go`のファイルを作成します。
“`
touch main.go
“`最初に、`Hello Golang!!` を出力するcodeを`main.go`に記述してみましょう。
“`main.go
package mainimport “fmt”
func main() {
fmt.Println(“Hello Golang!!”)
}
“`記述後、下記のコマンドで `Hello Golang!!` が出力されるか確認しましょう。
“`
go run main.go
“`
`Hello Golang!!` が出力されればOKです。# Ginを導入する
下記の公式Docsを参考に、G
【Go言語学習】チャネルとミューテックス
# チャネル
ゴルーチン間でデータを安全にやり取りするための手段。
データの送受信が同期的に行われるため、データ競合を防ぐことができる。
チャネルはゴルーチンの同期にも使用でき、一つのゴルーチンが結果を計算し、その結果を別のゴルーチンに送信するといった場合に便利である。
→同期処理# ミューテックス
一つのゴルーチンだけが特定のリソース(例えば、共有データ構造)にアクセスできるようにするための手段。
複数のゴルーチンが同時に同じリソースにアクセスしようとしたときのデータ競合を防ぐために使用される。
→排他制御https://github.com/kabasunny/GoPractice/tree/main/channels
“`Go
package mainimport (
“fmt”
“sync”
“time”
)type SafeCounter struct {
v map[string]int
mux sync.Mutex
}func (c *SafeCounter) Inc(key string, ch chan int) {
c.mux
Goで2進数の0,1の数を数えたい
## 結論
`math/bits`パッケージの
– TrailingZeros()
– LeadingZeros()
– OnesCount()を使うと簡単に分かります。
https://pkg.go.dev/math/bits#LeadingZeros
## 背景
競技プログラミングで、2進数の末尾の0の数を求める問題を解いた際に
便利な公式パッケージがありましたので紹介します。## どう使うの?
“`go
var n uint16 = 16 // 10000(2進数)// お尻から0がいくつ続くか
fmt.Println(bits.TrailingZeros16(n))
// 頭から0がいくつ続くか
fmt.Println(bits.LeadingZeros16(n)) // 0000 0000 0001 0000(2進数)
// ビットが1の数を求めたい場合
fmt.Println(bits.OnesCount16(n))
“`
uint型のbit数に応じて関数名が変わります。
(uint型の場合、bits.Tr
【Go言語学習】チャネル( Channel )
# A Tour of Goでの説明
Channels
チャネル( Channel )型は、チャネルオペレータの <- を用いて値の送受信ができる通り道です。 https://go-tour-jp.appspot.com/concurrency/2 # ゴルーチン間で値のやり取り ゴルーチンは非同期だけど、チャネルを使って同期させる。 情報処理検定で出てくる、キュー(先入れ先出し、FIFO)の動作。最初にチャネルに送信したデータが最初に受信される。スタック(後入れ先出し、LIFO)ではないイメージ。 mainゴルーチンの最後にチャネル受信を用意しておくと、全終了を待たせることができる。 # デットロック チャネルへの送信操作は、そのデータが受信されるまでゴルーチンをブロックするため、同じゴルーチン内でチャネルの送受信を行うとデッドロックが発生する。→バッファ付きチャネルを使用すれば解消する。 # 試してみた ```go package main import ( "fmt" "time" ) func main() { ch1 := make(chan int)
【Golang】日付型を扱う時はsql-driverのparseTimeをTrueにしよう
## はじめに
タイトルの通り、Goでデータベースを使用する際にDSN(Data Source Name)のオプションを適切に設定していなかったため詰まったためメモとして残します。
sql-driverはmysqlを使用しています。## 結論
Date型を扱う時はparseTimeをTrueにしよう(誰でも知ってるかも笑)## 理由
Todoテーブルからsqlxのselectメソッドでデータを取得した時のこと
“`go
err := db.Select(&todos, “SELECT id,task,due_date, status,created_at,updated_at FROM todos”)
“`
sqlxのselectメソッドは構造体のフィールド名、もしくはタグ名と一致していれば自動的にマッピングしてくれます。“`go
type Todo struct {
Id int `json:”id” db:”id”`
Task string `json:”task” db:”task”`
DueDate tim
【Golang, PHP】PDFスライド画像変換&S3保存処理のパフォーマンス改善
大学の学部四年生でエンジニアをしている者です。
普段は業務委託でバックエンド開発をメインに行っています。
今回はPHPのプロダクト内で起きていた問題解消にGolangの機能(Go routine, channel)を使用して解消をしました。
その概要をまとめます。
コード自体はプロダクトに反映してしまったので載せるのは控えます。## プロダクト使用技術
– AWS EC2 (t3.medium)
– AWS S3
– PHP (Laravel)
– poppler-utils (pdftoppmコマンド) ⇒ PDFの画像変換処理で使用
– Golang ⇒ 改善のために使用## 開発機能詳細
ピッチ資料を生成する機能です。
https://www.hear.co.jp/recruit/saiyoupitch-100sen
機能の内部処理の流れとしては以下の通りです。(AS IS)
1️⃣ **ユーザーはPDFファイルをアップロード**
2️⃣ **アップロードされたファイルをローカルのディスクに一時保存**
3️⃣ **ローカルディスクに保存されているPDFスライドを画
Go未経験のバックエンドエンジニアがGoらしさに触れる(命名規則編)
## Go言語文化圏に踏み出す前に
Go言語ですが、「ただ一つのことをうまくやる(Do one thing and do it well)」という思想がある言語です。
つまり、かなり設計思想や原則を守った開発を求められることになります。
もし、Go言語文化圏について学ばずにGo言語のソフトウェアに足を踏み出してしまうとGo言語文化圏では厳しく罰せられるかもしれません。もし、Go言語の原則を知らないまま開発を進めてしまうと、待っているのはチームや自分自身の疲弊、保守性の悪いセンスのないソフトウェア、のような地獄になるかもしれません。
そんな地獄には足を踏み入れたくない。そんな私がGo言語文化圏について学んだことをシェアしようと思います。
## 対象の読者
– Go言語知らないけど、どんな特徴があるかは抑えたい人
– Go言語をこれから勉強しようと思っている人、初学者## この記事のゴール
– Go言語の命名規則をざっくりと把握する
– Go言語書いたことがなくても、「Go言語って、〜なところがある言語だよね」とドヤ顔で雑談ができる## 参考書籍
– [実用Go言
初心者視点で読むGoチュートリアル
## はじめに
個人開発でバックエンドにGoを使いたかったので、Goの勉強を始めました。
疑問をその都度解決していく勉強法なため、横道にそれまくりますが、Goを勉強し始目た時に同じ壁にぶつかった人の助けになればと思っております。コードは[本家様](https://go.dev/doc/tutorial/z)をご参照ください。## Goとは
Goとは、Googleがサポートするオープンソースのプログラミング言語です。
## 環境構築編
早速環境構築を始めます。
まず、[Go公式](https://go.dev/dl/)からGoのインストーラーをダウンロードします。[homebrew](https://brew.sh/ja/)を使わないのは`brew upgrade`で意図せずバージョンアップさせそうだからです。
インスターラーでのインストールが完了したら、[.zshrc](https://qiita.com/siakio/items/f9ab8a02d7b7fa6963ba)に下記(パス)を記述します。
“`
export PATH=$PATH:/usr/local/