2012年6月30日 星期六

Pipe to a Subprocess


偶爾想偷懶的我會在code中使用system(),呼叫shell來執行一些東西,並且將執行完的結果丟回來程式中處理,這時候popen就很好用了,popen - pipe stream to or from a process。
popen允許開啟read或write pipe,不能夠同時開啟為read/write,read可以讓程式從popen中讀回來處理,而write可以將程式中的資料丟到popen處理。

popen(,"r")
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    char buf[128];
    float a, b, c, d;
    FILE *fp;
    if ((fp = popen("(df -h 2>/dev/null) | tail -n +2", "r")) == NULL) {
        fprintf(stderr, "popen() failed\n");
        return -1;
    }
    while (!feof(fp)) {
        fscanf(fp, "%*[^ ]%f%*[^1-9]%f%*[^1-9]%f%*[^1-9]%f%%%*[^\n]", &a, &b, &c, &d);
        printf("%f/%f/%f/%f\n", a, b, c, d);
    }
    return 0;
}


popen(,"w")
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    char buf[] = "1 2 3 4 5";
    float a, b, c, d;
    FILE *fp;
    if ((fp = popen("xargs -n 1 > /tmp/xx", "w")) == NULL) {
        fprintf(stderr, "popen() failed\n");
        return -1;
    }
    fprintf(fp, "%s", buf);
    pclose(fp);
    return 0;
}


    參考資料:
  • The GNU C Library, Chapter 15.2




2012年5月26日 星期六

Design Patterns - Command pattern


Command pattern是一種將Action封裝起來,並提供一個general的interface作為呼叫時(invoke)的統一介面。

舉個生活例子來說明,想必您一定用過萬用遙控器,User可以設定遙控器上某個按鈕1的功能為電視的開關,所以當User按下按鈕1,就可以開關電視,接著User設定按鈕2為控制冷氣的開關,所以當User按下按鈕2,就可以開關冷氣,這樣簡單的運作就是一種Command Pattern。
電視開關是一種Action,被封裝成遙控器上面的按鈕,對User來說,這是一個General的interface,而且User在變更任和按鈕功能時,並不會影響遙控器上面的其他按鈕。

Command pattern有三個名詞需要解釋一下:
client:The client instantiates the command object and provides the information required to call the method at a later time.
invoker: The invoker decides when the method should be called.
receiver: The receiver is an instance of the class that contains the method's code.

client就可以想成"設定按鈕"的動作,invoker就是User了,而receiver就是電器了。

圖取自http://en.wikipedia.org/wiki/Command_pattern.


#include <iostream>

class Command {
public:
    virtual int exec(void *args) = 0;
};

// Receiver
class TV {
    bool turn_on_off;
public:
    void pwr_switch() {
        if (turn_on_off) {
            std::cout << "Turn off TV" << std::endl;
        } else {
            std::cout << "Turn on TV" << std::endl;
        }
        turn_on_off = !(turn_on_off);
    }
};

class CmdTvSwitch: public Command {
    TV *_tv;
public:
    CmdTvSwitch(TV *tv) {
        this->_tv = tv;
    }
    virtual int exec(void *args) {
        this->_tv->pwr_switch();
        return 0;
    }
};

int main(int argc, char *argv[])
{
    // Client
    TV tv;
    Command  *c;
    c = new CmdTvSwitch(&tv);
    c->exec(NULL);
    c->exec(NULL);
    return 0; 
}

就目前個人在使用這個Pattern上面的感觸就是"Command pattern是一種將Action封裝起來,並提供一個general的interface作為呼叫時(invoke)的統一介面。"比如,我在寫Message Queue會用到,提供新的指令供外界呼叫也會用到。
    參考資料:
  1. http://en.wikipedia.org/wiki/Command_pattern
  2. http://caterpillar.onlyfun.net/Gossip/DesignPattern/CommandPattern.htm




2012年5月19日 星期六

理財常用的Link



股匯市原物料期貨報價, http://www.stockq.org/
全球股市排行榜, http://www.stockq.org/market/
貨幣各國匯率歷史紀錄, http://fxtop.com/en/historates.php
金磚四國和台灣股市走勢圖, http://finance.yahoo.com
台灣地區銀行利率, http://www.taiwanrate.com/
台灣地區各網路銀行入口, http://www.easyatm.com.tw/playatm.html
文茜世界財經週報, http://www.youtube.com
57金錢爆, http://www.youtube.com
國際主要股市月報 , http://www.twse.com.tw/ch/statistics/statistics.php
基金績效,
台股上市公司本益比, http://www.twse.com.tw
台股上櫃公司本益比, http://www.otc.org.tw
基金定期定額試算, http://fund.scsb.com.tw
STOCK-AI提供各類經濟指標數據, https://stock-ai.com/
blog
法意聯盟, http://www.wretch.cc/blog/joejoejoe



持續更新中...



熱門文章