程式設計週記[2016/04/23]: 程式語言是好工具,所以可以掛牆上 (誤)

圖片來自: .@proppy is explaining why Haskell is a tool the way soldering iron is a tool. pic.twitter.com/Fv722CUOtp— JBD (@rakyll) April 18, 2016 這是什麼? 程式週記主要內容如下: Gihub project 介紹: 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢 網路文章心得: 會寫些心得,強迫自己閱讀. “程式週記”並且定期週期性更新. 大部分內容在我的twitter都會有,這邊只是將一些簡單的心得與感想註解一下. 本週摘要 本週大部分時間再看 KMP 字串比對演算法的進階使用 ACA 演算法,還有玩玩 VS Code. 反而比較少時間看一些網路文章. 單純紀錄就好. Go SHRINK YOUR GO BINARIES WITH THIS ONE WEIRD TRICK 這篇教導你透過 go build -ldflags="-s -w" 來將你的 go app binary 變小,根據這篇文章說可以縮小到七倍,似乎有點誇張.不過可以關注看看,瞭解一下方法. Go Conference 2016 Spring 04/23 在日本舉行的 Golang Conference ,可以看看有沒有什麼有趣的文章. High-precision indoor positioning framework for most wifi-enabled devices 透過 WiFi 的技術來做高精度的室內定位 A modern and intuitive terminal-based text editor Micro 一個現代又直覺的 terminal-based editor ,支援基本的一些熱鍵組合與 75 種 syntax highlighter paper An Implementation and Analysis of a Kernel Network Stack in Go with the CSP Style 網路有關的論文,裡面是用 Golang JVM Akka.Actor to Go Akka Actor for Go A TOTP-based, PiFace powered door lock for Cork’s Forma Labs biohackerspace. Door lock wite full in Go Python Python Taipei Meetup note@Just for noting 紀錄的蠻好的,連 slide...
繼續閱讀

[字串比對演算法] 從 KMP 到下一個階段 Aho–Corasick (Algorithm) Automation

前提 前一篇文章介紹到字串比對的演算法 KMP 那時候在 Twitter 上面就有人介紹我說其實可以繼續去研究字典樹 (trie) 與 Aho–Corasick Algorithm @Evan_Lin KMP + Trie 的概念可以延伸成 AC-Automaton 單文本多模板匹配自動機,有興趣可以研究看看 https://t.co/v87XrLLiwT— Quexint  (@Quexint) April 15, 2016 所以就開始研究這一篇 slide 想不到意外的有趣.於是也把本週專案也決定改成 AC Automation . 本週專案: Aho–Corasick algorithm automation implement in Golang 開始介紹 Aho–Corasick Algorithm (AC Algorithm) 為何需要 AC Algorithm? 原先在 KMP Algorithm 我們解決了可以在一個長字串 (haystack) 裡面找到所有具有單個字串 (needle) 的位置集合. 並且可以把時間複雜度縮小到 \(O(n + m)\) 其中 \(n\) 是 haystack 的字串長度,而 \(m\) 是 needle 的長度. 那麼.. 問題來了: 如果我們要比對的 needle 是多數個呢? (比如說掃毒程式) 那這時候時間複雜度就會變成以下狀態: ( 題外話: 參考這篇可以在 Jekyll 裡面加上 Latex ) 以下是時間複雜度的推導過程: TL;DR \(O(n + km)\) . 透過 KMP 如果要處理多個搜尋字串的時間複雜度 要尋找字串集合 (needles) \(P\) 其中 \(P = { P_1, P_2, ... P_k }\) 目標字串 (haystack) \(T[1 ... m]\) 在 KMP 之中,我們已經知道要計算一個 needle \(P_i\) 的時間複雜度為 \(O( n_i + m)\) 所以要處理多個字串 \(P\) 就必須要經過: ( Latex 有點忘記,詳細推導後補) \[\begin{align*} ((| P_1| )+ m) + ((| P_2| )+ m) + .... ((| P_k| )+ m) &= \sum_{i=1}^k | Pi | + k*m \end{align*}\] AC Automation 的時間複雜度 先講結論,要能夠比...
繼續閱讀

[Golang] 深入研究 Visual Studio Code for Golang

前提 Visual Studio Code (以下簡稱: VS Code) 是微軟的跨平台的開源 IDE ,目前已經進入了 1.0 的正式版本. 由於功能強大,預設就能 debug python, node.js 與 java script .玩了一兩天,將所有與 Golang 相關常用到的情境加以記錄下來,希望能夠幫助到某些人. 阿鬼,你還是講英文吧!! 第一次安裝 VS Code,會發現他有一個相當”貼心”的功能.就是他會幫你的 IDE UI 選取到中文介面. 貼首先,先修改 locale 將”中文” VS Code 改回英文介面: 按下 F1 點選 “設定語言” locale 改成 “en-US” 重啟 VS Code 安裝 vscode-go 安裝 VS Code 1.0.0 以上版本 cmd-shift-p Install Extension Go vscode-go 基本設定 cmd + , 如果你使用 homebrew 可以設定 "go.goroot": "/usr/local/opt/go/libexec", 如果不是記得將該目錄指向 $GOROOT 常用熱鍵: (F1 或是 Shift + cmd + p) command palette: 呼叫出命令列,可以跑一些 IDE 的指令:比如說安裝 extension 那類的. (F2) Rename (gorename): 可以快速幫你把整個專案裡面的變數修改名稱,就像是 VS 跟 XCode 裡面的 Refactor. (F5) Debug : 直接幫你 compile 目前的專案,並且直接進入 debug 模式.就像是 VS 一樣,使用起來相當的方便. 並且可以透過以下的 hot-key 來進行 debug : F5 continue F10 step over F11 step into SHIFT+F11 step out (目前 delve 尚未支援) SHIFT+F5 stop (F8) Go to Next Error or Warning: 可以快速切到如果有任何 error 或是 warning 的部分. 要切換到前一個,可以試著 (Shift + F8) (F12) Go to Definition (godef): 跳到 function 定義的地方,就如同 VS 裡面的 F12...
繼續閱讀

[TIL] 使用Visual Studio Code 來 Debugging Golang

VS Code Debugging for Golang: 前幾天正式邁入 1.0 的 VS Code,不少 Redit 上面有討論到似乎很好用? 其實 CS Code 的 Golang debugging 就已經很吸引人,但是因為MacOSX上面要使用 Delve 需要跑 Codesign流程 實在很煩人. 最近有兩個 Golang IDE 的更新都圍繞 delve VS Code 正式邁入 1.0 LiteIDE 釋出新的版本 X29 也是支援 delve QT5 支援 於是週末很認真的把 delve 好好的設定起來. (Mac OSX 上面的codesign 實在有點討厭) 依照官方作法,一直會失敗而無法讓 delve 無法正常載入就會出現 "delve could not launch process: could not fork/exec" 重新跑了兩次,在灰心的狀態下重開機.. 竟然就成功了.. 原來設定完 codesign 一定要重開機… 原來設定完 codesign 一定要重開機… 原來設定完 codesign 一定要重開機… 全部金鑰簽署的設定流程 以下提供中文版本的設定方式,避免有人看不懂:( 如果我沒有特別寫的,請盡量就不要改) 打開「鑰匙圈存取」的系統App 選單「鑰匙圈存取」-> 「憑證輔助程式」-> 「製作憑證授權..」 “名稱” -> 請打入 “dlv-cert” “識別身份類型” -> “自簽根 CA “ “使用者憑證” -> “代碼簽名” 選取 “覆蓋預設值” 點選 next 第二頁,憑證資訊有效日期: 從 365 -> 3650 “簽署邀請” 取消點選 點選 next 個人資訊: 不改->點選 next 密鑰配對資訊: 不改->點選 next 為此 CA 使用者指定密鑰配對資訊: 不改->點選 next 此 CA 的密鑰用法擴充欄位: 不改->點選 next 此 CA 使用者密鑰用法擴充欄位: 不改->點選 next 此 CA 延伸密鑰擴充欄位: 不改->點選 next 此 CA 使用者延伸密鑰擴充欄位: 不改->點選 next 此 CA 基本限制擴充欄位: 不改->點選 next 此 CA 使用者基本限制擴充欄位: 不改->點選 next 此 CA 的主題替用名稱擴充欄位: 不改->點選 next 此 CA 使用者的主題替用名稱擴充欄位: 不改->點選...
繼續閱讀

程式設計週記[2016/04/15]: 本週幸運數字是8 : F8 與 KB8

這是什麼? 程式週記主要內容如下: Gihub project 介紹: 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢 網路文章心得: 會寫些心得,強迫自己閱讀. “程式週記”並且定期週期性更新. 大部分內容在我的twitter都會有,這邊只是將一些簡單的心得與感想註解一下. 本週摘要 本週主要在玩 Bot Framework 跟 wit.ai .主要是想把它改寫成 Golang 版本的. 寫到一半發現由於 wit.ai 已經是兩三年前就發行了.(也沒啥在更新,這次F8 只是講說 Messenger 以後會支援) .就改來寫 KMP. 既然要寫 KMP 當每週專案,當然要搞清楚他的原理跟他要解決的問題.當然也去想了一下應用. (好像也只有 strstr 跟 strchr ). 我加入了碼天狗策展團隊,文章會在下一期(下週一出刊的版本)上.有興趣的可以看看. Go Golang 1.6.1 & 1.5.4 Security update 修復兩個主要的安全漏洞的更新版本: 1.5.4 與 1.6.1 將會在 04/13 02:00 UTC 更新,有需要的朋友記得更新. 安全漏洞如下: 點這裡 此外: json decoder 導致https的速度提升修改,將不會在這次的更新中. Binary Sizes in Go 文章探討到如何縮小你的 Golang App Binary Size,裡面除了用到 -ldflags '-w' 之外,還有用到 unix strip . 結果 Dave Chenney 不建議 strip.其他可以參考 reddit An Enterprise-class Container Registry Server based on Docker Distribution 除了官方的 Docker Registry Server 之外,有人另外寫了一個具有以下的衍生功能: Role Based Access Control: Users and docker repositories are organized via “projects”, a user can have different permission for images under a namespace. Graphical user portal: User can easily browse, search docker repositories, manage projects/namespaces. AD/LDAP support: Harbor integrates with existing AD/LDAP of the enterprise for user authentication and management. Auditing: All the operations to the repositories...
繼續閱讀

[TIL] 有關字串搜尋的演算法: KMP

TL;DR KMP(Knuth–Morris–Pratt algorithm) 是字串搜尋的最佳化演算法,是由 MP Algorithm 優化而成,並且 KMP Algorithm 主要也只能解決某些問題 (要搜尋字串連鎖過多造成過多移動) . 暴力法 -> MP (提供比對與快速移動的方式) -> KMP (提供連鎖的減少移動方式) 相關程式 如果需要可以執行的相關 MP KMP 程式,可以去拿這個 Go 的版本. https://github.com/kkdai/kmp 前言 紀錄一下關於 KMP 的學習紀錄,會講到 KMP(Knuth–Morris–Pratt algorithm) 主要就是因為一篇 DevOps 的求職文章. 所以決定去把它搞懂一下,順便寫一下相關程式. 注意 以下的部分由於我懶得畫圖,就沒有圖表介紹.如果要看圖表或是影片. 這一對教學影片很清楚. youtube: Knuth–Morris–Pratt(KMP) Pattern Matching(Substring search) 原理 KMP(Knuth–Morris–Pratt algorithm) 本身是用來做字串搜尋的演算法.也就是有點類似 C 語言本身會提供的 strstr 也就是在一個字串裡面搜尋一個字串. 當然 KMP 跟 strstr 有些許的不同由於回傳的資料不同. KMP 回傳所有符合的索引位置,而 strstr只回傳第一個. 字串搜尋: 方便以下講解,字串 target 為我們的目標字串, want 就是我們想要找出的字串. 其中: n = len(target) m = len(want) 暴力搜尋 解決問題: 講到在一個字串裡面要搜尋一個比較小的字串.比較直覺方式就是暴力法,也就是一個個比對. 方法論: 從字串 target 的第 i 個位置開始找 ( i 從 0, 1, … n ) 如果 target[i] == want[0] 則繼續往下比對,一直比對到整串字串比對完畢. 如果不成功,將指標移到 target[i+1] // 1 // Target [ 1 2 3 4 7 4 5 6 7] // Want [ 5 6 7 // 2 // Target [ 1 2 3 4 7 4 5 6 7] // Want [ 5 6 7 ] // 3 // Target [ 1 2 3 4 7 4...
繼續閱讀