推薦軟硬體、網站

Google Adsense

aNobii網路書櫃

2010年12月17日 星期五

Google Chrome & Security: Sandboxing

2010年10月23日 星期六

[Mac] 用Dropbox同步多台電腦的Adium對話記錄



Use Dropbox to Sync Adium Logs Between Computers

隨著越來越常在實驗室的Mac Mini Server和宿舍的MacBook輪流工作,Dropbox對我來說更顯得重要。一般的程式碼、文件都能輕鬆同步,但如果Adium即時通的對話記錄無法同步的話,總會帶來一些困擾。例如我在實驗室丟別人離線訊息,等回宿舍隔天再收到別人的回應時,我已經忘了當初說的是什麼了XD,尤其對方也離線時會更困擾。

其實Dropbox可以透過Unix系統的symbolic link,來同步~/Dropbox資料夾以外的東西,以前已經有人介紹過了。不過同樣是symbolic link,如果想在多台Mac電腦間同步Adium對話記錄,我比較建議「把原本的Logs搬移到Dropbox裡以後,再到原本放Logs的路徑建立symbolic link連到Dropbox」,這樣比起建立symbolic link從Dropbox連到Logs,還要更不會出包和遺失資料,而且至少可以允許不同電腦取不一樣的使用者名稱XD。詳細方法如下:

  1. 首先要說的是,如果過去在多台電腦上有重複聯絡人的Logs,那在第一次同步必須有所取捨,因為同樣檔名的對話只能保留一個,而我不會合併。
  2. 登出Adium,然後到每台電腦Adium存Logs的地方,也就是 ~/Library/Application Support/Adium 2.0/Users/Default ,把Logs資料夾搬移到~/Dropbox內,例如我順便更名為~/Dropbox/Adium_Logs。如果發生1.的情形,請一一小心斟酌,不要把Logs資料夾整個丟進去,否則會全部覆蓋。基本上是挑對你比較重要的記錄保留。
  3. 現在想同步/備份的最大Logs已經在~Dropbox/Adium_Logs裡面了,接下來請在每台電腦開啟終端機來建立symbolic link。
    • cd ~/Library/Application Support/Adium 2.0/Users/Default
    • 用ls確定Logs資料夾已被搬移或刪除
    • ln -s ~/Dropbox/Adium_Logs Logs
    1. Done! 現在每當Adium需要讀取對話或是寫入對話以後,都會到symbolic link指到的~/Dropbox/Adium_Logs裡去讀寫。
    其實如果Adium能像MSN一樣,允許使用者指定存放對話記錄的路徑就省事多了Orz。




    2010年9月12日 星期日

    [食記] 澎湖:龍門海鮮餐廳

    拖稿兩個月在開學前還是趕快寫一下吧XD。

    澎湖出遊前在PTT和網路上到處亂爬文,總算是有貢獻到一次吃的行程,而且值回票價!


    店名:龍門海鮮餐廳

    地址:澎湖縣湖西鄉龍門村58之2號 (沿著204縣道一路往東就對了,餐廳就在馬路邊)

    官方無名:http://www.wretch.cc/blog/canwell37 target="_blank"

    沿著菊島去旅行的介紹:http://goo.gl/r4Mz

    鎮店名菜:水晶小管糖醋魚球活跳胭脂蝦

    只要報上自己是PTT或菊島的網友,就能享85折優惠,
    外加官網不時有加贈一道菜的活動喔!


    當初訂位時,考量當天行程,加上想故意餓一點XD,問老闆說如果訂晚上八點會不會太晚。結果他回答可以為了我們開到八點,真是太感人了T.T,一開始就覺得老闆人很好。

    以下照片由於相機品質因素,加上我們筷子動太快了,品質不是很好請多包含XD,其實每一道菜的份量都是不少的!







    鎮店名菜--水晶小管~就是小管冰鎮沙拉啦~這道菜由本店創始的!
    炎炎夏日吃這種涼品別有一番風味,應該是我吃過最棒的一次小管了,八個人吃也很OK!





    生吃海膽:一樣是涼品,記得吃起來軟綿綿的。



    鎮店名菜--糖醋魚球。糖醋很下飯,這道菜蠻快就被清掉了XD。

    很可惜另一道鎮店名菜--活跳胭脂蝦 (活的胭脂蝦,用酒把它迷昏之後,再丟入冰水中冰鎮),因為缺貨所以沒吃到:(



    生吃絲瓜:第三道涼品,夏日好夥伴。我第一次吃生的絲瓜,就像瓜類水果一樣並不可怕,配上冰塊跟醬汁口感很不錯!



    洋蔥炒紅蚵:我們吃速太快了只剩一半Orz。可惜沒有點到顆粒更大的石蚵,覺得大的蚵類吃起來會更爽:p



    鹹魚炒飯:也是客人喜歡點的食物之一,可能因為飯是主食吧。細小的鯖魚埋藏在炒飯中,增添不少味道。網路上的評價是米飯「粒粒分明」,但我覺得老闆這次炒得有點溼不太成功,或許是趕下班吧Orz。



    海鱺生魚片:這份量真是超大方(21塊?)而且又不貴,跟前一天吃到的地雷海鮮店比好太多了!!!



    照片有些遺漏...總之呢,我們八個男生點了大約八菜一湯吧,雖然每道菜總是迅速被清光XD,但整餐下來仍然很滿足,也夠飽,以餐廳快打烊的水準已經算上等好料了。

    PTT板友價85折之後,一人只花380元(湯的單價高蠻多的,所以其實能更省),跟預算較高的一次家聚錢差不多,但這次可是吃海鮮呀呀呀!!!真的是值回票價!

    老闆人也很好,點菜時就給了不錯的建議,甚至問了我們的預算後,還在腦中先幫我們盤算點什麼比較合適。每上一道菜也會做一些解說,其實老闆蠻幽默的,屬於冷面笑匠型,開玩笑時自己都不會笑XD。


    臨走前老闆說他自己有設部落格,希望我們能拍照留念,看著我們比的手勢應該就知道大家今天的評價如何了^__^。最後的最後,好客、大方的老闆還帶我們參觀他們的活海鮮,我記得有看到一條又大、速度又超快的魚。澎湖真是吃海鮮的好地方,只是要挑對店家喔^_<


    我記得老闆相簿的註解好像是:大口吃冰的八位帥哥?Orz

    2010年7月27日 星期二

    關於Apple以$19,900出貨Mac Mini Server的想法

    昨天晚上回家就看到Apple願意$19,900出貨的消息

    很驚訝(這是Apple Taiwan被罵至今難得白回來的一次啊XD,雖然這次決定應該還是聽命行事。)

    也佩服Apple這次大快人心

    很爽!


    不過昨天邊睡覺邊想邊擔憂...

    真的出貨的話可能會有很「混亂」的現象

    我是說後續效應


    至於怎麼個混亂法

    身為利害關係人現在不方便透漏

    不過市場可能真的會被打亂


    例如敝人從現在起宣布:

    『向敝人諮詢Mac Mini Server改機服務必須收費(笑)。』


    我還是覺得送個幾千元不限商品的Apple Store折價券最實在啦

    雖然少掉賺暴利的機會

    但這應該是最不會影響市場的方式(而且是一個可能「有價無市」的市場)


    甚至折價券送到$19,900可能影響都沒有出貨大

    只想撿便宜的人拿去賣給Apple fans一定會有人撿!


    會這樣想還是因為市場機制的真諦:

    『商品與服務會從對他價值(最)低的人,轉移到對他價值(最)高的人手上。』

    我不管怎麼處置我的Mini Server都會希望符合這個原則

    至於賺個價差只是順便而已XD


    把Mac OS X Server當Mac OS X來用已經夠浪費了(是我的話會這樣)

    如果拿來裝Windows就......


    消保會&消基會似乎把Mac Mini Server當作一般「桌上型電腦」來討論

    http://www.cpc.gov.tw/detail.asp?id=1564

    拜託,差多了好嗎?

    所以真的以$19,900出貨對整體(全球)消費者是不是好事(不只是金錢上)

    我不太樂觀 :(

    應該會讓Mac OS X的使用者經驗先扣分吧Orz(因為用的是Server)



    2010年5月16日 星期日

    [Mac] 用QuickTime X + Soundflower進行含系統音效的螢幕錄製

    Keywords: QuickTime X, audio, screen capture, screen recording.

    Snow Leopard上的一個很大的改變是新的QuickTime X,其中一個好用的功能就是螢幕錄製(screen recording)。可是預設是沒有辦法連同系統音效一起錄製的,只能選擇麥克風當作音源。其實透過 Soundflower 這個套件可以幫我們做到。
    1. 至專案網址 http://code.google.com/p/soundflower/ 下載soundflower的dmg檔。掛載後點選Soundflower.mpkg,照正常的步驟安裝。雖然沒強制,但裝完之後建議重開機。

    2. 至系統偏好設定 -> 聲音 -> 輸出,原本的聲音輸出設備是內建揚聲器,現在改選Soundflower (2ch or 16ch)


      Note1: 從現在開始會聽不到系統音效,因為所有的音效輸出都被導到Soundflower。

      Note2: 有個方便的切換方法:option + click工具列右上方的喇叭圖示,可直接切換聲音輸出設備。


    3. 開啟QuickTime X -> 檔案 -> 新增螢幕錄製,點選向下箭頭,麥克風選擇剛剛設定的Soundflower (2ch or 16ch),再按下錄製鈕就可以錄製有聲音的畫面了。


      Note:
      錄製的時候仍然聽不到任何聲音,感覺有點怪但是沒辦法XD。

    4. 完成之後再用2.的方法,把聲音輸出設備改回內建揚聲器,才能再聽到聲音。這樣子剛剛錄製的螢幕就含有系統音效了!


    獻醜一段我剛剛錄的一個例子XD


    參考資料:

    1. Snow Leopard – Use Quicktime Player to capture web video and audio | Apple Mac | Tech-Recipes
    2. How to use Snow Leopard’s new QuickTime Screen Recording feature to record Hulu content for your iPhone — Sample the Web

    2010年1月29日 星期五

    2010年1月10日 星期日

    OpenCV: How to print (dump) Matrix (Image) contents with specified range

    After grabbing ideas from Random Noise blog, I created my own printMat() functions

    The first works for single-channel 2D matrices of type CvMat.
    Better yet, it has default arguments (rowBeg, rowEnd, colBeg, colEnd) for you to specify the range.
    If none is specified, the function prints the entire matrix.

    The second is just the overloaded version for the type IplImage, so this function can print both a matrix and an image depending on argument 1.


    Function prototypes:
    void printMat(CvMat *matrix, const char *name, int rowBeg = -1, int rowEnd = -1, int colBeg = -1, int colEnd = -1);

    void printMat(IplImage *img, const char *name, int rowBeg = -1, int rowEnd = -1, int colBeg = -1, int colEnd = -1);


    Function implementations:
    /* Print a single-channel 2D matrix, with default range being the whole matrix */
    void printMat(CvMat *A, const char *name, int rowBeg, int rowEnd, int colBeg, int colEnd) {
    /* If the (row, col) range is all in default => Use the full range */
    if (rowBeg == -1 && rowEnd == -1 && colBeg == -1 && colEnd == -1) {
    rowBeg = 0; rowEnd = A->rows - 1; colBeg = 0; colEnd = A->cols - 1;
    }

    /* Check for validity of the privided (row, col) range */
    if (rowBeg < 0 || rowEnd >= A->rows || rowBeg > rowEnd || colBeg < 0 || colEnd >= A->cols || colBeg > colEnd) {
    error("printMat(): Invalid range of (rowBeg, rowEnd, colBeg, colEnd)." );
    }

    cout << endl << name << "(" << rowBeg << ":" << rowEnd << ", " << colBeg << ":" << colEnd << ") =\n\n";
    for (int i = rowBeg; i <= rowEnd; i++) {
    switch (CV_MAT_DEPTH(A->type)) {
    case CV_32F:
    case CV_64F:
    for (int j = colBeg; j <= colEnd; j++)
    /* Use C's printf() for convenience :p */
    printf("%7.3f ", (float)cvGetReal2D(A, i, j));
    break;
    case CV_8U:
    case CV_8S:
    case CV_16U:
    case CV_16S:
    case CV_32S:
    for (int j = colBeg; j <= colEnd; j++)
    /* Use C's printf() for convenience :p */
    printf("%4d ", (int)cvGetReal2D(A, i, j));
    break;
    default:
    cerr << "printMat(): Matrix type not supported.\n";
    exit(EXIT_FAILURE);
    break;
    }
    cout << endl;
    }
    cout << endl;
    }





    /* Print a single-channel image, with default range being the whole matrix */
    /* This is the overloaded version for IplImage */
    void printMat(IplImage *A, const char *name, int rowBeg, int rowEnd, int colBeg, int colEnd) {
    /* If the (row, col) range is all in default => Use the full range */
    if (rowBeg == -1 && rowEnd == -1 && colBeg == -1 && colEnd == -1) {
    rowBeg = 0; rowEnd = A->height - 1; colBeg = 0; colEnd = A->width - 1;
    }

    /* Check for validity of the privided (row, col) range */
    if (rowBeg < 0 || rowEnd >= A->height || rowBeg > rowEnd || colBeg < 0 || colEnd >= A->width || colBeg > colEnd) {
    error("printMat(): Invalid range of (rowBeg, rowEnd, colBeg, colEnd)." );
    }

    cout << endl << name << "(" << rowBeg << ":" << rowEnd << ", " << colBeg << ":" << colEnd << ") =\n\n";
    for (int i = rowBeg; i <= rowEnd; i++) {
    switch (A->depth) {
    case IPL_DEPTH_32F:
    case IPL_DEPTH_64F:
    for (int j = colBeg; j <= colEnd; j++)
    /* Use C's printf() for convenience :p */
    printf("%7.3f ", (float)cvGetReal2D(A, i, j));
    break;
    case IPL_DEPTH_8U:
    case IPL_DEPTH_8S:
    case IPL_DEPTH_16U:
    case IPL_DEPTH_16S:
    case IPL_DEPTH_32S:
    for (int j = colBeg; j <= colEnd; j++)
    /* Use C's printf() for convenience :p */
    printf("%4d ", (int)cvGetReal2D(A, i, j));
    break;
    case IPL_DEPTH_1U:
    for (int j = colBeg; j <= colEnd; j++)
    /* Use C's printf() for convenience :p */
    printf("%1d ", (int)cvGetReal2D(A, i, j));
    break;
    default:
    cerr << "printMat(): Matrix type not supported.\n";
    exit(EXIT_FAILURE);
    break;
    }
    cout << endl;
    }
    cout << endl;
    }


    Powered By Blogger

    Google Analytics