顯示具有 軟體工具 標籤的文章。 顯示所有文章
顯示具有 軟體工具 標籤的文章。 顯示所有文章

MyGenerataion的使用方式(三) - Transfer設計

MyGenerataion Template Transfer設計
這裡將提到Template設計過程中,Template Code的部分,也是Template的重點,我希望能夠在挑選完想要產生檔案的Table/View之後,透過Template Code產生出對應每個Table或View的C# class,節省開發的時間。
My Generation內建的範例Template中Toturial目錄下4種語言的範例,下面是空白C# Template的Template Code內容:
<%
public class GeneratedTemplate : DotNetScriptTemplate
{
     public GeneratedTemplate(ZeusContext context) : base(context) {}
     //---------------------------------------------------
     // Render() is where you want to write your logic    
     //---------------------------------------------------
     public override void Render()
     {
          %>
          You can toggle in out of script like this
          <%
          output.writeln("Hello world.");
     }
}
%>
輸出結果如下,共四行分別因為特殊符號與[You can toggle in out of script like this]分別在不同行而系統幫忙輸出一次換行符號以及[Hello world.]是透過writeln的方式輸出而會在產生一行新行。
You can toggle in out of script like this
Hello world.
在開發的過程中,我們都是在Render() Method中處理轉換,而語法上是C#的語法沒錯,但是請注意上面特殊的符號>%、<%,在My Generation的Template Code中,於>%、<%範圍內的文字會判斷為C#程式碼來執行,而範圍外的等同於write效果,會直接輸出,以上述範例來說[You can toggle in out of script like this]這段文字會直接輸出。如果特殊符號會影響到原本要輸出的內容時,可以透過設定變更成另一種特殊符號避免轉換過程中使用到而造成解讀錯亂。在這樣特殊的設計下程式的閱讀會困難很多,但是在產生輸出模型來說,確是可以快速很多,這部分就交由後面的例子來感受。

範例:輸出檔案


string path = input["__defaultOutputPath"] as string;
path += "\\Chapter1.txt";
output.save(path, false);
output.writeln("");
output.writeln("All of this text was just saved to '" + path + "'");
在Render過程中,只要呼叫output.save的method就可以將save之前透過write輸出或特殊符號以外的文字寫入檔案。

範例:取得UI的變數值


public class GeneratedTemplate : DotNetScriptTemplate
{
    private ArrayList _selectedViews;
    private ArrayList _selectedTables;
    private string _database;
    private string _namespace;
    private string _outputPath;
    public override void Render()
    {
        _database = input["comboBoxDatabase"].ToString();
        _namespace= input["textBoxNamespace"].ToString();
        _outputPath=input["textBoxOutputpath"].ToString();
        _selectedViews=input["listBoxViews"] as ArrayList;
        _selectedTables=input["listBoxTables"] as ArrayList;
    }
}
透過上述的程式碼取得使用方式(二)所產生的UI每一個值,變數本身因為是C#的變數數值,因此在使用上比較不會有困難。

範例:產生Table C# Class


public void CreateClassByTableName(string tableName){
    output.clear();
    %>/* Create By Ray Wang (sheauren) <%=DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss")%>
    */
    using System;
    using System.Data;
    namespace <%=_namespace%>.VO{
        /// <summary>
        /// Generated by MyGeneration using Ray VO template.
        /// </summary>
        public class <%=tableName%>{
            <%CreateTableAttribute(tableName);%>
            <%CreateTableProperty(tableName);%>
        }
    }<%  output.save(_outputPath+"\\"+tableName+".cs","o");
    output.clear();
}
public void CreateTableAttribute(string tableName){
    %>  #region Attribute
    <%IColumns columns=MyMeta.Databases[_database].Tables[tableName].Columns;
    foreach(IColumn column in columns){
        %>  private <%=DBType2CSharpType(column.DataTypeName,column.CharacterMaxLength)%> _<%=column.Name%>;<%output.writeln("");
    }
%>  #endregion Attribute
<% } 
public void CreateTableProperty(string tableName){
    %>  #region Property
    <%IColumns columns=MyMeta.Databases[_database].Tables[tableName].Columns;
    foreach(IColumn column in columns){
        %>  public <%=DBType2CSharpType(column.DataTypeName,column.CharacterMaxLength)%&        gt; <%=column.Name%>{
        set{
            _<%=column.Name%>=value;
        }
        get{
            return _<%=column.Name%>;
        }
    }  
    <%output.writeln("");
 }
 %>  #endregion Property<%  
}

範例:MyGeneration資料型態轉成C#資料型態

public string DBType2CSharpType(string dbType,int length){
 switch(dbType){
  case "bigint":
   return "long";
  case "binary":
   return "byte[]";
  case "bit": 
   return "bool";
  case "char": 
   if(length==1){
    return "char";
   }
   else{
    return "string";
   }
  case "datetime": 
   return "DateTime";
  case "decimal": 
   return "Decimal";
  case "float":
   return "float";    
  case "image": 
   return "byte[]";
  case "money":
   return "float";
  case "int": 
   return "int";
  case "nchar": 
   return "string";
  case "ntext": 
   return "string";
  case "nvarchar": 
   return "string";
  case "real":
   return "double";
  case "smalldatetime": 
   return "DateTime";
  case "smallint": 
   return "short";
  case "smallmoney": 
   return "float";
  case "text": 
   return "string";
  case "timestamp":    
   return "DateTime";
  case "tinyint":    
   return "short";
  case "uniqueidentifier":    
   return "Guid";
  case "varbinary":    
   return "byte[]";
  case "varchar":    
   return "string";
  case "xml": 
   return "string";
  case "sql_variant":     
   return "object";
  default:
   return dbType;
 }
}

MyGenerataion的使用方式(二) - UI設計

MyGenerataion Template UI設計

在Template的設計中,程式碼分成interface code/template code兩類,interface code是拿來設計UI的,也是這篇要討論的,而template code則留到下一篇文章討論,討論程式當然以範例介紹最實際,先看完成圖(覺得醜的請改成漂漂版本送我...)如下:
很簡單明確的UI,其中Database是一個ComboBox,負責顯示SqlServer中所有的Database名稱,並且挑選之後,會在下面兩個ListBox分別顯示該Database所有的Table/View提供挑選,最後兩項分別是設定我想要輸出的C# namespace以及目標目錄,最後OK是預設的按鈕,點下去就會交給Template Code去執行轉換了。
在上圖中的UI夠使用了下列Zeus的UI:
  • GuiLabel - 每一項目的標題: 如:database、select tables。
  • GuiTextBox - Namesapce內容、Output Path內容
  • GuiListBox - Tables、Views內容
  • GuiComboBox - Database名稱列表
  • GuiFilePicker - 挑選檔案目錄,顯示[...]的Button

MyGenerataion C# 空白 Template Code


public class GeneratedGui : DotNetScriptGui
{
public GeneratedGui(ZeusContext context) : base(context) {}

//-----------------------------------------
// The User Interface Entry Point
//-----------------------------------------
public override void Setup()
{
// ** UNCOMMENT CODE BELOW TO SEE UI **
//ui.Width  = 100;  /* 設定視窗的寬度 */
//ui.Height = 100;  /* 設定視窗的高度 */
/* 產生一個Label元件,顯示內容為Demo,
提示文字為Demo Tooltip,元件名稱為lblDemo */
//GuiLabel lblDemo = ui.AddLabel("lblDemo", "Demo", "Demo Tooltip");
//ui.ShowGui = true;  /* 顯示UI */
}

}
ui是預設的視窗框架,在程式碼中被comment掉的是設計UI的width/height以及產生一個GuiLabel之後顯示該UI的部分,/**/是我新增上去的註解,因此只要在Step中依賴這樣子的步驟,就可以開始設計想要的Template UI了。

範例:新增一組Label+ComboBox


GuiLabel lbDatabase = ui.AddLabel("lbDatabase", "database:", "first, please select database.");
lbDatabase.Width=50;  
GuiComboBox comboBoxDatabase = ui.AddComboBox("comboBoxDatabase", "Select a database." );
comboBoxDatabase.Width = ui.Width-lbDatabase.Width-30;
comboBoxDatabase.Top=lbDatabase.Top;
comboBoxDatabase.Left=lbDatabase.Width+10;


範例:新增一組Label+ListBox


GuiLabel labelTable = ui.AddLabel( "labelTable", "select tables:", "third, select tables from the listbox below." );
GuiListBox listBoxTables = ui.AddListBox( "listBoxTables", "Select tables." );
listBoxTables.Height = 100;
listBoxTables.Width=ui.Width-30;


範例:新增一組Label+TextBox


GuiLabel lbNamespace = ui.AddLabel("lbNamespace", "namesapce:", "fifth, please input vo's namespace.");
lbNamespace.Width=80;  
GuiTextBox textBoxNamespace = ui.AddTextBox("textBoxNamespace","Ray", "input namespace." );
textBoxNamespace.Width = ui.Width-lbNamespace.Width-30;
textBoxNamespace.Top=lbNamespace.Top;
textBoxNamespace.Left=lbNamespace.Width+10;


範例:新增一組Label+ListBox+FilePicker


GuiLabel lbOutputPath=ui.AddLabel("lbOutputPath", "output path:", "sixth, please select output path.");
lbOutputPath.Width=80;
GuiTextBox textBoxOutputpath = ui.AddTextBox("textBoxOutputpath","", "output path" );
textBoxOutputpath.Width = ui.Width-lbOutputPath.Width-50;
textBoxOutputpath.Top=lbOutputPath.Top;
textBoxOutputpath.Left=lbOutputPath.Width+10;  
GuiFilePicker filePickerOutputPath = ui.AddFilePicker( "filePickerOutputPath", "...", "Select the Output Path.", "outputPath", true );
filePickerOutputPath.Width = 20;
filePickerOutputPath.Height-=5;
filePickerOutputPath.Top = lbOutputPath.Top+1;
filePickerOutputPath.Left = textBoxOutputpath.Left+textBoxOutputpath.Width;

範例:UI設定Event Control


comboBoxDatabase.AttachEvent( "onchange", "comboBoxDatabase_onchange" );
filePickerOutputPath.AttachEvent("onselect","filePickerOutputPath_onselect");

範例:Database選取變更後,更新Tables/Views顯示資料


public void comboBoxDatabase_onchange(GuiComboBox comboBoxDatabase){
listBoxTables_databind(comboBoxDatabase.SelectedText );
listBoxViews_databind(comboBoxDatabase.SelectedText );
}
public void listBoxTables_databind(string databaseName )
{
GuiListBox listBoxTables = ui["listBoxTables"] as GuiListBox; 
try 
{
IDatabase db = MyMeta.Databases[databaseName];
listBoxTables.BindData( db.Tables );
}
catch
{
}
}
public void listBoxViews_databind( string databaseName )
{  
GuiListBox listBoxViews = ui["listBoxViews"] as GuiListBox;  
try 
{ 
IDatabase db = MyMeta.Databases[databaseName];
listBoxViews.BindData( db.Views );
}
catch
{
}
}


範例:目錄選取後,更新TextBox資料


public void filePickerOutputPath_onselect(GuiFilePicker filePickerOutputPath){  
GuiTextBox textBoxOutputpath=ui["textBoxOutputpath"] as GuiTextBox;
textBoxOutputpath.Text=filePickerOutputPath.ItemData;
}

範例-初始值設定


ui.Width  = 500;
ui.Height = 500;
// 等DataBase/View/Tables元件也新增完成之後
comboBoxDatabase_databind(comboBoxDatabase);
public void comboBoxDatabase_databind(GuiComboBox comboBoxDatabase){
try
{ 
if( MyMeta.IsConnected )
{
comboBoxDatabase.BindData( MyMeta.Databases );
if( MyMeta.DefaultDatabase != null ) 
{
comboBoxDatabase.SelectedValue = MyMeta.DefaultDatabase.Alias;
listBoxTables_databind(comboBoxDatabase.SelectedValue);
listBoxViews_databind(comboBoxDatabase.SelectedValue);
}
}
}
catch
{
}  
}

MyGenerataion的使用方式(一) - 簡介

My Generataon可以做什麼

MyGenerataion是一種O/R Tool,由於它可以自訂Template來產生不限定格式的目標檔案提供給各種語言(C#、Basic、Script、SQL)或者顯示(HTML、XML、Text),因此在自行擴充上非常的便利,缺點是一開始使用的時候比較沒有頭緒,並且必須適應一下,當然我們可以透過網路上已經被設計完成的Template來套用即可,不過學習MyGeneration的語法也可以讓原本使用的Template改良更符合自己的需求,也因為自由度高,每個Template實際產生的內容是由該Template決定,而該Template會依賴自行設計的UI來跟User要求必須設定的參數後,產生對應的文件或單純顯示在output區。
My Generataion工具所提供的UI與Meta資料都是需要查My Generation的文件才會比較好上手,設計UI是為了設定當時所需要的參數,如果要產生對應Table的C# class,此時UI必須要取得所對應的DataBase內Table的名稱與Table內每一個Column的名稱跟資料型態,並且Class本身的namespace或class name以及最後輸出的目錄位置等等,透過自行設計的UI,可以取得更多Template設計所需要的參數,來更符合使用者的需求。Meta資料則是詳細的對應Database各項資訊,在UI選取的時候,就可以直接將現有的Database/Table列出提供挑選,也可以在開始產生檔案的時候透過Meta資料讓程式碼直接產生與DB資料型態完全符合的變數或存取方式。
大致上來說,My Generation提供的UI很簡單,有點類似手工打造.Net的WinForm(這會簡單嗎?)。UI元件提供的並不完全是.Net的WinForm元件不過似乎是可以直接使用WinForm的元件,由於UI本身只是拿來最基本設定,因此My Generataion提供的基本元件其實很夠用了。元件相關的Class/Method/Property等資訊可以參考Help中Zesu Script說明文件,元件名稱主要是:GuiButton、GuiTextBox等,字頭有個Gui而以,使用上其實不困難,只是排版有點笨,這部分可以參考Samples中GUI Control Test Template。提到排版有點笨是因為,預設元件的Top會一個一個排列下來,因此要左邊Label右邊TextBox就要自己設定TextBox的Left、Top去配合左邊的Label,在顯示上才會正確。不過因為UI本身通常拿來選擇DataBase/Table/View等功能為主,比較少有人會真的拿來作精美的Form,所以設計一個From大概就可以套用很多個Template來使用了。
My Generation因為說是O/R Tool,因此有提供對應資料庫的API,而且剛登入時就要求設定好對應的Database,取得Database資訊的API可以參考Help中MyMeta API說明文件,這部分的資訊可以取得很詳細,用來設計對應DB功能的一些Class就是靠它了。

My Generation使用Template

My Generataion預設安裝完成後就提供不少Template來提供使用,其中也有一些是屬於範例Template,當然也可在官方網站或非官網找到一些Template來擴充,一開始可以透過使用內建的Template來確認目前的Template功能是不是符合需求,在針對不滿意的部分做修改,也可以順便效法現有Template寫法。使用過內建Template之後,應該會發現幾個特色,輸出的型態多元化(Basic/C#/HTML/PHP/Script)以外,連Template的原始碼都沒有用同一的語言開發(Basic/C#/JScript/VBScript),也因此在自己設計Template的時候,可以用自己比較習慣的語言來作開發(我是用C#)。

TuneUp Utilities 2008 - 維護Windows的軟體

官方網站有提供下載trail version,記得可以使用大約30天左右。這套軟體使用的理由官方說明是:
  • Powerful hard drive defragmentation - 強大的磁碟重組工具
  • Optimum start-up, Internet, and Windows acceleration - 開機速度、網路速度、與Windows速度的最佳化
  • Quick and extensive clean-up for hard drives - 快速清除所有硬碟暫存資料
  • Effective elimination of junk data - 有效率清除廢棄資料
  • Fully-automatic clean-up and improvement of your PC - 全自動的對電腦系統進行完整性的整理與改善
  • Extensive clean-up of the registry - 全面性整理統註冊區資料
  • Effective help in solving standard Windows problems - 有效率的幫您解決一些典型的Windows問題
  • Secure data recovery and data elimination - 救回保護的資料以及垃圾資料的根除
  • Simple custom Windows configuration - 簡單的自訂Windows的設定
  • Individual Windows styling - 獨特的Windows風格
在安裝完畢之後,預設會在桌面出現兩個圖示:TuneUp 1-Click Maintenance、TuneUp Utilities 2008,1-Click Maintenance是最省事的懶人方式,會檢查系統的錯誤跟移除不乾淨的程式以及系統註冊區的資料是不是有無效的來進行刪除,最後一個步驟是磁碟重整,覺得太慢可以skip task有空再做。而Utilities的功能,就必須一個一個去查詢跟使用了。

Foxit Reader

Foxit Reader
http://www.foxitsoftware.com/pdf/rd_intro.php
算是Adobe以外另一個讀取PDF檔的選擇吧,
原本是為了找讀取PGD檔的工具,結果卻找到讀取PDF檔的另一個選擇(汗
不過相較於Adobe Reader的越來越肥大,Foxit Reader顯示字型以及速度上都還不錯,
不過還是有其缺點在,相較於adobe廣為人知,Foxit Reader本身因為使用者較少的情況下,
該公司提供更新上面的速度相對的也不高就是了。

橫式廣告