今天逛到的,Mono XSP 也可以支持 SSL,先收錄起來.
*UsingClientCertificatesWithXSP – Mono
Regex 101 Exercise
Today, I found an article – Eric Gunnerson’s C# Compendium : Regex 101 Exercise S3 – Validate a zip+4 zip code.
I think that I can practice my regular expression skill.
How to match these patterns using .Net regular expression??
98008
98008-4893
My answer is:
[0-9][0-9][0-9][0-9][0-9]-?[0-9]*
It seems stupid. There should be better solution.
Mono 與 GNU GetText
Debian Wiki上有提供 Mono 的中文簡介說明,裡面有提到與 GNU GetText 合作的方法.
GNU GetText 是 Linux 世界裡作 i18n/l10n 的一組 library.
這意味著 mono 也可以藉由 GNU GetText 來達到 i18n/l10n.
mono網站上提供了詳細的Tutorial可供參考.
以 .Net 本身來說,一般使用的方法是 Resource,原理差不多.
該怎麼選擇,就看開發者個人囉.
Delete via DataAdapter
這是一個慘烈的教訓,我搞了一天半.
我始終不明白,爲什麼我確實地在 DataSet 裡的 DataTable 去刪掉了一筆 DataRow, 但 Update 的時候卻無法成功?
Open source 就是有這好處,於是我開始 Trace mono 的 ByteFX.Data.
大致看了一下,發現幾件有趣的事情:
*在我們呼叫 xxxDataAdapter.Update 的時候,其實是呼叫 DbDataAdapter.Update.各個 Provider 並不負責這件事情.各個 Provider 是負責提供必要的資訊給 DbDataAdapter, 讓她去完成這件事情.
*xxxDataAdpater 的 DeleteCommand, InsertCommand, UpdateCommand 在
xxxDataAdapter da = new xxxDataAdapter(); xxxCommandBuilder xcb = new xxxCommandBuilder( da ); 的時候並不會被馬上組出來,而是在內部被呼叫 RowUpdating (真正要 Update)的時候,才被組合出來.
這些都跟主旨無關.回到正題.爲什麼無法刪除呢??
我使用的語法是這樣子,在我找到我要刪除的 DataRow 之後,我使用的是 DataTable.Rows.Remove( 我要刪除的row ).
很不幸,這會直接從 DataRowCollection 裡面直接刪掉.
但是 DbDataAdapter.Update 依賴的是 DataRowCollection 裡面各個 Row 的 RowState 來判定要新增,修改或是刪除. 如果 DataRowCollection 裡面並沒有這個 DataRow,那麼 DbDataAdapter.Update 也不會知道這個 DataRow 需要被刪除.
因此你在找到要刪除的 DataRow 之後,得用 DataRow.Delete() 才行.
這邊需要特別注意的是, Delete() 之後,不要使用 DataTable.AcceptChanges(),這個命令同樣會使得 DataRowCollection 採取和 Remove() 一樣的動作.
Delete() 之後再呼叫 xxxDataAdapter.Update(), 這樣就可以順利完成刪除動作了.
PageIndexChanged on mono 1.1.9.2
RSS 時刻表 (feedgator)
目的:收集 feed, 然後依照時間顯示最近的 50 筆
主要部份:
1. Crawler, 抓取 feed, 並安插到 Database
1.1 Remover, 週期性刪除,刪除資料庫中超過 30 天或特定天數的 feeds ( This is setting is in web.config, FeedExpiredDays )
2. 主頁面, 從 database 取資料出來顯示
3. Manage:
3.1 新增 feed url
3.2 編輯/修改 feed url 資料
Table 規劃:
feeditem ( author, guid, link, pubdate, title )
feedurls ( link, lastbuild )
其他事項:
1. 頁面美觀, 可以參考 lilina; 另外記得 DataGrid 可以做 grouping.
2. manage 部份可以引進 tab panel, 這樣就可以把 add 與 browse/edit/delete 放在一起了
3. 是否要支援 log4net 來存放 crawler 的 log??
4. 支援 atom?
後記:
其實這個小 project 已經進行一段時間了,都是間斷的寫…到現在還沒弄完…
寫的過程裡面學到不少東西:
1. Mono xsp 可以直接在 httpd 的 configuration 中設置就好(/etc/httpd/conf.d/mono.conf), httpd 會負責把 xsp(mod-mono-server) 叫起來.沒有以前那麼麻煩了.
2. Mono xsp 的 default encoding 需要在環境變數中指定, mod_mono 的設定裡面可以指定 (MonoSetEnv “LANG=en_US.UTF-8”),否則將會是 Apache 的預設 encoding (ASCII)
3. RSS 的 pubdate 用的是 universal time, 而非 local time.
4. MySQL 3.x 不支援 unicode, 或者應該說, bytefx.Data mysql data provider 會依賴 MySQL database 內的 codepage 設定來決定是否要轉碼,而 php mysql library 並不會.
5. nHibernate 尚未移植到 Mono
參考資料:
*Mono
*Mod_mono”
*RSS.NET: An open-source .NET class library for RSS feeds
Mono ByteFX.Data 與 encoding
ByteFX.Data 是 MySQL 的 .Net Data Provider, 同時提供有 mono 與 Microsoft.Net 的版本(微軟版本好像叫做 Connector/.Net).
這兩天在試著用 mono 與 ByteFX.Data 來存取 MySQL 資料庫.
但卻發現中文的字串在存入資料庫之後,全部都變成問號了.
原本以為是我編碼的處置或設定有問題,在經過 Trace mono 與 ByteFX.Data 的 source code 之後,才發現並不是.
我開始懷疑是 MySQL 的問題,我首先去問 Google 大神.
Google 大神告訴我,MySQL 在 4.0 以前並不支援 unicode, 資料庫預設的編碼是 latin1.
ok, 那麼為什麼使用 MediaWiki 或是一些 blog 卻可以存入 unicode 的字串??
又稍稍的 Trace 了 MediaWiki 的 source code, 並無驚人之處,也沒有什麼特別的處理,純粹就是 insert, update 而已.
最後我再回頭看 ByteFX.Data 的 source code, 終於找到問題所在.
ByteFX.Data 在丟封包到 MySQL 之前,會先依據 MySQL 的 encoding 進行編碼.
所以不管怎麼樣,我在 client 怎麼轉碼,到最後 ByteFX.Data 都會轉成 latin1,再進行存入.
是故,可能的解法如下:
1. 升級 MySQL 到 4.0 以後的版本.
2. 在丟資料庫之前,先把字串轉為 byte[], 如果是 byte[], ByteFX.Data 就不會進行轉碼,而直接存入. 但這樣在取出資料的時候,還需要再作一次工,將 byte[] 轉回 string.
解法 2 相當費事,而且以後如果要更換資料庫的時候,又會再受到一次衝擊.
看來解法 1 才是王道. 但是,懶得升級說… =_=
在 .Net 指定 proxy 的方法
其實只要在 Machine.config (也就是 xxx.exe.config) 裡面指定就可以了.
範例如下:
<configuration>
<system.net>
<defaultProxy>
<proxy
proxyaddress = “http://proxyserver:80”
bypassonlocal = “true”
/>
</defaultProxy>
</system.net>
</configuration>
此方法, .Net 與 mono 均適用.
參考資料:
*dotnetJiNi.com – Blogs @ Jignesh Desai
The LINQ Project(心得)
懶得把 LINQ 裝起來試….
目前只把 LINQ 與 DLINQ 的 overview 看完而已…
這邊做一個簡單的說明
LINQ ,實作類似 SQL Query 的語法來操作 collection
DLINQ, 解決 Relational DB 與 collection 之間的轉換與對應.
XLINQ, 解決 XML 文件與 collection 之間的轉換與對應.
VFP, 以 SQL Query 直接操作工作區或 Relational DB
看出 LINQ 與 VFP 的不同了嗎??
VFP 的確很強大,已經把 Query 資料庫的技術發揮到極致,但缺點是很難對應到物件導向世界,物件導向的世界裡面一切都是物件,只有 class / object, 而沒有 database. 很多同類的物件在一起,是 collection, 是 container, 而不是 database.
LINQ 則是直接對 collection 操作.
目前很多人對 DLINQ 頗有微詞的地方,是在於 DLINQ 使用了 attribute 去為 class 的 member 貼上資訊,在與 Relational DB 對應的時候,就依照這些 attribute 來做對應.這樣會使得相依性過高.
這部份,我也不知道怎麼樣會是比較好,但 nHibernate 看起來是一個不錯的選擇.
其他可以參考的開源ORM專案:
*Gentle.NET
*iBatis
*nHibernate
The LINQ Project(補)
剛剛用 Google 新推出的 Google blog search 去找
發現了一大堆…
http://www.google.com/blogsearch?hl=en&q=LINQ&btnG=Search+Blogs&filter=0&sa=N&start=10
這篇文章的標題:Project LINQ – Can it be done in VFP?
還蠻吸引我的…
果然裡面又批了微軟一頓
還寫了一個程序”Visual FoxPro Object-Oriented SQL (VOSQL)”來證明 VFP 的強大.
其他參考資料:
*Linq and C# 3.0
*Language Integrated Query (LINQ) feedback
*Project LINQ and XML – Some reflections
Another, c# 3.0 對 functional programming 的新寫法
*Functional programming in C# – Reloaded!