星期三, 2月 13, 2008

NoClassDefFoundError: org/jaxen/JaxenException

當使用dom4j,jdom等來讀xml時
會有NoClassDefFoundError: org/jaxen/JaxenException發生
因為dom4j不包含SAX與DOM"接口"
所以要多下載jaxen包

下載並解開取出jaxen.jar 引用即可以

星期三, 1月 23, 2008

抽象class與介面interface

Abstract class
可擺放實做的method,也可放抽象的method,目的在擴充,所以抽象類別是未定義完全的類別,需繼承才能使用,抽象的method可實做(擴充),可不實做(擴充)

Interface
只定義不實做method,目的讓父類別可以呼叫子類別method,因此當有多個子類別實作父類別的method,即可只透過父類別(介面)的參考呼叫各子類別的method
*interface預設public及abstract,因此有加沒加沒差

星期二, 1月 22, 2008

MySQL亂碼

在網路上找半天
原因是MySQL預設文字編碼是 cp1252 West European (latin1)
因此儲進去的格式已變成latin1了 所以用其他編碼讀取來當然會錯

最簡單的解法方法
1.網頁上 (如phpMyAdmin)
=>讓資料庫的儲存格與讀取的編碼相同
1.將文字編碼cp1252 West European (latin1) 改為utf8
2.sql connection string =>Host=localhost;Database=xxx;charset=utf8
加上編碼utf8即可正常顯示

至於原本已經存latin1的...
還沒找到解決方法


另外利用連線取資料
如果資料庫設為utf,則建利連線後
可下 mysql_query("SET CHARACTER SET 'utf8'");

星期五, 1月 18, 2008

C#動態創建類的實例

C#動態創建類的實例: "

C#動態創建類的實例,如果對性能要求不是很高,而且需要動態創建類的實例的時候可以考慮使用以下的方法:

1. 定義兩個類:
// 基類
public class BaseBusiness
{ }

// 子類
public class SampleBusiness : BaseBusiness
{ }

2. 動態創建類的實例

// 程序集名稱
string assemblyName = "abc.Business";
// 類名稱
string className = "SampleBusiness";

// 獲得指定名稱的類型:程序集名稱 + 類名稱
Type type = Type.GetType(assemblyName + "." + className);

// 創建類型的一個實例
object obj = Activator.CreateInstance(type);

// 將實例強制轉換成指定的類型
BaseBusiness curBusiness = (BaseBusiness)obj;

(編輯:IT資訊之家 www.it55.com )


**如何invoke method
續上例
invoke method有兩種,
1.實體化(new一個實體再invoke)

法1. 透過實體直接使用
curBusiness.Invoke(obj,new string[]{"test"}); //test => 字串參數,如果沒有就放null

法2. 透過type取得method
System.Reflection.MethodInfo method = type.GetMethod("go"); //go => method name


2.靜態呼叫(如Math.abs的static物件,不用new)
method = type.GetMethod("MethodtoUpperCase");//有個static的method名稱
string a = (string)method.Invoke(null,new [] object{"lowercase"}); //要傳object陣列型態
p.s 沒有參數,就給null,如同沒有實體的null
==>LOWERCASE


Reference:C#反射實例講解

星期一, 1月 14, 2008

強名稱

看半天看不懂什麼叫強名稱
似乎是為了讓 dll名稱唯一
從MSDN上抄來的

具有強名稱的程序集
強名稱是由程序集的標識加上公鑰和數字簽名組成的。其中,程序集的標識包括簡單文本名稱、版本號和區域性信息(如果提供的話)。強名稱是使用相應的私鑰,通過程序集文件(包含程序集清單的文件,並因而也包含構成該程序集的所有文件的名稱和散列)生成的。

通過簽發具有強名稱的程序集,您可以確保名稱的全局唯一性。強名稱還特別滿足以下要求:

*強名稱依賴於唯一的密鑰對來確保名稱的唯一性。任何人都不會生成與您生成的相同的程序集名稱,因為用一個私鑰生成的程序集的名稱與用其他私鑰生成的程序集的名稱不相同。
*強名稱保護程序集的版本沿襲。強名稱可以確保沒有人能夠生成您的程序集的後續版本。用戶可以確信,他們所加載的程序集的版本出自創建該版本(應用程序是用該版本生成的)的同一個發行者。
*強名稱提供可靠的完整性檢查。通過 .NET Framework 安全檢查後,即可確信程序集的內容在生成後未被更改過。但請注意,強名稱中或強名稱本身並不暗含信任級別,例如由數字簽名和支持證書提供的信任。

在引用具有強名稱的程序集時,您應該能夠從中受益,例如版本控制和命名保護。如果此具有強名稱的程序集以後引用了具有簡單名稱的程序集(後者沒有這些好處),則您將失去使用具有強名稱的程序集所帶來的好處,並依舊會產生 DLL 衝突。因此,具有強名稱的程序集只能引用其他具有強名稱的程序集。

星期三, 1月 09, 2008

Log4net

日誌記錄,可分Debug、Info、Warn、Error、Fatal等級
相關文件:
1.史帝芬心得筆記--log4net
2.Log4Net使用指南

Installation
Step1. 下載log4net
http://logging.apache.org/log4net/

Step2. 設定log4net.snk
似乎是存讓dll存取本機檔案的key,所以不同的電腦都需重新執行下列指令
*注意,log4net.snk是經由下列程式產生,並不會存在任何pack裡
command:sn -k log4net.snk
p.s. sn一般存放在C:\Program Files\Microsoft.NET\FrameworkSDK(xxx版本)\Bin\
執行完後便會產生log4net.snk
再移到解壓的根目錄(log4net預設位置讀取log4net.snk的位置)

Step3.編譯log4net.dll
在解壓的src目錄下將log4net.sln載入Visual Studio .NET,編譯後可以得到log4net.dll

p.s. 未產生log4net.snk會出現以上錯誤訊息「...讀取金鑰檔'log4net.snk' 發生錯誤 -- 系統找不到指定的檔案。」


===重建金鑰,不必重新compiler==
下面是網路上找到的

1. 創建一個新的隨機密鑰對。
d:\temp> sn -k test.snk

2. 反編譯目標程序集(假設是 a.dll)。
d:\temp> ildasm a.dll /out=a.il

3. 重新編譯,附帶強命名參數。
d:\temp> ilasm a.il /dll /resource=a.res /key=test.snk /optimize

4. 驗證簽名信息。
d:\temp> sn -v a.dll


*找不到ilasm.exe
用搜尋找一下吧...找到後,在同一資料夾還有fusion.dll


MSIL 組譯工具 (Ilasm.exe)
MSIL 反組譯工具 (Ildasm.exe)

星期二, 1月 08, 2008

xmlDoc.load跟xmlDoc.loadXml的不同

xmlDoc.load:可讀取xml檔案(dtd未定義)
xmlDoc.loadXml:直接讀取已定義的xml檔...

如過用loadXml讀未定義的xml檔
會出現「在根層次的資料無效。 第 1 行,位置 1。」
應該是這樣吧...智源大師開導後的心得

例外可用.net裡的XmlTextWriter建立語式正確的 XML

以 XmlTextWriter 建立語式正確的 XML

星期一, 12月 24, 2007

JavaScript讀XML

//1.讀XML
function loadXML(xmlFilePath)
{        
if(window.ActiveXObject)// code for IE
{
xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
xmlDoc.async = false;
xmlDoc.load(xmlFilePath);
}else if (document.implementation&&document.implementation.createDocument)// code for Mozilla, etc.
{
xmlDoc = document.implementation.createDocument('', '', null);
xmlDoc.load(xmlFilePath);
}
else
{
alert('您的瀏覽器不支持xml文件讀取,於是本頁面禁止您的操作,推薦使用IE5.0以上可以解決此問題!');
return null;
}
}


//2.瀏覽XML
//取得node方法
//Method 1 利用tag name
//1.1 取得陣列
 var Area = xmlDoc.getElementsByTagName("test"); 
 for (var i = 0 ; i < Area.length ; i++){
   var node = Area[i].firstChild.nodeValue; 
 }


//Method 2 XPATH
xmlDoc.selectSingleNode("test").text;  //從根找起
 xmlDoc.selectSingleNode("//test").text;  //回傳第一個找到的



//3.存取node (ex. lalala)
xmlNode.xml; // lalala
xmlNode.text; // lalala
xmlNode.getAttribute('what'); //ok

//4.讀子節點或父節點
xmlDoc.childNodes;
xmlDoc.parentNode;

//5.新增node

//6.儲存
xmlDoc.save("xxxx.xml");

星期二, 12月 18, 2007

XPath指定節點

原本利用getElementById來取得指定的節點
才發現要用DTD指名該節點的欄位為ID型態
MSDN的說明:雖然 ID 型別的屬性可以在 XSD 結構描述或 DTD 中定義,但是這一版的產品只支援在 DTD 中定義者。除非在 DTD 中定義,否則名稱為 "ID" 的屬性並不是 ID 型別。不知道屬性是否為 ID 型別的實作,應該會傳回 Null 參照 (即 Visual Basic 中的 Nothing)。

後來很辛苦的一步步建好
才發現id得存文字型態...會寫這句當然是因為id用數字存
後來銀光大大利用xpath指到屬性...也可以抓到了
XmlNode aaa = doc.SelectSingleNode("//Area [@ID='9']");

星期五, 11月 23, 2007

為網頁上多個元件加入相同的事件處理 - 鍵盤

加入事件handler (兩種方法 擇一即可)

//為input element加入事件handler
HtmlElementCollection tt = divDeviceChoosing.GetElementsByTagName("input");
foreach (HtmlElement a in tt)
{
//Method 1: AttachEventHandler 據說利用+=不會覆蓋父物件的事件(i++與i=1)
a.AttachEventHandler("onclick", new EventHandler(Device_Click));

//Method 2: +=
a.Click +=new HtmlElementEventHandler(teachAni_Click);
}

//事件處理 (兩種方法 擇一即可)
private void teachAni_Click(object sender, EventArgs e)
{
//Method 1: 最快最簡單 (不過要注意事件handl要用HtmlElementEventHandler,而不是EventHandler,不然sender好像會null)
HtmlElement buster = (HtmlElement)sender;
choosing(buster.Id);

//Method 2: 剛被"激化"的ActiveElement
HtmlElement buster = divDeviceChoosing.Document.ActiveElement;
MessageBox.Show(buster.Id);
//int number = int.Parse(buster.Document.ActiveElement.GetAttribute("value"));
String MacAddr = buster.Document.ActiveElement.Id;
}


**動態加入元件及事件處理**

動態加入有兩種
1.利用HtmlDocument.CreateElement
注意:此方法可work,還沒有找到方法移除element ,法二就可以了

//建立一個input的html element
HtmlElement imgDevice = divDeviceChoosing.Document.CreateElement("input");
...
//加入事件處理
imgDevice.AttachEventHandler("onclick", new EventHandler(teachAni_Click));
//再接入某位置
divDeviceChoosing.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd, imgDevice);

2.利用innerHtml

//加入多個可利用樣版
for (;;;)
{
string Butstr = "";
//套文字
string OutStr=OutStr.Replace("##id##",id);
}
//加入某段div裡
div.InnerHtml = OutStr;
//事件處理同上

星期三, 11月 14, 2007

JavaScript 與 Flash 的通訊範例

JavaScript 與 Flash 的通訊範例

有3種不同的方式
1.JavaScript 對 Flash 的通訊
2.Flash 對 JavaScript 的通訊
*主要通過fscommand 指令
3.Flash 對 Flash 的通訊

另外還有javascirpt call c# function

星期二, 11月 13, 2007

javascript call c# function

1.c#裡的function
public void test()
{
Messagebox.show(""Are you shit on me?");
}

2.加入com
在namespace後的第一行
比public class 更之前 加入 [System.Runtime.InteropServices.ComVisibleAttribute(true)]
ex.
namespace ezLa
{
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public partial class ezLa : Form
...
}


2.為webBrowser加入指定物件
webBrowser1.ObjectForScripting = this; //寫在建構子

3.在html裡加入要觸發
ex.利用button實作
在onclick="window.external.test()" 就ok啦

星期一, 11月 12, 2007

偵測影片是否播完

偵測影片是否播完
=>flv可利用obj.duration
=>swf,載入時去偵測 _totalframes

在第幾秒處設定觸發點
=>addCuePoint

聲音的現在放的毫秒數
=>soundid.duration

C#書籍

Windows Forms Programming with C#(中譯:實作手冊-使用c#),Erik Brown

星期三, 11月 07, 2007

WebBrowser 呼叫javascript

1.win form 呼叫javascript
方法:public Object InvokeScript (string scriptName)
實例:webBrowser1.Document.InvokeScript("Method"); //不用加括號,也可加啦

由於內嵌flv player的html無法用c#來設定style="display: none"
不過可使用visibility使之隱藏
但用display才是王道...因為visibility會留空白

而直接利用網頁上的javascipt卻可以讓display正常隱藏
因此得利用webbrowser呼叫javascript...


2.傳參數給javascript
方法:public Object InvokeScript (string scriptName, Object[] args)
範例:MSDN上的例子
private void InvokeTestMethod(String name, String address)
{
if (webBrowser1.Document != null)
{
Object[] objArray = new Object[2];
objArray[0] = (Object)name;
objArray[1] = (Object)address;
webBrowser1.Document.InvokeScript("test", objArray);
}
}

Javascript

<-HTML>
<-SCRIPT>
function test(name, address) { //自動變成兩個參數
window.alert("Name is " + name + "; address is " + address);
}
<-/SCRIPT>
<-/HTML>


搞半天,原來不是直接寫在裡面scriptName的括號裡
是要在後面加傳參數array,而且參數會自動依序拆成一個個的參數

3.Thread呼叫javascript
跨執行緒作業無效的呼叫法,寫法如下,簡化不寫參數
private void InvokeTestMethod()
{
if (wbContent.InvokeRequired)
{
wbContent.Invoke(new MethodInvoker(InvokeTestMethod)); //delgete型態,傳Method Name
else
{
webBrowser1.Document.InvokeScript("test");
}
}



下次研究看怎麼動態增加javascript進去


**備註**
呼叫javascript時,有時會因web page尚未讀完,所以呼叫javascript function會沒有反應
最好是等page loaded通知webbrowser,webbrowser再去call javascript

星期三, 10月 31, 2007

WebBrowser讀取frame

HtmlWindow currentWindow = WebBrowser1.Document.Window;

1.get frame by id
HtmlWindow frame = currentWindow.Frames["aaa"]

2.get frame one by one
foreach (HtmlWindow frame in currentWindow.Frames)
{
//frame即為所求
}

*有n個frames的會跳n次completed+本身的html page 共n+1次

資源:HtmlWindow.Document 屬性

星期二, 10月 30, 2007

div隱藏技

div的visibility可以隱藏本身,但會變成一個空格
用法:
<[div] id="test" style="visibility: none;">
屬性選項:

visibility: hidden;
visibility: visible;
Javascript寫法
document.getElementById("test").style.visibility="hidden";
document.getElementById("
test").style.visibility="visible";

利用display可以讓後面的物件往上拉
用法:style="display: none;"
屬性選項:
none;//隱藏
空白即為顯示
javascript寫法
  document.getElementById("test").style.display="none";//隱藏
  document.getElementById("test").style.display="";//顯示

星期四, 10月 25, 2007

lapasta 義麵屋

http://www.lapasta.com.tw/

吃過最好吃的義大利麵了吧
而且很划算 平均200多塊錢一盤
份量很多 而且加麵不加價

原本在天母中山北路
後來搬到...天母新光那兒...

取得運算過的static變數

好難形容
總之就是不new一個class
而要直接使用ClassName.attribute
public class a
{
public static string aString="hi";

static
{
aString += " this is how it works";
}
}

ex. a.aString; ==> hi this is how it works

星期二, 10月 23, 2007

使用介面設計資源

書籍
1."Don't make me think", Steve Krug (有中文版)
2."Information Architecture for the World Wide Web", Louis Rosenfeld and Peter Morville, O'Reilly (有中文版)
比較理論,教科書
3."Designing Interfaces", Jenifer Tidwell, O'Reilly, 中文:操作介面設計模式
較像工具書,作者提供12心法與94招讓讀者學習