2009年5月30日 星期六

Fedora 10 安裝記事

好久沒摸 Linux 了,剛好最近有台 NB 需要合法的作業系統,索性就給它從頭到腳都是合法。
雖然 Fedora 官網倒數著 7 天候就會釋出
Fedora 11,但心裡還是等不及地直接裝上
Fedora 10。出乎自己意料,目前的 Fedora 10
的版本,硬體支援度竟是這麼的棒,連我這台
2 年前雜牌 NB 都可以跑得嚇嚇叫,果然非昔日吳下阿蒙,不可同日而喻了!



以下紀錄安裝完 Fedora 10 後,額外需安裝的套件:



1. flash player:讓你使用 FireFox 瀏覽網頁時,可以看到 Youtube 影片或 Yahoo 網站
的動畫廣告

b.先要去 Adobe 網站下載 .rpm 檔案。
c.打開:應用程式 >> 系統工具 >> 終端機 ,輸入指令 rpm -Uvh 剛下載的檔案.rpm
d.再執行 yum install flash-plugin
e.關掉所有目前已開啟的 FireFox 頁面, 重新開啟 FireFox 就可安裝完成。

2. 更新你的系統:你目前雖然剛安裝好作業系統,但難保目前有些軟體已經有較新的版本發佈,
透過這步驟,可以確保你作業系統上的軟體是最新的。

a.參考這篇:Fedora7 設定軟體更新程式 (Freshrpms 套件庫 )
b.打開:應用程式 >> 系統工具 >> 終端機
c.如果 /etc/yum.repos.d/ 這個目錄內有 freshrpms.repo 這個檔案,請先將檔案刪除。
d.
在終端機內輸入
rpm -ivh http://ftp.freshrpms.net/pub/freshrpms/fedora/linux/7/freshrpms-release/freshrpms-release-1.1-1.fc.noarch.rpm
這個指令會安裝 freshrpms 套件,並在/etc/yum.repos.d/目錄下,新增一個檔案,
檔案名稱為freshrpms.repo。
e.在工作列上點選 應用程式-->系統工具-->軟體更新程式。根據自己經驗,會花半個小時以
上去完成軟體的更新。


3. 下載 xmms-mp3:電腦如果不會唱 mp3 歌曲很像很遜
a.到 xmms-mp3 - MP3 output plugin for XMMS 下載 xmms-mp3
b.下載後直接安裝即可。

4. 播放影片 (rmvb, avi)
a.參考這篇:Fedora 9装mplayer播放rmvb经验总结
b.安裝 mplayer。
yum -y install mplayer
c.安裝 smplayer。
yum -y install smplayer

d.安裝解碼器。
下载地址:http://www1.mplayerhq.hu/MPlayer/releases/codecs/essential-20071007.tar.bz2

安装方法:
tar -xf essential-20071007.tar.bz2
mkdir -p /usr/lib/codecs/
cp -p essential-20071007/* /usr/lib/codecs/



5. PDF 檔案支援。
Fedora 10 所內建讀取 pdf 檔案的程式為 Document Viewer (文件檢視器)。如果 pdf
文字是中文,則會出現文字糊掉或亂碼的現象。目前尚未找到針對 Document Viewer 的
解決方式。解鈴還須繫鈴人,我們回頭到 Adobe 的官方網站,去下載 Adobe Reader 的
rpm 回來直接安裝,酷!中文字的問題完全解決。

6. 檔案關聯設定。
針對播放影片,PDF 等檔案,都安裝了非預設的開啟程式。當然我們是希望以後遇到特定
副檔名,就要能夠用我們所安裝的程式來播放。這時,可以透過指定軟體開啟來設定。舉例
來說,我在某個 .PDF 檔案點選右鍵,執行『屬性』後,並選擇 『用指定軟體開啟』頁籤,
挑選 Adobe Reader,就是希望以後這類檔案都是用 Adobe Reader 來開啟。


7. 中華電信撥接上網
a.設定 Hinet 撥接。
b.打開 系統 >> 管理 >> 網路
c.點選左上角的『新增』圖示,在『裝置類型』選擇 xDSL 連線,然後執行下一頁。
d.乙太網路裝置挑選目前的網卡名稱。
提供者名稱則可以自己任意為這個連線命名
帳號類型在此則不要挑選
登入名稱/密碼,則依中華電信給您的帳號及密碼就可以。
完成後點選下一頁並選擇套用。


e.當設定完連線資訊,點選該連線想要啟動連線時,會發現『啟動』按鈕竟然是關閉
的。我們在該連線點兩下以開啟組態設定。


f.在此,僅需將 NetworkManager 取消,並按確定之後,就可以出現『啟用』按鈕。

2009年5月25日 星期一

兩者中都有型別的錯誤問題

兩者中都有型別的錯誤問題

在 VS2005 執行重建專案時,跑出一堆如下的錯誤訊息。


錯誤 13
d:\ItriWeb\ProjMng\ProjMng\ProjMngWeb\plan\dialog_EditOutComeType.aspx.cs(33): error CS0433: 
'c:\...\Temporary ASP.NET Files\projmngweb\70148ad8\4f87a4e0\App_Web_zc0mxaol.dll' 和 
'c:\...\Temporary ASP.NET Files\projmngweb\70148ad8\4f87a4e0\App_Web_3u5qu2vi.dll' 
兩者中都有型別 'MasterPage_Plan'
D:\ItriWeb\ProjMng\ProjMng\ProjMngWeb\codetbl\dialog_EditEmpnoList.aspx 1


google 了一下,看看有沒有跟我同樣遭遇的網友,
MSDN 找到一篇類似的文章,
自己也依照建議步驟,執行了

  1. 先執行 iisreset 把 IIS 重新啟動
  2. 關閉 Visual Studio 2005
  3. 把 c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 
    目錄下所有目錄刪除掉 

但還是無效。

回頭檢視自己專案,發現當初在設計時,
將 階段 A ,階段 B , 階段 C 的程式都分別放在三個資料夾下。
這三個階個別都有自己的 MasterPage。

VS2005 預設在 .aspx 頁面,當你取好檔案名稱後,會自動幫你產生對應的 .cs 檔。在 .cs 檔裡,
就會產生如下程式。


using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class MasterPage_Plan : System.Web.UI.MasterPage
{

}



MasterPage_Plan 這個類別名稱,也是 VS2005 幫我們取的。這就是問題的癥結。因為我三個階段都是
以資料夾來分的,每個資料夾又有自己的 MasterPage。而很幸運的,VS2005 幫我自動命名的類別名稱
都剛好一樣,所以造成命名的混淆。所以,當我手動將物件類別名稱改名,再重建專案之後,就正常了。

2009年5月21日 星期四

SQL2005資料分割範例


/*
分割範例-建立 TranLog 資料表 
*/

CREATE TABLE [dbo].[TranLog](
[TID] [bigint] IDENTITY(1,1) NOT NULL,
[TCreate] [datetime] NULL,
[TStatus] [nvarchar](50) NULL,
 CONSTRAINT [PK_TranLog] PRIMARY KEY CLUSTERED 
(
[TID] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]


/*
  TranLog 資料表新增預設資料,2007 年度 60 筆, 2008 年度 60 筆 , 2009 年度 60 筆
*/


declare @datetime datetime
set @datetime=getdate()
set @datetime=DateAdd(yy,-2,@datetime)

declare @items int
set @items = 60

while(@items>0)
begin
set @datetime=DateAdd(d,1,@datetime)
insert into TranLog (TCreate,TStatus) values (@datetime,'OK')
set @items=@items-1
end

set @datetime=DateAdd(yy,1,@datetime)
set @items = 60

while(@items>0)
begin
set @datetime=DateAdd(d,1,@datetime)
insert into TranLog (TCreate,TStatus) values (@datetime,'OK')
set @items=@items-1
end

set @datetime=DateAdd(yy,1,@datetime)
set @items = 60

while(@items>0)
begin
set @datetime=DateAdd(d,1,@datetime)
insert into TranLog (TCreate,TStatus) values (@datetime,'OK')
set @items=@items-1
end


select * from TranLog


/*
   Demo 
*/


--Partition Function的名稱,及要分割條件
CREATE PARTITION FUNCTION pf_TranLog_Date (datetime)   
AS RANGE RIGHT 
FOR VALUES (convert(datetime,'2008 01 01'), convert(datetime,'2009 01 01'))  



CREATE PARTITION SCHEME ps_TranLog_Date        --建立Partition scheme 
AS PARTITION pf_TranLog_Date                   --依所建立的Partition function設定分割點 
TO (TranLog_FG_2007, TranLog_FG_2008, TranLog_FG_2009)   --將Partition scheme指定給三個filegroup 
GO 


-- Create partitione table     --建立Partition Table 
CREATE TABLE TranLog_Partitioned
   TID int IDENTITY(1,1) NOT NULL, 
   TCreate datetime NOT NULL,    
   TStatus nvarchar(50)  NULL 
ON ps_TranLog_Date(TCreate) 
GO 

-- 將原本 TranLog 的資料匯入到  TranLog_Partitioned 分割資料表
insert into TranLog_Partitioned ( TCreate,TStatus )
select TCreate , TStatus from TranLog

select * from TranLog
select * from TranLog_Partitioned



-- 建立  對照組 資料表 (不建任何索引 不切割)
CREATE TABLE TranLog_NoAnyThing
   TID int IDENTITY(1,1) NOT NULL, 
   TCreate datetime NOT NULL,    
   TStatus nvarchar(50)  NULL 

--將 TranLog 資料匯入到 對照資料表 TranLog_NoAnyThing
insert into TranLog_NoAnyThing ( TCreate,TStatus )
select TCreate , TStatus from TranLog



/*  使用【顯示估計執行計畫】分析以下資料 */

-- 查詢條件:  不設定
select * from TranLog 
select * from TranLog_Partitioned  
select * from TranLog_NoAnyThing 

--查詢條件: 日期 大於 20090401
select * from TranLog  where TCreate  < convert(datetime,'2008 01 01')
select * from TranLog_Partitioned  where TCreate < convert(datetime,'2008 01 01')
select * from TranLog_NoAnyThing  where TCreate < convert(datetime,'2008 01 01')

--查詢條件: By ID
select * from TranLog  where TID  =1  
select * from TranLog_Partitioned  where TID  =1 
select * from TranLog_NoAnyThing  where TID  =1 

-- 查詢條件:  By ID  + 日期小於 20080101
select * from TranLog  where TID  =1 and TCreate  < convert(datetime,'2008 01 01')
select * from TranLog_Partitioned  where TID  =1 and TCreate  < convert(datetime,'2008 01 01')
select * from TranLog_NoAnyThing  where TID  =1 and TCreate  < convert(datetime,'2008 01 01')



/*
 讓每個 Table 各增加 9 萬筆,提升資料量後再重新分析一次
 */


declare @iCount int
set @iCount=30000


declare @tDate datetime
set @tDate = convert(datetime,'2007 04 01')

while (@iCount>0)
begin
insert into TranLog (TCreate,TStatus) values (@tDate,'OK')
insert into TranLog_NoAnyThing (TCreate,TStatus) values (@tDate,'OK')
insert into TranLog_Partitioned (TCreate,TStatus) values (@tDate,'OK')
end

set @iCount=30000
set @tDate = convert(datetime,'2008 04 01')
while (@iCount>0)
begin
insert into TranLog (TCreate,TStatus) values (@tDate,'OK')
insert into TranLog_NoAnyThing (TCreate,TStatus) values (@tDate,'OK')
insert into TranLog_Partitioned (TCreate,TStatus) values (@tDate,'OK')
end

set @iCount=30000
set @tDate = convert(datetime,'2009 04 01')
while (@iCount>0)
begin
insert into TranLog (TCreate,TStatus) values (@tDate,'OK')
insert into TranLog_NoAnyThing (TCreate,TStatus) values (@tDate,'OK')
insert into TranLog_Partitioned (TCreate,TStatus) values (@tDate,'OK')
end


2009年5月20日 星期三

SQL 2005 資料分割 (Partition)

SQL 2005 資料分割 (Partition)

想要對資料表進行切割動作,翻閱一下 SQL 的線上說明文件,在 create table 陳述式裡可以找到這一段 :

CREATE TABLE
    [ database_name . [ schema_name ] . | schema_name . ] table_name
        
( { <column_definition> | <computed_column_definition> }
     [ <table_constraint> ] [ ,...n ] ) 
[ ON { partition_scheme_name ( partition_column_name ) | filegroup
| "default" } ]
[ { TEXTIMAGE_ON { filegroup | "default" } ]
[ ; ]


可以注意黃色醒目背景的地方,在 CREATE TABLE 指令就可以設定資料分割的動作了。

ON { partition_scheme_name ( partition_column_name ) }
裡面的 partition_scheme_name ,是指當我們如果需要建立一個切割資料表時,
需要明確定義這個資料表是要根據何種方式來切割。而這個定義,稱為 partition schema
也就是說,資料切割只需要在 create table 指令加上 partition schema 的名稱就可以了。

此外,也要宣告一個切割時所要依據的欄位。譬如說,你希望未來資料切割方式是根據你的日期欄位來切,
2007 年 放一塊,2008 年放一塊 ,2009年放一塊,那就要將日期欄位指定為切割所依據的欄位了
(partition_column_name )。

很可惜,事情不是這樣就結束了。因為殺出一個程咬金 partition schema 出來,那要怎麼去產生這個
partition schema 呢?

也是一樣,翻一下SQL 的線上說明文件,在 create partition schema 說明裡,有以下一段:


CREATE PARTITION SCHEME partition_scheme_name
AS PARTITION partition_function_name
[ ALL ] TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] )
[ ; ]


原來,要產生 partition schema ,有兩個步驟要做,
第一:產生 partition function
第二:指定 file group

首先,產生 partition function。線上說明文件有提到:

CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type )
AS RANGE [ LEFT | RIGHT ]
FOR VALUES ( [ boundary_value [ ,...n ] ] )
[ ; ]

input_parameter_type:
是指用來切割時依據欄位的資料格式,如果是用日期的話,這裡就要用 datetime
boundary_value:
是指切割的臨界值。如果希望將資料切割成 2007年 、 2008年 、2009年 三份的話,就必須切兩次,依據  20080101  與 20090101  就可以讓資料依年度分為三類,而boundary_value 就是指20080101 與 20090101。當然,因為是屬於datetime 欄位,所以實際上我們要將輸入的參數轉型為適當型別。以我們的範例來說,就需要改成  convert(datetime,'2008 01 01'), convert(datetime,'2009 01 01')
LEFT | RIGHT:
剛剛有提到的臨界值,如果這麼恰巧,有一個日期  就是 20080101  ,那我們會希望這臨界值放在臨界值左邊還是右邊?就要用 LEFT 或 RIGHT 來設定。以我們的範例,20080101 當然是希望放在他的右邊囉,因為它的左邊都是 2007 年的,右邊才是 2008 年。


接著,產生 file group。
我們嘴裡喊著要將資料表做切割,雖然表面上看起來,我們存取的是一個資料表,但實際上,因為我們的切割,他會根據我們切割的
規則而分別存放在各個檔案裡。以我們的範例來說,根據 20080101 與 20090101 的分割法則,會產生三個資料區塊:
資料<2008 ,  2008<= 資料  < 2009 , 2009<=資料 。實際上,就需要產生三個不同的檔案來存放。而每個檔案要對應一個檔案群組,
所以我們同時也需要產生一個檔案群組給每一個檔案。

產生檔案群組方式:

ALTER DATABASE TestDB ADD FILEGROUP fg_date_1 

很簡單,只要  ADD FILEGROUP 就可以了。


產生檔案的方式:

ALTER DATABASE TestDB  
ADD FILE  
( NAME = TDate1, 
 FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\TranDate1.ndf', 
 SIZE = 1MB, 
 MAXSIZE = 100MB, 
 FILEGROWTH = 1MB) 
TO FILEGROUP fg_date_1 


NAME 是指定檔案的名稱
FILENAME 是檔案實體名稱,預設都會放在c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\ 下面,後面就是我們自己對實體檔案的命名
FILEGROUP 是指定對應的檔案群組


當我們完成上述所有步驟之後,就可以產生一個具有分割特性的資料表。以後所有 insert 到這資料的資料,就會根據分割原則存放在所分配的實體檔案裡。





2009年5月16日 星期六

jQuery in select

針對 < select > 挑選物件 ,比較一下 javascript 與 jQuery 的差別。假設要挑選 物件 select (id="s1") 裡的第三個選項。javascript 會寫成

document.getElementById("s1").value=3

但 jQuery 只要寫

$("#s1").val(3)

真的簡潔多了。




此外,如果自己想 try jQuery 語法又不想大費周章的去建立網頁的話,可以試試黑暗執行緒所提供的測試網頁 mini jQuery Lab ,蠻方便的。

2009年5月14日 星期四

jQuery UI 對話視窗


javascript 內建的 alert 視窗按鈕選項,只有【確定】、【取消】兩個。但偏偏我的客人執意要【是】、【否】、【取消】。以前我可能會告訴她做不到,但時下景氣這麼差,只好找些替代方案來取悅人家了。

在 jQuery 1.3 版後,同時 jQuery UI 也發佈了 1.7.1 版本。在這新的 jQuery UI 裡,widgets >> Dialog 所內建的對話盒真的漂亮許多,且她提供的 Modal Dialog  模式剛好可以取代原先 alert 的效果,也可以自訂 Buttons。


可自行到 Download 頁籤下載,壓縮檔解開後,/css 與 /js 資料夾是程式開發所必要的。可以將這兩個資料夾複製到自己開發的專案下面。接著要介紹的,就是自己撰寫一個使用 jQuery UI Dialog 的程式。


< script type="text/javascript" > 
$.ui.dialog.defaults.bgiframe = true;
$(function() {
$("#dialog").hide();
$("#dialog").dialog({   buttons:{
"取消":function(){  $("input[id*=h_DeliverType]").val('0'); $(this).dialog("close");},
"否":function(){  $("input[id*=h_DeliverType]").val('2'); $(this).dialog("close"); },
"是":function(){  $("input[id*=h_DeliverType]").val('1'); $(this).dialog("close"); }       
},
modal: true,
autoOpen: false,
close: function(event,ui){alert('使用者按 X 離開視窗');}

});  
});

function ShowDeliverDialog()
{
$('#dialog').dialog('open');
}

< /script >

< /head >
< body >
< div class="demo" > 

< div id="dialog" title="對話視窗"> 
如果您要吃披薩,請按 '是' ,如果不要吃披薩,請按 '否'。如果目前不想選擇,請按 '取消'。
< /div >




在測試頁面,先置放一個 id=dialog 的 div,當作我們對話視窗的說明文字,title 屬性則是對話視窗最上層會顯示的文字。我希望這個對話視窗內容,是要在 User 壓了 button 按鈕後才出現,所以預設會用  jQuery 的 .hide() 方法將他隱藏。jQuery UI 的 Dialog 有一個 Options 選項叫做 buttons ,你可以在這裡定義自己所要新增的 button 以及這個 button 所要觸發的事件。modal 屬性設為 true ,則表示這個對話視窗是以獨占方式顯示,其背景物件都會以暗化來處理。autoOpen 屬性設為 false ,則是因為我們不希望對話視窗在頁面一載入就跳出,而是要等按鈕觸發後才跳出。

完成設定後,就會跟上圖結果一樣了。

補充: 20091202
在程式裡面加上 攔 close 的事件,也就是當 user 按了視窗右上角的 X 符號離開視窗時會觸發的事件。

$('.selector').dialog({
   close: function(event, ui) { ... }
});

參考網址:http://jqueryui.com/demos/dialog/#event-close  「請選擇 Events 頁籤」