兒子便秘

012-我不喜歡喝水-03 (by Ellery)
昨天傍晚餵兒子喝奶,在他快喝完的時候,突然臉一陣紅一陣白的在用力。
我知道,這是他在嗯嗯的前兆,在努力數下之後,開始哭~我趕緊叫老婆過來幫忙。
於是我們趕緊把他尿布解開,想要幫他~
果然,撥開他的小菊花一看,就是有硬硬的便便卡住,我拿出溫度計沾上一些凡士林,插進他的小菊花刺激他~
於是他繼續嗯嗯,嗯到他哭喊,恩到哭著努力想要讓它解放,我們的心裡真的是很難過。
後來便便總算是出來了~還帶著一些血絲~
喝完奶之後,我們趕緊餵他喝了 30cc 葡萄糖水。
喝完以後跟他講了好久~讓他明白不可以因為痛就忍著不便便~
到了晚上九點多餵奶,他又變臉、哭喊,不過這次便便雖然也小硬,但卻順利了許多~(我想這可以證明他有聽懂我們說的話。)
以後喝完奶都要強迫他喝水了(因為他不愛喝水),早晚也要給他暗示說要便便~否則每次他便便都會是他自己的痛苦~
參考資料:

讀取網頁(3)

WebClient 畢竟還是有一些限制,例如 Cookie,這就沒辦法了,你必須要自行操作 Header。
可是 WebClient 並沒有任何成員可以讓你實現這塊。

而 WebClient 的底層,其實是用 WebRequest 來實現的。這裡的例子使用了
HttpWebRequest,但其實 HttpWebRequest 也是繼承自 WebRequest。
要加上 Cookie 的話,你得指定 HttpWebRequest 的 CookieContainer 屬性。

所以我們很快就可以寫出 wgetInWebRequest()。
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Net;
using System.Web;
using System.IO;
using System.Diagnostics;
using System.Collections;

public class Network
{
    public static string wgetInWebRequest( string url, CookieContainer cookies, Encoding encoding )
    {
        string responseData = "";
            
        try
        {
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create( url );

            // 加上 Cookie
            webRequest.CookieContainer = cookies;

            // 如果你有 Proxy 的話~
            // webRequest.Proxy = new WebProxy( "your_proxy", 3128 );

            // 加上 User Agent,用來模擬瀏覽器~
            //webRequest.Headers.Add( "User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");

            StreamReader responseReader;
            responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream(), encoding );

            // and read the response
            responseData = responseReader.ReadToEnd();
        }
        catch( Exception ex )
        {
            Debug.WriteLine( ex.ToString() );
        }
        finally
        {
            Debug.WriteLine( responseData );
        }
        return responseData;
    }
}
我想,也許你會問這有什麼用?
一般網站應用系統登入以後,都會設置 Cookie 以表示你已經登入了,換句話說,你只要先設法模擬登入,然後取得 WebResponse 所得到的 Cookie,接著再把得到的 Cookie 放到 WebRequest.CookieContainer,你接下來所有對該網站應用程式的 Request 就已經是有特定使用者身份的了~
讓我舉個 ASP.Net 網站的例子吧~
    public static void Login( string user, string pwd)
    {
        string loginPage = wgetInWebRequest( "http://your_web_app/login.aspx", null, Encoding.Default );

        // ASP.Net 會在頁面埋一個 __VIEWSTATE 隱藏表單變數,先取得!
        Regex rx = new Regex(@"\<input\ type=""hidden""\ name=""__VIEWSTATE""\ value=""(?<viewstate>.+)""\ /\>");
        string viewstate = "";

        try {
            // Find matches.
            MatchCollection matches = rx.Matches( loginPage );
                
            if( matches.Count == 1 )
            {
                // 要作 UrlEncode
                viewstate = HttpUtility.UrlEncode( matches[0].Groups["viewstate"].Value );

                // 用來收 cookie 的容器
                CookieContainer cookies = new CookieContainer();

                // now post to the login form
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create( "http://your_web_app/login.aspx" );

                // 模擬瀏覽器
                //webRequest.Headers.Add( "User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");

                // POST
                webRequest.Method = "POST";
                webRequest.ContentType = "application/x-www-form-urlencoded";

                // 收到的 cookies 會放到 cookies 變數
                webRequest.CookieContainer = cookies;

                // 如果你有 proxy 的話
                // webRequest.Proxy = new WebProxy( "your_proxy", 3128 );

                // 這邊要看 login 表單有哪些變數而定,請自行變化
                string postData = string.Format( "__VIEWSTATE={0}&user={1}&password={2}&Submit=Submit", viewstate, user, pwd );
                StreamWriter requestWriter = new StreamWriter(webRequest.GetRequestStream());
                requestWriter.Write(postData);
                requestWriter.Close();

                // 收到內容啦,但是我們不需要他的結果,只要 cookies
                webRequest.GetResponse().Close();
                    
                // now we can send out cookie along with a request for the protected page
                string responseData = wgetInWebRequest( "http://your_web_app/default.aspx", cookies, Encoding.Default );
                Debug.WriteLine( responseData );
            }
            else
                Debug.WriteLine( "Internal error, too many ViewState." );
        }
        catch( Exception ex ) {
            Debug.WriteLine( ex.ToString() );
        }
        finally {
        }
    }

大致上就是這樣子,我不作太多的說明囉~
想要作更多的話,可以再研究HTTP Protocal並配合Sniffer之類的軟體去監看網路封包,來了解詳細的流程。

奶爸心得(2)-參考用的餵奶間隔

原本以為小朋友只要定時餵,就會乖乖的,實際上卻不然。
我家的小朋友,哭了,會有兩個可能原因:

  1. 餓了
  2. 想睡了

(尿布濕了反倒不是最主要的原因,濕了,他只會睡得比較不穩而已。)
在初期,他常常哭,老婆跟我始終搞不清楚他是想睡還是想吃。到後來,終於搞懂了,簡單的判定原則就是,吃”飽”以後的 3~4 小時,如果哭了,可以先簡單把餓的因素排除掉;反正就是先哄睡。如果還是哭,就換人哄,再不行,就應該是餓了~
所以這個餵奶間隔,真的就是參考用~

張超英病逝

今天在Yahoo!奇摩新聞上看到張超英病逝了~令人扼腕的消息~
原本不知道這個人對台灣的影響在哪裡。某次到敦南誠品看到宮前町九十番地這本書,翻了一會,發現這本書有種獨特的魅力,讓我沒辦法放手。從他身邊的故事與在國外所作的事情,可以很清楚的讓人體會到台灣外交的艱難處境與之前國民黨政府的顢頇(要不然怎麼會有民進黨美麗島事件?)~
在此悼念~並推薦這本書:宮前町九十番地

讀取網頁(2)

上一篇最後留下 Encoding 的問題還沒解決,事實上已經有解了:你可以改用 DownloadString() 函數。
DownloadString() 是怎麼做到的呢?
他是先看 WebRequest 得到的 Header 裡面是否有 Content-Type ,如果有指定的話,再看他裡面是否指定 charset,如果有,就以此編碼去讀取 stream。
如果沒有指定的話呢?.Net 2.0 的 WebClient 多提供了 Encoding 屬性,換句話說,就會以 Encoding 屬性指定的編碼去讀取 stream。
事實上,大部分的 browser 並沒這麼笨~他還會先去偷看網頁內容是否有指定 Content-Type 這個 meta tag:

<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />

如果有的話,就會以此 charset 所指定的編碼來讀取。

讀取網頁(1)

如果你要搞個 spider 或是 bot,需要讀取網頁的話,用 WebClient 就綽綽有餘了~
using System.Net;

public class Network
{
    public static string wget( string url )
    {
        WebClient _client=new WebClient();
        string result="";
            
        try {
            // 藉著修改 Header,可以用來模擬某特定 Browser,以下是模擬 IE 6
            _client.Headers.Add("Accept","image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*");
            _client.Headers.Add("Accept-Language","zh-tw");
            _client.Headers.Add("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");

            // 表示支援壓縮,也就是說,你可以丟壓縮過的資料過來,我來解~
            //_client.Headers.Add("Accept-Encoding","gzip, deflate");

            // read
            System.IO.Stream objStream=_client.OpenRead( url );

            // 要知道正確的編碼,再去讀取~.Net會幫我們自動轉為 unicode 字串。這邊預設都是 UTF8
            System.IO.StreamReader _reader=new System.IO.StreamReader(objStream,System.Text.Encoding.UTF8);
            //System.IO.StreamReader _reader=new System.IO.StreamReader(objStream,System.Text.Encoding.GetEncoding(950));
            result = _reader.ReadToEnd();
        }
        catch( Exception ex ) {
            throw ex;
        }
        finally {
        }
            
        return result;
    }
}

所以我們就可以這麼用
Console.WriteLine( Network.wget("http://www.google.com.tw") );

目前有個決定性的缺點:必須先知道網頁編碼,我們才能讀到正確的文字~有辦法先知道網頁的編碼,再去決定要怎麼讀取嗎?

奶爸心得(1)-奶粉與紙尿布

地區:新店安坑/中和
我家用的是明治嬰兒奶粉,目前最低價在南勢角威安藥局:309。
家裏附近的藥局則是 319,一般大賣場是 325,價差可以差到 1x 元,不可說不大。
明治算是蠻便宜的了,其他牌子的奶粉可想而知。
紙尿布的話,我家並沒有特定愛用品牌,大體來說是混用,就是貴一點/比較舒服的在晚上用,便宜的/感覺上較差的在白天用。。
最早我娘是用布的尿布,後來先暫停,因為布的尿布太久沒換的話,容易造成上衣濕掉,所以必須經常更換。
冬天經常更換尿布又怕小朋友著涼,後來我娘還是先用紙尿布,等夏天的時候再說。
最低價是在全聯福利中心,大潤發有集點活動,藥局可能也有,但卻都不一定有全聯那麼便宜。
2007/3/10 更新:
奶粉與尿布最低價出現在永和中正路上的宏恩連鎖藥局,奶粉 299,尿布居然比全聯硬是再便宜了十元左右~

電影流水帳(2007/2/13~2007/2/25)

看的片子反而變少了~是我記憶變差了嗎?還是怎麼著??
印象中主要好像還是都在看 Discovery 、國家地理頻道跟綜藝節目~

  • 星際大戰四部曲五部曲六部曲:這是去十大書坊租借的…再加上過年期間衛視西片台播放的首部曲二部曲三部曲,這樣就算是補完了。
  • Lucky Number Slevin,中譯片名為關鍵密碼,個人覺得翻譯的很爛,片名其實就是片裡所描述的故事與主角名字,這片的故事很簡單~就是復仇~導演故意拍得很撲朔迷離,總算是湊完了一小時四十幾分。
  • OCEAN’S 12,一直想看卻沒機會看完的片子,今天剛好從中間一半看起,片中很有趣的一段是,叫Julia Roberts所扮演的Tess Ocean去演Julia Roberts,很不幸,剛好兒子起床了,也沒看完。
  • Prison Break 第二季的14、15,沒什麼好說的,不過劇情越來是越緊張,希望趕快結局~
  • 國家地理頻道的杜拜人工島,很神奇的島嶼,居然可以這樣憑空造出~
  • 龍虎門,只看了最後一小段,甄子丹真是帥~
  • 打雀英雄傳,跟大部分賭的電影差不多,主要是無聊啦~看看也無妨~
  • 反收數特遣隊,每次有轉到,都是只看一小段,讓我想看下去的原因是,片中有個洋警員兼差作律師。或許以這個橋段可以發展出另外一部電影呢~不過這部片子談的是警察借高利貸的問題。
  • Batman Begins,大約看了60%~70%左右,從越來越大堆頭的續集之後,回歸純樸,這部我覺得還拍的不錯~我個人最欣賞的是第二集~
  • KERORO軍曹‧超劇場版,一不小心又看完這片,還不錯~

體會

小時候,有一次我感冒咳嗽,藥已經吃完,感冒也好的七七八八,就是喉嚨還帶著痰在咳嗽。我媽聽了,就要我去看醫生,我搖頭說不,她很生氣,就說:”不去可以,那你就不要咳給我聽!”。於是我照作,再也不敢咳出聲。
當時我不能體會她為什麼要這樣斥責我,可我現在在我兒子感冒咳嗽的同時,明白了。這就是父母心啊~父母總是不忍見自己兒女受苦。
我想兒子的感冒是我傳染給他的,除夕前天我感冒了,除夕當天回叔叔家拜祖先,隔天就發現他有輕微發燒,初二早上就跑去慈濟看醫生,醫生說沒大礙,能吃就沒問題,只開了個藥水。初三,我們還帶他跑去富田花園農場,不過這天我心裡很掙扎~整天其實臉色都不是很好~幸好我戴著口罩,看不太出來。之後的幾天都在家休養,期間心裡很擔心難過,好在現在也好的七七八八了,就是偶爾還在咳嗽,聽了還是會忍不住擔心兩下~
參考資料:

  • 發燒拉警報! 正確處理寶寶發燒8Tips,

    一般定義肛溫高於37.8℃,口溫高於37.3℃,腋溫高於36.8℃為發燒。

    一般感冒常會發燒2~4天,如果活動力佳、進食正常則不必太擔心。但需注意感染有無惡化或發生併發症的情形,如嬰幼兒出現哭鬧不停、活動力差、高燒不退、不肯進食、抽搐等,應儘速就診。

電影流水帳(2007/2/5~2007/2/11)

想不到這星期又莫名其妙看完五部電影,少林傳人跟雷鳥神機隊這兩部嚴格來說,不能算全部看完,完成度約 80% 以上…
我正在想,在帶小孩的這段期間,我會不會把很多電影都看過一遍啊~(驚~)

  • 少林傳人,故事內容就是簡單的王子復國記,還蠻好看的,我老婆轉到這台以後,居然就停住,繼續看下去…記得上次有部好像叫乾隆下江南的老片,好像也是這樣…
  • A Very Long Engagement未婚妻的漫長等待,之前有聽朋友說過這片,原本以為會很枯燥的,不過卻發現蠻對我胃口的,就一路看下去,雖說是漫長的等待,但女主角並不是坐以待斃,而是慢慢追查,這樣的過程相當有趣,女主角如果不是Audrey Tautou,我還真想不出有誰適合出演。片中居然還有Jodie Foster,嚇了我小小一跳。
  • 超人類,找不到官方電影網頁,只好隨便從搜索結果中挑一個。故事的真相發人深省,其實這樣的事情已經在真實世界上演…
  • The Break Up,建議還沒結婚的男女,一定要看看這片,同居/結婚以後發生衝突的原因往往就是這麼簡單,雖然故事的最後並不是皆大歡喜,不過卻比較貼近現實的生活,這樣也好,好萊塢電影的結局並不一定都要是好結局啊~
  • Thunderbirds,老片新拍,還不難看啦~

p.s.開始很認真的在考慮這一系列的文章標題要怎麼下….