2011年5月20日 星期五

美麗的誤會

排氣檢查的禮物


又到了一年一度的排氣檢查,我那台老車啊,想說去年從宿舍騎沒 3 分鐘就去測試,結果當然是失敗 XD 這次我記取教訓,乾脆騎到市區順便領火車票,在途中看到一間有檢測的店就給他測了一下,結果...還是沒過 XD


這是測試的是 A 老闆,A 老闆看到測沒通過時,很好意地跟我說,請我去我信任的車行維修,這句話給人感覺很讚,不像去年第一次測的 C 老闆,一臉奸笑著說要收多少錢 XD 隨後我就去找 B 老闆維修,而 B 老闆是大家掛保證的好老闆,去年也是找他維修的,只可惜 B 老闆沒再做檢測。讓他幫我調整了一會後,由於今年的排氣測試維修還要簽名,所以 B 老闆覺得如果沒測過還要再維修,要不斷地從 A 到 B 跑來跑去,對我有點不方便,在加上看到檢測的是 A 老闆,馬上就跟我說 A 老闆人很老實,請我放心地給他維修就好,這樣要測試也比較方便。


所以,我就多認識一位好機車老闆(怪怪的稱呼XD)。在維修的過程,我擔心口袋不夠深,所以會多詢問幾次價錢,並且維修過程,其徒弟還會詢問某個舊東西要不要換,結果 A 老闆回說還可以用,就繼續用,整個維修過程讓我感到很安心 :) 最後的測試當然就是 Pass 啦!只是 A 老闆還是跟我提醒,二行車對環境本來就比較有汙染,現在檢測成功,比較像吃安非他命罷了,建議還是考慮換一下車,對環境比較好,好感再次 ++ 


我覺得與人相處就是要互動,修車的過程我嘗試詢問對方可能擅長的回答內容,例如培養一位師傅要花幾年等等,讓老闆講得很順嘴,漸漸地就會像聊天了 :D 老闆還跟我說,像我剛剛第一次測時,旁邊也有一台進來,那台就是住在附近,騎來的車不夠熱的,他說這種他一定不測,要對方先騎去市區跑跑啦!這會讓我想起去年我車騎不夠久時(小於3分鐘吧),當時的 C 老闆還是執意幫我測,那種感覺是有落差的。


至於學徒方面,老闆說大概要花 3~5 年,我說不是有啥專科學校嗎,他說那邊教的是理論,到車廠上班就是學經驗,還說有些人看起來跳槽很多間,好似吸收很多經驗,但不見得是真本領。我想,言下之意就是找個好老闆,好好地跟一陣子,認真學習就對了。這讓我想到資訊業都沒有這種傳承的,如果老闆又不常 coding 的,大概只會丟幾篇 paper 或是要你看看哪些 framework 就拿來用,感覺真的有差啊 :P 在資訊業好像傳承的部分很少,大概都各憑本事吧。


除此之外,今天要去火車站時,等紅燈時還碰到一位咩問路 XD 可惜我回答得不出來,只說應該是在前面,雖然結果是猜對的,但還是挺遜的!我該多跑市區多記幾條路才是!


Anyway,有時也不用執著已知的解法,換個方向走走,也是挺不錯的,上圖就是測試成功後,老闆送我的禮物 XD 他說,要測試成功他才有錢可以領,也算是要謝謝我這個客人吧!(只是感覺很像去 xxx 後,付完錢,被對方包紅包 XD)


2011年5月18日 星期三

[Windows] 搭配 VirtualBox 共享目錄,使用 Dropbox 服務 @ Windows 7

今年開始用 Dropbox ,但由於資安安全性部分,我不太想直接在自己的電腦上直接安裝 Dropbox ,所以我想把 Dropbox 安裝在虛擬環境上(Guest OS),但資料又可以輕易的使用(Host OS),簡單來說讓資安問題停留在虛擬機器上,但實體機器又可以存取 Dropbox 之同步資料。


我使用的作業系統是 Windows 7 x64 ,原先在 Virtualbox 安裝一個 Windows XP 跑 Dropbox,透過 Virtualbox 共享資料夾(NFS),結果發現 Dropbox 不允許使用網路硬碟。這下可好了,想做的事都不能搞 XD 不使用網路硬碟算是有一些實作上的考量,例如 lock 的問題等。結果最近我安裝了 Ubuntu 來使用,想說再試一次網路硬碟的方式看看,沒想到在招在 Ubuntu 10.04 Desktop 64-bit 上適用耶!所以就來筆記一下。


Host:


OS:Windows 7 x64 + VirtualBox 4.0.4 r70112 (並非最新版,新版使用上有點問題,所以改換前一版)


使用目錄 D:\SharedDropbox


Guest:


OS:Ubuntu 10.04 Desktop 64-bit


dropbox


流程就很順地安裝完上述兩套環境,接著在 Guest OS 上安裝 Virtualbox Guest Additions ,並共享 Host 端 D:\SharedDropbox 目錄,勾選 "自動掛載" 和 "永久性",使用的名稱還是 SharedDropbox。接著在 Ubuntu 環境上(Guest OS)進行自動掛載的設定:


$ sudo mkdir /SharedDropbox
$ sudo vim /etc/fstab


# /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    nodev,noexec,nosuid 0       0
# / was on /dev/sda1 during installation
UUID=#####-####-####-####-###### /               ext4    errors=remount-ro 0       1
# swap was on /dev/sda5 during installation
UUID=########-####-####-####-######## none            swap    sw              0       0
# Dropbox
SharedDropbox   /SharedDropbox  vboxsf  defaults        0       0


重點是上述最後兩行。


$ sudo reboot


上述重開機完就算完成,以後Ubuntu 開機時就會自動掛載該目錄。如果只想要測試,就先用 sudo mount -t vboxsf ShadredDropbox /SharedDropbox 看看,例如在該目錄建立一個檔案,是否能在 Windows (Host OS)上看到。


最後就能用叫 Ubuntu 幫你抓好資料擺好,然後用 Windows 存取那些檔案啦,有點脫褲字放屁啦 XD


2011年5月17日 星期二

學而不用則荒廢、不學東西則懶散

20110509-sunny


趁著天氣好時,拍一張,有時並不是天天都有好風景,但換個角度仍是又一村啊。


子曰:「學而不思則罔,思而不學則殆。」身在一處專碰新技術的單位,這半年開始會有這樣的念頭。天天有機會接觸新的東西,但總是沒那個展現環境,派不上用場,時常觀察新趨勢,左看看右看看,手上的成品卻不曾一點茁壯。之前也寫過一篇心得:戒了 iPhone、iPod touch 和 iPad 產品,深深覺得真正有價值的不是多酷炫的 UI 、高效率的程式,而是使用者當下情愫下,生產出來的內容。然而,就該因為這些停步嗎?我想這又有點本末倒置了,這之中必須尋求一個平衡點。


趁著今天的萬安演習,跟隔壁 team 的同事閒聊幾句,我問他是否念博班,他跟我說他喜歡寫 code 所以很明確現在不想追求學問。幾天前跟幾位大學同學閒聊,發現不少人擁有高薪生活,但工作內並非寫程式。


打算少用 Social Network Service 好了,最近覺得 Social Network 只是另類的孤獨方式,看起來好像很快樂,實際上卻甚麼也沒留下。專心一下,產生一些足跡吧!


2011年5月16日 星期一

[PHP] 使用 cURL POST 上傳檔案

好久沒寫 PHP 了,連自己工作的機器上都忘了安裝 orz 這半年一直都在寫 python 啊,這次使用 PHP 來模擬短時間的大量連線。


在 Ubuntu 的安裝:


$ sudo apt-get install php5-cli php5-curl


之前只有透過 curl 使用 POST 送出 text 類的資料,這次想要模擬檔案上傳,一開始使用:


$POST_DATA = array( 'my_file' => file_get_contents( '/path/my_file' ) );


但還是送不出去,最後才發現要用:


$POST_DATA = array( 'my_file' => '@/path/my_file' );


大概是這樣才會被轉換使用 multipart/form-data 的方式,完整範例:


<?php

        $url = 'http://host/upload';

        $ch = curl_init();
        curl_setopt( $ch, CURLOPT_URL, $url );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
        curl_setopt( $ch, CURLOPT_POST, true );
        curl_setopt( $ch, CURLOPT_POSTFIELDS, 
array(
               //'my_file' => file_get_contents( '/path/my_file_data' ) 
               'my_file' => '@/path/my_file_data' 
)
);  
        echo curl_exec( $ch );
        curl_close( $ch );
?>


2011年5月15日 星期日

[C] C 語言,使用 Perl Compatible Regular Expressions (PCRE)

幾年前也寫過一篇:[C] C 語言,使用 Regular Expressions,那時是使用 Regex library 也曾說過要用看看 PCRE 啦,結果日子久了就都忘光光,倒是前陣子在 visual studio 編譯 c++ project 時,發現怎都忘光光 Orz 所以來寫一篇筆記吧。


至於 PCRE 的好處嘛,如果常開發 PHP 並使用 preg_match 或 preg_match_all 等相關函式庫的話,那使用的語法一致的啦。


簡單的 main.c 範例:


#include <pcre.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main( int argc, char ** argv)
{
        pcre *re;
        const char *error;
        int erroffset;
        int ovector[30];
        int options = 0;

        if( argc < 3 )
        {
                printf("Usage> %s \"PCRE_PATTERN\" \"TEST_DATA\"\n", argv[0]);
                return 0;
        }
        if( ( re = pcre_compile( argv[1], options, &error, &erroffset, NULL) ) == NULL )
        {
                fprintf(stderr, "PCRE compilation failed at offset %d: %s\n", erroffset, error);
                exit(1);
        }
        if( pcre_exec(re, NULL, argv[2], strlen(argv[2]), 0, 0, ovector, 30) >= 0 )
                printf("Match\n");
        else   
                printf("Not Found\n");
        return 0;
}


在 FreeBSD 編譯:


如果系統已經安裝過 pcre 相關 lib 的話,僅需編譯程式時,指定函式庫相關資訊即可


> gcc -I/usr/local/include -L/usr/local/lib -lpcre main.c


如果沒有安裝過,那只好去 PCRE - Perl Compatible Regular Expressions 官方網站下載原始碼來編譯一下。


> cd pcre_test
pcre_test> wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.12.tar.gz
pcre_test> tar -xvf pcre-8.12.tar.gz && cd pcre-8.12
pcre_test/pcre-8.12> cd pcre-8.12
pcre_test/pcre-8.12> ./configure && make && cd ..
pcre_test> ls
main.c          pcre-8.12/        pcre-8.12.tar.gz


pcre_test> gcc -DHAVE_CONFIG_H -DPCRE_STATIC -Ipcre-8.12 pcre-8.12/pcre_chartables.c pcre-8.12/pcre_compile.c pcre-8.12/pcre_config.c pcre-8.12/pcre_dfa_exec.c pcre-8.12/pcre_exec.c pcre-8.12/pcre_fullinfo.c pcre-8.12/pcre_get.c pcre-8.12/pcre_globals.c pcre-8.12/pcre_info.c pcre-8.12/pcre_maketables.c pcre-8.12/pcre_newline.c pcre-8.12/pcre_ord2utf8.c pcre-8.12/pcre_refcount.c pcre-8.12/pcre_study.c pcre-8.12/pcre_tables.c pcre-8.12/pcre_try_flipped.c pcre-8.12/pcre_ucd.c pcre-8.12/pcre_valid_utf8.c pcre-8.12/pcre_xclass.c pcre-8.12/pcre_version.c pcre-8.12/pcreposix.c main.c



pcre_test> gcc -Ipcre-8.12 main.c pcre-8.12/.libs/libpcre.a


pcre_test> ls
a.out*            main.c          pcre-8.12/        pcre-8.12.tar.gz


測試:


pcre_test> ./a.out 
Usage> ./a.out "PCRE_PATTERN" "TEST_DATA"
pcre_test> ./a.out "<a></a>" "<a>test</a>"
Not Found
pcre_test> ./a.out "<a>(.*?)</a>" "<a></a>"
Match


在 VC++ 編譯:


PCRE 內附 cmake 編譯方式,正統的方式應該是透過 cmake 編譯出 lib 來使用,在這邊就手動調調,直接用 src 把玩一下。


建立 2 個 projects,其中一個是 libpcre 另一個則是 main,前者是 PCRE 的相關資料,後者是上述的 main.c 例子。對 libpcre 來說,先把壓縮檔內 config.h.generic、pcre.h.generic 和 pcre_chartables.c.dist,分別複製成一份 config.h、pcre.h 和 pcre_chartables.c。


source, header


接著設定兩個 projects 的 properties 等,對 libpcre 和 main 兩者來說:


[C/C++] -> [General] -> [Additional Include Directories] 加入 pcre-8.12 的目錄位置


[C/C++] -> [Code Generation] -> [Runtime Library] 設定為 Multi-threaded (/MT) ,理由是我要用 static 的,並且不想使用 DLL ,這樣才比較 portable 。


multi-threaded


對 libpcre 個別設定:


[General] -> [Configuration Type] 設定為 Static library (.lib)


[C/C++] -> [Preprocessor] -> [Preprocessor Definitions] 加 HAVE_CONFIG_H;PCRE_STATIC; 


對 main 個別設定:


[Common Properties] -> [Framework and References] -> [Add New Reference],請加入 libpcre


[C/C++] -> [Preprocessor] -> [Preprocessor Definitions] 加 PCRE_STATIC; 即可


[Project Dependencies],對 main Projects 請勾選 libpcre ,這樣編譯過程會先編 libpcre


dependencise


如此一來就能夠 build 出來啦


其他筆記:


如果編譯過程中會有 error LNK2001: unresolved external symbol __pcre_default_tables 的話,那應該是 libpcre 編譯過程中少了 pcre_chartables.c 檔案,可以從 pcre_chartables.c.dist 複製出來;若是 error LNK2019: unresolved external symbol __imp__pcre_exec referenced in function _main 這類的,那應該是 main project 之 preprocessor definitions 忘了加 PCRE_STATIC  或是 Framework and References 要加一下 libpcre 囉