Google Ads API Beta(v2.1) Short Notes

Prerequisites

  • Developer token
    • generate from a Google Ads Manager Account
    • you can use the same token for not linked account
    • token state: pending, approved
    • only approved token can connect to the API for production
    • Use any developer token if you using Test Manager Account view doc
  • Custermer ID
    • the account number of an Google Ads account
    • can be set or replace programmatically in the SDK
  • OAuth2 client credential
    • generate from a GCP Project/API Console
    • use for managing the API users
  • Client Library

Basic first call (installed application flow)

Step 1

  1. register an Google Ads Manager Account for production use
  2. take the developer token from UI
    > TOOL > SETTINGS > API Center

step refs:

You must use a production (non-test) manager account’s developer token to make API calls against a test account. Even if the token is pending approval, you can still use it to make calls against test accounts.

Step 2

  1. create a Google Account for testing
  2. use the Google Account to register a Google Ads Manager Account
  3. login and create one customer account (the customer created by test manager account will be test only)
  4. create a campaign under the customer account

step refs:

  • https://developers.google.com/google-ads/api/docs/first-call/overview#test_account
  • https://developers.google.com/adwords/api/docs/guides/accounts-overview#test_accounts

Step 3

If already has an OAuth client:

  1. assume the client ID is ORIGIN.apps.googleusercontent.com
  2. go to API console, find the OAuth2.0 client ID then download the client secret json file
  3. use this secret to request a generate refresh token

else:

  1. create a GCP project
  2. enable the GoogleAds API in API console page
  3. create a OAuth client, assume the client ID is NEW.apps.googleusercontent.com
  4. download the client secret json file
  5. use this secret to request a generate refresh token

step refs:

  • https://developers.google.com/adwords/api/docs/guides/accounts-overview#usingoauth2withtestaccounts

When requesting an OAuth2 refresh token, make sure you’re logged in as the test manager account user

To access a test account using OAuth2, the test manager account user must grant permission to your client application. Therefore, when requesting a refresh token, ensure you’re logged in as the test manager account rather than the production manager account.

you want to switch from the test manager account to the production manager account, simply reconfigure the client library to use the production manager account’s refresh token.

Step 4

  1. install client library
  2. create an sdk config file google-ads.yml and insert the values:
    • developer_token
    • client_id
    • client_secret
    • refresh_token
    • logincustomerid
  3. initial a client object that loads the config file
  4. make the first call to search the campaign we just created

Read more “Google Ads API Beta(v2.1) Short Notes”

發表留言

第一次開發選服就烙賽

Intro

自從邱威傑市民服務網站上線後,一直想要完成這篇,紀錄一下這一個月多月開發以來的心得感想,但因為專案完成,本身也剛換工作,無預警進入了懈怠期,不知不覺就拖到現在了

晚上和呱吉跟他的政治團隊吃飯,回家後提醒自己寫下紀錄,今天大概就能算是一個圓滿的結束點吧~

18.12.07 確定接下案子

在這之前,第一次和負責的團隊成員——很年輕的法律系學生 @Eddy 見面,一開始當然不知道呱吉會打算怎麼做這個系統,原本以為會有前輩主導開發,去參與討論或插花即可,但實際上是最多找2-3個人做;也以為是要做能讓多個議員註冊、使用的平台,但需求聽起來卻像呱吉個人的宣傳式網站

我認知到一件事,那就是 Eddy 沒辦法準確評估我的技術水準,只知道我有做過網站。令人訝異的是,當天握手之後就直接把任務交給我了。當然,這是風險評估出了問題呢,還是完全信任夥伴?我選擇相信後者。(團隊的風氣感覺是年輕人放手去做就對了,烙賽沒關係?)

專案需求雖然很簡單:使用者填寫表單、送出後可以在後台編輯。但我還是一樣超沒信心,因為認知到:

  • 我希望這是一個開源專案,如果要開源,會有資安上須考量的風險,加上呱吉是公眾人物,容易成為箭靶
  • 短期會有高流量,分散式部署是必要的;自己沒有實際維運過分散系統,大概知道是怎麼做,但沒把握
  • 重點是前端視覺與使用者體驗,但自己頂多做後端,前端雖然會寫,但根本在標準之下

Read more “第一次開發選服就烙賽”

4 則迴響

面試紀錄 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實作資料結構 – Data Structure Implements in Python

以Python實作資料結構

tags: data-structure, python

TOC

簡介

什麼是資料結構?為什麼要使用資料結構?

是電腦中儲存、組織資料的方式,可以讓我們有效地儲存資料,並讓所有運算能最有效率地完成

演算法的運行時間是根據資料結構決定的,所以使用適當的資料結構來降低演算法的時間複雜度,如:

  • 最短路徑演算法若無適當的資料結構,運行時間是O(N^2),使用(heap/priority queue)可以大幅降低運行時間至O(N*logN)

抽象資料型態 Abstract Data Types

簡單而言,ADT是針對資料結構的「規範」或「描述」,像是物件導向語言裡面的interface,但不會實作細節

舉例堆疊的ADT描述:

  • push(): 插入元素 item 至堆疊頂端
  • pop(): 移除並回傳堆疊頂端的元素
  • peek(): 看堆疊頂端的資料而不取出
  • size(): 看堆疊的長度

ADT跟資料結構的關係

每個ADT在底層都有相對應的資料結構去實作ADT裡定義過的行為(method)

ADT Data Structures
Stack array, linked list
Queue array, linked list
Priority Queue heap
Dictionary/Hashmap array

時間複雜度 Big O notation

描述演算法的效率(複雜度),舉例來說,A宅想要分享他的D槽給B宅,有以下幾種做法:

  1. 台北騎車到屏東B宅家
  2. 用網路傳輸,不考慮被FBI攔截的情況
1GB 1TB 500TB
騎車運送硬碟 600 min 600 min 600 min
網路傳輸 3 min 3072 min 1536000 min

從上表來看,騎車這個選項雖然聽起來很蠢,但不管硬碟有多大,都能確保10個小時內可以送達—— O(1);至於網路傳輸隨著檔案越大,所需的時間也越長 —— O(N);從這裡就可以看出常數時間(constant time)和線性時間(linear time)的差別對效率的影響有多大了

在表現複雜度函數的時候,有幾個通用的規則:

  • 多個步驟用加法: O(a+b)

  • 省略常數: ~~O(3n)~~ O(n)

  • 不同的input用不同的變數表示: ~~O(N^2)~~ O(a*b)

  • 省略影響不大的變數: ~~O(n+n^2)~~ O(n^2)

陣列 Array

物件或值的集合,每個物件或值可以被陣列的索引(index, key)識別

  • 索引從0開始
  • 因為有索引,我們可以對陣列做隨機存取(Random Access)

優點:

  • 隨機存取不用搜尋就能訪問陣列當中所有值,執行速度快O(1)
  • 不會因為鏈結斷裂而遺失資料
  • 循序存取快

缺點:

  • 重建或插入陣列須要逐一複製裏頭的值,時間複雜度是O(N)
  • 編譯的時候必須事先知道陣列的大小,這讓陣列這個資料結構不夠動態(dynamic)
  • 通常陣列只能存同一種型別
  • 不支援連結串列的共享

Implements

行為 big O
search 搜尋 O(1)
insert 插入第一項 O(N)
append 插入最後一項 O(1)
remove 移除第一項 O(N)
removeLast 移除最後一項 O(1)

以Python實作

random indexing: O(1)

linear search: O(n)

連結串列 Linked List & 雙向連結串列 Double Linked List

  • 節點包含datareferenced object
  • 連結的方式是節點(node)記住其他節點的參考(reference)
  • 最後一個節點的參考是NULL

優點

  • 各節點型態、記憶體大小不用相同
  • 動態佔用的記憶體,不須事先宣告大小
  • 插入、刪除快O(1)

缺點

  • 不支援隨機存取,只能循序存取(sequencial access),時間複雜度為O(N)
  • 須額外空間儲存其他節點的參考
  • 可靠性較差,連結斷裂容易遺失資料
  • 難以向前(backward)訪問,可以用雙向連結串列來處理,不過會多佔用記憶體空間

Implements

行為 big O
search 搜尋 O(N)
insert 插入第一項 O(1)
append 插入最後一項 O(N)
remove 移除第一項 O(1)
removeLast 移除最後一項 O(N)

註:連結串列沒有index,處理插入或移除第N項會需要先循序找到插入/移除位置,因此會需要O(N)的時間

以Python實作

以下的代碼是我實作的範例,有錯誤煩請指正。

主要概念是實作__getitem__來循序存取(indexing),另外Double Linked List支援反向存取,故訪問lst[0]lst[-1]皆可以達成O(1)的時間複雜度

執行結果請參考travishen/gist/linked-list.md

Linked List現實中的應用

  1. 低級別的內存管理(Low Level Memory Management),以C語言為例:
  • malloc()free(): 見Heap Management
  • chart * chart_ptr = (chart*)malloc(30);: 取得30byte的heap memory
  1. 許多Windows的應用程式:工具列視窗切換、PhotoViewer
  2. 區塊鏈技術

image
[圖片來源]

堆疊 Stack

Implements

行為 big O
push 將資料放入堆疊的頂端 O(1)
pop 回傳堆疊頂端資料 O(1)
peek 看堆疊頂端的資料而不取出 O(1)

應用

  • call stack + stack memory
  • 深度優先搜尋演算法(Depth-First-Search)
  • 尤拉迴路(Eulerian Circuit)
  • 瀏覽器回上一頁
  • PhotoShop上一步(undo)

註:任何遞迴(recursion)形式的演算法,都可以用Stack改寫,例如DFS。不過就算我們使用遞迴寫法,程式最終被parsing還是Stack

Stack memory vs Heap memory

可參考Stack vs. Heap

stack memory heap memory
有限的記憶體配置空間 記憶體配置空間較大
存活時間規律可預測的 存活時間不規律不可預測的
CPU自動管理空間(GC) 使用者自主管理空間
區域變數宣告的空間不能更動 物件的值可以變動,如realloc()

另外ptt有針對兩者佔用記憶體大小的討論stack v.s. heap sizes

以Python實作

Using Lists as Stacks

佇列 Queue

  • 佇列是一種抽象資料型態,特性是先進先出(FIFO, first in first out)
  • 在高階程式語言,容易用array、linked list來實作

應用

  • 多個程序的資源共享,例如CPU排程
  • 非同步任務佇列,例如I/O Buffer
  • 廣度優先搜尋演算法(Depth-First-Search)

以Python實作

參考

二元搜尋樹 Binary Search Tree

主要的優點就是時間複雜度能優化至O(logN)

  • 每個節點最多有兩個子節點
  • 子節點有左右之分
  • 左子樹的節點小於根節點、右子樹的節點大於根節點
  • 節點值不重複
Average case Worst case
insert O(logN) O(N)
delete O(logN) O(N)
search O(logN) O(N)

以Python實作insert, remove, search,執行結果請參考gist

BST現實中的應用

  • OS file system
  • 機器學習:決策樹

平衡二元搜尋樹 Balancing Binary Search Tree, AVL Tree

  • 能保證O(logN)的時間複雜度
  • 每次insert, delete都要檢查平衡,非平衡需要額外做rotation
  • 判斷是否平衡:
    • 左子樹高度 - 右子樹高度 > 1: rotate to right
    • 左子樹高度 - 右子樹高度 < -1: rotate to left
    • image
Average case Worst case
insert O(logN) O(logN)
delete O(logN) O(logN)
search O(logN) O(logN)

不適合用在排序,時間複雜度為O(N*logN)

  • 插入n個:O(N*logN)
  • in-order迭代:O(N)

繼承上面BST繼續往下實作,有bug請協助指正,執行結果請參考gist

  • 任一節點設定完left或right,更新該節點height
  • 每個insert的call stack檢查檢查節點是否平衡,不平衡則rotate

紅黑樹 Red-Black Tree

  • 相較於AVL樹,紅黑樹犧牲了部分平衡性換取插入/刪除操作時更少的翻轉操作,整體效能較佳(插入、刪除快)
  • 不像AVL樹的節點屬性用height來判斷是否須翻轉,而是用紅色/黑色來判斷
    • 根節點、末端節點(NULL)是黑色
    • 紅色節點的父節點和子節點是黑色
    • 每條路徑上黑色節點的數量相同
    • 每個新節點預設是紅色,若違反以上規則:
    • 翻轉,或
    • 更新節點顏色

image

Average case Worst case
insert O(logN) O(logN)
delete O(logN) O(logN)
search O(logN) O(logN)

github上用python實作的範例:Red-Black-Tree

優先權佇列 Priority Queue

  • 相較於Stack或Queue,對資料項目的取出順序是以權重(priority)來決定
  • 常用heap來實作

二元堆積 Binary Heap

  • 是一種二元樹資料結構,通常透過一維陣列(one dimension array)
  • 根據排序行為分成minmax
    • max heap: 父節點的值(value)或權重(key)大於子節點
    • min heap: 父節點的值(value)或權重(key)小於子節點
  • 必須是完全(compelete)二元樹或近似完全二元樹

註:

  • heap資料結構跟heap memory沒有關聯
  • 優勢在於取得最大權重或最小權重項目(root),時間複雜度為O(1)
time complexity
insert O(N) + O(logN) reconsturct times
delete O(N) + O(logN) reconsturct times

應用

  • 堆積排序法(Heap Sort)
  • 普林演算法(Prim’s Algorithm)
  • 戴克斯特拉演算法(Dijkstra’s Algorithm)

堆積排序 Heapsort

  • 是一種比較排序法(Comparision Sort)
  • 主要優勢在於能確保O(NlogN)的時間複雜度
  • 屬於原地演算法(in-place algorithm),缺點是每次排序都須重建heap——增加O(N)時間複雜度
  • 在一維陣列起始位置為0的indexing:

image

操作可參考這篇文章:Comparison Sort: Heap Sort(堆積排序法)

用Python實作Max Binary Heap,請參考gist

python build-in heapq

關聯陣列/對映/字典 Associative Array/ Map/ Dictionary

  • 鍵、值的配對(key-value)
  • 相較於樹狀資料結構,劣勢在於排序困難
  • 主要操作:
    • 新增、刪除、修改值
    • 搜尋已知的鍵

image

hash function

  • division method: modulo operator

h(x) = n % m

n: number of keys, m: number of buckets

Collision

當多個key存取同一個bucket(slot),解決collision會導致時間複雜度提高

解法:

  • chaining: 在同一個slot用linked list存放多個關聯
  • open addressing: 分配另一個空的slot
    • linear probing: 線性探測
    • quadratic probing: 二次方探測,如1, 2, 4, 8…
    • rehashing

Second Round皆有詳盡解說:

Dynamic resizing

load factor(佔用率): n / m

  • load factor會影響到存取的效能,因此須要根據使用率動態變更陣列大小;
  • 舉例來說,Java觸發resize的時機點大約是佔用超過75%時、Python則約是66%

應用

  • 資料庫
  • Network Routing
  • Rabin-Karp演算法
  • Hashing廣泛用於資料加密

參考:

  • http://www.globalsoftwaresupport.com/use-prime-numbers-hash-functions/
  • http://alrightchiu.github.io/SecondRound/hash-tableintrojian-jie.html#collision

以Python實作,請參考gist

Average case Worst case
insert O(1) O(N)
delete O(1) O(N)
search O(1) O(N)

三元搜尋樹 Ternary Search Tree, TST

  • 相較其他樹狀資料結構而言,佔用記憶體空間較小
  • 只儲存string,不存NULL或其他物件
  • 父節點可以有3個子節點:left(less)middle(equal)right(greater)
  • 可以同時用來當作hashmap使用,也可以做排序
  • 效能上比hashmap更佳,在解析key時是漸進式的(如cat若root沒有c就不用繼續找了)

image

應用

  • autocompelete
  • 拼字檢查
  • 最近鄰居搜尋(Near-neighbor)
  • WWW package routing
  • 最長前綴匹配(perfix matching)
  • Google Search

以Python實作,請參考gist

互斥集 Disjoint sets / union-find data structure

  • 一堆沒有交集的集合,如10個學生分成4組
  • 主要操作: unionfindmakeSet
  • 通常以linked list或tree來實作
  • 訪問disjoint set中的任何節點都回傳同一個root value

set在union過程中會遇到不平衡的問題,有兩種最佳化方法:

  1. union by rank: 讓小的樹接到較大的樹
  2. path compression: 訪問節點時調整樹的結構,直接與root連結

應用

  • Kruskal: 檢查圖中是否有cycle

以Python實作,輸出請參考gist

發表留言