[Golang]將開發環境從sublime text切換到vim

##前言 主要是vim-go版號進步到了1.1,在社群裡面大家一面倒都使用vim來作為Go的開發環境.所以還是來試試看. ##安裝 初始VIM環境 清乾淨環境,避免之前有裝過太多plugin rm -Rf ~/.vim rm ~/.vimrc 安裝vim-pathogen 先要先裝vim-pathogen,這個可以幫助我們接下來要安裝的一些工具. mkdir -p ~/.vim/autoload ~/.vim/bundle && \ curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim 接下來要編輯vim ~/.vimrc: execute pathogen#infect() 安裝Vim-Plug 先裝vim-plug,來管理vim的plugin curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim 透過Vim-Plug安裝 Vim-go 記得還得編輯設定檔 vim ~/.vimrc 把以下加上去 call plug#begin('~/.vim/plugged') Plug 'fatih/vim-go' call plug#end() 還沒完,還需要啟動pluginstall vim :PluginInstall 他會把vim-go裝起來,透過vim 去打開go檔案,就會有基本的syntax highlighter 一些vim-go進階設定 根據vim-go作者建議,你可以把以下部分加上去vim ~/.vimrc: 打開各種syntax highlighter let g:go_highlight_functions = 1 let g:go_highlight_methods = 1 let g:go_highlight_structs = 1 let g:go_highlight_operators = 1 let g:go_highlight_build_constraints = 1 各種快速鍵,其中 代表的是 '\' au FileType go nmap <leader>r <Plug>(go-run) au FileType go nmap <leader>b <Plug>(go-build) au FileType go nmap <leader>t <Plug>(go-test) au FileType go nmap <leader>c <Plug>(go-coverage) 把go-fmt 換成 go-import 強烈推薦 :p let g:go_fmt_command = "goimports" 初始安裝完成 到目前為止,你可能會需要使用的功能如下(都是在vim下面) #Save it and check goimport result :w #Build current project :GoBuild #Run it :GoRun #Run Go Run directly \r #Run Go Build directly \b #Go to definition g d monokai 顏色配置 如果你跟我一樣喜歡sublime text的monokai配色,你一定要跟我這樣弄: 從fatih/molokai下載molokai.vim 到...
繼續閱讀

[Golang]如何處理多國使用者的網頁輸出

前言: 這裏整理一下,如何透過Golang來處理多國使用者網頁顯示的問題. 所謂面對多國使用者的時候,主要有一些問題: 如何根據不同國家顯示不同資料 如何根據不同國家顯示正確的時間資料 如何根據不同國家顯示以及儲存正確的字元集 我在這裡只把顯示的部分整理一下…. 判斷使用者國家語系方法: 透過使用者設定 這個是最簡單的方式,也就是使用者自己先設定好你所偏好的語言.類似Google一樣,然後所有的語言顯示就會依據你的顯示方式. 但是這個方式可能有以下的問題,某些服務可能不只有在內部使用者使用.有可能會邀請不同的使用者. 這時候要如何顯示正確的語言呢? 接著來看第二個判斷方式….. 瀏覽器回傳數值 每個瀏覽器都會提供Accept-Language這個Header參數可以提供網站來參考.它的細節在此. 以下列出我用Golang 抓出的三個我常用的瀏覽器結果,在繁體中文Mac OSX上面. Chrome: [zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4] Safari: [zh-tw] FireFox: [zh-TW,zh;q=0.8,en-US;q=0.5,en;q=0.3] // Parse accept-language in header to convert it as: tw, en, jp ... func ParseAcceptLang(acceptLang string) string { // 1. Chrome: [zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4] // 2. Safari: [zh-tw] // 3. FF: [zh-TW,zh;q=0.8,en-US;q=0.5,en;q=0.3] // // Ret: zh or en ... tarStrings := strings.Split(acceptLang, ";") if len(strings.Split(tarStrings[0], ",")) > 1 { return strings.Split(tarStrings[0], ",")[1] } return strings.Split(tarStrings[0], "-")[0] } 以上程式碼可以根據目前的Header的Accept-Language 內容轉換成 tw, en或是jp. 針對不同國家語系,顯示不同內容 使用javascript 顯示網頁部分 透過之前的ParseAcceptLang搭配著http.Request裡面的Header你就可以取出資料並且開始判斷與處理.這裏我使用的是martini跟 martini-render. func ShowDifferentResultByLang(r render.Render, res *http.Request) { var acceptLang string for _, v := range res.Header["Accept-Language"] { acceptLang = v break } outPutData.Lang := OutPutStruct{} //取得瀏覽器Accept-Lang設定 outPutData.Lang = ParseAcceptLang(acceptLang) r.HTML(200, "SOME_TMPL", outPutData) } .... //Web Template <script type="text/javascript"> var Language = "\{\{ .Lang \}\}"; DoSomethingWith(Language) </script> 這裡面的方法,就是要透過瀏覽器的回傳數值.透過JavaScript 來做相關的處理. 在JS裡面的細節我就不詳談了,這裡有一個詳細方法可以讓大家參考. 顯示不同的圖片 除了在網頁上面透過Java Script來顯示不同的內容之外,其實就算要顯示圖片也是可以透過不同的瀏覽器來給予不同的語言. 方法其實很簡單,就是必須要多開一個接口來幫忙處理圖形的處理部分. 這裏主要會用到的是 http.ResponseWriter的方式. func ShowLocaleImageByBrowser(params martini.Params, r render.Render, db *DB_Medium, res...
繼續閱讀

[年度計畫]52 Weeks, 52 Projects.... (持續更新)

前言 主要是因為看過https://speakerdeck.com/jeffersonlam/reflections-from-52-weeks-52-projects投影片之後想要跟自己挑戰. 條件與限制 一個禮拜一個專案 不限制專案大小,但是重構不包含其中. 不限制一定要建立新的專案,可以學習人家寫一樣的專案(但是要自己打造內容,而不是fork再來修改)。 不限制任何程式設計語言 真的沒點子嗎? 這一篇文章也不錯 Write code every day 進度 (會不斷更新) (06/25):Facebook Album Downloader: https://github.com/kkdai/goFBPages 一個抓取臉書相簿的小工具. 主要學習FB API跟檔案下載. (07/02): Instagram Downloader: https://github.com/kkdai/goInstagramDownloader 抓取Instagram的相片的小工具. 其實Instagram 不少眉眉角角,沒下去寫不知道他的分頁的設計其實相當有趣. (07/10): Facebook Album Client: https://github.com/kkdai/goFbAlbum 將小工具的API抽取出來成為一個元件,順便加上相關文件. 主要學習Travis CI 跟 GoDoc (07/18): Microsoft Translator: https://github.com/kkdai/mstranslator 發現不少特別的眉眉角角,先寫在心得裡面.這個工具可以幫助你使用一些基本的翻譯網路功能. (07/25): iloveptt 我愛批踢踢: https://github.com/kkdai/iloveptt 主要是學習corbra跟goquery. (07/31): Paxos: https://github.com/kkdai/paxos 學習如何用Go channel模擬網路通訊 (08/07): Bloom Filter https://github.com/kkdai/bloomfilter (08/15): Skip List: https://github.com/kkdai/skiplist (08/22): https://github.com/kkdai/pubsub A Redis pub/sub concept implement. (08/29) https://github.com/kkdai/webpic WebPic downloader (09/04) https://github.com/kkdai/jsonop A json operation library (09/12) https://github.com/kkdai/radix A simple radix tree implement in Golang (09/19) https://github.com/kkdai/dfa A Deterministic Finite Automata function implement in Golang (09/26) https://github.com/kkdai/nfa A Nondeterministic Finite Automata function implement in Golang (10/02) https://github.com/kkdai/e-nfa A Epsilon Nondeterministic Finite Automata function implement in Golang (10/09) https://github.com/kkdai/re2epsnfa A tranform function to translate RE to Epsilon-NFA (10/16) https://github.com/kkdai/cyk CYK algorithm in Golang (10/23) https://github.com/kkdai/pcp PCP: Post’s Correspondence Problems simple solver implement in Golang (10/30) https://github.com/kkdai/tm TM: Turing...
繼續閱讀

[Golang]關於MacOSX Desktop Notification(桌面提醒)

##前言: 想要寫一個小工具,可以把一些http link傳給下指令的人.卻又苦於一般CLI無法直接顯示Hyperlink.想說參考了一下gomon,不過卻發現原來MacOSX的桌面通知有不少方式可以顯示. ##可以發送MacOSX Desktop Notification的方式: [免費的] 透過Apple Script來發送 Apple Script 提供一個簡單的方式,可以在任何Application 或是 CLI的來發送通知. 不過他有一些缺點: 不支援HTTP LINK 不支援自訂圖片 無法自訂標題或是ICON 這裏有一個Golang 的小工具,有將Apple Script 整理過https://github.com/everdev/mack [免費的] 透過terminal-notifier terminal-notifier是一個由ObjectiveC與Ruby構成的小App,可以透過Homebrew來安裝. 雖然可以開啟URL,但是還是有以下的缺點: 無法自訂圖片 不支援ICON [付費] Growl Growl算是相當知名的Notification App,提供相當多的API給使用者使用. 這裏列出幾個Go的相關工具: go-gntp 透過Golang來呼叫Growl 的APIs Gomon 會幫你檢查source code並且回報給你.不過也是透過Growl來做的.
繼續閱讀

[MOOCS][Golang]MIT6_824 Distributed Systems Week3- About Paxos Algorithm

前言: 由於之前無論文有點久遠,先把論文瞭解的部分先寫成文章.之後再來把Lab3寫出來…. 這一篇主要是講Paxos算法的部分 MIT 6.824 分散式系統 系列文章 6.824: Distributed Systems [MOOCS][Golang]MIT6_824 Distributed Systems Week2(Lec2/Lab2A) [MOOCS][Golang]MIT6_824 Distributed Systems Week2(Lec2/Lab2A) [MOOCS][Golang]MIT6_824 Distributed Systems Week2(Lec2/Lab2B) [MOOCS][Golang]MIT6_824 Distributed Systems Week3- About Paxos Algorithm [MOOCS][Golang]MIT6_824 Distributed Systems Week4- 關於Consensus協定 Raft 學習(一): 簡介,資料格式與領導者選舉 ##論文-Paxos 先拿出一張各種的consensus的解決方式比較圖. 論文的原文,Leslie Lamport,(就是 LaTeX 中的”La”)在1990提出該演算法後,由於太難懂沒有受到重視.於是他又寫了一篇來解釋自己的演算法其實很簡單. 很有趣…. 共識問題 Paxose主要是要解決共識(consensus)的問題,這一個Quora舉了一個很有趣的案例討論什麼叫做共識(consensus),就像是婚禮的誓詞一樣. 神父: 新娘你願意嫁給新郎? 新娘: 願意 神父: 新郎你願意娶新娘嗎? 新郎: 願意 神父: 那..我宣佈你們成為夫妻 2PC (Two Phase Commit) 類似這樣就叫做共識問題,而一開始提出的解法就是2PC(Two Phase Commit) Vote-Phase: 由協調者(也可以稱為提案者,原本也是其中一個節點)提案所有節點(node),是否同意某個數值(或是交易).其中協調者需要詢問所有的節點,確認大家都是同意的. Commit-Phase: 當協調者確認全部人同意後,他會執行這個動作.並且也告訴所有的節點,要執行這個部分(數值或是交易) 缺點: 指令相當繁瑣,需要一共三次的溝通.如果有n個節點,就需要有3n的資訊往來. 協調者 -> 節點 (是否同意?) 節點 -> 協調者 (我同意) 協調者宣布提案成立 任何一個節點的失敗不會造成該提案失敗,但是如果在詢問的過程中協調者忽然離線了.其他的人就無法知道狀況與結果. 為了避免協調者離線的問題,於是乎有了3PC的方式 (Three Phase Commit) 3PC (Three Phase Commit) Phase 1: 跟Vote-Phase一樣,協調者會問所有的節點. Phase 2(新步驟): 協調者取得所有人的共識後,會發送一個”Prepare to Commit”的訊息給所有的節點.這個動作的重點是,告訴所有的節點我們已經取得所有人的共識.要開始執行提案.(表示該提案已經成立,不會退回).此時所有節點也會回傳給協調者告知是否有收到. Phase 3: 跟Commit-Phase一樣,協調者會執行提案後也告訴所有節點要執行該提案. 解決的問題 如果在3PC的狀況下,如果在Phase 2發生了協調者離線(crash),新的協調者只要重跑一次Phase2 即可,不需要重新詢問Phase 1. 如果是在Phase 3發生crash,由於已經收到回應確認全部人都已經有收到Prepare to Commit.所以新的協調者繼續執行最後步驟即可. 缺點 雖然3PC解決了重大問題,但是還是存在一些問題如下: 步驟變得更繁瑣,需要訊息量也從3n變成5n (2 + 2 + 1) 無法解決如果網路發生問題造成某些節點以為還在第二步驟,某一些節點卻又到了第三步驟. Paxos Algorithm (Image comes from here) 為何我們需要Paxos Algorithm? 雖然解決了協調者crash問題,但是無法結果Partition Failure.也就是由於某些網路問題造成數個節點離開.(或是中間節點鍛造成兩個子網路)這也是所謂的 Partition tolerant algorithm.(尤其現今網路的狀況,這種情況更容易發生) 原來不論是在2PC或是3PC討論的都是協調者失效後,由其他人來替代的方案.但是現在要討論的是,節點失效後採取的復原方式與相關的處理.這樣會更有效用.根據原文也就是說 3PC是 fail-stop resilient但是比較需要的應該是fail-recover resilient. 關於Paxos的起源與假設 Paxos主要是根據Lamport所提出的一個寓言故事,也就說個古希臘愛琴海上的被稱為Paxos的小島的故事.根據該小島議會制度所提出的演算法,裡面有幾個主要的假設: 小島上的人忙著經商,所以不會一直在議會裡面.也就是共識可能是在大家不一定全部都在的狀況下產生.所以他只需要大多數的人同意即可. 不會有拜占庭將軍問題(也就是一個訊息被傳遞兩次的問題).而且訊息不管要經過多久,都會被傳到. Paxos小島上的人性本善,基本上提出的提案都會被同意. 主要運作原理: 某些層面跟2PC很類似,但是主要精神不同: 選舉出一個leader(或是提案者) 提案者提出一個提案(acceptor)傳給大家(這個訊息稱為acceptor-request)在一個限定的時間內(a given time). 不同於2PC,Paxos只需要大多數的人回覆同意即可繼續發送commit message給所有節點 如果leader(提案者)failure? 由於原本2PC方式沒有辦法處理leader錯誤的狀況.在這裏Paxos提供以下兩個機制來處理: Assign...
繼續閱讀

[MOOCS:edx]BerkeleyX CS100.1x- Introduction to Big Data with Apache Spark (四)

前言: 最後一週,只有Lab.而最後一個Lab其實也接著之後的進階課程Scalable Machine Learning. 所以最後一次的Lab開始介紹Spark關於Machine Learning的部分.喜好電影預測是個很有趣,很實用的課題. 相關文章 edx 課程網址在這裡 https://www.edx.org/course/introduction-big-data-apache-spark-uc-berkeleyx-cs100-1x [MOOCS:edx]BerkeleyX CS100.1x- Introduction to Big Data with Apache Spark (一) [MOOCS:edx]BerkeleyX CS100.1x- Introduction to Big Data with Apache Spark (二) [MOOCS:edx]BerkeleyX CS100.1x- Introduction to Big Data with Apache Spark (三) [MOOCS:edx]BerkeleyX CS100.1x- Introduction to Big Data with Apache Spark (四) Lab4 - Predicting Movie Ratings 這一次的Lab主要是要做透過使用者對於喜愛電影的評分,加上從MovieLen上面超過10M資料抽出50萬筆一般大眾的評分資料.來預測你可能會喜歡的電影.運用的技術是所謂的“協同過濾”(Collaborative filtering)的方式來達成. 簡單的概念就是: 如果一般人喜歡A電影的同時,大多也喜歡B電影.當你輸入你喜歡A電影的時候,系統就會預測出你可能也喜歡B電影. 上面的圖片可以有一個簡單的概述,也就是透過以下流程達成: 建立參考數值(也就是我們所認知的一般人喜好) 計算每部電影的平均評分跟評分個數 找出500個評分以上的資料.這些資料要來當作預測數值衡量基準. 訓練模型 找出訓練的資料群組 針對Matrix Factorization Model的資料類型,Spark提供ALS.train的方式來train 計算出預測出的RMSE(Root Mean Square Error),也就是與大眾偏好的偏差值 當預測數值越精確,RMSE會越趨近於零.反之,越趨近於一. 透過rank的變化,挑選出最好的模型(RMSE最低的)來進行下一個階段 預測你可能會喜歡的電影 輸入你對於電影的評分 透過ALS.train預測結果 心得 關於最後的Lab,一開始還稍微卡住.不過跟一些人請教之後.一下子就把最後的Lab寫完. 我才發現其實Spark的使用上並不會困擾我,我反而是困擾在Python的Lambda運用. 因為題目裡面很多都只給一個. 但是當你不熟悉Lambda的時候,你就只會用很多行的方式來解決. 如果可以熟練使用Lambda的方式,更可以搭配著Spark的一些transform (map, filter, flatMap 或是 reduceByKey…) 來解決更多的問題. 有人推薦這本Data Science from Scratch principles Python似乎也蠻適合我這種對於Data Science完全沒有概念的人. 關於這本書的範例程式在這裡可以找到. 相關鏈結: Movie Lens Wiki: 協同過濾 Wiki: Collaborative filtering Book: Data Science from Scratch principles Python Python Data Science Sample Code fro Book “Data Science from Scratch principles Python”
繼續閱讀