Feeds:
文章
留言

Archive for 2007 年 01 月

Chui-Wen Chiu(Arick)
MSN SpaceGoogle DocGoogle Blog
2007.1.19

最近開發程式需要快速配置一個大型檔案,之前找到 File.WriteAllBytes("largfile.dat", new Byte[???] ) 方法建立,可是這個方法會受限於 new Byte[] 所能配置的最大記憶體,所以,在 MSDN 論壇我張貼了兩篇文章[2][3]看有沒有人遇到類似的問題,雖然 tihs 建議可透過迴圈的方式來分批寫入資料,但是這個方法還是太慢無法滿足我的需要。後來我在 Code Project 找到一篇"Make-A-File – File Creation Utility "[1],發現他可以快速建立高達 1EB 的檔案大小,訝異之餘研究了一下 Source Code,發現他利用 CreateFile() 建立檔案之後,接著透過 SetFilePointer() 設定檔案的長度,最後透過 SetEndOfFile() 關閉檔案即完成。我發現他的關鍵在於 SetFilePointer() 函數,找尋 FileStream 的相關文件後發現 SetLength() 方法,於是快速建立 1GB 大型檔案的方式就是下面簡單的兩行指令:

using (FileStream fs = new FileStream("e:/large.dat", FileMode.Create)) {
      fs.SetLength(1024000000); // 最大可配置 long.MaxValue 大小
}



補充:(感謝璉璉、tihs 在 MSDN Forum 的回覆[2][3])
1. 陣列索引最大值為 2,147,483,647 – 1(亦即在記憶體充足的情況下,可以配置高達 2,147,483,647 (2GB) 的陣列 )
2. 早期 Windows 雖然號稱單一陣列可以到 2 GB ,但是實際上綁在 oleaut32.dll 上只能到 256 MB,亦即變成 8 個陣列到 2 GB,只能透過 kernel32.dll 來達到單一區塊 2 GB 。.Net framework 不使用 oleaut32.dll
3. 每個陣列之維度長度都受限於 Integer 資料型別的最大值,也就是 (2 ^ 31) – 1。然而,陣列之總大小也同時受限於系統可用的記憶體。若您試圖對總大小超過可用的 RAM 之陣列進行初始化,Common Language Runtime 將擲回 OutOfMemoryException 例外狀況。[5]

參考資料:
[1] http://www.codeproject.com/tools/make-a-file.asp

Read Full Post »

Read Full Post »

今天同事傳了一個"磨蹭的快感?-阿魯巴的男子氣概建構"論文超連結給我,哇~ 真不塊是台大的學生,連這個也能洋洋灑灑寫了 1xx 個字的論文,從摘要和目錄來看,作者似乎有相當考究過,可惜無緣下載本文來欣賞,希望以後有機會一睹這篇論文的全貌。不過,為什麼工學院的主題是這個呢?社會民情風俗觀察嗎?

Read Full Post »

 

Chui-Wen Chiu(Arick)
MSN SpaceGoogle DocGoogle Blog
2007.1.17

本文主要是教導你如何建立一個簡單的 Visual Studio Add-in。

建立 Visual Add-in 框架
首先建立 Visual Studio Add-in 專案:File | New | Project | Other Project Types | Extensibility | Visual Studio Add-in,設定如下

將功能選項移到 View
預設情況下,每一個 Visual Studio Add-in 都會放置在 Tools 選項下,如果要移到 View 選項下,我們可以到 Connect.cs 的 OnConnection 事件中找出如下的程式片段(L36-L52)

                try
                {
                    //If you would like to move the command to a different menu, change the word "Tools" to the
                    //  English version of the menu. This code will take the culture, append on the name of the menu
                    //  then add the command to that menu. You can find a list of all the top-level menus in the file
                    //  CommandBar.resx.
                    ResourceManager resourceManager = new ResourceManager("MyAddin1.CommandBar", Assembly.GetExecutingAssembly());
                    CultureInfo cultureInfo = new System.Globalization.CultureInfo(_applicationObject.LocaleID);
                    string resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "Tools");
                    toolsMenuName = resourceManager.GetString(resourceName);
                }
                catch
                {
                    //We tried to find a localized version of the word Tools, but one was not found.
                    //  Default to the en-US word, which may work for the current culture.
                    toolsMenuName = "Tools";
                }

當使用者點選你 Add-in 選項時,會觸發 Exec 事件,要處理自己的 Add-In 功能,請找出下面的片段

        public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
        {
            handled = false;
            if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
            {
                if(commandName == "MyAddin1.Connect.MyAddin1")
                {                                    
                    TextSelection sel = (TextSelection)_applicationObject.ActiveDocument.Selection;

                    if (!String.IsNullOrEmpty(sel.Text)) {
                        String[] dataSet = sel.Text.Split(new char[] { ‘=’ });
                        if (dataSet.Length == 2) {
                            sel.Text = dataSet[1] + " = " + dataSet[0];
                        }
                    }

                    handled = true;
                    return;
                }
            }
        }

黃色標記區是判斷是否屬於自己的 Add-in 命令,紅色區域是 Add-in 實作,上述實作是將目前選取字串中,如果包含一個 = 字元時,將 = 兩端的字串交換。如果想要控制 IDE,首先必須先取得 EnvDTE80.DTE2 型態的物件,在 Visual Studio Add-ins 專案中,已經預先定義了一個 _applicationObject 成員變數,你可以直接透過這個變數來控制 IDE。

執行結果:

參考資料:
[1] http://www.codeproject.com/useritems/vstoolwindow.asp

Read Full Post »

簡介
動態載入CSS的一個重要特色是可以動態更換應用程式的外皮,Flex 支援的執行期 CSS 可以內嵌自訂字型、自訂元件的外觀和圖形,基本上編譯之後就是一個 SWF 檔案。那要如何產生這樣的 SWF 檔案呢?Flex 2.0.1 的 mxmlc 編譯器已經支援編譯 css 檔案成為 SWF,所以,假如有一個 ‘style1CSS.css’ 且內嵌的相關資料都位於 CSS 指定目錄下,你只需要如下的命令即可產生 CSS 格式的 SWF。

mxmlc style1CSS.css

假如你使用 Flex Builder 2.0.1,則只需要在 CSS 檔案右鍵選單中使用"Compile CSS to SWF",即可在 bin 目錄下看到產生好的 SWF。

範例:動態切換外觀
1. 使用 Flex 2 Style Explorer 產生三個不同的 CSS 並分別取名為 style1CSS.css, style2CSS.css 和 style3CSS.css

style1CSS.css style2CSS.css style3CSS.css
Application {
   backgroundGradientAlphas: 1, 0.21;
   themeColor: #ffff00;
   color: #cc0000;
}
Application {
   backgroundGradientAlphas: 1, 0.21;
   themeColor: #0000ff;
   color: #ffffcc;
}
Application {
   backgroundGradientAlphas: 1, 0.21;
   themeColor: #ff0000;
   color: #ffff00;
}

2. 建立測試主程式

runtime_css.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
 xmlns:mx="http://www.adobe.com/2006/mxml&quot;
 layout="absolute"
 initialize="StyleManager.loadStyleDeclarations( ‘style1CSS.swf’ )"
 viewSourceURL="srcview/index.html">
 
 <mx:ComboBox
  id="styleCombo"
  top="10" left="10" right="10"
  dataProvider="[‘style1CSS’,’style2CSS’,’style3CSS’]"
  change="StyleManager.loadStyleDeclarations( styleCombo.selectedItem + ‘.swf’ )" />
 
</mx:Application>

執行結果類似 Runtime CSS Example

範例中在起始化事件中使用 StyleManager 載入 style1CSS.swf。另外,也可以再執行階段透過 ComboBox 動態切換不同的 CSS 外觀。

常見問題:
1. 是否有網站提供佈景主題下載?
可以逛逛 http://www.scalenine.com/

參考資料:
[1] Flex 2.0.1 – Understand Runtime CSS
[2] StyleManager LiveDoc

 

 

Read Full Post »

Adobe 釋出 Flex 2.0.1

 

Flex SDK 2.0.1 改進重點:
1. 執行時期的 CSS:應用程式可以動態載入CSS 或樣式,之前版本只能在編譯時期載入CSS或樣式。
2. 模組:允許將應用程式切割成獨立單位並在執行階段載入。可以在自訂元件的根標籤使用 <mx:Module>, 這個元件將會在執行階段被動態載入。
3. 為 Apollo 作預備Flex 2.0.1 為 Apollo 做了修許修改。
4. 支援 OSX

5. 加入 ASDoc 工具:文件產生器
6. 支援 FlashType 編碼:mxmlc 編譯器現在可以直接使用 Flash Type 內嵌字型。
7. 支援自動化測試:包含 Mercury QuickTest Pro 9.1

Flex Builder 2.0.1 改進重點:
1. 強大的程式碼編輯能力:使用以 Eclipse 為基礎的 IDE 來開發應用程式。編輯器包含 MXML、ActionScript 和 CSS。提供語法著色、語法自動完成、程式碼縮放(code collapse)等功能。
2. 編譯器整合:直接與編譯器整合,並提供編譯器的錯誤回報。
3. 互動式除錯:可在設定中斷點除錯,顯示除錯時期的變數狀態、運算式結果、變更變數值和監控 trace 訊息。
4. 視覺化排版:使用內建的或自訂函數庫透過 Design View 以拖拉方式設計 Flex 應用程式介面
5. 資料視覺化:可透過直接拖拉視覺化元件與資料來源連接顯示資料內容。這是透過 Flex Chart 函數庫。
6. 支援 Macintosh OS X
7. 偏好設定變更
8. 支援執行時期的 CSS:Flex Builder 支援執行時期 CSS,也就是說 Flex 程式的 CSS 不需要在編譯時期指定。現在多了一個"Compile CSS to SWF"功能選項將 CSS 編譯成 SWF。這個由 CSS 產生的 SWF 將被複製到輸出目錄。假如有啟動自動編譯功能,當有任何變動發生的時候,將會使 CSS 重新編譯成 SWF。
9. 模組:在建立一個新的 MXML 元件時,精靈視窗會出現一個選項讓你決定他是否要成為一個模組。ModuleLoader 元件是一個模組載入器,他放置 Component 面板的 Controls 分類中。 ModuleLoader 有一個 “url” 屬性用來指定要載入的模組。

檔案下載:
1. Flex Builder 2.0.1 升級包
2. Flex Builder 2

Flex Builder For Windows 升級到 2.0.1 版本(測試環境: Windows XP Professonal)
1. 下載 Flex Builder 2.0.1 升級包
2. 執行升級包
3. 同意授權
4. 假如 Installer 找不到 Flex Builder 安裝路徑,會要求你選擇 Flex Builder 路徑
5. 選擇 Flash Player 瀏覽器(Internet Explorer, Netscape or Firefox)外掛
    : Flex Builder 2.0.1 和 Flex SDK 2.0.1 可以在 Flash Player 9 (版本: 9,0,16,0 日期 6/27/07)上執行。然而, 最好還是安裝 Flash Player 9 更新
6.(選擇性) 當安裝完成之後,重新啟動電腦使 Flash Player 瀏覽器外掛能夠正常運作
7. 啟動 Flex Builder
8. 對於已經存在的 Flex Builder 專案,你應該使用 -clean 選項來更新 Workdspace,要完成這個動作,請先打開 Command 視窗,瀏覽到 Flax Builder 目錄,然後輸入 FlexBuilder -clean -vmargs -Xmx512m

參考資料:
[1] http://forums.ultrashock.com/ff.htm?http://forums.ultrashock.com/forums/showthread.php?threadid=86348
[2] Adobe Flex Document
[3] Adobe Flex Builder 2 Release Notes
[4] http://tommyb.com/2007/01/07/flex-201-released/
[5] http://www.sephiroth.it/weblog/archives/2007/01/flex_201_is_here.php
[6] Introducing Flex 2.0.1

 

Read Full Post »

[C#]懷念的對對碰遊戲

最近想到以前幫女友寫的 VB 對對碰遊戲作業,原本想用 Flex 改寫,可惜Flex的元件開發我還不甚熟悉,決定先用 .NET 改寫一個版本,Flex 之後再慢慢改。他的類別圖應該是如下:

 

CBox: 每一個需要批配的小元件
CBoxManager: 管理 CBox 的類別
CBoxRandomer: 產生亂數序列
CBoxPairChecker: 檢測兩值是否匹配
CBoxArray: CBox 容器

 執行畫面(ps. 背景圖片網路上抓的… 別誤會 @_@… 如有侵害到您的權利請通知我一聲, thanks)

有興趣下載這個小遊戲玩玩,請點選這裡(79KB, 需要有 .NET Framework 2.0)

Read Full Post »

« Newer Posts