見出し画像

無償のプログラミング入門講座CS50xをやってみる Week9

全体(17h)

オリンピックの開会式のお陰で4連休だったので、比較的余裕をもって一週間以内で完了することが出来ましたが、課題の一つが11時間以上かかったので、通常の週であれば、かなりカツカツだったんじゃないかと思っています。

課題では「Flask」で作りかけのWebアプリケーションを完成させたのですが、「Flask」は覚えることが少なく、簡単に扱うことが出来ました。ただ、覚えることが少ないということは多くの機能を自分で実装する必要があるということなので、それはそれで一長一短ですね。

動画(2.5h)

Webアプリケーションフレームワークは「Rails」の入門書や、入門コンテンツをいくつかやって、Railsのアプリケーションを保守したことがある程度なので、あんまり知らないんですが、FlaskはWebアプリケーションフレームワークに必要な最低限の機能を備えて非常にシンプルなソリューションに見えます。一週前の課題で自分のホームページをHTML, CSS, Javascriptで作ったのですが、テンプレートの機能がなかったのでヘッダーやフッターのHTMLをコピペしてたんですよね。単純で静的なサイトを作るだけでも使う理由は十分にありそうです。

また、クエリパラメータや、POST、セッション、Cookieの解説は日頃Webアプリケーションを使っている人なら見ておいて損はなさそうな内容でした。

Lab9 - Birthday(3h)

フォームで名前と誕生日を受け取ってDBに保存してページに読み込むアプリを作成する問題。見た目は気にせずにとりあえず機能だけ作りました。入力にバリエーションかけるのと、Flaskの「flash」と言う機能でエラーメッセージや成功メッセージを表示するようにしました。そういえばFlaskってテストどうやって書くんでしょうね。

Pset9 - Finance(11.5h)

ユーザー登録出来て、実在の株の売買をシミュレーションできるWebアプリケーションを作成する問題、結構時間がかかったので、実装したもの順に感想を書いていこうと思います。ちなみに実装に入るまでに1時間ほど問題とソースコードの読み込み、APIキーの準備を行っています。

実装したHTMLは参考にできるページが公式に提供されているので、それをほぼコピーして使っています。HTMLも自分で調べてとなるともっと時間がかかっていたのではないかと思います。

register(2.5h)
登録フォームとユーザー登録を実装しました。名前とパスワードをDBに保存するのはLab9でやったのとあまり変わらなかったのですが、登録名がユニークでないとけないので、その確認の実装には少し時間がかかりました。アカウント登録が成功したら自動的にログインするような動きにしてみました。

quote(1h)
「iex.cloud」と言うサイトのAPIを利用して、実在する会社の株価等を取得ししページへ表示するようにしました。APIを使い情報を取得する箇所は既に実装されていたので、フォームに入力された値のバリエーションと、POST、結果の表示を実装しました。取得前と取得後でHTMLを切り替えるという風に書かれていたんですが、面倒だったので一つのHTMLファイルで行っています。

buy(2.5h)
ユーザーに購入したい会社のシンボル(NetflixだとNFLXみたいなやつ)と数量を入力させて、株価を取得、購入を行い購入情報をDBに保存、同様にusersテーブルのcash列の更新も実装します。売買記録を保存するDBは自分で設計しないといけないので、なかなか時間がかかりましたが結構いい感じにできたかなと思っています。

index(2h)
画面更新時点の保有資産を表示するページを実装しました。株を売却している可能性もあるのですが、Sellページはまだ実装していないので、DBを直接更新しててテストを行いました。売買記録のテーブルを作成する際に、レコードが「売買」どちらなのかを示す列を作っておいたのが功をそうして、比較的すんなり実装することが出来ました。問題の説明文に書かれた順番を無視してSellを先に実装しても良かったかもしれないです。

sell(1h)
buyの逆を行うだけなので比較的簡単に実装できました。持っている株の銘柄をプルダウンメニューに表示させるのも、indexで使った処理を流用できました。

history(0.5h)
売買の履歴を一覧表示するページを実装しました。indexで取得した売買履歴をそのまま表示するだけだったので処理時代は以下のような感じで非常に簡単にかけました。

def history():
   transactions = db.execute("SELECT * FROM transactions WHERE user_id = ? ", session.get("user_id"))
   if len(transactions) > 0:
       return render_template("history.html", rows=transactions)
   else:
       return apology("no history", 400)

仕様上履歴が無い場合に、エラーを出す必要はないので、実際の処理は2行でかけてしまいます。履歴が無い場合はエラーを表示するようにしましたが、エラーにすることはなかったのではないかと思っています。

deposit(0.5h)
入金機能を追加しました。と言ってもここまでで使ったコードを流用しただけなので、サッと作成できました。

パスワード更新(0.5h)
パスワードを更新する機能を追加しました、registerとloginのコードをコピペしてやるとなんと簡単に出来上がりました。

スコア

画像1

Week 8


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