2009/07/31

PKI Research #2 - 憑證製作

拿舊電腦安裝 OpenCA (on CentOS 5.3) 安裝失敗,無法啟動。看到 Fedora 有自己寫的 Dogtag 憑證系統,不知道有沒有用,這方面先交給別人實驗。

我們要 PKI 的目的是要使用產生的公私鑰對來驗證使用者身分,但是發憑證很簡單 (OpenSSL 就可以簽 X.509 了),但要集中管理使用者金鑰卻很困難,不得不架設 CA 一類的東西,尤其是憑證廢止清冊,這一定要中央集權式管理才可以。OpenSSL 簽憑證並沒有辦法考慮到廢止的問題吧 (頂多自動過期,離職等無法強制廢止) 所以似乎還是要 CA 中央管理憑證。

我提過我已經可以自行簽發憑證了 (見此 OpenSSL 教學),跟教授借來的那本也有提到 Bouncy Castle 這個 Java 函式庫可以簽發,但是重點的憑證管理卻隻字未提。還有簽完的 RSA Private Key 檔、憑證申請書和簽發憑證檔都是特定格式,要直接抽出公私鑰對存在 RFID Tag 太難了,我想許多程式設計都是直接將憑證檔案丟去處理的吧。

以下為絕對沒用過的 RSA Private Key 檔範例:
-----BEGIN RSA PRIVATE KEY-----
MIIBOQIBAAJBAOWeK9TSYVnPEkmK45TeI7NrC8MzvwabSVg1aEuTmcNkLRg/Qibv
B6ST5F056HCk0xvzm5rfO5A+q+4ncBMGMhkCAwEAAQJABGaLoICHrRjy2MX4ppm7
RWz/xLXxK0c+mJotbYVepQf1KYB6kPc4df1t4KrFFgxMyXzdJ/eiegf4j3HFT4Hs
gQIhAPiVVZNSMqp1uUx7OXB3GGW+3uslvA3+NvuAKqVguIo9AiEA7Hf6ykGeuRBN
k2EN+J+Vof4ryzFOtJGH+eyycmKPsQ0CIFJYteZ9nkcVhHKvh1GYQj7CQfpHn8pK
4k/iHz51kexJAiBwKs1kiVHv+QLDSQNmjtRcngNKBB6QWoQEkjlnNsdwNQIgbJYa
Ft4zOc8TnbXnGxXRfGVG0RZfXmxcQNv2yX2G4Vc=
-----END RSA PRIVATE KEY-----

你能看出這個檔案內的私鑰組成是什麼嗎?

openssl rsa -in 1.key -text
可看出私鑰的各組成資訊。

PEM 內文經過 BASE64 解碼後的 DER 編碼有 317 bytes,一個 Tag Block 有 16bytes,也要約 20 格。

-----BEGIN CERTIFICATE REQUEST-----
MIIBGzCBxgIBADBhMQswCQYDVQQGEwJUVzEPMA0GA1UECBMGVGFpd2FuMQ8wDQYD
VQQHEwZUYWl3YW4xHDAaBgNVBAoTE05DSFUgTUlTIERlcGFydG1lbnQxEjAQBgNV
BAMTCXNvdWx0YWtlcjBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDlnivU0mFZzxJJ
iuOU3iOzawvDM78Gm0lYNWhLk5nDZC0YP0Im7wekk+RdOehwpNMb85ua3zuQPqvu
J3ATBjIZAgMBAAGgADANBgkqhkiG9w0BAQUFAANBANOz3JapX/SSbdTCaQiriALm
ZlMeGW+L3XWnj4H7kXVljqsyYv6JJEAnQzdBcw1MiUZDYZqFOYJHxmx56eSIx8o=
-----END CERTIFICATE REQUEST-----

要求憑證簽發的申請檔,內含有國家、組織、姓名等個人資訊,你看得出來嗎?
-----BEGIN CERTIFICATE-----
MIIBtDCCAV4CCQChpB3R8j5vwDANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJU
VzEPMA0GA1UECBMGVGFpd2FuMQ8wDQYDVQQHEwZUYWl3YW4xHDAaBgNVBAoTE05D
SFUgTUlTIERlcGFydG1lbnQxEjAQBgNVBAMTCXNvdWx0YWtlcjAeFw0wOTA3MzEw
NDE1MDJaFw0xMDA3MzEwNDE1MDJaMGExCzAJBgNVBAYTAlRXMQ8wDQYDVQQIEwZU
YWl3YW4xDzANBgNVBAcTBlRhaXdhbjEcMBoGA1UEChMTTkNIVSBNSVMgRGVwYXJ0
bWVudDESMBAGA1UEAxMJc291bHRha2VyMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJB
AOWeK9TSYVnPEkmK45TeI7NrC8MzvwabSVg1aEuTmcNkLRg/QibvB6ST5F056HCk
0xvzm5rfO5A+q+4ncBMGMhkCAwEAATANBgkqhkiG9w0BAQUFAANBAGQhB8VKtY2N
hecmukSUmJkTzFWwT15fPmTGzf0KdrccNCSK2bE/u6bTW9dkUF12MkTaHNVytmKd
u7MoPuNvCnA=
-----END CERTIFICATE-----

crt 已簽署憑證內容。這張憑證是自我簽署的,沒什麼效用。

openssl x509 -in 1.crt -noout -modulus
輸出公鑰係數。

OpenSSL 參考資料:
http://www.ascc.sinica.edu.tw/nl/91/1819/02.txt
http://setnet.com.tw/ftp/%BA%FB%AD%D7%A7%DE%B3N%BB%A1%A9%FA/Linux/%C3%B1%B5o%BE%CC%B5%FD.txt
http://csc.ocean-pioneer.com/docum/ssl_basic.html

2009/07/30

C# 編譯產生 Unable to find manifest signing certificate in the certificate store 錯誤

當專案搬到另一台機器進行編譯後,可能會發生「Unable to find manifest signing certificate in the certificate store」,百思不得其解。查閱 Google 大神發現錯誤原因,由於 ClickOnce 的佈署需要經金鑰認證,換一台機器後編譯的金鑰就不同而會發生錯誤。可以手動開啟 *.csproj 檔案,搜尋:

<manifestcertificatethumbprint>XXX</manifestcertificatethumbprint>
<manifestkeyfile>XXX</manifestkeyfile>
<generatemanifests>true</generatemanifests>
<signmanifests>true</signmanifests>


將這幾行刪除後重新存檔,應該就能正常編譯。
--
參考資料:Unable to find manifest signing certificate in the certificate store
話說, 有鑑於 icLin 的標準

大家就一起來想想看這系統中有啥功能 & PO 一下唄

現在既定的有...

A) 看公文

B) 上傳 [netDrive]

C) 圖示隨意拖拉放

想到啥就 有閒沒閒 回個應好過年 唄.

2009/07/27

開發週報7/27

進度: iclin快把電腦給我生出來呀!!!!!

OpenCA 試架


預想認證方式

遺失補發
所有者持身份證件or 護照 至管理部門進行與DB內的資料核對
若成功就予以補發 錯誤就代表此人為不合法想要申請TAG補發的使用者

根據認證方法與補發辦法上
TAG與DB的儲存內容調整為以下


TAG 內存

使用者名稱 個人介面選項 公鑰 私鑰


DB內存

使用者名稱 職位等級(讀公文等級,思考中?) 身份證字號(或護照號碼)先做hash再存入 公鑰

試問:
伺服器問題是否以解決

--------------------
PPT進度在回覆回報一下

2009/07/22

下一步?

RFID:
因為若真的要用SK & PK 來認證的話
那麼原本要存進TAG&DB的 我們所給的ID(自動編號的0001,0002)之類的 這項可以去掉
再來留 SK PK各8 blocks來存
改存

1.USER NAME
2.LEVEL
3.UserMod
5.SK
6.PK(從資料庫存取資料的index)

其中5,6為後來再來執行
------------------------------------------------
DB的話
驗證方面的似乎要分開?



現在要先做的應該是做主程式從SERVER端讀取公文檔案
傳到本地端電腦這一塊
我們要就是讓他傳檔案到本地端電腦還是?
基本上我們一開始的想法是公文
公文並不能修改
所以並不需要做修改後回存這一部份的動作跟程式
但聽IC說法好像想要讓我們做可以修改回存...(?)


麻煩大家說一下意見吧?

----------------------------------
7/23更新

DB增加身份證字號 or 護照 號碼 HASH後的值
(Varchar32) 存入
拿來當萬一TAG 被使用者弄丟的話
使用者可憑證件向公司申請補發一張新的TAG
同時重新讓認證中心重新發佈SK & PK

2009/07/21

OpenCA

好,既然無論如何都要加 PKI,那就硬幹看看。OpenCA 我們已經知道可以用來建立 CA 了,至於要怎麼用還不清楚。這裡有份 Live CD 的說明文件,可以下載 Live CD 直接以光碟開機啟動。

我不知道 X.509 憑證裡面寫了啥,不過如果真的只需要公鑰跟私鑰,他創一個這麼大的檔案要幹嘛?如果真的有辦法只取出公私鑰塞入 Tag,這樣不就變成單純的 RSA 機制?那 CA 的驗證等等還有用嗎?但這個機制避掉了 Tag 空間不夠,只存必要資訊的方法。(話說也沒人這樣做過?我們算先驅?)

另一種方法則是將憑證檔案也存放到 Server,統一保管 (注意這有被駭的安全性問題),Tag內只存放索引,必要時調出憑證來確認。這個方法似乎避免掉了憑證檔不能存在 Tag 的問題,卻又引發了另一個問題。


伺服器機架問題,還未能正式上線。我希望下週就能搞定,就可以架設 OpenCA (+ OpenSSL, Apache HTTP Server 等),現在只能找 Live CD 套著玩。

2009/07/15

PKI目前結論

該比賽有教學
跟套件可索取
這玩意兒是給
"智慧卡"用的
並不是用RFID

結論:...擱置
---------------------------------
7/16更新
RFID與PKI結合應用研究 < CYY的技術報告 準備要去神出來(大家上)

PKI直接架構無法使用在RFID TAG(太耗空間)
PKI要參加比賽要用已知的PKI技術(不知CYY他們的技術報告可不可行)

資通 PKI 競賽第一屆電子報
亞軍:朝陽科大資工-「應用PKI為安全基礎的共享汽車系統」
RFID 搭配自然人憑證 (先以自然人憑證認證,再將憑證卡號綁定 Tag 的方式),並非 Tag 內儲存 PKI 資訊,自己建立憑證中心。

交大資工
一系列工研院的 RFID 安全研究,提到 OpenCA 架設憑證中心自行發行憑證的可能性。

PKI技术在RFID标签数据安全中的应用 / 杨金国 - 计算机工程与设计, 2007
一篇大陸論文,因為無法存取所以無法知道更詳細的資料,只知道至少有人在研究這個領域。

RFID在产品防伪应用中的关键技术研究
有圖有真相

保密承諾書
參加ARES uPKI比賽要簽的賣身契,基本上就是uPKI是他們的機密,比賽完後就不可使用及流出。

2009/07/13

部署 VMware ESXi Server 4 on IBM System x3550

最後我選了 ESXi 作為虛擬化的方案。

第一:OpenVZ 基於一個 Linux,這個 OS 必須去維護它,我維護其他 OS 都嫌麻煩了;ESXi 是特化的 Linux 核心,幾乎不需維護 (定期注意系統更新即可)。

第二:OpenVZ 只能支援 Linux OS,因為它是 OS-Based 虛擬化的緣故;ESXi 使用 VMware 長久以來全虛擬化的結晶實作了一個半虛擬化的 Hypervisor 平台,可以運作多樣的 OS,當然也包含 Windows。

第三:這有點偏見,ESXi 安裝很簡單,OpenVZ 卻還要慢慢設定。

說了這麼多,最後我終於啟動了 System x3550,有如渦輪引擎的六具 6000 轉抽風扇瞬間轉起,那吵度真不是蓋的。卻發現它沒有 PS/2 插孔而只有 USB,因為手中沒有 USB 鍵盤所以只好又跑一趟電子街買一個 KIMYO NT$195 的 USB 陽春鍵盤。插上去後仔細看螢幕說明,按下 F1 按鍵進入 BIOS 設定,可以看到裝著兩顆 Intel Xeon E5405 2.0GHz、2GB 的記憶體及兩顆 SAS 167GB 硬碟。接著依指示按下 Ctrl + A 進入 RAID 管理。

我想 RAID 0 應該沒有勇者要試吧,這是伺服器耶。於是就選了 RAID 1 鏡像備份模式。建立完之後跳出設定,放入預先燒好的 ESXi 安裝光碟,開始安裝。

安裝過程沒什麼好說的,就是看指示按下對應按鈕,可能是 F8、F11 或 Enter 一直變換,大概是不想讓你一路跳過去吧。安裝過程根本沒難度,只是 ESXi 4 的安裝條件相當嚴苛,通常不能安裝都是卡在 RAID 卡或是網路卡不支援,這台 IBM System x3550 算是通過考驗了。安裝完成重開機,就進入 ESXi 介面。

介面什麼都沒有。總之先按下 F2 設定 root 密碼跟伺服器 IP 吧,成功輸入 IP、Subnet mask、Gateway和 DNS 後,就完成了網路設定。最後打開被封印的 SSH 遠端管理功能,這是一定要的 (參考文章)。過程中比較難的大概是 vi 指令,因為許久未碰都忘光了XD 按 a 進編輯模式,刪除註解的 # 字元,按下 Esc 跳出編輯模式,輸入 :wq (冒號: Shift + ;) 寫入並離開就大功告成,最後重開一下。

要管理必須透過 vSphere Client 連線 (可以 HTTP 連到伺服器 IP 有下載連結),而且只有 Windows 版,怪。安裝完成後發現 Windows 7 RC 版不能登入,顯示 clients.xml 錯誤啥的。官方也有網友回報討論串,官方解答竟然是叫你用 7 的 XP Mode 執行,這真是我聽過最棒的回答法了,去你的。還好下面有強者提出解套法:去其他安裝 .NET 3.5 SP 的電腦上找 System.dll 複製,修改 VpxClient.exe.config 文件,使用 BAT 下環境變數執行,真的成功,真是太棒了。

最後就利用 GUI 登入,上傳作業系統 ISO 檔供虛擬系統安裝時使用,設定虛擬系統跟 VMware 其他產品非常像,這是最易上手的地方。最後啟動虛擬系統,按照安裝 OS 的步驟來安裝 (放入光碟、更改 BIOS 開機順序),就大功告成。記得最後裝個 VMware Tools 來使系統更快更穩。

灌了一個 CentOS 5.3 版,跑看看再說。在 CentOS 的 eth0 設定使用手動 IP 設定,也可以取得固定 IP,有如另一台伺服器在線運作一般,真好玩。也可以 SSH 連進去管理。

2009/07/10

架設機架式伺服器

目前位在我們研究室的那台伺服器,是IBM出品的 System x3550(Intel Xeon E5405 2.0GHz x 2, 2GB DDR2 RAM),這一台東西被擱置已經有半年以上了(NT$八萬多耶),現在即將在一週內被安裝到機房內,並建構好作業環境。

順利的話,這台機器可以放在新蓋的社管大樓5F機房,佔用1U機架的空間,有備援電源跟冷氣照顧,應該比放在研究室好上很多。這方面還要看到時候有沒有辦法,畢竟只是說說。然後這台新機器確定要由三組團隊共用,我不相信三組人馬能好好的共處在一個作業環境下,所以我想將這台機器建立在虛擬化的技術上,讓每一組自己搞自己的那一塊。

例如有 OpenVZ 這種 OS-Based 半虛擬化技術,它是直接在 Linux Kernel 上動手腳,讓其他環境直接在機器上同時運作,並幾乎以一般的速度運作,因此其他虛擬私人伺服器 (Virtual Private Server, VPS) 所運行的作業系統只能是 Linux 了。

OpenVZ 必須先安裝 CentOS 4/5 或是 Fedora 系 Linux,才能在其上安裝 OpenVZ,目前 Wiki 有介紹如何下載 yum 套件安裝。另外架設完成後,Host OS必須使用 OpenVZ 預先準備好的包裝來建置,不過有非常多的Distributuion 可選擇,Ubuntu 什麼的都可以用,放到/vz/template/cache即可。

OpenVZ 搭配 HyperVM 的網頁式管理介面應該是最好的了,安裝也很容易。

發現有包裝好的 OS + OpenVZ + Web管理包:Proxmox VE,它同時也包進了QEMU全虛擬化環境,可以運作 Windows (慢),如果要選 OpenVZ 方案我會用這個整合包來安裝。

另一個方案是 VMware ESXi Server 半虛擬化技術,這套軟體是商業軟體免費化。相關文章。唯一的不同是這套可以支援許多 OS,連 Windows 都有,但整體效率應該比 OpenVZ 來的差一點吧。優點是他跟我們平常接觸的全虛擬化環境 (例如 Virtual PC, VMware, VirtualBox) 非常接近,但由於是建購在半虛擬化技術上,速度比較快。

VMware ESXi 需要搭配專用的連線程式連到主機去佈置 Host OS,不知道有沒有多帳號可以分開管理就是了。

07/13 編輯:有多帳號,但是似乎沒有辦法讓每個人自己只管自己的 VM,而是一次給予所有 VM 的修改權限?也就是我可以改你的,這太不好了,我再研究看看。
---
相關文獻

http://wiki.centos.org/HowTos/Virtualization/OpenVZ
http://www.linuxfly.org/post/307/
http://phorum.study-area.org/index.php/board,39.0.html
http://blog.s5x.tw/log/2009/04/enable-ssh-on-esxi.html

PKI

PKI(Public Key Infrastructure;公開金鑰基礎建設)

何謂PKI?
提供在電腦網路運作的個人資料、商務與商業能夠如同信封簽章與封印般的技術。
密碼學上,藉著憑證管理中心(CA)將使用者的個人身分跟公開金鑰鏈結在一起。

PKI所能達到的目標?
機密性、真確性、驗證性、不可否認性

PKI概念介紹(PDF)

資通PKI應用競賽 歡迎來PK!

ARES uPKI套件是免費提供的 (在這個比賽),但是它好像是用在 SmartCard 上,RFID上不知可不可行。

2009/07/09

職位等級該取得之資料分級方法

今天討論後
由依等級不同分存在不同等級的資料夾
所以依不同等級建立不同資料夾來存


ex:

Level 1Level 2Level 3

如圖
各level資料夾更放著不等level的該取得的訊息等

2009/07/08

C# 迴圈 vs 遞迴

剛剛想要驗證書上說
遞迴比迴圈有效率(我覺得他在唬爛...)
於是用程式run看看
有鑑於電腦跑起來速度我感覺不出來...
依java經驗(?)來講
當然是迴圈快
只好拜咕大神
沒有看見遞迴比迴圈有效率的說法(除了特殊情況下)

雖然遞迴就結構上比較直覺

但對我來說就程式邏輯而言還是迴圈比較好想
而在效率上也是迴圈比較好
Visual C# 2005 精要剖析書上是錯的
不要相信它= =a

C# Delegate 委派 使用方法

之前講到委派 (Delegate),當時不清楚做法。查了一些資料後,大概了解它是一個代理者的角色,代替你執行你要執行的方法。例如說你可以手動打開電視開關來收看電視,也可以利用電視遙控器 (代理者) 來幫你執行打開電視的工作。

C# 提供 delegate 修飾子來宣告一個委派方法:

public delegate String getNameDelegate(String n);

委派方法的參數個數、順序、型態乃至於回傳型態都必須跟要被委派的方法一樣 (但變數名稱可以不相同)。下面是我們要委派這個 getNameDelegate 方法呼叫的一個方法:

public static String getName(String name){
return "g1: " + name;
}


所以我們把 getName 想成打開電視機,getNameDelegate 當作遙控器,這樣可以多少理解吧?

要呼叫委派方法,有許多方法,隨著 C# 版本的演進已經越來越方便,就從最複雜的開始說起吧。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1 {
class Program {
public delegate String getNameDelegate(String n);

static void Main(string[] args) {
getNameDelegate g0 = new getNameDelegate(getName);
getNameDelegate g1 = getName;
getNameDelegate g2 = delegate(String n) { return "g2: " + n; };
getNameDelegate g3 = n => "g3: " + n;

Console.WriteLine(g0("0"));
Console.WriteLine(g1("1"));
Console.WriteLine(g2("2"));
Console.WriteLine(g3("3"));
Console.ReadKey();
}

public static String getName(String name){
return "g1: " + name;
}
}
}


首先是 getNameDelegate g0 = new getNameDelegate(getName); 這段,這是最早的方法。你就將 getNameDelegate 給實體化,並在其建構元上指定要代為執行的方法 (如 getName) 就可以了。

因為這樣太麻煩,所以後來的 C# 支援這種寫法:getNameDelegate g1 = getName; 是不是更直覺呢?

C# 2.0 中,增加了匿名方法的建立,像我們的 getName 這麼簡單的一行,可以簡化為
getNameDelegate g2 = delegate(String n) { return "g2: " + n; };
這樣,利用 delegate(){ } 來定義匿名方法。

C# 3.0 中,更以 Lambda 運算式取代匿名方法,一行 getNameDelegate g3 = n => "g3: " + n; 輕鬆打發。 n => "g3: " + n; 就是所謂的 Lambda 運算式。例如 x => x * x 就是「傳入 x,執行 x * x 並回傳」。

最後準備好 g1 等委派物件後,就可以開始執行了。執行的方式有兩種,一種是 g1.Invoke(); 來引發,另一種是更為直覺的 g1(); 直接執行。


這麼看起來委派只是代為執行,並沒有什麼好用的感覺啊。像上面的例子,我大可直接呼叫 getName() 就好,為什麼還要繞一圈以 getNameDelegate 包裝起來再呼叫呢?脫褲子放屁嗎?

getNameDelegate g1 = getName;
g1("Scribe");

getName("Scribe");

They're the same!

雖然我現在還搞不懂委派有什麼好的,不過我發現委派他可以一次呼叫代為多個方法,這樣就比較有用多了。例如我按下遙控器的開關,就可以幫我把電視、冷氣、電燈等開關一次打開,不是很方便嗎?所以下面要教你怎麼一次委派多個方法。

using System;

namespace ConsoleApplication1 {
class Program {
public delegate void consoleDelegate(String txt);
public delegate void printNameDelegate(String n, consoleDelegate p);

static void Main(string[] args) {
var g0 = new printNameDelegate(printName);
g0 += delegate(String n, consoleDelegate p) { p("Call from anonymous func: " + n); };
g0 += (n, p) => p("Call from Lambda: " + n);

g0("scribe", print2Console);
Console.ReadKey();
}

public static void printName(String name, consoleDelegate p) {
p(name);
}

public static void print2Console(String txt){
Console.WriteLine(txt);
}
}
}

Result:
scribe
Call from anonymous func: scribe
Call from Lambda: scribe


var g0 = new printNameDelegate(printName);
g0 += delegate(String n, consoleDelegate p) { p("Call from anonymous func: " + n); };
g0 += (n, p) => p("Call from Lambda: " + n);

上面三行分別以不同的方式創造出委派物件,跟上面範例的不同點是以 += 串接,讓 g0 一次代理多個方法,最後再一次執行。所以 g0() 的結果有三行。這樣就可以呼叫一個委派物件,同時作數件事情了。

值得一提的是本範例用了兩個 delegate,其中一個用在 print2Console 上,讓其他方法能夠叫用。printName 第二個參數就是 delegate,其實很像是方法的指標之類的。(因為不可以直接指定第二個變數型別為 print2Console,所以使用委派方式)


我比較喜歡 delegate{} 建立匿名方法跟直接使用 () 來呼叫委派物件,你呢?

參考資料:C# 筆記:重訪委派-從 C# 1.0 到 2.0 到 3.0

2009/07/07

在 WPF Application 中使用 Timer

一般來說在 Windows Forms 程式可以使用工具箱的 Timer (System.Windows.Forms) 來進行,另外也有更為精確的 System.Timers.Timer 可以用。但是在 Windows Presentation Foundation 應用程式中,沒有辦法使用 System.Windows.Forms.Timer,而 System.Timers.Timer 雖然仍可以使用,但是在時間觸發的事件中如果你去修改 UI 控制項的文字等等,會警告你只有擁有 UI 控制項的執行緒可以修改屬性。要解決這個方法可以用 Delegate 委派方法,但是這是 C# 的新玩意,Java沒有這種東西,所以不太懂。另一個方法是設定 Timer 的 SynchronizingObject 屬性,讓這個獨立的執行緒跟 UI 執行緒屬於同一個,但是 WPF 程式的頂層 Window 沒有實作 ISynchronizeInvoke 介面的樣子,所以無法使用。

System.Windows.Forms.Timer:
Windows Forms 程式用
計時執行緒跟 UI 執行緒是同一個 (或者說根本只有一個執行緒)
可能造成主畫面沒有反應的狀況 (因為相同執行緒的關係)

System.Timers.Timer:
所有 .NET 程式皆可使用
計時執行緒跟 UI 執行緒是不同個 (因此有執行緒同步問題)
不會造成主畫面沒有反應的情況


於是拜 Google 大神,得到了 System.Windows.Threading.DispatcherTimer 這個物件,可以用在 WPF 程式上,而且它所產生的執行緒跟擁有 UI 的執行緒是同一個,就不必擔心無法修改的問題。

private void btnTimer_Click(object sender, RoutedEventArgs e) {
// 設定 Timer 以自動讀取
DispatcherTimer t = new DispatcherTimer();
t.Tick += new EventHandler(t_Elapsed);
t.Interval = new TimeSpan(1000000);
t.Start();
}

private void t_Elapsed(object sender, EventArgs e) {
// ... do something...
}


值得注意的是 TimeSpan 建構元接受的數字是 100 奈秒單位,上面的 1000000 為 100 毫秒的意思。

System.Windows.Threading.DispatcherTimer:
所有 .NET 程式皆可使用
計時執行緒位於 Dispatcher 佇列之中,可以存取 UI 控制項
不會造成主畫面沒有反應的情況 (未測試,可能是因為統一由 Dispatcher 管理)

DB&RFID所存資料


目前想到的暫定版應該是這樣
大家有意見或有問題請講~~~~

2009/07/06

關於在 VS 中為網頁嵌入式件處理程序的方~法

在 VS 當中, 對於在專案理加入事件處理程序.

有幾種方式.

首先 A) 就是直接寫在 其附屬的 C# 檔中;

如下例:




在右邊的這個欄位中選擇 *.cs 檔,

直接在其中加入 function.

整體跟 java 有一定程度的相似度.







不然的話,

可以用方法 B) , 另外新增一個 *.js 檔.





這樣的話就跟撰寫一般 javascript 檔的寫法就一模一樣了. 嘿嘿.


以上這兩個方法都可以使用.

程式存取部分簡圖



嗯...如果沒理解錯誤的話

我們的基本運作方式(終端電腦省略掉了 還是也要畫上去呢~?)

算第一張簡圖吧~比之前我們討論時的還簡略了不少

2009/07/03

.NET 字串轉 Byte 、Byte 轉字串解法

因為 RFID 的 Block 讀寫是採用低階的 byte,一般使用不太可能直接使用 byte 而會是 String 一類的東西,是故我們必須學會如何把字串轉成 byte,反過來 byte 轉成 String 的方法。

"張京介" → Write to Block X
"張京介" → Convert to byte[] → {177, 105, 168, 202, 164, 182} → Write to Block O


.NET Framework 的 System.Text.Encoding 類別庫提供一系列的字碼頁轉換方式,其中有 Default (環境預設編碼,例如正體中文便是 Big5)、UTF7、UTF8、Unicode (UTF-16)、UTF32、ASCII 等編碼。要把字串變成 byte,則可以使用 GetBytes() 方法,以下是例子:

using System.Text;

String name = "張京介";
Encoding.UTF8.GetBytes(name); // {229, 188, 181, 228, 186, 172, 228, 187, 139}
Encoding.Default.GetBytes(name); // {177, 105, 168, 202, 164, 182}
Encoding.Unicode.GetBytes(name); // {53, 95, 172, 78, 203, 78}


要從 byte 轉回來,也有 GetString() 方法可以用,細節就不再說明。

2009/07/02

MySQL Prepare() 使用法 + UTF-8 亂碼解決

MySqlCommand 提供的 Prepare() 可以讓你避免自行組合字串的不便性和 SQL Injection 的防止。前面提到過 21.2.4.6 節有範例可以參考。

MySqlConnection conn = new MySqlConnection("server=localhost;user=root;database=test;port=3306;charset=utf8;");
MySqlCommand cmd = new MySqlCommand("INSERT INTO test VALUES (@ID, @Name)", conn);
cmd.Prepare();
cmd.Parameters.Add("@ID", MySqlDbType.Int16);
cmd.Parameters.Add("@Name", MySqlDbType.String);

for(int i = 6; i < 10; i++){
cmd.Parameters["@ID"].Value = i;
cmd.Parameters["@Name"].Value = "修羅パンツ" + i.ToString();
cmd.ExecuteNonQuery();
}


只要下好 SQL Command 後呼叫 Prepare(),再塞入 Parameters,最後 Execute 就可以完成了。這邊範例是先定義好 Parameters 的型態 (ID 是整數、Name 是字串)後,利用迴圈批次新增資料 (Parameters["@ID"].Value) 再呼叫 ExecuteNonQuery 新增,就可以達成重複使用。

另外,如果在 Connection String 時沒有設定 charset=utf8 (注意是 utf8 不是 utf-8!),寫入時會預設使用 iso-8859-1 (Latin1) 來寫入,非英數字就會變成 ???。另外新增 MySQL 資料表時,Table 跟每個欄位也要設定使用 utf8 (utf8_general_ci) 這樣讀寫才會正常。

總結,要排除亂碼,在 MySQL 資料表要設定為 utf8 外,程式建立連線時也要明顯定義 charset=utf8 才可以。

silverlight 的安裝 & 開發環境. 啾咪

首先哩,

silverlight 可以直接用 VS 2008 來編寫

她可以看做是 wpf 的子集合

基本程式撰寫方式也很像

所以只要熟一種, 另一種可以很快上手.

接下來,

就來簡單的說一下如何開始屬於 你/妳 的銀光之旅

================================

第一步是如何安裝.

說到要寫一個銀光程式,

現在一般業界有幾種來寫她的方法.

有人用 M$ 出的 expression Blend 來寫 ( 要$

也有人用記事本就幹出來. ( 不用$ 但是要你的肝 & 大量時間

當然,

個人最推薦的還是免費的 VS 2008 來玩.

要在 vs 2008 上來建立編譯環境的話,

你需要的是以下東西.

A) VS 2008. [include C#, web developer.]

B) 將 VS update 到 SP1.

C) 下載 M$ 的 silverlight tool.
這是一種插件, 安裝之後就可以在 VS 中開啟屬於 你/妳 的銀光專案.

* 這裡要注意的是, 如果 你/妳 A)裝的中文版, C) 也要裝中文版喔.

裝完之後就可以在建立專案的時候看到這樣的圖:


這樣就可以來玩 你/妳 的銀光專案了.


先到這裡, 有新心得再 po . 啾咪.








這裡有個官方的教學 blog, 還不錯.

有興趣可以參考一下.

http://www.microsoft.com/taiwan/msdn/silverlightnet/GetStarted/default.aspx

MySQL Connector/Net 使用法

1. 安裝 MySQL Connector/Net (參考文章)
2. 開啟 Visual C# 2008,將 MySql.Data 加入物件瀏覽器的自訂元件集(編輯自訂元件集),在.NET分頁可以找到 MySql.Data。



3. 在專案要先「參考」MySql.Data才能在專案中使用,快速新增參考的方式很簡單,在 2. 項中我們已經新增了 MySql.Data,只要選取後按下圖中的按鈕就可以快速加入參考。



4. 以下是連接 MySQL 資料庫的範例程式碼:

using System;
using System.Windows.Forms;
using MySql.Data.MySqlClient;


namespace WindowsFormsApplication1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
MySqlConnection conn = new MySqlConnection("server=localhost;user=root;database=test;port=3306;charset=utf8;");
try {
conn.Open();
MySqlCommand cmd = new MySqlCommand("SELECT * FROM test", conn);
MySqlDataReader rdr = cmd.ExecuteReader();

while(rdr.Read()) {
this.label1.Text += rdr[0] + " -- " + rdr[1] + "\n";
}

rdr.Close();
conn.Close();
} catch(Exception ex) {
MessageBox.Show(ex.ToString());
}
}
}
}


Form1 有個 Label 叫做 label1,作為顯示資料庫的項目用。

2009/07/01

.NET Framework 類別庫

雖然 Visual Studio 有內建整個文件了,但網路上的版本說不定比較新比較好。

這是 .NET Framework 3.5的文件:點此開啟。跟 Java API References 一樣,屬於必讀的內容。

C# 連接 MySQL 資料庫

我們寫的系統預定會連接後端資料庫,是故一定要知道怎麼用程式連接。因為我們選的是 .NET 平台,又因為 .NET 特性,只要函式庫支援 .NET,所有 .NET 語言都可以使用它。所以說 RFID 廠商提供的 .NET 函式庫我們可以在 VB.NET, VC#, VC++ 等語言使用。同樣的,MySQL官方網站有給 .NET 平台的 Connector 可以用:下載網址

沒解讀錯誤的話,這個套件使用 GPL 授權,這意味著使用的程式也要以 GPL 授權嗎?這值得玩味。

另外這個 Connector 有 Manual:點此開啟,連結的是 MySQL 5.1 版的文件,但應該相去不遠。


21.2.4 節
才開始教你如何建立 MySQL 連線並取得資料,這是寫程式時會用到的部分。

為了防止自行組合 SQL 字串而給駭客有 SQL Injection 隱碼攻擊的機會,很多函式庫會提供 PreparedStatement 等類似的方式來幫助程式設計師來組合字串。MySQL Connector/Net 也不例外,21.2.4.6 節有提到使用 Prepare() 方法。

其他等遇到再說。

C# 連接 RFID 開發工具

一般來說 RFID 開發工具會有讀卡機、幾張卡片 (Tag),就沒了。好一點的廠商會附送沒啥用的 Manual 和 Demo,但真正重要的還是 SDK。如果沒有 SDK 你知道要怎麼要求讀卡機讀取嗎?

據我研究,讀卡機利用 COM Port 與電腦以序列埠 (Serial Port) 連結,你只要開啟連線,丟封包給讀卡機,再解讀讀卡機丟回來的封包,就能完成工作。但封包的詳細規格因讀卡機的實作而有不同,我們手上的是 MIFARE 卡,也有書提到如何寫封包。但有輪子的話,何必自己造呢?沒錯,就是 SDK。我們透過廠商拿到了給 .NET 平台的函式庫,只要呼叫預先寫好的方法,就能順利跟讀卡機對談,輕鬆又方便。

當然,你也可以不使用函式庫,直接生成指定格式的封包以 Serial Port 通訊與讀卡機連線,但既然有更方便的方案,為何不使用呢?

Microsoft Visual Studio.NET 2008 Express Edition

我們的畢業專題將會採用 Microsoft 提供的免費開發工具 Visual Studio.NET 2008 Express Edition 來設計,其中 Visual C# 是我們選定的程式語言,因為它近似 Java,對於學過 Java 的我們來說,應該是最快上手的語言了。為什麼不選 VB.NET 的原因是本人認為 VB 的語言結構不夠物件導向,只是單純的硬塞的感覺,這只是本人自 VB6 所得來的印象。

因為要一次為每個成員都建置好環境,一般提供的線上安裝檔自然就不合用。還好有提供離線安裝 ISO 檔,可以下載後直接以虛擬光碟掛載安裝,十分省事。下載映像檔的地方在這裡,下方的 Offline Install 即可選擇語系並下載。

繁體中文版含 SP1 映像檔檔案大小:943MB。