2009年3月31日 星期二

網頁開發除錯工具

記得曾經找過網頁開發工具,除錯的部分都用firefox的控制台,之前就夠用了但現在網站越來越大條了,發現用IE跑的話,有些問題出現,甚至跑不動,重新找了一遍除錯工具

適用 FireFox -- Firebug 1.3.3

適用 IE --(IEDevToolBarSetup.msi)
微軟官方抓下來忘了留網址,自己找吧!

php) date 時間日期不對

使用PHP 內建日期函式 date(Y-m-d)
跑出來結果都跟本機時間不同,但在MySql使用其內建date()又沒錯...怪~
原來是php server 問題~ 要設定php.ini 的timezone 為Asia/Taipei

若不改設定檔~可以用下面方式

程式碼中加上
date_default_timezone_set("Asia/Taipei");
預設指定系統時間為台灣就可以了~

or
date('Y-m-d G:i:T', strtotime('+8HOUR') )
指定時間偏移到為台灣時區就可以了~

到右下角小時鐘,點"時區"分頁,就會看到 (GMT+08:00)台北

據說是5.X版後全改成格林威治時間~

Timeout偵錯

WebClientProtocol.Timeout 屬性

HttpWebRequest.Timeout 屬性

Session Timeout 設定及讀取

WebService calling from Pocket PC


12月04日「 微軟線上專家對談」主題:ASP通往ASP .NET的升級之路

c# 关于HttpWebResponse蹦出的异常的一个问题

C# 呼叫 WebService

http://sls.weco.net/calendar-orig/2009/01/4

2009年3月27日 星期五

javascript 物件導向宣告

javascript控制html元素顯示/隱藏

1。編寫js函數

< script type="text/javascript">

function display(id){

vartraget=document.getElementById(id);
if(traget.style.display=="none"){
traget.style.display="";
}else{
traget.style.display="none";
}
}
< /script>

2.要顯示/隱藏的html元素加上id屬性

< table>

< tr id="menu" >

< td>控制這個tr的顯示/隱藏< /td>

< /tr> < /tr>

< /table> < /table>

3,添加按鈕,鏈接等觸發js函數

< input type="button" onclick="display( 'menu' )" value="顯示/隱藏"/>

< a href="#" onclick="display( 'menu' )" >顯示/隱藏< /a>
javascript顯示隱藏層
< div id="" style="display:none;">廣告< /div>
< input type="botton" onclick="函數">

< script language=javascript>
function函數{
if(thisdiv.style.display=='none'){
thisdiv.style.display=""
}
else
thisdiv.style.display="none"
}

< /script>

你先給div取個ID=“AA”thisdiv=AA
javascript隱藏/顯示表單對象


[SCRIPT language=javascript]
function expandIt(el) {
whichEl =document.getElementById(el)
if (whichEl.style.display == 'none') {
whichEl.style.display = '';
}
else {
whichEl.style.display = 'none';
}
}

[/SCRIPT]

el是對象的id,不管是tr或者table等等先設置一下id,然後進行調用。

例:

[a onclick="expandIt('ttchild'); return false" href="#" ]try it[/a]

[tr id="ttchild"][td width="18"]Example[/td][/tr]

使用時把[]變成< >

javascript控制頁面控件隱藏顯示的兩種方法

javascript控制頁面控件隱藏顯示的兩種方法,方法的不同之處在於控件隱藏後是否還在頁面上佔位方法一:
document.all["PanelSMS"].style.visibility="hidden";
document.all["PanelSMS"].style.visibility="visible";

方法二:
document.all["PanelSMS"].style.display="none";
document.all["PanelSMS"].style.display="inline";
方法一隱藏後頁面的位置還被控件佔用只是不顯示類似於.net驗證控件的Display=Static
方法二隱藏後頁面的位置不被佔用類似於.net驗證控件的Display=Dynamic

2009年3月25日 星期三

ASP.NET權限不足,無法使用WINDOWS應用程式

最近遇到了個問題
撰寫了一個web service掛載於IIS下,web service會透過SKYPE API呼叫本機電腦裡面的應用程式(SKYPE)作發送簡訊的功能。

未發行至IIS下叫用都是正常的,也寫了一個windows form 來叫用確認是可以執行的
但一發布到IIS下,偵錯時卻發生了.. client端程式 出現wait timeout..

開啟web service 偵錯模式,再來看看web service怎說~
web service先參考skype4com.dll,在程式裡new skypeclass()實體為 myskype都OK,下一步
myskype.sendSMS("+886xxxxxxxxx","hello","") 馬上消失,就像正在處理工作一樣程式碼沒有反紅,看不到偵錯情形。
利用try and catch把runtime error抓出來,錯誤顯示
System.Runtime.InteropServices.COMException (0x80040200): Not attached.
於 SKYPE4COMLib.SkypeClass.SendSms(String TargetNumbers, String MessageText, String ReplyToNumber)
於 Service.HelloWorld() 於 c:\Inetpub\wwwroot\WSsendSKYPE2\App_Code\Service.cs: 行 70

怪哉~GOOGLE了很久,沒有一個解決的方法~
問題可能出在"安全性"問題上~
ASP.NET預設使用者使用資源的安全性與windows應用程式預設安全性不同,所以才會有掛載在IIS下的webservice與windows form使用SKYPE.EXE權限不同!

MSDN tech提到安全性原則部分
有兩個步驟:
1.讓ASP.NET使用者權限提到最高,可以執行、讀取、寫入等等
2.讓SKYPE檔案降低權限可以被設定的使用者群組執行、讀取等

之後再在web service程式碼裡頭加上
System.Diagnostics.Process.Start("Skype.exe"); 允許讀取到此執行檔


System.Diagnostics.Process.Start("Skype.exe");
錯誤顯示 :
{"System.Web.Services.Protocols.SoapException: 伺服器無法處理要求。 ---> System.ComponentModel.Win32Exception: 系統找不到指定的檔案。\n 於 System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)\n 於 System.Diagnostics.Process.Start()\n 於 System.Diagnostics.Process.Start(ProcessStartInfo startInfo)\n 於 System.Diagnostics.Process.Start(String fileName)\n 於 Service..ctor() 於 c:\\Inetpub\\wwwroot\\WSsendSKYPE2\\App_Code\\Service.cs: 行 15\n --- 內部例外狀況堆疊追蹤的結尾 ---"}

挖哩,還是讀取不到~>~<~ 不知道是使用者群組原則是否沒有設定好,但我已經把權限都改成"完全控制"了呀?! 之後也試過了web.config 組態設定,還沒試"註冊表"修改~畢竟如果轉移網站的話,不好意思把別人的系統弄掛吧>< 如果web service 可以叫用額外寫的windows form(APP1),而APP1可以使用SKYPE API進行發送簡訊,這樣也許可以完成。只要APP1的路徑掛在IIS下,但不成為ASP.net的成員。不知道這樣的觀念有沒有錯~ 終於找到了這個想法的實現方式~"遠端物件"~~~~~ 利用.net framwork 提供的 remoting namespace把windows application當作遠端物件使用~ 依然要考慮到使用者群組安全性原則~ 但是..這又是一個大議題..依目前程度要花不少時間來看。 想著這個方法的可行性入睡~~~ 也許有另一個方式會比較間接,但可行性有9成!! 利用資料庫當作媒介,讓WEB SERVICE作寫入,另一隻程式做讀取判斷來執行SKYPE 一樣另外寫一個windows application,這隻程式不斷讀取資料庫作判斷。 這樣一來,windows application是在系統管理者的權限下執行而可以使用SKYPE API 再者,移動網站時,也不需要考慮到路徑的問題,只需要多安裝這個application了~ 但,這畢竟是較低級的方法,application 會不斷使用系統資源,還是使用event觸發的方式較能節省系統資源。

2009年3月24日 星期二

SKYPE API

Skype4COM reference

https://developer.skype.com/Docs/Skype4COM

Examples

https://developer.skype.com/Docs/Examples#head-3ff2bc7e3da15010b5c305b7604c85275f971b60

CLASS ref

https://developer.skype.com/Docs/Skype4COMLib

Skype4COMLib Version History

https://developer.skype.com/Docs/Skype4COMLib/VersionHistory

2009年3月22日 星期日

XML DOM reference

AJAX 的X 表示XML
最近享用XML取代string >< ~ 應該比較好整理吧!
有高亮度顯示,這個就足夠
Document Object Model (DOM) Reference

很完整
JavaScript DOM


HTML DOM Document Object


document、element、node方法

document方法:
getElementById(id) 返回指定结点的引用
getElementsByTagName(name) 返回文档中所有匹配的元素的集合
createElement(name) 创建指定类型的新结点
createTextNode(text) 创建一个纯文本结点

element方法:
getAttribute(id) 返回指定属性的值
setAttribute(id,value) 给属性赋值
removeAttribute(id) 移除指定属性和它的值
getElementsByTagName(name) 返回结点内所有匹配的元素的集合

node方法:
appendChild(child) 给指定结点添加一个新的子结点
removeChild(child) 移除指定结点的子结点
replaceChild(newChild,oldChild) 替换指定结点的子结点
insertBefore(newChild,refChild) 在同一层级的结点前面插入新结点
hasChildNodes() 如果结点有子结点则返回true

node属性:
nodeName 以字符串的格式存放结点的名称
nodeType 以整型数据格式存放结点的类型
nodeValue 以可用的格式存放结点的值
parentNode 指向结点的父结点的引用
childNodes 指向子结点的引用的集合
firstChild 指向子结点结合中的第一个子结点的引用
lastChild 指向子结点结合中的最后一个子结点的引用

2009年3月21日 星期六

2009年3月14日 星期六

開啟關閉 windows mobile WIFI

1.
[DllImport("coredll.dll")]
public static extern int DevicePowerNotify(string device, CEDEVICE_POWER_STATE state, int flags);


[DllImport("coredll.dll")]
public static extern int SetDevicePower(string pvDevice, int df, CEDEVICE_POWER_STATE ds);


没有专门针对WIFI设备的API, 但是可以通过上面两个方法,控制WIFI状态

2. ref: http://topic.csdn.net/u/20080728/20/a5efe62a-629c-4811-add5-bc6c53fcdd5b.html
用无线管理器ChangeRadioState函数可以指定打开或关闭某一设备,包括WIFI


首先使用函数HRESULT GetWirelessDevices()获得一个设备链表,在设备链表中根据设备类型,找到wifi设备,然后调用ChangeRadioState()打开或者关闭指定的设备。
有关上述函数的详细使用,可以查windows mobile 6 documentation

GetWirelessDevices(),ChangeRadioState()都是MS公布给OEM的标准接口,WM6都是支持的。

openNETCF有,且有例子,你找找去。


看看人家做的
http://www.cnblogs.com/MS-Frank/archive/2008/11/14/1333664.html

軟體 wifiswitch
http://www.winbile.net/bbs/forums/threads/1014040.aspx
http://www.pudn.com/downloads90/sourcecode/windows/comm/detail342414.html

Native Wifi api
该api的可以实现windows的无线客户端的网络参数配置(WlanSetProfile),连接指定的ap,断开连接和获得其他关于无线网络的信息(ssid,rssi等)。

並且有一個斷開WIFI的範例。

另一個繼續深入的搜尋資源
http://search.pudn.com/search.asp?keyword=%20wifi


coredll 全部的函式名稱
http://topic.csdn.net/t/20050826/13/4233161.html

2009年3月12日 星期四

OpenNetCF` Smart Device Framework(SDF)

http://blog.csdn.net/khler/archive/2008/06/27/2592008.aspx
很遺憾,.Net Compact Framework類庫對於在Windows Mobile做應用程序開發是很不成熟的,有時候你不得不依賴於會引起諸多問題的Platform Invoke機制。 Smart Device Framework(SDF),一個對.NetCF進行了擴展的功能庫,覆蓋了.Net Compact Framework所未觸及的區域。
如果你之前使用.NetCF為Windows Mobiel開發過應用程序,那麼你就會發現僅僅依靠微軟提供的類庫是不能滿足所有功能需要的。在這種情況下,你不得不依賴於Platform Invoke(即通常所說的P/Invoke)——一種為了與操作系統共享數據而不得不使用的令人不快的東西。幸運的是,OpenNetCF組織推出了一個叫Smart Device Framework(SDF)的類庫,它填補了微軟.NetCF類庫的不足,將所有對操作系統的服務的調用封裝到了這個類庫中,方便基於託管代碼平台的開 發者直接訪問平台服務而不需要繁瑣的P/Invoke調用。

Windows Mobile Registry 系統存取 (C#)

.NET Compact Framework使用P/Invoke服务 (二)

Windows Mobile 中开关 WIFI 的“通用”代码

codedll.dll完整函數名稱




HOW TO:在類別庫中尋找 .NET Compact Framework 的支援成員

使用 .NET Compact Framework 進行裝置的程式設計

裝置的 COM 互通性
使用 Unmanaged DLL 函式

要看DLL中有什麼內容,可以使用DumpBin.exe, 如果是ATL COM DLL, 可以使用OLE/COM Object Viewer

dll查看

求 DLL 入口函数查询工具

http://topic.csdn.net/u/20081114/09/def024cb-fb52-4276-bec6-a42cf3c585e5.html



http://topic.csdn.net/u/20080728/20/a5efe62a-629c-4811-add5-bc6c53fcdd5b.html

http://www.pudn.com/login.asp




豐富的搜尋資源


Native Wifi api


WiFiSwitch



使用 Windows Mobile 5.0 中的图片、视频和照相机

使用 .NET Compact Framework 的條碼掃描器




利用連結 iframe 內的錨點作說明頁面

在main.php裡面內嵌一個Iframe (helpinfo.php)
在main.php 有說明列表連結,點選其中一個說明連結,讓Iframe裡的資訊呈現至說明內容的指定項目

main.php

<html>
<body>

<a href="helpinfo.php#說明項目一" target="myIframe">xx1說明</a><br/>
<a href="helpinfo.php#說明項目二" target="myIframe">xx2說明</a><br/>

<iframe name="myIframe" src="helpinfo.php" width="600" height="400"></iframe>

</body>
</html>


helpinfo.php

<html>
<body>

<A NAME="說明項目一"></A>xx1說明<p>
<a NAME="說明項目二">xx2說明</a><p>
</body>
</html>

2009年3月10日 星期二

webservice 傳送問題

傳輸時,發生

用戶端找到的回應內容型別為'text/html; charset=iso-8859-1',但需要的是'text/xml'。

解:
如果您檢視錯誤訊息的內容,會發覺這個 HTML 網頁是您瀏覽 .ASMX 檔案時所見到的。這時會產生一個疑問:當我將 XML (SOAP Envelope 的格式) 公佈到 Web 服務時,為什麼會傳回 HTML?結果就是您沒有使用 SOAP Envelope 傳送 HTTP POST 要求,卻只是傳送沒有本文的 HTTP GET 要求,而 Web 服務會適當地假設您是瀏覽器,並傳回它一般的 HTML 回應。

refer
http://www.microsoft.com/taiwan/msdn/library/2002/Sep-2002/service08062002.htm

2009年3月8日 星期日

網頁問題(暫存)

目前發現的

1.在做歷史軌跡部分,時間比對在0:00~01:00時間不會顯示。
之前還莫名其妙的在想是不是網站掛了>< 因為每次開啟都不一樣問題~不同瀏覽器也有問題~

2. 行動排程 按下區域應該要顯示設定的區域!

3.行動排程應該要加上時間設定(這個頭大)

3.要可以修改會員資料,並顯示資訊以及刪除功能

4.系統說明頁面未寫

5.寄發E-mail驗證未寫

6.歷史軌跡應該從有資訊的時間點開始

7.歷史資訊控制相要加入暫停紐(不知道有沒有thread的功能)

8.區域設定可以加入MRT設定

9.PDA端可以加入POWER節省控制

10.PDA佈署要在自動安裝在最右下角

11.要加入關閉螢幕背光設定

12.網頁控制項應該加入過濾精準度的能力

13.歷史軌跡應該加入畫線速度拉軸 (慢 中 快) 或是 開始/暫停 後快轉 停止 前快轉

使用PHP撰寫網頁程式

剛開始學習網頁設計時,網站的設計比預期的還來的大~
重複的演算法與功能函式挺多的,以致於現在看到網頁源碼頭都很大>< 
早知道 就該用物件導向的寫法了~

Object Oriented Programming (OOP) 最重要的概念有三種:

  1. 封裝 (encapsulation)
  2. 繼承 (Inheritance)
  3. 多型 (Polymorphism)

參考這篇,學一下物件導向寫法的基本使用方式吧~
物件導向 類 class

php官網有更詳細的範例說明 The Basics(PHP官網)

開啟/關閉 WIFI 裝置

問題
http://topic.csdn.net/u/20080728/20/a5efe62a-629c-4811-add5-bc6c53fcdd5b.html

解法

Windows Mobile 中开关 WIFI 的“通用”代码

SystemState.WiFiStatePowerOn Property  讀取WIFI狀態的屬性,但無法設置開關
英文的 ><

Deactivate /Activate all Services like (Internet,WIFI,Bluetooth,WLAN..)

Enabling Radio in the Windows Mobile 5.0

WiFi Power On Event

開啟D0 關閉D4

We can implement this functionality with ease. Hope this can give your some idea.

See the code below:

// D0 indicates open; D4 indicates close;

CEDEVICE_POWER_STATE state = D0;

HRESULT hr = SetDevicePower(TEXT(""),POWER_NAME,state);

Note: We use SetDevicePower function here. It sets the device power state for a device.

  1. 1st parameter: specify the device.
  2. 2nd parameter: we use POWER_NAME here to indicate that the first parameter is just a device name.
  3. 3rd parameter: sets the power state.

In order to get information in details, you can find it in MSDN. Thanks!

Regards,

Zero Dai - MSFT



之後
Battery Status

GPS Application

Mobile GPS

2009年3月5日 星期四

在不同執行緒下存取UI控制項(textbox combobox)

問題描述 :在不同執行緒下呼叫方法,方法裡面需要存取主執行緒下的UI控制項

解法:

1.Form.CheckForIllegalCrossThreadCalls = False

2.建立委派

3.使用BackgroundWorker


這裡介紹第二種

首先在windows.form 的 onload事件建置一條執行緒

compareandprintout = new Thread(new ThreadStart(MRTcompareThread));
compareandprintout.Start();

這條thread 會執行compare()方法,存取UI控制項的程式就寫在裡面(存取textbox,combobox)
public void MRTcompareThread()
{
compare(); //裡面有無限迴圈
}

委派的建立!!


1.建立方法

publik int XXmethod(int a, int b);

2.宣告委派;委派參數,需要與被呼叫的方法一樣,包含回傳型別 (相同 signature)

   private delegate void XXDelegate();
   private delegate int XXDelegate(int a, int b);

3.引用委派(實體化),後指定方法

XXDelegate d = new XXDelegate(XXMethod); //參考的方法只要名稱就可以了
4.呼叫函數

invoke();


真的開始囉~~

於class form1裡宣告委派

delegate void SetTextCallback(Control ctl,String str); 設置textbox.text
delegate string GetTextCallback(Control ctl); 讀取textbox.text
delegate string GetCBTextCallback(ComboBox ctl, int i); 讀取ComboBox
delegate string GetCBTextCallback(Listcontrol ctl, int i); 讀取ComboBox


另外要寫委派方法
public string gettext(Control ctl)
{
if (this.InvokeRequired) //InvokeRequired required compares the thread ID of the // calling thread to the thread ID of the creating thread. // If these threads are different, it returns true.
{

GetTextCallback d = new GetTextCallback(gettext);
// this.Invoke(d);
string x;
x =(string) this.Invoke(d, new Object[] { ctl });
return x;
}
else
{
return ctl.Text;
}

}
public void settext(Control ctl,String str)
{
if (this.InvokeRequired)
{
SetTextCallback s = new SetTextCallback(settext);
this.Invoke(s, ctl, str );
}
else
{
ctl.Text = str;
}
}
public string getCBtext(ComboBox ctl, int i)
{
if (this.InvokeRequired)
{
string try1 = ctl.GetItemText(i); //i = 1 2 3 4 遞增,奇怪~難道我誤會MSDN? 給出來的是combobox的item索引
string try2 = (string)ctl.Items[i];//

GetCBTextCallback Gcb = new GetCBTextCallback(getCBtext); //建立
string x;
x = (string)this.Invoke(Gcb, ctl, i);
return x;
}
else
{
return (string) ctl.Items[i];
// return ctl.GetItemText(i);
}
}


在非產生UI控制項的副執行緒主程式 compare裡面有

while(true)
{
for (i = 1; i < style="color: rgb(51, 204, 255);"> getCBtext(comboBox1,i) && startstation == true)
//if (nowBox.Text == comboBox1.Items[i].ToString() )
{
//onBox.Text = comboBox1.Items[i].ToString(); //debug會出錯(不同控制項執行緒叫用 ... 我忘了)
string y = getCBtext(comboBox1,i) ;
settext(onBox, y); //叫用方法,自動判斷叫用invoke

}
}

for (i = 1; i < style="color: rgb(255, 0, 0);">// if (onBox.Text == comboBox1.Items[i].ToString())
{
if (goal > getonposition)
{
//nexterrorstop = comboBox1.Items[i - 1].ToString();
nexterrorstop = getCBtext(comboBox1,i-1);
}
else
{
nexterrorstop = "error";
}
}
}



}


VB版
一樣 ,先建立一個拿來更新 UI 的方法( UpdateUI),再建立一個有相同 signature 的委派( UpdateUICallBack)

Private Delegate Sub UpdateUICallBack(ByVal newText As String, ByVal c As Control)

Private Sub UpdateUI(ByVal newText As String, ByVal c As Control)
If Me.InvokeRequired() Then
Dim cb As New UpdateUICallBack(AddressOf UpdateUI)
Me.Invoke(cb, newText, c)
Else
c.Text = newText
End If
End Sub


ref:

舊文重發:Windows 表單與多執行緒


HOW TO:進行對 Windows Form 控制項的安全執行緒呼叫

VB/ VBA/ C#/ Java/ C++ 語言學習筆記

2009年3月4日 星期三

執行緒 事件 委派 回呼

Windows Mobile Registry 系統存取 (C#)


如何使用 Native Code 開發的 DLL (C#)

Windows Mobile 開發常用工具介紹

如何使用 Native Code 開發的 DLL (C#)

NET 事件與委派詳論

委派 (C# 程式設計手冊)

用故事講事件與委派


callback function
當你沒有辦法知道什麼時候會呼叫到這個function的時候。假如你有一個thread的程式,你希望thread在做完什麼事情之後,去通知主程序的的某個function要執行這時候因為主程序不會知道thread什麼時候做完事情,所以會讓thread裡面知道主程序裡要執行的那個function的function pointer,這樣子thread就會知道在自己完成什麼事情後自己執行那個function,而不用讓主程序知道。

行動運算-機器人能教您什麼?

炫喔~
用藍芽技術做機器人 WIMO
http://msdn.microsoft.com/zh-tw/magazine/cc748660.aspx

尚須解決PDA端問題-暫存

function1
需於PDA 設定->連線->Wi-Fi->要存取的網路:僅存取點
要找開啟或關閉無線網路的API