はじめに
今日から、新しいチャレンジを始めます。それは「読んだ本のレビューを残すアプリ」をGo言語でアジャイル開発し、学びながら進めること。さらに、開発の過程でChatGPTやGitHub CopilotといったAIアシスタントを「仮想ペアプロ」として活用します。
なぜこんなことをやろうと思ったのか?
- Go言語を実践的に学びたい:
APIサーバやDB操作、テンプレート処理を通して学ぶ。 - 読書記録アプリを作りたい:
ISBNで書籍情報を取得し、そこにレビューやメモを残せるプラットフォーム。 - アジャイル開発で柔軟に:
段階的に機能を増やし、完成度を上げていく。 - ChatGPT & Copilot活用:
詰まったらChatGPTに相談し、コード補完はCopilotに任せる。 - 最終的にはカメラでバーコード読み取り:
QuaggaJSやZXingなどのJSライブラリを使い、スマホやPCのカメラでISBNをスキャン→自動的に書籍情報取得する流れを目指す。
目標とロードマップ
最終形をざっくりイメージすると、
- ISBN検索機能(外部API連携) → 書籍基本情報を取得
- レビュー機能 → 書籍情報に対してメモやコメントを保存
- バーコード読み取り機能(フロント側) → スマホやPCのカメラでISBNをスキャン、手入力不要
- メモ管理(編集・削除・一覧表示) → 本格的なレビューデータベース
これらをアジャイル的な小さなスプリントで区切って進めます。
スプリント例
- スプリント1: ISBN検索API(Goで外部API連携)
- スプリント2: フロントエンドでISBN入力→検索結果表示
- スプリント3: DB導入・レビュー記録機能追加
- スプリント4: レビュー編集・削除、一覧表示
- スプリント5: QuaggaJSやZXingを使ったバーコード読み取り機能実装
- スプリント6: デプロイ、UI改善、総仕上げ
※ スプリント数や内容は柔軟に変更する可能性あり
今日(Day 1)の活動結果
- プロジェクトのディレクトリ作成:
BookReviewを作成
(base) ******\projects\go\mkdir BookReview
(base) ******\projects\go\cd BookReview
- Gitの初期化:
git int でディレクトリのディレクトリを作成
(base) ******\projects\go\BookReview> git init
- Goの初期化:
Go言語のプロジェクトフォルダなので go の初期化も設定。
Go言語プロジェクトでモジュール管理を行う場合、go mod コマンドによる初期化が必要になることがあります。特に、外部パッケージを利用する際や、プロジェクトをより構造的に管理したい場合は以下のステップを踏むことが一般的です。
コマンド例:
(base) ******\projects\go\BookReview> go mod init bookreview
実行結果:
go: creating new go.mod: module bookreview
- GitHubリポジトリ作成:
my-book-review-app
のようなプロジェクト名でリポジトリ作成。
- HTTPサーバ起動テスト:
簡単なGo HTTPサーバを作り、「Hello, Book Review World!」が表示されるか確認。
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, Book Review World!")
}
func main() {
http.HandleFunc("/", handler)
fmt.Println("サーバーがポート8080で起動しています...")
http.ListenAndServe(":8080", nil)
}
// ビルドと実行
(base) ****** \projects\go\BookReview> go build
(base) ****** \projects\go\BookReview> ./BookReview
サーバーがポート8080で起動しています...
// 実行のみ
(base) ****** \projects\go\BookReview> go run .\main.go
サーバーがポート8080で起動しています...
- ChatGPT活用:PATH設定でちょっと悩んだが、ChatGPTに質問→すぐ解決できました。
- GitHub Copilot活用テスト:ハンドラー関数を書く際にCopilotが補完してくれ、今後が楽しみ。
HTTPサーバ起動テスト用コードの内容確認
上記で表した Go 言語を使った基本的な Web サーバーを実装したコードについてまとめました。
1. package main
- Go プログラムのエントリポイントを示します。
main
パッケージは実行可能なプログラムを構成する特別なパッケージです。
2. import
文
import (
"fmt"
"net/http"
)
- 必要なライブラリをインポートしています。
fmt
: フォーマットされた I/O 関数(例:Println
)を提供します。net/http
: HTTP サーバーやクライアントを扱うための機能を提供します。
3. func handler(w http.ResponseWriter, r *http.Request)
- これは HTTP リクエストを処理するハンドラー関数です。
w http.ResponseWriter
: HTTP レスポンスを書き込むためのインターフェース。r *http.Request
: クライアントから送信された HTTP リクエストを表します。
- この関数では、
fmt.Fprintln
を使ってレスポンスに「Hello, Book Review World!」という文字列を書き込んでいます。
ハンドラー関数とは
HTTP リクエストを処理するハンドラー関数とは、Webサーバーに来たリクエスト(アクセス)を受け取って、それに対する処理を行う関数のことです。
この関数は2つの重要な要素を受け取ります。
- レスポンスライター(w):クライアントへの返信を書き込むためのツール
- リクエスト(r):クライアントから送られてきた情報
具体的には、このコードではクライアントがアクセスしてきた時に「Hello, Book Review World!」というメッセージを返す処理を行っています。
4. func main()
- プログラムのエントリポイントです。以下の処理を行います。
エントリーポイントとは?
エントリーポイントとは、プログラムの実行が開始される場所を指します。
Go言語では、mainパッケージ内のmain関数がエントリーポイントとなり、プログラムはここから実行が始まります。
このプログラムの場合、main関数の中で
- HTTPハンドラーの設定
- サーバーの起動
- ポート8080でのリッスン開始
という一連の処理が実行されます。
(1) http.HandleFunc("/", handler)
- ルート URL(
"/"
)にアクセスしたときに実行されるハンドラー関数を登録します。- ここでは
handler
関数が登録されています。
- main関数内で
http.HandleFunc("/", handler)
を使って、ルートURL(”/”)へのアクセスがあった時に実行される関数としてhandler
を登録します。 - クライアントがWebサーバーのルートURLにアクセスすると、登録された
handler
関数が呼び出され、「Hello, Book Review World!」というメッセージを返します。
- ここでは
(2) fmt.Println("サーバーがポート8080で起動しています...")
- コンソールにサーバーが起動中であることを表示します。
(3) http.ListenAndServe(":8080", nil)
- ポート 8080 で HTTP サーバーを起動します。
":8080"
: サーバーがリッスンするポート番号。nil
: デフォルトのマルチプレクサを使用することを指定しています。
実行結果
- プログラムを起動すると、ターミナルに以下が表示されます。
コードをコピーする サーバーがポート8080で起動しています...
- ブラウザで
http://localhost:8080/
にアクセスすると、以下のレスポンスが表示されます。コードをコピーする Hello, Book Review World!
学べるポイント
- HTTP サーバーの起動方法
- Go では
net/http
パッケージを使って簡単に Web サーバーを構築できます。
- Go では
- ハンドラー関数の作成
- HTTP リクエストを処理するカスタムロジックを実装できます。
- ポートの指定
- ポート番号を指定することで、どのポートでサーバーを動作させるかを制御します。
- シンプルな構成
- Go の標準ライブラリだけで基本的な Web アプリケーションを構築可能です。
このコードをベースに、さらに機能を追加してアプリケーションを拡張していくことができます!
明日以降にやること
- Day 2: Google Books APIなどを叩いて、ISBN指定でタイトル取得のプロトタイプを作る。
- 中盤: DB導入し、書籍レビューを保存できるようにする。
- 後半: QuaggaJSやZXingでカメラアクセス実装→バーコード読み取り→ISBN取得→書籍情報表示の流れを完成!
なぜバーコード読み取り?
入力を極力簡略化したいからです。
- 手でISBNを入力する手間を省く
- スマホのカメラで本のバーコード(ISBN)をスキャン→即座に書籍情報表示→レビュー記入、というスムーズなUXを提供したい
まとめ
今日は地ならし。Go言語でHello World的なHTTPサーバが起動できました。明日から、いよいよISBN検索APIの実装に入っていきます。最終的にはカメラでバーコード読み取りも実現し、より便利な読書記録ツールに育てていく予定。ChatGPT & Copilotと二人三脚で、試行錯誤しながら前進していきます!
コメントを残す