Monday, March 31, 2008

My offen misunderstand things of CSharp

对于C#语言总有一些容易混淆的东西, 比如App Domain, lock语句块, 线程安全, deadlock和Content, 以及类的析构子和Finializer.
我总结了一个文章, http://docs.google.com/Doc?id=ddhzfwz6_1gkm272fd

Tuesday, March 18, 2008

Wonderful software-Task Coach


Keywords: Task Management, Track Task, Schedule management


Today, I visit the famious website--http://portableapps.com/apps,


And I found one good software, Task Coach. It is more powerful than outlook, sunlight.


From now on, I make one day schedule by using TaskCoach in the morning. I track my task by it.


Before I leave office I export the calendar from TaskCoach, and import it into Mozilla ThunderBird/SunLight to publish my task into google.




Tuesday, March 11, 2008

Monday, March 10, 2008

Study Use Case

Keywords: UML, Use case, 用例, Use Case Diagram, 用例图


这篇文章基本上是http://focuswindows.blogspot.com/2008/02/2-uml-tutorial.html的中文翻译, 该英文文档相当棒. 这节只关注Use Case.


1. 用例图的几个概念



Use Case Diagram是站在用户的视点去理解系统到底是什么样子的. 它关注于系统是什么, 而不关注怎样构建系统. Use Case Diagram由Actor、Use Case和Communication association(或者简称为Communication)组成. 怎样画Use Case diagram, 需要先明白Use Case和Actor概念.


Use Case是面向对象的概念, 所以我们要用面向对象的概念来理解Use Case,到底什么是UseCase呢? 我们开发的系统其实是真实世界中的一个对象, 那么这个对象对外提供的服务,可以说就是Use Case.


大家在讲Use Case的粒度问题的时候, 常犯的错误就是将该系统的服务的步骤, 当成Use Case. 步骤不是Use Case diagram关注的东西, (UML用Sequence diagram和Activity diagram来体现步骤)


Actor是目标系统的用户, 这个用户可以是人, 也可以是其他系统. 通常将用户按照角色分类, 就能确定用例图的Actor了.



2. 怎样画Use Case diagram



2.1 画Actor: Actor用一个小人表示.


2.2 画Use Case: Use Case是一个椭圆, 里面包含Use Case名.


2.3 画Communication: 用一个直线连接Actor和一个Use Case.


2.4 画System boundary: 用矩形表示, doundary圈住所有的Use Case.


2.5 理解Use case 之间的关系


2.5.1 Generalization关系, 这个关系和类的继承关系一样. 可以说derived use case就是Base use case的具体化(或者说是Base use case的一个实例). 比如刷卡付款和付款这两个用例, 就有generalization关系. 画法是:一条实线带一个实线箭头, 箭头指向Base Use Case.


2.5.2 Include关系, 包含关系很好理解, 如果多个Use case有相同的部分, 可以将相同的部分抽取出来, 这样新Use Case和原有的Use Case就有了Include关系.UML 画法是: 一条虚线带箭头, 箭头指向derived Use Case, 并且在虚线上打<<Include>>标记.


2.5.3 Extend关系, 表示一个Use Case是另一个Use Case的变种, 要注意它和Generalization的区别, Generalization关系就像基类和派生类间的关系; Extend关系就象是同一个基类的两个派生类之间的关系. UML画法是:一条虚线带箭头, 箭头指向参考的Use Case, 并且在虚线上打<<Extend>>标记.



3. 用例图的用处:



3.1. 协助我们来确定系统的feature或需求


3.2. 作为和Client沟通的材料, 因为用例图是站在用户的角度来理解系统, 所以特别适合和Client沟通.


3.3. 生成Test Case. 用例图会反映出系统会有哪些Scenario, 所以可以用来设计Test Case.



ScrewTurn Wiki Project(C#, Architecture Design)

Keywords: Wiki, ScrewTurn Wiki


There is a wonderful our source project, ScrewTurn Wiki(http://www.screwturn.eu/MainPage.ashx). Download the source and research it. You will gain a lot from it.


1. Multiple Database supported: By using plugin architecuture.


2. MVC Pattern: Wonderful layer division


3. Asp.net: Good code


4. How to build one web application and how make it deploy easily

all about .net framework 3.0(copied article)

All about .NET Framework 3.0 http://aspalliance.com/1351_All_about_NET_Framework_30.all


Published: 10 Jul 2007


Abstract


The .NET Framework 3.0 is the next generation of the .NET Framework that sits on the top of the previous version. It introduces some additional features, and in this article Hima discusses these features in detail.


Article Contents:


Thursday, March 6, 2008

Avoid using FileMode.OpenOrCreate to open stream

Keywords: C#, Stream, FileMode.OpenOrCreate


C#提供多种方式来创建一个具有不同读写权限的流, 这主要是通过设置不同的FileMode和FileAccess值来实现的. 我们如果要取得一个具有读写权限的流, 最好是用FileMode.Create和FileAcess.ReadWrite来获取. 源码后说明原因.



private void Test()
{
//get the main part of docx. The main part is just document.xml in docx package
PackagePart wordMainPackagePart=GetMainPart();

//load document.xml into wholeDocument object
XmlDocument wholeDocument = new XmlDocument();
using (Stream stream = wordMainPackagePart.GetStream())
{
wholeDocument.Load(stream);
}


//change the wholeDocument
//...

//save wholeDocument into document.xml. It is better avoid using FileMode.OpenOrCreate, we had better use FileMode.Create
using (Stream stream = wordMainPackagePart.GetStream(FileMode.Create, FileAccess.ReadWrite))
{
wholeDocument.Save(stream);
}
}


FileMode有几个枚举值:


FileMode.Append的意义是, 如果文件存在, 流定位到文件尾部, 新写的东西将追加到原文件尾; 如果文件不存在, 则新增文件. 这个FileMode只能和FileAccess.Write一起使用, 不能和其他的FileAccess同时使用.


FileMode.Create的意义是:如果文件存在, 首先删除文件的内容, 然后重写文件; 如果文件不存在, 则新增文件


FileMode.CreateNew的意义是: 如果文件存在, 则抛出一个异常; 如果文件不存在, 则新增文件


FileMode.Open的意义是,如果文件存在,再根据FileAccess的取值, 来确定可不可写; 如果文件不存在, 则抛出一个异常


FileMode.OpenOrCreate的意义是, 如果文件存在, 则重写这个文件, 重写的机制是不删除原有文件的内容, 那么从原文件头开始重写, 比如原有文件共10个字节, 新的内容只有5个字节的话, 则重写后的文件后5个字节仍是原有文件的内容.

FileMode.Truncate的意义是, 如果文件存在的话, 首先删除 文件的内容, 然后重写文件.


为什么我们推荐使用FileMode.Create呢, 因为FileMode.Create其实同时具有FileMode.CreateNew和FileMode.Truncate的效果, 即当文件存在的时候,它使用FileMode.Truncate方式重写文件, 当文件不存在的时候, 它使用FileMode.CreateNew来新增文件.






misunderstand when using XmlNode.SelectSingleNode function

Keywords: System.Xml, XmlNode, XPath


在使用System.Xml命名空间的XmlNode类, 有一个方法 XmlNode.SelectSingleNode(string xpath).


刚开始使用它时, 对它的作用理解有误. 如果XPath以"/"开始, 其意义为从根节点开始搜索Node. 原本想使用XmlNode456对象的SelectSingleNode(XPath123)方法, XPath123这个表达式所指的根节点应是XmlNode456, 但事实是, 这个函数仍以XmlNode456所在文档的根节点root作为搜索的起点.


要搜索Node456下的Child节点, 有2个方法, 最好使用方法2, 因为它更加简单.


方法1: 如果想通过SelectSingleNode()来搜索的话, 构建一个从根节点root指向Child的绝对路径的XPath, (XPath表达式应该以"./"开头)


方法2: 将Node456.OutXml赋值给一个tempXmlDocument., 然后再使用tempXmlDocument.SelectSingleNode(AbsoluteXPath), 可以定位到子节点. 这时候, 你可以用tempXmlDocument来直接提取Node456节点的内容, 如果还要修改Node456, 应该在修改tempXmlDocument之后, 再将修改后的内容保存到原有的Node456节点上.




XmlDocument tempXmlDocument = new XmlDocument();
//Load the xml from Node456
tempXmlDocument.LoadXml(Node456.OutXml);

//extract Info from tempXmlDocument
//...


//change the tempXmlDocument info
//...

//save the result after changed into the Node456
Node456.InnerXml = tempXmlDocument.DocumentElement.InnerXml;