1. 升級失敗... Orz

    看到 community server 官方網站, 有 CS 2.1 SP2 可以下載, 想說跟我當初裝的 2.0 RTM 也隔了好久, 想說來升級看看...

    順手先做了 shadow copy, 然後照說明, 更新檔案, 執行 2.x -> 2.1 upgrade sql script ...

    很好, 結果整個 CS 開不起來, CS 又有自己的錯誤回報機制, 所有錯誤訊息都被藏起來, 除了知道有 Error 之外啥都不曉得.. -_-

    結果小孩在旁邊吵, 沒法專心處理, 只好把 revert shadow copy ... 下次責日再戰.. :@

    2006/12/10 有的沒的

  2. CS 2.1 SP2 - MetaWeblog API / newMediaObject method support ..

    聽說新版的 MetaWeblogs API 直接支援上傳照片... 不用再搞半天弄 ftp 了...

    貼張照片試看看...

    2006/12/10

  3. Volume Shadow Copy Service ...

    windows 2003 提供的 "新" 功能... 其實也不算新了, 都已經要邁入第四年了, 不過卻是個很實用的東西..

    簡單的說, vss 是建立在 file system 以下的服務, 它可以替你的 storage 做 snapshot, 跟一般的備份不一樣, 它是用 "copy on write" 的方式. 意思就是, 當我要求現在替我的硬碟做一次 snapshot, 只要這份 snapshot 不刪除, 我都隨時可以找到這時的檔案內容.

    聽起來就是一般的備份嘛, 不過它的作法完全不同. snapshot 很快就可以作好, 是快到 0.x sec 這種程度, 它只是在目前的資料上做個記號, 只要檔案沒更新, 完全沒有資料需要被備份. 而已經作了 snapshot 的資料要被更新時, 它才立即做了一份 copy, 實際上的更新動作是 copy 一份出來才 update. 這就是 "copy on write" 的作法.

    講那麼多幹嘛? 因為當年研究所考試台大有考 "copy on write" ... 當時年紀輕什麼都不懂, 想破頭也寫不出來, 後來考完出來翻書才恍然大悟, 只怪書翻的太晚... :~ 所以印相就特別清楚.. 哈哈

    win2003 提供的 vss 其實不只如此, 它還提供了 provider 的架構, 意思是做 snapshot 的機制, 有可能換成其它軟體來處理, 或是其它硬體, 像是 Microsoft 自己的 SQL2005, Exchange2007, Data Protection 2006, 還有其它備份軟體... 等等工具都會受惠. 這些軟體可以基於 vss 再開發出更進階的功能, 像 SQL2005 也在 db 上提供了 snapshot, Exchange2007 也靠 vss 做出更完整的檔案備份及複寫功能...

    不過這些對大部份自己用的電腦都沒啥用, 大家不都是現成電腦買來, windows 灌好就開始用了... 最近花了些時間研究一下, 發現還挺好用的:

    1. 在 disk properties 上可以看到 shadow copy 的畫面, 你可以定期做 snapshot
    2. 做好 snapshot 後, 透過網路芳鄰來看這個 share folder 就會有額外的 options
    3. 按下 view 就可以把過去的備份叫出來, 也可以還原到某個時間的檔案內容

    很棒的功能, 不過跟我的需求有點差距... 我希望用 snapshot 解決我碰到的一些問題:

    1. 我必需要更可靠的備份作業, 我要把資料 "真正" 的 copy 出來, 而不是只留著 snapshot.
    2. copy 的動作要花一些時間, 但是 copy 時有可能資料也正在被修改 or 鎖定..
    3. 我需要隨時做這些動作, 而不是像 2003 內建的, 只能排排程定期做.. 最好是可以寫成批次檔 (老人家的壞習慣... Orz)

    最後找到的方式, 很陽春, 不過已經足夠解決我的問題了 (H), 就順手貼出來, 邏輯上的步驟, 是:

    1. 要開始備份前, 先做一次 snapshot
    2. 之後備份作業從 snapshot copy 出來, 而不是從 current state copy 出來, 就不會有 lock or update 的問題
    3. 動作完成後, snapshot 就可以砍了, 當然要留著也無所謂...

    要做成批次檔, 一次完成的話, 則有這兩項關鍵:

    1. 命令列執行建立及刪除 snapshot 的方式: 用 vssadmin.exe
    2. 讓其它工具 (我用 RAR.exe) 直接讀取 snapshot 的方式, vss 是以 UNC 的路逕提供:
      \\localhost\d$\@GMT-2006.11.28-23.00.01

    其中 \\nest\Home 是一般的 UNC 路逕, 後面加的 @GMT-...... 則是做 snapshot 的 timestamp, 以我來說, 要備份這目錄只要這樣下:

    RAR.exe a -r c:\backup.rar \\nest\Home\@GMT-2006.11.28-23.00.01

    說穿了沒啥特別的, 只不過找到了最後兩項關鍵, 命令列指令, 跟存取 snapshot 的路逕, 解決掉了我多年來的困擾, 每次要備份檔案一下這個 lock 一下那個 lock, 不然就是得先關一堆程式才能 copy 的困擾. 不過 windows xp 的 vss 好像就沒這麼完整, 這些作法目前只有 windows 2003 能夠用, 殘念... 不知道 vista 有沒有類似的東西可以用? :D

    2006/12/06 技術隨筆 有的沒的

  4. Ya!! Community.Chicken-House.Net 滿兩週年了 :D

    嗯, 這個站架起來的第一篇是 2004/11/19 貼的, 剛好滿兩年 :D

    當然再之前我自己寫的那個 forum.net 不算在內啦, 被唸到臭頭的網頁 :~~ 這個只是拿來練功用, 想當年這個 forum 也替我賺了不少獎品 :D, 現在小皮愛玩的 xbox (看 2004/01/05 那篇), 路癡用的 PDA 導航, 老婆大人每天當電視看的 HP 15" LCD.. 還有老爸用的 scanner / printer (2004/10/13那篇)... 都是這程式賺來的.. (H)

    如果把 forum.net 也算進去的話, 可以追溯到這篇... 2003/06/08...

    如果把更早的留言板 (當年只用 xml 檔當 storage, 沒有用 database) 算進去.. 哇靠, 這篇更早,  2002/07/01 ...

    當時還沒花錢買 chicken-house.net 這個 domain name, 用的還是免費的 chicken.27south.com .. 南方廿七號養雞場... -_-

    再往前算? BBS ... 嗯, 好, 不提當年勇了 [H]

    謝謝大家的支持, chicken-house.net 會繼續開下去的 :D

    2006/11/19 有的沒的 當年勇

  5. Digital Camera Filer - Source Code (update)

    這個程式其實很簡單, 最麻煩的兩個部份都找到現成的 library 就解決掉了, 剩下的就只有剪剪貼貼的手工業而以. 先介紹這個 tools 開發時用到的兩套 library:

    1. PhotoLibrary: 封裝 System.Drawing.Image 方便讀取 EXIF 等資訊.
      Project Site: http://www.gotdotnet.com/workspaces/workspace.aspx...
    2. Microsoft RAW Image Viewer: 它提供了 canon sdk 及 .net wrapper
      Download Site: http://www.microsoft.com/downloads/details.aspx?fa...

    扣掉這兩套 lib 幫的忙之外, 其它剩下的就真的沒啥好看的了... 只有一些五四三的還能拿來講一講... 底下是整個 project 的 class diagram:

    程式主要是用到 Factory Patterns, 每種要處理的檔案類型各有一種對應的 MediaFiler 類別來負責, 之後主程式就是 recursive 找出所有的檔案, 一個一個丟給 MediaFiler 處理而以. 簡單的說明一下這幾個 class:

    • class MediaFiler: 沒啥好說的, 所有的 MediaFiler 都要從這個抽像類別繼承下來. MediaFiler 會處理單一個特定格式的檔案歸檔動作.
    • class CanonPairThumbMediaFiler: 一樣是抽像類別, 不過處理的檔案類型較特別, 專門處理會附帶一個縮圖檔 ( *.thm , 內容為 JPEG 格式縮圖 ) 的檔案類型.

    扣掉這兩個 abstract class, 剩下就一個蘿蔔一個坑了... 來點名吧:

    • JpegMediaFiler: 就是處理 *.jpg 的 MediaFiler
    • CanonRawMediaFiler: 處理 *.crw (會附帶處理對應的 .thm)
    • CanonVideoMediaFiler: 處理 *.avi (會附帶處理對應的 .thm)

     

    [update: 2006/11/20]

    講這麼多還丟 source code 幹嘛? 其實有個目的, 就是這工具的架構及選用的 library 其實已經有足夠的擴充能力去適應非 canon 的檔案格式了, 改版後做了一點調整, 搭配了 Attribute 來達成這目的, 舉片段的 code 當例子:

      237         public static MediaFiler Create(string sourceFile)

      238         {

      239             FileInfo sf = new FileInfo(sourceFile);

      240             foreach (Type t in GetAvailableMediaFilers())

      241             {

      242                 //

      243                 //  match

      244                 //

      245                 MediaFilerFileExtensionAttribute ea = GetFileExtensionAttribute(t);

      246                 if (string.Compare(ea.FileExtension, sf.Extension, true) == 0)

      247                 {

      248                     //

      249                     //  file extension match

      250                     //

      251                     ConstructorInfo ctor = t.GetConstructor(new Type[] { typeof(string) });

      252                     return ctor.Invoke(new object[] { sourceFile }) as MediaFiler;

      253                 }

      254             }

      255             return null;

      256         }

      

     for loop 的部份就是列出所有已載入 AppDomain 的 Assemblies 裡所有包含的 Type, 過濾的條件是:

    1. 要繼承自 class MediaFiler
    2. class 要有貼上 MediaFilerFileExtensionAttribute 自訂屬性

    符合這兩個條件的所有 type 就會一個一個拿來比對. 也許有人會問, 用 attrib 看起來比較強嗎? 這種典型的應用不是應該用 abstract method, 讓底下的 class 來實作就好?

    是的, 如果我用 java 寫的話, 我會這麼做. 不過, polymophism 的前題就是要有 instance, 我連要用那個 class 來產生 instance 都還不曉得, 如何能享用到 polymphism 的好處? 用 static method 就沒有這種好處了, 況且 c# 語法也沒有辦法強迫衍生類別一定要 implements 某些 static method ...

    這時透過 attrib 就可以很漂亮的解決這個問題, 細節就不管了, 總之我透過 custom attribute 替每個 MediaFiler 標明, 每個 MediaFiler 負責的 file extension 為何.

    動態挑到適當的 MediaFiler 後, 剩下的就靠 Reflection 產生 instance, 收工.

     

    看起來有點小題大作, 目的只有一個, 如果有新的檔案格式要支援怎麼辦? 目前的架構很簡單, 只要加上新的 MediaFiler implementation, 然後用 custom attribute 標明它負責的是那種 file extension, 其它就通通結束了, Factory Pattern 核心的部份 Create( ) 完全不用改.

    優點不只如此, 還可以再做的徹底一點, 其它檔案類型的支援, 甚至不用改到原本的 code / .exe, 只要另外開 class library project, 寫在其它的 assembly, 丟在同一個目錄下執行就好了. 以往要做到 plug-ins  架構的程式非常麻煩, 現在十行左右的 code 就完成了.

     

    最後, 要看 source code 的人可以到下面列的網址下載整個 project. 順便廣告一下我自己寫的 zip folder http handler (H), 幹嘛用的? 直接把 zip 檔丟上來, 透過 http handler 加持, 就可以把 .zip 檔視為一個目錄了... 方便的很, 上面的 class diagram 其實就是藏在 zip 檔裡的圖而以... 我就不用另外再維護兩份檔案了 (一份圖檔, 一份 zip 下載檔)

    Source Code (Visual Studio 2005 Project): http://www.chicken-house.net/files/chicken/Chicken...

    2006/11/18 .NET 技術隨筆