エンジニア採用担当がプログラミング頑張る話【15日目/2ヶ月間】
こんにちは、@hiroki_maekawaです。
さて、今週の目標は下記のようなので、早速進めていきたいと思います!
・RestfulAPIの構築
・http経由でデータのやりとり
・golangからmysqlに接続
今日の目標
・今週何をすればいいのか?全体像をつかむ
・Go Modulesを新しいディレクトリで実行する
・コードレビューの確認
1. 今週何をすればいいのか?全体像をつかむ
まずは分からない単語を調べてみました。
そもそもRESTfulAPIとは?
色々ググってみたところこんな感じ。
・RESTfulAPI=REST API。
・REST APIでの呼び出しインターフェースのこと。
・RESTの原則に沿った形で設計されたAPIのこと。
・クライアントとサーバー間でデータを送受信する方式のこと。
・HTTPメソッド(GET、POST、PUT、DELETE)で表現するもの。
・Webシステムを外部から利用するためのプログラムの呼び出し規約(API)の種類の一つで、RESTと呼ばれる設計原則に従って策定されたもの。
・「作成(Create)」「読み出し(Read)」「更新(Update)」「削除(Delete)」ができる。
→RESTという設計思想に基づいて作られた、クライアントとサーバー間でデータをやり取りする時に使うAPI(他のソフトウェアと機能を共有できるようにしたもの)。httpを使います。と理解。
httpとは?
こちらは「ITパスポート試験」を勉強した時に学びました。通信プロトコル。通信する時の決まり事というイメージ。
その後"Go RestAPI"とググり進めていくと、下記サイトを発見し、まずは環境構築→RESTAPIの実装になるのではと仮説を立てました。
色々と試行錯誤しながらやっていきたいと思います。
(その他にも、フレームワークのGinを使うと、APIをいい感じに実装できるらしいといったサイトがあったのでメモ。)
2. Go Modulesを違うディレクトリで実行する
go mod init したところGOPATHの設定をしていなかったことが判明したので、GOPATHの設定について調べていきたいと思います。以前PATHの設定を行ったのですが、パスについての知識が飛んでしまっていたので、、この際復習も兼ねてやっていきます。
(base) HirokinoMacBook:hiromae_week_3 hirokimaekawa$ go mod init
go: cannot determine module path for source directory /Users/hirokimaekawa/season-three/hiromae_week_3 (outside GOPATH, module path must be specified)
【用語】GOPATHとは、Goのソースを取りまとめておく場所を指定する環境変数のことであり、今回の場合、go mod initを実行するために設定する必要があるものと理解。(GOPATHを設定しないとgo mod initが実行できない。)
今自分のパソコンにある環境変数を確認($ printenv)
$ printenv
実はこのprintenvコマンドも/usr/bin/printenvと打っても実行できるが、環境変数$PATHに設定されているため、printenvだけで実行することができている。
確認の方法($ printenv PATH)
(base) HirokinoMacBook:hiromae_week_2 hirokimaekawa$ printenv PATH
/Users/hirokimaekawa/opt/anaconda3/bin:/Users/hirokimaekawa/opt/anaconda3/condabin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/Library/Frameworks/Python.framework/Versions/3.8/bin:/Library/Frameworks/Python.framework/Versions/3.8/bin:/Library/Frameworks/Python.framework/Versions/3.8/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/hirokimaekawa/myprojects/mydrivers
↑この中に/usr/binがあるためですね。
また普段ここまで遡らないですが、確かに/の中にもuseが確認できます。
(base) HirokinoMacBook:/ hirokimaekawa$ ls
Applications etc
Library home
Network installer.failurerequests
System net
Users private
Volumes sbin
bin tmp
cores usr
dev var
その後/usr/bin/printenvまで探してみると、、
(base) HirokinoMacBook:/ hirokimaekawa$ cd usr
(base) HirokinoMacBook:usr hirokimaekawa$ ls
bin lib local share
include libexec sbin standalone
(base) HirokinoMacBook:usr hirokimaekawa$ cd bin
(base) HirokinoMacBook:bin hirokimaekawa$ ls
//沢山あったので色々省略
printenv
確かにありました。
GOPATHも設定していきます。
go mod initを通すことがゴール→modはここにあったので、
/Users/hirokimaekawa/go/pkg/mod
GOPATH=/Users/hirokimaekawa/goを通してみます。
$ export 定義したい環境変数の名前=環境変数の中身
$ export GOPATH=/Users/hirokimaekawa/go
通らなかったので
$ export GOPATH=$HOME/go
これでも通らず調べたところ、vimを使って環境変数を設定しなければいけないことが分かりました。
ここからはvimの操作方法を調べながらやっていきます。
//編集画面を開く
$ vi ~/.bash_profile
//入力モードに切りかえ
i
//PATHを追加
GOPATH=/Users/hirokimaekawa/go
//保存と終了
:wq
//保存しないで終了
:q
//もし何かあったら
esc
//その後反映させる
$ source ~/.bash_profile
//GOPATHを確認
$ printenv GOPATH もしくは $ echo $GOPATH
これでGOPATHが設定できたので、再びgo mod initが通るか確認
(base) HirokinoMacBook:hiromae_week_3 hirokimaekawa$ printenv GOPATH
/Users/hirokimaekawa/go
(base) HirokinoMacBook:hiromae_week_3 hirokimaekawa$ go mod init
go: cannot determine module path for source directory /Users/hirokimaekawa/go/season-three/hiromae_week_3 (outside GOPATH, module path must be specified)
Example usage:
'go mod init example.com/m' to initialize a v0 or v1 module
'go mod init example.com/m/v2' to initialize a v2 module
Run 'go help mod init' for more information.
またエラーや〜
質問してみたところ、リポジトリをここに作る必要があるみたいでした。
/Users/hirokimaekawa/go/src/github.com/season-three/hiromae_week_3
調べたところ、ソースコードはsrc内に保存する必要があるとのことでしたが、なぜgithub.com内に入れなければいけないのか分からず、、
理由は「goのライブラリ管理がgithubに依存しているため、github.comに入れる必要がある」ということでした。とりあえず今のところはと覚えておくだけでOKとのことだったので、ここに備忘録としてメモしておきます。
github.com/{organization}/{repository_name}
レポジトリを移動して、これでようやく
$ go mod init
$ go build
無事go.modファイルとgo.sumファイルができてくれました。
3. コードレビューの確認
そもそも以前書いたテストコードがエラーだらけだったので、まずは実行できる状態に書き直しました。「エラーコードの意味を自分で調べて→修正」といった作業ができるようになっていたので、嬉しかったです。
またレビューの内容は「テストをループ処理するところに、関数を書くことで(=なんの関数をテストするかを明らかにすることで)、他の人が見て分かりやすくするという意味がある」ということを理解しました。
今日できるようになったこと
・vimを使ってGOPATHの設定
・エラーへの対処(以前よりましに)
さいごに
またもPATHでハマってしまった1日でしたが、良い復習になりました。また、以前よりエラーへの対処ができるようになっているのが収穫でした。
明日はいよいよREST APIの構築、環境構築からやっていきます。
それではまた!