Category Archives: General

重新檢討自己的技術選型

我現在的狀況是這樣:幾乎只能工作大約半個工作日(約四至五小時),手臂跟背部就開始抗議了,有時覺得那一天狀況奇佳,可以衝了快十小時,隔天就又被討回來。

於是我覺得我該重新檢討自己的技術選型。再不然,我就得考慮盡早轉行。

誠實地說,以往我因為自己的學歷出身,長期在這個圈子裡覺得很自卑,喜歡電腦科學、軟體工程,但是幾乎沒有用過比較貼近系統底層的語言,遑論做相關開發,這種無法往 “bare-metal” 靠、「榨乾、徹底且有效發揮硬體能力」的歷程,讓我覺得自己始終低人一等。

以前我讀朱邦復的組合語言教材《組合語言的藝術》,他錙銖必較於「少用幾個指令,卻做到相同的功能」那種情懷,很讓我嚮往,雖然我知道現在很多編譯器產品做的最佳化,已經很聰明了,往往只要你的程式寫法不要寫得太爛,效能表現其實都不會太差,反之,如果你的程式爛到原本就用很差的算法去叫電腦做事,用再怎麼貼近底層的程式語言,編譯器可能還是會編出同樣也是在繞很多路來做事情的機器碼,這樣並沒有比較高明。

但是我一直以來都在用相對「軟式」的 scripting language 做開發,常常還是會想「哪天我也可以做點比較『硬底子』、更貼近系統底層的東西」,如果可以這樣,自己是不是就可以更往 “bare-metal” 靠、更 rock 一點?

不過以我現在的狀況,我想了想,我必須選擇那些更能讓我表現 “intent” 的程式語言與工具,也就是那些雖然可能還是很「軟式」,卻可以一眼望去,就立即知道這段程式碼想要處理、解決什麼問題的程式語言與工具。

當然,scripting language 不盡然都可以很不反人類地表達 intent(為了怕傷感情,我就不多舉例了…),貼近系統底層的語言也不盡然就寫不出「高 Intent 表達力」的程式。所以我說的是,我接下來的技術選型,可以讓我更能表現 “intent”,粗糙一點來說,就是「同樣行數,卻更能涵蓋問題解法,且不管你資淺資深、本科非本科,有基本程式觀念的人都容易讀懂」的程式。

一來是因為我必須很容易找到人一起跟我共事,做出解決方案,二來,考慮我的生產力整個打折,我必須用更少時間,做出原來在正常工作日該有的產能。

再來就是,就算我沒能做出什麼揚名立萬、揚眉吐氣、超硬底子、超貼近系統底層的東西,只要我在這行,還能有點用處,解決一些其他人覺得很煩、很痛的問題,其實,就很好了。

補充:這篇網誌寫完後的晚間,我恰巧讀到〈尤雨溪回应:Vue与TypeScript为什么相性特别差?〉一文,其中提到 “intuition based design”,即符合我上面講的「表現 “intent”」這件事。我書讀的少,不知道有這麼一個現成的好詞可以表達我的意思,真是笑話了。

離開 InfuseAI

去年七月進來這家公司,但是最近身體狀況又變差,難以負荷工作,就在一月底決定離開。

其實多多少少還是有人在猜測背後有沒有什麼隱情之類的八卦,沒有,真的沒有。把在 Twitter 上寫的再貼來講一遍:公司沒有什麼問題,老闆是出社會以來遇過最好的,同事也都是極為優秀的人才,產品也解決了很多企業亟需導入 AI 時的基礎建設痛點。

而且很可惜的是,之前在 KKTIX 共事很愉快、從他那邊也學到很多東西的 Ash 後來也加入這間公司,再度當同事,但是我不得不先離開,不然還會再從他那邊偷學到更多東西。

真要說有什麼問題的話,就是我自覺給團隊惹的麻煩比貢獻多,非常抱歉。

我的復健路

四個多月前,我開始了待業、且經常跑醫院的日子。

復健項目一開始有熱敷、牽引治療、低週波電療,後來調整為熱敷、牽引治療、干擾波電療。

熱敷的作用是讓頸關節先熱開,避免接下來的牽引治療發生拉傷。低週波電療與干擾波電療的作用,復健師沒跟我說,我也不好從網上抄作用機制來貼。

每個項目表定 20 分鐘,所以一整個療程做下來就是基本一個小時。健保補助看診一次可以做六次復健。

每次做完復健,當下幾乎都感覺比較舒服,但是也常常隔了一天患部就又痠疼麻。

中間我曾經自費購買熱敷墊、瑜珈墊,希望在家也能多少做點「自」療。

後來綜合醫師與復健師的說法,我懷疑自己這樣反覆發作,其中一個因素是我的睡姿不良,側躺、俯臥壓迫到患部肌肉、筋骨,所以我又去買了「護腰墊」與「床頭靠墊」來矯正我的睡姿,回到對背部肌肉最無負擔的仰臥,目前看來改善不少,但是我不能確定是心理作用使然,還是物理機制確實如此,僅提供我自身經驗,非宣傳療效,請注意。

在這之前,我從不知道「能夠握緊拳頭出力」這樣尋常的動作,竟是如此難能可貴的事,那段只能撐半天敲鍵盤工作、接下來就呈現無法使力的報銷狀態的時光,連拿個碗都拿不穩,工作上也覺得拖累團隊步調,久而久之,會讓原本就很廢柴的自己覺得更加百無一用,心情受到很大的影響,惡性循環之下,整個人的身心都不好。

如今稍有改善之後,我學著要注意保持正確、避免不當壓迫的姿勢,還有透過醫療資訊的線索,在原本茫然不知從何改善的狀態下,漸漸能夠自主掌握些什麼,心理會踏實不少。不過還是要再強調,資訊的媒體識讀很重要,我一直很小心讓自己不成為那種「病急亂投醫、胡亂相信一些作者不知打哪來的醫療文章、被牽著鼻子走、買了一堆來路不明的藥物、器材」的人。

COSCUP 2018 「帶您讀源碼」議程軌熱烈徵稿中!

我一直很想在今年的 COSCUP  推動「帶您讀源碼」議程,起因是我某天在放空時,就這麼突然想到:

在 COSCUP 這個臺灣的 F/OSS 年度盛會當中,主角之一 “source code” 反而佔不到什麼版面?大家都在談 Open Source,但是好像沒什麼人在意那個 “Source”?

我覺得這個現象蠻奇妙的,而如果我們可以讓 source code 在 COSCUP 裡多一點份量,會產生什麼效應?我自己有一些預設的想像與期望,希望透過這樣的活動,可以鼓動更多人投入軟體開發(當然,如果是開發 F/OSS 那尤其是再好不過的了),或者再講淺白一點,撒下一顆顆「程式人」的育成種子。

由於一些陰錯陽差,這個構思差點泡湯。好在貼心的 BobChao 大人幫忙,送出了議程軌申請案,最後這個議程軌也成案了。

現在這軌議程開放徵稿了,非常需要您來分享圍繞著 source code 主題的各種有趣議題!

Minikube 0.26.1 開設 Kubernetes 1.10 cluster 遇到 “failure loading apiserver certificate: the certificate is not valid yet” 的 workaround

Minikube 0.26.1 開設 Kubernetes 1.10 cluster 遇到 failure loading apiserver certificate: the certificate is not valid yet

$ minikube start
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
E0424 09:10:22.557702 22820 start.go:276] Error starting cluster: kubeadm init error sudo /usr/bin/kubeadm init --config /var/lib/kubeadm.yaml --ignore-preflight-errors=DirAvailable--etc-kubernetes-manifests --ignore-preflight-errors=DirAvailable--data --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-etcd.yaml --ignore-preflight-errors=Swap --ignore-preflight-errors=CRI running command: : running command: sudo /usr/bin/kubeadm init --config /var/lib/kubeadm.yaml --ignore-preflight-errors=DirAvailable--etc-kubernetes-manifests --ignore-preflight-errors=DirAvailable--data --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-etcd.yaml --ignore-preflight-errors=Swap --ignore-preflight-errors=CRI
output: [init] Using Kubernetes version: v1.10.0
[init] Using Authorization modes: [Node RBAC]
[preflight] Running pre-flight checks.
[certificates] Using the existing ca certificate and key.
[WARNING Swap]: running with swap on is not supported. Please disable swap
Flag --admission-control has been deprecated, Use --enable-admission-plugins or --disable-admission-plugins instead. Will be removed in a future version.
failure loading apiserver certificate: the certificate is not valid yet
: running command: sudo /usr/bin/kubeadm init --config /var/lib/kubeadm.yaml --ignore-preflight-errors=DirAvailable--etc-kubernetes-manifests --ignore-preflight-errors=DirAvailable--data --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml --ignore-preflight-errors=FileAvailable--etc-kubernetes-manifests-etcd.yaml --ignore-preflight-errors=Swap --ignore-preflight-errors=CRI
.: Process exited with status 1

目前試出來的 workaround 是指定 bootstrapper 為不知何時會棄用的 localkube(被 kubeadm 取代):minikube start --bootstrapper=localkube