見出し画像

エンジニア採用担当がプログラミング頑張る話【24日目/2ヶ月間】

こんにちは、@hiroki_maekawaです。

ぎっくり背中からの復帰初日になるので、首と背中をいたわりながらプログラミング学習していきたいと思います。


1. AtCoder練習問題

まずはAtCoderのABC問題から。

スクリーンショット 0032-06-26 10.42.27

Scanしてから、1がいくつあるのかループ処理か何かで数えるのか?という考えは出てきますが、それをどういう風にコードに書けば良いのか検討がつきません。

この問題を解説しているページを上から読んでみて、何かしらのキーワードが出てくる度にググって自分で問題を解決しようと試みますが、やはり検討がつかず。。

まだまだ自分の中のレパートリーがないんだなと思い、最終的には答えのサンプルのコードを参考に解読していく作業をしました。

package main

import "fmt"

func main() {
   var str string
   fmt.Scan(&str)
   cnt := 0
   for i := 0; i < len(str); i++ {
       if str[i] == '1' {
           cnt++
       }
   }
   fmt.Print(cnt)
}

まずはstrというstring型の変数を宣言して、fmt.Scan(&str)で読み取る。

その後、0からstrの長さまで1つづつ各要素に1があるかループ処理を行い、1があった分だけfmt.Printするという流れ。

ここまで理解したところで、これを0から自力で書けるかチャレンジしてみました。

package main

import "fmt"

func main() {
	var str string
	cnt := 0
	for i := 0; i < len(str); i++ {
		if str[i] == '1' {
			cnt++
		}
	}
	fmt.Println(cnt)
}

ただこれだと8回中1回しか正答(AC)できていませんでした(7回はWA (Wrong Answer))。fmt.Scan(&str)が抜けていたようです。。加えてもう一度提出したところ、8回とも無事正答できました。

練習問題は1日1時間できるところまでやるという課題ですが、1問理解して自分で書いて提出までするだけで数時間かかってしまいました(泣) 場数がまだまだ足りないです。


2. API経由でMySQLにデータを追加

ここまでできたところで、先週やるはずであった課題を並べます。

・API経由でCREATE/UPDATE/DELETEを行う
・記事100件APIの作成
・記事詳細APIの作成
・記事作成APIの作成
・記事更新APIの作成
・記事削除APIの作成

ぎっくり背中前に、「select文を実行して取得した情報をJSONとして返す(READ)」までできたので、CREATE、UPDATE、DELETEもできるようにしていきます、

ググったところ、CREATEはinsert文、UPDATEはupdate文、DELETEはdelete文で実現できるようです。

それではまずCREATEから。insert文は下記のように書くことができるので、MySQLに新しい値を入れて反映できるようなコードを書けば良いのかと理解。

INSERT INTO tbl_name VALUES (value1, value2, ...)

Apple、Orange、Grapeときたので、"name": "Banana" "price": 100を追加することにしました。

package main

import (
	"database/sql"
	"fmt"
	"net/http"

	_ "github.com/go-sql-driver/mysql"
	"github.com/labstack/echo"
)

//Fruit 構造体
type Fruit struct {
	ID    int    `json:"id"`
	Name  string `json:"name"`
	Price int    `json:"price"`
}

func main() {
	//Echo立ち上げる
	e := echo.New()
	//GETリクエスト(ルーティング)
	e.GET("/show", show)
	//サーバー起動
	e.Start(":9009")
}

func show(c echo.Context) error {
	//接続
	db, err := sql.Open("mysql", "root:password@/gomysql")
	if err != nil {
		fmt.Println(err)
	}
	defer db.Close()

	//insert文
	_, err = db.Query("insert into gomysql (id, name, price) values (4, 'Banana', 100)")
	if err != nil {
		fmt.Println(err)
	}
	defer db.Close()

	//複数レコードをselect -> ループ処理
	rows, err := db.Query("select id, name, price from gomysql")
	if err != nil {
		fmt.Println(err)
	}
	fruits := make([]Fruit, 0)
	//ループ処理 + Next関数
	for i := 0; i < 4; i++ {
		f := Fruit{}
		rows.Next()
		err = rows.Scan(&f.ID, &f.Name, &f.Price)
		if err != nil {
			fmt.Println(err)
		}
		fruits = append(fruits, f)
	}
	return c.JSON(http.StatusOK, fruits)
}

insert文を追記して実行しましたが、3つしか出力されていなかったため、ループ処理の回数を変えたところ何とかデータをinsertしてから全てのデータを出力することができました!

スクリーンショット 0032-06-26 21.18.13


今日できるようになったこと

・API経由でMySQLにデータを追加


さいごに

何とか復活はしましたが背中と首にまだまだ疲労が溜まりやすいので、ストレッチをこまめに入れながらプログラミング学習継続していきたいと思います。

それではまた!


この記事が気に入ったらサポートをしてみませんか?