1. 請正確的引用文章內容!

    在開始講 "為什麼" 之前,先講一下該如何正確的引用我的文章。

    1. 明確的提供本站及該文的網址。例如:

      ........ 網路上有個叫安德魯的寫過一篇文章: "任意放大/縮小網頁的內容" ...........


    2. 若要轉貼,請以不超過 1/3 內容為原則 (程式碼及檔案下載不算),同時也要包含第一點的資訊。引用的部份請在格式上跟你的原文有所區隔,用斜體或是改顏色都可以。例如:

      ........ 網路上有個叫安德魯的寫過一篇文章: "任意放大/縮小網頁的內容" ,他提到一個用法:
      把“放網頁大 200%”的功能直接加在我的最愛

      只要把這個 link 加到書籤, 就大功告成了!

      javascript:document.body.style.zoom="150%";void(0);

      之後看到任何網頁, 覺的看不過癮想放大看, 再點一下這個 Bookmark 就好了.
      覺的固定 150% 不好用, 那可以把 link 改成這樣:

      javascript:document.body.style.zoom=prompt('縮放比例 (%):','100%');void(0);

    3. 如果要轉貼的部份超過 1/3,或是會牽扯到商業行為,請務必取得我的同意
      聯絡方式很簡單,在這裡留言我會看的到。

      如果你要透過 RSS 自動轉貼,我也很歡迎! 不過一樣要符合前面兩點要求,請勿轉貼超過 1/3 的內容。如果你的 RSS 轉貼系統只能轉貼整篇,很抱歉,只好請你停止 RSS 轉貼。

      另外,所謂的商業行為,不只是拿去投稿出書賺稿費之類的,如果你轉載的網頁有刊登廣告,就已經算是商業行為了。

     

     

    --------------------------------------------------------------------------------------------------------------------------------

    引用說明結束。以下為本文內容,純發洩用。

     

    為什麼突然要貼這篇? 該說是 "一回生二回熟" 嘛? 沒錯,每次一時興起,到 GOOGLE 找一下我自己的資訊,總是會發現有人沒經過我同意轉貼我的文章...。轉貼對我實質上的影響並不大,畢竟我寫東西是興趣,不是拿還養家糊口的,所以被轉貼除了心理不大爽之外,其它都還好。不過這樣會大大的降低我寫東西的意願。

    舉例來說,最不滿的就是像上次在對岸的入口網站碰到的案例,原文照貼,沒註明出處,留 comment 提醒還被砍掉!? 回報站方也是一副不理不睬的樣子... 這種沒什麼好說的了,直接用我的方式表達我的不滿。

    碰過另一個例子,也是很令人厭惡,就是到處轉貼文章,不管有沒有註明出處。落落長的一整篇文章就被 COPY / PASTE 過去,最後加個小小的 "出處" 就算免責了? 如果他的網頁還放了廣告,那就等於是不當的取得利益。講的難聽一點,這跟盜版沒兩樣,不都是用別人的作品去賺取利益? 最後是通知 BLOGGER,站方停權結束這件事。

     

    看過 Jedi 的文章,我很認同他在這篇 [引用不能祇是引用] 文章裡的看法。很多人好像以為只要加了 trackback 就是盡到道義上的責任了? Trackback 太方便了,之前用的 CS 甚至方便到連 trackback 的 URL 都不需要點,一切全都無腦化自動的進行。方便到好像原本該尊重作者的動作都不用作了,直接貼了就好。所以我的網站刻意不放 trackback,因為我不喜歡這樣的結果。

    我自己認為尊重作者的引用方式,要有兩個前題。一個是清楚的讓你的讀者知道,這段引用的內容出自那個人的那一篇文章。另外就是轉貼的部份。如果你不能只提供 LINK,而需要轉貼它人的內容到你的文章內,請把握好 "片段" 的原則。轉貼幾句話是合理的,轉貼一整篇就是白目了。這跟書本只影印一部份 (好像是 1/3 以內?) 是合法的,整本影印就侵害到原作者版權了。網路上的內容,複製更容易了,也讓人更容易忽略掉這些問題。

     

    所謂 "不教而殺謂之虐",就藉著這個機會說明一下,怎樣作我才不會認為我的權益被侵害。我很歡迎同好轉貼我的文章,不過我既然是我自己的文章,我會保有這幾項權益:

    1. 個人形象
      我會發佈的東西都是在 internet 上代表我這個人。要幫我散佈可以,不過請務必讓讀者知道我的網址及該篇文章的網址。
    2. 讀者 feedback
      收到有人看了我的文章有 feedback, 對我是一大鼓勵。如果你引用的方式違背了第一點,就有可能讓想給我 feedback 的讀者找不到管道。
    3. 點閱率 / 廣告
      很實際的一點,如果你不當的引用會影響我的點閱率 (如同那些全文照貼的),不論你有沒有註明出處,在這個層面上就已經侵犯到我的權益了。雖然我不靠廣告過日子,不過我把它當作打電動的經驗值看待,看著點閱次數增加也是一種成就感。
    4. 原作者要知道作品如何被利用
      如果你有不得以的理由 (比如要發布在內部,不能連到 internet, 或是發部在平面媒體、報章雜誌) 必需原文照貼,沒有辦法滿足上面三點...,或是你要拿去賣錢等等之類的商業應用,請務必取得我本人的同意。

     

    這篇不是合約,也不是在訂什麼法律條文...。我只是想表達出我對於 "轉貼" 及 "引用" 的看法而以。其實任何方式的引用我都歡迎,只要不違背上面四點原則為前題就好。只是一直碰到類似的事件,我不想成為處理盜文事件的老手啊啊啊...。希望打了這篇,可以讓那些沒有惡意的轉貼行為,不會被我誤認為又是盜文事件。

    2008/09/01 有的沒的 火大

  2. 升級到 BlogEngine.NET 1.4.5.0 了

    哈,升級還蠻簡單的,一下子就搞定了... 特此留念 :D

     

    枉我還大陣仗的對付它,VSS (Visual Source Safe), VSS (Volume Shadow copy Service) 都搬出來用了,結果只是目錄搬一搬就好... 咳咳。

    除了 Bot Checker 沒有搬過來之外,其它應該都搞定了吧? 如果有發現我的網站有那裡沒弄好,記得留言跟我講一下 :D

    2008/08/29 BlogEngine.NET 有的沒的

  3. Canon G9 害我沒睡好... 相片自動轉正的問題

    抱怨一下,因為在看照片時發現,有些直的拍的照片看起來是正確的 (會自己轉 90 度),有些卻不是... 得歪著頭看,所以就很好奇到底是怎麼回事...。

     

    image

    這幾張是正確的 (右上 & 左下,會自動轉 90 度)

     

    image

    這幾張是錯的 (應該自動轉 90 度才對)

     

    image

    第二張是錯的 (應該要轉 180 度才對)

     

    越想越不對,我記得除了我那台古董 CANON G2 之外,後來 CANON 的相機都有加上偵測轉向的機制啊? 不外乎是水銀開關或是類似的東西,總之相機能夠得知目前是不是轉直的拍,同時能把這資訊寫到 EXIF 內的 ORIENTATION 欄位去...

    但是為什麼拍出來的相片有的可以自動轉,有的不行? 花了點時間歸納一下,發現 G9 拍出來的 "有機會" 是正常的,而家裡大人的 IXUS55 則都不會自動轉,真是怪了... 在相機上看都會自動轉正啊...

    因為我的照片都是自己用 WPF 寫程式縮圖處理的,我開始懷疑是不是我的歸檔程式的問題。G9 拍的 .CR2 檔,透過 RAW CODEC 轉成 JPEG 會自動轉正,G9 / IXUS55 拍的 JPG 檔則不會...

     

     

    image

    嗯,開始無聊了,拿起相機拍了四種角度,然後用 DEBUGGER 去看 EXIF 的 ORIENTATION 值為啥... .CR2 要用 "/ifd/{ushort=274}" 來查,會得到一個 UInt16 的值,如果是 .JPG 則要改成 "/app1/{ushort=0}/{ushort=274}" ...

    得到的值還真怪。.CR2 / .JPG 都一樣。依照上圖的順序,得到的值分別是 0x01, 0x08, 0x01, 0x06。查了查文件,除了轉 180 度那個的值不大對之外,另外三個都正常。不過 Canon Codec 在 decode 時會自動幫我做 RotateTransform,我得在處理 .JPG 時自己補上這個動作。除了轉 180" 之外其它都正常了。

     

    就是那張 180 度的不正確,害我氣的牙癢癢的... 決定跟它拼了... 改了改程式,把所有 EXIF 都印出來,用肉眼一個一個比... 本來想說是不是有別的 FLAG 可以判定出來正反? 結果看到眼睛脫窗了也沒找到,我連 EXIF 裡的 BLOB (Binary data) 都一個一個印出來看 @_@,GOOGLE 也找不到啥有用的資訊...

    最後氣到,拿起相機重拍一次,這次直接在相機上看,按下 DISPLAY 看看有無其它資訊... COW,終於發現... 相機自己也認不出轉 180 度的狀況? 嘖嘖... 搞了半天 CANON 只有偵測左轉及右轉 90 度的情況,轉 180 度就不理它了.. 哈哈!

    不過有誰會轉 180 度拍照? 當然有...

    1. 用右手拿相機自拍,按不到快門... 只好轉 180 度,用底下的姆指來按
    2. 小孩拿著自己亂拍
    3. 想不出來了...

    總算水落石出,犧牲了幾個小時的睡覺時間,咳咳... 不過既然本版都是討論 .NET 程式設計的,最後就貼點 CODE 充個數... 也算沒偏離主題了 :D 不過我想應該沒人像我一樣無聊在搞這些吧?

     

    取得 ORIENTATION 的值,並且判定要往那個方向旋轉[copy code]
                            BitmapMetadata metadata = null;                        Rotation rotate = Rotation.Rotate0;                        // ...	                        ushort value = (ushort)metadata.GetQuery("/app1/{ushort=0}/{ushort=274}");                        if (value == 6)                        {                            rotate = Rotation.Rotate90;                        }                        else if (value == 8)                        {                            rotate = Rotation.Rotate270;                        }                        else if (value == 3)                        {                            rotate = Rotation.Rotate180;                        }
    
       1:  BitmapMetadata metadata = null;
    
       2:  Rotation rotate = Rotation.Rotate0;
    
       3:  // ...  
    
       4:  ushort value = (ushort)metadata.GetQuery("/app1/{ushort=0}/{ushort=274}");
    
       5:  if (value == 6)
    
       6:  {
    
       7:      rotate = Rotation.Rotate90;
    
       8:  }
    
       9:  else if (value == 8)
    
      10:  {
    
      11:      rotate = Rotation.Rotate270;
    
      12:  }
    
      13:  else if (value == 3)
    
      14:  {
    
      15:      rotate = Rotation.Rotate180;
    
      16:  }
    

     

     

     

    利用 TransformGroup, 一次套用 ScaleTransform (縮放) + RotateTransform (旋轉) 兩種轉換特效[copy code]
                JpegBitmapEncoder target = new JpegBitmapEncoder();            TransformGroup tfs = new TransformGroup();            tfs.Children.Add(new ScaleTransform(0.1, 0.1));            switch (rotate)            {                case Rotation.Rotate90:                    tfs.Children.Add(new RotateTransform(90));                    break;                case Rotation.Rotate180:                    tfs.Children.Add(new RotateTransform(180));                    break;                case Rotation.Rotate270:                    tfs.Children.Add(new RotateTransform(270));                    break;            }            target.Frames.Add(BitmapFrame.Create(                    new TransformedBitmap(sourceFrame, tfs),                    null,                    null,                    null));            target.QualityLevel = quality;            //            // save to temp file            //            string temp = Path.Combine(Path.GetDirectoryName(trgFile), string.Format("{0:N}.tmp", Guid.NewGuid()));            FileStream trgs = File.OpenWrite(temp);            target.Save(trgs);            trgs.Close();
    
       1:  JpegBitmapEncoder target = new JpegBitmapEncoder();
    
       2:  TransformGroup tfs = new TransformGroup();
    
       3:  tfs.Children.Add(new ScaleTransform(0.1, 0.1));
    
       4:  switch (rotate)
    
       5:  {
    
       6:      case Rotation.Rotate90:
    
       7:          tfs.Children.Add(new RotateTransform(90));
    
       8:          break;
    
       9:      case Rotation.Rotate180:
    
      10:          tfs.Children.Add(new RotateTransform(180));
    
      11:          break;
    
      12:      case Rotation.Rotate270:
    
      13:          tfs.Children.Add(new RotateTransform(270));
    
      14:          break;
    
      15:  }
    
      16:  target.Frames.Add(BitmapFrame.Create(
    
      17:          new TransformedBitmap(sourceFrame, tfs),
    
      18:          null,
    
      19:          null,
    
      20:          null));
    
      21:  target.QualityLevel = quality;
    
      22:  //
    
      23:  // save to temp file
    
      24:  //
    
      25:  string temp = Path.Combine(Path.GetDirectoryName(trgFile), string.Format("{0:N}.tmp", Guid.NewGuid()));
    
      26:  FileStream trgs = File.OpenWrite(temp);
    
      27:  target.Save(trgs);
    
      28:  trgs.Close();
    

    2008/08/28 .NET Tips WPF 技術隨筆 有的沒的

  4. 敗家: HTPC

     

    image

    沒錯,我又敗家了... :D

     

    想弄 HTPC 已經很久了,不過老是碰到一些怪問題。原本想直接用桌機,不過桌機已經接了雙螢幕,要再接 LCD TV,沒在主機板上插兩張 VGA 卡就辦不到 (其它用 PCI / USB 之類的效能太差就不考慮了)。不過三個輸出都需要數位輸出 (兩台桌上的 LCD 都有 DVI,SHARP TV 又很有個性的不提供 D-SUB,只有 HDMI ... 不然就是色差...),沒有插兩張 DUAL DVI 的中價位 VGA 卡也沒辦法...。我用不到這麼高級的顯示卡啊 :~~~

    不過就算硬體搞定了也是個大問題。試過暫時接到 TV 過,有時我要 MCE 開出來開在桌上的 LCD,有時又要開在 TV ... 光是操作就很麻煩...。最後體認到了沒有弄一台專用機的話,HTPC大概只能試一下試爽的而以。

    與其是想升級換張可以插兩張顯卡的主機板 + 新的顯卡,實在不是太便宜... 尤其我須要的是 DVI x 2 + HDMI ... 後來無意間看到一堆在介紹 AMD 780G 的文章... 算一算好像比換主機板還便宜...。

    於是不知不覺,八月初某日下班就多提著一袋零件回來了... 哈哈。因為有一堆東西有備料,陸陸續續買了下列東西就開始享受了:

    1. 主機板: ASUS M3A78-EM NTD 2750
    2. CPU: AMD 4850e (45W 低耗電) NTD 2250
    3. RAM: DDR2-800 2GB x 2 (實在用不到這麼多,不過看到一條 999,真的找不到理由去買 1G 的...) NTD 990 x 2
    4. POWER: SEASONIC 330W (這個也很奢侈,明明整台機器全速運轉也沒有破 100W ... 不過其它牌都不信賴... 330W 是最低的規格了) NTD 1700
    5. 搖控器: Toshiba MCE 搖控器 NTD 550
    6. 便宜的 HDMI 線 3 公尺 NTD 130
    7. 喇叭: JungleRex AF-31S NTD 3800
    8. 現有的硬碟: Hitachi 7K250 250GB SATA2 HDD
    9. 現有的舊機殼、光碟機、藍芽接收器、鍵盤滑鼠... ETC

    其它像機殼,光碟機,硬碟機,鍵盤滑鼠等等就直接用現成的...。至於 MCE 一定要的 TV CARD 我反而沒買...。一方面現在的卡我都覺的太貴了 (因為之前買過 ATI theater pro 550 的卡,一張不到一千...),再加上我很少在客廳看 LIVE TV...,就算要看也是先用 MCE 錄下來。我跟家裡大人的桌機都已經有 MCE + TV 卡了,實在不大需要再買第三張... 哈哈。

    果然裝了 HTPC 這樣才覺的這台電視真的是好物啊 :D,隨便一部 DVD 或是 MPEG4 的片子 (來源當然是牧場來的...) 看起來都很棒。扣掉奢侈品,其實一萬以內都搞定了。硬體沒啥好介紹的,網路一查一堆,總是有魔人有一堆測試報告,看都看不完,輪不到我在這邊講。除了耗電量實在很低一定要講一下之外... 其它硬體介紹我就跳過去了。耗電量實在是不錯,一開機耗電量 85 W 左右,開機完進入 VISTA 後就降到 50 ~ 55W,看片時看 DVD (MPEG2) 或是 AVI ( DIVX / MPEG4 ),耗電量輕微升到 60 ~ 65W,跑一些變態的 BENCHMARK 才會飆到 75 ~ 80W...。進入待命模式才 1 ~ 2W,真的是算省電了。

     

    那特別要講的是啥? 主要要講怎樣不靠鍵盤滑鼠操作 MCE ... :D

    不用 KB / MOUSE,那當然是用搖控器了。我買的這個我覺的很不錯,接收器插上去就可以用,什麼 DRIVER 設定都免了,VISTA X64 也一切正常。搖控器上那顆綠綠的鈕,按下去就會自動叫出 MCE。叫出 MCE 後,主要的幾個功能也都有對應的按鈕,操作起來很方便。只要可以直接在 MCE 裡播放的話,用搖控器就搞定了。現在我連放 MP3 (原本用 Media Player) 跟放照片 (Windows Live Photo Gallery) 也都改用 MCE 了... (Y) 上面那張圖就是用 MCE 放 MP3 的樣子...。

    搖控器上的電源鈕,也會直接對應到電腦的 "SLEEP" 及喚醒 SLEEP 中的電腦。如果你都只用 MCE,其實操作就很簡單了。按下搖控器的開關,電腦就醒來。看完再按一下電腦就 SLEEP 去了。康博的 TV CARD 使用者比較幸福,卡片上可以直接對應到電腦的電源開關。不過... 開機關機就要等的比較久。算算 SLEEP 模式下耗掉 1W 左右的電,就算了... 隨時想看一按就開還是比較爽啊..

     

    另一個比較特別的也要講一下。過去曾貼過一篇 [一萬多塊錢的簡報器],提到有軟體 (Salling Clicker for Windows 3.5)可以當簡報器,搖控 PPT 播放,也能搖控 Media Player ...,現在這些東西有內建在 VISTA 的版本了,主要就是透過 SlideShow。在 Vista 推出一年多之後,Microsoft 總算推出 Preview 版的軟體,可以讓你的 Windows Mobile 5 / 6 的手機及PDA,搖身一變成為 Vista SlideShow Device。再搭配上 Microsoft 才開發到 BETA 版的 SlideShow Gadget for MCE... 耶! 手機可以變成 MCE 搖控器了!

    image image

    這跟 MCE 搖控器有什麼不一樣? 這篇文章有簡單的介紹... 這裡也找到另一篇...。首先,TV 的節目表都可以直接秀在手機上,播放的曲目也都會顯示在手機上,如果你不希望中斷影片的播放,這就很有用。這些功能是沒有螢幕的搖控器作不到的。不過... 大部份時間,還是搖控器好用。

    但是為什麼我還是要特別提一下? 因為... 我還要聽音樂啊,聽音樂時我就懶的開電視了。不開電視的情況下,這就很好用了,直接在手機上選好媒體櫃裡的專輯,按下播放,整個客廳就有音樂可以聽了 :D,這完全是搖控器辦不到的 :D

     

    Microsoft Vista Slideshow Media Centre Remote

    不過這兩種搖控方式不能合二為一嗎? 有... 只要肯花錢就有。這支搖控器就是符合 vista slideshow device 規格的 MCE 搖控器,一隻要 USD 199... 看到價錢,我還是買隻十分之一不到的搖控器 + 手機就好...

    有打算用 HTPC 又有 WM5/WM6 手機的人一定要試一下。反正通通是現成的啊 (除了藍芽接收器你可能得花個一百塊買一支之外)。如果你也是 HTPC 一族的,有啥 TIPS 記得提供一下,如果不是的話,快點去敗吧 (H)!

    2008/08/25 敗家 有的沒的

  5. 世紀末軟體革命復刻版

    http://www.books.com.tw/exep/prod/booksfile.php?item=0010334718

     

    沒想到電腦書也流行復古... 真是令人懷念的一本書啊,電腦書通常都是半年到一年就過時了,堆了兩年以上的書很少還會拿出來翻... 不過這本 (原版,不是復刻版) 例外,足足有好幾年的時間我還是會沒事就拿起來翻一翻。每想到十來年後還會有書局再版... 一定要推一下。

    這本書的觀念寫的實在不錯,我有很多OOP的觀念都是靠這本書建立起來的。常常有人問我學物件導向要看那本書,我都很想推這一本,不過早就絕版了那買的到... 前陣子才發現竟然有復刻版... :D

    再版的這本書是把原本上下兩冊併在一起,不知道有沒有附當年作者自己寫的 GUI 範例程式? 老實說那個範例程式在當年是蠻猛的,一張磁片就放的下的程式 (還包含 source code),一個像 windows 3.1 的視窗環境,該有的功能一點都不少,你還可以用它的 API 開發在那個 GUI 環境下的應用程式...,不過那個東西實際的用途不大,現在搞不好也沒有環境能跑了,不過看到有人可以用 C++ 建立起像 Windows 3.1 那樣的環境,而且真的可以跑,還真是打從心底佩服...。

    技術可能都退流行了,現在流行的東西書上都沒提到,不過觀念的部份還是很實用,想加強自己物件導向觀念的人不要錯過這本書... [Y]

    2008/08/23 技術隨筆 敗家 物件導向