2013年6月24日 星期一
[Hackathon] API Hackday SF
早上八點頂著貪睡的慾望,硬是跟Stan殺到舊金山參加API Hackday SF. 比賽場地在Parisoma,也就是那種專門給宅宅們週未coding取暖的空辦公室。街道充斥著酒後狂歡嘔吐物的臭味,不用咖啡就很提神,算是很酷的地方。
API Hackday比的是看誰利用別人的API,拼出最酷的產品,也就是看誰二次創作的能力最強,就像比誰站在巨人的 肩膀上跳得更高一樣。Sponsor的APIs主要有幾類:
1. 提供e-mail API, 讓你不用自己架SMTP mail server的 SendGrid, context.io
2. communication: VOIP的twilio, video streaming的open-tok
3. API manager: 上面放著其它一堆公司的API, 如Mashery, Mashape。基本上有open你想得到的廠商的API都有。
4. 不知道來幹麻的,應該說只有sponsor但是沒派人來,而且api也不清不楚:Apiphany,BigCommerce,
經過一番討論後,我們決定利用open-tok來架一過即時拍賣網。簡單說就是針對很希望把垃圾趕快清掉的賣家,讓他開一個限時的 video conference room。買家們可以挑選有興趣的房間加入參與拍賣,一起來享受趁火打劫的樂趣。理想中的互動是賣家用video streaming跟買家們介紹他這個蟠龍花瓶多古老多名貴,買家不斷的挑毛病殺價說你這花瓶怎麼看起來像花盆,或是互想競標加價。最後買家321成交,結案。出發點是讓拍賣過程變得即時刺激有趣,增加互動。合理性商業可能性全不在考慮,反正hackathon重視的是創意!
實作過程不像想像中那麼順利,首先我們到12點在開工,距離結束只剩6小時。再加上我貧弱的front end,還有完全不熟悉的node.js跟express, 要不是有stan大大,恐怕這個idea會一直都只是idea。話雖如此,進度也是嚴重落後,到了四點時只把最基本的首頁(商品頁)做好.…不過工程師的效率一向都是exponential的,越到最後關頭越強大,越到最後關頭越隨便....來不及做的server push也只好砍了。甚至slide是最後一分鍾做的....
demo過程尚稱順利,該動的都會動,presentation也還ok,台下應該有聽懂我們是來hackathon不是來賣藥的。結束的時候還有人鼓掌跟吹口哨,工程師們果然都是好人!最後如預料的與前三名無緣,不過open-tok看到我們的努力,加上是唯一兩組用他們API的,把best open-toke prize給了我們...好吧也算是肯定了,誰叫另一組不爭氣呢?
做個檢討的話,就是
1. hackathon是比好玩的,但是要贏就要偷跑。今天得獎的作品莫不是精美異常,有些參加人還是ceo拿自己公司的產品來介紹。
2. presentation大概佔七成吧,設計的好的簡報還是蠻有利的,雖然我認為今天報得都不怎麼樣。
3. UI, front end 真的很重要...最後關頭UI是投資報酬率最高的。好的首頁一秀出來,自己吹牛也吹得有自信起來。
4. 自己的T-shirt的size要記牢,女朋友的T-shirt size要記得更牢。
行文至此,倍感勞累。古人有 云, no pain no gain!
https://www.hackerleague.org/hackathons/api-hackday-sf-2013/hacks/live-bid
2013年6月3日 星期一
[UVA] 198 Peter's Calculator
題目:http://uva.onlinejudge.org/external/1/198.html
code & tests:
https://github.com/wilson100hong/UVAOJ/tree/master/Volume_1/198
想法:一行一行parse,根據三種不同的指令做如下動作
1. Assign
含有 ":=" (assign operator) 的line都執行Assign。:=的左邊是variable name,右邊會是一個Expression。由於Expression內含recursive的桔構,我這裡使用tree來存儲Expression內的每一個Term,而每一個Term也是一個tree,包含著子Factor。由於題目的input皆是合法輸入,對於tree的每個children可以recursive parse。
這個命令執行完時,我們會產生/取代一組variable name -> Expression的key value pair,也就是變數的定義。把定義存在global的map裡。
2. Reset
去空白後,以RESET開頭的line皆執行Reset。把 variable name -> Expression map 清掉即可。
3. Print
去空白後,以PRINT開頭的line皆印出變數evaluation出的數值。由於我們必需考慮undefined variable 和cyclic dependency的情況,我們必需先
a. 確認當前變數被定義過
b. 從當前變數往源頭變數們(":=" 右邊的變數們)迴溯,它們也必需被defined過。不斷迴溯,直到所有involved的變數為
b1. 所依賴的變數皆定義過 或
b2. 不依賴其它變數 (eg. a:=3)
c. 如果符合,那麼所有會被evaluate到的變數都有被定義過了。第二步是check cyclic dependency,這一步用DFS即可。有cycle就是UNDEF
排除undefined之後,就是evaluate變數。我這裡是用topological sort把所有involved變數的依賴性排序後,依ts order做evaluate。每次evaluate完一個變數後就存進cache裡來reuse。這樣的好處是evaluate一個變數時它依賴的變數們都有值了,可以值接從cache取出來,免除重複計算。
GY:
這一題考的就是coding而已。不過還是有GY之處,而且都非常賤:
1. 空白行是合法的,跳過即可
2. token之間是可以沒有空白的。簡單起見,一開始就把空白trim掉
3. RESET 跟 PRINT 的前面也可以有空白 <-- waste me 4 hours
code & tests:
https://github.com/wilson100hong/UVAOJ/tree/master/Volume_1/198
想法:一行一行parse,根據三種不同的指令做如下動作
1. Assign
含有 ":=" (assign operator) 的line都執行Assign。:=的左邊是variable name,右邊會是一個Expression。由於Expression內含recursive的桔構,我這裡使用tree來存儲Expression內的每一個Term,而每一個Term也是一個tree,包含著子Factor。由於題目的input皆是合法輸入,對於tree的每個children可以recursive parse。
這個命令執行完時,我們會產生/取代一組variable name -> Expression的key value pair,也就是變數的定義。把定義存在global的map裡。
2. Reset
去空白後,以RESET開頭的line皆執行Reset。把 variable name -> Expression map 清掉即可。
3. Print
去空白後,以PRINT開頭的line皆印出變數evaluation出的數值。由於我們必需考慮undefined variable 和cyclic dependency的情況,我們必需先
a. 確認當前變數被定義過
b. 從當前變數往源頭變數們(":=" 右邊的變數們)迴溯,它們也必需被defined過。不斷迴溯,直到所有involved的變數為
b1. 所依賴的變數皆定義過 或
b2. 不依賴其它變數 (eg. a:=3)
c. 如果符合,那麼所有會被evaluate到的變數都有被定義過了。第二步是check cyclic dependency,這一步用DFS即可。有cycle就是UNDEF
排除undefined之後,就是evaluate變數。我這裡是用topological sort把所有involved變數的依賴性排序後,依ts order做evaluate。每次evaluate完一個變數後就存進cache裡來reuse。這樣的好處是evaluate一個變數時它依賴的變數們都有值了,可以值接從cache取出來,免除重複計算。
GY:
這一題考的就是coding而已。不過還是有GY之處,而且都非常賤:
1. 空白行是合法的,跳過即可
2. token之間是可以沒有空白的。簡單起見,一開始就把空白trim掉
3. RESET 跟 PRINT 的前面也可以有空白 <-- waste me 4 hours
訂閱:
文章 (Atom)