2009年12月13日 星期日

法國鍵盤

今年去法國遊玩時
在 Annecy 的旅館使用他們的電腦上網
這時才發現法國的鍵盤 Layout 跟習慣中的 Qwerty 有所差異

法文鍵盤 (請參考) 的QAW 的位置就不一樣
(其實還有些地方也不一樣)
調整一下習慣就好

當時感覺的另外一種"資訊" culture shock
挺有意思的

Belgian keyboard layout.png

2009年12月11日 星期五

DotNetZip

DotNetZip 可以快速的開發 ZIP
還可以正確處理中文檔名 (之前有問題)

參考範例:

using (ZipFile zip = new ZipFile(System.Text.Encoding.Default))
{
// add this map file into the "images" directory in the zip archive
zip.AddFile("c:\\images\\personal\\7440-N49th.png", "images");
// add the report into a different directory in the archive
zip.AddFile("c:\\Reports\\2008-Regional-Sales-Report.pdf", "files");
zip.AddFile("ReadMe.txt");
zip.Save("MyZipFile.zip");
}

還是免費的 Yeah!

ps. System.Text.Encoding.Default 是用來處理中文, 否則中文檔名將會變成 ?????

2009年12月6日 星期日

程式圖庫

在 Visual Studio 2008 的安裝目錄下
...\Program Files\Microsoft Visual Studio9.0\Common7\VS2008ImageLibrary\
目錄下可以找到一個壓縮檔 VS2008ImageLibrary.zip
這個壓縮檔案中有需多開發應用程式需要用的圖庫
還包含動畫ㄡ..

2009年11月29日 星期日

關閉 RadWindow 所開啟的視窗

呼叫一個 RadWindow 並讓這個 Window ShowModal
是件容易的事

但是要讓這個 Window 關閉回到呼叫他的視窗該如何做
找了一下範例
發現 Telerik 線上文件也有人再問這個問題

function GetRadWindow()
{
var oWindow = null;
if (window.radWindow)
oWindow = window.RadWindow; //Will work in Moz in all cases, including clasic dialog
else if (window.frameElement.radWindow)
oWindow = window.frameElement.radWindow;//IE (and Moz as well)
return oWindow;
}

// 按下關閉或是離開的按鍵
function Button2_onclick() {
GetRadWindow().Close();
}

2009年11月28日 星期六

.NET Excel

Excel 在 Server 端讀取或是產生
已經變成在商業應用程式中常見的需求

之前利用 VSTO 或是利用 Automation 的方式操作
會遇到幾個瓶頸
1. 慢 (1 sec vs. 40 sec)
2. 應用程式記憶體沒有正常的釋放掉
3. 安全考量 (前兩個問題就很頭痛了,這點也就不需要錦上添花了)

微軟還大書特書的一篇告知開發者不建議 Automation 的方式在伺服器端操作
但是微軟也沒有提出這個問題有何好的解決方法

最近發現 3rd party
有幾個好工具
2. NPOI

Aspose 的 Solution 比較廣泛,除了 Excel, Word, Powerpoint 等Office 文件都可以支援, 當然也不便宜, 使用前請考慮專案預算及 License 策略

NPOI 目前是Free, 但只有 Excel
Java fans 應該不陌生
因為NPOI 就是 .NET POI 啦

2009年11月24日 星期二

一月初到十月底的查詢

這個題目似乎很簡單

假設資料庫中有個表格如下
CREATE TABLE TX (DT DATETIME, EVENT VARCHAR(100))

一般都會以下的查詢

SELECT EVENT FROM TX WHERE DT BETWEEN '2009/1/1' AND '2009/10/31'

但陷阱會出現在 '2009/10/31' 這邊
因為 '2009/10/31' 是代表 '2009/10/31 00:00:00'

下面這筆資料就不會被擷取到
INSERT INTO TX VALUES('2009/10/31 10:10:10', 'SOMETHING WRONG')

所以敘述應改改為

SELECT EVENT FROM TX WHERE DT >= '2009/1/1' AND DT < '2009/11/1'
或是
SELECT EVENT FROM TX WHERE CONVERT(VARCHAR(8), DT, 112)
BETWEEN '20090101' AND '20091031'

會比較好

在 Oracle 也是一樣
SELECT EVENT FROM TX WHERE DT > to_date('2009/1/1', 'YYYY/MM/DD') and DT < to_date('2009/11/1', 'YYYY/MM/DD');

Trunc

Oracle

select trunc(1.3)from dual

SQL Server

select cast(1.3 as int)

結果相同.