2014年11月25日 星期二

[Web] 使用Ajax更新局部頁面後javascript失效問題

  • 可以重新讀取js檔(因使用第三方js使用此方法較快)
<script type="text/javascript">
    function load_js()
    {
        var head= document.getElementsByTagName('head')[0];
        var script= document.createElement('script');
        script.type= 'text/javascript';
        script.src= '../thirdparty/Metro-UI-CSS-master/docs/js/metro.min.js';
        head.appendChild(script);
    }
   
    function js_AddToCar(Id) {
        $.ajax({
            type: "POST",
            url: "/AddCartFun",
            data: { msg: Id }

        })
        .done(function (data) {
            $('li#brid').html(data);
            load_js();
        });

    };
</script>
  • 若是自己的function可以使用重新綁定(live, bind)元件事件

2014年11月24日 星期一

[C/C++] C++ 運算子重載(4)

class E
{
public:
    int *num;   // 指標必須再new 1份
    E& operator=(const E& rhs)
    {
        this->num = new int((*rhs.num));   // 避免互相影響
        return *this;
    }
}
class A
{
    //member operator
    A& operator+=(const A& rhs)
    {
        this->num += rhs.num;
        return *this;
    }
    int num;
};
E test1;
*test1.num = 5;
    
E test2;
test2 = test1;

2014年11月23日 星期日

[C/C++] C++類別成員覆蓋性(3)

#include <iostream>
using namespace std;

class CA{
  public:
     CA(){a=2; b=3; c=4; }
     int a, b, c;
};

class CB: public CA{
  public:
     CB(){ a=100; b=200;}
     int a, b;      // 可以覆蓋覆類別
     int getX(){ return a*b; }
     int getY(){ return CA::a*CA::b*c; }    // 若要使用父類別
};

int main()
{
  CB b;
  cout<< "a*b= "<< b.getX()<< endl;
  cout<< "a*b= "<< b.getY()<< endl;
  b.a = 1;
  b.CA::a = 5;
  b.c = 2;
  cout<< "a*b= "<< b.getX()<< endl;
  cout<< "a*b= "<< b.getY()<< endl;
  return 0;
}

[C/C++] C++類別繼承筆記(2)

#include <iostream>

using namespace std;

class A
{
    public :
    A() : ia(10){}
    
    int ia;
};

class B : public A
{
    public :
    B() : ia(20){}      // error    ia不屬於本身類別成員
    B(){ ia = 20; }     // OK       須在建構式內設定值
    int ib;
};

int main()
{
    A ca;
    B cb;
    
    ca = cb;    // OK       A有的成員 B都會有
    cb = ca;    // error    B因繼承A 可能有A沒有的成員
    
   cout << ca.ia << endl;  // 20
   
   return 0;
}

2014年10月28日 星期二

[Web Matrix] 遇到下列站台已停止



  • WebMatrix執行預覽時若遇到下列站台已停止時
  • 執行 IISExpress.exe /trace:Error 查看是否正常
    • 錯誤: Failed to load global module C:\Program Files (x86)\IIS Express\diprestr.dll
  • 解決辦法:刪掉IIS設定檔

  • 重新啟動WebMatrix 加入網站資料夾

2014年10月27日 星期一

[8] fatal error C1900



  • 重灌VS2008 professional版遇到舊程式碼編譯出錯,訊息如下
    • fatal error C1900: Il mismatch between 'P1' version '20080116' and 'P2' version '20070207'
  • 解決辦法: 安裝VS2008 SP1
    • http://www.microsoft.com/zh-tw/download/details.aspx?id=10986

2014年10月7日 星期二

[Web Matrix] 本機使用Web deploy自動上傳到遠端server


  • 加入Recommended Server Configuration for Web Hosting Providers並安裝
  • 右上角搜尋Web Deploy
  • 加入Web Deployment Tool 2.1並安裝
  • 順利的話IIS管理員的網站應該會出現deploy選項
  • 接著設定WebMatrix發佈選項,測試連線是否成功

  • 若不知自己網站的port可以參考


  • 如此就能把編輯的檔案自動上傳到server上的資料夾了






2014年9月28日 星期日

[1] 原生碼native code 是什麼

nativecode或稱為binarycode/bitcode是將程式編譯成instructionsets(assemblycode)
最簡單的例子就是windows下的C++exe檔執行時直接load進memory
相對於nativecode的則是

bytecode是將程式編譯成javabytecode/MSILJAVA、Flash程式就是這種型式
執行時需透過一個virtualmachine/runtime

說明nativecode編譯器以前,
讓我先解釋另一個名詞─p-code,
p-code的意思是「虛擬的可執行碼」,為什麼說是「虛擬的」呢?
因為p-code雖然是可執行碼,但卻不是由CPU直接執行的
(必須經由「解譯器」解譯後方可執行),
所以不算是「真正的」可執行碼,故稱之。

相對的,nativecode則是由CPU直接執行的可執行碼。
VB4.0以前的版本都一直將程式編譯成p-code,而由於p-code必須經由「解譯器」解譯後方可執行,
所以執行效能不及nativecode,為了改善這個缺點,VB5.0的新功能之一便是:將程式編譯成nativecode。
據微軟宣稱,由於使用了nativecode,VB5的程式平均要比VB4的程式快20倍以上。

2014年9月23日 星期二

[QT] 使用designer搭配stylesheet (CSS) 美化介面


QT的stylesheet用法可參考官網,大致和CSS同
http://qt-project.org/doc/qt-4.8/stylesheet-examples.html#customizing-a-qpushbutton-using-the-box-model

[1] 在designer中點選元件的stylesheet來作編輯

[2]  打開編輯樣式表,可使用上方的選項來快速產生代碼

[3] 再來介紹如何加入圖片
     1.新增資源找地方存檔(.qrc)
     2.新增前置字串,打上斜線(/),用來找.qrc檔的相對路徑,有資料夾就再加資料夾名
     3.接著就可以新增圖片檔到qrc裡囉
     4.加好之後,就可以從建好的資源檔中選取圖片產生代碼了


[4] 產生好的qrc檔須經過編譯成cpp檔並加入專案才能在畫面上看到,否則介面的.h檔內的stylesheet無法找到,一樣使用QT BIN資料夾下rcc.exe
    執行rcc image.qrc -o image.cpp

[QT] 使用QT5.2.0 designer 產生UI給C++使用

此方式使用designer 建立介面,當然QT creator也是可以
但因VS介面較熟悉所以只用designer 建立介面,不使用QT creator建專案,覺得彈性也比較大

[1] 開啟designer建立widget



[2] 拉好所需的介面,存成.ui檔
[3] 使用QT bin資料夾下的uic.exe 將ui檔編譯為h檔
      uic.exe ClientUI.ui -o ClientUI.h
[4]  將h檔拉進專案,需要注意的是,為方便之後可以繼續以designer修改介面,最好避免手動去修改h檔,uic.exe重編會覆蓋掉你修改過的,所以須小心,那怎麼比較好呢,個人是建立子類別來繼承此UI類別,把要另外加的layout/元件和signal/slot和需要的UI加在這裡,(應該也可以直接從new出來的父類別改)
[5] 在main裡new出介面

QWidget widget;       // widget  
ClientUI_Imp ui;      // .ui產生的類別

ui.setupUi(&widget);  // 設定介面
ui.initCustomGui();   // 另外自定的介面
ui.initconn();        // 另外自定的signal/slot

widget.show();        // 顯示介面

2014年9月14日 星期日

[C/C++] char* 和 char[] 使用差別

char *p = "abc"; // 指標宣告, "abc"這個陣列會放在記憶體的"常數區塊",不允許被修改
char q[] = {'a','b','c',0}; // 陣列宣告,同時給予初始值
char r[] = "abc"; // 陣列宣告, 此空間就放在堆疊上
q[0] = '!'; // q字串變成 "!bc"
r[0] = '!'; // r字串變成 "!bc"
*p = '!'; // 這在Unix系統上會造成Segmentation fault (core dumped)

#include <iostream>
#include <string.h>
#include <stdlib.h>

using namespace std;

char * strcopy(char *dest, char *from)
{
    char *p = dest;
    while(*dest++ = *from++)
    ;
    return p;
}

char * strconcat(char *dest, char *from)
{
    char *p = dest;
    while(*dest) dest++;
    
    while(*dest++ = *from++)
    ;
    
    return p;
}

char * strrever(char *dest)
{
    char *p = dest;
    char *pt = dest;
    
    while(*dest) dest++;
    ; 
    for(--dest; pt < dest; pt++, dest--)   
    {
        *pt = *pt ^ *dest;
        *dest = *pt ^ *dest;
        *pt = *pt ^ *dest;   
    }
   
    return p;
}


int main()
{
   //char str1[]="123      ";           // dest須給足空間 否則會有問題
   //char *str1 = "123456789"           // error 指標已指定長數空間 不能更改其內容
   char *str1 = (char *)malloc(20);     // dest須給足空間 否則會有問題
   char *str2="abcdef";
   
   char *str3 = strcopy(str1, str2);
   
   cout << str1 <<endl;
   cout << str2 <<endl;
   cout << str3 <<endl;
   
   //strcat(str1, str2);
   char *str4 = strconcat(str1, "test");
   
   cout << str1 <<endl;
   cout << str2 <<endl;
   cout << str4 <<endl;
   
   char *str5 = strrever(str1);
   
   cout << str1 <<endl;
   cout << str2 <<endl;
   cout << str5 <<endl;
   
   return 0;
}




2014年6月24日 星期二

[1] Windows Programing - 查詢記憶體使用量

範例:

.h
#ifndef EXTRAAPI_H
#define EXTRAAPI_H

class extraAPI
{
public:
 extraAPI();
 ~extraAPI();

 static void memoryinfo();
};

#endif // EXTRAAPI_H
.cpp
#include "windows.h"
#include "stdio.h"
#include "psapi.h"

// 需加入這兩個lib
#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "psapi.lib")

void extraAPI::memoryinfo()
{
 PROCESS_MEMORY_COUNTERS pmc;
 GetProcessMemoryInfo( GetCurrentProcess(), &pmc, sizeof(pmc)); //get memory usage

 MEMORYSTATUSEX statex;
 statex.dwLength = sizeof (statex);
 GlobalMemoryStatusEx (&statex);
 (statex.ullTotalPhys-statex.ullAvailPhys)/1024;  // 全部已使用記憶體 3213064 (Kb)
 pmc.WorkingSetSize/1024;       // 此程式WorkingSet記憶體: 18832 (Kb)
}

2014年5月7日 星期三

[桌面小工具] 黃金即時報價 製作

win7 桌面小工具簡單製作
[1] 準備xml檔,設定來源為要顯示的html檔(如goldprice.html),範例如下
<gadget>
<name>SDK Hello World</name>
<version>1.0.0.0</version>
<author name="Microsoft">
    <info url="msdn.microsoft.com" />
</author>
<copyright>&#169; Microsoft Corporation.</copyright>
<description>"HelloWorld" Sidebar gadget sample.</description>
<hosts>
    <host name="sidebar">
      <base type="HTML" apiVersion="1.0.0" src="goldprice.html" />
      <permissions>Full</permissions>
      <platform minPlatformVersion="1.0" />
    </host>
</hosts>
</gadget>
[2] 準備html(goldprice.html)檔,截取一部分的網頁內容,並調整適當大小,和設定背景圖片(自行準備),並設定2分鐘更新一次網頁,須自行修改網頁代碼(不另說明),範例如下
<html >
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=Unicode" />
        <title>Hello World</title>
        <style type="text/css">
        body
        {
            margin: 0;
            width: 400px;
            height: 150px;
            font-family: verdana;
            font-weight: bold;
            font-size: small;
        }


        #gadgetContent
        {
            margin-top: 20px;
            width: 800px;
	    height: 150px;
            vertical-align: middle;
            text-align: center;
            overflow: hidden;
        }
        </style>
        <script type="text/jscript" language="jscript">
			setTimeout("self.location.reload();",60000);
            // Initialize the gadget.
            function init()
            {
                var oBackground = document.getElementById("imgBackground");
                oBackground.src = "url(whiteback.png)";
            }
        </script>
		<link rel="stylesheet" type="text/css" href="http://img.hexun.com.tw/gold/2010/gold.css" />
		<script language="javascript" src="http://img.hexun.com.tw/www/2010/js/tab.js"></script>
    </head>

    <body>
		<style type="text/css">
		.newgp0124{width:380px;float:left;margin:10px;display:inline;overflow:hidden;height:130px;margin-left:30px;}
		.gpcont{ height:124px; padding:6px 10px 0 10px;border:#cbcdcc 1px solid; border-top:none; float:left; width:278px; overflow:hidden;}
		.righttag{}
			 
		.tagn,.tagf{  padding:5px 7px;text-align:center; cursor:pointer;}
		.tagn{border-bottom:#cbcdcc 1px solid;}
		.tagf{ border:#cbcdcc 1px solid; border-right:#cbcdcc 1px solid;border-bottom:none;color:#000;}
		.hexunHidden{display:none}
		.hexunShow{display:block}
		#righttag tr td a {color:#707070;text-decoration:none;}
		#righttag tr td.tagf a {color:#000;}
		.goldHqContainer {width:958px;overflow:hidden;margin:10px auto;border:1px solid #ccc;}
		.msgContainer {position:relative;width:380px;height:85px;z-index:1;overflow:hidden;top:10px;}
		.currentImg {position:absolute;top:-15px;}

		.fixedMsg {width:500px;float:left;height:130px;margin-top:10px;display:inline;margin-left:30px;}
		.fixedMsg table tr td a {text-decoration:none;color:#000;}
		.imgDateShow {width:180px;height:85px;float:right;}
		.imgDateTop {overflow:hidden;}
		.imgDateTop img {width:35px;height:47px;float:left;margin-top:12px;}
		.imgDateNumber {padding-left:10px;float:left;display:inline;font-family:Arial;}
		.imgDateNumber strong {display:block;font-size:30px;color:#009900;line-height:28px;margin-top:10px;}
		.imgDateNumber span {display:inline-block;margin-left:5px;margin-right:5px;color:#090;font-size:14px;}
		.imgDateBottom {color:#ccc;margin-top:3px;text-align:center;}
		.rightMsg td {height:42px;text-align:center;cursor:pointer;}
		.currentTab {width:99px;border:1px solid #ECECEC;border-right:none;}
		.noTab {border-right:1px solid #ECECEC;}
		.rightMsg td div {background:#fff;}
		.rightMsg .noTab div {width:96px;height:38px;background:#F5F5F5;margin-top:1px;margin-left:0;float:left;line-height:38px;}
		.showMsgLayer {float:left;width:380px;margin-left:20px;display:inline;overflow:hidden;}

		.showLayer1 dl{float:left;width:180px;overflow:hidden;margin-top:12px;margin-right:10px;}
		.showLayer1 dl dt {float:left;color:#336699;width:50px;}
		.showLayer1 dl dd {float:left;display:inline;margin-left:6px;overflow:hidden;text-align:right;}
		.showLayer1 dl dd.last {width:15px;}
		.showMsgLayer th {font-weight:normal;color:#ccc;}
		.showLayer1 table tr td {font-family:Arial;}  </style>
		<script type="text/javascript" src="http://img.hexun.com.tw/gold/js/hexun.index.gold.js"></script>
		<div class="newgp0124">
				<table width="100%" border="0" cellspacing="0" cellpadding="0"  class="righttag" id="righttag">
					<tr>
						<td class="tagf"  id="tagname_nowhot1"><a href="http://gold.hexun.com.tw/hjxh/" target="_blank">黃金</a></td>
									</tr>
				</table>
				<div class="msgContainer">
					<a href="###" target="_blank"><img class="currentImg" id="currentImg" src="http://dfile.tool.hexun.com.tw/homepage/gold/img/avgprice.gif?1379919748215" /></a>
					<div class="imgDateShow" id="imgDateShow">
						<!--div class="imgDateTop">
							<img src="down.gif" />
							<div class="imgDateNumber">
								<strong>2447.31</strong>
								<span>-100.00</span><span>-0.05%</span>
							</div>
						</div>
						<div class="imgDateBottom">2013年9月18日 11:59 北京時間</div-->
					</div>
				</div>
		</div>
		<script type="text/javascript">
			hexun.index.Gold.get().init();
		</script>
    </body>
</html>
[3]  將做好的網頁(包含xml,圖檔等)壓縮成zip檔,之後更改副檔名為.gadget
[4]  執行.gadget檔就可以安裝,並出現在桌面,可再自行設定不透明度等

[5]  安裝完成應該會出現在使用者路徑的 AppData\Local\Microsoft\Windows Sidebar

2014年5月2日 星期五

[C/C++] struct 和 union 的sizeof相關判斷方式

sizeof 相關整理
            32bit    64bit(LLP64)    64bit(LP64)
char         1        1                1            byte
short        2        2                2
int            4        4                4
pointer     4        8                8
long         4        4                8


struct 對齊的size判斷
1. #pragma pack(4) 超過最大成員型別的size以 最大成員型別的size 為區塊依據 (4 byte表示記憶體一次讀取4 byte)
2. 成員順序會影響struct的總大小
3. 一個成員不能拆開在不同區塊
4. 區塊空間足夠才可合併,例如char和short可合併在區塊大小為4 byte的空間
5. struct中的struct/union 須考慮子層的最大型別再對齊


union 對齊的size判斷
1. #pragma pack(4) 超過最大成員型別的size以 最大成員型別的size 為區塊依據 (4 byte表示記憶體一次讀取4 byte)
2. 以最大size的成員直接當成union的size (因空間共用)
3. 若最大size的成員型別(char)不是 成員當中型別最大的(int),則須對齊

PS. 若子層的struct/union沒有實體化只單純宣告 則不占空間, 反之有給定變數則要計算

// 例一
struct B   

    union A  // 不占空間
    { 
        int t;   //4 
        short m; //2 
        char p;  //1 
    } ;          // } AA; 若有給定名稱(實體化)則要計算
    double c;    //8 
    char p2;     //1 
}; 
// sizeof(B) = 8+8 = 16

// 例二
union A

    int t;   //4 
    short m; //2 
    char p;  //1 
} ; 
struct B   

    A a;    //4 有實體化
    double c;    //8 
    char p2;     //1 
};
// sizeof(B) = 8+8+8 = 24

2014年4月24日 星期四

[7] VS2008 如何為執行檔加入icon

1. 準備icon 可使用http://www.ifreesite.com/favicon/ 轉成桌面用較大的圖示
2. 添加資源檔 將轉好的icon匯入
3. 編譯 預設就會出現囉~

ps1.
這個只會出現在未執行時

ps2.
若要在程式執行時的視窗使用自己的圖示,請在寫代碼在程式中
以使用QT為例
QPixmap pixImg("..\\Resource\\img\\keyicon.png");
test_form->setIcon(pixImg);


2014年3月12日 星期三

[4] VS2008如何遠端偵錯

以DLL放置遠端電腦,使用本機程式讀取為例

[一] 在要放置DLL的電腦啟動遠端偵錯工具

[二] 工具->選項,設定驗證方式及port和可偵錯時間(可加長)

[三] 打開本機端的source code,打開專案屬性,確定停用最佳化,以及打開產生偵錯資訊


[四] 編譯產生DLL檔和符號檔(pdb)

[五] 將DLL放置遠端同目錄,供其他程式載入,將pdb放置與本機成是相同位置(好像可以不用放,VS會自己找)

[六] 使用 VS->工具->附加置處理序

[七] 選擇 遠端,輸入遠端的IP及之前設定的port,選擇載入此DLL的程序(此圖舉例),按附加

[八] 添加中斷點,執行本機端程式,即可偵錯

[PS]
若中斷點找不到符號?
1. 可能是code有更動,符號對不到,重新編譯,重放符號檔及DLL
2. DLL和pdb的放置位置不一樣
3. 最佳化未停用

2014年3月11日 星期二

[3] VS 如何忽略警告

[一] 忽略警告設定,可能是C的舊語法不安全造成

[2] VS如何不顯示console


[一] debug顯示console


[二] release顯示console