發表文章

目前顯示的是 2013的文章

[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

[ML] Classification & Regression Trees (CART)

圖片
上次提到了一個很簡單的 Decision Tree, 應該大多數人都可以很輕易理解 不過其實 Decision Tree 有相當多種變化, 這次來提一個也很常見的 Tree Classification & Regression Trees (CART)  西元1984年, 由 Breiman, Friedman, Olshen, and Stone 等人發表的演算法 是一個比我還老的演算法....Orz Breiman (1928 - 2005) 是個很強的教授, Random Forest (2001) 也是他發表的其中之一演算法 之後應該也會再寫個 Random Forest ~!!

[ML] K-means algorithm (revision 1)

圖片
這次來講個非supervised learning, K-means algorithm 大概算是unsupervised 演算法中, 數一數二簡單的 unsupervised 的意思就是, 給你的training data沒有答案 以前(大學)在DM的書上還看過說, 沒有專家跟你說答案 這DM的解釋讓我當初超莫名奇妙的, 不過後來想想, 其實也不算有問題 因為 data 可能就是沒有答案, 只是一坨混亂, 但是可以用一些演算法找出些許規則 Unsupervised 常見的運用有找出 data 中的特例, 將 data 區分成不同類別, 甚至是壓縮技術 首先, 因為 data 沒有 label, 所以只能從 feature 上下手找規則 如下圖 (我用random normal distribution 隨機建立出來三個 group)

[ML] Decision Tree (revision 3)

圖片
來提個我工作上我還滿喜歡使用的演算法 - Decision Tree wiki:  http://en.wikipedia.org/wiki/Decision_tree_learning decision tree 基本上 google 一下應該就可以找到很多東西 不過要注意的是要 google 的是 decision tree learning 之前在講 Adaboost 有稍微提到這東西, Decision Stump 就是一個簡化版的 Decision Tree 這東西其實說起來相當簡單, 嗯, 其實做起來也超級簡單XD 簡單提一下, 這邊有一個很有趣的網站 -  http://en.akinator.com/ 遊戲是這樣的, 你可以心中想一個人, 然後回答他的問題, 他問題答案只會是 - 是/否 回答他的問題一定的量之後, 他就會猜你心中想的人物 那, 這背後當然是有龐大的資料庫跟使用者回饋 不過技術上, 就很像是Decision Tree 題外話: 我還真的有去買C4.5作者的書, 可是有一半內容就只是把C4.5的程式碼印上去... C4.5 是一個很有名的 Decision Tree algorithm, 新版本叫做C5.0

[ML] Logistic Regression

圖片
最近忙了一點, 來討論一下其他演算法 Linear Regression, 看起來做的事情就是能夠找到一條線去 fit 可能的點(sample) 但是感覺起來, 功能性好像不太夠?? 如果說, 今天我們想要解決的問題改成是, 給定一堆點, 點的類別有兩類型(Binary) 我想要用一條線, 分別出兩種不同點的分佈, 這做的到嗎? 又, Linear Regression是output numerical的結果, 所以他不適合, 但是有個很適合又類似的演算法 Logistic Regression, 就是其中一種可行的辦法

[Other] Chrome 重新整理所有開啟頁面

由於工作上會用不少web application還有收發e-mail也是在web上 所以自然而然的每次進公司, 假設電腦從休眠回來, 很多都還是昨天的頁面 一個一個按頁面重整實在有夠蠢, 想說有沒有可以直接把目前桌面上的chrome重整 結果查了一下還真的有, 不過是額外的plug-in https://chrome.google.com/webstore/detail/reload-all-tabs/midkcinmplflbiflboepnahkboeonkam/related 真是感動阿 ~ 還可以設定快速鍵XD (幸好沒有自己衝動跑去寫plug-in....)

[ML, Python] Gradient Descent Algorithm (revision 2)

圖片
因為最近有在看Coursera複習ML, 就順便結合我這邊的一些其他資料做個整理 Gradient Descent 一個在ML中相當常用來找minimum的演算法 在進入Gradient Descent之前, 要先談一下Linear regression with one variable Linear regression, 基本上高中數學課本就已經有教過了 給你一堆點, 要你找一條線去fit他, 可以用數學表示成 y = ax + b 那我們炫一點, 用ML常見的方式表示 x就是那些點 (input), 那 h θ (x) 就是那條可能的線

[Ubuntu 13.04] Ubuntu更新

前幾天就已經看到要更新的新聞 今天系統一開機就詢問是否更新, 好吧, 就來當個白老鼠試試看 基本上從12.10更新上去, 還算容易, 勾勾選選後面都自動化了 除了幾個小設定問你要不要保留, 或者沒用的lib要不要刪除 唯一有碰到的小問題是, 如果剛好有用到一些library在跑, 有可能會暫時失效 像是剛好正在用python, 結果因為正在更新python library, 所以有幾個lib當下是失效的 等到13.10更新好上去,  就又可以用了 重新開機後, 基本上目前感受差異還好, 有些圖示修改了, 中文的字體也改變了, 搜尋也稍微換了 在工具列上的程式如果有開多個數量, 可以在上面按右鍵看到其他的選擇, 快要變成win7了嗎... 不過到是把我的桌面work space數量改變了Orz, 不~~我的16個畫面就此消失了嗎QO.... 想說用12.10的方式去調整Compiz居然沒看到!!!! 最後google了一下 找到一篇文章有教學 http://askubuntu.com/questions/260510/how-do-i-turn-on-workspaces 首先要去開啟dconf-editor這隻程式 然後到org.compiz.profiles.unity.plugins.core這個位置 去修改hsize跟vsize, 才把workspace調回來 (歡呼) 看看這幾天還會有啥悲劇發生....Ubuntu每次更新我心臟都要承受不小壓力XD 目前悲劇還有Linux版本的Skype失效(直接就給他segmentation fault) Skype 解決:  http://community.skype.com/t5/Linux/ubuntu-13-04/m-p/1501979/highlight/true#M3841 查到解決是執行前要加一行 export LD_PRELOAD=/usr/lib/i386-linux-gnu/mesa/libGL.so.1 然後再執行skype就可以了

[Python] property - Python build-in function

property是python內建的function Official python property:  http://docs.python.org/2/library/functions.html#property 他真的...相當相當好用阿, 只是第一次看到的人可能會莫名其妙 去google也要花很多時間去了解, 或者沒看懂就不看了, 不要用就好 可是會用的話, class修改的code會有一定程度的大幅降低, 也提昇maintain的好處

[ML, Python] Adaboost part 2

進入到實作部份, 先稍微整理一下, 用Adaboost要準備三個材料 1. Structured Input Data (意思就是檔案要整理過比較方便) 2. Weak Learner (一個簡單的演算法) 3. Adaboost (演算法主體) 4. 鹽巴一小匙(XD) 其實Adaboost屬於一種meta-algorithm, 白話一點說, 就是他是附加在某一演算法上的演算法 其實那個weak learner, 才是去學習的演算法, Adaboost不過就是強化了他罷了 所以來討論一下傳說中的weak learner (其實每個演算法都可以當weak learner, 但, 還是不要太強) 實作會參考Machine Learning in Action的範例來使用, 不過會稍微修改 (對了這是一本好書, 想學ML實作的人應該都去買來看看)

[ML] Adaboost part 1

圖片
當年我第一個學的ML algorithm, 就是Adaboost (Adaptive boosting) Adaboost wiki:  http://en.wikipedia.org/wiki/AdaBoost 因為他在平均辨識偵測的表現上, 算是較好的, 參數不多效果好, 好learning, 不學嗎? 其實應該是說這比SVM好介紹...所以Adaboost先登場XD 不過, 通常Adaboost要登場前, 要先拿Bagging拿出來鞭

[Python] easy generator

python的generator一直都相當好用 這邊參考了官網跟Expert Python Programming 官網:  http://docs.python.org/2/tutorial/classes.html#generators 首先進入generator之前, 要先了解一下iterator 使用iterator很簡單, 只要下iter即可 i = iter('apple') 之後可以用i.next()來呼叫每個元素, 就會一個一個印出a,p,p,l,e

[Linux] Linux下查詢硬體記憶體資訊 Memory Information

有時候常常再win可以做的事情, Linux也想做 像是查記憶體插了幾根, 最多可以支援到多大的記憶體之類的 dmidecode指令相當方便, 當然需要sudoer的權利才能用 相當詳細的教學說明:  http://www.weithenn.org/cgi-bin/wiki.pl?Dmidecode-%E6%9F%A5%E8%A9%A2%E7%A1%AC%E9%AB%94%E8%B3%87%E8%A8%8A 這邊只稍微提及記憶體查詢, 其實他還可以查詢CPU, Motherboard...etc

[Machine Learning] 雜談兼瞎扯

還是比較喜歡寫自己的專長, 雖然碩士主攻Machine Learning, 但是還是覺的自己差得遠了 雖然當年(2010)唸碩士時有榮幸伴隨著指導教授的強大能力上了人生的第一篇ICML paper 不過, 人怎麼可以這麼快就滿足了呢???, 更何況當年還被NIPS打槍過XD, 不報仇不行阿(!!) 轉回來, 其實我還滿想要推廣ML的, 但是中英文的文件溝太大, 希望我自己寫(掰)的下去(掩面) 滿多資料跟內容可能都會是參考我當年指導教授(帥氣的HT-Lin)的著作 Book:  http://www.amazon.com/Learning-From-Data-Yaser-Abu-Mostafa/dp/1600490069 Offical Website:  http://work.caltech.edu/telecourse.html 上面是偷打廣告, 其實還會參考其他家我有買(?)的ML書籍, 例如: Introduction to Machine Learning (Ethem Alpaydin) 或者是看到某個演算法想要用中文去描述或者是如何實作也會紀錄(如果我有看懂...Orz) 我比較想要以中文為主來解釋眾多可怕的數學跟專有名詞....(自虐?) 再來是個人有時候的感想 我覺得很多人到後來都只會用tool, 像是用Weka用爽爽, 或者是只會用林老師寫的libsvm跑跑程式然後結果好棒好成功.... 但是演算法說不定都沒了解...只是會用tool, 這不行阿~!! 尤其如果看到較有水準的Conf paper, 需要實作, tool太複雜不會改, 那不就很可惜? (當然厚著臉皮去跟作者要code也不是不行, 但也要人家理你) 不過也不是真的實作就可以做出來....NIPS的一堆理論就深到爆炸, 想實作還要先看懂Orz...(但是真的好幾篇都很讚) 所以如果有閒有時間或者我如果看得懂...會順便翻譯一些不錯我也滿喜歡的ML-related Conference Paper 其實參照我自己工作的行業跟以前唸書的內容, 我應該也可以順便寫寫資安才對.....嗯...改天來翻譯幾本原文的Hack教學應該不錯(?!)

[Python] Basic Logging

這世界看起來好像很安全, 其實很危險, 像是北韓看起來很想要打仗, 但是打過去了要是南韓系統沒有log那怎麼救? (被飛彈炸到還有的救? 還有南韓好像跟我無關...雖然reddit天天都是他們的新聞) 寫程式會有bug, 會有例外狀況, 既然有這種可能會有的突發狀況意外狀況, 有防火牆也防不了的火災......那還是要乖乖的用log紀錄當下系統資訊起來比較保險 python有一個log module相當好使用, 叫做logging python logging:  http://docs.python.org/2/library/logging.html 中文目前描述較詳細的網站:  http://www.icoding.co/2012/08/logging-html 英文教學還是歐萊禮比較完整:  http://www.onlamp.com/pub/a/python/2005/06/02/logging.html 用print沒什麼不好, 就是管理麻煩了點(懶...), 還是用log比較方便, 一開始設定痛一次, 就好了XD

[Python] ServerSocket

最後這篇來講server socket在python上最後一個也是最方便的module Python SocketServer:  http://docs.python.org/2/library/socketserver.html 官網算是有一些範例, 而且網路上也有一隻影片有簡易教學 youtube 英文教學:  http://www.youtube.com/watch?v=OU7AWyw8MfI 基本上SocketServer是大幅簡化了我們要寫Socket Server的module, 他基本支援四種server classes TCPServer, UDPServer, UnixStreamServer, UnixDatagramServer

[Other] About open virus file

由於工作常接觸到很多病毒的文件, 用自己電腦開當然會很危險 雖然工作平台是Linux, 幾乎不太會有問題, 但是也會導致就算有病毒也看不出來 用單一防毒軟體測也是不可靠, 但是防毒軟體百百種, 自己要測試有點困難($$$) 國外有一網站, 可以幫你的單一檔案做相當大量的安全檢查(要小於32mb) 為了要安全一點開文件, 建議大家看到有懷疑的文件的時候, 先丟上這裡檢查, 都過的話至少會安心一點 VirusTotal:  https://www.virustotal.com 甚至熟悉這行的, 因為大多檔案都會做成 sha256, 可以安裝 chrome plugin, 直接右鍵複製搜尋 https://chrome.google.com/webstore/search/virustotal?hl=zh-TW&utm_source=chrome-ntp-launcher

[Python] Threading Socket Server

上一篇介紹了怎麼簡單的建立一個daemon server 這裡開始講述一些比較複雜的運用 thread或許很好用, 但是python也提供了一個threading module來幫助大家更方便使用thread python threading:  http://docs.python.org/2/library/threading.html 因為要做daemon server, 我們必須為每一個thread都建立一套機制流程, 而可能會有怕race condition, 或者是會有不同的client有不同的需求, 需要特別寫很多function來去加強功能需求, threading module可以很容易的讓你達到這件事情

[Python] Simple Socket Server

最近要利用Python來monitor一些東西, 需要做個telnet daemon 特地寫一下如何用 python 做一個 socket server 這個我當初到是真的花了不少時間找尋資料, 發現有兩種方法, 一種是比較傳統的 socket 然而 python 也有做一個 module - SocketServer, 可以簡化不少自己用 socket 做 server 的麻煩 不過 client 端當然還是要用 socket 自己做 官方文件 Socket:  http://docs.python.org/2/howto/sockets.html 網路上有很多教學, 這裡到是有一個不錯的英文教學:  http://www.binarytides.com/python-socket-programming-tutorial/

[Python] *args and **kwargs

這次來紀錄一個我以前剛學python的時候很容易一頭霧水的 - *args and **kwargs 其實python的tutorial網頁都有教學, 只是我都是用到才會去查 不過這次這東西還滿重要的(默.....) Ref:  http://docs.python.org/dev/tutorial/controlflow.html#more-on-defining-functions 來看網頁的範例 def ask_ok(prompt, retries=4, complaint='Yes or no, please!'): while True: ok = input(prompt) if ok in ('y', 'ye', 'yes'): return True if ok in ('n', 'no', 'nop', 'nope'): return False retries = retries - 1 if retries < 0: raise IOError('refusenik user') print(complaint) 這是個很一般的function, 很單純的parameter, 有prompt, retries, complaint, 也有設定預設值, 看起來很美滿

[Python] Python decorator

python decorator, 一個相當方便而且相當重要的工具, 我trace很多python都會用到此功能 官方網站說明:  http://www.python.org/dev/peps/pep-0318/ 有一篇中文教學也很詳盡 http://blog.roodo.com/descriptor/archives/9206319.html 這篇教學跟我看的來源一樣是Bruce Eckel寫的教學, 其實英文好的看他寫的就夠了, 我只是比較囉唆的翻譯 http://www.artima.com/weblogs/viewpost.jsp?thread=240808

[Python] OptionParser [basic] (Python v2.7 已被移除)

Python v2.7 已經移除此功能, 請改用 argparse 另外一個寫程式很常使用的就是手動輸入參數了, python有個很好用的叫做 OptionParser 官方說明 OptionParser:  http://docs.python.org/2/library/optparse.html 宣告很容易, 只要記得import OptionParser就好 from optparser import OptionParser optParser = OptionParser() 再來就是設定, 例如我需要輸入參數"-f", 其type為string, dest為"fp", help為"specitfy file path" optParser.add_option("-f", type = "string", dest = "fp", default = "/home/hh/tmp", help = "specitfy file path [default: /home/hh/tmp]")

[Python] ConfigParser

常常跑個程式, 需要相當多不同的設定實在有夠麻煩, 就用個ini file來幫忙, python就有個ConfigParser可以處理 ConfigParser - Configuration file parser :  http://docs.python.org/2/library/configparser.html 使用上相當簡單, 不過要是看官網, 會發現, 疑, 他有好多個ConfigParser, 在很久之前我用過基本的RawConfigParser, 後來新版本出來後, 基本都是使用SafeConfigParser, 依照官網說法, 為了compatible的問題, 當然還有增加一些額外的方法, 不過這我就沒有真的去測試了

[Crypto, Python] XOR cryption

XOR編碼大概是數一數二簡單卻也很好用的 假如我有一串文字要加密, 還有一個配合加密的key, 可以透過XOR加密來快速做到, 結果還會是binary的格式 而且xor特別的是, 我做兩次一樣的encrypt, 就可以把加密的結果又重新轉出來,缺點則是容易用Frequency analysis就反解出來 網路上有滿多篇都有介紹, 下面這兩篇算是寫比較清楚的一篇 Wiki:  http://en.wikipedia.org/wiki/XOR_cipher Reference1:  http://www.evanfosmark.com/2008/06/xor-encryption-with-python/ Reference2:  http://stackoverflow.com/questions/2029426/what-is-xor-encryption 以下我也簡單舉個例子使用說明

[Python] izip, cycle使用

覺得這實在很好用, 把他記錄下來一下 python再itertools裡面有兩個很方便的東西, 一個是izip, 另外一個是cycle 首先izip, 他可以將多個list垂直合併起來使用, 這邊熟悉python的人會覺的不是也有一個zip可以使用嗎? 其實這兩個做的結果一樣, 但是過程有點差異 ex: from itertools import izip xl = [1, 5, 10] yl = [5, 10, 15] for x, y in izip(xl, yl): print x, y 上述程式碼就會(1, 5), (5, 10), (10 ,15)的印出來 那下列這行結果也是一樣 for x, y in zip(xl, yl): print x, y 所以以結果來看看不出來差異, 但是在實作上, izip是當存取到那個item, 他才會去合併相對的list item 使用時機是, 假如list已經不小了, 合併會變成超大list, 那可能會造成記憶體吃太多, 而導致out of memory 而其實你只是要存取幾個合併的時候才要的item, 並不用真的完全合併所有list, 那就用izip就好, 可以剩下一些速度跟空間 再來是cycle, 這個東西比較不直觀, 首先使用方式是cycle(iterable), 也就是要傳一個iterable的物件進去 ex: from itertools import cycle yl = [5, 10, 15] for item in cycle(yl): print item 你會發現他停不下來, 拼命印, 一直不停的印出5, 10, 15, 5, 10, 15, 5, 10, 15...etc不停重複 原因很簡單, cycle就是會幫你做出一連串重複的結果 所以通常cycle要配合其他東西使用, 下面兩個for-loop舉例 ex: from itertools import izip, cycle xl = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] yl = [5, 10, 15] print "The foll

[Crypto, Python] Diffie-Hellman (迪菲-赫爾曼) 演算法

圖片
以前大四修過資訊安全的課, 不知道哪根經不對, 還特別做了網站紀錄, 現在由高醫陳以德老師接收管理(他上的課嘛XD) 我古老的Crypto講義:  http://itchen.class.kmu.edu.tw/Crypto/Web/ 廢話說完, 最近我又稍微在看以前的一些加密演算法, 其中正在看Diffie-Hellman key exchange, 順道紀錄整個過程 中文Wiki實在翻譯的不太看得懂阿.....建議要看的要看英文 Wiki:  http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange 其實DH已經是RFC標準了, RFC 2631:  http://tools.ietf.org/html/rfc2631 而且網路上居然還有影片特別介紹這演算法!! (主題在2:40秒之後), 相當清楚 Video:  http://www.youtube.com/watch?v=YEBfamv-_do

[Sqlite3] 多個Sqlite資料庫結合使用

有時候因為常常要作些統計資料, 會需要好幾個Sqlite database, 而常常有時候要的條件比較複雜 可能因為幾個db彼此之間必須要互相對應, 就要開來開去 查了一下其實Sqlite可以做multiple database connection - ATTACH 利用ATTACH把資料先rename成其他名稱, 之後下SQL就可以直接用, 例如rename成d1, 要存取d1的table就下d1.table_name ATTACH "$path/A.sqlite" as d1; ATTACH "$path/B.sqlite" as d2; SELECT people FROM d1.adr And rowid in (SELECT distinct PID FROM d2.history And MethodId IN (10,11,12) And MID IN (SELECT rowid FROM d1.ms And strftime('%Y-%m-%d',RTime) >= '2013-02-14' And strftime('%Y-%m-%d',RTime) <= '2013-02-20')) And Status = 3 ORDER BY RTime desc; 其實原本是四句SQL要I/O四次, 變成可以合體成一句, 這應該是只有I/O兩次 這樣比較好存成.sql檔案, 在linux下也比較方便呼叫跟使用

[Linux] ping or telnet IPv6 local network

最近剛好在處理IPv6問題, 才發現我還真沒試過如何去ping or telnet IPv6 紀錄一下under Linux的使用方式 1. ping6 首先先用ifconfig查到自己IPv6的IP, 然後用ping6 加上相對的網卡 例如eth0然後顯示是fe80::213:d3ff:fef1:e023/64, 就要打 ex: ping6 -I eth1 fe80::213:d3ff:fef1:eth0 其實如果是測local, 也可以測試 ping6 -I eth1 ::1 2. telnet 例如我80 port有設置服務, 類似上述方法, 不過這次eth要加在IPv6後方 ex: telnet fe80::213:d3ff:fef1%eth1 80 這邊問題來了, 那個eth0, eth1, 甚麼情況要選哪個(假設你不只一張網卡) 今天你是A電腦要連B電腦, 如果都是public IP 你要找出A電腦連到public是經過哪張網卡(ex: eth1), 然後找出B電腦IPv6 接著就可以打 telnet fe80::213:d3ff:fef1%eth1 80 也就是百分比後面的是說你電腦要連到IPv6的位置, 要透過哪張網卡連出去 換言之, 你如果把連內網的網卡(ex: eth0), 寫在後方, 那應該就會不通了, 因為出不去, 除非你是連內網的IPv6, 這簡稱scope

[Linux] 在linux下測試硬碟速度

首先要先用df找出你要測試哪一個分割, ex: Filesystem            Size  Used Avail Use% Mounted on /dev/sda3             140G   98G   36G  74% / /dev/sda1              99M   34M   60M  37% /boot tmpfs                 2.0G     0  2.0G   0% /dev/shm 例如是/dev/sda3, 然後就輸入下列指令 hdparm -tT /dev/sda3 等一會應該就會有簡易的結果如下 /dev/sda3: Timing cached reads: 31484 MB in 2.00 seconds = 15781.22 MB/sec Timing buffered disk reads: 310 MB in 3.01 seconds = 102.90 MB/sec

[Linux] 在Linux下如何測試兩台機器之間的傳輸速度?

首先要安裝iperf, apt-get or yum應該都可以安裝成功, 或者是到官網下載安裝: http://iperf.sourceforge.net/ 兩台機器分別為A跟B 首先在A machine, 要先假裝是一個Server, 要由另外一個B端連過來端測試速度: iperf -s 在B machine輸入下列指令, 等個幾秒, 就會有預設結果出來, 或者是可以手動設定 iperf -c A_IP -d iperf –c A_IP -t 60 -w 10M -i 1 就會有每1秒(-i)都會顯示傳輸數據, 總共會傳10M(-w)的測試檔案, 總共測試60秒(-t)

[Latex] Ubuntu安裝Latex

我是個很喜歡用Latex排版跟做投影片的人, 當然有GUI輔助更好 個人偏好使用Texmaker這套不管win or linux都有的軟體 紀錄一下剛換到Ubuntu的時候安裝的流程 在Ubuntu底下, 先透過apt-get安裝texlive, 最少要安裝texlive advanced math typesetting beamer, 安裝texmaker 那因為需要adobe reader, 有很多免費支援的軟體, 不過還是先試試看Adobe原廠的吧 到 http://get.adobe.com/uk/reader/otherversions/ 下載最新版adobe reader 下載tar安裝完之後, 發現pdf的Menu有顯示問題, 都看不到....Orz, 其實我只是要點開或關全螢幕的功能 看解開的tar底下的readme有快速鍵, 快速鍵還是可以正常運作, ctrl + l → 開/關 全螢幕

[Ubuntu 12.10] 使用紀錄

去年就把公司電腦改成用Ubuntu 12.10來工作 其實一直都很想把電腦改成用Linux, 因為我開windows最後的結果都是pietty到Linux去 相當沒效率阿, 而且本來裝的是win Vista..你說有多難用都比你說的難用更難用 另外一點是我做的工作很容易碰到win病毒(防毒程式整天嘰嘰叫), 乾脆換Linux, 至少安靜點 當然我也知道Linux is free if your time is free... 那因為在學校跟公司機器幾乎都是Red Hat系列, Fedora or CentOS, 想說桌機來點不一樣的, 就用Ubuntu 紀錄一下當初剛換的時候碰到的許多狀況 一開始剛裝完, 軟體更新一直失敗, 結果發現網路更新軟體路徑可能會有問題, 要記得去系統設定修改軟體設定(換個server path) 修改了之後, 路徑設定正確, 才有辦法順利開始安裝其他套件 剛裝完預設我習慣的很多東西都沒有包含, 例如curl, g++, vim 都要自己先裝好 bbs要裝pcman(試過其他的都很不滿意最後還是回到這套), browser裝chrome(這通常要先軟體更新成功), 要用免費vm裝vmplayer, 多桌面要裝compizconfig來修改, 設定在一般, 通用那邊 雙螢幕一開始沒有成功就要安裝nvidia-settings(當然要是nvidia的顯卡), 以及相關nvidia套件, 設定完重新login就可順利運作 dropbox安裝完要重開機, 這是我覺的目前裝過最鳥的軟體, 居然要重開機? 軟體更新重開機我比較能接受 msn可以裝kmess來使用, Skype的bug很多, 但是....看來微軟的意思還是必須要裝Skype 用playonlinux來使用win程式比較方便, 比用wine一步一步裝好用, 當然僅限常用的win程式 有一點滿奇怪的, 我發現裝完之後, ssh很慢, google了一下, 發現只要修改/etc/nsswitch.conf "hosts: files mdns4_minimal [NOTFOUND=return] dns mdns 4 mdns" 改成 "hosts: files dns" ssh就

[Linux] Linux 個人常用指令

Linux指令實在沒辦法都記下來, 放在網誌上做紀錄, 以後方便查 How to find file by giving time range? find . -newermt "2014-09-30 12:00:00" ! -newermt "2014-09-30 15:00:00" How to output shell variable string length? # usage ${#variable} words="this is a test" echo ${#words} # result 14 length How to transfer mass files from one server to antoher(not SCP way) ssh $host 'cd $directory; find . -type f -name "some file name" | tar czvf - --files-from -' | tar zxvf - -C $path How many files in a directory? ls -1 $directory/ | grep -c "" Generate Password apg -n 1 -M NL -a 0 -m 10 -x 15 # Generate a random but human-readable password from 10 to 15 characters long made with only lower case letters and numbers Check OS port usage (may work with grep) netstat -tulnap Problem: Argument list too long 起因: exec() 這個會太長(相當多指令會call到這個Linux function) 判斷: getconf ARG_MAX 會顯示有多少限制,  這是字串長度, 所以並不是檔案個數, 而是argument的總字串長度 (所以ls /home/xxx/yyy/* 會比

[Couchbase] Couchbase 介紹 - Client - 2 - PHP Version

這篇要講的PHP跟Couchbase, PHP要能夠跟Couchbase溝通 安裝上比C&C++麻煩一些, 我其實失敗了滿多次, 這邊提供我成功的方式 但是使用上大概不到幾行就說明完畢了.... 首先是安裝PHP的時候, 記得要enable JSON, 這千萬要記得, 可以用php.ini檢查 那Couchbase在php上面的extension可以到官方網站下載 Download:  http://www.couchbase.com/develop/php/current 其實網站上的方法我一直沒成功 我後來有成功的方式是 git clone git://github.com/couchbase/php-ext-couchbase.git cd php-ext-couchbase/ phpize ./configure --with-couchbase=/opt/couchbase.git make sudo make install 都好了之後記得去檢查php.ini有開啟下列這兩項, /path/to記得改成相對路徑 extension=/path/to/json.so extension=/path/to/couchbase.so 接下來就可以快快樂樂的用Couchbase with PHP (誤) 這篇我還是依舊用官網上的教學 但是之後會有一篇配合較複雜的View版本, 我會用php當作範例使用 看以下簡易範例 $cb = new Couchbase("127.0.0.1:8091", "", "", "default"); $cb->set("a", 101); var_dump($cb->get("a")); 短短這三行, 就完成了C&C++一大~堆的內容 左邊是IP/Port, 中間沒輸入的是Server的帳號/密碼, 右邊是Bucket Name 第一步連線, 第二步寫入資料到Couchbase Server, 第三步, 讀出來, 打完

[Couchbase] Couchbase 介紹 - Client - 1 - C&C++ Version

Couchbase C&C++ Version 這邊介紹如何用C&C++與Couchbase的"簡易溝通" (複雜的我後來都用PHP比較方便) 官網C Library: http://www.couchbase.com/develop/c/current 這邊附註一下, v1.8跟v2.0有一段落差, 我會稍微補充一點點不一樣的地方 比較完整個差異可以看這個人的Blog - 應該是Couchbase的工程師 http://trondn.blogspot.tw/2012/08/libcouchbase-overhauling.html 1. 首先要先安裝Couchbase Library, 這邊我直接用Source Archive安裝 用相對平台的rpm or deb也行, 官網其實都有很明確地安裝流程了 除了Source Archive, 如果是Source Archive安裝也很簡易: tar zcvf libcouchbase-2.0.3.tar.gz cd libcouchbase-2.0.3 ./configure sudo make && make install 安裝好了之後就可以利用C&C++來溝通Couchbase

[Couchbase] Couchbase 介紹 - Server - 2

圖片
再上一篇已經完成了安裝, 這邊稍微簡單解釋一下畫面上的功能 我並沒有全部都有用到, 我只目前覺得比較可以觀察跟使用的地方做講解 Cluster Overview 顯示現在機器的基本狀況, 記憶體&硬碟使用情況, 還有bucket簡易的顯示畫面, 跟現在連線到cluster的狀況

[Couchbase] Couchbase 介紹 - Server - 1

圖片
因為工作上的需要, 一直在研究NoSQL - Document類型的資料庫 本來最常使用的是MongoDB 但是我一直覺的他的UI實在相當的不friendly 啟動服務或者是做sharding or replica, 都有一定的麻煩 雖然提供很多api, 可是常常總覺的都些地方不是很方便 而因為以前學校研究習慣, 常常會去找尋跟評比我要做的東西的其他資源 所以又花了不少時間去找尋其他NoSQL資料庫 也測試過Apache cassandra, 不過太慢, 不是我要的 CouchDB, 嗯以web為主體的NoSQL, 我也不太需要... 後來發現, 疑?有一個叫做Couchbase的看起來好像很強很厲害, 之前很紅的Draw something也有在用, 那就乾脆來試試看吧 PS: NoSQL其實有一個比較完整的網站:  http://nosql-database.org/