2008年7月3日
学习软件开发的一种方法
本文是描述学习软件开发中条条大道中的一种,其中一些建议和流程也是非常适合于软件项目中的"救火"作业的.那下面我们就来看一下这种方法的具体操作流程:
1.首先找一个正规的IDE,这个非常非常的重要,所谓"工欲善其事,必先利其器"是也;据说JAVA社区中的IDE是五花八门,不过我认为在这一点上多不如精.比如MS.NET的IDE就是"只此一家,别无分店",你也就不必为这根本就不用挑的东西而费精力了(据说有个C#Builder,我在软件园中还没有发现朋友提到哪家公司是用的那个IDE).
2.了解一个项目应该先了解项目的框架以及工作类型,比如是WEB项目还是WINDOWS桌面项目.这样你可以把握整体上的一个大概的方向;C/S ,B/S项目的架构实质上是差别不大的,前端最大的差别具体体现在表现层及外观层,业务部分需要注意的是在同一时间段中的同一应用程序实例下B/S系统是多用户的,而C/S系统是单用户的.
3.采用实例法学习软件开发是最有效也是最好的一种方案,但是你最先动的不是程序代码,这往往是大家最想不通的,下面我讲一下之所以这么说的原因.
先要了解软件所要解决的问题,也就是业务需求;使你在大方向上有个把握.
然后再了解大概的解决方案,也就是概要设计文档;如果你有条件拿到详细设计文档那最好了,我所遇到的详细设计文档大多是对核心模块的核心处理过程的描述,这种文档可以是文字的,也可以是图表的.可以让你了解具体的实现理念即解决问题的思路和方法.
了解完一个项目的概要情况后,你需要在这个项目中找一下自己合适的位置,但这一点基本上不是由你来决定的.你会被安排在团队中的某一个角色中来为团队服务.你现在应该明白我为什么建议你先对项目的整体情况有个把握的原因了吧.在对项目尚没有个整体性的把握之前就给你安排具体的工作也是项目经理管理能力不成熟的体现.应急角色除外,但这种情况下也是需要先说明待你处理问题的起始点,终结点,以及处理方案和和约束条件的.
良好的团队会在软件开发过程中产生一系列重要的开发文档.这些才是你首先需要关注的东西.
4.了解完项目的总体情况后,这时你可以打开代码的解决方案了.如果我是你们的项目经理我会在项目解决方案的根目录中包括一份关于本解决方案框架的一些相关说明书,请注意我说的是"一些"而不是"一个".这些说明书可能包括变更日志(虽然你用了TFS,VSS,但是我还是建议你对于大的变更以及进展还是在解决方案中包含这样一份变更日志文件,具体的原因也就只能是仁者见仁,智者见智了),代码规范,解决方案架构,技术引用(比如本解决方案中具体使用了哪些设计模式,哪个实现特效,哪些特殊的设备)等.主要的目的是有利于新来的同事能很快的了解代码框架从而在短时间内融入我的团队.
2008年6月26日
电话只能接不能打了
今天下班时突然发现电话打不出去了,手机天线图标上有个怪异的小图标。
上网查了一下原因,有人报出是移动电话有两个线路:线路1和线路2。目前中国移动对线路1是接打模式,对线路2是只能接不能打模式。
回头查看我的手机设置,果然被设成了线路2。改过来后回到主画面发现天线图标上的小图标不见了又变成了之前那个熟悉的图标了。
仔细看了一下才发现原来那是个数字“1”,可能刚才那个怪异的小图标是“2”吧,于是又偿试调回到线路2。果然如此,那个怪异图标又重现了。
呵呵,看来手机上不懂的设置还是不要动了,免得紧急时刻电话打不出误事。
XML中处理带有命名空间的XPath查询
XML中使用了命名空间来区分结点,即如果XML结点中使用了非默认的命名空间则在使用XPath查询时必须指出其对应的命名空间,否则将找不到结点;
在查询XML结点时有两种方法来指定命名空间信息:1.通过XPath对像;2通过XPath字符串.
1.通过XPath对像来指定命名空间信息
XmlNamespaceManager xnm = new XmlNamespaceManager(xmlDocument.NameTable);
xnm.DefaultNamespace = "http://www.w3c.org/w2c";
xmlDocument.SelectNodes(xPath, xnm);
2.另一种方式是直接在XPath的字符串表达式中直接指出其结点的名称空间
string xPath=" /*[local-name()='OrderStatusResponseV10']/*[local-name()='OrderStatusResponse' and namespace-uri()='http://www.newegg.com/VXI/DataContract/OS/']/*[local-name()='ResponseDetail' and namespace-uri()='http://www.newegg.com/VXI/DataContract/OS/Response']/*[local-name()='PODetail' and namespace-uri()='http://www.newegg.com/VXI/DataContract/OS/Response']/*[local-name()='DataFrom' and namespace-uri()='http://www.newegg.com/VXI/DataContract/OS/Response']";
2008年6月23日
Ubuntu 8.04安装jdk1.6
首先我明确一下我的环境:
我是通过虚拟机安装的,宿主环境是windows xp sp3.
虚拟机是 virtualbox 1.6中文版
客户机是Ubuntu8.04
安装jdk
开始时我想下载那个.bin的jdk安装包,但又查到Ubuntu8.04上面有更好的安装方式如下:
sudo apt-get install sun-java6-jdk
如果你只想安装JAVA运行环境就用下面的指令
sudo apt-get iinstall sun-java6-jre
注意这两个命令会要求你管理员的权限。
我在安装的过程中并没有发现什么怪异的情况,有一个需要说明的是在安装过程中会弹出来个JDK的简介画面,在画面下部有一个确定按钮,一定要用TAB键选中然后按回车键,继续在旨出的“YES/NO”选项中依旧用TAB中选择确定后按回画。为了这个让我白等了好长时间,开始我以为是系统在后台执行,没想到是让我响应。看来LINUX的用户友好性还是差一些啊。
说明一下,apt-get的方式是在线下载的方式,如果你没有连接网络请不要用这种方式安装。我在安装的过程中中断退出过,后来重新执行后系统会从中断的地方继续安装,这一点非常好。
过几天我会介绍如何安装NetBens6.1中文版。
2008年6月21日
直接读取XML结点属性值
直接读取XML结点属性值
通过XPath
/PriceAvailabilityResponseV10/PriceAvailabilityResponse/ResponseItemCollection/ResponseItems/ResponseItem/VendorItemList/VendorItem/Price/@UP[.]
前面的都和读取结点一样,需要注意的是读取结点属性值的XPATH最后要加上[.]表示读取本属性的具体值内容。
这样有个好处就是,你可以直接把具体的属性值指定到XPath中通过XmlDocument直接读取出来,而不用先找到这个属性所在的结点,然后再通过结点读取属性值。
2008年5月28日
今天有需要写个配置类,在实现过程中遇到了一个系统异常。终于,今天这个异常让我有机会好好表明一下使用微软的开发环境所存在的困惑。
故障是这样的,先看一下下面的代码:
1
public class CroplandSection : ConfigurationSection
2
{
3
4
[ConfigurationProperty("Name", DefaultValue = "Cropland", IsRequired = true)]
5
[StringValidator(MinLength = 0, MaxLength = 15)]
6
public string Name
7
{
8
get
{ return (string)base["Name"]; }
9
}
10
11
[ConfigurationProperty("Age", DefaultValue = 23, IsRequired = true)]
12
[IntegerValidator(MinValue = 1, MaxValue = 99)]//如果指定了验证范围则必需在ConfigurationProperty特性中指明默认值,否则运行时报异常
13
public int Age
14
{
15
get
{ return (int)base["Age"]; }
16
}
17
18
[ConfigurationProperty("Address",DefaultValue ="DefaultValue", IsRequired = true)]
19
//[CallbackValidator(CallbackMethodName = "AddressValidator", Type = typeof(ConfiongrationExten.CroplandSection))]
20
[AddressValidatorAttribe("address")]
21
public string Address
22
{
23
get
{ return (string)base["Address"]; }
24
}
25
26
public static void AddressValidator(object address)
27
{
28
//实始时这里会被执行两次,默认值一次,配置文件中的一次
29
string a = address.ToString();
30
Console.WriteLine("CallBack:"+address);
31
32
}
33
}
在Age属性中我开始没有指定DefaultValue是多少,但我指定了其取值范围1~100,然后我就开始编译调试。一启动就报出异常:“
属性“Age”的值无效。错误为: 该值必须在 1-99 范围内。”
稍等,请看我配置文件里的内容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name ="Cropland" type ="ConfiongrationExten.CroplandSection,ConfiongrationExten"/>
</configSections>
<Cropland
Name ="Cropland"
Address="keji4Rd."
Age="39"
/>
</configuration>
Age为39,并没有超出上面所要求的范围限制啊。奇怪吧,我想了好久调了好久甚至我把Age换成别的字符也不行。没办法我从别处找了一个配置类看了看区别为它添加上了DefaultValue=23,这一回好了没有报错,但原因还没有找到。先不管,继续。
看上面类代码的最后一个方法
1
public static void AddressValidator(object address)
2
{
3
//实始时这里会被执行两次,默认值一次,配置文件中的一次
4
string a = address.ToString();
5
Console.WriteLine("CallBack:"+address);
6
}
这里面第次启动的时候都会被调用两次,我很纳闷为什么会被调用两次呢?
想了一阵才让我恍然大悟,也随即明白了刚才第一个古怪问题的答案来了,看了我下面的表述过程你也就明白了。
.Net的处理过程是这样的:
1、执行时先加载默认值,并在加载时验证默认值;
2、加载配置文件里配置的值,并在加载时验证;
3、如果有配置值则用配置值覆盖默认值。
这下就清楚了它为什么在指定了验证而没有配置默认值的时候会报异常,而且报的异常又似乎与实际情况不太相及:没有配置默认值(或系统需要默认值),而报出的异常却是
属性“Age”的值无效。错误为: 该值必须在 1-99 范围内。”
但如果搞明白了它的处理过程就很理解它这样报了。不过有多少人在使用一个产品的时候需要仔细的了解它的内部处理过程呢?类封装的目的不也是以提供标准接交互接口的方式对外提供服务而尽量对外忽略它的内部处理过程吗?
我想类假这种问题才是真真正正影响在这个平台上做开发的人吧。其实有异常不可怕,问题也困难也是能解决的。但让人恼火的就是这种表面上明明没有问题确给你报出问题的情况来。比如这件事中按系统报出的异常:
属性“Age”的值无效。错误为: 该值必须在 1-99 范围内。”。我检查了代码又检查了配置文件明明没有问题啊,但系统就是报出这样的异常来,而且还一幅不容置疑的样子。
这个问题的解答才让我明白为什么有那么多的开发人员不喜欢看微软的MSDN,抱怨MSDN里面讲的答非所问、语无论次了。
2008年5月24日
网上流行的操作系统虚拟机主要还是VMWare VPC2007 VirtualBox这三款。刚好我都用过,现就我的亲身体会写下来希望能有些许的意义。
下面我就从功能,性能,易用性上来为大家描述我的亲身体会
功能上从强往弱排依次是VMWare 6 VirtualBox 1.6 VPC2007。此排名次序中的VMWare 6我想是没有人提出异议,后两者可能存在争议,我来解释一下我这么排的原因。
首先VirtualBox支持USB设备,并且它可以把主机上插入的USB设备直接从虚拟机中识别出来;再者它跨Windows 、Linux两种操作系统平台。而VPC不支持USB设备,对于USB移动存储设备你则只能通过共享的方式实现宿主机与虚拟机之间的数据共享,那要是遇到像红我、蓝牙、视频头这类设备它就没戏了;另外它以被微软限制在自己公司的Windows平台上,Linux内核的诸操作系统在它里面不太好安装,不是花屏(RedHat 9)就是安装不了(ubuntu-8.04 提示处理器错误)。而WMWare 6 则继能跨Windows、Linux两种操作系统平台,而且支持虚拟Windows、Linux两类系统。
性能上从强到弱排依次是VirtualBox 1.6 VPC2007 VMWare 6。
我来讲一下我的亲深体验。首先我在同样的硬件环境中在VirtualBox 1.6 VPC2007中安装了 WindowsXP ,结果启动的时候很时显VirtualBox 1.6虚拟的XP要比VPC2007中虚拟的XP开机速度快了一大截。VMWare 6.5的开机速度和VPC2007比虽差不多但依然赶不上VPC2007。
易用性上从易到难VPC2007 VirtualBox 1.6 VMWare 6。
首先VPC2007在安装完虚拟操作系统中默认是与宿主机使用同一网段并在同一局域网中且两者可互相访问,感觉完全是同一局域网中的两台实体机。VirtualBox 1.6中安装的操作系统默义是采用NAT的方式使用宿主机的网络连接,如果宿主机可以上网,那么虚拟机也就可以上网了,再者它可以直接以局域网的形式访问宿主机,反之则不行。VMWare 6在安装完后也需要配置它安装在宿主机中的虚拟网卡,不过它可以配置成与宿主机在同一局域网中。
因此的观点就是:个人用户且需要虚拟两类操作系统那么可以选择VirtualBox 1.6,如果仅仅是虚拟Windows系统则请选用VPC2007,企业用户用于生产则推荐使用VMWare 6。
2008年5月16日
devenv.exe /setup /resetuserdata /resetsettings
前几天装了reSharper插件,它把我的快捷键等设置全改了,非常生气就删了它.我喜欢原装配置不喜欢被改得乱七八糟.但一时没办法改回来.就在 devenv.exe /?里面 看到有这个参数.后面的简介说得很清楚,恢复设置.
我把详细的列表及说明贴在这里:
Microsoft (R) Visual Studio Version 8.0.50727.762.
Copyright (C) Microsoft Corp 1984-2005. All rights reserved.
Use:
devenv [solutionfile | projectfile | anyfile.ext] [switches]
The first argument for devenv is usually a solution file or project file.
You can also use any other file as the first argument if you want to have the
file open automatically in an editor. When you enter a project file, the IDE
looks for an .sln file with the same base name as the project file in the
parent directory for the project file. If no such .sln file exists, then the
IDE looks for a single .sln file that references the project. If no such single
.sln file exists, then the IDE creates an unsaved solution with a default .sln
file name that has the same base name as the project file.
Command line builds:
devenv solutionfile.sln /build solutionconfig [ /project projectnameorfile [ /projectconfig name ] ]
Available command line switches:
/Build Builds the solution or project with the specified solution
configuration. For example "Debug". If multiple platforms
are possible, the configuration name must be enclosed in quotes
and contain platform name. For example: "Debug|Win32".
/Clean Deletes build outputs.
/Command Starts the IDE and executes the command.
/Deploy Builds and then deploys the specified build configuration.
/Edit Opens the specified files in a running instance of this
application. If there are no running instances, it will
start a new instance with a simplified window layout.
/LCID Sets the default language in the IDE for the UI.
/Log Logs IDE activity to the specified file for troubleshooting.
/NoVSIP Disables the VSIP developer's license key for VSIP testing.
/Out Appends the build log to a specified file.
/Project Specifies the project to build, clean, or deploy.
Must be used with /Build, /Rebuild, /Clean, or /Deploy.
/ProjectConfig Overrides the project configuration specified in the solution
configuration. For example "Debug". If multiple platforms are
possible, the configuration name must be enclosed in quotes
and contain platform name. For example: "Debug|Win32".
Must be used with /Project.
/Rebuild Cleans and then builds the solution or project with the
specified configuration.
/ResetAddin Removes commands and command UI associated with the specified Add-in.
/ResetSettings Restores the IDE's default settings, optionally resets to
the specified VSSettings file.
/ResetSkipPkgs Clears all SkipLoading tags added to VSPackages.
/Run Compiles and runs the specified solution.
/RunExit Compiles and runs the specified solution then closes the IDE.
/SafeMode Launches the IDE in safe mode loading minimal windows.
/Upgrade Upgrades the project or the solution and all projects in it.
A backup of these files will be created as appropriate. Please
see Help on 'Visual Studio Conversion Wizard' for more
information on the backup process.
Product-specific switches:
To attach the debugger from the command line, use:
VsJITDebugger.exe -p <pid>
2008年5月10日
2008年5月4日
Enterprise Architect
网上有许多关于EA的文章看了一圈教程很少也没有人专门对这款软件进行系统的介绍,好像也没有中文版。接触这个软件时间也不长,当时一看到这款软件就喜欢上了。何出此言,原因有四:体积小安装快此其一也;画面清晰直观此其二也;文档易得(据说的)此其三;所需要的功能基本上都已经覆盖到此其四也。
由于接触的时间不长,对它的一些功能不甚了解。今天来就是打个标记,以后会逐步有关于学习使用EA的记录提交上来。
今天的任务就是简单说明一下大致的情况和获取EA的途径和安装中需要注意的问题。可以从EA的网站 (http://www.sparxsystems.com.au/products/ea/trial.html)获取它的三十天试用版本,功能上没有被限制什么。对于我们学习来讲这个已经完全足够了,另外你可以把它安装在虚拟机里,就算时间到了也没什么关系,后面的我就不明说了大家智商都基本差不多。
下面我拍几张图:
启动画面(VPC虚拟机里,以下皆是)
主窗口画面
帮助
类型图概况