週報 2021/6/7(月)〜2021/6/13(日)
📚 1週間の感想
こんにちは〜!また書くのを後回しにしちゃって水曜になってしまいました。 今週(というか先週)は毎日アニメの美味しんぼを見て過ごし、推しキャラの富井副部長のモノマネをして猫をビビらせたりしていました。
自分と美味しんぼの関係を話すと結構長くなります。 私は小学3年から中学1年までドイツで日本人学校に通っていたんですが、当時はKindleもYouTubeもなく、かつ、我が家ではインターネットは1日30分という謎ルールを課せられていたため、娯楽といえばJSTVか、友達のうちにある漫画だけだったんです。 友達自身の持っている漫画をあらかた読んでしまった後、友達のお父さんの蔵書から貸してもらったのが自分と美味しんぼの出会いでした。特に小6〜中1のときに仲良くなった(今でも親友の)Sちゃんちのお父さんは、ほぼ全巻の美味しんぼを持っていたので、毎日1冊ずつ借りて舐めるように読んでいました。日本の食事にも飢えていたので、どの料理も羨ましかった…😭
色んなWebサービスの発展のおかげで、いま外国に住んでいる子供にはたくさん母語で楽しめる娯楽があるから、友達のお父さんの漫画は読まないかもな。 そもそも紙の漫画を外国に持ってきている家族がいないかも。それでもNetflixやYouTubeで美味しんぼを発掘して見ている子もいるかもしれないですね。
それでは、上の話とはあまり関連もないですが今週の振り返りをしてみます!! 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メモアプリ修正
- いただいたSinatraメモアプリのレビューを再確認。下記は修正できた。
- ディレクトリトラバーサル脆弱性対策はこの日中に終了できなかった。
- 安全なウェブサイトの作り方 - 1.3 パス名パラメータの未チェック/ディレクトリ・トラバーサル:IPA 独立行政法人 情報処理推進機構を読んで何をすればいいかは分かった。
datastrage
ディレクトリを新たに作って、新規作成したJSONファイルをここに保存することはできたが、params
から受け取った値からbasename(filename)
で指定してファイルを開く処理がうまくできなかった。params
が何かの理解が曖昧かもしれない。basename
を↓のように使おうとするとNoMethodErrorが出る。
# ディレクトリトラバーサル未対策のコード 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)さんに↓のような感想をいただいて感無量😭
npmとnpb(NipponProfessionalBaseball)の違いがわからない僕でもできました😆
— shirotamaki (@shirocks) June 8, 2021
わかりやすさホームラン級!!#fjordbootcamp https://t.co/GbkoEj53vZ pic.twitter.com/HWL4JO1dpM
- 先週の週報から目標の達成度を見てみると、ざっくりした目標だと達成できていない(というか、目標自体を振り返ってみるまで忘れている)気がする。例えば「質問タイムで質問1回する」とかだと、頭の片隅に残っているので達成できている。上手な目標の立て方を今一度考えてみたい。
📅 6/9(水)
💪 やったこと
SinatraメモアプリDB利用
- SQLの概要を知るために以前使っていた教材がMySQLのものだったため、postgreSQLのコマンドを覚えるのに苦戦した。
SHOW DATABASES
は\l
で、USE DATABASE
は\c
。 - postgreSQLではワイの大好きな
AUTO_INCREMENT
も使えない😭代わりにSERIAL
で似たような機能が実現できる。 - とりあえずフォームから受け取った値をDBに保存→保存したメモのタイトルを一覧に表示まではできた。
- 一覧は最初↓のようになってしまったが、
puts
で値を表示させようとしていたため、puts
メソッドの戻り値nil
が入ってしまったのかと予想(チェリー本輪読会で得た知識)。
puts
を消したら各メモのタイトル情報がハッシュになったものが取得できた。
- ここから先は
erb
をいじれば実装できる(後から考えると変数名をJSON版と同じにしていればerb
は変更の必要なかった)。
- ↓でメモを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
🍕 感想
📅 6/10(木)
💪 やったこと
SinatraメモアプリDB利用
- SinatraメモアプリDB版の動作verができた〜!これから地獄のようなリファクタリングが待っている。
- 現状自分のローカルのDBに接続するようなコードになっているので、どうやってメンターさんのローカルで実行できるようになるのか考えないと。
- あとSQLインジェクション対策と、クラスに切り分けと、できればCSSもあてたい。心に余裕が生まれてきたので。
🍕 知識
- 🇸🇱 はファミマではなくシエラレオネの旗。
nil.to_i
は0。nil.to_i.next
は…?
📅 6/11(金)
SinatraメモアプリDB利用
- 昨日動いたコードはSQLインジェクション対策をしていないので、調べて対策を講じる。pgのREADMEに書いてあるかな〜と思って見たけど全然見つからないので、皆さんの日報を頼りにリンクを辿って下記を参照しつつプレースホルダーを実装させるコードを書く。
# プレースホルダー未実装 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
で、命令につける変数名に何か決まりがあるのか気になる。何でもいけそうだから適当につけてしまった。
🍒 チェリー本輪読会
- るりまに出てくる
int
やstr
やchr
みたいな略語が何か分からないという話が出た。言われてみると確かにどこ由来かわからないまま何となく類推して使っていた。 - 今日自分も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からフォークするときはどうすればいいのか!
- CSSをちょっと書いてみた。凝ったことをするつもりはないけど、サルワカと自分の過去の提出物を見ながらフォームの部分くらいは整えたい。
🍕 感想
- 土日はプラクティスは休むつもりだったんだけど気になって進めてしまった。楽しいのでヨシッ!
- 久々に散歩に行きつつオーディオブックを聞いた。普段寝転んで聞いてるときの5割増しくらいで理解できてちょっと驚いた。散歩すごい。色んな理由で夏が苦手なので早く秋になってほしい🙏
📅 6/13(日)
💪 やったこと
SinatraメモアプリDB利用
- 昨日できたからCSSをつけて今日提出するかな〜と思ってたらまた同じPG::DuplicatePstatementのエラーが出てしまった。
- う〜〜〜ん、何で昨日はうまく行った感じがしたのか。(昨日のコードは参考にならないので無視してください)
- また先輩の日報を読み漁り、
prepare
を外に出してDEALLOCATE
を削除したらうまくいったっぽい? - 結局何がうまくいってるのか(いってないのか)分からないから、テストをすべきなんだろうな。
🍕 感想
📚 来週の目標
- SinatraメモアプリDB利用提出
- 質問・雑談タイム1回は参加
- Discordでわからないとき助けを求めるムーブを1度は取る