發表文章

目前顯示的是 2009的文章

IE6 Upgrade Notice

有過網頁設計經驗的人,無論是部落格樣版或是其他頁面,都一定有個共同的痛,就是IE6這傢伙對CSS的呈現總是跟別人不同,偏偏它的市占率一直是最高的。
通常解決這個問題的方法有兩種,一種是修改CSS直到版面看起來正常,另一種則是直接放棄,在網頁開頭就提醒使用者升級瀏覽器。
我們今天要介紹的就是最後一種方法,為什麼我們要放棄IE6呢?
因為網頁技術不斷的進步,不單單是CSS的問題,IE6本身還有其他原因,它已經不適合這個世代了,加上最近許多知名網站也紛紛開始提倡升級IE6,例如You Tube、Twitter和Facebook等,IE6你真的玩完了,拜託還在使用IE6的人,請你快點更換瀏覽器吧!!(小聲:換FirefoxChrome吧)



知名影音分享網站YouTube將停止對IE6的支援。



連最近在台灣火熱的Facebook都要封殺IE6了,還在使用它的人,麻煩你快點更新吧!!!

Factory pattern 工廠模式

距離上一篇 Strategy pattern 策略模式已經兩個多月了,一直拖到現在才生出這篇文章...orz。
其實這篇工廠模式應該要當作第一篇 Design pattern 的文章會比較好,因為這個模式很容易懂,但是工廠模式中又細分出一些其他類似的模式,例如抽象工廠模式,所以我把一些相關的資料都讀了一遍後,分三篇作介紹。
工廠模式最主要的精神就是將 new Class 這個動作另外封裝成一個 Factory Class,這個Factory Class 專門負責實體化這些類別。
特地這樣做有什麼好處呢?
舉個例子,假如我們現在有兩個繼承 Product 的類別,它們擁有共同的方法 Operation(),如下圖:

swfobject - 網頁輕鬆嵌入Flash

Flash在網頁上的應用已經越來越普遍了,未來一樣占有一席之位,但是從以前到現在,對於發佈Flash到網頁上常常碰到一些不必要的問題,例如XP SP2更新後,IE瀏覽器上方會出現檔掉的訊息,或是Flash外框出現虛線,需要滑鼠點一下才能開始動作等...,而且使用者並未安裝Flash Player的情況下或版本太低都會無法順利的瀏覽。
最近剛好看到一個不錯的東西,就是這次要介紹的swfobject,一般我們要嵌入swf到HTML時,通常會寫的語法如下:

<objectid="FlashID"classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"width="300"height="120"><paramname="movie"value="test.swf"/><paramname="quality"value="high"/><paramname="wmode"value="opaque"/><paramname="swfversion"value="6.0.65.0"/></object>
上面的程式碼使用到<object>標籤,早一點的甚至還要再寫<embed>才能動作,因為IE跟其他瀏覽器的種種原因,使得這種寫法不但又臭又長,也不符合標準。
那使用swfobject有什麼好處呢?我們繼續看下去吧。
首先我們得先去swfobject的網頁http://code.google.com/p/swfobject/,然後下載目前的最新版本swfobject_2_2.zip


Visual Studio Code Snippets

最近在看聖殿祭司寫的ASP.NET 3.5 專家技術手冊,上面提到Visual Studio 2005之後,提供一個很不錯的功能叫做Code Snippets(程式碼片段),這是一個可以快速產生常用程式碼的好東西。
在VS編輯器上將游標停在要加入程式碼片段的地方->滑鼠右鍵->插入程式碼片段,或是使用快捷鍵,預設是Ctrl+K->Ctrl+X,就會列出目前可以使用的程式碼片段清單。




AS3如何複製DisplayObject

最近正在寫一個FLASH的相片大頭貼截取程式,碰到了一個複製MovieClip的問題,AS3已經沒有AS2的duplicateMovie()方法可以用,所以我找了一些解決方法分享上來。


第一種方式是比較好的解決方法,是PTT的CJCAT大提供的,可以直接複製一個相同的Class。
假如場景上面有一個clip_mc,它的class是MyClip,在不使用 new MyClip() 的前提下,以下的code可以生出一個新的MyClip物件。// 先抓到MyClip的constructorvar mcClass:Class = Object(clip_mc).constructor;// 這樣就生出一個新的MyClip物件了var clip2_mc:DisplayObject = new mcClass();// 加入到舞台後就成功了this.addChild(clip2_mc);
不過上面這個方法我試不出來,不知道是不是哪裡出錯了,所以又找了第二種方法,Copying a Sprite using BitmapData,這個方法可以將Sprite的畫面複製到另一個DisplayObject上,因為我只是需要複製一個靜態的圖,所以可以不需要使用第一種複製Class的方式。

// 先實體一個clip_mc大小的BitmapDatavar myBitmapData:BitmapData = new BitmapData(clip_mc.width, clip_mc.height);// 然後繪製一個相同的clip_mcmyBitmapData.draw(clip_mc);// 實體一個複製的Bitmapvar clip2_mc:Bitmap = new Bitmap(myBitmapData);// 加入到舞台後就成功了this.addChild(clip2_mc);
參考資料:
批踢踢實業坊KIRUPA.COMActionScript 3.0 語言和組件參考

XNA Simple Animation

因為我的大學專題是寫一款四人網路連線的格鬥遊戲,所以對XNA這套微軟提供的遊戲開發平台有點研究,之前在痞客邦寫網誌的時候有寫過幾篇這個作品的開發情況,後來因為實在太忙了所以沒有繼續介紹下去,現在這個遊戲已經在去年完成了,也得到不錯的成績,有機會我會PO上來分享一些製作心得。
在網誌搬到Blogger之後一直沒有機會寫一些跟XNA有關的文章,我打算介紹一些XNA Creators Club教學範例中所使用到的開發技術,國內介紹XNA的文章不多,有興趣用XNA開發遊戲的人,推薦可以到點部落去看一些不錯的文章。


這一篇我想先介紹XNA如何使用Model、ModelBone和ModelMesh等技術去載入一個3D模型,然後控制一些簡單的3D動畫。

首先必須先準備一個3D模型,XNA預設的類型有.x跟.fbx兩種模型檔,這裡我們先用微軟提供的坦克車模型(part1)(part2)來作示範。

一開始先建立一個XNA的專案。


將模型檔加入到Content資料夾內。


新增一個Tank.cs:
using Microsoft.Xna.Framework;using Microsoft.Xna.Framework.Content;using Microsoft.Xna.Framework.Graphics;namespace SimpleAnimationSample{/// <summary>/// 能讓零件動作的坦克車模型類別/// </summary>publicclass Tank{/// <summary>/// 坦克車模型/// </summary>private Model tankModel;/// <summary>/// 坦克所有組件的平移矩陣/// </summary>private Matrix[] boneTransforms;/// <summary>/// 載入坦克車資源/// </summary>publicvoid Load(ContentManager content){// 從ContentManager載入坦克車模型.

SortedDictionary如何自訂排序

之前再寫資料檢索這堂課的作業時,碰到一個SortedDictionary排序上的問題,因為我在寫反轉索引法的過程中有使用到這個集合,其中Key的部分我是用來存放TF-IDF演算法求出來的weight score,這個值我是以double的型態來存放,不過因為SortedDictionary的排序方式是由小到大,也就是以升冪排序的方式幫你排序好了,但是我希望它能夠由大到小排序,因為作業的顯示結果要求weight score越高的結果要排越前面,所以我上MSDN查了一下SortedDictionary的資料後,本來看到它有一個Reverse的方法,不過後來研究了好久還是不會用,最後就上PTT的C_Sharp板去求助,經過Cloud大大的指導後終於解決這個問題了。


利用SortedDictionary建構式的一個多載,IComparer介面就可以實現自訂排序方式,來看看實作程式碼吧。

我們先看一下一開始SortedDictionary為我們排序的結果:
using System;using System.Collections.Generic;namespace SortedDictionarySample{class Program{staticvoid Main(string[] args){SortedDictionary<int, string> sortedDictionary = new SortedDictionary<int, string>();sortedDictionary.Add(5, "五");sortedDictionary.Add(4, "四");sortedDictionary.Add(6, "六");sortedDictionary.Add(2, "二");sortedDictionary.Add(8, "八");foreach (KeyValuePair<int, string> kvp in sortedDictionary)Console.WriteLine(kvp.Value);}}}

Strategy pattern 策略模式

這篇文章是我打算要寫的Design pattern系列中的第一篇,在我大學三年級的時候,修了系上開的視窗程式設計課程,開課教授也是我的專題指導教授,這堂課老師教了我們很多關於programming design pattern的觀念。 

最近剛好也讀完了O'REILLY出版的Head First Design Patterns(深入淺出設計模式),對於一些較常用的pattern也有了更加的了解,所以我希望能整理幾個比較入門的pattern來當作學習文章,如果有哪裡寫錯或是有疑問的,非常歡迎留言指教,大家一起學習。


什麼是design pattern(設計模式)呢?
design pattern是對軟體設計中普遍存在(反覆出現)的各種問題,所提出的解決方案。
design pattern並不是直接用來完成程式碼的編寫,而是描述在各種不同情況下,要怎麼解決問題的一種方案。
演算法不能算是一種design pattern,因為演算法主要是用來解決計算上的問題,而非設計上的問題。 design pattern主要目的是避免會引起麻煩的程式緊密耦合,以增強軟體設計面對並適應變化的能力。以上是引用軟體設計模式-維基百科的其中一段介紹,第一次接觸的人可以去看看相關內容。
接下來我們進入主題,第一篇要來介紹的pattern是Strategy pattern(策略模式)。
Strategy pattern是指物件本身有某些行爲(method),但是在不同的情況中,該行爲有不同的實現方式(演算法),找出程式中可能需要更動的地方,把它們個別封裝起來,就算演算法有變動,也不會影響到使用演算法的程式,舉個維基百科提供的例子,比如每個人都要「繳交個人所得稅」,但是「在美國繳交的個人所得稅」和「在台灣繳交的個人所得稅」就有不同的計算稅的演算法。

我們用Head First Design Patterns書上的鴨子範例來一步步解釋。
假設我們打算完成一個模擬鴨子的小程式,程式中可以模擬出各種不同類型的鴨子行為,例如游泳,呱呱叫等等的...。
這個時候我們會設計一個擁有這些行為的鴨子抽象類別(abstract class),讓各種鴨子繼承此類別。