2013年6月30日 星期日

TinyXml、TinyXPath 基本讀取


需求:欲讀取下列XML檔案中的TEXT資料:
 

 127.0.0.1
 800


 
string readXmlSingleText(string file,string xpath){

 char errStr[MSG_MIN_LEN] = {'\0'};

 TiXmlDocument xmlDoc(file.c_str());
 xmlDoc.LoadFile();

 if(xmlDoc.ErrorId() > 0){
              //error do something..
 }

 TiXmlElement* pRootElement = xmlDoc.RootElement();

 if(!pRootElement){
             //error do something..
 }


 TinyXPath::xpath_processor xproc(pRootElement,xpath.c_str()); 
 unsigned  nodeCount =xproc.u_compute_xpath_node_set();          
 if(nodeCount==0) {
            //error do something..
 } 

 TiXmlNode *xnode = xproc.XNp_get_xpath_node(0);
 return string(xnode->ToElement()->GetText());
}

使用方式如下:
    string ip = readXmlSingleText("setting.xml","//ROOT/SEND-IP");

2013年6月28日 星期五

SQL - 如何指定DATE PART的特定時間

假設我有一個需求,需要在TSQL中宣告一個時間,日期為當下的日期(例如現在撰文的6/29)、並指定DATEPART HOUR為20,DATEPART MIN為45,該如何做?


 
     DECLARE @STARTDATE AS DATETIME 
     SET @STARTDATE = GETDATE();
     SET @STARTDATE =  DATEADD(hour, 20, DATEDIFF(DAY, 0, GETDATE()))
     SET @STARTDATE =  DATEADD(minute , 45, @STARTDATE)

其中最重要的應該是第2行
SET @STARTDATE = DATEADD(hour, 20, DATEDIFF(DAY, 0, GETDATE())),
先運用DATEDIFF(DAY, 0, GETDATE())找出,當下時間(假設為2013/6/29 18:05)與第0天(1900-1-1)相差了幾"日",此時取出來的時間皆為00:00分;之後再運用DATEADD指定hour與欲得到的hour就可以了

2013年6月23日 星期日

google checkout API -only for US and UK

這篇只是抱怨文

因為工作需要研究了google in-app billing機制,但是研究了之後發現這個機制其實對於開發者來說並不安全,因為檢查購買資訊判斷這些都是由CLIENT端發動,然後由CLIENT做驗證(驗證購買資訊),以 Android SDK中的in-app Billing範例TrivialDrive來說,【infinite gas】、【premium】這兩樣等於是無敵VIP的物品是否購買的判斷,居然都是從CLIENT端透過API發動詢問,然後從CLIENT端接收回應,由CLIENT開發者自行決定是否有購買...這怎麼看都是個大問題,找了關於in-app Billing Server Side validate方面的討論挺多的,結果找到了Google CheckOut的API,頓時眼睛一亮,這就是我要的!!

接著照者說明開始做...奇怪了...找的到merchant ID,就是找不到merchant Key啊!!繼續google下去,才發現原來要註冊為正式的checkout商家會員,居然只限定US and UK(請看某使用者回應)...@&*^#&# ,因為英文閱讀能力不好,所以這樣找尋大概來來回回花了3小時以上有吧.........得到最後的答案是這樣真的很.........


所以答案是,google in-app billing機制不合我用,可是還是看到不少game使用,神X之塔是因為這樣才被改的無限寶石是吧??但RO手機版也有使用,卻沒有這種問題的樣子,還是他們有美國據點或關係才能使用呢? 這就不得而知了..

好吧其實嚴格來說這篇也不算是完全抱怨啦,至少我知道了他們機制only for US and UK...

更新:
這裡 給了我希望,這做法應該是可行的!!怎麼我就沒想到呢,來去試試看...


2013/6/27 update:
忘記更新,確定可行,因為buy的時候不需要key,所以key可以安全地置放於server端驗證使用~








2013年6月22日 星期六

android初體驗 - 利用SharedPreferences來保存暫時資料


先貼Code,以下為goole in-app billing的Example擷取出來:

  
    void saveData() {
        SharedPreferences.Editor spe = getPreferences(MODE_PRIVATE).edit();
        spe.putInt("tank", mTank);
        spe.commit();
        Log.d(TAG, "Saved data: tank = " + String.valueOf(mTank));
    }

讀取回資料的方式也相當簡單:
  
    void loadData() {
        SharedPreferences sp = getPreferences(MODE_PRIVATE);
        mTank = sp.getInt("tank", 2);
        Log.d(TAG, "Loaded data: tank = " + String.valueOf(mTank));
    }

上述的getPreferences(int mode)其實等同於呼叫getSharedPreferences(activity's class name, int mode)
而SharedPreferences.getInt(String key, int defValue) 後的第二個參數代表是default value
應該可以很簡單理解所以就先記錄下來吧!

2013年6月21日 星期五

dbunit初體驗 - 新增table data from existing xml data


首先,做一些setup工作
        
private MsSqlConnection _dbunitConnection;
 @Before
 public void setUp() throws Exception {
     _dbunitConnection = new MsSqlConnection(DBUnitUtilities.createHsqlDBConnection(), null);
      //do something setup..
 }

重點在這:
 IDataSet setup = DBUnitUtilities.getDataSet("datasheet\\Banner11.xml");
 DatabaseOperation.CLEAN_INSERT.execute(_dbunitConnection,setup);