2020 年度回顧與展望

2020 年度回顧

  1. 女兒健康成長(父母最開心的事)
  2. 公開演講 13 場。 (而且年底公司大場,一天還講兩場)
    1. https://github.com/kkdai/slides
  3. 英文國際演講 2 場(一場日本 DevDay)
    1. https://github.com/kkdai/slides
  4. 15 本電子書閱讀.
    1. http://www.evanlin.com/categories/
  5. Github 752 commits (2019 691)
    1. https://github.com/kkdai
  6. 3 場黑客松(梅竹,內部,校園競賽)
  7. 持續運動(但是運動量沒有之前高,要努力)
  8. 61 篇部落格(持續寫作,終生學習)
  9. 提攜後進,福音戰士二號機大有潛力
  10. MHW, MHGU, 期待著 MH-R

2021 年度期許

  • 家人健康
  • 再瘦一點
  • Golang in Machine Learning

[好書分享]賈伯斯傳(最新增訂版)(Steve Jobs)

賈伯斯傳(最新增訂版)
Steve Jobs
作者: 華特.艾薩克森  
原文作者: Walter Isaacson  
出版日期:2013/09/11 

買書推薦網址:http://moo.im/a/ehEGJY

前言:

這一本是今年所讀完的第十五本書。 其實這本書很捨不得看完,因為邊看這本書我習慣邊看著電影。或是邊看著蘋果的發表會來了解其中的一些細節。其實當年對於賈伯斯的認知,都是來自於早期的矽谷相關電影「微軟英雄」。 雖然這部電影其實也蠻久的了,但是許多的描述也是相當的深入,對其他相關的書籍與電影都影響相當的大。

後來由艾希頓庫奇所拍攝的「賈伯斯」,則更深入得探討到賈伯斯的內心轉折。也很建議大家來看。

最後,來談到這本書。高達六七百頁的書籍。內容包含了學生時期的賈伯斯,一直到賈伯斯因為癌症過世之前的心路歷程。都包含在其中,很值得推薦一看。

內容簡介與心得:

人人都知道賈伯斯不遺餘力捍衛隱私,這位傳奇性的企業家從未寫過回憶錄,但他在兩年間,接受本書作者艾薩克森多達四十餘次的深入訪談,並允許他遍訪他的朋友、親戚、競爭對手、仇人和同事,總數超過一百人。

艾薩克森寫出「最真實的賈伯斯」,書中描述這位創造力旺盛的企業家雲霄飛車般驚險刺激的一生。賈伯斯執著的個性、追求完美的熱情和狂猛的驅力推動六大產業革命,包括個人電腦、動畫、音樂、電話、平板電腦和數位出版。

這不只是賈伯斯的故事,也是一本談創新的書。在這個數位時代,很多企業都努力走在創新的最前頭,許多國家也汲汲於建立創新經濟,但就獨創、想像和創新,賈伯斯無疑是標竿人物。他深知要在二十一世紀創造出有價值的東西,必然要讓創造力和科技結合,因此他打造的公司,不但要有跳躍的想像力,更要呈現鬼斧神工般的科技工藝。

章節條列

1955-1980.天生反骨

這個章節講的主要是從小到求學時期到他的蘋果電腦公司的創立,並且詳細的敘述了他在學生時代在雅達利打工的怪僻。當時的他不愛洗澡,所以都是晚上才上班。但是因為寫程式的功力很了得,常常可以解決很困難的問題。所以當時的主管就讓他晚上才上班,這樣也可以避免他跟其他人的來往。

到了 Apple II 的大賣,也讓蘋果電腦變成上市的公司。瞬間也讓賈伯斯必須要在很年輕的時候就要率領著一堆比起他資深太多得各種專家來經營公司。

1980-1991.大起大落

從上市之後,麥金塔的打造更是讓蘋果電腦登上 1984 年的超級盃廣告。

但是隨著麥金塔的上市,隱憂也開始了。 蘋果電腦內部逐漸分裂鬥爭。賈伯斯也因此被趕了下來。

但是離開了蘋果的賈伯斯,雖然失意但是卻因此有機會成為皮克斯的股東。這裡也放一下最知名的 Pixar 的標誌。

1991-2004.不同凡想

藉由著 NexT 的併購案,蘋果電腦透過併購了賈伯斯後來創力的 NexT 而邀請賈伯斯回鍋當 iCEO(interm-CEO),之後則有了 iMac 等等,讓人驚艷的新產品。 也是在這個同時,皮克斯也迎來了最大的成功(玩具總動員的上映),皮克斯後來也接受了迪斯尼的併購,並且接手了動畫部門的開發。

這個階段的賈伯斯則是在前十年的沈澱後,完全堅持在更完美的產品研發上。

2004-2011.超越死亡

最後的階段,雖然 Apple 也開發出了劃時代的產品 iPhone 。 完全改變了應用端從桌面到行動裝置的年代,但是賈伯斯的身體也對他發出了抗議。 癌症的發病與延誤的治療,讓病情無法馬上獲得控制, 即便後來使用了許多相關療法,還是讓病情無法緩和下來而復發。

接下來,如同大家所了解的,到了過世的前幾天賈伯斯才卸下了蘋果 CEO 的重擔。在家人的陪伴下離開了。

心得:

記得當初賈伯斯過世的時候,許多人都相當的難過。 我想除了是紀念一個偉大的創業者,產品經理。更是紀念一個堅持己見的產品愛好者,經常在許多時候,都會有著想要偷懶與得過且過的心情。 但是受到賈伯斯對於產品的堅持與追求完美的信念,又會開始努力下去。

許多人說,賈伯斯也是人他也有很多失敗的過程。這本書也有他人性的一面,不論是年輕時候不願意面對自己的小孩,到後來又相當的後悔。不論是更多的失敗的產品,或是他被逼退的過程,更走詳細的敘述。蘋果之所以成為偉大的公司,正也是在於賈伯斯的統一集權的狀況。

不論你喜不喜歡賈伯斯,我們都得承認「Steve Jobs」 這個名詞應該會成為我們心中對於產品不停追求的象徵。

最後,這一句來自 Think Different 裡面的文字,分享給大家。

The people who are crazy enough to think they can change the world are the ones who do.”

──Apple's "Think Different" commercial, 1997

[好書分享] 韓國人和你想的不一樣

韓國人和你想的不一樣
人妻太咪的韓國有趣文化 × 特殊習慣 × 超妙生活觀察
作者: 太咪  出版社:時報出版 
出版日期:2014/08/25 

買書推薦網址:http://moo.im/a/16evQS

前言:

這一本是今年所讀完的第十四本書。

我說過,我通常會一本嚴肅的書跟著一本輕鬆的書來調劑身心。跟韓國與日本同事在溝通的時候,雖然除了語言本質之外,會發現其實大家的文化上差異真的很大。這本書就是買來讓我更了解韓國同事,也希望不要踩到一些文化上的雷。

內容簡介與心得:

瘋韓劇、追偶像、學韓文,也要了解韓國人的一切;
對韓國有成見?也許你對他們有些誤會!
太咪帶你深入日常生活,從此對他們瞭若指掌,
就算第一次走跳韓國也能立刻上手!

章節條列

  • Chapter 1 走跳韓國!食衣住行實用指南
  • Chapter 2 現實就像韓劇一樣浪漫嗎?
  • Chapter 3 第一次融入韓國就上手!

第一章節有許多跟韓國食衣住行有趣的經驗分享,包括了韓國鐵筷子的由來。韓國的泡菜湯不是拿來喝的,是拿來洗筷子的。更有許多有趣的名字,「大醬女」,「快快病」。也有許多韓國有趣的習性,坐地上,早餐吃米飯,泡菜,見面先問年紀,聚會的續攤(日本好像也有?)。 更有提到有趣的汗蒸幕文化,職場的規則跟加班的習性。

心得:

這本有許多有趣的內容分享,雖然對我來說都是第一次知道的知識。但是常看韓劇的朋友可能都有觀察到一些小細節,很推薦大家來看這本書一起來了解韓國文化上的差異。這樣在跟朋友(同事)溝通時候的背景 context 比較能夠體會了。

[好書分享] 發掘你的微細領導力 (This Is Day One)

發掘你的微細領導力: 運用「第一天」模式覺察自身價值,成為更有分量的人
This Is Day One : A Practical Guide to Leadership That Matters
作者: 卓杜立  
原文作者: Drew Dudley  
出版日期:2019/10/03

買書推薦網址:http://moo.im/a/7afCJN)

前言:

這一本是今年所讀完的第十三本書。

是否一定要是身為管理階層才需要學習領導力? 不論是領導力還是影響力,代表的就是你如何透過你自己的行為來影響其他的人。很多時候,每一個人或多或少都在別人的生命中影響著其他人。這些影響力是如何造成,你的生命中又曾經被多少人影響過? 這一系列的問題引導著你,很適合透過這一本書來仔細思考。

內容簡介與心得:

請記住以下這句話:你對周遭的人、所屬組織發揮的最大影響力,幾乎都是日常無心插柳的意外結果。

大多數人把領導力想得過於狹隘,認為自己既沒做大事,也不在高位,需要有財富、頭銜及影響力等外在光環加持才能算是領導人。然而這種能力其實人人都有,甚至天天都在實際運用,只是肇因於陳舊思維與教育洗腦,矮化了自己的重要性與領導能力。

宏觀來看,其實職場或人生中的每段旅程(例如戒酒、保持身心健康、乃至創業成功等),都需要領導力的加持。曾是個學霸並遵循世俗成功標準與期望而活,也曾深受酒精、肥胖與躁鬱症所苦,領導力專家卓杜立在改變自己的過程中,發現了「第一天」領導哲學,也就是做每件事都要保持「第一天」的積極心態,便能持之以恆地落實個人的核心領導力價值,引領自己做出改變,進而影響他人。

章節條列

第一部 就從這一天開始

是否記得你的第一天上課,第一天上班? 想要透過哪些行動舉止來讓其他人知道對於工作的態度? 這邊提的是個人領導力,也就是你可以透過你自己的行為與態度來影響你周圍的人。

你不太需要很高的職位,或是很大的舞台。 很多時候就是做好自己,或是「多做一點」就能夠展現個人的領導人,進而影響別人。裡面提到公司車機的例子:

一位在自己崗位職守數十年的小學公車司機,有一天載到一位 22 歲的年輕人。他好奇的問了那位年輕人為何上車,他卻回答說:「我明年要去讀哈佛大學研究所,我想要感謝你,因為你喜歡在開車的時候唱歌,不論小學生們如何笑你,你還是樂在其中的每天唱歌。你讓我深信,不需要在意其他人的眼光,努力做自己」。

第一天就是你想要改變自己的第一天,想要影響其他人的第一天。因為第二天往往是第一天的延續,於是這個章節探討得是你會如何在這個「第一天」發揮你的影響你,來影響其他的人。

第二部 領導力的六個關鍵價值

這個章節,作者透過領導力的六個關鍵價值,來讓你思考個人領導力的具象話與價值所在。透過你每一天去詢問自己以下的六個問題,你能夠逐漸建立起自己的微領導力。

  • 影響力(Impact): 我今天做了什麼樣的事情,來影響其他的人?
  • 勇氣(Courage):我今天做什麼有不一定很有價值,但是放手一博的事情?
  • 給力(Empowerment): 我今天做了什麼事情讓其他人更接近目標?
  • 成長(growth):今天做了什麼可以幫助其他人學習?
  • 格調(class): 今天做了什麼能提高而非升高對立狀況?
  • 自重(self-respect): 做了什麼事情來善待自己?

第三部 你如何定義你自己

對於定義自己這一段,作者先建議提出以下三個方式:

  • 「假設性的關鍵價值」
    • 假裝有個人跟在你身旁,那麼一個月後他會認為你這個人有哪些特質。 比如說「扛責」,「冒險」,「紀錄」…
  • 你的「床邊建議」
    • 如果今天是你的兒子(女兒)即將要去外地讀書,獨立自主了。那麼你會給予哪些人身建議呢?
  • 最優與最差
    • 回顧自己人生,找出目前為止表現得最好與最差的狀態。

以上這些問題,不僅幫助定義你自己。更可以幫著你了解自己的長處與優點。進而找出自己適合影響其他人的特質來幫助其他人。

心得:

這本書當初也是因為讀了某些片段後,呼應起自己生命中的一些過程。曾經我們也是被某些人或是某些事所影響到,當然我們也有可能影響其他的人。在這裡分享兩個我印象很深刻的事件。

「現在做這些有什麼意義」

我的第一份工作是在外商(美商)工作,是做多媒體播放軟體的產品工作。 因為大環境的變遷,產品不停萎縮的狀況下,公司最終裁員。還記得裁員公告一公佈的當天,我心情雖然很差,但是還是想把自己手上的工作做到完。 這時候去找同專案的同事討論的時候,得到的卻是:

「現在做這些還有什麼意義?」
「現在做這些還有什麼意義?」
「現在做這些還有什麼意義?」

我當下其實相當的震驚,之後我默默地走回座位。然後告訴我自己,我決定要堅持自己想要做,或是應該做的事。不論大環境如何的變遷,我們不應該在那個時候就認輸。

「但是,我就是過不去啊」

一樣是在第一份工作給予我的啟發,當時正在管理著 OEM 的專案。雖然產品接近萎縮,但是還是發生了問題。這時候去問了當時的老闆應該要怎麼回覆客戶? 只見他,雖然很想回家。 但是還是說出了讓我印象很深刻的一句話。

我也是可以就這樣過去,不理這件事情。 但是我就是過不去啊!

也是這件事情之後,我更了解到。「人生,有所為,有所不為」 。我們的堅持與固執,造就了我們人格的特質。每個人都會放棄,都會想得過且過。但是真正的堅持與固執才能成就我們,也希望這些小故事能夠影響正在看這篇文章的你。

每個人都會影響其他人的,希望我們都可以帶給身邊的人正向的影響。

[研討會心得] 在 LINE 熱點服務上如何處理地理性資訊

寫在前面

大家好,我是 LINE Taiwan DevRel 團隊的 Evan Lin。很開心在這裡跟各位分享本年度的第三場開發者小聚中,由 LINE SPOT Team – Julian Shen 帶來分享他在處理地理資料 (location-based data) 時候所遇到的一些問題與經驗分享。關於LINE SPOT 可以參考 Julian 在 TECHPULSE 2019 的會場有介紹過關於 LINE SPOT 服務介紹。。更多的 LINE SPOT 服務介紹與 LINE SPOT 架構介紹可以參考這篇文章 「LINE TAIWAN TECHPULSE 2019 科技盛會精彩回顧」

KKTIX 活動網頁: 活動網址

其他相關文章:

投影片

演講影片

地理資訊服務 Location-Based Services

這次主要介紹 LBS: Location-Based Serivice 的內容,關於 LBS 相關的遊戲或是服務我們經常可以看到,舉凡打卡,地圖,導航都會用到。那麼要尋找兩個點之間距離上,可以使用的技術也相當的多。

找出距離幾公里的景點

處理上面經常是拿到 GPS 座標,或是直接拿到地址。 地址是可以方便人類來閱讀的,但是真正要電腦能夠處理的就是經緯度的座標位置。 如果要對某一個座標找尋出距離三公里距離的所有座標,那是不是需要把資料庫裡面的地點全部拿來計算呢? 這裡介紹了一種方式叫做 K-D Tree 。

K-D Tree 的方法就是將地圖平面透過二分法的方式來切割,將每兩個點找出距離後作為一個區塊。透過這樣的方式可以很快速地找出兩個最相近的距離點。

如何將搜尋結果作 Caching

如果有一群人同時開 LINE SPOT 需要尋找三公里內所有座標,那麼有方式可以快速的暫存起來資料,並且快速的回覆使用者的需求嗎? 這時候可以考量使用 Hashing 的方式來將經緯度數值直接轉換成一串文字,透過這個方式可以快速找到上一次搜尋的結果。如果沒有搜尋過才去跑 K-D Tree 的搜尋,這樣一來就可以在不經過複雜的運算就可以快速的回覆使用者。

這個方式雖然可以快速地知道有沒有搜尋過,但是有一些問題如下:

  • 由於採取 zig zag travesal 的方式來 hashing ,可能不同的經緯到有相當相似的結果。
  • 可能相當的接近,由於在邊界上可能造成 geohashing 結果不同。

其他的方式

Google 也有提出 S2 Cell ID 的方式來區分地理資訊。而 Uber 也有提出 H3 的方式,透過六角形的方塊來切分整個地理資訊。也因為使用六角形,才能更精確地將地球球形的地理狀況表現出來。

「LINE 熱點」美食推薦

別再說新竹市美食沙漠, LINE 熱點也是有精選「十家新竹在地美食店家」。

活動小結

希望同學們了解地理資訊的處理經驗分享後。也都可以來 LINE 熱點來分享你的新竹美食地圖。

立即加入「LINE開發者官方社群」官方帳號,就能收到第一手Meetup活動,或與開發者計畫有關的最新消息的推播通知。▼

「LINE開發者官方社群」官方帳號ID:@line_tw_dev

關於「LINE開發社群計畫」

LINE今年年初在台灣啟動「LINE開發社群計畫」,將長期投入人力與資源在台灣舉辦對內對外、線上線下的開發者社群聚會、徵才日、開發者大會等,已經舉辦30場以上的活動。歡迎讀者們能夠持續回來察看最新的狀況。詳情請看:

[TIL][Golang] Type Parameters in Golang 初體驗 (a.k.a Go2 Generics)

前言:

Generics (泛型)一直是 Golang 這個程式語言比較受到 C++ 與 Java 轉過來的開發者們經常訓問的問題。 這個問題不僅僅算是經常被語言戰爭中主要的攻防端,更有許多發了需求要加入 generics(參考) 。這邊幫大家整理一下與嘗試一下最新版本的 Go2 到底 Generics 狀況如何了。

感謝 TG 上面討論的網友提供的鏈結, 試玩一下 Go2 Playground 並且看了一下 Type Parameters 的 proposal 變更後,寫了一下心得。大家可以玩玩看,一起來更了解一下 Type Parameters 的提案內容。

我得了一個重大活動前,就很想要寫程式或是讀 Spec 的病。 投影片明明在等我

為何程式語言需要 Generics

Generics (泛型)

泛型程式設計(generic programming)是程式設計語言的一種風格或範式。泛型允許程式設計師在強型別程式設計語言中編寫代碼時使用一些以後才指定的類型,在實例化時作為參數指明這些類型。

(來源: wiki)

也就是說,在強型態程式語言中,因為型態都必須去先給與。撰寫 function 的時候很難將型態加以抽象畫。 讓型態可以事後在套入。拿個簡單的例子來說,根據文章 “Why Gnerics” 曾經舉過這個很棒的範例。先假設你需要將一個 slice 裡面所有元素從小到大來排序。

根據 Int 你可能會寫:

func ReverseInts(s []int) []int {
    first := 0
    last := len(s) - 1
    for first < last {
        s[first], s[last] = s[last], s[first]
        first++
        last--
    }
    return s
}

而如果是字串的時候,可能如下:

func ReverseInts(s []string) []sting {
    first := 0
    last := len(s) - 1
    for first < last {
        s[first], s[last] = s[last], s[first]
        first++
        last--
    }
    return s
}

根據以上的方式,你會發現兩個 function 其實真的沒有任何的差異。但是卻由於資料格式不同,需要特地用兩個 function 分開來撰寫。 這樣對於維護上往往不直覺,以後發現其中可以優化或是有問題的時候,就一次需要把所有用到型態的程式碼都一起維護,相當的不直覺。

在 Type Parameters 之前Golang 沒有其他替代方案嗎?

先不談 Generics ,其實 Golang 可以透過 Interfaces 的方式來做相關的開發,這裡是相關的實作方式。 先來解釋什麼是 interfaces :

Interfaces are named collections of method signatures.

(Refer: Go by Example: Interfaces)

根據這個範例 可以簡單瞭解 interfaces 主要用法。 那為人所熟悉的應用方式是什麼呢? 就是 sort.Sort()

package main
 
import "sort"
import "fmt"
 
type ByLength []string
 
func (s ByLength) Len() int {
    return len(s)
}
func (s ByLength) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}
func (s ByLength) Less(i, j int) bool {
    return len(s[i]) < len(s[j])
}
 
func main() {
    fruits := []string{"peach", "banana", "kiwi"}
    sort.Sort(ByLength(fruits))
    fmt.Println(fruits)
}

透過 sort.Sort() 的 function,你可以套入 int 或是 string 的排序方式,甚至你可以為了自定義的 struct 定義自己的 Len()Swap()Less() 之後就可以套用 sort.Sort()。 當然其實也有 Go generation , reflection 等等方式也是可以使用。 這裡就不再詳述,歡迎大家參考延伸閱讀。

衍伸閱讀

Golang Generic Proposal 介紹影片:

以下有根據 Golang Generics Proposal 的敘述投影片,請注意這是第一個版本 (2019/07) 的 Generic Proposal ,裡面還是使用 Contract 的方式來實現 Type Parameters 。 但是這個部分在之後已經修改成 interfaces 來讓語法比較清楚。 必須得老實說,當初 Contract 出來的時候,我真的也搞不太懂 contracts interfaces 的差異。

What happened to contracts?
An earlier draft design of generics implemented constraints using a new language construct called contracts. Type lists appeared only in contracts, rather than on interface types. However, many people had a hard time understanding the difference between contracts and interface types. It also turned out that contracts could be represented as a set of corresponding interfaces; there was no loss in expressive power without contracts. We decided to simplify the approach to use only interface types.

https://go.googlesource.com/proposal/+/refs/heads/master/design/go2draft-type-parameters.md

試玩 Go2 Playground

就讓我們來透過 Go2 playground 提供的 Type Parameters 來回頭看我們原本的問題。是否有方式可以透過 Type Parameters 來實作呢?

馬上來看結果: https://go2goplay.golang.org/p/doitUP4_1Jm

func ReverseSlice[T any](s []T) []T {
	first := 0
	last := len(s) - 1
	for first < last {
		s[first], s[last] = s[last], s[first]
		first++
		last--
	}
	return s
}

func main() {
	fmt.Println(ReverseSlice([]string{"Hello", "playground"}))
	fmt.Println(ReverseSlice([]int{1, 3, 5}))
}

Type Parameters加上限制

使用 any Type Parameter 其實相當的方便,但是往往取決於你可能處理的資料並不適合所有的型態的時候。其實需要加上一些資料的限制。 舉個例子來說明:

範例: 兩個參數取比較大的

	if a < b {
		return a
	}
	return b

這是一個相當簡單的比較方式,但是可以看到如果將這個方式透過 Type Parameters 來撰寫。會發現輸入的參數將不支援 string ,所以需要以下的相關修改。

https://go2goplay.golang.org/p/9BgTT0hCgD7

type numeric interface {
	type int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64
}

func min[T numeric](a, b T) T {
	if a < b {
		return a
	}
	return b
}

func main() {
	fmt.Println(min(42, 84))
	fmt.Println(min(3.14159, 2.7182))
}

小結論:

Type Parameters 與 Go2 Playground 其實還在開發中,使用上也沒有那麼直觀與好用之外,可能還有一些 bugs 。 不過真的很期待使用 Type Parameters 讓開發上可以真正將演算法與型態脫鉤,讓 function 能夠更簡潔。

相關文章:

  • Golang Blog: 2019/07/31 “Why Gnerics

  • Golang Blog: https://blog.golang.org/generics-next-step

  • Type Parameters in Go https://go.googlesource.com/proposal/+/master/design/15292/2013-12-type-params.md

  • https://groups.google.com/g/golang-dev/c/U7eW9i0cqmo/m/-gDfa_6KAAAJ?fbclid=IwAR27mCQ8vgV9w8A201SlLMkyTnWJbfKVBoVRFutGU1zt1_KOCib9pVeQSMs

  • Type Parameters Draft Design in Gohttps://go.googlesource.com/proposal/+/refs/heads/master/design/go2draft-type-parameters.md

  • Go2 Playground https://go2goplay.golang.org