エンジニア採用担当がプログラミング頑張る話【26日目/2ヶ月間】
こんにちは、@hiroki_maekawaです。
今日は記事APIを作っていきたいと思います。
今日の目標
・昨日解いたAtCoder練習問題の復習
・記事APIの作成
1. 昨日解いたAtCoder練習問題の復習
昨日解けなかったAtCoderの練習問題に関して、昨日理解した模範解答を何も見ずに0から自分で書いてみました。
package main
import (
"fmt"
)
func main() {
var N int
fmt.Scan(&N)
A := make([]int, N)
for i := range A {
fmt.Scan(&A[i])
}
count := 0
for {
ok := true
for _, v := range A {
if v%2 != 0 {
ok = false
}
}
//模範解答は if !ok {break}
if ok != true {
break
}
for i := range A {
//もしくはA[i] /= 2
a := A[i] / 2
A[i] = a
}
count++
}
fmt.Println(count)
}
一点、A[i] /= 2の部分のイコールが抜けていましたが、それ以外は問題なさそうでした。
2. 記事APIの作成
記事API作成に関して、初めは「スクレイピングで〇〇ブログの記事のタイトルや文章などの詳細を取ってきて→データベースに保存して→その情報をJSONで出力させる。その後、スクレイピングで取ってきた記事の変更(更新)、削除のAPI作成等も行う。」
という感じなのかな?と思っていたのですが、記事に関してはデータベースに自分で下記のようなフィールド名のテーブルを作って、記事の内容をランダムに記入してOKとのことでした。
- 記事名(タイトル)
- 投稿者
- 投稿日時
- 内容
- イイネの数
それでは早速、データベースのテーブル作成から行います。
mysql> desc articleapi;
+---------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| title | text | YES | | NULL | |
| date | int | YES | | NULL | |
| content | text | YES | | NULL | |
| likes | int | YES | | NULL | |
+---------+------+------+-----+---------+-------+
5 rows in set (0.01 sec)
なかなか反映されず、likeをlikesとしたところ反映されました。
その後、作成したテーブルに記事の情報を追加するコードを書きました。
package main
import (
"database/sql"
"fmt"
"net/http"
_ "github.com/go-sql-driver/mysql"
"github.com/labstack/echo"
)
//Articles 構造体
type Articles struct {
ID int `json:"id"`
Title string `json:"title"`
Date int `json:"date"`
Content string `json:"content"`
Likes int `json:"likes"`
}
func main() {
//Echo立ち上げる
e := echo.New()
//GETリクエスト(ルーティング)
e.GET("/show", show)
//サーバー起動
e.Start(":9999")
}
func show(c echo.Context) error {
//MySQL接続
db, err := sql.Open("mysql", "root:password@/articleapi")
if err != nil {
fmt.Println(err)
}
defer db.Close()
//insert文
_, err = db.Query("insert into articleapi (id, title, date, content, likes) values (1, '【ITパスポート】を取得した方法。',20200512, '1.ITパスポートとは?2.ITパスポート受験するメリット3.筆者について4.勉強時間5.試験結果6.勉強方法7.いかがでしたでしょうか?',3)")
if err != nil {
fmt.Println(err)
}
defer db.Close()
//複数レコードをselect
rows, err := db.Query("select id, title, date, content, likes from articleapi")
if err != nil {
fmt.Println(err)
}
articles := make([]Articles, 0)
//ループ処理
for i := 0; i < 1; i++ {
a := Articles{}
rows.Next()
err = rows.Scan(&a.ID, &a.Title, &a.Date, &a.Content, &a.Likes)
if err != nil {
fmt.Println(err)
}
articles = append(articles, a)
}
return c.JSON(http.StatusOK, articles)
}
無事、反映されてます。
その後、更新や削除もコードを変えて試し、最終的に3つ分の記事の詳細について出力しました。
今日できるようになったこと
・記事APIの作成
さいごに
今日の記事APIの作成は、これまで行ってきたことの復習編のような感じだったので特に詰まる所はなく出力まで行うことができました。
来週からはAPIの作成に加え、インフラ部分(AWS)にも着手できることになったので頑張っていきたいと思います!
来週の課題
・ec2を立てる
・ec2にssh接続
・ec2に自分の書いたコードを送る
それではまた!