エンジニア採用担当がプログラミング頑張る話【4日目/2ヶ月間】
こんにちは、@hiroki_maekawaです。
昨日は環境設定のところで脳みそが溶けそうになったのですが、改めて頑張っていきたいと思います。
今日の目標
1. 環境変数の理解
2. Goを実際に書いてみる
3. Goでhttpリクエストをしてみる
4. コードの内容を共有し、コメントをもらう
1. 環境変数(PATH)の理解
@Sueken51さんから教えていただいた下記の記事、Step by Stepで分かりやすい。。理解。
その後、コマンドぽちぽちして、mkdirが打ててたのもPATHのお陰だったのか!と自分の中で勝手に納得。
(base) HirokinoMacBook:~ hirokimaekawa$ cd ..
(base) HirokinoMacBook:Users hirokimaekawa$ cd ..
(base) HirokinoMacBook:/ hirokimaekawa$ cd bin
(base) HirokinoMacBook:bin hirokimaekawa$ ls
[ df launchctl pwd test
bash domainname link rm unlink
cat echo ln rmdir wait4path
chmod ed ls sh zsh
cp expr mkdir sleep
csh hostname mv stty
date kill pax sync
dd ksh ps tcsh
(base) HirokinoMacBook:bin hirokimaekawa$
2. Goを実際に書いてみる
goディレクトリの下にsampleprojectディレクトリを作り、その下にhello.goファイルを作り、Hello, World.のコードを下記、コマンドでgo run hello.go!
できました。Goで記念すべき初Hello World。
この後1日目に習ったgit pushも行い、復習することができました。
「ファイルはなぜ.goで終わらせないといけないのか?」という質問にも答えていただき、理解。
3. Goでhttpリクエストをしてみる
今朝@Sueken51さんから頂いたヒントが、昨日立てた自分の仮説と似てる説。
早速Goでhttpリクエストするには何すれば良いか調べて→実際のコードを見て何やってるのか解読して→自分でも書いてみるという作戦でいくことにしました。
golang httpリクエストでググって、みんな何をしてるのか調べてみました。するとまずみんなGETリクエストしてることが分かりました。(メインで参照したのはこの3つ。)
GETリクエストの一例(右に自分なりの見解を入れてます。)
package main //こいつは最初にかかなきゃいけないやつと理解
import ( //こいつは最初のパッケージに含まれてないけど入れておきたいってやつを、目的に応じて記載
"net/http"
"io/ioutil"
)
func main() { ///func=function=関数のこと。{}の中に入れると実行しますよってイメージ?
response, _ := http.Get("http://httpbin.org/get") //HTTPリクエスト行
body, _ := ioutil.ReadAll(response.Body) //ボディ:POSTで書かれるやつって書いてあったけどなんでここに書いてある???
defer response.Body.Close() //deferは特定の処理を最後にできるやつ。よくリソースの解放(close)に使用される。response.Bodyは上の2行のことを指してる??
println(string(body)) //printlnは出力関数、stringは文字列
}
httpリクエストには種類があるらしい?
①GETリクエスト:欲しいデータの条件を送信してデータを取得するリクエストのこと
②POSTリクエスト:ユーザー情報などを編集した時、編集したユーザーのの情報を送信して、編集データの保存結果を取得する時に使うリクエストのこと
①GETリクエストする時には、条件も送信するらしく下記2つで構成されている。
1. HTTPリクエスト行:リクエスト行は一行で、Get(メソッド)URL(メソッドの対象)クエリ文字列もしくはURLパラメーター(サーバーに情報を送るため)
2. HTTPヘッダー行:リクエストの下はヘッダーと呼ばれ、リクエストの詳細を示す。
次はPOSTリクエスト
package main
import (
"net/http"
"net/url"
"io/ioutil"
)
func main() {
resp, _ := http.PostForm( //Getではなく、こちらはPostForm
"http://httpbin.org/post",
url.Values{"foo": {"bar"}, }, //どうやらnet/urlのパッケージと関係があり、Valuesは、文字列を数値に変換できる関数
)
body, _ := ioutil.ReadAll(resp.Body) //ioutilのパッケージのReadAll関数という意味。ReadAllは内容を全て読み込む。
defer resp.Body.Close()
println(string(body))
}
②POSTリクエストは下記3つで構成されているみたい。
1. HTTPリクエスト行」
2. HTTPヘッダー行」
3. HTTPボディ部」
【用語】net/httpパッケージは、HTTPクライアントとHTTPサーバーを実装するために必要な機能が提供されてる、HTTPを扱うパッケージ。(Go言語でHTTP通信をするには、net/httpパッケージを使用する。)
【用語】io/ioutilパッケージには、入出力に利用するユーティリティ関数(役に立つ関数)が定義されている。
2つのコードを読んでググりまくって分かったこと
・package mainは最初にかかなきゃいけないやつ
・importは上のパッケージに含まれてないけど、今回は入れておきたいってやつを目的に応じて入れる。
・func=function=関数のこと。{}の中に入れると実行しますよってイメージなのか?
・resp=responceは、GETリクエストの一行目に書くやつ。URLをGetしてくるリクエスト文というイメージ。
・http.Get、http.PostForm、ioutil.ReadAllなどは全てパッケージ名.関数ということが分かった。
・deferは何かエラーが起きてしまった時の対策で、よくリソースの解放(close)に使用される。
・importで色んなパッケージ入れれば入れるほど、実現したい関数のバラエティを増やしていけるイメージなのか?
・Stringとは文字を並べたもの(文字を入れることができる箱のイメージ)
その後、このサンプルコードをVScodeにコピペして、コマンドでgo run "ファイル名"してみたら、HTMLのコードがばーっと出てきました。ここで初めてGETリクエストの流れを理解することができました。
また、サンプルコードの意味は完全に理解できませんでしたが、あるURLのHTMLコードを取得するには、下記4つが含まれて入ればいいのかな?と考えました。
①HTTPリクエスト行を入れる
②ReadAll入れる
③万が一のエラーのためのコードを入れる
④HTMLをStringで取得するコードを入れる
その後、httpパッケージ、ioutilパッケージのサイトを参考にしながら、自分なりにコードを書いてみました。
package main
import (
"io/ioutil"
"net/http"
)
func main() {
url := "https://www.crunchbase.com/organization/zoom-video-communications#section-overview"
resp, err := http.Get(url) //①HTTPリクエスト行を入れる
if err != nil {
}
defer resp.Body.Close() //③万が一のエラーのためのコードを入れる
body, err := ioutil.ReadAll(resp.Body) //②ReadAll入れる
println(string(body)) //④HTMLをStringで取得するコードを入れる
}
これでrunできました!感動。
4. コードの内容を共有し、コメントをもらう
ここまでいった時点で既に深夜だったので、共有は明日の朝にします。
さいごに
このブログを書きながら&コードを書きながら思ったのですが、プログラミングを長年やっている方は、他の人が書いたコードを見れば、その人がどのように物事を捉えているか、またどのように考えているか分かってしまうのでしょうか。。?
そう思うとなんだか恥ずかしさもありますが、同時に面白いとも感じました。
明日はスクレイピングの方法について勉強していきたいと思います。
それではまた!