[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”
繼續閱讀

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

前言 剩下兩週了,不過家中寶貝誕生.必須要把時間做更好的調配,才能完成這個課程. 相關文章 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 (四) Lecture 7 Data Management Data Clean: Deal with: Missing Data Entity Resolution Unit mismatch 對於現實世界中數值可能出現的Dirty Data分為以下各種: 失真(distortion): 當發現在連續作業中的某段資料不見的時候. 選擇性偏差(Selection Bias):由於樣本的選擇不同,所以得到差異相當大的數值.比如說訪問政黨傾向不同得民眾.這裡有更詳細資料. Left and Right Censorship: 由於樣本不斷地來來去去,不能知道樣本是否有跑完所有採樣流程. 相依的(Denpendence): 每個樣本應該是比次獨立,但是有一些沒有而造成資料的偏差. Data Gathering的重要性: 資料在取得的時候存在許多發生錯誤的可能性,比如說硬體或軟體的問題或是欄位的問題..等等 若是能在取得資料的時候做一定程度的驗證,可以讓資料精確度更高. 其他名詞解釋: Big rot: 資料超過一定時間的沒有數值跟精準度. Data Delivery可能發生的問題與解決方式: 資料遺失或是毀損: 透過可信賴的傳輸方式或是透過Relay,也可以增加checksum來增加資料傳遞的可信任程度. 資料來源的相依性與可信任程度: 必須跟資料提供者有相當程度協調與協議. Lecture 8 Exploratory Data Analysis and Machine Learning 敘述性統計(Descriptice Statistics): 透過統計數量來對事件作敘述,比如說,本班的成績平均. 推論性統計(Inferencial Statistics): 透過收集到的統計數字,對事件作一定的推論.比如說,選前問卷調查. 探索性數據分析(Explortory Data Analysis): 透過先行的探索來進行數據的分析,進行的活動可能有以下數種: Visualizing the data distributions Calculating summary statistics for the data Examining the distributions of the data Rhine Paradox: 找了一千個人來猜連續十張為藍色或紅色的卡片.進而判斷出不能告訴超能力的人他有超能力的心理分析結果. Rhine’s Error: 但是真正的錯誤是,由於要猜測10張完全顏色一樣的機率為1 / 2^10 =>(1/1024) 也就是說一千個人要猜對一次也不到1個.其實要講解的是對於數據的不清楚造成錯誤的結論. Spark Machine Learning Toolkit(mllib): 提供許多功能比如說分類與回歸分析或是一些數值分析的工具. Lab3 這次的Lab3更加深難度的要讓我們學習Text Analysis 跟 Entity Resolution並且有提到“詞袋模型”(Bag-of-words model),裡面有幾個比較需要注意的地方: 關於 python dictionary 的 lambda: 這次比較困擾我的,其實是Python 的dict...
繼續閱讀