發表文章

[Linux] Ubuntu supervisor file descriptor limit

因為常常在 Linux 下寫 Code, 也常常寫不少 daemon 服務 之前都習慣用 Supervisor 這隻程式來管理眾多 daemon ( http://supervisord.org/ ) 結果最近發現我有一隻 daemon 服務的 connection 會連不到 想說覺得奇怪, 去 /proc 底下檢查這隻程式的 fd 資料夾發現不多不少就是 1024 個, 這果然有問題, 八成是 connection 爆了 可是用 supervisor 啟動的程式, 要如何可以讓他使用更多的 file descriptor? 查了一下 Supervisor 的 Manual: http://supervisord.org/configuration.html 裡面還真的有一個 config 設定可以調整 file descriptor: ( http://supervisord.org/configuration.html#supervisord-section-settings ) 有一個設定值是 minfds, 預設 1024, 可以修改成你想要的 果然, 更改 /etc/supervisord.conf 儲存之後, 重新啟動 supervisor 就可以了 sudo service supervisor restart 打完收工

[Python] docopt

今天因為要在程式加上 optionParser 發現 python v2.7 不支援了 只好找尋其他 library使用, 我也知道其實早就有 argparser 可是就覺得他好難用, 當初要寫他文件就寫得很零碎 今天 google 了一番, 發覺有個東西叫 docopt , 好像好好用阿, 就來試用一下 一用之下, 真是令人清爽, 而且強迫你建立好習慣, 是個好 library Official site:  http://docopt.org/ pip:  https://pypi.python.org/pypi/docopt

[Python] list flatten

最近剛好碰到需要做 list flatten 的行為 網路上查了一下, 順便做了一點不專業的比較 故事是這樣的 今天我有一個 list 中的 list tmp_list = [[1, 2, 3, 4], [5, 6, 7, 8]] 我今天想要做的事情就是把他平扁化, 也就是變成 [1, 2, 3, 4, 5, 6, 7, 8] 查到有兩種作法 1. 利用 itertools import itertools list(itertools.chain.from_iterable(tmp_list)) # [1, 2, 3, 4, 5, 6, 7, 8] 正當我覺的還要多 import module 不太滿意的時候, 看到了第二種作法 2. 利用 sum sum(tmp_list, []) # [1, 2, 3, 4, 5, 6, 7, 8] 頓時讓我覺的好聰明阿, 不過一般人來講應該會寫的第三種 3. 利用 list comprehensive [item for sub_list in tmp_list for item in sub_list] # [1, 2, 3, 4, 5, 6, 7, 8] 那順便做一個大的 list 來試試看哪個比較威XD import itertools def make_list(): return [range(100) for i in range(1000)] @profile def merge_iter(tmp_list): return list(itertools.chain.from_iterable(tmp_list)) @profile def merge_sum(tmp_list): return sum(tmp_list, []) @profile def merge_comph(tmp_list): return [item for sub_list in tmp_list for item in sub_list] if __name__ == '__main__': tmp_list = make_list() merge_iter(tmp_list) m...

[Python] Python 入門 - Coursera

好像很久沒有更新網誌(汗) 最近也有一門 Coursera 的 Python 課程開了 有興趣從基礎開始學的的人可以去看看 是美國 Rice 大學開的課程: https://class.coursera.org/interactivepython-004 裡面使用線上的 python 來教學 : http://www.codeskulptor.org/ 有興趣得人可以去看看, 完全不會 Python 的人很適合去學

[Python] Virustotal api using python

圖片
雖然本身接觸到不少病毒資料, 不過每次都靠上傳檔案到 Virustotal 實在非常的沒效率 寫程式用 url upload 也不是不行, 不過其實他是有釋出 API 可以用的 一般帳號的 API 規定 1 分鐘最多 4 個 request, 而且是透過 http post 的方法且回傳是 json 格式 ( The chosen format for the API is HTTP POST requests with JSON object responses and it is limited to at most 4 requests of any nature in any given 1 minute time frame  ) 這篇參考的是他的 API 教學頁面, 做一個簡易的上傳跟擷取講解 (目前時間大約是 2013/12/23) Official Source:  https://www.virustotal.com/en/documentation/public-api/ 而使用他的 API 需要 API key, 這需要先註冊帳號才可以 首先, 英文版右上方有一個 Join our community (中文是加入我們社群) 依序填完相關資料即可, 這邊應該是沒什麼太大的難度 但是注意信箱要填正確, 他會寄確認通知, 等點了確認通知信之後才會正式開啟 之後到 virustotal 登入, 點右上角的帳號選擇 profile, 就會出現一些相關訊息, 點API就會看到API KEY 中間那個 API KEY複製下來之後, 就可以開始使用了 (他下面的聲明是說如果你用不夠想要更多的數量需求, 再寫信跟他要) 以下都是使用 python code 為範例 Upload Suspicious File 官網是建議利用 httplib 來跟 virustotal 提供的 api 做溝通, 但有三件事情要修改跟注意 首先會看到官網有提供一段 code import postfile host = "www.virustotal.com" selector = "https://www.virustotal.com/vtapi/v2/file/s...

[ML] Coursera 線上機器學習中文課程

我以前的指導教授終於開 Coursera 線上課程了!! 對於機器學習有者相當大的好奇心可以來加入學習!! 這門課主要是講述機器學習的基礎概念 https://www.coursera.org/course/ntumlone 對了是中文授課, 雖然投影片是英文的XD

[Python] ML WITH SCIKIT Learn (Model Selection)

圖片
年初網路上有一個基礎 scikit learning 的教學, 相當的完整以及實用 花了一點時間看完發覺應該讓更多人學會使用他, 所以打算來寫個中文版本的說明 這篇只是用我的話重新講述 Model Selection 部份, 剩餘的有時間再寫 Video:  https://www.youtube.com/watch?v=iFkRt3BCctg 官網:  https://us.pycon.org/2013/community/tutorials/23/ 影片相關資料: https://github.com/ogrisel/parallel_ml_tutorial.git  (需要用 git 下載) 下面程式碼一律都是 Olivier Grisel 所提供在 github 的, 我只是會有小幅度的修改跟利用 想要看完整版還是乖乖的把 video 看完吧, 要花約 2.5 hr (Model selection只佔 1/4)

[Python] Python Koan

呼 ~ 之前家裡出了點狀況, 加上最近忙碌了一陣子, 只好稍微擱置 這幾天比較有空, 終於有點時間回來寫 blog 回歸的第一篇先來簡單介紹一個很好的 software: Python Koan 官方連結:  https://github.com/gregmalcolm/python_koans 這是一個相當不錯的軟體, 基本上當然是在 linux 下比較適合運行 這是透過 python 的 TDD 來測驗跟了解甚麼是 python, 以及 python 要怎麼用 當然電腦中必須裝有 python 2.7 or python 3.1 的版本才行 例如我電腦中有 python 2.7 我可以到下載後的資料夾中的 python2 裡面, 執行 run.sh 他就會開始跟你講有哪個檔案有 error, 必須要修正才可以 (官網有示意圖) 修正了就會到下一個錯誤, 藉由這樣的方式來學習 Python 總共有 38 關, 297 個任務 就我個人完全過關之後的感想是, 最好有一些基礎跟了解再來玩會比較好 不然可能會不知道他考的是甚麼問題 那其實問題都滿簡單的, 只有到後面的 decorate 才開始有點難度 不過到那邊也表示快結束了 至少全部都過了之後, 也應該有基本的 python coding 的能力了 推薦給想要確認自己是否熟悉 python 的人可以試試看

[ML] Basic Imbalance data

圖片
有鑑於不管是有人問, 或者是我自己, 都碰到滿多次 imbalance data 假設你有兩類的 data, 差異相當的大, 可以 class a 佔了 95%, class b 佔了 5% 針對這種很嚴重的 imbalance data 那該怎麼辦勒? 或者甚至是 multi-class 的狀況 其實有相當相當多的方法可以去 approach 他 有一篇 '09年發表在 IEEE Transactions on Knowledge and Data Engineering 的 paper 有做 survey (話說這是一個相當相當好的期刊, 常常有很多最新的知識發表) 他們 survey了眾多過去處理 imbalance data 的方法, 我個人看完是覺得滿實用的 其中分析了 over-sampling, under-sampling, kernel based, active learning, cost-sensitive 等應用 而我這邊針對 over-sampling, under-sampling 做簡易的翻譯跟解釋 Title: Learning from Imbalanced Data (2009) pdf:  http://www.ele.uri.edu/faculty/he/PDFfiles/ImbalancedLearning.pdf 其實此 paper 作者最近出書了, 但是我還沒有買到這本, 所以只好參考他這篇 paper 來解說

[Python] Easy Dictinoary

最近有點忙, 來更新一個簡易的工具, ML 晚點再更新 python 有個很好用的工具 - dictionary, 基本上就是 key, value 的 data structure 使用相當簡單 Code: sample = {} sample['a'] = 5 sample['b'] = 3 sample['c'] = 2 print sample Result: {'a': 5, 'c': 2, 'b': 3} 同樣的結果也可以這樣給值 sample = {'a': 5, 'c': 2, 'b': 3} 那常見的還有印出所有 keys 或者是印出 dict 所有內容 print sample.keys() # 可以查出所有的 keys for k, v in sample.items() # 可以印出所有 key, value pair print k, v 而使用 dictionary 可能常常會去判斷是不是有已經有此 key, 有的話 value +1, 沒有的話 value = 1 寫法常見如下: Code: key = 'a' if key in sample: # 用 in 就夠簡白了, 還有很多其他方法並沒有比較快 sample[key] += 1 else: sample[key] = 1 因為 dictionary 預設是空值, 所以都要做這樣的設定 Q: 如果今天我們想要有初始值的 dictionary 呢? A: 其實在 python 的 collections library 有一個 defaultdict 可以預設初始值 Code from collections import defaultdict sample = defaultdict(lambda: 0) key = 'a' sample[key] += 1 也就是不用多那個 if 判斷, 因為他是偵測如果沒有這個 key, 他會先設定成 0 然後再 +1 Q: 那如果想要紀錄一些資料進出, 結果...

[ML] K - Nearest Neighbor (kNN)

kNN - K Nearest Neighbor 這個演算法是滿單純簡單的, 所以簡單提一下原理就好 首先, 大部分的 ML 狀況大致上都如下 假設我手上有一筆資料, 有很多的特徵跟每筆資料的類別都有 然後有人給我一筆只有特徵但不知道類別的資料, 我要怎麼辨識他 那, 單純一點的問題, 假設今天你要透過收集人臉, 來辨識人種 所以你可能有一批照片的檔案, 然後我在國外隨便路上搭訕了一個正咩拍了他張照片 結果想要猜測他是那一人種!! 最簡單的方式就是開始拿照片比對, 看有沒有跟她長很像的照片, 或者同樣有類似的特徵 我就會猜測她可能是哪種人種 而且如類似照片多的話, 我可以取前幾個都很類似的人, 看哪種人種最多, 就選那種 細部一點解釋, 我可以擷取出了人臉上的各個特徵, 像是 膚色, 輪廓, 眼睛高度, 鼻子高度, 嘴巴高度, 臉長, 臉寬, 髮色...etc 然後去計算每個特徵的差異, 最後加起來差異最小的前幾名再來投票決定 這樣我們就完成簡單的 K-Nearest Neighbor 演算法了 而較常見的計算差異的方法通常是用距離公式, 也就是 euclidean distance 取幾個人做比較也就是那個 k, k 通常都是20~30上下, 當然要看 data 的數量多寡決定 想要有系統的方式去預估 k 就用 cross validation 吧!! 其實這篇只是要為了之後的內容鋪路 XD 因為 kNN 相對簡單, 所以其實結果通常不容易太好, 可是他卻很適合做一些 data 的 preprocess 像是針對 imbalance data 就有一些特別用途, 這留到之後再說

[Python] Easy python profiling

話說, 常常寫 python 會碰到一些 performance issue 因為 python 太多好用的 function, 很容易就不小心用很直覺得方式去撰寫 code 而導致有些寫法其實會無意間增加很多的執行時間 一般情況下一般人在 Linux 會使用 time 來簡易的衡量程式跑得時間 可是問題是這並沒有辦法知道你寫的 function 中哪一行花費了最多的時間, or 耗費的記憶體 首先針對執行時間, 有個 python module 可以幫你改善這件事情 line profiler:  http://pythonhosted.org/line_profiler/

[Linux] CentOS iptables default

這兩天特別裝了兩台 CentOS 機器測試一些服務 發現我架起來的 web 服務, 不管怎樣都無法讓別台進入, 唯一通得只有 port 22 想說, 怪了, 才安裝完甚麼鬼設定都沒動阿, 結果發現是一個 iptables 的 default 擋住了 [root@hh ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination RH-Firewall-1-INPUT all -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination RH-Firewall-1-INPUT all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain RH-Firewall-1-INPUT (2 references) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT icmp -- anywhere anywhere icmp any ACCEPT esp -- anywhere anywhere ACCEPT ah -- anywhere anywhere ACCEPT udp -- anywhere 224.0.0.251 udp...

[ML, Python] scikit-learn (revision 1)

其實雖然常常自虐自己寫 Machine Learning 的 algorithm 但實際上 ML 演算法太多, 而且加上一個實驗的整個步驟很多事情要做 所以沒事就會去網路上查查一些 off-the-shelf 的軟體來用 那以前在學校比較常用的是 Weka, 程式碼是以 Java 建構的 在學期間有個 project 是用 Weka 去修改 code 完成的 不過因為 Weka 算是滿交錯複雜, 很多 function 之間都互相有一定關係 所以到後來都只是使用上居多, 修改相對少 除了 Weka, 也有用過 Matlab 上的, 不過離開學校就沒機會了 那後來還是對 Python 比較有愛, Python 其實也有不少人寫 ML 來用 不過截至目前為止, 我找到比較完整而且方便使用的, 應該就是 Scikit - Learn 了 (念法 Sci - Kit - Learn) 官網:  http://scikit-learn.org/stable/ 這篇來簡單講一點內容, 跟稍微提一下怎麼使用他的演算法 此篇應該會一值更新, 因為還有很多功能沒放上

[PHP] verify IPv6 and IPv4

剛好最近在找如何判斷給訂的 IP 是不是 IPv6 google 了一下, 在此篇找到:  http://www.electrictoolbox.com/php-validate-ip-address-filter-var/ 發現 PHP 居然內建自動偵測, 真是不錯, 但其實他是使用 PHP 的 filter_var 來幫忙篩選 詳細官方說明網頁:  http://php.net/manual/en/function.filter-var.php 不過要注意要 PHP ver 5.2 以上才支援喔!! 節錄偵測 IPv6 範例如下 function is_ipv6($ip) { if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) return true; else return false; } 理所當然也有偵測 IPv4的 function is_ipv4($ip) { if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) return true; else return false; } 前面的 FILTER_VALIDATE_IP 就是先判定他真的是 IP 那他還有偵測不要是 private ip range 的 flag: FILTER_FLAG_NO_PRIV_RANGE 算是一個偷懶的作法XD 當然偵測是否給定的是 IP, 也可以用 PHP 的 function: ip2long (但只限制IPv4) ex: function is_valid_v4($ip) { return sprintf("%u", ip2long($ip)); } $ip = "192.168.1.1"; echo (is_valid_v4($ip))? "$ip is a valid IPv4\n" : "$ip is an invalid IPv4\n"; $ip = "abc"; ech...

[Vim] 要如何快速縮排特定範圍?

沒想到....沒想到....我以前一直埋頭苦幹著在那邊一個一個按下按倒退鍵刪掉 tab 的行為 原來一直都有快速鍵可以用....Orz 沒事果然要多回去看 vim 快速鍵....常常會忘記XDD 其實使用方式超簡單, 從你要縮排的那行往下數, 假設要縮排 10 行 就在 Normal Mode (也就是一般畫面非可編輯畫面模式) 要往左縮排, 按下 10 << 要往右縮排, 按下 10>> 就完成部份縮排了....我以前寶貴的光陰阿QO.....

[NodeJS] NodeJs Socket Server & Socket Client

大概是寫 Socket Server 寫上癮了 這次來寫如何用 NodeJS 來製作一個簡易的 Socket Server 由於 NodeJS 是天生就是為 Web 設計的, 所以他要做出 Socket Server 是再簡單也不過了 官方手冊:  http://nodejs.org/api/net.html 官方已經寫得很好了, 我順便給予一個超級簡易的範例

[NodeJS] Begin

其實我本身除了研究 ML 以外, 也很喜歡做 Web 相關的服務 不管是前端(從高中開始) 後端 & database (大學開始), 都有苦過一段時間 可惜 web 發展越來越多元, 越來越難去搞到甚麼鬼都學 所以現在大多是挑有一定需求的才會花時間去學來玩 (以前有很多都是為了當好人去學起來教人.....Orz) 那其實 NodeJS 也已經有一段時間了, 只是以前都只是聽過, 一直沒有吸引到我 直到我最近剛好在評比 Erlang 跟 NodeJS 作為背後的 Server 角度下的 performance 的時候 發覺 NodeJS 感覺是個不錯的玩意兒 (其實想找個取代 Erlang 的 Server 來架設服務, 因為會 Erlang 的人太少太少, 維護是個問題) 那也因為我以前也只有寫過簡易的 Javascript & Jquery, 這是第一次走完全的 NodeJS 這邊只是稍微整理一下可以學習 NodeJS 有關的資訊 NodeJS wiki:  http://en.wikipedia.org/wiki/Nodejs Node Official website:  http://nodejs.org/ NodeJS 是基於 Google 的 V8 Javascript 引擎建立出來的東西, 一個 event-driven 的 server

[ML] Kaggle comptition (revision 1)

其實現在有好多好多的 ML 比賽, 有空的話應該來找一兩個玩玩 說不定可以來實驗一些自己想出來的演算法XD Kaggle 是一個 data mining 的競賽平台, 提供很多企業使用 http://www.kaggle.com/competitions 重點是我還在 Coursera 某個 class 上面還看到了一大堆的人在組好多 Team XDDD 目前我有加減玩的大多都是一天有2~5次 submit 機會, 不可多重帳號 (但可同組) submit 用完大多都要 8~15 hr 不等的等待時間, 其實滿討厭的 Orz

[ML] Random Forest

圖片
終於來到我最喜歡的演算法 - Random Forest 會喜歡的原因是, 他簡單, 直觀, 當然前提是你要知道甚麼是 Tree 在看 Random Forest 之前最好先去了解一下 Tree, Link:  Decision Tree , Link:  CART 假設你已經知道甚麼是 Tree, 那你也差不多沒幾步就可以完成 Random Forest 了!! 在這之前先聽個故事... ptt 最喜歡惡搞的一個故事就是, 父親給兒子筷子, 然後一根很容易折斷 兩根很容易折斷, 三根也很容易折斷...嗯...這兒子力量好強!! 這應該叫他 SVM, 因為超強的XDDD 如果今天變成是, 給到第三跟筷子兒子折不斷, 那這時候就要跟他講團結的力量大XD 其實 Random Forest 就是團結的力量 !! 用一句話描述 Random Forest: Random Forest 基本概念就是先 build 多棵 Decision Tree, 然後集合這些 Tree 的力量為一個 Forest, 再來做預測 打完收工~~大~家~可~以~回~家~了!! 當然...事情永遠不會那麼單純XD