Feeds:
文章
迴響

Archive for 2007 年 08 月

 

MSN SpaceGoogle DocGoogle Blog
Chui-Wen Chiu
2007.08.22

今天收到一個錯誤訊息"The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF", Google 一下有相當多這方面的資料。我就不一一細列,這個錯誤主要是因為 Web Server 回傳的 HTTP 訊息結尾只有 n,而 .NET 實作的 WebRequest 預設情況下,必須符合 RFC 855 實作,也就是結尾必須包含 rn。所以,當 .NET 的 WebRequest 收到這個 HTTP 訊息時,就會出現錯誤。

解法兩個,一個就是讓 Web Server 丟出的 HTTP 訊息符合 RFC 855,另一個就是是讓 WebRequest 睜一隻眼閉一隻眼,亦即將 WebRequest 的 UseUnsafeHeaderParsing 屬性設為 true,這個屬性在 MSDN 文件上得描述如下:

當這個屬性設定為 false 時,會在 HTTP 剖析期間執行下列驗證:

  • 在行結尾程式碼中使用 CRLF;不允許單獨使用 CR 或 LF。

  • 標頭名稱中不應該有空格。

  • 如果有多個狀態列,會將所有額外狀態列視為不正確的標頭名稱/值組。

  • 除了狀態碼外,狀態列還必須有狀態描述。

  • 標頭名稱中不能有非 ASCII 字元。無論這個屬性設定為 truefalse,都會執行這個驗證。

當發生通訊協定違規時,會擲回 WebException 例外狀況,並將狀態設定為 ServerProtocolViolation。如果 UseUnsafeHeaderParsing 屬性設定為 true,則會忽略驗證錯誤。

將這個屬性設定為 true 具有安全性含義,因此只有在需要與伺服器的回溯相容性 (Backward Compatibility) 時,才應該執行此動作。

需要注意的是這個屬性到 .NET 2.0 才新增的,且文件中也提到除非為了 Web Server 回溯相容,否則還是設定為 false。另外,如果要全面套用到每一個使用到 WebRequest 的地方,在 app.config 加上下面的設定:

<system.net>
    <settings>
        <httpWebRequest useUnsafeHeaderParsing="true" />
    </settings>
</system.net>

Read Full Post »

TWSkype 是利用 Twitter 上的最新訊息來更新 Skype 的心情文字或暱稱,有興趣者請先啟動 Skype 3.2.x 或更新版本,然後下載 7138F53BC828450B98B75AC9EB66C977.sparc 安裝。畫面依序如下:

1. 版權宣告

2007082001

2. 賦予 Skype 連接權限,否則 TWSkype 沒有辦法執行

2007082002

3. 執行畫面

你可以依需要將你的 Twitter ID 填寫按下設定,並按下立即更新即可。原則上,訊息每 1 秒更新 1 次,如果訊息內容一樣,更新時間會延長,最大延長到 1 分鐘更新一次。

2007082003

補充:
該程式使用 .NET 2.0 開發,系統必須具有 .NET Framework 2.0 才能運作。

Read Full Post »

(C#) 取得最新的 Twitter 訊息

MSN SpaceGoogle DocGoogle Blog
Chui-Wen Chiu
2007.08.20

測試環境
1. Windows XP Pro
2. Visual Studio 2005

TWessenger[1] 是一套抓取 twitter 最新訊息來更新 MSN 狀態的 Messenger Add-In,主要技術只有兩個,第一個是透過 Windows Live Messenger Add-In API 更新 MSN 狀態文字,第二個是抓取 ATOM 取得最新訊息。本文主要描述抓取最新 Twitter 訊息的方式,首先要取得一個 twitter id,然後可代換成 ATOM URL 如:http://twitter.com/statuses/user_timeline/1713501.atom,其中 1713501 是我個人的 twitter ID,你可以代換成任何 ID。*.atom 的內容類似如下:

<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom"&gt;
  <title>Twitter / Chui-Wen Chiu</title>
  <id>tag:twitter.com:Statuses</id>
  <link type="text/html" href="http://twitter.com/chui_wen_chiu&quot; rel="alternate"/>
  <subtitle>Twitter updates from Chui-Wen Chiu.</subtitle>
  <entry>
    <title>Chui-Wen Chiu: ebXML是一個開放性的電子商務建構標準 (http://www.ebxml.org.tw/big5/index.jsp)</title>
    <content type="html">Chui-Wen Chiu: ebXML是一個開放性的電子商務建構標準 (http://www.ebxml.org.tw/big5/index.jsp)</content>
    <id>tag:twitter.com,2007-08-19T17:51:32+00:00:http://twitter.com/chui_wen_chiu/statuses/214515122</id&gt;
    <published>2007-08-19T17:51:32+00:00</published>
    <updated>2007-08-19T17:51:32+00:00</updated>
    <link type="text/html" href="http://twitter.com/chui_wen_chiu/statuses/214515122&quot; rel="alternate"/>
  </entry>
  <entry>
    <title>Chui-Wen Chiu: 加快OpenOffice執行速度的方法 (http://blog.xuite.net/emisjerry/tech/13078174)</title>
    <content type="html">Chui-Wen Chiu: 加快OpenOffice執行速度的方法 (http://blog.xuite.net/emisjerry/tech/13078174)</content>
    <id>tag:twitter.com,2007-08-19T17:35:47+00:00:http://twitter.com/chui_wen_chiu/statuses/214495672</id&gt;
    <published>2007-08-19T17:35:47+00:00</published>
    <updated>2007-08-19T17:35:47+00:00</updated>
    <link type="text/html" href="http://twitter.com/chui_wen_chiu/statuses/214495672&quot; rel="alternate"/>
  </entry>
…略

接著透過 .NET 的 XmlTextReader 以 SAX 方式循序讀取 ATOM,直到搜尋 <content> 標籤,其標籤內容即為 twitter 內容,因為 ATOM 是從新到就排序,所以第一筆極為最新消息,因此,整個完成的程序如下:

using System;
using System.Xml;

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            // Twitter ATOM URL
            string url = "http://twitter.com/statuses/user_timeline/1713501.atom";
            String statusMsg = String.Empty;
            String username = String.Empty;
            using (XmlTextReader xmlReader = new XmlTextReader(url)) {
                while (xmlReader.Read()) {                   
                    if (xmlReader.Name == "content") {
                        // 取得 twitter 內容
                        String tmp = xmlReader.ReadString();

                        // 內容切割
                        String[] contents = tmp.Split(new char[] { ‘:’ }, 2);
                        username = contents[0];
                        statusMsg = contents[1].Trim();                      

                        break;
                    }
                }
            }
            Console.WriteLine("Username: {0}", username);
            Console.WriteLine("Message: {0}", statusMsg); 
        }
    }
}

執行結果

參考資料
[1] TWessenger

Read Full Post »

來源:電子郵件,真正出處不詳

那是義大利一個電信公司招考部時所發生的一段小插曲。據說,招考部的筆試結束後,這家公司發給所有甄選通過的人一袋綠豆種子,並且要求他們在指定時間,帶著發芽的綠豆回來,誰的綠豆種得最好,誰就能獲得那份競爭激烈、待遇優渥的工作。

果然,當指定時間來臨,每個人都帶著一大盆生意盎然、欣欣向榮的綠豆芽回來,只有一個人缺席。總經理親自打電話問這人為何不現身?這人以混合著抱歉、懊惱與不解的語氣說他感到抱歉:因為他的種子還沒發芽,雖然在過去那段時間,他已費盡心血全力照顧,可種子依然全無動靜!「我想,我大概失去這個工作機會了。」據說,這是那唯一的缺席者,在準備放下電話前所說的一句話。

但經理卻告訴這孵不出綠豆芽的男子說:「你,才是唯一被我們錄用的新人!」

原來,那些種子都是被處理過的,不可能發芽。種不出綠豆芽,正證明了男子是一個不做假的人,公司高層認為,這樣的人必也是一個有道德操守的人。「而這」,總經理說:「就是我們用人的唯一準則!」……

有一句西方諺語說:「如果表現卓越是魚的話,那麼操守就是保鮮劑!」這話的意思是,工作追求卓越固然重要,但不講道德操守,一切都可能落空。就像一條魚,再怎麼美味,沒有保鮮劑,最後還是會腐爛。

同樣,那些志在必得的應徵者,所捧出的綠豆芽雖無比美麗茂盛,但不曾以誠實做為人格的保鮮劑,最後,他們終還是失去了那努力爭取、夢寐以求的工作。

——

不論這則故事是不是真實發生,聖經中也有提到"你們的話、是、就說是.不是、就說不是.若再多說、就是出於那惡者。(馬5:37)",所以,憑著你的良心作你該做的事情,其他的交給神吧~

Read Full Post »

最近再研究 WinVNC Source Code,看到下面這段有點怪的程式碼

BOOL
vncServer::RemoteEventReceived()
{
 vncClientList::iterator i;
 BOOL result = FALSE;
 omni_mutex_lock l(m_clientsLock);

 // Iterate over the authorised clients
 for (i = m_authClients.begin(); i != m_authClients.end(); i++)
 {
  result = result || GetClient(*i)->RemoteEventReceived();
 }
 return result;
}

其中 GetClient(*i)->RemoteEventReceived() 回傳 BOOL。這段 Code 的意思應該是找到第一個執行 RemoteEventReceived() 回傳 TRUE,之後就不要再執行 RemoteEventReceived(),如果是這樣,為什麼不寫成

BOOL
vncServer::RemoteEventReceived()
{
 vncClientList::iterator i;
 BOOL result = FALSE;
 omni_mutex_lock l(m_clientsLock);

 // Iterate over the authorised clients
 for (i = m_authClients.begin(); i != m_authClients.end(); i++)
 {
  if (GetClient(*i)->RemoteEventReceived()){
    result = TRUE;
    break;    
  }

 }
 return result;
}

如此,不是可以避免不必要的迭代和 assign 動作嗎?

Read Full Post »

20070817

Read Full Post »

(轉貼)Hi Ne Ni 我在這裡

原始連結:http://www.im.tv/vlog/personal/909360/2281226

耶和華我的主啊
求你使我放下心中、放下心中所愛
耶和華我的主啊
求你使我打碎心中、心中偶像
直到我在敬拜中獻上自己為祭
無怨無悔、永不回頭
直到我在祭壇那裡得著命定
無怨無悔、我在這裡

Hi- Ne- Ni、Hi -Ne- Ni
燒我差我,我在這裡。
Hi- Ne- Ni、Hi- Ne- Ni
燒我差我
Hi –Ne- Ni

為這世界黑暗的角落,我在這裡
為那不曾被安慰的靈魂,我在這裡
Hi- Ne-Ni

 
最近作什麼事情都懶洋洋,服事上也是如此,原本寫完文章想去睡覺,恰好看到"夏美~~なつみ"留言,所以又連上 I’m Vlog 看有什麼新音樂,再一次看到"獻上感恩的心"那篇寫的唐蒙恩自傳,很受感動,也讓我想了一下自己未來的道路。接著又看到"Hi Ne Ni 我在這裡"這首歌,他的歌詞真是讓我感動
 
"求你使我放下心中、放下心中所愛….求你使我打碎心中、心中偶像。直到我在敬拜中獻上自己為祭…直到我在祭壇那裡得著命定…"
,也許這就是此刻我需要對神的禱告~

Read Full Post »

Older Posts »