1. Generic Type 的繼承...

    之前貼過一篇 Singleton 的文章 (泛型 + Singleton Patterns, 泛型 + Singleton Patterns (II)), 就用到 base class 是 generic type 的作法, base class 可以是 generic type, 在繼承時直接給型別, 衍生出來的子類別就不再是 generic type 了.. 不過這種怪異的用法, 大概沒什麼書上的範例有講到, 也沒什麼書上有應用範例... 這完全是我自己亂配出來的藥方, 沒練過的人不要亂吃, 咳咳..

    除了 Singleton 那種例子之外, 我另外碰到一個例子... 某個用 asp.net 開發的 project, 需要準備一套輸入各種型別資料的 control, 如基本的型別: string, int, bool, DateTime, TimeSpan... 及較複雜的自定型別, 如 MemberInfo, RoleInfo, ..... 等.

    基本型別的部份, 大概大家都是搭配 asp:textbox, asp:checkbox, asp:calendar 這幾個控制項加一些 code 就搞定了, 反正用起來夠簡單, 也不用再呼它夠不夠精簡, 可不可以 reuse 了, 後面的自訂型別應該也不會太多, 可能土法練鋼, 每種各硬寫出個 user control 就解決了...

    不過我怎麼能容忍這種 code 擺在我眼前? 哈哈... 看了就很不順眼... 以一般的 OO 觀點來看, 這些控制項應該有些共通的地方 (generalization) 能抽出來, 往上堆到 base class .. 不過卡在每種 user control 要輸入的型別跟本完全不一樣, 不是通通用 object 代替, 就是要寫的很醜...

    看到那段紅字, 大家大概就會聯想到泛型 (generic) 了, 沒錯... 不過套用到 control 的世界該怎麼用?

    貼一段不能 run 的 sample ... base class 的部份:

    public class Editor<T> : System.Web.UI.UserControl {
        public abstract T Value { get; set; }
        // 其它就不干我的事了
    }

    之後假設我要寫個選日期的控制項, 只要這樣寫:

    .ascx

    <asp:calendar runat="server" id="calendar1" />

     

    .ascx.cs

    public class DateEditor : Editor<DateTime> {
        public override DateTime Value {
            get { return this.calendar1.SelectedDate; }
            set { this.calendar1.SelectedDate = value; }
        }
    }

     

    最後用起來就沒什麼特別的了, 大概像這樣:

    <chicken:DateEditor runat="server" value="2000/01/01" />

     

     

    看到最後, 讓大家失望了 (H), 沒什麼特別的 code 嘛, 其實不然, 這個作法可以替你的 project 打下一個很好的基礎, 透過 generic 的 base class, 解決掉型別的問題後, 你就可以把各種型別的 editor 都綁在一起, 讓它們有共通的 base class, 這樣的好處很快就出現了, 有許多功能你就有機會只作一次, 每種不同的 editor 都能享用...:

    1. 例: Editor 可以實作 "記住上次輸入的值" 這動作, 只要把 value set 的 code 插一段, 記到 file / db 之類的地方..., 所有 editor 自動都有這個能力了
    2. 可以統一加上 OnChange Event, 所有的 editor 都可以有這事件讓寫 page 的人能應用
    3. 因為所有的 editor 都有共同的 base class, 因此搭配 reflection 及 attribute, 你就能把 polymorphism 的技巧應用出來. 舉例來說, 你可以拿任意物件, 產生它專用的編輯畫面. 你可以透過 reflection api, 把所有的 field / property 名字及型別列出來, 同時在畫面上動態產生一個對應型別的 editor control ... 最後底下放個 [save] 的 button, 按下 ok 後自動的把每個 editor 收集到的值寫回 object ... 這一連串的動作如果沒有共同的 base class, 你是沒有辦法做的出來的
    4. 其它 543 的功能, 你有辦法都可以加在 class Editor<T> 裡, 馬上所有的 Editor 都能夠繼承這些能力
    5. 想不出來了, 剩下的原因只有這樣寫起來比較爽...

    實際的 sample code 還真的不大好寫, 我碰到的 project 裡寫的東西又牽扯太多, 那天有空想要把它精簡一點的話再放 sample code, 不然就再說... 哈哈..

    2007/02/12 .NET Tips 技術隨筆 物件導向

  2. Windows Live Writer - Plugin 處女作...

    Windows Live Writer (以下簡稱 WLW) 用過的都說好, 老實說它做的真是不錯, 連家裡太座用了之後就再也不到網頁上寫 blog 了...

    不過有個缺點實在是很礙眼, 就是透過它上傳的圖檔, 不管 options 怎麼調, 透過 MetaBlogAPI 或是 FTP, 都會被重新存一次 JPEG 檔. 一來 JPEG 是破壞性壓縮, 越存會越糟糕, 二來它用的 quality 還不低, 我自己的圖檔丟上去大概都會肥一倍... 畫質變差, 檔案又有可能變肥, 真是人財兩失.. 到底差多少? 各位自己比較一下就知道了, 在圖檔上按右鍵選內容可以看的到 file size.. 底下左邊的圖是原檔, 右邊是 WLW 幫你加工過的, 不過我原圖是 JPEG 100% quality, 所以 WLW 雞婆完反而變小一點...

    試了半天沒得解, 每次都用 "Insert Picture From Web" 也不是辦法, 就把腦筋動到 Plugin 上了... 跟小熊子聊完後就開始手癢了, 去下載 WLW SDK 回來看... 可以用 .NET 寫, 就邊 K 邊寫起來... 做法跟 Insert Picture From Web 差不多, 只是先設定好 UNC 路逕跟網址的對應, 讓你挑完檔案先幫你 copy 好再塞入網址.. 懶人用.

    首先是 option settings, dll 丟到 Plugins 目錄後, 打開 WLW 的 Tools -> Preferences, Plugins 就會看到新加進去的外掛了..

     

    我有準備編輯設定的畫面... 因此有 [options] 的按鈕可以用..

    這個畫面就很簡單的只填 UNC (網路分享的路逕), 跟對應的 URL ... 設定完成後, 只要要插入圖檔時, 從選單選 Insert -> 插入圖片(從網路芳鄰), 就會跳出標準的 Open File DialogBox, 挑完就一切大功告成了 :D

     

    本來是想從 MetaBlog API 下手, 因為這個管道也可以 upload image, 不過試了半天宣告放棄, 大概是 Microsoft 怕有人寫 Plugins 來偷密碼吧? 也可能是 Plugins 都被定位在 "edit blog" 的部份, 而不是 "publish" 的部份, 因此完全拿不到 WLW 的 Weblog Account 相關資訊... 這條路宣告放棄, 就算要作, 也得分開 config, 沒辦法...

    現在這個版本其實只是自己做爽的而以, 所以就不用跟我要 .dll 了, 不成氣候的作品... 因為不知 Microsoft 下一版會不會改掉這鳥問題? 有的話這外掛就變廢物了, 二來現在太陽春, 連個防呆都沒有... 哈哈... 只是花兩個小時邊 K 邊寫的本來就只能玩玩... 不過做過這個 plugin 後, 寫法跟能運用的範圍大概都有個底了, 下次來改寫的話, 我打算 option 那邊就改成 MetaBlogAPI 需要的設定, 如 Blog URL, account, password 等資訊, 不然放個網芳真的是沒啥用...

    2007/02/07 .NET 作品集 技術隨筆

  3. 新手機真是讚 (y) - II

    既然要勸敗, 就要勸的徹底一點, 不過我當然寫不出那種從開箱就一堆照片, 然後啥 ooxx 很有質感, 接著再拿一堆手機出來疊疊樂的文章, 咳咳..

    發現買 Dopod C720W 這支手機的人似乎不多, 討論也是少到可憐, 不過這款手機倒是有不少優點, 我事前除了做足了功課之外, 還專程去抓了 Microsoft 的 Smartphone SDK + Device Emulator, 把我要的功能都試了好幾次, 確認跟我想的一樣才跑去買... 我就挑幾個合我胃口的優點講一講:

     

     

    Dopod 內建了幾個軟體, 很鳥的就不講了, 不過 "語音命令" 這個軟體還真不錯 (Y), 軟體不大, 語音也不用事先錄好, 直接講就可以了, 像上面的例子, 我只要 hotkey 按住, 對著手機講 "打電話到叭樂雞行動電話", 接著講 "確定", 我的電話號碼就撥出去了..., 講 "查詢叭樂雞", 我的通訊錄就跳到我那一筆...

     

     

    這個軟體 ( pTravelAlarm ) 從我上一支 smartphone 就開使用了, 沒什麼特別的功能, 就是簡單好用而以. Microsoft 內建的鬧鐘很沒有誠意, 連兩百塊的電子錶都比它強 :@, 我的要求也不多, 能用 midi / mp3 / wma 當鈴聲, 能夠讓我訂兩三組, 上班 & 周末各在不同時間響就好了...

    不過說也奇外, 這麼簡單的功能還真找不到滿意的, 這套本來在 WM5 smartphone 有小 bug, 就是 kb 鎖住後鬧鐘又響, 事後會按不到解鎖的鈕, 變成你的手機就解不開了 :@, 解法只剩自己打通電話進來, 或是拔掉電池這兩招... 本來想試試其它軟體都不合用, 剛好一月中更新的版本解掉這個鳥問題, 就繼續用這套習慣的小鬧鐘...

     

     

    Screen Saver + Auto Lock

     

    手機剛買來前兩天, 就為了這件事很苦惱, 一堆鍵, 旁邊還有觸控條, 帶在身上光是要拿出來就會不小心按到一堆鈕... 收起來時忘了 lock keyboard 就麻煩了, 用慣折蓋機對這點還真不能適應... 果然 smartphone 能灌軟體是個大優點, 什麼要求都找的到軟體可以用...

    這個是德國人寫的小程式, 選項多到會眼花, 我只挑兩個功能... 一個是像電腦的 screen saver 一樣, 隔幾秒不動就自動 lock keyboard .. 另一個就是它可以自定 screen saver 的畫面, 設定方式挺抽像的, 不過彈性很大就是, 這段 video 就是我調的, 還是弄個類比時鐘比較順眼... :D

    底下那排 icon 會隨時跟著 smartphone 的狀態作變化, 像是有沒有開 wifi, bluetooth, 電池有沒有電, 有沒有漏接來電等等... 還挺方便的, 另外有顯示溫度 ??? 不過那個溫度怎麼看都不準, 不知道資訊是打那來的?

     

     

     

    上一篇提到多普達的鳥客服... 手機買來手癢就給它 hard reset, 然後要去抓軟體回來裝, 網站連個影都沒有 :@, 對, 即使到現在還是沒有. 本來有內建一個字典也沒得用了, 只好去挖這套之前在 8390 上面用的字典出來裝...

    這年頭, 連手機都有 clear type ....  =.=, 左邊的是開 clear type 的效果, 右邊的沒有... 其它就沒啥特別了, 就是一般的字典而以.. 我裝了英英跟英漢兩套, 果然有 qwerty keyboard, 查起來真順手, 哈哈...

     

     

     

    Dopod 最近的手機都內建一套 RSS reader, 本來我是想...

     "手機內建 rss 能幹嘛? 我又不會一天到晚上網"

    不過就算每天只同步一次, 這個軟體還真不錯用, RSS 剛好可以把這些消息大綱很快的上網抓下來, 然後就帶在身上無聊拿出來看一下... 如果 theme 換成多普達的, 在首頁還會隨機輪播 RSS 的文章標題...  現在到處都有 RSS 可以訂閱, 每天簡單更新一下就幾十則新聞自動跑進來... 遠比用 mail 或是 mobile favorites 方便太多了... 沒上網時就有東西可以看, 當然有上網時更棒... 可以直接連到網頁去看全文...

    不過用手機上網幹嘛? wifi 又不是那麼方便, 我也沒有 3G / GPRS 吃到飽... 這時 bluetooth 的好處就來了, 我的電腦插著 bt dongle, 剛好我在床上躺著還可以收到訊號, 臨時想連一下就不用爬起來... 哈哈, 所以現在我都窩在床上看 RSS ..

    補幾張圖... 左邊是看 RSS 內容的畫面, 右邊是點了 "線上閱讀" 後開 IE 的畫面.. 怎麼上網的? 本來用 wifi 後來覺的太麻煩, 我現在都改用 bluetooth + activesync 了...

     

     

     

     

     

     

    PaPaGo G10 就沒啥好講了, 之前只耽心 320x240 這種解析度會不會有問題? 試了結果是一切正常 :D, 補幾張圖應付一下.. 哈哈..

     

     

     

    這個軟體叫 Smart Journal, 是裝在 PC 上, 不是裝在手機上... 只要每次 ActiveSync 一啟動, 它就會跟著跑起來, 會把 SmartPhone 上面的通話記錄都倒到 outlook 的日誌 (Y), 我的 outlook 就會有所有的通聯記錄了, 咳咳.. 它會記錄來電 or 去電, 沒接到的也會記, 如果通訓錄對的到, 就會直接秀名字, 也會有通話時間... 這個小軟體太棒了, 有用 windows mobile 的一定要去裝一下...

     

     

    最後要講的是象牙筷子... 咳咳, 果然敗家會忍不住一直敗下去... 為了這支手機總共多敗了三樣雞絲...

    1. 那個買到假貨的 bluetooth headset 就不要提了, 雖然 NTD480 而以, 賣家還有一萬多個好評... 反正我本來就只是要買個便宜堪用的... 沒想到現在連 3C 產品也有假貨, 外型很像, 包裝很像, 不過很多小地方不同, 模具也差, 不過抓到的 device id 還一模一樣, 對岸的功力果然不是蓋的... 之前看壹周刊, 對岸連雞蛋都有假的... (沒錯, 假蛋打開也有蛋白蛋黃, 拿去煎還會熟...  -_-)

    2. Kingston 1GB micro SD, 含 SD 轉卡, 還有一個 microSD 的 USB 讀卡機 (不用轉卡), 含稅, 總共是 NTD 550 + 50 ... 同樣的東西 512mb 要 300 + 50, 想都沒想就標了 1G 的... 不過, 塞不完啊 :'(   努力塞了半天還剩 7xx mb ...

    3.  最後一個, 用了三個禮拜的 USB bluetooth dongle, 受不了了, 凸一塊在旁邊, notebook 很難收到包包裡, 拔掉的話要連線又要抓半天, ThinkPad 專用的 BMDC-300 貴就算了, 沒內建天線, 還要破解 BIOS 啥的... 受不了就去敗了這張 PCMCIA 的 bluetooth adapter, 不過也不便宜, 夠買兩支同等級 USB 的 bluetooth dongle 了.. 這張的收訊範圍是 200m (號稱), 舊的那支我剛好躺在床上用手機就是極限了, 翻個身就收不到, 換了這張怎麼滾都有訊號... 哈哈!! 不過美中不足的是, 買來插上電腦才發現, 這張 PCMCIA 其實裡面是 USB host chip + USB bluetooth chip... 所以插上電腦是先找到 VIA USB Host Controller... :@, ouch !!! 腦袋馬上響起一句話.. "VIA sucks..." 嘖嘖, 好在用起來沒啥大問題, 就睜一隻眼閉一隻眼吧...

    4. GPS bluetooth receiver... 這個還沒敗, 不過我只打算買個便宜堪用的就好, 哈哈... 這個其實不算買手機後才要買的東西, 我本來就有一個了, 只不過之前有一次拿錯變壓器, 充壞了, 還可以用, 不過關不掉, 電池一放就猛閃燈, 也不會進入省電模式, 猛閃個半小時就沒電去...

    好了, 別再撐了, 快去敗吧... 對, 就是說你們兩個 :D

    2007/02/03 敗家 有的沒的 當年勇

  4. 總算搬完了

    server 跟我桌機要對調主機板的事, 其實早就有這打算了, 只因為一個懶字, 就摸到現在 (H)...

    幾個月前, 弄了套陽春的 MCE, 因為配了 Core2 Duo CPU, 又快又省電, 風扇也安靜的多, 就想把它換到 server 上, server 的 PentiumD 920 挪到桌機看電視等娛樂用途...

    上週日趁著老婆小孩回娘家, 有幾個小時的空檔, 開車回家吃完飯就趕回來施工了, 3:00pm ~ 6:30pm 總算把要拆機的動作弄完... 嘖, 動作真慢, 果然年紀大了就不適合玩 DIY 了, 以前這種事大概一半時間就搞定了...

    整個過程還真是不怎麼順利... 記一下:

    1. 顯示卡的散熱片卡到機殼風扇, 剛剛好蓋不起來...
    2. 12" 的機殼大風扇, 平常放著竟然吸了好幾隻蚊子到機殼內.. -_-
    3. 積了一堆灰塵, 吸塵器剛好沒電
    4. SATA 接頭竟然一碰就掉, 害我多拆了好幾次
    5. MCE跟我哀說偵測到硬體變更, 要我重新 activation windows xp :@
    6. 一堆沒標示正負的線裝反, 燈不會亮, USB 不能用, 讀卡機不會亮 ... Orz
    7. USB KB 竟然在開機時會抓不到, 明明按個確定就好, 就是按不下去 :~ 只好再去挖 PS/2 的..

    搞了半天, 小皮有一整天沒湯瑪士可以看, 我有兩天沒睡飽, 少錄了一天的天線寶寶跟企鵝家族, 總算是都搞定了... 換了 C2D, 果然安靜很多 :D  辛苦果然是值得的, 接下來就是欠的債要還一還了, 升級 community server 2.1 ...

    2007/02/02 家人 敗家 有的沒的 水電工

  5. 新手機真是讚 (y)

    哇哈哈, 用了半個多月, 覺的這支新手機 (dopod c720w) 真是不錯啊... (Y)

    這支手機果然沒有辜負我對它的期望, $$果然沒有白花, 喜歡用 smartphone 的人可以考慮一下... 首先對於一支手機, 它是還蠻稱職的, 雖然這些要求可能幾百塊的手機就擺的平, 不過被舊手機折磨了兩年多, 我一定要講一下...

    • 待機時間還不差, 官方說法待機 250hr, 平常一天講個三四通, 早上當 mp3 鬧鐘, 可以連續用個四五天.. 比之前那支待機 1 天, 電力剩不到一半還會斷訊好多了
    • 終於不會當機了... :'(
    • 很薄, 掛在腰帶上很舒服, 不會卡卡的

    如果只有上面這些優點的話會被人當笑話看, 咳咳...

    • 橫的 LCD ( 320x240 ) 看起來果然爽多了, LCD 畫面真棒
    • 跟 outlook 整合的很完美, 藍芽一按下去資料就通通過來了, 通訊錄的大頭照貼在 outlook 裡就自動進來...
    • 鬧鐘 + 自動鍵盤鎖 + 全螢幕的類比時鐘等小軟體, 灌一灌就很順手
    • 不小心買了 1GB microSD, NTD 600 含運費 + 發票 + USB 讀卡機, 灌不滿 :~~
    • 可以跑 PaPaGo, 以後出門不用多帶台 PDA ..
    • 終於可以用 bluetooth headset ... :D
    • 標準 mini USB 充電, 到處都可以充...
    • 用了之後證明, 有 qwerty 鍵盤, 比拿隻筆在上面戳戳戳方便太多了 (H)
    • 有 wifi, 在公司可以直接上網, skype / communicator 可以直接用
    • 搭公司的 exchange server 可以有 push mail
    • 語音命令很好用, 直接唸名字就可以打電話...
    • RSS reader 放上面很方便, 平常同步抓一下, 出門沒事可以當報紙看
    • 可以看 word / excel / power point / pdf, 檔案帶著實用多了
    • 通話記錄可以傳回 outlook journal, 有來電號碼, 通話時間等...
    • 電腦放房間, 我躲在床上還收的到藍芽的訊號, 剛好省了 wifi ...
    • 可以自己寫 .net cf 的程式丟上去跑...

    爽完了, 講點不爽的...

    • dopod 的客服實在是很鳥, 手機買來有灌一些工具, 手冊說 hard reset 後這些軟體會清掉, 要上網 download 軟體回來補... 不過網站跟本沒這堆檔案, 跟客服盧了兩個禮拜沒結果 :@
    • 為了搭手機去買 bluetooth headset, 沒想到連這東西都有冒牌的.. -_-, 不過很便宜就是...
    • notebook 沒有內建藍芽, 插一根藍芽棒好麻煩.. 該去敗 thinkpad bmdc 300 或是 billionton 的 pcmcia bluetooth adapter 了..
    • 沒座充... mini USB 有個蓋子, 要拔來拔去的.. 為什麼不能無線充電啊!!!
    • 好貴...

    哈哈, 還沒退伍時買了第一支手機 (Panasonic GD70), 之後就沒再買過了, 中間兩支手機都是不用錢的 (H), 這支是第二支... 不錯不錯, 果然手機還是要自己買才合用啊... 這篇其實沒啥內容, 只不過是勸敗文而以, 哈哈 :D

    2007/02/02 敗家 有的沒的