Feeds:
文章
迴響

Archive for 2007 年 01 月

蒙福

今天聽到淑恩姐分享這段很棒經文,紀錄在此與你共享

申二十八
1: 你若留意聽從耶和華你 神的話、謹守遵行他的一切誡命、就是我今日所吩咐你的、他必使你超乎天下萬民之上。
2: 你若聽從耶和華你 神的話、這以下的福必追隨你、臨到你身上。
3: 你在城裡必蒙福在田間也必蒙福
4: 你身所生的、地所產的、牲畜所下的、以及牛犢、羊羔、都必蒙福
5: 你的筐子和你的摶麵盆、都必蒙福
6: 你出也蒙福、入也蒙福
7: 仇敵起來攻擊你、耶和華必使他們在你面前被你殺敗.他們從一條路來攻擊你、必從七條路逃跑。
8: 在你倉房裡、並你手所辦的一切事上、耶和華所命的福必臨到你.耶和華你 神、也要在所給你的地上賜福與你。
9: 你若謹守耶和華你 神的誡命、遵行他的道、他必照著向你所起的誓、立你作為自己的聖民。
10: 天下萬民見你歸在耶和華的名下、就要懼怕你。
11: 你在耶和華向你列祖起誓應許賜你的地上、他必使你身所生的、牲畜所下的、地所產的、都綽綽有餘。
12: 耶和華必為你開天上的府庫、按時降雨在你的地上.在你手裡所辦的一切事上賜福與你.你必借給許多國民、卻不至向他們借貸。
13: 你若聽從耶和華你 神的誡命、就是我今日所吩咐你的、謹守遵行不偏左右、也不隨從事奉別神、耶和華就必使你作首不作尾、但居上不居下

Read Full Post »

Read Full Post »

 Chui-Wen Chiu(Arick)
MSN SpaceGoogle DocGoogle Blog
2007.1.28

如果你用 VS2005 開發 WinForm 程式,應該會看過下面的畫面,也就是 Microsoft 官方 所說的 WSOD

[1]提供找出並修正問題的方法,首先開啟一個新的 Visual Studio,在這新的 Visual Studio 中點選 "Tools | Attach to Process",選擇出現 WSOD 的 VS2005 應用程式(devenv.exe),如下圖所式:
點選"Debug | Exceptions",勾選"Common Language Runtime Exception" 和 "Managed Debugging Assistants" 的 Thrown 與 User-unhandled,如下圖:
關閉出現 WSOD 畫面的視窗,接著在重新開啟,此時另一個 VS2005 會在發生錯誤的地方進行中斷,此時你就可以進行相關的修正。
無法顯示錯誤的圖片「https://i2.wp.com/www.codeproject.com/csharp/wsod/03_CaughtInNewVS.png」 
參考資料:

[1] http://www.codeproject.com/csharp/wsod.asp

Read Full Post »

 Chui-Wen Chiu(Arick)
MSN SpaceGoogle DocGoogle Blog
2007.1.27

簡介
    System.Net 中包含用來從網站或 HTTP 網路服務中擷取資料的 HttpWebRequest 和 HttpWebResponse 兩個類別。另外,System.Web 中還包含一個用來將 HTML 和 URL 進行編解碼的 HttpUtility。Yahoo 網路服務的回傳是 XML 資料。有其他部份服務另外提供 JSON 或 PHP Serialize。

送出簡單的 GET 需求

  1. using System;  
  2. using System.IO;  
  3. using System.Net;  
  4. using System.Text;  
  5.   
  6. // 建立 Request
  7. HttpWebRequest request = WebRequest.Create("http://developer.yahoo.com/"as HttpWebRequest;  
  8.   
  9. // 取得 Response
  10. using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)  
  11. {  
  12.     // 取得回應的 Stream
  13.     StreamReader reader = new StreamReader(response.GetResponseStream());  
  14.   
  15.     // 列印會傳的資料  
  16.     Console.WriteLine(reader.ReadToEnd());  

送出簡單的 POST 需求

  1. // We use the HttpUtility class from the System.Web namespace  
  2. using System.Web;  
  3.   
  4. Uri address = new Uri("http://api.search.yahoo.com/ContentAnalysisService/V1/termExtraction");  
  5.   
  6. // Create the web request  
  7. HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;  
  8.   
  9. // Set type to POST  
  10. request.Method = "POST";  
  11. request.ContentType = "application/x-www-form-urlencoded";  
  12.   
  13. // 建立 POST 參數  
  14. string appId = "YahooDemo";  
  15. string context = "Italian sculptors and painters of the renaissance"  
  16.                     + "favored the Virgin Mary for inspiration";  
  17. string query = "madonna";  
  18. StringBuilder data = new StringBuilder();  
  19. data.Append("appid=" + HttpUtility.UrlEncode(appId));  
  20. data.Append("&context=" + HttpUtility.UrlEncode(context));  
  21. data.Append("&query=" + HttpUtility.UrlEncode(query));  
  22.   
  23. // POST 字串參數轉成 Byte 資料  
  24. byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString());  
  25.   
  26. // 設定寫入內容長度
  27. request.ContentLength = byteData.Length;  
  28.   
  29. // 寫入 POST 參數  
  30. using (Stream postStream = request.GetRequestStream())  
  31. {  
  32.     postStream.Write(byteData, 0, byteData.Length);  
  33. }  
  34.   
  35. // Get response  
  36. using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)  
  37. {  
  38.     // Get the response stream  
  39.     StreamReader reader = new StreamReader(response.GetResponseStream());  
  40.   
  41.     // Console application output  
  42.     Console.WriteLine(reader.ReadToEnd());  
  43. }

HTTP 驗證需求
部份 API 服務使用時需要輸入帳號和密碼進行 HTTP 驗證,要完成這個動作只需要簡單的加上 NetworkCredentials 實體。

  1. HttpWebRequest request   
  2.     = WebRequest.Create("https://api.del.icio.us/v1/posts/recent"as HttpWebRequest;  
  3.   
  4. // Add authentication to request  
  5. request.Credentials = new NetworkCredential("username""password");  
  6.   
  7. // Get response  
  8. using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)  
  9. {  
  10.     // Get the response stream  
  11.     StreamReader reader = new StreamReader(response.GetResponseStream());  
  12.   
  13.     // Console application output  
  14.     Console.WriteLine(reader.ReadToEnd());  

錯誤處理
    雖然 YAHOO 提供許多 REST 網路服務,但是錯誤處理部份並沒有完全一致,部份服務會回傳狀態碼 200 (OK) 或是錯誤發生時透過 XML 描述詳細資訊並回傳狀態碼。詳細的處理方式要參考服務文件。比較需要注意的是 YAHOO Browser-Based Authentication 和 HTTP 驗證服務是兩種不同的驗證。

如果遠端回傳的狀態碼不是 200 時,呼叫 HttpRequest.GetResponse() 會發生 Exception。

以下是對於錯誤處理的範例程式

  1. public static void PrintSource(Uri address)  
  2. {  
  3.     HttpWebRequest request;  
  4.     HttpWebResponse response = null;  
  5.     StreamReader reader;  
  6.     StringBuilder sbSource;  
  7.   
  8.     if (address == null) { throw new ArgumentNullException("address"); }  
  9.   
  10.     try  
  11.     {  
  12.         // Create and initialize the web request  
  13.         request = WebRequest.Create(address) as HttpWebRequest;  
  14.         request.UserAgent = ".NET Sample";  
  15.         request.KeepAlive = false;  
  16.         // Set timeout to 15 seconds  
  17.         request.Timeout = 15 * 1000;  
  18.   
  19.         // Get response  
  20.         response = request.GetResponse() as HttpWebResponse;  
  21.   
  22.         if (request.HaveResponse == true && response != null)  
  23.         {  
  24.             // Get the response stream  
  25.             reader = new StreamReader(response.GetResponseStream());  
  26.   
  27.             // Read it into a StringBuilder  
  28.             sbSource = new StringBuilder(reader.ReadToEnd());  
  29.   
  30.             // Console application output  
  31.             Console.WriteLine(sbSource.ToString());  
  32.         }  
  33.     }  
  34.     catch (WebException wex)  
  35.     {  
  36.         // This exception will be raised if the server didn’t return 200 – OK  
  37.         // Try to retrieve more information about the network error  
  38.         if (wex.Response != null)  
  39.         {  
  40.             using (HttpWebResponse errorResponse = (HttpWebResponse)wex.Response)  
  41.             {  
  42.                 Console.WriteLine("The server returned ‘{0}’ with the status code {1} ({2:d}).",  
  43.                     errorResponse.StatusDescription, errorResponse.StatusCode,   
  44.                     errorResponse.StatusCode);  
  45.             }  
  46.         }  
  47.     }  
  48.     finally  
  49.     {  
  50.         if (response != null) { response.Close(); }  
  51.     }  


延伸閱讀

參考資料:
[1] http://developer.yahoo.com/dotnet/howto-rest_cs.html

Read Full Post »

[Flex] 透過程式驅動特效

 Chui-Wen Chiu(Arick)
MSN SpaceGoogle DocGoogle Blog
2007.1.26

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml&quot; initialize="initMe()">
 
    <mx:Script>
    <![CDATA[
      import flash.utils.Timer;
      import flash.events.TimerEvent;                  
      public var myTimer:Timer;
      
      public function initMe():void {     
        glowThis.target = makeMeGlow; // 套用特效到 UIComponent
        glowThis.end(); // 中斷目前正在播放的特效
        glowThis.play(); // 開始播放特效
      }
                 
    ]]>
    </mx:Script>
    <mx:Sequence id="glowThis" repeatCount="0"> 
        <mx:Glow id="glowImage" duration="1000"
            alphaFrom="1.0" alphaTo="0.3"
            blurXFrom="0.0" blurXTo="50.0"
            blurYFrom="0.0" blurYTo="50.0"
            color="0xFF0000"/>
          
        <mx:Glow id="unglowImage" duration="1000"
            alphaFrom="0.3" alphaTo="1.0"
            blurXFrom="50.0" blurXTo="0.0"
            blurYFrom="50.0" blurYTo="0.0"
            color="0xFF0000"/>      
    </mx:Sequence>     
    <mx:Button id="makeMeGlow" label="Look Ma’, I’m glowing!"/>
   
</mx:Application>

參考資料:
[1] Programmatic Control of an Effect
[2] mx.effects.Sequence (Flex™ 2 Language Reference)
[3]
mx.effects.Glow (Flex™ 2 Language Reference)

Read Full Post »

 Chui-Wen Chiu(Arick)
MSN SpaceGoogle DocGoogle Blog
2007.1.26

1. 要將一個類別序列化,只需要透過 [Serializable] Attribute 即可

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace SerializeTest {
    class Program {
        static void Main(string[] args) {
            Byte[] bs;
            BinaryFormatter bf = new BinaryFormatter();
            using (MemoryStream inMS = new MemoryStream()) {               
                bf.Serialize(inMS, new ShoppingCartItem(1, 2, 3));

                bs = new Byte[inMS.Length];
                inMS.Seek(0, SeekOrigin.Begin);  
                inMS.Read(bs, 0, (int)inMS.Length);  
            }

            using (MemoryStream outMS = new MemoryStream(bs)){
                ShoppingCartItem sc = bf.Deserialize(outMS) as ShoppingCartItem;
                if (sc != null) {
                    Console.WriteLine(" productId={0}n price={1}n quantity={2}n total={3}n", sc.productId, sc.price, sc.quantity, sc.total);
                    /**
                     *  Output:
                     *  productId=1
                     *  price=2
                     *  quantity=3
                     *  total=6
                     */
                } else {
                    Console.WriteLine("Serialize Fail");
                }
            }

            Console.ReadKey();
        }
    }

    [Serializable]
    class ShoppingCartItem {

        public int productId;
        public decimal price;
        public int quantity;
        public decimal total;

        public ShoppingCartItem(int _productID, decimal _price, int _quantity) {
            productId = _productID;
            price = _price;
            quantity = _quantity;
            total = price * quantity;
        }

    }
}

2. 如何將特定資料成員不進行序列化,在成員上面使用[NonSerialized]

  /**
   *  Output:
   *  productId=1
   *  price=2
   *  quantity=3
   *  total=0
    */

    [Serializable]
    class ShoppingCartItem {

        public int productId;
        public decimal price;
        public int quantity;
        [NonSerialized]
        public decimal total;

        public ShoppingCartItem(int _productID, decimal _price, int _quantity) {
            productId = _productID;
            price = _price;
            quantity = _quantity;
            total = price * quantity;
        }

    }

3. 如果想要讓反序列化之後自動進行一些動作,可以在類別實作 IDeserializationCallback 介面

  /**
   *  Output:
   *  productId=1
   *  price=2
   *  quantity=3
   *  total=6
    */

    [Serializable]
    class ShoppingCartItem : IDeserializationCallback{

        public int productId;
        public decimal price;
        public int quantity;
        [NonSerialized]
        public decimal total;

        public ShoppingCartItem(int _productID, decimal _price, int _quantity) {
            productId = _productID;
            price = _price;
            quantity = _quantity;
            total = price * quantity;
        }

        void IDeserializationCallback.OnDeserialization(Object sender) {
            total = price * quantity;
        }
    }

4. 如果序列化物件有進行資料成員的更動,導致類別前後版本不一致時,可以在變動的資料成員上使用 [OptionalField] ,如果要初始化此欄位資料,可以實作 IDeserializationCallback 介面

  /**
   *  Output:
   *  productId=1
   *  price=2
   *  quantity=3
   *  total=6
    */

    [Serializable]
    class ShoppingCartItem : IDeserializationCallback{

        public int productId;
        public decimal price;
        public int quantity;
        [NonSerialized]
        public decimal total;

        [OptionalField]
          public bool taxable;

        public ShoppingCartItem(int _productID, decimal _price, int _quantity) {
            productId = _productID;
            price = _price;
            quantity = _quantity;
            total = price * quantity;
        }

        void IDeserializationCallback.OnDeserialization(Object sender) {
            total = price * quantity;
        }
    }

5. 實務上要達到類別版本相容的一些準則
    5.1 不要移除任何已經被序列化的欄位
    5.2 假如舊版類別欄位沒有套用 NonSerializedAttribute  Attribute,新版的資料欄位也不要套用此 Attribute
    5.3 不要變更已經序列化的欄位名稱
    5.4 新增一個序列化欄位,記得加上 OptionalFieldAttribute  Attribute
    5.5 假如移除欄位上的 NonSerializedAttribute ,記得加上 OptionalFieldAttribute  Attribute
    5.6 對於所有 OptionalFieldAttribute  欄位透過 IDeserializationCallback 進行初始化

參考資料:
[1] How to Serialize and Deserialize custom classes
[2] SerializableAttribute Class (System)
[3] NonSerializedAttribute Class (System)
[4] OptionalFieldAttribute Class (System.Runtime.Serialization)
[5] IDeserializationCallback Interface (System.Runtime.Serialization)

Read Full Post »

Flex 超連結(Hyperlink)元件

 Chui-Wen Chiu(Arick)
MSN SpaceGoogle DocGoogle Blog
2007.1.19

本文擴展 Text 控制項成 Hyperlink 控制項,外觀的呈現透過 Text 控制項的 htmlText 來顯示超連結,當使用者的游標移動到超連結上面時,透過文字代換 htmlText 來顯示不同的顏色,最後,如果想要點選超連結之後以瀏覽器開啟連結,可以使用 navigateToUrl() 來瀏覽指定的 URL。下面是控制項實作的原始碼:

Hyperlink_test.mxml
<?xml version="1.0" encoding="utf-8"?>
<!– This app shows the usage of the Hyperlink.as component and HyperlinkEvent.as custom event.
  Both of those files must either reside in the same folder as this file, or must be in
  a source-path folder. –>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml&quot;
    xmlns="*" layout="vertical" horizontalAlign="left">

<mx:Script><![CDATA[
  import Hyperlink;
  import HyperlinkEvent;
 
  /** run by bubbling custom event from Hyperlink component */
  private function onLinkClick(oEvent:HyperlinkEvent):void
  {
    txtDataUrl.text = oEvent.data.toString();
  }//init
 
]]></mx:Script>
  <mx:Text text="This app shows the usage of the Hyperlink component and HyperlinkEvent custom event." width="300" fontSize="12" />
  <mx:Text text="This repeater  sets launchUrl=true, so clicking on a Hyperlink launches the specified url in a separate browser." width="200" />
  <mx:Repeater id="rpUrl" dataProvider="{xmlData.item}">
    <Hyperlink launchUrl="true" colorNormal="#0000FF" colorHover="#00FF00"
        linkText="{rpUrl.currentItem.@linkText}"
        dataUrl="{rpUrl.currentItem.@dataUrl}" />
  </mx:Repeater>

  <mx:Text text="This repeater sets launchUrl=false, so the Hyperlink component emits a bubbling custom event, which is handled by a listener in the main app. It also uses different text colors." width="200" />
  <mx:Repeater id="rpEvent" dataProvider="{xmlData.item}">
    <Hyperlink launchUrl="false" onClick="onLinkClick(event)"
        colorNormal="#0FF0FF" colorHover="#FAAAFF"
        linkText="{rpEvent.currentItem.@linkText}"
        dataUrl="{rpEvent.currentItem.@dataUrl}" />
  </mx:Repeater>
  <mx:Label text="You clicked:"  />
  <mx:Text id="txtDataUrl" fontSize="16" color="white" />
  
  <!– Sample data –>
  <mx:XML id="xmlData" xmlns="">
    <data>
      <item linkText="Google" dataUrl="http://www.google.com&quot; />
      <item linkText="NPR" dataUrl="http://www.npr.org&quot; />
      <item linkText="MSN" dataUrl="http://www.msn.com&quot; />
      <item linkText="Yahoo" dataUrl="http://www.yahoo.com&quot; />          
    </data>
  </mx:XML>
</mx:Application>

Hyperlink.as
/**
 * Hyperlink
 * This control displays a Text control that looks like an HTML hyperlink.
 * See public var / property declarations
 *
 *
 */
package
{
 import mx.controls.Text;
 import flash.events.Event;
  import flash.events.TextEvent;
  import HyperlinkEvent;
  import flash.net.*;
 
 [Event(name="onClick", type="HyperlinkEvent")]
 public class Hyperlink extends Text
 {
  public var colorNormal:String = "#0000FF";   //Link text color.
  public var colorHover:String = "#00FF00";    //Link hover text color.
  public var dataUrl:String = "";         //Any string if launchUrl="false" and using event, must be valid url if launchUrl="true";
  public var linkText:String = "";        //Displayed Hyperlink text
  public var launchUrl:Boolean = true;      //controls whether a click on a link launches the dataUrl, or emits a DLink event.
 
  /**
   * 控制像建立完成時的初始化動作
   */  
  private function onCreationComplete(oEvent:Event):void
  {
   if (linkText && linkText.length > 0)  {              //only do this if we have link text
    setHtmlText();
   }
   else  {
     htmlText = "!!!!!!Property ‘linkText’ is REQUIRED!!!!!!";
   }
  }//onCreationComplete
 
  /**
   * 使用 HTML 標籤顯示超連結和提示文字
   */
  private function setHtmlText():void
  {
   var sHTML:String = ‘<font color="’ + colorNormal + ‘">’;
   sHTML += ‘<a href="event:myEvent" ><u>’; 
   sHTML += linkText;
   sHTML += ‘</u></a’;
   sHTML += ‘</font>’;
   this.htmlText = sHTML;
   this.toolTip = "Click to show " + linkText;
  }//setHtmlText
 
   
  /**
   *  當游標橫越超連結時,切換文字顏色
   */
  private function hover(oEvent:Event):void{
    if (oEvent.type == ‘mouseOver’)  {
      this.htmlText = String(this.htmlText).replace(colorNormal, colorHover);
    } else  {
      this.htmlText = String(this.htmlText).replace(colorHover, colorNormal);
    }
 
  }//hover 
 
  /**
   * 當點選 URL 時,如果要開啟新視窗,則使用 navigateToURL(),否則將 Click 訊息往上傳遞
   */  
  private function onLinkClick(oEvent:TextEvent):void
  {
     if (launchUrl)  {
        var ur:URLRequest = new URLRequest(dataUrl);
        navigateToURL(ur,"_blank");
     } else  {
        dispatchEvent(new HyperlinkEvent("onClick",dataUrl,true,true));
     }
  
  }//onLinkClick  
 
  /**
   * Constructor
   */   
  public function Hyperlink(xmlData:XML=null)
  {
   this.addEventListener("mouseOver",hover);
   this.addEventListener("mouseOut",hover);
   this.addEventListener("creationComplete",onCreationComplete);
   this.addEventListener("link", onLinkClick);
   super();
  }//Constructor
 
 }//class Hyperlink
}//package
HyperlinkEvent.as
/**
 * This simple custom event works with the Hyperlink component.
 * Actually, it could be easily adapted for other uses as well.
 */
package
{
 import flash.events.Event;

 public class HyperlinkEvent extends Event
 {
  public var data:Object;
 
  /** Constructor */
  public function HyperlinkEvent(type:String, data:Object, bubbles:Boolean=false, cancelable:Boolean=false)
  {
   super(type, bubbles, cancelable);
   this.data = data;
  }//Constructor

    /** Override the inherited clone() method. */
    override public function clone():Event {
      return new HyperlinkEvent(type, data, this.bubbles, this.cancelable);
    }//clone 
 
 }// class HyperlinkEvent
}//package

執行結果:

參考資料
[1] http://www.cflex.net/showFileDetails.cfm?ObjectID=595&ChannelID=1

Read Full Post »

Older Posts »