[TIL][Kotlin] 關於 Kotlin 相關語法快速整理

前言:

最近 Google Taiwan 開啟一個計畫「Android App 開發培訓計劃 2021」,透過 Android Studio 跟著 Kotlin 這個語言來讓大家寫 Android App 。趁機順便學習一下 Kotilin 相關語法跟需要注意的地方。

相關工具

Kotlin Playground

由於有點懶得安裝環境跟相關的 IDE 設定,所有的練習其實可以快速的在 Kotlin Playground 上面完成。

語法Tutorial - Koans

可以透過網頁上面的 Koans 或是內建在 JetBrains IntelliJ IDEA or Android Studio 的 JetBrains educational plugin

學習建議:

由於這個語言我不是很熟習,但是熟悉新的語法其實蠻建議透過 Tutorial 來先有個概念性的了解,方便你開始相關的查詢。 所以這邊建議先跑過一次 Koans 再來把相關資料結構與語法來做一個語法的相關脈絡整理。

特別資料結構語法說明

LIST

val numbers: List<Int> = listOf(1, 2, 3, 4, 5, 6)

透過 List 關鍵字來加上 generic type 來建立出相關 List 物件。也可以透過 Inferred 方式建立。

val numbers = listOf(1, 2, 3, 4, 5, 6)

Kotlin 是 Zero-based Index 的語言(延伸自 Java) 。

MutableList

參考官方文件 , MutableList 為長度可變的 List 。也就是可以針對 List 去 add, addAll, listIterator, remove, removeAll… 相關操作。 宣告方式參考如下:

val entrees = mutableListOf<String>()

相關文章:

[TIL][Android] Android Studio 開啟專案可能會遇到的問題

前言:

最近 Google Taiwan 開啟一個計畫「Android App 開發培訓計劃 2021」,透過 Android Studio 跟著 Kotlin 這個語言來讓大家寫 Android App 。雖然我之前有寫過,但是也很久沒使用 Android Studio 了,來開啟專案看看吧。 不過一開始好像開啟錯誤的 codelabs www 不小心開到後面的 Use Kotlin Coroutines in your Android App,出現了一些問題,也順便解決一下。

如何設定環境(How to setup your Android 4.1 on Mac Catalina)

跟著這次的 Kotlin coroutine codelab 你會找到 Android Studio 下載的地方。 你也會找到相關的 github for Kotlin coroutine 。 然後透過 Android Studio 來打開 coroutines-codelab 的資料夾,你可能會出現以下的 Error 。

> License for package Android SDK Build-Tools 29.0.2 not accepted
> License for package Android SDK Platform 29 not accepted.

> Could not resolve all dependencies for configuration ':start:debugRuntimeClasspath'.
> Could not create task ':start:minifyReleaseWithR8'.
> Cannot query the value of this provider because it has no value available.

原因:

因為最新版本的 Android Studio 4.1.3 ,預設使用的 Android SDK 版本是 30 ,但是這次的 codelab 是使用舊版本的 29 來準備的。所以需要下載舊版本的 SDK 並且同意相關的 License 授權。

解決方式:

[Preference] -> [System Setting] -> [Android SDK] -> Enable Android Platform 29

這樣下載 Android SDK 29 的時候,就會同時去同意 License 。 就可以正常的 Compile。 範例也可以正常執行在 Android Simulator 上才是。

相關文章:

[好書分享] 無限賽局(The Infinite Game)

無限賽局 - 翻轉思維框架,突破勝負盲點,贏得你想要的未來 THE INFINITE GAME

作者: 賽門.西奈克  
原文作者: Simon Sinek  
譯者: 黃庭敏  
出版社:天下雜誌出版 

買書推薦網址:

前言:

這一本是今年所讀完的第五本書。賽門,西奈克(Simon Sinek) 一直是我很喜歡的作者,我似乎也買了(讀了)他的不少創作,從『先問為什麼」,到這一本書。

這一本書本來認為是講解有限思維與無限思維的書籍,但是有不少關於公司經營策略的方向。 如果公司透過了有限思維來制定公司的願景,那麼公司的前景是堪憂的,相反過來許多的公司都透過「無限賽局」的思維來訂定的公司的目標企業形象。這樣一來不僅僅能夠帶來源源不絕的動力,對于公司的進步也是可以期待的。

對於代表公司在外頭常做企業形象演講的我,這樣的思維是相當的重要的。這本書也蠻推薦給常需要代表公司在外頭演講的相關職業。

最後獻上天下雜誌所製作的推薦影片,其實蠻讚的。

內容簡介與心得:

《先問,為什麼?》暢銷作家賽門‧西奈克最新顛覆力作

黃金圈引導你找到最初的為什麼
無限思維為你重新定義工作與人生的方向與策略

贏了對手讓人士氣大振,但是為什麼興奮兩天就消散?
終於站上市場第一,但是新競爭者不斷出現,什麼時候才是真正的勝利?
在競爭中,我們怕輸、怕落後,拼命的像滾輪上不停奔跑的老鼠,疲憊不堪。
這是我們唯一的選擇嗎?

市場沒有一定規則,思維框架決定了你的策略選擇。
不被當下成敗綁架,才能主動應變,每天都充滿動力!

我們被自己的思維框架困住了!
習慣用贏家輸家、成功失敗的角度來看事情,
是讓我們不斷感到挫折、無法持續努力的最大盲點!

商業環境不是球賽棋局,改變規則沒有預告、參賽者沒有名額限制,也沒有一定的終場時間。

人生也是如此。

章節條列

  • 作者序 我為何寫這本書
  • 前言 怎樣才算勝利?
  • 01 有限賽局和無限賽局
  • 02 崇高的信念
  • 03 如何找到信念
  • 04 讓信念傳下去
  • 05 企業責任2.0
  • 06 意志與資源
  • 07 信任的團隊
  • 08 小心道德褪色
  • 09 可敬的對手
  • 10 攸關存亡的應變
  • 11 領導的勇氣
  • 後記 名為人生的賽局

就如同影片說明的,作者對於目前的企業文化覺得有些怪怪的。自從作者讀了五十年後的 1986 年,卡爾斯寫了《有限賽局與無限賽局》(Finite and Infinite Games) 之後,他知道許多問題的癥結點在於許多的企業都使用者「有限賽局」的思維作為企業文化的表徵。

在這本書一開始先敘述「有限賽局」與「無限賽局」的不同,主要的思考論點也在於「有限賽局」的思考脈絡始於競爭,但是就算很順利的將公司的達到了市場的領頭羊,或是市場上第一佔有率的公司。接下來又該如何? 這樣的思維往往是相當危險的,代表公司的創辦人本身看到的並不是公司未來的發展。就如同本書提到的,公司發起的主要因素一定是為了賺錢,但是如果只是將賺錢來當作公司主要核心目標甚至是公司標語的時候,那麼公司的未來是岌岌可危的。

因為往往賺到了許多前後,公司可能接下來就是精簡支出,以求取更高的獲利。為了讓股東賺取更多的獲利,而不在意是否能夠找到公司的信念。

但是每間公司並不完全能夠遵守的無限賽局的想法,很多時候許多公司一開始都是由著無限賽局的夢想而出發。 但是隨著與競爭者的相互競爭下,許多公司會迷惘,進而失去了無限賽局的思路,讓自己公司陷入了有限賽局的迷惘內。

這種往往發生在許多團隊中的「道德褪色」,指的是因為團隊間的惡性競爭,造就了欺騙甚至是假報成果的狀況。 書上也指出就算是在紀律嚴明的軍中,也會因為當局者陷入有限賽局的思路,每次只想著如何贏過其他的競爭對手來取得更好的成績,而與許著軍中出現了所謂的道德褪色的狀況。

「無限賽局」的思維並不容易,往往許多時候也會造成痛苦的轉變過程。 作者先舉了反向的例子,也就是「發明數位相機專利的柯達」,最後竟然就是被數位相既的風潮導致公司破產。 因為當初第一位發明數位相機專利的人,其實是柯達裡面的員工。但是當時的柯達高層,還是汲汲營營與底片的收入,認為底片才是柯達收入的主要來源,數位相機不會變成風潮。所以刻意打壓,申請了專利也只是拿來收取專利授權金而不是自己開發數位相機。到了數位相機得專利過期後洶湧而來的數位相機風潮就讓柯達支撐不下去,緊守著底片的他們也跟不上新的浪潮,只能走向破產的收場。

接下來作者也舉了具有公司信念的例子,比如說全美國最大的藥局 CVS 連鎖藥局,在 2014 年決定了下架了菸類的商品。 因為他們真正在護著客戶的健康,也了解販賣著真正下架香菸才能讓他們的顧客真正的健康。但是這樣的轉變一開始受到華爾街投資客的不看好,認為下架香菸商品會讓 CVS 的「每股獲利大幅度減少」,更讓整個企業走向衰敗。

但是事實上,許多的顧客樂於見到這樣的企業轉變。紛紛轉向CVS 去購買其他健康的商品。並且許多在 CVS 藥局工作的人也能夠以此為榮。真正的實現他們的口號「幫助人們變得更健康」。 這樣的企業口號變得更加的真實,也讓許多競爭者望塵莫及。這樣才真正是所謂的「無限賽局」的思維。

參考文章

心得:

Simon Sinek 真的很會激勵人心,就算只是在書上的文字。我剛看完 CVS 藥局那個段落的時候,真的是相當的激動也相當的感動。 真正的企業形象的塑造,在於如何透過一個簡單而由上往下的行動來塑造整體的企業文化。不要讓許多企業經營的原因影響了許多原本立意良好的企業初衷。 身為公司的技術傳教士,經常思考著如何能夠協助公司打造更好的技術品牌的同時。 回過頭來也常常想到,許多的上位者其實都帶給我們許多好的影響。 記得在日本總部受訓的時候,總部的技術長總是百忙之間抽空來跟新建同仁們聚餐,並且會儘量跟每一個同仁講到話。也希望每一位同仁能夠真正地做到「Be Open」,讓同仁們能夠更加的相互溝通。 這些事情也都是我經常忽略,應該要把這些小故事更經常地放在我的表現之中,希望每一個夥伴能感受到。

如果你也是要打造公司形象的行銷夥伴,或是也是技術傳教士。這一本書真的會讓你充足滿滿的能量。

[學習心得][Golang] 舊的開源專案開啟 Go Modules 可能會遇到的問題 (e.g. go get 無法更新版本)

前言:

各位好, LINE Bot Go SDK 是一個經營超過了五年的專案,並且版本號碼也早就已經到了 v7.8.0 。

而本月月初 (2021/April) LINE Bot Go SDK 又有新的版本更新了,這次有支援到三月平台所提供新的功能,還有將去年公開的 FLEX Msg 的 update 2 更新了。歡迎大家使用。

這個套件已經更新到 v7 版本,才支援 Modules 。 結果一開啓就踩到雷,感謝台灣的網友 wys1203 送了 PR 修復。 我也整理一下相關心得,跟大家分享一下。

TL;DR

本篇文將要介紹以下一些的部分:

如何將舊的開源專案支援 Go Modules

LINE-BOT-SDK-GO 是 LINE 開源出來的對於 LINE Messanging API 所釋放出的開源套件,並且支援多個語言版本(Go., PHP, Java, Python) 。

原本這個 https://github.com/line/line-bot-sdk-go 的版本已經超過 v7 ,但是遲遲沒有支援 go modules 。 也就是並沒有 go.mod 在該專案的檔案下面。所以需要透過以下方式來啟動 Go Modules (Enable Go Modules)

- go mod init
- go mod tidy
- go mod vendor

原本 PR 看起來也沒有太多的問題,於是就將新版本發佈出來。 (v7.9.0)

發生問題了

原本版本更新後,看起來也沒有太多問題。但是版本更新後卻發生了以下兩個問題:

無法更新版本 (Cannot update version by “go get”)

這時候我試著去更新一個本來有使用到 https://github.com/line/line-bot-sdk-go 的套件,正常的更新流程如下:

>> go mod tidy                                                           
go: finding module for package github.com/line/line-bot-sdk-go/linebot
go: found github.com/line/line-bot-sdk-go/linebot in github.com/line/line-bot-sdk-go v7.8.0+incompatible

問題出來了,我明明有更新版本到 v7.9.0 但是卻無法抓到最新的版本?

於是我拿了一個新的專案,重頭試試看。

  1. Copy https://github.com/line/line-bot-sdk-go/tree/master/examples/echo_bot to your go path
  2. go mod init
  3. go mod tidy

結果一樣是出現:

>> go mod init                                                                       
go: creating new go.mod: module github.com/kkdai/echo_bot 
go: to add module requirements and sums:
	go mod tidy
 
>> go mod tidy                                                                            
go: finding module for package github.com/line/line-bot-sdk-go/linebot
go: found github.com/line/line-bot-sdk-go/linebot in github.com/line/line-bot-sdk-go v7.8.0+incompatible

大家可以參考這個 issue 。 不論使用 go get 還是使用 go mod tidy 都無法順利將版號更新的最新的版本。 這個問題,讓我困擾了一陣子。

pkg.go.dev  上面版本是舊的

<a id=”go-dev-out-of-date””></a>

先來稍微解釋一下 https://pkg.go.dev 是一個 Golang 社群的套件說明網站。開發者可以透過關鍵字搜尋套件,並且可以查看相關的說明(所有內容都是根據 github.com 上面的資訊)。

而透過 https://pkg.go.dev 也可以很輕鬆的查許多專案版本方面的資訊,比如說 https://pkg.go.dev/github.com/appleboy/gofight 可以看到有最新版本 v2 - https://pkg.go.dev/github.com/appleboy/gofight/v2

雖然 https://github.com/line/line-bot-sdk-go 已經加上了 go.mod 的檔案,但是卻無法找到 https://pkg.go.dev/github.com/line/line-bot-sdk-go/v7 這個資料夾。

這時候感謝台灣網友提供的 Pull Request 提供給我相關的想法。

Go Modules 對於 v2 之後的支援方式

根據官方的文件 - Golang-Blog Publishing v2 and beyond 上面有提到,如果需要發布 v2 之後的版本由於是具有不向後兼容的方式。 所以在發布得時候,官方建議有兩個方式:

  • 建立一個新的資料夾 v2 並且把東西全部更新到該資料夾上面。並且更改 go.mod 將版本號碼改成 v2
  • 或是直接更改目前資料夾的 go.mod 將版本號碼改成 v2

修改 go.mod 檔案到 v2 (或是之後)的方式

$ go mod edit -module github.com/YOU/YOUR_PROJECT/v2 go.mod

這邊要注意,因爲 go mod init 並不會自動幫你加上相關的版本(如果超過 v2),只得自行加上。所以需要「手動」加上相關的版號,也就是說如果你的套件可能已經超過了 v2 以上,但是一直沒有啟動過 go modules 那麼你可能就會踩到這個雷。

如何修復? 有用到的人該如何修改?

原始套件啟動 Go Modules 的修復方式

關於 https://github.com/line/line-bot-sdk-go 的修復方式,大家可以參考這個 pull request

使用到的套件,要如何能夠正確的更新版本?

如果你是使用 https://github.com/line/line-bot-sdk-go 這個套件的人,請根據以下方式來正確地取得最新的版本。

  1. 所有 import 的地方,修成到 v7

    1. AS-IS: import "github.com/line/line-bot-sdk-go/linebot"
    2. TO-BE: import "github.com/line/line-bot-sdk-go/v7/linebot"
  2. 重新修改 `go.mod. 透過執行

    1. go mod tidy
    2. go mod vendor
  3. 測試你本地端的程式碼,確定沒問題。

  4. 更新到 GitHub

結論:

因為 Go Modules 其實是兩年前的 1.11 才開始使用,但是許多專案其實也沒有馬上啟動。 如果沒有啟動 Go Modules 其實版本更新也不會出錯。 但是只要一啟動 Go Modules 的話,就要小心本篇文章所提供的相關案例。

其實啟動 Go Modules 是相當方便的,也應該要提早準備好相關的修正。希望每一個套件管理者能儘早的準備升級到 Go Modules 的套件支援。

相關文章:

[好書分享] 創意競擇 - 蘋果前iPhone首席軟體工程師獨家告白

創意競擇 - 從賈伯斯黃金年代的軟體設計機密流程,窺見蘋果的創意方法、本質與卓越關鍵
Creative Selection: Inside Apple's Design Process During the Golden Age of Steve Jobs
作者: 肯.科辛達  
原文作者: Ken Kocienda  
譯者: 洪慧芳  
出版社:臉譜 
出版日期:2021/01/26 

買書推薦網址:

前言:

這一本是今年所讀完的第四本書。 當初也是聽到 「「現在開始你們都是鍵盤工程師!」iPhone 鍵盤的誕生與賈伯斯時代的蘋果軟體設計流程」的結果馬上就買了這一本書的電子版(週日買),作天晚上(週三)就看完了。 為什麼會這麼想要看這本呢? 我的理由如下:

  • 這是第一本由 「蘋果首席iPhone軟體開發工程師」(註解: Principle iPhone Software Engineer,通常在外商科技公司中, Principle Software Engineer 通常就是非管理職的最高職位)所寫的書籍。
  • 這也是一本講解有賈伯斯在的時候蘋果所產生出來的氛圍,還有一個好的功能是如何挑選出來的。

蠻推薦給大家看的,有興趣可以買來看。

內容簡介與心得:

──蘋果前iPhone首席軟體工程師獨家告白──
──Steve Jobs賈伯斯黃金時代蘋果創意法則全紀錄!──

蘋果產品全球有近二十億使用者,但催生、實現這些創意的所有工作流程,
由於內部嚴格的「保密條款」限制,始終成謎。
天才們究竟是如何孕育出iPhone、iPad、Safari……?
蘋果前首席軟體工程師,首度揭露賈伯斯黃金時代的蘋果設計開發流程,以及成就Apple的關鍵要素

章節條列

  • Introduction前言
  • The Demo演示
  • The Crystal Ball水晶球
  • The Black Slab黑色方碑
  • One Simple Rule大道至簡
  • The Hardest Problem最難的問題
  • The Keyboard Derby鍵盤大賽
  • QWERTY英打鍵盤QWERTY
  • Convergence聚合
  • The Intersection交會點
  • At This Point此時此刻
  • Epilogue後記

整本書從一個 iPad 的鍵盤設計展示開始(也是作者最後一次在公司看到賈伯斯),慢慢回想到作者如何被找來蘋果開發軟體。 如何協助開發 Mac 上面的瀏覽器,也是因為瀏覽器的開發讓作者第一次感受到十倍工程師的能力。裡面的小故事是: 一開始作者想透過 Mozila 的原始碼修改移植到 Mac OS 上面。但是因為 Mozilla 實在太龐大了,所以導致作者花了六個禮拜還不能讓 Mozilla 在 Mac OS 上面正確的執行(應該說連編譯 compile 都不行)。 但是新成員查理的加入,他用了兩天的時間就就透過自己寫的一層 Shim 讓 Mac OS 能跑 KDE 上面的瀏覽器(Shim 是一層欺騙層,一方面騙 KDE 瀏覽器正在 KDE 上面,一方面騙 Mac OS 他跑的是 Mac 軟體。 (類似 Kubernetes 裡面的 Dockershim )

這也是一個很特別的故事分享(原來強者可以兩天內寫好一個 shim 啊啊啊啊啊)

完成了 Mac OS 上面的瀏覽器(也就是我們後來熟知的 Safari ),作者有機會能高升為 iCloud (當時還是網路儲存),但是因為自己的不適應,竟然用跳槽威脅老闆們要當回工程師。(這也是很有趣的例子,原來真的有人願意單純當工程師)。 然後作者也加入了後來的 Purple 團隊(也就是蘋果最偉大的產品 iPhone)的團隊。 也是這個機會讓後來作者能有機會能夠在賈伯斯面前 demo 新功能「鍵盤的功能」。 現在 iPhone 上面的鍵盤就是作者參與製作的功能,並且也是作者打造出的自動拼字的功能,也是他打造出手指調整。也就是按鈕按下去得時候,往往使用者以為是指尖按到,但是往往會是指腹會先碰到螢幕。造成使用者以為不精準(其實是自己先碰到),連這個都能改善,真的是蘋果啊!!

心得:

蘋果的許多展新功能不是透過許多人的腦力激盪,而是透過許多不同的展示。許多有天賦的工程師透過高效率的樣品與展示,讓賈伯斯與許多高層能夠透過展示的成果決定那些功能是不是蘋果需要的功能。 這些段落在書中有詳細的敘述,也是很值得看的段落。身為工程師能了解如何做高效地展示,並且如何在展示的途中思索如何讓許多人能接受自己的展示。都是很重要的能力。

想要快速了解書內容,可以聽聽 Podcast 。但是身為工程師的話,建議一定要看本書。

參考文章

[學習心得][Golang] 簡單介紹幾個 Golang 1.16 的新功能

前言:

這篇文章拖得有點久(再不寫完 1.17 就要出了)

整理一下 Go 1.16 最新的幾個重要功能,其中最重要就是 Retract 跟 Embed Package 。大家趕快來試試看。

TL;DR

本篇文將要介紹:

如何安裝嚐鮮版本的 golang 1.16

如果你想要嘗試一下,還沒有在 Homebrew 上有支援的 Golang 版本,就目前 (2021/02/19) 狀況由於許多相關套件還沒有更新好,造就 HomeBrew 遲遲無法 Merge ,大家可以參考一下這個 PR

那如何在本地端安裝一下測試版本的 Go1.16 呢? 就如同本文開場圖片的敘述一下:

go get golang.org/dl/go1.16
go1.16 download

如此一來,就會在本地端安裝一個編譯好的檔案。 go1.16 如果需要相關的測試可以直接跑 go1.16 build 或是 go1.16 test 來跑。

1.16 新功能主要列表

Apple Sillicon (也就是目前的 Apple M1 Chip) support

這個版本正式支援 apple Silicon 誒就是 64-bit ARM 架構。(a.k.a. Apple M1 chip) 。 可以透過 compiler 參數:

  • GOOS=darwin,
  • GOARCH=arm64

來設定,而原先的 iPhone binary 設定則改為:

  • GOOS=darwin,
  • GOARCH=ios/arm64

可以透過指令 env GOOS=darwin GOARCH=arm64 go build 來編譯出給 Apple M1 的 binary 。

Go Module Retract

這部分可以參考我的另外一篇詳細文章。 [學習心得][Golang] Go 1.16 新功能的「版本撤回(下架)」(Go Modules retraction)

Embedding Files (把靜態檔案包含在專案中)

以往是無法將靜態檔案,包在 Golang 的專案之中。幾個方式只有:

  • 如果要載入的檔案是 json ,將它弄成變數。
  • 如果是 html 的 template 檔案,需要跟 binary 放在一起
  • 或是可以看一下 go-bindata 的專案(相似的還有 packrpkger ),透過這個方式將 static file 放在專案中變成 resource 。

但是在 1.16 之後,可以正式支援了。

假設檔案結構為:

.
├── go.mod
├── main.go
├── static
│ └── css
│ └── main.css
├── templates
│ └── index.html.tmpl
└── title.txt

透過以下方式,可以將檔案打包到專案中:

以後要打包整個網站,不用在擔心 docker 打包的時候會忘記把 template 跟 image 資源檔案忘記打包。

相關資料

相關文章: