Eat, Play, Nap and Code

食とあそびと昼寝とプログラミング学習

週報 2021/6/7(月)〜2021/6/13(日)

f:id:eatplaynap329:20210616211148p:plain

📚 1週間の感想

こんにちは〜!また書くのを後回しにしちゃって水曜になってしまいました。 今週(というか先週)は毎日アニメの美味しんぼを見て過ごし、推しキャラの富井副部長のモノマネをして猫をビビらせたりしていました。

自分と美味しんぼの関係を話すと結構長くなります。 私は小学3年から中学1年までドイツで日本人学校に通っていたんですが、当時はKindleYouTubeもなく、かつ、我が家ではインターネットは1日30分という謎ルールを課せられていたため、娯楽といえばJSTVか、友達のうちにある漫画だけだったんです。 友達自身の持っている漫画をあらかた読んでしまった後、友達のお父さんの蔵書から貸してもらったのが自分と美味しんぼの出会いでした。特に小6〜中1のときに仲良くなった(今でも親友の)Sちゃんちのお父さんは、ほぼ全巻の美味しんぼを持っていたので、毎日1冊ずつ借りて舐めるように読んでいました。日本の食事にも飢えていたので、どの料理も羨ましかった…😭

色んなWebサービスの発展のおかげで、いま外国に住んでいる子供にはたくさん母語で楽しめる娯楽があるから、友達のお父さんの漫画は読まないかもな。 そもそも紙の漫画を外国に持ってきている家族がいないかも。それでもNetflixYouTube美味しんぼを発掘して見ている子もいるかもしれないですね。

それでは、上の話とはあまり関連もないですが今週の振り返りをしてみます!! Sinatraのプラクティスも、DBを利用しないバージョンを提出&合格し、DB利用版を動く状態まで書けたので、佳境に入ってきたという感じですね〜💪分からなくてもいつかは終わるんですね!

📚 もくじ

📚 今週やったフィヨルドブートキャンプのプラクティス

  • Sinatra を使ってWebアプリケーションの基本を理解する
  • WebアプリからのDB利用

📚 目標と成果

目標 成果 来週の課題
SinatraメモアプリJSON版合格 OK -
SinatraメモアプリDB利用版提出 NG 来週は!
YouTubeでテスト書きまくる OK 自分のエディタから使えるようになりたい

📚 学習時間

日付 時間
6/7(月) 06:00
6/8(火) 05:45
6/9(水) 05:00 ​
6/10(木) 05:00
6/11(金) 03:30
6/12(土) 03:00
6/13(日) 02:30
合計 30:45

📚 週報

📅 6/7(月)

💪 やったこと

Sinatraメモアプリ修正

# ディレクトリトラバーサル未対策のコード
def convert_json_into_hash(params)
    @memo_info = File.open(params) do |file|
        JSON.parse(file.read)
    end
end

# ディレクトリトラバーサル対策をしたつもりで書き換えたコード
def convert_json_into_hash(params)
    @memo_info = File.open("datastrage/#{basename(params)}") do |file|
        JSON.parse(file.read)
    end
end

Gitで起きた問題

  • インスタンス変数名を変えたため、コミットメッセージに@を入れたら、誰かのアカウント名に紐付いてリンクされてしまった。
  • 質問タイムで聞いたところ、バックスラッシュで回避すればよいとのこと。
  • Pushするまで気づかなかったのでコミットメッセージを書き換える処理を初めて行うことになった。公式資料を見ながらやったらスムーズにできた。

🍕 感想

  • Sinatraメモアプリ、レビューに従って書くうちに自分が何をやってるのかが分かってきた。また進捗が遅くなってしまうけど、新しいことをやる前に落ち着いて修正をしていきたい。
  • 色々やることがたまっているので少しずつ消化していきたい。

📅 6/8(火)

💪 やったこと

Sinatraメモアプリ修正

  • 昨日の日報でディレクトリトラバーサル対策をしたつもりでNoMethodErrorが出ていたコード、File.basenameるりまをちゃんと読めば何が間違ってるか一目瞭然だった。
  • 空のディレクトリはPushできないと耳にしていたので、作ったJSONファイルを入れておくディレクトリに.gitkeepというファイルを置いて提出した。
  • もっと追加の修正が入るかと思ったけど、2回めの提出で合格がいただけた😭
  • 提出時は全く心のゆとりがなくて、最低限の機能のものしか作れなかったが、余裕が出来たらCSSなどの歓迎要件も追加してみようかな。

🍕 感想

  • ブログを書いていた日。タマキ (id:shirotamaki)さんに↓のような感想をいただいて感無量😭

- 先週の週報から目標の達成度を見てみると、ざっくりした目標だと達成できていない(というか、目標自体を振り返ってみるまで忘れている)気がする。例えば「質問タイムで質問1回する」とかだと、頭の片隅に残っているので達成できている。上手な目標の立て方を今一度考えてみたい。

📅 6/9(水)

💪 やったこと

SinatraメモアプリDB利用

  • SQLの概要を知るために以前使っていた教材がMySQLのものだったため、postgreSQLのコマンドを覚えるのに苦戦した。 SHOW DATABASES\lで、USE DATABASE\c
  • postgreSQLではワイの大好きなAUTO_INCREMENTも使えない😭代わりにSERIALで似たような機能が実現できる。
  • とりあえずフォームから受け取った値をDBに保存→保存したメモのタイトルを一覧に表示まではできた。
  • 一覧は最初↓のようになってしまったが、putsで値を表示させようとしていたため、putsメソッドの戻り値nilが入ってしまったのかと予想(チェリー本輪読会で得た知識)。

image.png

  • putsを消したら各メモのタイトル情報がハッシュになったものが取得できた。

image.png

  • ここから先はerbをいじれば実装できる(後から考えると変数名をJSON版と同じにしていればerbは変更の必要なかった)。

image.png

  • ↓でメモをDBに新規保存できるようになった。VALUES('#{memo_title}', '#{article}')")#{memo_title}#{article}をクオートで囲まずに実行したらエラーが出て困った。
post '/memos' do
  memo_title = params[:memo_title]
  article = params[:article]
  conn.exec("INSERT INTO memo(memo_title, article)
    VALUES('#{memo_title}', '#{article}')")
  redirect to('/memos')
end

🍕 感想

  • DB利用SinatraSQLで考えればいいと思うと書くことがシンプルでとても楽だな〜。
  • 最近昼食後に1時間くらいnapしてしまう…Zzzz

📅 6/10(木)

💪 やったこと

SinatraメモアプリDB利用

  • SinatraメモアプリDB版の動作verができた〜!これから地獄のようなリファクタリングが待っている。
  • 現状自分のローカルのDBに接続するようなコードになっているので、どうやってメンターさんのローカルで実行できるようになるのか考えないと。
  • あとSQLインジェクション対策と、クラスに切り分けと、できればCSSもあてたい。心に余裕が生まれてきたので。

🍕 知識

  • 🇸🇱 はファミマではなくシエラレオネの旗。
  • nil.to_iは0。
    • nil.to_i.nextは…?

📅 6/11(金)

SinatraメモアプリDB利用

# プレースホルダー未実装
get '/memos' do
  @title = '一覧'
  @memos = conn.exec("SELECT * FROM memo ORDER BY id")
  erb :index
end

# プレースホルダー実装
get '/memos' do
  @title = '一覧'
  conn.prepare("show","SELECT * FROM memo ORDER BY $1")
  @memos = conn.exec_prepared("show", ['id'])
  erb :index
end
  • ↑で動くものの、ただ正直コードが果たしていることの詳細はあまり理解できていない。prepareメソッドの第1引数であとで呼び出すためSQLの命令名を定義して、第2引数にSQLの命令を入れて、その後のexec_preparedメソッドでさっき定義した命令を第1引数で呼び出して、変数に第2引数を入れて実行しているという理解で進めたけどあってんのかな。
    • prepareで、命令につける変数名に何か決まりがあるのか気になる。何でもいけそうだから適当につけてしまった。

🍒 チェリー本輪読会

  • るりまに出てくるintstrchrみたいな略語が何か分からないという話が出た。言われてみると確かにどこ由来かわからないまま何となく類推して使っていた。
  • 今日自分もSinatraの課題で、pgのドキュメントにstmtという略語が出てきてstatementのことだと分かるまで結構時間がかかったので、↓に自分がよくみる省略形と理解してる意味を書いてみた(間違ってるかも)。
省略形 正式な形 意味
int integer 整数
chr character 文字
str string 文字列
arry array 配列
opt option 省略可能なもの
ans answer 回答
stmt statement 命令

🍕 感想

  • 輪読会3週目終わった!まだ1ヶ月経ってないとか信じられない。めちゃくちゃRubyの理解度が上がったし、メンバー同士仲良くなれた。
  • テストの書き方・読み方が分かったのと、色んな便利なメソッドや洗練された書き方にふれることができたのは大きな収穫。
  • Sinatra、DB利用版の方が遥かに楽…と思ったけどどうでしょう。Railsの前にSinatraのプラクティスが2種用意されているのって、段階を踏んだステップを準備しているという点で親切なんだろうけどすごくスパルタな気がする。

📅 6/12(土)

💪 やったこと

SinatraメモアプリDB利用

  • 一昨日の時点のコードで、過去に割り当てられたSQLが呼び出されてしまって「Prepared Statementが既に存在している」というエラーが出てしまったので、ブートキャンプ内のQ&Aを参考にDEALLOCATEを試してみる。
# 過去のSQL文が割り当てられちゃうコード
get '/memos' do
  @title = '一覧'
  conn.prepare('show', 'SELECT * FROM memo ORDER BY $1')
  @memos = conn.exec_prepared('show', ['id'])
  erb :index
end

# 過去のSQL文割り当て対策したコード
get '/memos' do
  @title = '一覧'
  conn.prepare('show', 'SELECT * FROM memo ORDER BY $1')
  @memos = conn.exec_prepared('show', ['id'])
  conn.exec('DEALLOCATE show')
  erb :index
end
  • これでrubocopも通ったので、提出してもいいかと思ったが、後回しにしていた1番重要な問題を思い出す。自分が自分のMacにインストールしたpostgresqlのDBのテーブルにアクセスしている分には問題ないけど、メンターさんがGitHubからフォークするときはどうすればいいのか!
    • Sinatraの操作を書いているファイルにSQLを実行して実行側のローカル環境に自分の指定したいDBとテーブルを作成するコードを書く必要がありそう。
    • しかし具体的にどう書けばいいのか分からないので、paizaのSinatra講座を見直してどうやってるのか参考にする。
  • CSSをちょっと書いてみた。凝ったことをするつもりはないけど、サルワカと自分の過去の提出物を見ながらフォームの部分くらいは整えたい。

🍕 感想

  • 土日はプラクティスは休むつもりだったんだけど気になって進めてしまった。楽しいのでヨシッ!
  • 久々に散歩に行きつつオーディオブックを聞いた。普段寝転んで聞いてるときの5割増しくらいで理解できてちょっと驚いた。散歩すごい。色んな理由で夏が苦手なので早く秋になってほしい🙏

📅 6/13(日)

💪 やったこと

SinatraメモアプリDB利用

  • 昨日できたからCSSをつけて今日提出するかな〜と思ってたらまた同じPG::DuplicatePstatementのエラーが出てしまった。
  • う〜〜〜ん、何で昨日はうまく行った感じがしたのか。(昨日のコードは参考にならないので無視してください)
  • また先輩の日報を読み漁り、prepareを外に出してDEALLOCATEを削除したらうまくいったっぽい?
  • 結局何がうまくいってるのか(いってないのか)分からないから、テストをすべきなんだろうな。

🍕 感想

  • 明日こそCSSをつけて提出するぞ〜
  • 今週末はほとんどプラクティスは進めようと頑張らず、本を読んで過ごした。結局いつもと同じくらいはできてるので、無理に頑張りすぎないのが1番だな〜と思う。

📚 来週の目標

  • SinatraメモアプリDB利用提出
  • 質問・雑談タイム1回は参加
  • Discordでわからないとき助けを求めるムーブを1度は取る