[TIL][Golang] Golang 社群 FAQ (2) - Struct Tags

前言: 平常在臉書社群或是 Slack channel (https://t.me/golangtw) 都會聽到一些常問的問題,決定把它整理一下,變成這篇文章,也希望讓更多人經過搜尋來了解與得到解答。 由於經常詢問的問題還不少,這算是一個系列的整理,希望能透過整理成文章的方式給予大家比較深入的了解。 第二篇是 Struct Tags ,希望大家在處理 XML 與 JSON 資料上面,能夠更了解。 相關系列文章整理: Type Assertion Struct Tags (本篇) Struct Tags: 請問一下,像這種直接在 struct 成員宣告後面放字串的,是什麼語法啊? type Person struct { Name string `form:"name"` Address string `form:"address"` } 我在官方文件中找不到 這個叫做 struct tags Go Wiki: Well known struct tags,通常是用在 JSON 資料格式定義的時候。 以下拿一個簡單的範例來舉例: package main import "fmt" type User struct { Name string `example:"name"` } func (u *User) String() string { return fmt.Sprintf("Hi! My name is %s", u.Name) } func main() { u := &User{ Name: "Sammy", } fmt.Println(u) } (範例來自:How To Use Struct Tags in Go) https://golang.org/pkg/reflect/ func (StructTag) 那邊有一些範例。 其實 Golang 本身提供不少種類的 Struct Tags , JSON, XML, bson 都算是比較常見的格式。 https://github.com/golang/go/issues/23637 Reference: How To Use Struct Tags in Go Go Wiki: Well known struct tags
繼續閱讀

[好書分享] OKR:做最重要的事

OKR:做最重要的事 (Measure What Matters: How Google, Bono, and the Gates : Foundation Rock the World with OKRs) 作者: 約翰.杜爾 原文作者: John Doerr 譯者: 許瑞宋 出版社:天下文化 出版日期:2019/01/30 語言:繁體中文 ISBN: 9789864796335 買書推薦網址:http://moo.im/a/24kwJL 前言: OKR 這個名詞或許曾經在什麼地方有聽說過,但是到底 OKR 是為何產生的? 究竟 OKR 跟日常經常聽到的 KPI 又有什麼不同? 為什麼 Google 跟 Intel 會選擇使用 OKR 而不是我們常見的 KPI ? 辦完了年度開發者盛會 LINE TAIWAN TECHPULSE ,除了活動的收尾活動之外,接下來就是得要開始訂定明年度的計畫,要如何有效地訂定一個「可量化」,「有挑戰性」,「並且能夠符合團隊主要目標」? 於是我挑選了這本書來看,看完之後真的相當的推薦每一個管理專案的人員都應該看看這本書。 內容簡介: 這是杜爾最成功的投資,他在科技界興起了新的管理方法,造就世界級的執行力。 什麼是OKR?目標與關鍵結果(OKR,Objectives and Key Results),前者代表你想達成「什麼」,後者則是你該「如何」達成。 OKR有4大超能力: #1:專注投入優先要務 #2:契合與連結,造就團隊合作 #3:追蹤當責 #4:激發潛能,成就突破 OKR帶領Google從40人的新創公司,成長為超過7萬員工的科技巨擘,市值高達7000億美元。 簡介來自讀墨: http://moo.im/a/24kwJL 這本書一開始就開宗明義地解釋了 OKR 是 Google 裡面主要作為主要評量每一個團隊目標與工作事項的主要工具。 OKR (Object Key Result) 其中拆開來解釋: OKR 帶來的改善 (Object): 「目標」就是我們想達成的事,不多也不少。目標必然是重要、具體和行動導向的,最好還能激勵人心。目標設計和運用得當,可以防範模糊不清的思想,以及執行時的含混摸魚。 (Key Result):「關鍵結果」界定目標的標準,並且監控我們「如何」達成。有效的關鍵結果不僅明確,而且有時限,是進取但又可行的。 接下來這本書就開始透過許多公司使用 OKR 所帶來的轉變過程,其中包括了: Intel Remind MyFitnessPal Google Chrome Youtube 雖然每一個案例沒有提到詳細 OKR 的執行方式與細節,但是可以了解到以上的這些公司或是產品透過 OKR 所帶來的快速反應與強大的力量。並且推進著團隊裡面的人往更加有進取性的目標而前進。 細究 OKR 的細節與精神 OKR已經使形式上的年度目標變得毫無必要,我們需要一種工具,可以徹底革新過時的績效管理系統。簡而言之,工作的新世界需要一種新的人力資源模式。這種取代年度績效考核的系統,就是持續性績效管理,執行工具是CFR,如下所列: CFR (Conversation, Feedback, Recognition) 三者所組成,是一種相當有時效性,反饋性與進步性的改善工具。 如果 OKR 讓每一個目標變得積極與可衡量性, CFR 讓團隊績效考量上變得經常性地溝通 (C),並且適時的透過反饋 (F) 來讓每個工作往著正軌運行,並且透過誇獎 (R) 讓增強團隊成員對於正確執行的效果。 年度考量是許多公司的噩夢,由於發生的區段相當的長(一年做兩次或是一次)使得許多主管都無法詳細記錄下來評量的方式,往往透過依稀的記憶來填寫著相當戎長的文書報告,來做與薪資相關的績效評量。 並且績效考量都會跟著薪資掛勾,讓許多高績效的人才往往厭惡做績效評量而得到低下的評分,善於做報告的人往往可以拿到高校評量。 讓整個績效考核制度變得相當的失敗,並且往往就是流失人才的主因。 接下來的章節討論著如何透過 OKR 來取代年度績效的評量。分享了 Adobe 的案例,也分享了 Zuma Pizza 的故事,透過這些故事可以清楚讓人暸解。 透過 ORK 的精神可以讓績效評量變得能更精確,更實際並且更能反映每一個員工的努力程度。 心得: 這本書的整個編排讓我相當的驚艷,其實從第一頁到最後一頁,作者都沒有清清楚楚的寫明該如何做 OKR ,但是透過許多案例的分享,讀起來其實可以從心裡面去了解 OKR 的許多真理,比如說「目標的制定」,應該要由上而下,應該要遵循著整個組織的使命與最重要的目標來訂定。在訂定目標的時候也一定要與每一個成員坦承與公開的討論,讓整個團隊的目標能夠依照這個來展開成每個小部門的目標,來規劃出每一個成員的「關鍵結果」。 並且第二個章節也討論了績效評量與 OKR 跟 CFR 的差異,透過經常性地討論,反饋與誇張。讓許多績效評量變得更加有效過,讓成員在完成每一個工作之後馬上地得到誇獎,每一個值得討論的時候迅速的反饋。如此一來就能回歸績效評量的核心宗旨,希望每一個成員能夠持續不斷努力,讓組織逐漸地向前進步(並且是快速的)。 這本書相當建議大家好好閱讀,不論你是不是有從事專案管理或是人員組織管理的相關工作.都應該好好的了解整本書的精髓,讓你的組織能夠向上提升。
繼續閱讀

[TIL][Golang] Golang 社群 FAQ (1) - Type Assertion

前言: 平常在臉書社群或是 Slack channel (https://t.me/golangtw) 都會聽到一些常問的問題,決定把它整理一下,變成這篇文章,也希望讓更多人經過搜尋來了解與得到解答。 由於經常詢問的問題還不少,這算是一個系列的整理,希望能透過整理成文章的方式給予大家比較深入的了解。 第一篇首先是 Type Assertion ,希望大家在型別轉換上能夠更了解。 相關系列文章整理: Type Assertion (本篇) Struct Tags Type Assertion: 範例程式碼: https://play.golang.org/p/Ya8tVYmdpko 不好意思 想請問這一段 resp, ok := datum.(*module.Response) 那個ok是代表甚麼意思啊 是代表datum這個interface可以成功轉成Request 這個struct的意思嗎? 這種用法叫做 Type Assertion (Go Tour 有相關說明),主要是用來做轉型判斷。透過 Type Assertion 主要的好處可以確認是否可以正確的轉型成功。 當然 reflect 也可以轉換數值,但是比較適合使用在當你拿到一個參數卻不知道當初是使用哪一種資料型態。才透過 reflect 套件來取得型態與取得數值內容。 簡單一點的例子而言: func parseInterfceToString(in interface{}) string { if val, ok := in.(string); ok { return val } return "" } 上面的例子,因為已經確定只支援 string 的解析方式,所以可以直接使用 type assertion 的方式來轉址。 但是很多時候,如果希望能夠支援多種型態,並且能夠正確的讀取數值的話,又該如何做呢? func createQuery(q interface{}) { t := reflect.TypeOf(q) v := reflect.ValueOf(q) fmt.Println("Type ", t) fmt.Println("Value ", v) } 這是一個相當簡單的 reflect 範例,可以讓妳得知輸入進來的資料型別與實際資料。 直接透過 reflect.Type.Kind() 來取得型別做處理的範例可以參考以下: func examiner(t reflect.Type, depth int) { fmt.Println(strings.Repeat("\t", depth), "Type is", t.Name(), "and kind is", t.Kind()) switch t.Kind() { case reflect.Array, reflect.Chan, reflect.Map, reflect.Ptr, reflect.Slice: fmt.Println(strings.Repeat("\t", depth+1), "Contained type:") examiner(t.Elem(), depth+1) case reflect.Struct: for i := 0; i < t.NumField(); i++ { f := t.Field(i) fmt.Println(strings.Repeat("\t", depth+1), "Field", i+1, "name is", f.Name, "type is", f.Type.Name(), "and kind is",...
繼續閱讀

[LINE TAIWAN TECHPULSE 2019] 活動安排幕後秘辛

前言 大家好,我是 LINE Developer Relations 團隊的資深開發技術推廣工程師 - Evan Lin 。主要的工作項目就是平台技術推廣與技術品牌的建立與溝通。 LINE TAIWAN TECHPULSE 2019 已經在 2019/12/04 在和平籃球館舉辦了,不知道今年各位有沒有參與到這一場精心安排的盛會。 這一篇文章,分享一下身為幕後工作人員在活動裡面想要傳遞的訊息,本篇文章將會專注在主場議程以外的相關訊息,也就是開發者相關的交流區域。希望大家都有觀察到工作人員們的初衷,跟著本篇文章再來體驗這一場知識與社群的饗宴。 回歸初衷,從開發者的本質出發 開發者在參與研討會的時候,最想要的究竟是什麼? 就是跟人互動, 而 Closing the distance 一直都是 LINE 的宗旨之一,也是本次活動最大的設計目標。 於是本次的活動回歸了開發者社群的本質,參與研討會最想要做的但是由於一些外在條件而無法實現的夢想,大致上條列如下: 講者們都好強喔,好希望能在台下跟講者互動跟交流,想聽聽他們對於其他部分的意見討論與問題交流。 LINE 的強大開發平台上面有哪些社群組織? 裡面該如何加入呢? 什麼是 LAE (LINE API Expert) 這些大大又是哪裡來的? 可以跟他們交流問問題嗎? LINE Pay 該如何申請測試帳號? 該如何分析問題呢? LINE 的新星計畫又是什麼? 可以跟那些參與的新創團隊聊聊嗎? 聽說 LINE 資安做得相當好,那有資安社群可以參加嗎? 每次看到 LINE 的工程師在各大研討會的分享都好棒,有沒有機會可以跟他們近距離討論呢? 有沒有機會能夠透過參與研討會認識更多的同好? 或是跟同行友人又更多拍照的機會? 這些的問題從去年活動舉辦之後,就有陸陸續續收到來賓們與社群朋友們的意見。 工作團隊仔細思考之後,推出了已開發者為本的活動主軸。 互動攤位: 讓你了解大神的機會 首先問了讓每個參與的人都有機會可以跟講者們面對面討論的機會,主辦單位這次提供了互動攤位。並且有五大主題攤位: Ask LINER: 讓你跟講者,來自日本的 LINE 工程師面對面的交流與討論。台上聽不懂的,台下讓你問。 面板上面還清清楚楚地有著所有講者會待在攤位的時間,千萬不要錯過跟講者面對面的機會。 並且在中午時段還有來自於日本 Developer Relations 團隊的 Shoko Sato 與 Tachibana Sho 來分享日本 Developer Relations 的活動與一些有趣的日本服務。 LINE Pay: 行動支付已經是一大風潮,想要透過 LINE 官方帳號來創業的夥伴們,都希望可以快速的了解如何串接 LINE Pay ,這個攤位給你一個面對面的討論機會。 BECKS.io 社群攤位: 由 LINE 韓國同仁,亞洲傳奇資安大神 Beist 所組織的跨公司的資安社群 BECKS.io 這次也帶著相關資訊在此次的研討會之中擺攤。 其實 BECKS 今年在台灣也舉辦了五次的社群聚會,如果對資訊安全有興趣的朋友,可以追蹤社群活動首頁: https://becks.kktix.cc/ LAE (LINE API Expert) 互動攤位: LAE (LINE API Expert) 自從在 2018 Q1 宣佈以來,台灣目前也有九位 LAE (可以去以下網址查詢所有的 LAE )。 經常大家都是遠遠地知道有這些 LAE 的存在,卻一直苦無機會能跟他們面對面的交流。 所以這次趁著 LINE TECHPULSE 的機會,也邀請了 LAE 一起來共襄盛舉。 LINE PROTOSTAR 互動攤位: 本屆 TECHPUSLE 也邀請到運用 LINE 平台打造應用的10家新創團隊,命題都非常實用有趣,可分為生活助手、娛樂、教育,與金融科技相關的應用。 這邊可以讓各位去一個一個了解每一個新創團隊如何透過 LINE 平台與聊天機器人來發展自己的事業,並且如何透過一些 Messaging API 來讓自己的相關事業能更加活躍。 展示架(Poster) : 跟 LINE 台灣服務工程師討論架構 此外,今年一共舉辦了四次的 LINE Developer Meetup ,並且有許多次的社群活動邀請到...
繼續閱讀

[研討會心得] 20191211 Chatbots Taichung #5 at 台中夢森林

前言 大家好,我是 LINE Taiwan 的 Technical Evangelist - Evan Lin。這次很開心受到 chatbot 社群台中分部的邀請,參加了 “中部人的 Chatbots Meetup 聊天機器人小小聚 #5 @ 台中夢森林” 的聚會活動,並且分享 LINE API 更新與個人開發的心得。在此也跟各位分享本次參與的心得,並且也希望透過社群分享的力量能夠讓聊天機器人的開發動能更加的盛大。 社群 Chatbots Meetup: https://chatbots.kktix.cc/ 本次活動網頁: 活動網址 本次活動的共筆紀錄: https://hackmd.io/MA3uyLKtTn24KUx1iBWSzQ?both 由於 Chatbots Meetup 本身屬於社群自主性的活動,裡面也有許多社群朋友所贊助的閃電秀。裡面的所有內容也是相當的難得與有趣。也希望能夠透過本篇文章讓大家稍微了解 Chatbots Meetup 社群閃電秀的魅力。 以下分享一下個人在這場活動參與的心得,想要了解更多也歡迎去查看社群共筆紀錄。 https://hackmd.io/MA3uyLKtTn24KUx1iBWSzQ?both TECHPULSE RECAP and LINE API Update 201912 / 資深開發技術推廣工程師 Evan Lin TECHPULSE 投影片 LINE API Update 201912 LINE 開發者官方社群 OA 大升級: 就在 12/04 的 LINE TECHPULSE 2019 的大會上,來自韓國的 Jaewon 跟台灣工程師 Penny 有跟大家介紹 Clova Chatbot builder ,並且我們也跟大家想分享了,其實現在開始在 LINE 開發者官方社群 (ID: line_tw_dev) 也已經將 Clova Chatbot builder 整合進來,希望能讓每一位開發者都能夠清楚了解 LINE 平台的開發相關資料該如何尋找,也歡迎大家看看這一篇介紹文章 - LINE 開發者官方社群小幫手 – 操作體驗篇。 部分 LIFF 功能暫停使用 如同之前新聞 「部分 LIFF 功能暫停使用」所述,有一些 LIFF 的功能在即將上架的 iOS 9.19.0 之後就會暫停使用。在這個聚會上也跟大家公布一下,也請開發者們等待更近一步的消息公佈。 相關還有更多的新聞,也歡迎大家到投影片裡面查看。 至於 LINE TECHPULSE 2019 的投影片內容部分,也歡迎大家到投影片裡面查看,如果有任何 LIFF 使用上的問題與建議,歡迎大家在社群提問與討論。 更多相關內容: LINE 開發者官方社群小幫手 – 操作體驗篇 部分 LIFF 功能暫停使用 如何打造一個好的機器人開發框架 / C.T.Lin 投影片 來自資拓資訊的 CT ,跟大家分享聊天機器人開發框架 Bottender 的開發經歷。 整個內容相當有趣,敘述著當初公司接到案子要開發聊天機器人的那一刻,就想要打造給自己用的聊天機器人框架,透過支援的平台增加,與功能的增加,也開始想要把開發框架開源出來給社群的夥伴一起使用,一起來打造更好的平台生態。 整個內容隨著時間軸來了解 Bottender 框架是如何建立與逐漸成長的過程,也有討論到隨著每個平台不同的架構與支援功能在開發一個框架的時候應該要如何應對。 最後 Bottender 也在日前正式的宣布 1.0 ,歡迎大家來關注並且了解這開源聊天機器人開發框架。 更多相關內容: Bottender Bottender 1.0 官方部落格 閃電秀 三個講者之後,接下來就是介紹這個社群最有魅力的部分就是閃電秀。所有的閃電秀可以參考這篇共筆文章 https://beta.hackfoldr.org/chatbot/ ,由於都是五分鐘的閃電秀,主要內容快速用條列介紹給各位: 能使用變數的訊息推送小工具 / 戴均民...
繼續閱讀

[TIL][Golang] 如何抓取 Youtube 影片的相關資訊,與使用 Go 下載 Youtube 影片 (2020/06/03 更新)

前言: 這個專案是之前在開發 Project 52 所開發出來的,原因是看到一些解析 youtube 影片資訊的內容。透過 Golang 的 channel 跟 goroutine 可以很快速的開發出來一個小工具。 專案完成後,其實也沒有特別維護他。想不到卻受到大家的喜愛,Star 數也破了兩百。 由於 Youtube 其實對於資料格式也有修改(截至 2019/12/10 當下) ,這裡也針對目前的資訊來探討如何透過 Golang 來抓取相關資訊,並且取得影片標題,作者姓名,甚至是取得下載鏈結的方式。 (更新: 2020/06/02 ) 由於 YouTube 又再一次更新了影片網址的取得方式,個人也認爲相當適合分享。在此整理一下相關更新部分在同一篇文章中。 開源專案: github.com/kkdai/youtube 投影片: Github: https://github.com/kkdai/youtube 直接下載使用: - go install github.com/kkdai/youtube/youtubedr 用法1: (另存檔名為 Campaign Diary.mp4) youtubedr -o "Campaign Diary".mp4 https://www.youtube.com/watch\?v\=XbNghLqsVwU 用法2: (不指定檔名,而使用影片標題) youtubedr https://www.youtube.com/watch\?v\=XbNghLqsVwU 抓取 Youtube 影片資訊 取得 Youtube 影片 ID 與取得資訊: 舉個例子 Rob Pike 在 dotGo 2015 裡面的一個很棒的 talk - Simplicity is Complicated ,該影片的位置如下: https://www.youtube.com/watch?v=rFejpH_tAHM 這邊簡單的簡介一下,在 Youtube 每一則影片都有一個 ID,這個影片的 ID 則為 rFejpH_tAHM。 如果需要取得影片的相關資訊,則需要呼叫 https://youtube.com/get_video_info?video_id={YOUR_VIDEO_ID} 來取得,也就是如果要取得這部影片的資訊需要鏈結到 https://youtube.com/get_video_info?video_id=rFejpH_tAHM 取得資訊與相關處理程式碼: 接下來依序討論如何尋找影片 title 與資料。首先來詳細查看剛剛取得的相關資料。 因為取得下來的是 URK-encoded query string 的資料,需要透過以下的處理方式。 首先,你需要處理一下錯誤訊息。由於許多的影片是禁止下載分享,如此一來在取得相關資訊的時候則會發生錯誤的 status ,這裡需要處理一下。 取得影片標題與影片作者資訊: 這裡得說一下,其實大多數的資料有修改過。跟網路上可以找得到的資訊不同。所以後來花了很多的時間重新搜尋相關資訊,並且整理與轉換。 透過上述的 parseVideoInfo 轉換後可以取的 url.Values 也就是變數名稱的 answer。 處理上可以參考下列的方式,由於發現 ``answer[“player_response”]` 裡面有 Map 結構的資料格式,於是透過以下的方式可以取得相關資訊。 這邊有些比較少見的用法,稍微解釋一下。 if err := json.Unmarshal([]byte(playResponse[0]), &personMap); err != nil { panic(err) } 這個透過 JSON unmarshal 的方式來將JSON string 轉換成 map 。 轉換成 map 之後就可以尋找與取值,這裡可以使用 videoDetails 。 至於讀者可能會好奇這些資料格式是如何知道的,並且知道資料所在的位置。 這也是不斷地透過 iteration 來尋找才找到的。 取得 map 資料取出後,由於資料預設格式都會是 interface{} 如果要轉換成 string 輸出的話。可以透過 type assertion 或是直接轉換的方式。 下載影片:...
繼續閱讀