前言
由於網路程式設計課程的關係需要在C++中用到Regular expression,
google之後發現有許多解決方案,如Regex++ 、 Boost.Regex 、 PCRE 、 regix.h 等等,
但考慮到系上工作站未必有安裝上述套件,而PCRE卻是人人都有,
所以我選擇使用pcrecpp這個lib。
安裝
- Environment: FreeBSD 8.2
% sudo portmaster devel/pcre++
使用
-
CASE 1: FULLMATCH & PARTIAMATCH
FullMatch就是需要完全相符,就像/^(regular expression code)$/一樣
PartialMatch則反之
#include <iostream>
#include <pcrecpp .h>
int main(int argc, char ** argv)
{
if (argc != 3)
{
std::cerr < < "Usage: " << argv[0] << " pattern text\n";
return 1;
}
pcrecpp::RE oPattern(argv[1]);
if (oPattern.FullMatch(argv[2]))
{
std::cout << argv[2] << " fully matches " << argv[1] << "\n";
}
else if (oPattern.PartialMatch(argv[2]))
{
std::cout << argv[2] << " partially matches " << argv[1] << "\n";
}
else
{
std::cout << argv[2] << " dose not match " << argv[1] << "\n";
}
}
執行結果
% g++ TestPcre Cpp.cpp `pcre-config --cflags` `pcre++-config --cflags` - lpcrecpp -o pcrecpp
% ./pcrecpp
Usage: ./pcrecpp pattern text
% ./pcrecpp "http:\/\/.*\.qq\.com" "http://www.qq.com"
http://www.qq.com fully matches http:\/\/.*\.qq\.com
% ./pcrecpp "http:\/\/.*\.qq\.com" "http://www.qq.comiii"
http://www.qq.comiii partially matches http:\/\/.*\.qq\.com
% ./pcrecpp "http:\/\/.*\.qq\.com" "http://www.qqq.comiii"
http://www.qqq.comiii dose not match http:\/\/.*\.qq\.com
-
CASE 2:CONSUME之完全比對
有時候你會想把整個字串比對完,像是你想parse一整篇html或文章中所有的email,你或許會這樣寫
string contents = ...; // Fill string somehow
pcrecpp::StringPiece input(contents); // Wrap in a StringPiece
string name, site;
pcrecpp::RE re("([^@]+)@([^\s]+)");
while (re.Consume(&input, &name, &site)) {
...;
}
然後就可以成功抓到一篇文章所有的email。
切記,StringPiece一定要記得Wrap,否則會型態不符喔!
Note
經實際測試結果,compile時必須加上
% g++ `pcre-config --cflags` `pcre++-config --cflags` -lpcrecpp
才可以成功compile,且如果他說找不到lpcrecpp請手動symbolic link到/usr/bin下才可執行
% sudo ln -s /usr/local/lib/libpcrecpp.so.0 /usr/lib/
Reference
目的
將同網域的Windows電腦大量關機
需求
- 你必須有該網域的administrators之權限。
- Windows版本XP以上。
方法
Win7和WinXP和Win2008的shutdown這隻程式似乎長得不太一樣,但功能應該大同小異,
打開CMD輸入shutdown /?或者shutdown --help就可得到說明
而我測試的版本為Windows2008,指令為
shutdown /s /m \\電腦名稱 /t 秒數
即可在某固定秒數內將電腦(們)關機。
參數說明可以看windows自訂說明,其實寫得很清楚也不用多提。
問題
-
寫成批次檔的話會一直等待已經關閉的電腦回應,關機要很久
可利用批次檔的START指令,該指令功能就像fork一樣,會自己呼叫新的cmd出來,可以達到一次關閉很多台電腦的功能
EX:
START /B shutdown /s /m \\CCCC-12345 /t 10
而其中/B代表的是幕後執行,因此不會彈出很多個小黑窗。
另外如果你怕一次執行太多可以用timeout /t 秒數指令延緩執行,
比如說你可以關10台執行timout /t 20讓他每關10台等待20秒再關下十台這樣。 -
Win7沒辦法遠端關機?
可能是防火牆設定的問題,試著允許"檔案與印表機共用"這個欄位試試看。
Reference
前言
大兜推薦Octopress這個傳說中的「駭客的blog」,可以使用markdown撰寫文章,還有很方便的程式碼上色功能,也不失設計彈性,一聽之下大為心動,就打算把blogger的舊家搬過來。
掙扎
一開始打算利用他寫的這篇文章安裝在Win7上面,不料困難重重,全部都設定好之後仍然無法使用程式碼上色功能,只好試著搬家到FreeBSD上面看看會不會比較方便安裝。
撞牆
原本打算照官網上的步驟一步一步來,但不料iconv的dependency問題一直無法解決(會一直噴找不到iconv錯誤),索性放棄,直接改用FreeBSD的ports, 結果瞬間就好了(不過未來可能會出現ruby版本相容性問題...QQ)
安裝
Install base ruby, ruby-iconv, ruby-bundler
% sudo vim /usr/ports/Mk/bsd.ruby.mk # 將RUBY_DEFAULT_VER?= 1.8 改成 1.9
% sudo portmaster converters/ruby-iconv
% sudo portmaster /usr/ports/sysutils/rubygem-bundler
% rehash
Next, install dependencies.
% cd
% git clone git://github.com/imathis/octopress.git octopress
% cd octopress # If you use RVM, You'll be asked if you trust the .rvmrc file (say yes).
% ruby --version # Should report Ruby 1.9.2 or 1.9.3
Install the default Octopress theme.
% gem install bundler
% rehash
% bundle install
% rake install
OK,完成XD!
可以繼續往下跑囉!
Reference
前言
最近系計中買了VMware vSphere平台的授權,當然要好好的用一下。
灌完FreeBSD9之後發現效能居然還比Ensky.tw這台實體機來的快!
因此決定把vSphere的VM偷兩部過來當做Load balance的Web server。
設定
原本那兩台採用DHCP + DDNS綁在某個hostname上面,因此打算使用CNAME做loadbalance的record,
google之後才發現CNAME沒辦法設多筆!因此我把host用A record綁在cdn.ensky.tw上面,
想要load balance的server再用CNAME指到cdn.ensky.tw上
設定其實非常簡單,就只是一筆DNS record上綁很多個A
cdn A 10.0.0.1
A 10.0.0.2
A 10.0.0.3
然後再把你要load balance的hostname導到cdn上面去
www CNAME cdn
好了!從此之後你的www就可以自動分散流量到10.0.0.1~3上面囉!
後話
其實這個作法並非非常理想,為何?
因為假設某台Server突然死掉了,本架構並不能做到fail-over,
也就是如果client很不幸的連到死掉的那台server,一樣會噴404 not found,
你會說,那我就寫隻script檢查有沒有死掉,死掉的話就nsupdate拿掉他就好啦?
但是dns更新需要時間,你就算拿掉該host,client端還是會404一陣子,直到dns快取expire...
這裡比較好的作法可能是用一台server做reverse proxy的工作,
當流量過來的時候自動round-robin導到內部的server pool上面,
而當有server掛掉的時候可以自動導到別台這樣。
改天來研究這個方法:p
其他issue
- 用worker: http://blogs.msdn.com/b/silverlining/archive/2011/10/04/support-for-worker-roles-in-the-windows-azure-sdk-for-php.aspx
- 用table, blob, queue: http://azurephp.interoperabilitybridges.com/tagsearchresults/?tag=Storage
- 好多教學: http://azurephp.interoperabilitybridges.com/tutorials
- 微軟教學: http://msdn.microsoft.com/zh-tw/library/windowsazure/hh696549v=VS.103).aspx(
筆者遇到的小問題
- 明明在ServiceConfiguration.cscfg裡面將Worker的Instances設為10了,為什麼還是不會變?!
經測試,
這行指令並不會把新的ServiceConfiguration.cscfg複製過去OUTPUT DIR(很有趣) 所以你可能要手動去OUTPUT DIR將那邊的ServiceConfiguration.cscfg改正才行package create -in="SOURCE DIR" -out="OUTPUT DIR" -dev=true
- Azure的Compute Emulator跑第二次就出現 Role status Unknown 這我也常常發生但還沒找到好的解法,我的作法是直接把Compute Emulator shutdown & restart兩次就好了= =
前言
DataMining這門課第一次作業要建立FP Tree來分析Frequent Itemset,有分三部分:
- 單機版
- Map Reduce on Window Azure版本
- 第二版本改善效能(bonus) 由於筆者最擅長的語言是PHP,就打算用PHP撰寫之。
安裝
- 先照著這篇文章來安裝 PHP + Windows Azure SDK + SQL Server Express
- 再照著這篇文章來安裝 Windows Azure SDK for PHP 以及學習如何測試開發
試跑
上一步驟做完應該已經會產生package了,現在要來跑跑看,請參考這篇文章來用用看phpinfo();
安裝 Q & A
你可能會遇到一些神奇的問題
- PHP 安裝失敗
很妙的是Microsoft Web Platform Installer他並不會自己幫你裝好IIS,你要去控制台->程式與功能->開啟或關閉windows功能把它設定成至少這樣才能開始安裝PHP
- 404 Not Found
根據筆者的經驗,Microsoft Web Platform Installer安裝的php版本會是壞掉的(很妙,啊?),檢測方法是去C:\Program Files\PHP\v5.3\下點開php.exe和php-cgi.exe看會不會炸掉,
如果OK就可以,不行的話你可能要去PHP for Windows官網找5.3 Thread safe zip
請自行備份舊檔案,解壓縮新檔案到同一個資料夾,再把舊的php.ini複製進去新folder。
然後呢,你可能會繼續404 Not Found,此時很有可能是IIS並沒有自動幫你設定好FastCGI & enable PHP。
請進入控制台->系統管理工具->IIS管理員->FastCGI設定然後這樣設定
然後回到IIS管理員進去PHP管理區啟動PHP
之後看看行不行,不行就google看看囉,或看這裡搜尋404,至少我是這樣解決的。
Reference
- http://azurephp.interoperabilitybridges.com/articles/setup-the-windows-azure-development-environment-automatically-with-the-microsoft-web-platform-installer
- http://azurephp.interoperabilitybridges.com/articles/setup-the-windows-azure-sdk-for-php
- http://azurephp.interoperabilitybridges.com/articles/build-and-deploy-a-windows-azure-php-application
- 用worker: http://blogs.msdn.com/b/silverlining/archive/2011/10/04/support-for-worker-roles-in-the-windows-azure-sdk-for-php.aspx
- 用table, blob, queue: http://azurephp.interoperabilitybridges.com/tagsearchresults/?tag=Storage
- 好多教學: http://azurephp.interoperabilitybridges.com/tutorials
- 微軟教學: http://msdn.microsoft.com/zh-tw/library/windowsazure/hh696549v=VS.103).aspx(
All in one link
其實官方wiki寫的很清楚了,
直接到那邊就可以看到如何安裝、如何測試等等。不過我這邊還是記錄一下我的步驟,以及我遇到的困難及解法。
Overview
既然是要做map-reduce,所以先來份code。
這份code裡面就是基本的word count,
function version
def mapper(key, value):
for word in value.split():
yield word, 1
def reducer(key, values):
yield key, sum(values)
if __name__ == "__main__":
import dumbo
dumbo.run(mapper, reducer)
可以看到mapper function負責map, reducer function負責reduce,是透過dumbo.run來註冊。
class version
你也可以用class來做mapper和reduce的動作,就可以定義__init__在initilize的時候執行一次就好,減少一些overhead。
class Mapper:
def __init__(self):
file = open("excludes.txt", "r")
self.excludes = set(line.strip() for line in file)
file.close()
def __call__(self, key, value):
for word in value.split():
if not word in self.excludes:
yield word, 1
def reducer(key, values):
yield key, sum(values)
if __name__ == "__main__":
import dumbo
dumbo.run(Mapper, reducer, reducer)
可以看到__init__是constructor,一開始會被執行一次;__call__是真正執行的function。
Installation
https://github.com/klbostee/dumbo/wiki/Building-and-installing
Note
若你打算使用國網中心的hadoop,直接看到virtual Python environment的解法即可。
Running
dumbo允許你單機進行測試,單基測完沒問題可以放到hadoop上測試,減少開發時間。
詳細說明
https://github.com/klbostee/dumbo/wiki/Running-programs
Notes
有關Running這邊實在吃了不少苦頭,於是把一些常見問題放在這裡以資各位參考。
- 共同
- 每次都要刪除舊檔案很麻煩 -> 參數加上 -overwrite yes
- 出現Memory error -> 記憶體不足,因為預設的記憶體限制很小,參數加上 -memlimit 1073741824
- Hadoop only
- Output出現亂碼 -> 參數加上 -outputformat text
- 只用到兩個mapper, 一個reducer -> 預設參數是這樣,要設定參數: -nummaptasks [a number]
簡介
新酷音真的比新注音輸入法好用太多,智慧選字、全形標點,怎樣都不想換回新注音輸入法。
不過新酷音對64bit的支援一直都有點問題,網路上有人提供64bit的載點和解法,但經測試過後並不成功。
於是就絞盡腦汁的嘗試XD,終於給我嘗試成功!
測試過程
經觀察後發現windows在安裝輸入法的時候,若發現他是32bit的輸入法,會將檔案放在C:\Windows\SysWOW64\下;而64bit的則會放在C:\Windows\System32\下
新酷音經熱心網友改版之後有了
32bit和
64bit兩種版本,於是分別放在syswow64和system32下的話,就可以成功使用囉!
安裝步驟
- 下載並解壓縮到C:\下
- 去控制台->時鐘、語言和區域->變更鍵盤或其他輸入方法->變更鍵盤->新增->新酷音輸入法->確定
- 大功告成!