2016年2月22日 星期一

C# 及 VB 轉換

該死的Visual Studio,為何你提供這麼多的Language給程序員選擇,導致我有時要寫C#,一時VB。。。辛苦死了。幸好,網上有一個轉換Tool,可快速將VB Code轉成C#,C#轉成VB。(但不是100%能夠成功),以下是網址:
http://converter.telerik.com/

在WEB的左方輸入VB/C# Code,再選選個DropDown,再按個"Convert Code"按鈕,右面就會出現相對應的Code,真是方便至極,愛死Telerik了。

2016年2月20日 星期六

C# Winform 工作計時

最近要做一個Tool,需要Read 26個txt file,每個file有2500行的Data,並紀錄所需時間。原本我以為要用到Timer,但是原來是不用的。 System.Diagnostics 這個Class內有一個好用的Stopwatch,能夠像計時器一樣計出準確時間,而且Coding也是僅僅數句,真是省了很多功夫,數小時就能搞掂(當然包UI,包埋點read)。

下面是Stopwatch的Coding,將所需時間放進一個Label裡面。 var watch = Stopwatch.StartNew();

//Do Work

watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
label1.Text = (dlapsedMs / 1000.00).ToString() + " s";


希望以後不會不記得!!!

2016年2月12日 星期五

Windows Server 2012架設NTP時間伺服器(2) 於services.msc 啟動服務

於regedit.exe修改 數值

於桌面右上角按鍵至"Search",並輸入"services.msc"

於Services視窗連按兩下"Windows Time"

於"Windows Time Properties"視窗"General"內Startup type選擇"Automatic"後按下"Start"按鈕,待Service status轉為Running時, 然後按一下"Apply", 最後按一下"OK"

"Windows Time"服務狀態為"Running"即可


步驟2 (services.msc 啟動 服務) 完成!!

Windows Server 2012架設NTP時間伺服器(1) 於regedit.exe修改數值

架設NTP Server顧明思義,就是Sync Time,特別是工程信息公司,Time Sync是絕對、一定、十分重要的,因為資料轉換過程的紀錄時間不容有偏差(~300ms還是可接受的)。以下就是教學:

於regedit.exe修改 數值

於桌面右上角按鍵至"Search",並輸入"regedit"及選擇"regedit.exe"

出現"Registry Editor"後,於左方樹狀列選取(HKEY_LOCAL_MACHINE --> SYSTEM -->CurrentControlSet --> Services --> W32Time)

更改資料夾"Config"的數值至下圖

AnnounceFlags

5

MaxPosPhaseCorrection

ffffffff

MaxNegPhaseCorrection

ffffffff

 

更改資料夾"Parameters"的數值至下圖

NtpServer

stdtime.gov.hk,0x1 time.windows.com,0x2

Type

NTP



更改資料夾"TimeProviders"內"NtpClient"的數值至下圖

SpecialPollInterval

180



更改資料夾"TimeProviders"內"NtpServer"的數值至下圖


Enabled

1

 



步驟1 (regedit.exe修改 數值) 完成!!



Windows Server 2012架設NTP時間伺服器(3) 設定防火牆

設定防火牆

於桌面右上角按鍵至"Search",並輸入"firewall",選取"Windows Firewall"

於"Windows Firewall"視窗按下"Advanced Settings"

於"Windows Firewall with Advanced Security"視窗按一下"Inbound Rules"

按下"New Rule..."

於"New Inbound Rule Wizard"視窗按一下"Port"的圈圈,再按"Next"

按一下"UDP"的圈圈及於"Specific local ports"輸入"123" ,再按"Next"

按一下"Allow the connection"的圈圈,再按"Next"

全部剔,再按"Next"

於"Name"輸入"Time Sync Server" ,再按"Finish"

出現下圖情況即可



步驟3 (設定防火牆) 完成!!

Windows Server 2012 NTP時間伺服器 架設完成!!

透明Animated GIF製作

這圖片不簡單的!!!

圖片是網頁中非常重要的元素,有動作、底色不被局限的圖片更加是重中之重。以下是一個天文台有動畫的黑雨圖案製作。

1‧先下載Tool,我選用的是GIMP (GNU IMAGE MANIPULATION PROGRAM),原因:免費!!!

可到http://www.gimp.org/下載,這個當然不及Photoshop那樣強大,免費就是要將就將就。


2‧預備一張黑雨圖片

經過一輪安裝,待完成後,就預備一張圖片,由於工作需要,我選取了天文台的黑雨圖示,其實還有紅雨、黃雨(= =)。各位Google一下就知道有沒有。


3‧重覆創建2個Layer

先Dulipcate 2個Layer,這是基本Photoshop技巧,沒有什麼特別,各位有什麼不明白,可以上網尋找一些高手的汁圖技巧。

4‧Layer的圖樣

各Layer只需按照下圖便可以了。
Layer 1 (2行雨水)

Layer 2 (1行雨水)

Layer 3 (沒有雨水)

5‧觀看效果

如圖示中顯示,按下Plackback按鈕,之後再按Play,可以預覽Gif的效果。

6‧匯出

由於我之前選取圖片的format為png,現在需要轉為GIF,所以要使用Export Function進行轉換。

製作動畫GIF,必須勾選"As animation" 及 "Loop forever"。
(Option) 可設定每個frame的間隔時間(Delay between frames where unspecified),如果選用delay,需要勾選"Use delay entered above for all frames"

7‧創建網頁

動畫GIF製作完成了,就需要用網頁包著它。 我製作了一個有底色的test.html,放住剛剛的GIF檔

8‧網頁結果

效果就是這樣!!!
辛苦了 。

2016年2月4日 星期四

C# 連接 Oracle Database

由於公司接了一單水務署的工程,需要連接他們的Oracle Database,並拿走少量的數據放進Mysql裡面,在做的過程中,小人從中得知連接Oracle比連接SQL Server、MySQL較為複雜(好似係‧‧‧),所以訂立此帖以作紀錄。

1‧下載Oracle 的ODAC

由於水務署通常使用的系統、設備都 比較舊 (例如:Windows OS、Web Broswer),所以下載低version就 一定無死了 可以了,果然他們使用的是10g (冒汗‧‧‧2016年了‧‧‧)



2‧將已下載的檔案unzip、並將下圖的file轉移至Visual Studio的專案內

只有Oracle.DataAccess.dll能夠成為reference,其餘3個file只需放在一起便可。專案的佈局便大致完成。



3‧創建一個Class(類)

個人習慣,沒有什麼可以解釋。

class OracleData
{
     private string equip_no;
     private string location_code;
     private DateTime comm_date;
     private int maint_threshold;
     private string description;
     private int interval;

     public OracleData()
     {
         // TODO: Complete member initialization
     }

     public string GetEquipNo()
     {
         return equip_no;
     }

     public void SetEquipNo(string eq_no)
     {
         equip_no = eq_no;
     }

     public string GetLocationCode()
     {
         return location_code;
     }

     public void SetLocationCode(string loc_code)
     {
         location_code = loc_code;
     }

     public DateTime GetCommDate()
     {
         return comm_date;
     }

     public void SetCommDate(DateTime comm_dt)
     {
         comm_date = comm_dt;
     }

     public int GetThreshold()
     {
         return maint_threshold;
     }

     public void SetThreshold(int threshold)
     {
         maint_threshold = threshold;
     }

     public string GetDescription()
     {
         return description;
     }

     public void SetDescription(string desc)
     {
         description = desc;
     }

     public int GetInterval()
     {
         return interval;
     }

     public void SetInterval(int interv)
     {
         interval = interv;
     }
 }

4‧引用Oracle.DataAccess.dll


using Oracle.DataAccess.Client; 

5‧Connection String設定

跟SQL Server及MySQL 大致相同 (Username、Password、Host IP、Port),唯一分別是SID,但不一定要使用SID,SERVICE_NAME也可以使用,視乎Server設定
如果server為Express,SERVICE_NAME為XE;如果想直接引用tnsnames.ora,Datasource=ora內的名稱即可。

string connString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=" + oracleIP + ")(PORT=" + oraclePort + ")))" +
                    "(CONNECT_DATA=(SID=" + oracleServiceID + ")));" +
                    "User id=" + oracleUserName + ";" +
                    "Password=" + oraclePassword + ";";


6‧將Oracle 內的Data 打包

query跟SQL Server及MySQL 大致相同,我就不作解釋了,下面的Code大約就是將 Oracle 內的Data加進自訂的List<OracleData>裡面,以便調用。
*DBNull.Value的使用就是防止data field的值是(null)而產生的錯誤。*
*最好將下面的code放進try block以便debug,因為不一定第一次做就能夠成功(你明白的‧‧‧)*
 
OracleConnection conn = new OracleConnection(connString);
OracleCommand cmd = new OracleCommand(query, conn);
cmd.CommandTimeout = 1200;
conn.Open();

OracleDataReader dr = cmd.ExecuteReader();
List<OracleData> content = new List<OracleData>();
while (dr.Read()) {
   OracleData od = new OracleData();
   od.SetEquipNo(dr[0].ToString());
   od.SetLocationCode(dr[1].ToString());
   od.SetCommDate(Convert.ToDateTime(dr[2]));
   if (!DBNull.Value.Equals(dr[3]))
   {
      od.SetThreshold(Convert.ToInt32(dr[3]));
   }
   else
   {
      od.SetThreshold(0);              
   }
   od.SetDescription(dr[4].ToString());
   if (!DBNull.Value.Equals(dr[5]))
   {
      od.SetInterval(Convert.ToInt32(dr[5]));
   }
   else
   {
      od.SetInterval(0);               
   }
   content.Add(od);
}
conn.Close();

C# 連接 Oracle Database 就大致完成了!!