[好書分享] 征服世界是可能的嗎?

前言: 最近把一些之前沒看完的書開始拿出來讀完,這一本就是在閒暇時間拿來消遣用的書.但是雖然最近 Kobo 大幅度特價來台灣打廣告,我還是喜歡紙本的書啊(書櫃表示滿了..) 這一本不諱言當初是因為封面的比克大魔王 而買下來的,但是其實內容相當有趣所以當初也是一次幾乎都看完了.一直到了最近才有時間去寫讀書心得.這系列其實跟「空想科學讀本」系列很像,屬於幻想的科學系列.但是作者們都用很嚴謹的角度來看待當初埋藏在各位心裡的奇怪想法. tldr: 如果你沒有看過以下的漫畫讀物,強烈建議你「不」要買這本書來看.因為作者 岡田斗司夫 是動畫公司的創辦人,並且是美少女夢工廠當初創辦的公司. 裡面的範例也超級「宅」 ,如果是愛看漫畫的人或許可以完全融入作者的幻想科學裡. 內容簡介: 「征服世界」 已經忘記有多少動漫畫的反派夢想似乎都是這個,透過征服世界來達到自己的夢想.這本書也很有趣的由這裡展開.本來只是作者 岡田斗司夫 在暑假一個有趣的研究的分享,「一起征服世界吧」的演講. 卻被出版社聯絡,決定要出了這本有趣的書. 不過作者也不是泛泛之輩,他就認真的開始分析各個動漫反派的動機與方法論.整本書的架構如下: 征服世界的目的是? 一開始作者先透過一些動漫角色 「假面騎士」還有「北斗神拳」裡面的來分析這些反派為何要征服世界.每個人都有不同的目的: 消滅人類: 宇宙戰艦大和號- 科美拉星人 我要錢: 老是被人管,想要統治別人 推廣邪惡: 這個酷了吧? 竟然是七龍珠裡面的比克大魔王 哪類的統治者? 這邊就統治者(也就是我們說的大反派)來分析他們的人個特性,你看是不是相當認真. 想要征服世界的大反派,其實分成四型: 魔王型 獨裁者型 昏君型 幕後黑手型 那麼如何征服世界呢? 這邊就認真的討論,如果真的想要征服世界的人該如準備? 設定目的 確保人才 調度資金 作戰計畫管理及肅清屬下 征服世界之後(繼承人問題) 真正有可能征服世界嗎? 這個章節也認真的討論(但是還是舉了很多動漫的例子)征服世界的好處,還有統治世界的重點. 心得: 這本是相當適合當作休閒刊物,當然前提你還是要有相當程度的「宅」才能看懂裡面所舉的範例.作為一個放鬆毒物其實相當的棒.但是除了動漫的角色之外,也是可以看到作者對於歷史與人類管理相關的演進過程有一定程度的研究.有許多相關內容也潛移默化的導入到有趣的範例內.
繼續閱讀

[好書分享] 知識內容寫作課:寫一篇真材實料的網路爆紅好文章 - 從資訊業來思考

前言: 這本書其實已經看完幾個禮拜了,不過一直到這幾天放長假(?) 之後才有時間來寫. 這一本書是 Redhat 的大大提供建議的好書.雖然書名跟摘要會讓人覺得好像跟資訊技術人員沒有關係,但是裡面的內容其實都是通用的.讀完之後覺得有滿多地方可以推薦給大家.同時我會一併轉換到資訊技術人員來說,該怎麼去改善自身的撰寫方式. 其實我經常在演討會的摘要或是投影片上面都有運用到相關技巧,也歡迎大家相互討論指教. 內容簡介: 這本書是泛科學總編輯與泛科知識公司的知識長-鄭國威所撰寫的書.主要就是敘述他如何讓泛科學 這樣介紹科學的知識網站如何獲得大眾的青睞. 如何透過「有趣」並且吸引人的內容來讓更多人了解艱澀的科普知識. 整本書的內容圍繞在三個大流程: 如何寫出受人歡迎的知識內容? (知識寫作的九宮格) 如何宣傳你的知識文章 建立個人知識品牌 接下來就簡單介紹一下這本書裡面的內容,希望會讓大家更欣賞這本書.我會一併轉換到資訊技術人員來說,該怎麼去改善自身的撰寫方式. 如何寫出受人歡迎的知識內容? (知識寫作的九宮格) 知識寫作的九宮格是一個工具,幫助你將你的知識鋪成文字並且吸引人來吸收.一個良好的知識需要足夠吸引人的文字來架構,並且需要有足夠好的內容與標題吸引人來閱讀. 1. 熱點: 透過流行文化與名人的話題來吸引人進來,對於資訊相關的知識而言.比如說最近的支付話題相當的盛行,不論是 Line 一卡通的新聞或是麥當勞大麥克之亂的都是很適合拿來寫作並且你腦袋裡面的知識帶入到文字之中. 2. 場景: 透過令人熟悉的故事,場景或是時空來讓讀者更容易吸收一些知識. 比如說透過 棋靈王 吸引人來聽 AlphaGo 甚至是 Tensorflow. 透過 Pokemon Go 的圖片與熱潮來解釋 Kubernetes 如何自動化擴展節點的優點都是. 3. 誰: 你的文章想要寫給誰看? 你的演講想要對誰說? 這個場地大多是哪一些人? 都是我每次一到了演講會場都會花時間去了解的. 如果是 ModernWeb 的場子,大多會是前端的人才, COSCUP 大多會是學生而各種不同的 Conference 都會充滿著各行各業的人. 「你如何透過他們的語言」將你的知識解釋給他們聽? 才是講者真正的功夫. 4. 為什麼? 怎麼做? 先建立好整篇文章(演講)的情境後,接下來就是你要文字(演講)的架構. 為什麼就會是一個很重要的問題,因為你的整篇文章都是圍繞著這個為什麼? 為什麼: 就是讓使用者省思,並且吸引他跟你一樣的思考 以下提供一些我過往的例子: 因為聊天機器人只會回答一般的文字,所以我們希望能幫他加上人工智慧 經常在外面看到一些物品不知道叫什麼名字? 幫你的聊天機器人加上 ImageNet 的人工智慧吧 這些都是「為什麼」你要怎麼做,他是一個 hook 可以鉤住讀者的目光.依照你的脈絡來開始閱讀你的文字. 而怎麼做就是比較有趣的部分,很多時候大家很急著把結果快速地寫出來.對於資訊相關人員而言,直接破題告訴你怎麼解決問題是沒有任何意義的. 因為必須要寫出來如何找到問題點,甚至如果能寫出 debug 的整個流程都是相當的好的. 5. 結果: 對於一般科學而言,這裡提到的是數據,歷史與結論.但是對於資訊從業人員而言,這裡可能就是某些解決方式或是某種現象. 比如說, 使用 Tensorflow 的訓練流程,透過 Kubernetes 來部屬你的服務方式. 6. 展望: 這個部分主要是討論在文章的後端,需要呼應到你一開始的「為什麼?」這個部份.對於資訊人員,舉例而言:了解了如何透過 K8S 來部屬你的服務之後,你必須馬上在文章的末端再給他加強印象.你可以透過 K8S 逐步將你手邊的應用程式方便的部屬,並且有 OOXX 的優點. 這個方式可以再三給讀者強烈的印象,前後呼應並且讓他深刻了解. 7. 感受: 連接者「展望」,讀者再三地強調「為什麼?」而做之後.就需要知道你希望他們產生的相關行動.一篇教導打造聊天機器人的文章,當然就希望讀者自己動作來寫一個.一個 K8S 部署的文章,會告訴讀者可以從哪個方向入手. 8. 參考資料: 這是我很習慣的部分,但是不少寫作的朋友可能都會忘記.附上相關鏈結可以補足你可能遺漏的部分.更可以讓讀者可以去閱讀更多的相關資料.也同時是鼓勵讀者回來回饋,如果有錯誤的話? :p 9. 圖文影音: 這部分屬於觀感部分,人類對於文字的吸收與記憶能力不如圖文與影音.所以可以的話,儘量加上一些圖片可以幫助讀者放鬆. 如何宣傳你的知識文章 文章寫好了,該如何宣傳你的文章? 這邊有幾個很值得分享的內容,你需要「三種關鍵角色來幫你推廣」: 連接者: 如果一篇 DevOps 的文章能夠放在 DevOps 社群的話,當然可以得到更多的讀者共鳴. 所以一個好的文章也需要好的地方「投放」. 專家: 如果你寫了一篇好的文章,你恰巧認識相關領域的專家.可以請他們幫你推薦.一本好的書,一定要能找到專家來寫序或是推薦文.可以為你的知識站台加分. 推銷員: 這邊講的不是像 Sales 那種推銷員,而是很喜歡分享內容的人.透過這樣的人可以讓你的文章獲得更多人的目光.更有可能他們還可能透過一些註解讓你的文章更吸引人進來. (ex: retweet, 臉書分享…) 建立個人知識品牌 這裡有建議的三個階段,快速的整理一下: 熱門平台做可行性測試: 透過 臉書, Twitter 上面直接寫文章的前言.來測試人們對妳話題的感興趣程度.如果很熱門,就可以放更多的心思將它完成. 建立自己渠道: 建立自己獨有的管道,不論是部落格,臉書粉絲頁面,或是社團討論區都可以.你需要建立自己在相關群組人裡面的專業形象. 與其他人合作: 不論是透過其他的社群,其他的討論版面.適當的擴大你的讀者群,是個重要的方向.你需要不僅僅讓你圈圈的人喜歡閱讀你的內容,更要讓不了解你領域的人試著閱讀你的文章. 心得: 這本書真的很棒,雖然大部分的內容都是筆者在通用科學與歷史偏重的泛科學的例子.但是我在閱讀的時候一直都轉換成資訊相關的內容,吸收起來格外的好.希望各位在讀的時候也能有一樣的感受.
繼續閱讀

[TIL][Golang] 修復 Golang BLE 在 MacOSX High Sierra 上面的問題

前言 Beacon 是具有藍芽連線的小裝置,通常裡面的格式為 Apple 的 iBeacon 或是 Google 的 Eddystone . 一般而言,要開發 Beacon 的話比較好的方式就是架設一個 Raspberry Pi 然後在裡面灌起來相關的藍芽模擬.但是如果你想要在 MacOSX 上面寫 Beacon 模擬程式的話,大部分的人都會使用 Bleno 一套由 nodejs 開發出來的藍芽套件. 支援夠好又熱門. Golang 是很方便的語言,不論是寫在後端或是系統上來說.當然我也會想說來寫寫一些測試 beacon 範例的. 三年前,我曾經寫了這篇文章 Golang BLE Eddystone 初體驗(包含Beacon模擬器) 的文章.但是事隔三年之後,由於 Mac OSX 的系統更新,整個部分已經無法正常運行,需要做修改. 在 Golang 上面要使用藍牙的相關工具,大部分人都是使用 paypal 所開源的 PayPal/gatt ,但是那個套件兩年沒有維護了.以下會簡單記錄一下出了哪些問題. tldr: PayPal/gatt 已經沒有在維護這個軟體.. Golang 要寫藍牙請用 https://github.com/go-ble/ble Mac OSX 改了什麼 首先 Mac 在 High Sierra 上面將藍牙設備名稱改名字(為何要這樣做?) 原本的名字是 com.apple.blued 但是到了 High Sierra 就改成 com.apple.bluetoothd 這樣導致了 PayPal/gatt 的 golang 套件無法順利運行.其實在 nodejs 的套件上面馬上就跟上了這個部分( nodejs bleno fixed ) Paypal/GATT 已經沒有在維護 回過頭來的老問題,這些問題其實不能解決也不難維護.但是 PayPal/gatt 由於沒有在維護了.其實相當的困難繼續開發,而且許多 fork 出來的專案似乎也沒有比較解決大部分的問題. 換 go-ble/ble 換過去整個流程還算簡單, go-ble 提供 Advertisement 跟 iBeaconAdvertisement.方便提供相關的轉換. 參考 paypal/gatt issue: Examples issue “Go pointer to Go pointer” ` GODEBUG=cgocheck=0 ./server` currantlabs/ble issue: Not working on macOS High Sierra Unhandled event: xpc.Dict{"kCBMsgId":4, "kCBMsgArgs":xpc.Dict{"kCBMsgArgState":5}} Tracking macOS High Sierra Support
繼續閱讀

[NodeJS][Golang] 玩玩看 LINE Beacon

前言 上週五去參加了 LINE 的技術者聚會活動,也同時聽到如何透過 LINE Beacon 來跟 LINE Bot 結合.於是決定把整個官方範例串接起來,並且將整個流程寫的更容易了解. LineBot Beacon 流程 在這個流程圖裡面,你可以看到整個流程有一點小複雜: 首先使用者的手機接受到 Beacon 的訊號後,手機會將藍牙訊號傳送到 LINE App LINE App 收到後,發送 Beacon hardware ID 給 LINE Server LINE Server 根據 hardware ID 轉發給相關的 LINE Bot (也附上該使用者的 token) 這時候 LINE Bot Webhook 就會收到使用者發送一個 beacon 的 event 跟據不同 Beacon ID 跟 Event (Enter/Leave) 來定義不同的反應方式 根據這樣的流程,可以知道以下幾件事情: Beacon 的控制的事情其實有限 (Enter/Leave) Beacon event 本身提供訊息也只有以下的部分 string Msg //beacon string string type //beacon type string hardware ID //beacon hardware ID to determine b 根據這些訊息,其實還是能做出很多有趣的運用就要看各位如何發揮想像力. 沒有 LINE Beacon 可以測試? 先試試看官方 nodejs 範例 官方範例: https://github.com/line/line-simple-beacon node 10 的 MacOSX 藍芽上似乎有問題 先來透過官方範例來看看,結果似乎有點問題 (20180825): internal/modules/cjs/loader.js:583 throw err; ^ Error: Cannot find module 'xpc-connection' at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15) at Function.Module._load (internal/modules/cjs/loader.js:507:25) at Module.require (internal/modules/cjs/loader.js:637:17) at require (internal/modules/cjs/helpers.js:20:18) at Object.<anonymous> (/Users/Evan/src/go/src/github.com/kkdai/line-simple-beacon/tools/line-simplebeacon-nodejs-sample/node_modules/bleno/lib/mac/highsierra.js:10:21) at Module._compile (internal/modules/cjs/loader.js:689:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10) at Module.load (internal/modules/cjs/loader.js:599:32) at tryModuleLoad (internal/modules/cjs/loader.js:538:12) at Function.Module._load (internal/modules/cjs/loader.js:530:3) 跟工程師討論的結果,似乎 node10 再 xpc-connection (也就是要跑 mac 藍牙的這個部分) 所以可能還是要使用 node8 是比較穩定的. 那來幫 nodejs 降版吧 如果你跟我一樣使用 Homebrew 作為套件的管理系統,那麼從 node10...
繼續閱讀

[Golang][LineBot][2018 更新部分] 透過微軟的語言學習服務 LUIS 架設具有 AI 對話的聊天機器人

前言: 這篇文章其實講解了兩年前為了去 COSCUP 弄的專案(https://github.com/kkdai/LineBotBabyLuis) ,因為當初其實也沒有花太多時間講解開發的內容. 並且也沒有講解如何實現. 如果有興趣當初演講內容的話,可以查看以下兩份投影片: 2016/08/24: Modern Web 2016: Using Golang to build a smart IM Bot 2017/04/27 iThome Chatbot Day: 透過 Golang 無痛建置機器學習聊天機器人 這篇文章主要講解最近一週,為了讓這個機器人復原所做的一些修改的部分.並且補充了 LineBotLUIS 的執行循序圖,希望讓有興趣的人能夠更清楚的了解. 關於 LineBotLUIS 的簡單介紹: LineBotLUIS (https://github.com/kkdai/LineBotBabyLuis) 主要是兩年前開發的實驗性質產品.那時候想要結合 NLP 學習的 AI 引擎 (MSFT LUIS) 並且透過 LineBot 的交互式對談的方式,能夠讓這個機器人做到自我學習. 整個機器人就是模擬一個小孩子啞啞學語機器人,大致上流程如下.細節可以再看(循序圖): 輸入小孩子講的話語 (e.g. shi shi, mi~ mi~, ㄋㄞ ㄋ ㄞ ..) 如果她已經學會了,他會告訴你以往的意圖.如果不會它會問你說這句話的意圖是什麼 你可以從 抱抱,牛奶,奶嘴或是玩具之中選擇一個小孩子可能的意圖.(可能就是你了解你小孩子想什麼之後) 然後透過 LUIS 就會學習到,並且之後打出類似的話語就會辨識出來小孩子的意圖. 聽起來很神奇?其實並不難… 架構與近期修改的部分: 這個部分除了 LineBot Webhook (https://github.com/kkdai/LineBotBabyLuis) 的相關處理外,另外還有一個要處理 LUIS API 的 LUIS SDK .這邊是透過我兩年前開發的套件 (https://github.com/kkdai/luis) ,並且也於日前將 API 升級到了 2.0 . 其實本來也沒有太大問題,不過主要是因為微軟日前已經將 LUIS 1.0 API deprecated 掉了.導致我必須將相關的 API 服務都改成 2.0 的服務. 最後, LineBot SDK 也有一些改動.兩年前的 Token 傳遞方式也有變動,造成我必須更新 LineBot Go SDK 的版本之外,其實他們對於 PostAction 的反應也有修改.這邊也會稍微提一下. 關於 LUIS v2.0 修改的部分: 講到 LUIS,就是微軟開發的語意學習引擎 (luis.ai),他將每一句會區分為 Intent(意圖) 與 Entity (物件) .而學習出來的機器模型會根據你輸入的 utterance(話語) 來 Predict(預測) 你的意圖. 先來提提 LUIS 改變到 v2.0 API 的相關修改: Training 跟 Publish 分開來,Training 後必須要 Publish 才能讓你的 Prediction 拿到最新的資料. Prediction 的 API 網址有變動.這邊比較奇怪的是,他不像是一般的 API 從 1.0 換到 2.0 而是整個網址換掉.並且跟其他的 API entrypoint 都不一樣. 其他還有就是要加入 Intent 變得更加的麻煩,不過還好 LineBotLUIS...
繼續閱讀

[Golang] 在 Kubernetes 上面透過 Go 開發 GRPC service 可能遇到的問題

前言: 之前為了幫公司的產品加上一個中間層的服務處理,需要把許多原先預設的 GRPC 服務參數都改掉,或是新增不少功能.在這裡整理一下,分享給大家. 本文會提供一個簡單的 repo 裡面有提到會使用到的一些功能,並且附上一個 Kubernetes 部署的 yaml 檔. Show Me The Code 不囉唆,先看 REPO https://github.com/kkdai/grpc-example 原先的 GRPC 服務開始擴展: 一開始,我們先以 Hello World 為範例,並且省略相關的部分. 一開始 SayHello 的範例建置好之後. 這個範例(hello world) 相當簡單,就是一個 SayHello 然後傳回一個回覆. 我們可能會開始收到其他的需求… 以下的需求最後將整合到一個範例 repo https://github.com/kkdai/grpc-example 1: 能不能一次送多個指令 (streaming request) 你可能收到需求,需要在原先的服務上面新增一個接口可以處理連續性的請求 (streaming request) .或是在處理資料的時候不要一次都處理完才回復,而是處理完其中一個部分請求就先回傳 (streaming response). 這是一個相當範例,可以看到 SayStreamHello 並沒有增加新的資料欄位.而是沿用舊的資料欄位 rpc SayHelloStreamServer (HelloRequest) returns (stream HelloReply) {} 在 proto buffer 裡面其實要改得很少,但是處理方式就不太依樣.以下開始放相關的處理代碼. 首先看 Streaming Server 的 server 端的部分 這邊稍微解釋一下,由於你將回傳的資料改成了 streaming 的結果.所以你必須要將資料一筆一筆的傳回去. 這段範例中,我加上了兩秒的 sleep 讓 streaming 更有感覺. 再來看 Streaming Server 的 client 端的部分 由於資料都是由 stream.Recv() 取出來,所以你需要做檢查是否資料傳完了沒.這裡是透過 err == io.EOF 來檢查. Streaming client 的部分,由於差不多請直接看程式碼 SayHelloStreamClient 2. 如何控制 GRPC service 的連線時間? 接下來能夠連續傳送資料之後,再來就是你會希望能夠讓你的 GRPC call 能夠更久一點.那麼你就會需要去修改你的連線方式. 這段程式碼裡面,可以看到 20*time.Second 就是我們連線的時間限制.你可以延長這個時間來達到增加呼叫時間,當然你也可以換個方式透過這個方式來控制你的時間限制. 3. 能不能大量的資料? 既然你的 GRPC 服務已經可以傳送大量的資料,那麼接下來就會有另外的需求: 能不能傳送相當大量的資料呢? 這裡定義的大量資料可能是超過 5MB 以上,因為 GRPC 預設的大小限制為 4 MB (source code) defaultServerMaxReceiveMessageSize = 1024 * 1024 * 4 那如果要修改的話,就依照以下的方式來修改. 這一段是要改成 server 將傳送的大小限制從 4MB 改到 8MB ,因為傳送資料是在 client –> server 這邊做第一次的控管,所以是由 server 來決定最多能傳送多大的資料.當然如果你希望 server 回傳資料可以傳大量的資料,就反過來要改在 client 當然,如果你想改 python 的 grpc server ,可以參考一下方式: 另外一方面.....
繼續閱讀