這陣子

這陣子做了幾件事: 成功嶺秋令營 開始工作 從 Pelican 搬到 Ghost 開始工作後沒多久,就想著應該要繼續寫 Blog ,最主要是能紀錄工作上碰到的問題,其次寫點東西也好。從成功嶺下來只有兩個多禮拜,卻覺得過了好久,跟以前很不一樣了呢。最顯著的差別是宵夜,上班後就幾乎沒在吃宵夜了,總想著要快點睡,不像以前十二點一到就餓慘。 至於為什麼要從 Pelican 搬到 Ghost ?倒也不是 Pelican 不好用,只是覺著要有個編輯器,打起來比較舒服。除了這點,其他的大概沒什麼變,一樣是 host 在 github page 上。 在搬家的過程遇到一點障礙,可能是 Pelican 的用戶太少了,所以沒有現成的 pelican -> ghost migrator,雖然舊的文章也沒幾篇,但我畢竟是個念舊的人,少歸少總得接過來,於是…

Intro to Scrapy, CrawlerSpider

前言 以前自己寫爬蟲,由於 scale 都很小,所以也沒考慮要用 framework,都很單純的使用 requests + BeautifulSoup 來完成。這次突然興起想把唐詩宋詞都爬下來,就拿來練手練手。至於為什麼要爬唐詩宋詞?那又是另一個故事了... 1. 環境配置 為了不讓本身的環境紊亂,我都習慣先開一個 virtualenv ,並把需求寫在 requirements.txt 裡面,一來比較清楚明瞭,二來也可以指定版本號。 mkvirtualenv crawler # 產生環境 workon crawler # 切換到該環境 deactive crawler # 跳出該環境 以上是大致上會用到的指令,至於如何在你的作業系統上安裝 virtualenv這個部分就不贅述了。 再來就是比較主要的部份,安裝這個範例要使用的package。 pip install Scrapy peewee peewee 可以選擇裝或不裝,後面範例是用 sqlite 來操作的。 2.…

Redux 架構下實作 Async Actions

最近專案開發上使用了 reactjs ,並採用redux架構。而依照 javascript 的特性,你沒辦法假設他會將指令執行完才繼續下一道指令,所以要怎麼做到多個 Action 異步處理呢? 舉個例子,當你 update 一份資料以後,希望他能隨後就 fetch 回來,以確保 state 裡面都是最新的資料,直觀的來寫會是這樣,但眼尖的你一定會發現不太對勁。 export const fetchData = createAction('FETCH_DATA', APIUtil.fetchData); export const updateData = createAction('UPDATE_DATA', APIUtil.updateData); this.props.updateData(data); this.props.fetchData(); // not latest result 它不會等 updateData…

Procmail 搭配 Script

我們每天都在收信,那有沒有某些信件是你想挑出來,特別處理的?有的話可以使用 procmail 這個程式來幫你。 首先你家目錄下的 .forward 檔案內容必須是 "|/usr/local/bin/procmail" 確定信件會被 pipe 給 procmail 處理。 那現在重點會擺在 .procmailrc 這個檔案,這裡只會粗淺的講一下實現「用 procmail 將信件傳遞給 script 執行」。 假設我想要將從 ken8203@love.com 寄來的信傳至 mail_processing.py 做處理 :0Wc: * ^From.*ken8203@love.com | /usr/local/bin/python $HOME/mail_processing.…

Scikit-learn Combining Classifiers

跑 Classification 的傳統方式是決定一個 Classifier 後,透過 feature 的新增或是參數的調整,來提高準確率;而另外一個方法就是集百家之優來改善預測的結果-Essemble。 今天要介紹的是用 Voting 的方式來決定預測的結果,當然這只是 Essemble 中的其中一種,還有很多其他的方法。 Scikit-learn 的 Voting 分為 hard 與 soft。 Hard 簡單來講就是多數決,例如: # of classifierprediction1class 12class 23class 14class 3 這樣預測結果就會是 class 1。 Soft 這會依照預測出來每個 class 的機率乘上你給的權重(weight)來做定奪,例如:(w1=w2=w3=1) # of classifierclass…

如何架設 MySQL Cluster

MySQL Cluster提供無共享(shared-nothing)的叢集以及自動分片(auto-sharding)的功能,並且具備 High Availability 以及 Scalability 的特點。 *什麼是 shared-nothing?這是一種架構,在此架構下,每個節點都有自己的 CPU 、記憶體、空間,而跨節點之間的數據往來通常透過網路來完成。 以下使用 VM(Ubuntu) 來操作。要架設功能完整的 MySQL Cluster 至少需要 3 台 VM,一台 Management Node 以及兩台 Data Node 。 Management Node 的存在可以避免 Split-Brain 的情況發生,而兩台 Data Node 是為了 Availability ,MySQL Cluster…

Scikit-learn 的 DictVectorizer 怎麼使用

以往使用的機器學習(Machine Learning)工具都是 LIBSVM,而這次因緣際會用了 Python 的 scikit-learn,卻不知道如何使用自己的 Feature,剛好來記錄一下。 scikit-learn 很強大的內建了幾種 Feature generator,像是 CountVectorizer、TfidfVectorizer...等等。而 DictVectorizer 則可以搭配自己的 Feature ,用法如下: from sklearn.feature_extraction import DictVectorizer vectorizer = DictVectorizer(sparse=False) features = [ {'feature_name_1': 1, 'feature_name_2': 2}, {'feature_name_1': 3, 'feature_name_…

使用 Python 處理中文 JSON

最近在處理大量的中文 json 檔案,一直遇到編碼上的問題,相信大家也都有遇過, UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-10: ordinal not in range(128) 也就是 ascii 無法順利編碼,最後得到了一個解決方法:調整 ensure_ascii 參數以及使用codecs。 我們用example.json當做範例: [ { "category": "數位生活", "content": "

Pelican Custom Syntax Highlighting

不久前將我 code block 改了個樣子並且加上行號(line number),自己是比較喜歡現在這樣。所以這篇就來講一下,要如何客製化 code block 這個部分。 要做到這些事情得仰賴 Codehilite 這個套件,它可以藉由 linenums 這個選項自動產生行號,並產生既有的結構方便規劃,能節省許多時間。 首先我們在 pelicanconf.py 裡頭加上 MD_EXTENSIONS 這個參數。 :::python #! pelicanconf.py MD_EXTENSIONS = ['fenced_code', 'extra', 'codehilite(linenums=True)'] 拿上面的程式碼舉例,設定完 MD_EXTENSIONS 後你產生的 code block 結構會如下,因此得知要修改的 css class…

Mac 上安裝 OpenCV

OpenCV 是圖像處理裡面很猛的一個套件。之前用純 make 去安裝,每每碰壁,於是我發現 Homebrew 的美好,來記錄一下! 安裝 / Installation 在開始之前,當然要確定自己有[Homebrew](http://brew.sh/)。 首先使用 doctor 檢查自己的 brew 有沒有問題 :::bash $ brew doctor 然後要轉移到 science 的倉庫裡 :::bash $ brew tap homebrew/science 接著就可以安裝 OpenCV 了 :::bash $ brew install opencv 再來換到 OpenCV 的目錄底下(要注意自己 OpenCV 的版本) :::bash $ cd /usr/…