2009年3月23日 星期一

Crystal Report

Crystal Report為用來製作報表的工具


運作模型分為兩種:pull model 和 push model。

pull model:報表的資料來源是在設計報表時就指定好的,亦即在執行時期產生報表時,會向預先指定的資料來源(通常是資料庫)將所需的資料「拉」回來。


Push model :是在執行時由程式將資料給報表,

pull model 是將大部分的工作都在設計報表時完成,而 push model 還必須撰寫程式將資料丟給報表,push mode可以將報表資料透過程式全部都準備好之後,再利用報表工具呈現出來 ,如動態欄位、極複雜的 SQL...。

在非開發環境要使用Crystal Report需要有Crystal Report Runtime的環境,在Visual Studio 2005的開發環境可以運行,是因為Visual Studio 把運行的Runtime整合到開發環境。

取得Runtime開發環境的方式
Step 1. 取得Crystal Report Runtime合併模組 (
http://resources.businessobjects.com/support/additional_downloads/runtime.asp )
Step 2. 新增專案的安裝及部署項目(Step 1解壓後的文件中有word檔教學),加入Step 1.的合併模組
Step 3. 在要運行Crystal Report的環境安裝 Step 2.產生的安裝檔


由Crystal Report 吃XML資料的方式
XML → DataSet →Crystal Report
說明:
http://www.codeproject.com/KB/cs/xmlcrreport.aspx
Example


MSDN資料:
合併模組專案
[合併模組] 專案讓您建立可重複使用的安裝元件。就如同動態連結程式庫能讓您在應用程式間分享程式碼一樣,合併模組能讓您在 Windows 安裝程式間分享安裝程式碼。
合併模組 (.msm 檔) 是一個包含安裝元件所需的所有檔案、資源、登錄項目及安裝邏輯的單獨套裝。合併模組無法單獨安裝,必須在 Windows Installer (.msi) 檔案內容中使用。
合併模組能讓您擷取一特定元件的所有相依性,以確保安裝正確版本。一旦您散發了合併模組就無法再做修改,而應為元件的每個後續版本建立新的合併模組。
為了避免版本問題,多重應用程式所共用的元件或檔案都應該使用合併模組。


Ref:
http://msdn.microsoft.com/zh-tw/library/0h4bhcz3(VS.80).aspx
http://msdn.microsoft.com/zh-cn/library/ms225593(VS.80).aspx
http://www.dotblogs.com.tw/huanlin/archive/2008/04/23/3315.aspx
http://www.codeguru.com/csharp/.net/net_general/toolsand3rdparty/article.php/c13253/


2009年3月22日 星期日

C# and Flash

在C Sharp 播放Flash有三個步驟

1. Add Shockwave Flash Object to Tool Box
2. Register Flash ActiveX Control
3. Use Shockwave Flash Object

1.Add Shockwave Flash Object to Tool Box


2.Register Flash ActiveX
找到Flash9f.ocx的路徑(名稱會依安裝的版本不同而有改變)
一般是放在C:\WINDOWS\system32\Macromed\Flash\
在命令列輸入regsvr32 C:\WINDOWS\system32\Macromed\Flash\Flash9f.ocx

3.Use Shockwave Flash Object
使用Toolbox裡的Shockwave Flash Object

更改Movie 屬性指到Flash 檔所在的位址

另外當使用Visual Studio做過Register Flash ActiveX的步驟後,托拉Shockwave Flash Object到Form時,如果有下面的錯誤發生:

那需要使用Windows Form ActiveX控制項匯入工具(AxImp.exe)來手動產生dll
1. AxShockwaveFlashObjects.dll
2. ShockwaveFlashObjects.dll
再加入Visual Studio 專案中的參考裡面,再去手動Coding

AxImp.exe 需要安裝過.Net Framework SDK
“C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin” 底下會有AxImp.exe
AxImp.exe 的使用方式
Command-Line: cd C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin
Command-Line: aximp C:\WINDOWS\system32\Macromed\Flash\Flash9f(10a).ocx

程式的配置方式
namespace PA_Project
{
partial class PAParty
{
...
...
private void InitializeComponent()
{
...
...
this.axShockwaveFlash1 = new AxShockwaveFlashObjects.AxShockwaveFlash();
...
...
//
// axShockwaveFlash1
//
this.axShockwaveFlash1.Enabled = true;
this.axShockwaveFlash1.Location = new System.Drawing.Point(-1, 3);
this.axShockwaveFlash1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.axShockwaveFlash1.Name = "axShockwaveFlash1";
this.axShockwaveFlash1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axShockwaveFlash1.OcxState")));
this.axShockwaveFlash1.Size = new System.Drawing.Size(700, 500);
this.axShockwaveFlash1.TabIndex = 3;
...
...
}
...
...
public AxShockwaveFlashObjects.AxShockwaveFlash axShockwaveFlash1;
...
...
}
}



Reference: http://msdn.microsoft.com/zh-tw/library/8ccdh774.aspx

Json

官方網站:
http://www.json.org/
Json : JavaScript Object Language
----------------------------------------------------

一開始接觸到的不是Json(JavaScript Object Language),而是XML( Extensible Markup Language),使用它的原因,是為了當Server Transaction結構上有改變時希望不用重新編譯整個Server。
為什麼需要重新編譯整Server,是因為Server共同的Header file.所以,當有一隻程式的結構改變影響到了Header file那整個Server就必須重新編譯,另一方面當Server對外的結構有改變時,有影響的Sub System也需要重新編譯(光編譯和協調的時間就會花掉好幾個工作天)

方式:
我們希望當某一隻Transaction結構上改變時不用重新編譯整個Server,只需要針對改變的那個檔案做編譯,所以在結構上會使用String用來放可變的XML 內容。當結構有改變.是改變XML的內容,編譯器還是認為結構為String沒有改變。

而使用XML的語法分析必須透過DOM有轉一手的動作,在某一些開發環境沒有提供XML 語法分析而又想使用的時候,必須去找到可用的Library,會花一段去學習如何建立和使用Library的時間,且使用的Library通常長的很肥。(當然也可以自己去寫分析的程式)

到最近才知道一個好用的格式Json(JavaScript Object Language).如果只是要做為資料流的傳遞,使用Json會比XML來適當,原因是他很簡單、在傳送的字串比XML少且在分析內容時不用透過DOM轉一手,語法分析上也很容易,如果是擔心資料查詢的問題,可以結合Class、Hashtable (或.Net 2.0 之後的Directory)所include的Library不會像XML那麼一大包,且使用Json可以免除去擔心某些XML分析器Memory上處理的問題。

對於是否要存成XML的資料格式,我認為是在當這個資料有要在網頁上做呈現的資料或是大量封存的資料,我才會存成XML格式,因為我會把XML格式的資料定位在儲存的資料而不是在處理中的資料流。

XML 與 Json 格式比較





XMLJson

<information>
<fullname>Rice Lin</fullname>
<nickname>Rice</nickname>
<emailaddrs>
<address type='work'>rice@xxx.ooo.com</address>
<address type='home'>riceballs@gogo.com</address>
</emailaddrs>
<telephones>
<tel type='work'>03-1234567</tel>
<tel type='mobile'>0911000000</tel>
</telephones>
</information>

{
"fullname": "Rice Lin",
"nickname": "Rice",
"emailaddrs": [
{"type": "work", "value": "rice@xxx.ooo.com"},
{"type": "home", "value": "riceballs@gogo.com"}
],
"telephones": [
{"type": "work", "value": "03-1234567"},
{"type": "mobile", "value": "0911000000"}
]
}



目前我使用到Json是關於C#方面的程式所以使用到的是Json.NET(http://json.codeplex.com/)上的Json.NET 1.3.1(.NET 2.0)。
他提供了 .Net 2.0和.Net 3.5的版本,.Net 3.5比.Net 2.0上的使用功能更強大(主要是有用到了Linq的功能),但在考慮到使用.Net 3.5版本開發出來的元件,使用者也必需安裝.Net 3.5的Library,所以我使用.Net 2.0的版本
下載完解壓縮的的檔案裡面可以先去看他所提供的Example 都有Source Code對於學習怎麼使用Json很容易就可以上手。

我常用的是物件的轉換,這個方式大大的縮短了分解Json,處理Json的開發時間

Json轉成Hashtable(也可以是其它的Class):
string value = @"{""Name"":""Orange"", ""Price"":3.99, ""Expiry"":""01/24/2010 12:00:00""}";
Hashtable p = JavaScriptConvert.DeserializeObject(value, typeof(Hashtable)) as Hashtable;

Hashtable 轉成Json(也可以是其它的Class)
Hashtable strHashtable = new Hashtable ();
string jsonText = JavaScriptConvert.SerializeObject(strHashtable );

Json.Net 也提供了Json轉XML格式. XML轉Json
但是如果想要結和 XML轉Json再轉成Class, 需要考慮到,他定義 XML如果為屬性資料的部份在轉成Json格式會在名稱那裡帶一個"@"





XMLJson
<span class=""vevent""></span>"span":{"@class": "vevent"}

在將Json轉為Class時Json的名稱要和Class的名稱相同(那前面多帶的@就會是個問題) 下面是正常的情況





ClassJson
class dataInfo
{
string name;
string number;
}
dataInfo Info;
"Info":{
"name":"Rice",
"number":"012345"
}


2009年3月7日 星期六

建立Apache Http Serve開發環境

安裝版本下載位置:

Apache Http Server 2.2.11
http://httpd.apache.org/download.cgi
PHP 5.2.9(zip 解壓縮版)
http://www.php.net/downloads.php
mySql 5.1.32
http://dev.mysql.com/downloads

(X)phpMyAdmin 3.1.3(zip 解壓縮版)
(X)http://www.phpmyadmin.net/home_page/downloads.php

phpMyAdmin 不是很好用,更改效率慢 改用
MySQL Administrator (在mysql網站 download GUI Tool )


部署:


安裝和配置:

在Vista下安裝,先將UAC關閉(修改UAC 需要重新開機)。




安裝 Apache Http Server
1.Network Domain、Server Name填localhost
2.安裝選Custom ,安裝位置改到D:\root\webTool\Apache2.2
3.在安裝過程中.選擇不會自動註冊服務(port 8080那一個,port可以在之後的設定修改)
4.進入Command Line(命令提示字元),在執行 打cmd按下enter(vista 如下圖)


在Command Line下輸入


C:\Users\Rice>d:
D:\>cd d:\root\webTool\Apache2.2\bin
d:\root\webTool\Apache2.2\bin>httpd -k install


配置 PHP
1.將 PHP文件解壓縮到 D:\root\webTool\PHP5.2.9
2.在.\PHP5.2.9 資料夾下複制一份php.ini-recommended改名成php.ini
3.修改php.ini

;extension=php_mysql.dll 去掉;
→ extension=php_mysql.dll
extension_dir = "./" 改成php底下的ext資料夾
extension_dir = "D:/root/webTool/php5.2.9/ext/"


在ext底下有目前版本php所提供可用的DLL,大部份都是沒有被啟動,如果要使用,只需要把php.ini裡對應到extension前面的分號拿掉,再重起Apache Http Server


4.把php所在的目錄加到系統環境變數path的後面



Apach Http Server上配置PHP
打開httpd.conf (在Apache安裝目錄下conf資料夾中:D:\root\webTool\Apache2.2\conf)
修改httpd.conf













原始結果
DocumentRoot "D:/root/webTool/Apache2.2/htdocs"#設定網頁起始的位置
DocumentRoot "D:/root/wwwroot"

#在LoadModule的位置新增下面二行
LoadModule php5_module "D:/root/webTool/php5.2.9/php5apache2_2.dll"
PHPIniDir "D:/root/webTool/php5.2.9"
DirectoryIndex index.htmlDirectoryIndex index.php index.html

#找到AddType application/x-gzip .gz .tgz 新增下面二行
AddType application/x-httpd-php .php
AddType application/x-httpd-php .html
Listen 8080#這為設定port 原先可能為8080 : 80為http預設port
Listen 80
在conf資料夾下有一個original資料夾(D:\root\webTool\Apache2.2\conf\original),裡面有原始的設定檔,如果httpd.conf被改到爛掉,可以重新copy一分回來

安裝mySql
安裝時選Custom,改變安裝目錄到D:\root\webTool\mysql
安裝完成後,會問你要不要到官網註冊(可以跳過)。然後會問你是否 Configure the MySQL Server now,選中並繼續,然後根據提示,設定 ,以及 root 管理員的密碼。


安裝phpMyAdmin
這是一套用php寫出來管理mySql的GUI
下載並解壓縮程式,搬移至 Web 網站目錄下manager資料夾,修改為phpmyadmin313
複製主目錄下的 config.sample.inc.php 檔,並更名為 config.inc.php。
修改config.inc.php
$cfg['Servers'][$i]['auth_type'] = 'cookie';
給予 $cfg['blowfish_secret'] 一個任意亂數值,最長可為 46 個字元。此亂數值將用以使用在 blowfish 演算法,對密碼進行加密,例如:$cfg['blowfish_secret'] = 'cooki';
phpMyAdmin 執行時會先載入 libraries/config.default.php 檔,接著再重設 config.inc.php 檔中設定的變數。


可能遇到的問題

使用 cookie 登錄時,需將密碼經編碼後儲存,需使用 mcrypt 函式,若 php 不支援此函式登錄後,畫面下方會出現此錯誤訊息:『無法讀取mcrypt模組,<br />請檢查 PHP 設定』。欲解決此問題,請開啟 php.ini 檔案,將 extension=php_mcrypt.dll 前方的註解移除 (亦即啟動 php_mcrypt.dll),另外請將 php 目錄下的 libmcrypt.dll 檔案複製到 apache2.2\bin



找不到 PHP 內的 mbstring 編碼模組, 沒有這個模組, phpMyAdmin 無法準確地分割雙字元文字, 而可能產生問題.
修改php.ini檔案extension=php_mbstring.dll前方的註解移除

設定檔案現在需要密碼 (passphrase) (blowfish_secret).

修改config.inc.php檔案
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['blowfish_secret'] = 'cookie'

建立資料庫時出現”Missing parameters “errors
libraries/config.default.php 檔裡面修改$cfg['PmaAbsoluteUri'] = ‘’
→ $cfg['PmaAbsoluteUri'] = 'http://localhost/phpMyAdmin313'
(在phpMyAdmin3.1.3版本$cfg['PmaAbsoluteUri'] 是放在config.default.php 有一些版本是在config.inc.php)
另外,在這我沒有設定,維持原本設定空值.還是能正常執行。

增加其它附加功能



第一步新增Database 和 Table
在.\phpMyAdmin313\scripts下有二個SQL檔案create_tables.sql、upgrade_tables_mysql_4_1_2+.sql
執行 create_tables.sql
執行 upgrade_tables_mysql_4_1_2+.sql
可以透過phpMyAdmin 執行.sql裡面的內容

第二步修改.\phpMyadmin313\config.inc.php
打開下面的設定(後面的值,代表資料庫的名子和表格的名子)

$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark';
$cfg['Servers'][$i]['relation'] = 'pma_relation';
$cfg['Servers'][$i]['table_info'] = 'pma_table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma_table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma_pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma_column_info';
$cfg['Servers'][$i]['history'] = 'pma_history';
$cfg['Servers'][$i]['designer_coords'] = 'pma_designer_coords';


Ref:
http://hi.baidu.com/dzlx/blog/item/1fd882517f850f2342a75bea.html
http://www.xiaohui.com/dev/server/20070922-install-apache-mysql-php-on-vista.htm
http://www.plays.com.tw/vbulletin/archive/index.php/t-382.html