The most challenge things in your job

這篇一直很想寫,但是一直沒有寫出來。

上個月初的時候去了一趟 WWDC ,這是 Apple 的 Developer 會議,可以遇到來自全世界各地的開發者,還有很多跟 Apple 有關的人,像是設計師,PM,也有很多公司在附近其他場地辦party 找人。主要組成比例大概是:Attendance 5000,Apple Engineer 1000

門票很貴,1599鎂,再加上機票住宿,去一次沒有10萬~15萬是去不了的。為了不要浪費這筆錢,所以會去的人幾乎都是有準備才會去的。

在那邊五天的時間裡面,我最常作的事是跟其他國家的開發者聊天,交換彼此遇到的問題,平常在台灣跑 meetup,會遇到的問題大概都一樣,因為我們遇到的是同一個業界,都是在台灣。

跟國外的人聊天之前,總是會有一種期待,期待對方講初他們是用什麼高大上屌炸天的技術。實際聊過才發現也沒差這麼多, startup 的人,很多人用 Lottie 作動畫,沒做Unit Test 沒做 CI 的人一大堆。有規模的公司,就是那種跨國有聽過名字的公司,一個 app 分成好幾組人,每組又有好多人的,大概10個 developer 寫一個 app 的那種,CI 幾乎都是從 jenkins 改出來的,再配上自己的 script 。人數更多的,就會開始自己寫 tool。

我最喜歡問的問題:What's the most challenge things in your job?

因為每個 developer 作的產品不同、客戶不同、市場不同、公司規模不同。這個問題收到一大堆的答案。

做物流的公司說是 customer service,做企業 app 的公司說是 security ,還沒賺錢的公司說是 adoption 。也問過 Apple Engineer ,大部分人都說是 cross BU communication,似乎技術問題對於 Developer 來說就像是吃飯喝水一樣,每天都在做都沒在害怕的。

搭飛機回來的路上,10幾個小時,我一直在想,如果這個問題問我自己呢?我做過的工作裡面什麼是最難的最重要的?想到兩個

1. 同事離職,交接時間不夠

待過很多家公司,遇過很多同事來來去去,最嚴重的問題一定是同事離職,尤其這位同事負責的東西沒有其他人可以做得像他一樣好、沒有他這麼深入了解。這個時候就是大問題,尤其在位子越高的人發生越嚴重,最知名最極端的例子是 Steve Jobs 離開,(雖然他是非自願的),這麼高職位的人要交接一定都是以年當單位來交接的,不可能兩三個月就交接完,當時要在 Apple 裡面找出另一個 Steve Jobs 是不可能的事。

以我待過接案公司跟新創團隊為例,每個月都在想下個月有沒有辦法活下去。在接案公司的時候,重點是快速接下一個案子,已經接進來的案子要快速結案。這個時候如果接到一個新案,是之前有作過類似的。一般來說就會發生請之前作的那位同事幫忙,如果好死不死,類似的案子一直來,那位同事就在那個領域一直累積經驗值,然後其他人就在作別的事。

有一天這位經驗豐富的同事要離職了,只有一個月作交接要怎麼辦。偏偏那個領域又是需要長期經驗累積的。其實在接案公司一個月算超多了,大部分都只有3 天到一個禮拜。

解法非常困難,牽扯到人性,「放權」。工程技術方面的解法想到幾招,定時開讀書會,換人作 refactor,或者寫 feature 跟 unit test 的時候故意找不同人作,這麼多招式可以用。

但也不一定,如果公司平常事情一堆,連做上面這些事的時間都沒有,也有可能專職負責的同事覺得教其他人不如自己作比較快,其他同事沒有練習的機會。同事離職的時候還是一樣完蛋。

2.待了一陣子,只是把一年經驗變成X年經驗

像我目前待的公司是在作 video streaming 的,在 app 端來說,最重要的是播放影片的技術:像是怎麼跟硬體溝通,加密解密的流程,在 app 既有的 flow 下要怎麼插入其他商業邏輯。

第二層的是每一版 iOS 更新後的新功能,如何跟商業邏輯整合。像是 3D touch 、Universal Link、rich notification。每年都在改版的金流 IAP 應該也算是這塊。

再下一層的話是指每個 app 都會用到的東西,像是刻 UI。這也是最常變動的一塊,有大量的練習機會。

最下面一層的就開始跟本業沒什麼關係,大多是重複性的工作,像是整理多國語系的翻譯、每次出版都 build 一版上傳用的版本、寫 release note 。這就是低附加價值,沒有辦法拿去炫耀的資歷,最好把這邊的事都變成自動化,不要有工程師專職負責這塊。

上面這幾項,是照功能重要性排名,對員工來說不是說越上面就越好,而是應該要盡可能的往其他層發展,如果只會最上面那層 player 的話,雖然在公司可能會是很重要的人,但是這個人未來發展就被局限住了。

待了一陣子,都在做重複的事,這件事對員工來說最傷,或許公司需要有人來專職負責某一塊業務,但是那像業務每次做的事有 90% 一樣,上手後就沒有挑戰性的,這就是非常浪費生命的一份工作,競爭力隨著時間慢慢磨掉了。

解法當然就是勇於跨出舒適圈,盡量跟同事學習其他業務相關的事情。平常如果有互相 cover ,互相交換工作的習慣,那大家彼此進步,就沒問題了。





carthage 踩到雷

寫軟體開發一定會遇到要管理 3rd party module 的時候,在寫 iOS 最常見的幾個工具,像是 cocoapods , carthage 。因為之前用 cocoapods 的經驗不是很好,所以後來在專案導入 module 管理工具的時候使用  carthage

這篇文章不會講 cocoapods 有哪些缺點,有哪些解法。也不會講為什麼要選擇 carthage ,不會講 cathage 要怎麼安裝。只會講這次遇到的問題。

目前維護的案子大概寫了兩年,幾乎都是用 swift 寫的,目前是 swift 3.0,不是自己寫的 module 大概小於 10 個,之前有寫一篇怎麼挑選 3rd party module 

carthage 原本只有用來管理 objC 的 module ,雖然也是有一些 swift 的 module ,但是那些 swift module 都小小的,compile time 增加不多,所以之前都直接把 source code 放進來,都不用 framework。

上個禮拜有個需求,考慮加入一個 swift module,底層又包了一個 C library ,零零總總加起來蠻大包的。所以直覺就是要包成 swift framework 包進來。

現在這個時間 7 月中,iOS 11 也出到 beta 3 了,所以開始看看 iOS 11 有哪些問題要解,要用 xcode 9,使用 xcode 9 compile 的時候 ,swift 版本會變成 swift 3.2 ,就獲得這個 build error。


意思是 app 是用 swift 3.2 ,但是 framework 是用 swift 3.0 ,所以這樣不行喔。覺得這應該是 swift 自己的問題,為什麼 objC 寫好幾年了,都沒有版本不合的問題。

平常還是有固定出版時間,還是必須要用 xcode 8,還是要用 swift 3 ,也就是不能直接換成 3.2。這個問題也只有每次 iOS 升級前解 bug 的時候會遇到。

想一想這問題大概有幾個解法:
  1. 放棄那個 swift module,用 objC 改寫
  2. 開兩個 branch ,一個是 swift 3.0 平常出版用的,一個是 swift 3.2 + iOS 11 修 bug 用的
  3. 等 iOS 11 上線,全部工作機都換成 xcode 9  以後再來做。
我選 3

WWDC 攻略

上禮拜中午與剛從WWDC回來的KKBOX iOS team 同事zonble 吃飯,zonble去了非常多年,這次每天在WWDC每天都會寫1000 2000字的工作報告,所有同事都驚呆了。所以就問zonble一些去WWDC 應該要做的事:



首先,公司花錢讓你去研討會,你必須要證明公司這筆錢花得有意義,像是WWDC的門票加機票住宿,一個人大概要花費10萬到15萬,過去conference 是去工作的,不是去玩的。去WWDC 大概是為了這三個目的

解決相容性問題

寫Apple 產品很重要的是,Apple 使用者升級速度超級快,不像Android 出個新版本可能四年後才會變成主要版本,6月中WWDC 發布測試版,9月就一定會上線,大概到了10月,有一半以上的使用者就會升到最新版本了。所以解決新系統跟現有app的相容性問題是在WWDC最重要的任務。


解掉workaround

另一個寫Apple 產品麻煩的地方是,除了WWDC沒有任何管道可以直接面對Apple的工程師,雖然每個開發帳號都可以有兩個Technical Support 問題可以問,但是一般都不會獲得完整的回答,只會告訴你要往哪個方向去找資料。所以當你有一些困擾很久開發上的問題,在lab的Apple工程師一般都是那個領域的作者,可以省去寫信來來去去的時間,跑lab可以一直問一直問。當然也要你對於這個領域夠瞭解才有辦法一直問一直問,如果有一些舊的workaround是跟apple有關的話,這是一個解決的好時機。

對現有產品的衝擊

快速了解新功能對現有產品的影響,這分成兩類:一個是舊功能的加強,一個是新功能的串接。舊功能來說,像這幾年常改的IAP policy,去年增加了family share,今年修改了autoreable 的分潤機制,身為工程師必須要去了解這些東西在IAP sandbox下要怎麼測試。

至於新功能,如果可以的話,寫個demo吧。
像是去年iOS出了Spotlight search 跟3D touch,就是兩個很好的例子,只要接個新api,馬上就可以整合到現有產品裡,讓規劃產品方向的同事實際體驗看看。


時間規劃

這兩年WWDC的session 隔天就會上網,所以去WWDC 最重要的目的就變成跑lab,而不是看session。WWDC是個五天的conference ,重要的時間表攻略如下:

第一天:上午keynote,沒什麼好說的,就是宗教傳道大會,大家都會看,感受氣氛一下就好,就算你不看別人也會寫好文章重點摘錄。

下午的第一場是developer 的keynote,Session 102 State of Union,超重要,一定要看,
沒有華麗的數字,大部分都是demo,身為工程師絕大部分是接下來你會面對到的東西。
再來就是重點了,接下來的session是Apple Design Award ,看不看無所謂,這個時間會開始開放下載新的Xcode跟iOS,記得要去高速上網區把Xcode跟iOS下載下來,然後裝到測試機裡面看看app有沒有什麼問題,一般來說都會有問題,這個時候就要根據不同的錯誤訊息來決定接下來幾天要去跑哪些lab。

這一天的重點是制定戰略,至少要準備兩台測試機,一台裝舊OS ,一台裝beta OS,跑看看產品app。

第二天:
記得去買紀念T-Shirt ,慣例第二天就會賣完 :)

第二天到第五天都差不多,動態調整吧:
第二天開始就會有session 跟lab了,lab的時間有個習慣是,重要的lab會重複出現兩次,,像是Cocoa Touch 這種UI系列的就會一直出現。所以第一次沒有時間去跑lab的話,第二次一定要去。

session 的重要性不高,但也要去聽,尤其是去的人有超過兩個人時候,每個人的任務分配就很重要了,基本上是聽跟自己產品有關的。

首先KKBOX 是個audio streaming app,所以Audio 有什麼改版一定要去聽,有用到IAP 的話,IAP有什麼改版一定要去聽。然後因為video team 完全沒派人去,所以也要去聽Video 相關的session(我就是video team的,聽到這句話的時候真不好意思)

這邊有一個插曲是,今年apple 推出了offline HLS,keynote完全沒有提到,但是這對video team來說非常重要,所以我們在台灣的同事就快速看一下sample code,整理出幾個問題讓現場的同事去幫忙詢問。當天在lab回答問題的剛好是HLS的作者Roger Pantos,運氣有夠好。

跑完session 跟lab,結束一天的行程後,每天晚上7 8點回到飯店,大概也就是台灣時間10點,跟台灣同事con-call確認一切正常互相報工作進度,然後開始寫工作報告,寫完上傳。

心態

以下是我聽來的,有一個已經離職去yahoo的前iOS team的同事,在研替三年期間去了兩次WWDC。他說他當年很弱,所以晚上在飯店的時候,主管為了要激發他的鬥志,指著他的頭問:
「你知道你為什麼會在這邊嗎?」「你知道讓你過來公司要花多少錢嗎?」「你知道你來這一趟至少要創造多少價值嗎?」

然後研替結束過沒多久他就離職了 (默)

zonble 在講他去WWDC 過程的時候,很明顯一直強調心態很重要,去那邊不是去玩的,是去解決問題的,是去創造價值的。要調整心態的方法我想上面幾行那幾個問題應該去參加國外conference的人都應該好好想一想。





Testflight 取代方案分析&fabric 使用心得

自從1月底收到 TestFlight.com 2/26收起來的消息以後,就非常緊張,大概比較了一下幾個發布平台。上個月來說,討論的選項有:

首先第一個出局的是蒲公英,雖然免費InHouse 好像很方便,但是身為一個有規模的公司,一點都不希望客戶打開你app的時候出現的使用授權跟是另一家公司的名字。而且蒲公英的做法完全違背了apple policy,哪天apple發現了扯到我們公司怎麼辦。

第二個出局的是iTunesConnect 的TestFlight,雖然在TestFlight的信裡鼓勵大家轉到iTunesConnect 去做發布測試,實際測試結果也蠻快的。但他有兩個致命性的問題:
  1. 沒有api,不能與CI結合
  2. 只有iOS 8 以上才能用,iOS 7沒辦法測
接下來放棄的是自架網頁,這其實蠻簡單的,以前在接案時也做過,可是可是可是層級一拉到公司就複雜很多。要做使用者管理,跟發註冊信,檢查使用者安裝狀況,還要分版本管理,一堆拉拉雜雜的事。跟以前只有把IPA丟到ftp然後產生一個連結比起來複雜太多了。可能要專門雇一個人來管理這個平台,評估起來效益不符。

於是就在Fabric跟HockeyApp之間做掙扎。


結果我們是選Fabric ,要說為什麼放棄HocketApp不如說為什麼為什麼要用Fabric,我在
《讓你的App優雅的crash三部曲》 有提到crashlytics這個服務,可以很清楚的看到目前crash issue  的排名,找出最需要解的issue。所以現在寫的app 第一個裝進來的3rd party framework就是crashlytics,用了一陣子,也整了他的api,跟jenkins 、slack 配合得很好。
自從推出Answer 這個功能後統計功能又更上一層樓了。所以知道他也可以做發佈平台後就想來用看看。


Twitter 把Crashlytics 買下來以後,就重新包裝了一個服務叫Fabric,裡面以crashlytics 當主體,結合twitter 登入跟一些api,層級是Fabric >Crashlytics > Crashlytics Beta,所以說用Crashlytics Beta也可以。因為是一模一樣的東西,一模一樣的DB,只是有兩個domain name而已。

fabric 使用心得

上傳


首先在整合crashlytics的時候就會拿到app的key 跟secret ,上傳的時候會用到。只能用api 上傳,沒有另外的app可以輔助。比較麻煩的是要透過crashlytics framework裡面的submit  來上傳。script像這樣:

Crashlytics.framework/submit 
        ${API_KEY} ${BUILD_SECRET}
        -ipaPath ${ipaName}.ipa \
        -notesPath message.txt \
        -groupAliases ${groupName}

這裏需要注意的是groupAliases,以這張圖來說,我應該要填的是vide

大問題


crashlytics 有一個很麻煩的問題是他會把同一個bundleID,不管是什麼configuration的ipa 都會視為同一個app,不像以前testflight 可以開好幾個app,每個app都是同一個bundle_ID 但是連到不同的測試站。Crashlytics 只要bundle_ID一樣就會放在一起。
我們的解法是在buildNumber 那邊做手腳,以下面這張圖來說 (DevInHouse faf29f)。
有Dev出現的表示連到測試站,DevInHouse 表示是那個build 是用InHouse provision,至於最後面的 faf29f 表示是用faf29f這個commit。


每個build 展開來可以看到有哪些人,還有那些人有沒有裝app了,甚至有沒有開過app也知道。比Testflight 又更詳細了一點~


把人頭點開來可以看到這個人有哪些裝置已經註冊,可以重送Invitation 或把他移掉。
至於大頭照是連到gravatar上面抓的。



上個禮拜在cocoaheads  Taipei 裏也有討論要跳去哪裡,大家有整理出一篇完整的
我這篇負責補完crashlytics 的部分,想要用其他平台的可以參考上面那篇。

crashlytics beta 從上個月底開始,大概也用了三個禮拜,上傳了30幾個版本,雖然有經過一些陣痛期,但是跟QA 還有客戶溝通上還算順暢,我想沒什麼大問題的話會一直用下去吧:)

iOS 8 vector UI sample

大概兩個月前,iOS8 正式版剛出的時候,我們知道了出圖可以用向量圖,目前xcode可以吃的向量圖只有pdf一種,所以下面就來示範用pdf出圖跟之前有什麼差別。

我把範例檔放在github

首先你要有個pdf,如果是用sketch的話,export的地方改一下就好了,這份檔案在這裡
然後加入圖片的時候要選說是Vectors,不設的話default是bitmap



來一些數據比較:

一張398*439的圖(我隨便亂畫的),png的大小是178k,輸出成pdf的話則是205k。
看似pdf會比較大,但是不要忘了,一樣長相大小不同的圖可以用pdf一個檔案搞定,png的話要出好多種。

最後來驗證看看是不是真的支援vector UI,我故意把png的大小放得比原圖還大,所以仔細看會看到邊緣有些鋸齒,相反的,左邊的vector不管怎麼放大邊緣都還是很平滑。





How to debug in run script


Answer:use echo!


echo "warning: 開始log"
filePath="$(pwd)"
echo "warning: CURRENT_DIR= $filePath"
echo "warning: PROJECT_DIR= $PROJECT_DIR"
echo "warning: PROJECT_NAME= $PROJECT_NAME"
echo "error: meh"
就會出現這些warning

xcode run script 可以使用的環境變數

    剛剛不小心試出來的,常用的是PROJECT_DIR,PROJECT_NAME 看看現在在哪裡
SDK_NAME用來看現在的device是實機還是模擬器。
下面是所有可以用的variable跟範例值

How to cheat jb detector and detect cheating

這個月的cocoaheads講了一個比較冷僻的題目,這個題目如果平常沒有在做jb防範應該是不會注意到的。我也是剛好前陣子有這個需求,才去找了一下資料,看了一下stackoverflow,發現大部分都是檢查檔案架構,還有url schema呼叫看看有沒有cydia。然後發現xCon這個tweak,看了幾篇文章後,才有後面這一連串檢查,這一串其實是個冤冤相報何時了的概念。

會寫這一篇的出發點,是在第二頁,列出一些app沒有做保護時會洩漏的資訊還有常常使用的攻擊手法。因為我平常都用這些方法在分析競業app,才會想要找一下防範方法。

在第二頁稍微寫的工具還有他們會造成的什麼影響,我故意沒有細講,我想如果想踏入iOS security研究的人,第二頁那邊的工具可以去玩玩看,留給有興趣的人去發掘,算是個出發點,然後有什麼心得可以加我好友一起來討論XD。想直接看答案的人可參考我之前寫的一篇 iOS app security




reference有這幾篇:
IOS Application Security Part 24 – Jailbreak Detection and EvasionxCon
xCon-Issues
iOS安全攻防(二十):越狱检测的攻与防


影片也出來了,這幾個月都在比快的



問題

在QA的時候田單單有問:我寫的那個check method如果被hook了,那不就白保護了。
我當時的回答是可以寫成block,讓他檢查不只做一次。回家的路上想想這樣還是不夠完整,
其實還可以再做三階段的加強:
  • 第一個是寫成inline block,或者是寫成c的function 宣告,這個目的是為了防止class dump,讓他看不到method name,也就不知道要怎麼hook
  • 第二個是把method name變得很長很長,我在sample裡面是取叫isJailBreakCheck,反正objC的method name都是在比長的,寫成isJailBreakCheckIfYouWantToProtectYourApp_ImSwiftSeniorEngineer也是可以,hook的時候打錯一個字就hook不到了,連我自己也覺得這蠻北爛的。
  • 第三個是回傳的比對值千萬不要用boolean,一定要用object,先定義好兩個object代表有jb跟沒有jb,最簡單的作法是用string。複雜一點的話可以再加一些加密解密的檢查。
在看這些文章的時候常常會想這些寫security的人是不是神經病,哪來這麼多攻擊跟偵測方法可以一層層的疊上去,然後文章看多了自己似乎也變得疑心病很重。真是沒事不要做security。

其他收穫

在晚上活動一開始的時候,主持人(David)有讓大家分成幾組自我介紹。每次去聚會都會看到很多熟面孔,但每次也都會一些第一次來的人。在我那組自我介紹的時候,有兩個是學生或剛畢業的新鮮人,其中一個說是老師介紹他來的,所以我們問他

「你老師有來過喔?」
「對啊」

眾人大驚。

從來都不知道有學校老師來過,這實在有點可惜。
沒有辦法促進產學交流,這更可惜。
我跟幾個朋友在聚會結束之後都會去吃宵夜聊天,如果有新朋友想加入的,不要害怕,伸出友誼之手就對了,我們可以告訴你很多工程師升級經驗談。

像這個月是一群人在國父紀念館旁邊的公園看OOBEsuperbil玩ingress打變電箱。



Apple Design Award app簡單分析

透過reveal.app可以很簡單的看到app的view hierachy,跟頁面使用了哪些class item,就這次Apple Design Award得獎作品簡單分析一下,扣掉幾個遊戲我沒什麼興趣以外,我覺得幾個有象徵意義的如下:

Sky Guide
原本以為很炫,打開後發現沒什麼好分析的,主要UI是用OpenGL實作看不到,除此之外只剩幾顆button不值一提。



Yahoo News Digest

身為連續兩年得獎的公司,yahoo 在news digest上面把視差滾動又玩得更上一層樓。
有很多去年得獎作品Yahoo Weather的影子。



Storehouse
滿滿的客製化UI compoment,細節一大推,我心目中的最大獎就是他





iOS8 beta 降級成iOS7步驟

為了測試現在寫的app在iOS8會有什麼問題,把自己的手機升成iOS8,把一些發現的問題都寫完了。大概有用到螢幕旋轉或判斷keyboard size的都會有些問題出來,還遇到AFNetworking在iOS8的會crash的問題。最難過的是一些常用的app都有大大小小的災情:像是skype不能傳訊息,Line進對話視窗會直接crash。

反正該修的都修完了,也該降回來了。以下是降級步驟:


  1. 把iPhone/iPad關機
  2. 打開iTune,連接iPhone/iPad
  3.  按住Home鍵,直到出現連接iTune的畫面為止。
  4. 然後會進入回覆模式,選「回覆與更新」
  5. 開始下載最新版的ipsw,如果你已經有的話可以按住option再按「回覆與更新」
等他跑完一直按下一步就好了。

看device上的SSL連線

前幾天才知道這招是隔壁部門的新人教育訓練之一,雖然工具不太同,不過作法一樣,都是要安裝自己sign過的cert。


我習慣用的工具是Charles,步驟如下:

在還沒有成功以前,Charles雖然可以看基本的http連線,但是沒辦法看到https的內容。



其實只有兩步就可以搞定了,第一步是在手機上安裝charles提供的cert,只要在手機上打開
http://www.charlesproxy.com/assets/legacy-ssl/charles.crt 就可以,然後輸入密碼點安裝就可以了,完成後如下所示


再來到Charles的proxy setting,SSL那欄,Enabled SSL Proxying打勾,下面增加一個要監聽的位置,像我是看所有連線的443 port





再看一次畫面,已經可以看到裡面傳什麼囉。
就是這麼簡單!




coscup 遊記

今年搶票的時候還在國外出差,搶票的時候是凌晨三點,完全忘記要搶票這件事。
就算記得應該也是很難在10秒內點到。

還好今年公司有贊助,分到一張門票,潮爽der。

現在出來的資料大概有這些:

IRC log
hashtag,回味一下當時發了甚麼文章
coscup 共筆
比較熱門的幾個題目都有錄影,好有幾場都在台下聽完,再看一次還是覺得很棒。

題目實在太多了,7軌再會聽最多也只能聽完1/7而已,講一下幾個我聽到覺得蠻有趣的:


Maker精神+大學教室

講者是元智的老師,這場session其實就是講他在課堂中帶學生用Aundrino做了甚麼應用,很有成果展的意味。完完全全就勾起了學生的興趣,期中期末做完學生還要求加碼,到Fab Lab去玩了一下3D printer,我想這場講完,這老師的課應該會變得超難搶的。

The Noto Sans CJK Font and Its Making

全世界第一場講Noto San 字型的session,講製作CJK (殘體、正體中文、日文、韓文)時發生的一些事,當然不能錯過,放棄前一場session先去搶位置果然是對的。幾個有趣的key point:
  • Noto 意思是No Tofu的意思,也就是讓所有字都不會出現方塊字
  • 從2010開始討論,和Adobe的小林劍先生一起設計
  • 製作時盡量符合當地的書寫習慣
  • 之前有許茹芸吃蓋飯的故事,現在有辣妹吃排骨飯的故事
  • 直書時不需要再另外轉換
  • 在教育部的標準字體裡面發現6個錯,已經回報
  • 中文叫做思源黑體,是葉平取的

在豆瓣的这两年 - CODE系统开发之旅

作者是豆瓣前技術總監,看著豆瓣從10幾個工程師到300多個工程師,這場介紹了很多豆瓣公司內的文化,像是新人網頁上面會有自己給自己的標籤,也有別人給你的標籤;自己給的都很正經、別人取的都很惡搞。CODE是豆瓣自己內部用的git平台,約三年前開發,當時因為github還不成熟,gitlab還很難用。所以自己做了一個git平台取叫CODE,一些細節像是非常鼓勵pull request,為了鼓勵大家pull request,做了獎勵機制:如果pull request被接受有merge到master上,加100分,如果給pull request下comment,加5分。然後工程師們就會為了虛無飄渺的分數瘋狂的作pull request,有一句話講得很好「工程師是靠著榮譽感活著的」。

CODE的基本要求是github有的功能CODE都要有,連UI也一模一樣,有個詞叫「像素級拷貝」,有一天github的人到豆瓣交流,完全沒有看出來有甚麼不一樣。看到範例後突然覺得小米、Samsung抄Apple也沒甚麼大不了的 =.=。這場錄影出來一定要再看一遍。

Skymizer 雲端編譯 / Skymizer: Build Software Better and Faster On The Cloud

講者Luba ,這場其實是佈道大會。舉了幾個實作compiler時會遇到的問題,最後介紹公司福利招生。不過講者很有心,特別穿恐龍裝拿一把劍。因為compiler聖經本的封面是騎士屠龍。






重點是Luba跟這次公司派出去的講者長得好像,我在上傳照片的時候facebook還問我要不要tag我同事XD


How KKBOX use mrjob to bring python, hadoop, AWS together

強者我同事,一個白天都在開會晚上才在趕作業的工程師主管。

其實他會寫的我都不會,所以我沒有聽這場XD 只有在公司內預講的時候有聽過,如果跟預講一樣的話這場主要講的是三個東西:
  1. 如何把要算的指標map成程式
  2. 如何reduce運算量
  3. 在AWS開機器的時候,要怎麼開才比較划算
是很實戰的經驗分享,如果有在做big data的人這場一定要聽,我只有在第3點如何選機器那邊比較有聽懂而已,前面兩點都在講語法自動忽略。

以下跟session無關

看上面我跑的議程這麼少就知道我是來交朋友的,COSCUP前一天公司剛好請林義傑來演講,不小心坐在這次公司要派出去的講師旁邊,他很煩擾晚上的講者晚宴要去幹嘛,其他講師沒半個認識的,剛好去年當主持人的時候有去過,也有認識幾個人,就三個人一起去逛一逛。然後吃一吃接通電話就不小心多拿到一張票了XD,還好coscup票還算搶手,馬上就送出去了。

對我來說coscup 根本就是業界八卦交換中心,遇到很多業界友人,聊天都聊到忘記有session,遇到了很久不見的大學同學,人多到可以開小型同學會也是蠻厲害的,雖然都是一樣北爛沒甚麼變。話說ubuntu的名片背面空白這麼多根本就是拿來畫畫的吧。(還有兩張沒入鏡XD)


去了幾年coscup,第一次參加Bof,去了電腦機房大腸花論壇逛一下,聽了很多.....恩,我忘了。感覺也不算是八卦的八卦,應該算是常識吧。

雖然看似做了很多事,但是結束以後一點都不會累。大概是注意力一直有在切換的關係吧,sesion聽膩了就開始寫code,趕場趕到一半遇到朋友聊一聊天就不小心過一個小時,聊膩了再跑回去聽session。累的時候不是要休息,切換模式恢復比較快。









台灣經緯度TWD97

昨天跟朋友去hackthon,做的題目裡面有一關是要做TW97轉WGS84。找了一下資料,有很多朋友都寫過各種語言的轉換function。
至於為什麼要有這麼多格式要轉換我想下面連結裡面隨便點一篇就知道了。

python
經緯度轉換TWD97

C#
WGS84經緯度與TWD97(TM2)投影坐標轉換程式

Ruby的
[Note] 二度分帶座標轉換爲經緯度

可惜我找不到objC版的(連C的也沒有),就順手寫了一個。
在github,寫好後聽朋友說這個寫法只有在本島會準,在蘭嶼澎湖需要再微調。


如何防止class dump

要防的東西分為三類:
  1. class
  2. variable
  3. method
最簡單法,通解,讓別人看不懂這些東西是在幹嘛的,Obfuscating(混淆),把平常口語話看得懂的所有東西混淆成看不懂的亂碼,但是邏輯依然存在,發現邏輯了以後還是可以輕鬆愉快的找出來。



比較正規的作法,根本不要出現:

variable:如果是property,改用@dynamic 而不是@synthesize,@dynamic 意義在於不會建立setter getter 也沒有建立個local variable,也就dump不出來了。可以用method swizzling在拿setter getter的時候轉給其他名字上聯想不到的method處理。

method:有很多種保護法,比如說在runtime的時候才註冊method、
把method寫成INLINE function、或者把method用c寫。


PIXNET Hackathon

以往國內的hackthon大多集中在下半年,上半年比較少。這次看到三月有一個活動,就很高興的找同事報名,因為不期待會有太多同事有興趣,就只問了一兩個....我的原則是不推坑,要推人下去的時候自己也會跳下去。其實我是用心良苦阿!!

剛好pixnet要辦個半天的hackthon,第一次參加這種的剛剛好,傷腦細胞不傷身。

這邊有些會後報導:
推廣開放資料 痞客邦辦黑客松
報導稿:PIXNET Hackathon 2014 Powered by Code for Tomorrow

這次一起去的同事(謝清帆)以前完全沒有去過hckthon的經驗,反正我想這個pixnet hackthon沒有篩選沒有獎品沒有獎金,連時間也只有7個小時,應該快樂寫就好了,所以就沒有特別跟同事討論題目,只要他提出來的就可以,這一個月來我大概每天都會戳他一下:「阿是想好了沒啦!」

一直到兩個禮拜前都還沒有動靜,想說這樣下去可能要開天窗了,就修改別人的code做一個flappy bird的小遊戲,說你再不給我題目我就要demo這個。
於是我這兩個禮拜每天都會聽到「不要阿」「救命阿」「我一定要阻止你」「我快想出來了」這種話。

終於在活動前兩天做出了一頁像是旅遊規劃的東西。那就用這個題目吧!

報到後10分鐘活蹦亂跳的模樣

大概90%的功能都是在當天寫出來的。

我分到的工作是要做旅遊規劃完成後po到網誌上的api,然後試了一下,要用OAuth,大概試了兩個小時,一直鬼打牆,才發現有一堆隱藏的參數散落在教學文件的各角落,要把他們拼在一起才會有正確的回應,然後OAuth給的參數命名跟我之前用的不完全一樣,光是在做文字轉換就花了大量時間。所以大概在下午一點的時候做了兩個決定:
  1. 改spec,改成旅遊規劃儲存在local,所以就不需要po文的功能了
  2. 承上,因為我要做的事突然不用做了。所以
我就自立門戶,把flappy bird 做完整,順勢改名叫pixnet fly
不過時間離demo只剩四小時。能做些什麼呢
大概只做了這些
  1. fork一個別人已經寫好的flappy bird
  2. 加上iOS7才有的TTS(Text to speak)功能
  3. 在第一頁加上了選pixnet使用者的畫面,然後拿大頭照,這也是我唯一串的api
  4. 承上,把拿到的大頭照拿來當flappy bird的鳥
  5. 把背景圖換成活動會場,把gameover的圖換成pixnet的logo


如我所料的寫完以後謝清帆已經虛脫了,才7個小時而已

我絕對不會說他就是KKTIX作者
拍這張照片的時候很囂張的說他今天的工作量就像是重寫了半個KKTIX

demo的時候他雖然發生一些問題,像是雙螢幕設錯、忘記iOS模擬器裡面沒有中文輸入法,用手寫國字花了很久、live demo crash之類的~~
不過我覺得這都是上台經驗不足的關係,多來幾次應該就可以克服了。


要回家吃晚餐前有雜誌編輯來採訪





那篇採訪也出來了,花蓮旅遊規劃那段就是在講他寫的


兩三個月後再來一場吧~~~,下次找有獎金的認真寫,
認真寫不叛逃

PS2:結束隔天就到東京出差,附上一張到剛剛在東京牛角吃到的灑金箔和牛,超好吃的!



open and fire

最近下班後的晚上一直都在看各家公司open出來的資料,上一篇列了幾家music相關平台的,這兩家是video 相關的

hulu,偏向研究報告跟framework介紹。

Netflix,很多活動介紹,比hulu更進一步,因為要講的東西實在太多,所以看到很多篇文章都是講我們辦了什麼主題的活動,有多少人參加。
很懶惰,竟然是用blogspot

相較起來我比較喜歡大陸的作法

相較於HULU跟Netflix單純是商業化副產品的展示區。騰訊對於不同的觀眾有規劃了不同的區域,像是學生、合作業者、競爭對手都有整理好的內容。阿里校園就是專攻校園,由學校為出發點,再對每個主題細分。
阿里開放平台就很普通,給開發商串API的玩意。

對比這四個平台,我看到的是每家公司在對於「open」這件事背後的深度,hulu跟netflix很明顯就是一般的思考:火力展示,也就是標題寫的open and fire,對於一般公司來說,open幾乎就等於炫耀,昭告天下「這就是xx」,從公開的資料可以看得出來這家公司平常是怎樣運作的,工程師面對的文件是怎麼樣的、甚至可以知道這家公司的技術能力到什麼程度。進而洗腦觀眾,認同公司的文化,強化對這家公司的印象,吸引一樣理念的人來投履歷。

相反地,如果東西太爛那還不要拿出來好了,會達到反效果XD
Gracenote那什麼api,爛爆了。如果東西很爛還是不得不拿出來那還是偽裝一下吧,這種東西完全不想用阿。

open的目的

似乎每家科技公司,成長到某種程度後,都會考慮做open data,不管是API/Framework/Library,或者分析報告。在做任何決策的背後都一定有個目的,我猜有這幾種:
  1. 最常見的目的是自己的應用已經做膩了,不知道還能做什麼,open出來讓想玩的人來應用
  2. 寫SDK讓其他合作夥伴串接(這個是為了賺錢而開放,不想討論)
  3. 吸引相同理念的人加入
我只想討論第三種:吸引相同理念的人加入。
作法很多種,最徹底的作法當然是深入校園,但這個成本應該也是最大的,也就是阿里校園的作法:直接以學生為主要觀眾,稍微想一想就可以知道為什麼要這樣做:如果公開出去的資料是連學生都看得懂的話,那一般在業界打混過的人就一定可以看懂,甚至會有種培養我們下一代的崇高使命感。有這種格局的公司,台灣不知道,沒看到哪家公司有這個想法可以想到學生這一層的。

最近也在規劃open data的事,如果可以一開始就看到這件事的影響力,把影響對象延伸到學生族群,那麼這個平台的影響力應該會比平常在conference擺攤兩天還要大很多。

有了open data,接下來要怎麼推廣、怎樣保持open的動力,那就是另一件事了。


music streaming open api

spotify
Rdio
Echo Nest

pandora 找不到,看起來是沒有
KKBOX 沒聽說過有

都要有付費帳號才能申請application key。這幾家台灣目前聽得到的只有spotify,其中spotify跟Rdio都把api寫成framework給iOS和Android用,只有Echo Nest 是用json,用session id來控制播歌權,看他spec更新的頻率,感覺他的client也是用這套api來寫的。

Gracenote的api竟然是用XML,這是什麼歷史共業嗎?


有提供api的幾家樣式都很不一樣,不管是document的格式或者從spec裡面,大概可以看出來每家公司設計的風格。比較起來我比較喜歡Rdio的。


申請apple 企業帳號step by step

最近有朋友的朋友在申請企業帳號卡關,
剛好前陣子有幫公司申請過,以下是我的步驟(比較詳細的版本):

1.查詢DUNS碼
DUNS碼最重要也最難過,不知道自己公司有沒有申請過可以到這邊查詢,找到的話請跳到步驟3,找不到繼續步驟2

找到的話按下那顆就會顯示你們公司的DUNS Number


2.申請DUNS碼
雖然這步驟很奇怪,但是請到apple 提供的DUNS lookup打一遍,申請前要先查詢

之前一篇所說,你可能會遇到這個問題:
如果是偽分公司,像是英屬維京群島商台灣分公司這樣的,千萬不要寫Taiwan Branch,不然會失敗。
原因是apple會請你用母公司的名義去申請,但是母公司就是一家空殼公司,怎麼可能會有辦法申請勒。


解法很簡單,有兩招,一是換一家母公司在台灣的申請,基本條件是在內政部商業司有登記有統編,那就可以了。另一招是就用這個名字跟他拼了,英屬xx公司又怎麼樣,也是有負責人的阿,就用負責人的名字照實填寫,地址也寫國外。

之後你可能會跟apple還有鄧百氏台灣窗口無盡的鬼打牆,電話如上一篇,親愛的同學你一定要有耐心,這步要成功的重點是拿到公司充分的授權。當對方問你:「請問您是否能代表貴公司提出申請呢?」,不要懷疑,apple的客服都外包給大陸,全部都是大陸人了,這個時候大聲的給他回答當然可以就對啦。


3. 申請apple 企業帳號
歷經痛苦的申請鄧百氏碼後,終於可以開始跑要申請的東西了。
apple申請網站開始跑流程了

沒有看錯,一年就是要299

一直填下一步就可以了,其中聯絡地址可以填台灣的沒關係,最後你應該會停在資格審核中的畫面,並且收到這封信:

再來你就等吧....等到apple的客服聯絡你。我上次申請的時候大概是等了3個禮拜,他會打電話到你申請時填的那隻電話,客服都是祖國同胞,所以不用擔心語言不通。

我申請時遇到一個問題,改掉後才讓我申請,就是我的名字申請時是寫Hokila Jan,客服打電話過來說不可以用藝名,一定要用漢語拼音才可以,到Apple ID後台修改就可以了。哼

最後也是最好玩的步驟來了,你要跟客服玩人工NPC的遊戲,他會問你四個問題,通過了以後才讓你申請:

1.請問您是否可以代表您們公司提出申請?
   當然要說可以!!

2.你的Person ID
   寫了這麼一陣子iOS,我聽到這個問題也是楞了一下,我後來才知道是在Member Center,Your Account裡面,似乎要先有一般開發者帳號才會有的樣子,這我不確定。


3. 請問申請這個帳號是用來幹嘛的,會不會拿去上架?
    一定要說是內部測試用的
 
4.請問這個帳號產生的app是給誰使用的
   一定要說是公司內同事使用,不給外人用

以上,有很多問題細節是iOS開發者才知道的,我的建議是授權給公司內的工程師去處理,不要想說給PM或秘書去跑流程,一定申請到天荒地老還出不來的啦。我當時是拿到主管的主管授權後才去申請的,誰在意誰辛苦,我覺得這是最有效率也是最實際的作法。



然後就可以刷卡申請帳號了,任何人的卡都可以,我的作法是先自己刷卡,再填請款單請款。



刷卡完馬上就會收到這封信,拿到帳號後就可以去申請In House的Provision了。


進去後台看到這個畫面就功德圓滿啦,接下來應該就不用再教了吧~~~

白色的力量


聽柯P演講,想不到還有好幾個醫師在各個領域裡面努力。加上以前看到的好幾個醫師,革命好像是醫師的宿命。

楊斯棓醫師的反核演講,雖然網路上可以找到很多批評的文章,但是對照今天的演講,看得出來他都有聽進去,不停在投影片裡面修正。

其實我也覺得楊醫師的演講,技巧大於內容,不過他講得真的很認真,也是我第一個看到這麼年輕台語講得這麼好的,像是裝錯靈魂的說書人,TED上面的演講跟今天聽到的全部都不一樣。




柳林瑋醫師之前參與過公民1985行動聯盟,現在跟g0v合作做出市長、給問嗎,這類公民參與的網站在台灣是第一個,但是美國已經推很久了,美國的watchout上還有「可不可以建死星」、「可不可以把小賈斯丁趕出美國」這些跟政治完全沒有關係的問題。

雖然網站現在掛掉了,但是明天就要重新上線,期待到年底選舉能發揮什麼作用。





回家,想了想今天的收穫,再想了想柯文哲今天的內容有什麼問題。

聽柯文哲演講,大家好像很激動,但是我沒什麼感受。我一直在想:
之前聽過好幾次政治人物演講、也參加過好幾次公民運動遊行,柯P講話的口氣跟我之前聽過其他人的完全不一樣,一般來說講到激動的時候應該會帶動群眾氣氛,來個七言絕句,或說個「對不對」、「好不好」、「是不是」之類的,他上台的時候,完全沒有這類句子。

一開始我看到柯文哲要出來選市長的新聞時,我只覺得他頭腦壞掉了,但是今天聽完,才知道他真的是認真的,他的目標其實不是台北市長、選台北市長只是因為這個職位對台灣的影響很大,他要做的是投影片上面那句「思想、文化、制度變革之公民運動」。



仔細想一下今天的內容,有很多主題都只點出大方向,但是沒有指出解決方案,只有解釋他為什麼要出來選台北市長這個問題,到年底還有非常長的一段時間,他現在的資源看起來也非常匱乏,蠻懷疑他能不能處理好接下來的挑戰的。

慢慢看吧。