2012年9月13日 星期四

活動:Facebook World Hack Taipei 2012


會場在 101 對面,風景好的很,還有真實的憤怒鳥彈弓可以玩

開發人員目測應該有 150 ~ 200 人,雖然活動很低調,可是來的人還是很多啊!


這是我第一次參加 Hack Day 類型的活動
活動的場地實在很不錯,風景好且放嗨歌寫 Code 真的頗熱血
我還記得我把憤怒鳥玩偶用真的彈弓射出界且又高又遠
旁邊的工作人員一直偷笑 XD
整個 Hack Day 的規格確有國際水準

為了這次的 Hack Day, 我從現有 全民電視 的專案
整理出了一個基本版的 Facebook Login/Logout API Framework
只要套上申請好的 Facebook Key/Secret 等等設定,就可以提供 client 端基本的登入登出等等 API 功能
這套 framework 當然是 open source 的!
不過現在沒有什麼價值,運作方式只會讓人覺得很詭異
因為專案中夾雜著剛學 Python 時所寫的 Child Code 以及許多我們平台綁定的格式及 Code
此 framework 目前 不推薦使用也不推薦觀看
希望接下來幾個月,能夠有時間整理出一個乾淨且泛用的 API Framework, 甚至提供 Long-Polling Class 的 Support …


此次的 Facebook Hack Day 活動,在活動開始前我們團隊發現幾件事情:
  • 這次的活動異常的低調,似乎知道的人很少,有相關討論的人也很少
  • 整個 Hack Time 只有六個小時
  • 獎項很不明,只知道最大的獎項是可以去跟 Facebook Team 見面
  • 之前其他地區舉辦的 Facebook Hack Day 系列相關活動的得獎作品,大都概念很簡單,如:製作生日快樂罐頭訊息的 APP …

仔細想想整個 Hack Day 對於 Facebook 而言,目的可能是:
  • 推廣自己 (Open Graph, Mobile SDK … )
  • 看到許多人開發 Facebook 相關的 App, 而且此 App 是對 Facebook 有所幫助的
  • 找到他們所感興趣的團隊
  • 有關讓 Developers 之間互動等等的目的就不再贅述 …

Hack Time 只有六個小時很明顯是不太夠的,從認識朋友、組隊、討論、實作、準備 DEMO …
這些程序恐怕就要花上一整天才有辦法產生比較完整的東西
所以 Facebook 不想要收到完整的東西?
我認為他們要的就只是一個對他們而言有創意的 Idea, 一個善用他們提供的資源所做出的產品
(且此產品要對其核心價值有所幫助)
Idea 是不是事先想好,甚至事先偷跑了都不是他們最 Care 的事情!
當然,如果只是把整個早就弄好的產品也不修改就拿來參賽,那就會完全失去了 Hack Day 的樂趣 …
這一切都取決於參賽者的心態跟目的


我們考量到既然要參賽,那就乾脆做一個自己覺得有趣,且 Facebook 一定也感興趣的 App
於是比賽前幾天,我們做了以下準備(偷跑):
  • 每天真的都在 Hack Facebook 的怪咖 CEO 負責系統設計,撰寫文件跟設計 DB 格式
  • 我開始整理 API Framework
  • 負責前端有時候還要跨後端的強者我同事則是開始玩 twitter bootstrap, angularjs …
  • 手邊有國際等級 APP 的 iOS 工程師,因為家裡有事情,臨時無法參加
簡單講,我們的 Hack Day 很不要臉的從週末就提早開始了!
由於萬事具備,比賽當天我們能夠當場申請新的 Facebook App, 即時調整 Serer 的設定
然後 Oauth Login 的功能,花幾分鐘改個設定就會動
要存取 Graph API 的 Function 早就寫好了,連要使用 Graph API Batch 功能的 Function 也都包裝好,可以馬上使用
(很遺憾我們沒時間申請網域跟處理 SSL 憑證,所以只有直接的 IP Adress … 造成了後來的一些問題)
當天 Hack Day 下午,我就看著文件拼命寫 Code !(事實上,前一天我還先寫了兩支 API)
最後我爆氣大概寫了 300 ~ 400 行 Python Code ,對我這種 Coding 嫩咖,已經算是突破自我了

Demo List


輪到我們團隊做 Presentation 時,遇到了很囧的事情:
  • 電腦被 似乎沒用過 windows 8 的 工作人員重開機,事先準備好的頁面都沒了 …
  • 遇到解析度跑掉的問題,整個頁面都看不完整
其實當下應該要拒絕馬上開始,堅持把環境處理好以後再開始 present
不過我們本身隨機應變的能力還不夠 … ,且就算扣掉上述問題,我們的整個 presentation 本身也處理不好
因此最後我們家的老闆跟怪咖 CEO Terry 拖了大家很多時間
Presentaion 過後,大家其實頗為沮喪,一個有趣的 Social Game 被 present 得很不有趣 Orz
仔細想想,其實整個 Hack Day 最大的重點是 presentation 是否能夠:
  • 表達出自己的 Idea
  • 說出此產品哪些特點符合 Facebook 的需求
  • 給大家看到產品完成的樣貌(但是不用全部沒關係)
亦即,很多產品非關緊要的細節其實不用實作 只要能夠完成基本要求(例如使用 Open Graph)得到分數即可
重要的還是想辦法在時間內讓大家印象深刻、理解我們想要作什麼!



遊戲首頁



進去後的個人畫面


遊戲畫面(先跟當事人抱歉,我幫你們做了馬賽克 XD)



最後的最後,很幸運的評審們應該知道我們在做什麼
我們得到了 最佳遊戲獎
禮物有: iPad, shuffle*2, $250 Facebook 廣告費用 …
最重要的是得到了 Facebook 的肯定
我們能夠在短時間內原創、設計,並且手工打造出了一個 Social Game: Memory Millionaire !
(雖然內含許多 BUGS)
這樣快速開發一個產品的過程(發散、收斂、衝突、妥協、爭論、配合),才是我們團隊所得到的最珍貴經驗!


之後我們會討論如何推廣並且讓大家都能夠玩到 BUG 比較少的這一款遊戲!
Cheers!


2012年9月3日 星期一

心得:稍微加強一下 Python 的 logging module

Python 的 logging module 是一個非常好用、方便的工具
關於他的介紹除了官方文件外
這裡有一篇雖然是英文可是淺顯易懂的文章 Good logging pratice in Python 推薦參考

我發現我個人使用 logging 時,特別是使用 logger.error 來紀錄一些例外狀況時
  • 會想要隨手塞幾個 object 當作參數
  • 使用 logger.error 後,常伴隨著的是 return False 的語句
因此我嘗試寫個 wrapper 來把 logger.error 給包裝一下
但是這樣會有個小缺點,實際執行 logger.error 的 function 會變成是 wrapper function
這樣的行為,對於想要紀錄是哪一行程式碼呼叫 logger.error 時
會抓錯位置而導致跑到定義 wrapper function 的地方
或許還有辦法解決,不過我還是忍不住直接使用 PDB++ 來瞧瞧 logger.error 的 source code
意外發現相當容易修改

我的小修改如下:
  • 寫一個 error_hack 直接取代 error,當然是 based on 原本的程式碼作一點點小修改
  • 加上一個將所有 args 參數轉成字串的小功能
  • 在函數的最後加上一個回傳值 False

程式碼及範例如下:
(其實也沒什麼特別的,就是一個小修改,讓我以後方便使用及少寫一點程式碼)


# Modified by joe.dev 
import logging

FORMAT = '%(asctime)-15s %(message)s'
logging.basicConfig(format=FORMAT)
logger = logging.getLogger()
def error_hack(*args, **kwargs):
    if len(args) > 1:                   
        log_str = ""
        for a in args: 
            log_str += str(a) + "  "
    else:
        log_str = str(args)
    logger._log(40, log_str, None, **kwargs)# 40 -> error level
    return False
logger.error = error_hack

def do_some_task():
    return logger.error("Orz 1", "Orz 2", ["Orz 3"], {"Orz 4": "Orz 5"})

if do_some_task() is False:
    print "My task failed"