首頁

  • 我開始居家隔離 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 的公司可以將我們的注意力轉換為金錢,因此很好理解他們這麼做的動機。而我常常著了他們的道,滑一下半小時就不見了,我想將時間用在更值得的地方。

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

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

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

  • 如何避免 Travis CI timeout 中斷任務?

    如何避免 Travis CI timeout 中斷任務?

    我們家是用 Travis CI 的 Core – 5 Concurrent Builds 方案,一直以來我都沒什麼使用上的問題,直到我跑了一個執行很久的 task,才發現它 10 分鐘內沒印出任何 log 會自動幫我中斷任務。

    原因

    Travis CI Documentation
    Customize the Build

    會被中斷的狀況:

    • When a job produces no log output for 10 minutes.
    • When a job on a public repository takes longer than 50 minutes.
    • When a job on a private repository takes longer than 120 minutes.

    會發生上述原因可能是:

    • Waiting for keyboard input or other kind of human interaction
    • Concurrency issues (deadlocks, livelocks and so on)
    • Installation of native extensions that take very long time to compile

    解決方法

    別人的 workaround,在設定檔跑迴圈印 log 避免中斷:

    ballerina/.travis.yml at master · SupunS/ballerina
    Ballerina is a new programming language for integration built on a sequence diagram metaphor. – SupunS/ballerina

    官方其實有提供 travis_wait 來等待耗時任務,使用範例如下:

    install: travis_wait 30 mvn install

    以上述範例來說,30 就是要等待的時間,單位為分鐘。

    但我使用 travis_wait 後,發現 log 就不再出現了,可能是 process 被丟到背景執行,導致想看的 log 沒辦法當下印出,這些 log 會在最終執行結束才一口氣顯示;其實滿困擾的,因為無法得知當下在做什麼。

    官方文件可參考:

    Travis CI Documentation
    Common Build Problems

    最終還是選擇 workaround 來當作本次的解決方案,因為它更貼近現實需求。

  • Kobo 電子書閱讀器無法開啟 PChome 購買的書籍

    Kobo 電子書閱讀器無法開啟 PChome 購買的書籍

    前陣子 Kobo 跟 PChome 合作,PChome 上的電子書有滿不錯的折扣,便趁機入手一些想看的書。但問題來了:我的閱讀器無法開啟從 PChome 購買的書籍,會顯示如同頁首照片的錯誤訊息:此文件無法開啟。

    一開始以為是同步問題,但書籍同步後還是出現一樣的錯誤訊息。最終的解決方法就是重新登入,登出時會造成未同步的紀錄消失,要確保登出前有做好資料同步。

    更多 -> 設定 -> 帳號 -> 登出

    重新登入後,我的書籍就可以正常閱讀了。

  • 室友的肛門炸裂了

    室友的肛門炸裂了

    我室友有個特質,當他覺得某件事對他有重大意義,他就會持續去做。我印象中,他在農曆年後就開始過著極度健康的生活,我未想過促使他做這件事的緣由,只覺得這是個好習慣。直到兩週前,我才知道背後的原因。

    那時我正在客廳打電動,莫約下午四點左右,室友拖著腳步走進門,看他面有難色的樣子,我便開始關心他。一問之下才知道他剛剛去電燒,現在還有點不舒服,而罪魁禍首就是肛裂。

    關於肛裂,我其實也略有經驗,我還記得當時染血的馬桶,跟後續心神不寧的狀況;每次上廁所都很怕再現血色地獄,但我的狀況不到電燒的程度,頂多就是擦藥而已。因為這段往事,我可以同理室友的心情,一路走來,我一直站在他的角度給予最大的關懷與支持。

    那天我們聊了很多慘痛經驗跟避免復發的方法,像是:保持高纖飲食、多喝水;在那之後,室友的生活作息以及飲食也更加謹慎,我以為這個夢魘會從室友的生活中消逝,但顯然沒有。

    反覆肛裂如同字面上的意思,傷口多次撕裂,使人飽受千刀萬剮之痛。就算是最剽悍的勇士,遇上反覆肛裂也會變成失去母親的幼崽,連走路都會膽戰心驚。人們總會詛咒他人生兒子沒屁眼,但他們不知道:最可怕詛咒的不是沒屁眼,而是有屁眼卻反覆肛裂,這是最惡毒的永恆詛咒,使人墜入無間。

    下班一回到家,我便用最誠摯的語氣關心室友的肛門;這才知道室友回到了上次的診所再次電燒,而且醫生還建議他要開刀處理。

    「這次去看醫生,裡面的阿姨一直叫我寶包。不知道是不是我上次電燒叫得太慘,這次來他們好像都認識我,跟我很熟的樣子。」

    「欸寶包來了。」

    「寶包,你還好嗎?」

    「我電燒的時候,那個痛就像一個波形一樣。就算他手拿開沒有燒了,我還是會痛得繼續叫。」

    聽室友描述,若電燒的痛楚可以具現化,我覺得會是一個正弦波。

    這次的憾事我跟室友事後檢討是哪個環節做錯了,室友提到醫生叫他每日解便兩次,這樣才不會太硬又造成傷害。我才想到:小時候老師會問大家的排便頻率,那些每天大兩次以上的同學會得到老師的稱讚,讓我好生羨慕;現在我都長得比老師當年還老了,才知道老師的用心良苦,不勝唏噓。人們常說:「佛度有緣人」,老師可能是人間菩薩,讓我們得以在他的庇護之下,避開肛裂帶來的腥風血雨,但室友無緣遇到這樣的好老師,讓我不得不正視教育資源的城鄉差距。

    「你知道我規律運動一段時間了,而且吃很多蔬菜,現在它又炸開,我真的覺得很憂鬱。」

    室友抱怨他近期嚴格的飲食、作息控制根本無效,並且感到灰心喪志。在我眼裡,室友確實付出了很多,無論是一天吃兩顆高麗菜,或是誤差逼近毫秒等級的作息時間,都令我感到欽佩不已,這不是凡夫俗子可以做到的,除了他還有誰有資格抱怨?

    前陣子室友做了心理測驗,測驗結果中,他對於當下心境的形容是:「風光明媚、無限美好」。但他今日改口,覺得當初的正能量已經消失殆盡。在我眼中,室友面對困難的態度,一直都是逆來順受、從不逃避。當下他或許展露了人性的脆弱,但我知道:他早就安排了手術時間,隨時都做好根除後患的準備,這些喪氣話不過是滄海一粟。或許就是這番遭遇,才得以孕育出社會的中流砥柱,越是嚴苛的條件,越能造就非凡的人才。

    故天將降大任於是人也,必先苦其心志,勞其筋骨,餓其體膚,空乏其身,行拂亂其所為,所以動心忍性,曾益其所不能。

    孟子

    後記

    寫完文章的隔天,室友就跑去開刀了。剛回到家有點像三魂七魄少了幾魄的那種民俗說法,整個人不在線上的感覺,多虧他女友一路攙扶,不然應該回不了家。希望他這次真的痊癒了,願閱讀此文的大家都能身體健康。

  • 半夜的腳步聲

    半夜的腳步聲

    每次融入新的團體,很多時候都會用鬼故事來開啟話題,我聽過的鬼故事不少,那些讓我覺得印象深刻的往往是他人的親身經歷,不是因為可怕,是因為真實。

    時間是二十五年前,那時是國小三年級的暑假,我每天都會賴在我哥房間打電動、看漫畫,而且都要熬夜到凌晨三、四點才肯上床睡覺。不知從何時開始,有些特殊狀況很針對性地發生在我身上。

    當我獨自一人在房間時,電腦不定時會自動開機。一開始最困擾的是:我還要去把它關機,覺得很煩,因為大家會唸我用完電腦不關機。這其實很直覺想到零件異常,可能需要修理。但無論我怎麼講,大家都不相信,因為只有我遇到這件事。有次我叔叔經過我房間,幾乎同時間——主機傳來開機嗶聲,熟悉的硬碟噪音也跟著響起,我終於可以證明自己沒有說謊,但叔叔只覺得奇怪,並沒有進一步的作為,這件事就停在這邊,不了了之。

    另一件事則是:我觀察到半夜門外總會有個腳步聲,非常緩慢,由遠到近,又逐漸走遠。家裡除了我哥跟我,我想不到還有誰會在大半夜活動;午夜時分有腳步聲是很詭異的,尤其兩個夜貓子都在房間裡頭,沒道理門外還有人沒睡。有次腳步聲響起,剛好我哥還醒著,我便跟我哥提起;他一臉疑惑彷彿沒聽到似的,就叫我開門看看,當下我們兩個人都很緊張,怕開了門會看到什麼未知的事物。花了一點時間做好心理建設,我緊抓著喇叭鎖、轉開,當下只看到無人的飯廳跟天花板上的昏暗夜燈。

    這腳步聲實在太頻繁了,幾乎每個夜晚都聽得到;有次我忍不住把這狀況告訴我爸,那天我爸沒有責備我胡思亂想,我有點忘記是如何跟他結束這個話題,但我還記得當天他沒有回家過夜,再次看到我爸已經是隔天的事情了。

    原來我爸聽完我的描述,他便去廟裡詢問腳步聲的事情;廟方告知理由後,我爸緊急驅車南下,在雲林的祖厝住了一晚,隔天才回到台北。

    「我回去鄉下開門。」我爸如是說。

    「為什麼?」我完全在狀況外。

    「鄉下大廳的門關起來了,你阿公被擋在門外,沒辦法進去,所以晚上只能在我們家裡徘徊。」

    就我有印象以來,鄉下三合院的門一直都是開著的,我們只有在晚上要睡覺時才會將門關上。那時因為祖母北上開刀,鄉下沒人,長輩便將門給鎖上了;而祖父——那時他過世還未滿半年。祖父務農,平時沒有穿鞋的習慣,而我家所有人都會穿室內拖鞋;我聽到的腳步聲是赤腳走路、行動緩慢,從客廳穿過飯廳,再往後走到最尾端的客房,也是我祖父生前暫住的房間。神奇的是:我爸跑了一趟雲林後,我再也沒有遇到電腦自動開機或是在半夜聽到腳步聲。

    這些經驗讓我聯想到星際效應的橋段,身處其他次元的主角,想要提示自己和家人一些訊息。我在想:當時阿公是不是也在異度空間瘋狂提示我們,想要去促成某些事情。

    對於這類的超自然現象,我喜歡用科學的角度來看待,雖然不諳宗教,但我會將神、鬼靈魂之說連結到其他維度的生命體,覺得合理存在,只是我們很難看到。未來若再讓我聽到半夜的腳步聲,我會直接以水錘效應結案,希望之後來自異度空間的訊息可以提示得更明顯一點,我們直球對決。

    後來我跟我爸提起這件往事,他雖然不記得了,但他質疑:祖先才不會被自己的家門擋住。我啞口無言,但我還是在心裡反嗆:阿公當時才過身不到半年,搞不好他還沒掌握好穿牆的技能啊!阿公沒有錯!

  • LiveKit – 最容易上手的 WebRTC 開源專案

    LiveKit – 最容易上手的 WebRTC 開源專案

    前言

    我第一次接觸 WebRTC 是在 2019 年,當時要在手機實作視訊、音訊通話功能,一開始選用 Google 官方的解決方案,過程非常痛苦,因為文件極少,且手機原生的相關討論也不夠多。後來雖成功實作這個功能,但自己對於這個領域的知識不夠充足,出問題要 debug 又是另一個難關。

    LiveKit

    LiveKit 來自美國加州,其 CEO Russell D’Sa 意識到:疫情期間,遠端工作深遠影響了公司文化以及同事間的合作模式。為了促進彼此的互動,LiveKit 應運而生。

    WebRTC 已經廣泛支援各個瀏覽器跟平台了,但要開發相關的應用程式其實很困難,首先要先理解 WebRTC 的協定規格,而這個協定內容範圍很廣,理解一部份後,馬上又會出現新的瓶頸,像我就是苦主之一。如果要使用現成的付費服務(例如:Twilio、Agora),費用昂貴不說,諸多限制又很難完全符合產品需求。

    功能

    以 WebRTC 為基底實作視訊、音訊功能,易部署、支援水平擴充,並以多種語言製作 SDK,此外它還支援 Simulcast,可確保網速不足的用戶可以擁有更好的通訊體驗。官方有提供網頁跟 app 版的通訊範例,在開發過程中可以很容易地參考使用方式。

    Server SDK

    • Go
    • Node.js
    • Python
    • Ruby
    • Rust
    • Java/Kotlin

    Client SDK

    • Javascript
    • iOS/MacOS/visionOS – Swift
    • Android – Kotlin
    • React Native
    • Flutter
    • Unity

    Tools

    • livekit-cli
    • chrometester

    核心概念

    LiveKit 核心概念像是:一間旅館提供無數房間,只要房間裡頭有人,那就可以開始聊天。

    • 房間:這是由 Server 端所建立的容器,可以讓參與者在裡頭交換資訊。
    • 參與者:參與者可以分為本地端(自己)跟遠端(對方),可以在房間裡面發布或訂閱通訊內容。
    • 通訊內容:那些可播放的多媒體串流。

    開始使用

    LiveKit
    Build, deploy, and scale realtime agents. Open source. Enterprise scale.

    實測紀錄

    用筆電跟手機視訊
    1. 台北跟雅加達的跨國視訊,沒遇到什麼延遲。
    2. 視訊超過 24 小時沒斷線。
    3. 多人視訊功能很穩定。

    P.S. 有幾次用自架的 LiveKit 進行線上會議,順便測試功能,當時的通訊品質比 Google Meet 還好,這點讓人滿驚豔的。

    結語

    精通 WebRTC 需要耗費大量成本,在沒有研究團隊跟金援的情況下,LiveKit 無疑提供了一個快速、方便的解決方案。目前視訊、音訊的開源專案不少,但以整合容易度來看,LiveKit 絕對稱得上是一時之選。

    後記

    我一開始其實是要試 Pion,可惜 Pion 的 Android / iOS SDK 還沒完成只好作罷;LiveKit 星星數比 Pion 少 ,不過使用方式以及文件都相對完善。此外,LiveKit 的開發者不多,但它 2021 年底的種子輪募到 700 萬美金,看來可以再活好一陣子。

    更新:我寫文章時 LiveKit 還很小,2025 年已經來到 B 輪、4500 萬美金的規模,應該不用擔心會夭折了。

  • 寫作的理由是為了複製自己

    寫作的理由是為了複製自己

    前言

    有次跟負責人在聊天,我們聊到公司想要補什麼樣的人,結果意外的有共鳴:「想要複製很多個自己。」會有這樣的想法其實很單純;當時公司成立沒多久,百廢待舉,很多事情都覺得有能力處理,但顯然地,我們力有未逮;每天要做的事情實在太多,恨不得多複製幾個自己來處理這些事務。

    為何寫作

    以專業能力來看,能取代我的人不少,即便如此,我也無法複製自己。在這世上,有些看不見的事物遠比能力重要,其中一項是價值觀。當我們擁有相似的價值觀,那就會被共同的信念所驅動,堅持不能退讓的底限,追求一致的目標。

    透過寫作,我可以將自身的價值觀傳達給他人;字裡行間裡頭,會有我抱持的看法、我重視的價值,這些透露出的資訊可以在素未謀面的狀況下,知道我是什麼樣的人。而我期待:某天我們這些抱持著相似的價值觀的人們齊聚一堂、成就一番大事。

    這就是近期恢復寫部落格習慣的原因,影響力雖然不大,但不做就不會成真。發文頻率還在摸索中,期待做到每週至少一篇。

    後記

    還記得某次我跟前主管在聊天,突然提到某同事要離職了,我覺得可惜,因為要離職的同事是很棒的人,擁有極高的不可取代性。這位主管一副理所當然的回答我:

    我們訓練出來的這些人,如果有一天離開了,不用覺得可惜,因為我們在這個業界種下了一顆種子。

    這位主管大可出一張嘴就好,當一位稱職的管理者;但他永遠在第一線支援,他認為有些事物必須要傳承下去,因此事必躬親、親力親為。就我感受到的,共事過的人或多或少都帶著這位主管的一部份;或許主管會覺得有一天,這些看不見的事物也會以某種形式回饋到他身上吧?