Python WSGI 及其應用

tags: python, wsgi, gunicorn, uwsgi

Python WSGI及其應用

WSGI是什麼?

  • 全名Python Web Server Gateway Interface
  • 基於CGI
  • Python用來描述了伺服器和請求處理程式之間傳輸資料的一種標準(協議)

PEP3333

基本原理跟目標

server、app、framework共用的界面

…proposes a simple and universal interface between web servers and web applications or frameworks: the Python Web Server Gateway Interface (WSGI).

不再重造輪子

…the goal of WSGI is to facilitate easy interconnection of existing servers and applications or frameworks, not to create a new web framework

只會支援python既有的release

…precludes WSGI from requiring anything that is not already available in deployed versions of Python

未來會增加部署的標準

…current version of WSGI does not prescribe any particular mechanism for “deploying” an application for use with a web server or server gateway. At the present time, this is necessarily implementation-defined by the server or gateway

Read more “Python WSGI 及其應用” 發表留言

面試紀錄 Interview logs

tags: job

Interview logs

TOC

Tagtoo科技跨平台網路廣告

  • job: 後端工程師
  • interviewer: Teddy
  • location: 臺北市信義路四段267號11F
  • date: 2018.12.20
  • questions:
    1. 有沒有用Django開發過什麼專案?
    2. 有用過GCP的什麼服務?有用過GKE嗎?
    3. 看你的經歷,為什麼又想回業界?
    4. 有沒有AI的經驗?用過什麼工具(視覺化、統計分析)?
    5. 為什麼會想投我們公司?是哪個部份吸引你?
  • answers:
    1. 以我在目前任職的農科院有開發過的兩個專案來回答
    2. 主要是使用compute engine,有舉出使用情境:為了幫公司測試tableau server的功能,分別在GCP部署了tableau server及api server;另外有補充是以docker來做部署;至於GKE的部份還沒有摸過
    3. 這個問題我說明了在業界的公司為什麼離職,之後又為什麼會找公部門的工作,有點可惜沒回答到重點,其實主要是業界的技術水準跟real world的營運,能學到更多的東西,另外一方面則是薪水
    4. 回答之前線上課程有上過相關課程,用numpy、pandas、seaborn來打kaggle的經驗
    5. 這一題回答得不好,我回答因為公司所使用的技術滿吸引我,但沒有表現出對廣告投放或資料分析這方面的興趣
  • informations:
    • 目前Tagtoo的廣告拓及率已是領導的地位、規模也在擴張(東南亞:馬來西亞、印尼等),之前比較沒有用AI技術來分析資料(2-3億筆cookie),現在逐漸在加強這方面的分析應用
    • 不接受遠端工作,老闆覺得見面的直接溝通最有效率
    • 應徵的信件應該都是老闆自己回覆的
  • references:
  • results:
    offer get (N-10)*13

趨勢科技TrendMicro

  • job: [email protected] Segment
  • interviewer: Catherine、John
  • location: 台北市大安區敦化南路二段198號8F
  • date: 2018.12.21
  • questions:
    • 一面
      1. 介紹你最近全端開發的專案?
      2. 你說的這個專案是部署在哪裡?為什麼不部署在雲端?
      3. 你的專案有寫過任何測試嗎?是什麼樣的測試?
      4. 為什麼你會針對穩定性來做測試?
      5. 你的專案主要用到什麼工具?
      6. 你之前在業界任職時的專案開發流程為何?
      7. 你的優點跟缺點為何?
      8. 請排序你最想當的角色:code、maintain、testing、design
    • 二面
      1. 為什麼考卷最後一題是送分題你卻沒寫到?是時間太短嗎?
      2. 如果今天桌上有5顆外觀一模一樣的球,但重量不同,給你1個磅秤,你能在幾次比較過後依重量完成排序?
      3. 同上題,如果今天已知其中3顆球和其中2顆球重量相同,能減少你比較的次數嗎?
      4. 如果9跟3的交集是1,聯集是多少?
      5. 今天讓你測試一個登入頁面,有email、password跟1個登入按鈕,你會怎麼測試?
      6. 為什麼前兩個工作性質差異這麼大?
      7. 你有什麼壞習慣?
      8. 人生遇過最大的困難是什麼?
      9. 你守時嗎?
      10. 你未來短、中、長期計畫是什麼?
  • answers:
    • 一面
      1. 介紹了我用Django開發的視覺化網站,專案的緣由以及要解決什麼問題
      2. 部屬在Local Windows Server上,說明因為專案性質跟資源因此沒有部署在雲端,有說明其中利弊
      3. 這個專案從多個API抓取資料,有測試抓取資料的函式及紀錄log,另外針對執行時段較長(如時間範圍廣的)有另外測試
      4. 這個問題一時想不出來怎麼回答,就回答了因為遇到某個問題必須加上這樣的測試
      5. 抓取資料的排程用了redis、celery,後端是django,前端主要用到highchart.js及datatable.js
      6. 一個junior做開發,自訂合理的開發時程或senior同意後開始開發,其中有遇到問題適時反應給senior知道,pm對整個專案的成果負責
      7. 說明了太過悲觀主義,有時想太多劃地自限,但這同時是個優點也是個缺點
      8. code > mantain > testing > design
    • 二面
      1. 答題時間沒有規劃好,不應該發生這樣的事
      2. 磅秤是一種比較排序法,最佳時間複雜度會是O(NlogN)
      3. 答不出來,但可能可以減少?
      4. 原本超簡單的題目一時竟然回答不出來,腦袋卡在為什麼9跟3交集會是1,其中是經過什麼運算得到?主管回覆說可以,但不用想這麼複雜有直接答案
      5. 測試form沒填正確回覆的錯誤訊息是否正確,改變cookie來測試session,之後主管補充可以抓背後的API測試
      6. 這題回答得太長,但主要是遇到突發狀況跟想轉語言
      7. 有強迫症動作、駝背、沒運動習慣
      8. 家裡發生的突發狀況跟當時自己心境上的困境
      9. 自己是個守時的人
      10. 短期:點擊後端技能樹、加強技術能力;中期:在開源社群有所貢獻;長期:創業、做自己有興趣的project
  • informations:
    • 其實我是要面web後端RD,QA只是後來主管有興趣,前幾天臨時加的面試,結果RD當天已經沒有缺
    • 趨勢是看到cakeresume上的履歷,發email線上考邀請,以python做,約一個禮拜後約面試
    • 面試時對趨勢QA工作概況的認知:
      • by project
      • 從專案開始到最後產品上線後的使用者體驗部份全程參與
      • 有分成client端、backend等,行為模式會不同
      • 依照專案需求會碰觸到deploy
      • 該部門RD跟QA的人數比是1:1
    • 針對該部門做的專案細節介紹就不公開紀錄
    • 環境部份:
      • 沒停車位,很難找車位
      • 電梯常常大排長龍
      • 人資很可愛…
    • 說明自己開發用過得技術時比較沒有被challange到
    • 考題很廣,以下列一些比較有印象的:
      • OS: linux指令如chmod
      • code: 給一段code考輸出
      • Web: subnet、ajax
      • 邏輯: 小明大昨天7歲,明年10歲,請問小明生日
      • testing: 針對鬧鐘app列出可做的測試、兩個client端上傳檔案到cloud要注意什麼問題
    • 遇到的人資、面試官人都還滿好的,一整天面試下來滿舒服的
  • references:
    • everyting on google: 趨勢 qa 面試 ptt
發表留言

以Python實作演算法 – Algorithms Implements using Python

TOC

圖論 Graph Theory

G(V, E)

  • 由頂點(vertex, node)和連接頂點的邊(Edge)關聯成的圖形
  • 其中關聯分作有方向性(directed)及無方向性(undirected)
  • 須考慮最大流問題(maximum flow)

在程式語言有幾種方式來建構Graphs:

相鄰矩陣 adjacency matrixes

image
圖片來源

陣列 edge list representation

應用

  • 最短路徑演算法 Shortest Path Algorithm: GPS, 高頻交易
  • 生成樹協定 Spanning Tree Protocol, STP
  • 爬蟲

參考:
Flow Networks:Maximum Flow & Ford-Fulkerson Algorithm

廣度優先搜尋 Breadth-first Search, BFS

  • 時間複雜度:O(V+E)(分別遍歷所有節點和各節點的所有鄰居)
  • 空間複雜度:O(V)(Queue中最多可能存放所有節點)
  • 用於有效率的迭代(traversal)
  • 迭代的方式為鄰近的先訪問(level-ordered)
  • 劣勢在於儲存指標記憶體空間,有時用DFS替代
  • 使用FIFO的Queue來實作,Queue為空代表完成迭代

應用

  • machine learning
  • Edmonds-Karp演算法
  • Cheney演算法

以Python實作,輸出請參考gist

參考:
Graph: Breadth-First Search(BFS,廣度優先搜尋)

深度優先搜尋 Depth-first Search, DFS

  • 時間複雜度:O(V+E)
  • 空間複雜度:O(logV)(訪問至末端節點後LIFO,Stack最多只會同時存在logV個節點,也就是樹的高度)
  • 為了解Maze Problem而生的演算法
  • 效能比BFS稍佳
  • 使用LIFO的Stack來實作

應用

  • 拓撲排序 Topological Order
  • Kosaraju演算法: 推薦系統 Recommand System
  • 判斷Grapth是否有cycle(DAG)
  • Maze

以Python實作,輸出請參考gist

參考:

Read more “以Python實作演算法 – Algorithms Implements using Python”

發表留言

Python 模組與套件 – module, package in Python

在開始前,會需要先具備Scope的基本觀念:Python變數範圍 – Scope


Module

module只是物件,來自特定的python資料型別types.ModuleType

import做了什麼事?

Python會直接從系統找尋已經存在的cache,若找不到此模組,才會繼續以下操作:
1. 建構一個ModuleType物件
2. 將此物件動態(in run time)載入記憶體
3. 將此物件的關聯被加到global namespace,可透過globals()訪問
4. 將物件的關聯加到系統cache,可透過sys.modules訪問
5. 編譯及執行該模組的source code

用一個最直接的例子來驗證caching(但這樣寫有大麻煩,請勿這樣用):

那以上這些動作可不可以自己來呢?可以!步驟大致上長這樣:

除此之外,也可以透過importlib.import_module來載入

這些模組從哪裡來?

  • built-in
  • 硬碟上的特定檔案,可透過__file__訪問

模組可以來自一般(.py)、預先編譯(.pyc)、壓縮檔(.zip)等…幾乎是沒什麼限制只要finders能找得到

python怎麼找到特定模組?——finders和loaders

Python:「Finder一號,你知道這個module在哪裡嗎?」
Finder一號: 「拍謝,我不知道ㄟ」
Python:「Finder二號,你知道這個module在哪裡嗎?」
Finder二號:「哦哦哦!我知道!來,我給你一張地圖,上面有說去哪找,也有說> 明找到後要交給Loader五號,他會幫你處理滴。」
Python:「Loader五號大大,請你幫我處理我手中這個module。」
Loader五號:「沒問題!」

上面這個對話裡的地圖,就是ModuleSpec(可以透過importlib.util.find_spec來取得)

透過sys.meta_path可以看到目前所有的Finders

所以客製化自定義的finder跟loader是完全可行的,或是自訂一個importer處理所有操作,可以參考Site-specific configuration hook

不同import的方式(variants)

  • from math import sqrt
    1. 使用cache或載入math(一樣載入整個math module),但math不加到global namespace
    2. sqrt(symbol)加到global namespace且reference至math.sqrt
  • from math import sqrt as r_sqrt
    1. 使用cache或載入math(一樣載入整個math module),但math不加到global namespace
    2. r_sqrt(symbol)加到global namespace且reference至math.sqrt
  • from math import *
    1. 使用cache或載入math(一樣載入整個math module),但math不加到global namespace
    2. 將math定義過所有的symbol和各自的reference加到global namespace

對module來說,以上這些變化,其實都是載入整個module,只差在namespace加的變數不同,所以並沒有部份載入這回事(載入package的行為就會不同,可以做到部份載入)

以上這些變化在效率上差別很小,只差在lookup的次數,如math.sqrt(2)sqrt(2),所以還是依照需求來決定怎麼寫,並非from的寫法就一定比較好

值得注意的是,from import *可能會導致錯誤,因為相同名稱的symbol會在namespace中依照先後順序互相覆蓋,舉例來說:

此外,有時會避免symbol撞名導致覆蓋,會選擇在local scope來載入,這樣做的載入效能會差,lookup次數的效能差別也會更為顯著

__name____main__

__name__變數用來顯示當前模組的名稱;如果該模組是程式入口,呼叫__name__的值時Python會回傳__main__字串,因此我們可以藉此模擬一種情境,來判斷當下的模組是否為程式入口:

Package

套件即是模組,但是此模組是由多個模組或子套件封裝而成,也就是目錄(directory)的概念,套件的名稱為目錄名,套件的屬性__path__為目錄的絕對路徑

Python透過__path____file____package__這些屬性來找到、封裝及載入你要的程式碼:

套件的入口__init__.py:

  • 告訴Python:請把這個目錄當作一個套件
  • 套件的__file__屬性即自身__init__.py的絕對路徑

幾個套件namespaces的封裝方法:

  • __init__.py
  • 將變數命名為私有(_)
  • __all__

Namespace package

與一般的套件相比,Namespace package不透過__init__.py封裝(沒有__file__屬性),其中的子套件可以來自不同的目錄位置

發表留言

Python 閉包及裝飾器的應用 – Closure and Decorator in Python

在開始前,會需要先具備Scope的基本觀念:Python變數範圍 – Scope


Closure

在函數執行時,會建立一個local scope,當函數執行完,這個local scope並不會被清除——而且只要你知道怎麼再次訪問,它都會確保你訪問得到其中的變數

Decorator

decorator的概念即是透過closure的特性,將傳入的函式經裝飾後回傳一介面,如以下範例:

經裝飾後回傳都會是同一個介面,這樣會導致debug的困難:

可以用built-in的wraps來處理,wraps是decorator,一樣要把函式傳入

decorator可以堆疊,以下這個範例其實只是做了auth(log(f))這樣的處理

Decorator Factory

至於decorator乍看之下可以傳額外的參數,其實只是再多封裝了一層decorator:

Decorator Class(用於decorator的類別)

此外,我們也能透過callable物件來製作decorator

Class Decorator (用來裝飾類別的decorator)

Python的monkey paching特性(在程式的runtime能隨意更改物件屬性),我們也可以透過decorator來裝飾類別

其他範例:
functools.totoal_ordering

Dispatching pattern

發表留言

Python 變數範圍 – Variable Scope

讓我們來討論一下這個簡單的語句:

這裡做了物件賦值(assign)這個行為,也可以說這個變數名稱(variable name)綁定(bound)到某物件上,這個物件可以透過變數(a)來訪問,但要注意…不是在程式碼任何一處都可以!

先來理解一下這些概念:

  • scope(lexical): 簡單來說,就是變數宣告(綁定)的地方

  • namespace: 命名空間紀錄這些綁定行為,每個scope都會有一份命名空間的字典來提供查找

image

Scope的類型

  • global scope
    • 或稱module scope,範圍是單個檔案(*.py)
    • 模組(或app)是層層堆疊起來的,並不會說哪裡才是真正的global環境,要說的話,最接近的可能就是built-in的變數如True、None所宣告的地方吧
  • local scope(in compile time)
    function為範圍,scope伴隨函式被呼叫時建立,變數重新綁定

當在特定的scope下找不到特定的變數,python會往外部的命名空間查找,順序是local>global>built-in。例如:

a在module scope被找到,print最後在built-in scope被找到,但找不到b,導致NameError

對於外部的scope已經存在的變數,在當前的scope再宣告一個同樣的變數名稱,這個動作叫做mask,因為在不同的scope,這樣做並不會影響到外部的變數(某個版本以前的list comprehension會發生這種狀況),除非有意為之

透過關鍵字globalnonlocal來操作

要注意nonlocal向外訪問只能訪問local scope的變數

此外,可以透過函數globalslocals輸出該scope的所有變數:

發表留言