學習心得:

CS50 wk9 是學習用Flask框架做網絡應用,作業是做一個簡易的股票買賣網站。

wk8和wk9都是網頁相關的,一開始有些抗拒,感覺沒有前半部分的會涉及電腦底層知識的課程有趣。然後又一口氣教這麼多,壓力很大。

加上Finance是一個很大的作業,會不想下手。所以我改變想法,讓自己每天寫1個小時,專注在時間上,而不是專注在作業本身。因為有時候作業很難很複雜會造成很大的心理壓力讓我們拖延。這是從《學習如何學習》這門課程學到的,專注在Process,而不是Product。

最後直到進入做Finance這個作業的狀態的時候,發現稍微改動一下,馬上就可以很直觀的看到網頁的變化,感覺還是蠻好玩的。最後做完,也是蠻有成就感的。

CS50的每節課都是這麼神奇,一開始覺得不可能,寫完作業就感覺把不可能變成了可能。(哪怕這只是幻覺,也還是超棒的。)

筆記:

參考官方Notes

1.route

上週的HTTP/CSS/JavaScript可以創造出一個頁面,不過只是一個page。這週通過Python的Flask框架可以創造出一個網絡應用(web application),包含很多page,這樣就可以實現很多功能。

怎麼到不同的page就是靠route。比如下面的例子,在applicaiton裡先定義好不同的route執行不同的Function,執行完畢再返回不同的頁面。

@app.route("/")
def index():
    return render_template("index.html")

通過學習route發現兩個有用的技巧:

一是在網址裡打上加上年份比如2021/,就可以輕鬆顯示2021年的所有文章。之前看別人的部落格的時候常常想選某一年的文章來看,這下子可以一步實現了。試了10個網站,成功率50%。比如這兩個(https://hiraku.tw/2022/https://rich01.com/2020/)也是ok的。

另外還發現我的部落格文章的URL設置太長,進一步改善裡我的WordPress 部落格URL 設置

Flask

Flask是一種框架,是別人寫好的很多Function,我們直接拿來用。比如Flask框架裡有自動發郵件的Function,使用此功能,只要在模板上填寫要發送到什麼郵箱之類的個人設置,不用自己慢慢寫code。

用現有的框架很省時間,但是為了順利運行,必須要遵守框架給我們的模板,比如Flask的四個模板。

Flask模板:
app.py
requirements.txt
static/
templates/

1.app.py,主要應用程序;

2.requirements.txt,列出支援應用的模塊;

3.static/,包含CSS和其他修改網站外觀的文件;

4.templates/,包含所有的HTML模板。

網站的實現-Model View Controller

MVC模型是MVC模式是一種網絡應用架構模式。把網路應用分為三部分:模型(Model)、視圖(View)和控制器(Controller)。

model:數據庫處理數據;

view:html和css控制網頁的頁面顯示。可以從網頁獲得信息(輸入)和展示信息(輸出);

Controller:程式應用用來控制和聯繫model和view。

GET/POST

GET/POST是應用層HTTPS協議裡規定的方法,具體是通過HTML Body的Form裡的選擇來實現的。

<body>
        <form action="/greet" method="get">
            <input type="submit">
        </form>
</body>

二者主要的區別是用法不同。

  • GET用來獲取數據比如看網頁。

為了使用方便性,當提交Form後,Form裡提交的值會以key=value 的形式顯示在URL裡。

比如下面的網址,google search的時候URL就會顯示q=what+time+is+it這一組key=value。這樣每次每次獲取數據的時候不用再重新輸入了。

https://www.google.com/search?q=what+time+is+it
  • POST用來執行或操作,比如登入會員。官方文件裡列舉了如下的用法。

如果使用POST,key=value則不會顯示在在url裡,因為隱私的關係。

w3schools 有總結二者區別,但是RFC文件裡好像並沒有規定這麼多。

Session/Cookie

HTTP請求網頁是stateless,沒有狀態,意思是不會記得你是誰。索取一個信息然後獲得信息後,就結束了。在statless的狀態下,我們每次只能打開一個網頁,如果是登陸系統的話,就需要不斷的輸入用戶名密碼login。

通過Session就解決了HTTP的stateless的特性,把網絡應用變成stateful,有狀態,記得你是誰。就好像去動物園蓋個手章,每次進入秀個手章就可以了。

而cookie是實作Session的方式之一。比如第一次登入網頁login的時候,會通過Set-Cookie被自動置入一個cookie,相當於蓋一個手章。

HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: session=value
...

這個cookie是一串很長的比如下面的代碼,每個用戶單獨一個代碼。相當於蓋手章。

2029240f6d1128be89ddc32729463129

下一次在登入同網絡應用的時候,http請求會自動展示這個session來表明身分。

GET / HTTP/1.1
Host: gmail.com
Cookie: session=value

這樣就可以無限瀏覽此應用的網頁和瀏覽無限多次。

當然也可以設置session的時間,像是股票購買網站可以設置比較短的時間比如15分鐘,像是郵件登入應用可以設置很長比如一個月。

cookie可以幫我們實現網站登錄和購物車的功能,但是也會被有心網站(比如FB和google記住,向我們精準投送廣告。

更多cookie有關內容可學習HTTP Cookies: Standards, Privacy, and Politics

Finance作業心得:

1.看往年的walkthrough,2017年版本的比如C$50 Finance / register也會提供多一些顯示。

2.耐心,這個pset我花了1個月,平常沒有時間,用每天早起的一個小時來完成。

3.作業一開始有給人很簡單的錯覺,只不過是用SQLite數據庫、HTML/CSS、Python語言和Jinja這套Model View Controller來做很多個網頁然後串在一起。

在做的過程中,發現自己在Python的dictionary、SQLite數據庫的各種操作和HTML的form上都犯了很多錯誤。其實想想光靠一節課學Python,一節課學SQLite數據庫,一節課學HTML/CSS,每個都學個皮毛,然後再一節課用這些皮毛學著把所有的都串起來,想想不出bug才是不可能的。

所以,這個finance pset是CS50課程中唯一一個參考部分solution的pset,看別人的solution也是一種學習。

後續學習-From Nand to Tetris

學完CS50算是對軟體層面稍微有個big picture。

本來想學習CS50W,因為1)CS50團隊出品;2)據說比CS50更難,想挑戰看看;3)馬上可以產出作品,很有成就感。

但是考慮了下,決定先學From Nand to Tetris這門課程看看。因為:

1)在學習CS50時候,比較感興趣的是前幾章和電腦底層知識相關的。Nand2Tetris 號稱:“從零開始造一台電腦“,從硬體到軟體,講解電腦是怎麼運行的,激發了我想要探索的好奇心。

2)先理解然後chunk最後神經元才會連結的更多。我覺得學習基礎課程應該可以幫助理解。現在回想今年一月份學習Python課程(心得)的時候,覺得一切都很難。經過了CS50的課程,現在連看_Computer Systems: A Programmer’s Perspective_這種經典教科書都覺得好像可以努力試試看。就是因為CS50課程花了一些時間在講電腦底層的知識。

3)刷到Scott Young的文章,裡面說自己做出來一點東西(比如網頁或app等)再學習CS相關的理論知識會非常有趣。Teach Yourself Computer Science也建議先學編程,再學CS。然後完成本週的作業我也算在老師的幫助下勉強做出來一個網站。所以可以去學更有趣的理論知識了。

4)鍛鍊下我的邏輯和思考能力。

huli大大說這門課很吃邏輯和思考能力(文章),這剛好是我所欠缺的。看看上這門課能不能鍛鍊一下。

總結:

CS50課程學完作業做完,算是挑戰成功。課程最後要求做的Project,等以後有興趣學習網頁製作的時候,比如CS50W的時候再做吧。

翻看了下我的github,從2月4號到7月7號,總共花了5個月的業餘時間完成。雖然花了很久,但是總算是完成了。