2008年2月25日 星期一

中文全形/半形轉換

Q:
如何作全形/半形轉換?

A:
原來以為要判斷第一個byte的ASCII大小, 沒想到 .net 提供一個簡便函數, 專門處理這項工作, 實在太帥了.

  • 全形轉半形

Strings.StrConv(mDigit, VbStrConv.Narrow, 0)

  • 半形轉全形

Strings.StrConv(mDigit, VbStrConv.Wide, 0)

日文字串也可以, 我想所有DBCS也都可以吧.

That's all, keep coding!!

2008年2月24日 星期日

指定表單預設欄位及按鈕

Q:
不管是Web Application 或 Windows Application, 使用者都會要求表單顯示時, 游標必須擺在第一欄, 而且按Enter時會觸發最常使用的按鈕, 這要怎麼做呢?

A: 使用.net 2.0 or above

Web Form

  • 招式一

在 html 的 form 標籤直接加入defaultbutton、defaultfocus屬性如下:

<form id="form1" runat="server" defaultbutton="Button2" defaultfocus="TextBox2">

  • 招式二

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

If Page.IsPostBack = False Then

Me.Form.DefaultButton = Button2.UniqueID

Me.Form.DefaultFocus = TextBox2.UniqueID

End If

End Sub

  • 招式三

使用Master Page時, form 標籤在主板網頁, 無法直接指定, 須調整一下姿勢, 如下:

Page.Form.DefaultButton = Button2.UniqueID

Page.Form.DefaultFocus = TextBox2.ClientID

Windows Form

  • 指定游標所在欄位, 只要將該欄的 TabIndex 屬性設為0即可
  • 要指定Enter預設按鈕, 則要修改【表單】的AcceptButton屬性為某一控制項即可
  • 另外要指定【取消】(Esc)的預設按鈕, 則要修改【表單】的CancelButton屬性

That's all, keep coding.

2008年2月19日 星期二

.net 建置時出現 lc.exe 錯誤

.net 建置時出現 lc.exe 錯誤, vs IDE無任何詳細訊息, 通常原因是引用third party元件, 並將專案複製給他人使用時產生錯誤, 處理方法有二:

A方案

  1. 先關閉vs 2005
  2. 至專案的My Project目錄刪除license.licx 檔案
  3. 開啟vs 2005
  4. 執行重建該專案,此時在「方案總管」會出現 license.licx 驚嘆號,對 license.licx 按滑鼠右鍵,選擇刪除,再重建該專案就 OK 了。

B方案

  1. 重新產生一個新專案
  2. 先加入third party元件, 再複製原專案所有程式即可

PS. A方案為同事Frank所想出的方式, 給他拍拍手.

That's all, keep coding.

2008年2月18日 星期一

Linux 效能調校心得

這兩天同事反映Linux server效能不彰, 嚴重影響應用程式效能, 但因之前也未接觸過Linux, 事情來了, 也只好硬著頭皮上場了, 之下是我的一些租淺看法:

  1. top指令: 監看CPU、Memory的使用量, 定時更新, 有很多指令可用, 例如排序、自訂欄位、調整process priority ...等, 還蠻好用的, 只差I/O資料
  2. iostat、vmstat指令: 監看I/O資料,可配合watch指令, 定時更新, 例如 watch -n 2 iostat, 不幸的事我們的Server好像偵測不到變化值, 希望善心人士能惠賜高見.
  3. nice指令: 可指定程式執行的優先等級,等級由 -19 ~ 20, 愈小等級愈高
  4. renice指令: 可調整執行中的程式(Process)優先等級, top指令也有提供, 我在top指令設定成功, 但直接下renice卻失敗, why ? :-(
  5. 心得:
    1) 發現java 的CATALINA_OPTS 環境變數設在profile中, 造成每一個Java程式都占據大量的memory, 使系統一直在作Swap。
    2) 用nice啟動較重要的程式, 給予優先等級
    3) Tomcat需要較大的heap memory, 可在tomcat/bin 目錄的setenv.sh 檔案設定
    set JAVA_OPTS=-server -XX:+UseParallelGC -Xmx768m -XX:MaxPermSize=160m -Djava.awt.headless=true

    *** xmx: max heap size
    *** server mode : 指示JVM採取run-time optimization

為了Linux, 最近度數又要增加了. 預告下次要寫一篇【眼睛保健】的文章與大家分享.

Keep coding.

2008年2月17日 星期日

建立 IE 的右鍵選單(Context Menu)

今天看了一篇關於『如何建立 IE 的右鍵選單(Context Menu)』的文章, 網址如下:
http://www.codeproject.com/KB/menus/IE_Context_Menu_Installer.aspx

它是以C#安裝專案為例子, 說明如何建立右鍵選單, 我試著以VB.NET直接產生右鍵選單, 效果還不錯, 步驟如下:

  1. 建立VB.NET 2005視窗專案
  2. 在Form1放入兩個Button
  3. 打開『程式碼檢視』, 輸入下列程式

  4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim mSubKey As Microsoft.Win32.RegistryKey = My.Computer.Registry.CurrentUser.CreateSubKey("SOFTWARE\Microsoft\Internet Explorer\MenuExt\Sample Action")
    '1,2,4,8,10,20 in heximal are 1,2,4,8,16,32 in decimal (respectively)
    ' 0x1:Default, 0x2:Images, 0x4:Controls, 0x8:Tables, 0x10:Text selection, 0x20:Anchor
    Dim keyValueInt As String = "16"
    mSubKey.SetValue("Contexts", Convert.ToInt32(keyValueInt), Microsoft.Win32.RegistryValueKind.DWord)
    mSubKey.SetValue(Nothing, "file://" & Application.StartupPath & "\action.htm")
    mSubKey.Close()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    My.Computer.Registry.CurrentUser.DeleteSubKey("SOFTWARE\Microsoft\Internet Explorer\MenuExt\Sample Action")
    End Sub

  5. 再產生一個檔action.htm, 放在執行目錄中, 內容如下:
    http://www.box.net/shared/nz3cngvsw0
  6. 按F5執行, 執行第一個按鈕
  7. 開啟一個新的IE, 選擇一段文字, 按右鍵, 即可看到Sample Action選單

That's all, keep coding.

2008年2月14日 星期四

部署 Html 編輯器

從網路上可以找到不少Html 編輯器的控制項, 例如下列網址 : http://windowsclient.net/articles/htmleditor.aspx

使用起來很方便, 功能也很帥, 但是部署時卻發生兩個問題:
1. ieframe.dll 無法註冊
2. 程式死當, 微軟要我們向他報告, 且保證不回覆, #$%^&

還好努力找了一陣子, 才把它搞定了.
1. ieframe.dll 無法註冊, 那就在部署專案中排除它
2. 程式死當, 是因為.net 2.0不再支援 ActiveX的..., 必須copy mshtml.dll 至應用程式目錄下.


That's all :-) , Keep Coding !!

PS.
其實可以直接用 .net 2.0 所提供的控制項再加上ExecCommand, 就可以製作一個類似的Html 編輯器了, 只是已經搞定, 就算了.

產生SQL Server 的DB Schema文件

網際網路上有許多產生DB schema的作法, 今天看到一個滿簡單的, 介紹給大家:
http://www.codeproject.com/KB/database/SQL_DB_DOCUMENTATION.aspx?msg=2424192#xx2424192xx

作法:

  1. 解開附件Script_to_generate_DB_Document.zip
  2. 執行Query Analyzer(SQL 2000) 或SQL Server Management Studio(SQL 2005)
  3. 選定要製作文件的資料庫(Use xxx)
  4. 點選選單, 查詢>結果至>將結果存檔, 或直接按 CTRL+Shift+F
  5. 執行Script_to_generate_DB_Document.sql內容

That's all :-)

2008年2月3日 星期日

資料庫存取速度提升

我們通常使用索引來提升SQL指令的執行速度, 其實做大量資料更新時還有一個簡單的地方可以提升速度, 就是使用交易(Transaction), 新增一萬筆資料至MS SQL Server, 大約快了三倍多, 測試程式如下:
1. 不使用交易
Dim cnn As New SqlConnection("server=.;database=sampledb;integrated security=sspi;")
cnn.Open()

Dim MyWatch As New Stopwatch
MyWatch.Start()
Dim mycommand As New SqlCommand()
mycommand.Connection = cnn
Dim n As Integer
Try
mycommand.CommandText = "truncate TABLE ex1;"
mycommand.ExecuteNonQuery()
Catch
End Try

For n = 0 To 10000 - 1
mycommand.CommandText = String.Format("INSERT INTO ex1 (a,b,c) VALUES('a','c',{0})", n + 1)
mycommand.ExecuteNonQuery()
Next
MsgBox("MyWatch.ElapsedMilliseconds=" & MyWatch.ElapsedMilliseconds)

2. 使用交易
Dim cnn As New SqlConnection("server=.;database=sampledb;integrated security=sspi;")
cnn.Open()

Dim MyWatch As New Stopwatch
MyWatch.Start()
Dim mycommand As New SqlCommand()
Dim mytransaction As SqlTransaction = cnn.BeginTransaction
mycommand.Connection = cnn
mycommand.Transaction = mytransaction
Dim n As Integer
Try
mycommand.CommandText = "truncate TABLE ex1;"
mycommand.ExecuteNonQuery()
Catch
End Try

' use transaction to make the process more quick
For n = 0 To 10000 - 1
mycommand.CommandText = String.Format("INSERT INTO ex1 (a,b,c) VALUES('a','c',{0})", n + 1)
mycommand.ExecuteNonQuery()
Next
mytransaction.Commit()
MsgBox("MyWatch.ElapsedMilliseconds=" & MyWatch.ElapsedMilliseconds)

3. 不使用交易, 但採用批次更新, 比第一種快1/5
Dim cnn As New SqlConnection("server=.;database=sampledb;integrated security=sspi;")
cnn.Open()

Dim MyWatch As New Stopwatch
MyWatch.Start()
Dim mycommand As New SqlCommand()
mycommand.Connection = cnn
Dim n As Integer
Try
mycommand.CommandText = "truncate TABLE ex1;"
mycommand.ExecuteNonQuery()
Catch
End Try

Dim da1 As New SqlDataAdapter()
da1.InsertCommand = mycommand
da1.UpdateBatchSize = 10000
For n = 0 To 100000 - 1
mycommand.CommandText = String.Format("INSERT INTO ex1 (a,b,c) VALUES('a','c',{0})", n + 1)
da1.InsertCommand.ExecuteNonQuery()
Next
MsgBox("MyWatch.ElapsedMilliseconds=" & MyWatch.ElapsedMilliseconds)

2008年2月2日 星期六

設定(Setting)與資源(Resources)的差別

Q: VS.net專案在My Project中具有設定(Setting)與資源(Resources)兩個頁籤, 都可以設定字串, 我一直搞不懂兩者有甚麼差別? 它們個字的使用時機為何呢?

有一天當我試圖要做多語系(Globalization)時, 我就暸了, 原來設定(Setting)是沒辦法進行多語系的, 而資源(Resources)是可以很輕鬆完成多語系工作, 例如要繁體化字串資源, 只要複製My Project目錄中的Resource.resx 成 Resource.zh-tw.resx, 再編輯該檔內容即可, 反之設定(Setting)在建置後會產生*.exe.config檔, VS.net不提供*.exe.zh-tw.config.

That's all. Keep Coding.

開站了!

這是一個 .net 程式開發的技術討論區.
筆者目前從事工具軟體開發, 同時也是Crazy Coding Boy. 希望能將日常遭遇的問題及解決技巧, 與大家分享. 內容會以解決現實問題為重點, 而非一味的追逐新技術, 主要內容包括:

  1. 專案問題與解答
  2. 有用的工具程式
  3. 參雜一點點的方法論(Methodology)

希望各方人士不另賜教, 能激勵筆者用力的寫下去.