首頁

  • MacOS CPU 資源被 ReportCrash 吃光

    MacOS CPU 資源被 ReportCrash 吃光

    前言

    最近筆電常有卡頓感,打開了活動監視器後,發現有 ReportCrash 吃掉我 80% 以上的 CPU。一開始以為是我哪個程式當掉,想說重開機就好,但重開完依然看到 ReportCrash,肯定是哪裡出了問題。網路資料說:ReportCrash 就是有服務當掉才會跑出來,且該服務不斷地重複開啟,導致 ReportCrash 消不掉。

    解決方法

    cat /var/log/system.log

    利用上述指令印出系統的紀錄檔,看是哪個服務一直重複啟動,找到就將它砍掉吧。我是看到 tw.gov.nhi.nhiicc2019,這是健保卡的相關服務,推測是我之前報稅時下載的。如果你也受健保卡服務所苦,請參考下述連結說明:

    移除 macOS 健保卡元件
    移除 macOS 健保卡元件. GitHub Gist: instantly share code, notes, and snippets.
    sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist

    上述指令用來終止 ReportCrash,可以緩解資源被佔用的狀況,但在找到重複啟動的癥結點後,還是要將它加載回來 。

    sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist

    刪除掉重複開啟的服務後,就可以利用上述指令將 ReportCrash 加載回來。

  • 貫徹始終的賓士車隊文化

    貫徹始終的賓士車隊文化

    前言

    這陣子在看 Netflix 上的 Formula 1:飆速求生。它是一部體育紀錄片,主要從 2018 年開始記錄 F1 賽車的故事。最近追到了第二季,第四集的內容在講 F1 賽車的常勝軍:賓士車隊,這集看完讓我驚嘆賓士車隊的文化,讓人難以置信可以組織出這麼強大的團隊。

    正文

    這集有三個人令我印象深刻,分別是尼基勞達、托托以及路易斯漢普頓。尼基勞達是賓士車隊的董事,過去是一名傳奇賽車手;托托則是車隊經理,過去也是一名賽車好手,至於路易斯漢普頓,他是賓士車隊的當家車手,在節目拍攝時已經取得五次 F1 世界冠軍。

    賓士車隊並非一開始就是一支勁旅,而是在尼基勞達出任董事後開始轉型(關於尼基勞達的故事,可以去看決戰終點線),截至第二季內容的 2019 年,賓士車隊已經連續五年獲得世界冠軍。這集內容主要是在講述該年度德國的大獎賽,賓士在主場發生嚴重失誤,最終一分都沒拿下。

    托托在接受 Netflix 訪問時,他透露賓士車隊的強大來自於一千六百位員工,他其實大可說是車隊在尼基勞達(或是他自己)的帶領下,取得當前的成就;但他沒有,而是將這份功勞歸於全體,這可能是場面話,但後續的發展讓我覺得他是發自內心陳述這件事。

    路易斯漢普頓在排位賽*身體不適,雖然前幾圈跑不好,但最終還是拔得頭籌,拿下了竿位*,此時他不像其他車手講些「爽啦」「耶」之類歡欣的話,而是感謝全體的付出,這也讓我印象深刻,真是一名內斂的強者。

    在正賽過程中,排名第一的路易斯漢普頓因車體受損要進站維修,原本只要換前翼,結果維修人員調度錯誤,連輪胎也一起換,這一折騰就是超過一分鐘。F1 賽車平均維修時間只有兩秒,套句賽車記者講的話:「在 F1 賽車,維修一分鐘幾乎是過了一年」,這是很嚴重的疏失,出站後排名已經掉到很後面了,最終完賽未能取下一分。

    事後檢討時,路易斯漢普頓率先跟大家道歉,他覺得是他沒有挽救頹勢。說真的,怎麼看都不會是他要道歉,整場看下來,他唯一犯錯的點就是打滑了一下,而且還沒有撞車。身為數屆冠軍車手,這是多麼廣大的胸襟?而托托在這次拍攝中沒有責怪任何人,因為他們有一套「不責怪」的文化。事情搞砸時,我們很習慣地會想要去抓戰犯,但賓士車隊這種對事不對人的文化,說明了他們卓越的原因。

    內容的結尾,帶到了尼基勞達所說的:每個人都會犯錯,重點是記取教訓,然後改變,變得更加強大。

    名詞解釋

    排位賽:各家車手在正式賽事的跑道上試著跑出單圈最快速度,此成績將決定正賽出場的排序,成績越好排得越前面。

    竿位:在排位賽取得第一名的成績。

    後記

    在職涯中,我經歷過不少公司,也有過被責罵的經驗。就我自己所感受到的,我認為被責罵後的表現很容易變差,而且還會造成員工間的不信任。比起責怪,我認為討論失敗原因以及改善方法才是上策。

    這是我之前在徵才文提到的內容:

    就事論事不是口號,是做到想法直說不用擔心得罪對方。

    就事論事是很重要的;對我而言,一個人很難面面俱到,那些資深、專業的員工不見得什麼都懂。好的公司文化應該要有機制聆聽不同的聲音,因為讓管理者完全帶領員工是不切實際的,必須有人在不同面向察覺一些端倪,提出後好讓大家可以往更好的地方前進,這才是長遠的經營之道。權力下放不見得是能力不足,而是理解這麼做可以帶來更大的效益。這也是為何我喜歡扁平的組織,因為管理者跟員工的對話機會更多,只要這些想法都能妥善處理,就能帶來正向循環。

    正循環

    1. 員工因為建議被採納,進而願意分享更多見解。
    2. 公司因為好的建議而有機會改善某些環節。

    當然,上述循環是理想狀況,也有一些情境我覺得滿常見的:

    1. 建議一百次後沒有得到採納,員工失去自信。
    2. 員工覺得決策者不公平。

    關於第一點,我其實可以理解,是否有辦法在屢戰屢敗後還可以站起來繼續打下一場仗的心理素質會是關鍵。每次帶著解決方案去找我家的技術主管,每次都被打臉我也覺得開心,因為又學到一些東西。但不見得每個員工都有一樣的心態,我只能給予引導與鼓勵,長久之計還是得讓員工長出面對挫敗的應對方式。

    我認為公平很重要,某種程度上,它是崇高、不可侵犯的。但決策者必須把關的是:帶領公司朝正確的方向前進。權衡之下,我會直接捨棄公平,公司利益為先;這也是為何某些人擁有決策權。遇到不滿意的決策,我通常就是詢問決策者的見解,無論最終有沒有說服對方,最起碼要保有資訊同步以及對決策者的尊重。

    很多問題是沒有解答的,彼此見解若多次牴觸,那我會覺得道不同不相為謀,去尋找下一個認同你的地方吧!

  • 腳踏車抵家的系統設計

    腳踏車抵家的系統設計

    前言

    在確認了產品需求之後,接下來就會走到開發實作的階段,這個階段第一個面臨的問題就是:我的系統要怎麼處理比較好?在回答這問題之前,必須盤點手上所有的資源,尤其要注意這些資源的限制,因為會攸關到可行性。

    產品需求見下文:

    資源清單

    • Oracle Cloud VPS * 1
    • Supabase Database (PostgresSQL + Postgis) * 1
    • Google Cloud Functions (for Auth)
    • 政府開放資料

    除了 Google Cloud Functions,其他都是免費資源。都有 VPS 了,為何還需要去付費使用 Cloud Functions?

    我之所以將 Cloud Functions 納入是因為:不想讓別人看到我的 API endpoint。尤其我是用免費的 VPS,機器比較不夠力一些,加上自身 SRE 的專業不強,很怕 Server 被人打趴,因此將驗證做在 Cloud Functions,先濾除一些非法的連線再去連我的 VPS;而不是直接把驗證做在我後端程式的 middleware。

    版本 1.0.0

    最一開始我串接雙北的公共自行車開放資料,因為開放資料沒有統一欄位,所以我寫了爬蟲程式放在 VPS 上,把開放資料整理後存入資料庫,並透過 API 將這些整理過的資訊給 App 使用。

    版本 1.1.0 – 1.2.0

    後來我發現交通部有個公共運輸整合資訊流通服務平臺(Public Transport Data eXchange,PTX),它整合全台灣公共自行車的資料,做的事情跟我 1.0.0 爬蟲程式差不多,就是取出資料交集,整理出一致的資料格式。此時決定改用 PTX 的資料,省下處理各縣市開放資料不一致問題的工。

    這時拿掉了很多東西,因為 PTX 滿足產品早期的需求,少維護一台伺服器我也樂得輕鬆。此時還留著 Cloud Functions 是因為:Android 應用程式容易反組譯,我不想讓 PTX 的金鑰外流,因此多墊一層確保安全性無虞,也保留一開始驗證使用者的功能。

    版本 1.3.0 – 現在

    新的產品規格有一些細膩的資料需求,這是 PTX 的 API 無法提供的,所以走回老路,重新啟用我那台 VPS 跟爬蟲程式,改爬 PTX 的資料;下圖左下是長回來的部分,專門處理新功能的需求。

    原本想要讓 Cloud Functions 直接對我的 Server 拿資料就好,但我自己的 API 回應時間一直調不到我預期的水準,所以保留 Cloud Functions 對 PTX API 拿資料的那段,確保回應時間壓在 100 ms 以下。

    優點與缺點

    每個解決方案都是權衡下的結果,我認為沒有最好的解決方法,只有最適合當下的處理方式。下述提到的優點是我追求的,但一定也為此犧牲了某些東西。

    高流量

    因為 Cloud Functions 可以自動水平擴充,所以使用者變多時也不太擔心。腳踏車抵家的主功能是在地圖上瀏覽腳踏車的站點,這是打 PTX API,我看 PTX 有處理 Cache 機制,感覺打不太死。而我的 Server 負責小功能的 API,這被打趴就算了,至少主功能還活著。

    安全性

    Cloud Functions 那邊用 Firebase Auth 處理驗證,不該外流的 key / secret 也沒有暴露給人看,看起來還算安全。

    費用

    便宜,目前 Cloud Functions 每個月花不到 100 台幣,當然使用者少也是一個原因。

    速度

    Cloud Functions 對 PTX 那段的速度還行,但我 Server 那邊就有點問題了。Cloud Functions(台灣)、VPS(日本)、Database(日本)分屬不同雲端服務,且分散在各個位置,這是先天不足之處,加上我沒有完全榨出那台 VPS 的效能;這問題我最後用連線策略跟使用者體驗處理掉,實際感受沒有那麼慢。

    最讓我有感的是 Cloud Functions 沒用時會睡著,要用時才會被喚醒,這個啟動時間超過十秒。就我自己觀察:有時打開 App 的前兩個 API request 會特別久,回應時間遠超出我的預期,即便我調整 Cloud Functions 的常駐數量也無法達到舒服的回應時間。但這就是它便宜的原因,想改善就是要換掉。

    潛在成本

    PTX 之後可能會收費,加上它是有使用上限的。目前爬蟲抓 PTX 資料是不可避免的成本,但主功能連 PTX API 那段其實是可以省下的,在正式處理之前都會是個隱憂。

    未來可行方案

    Typo, Radis -> Redis

    未來若有機會不計成本,我想以這個架構來實作。自然是囊括上述提到的所有優點,但目前的我還無法實踐,需要先擴充我的 SRE 技能點以及我的口袋深度。認真來看,這應該可以滿足商用等級的需求。

  • 創業之星選秀大賽得獎感言

    創業之星選秀大賽得獎感言

    2019 年,我們只有三個人,公司都還沒成立,只能暫時棲身成員在農田水利署二樓的合租辦公室,連座位都要搬開一堆雜物後,才勉強可以坐下。幾個月後,我扛著螢幕跟電腦設備在民生東路走過數個街區(後來換辦公室都有請搬家公司,請大家放心),跟著兩位初始成員搬進宏泰金融大樓,終於有個安身立命之地。

    後來我們陸續換了幾次辦公室,員工也成長到近三十人;在這期間,我一直覺得讓大家相信這間公司是困難的。我們在台灣沒沒無聞,搜尋公司名稱查不到什麼資訊,甚至有面試者懷疑我們是詐騙集團。

    「協助印尼政府進行稅務改革、印尼政府支持的新創科技、印尼辦公室座落於總統府行政區正對面」是我們在徵才頁面的說明,以往面試時,面試者對我們的公司總有諸多疑問。

    「公司真的能進駐在總統府旁邊嗎?」

    「為什麼台灣人可以做其他國家的稅務系統?」

    ……

    「原來是這樣,網路上查不太到你們公司的資訊,我一開始還有點擔心。」

    我們對每個問題據實以告,面試者最終也可以理解,但終究在親眼目睹之前,也不過是單方面說詞。

    我們一向鼓勵員工到最前線見證自己工作成果在當地的影響力,並走入政府大樓,跟我們熱情的印尼同事一同協作。儘管你可能只出差一、兩週,但我們也期待你試著融入當地。下班後,穿越對面的國家紀念碑,再往前走,那裡有一條小吃街,還不太適應當地食物的你,點了一盤炒粿條跟肉丸湯,你似曾嚐過這位廚師的手藝,或許往前追溯兩、三百年,會發現彼此的某代祖先就是鄰居。用完餐,你走到隔壁,那裡堆滿小時候最愛吃的山竹,以及從未看過、像是蛇皮般長滿鱗片的未知果實。接著你心滿意足地拎著一袋水果,用 Gojek 叫了一台機車,跨上機車後座後,在大馬路上穿過世界第四壅塞的車陣,並用你蹩腳的印尼語指引司機該怎麼騎到宿舍。最後你在客廳的沙發上,用多汁而酸甜的滋味結束一天的辛勞。

    2020 年疫情爆發後,出差去印尼的員工全數緊急撤離,逃命似地飛回台灣,諸多業務也因為後來雅加達封城而停滯,台灣跟印尼之間的聯繫就剩一條網路線跟幾通越洋電話,試問該如何證明這個事業千真萬確?印尼中央社的新聞稿?還是幾張印尼夥伴與地方首長的合照?看著無法理解的文字及照片上異國的傳統服飾,彷彿另一個世界,疫情在我們的事業籠罩了一層陰霾。幸好,今年印尼疫情趨緩,得以讓我們再次前往雅加達,加速印尼的所有業務。先前的擔憂一個一個化解,陰霾也逐漸散去,透露出一道曙光。

    四天前,我們榮獲經濟日報創業之星選秀大賽的冠軍,從 141 個企業隊伍中脫穎而出,受到來自各界的專業人士、評審肯定,這無疑是莫大的榮耀。這不只大大振奮了台灣的全體員工,在印尼的夥伴也為此歡欣鼓舞。終於可以自信地說出:我們的能力不只是受到印尼政府青睞,即便是在台灣,也絕對經得起考驗。

    除了感謝主辦單位及現場的評審老師,我最想感謝一起踏上這段未知旅程的酷堤康全體夥伴,沒有大家的辛勞付出,這件事情不會成真。

    @Tiffany Hsiao,我們的營運長,這場比賽自始至終由妳獨自打理,為比賽準備了無數個日子,還壓力大到在棉被裡哭泣;一直到我們上台前的最後一刻,還是維持在緊繃的狀態。後來妳在台上有條理地把公司最好的一面呈現給在場所有人,穩健的台風令眾人印象深刻,甚至有評審老師在中場休息時間特別走過來,讚賞方才在台上的表現。還記得輪到我們上台前的三十秒吧,妳莫名揍了我一拳,我被這突如其來的舉動嚇了一跳,如果這是什麼勝利的前奏或暗號,我下次願意被多揍幾拳(但拜託不要打臉)。

    還有執行長,@Red Li,最該接受這份殊榮的人,但此時遠在南半球的最前線,馬不停蹄地處理新的合約事宜。有時我會懷念當時一起去榴槤街,從街頭走到巷尾,宰殺無數顆或大、或小的榴槤,只為了尋覓那顆最美味的榴槤之王;然後回到住處,打上三小時榴槤口味的嗝(?)。

    以及 @tka,我的前同事兼 Mentor,現在的首席技術執行長,在我覺得最艱困的時候選擇加入酷堤康,為公司注入活水;團隊在你的帶領之下,除了技術限制的突破,團隊也明顯地比以往更加凝聚。以前總是受到你的指導與照顧,現在也是如此;我甚至想過要賣一顆腎來回報你的恩情,但我覺得一顆大概不夠,因此作罷(?)。

    最後,我想感謝閱讀此文的你,願意騰出時間看到這裡;今天是週末的最後一天,願你在週日晚間可以充分休息,然後明天與我一起在各自的職場上繼續打拚。

    我們是酷堤康科技,致力解決印尼的稅務問題。如同前文所述,我們正走在一段未知的旅程,我也不知最終會走到哪裡,但我們絕不止步。希望未來開啟職缺時,各位可以給酷堤康一個機會,來公司與大家聊聊,若可以,讓我們一同享受旅途上的風景,一起讓全世界看到我們的實力。

    創業之星選秀/「公司組冠軍」酷堤康 跨國抓逃漏稅 | 豐雲學堂
    錢滾錢財生財,紅包發起來!累積任務數抽900個紅包~立即登錄參加>第六屆創業之星選秀大賽公司組冠軍由酷堤康科技拿下,該公…
  • 腳踏車抵家 – 立志把官方 YouBike App 再進化

    腳踏車抵家 – 立志把官方 YouBike App 再進化

    前言

    什麼事情比眼睜睜看著別人騎走最後一台 YouBike 還要難過?有的,那就是又一次看著別人騎走最後一台。我每個 App 的開發動機都是一些雞毛蒜皮的小事,就像蔬果行情站是因為喜歡吃水果、尋車小幫手是經常忘記車停哪,腳踏車抵家則是:連續兩次看著別人騎走最後一台 YouBike 的憤怒與哀傷。

    那天下午六點半要在新租屋處跟房東點交,六點一下班,我就衝去公司對面的 YouBike 站點,只看到路人騎走站點的最後一台 YouBike。也罷,畢竟 App 上顯示只剩一台。接著我往建國高架方向走,App 顯示那邊的站點還剩六台車,而我竟在等紅綠燈時,眼睜睜又一次看著別人騎走最後一台 YouBike,說好的還有六台呢?那天點交差點遲到,氣到當晚直接開工。

    官方 YouBike App 缺點

    這陣子在處理搬家事宜,因為新租屋地點離公司不遠,預計遷入後會騎 YouBike 通勤。當我久違地開啟 YouBike App 時,發現 YouBike 1.0 跟 YouBike 2.0 居然是拆成兩個 App;這令我困擾,因為我騎個腳踏車還要下載兩個 App 才可以知道完整的資訊。對我來說:只要有車能借、有位能還,我不會在意是騎 YouBike 1.0 還是 YouBike 2.0。

    你可以接受來回切換 YouBIke App 只為了看完整的站點資訊嗎?

    除了上述的資訊不完整,我還留意到 YouBike 2.0 的 App 在更新資料時會造成畫面卡頓;對一個體驗要求高的開發者來看,這是很痛苦的事情,我還要體諒對方實作錯誤導致要用詭異的節奏來操作 App。相較之下,YouBike 1.0 App 的流暢度好多了。

    此外,前言提到當天借車遇到連續兩次撲空,第一次是地圖上剩一台車的站點,這我完全可以諒解;但剩六台還讓我撲空,讓我不禁懷疑資料更新的頻率是否有問題。

    需求分析

    基於上述各種理由,我決定自己寫一個 App,首要之急就是解決前面提到的幾個問題。

    資料完整性

    簡而言之,要讓 YouBike 1.0 及 YouBike 2.0 的站點同框登場,最好還可以自由篩選要顯示哪種類型的腳踏車。

    流暢的操作體驗

    改善體驗永遠做不完,但 App 畫面凍結絕對是不該發生的,我的 App 要順暢地滑動到每一個地圖的角落。

    可接受的更新頻率

    我不知道 YouBike App 的更新頻率是怎樣,也不知道 YouBike 站點回傳資訊的時間差;但我要求自己至少每分鐘抓取一次資料,不該因為 App 更新頻率問題,導致獲取了過舊的資訊。

    節省流量

    因為 YouBike 站點的開放資料是提供整座城市的,也就是會有多餘的流量浪費,某種程度也會讓 App 變慢,我希望這個 App 可以只提供我需要的資料就好。

    多國語系

    自從口罩地圖有人許願英文版後,我都期許未來的作品可以將英文版當作標配,以便服務更多使用者。對我來說,資料內容會限制這件事情的發展,幸好開放資料有提供英文資訊,可以順手一做。

    成果展示

    站點地圖
    站點資訊
    站點資訊(英文)

    下載連結

    BikesHere – YouBike Finder – Apps on Google Play
    Provides information on YouBike/YouBike 2.0/iBike/K-bike in Taiwan.

    產品定位

    自從將腳踏車抵家分享到各大社群網站後,幾乎每個平台都有人提出其他解決方案給我。像是 Google Maps 或是 Citymapper;留言者多以「別人也有」來評論腳踏車抵家的可取代性,例如:前面提到兩個產品都有 YouBike 1.0 跟 YouBike 2.0 的資料,為何還需要腳踏車抵家?如果因為這個理由而不試用就太可惜了,我們來聊聊產品差異。

    資料廣度比較

    Google Maps

    地點資訊包山包海,說是地圖界的巨人應該不為過吧?大家都很熟悉它,不多做解釋。

    Citymapper

    專注於交通資訊,它是跨運具規劃的佼佼者。如果覺得 Google Maps 資料太多、太肥,只想看交通資訊,那 Citymapper 就很適合取代 Google Maps。

    腳踏車抵家 BikesHere

    只有提供公共自行車資訊。

    產品策略

    面對資源遠大於我的競品,我沒有辦法與他們的產品強項來正面對決,只能劍走偏鋒,找到自己的生存空間。在進擊的巨人中,第二次女巨人捕獲作戰時,主角一行人的策略就是要把女巨人引到地下通道,利用地下建物的構造困住巨人,以降低任務難度;我們這些沒有資源的個人開發者也是,要把戰場轉移到可以佔上風的地方才有可能與這些企業巨人一搏。

    多數民眾利用 YouBike 來滿足短距離的移動需求,騎乘 YouBike 可能只是起點到終點的一部份而已,後續還要轉乘其他交通工具,如公車、捷運等。面對這種轉乘需求,這是 Google Maps 或 Citymapper 的強項,各種花式路徑規劃、豐富的到站資訊,並給予使用者一百種抵達目的地的方法,這是我做不到的。

    世界上有這麼一群人,對公車到站時間、捷運路線圖、火車時刻表視若無睹,對他們來說:資訊不在多,有腳踏車就行。Google Maps 雖然也能滿足他們對資訊的需求,但就是太多了。舉個例子:你今天想吃鹹酥雞,結果阿嬤不只幫你炸了一盤鹹酥雞,還幫你煮了五菜一湯,最後你被多餵了一堆鹹酥雞以外的食物,大概就是這種感覺。

    選擇戰場

    談完了鹹酥雞,所以我打巨人的策略是什麼?腳踏車抵家提供的資料這麼侷限,真的有辦法去跟 Google Maps 或 Citymapper 相提並論嗎?我們直接用真實案例來比較:我想要知道周圍的 YouBike 站點資訊。

    Google Maps

    1. 打開 Google Maps
    2. 自動定位到目前位置
    3. 點擊搜尋列
    4. 輸入「youbike」
    5. 點擊送出
    6. 顯示周圍 YouBike 站點資訊

    Citymapper

    1. 打開 Citymapper
    2. 點擊腳踏車圖示按鈕
    3. 自動定位到目前位置
    4. 顯示周圍 YouBike 站點資訊

    腳踏車抵家 BikesHere

    1. 打開腳踏車抵家
    2. 自動定位到目前位置
    3. 顯示周圍 YouBike 站點資訊

    小結

    從操作步驟的比較來看:腳踏車抵家是步驟最少的,這也意味它是效率最高的 App。一開始在資料完整性的比較落居下風,但換個角度看,原本的缺點就扭轉成優點了;且資訊最豐富的 Google Maps 在這個比較反而敬陪末座。

    主流市場就留給那些巨人,而他們無法完全滿足的對象就是我的目標受眾,這些人不多,但只要接觸到我的產品,就會留下來,因為這種量身打造的體驗很難在大眾導向的產品感受到,少了那五菜一湯,只端出用戶真正想吃的。

    競爭對手

    選擇完戰場,會發現上述提到的兩個競品與我產品定位差距甚大,他們並不是我直接的競爭對手。在相同戰場上,最大的競品是官方的 YouBike 微笑單車 App,儘管它做得很難用,但它就是擁有官方的特權與光環,有些事情只有它能做:註冊 YouBike 會員、設定扣款方式、查詢交易紀錄……等。這是民間開發者無法觸及的領域。

    面對官方的不可取代性,我並不覺得毫無勝算。如同我作品的資料廣度不足,但反著看會變成簡潔有效率;官方的弱點就是它身為官方,只能做官方的事。就像你不會在官方 YouBike App 看到彰化的 MOOVO 或是金門的 K-bike,地方政府沒有這個需求,自然也不會編列預算去做額外的整合。

    因此我的產品新功能的規劃會以「官方做不到」為大方向,如果有機會做到極致,那官方 App 就會變成只拿來註冊、查扣款紀錄的 App,剩下的使用需求全部被腳踏車抵家做完了。

    撇除官方,剩下的競爭者大概就是跟我一樣的獨立開發者或小型團隊了。在一樣的背景、資源狀態下,其實就是看誰技高一籌。網球王子有位角色叫手塚國光,當他發動絕招「手塚區」時,可以回擊所有對手打過來的球,意味著他不會失分,而且還可以反殺對方一波;我擁有名為軟體開發的手塚區,如果有人把球打進我的手塚區,我不確定自己是否能贏,但對手肯定麻煩大了,哈。我享受彼此較勁的經過,尤其有時回首看到自己在過程中的成長,那是種難以言喻的感動。

    總結

    興趣使然的開發者不以營利為目標、不需要出報表,也不用對投資人負責;在沒有任何包袱的情況下,可以完全專注在想要解決的問題,這是我能以小搏大的武器之一;我也以這個身份為樂,因為沒有人比我更自由了。

    最後期許自己能端出美味的鹹酥雞與大家分享。

    版本更新日誌

    • 1.6.4 同 1.6.2
    • 1.6.3 修正 App 打不開的問題
    • 1.6.2 改善搜尋體驗及站點顯示方式
    • 1.6.1 修正搜尋功能無法運作的問題
    • 1.6.0 加強搜尋功能
    • 1.5.0 地圖周遭站點列表
    • 1.4.0 搜尋站點功能
    • 1.3.0 收藏站點功能
    • 1.2.1 調整縣市顯示方法
    • 1.2.0 顯示縮放後的 11 個縣市並改善體驗
    • 1.1.0 支援全國 6200+ 自行車站點地圖
    • 1.0.2 修正修正初始頁面及自動更新功能
    • 1.0.1 修正錯誤圖示
    • 1.0.0 支援雙北 YouBike 1.0 / YouBike 2.0 站點地圖

    後記之一

    App 準備好了,就差我下週搬進新住處。希望未來都可以順利借到腳踏車,快樂抵家。

    其實在開發過程,也有遇到一些問題。串接政府的開放資料,往往遇到的問題就是:服務不穩定、資料異動、欄位不一致,又或著是內容有誤。前面幾項問題在多次交手後,已經有點麻痺了,但最後一項是我認為最嚴重的。

    原因在於:沒有人知道哪些資訊是正確抑或是錯誤的。這些資料一旦給大眾使用,總會有人瀏覽錯誤資訊後才發現問題,這時要補救已經太遲了。一旦這些開放資料變成不可信任的內容,一開始的立意與動機也會為此衝擊。希望政府單位可以多重視開放資料的相關議題。

    後記之二

    搬完家了,現在我每天都會開啟這個 App 看哪裡有車可騎,還滿方便的。

  • 願您安息,Vangelis

    願您安息,Vangelis

    偶然看到 Vangelis 過世的新聞,因為自己對音樂界不熟悉,一開始並不是很有感觸。直到我將新聞留言區的作品連結點開後,才發現這名大師的作品其實早就聽過無數次。二十年前我還是個對於版權沒什麼概念的屁孩,網路上充斥著各種可以下載的資源;其中有首音樂我每次放學回到家就會開始循環播放,當時只覺得從未聽過這類型的音樂,讓我喜愛不已,那就是 2002 年世足盃的主題曲:

    再次聽到這首主題曲,我當下的反應是錯愕,它用不到一秒的時間喚起我深層的記憶,接踵而來的是令人鼻酸的複雜情緒。當年最愛的音樂,竟在二十年後被我再次聽到了,但卻是在作者逝世的新聞留言中得知,這是我第一次知道作者是誰,真是發自內心感到羞愧,又強烈覺得遺憾與不捨。

    願您安息,Vangelis,我會永遠銘記您對音樂界的貢獻,也感謝您讓我對電子樂如此熱愛。

  • 我開始居家隔離 3+4 天

    我開始居家隔離 3+4 天

    前天晚上朋友來我家吃飯,隔天朋友的老婆快篩陽性,朋友本人則是陰性。我將狀況回報給我們家人資後,決定從嚴判定,先將朋友當作確診案例來看待。於是我開始自主隔離。首要的問題是:我手邊沒快篩試劑。

    從 4/28 快篩實名制開始,有販售的藥局都是大排長龍,這股既視感彷彿回到三年前的口罩實名制 1.0 的窘境,用 2.0 的登記方法不是很好嗎?公費快篩試劑買不到,幸好還有自費的管道,貴了點,最起碼需要時還是買得到。但不得不說:中永和真不愧是世界人口密度最高的地方,昨天連自費試劑都賣完了,今天趁著店家少量補貨才有機會買到。

    我跟朋友用餐是週二晚上的事,因此前三天(週三~週五)必須在家隔離,後四天(週六~週二)則是需要快篩陰性才可以出門;我們公司的處理方式是:我本週在家遠端工作,下週一出門前快篩陰性才可以進公司。

    隔離的心情其實滿複雜的,隔離前我還會開「如果我確診就用防疫險的錢請大家吃東西」這種玩笑,但實際隔離時,除了直接面臨到快篩試劑不足的窘境,也感受到民眾對於疫情的恐慌。像我老家有老人跟小孩的組合,母親節回家的念頭直接打消。而室友則是因為前陣子開刀有服用抗生素,抵抗力較弱,他這兩天都提心吊膽的,很怕確診。

    後記

    其實我很好奇:其他的隔離者如果沒快篩試劑,那該怎麼辦?目前網路上查到的公告資訊似乎都將快篩試劑當作解除隔離的判斷依據,但實際狀況還有很多人未購買或是手邊劑數不足。若 PM 只專注在 happy path 而忽略了其他案例,專案大概沒多久就炸了吧?

  • App Center 無法成功建置 Java 11 的 Android 專案

    App Center 無法成功建置 Java 11 的 Android 專案

    這幾天在升級尋車小幫手的專案設定,結果升完導致我在 App Center 的 CI/CD 跑不過,這感覺還滿正常的,畢竟升版本對 CI/CD 絕對是一件大事,不過我的專案把 Java 1.8 換 Java 11 了,怎麼 App Center 還是吃到 1.8 的設定?

    FAILURE: Build failed with an exception.
    
    * Where:
    Build file '/Users/runner/work/1/s/app/build.gradle' line: 1
    
    * What went wrong:
    A problem occurred evaluating project ':app'.
    > Failed to apply plugin 'com.android.internal.application'.
       > Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8.
         You can try some of the following options:
           - changing the IDE settings.
           - changing the JAVA_HOME environment variable.
           - changing `org.gradle.java.home` in `gradle.properties`.

    再巡一次專案設定,確定都置換完畢了,因此猜測癥結點可能在 App Center。果不其然,也有人回報一樣的問題:

    Android Gradle plugin 7.0.0+ requires Java 11 to build app · Issue #2067 · microsoft/appcenter
    Describe the solution you'd like To support appcenter build with the latest gradle plugin, could you please add Java 11?…

    解決方法是將 JAVA_HOME 的環境變數設定為 $(JAVA_HOME_11_X64),看來 App Center 的 JAVA_HOME 預設寫死 1.8,也沒去檢查我的 compileOption 設定的 Java 版本才會造成這個問題。

  • 2022 年如何把無名小站文章匯入 WordPress?

    2022 年如何把無名小站文章匯入 WordPress?

    這篇文章幾乎 lag 十年,當年的備份檔躺了三千多個日子,我近期才著手把無名小站的文章匯入這個網站。原以為格式轉換後就直接匯入了,但顯然我太天真。

    由於 WordPress 有支援從 Blogger 匯入,所以我打算將文章匯到 Blogger,再從 Blogger 匯入 WordPress。問題來了:WordPress 的 Blogger 匯入工具是有問題的,在我的網站執行這個 plugin 會導致網站無法運行,有版本不相容的狀況。

    接下來我就開始尋找各種匯入文章的 plugin,但最有機會匯入成功的 plugin 是付費版,幸好在真的付費之前看到一篇極簡單的處理方式:開一個 wp.com 網誌,把 Blogger 的文章匯進去,此時就可以成功匯入,而 WordPress 內建 WordPress 匯入工具,所以再將 wp.com 的文章匯到目前的 WordPress 網站即可,經實測後,這個官方 plugin 沒壞。

    流程

    1. Blogtrans 把無名備份檔轉成 Blogger Atom XML 格式(Windows 限定)
    2. 將檔案匯入 Blogger
    3. 從 Blogger 匯出文章
    4. 將檔案匯入 wp.com
    5. 從 wp.com 匯出文章
    6. 檔案匯入自架的 WordPress 網站

    後記

    過程非常迂迴,為了轉檔我還開機了久未插電的 Windows 桌機(差點要自己寫 converter),後續的花式轉檔讓我覺得很無語,因為試盡各種正規流程還解不了問題,結果用了一個詭異的方法解掉,還滿好笑的。

  • 拯救手機腦,著手數位排毒

    拯救手機腦,著手數位排毒

    我記得幾年前有段時間流行「使用手機對身心有害」的言論,當時坊間充斥著各種遠離手機的教學或工具,我跟風裝了手機監測跟螢幕變黑白的程式,甚至刪了 Facebook 跟 Instagram。可惜未持續多久,小工具一項一項刪除了,社群媒體也一個一個裝回。

    從現代智人到今日大約十萬年的時間,人類一直在進化,每次進化都是以更容易生存為方向,這些進化後的功能藏在我們的基因裡頭。智慧型手機問市不到二十年,如今人手一機,我們可曾想過:我們以萬年為單位的進化結果,碰上手機會造成機制上的衝突?

    我覺得書裡頭最精華的部分在於:作者以醫師專業以及學術研究資料說明人類演化至今的生理機制,並以生理機制說明手機對人類造成的影響。這像是有一本人體使用說明書,然後提及搭配手機使用會造成什麼問題。

    我自己手機成癮時,有察覺到一些負面狀態:

    1. 容易分心
    2. 沒耐性、易怒
    3. 憂鬱
    4. 失眠
    5. 記性變差
    6. 頸椎痠痛

    大概除了最後一項,其他都可以在書裡看到,這邊就不再贅述原因。既然會造成這麼多負面影響,我想趁著閱讀後的這股氣勢來做些改變,也就是標題提到的數位排毒(Digital detox)。

    數位排毒是指人們關上電腦和放下自己的行動裝置,放下職位和身分,投入大自然的懷抱,不用任何網路和外界連絡,就像回到小時候,享受單純簡樸的生活。數位排毒的好處:良好的心理健康、更好的人與人之間的關係、提高生產力以及良好的姿勢。

    維基百科

    我覺得中文版的說明不是很精確,其實就是在某段時間內不使用智慧型手機、電腦以及社群媒體。我目前使用頻率最高的時間應該是平日,但身為一位軟體開發者(而且還是開發手機應用程式的),要在平日落實數位排毒的難度頗高,所以我想換個方式:奪回使用手機的主導權並改善已知的負面狀態。

    我一直有意識到:只要手機畫面一亮或是突然震動,我就會把視線轉向手機,這其實嚴重影響我的工作,要回到專注狀態可能要再花十五分鐘以上。所以我第一步是將所有推播通知關掉,連震動都不行,只留下來電推播。我覺得這個調整的結果滿顯著的,被中斷的次數大大降低,工作效率提升不少。

    接著我將手機的社群媒體 App 刪光,如果我知道這會讓我上癮,那我最起碼要確保它不該唾手可得。這些 App 背後有一群心理學專家,他們知道什麼時候餵哪些內容會讓你欲罷不能,又或是哪些體驗會讓你對它充滿期待,這些 App 的公司可以將我們的注意力轉換為金錢,因此很好理解他們這麼做的動機。而我常常著了他們的道,滑一下半小時就不見了,我想將時間用在更值得的地方。

    接著是運動,即便是五分鐘的運動也能加強專注力並紓解壓力。我記得書中提到智人每天走兩萬多步,現代人只剩下三分之一左右。所以我決定每天下班先走一、兩站捷運站的距離再進站搭車,這是我最輕鬆的運動方式,這兩天試了一下,覺得沒花什麼時間又很簡單。

    接下來我還想跟我的手機劃清界線,明確規範某些行為不得使用手機操作,例如:不將手機當作休閒娛樂工具,這有點難,但這讓我更能把手機視為增加生產力的幫手,而不是讓人虛耗整日的時間殺手或冰封人際關係的幫兇。

    有時候我會懷念上一個世代的手機,功能單純,幾乎沒有人為此成為低頭族。現在的手機功能強大到讓人無法輕易放手,像是數位毒品,除了帶來快樂,也衍生不少問題。