个人资料
博主公告

版权声明:

   本博客所有原创内容,如有转载请务必与本人联系,否则一律视为侵权!

 

联系方式:

欢迎MSN联系!

欢迎留言联系!

博主视频教程
分类
    内容读取中…
图片幻灯
评论
读取中...
博文
置顶:王继彬的原创IT视频教程(2008-08-15 16:26)

欢迎转载,但必须注明出处:(http://blog.sina.com.cn/jbwang)

以下是本人的原创视频教程(最后更新日: 2009-10-07):
在线观看:点击视频名称链接,则可以进入在线播放模式;
下载观看:点击下载链接,则可以进入下载页面,选择合适的下载方式即可下载;

实战系列视频:

视频名称

作者

时长

下载

说明

典型三层结构程序设计教程  王继彬  2小时 [1] 详细介绍UI、BLL、DAL三者之间的分工与合作,以及如果在项目中应用。
 典型权限控制原理和实现  王继彬  2小时 [1] [2] 未完... 介绍典型的权限控制原理(用户-角色-权限),以及在项目中的具体实现和技巧。
 WinFrom开发全实例视频教程  王继彬  3.5小时 [1] [2] [3] 通过若干个实用例子,全面介绍.Net平台下的桌面应用程序的开发流程。
 C#开发扫雷游戏教程  王继彬  3小时 [1] 完全从面向对象的角度来开发此游戏,同时介绍了软件公司中开发文档格式。
 C#开发计算器教程  王继彬  1.5小时 [1] 开发类似于Windows自带的计算器工具,希望给初学者一个入门的参考资料。
 C#开发资源浏览器教程  王继彬  3小时 [1] [2] 开发类似于Windows的资源浏览器,介绍IO操作以及UI设计规范等内容。

控件使用技巧系列视频:

视频名称

作者

时长

下载

说明

 TreeView控件使用技巧  王继彬  1小时 [1] 介绍TreeView控件的用法和实用的开发技巧。
 Timer控件使用技巧  王继彬  0.5小时 [1] 介绍Timer控件,并利用它开发一个滚动字幕。
 ListBox控件使用技巧  王继彬  1小时 [1] 介绍ListBox控件,并开发左右选择的功能。

商业项目系列视频:

视频名称

发布日期

作者

时长

大小

下载

 进销存项目视频  2009-06-10  王继彬  40小时 2.7G [详情] (节选: [1] [2] [3] [4] [5])
 网上银行项目视频  2010-01-01  王继彬  40小时 2.5G [PPT预览] 

下载说明:

所有视频都采用了最佳的编码格式,以保证用最小的视频包含最多的内容,缩短下载时间。
    选择从事软件开发,就选择了与挑战为伍。时下这个年代的软件开发已经不再是上个世纪的软件开发了,那时候基本上你选择一种开发语言和一个开发环境,就可以吃饱饭,而且还可以吃得很好。然而在软件行业发展到今天,我们有无数种开发语言,有无数种开发理念,有无数个框架,这些东西为软件开发的各个领域带来了便利,这是积极的一方面。但是也有消极的一方法,往往在众多的选择面前,会让你手足无措。

    如今,单单靠使用一种编程语言,即便你炉火纯青、登峰造极,也算不上是一个优秀的软件开发者。那么到底怎样才可以在日新月异的软件开发技术面前,可以立于不败之地,做一个软件开发的常青树呢?

1、至少掌握两种开发语言
    毕竟软件开发还是要靠开发语言的,这是立足之本。那么为什么至少要掌握两种以上呢,因为每种开发语言都具备它的优势和不足,并且都有自己的一套理念。掌握多种语言的目的,一是为了综合各家之长处,二是要融汇贯通。如果这两种语言不是一个派系的语言那就更好了(如C++和Java)。

2、至少掌握两种程序设计思想
    时下是面向对象设计思想的天下,很多人认为凡事都面向对象那就万事大吉了。程序设计思想就如同文化历史一般,几千年的历史就是在改朝换代的模式中不断前进的。程序的设计思想也同样是百花齐放,只不过当前是面向对象比较主流而已。要知道,即便是面向对象占绝对主流的今天,很多软件也并不是采用这种思想来开发的,比如Windows本身。任何一种设计理念最终有一天都将成为过去和历史,我们只要通过两种以上的设计思想的掌握,达到掌握了软件设计的本质,那才可以永垂不朽^_^。

3、至少掌握两个领域专长的知识
    软件本身并不能创造价值,它需要为别的领域服务才可以体现其价值。我预期在将来,领域软件才是真正的高回报软件。作为一个优秀的软件开发者,不应该依赖于需求分析人员对特定领域的分析,不应该依赖于市场分析人员对特定市场的分析。而要培养自己的领域专长,这样才不会让自己沦为写代码的机器。一个只会写代码的程序员当然不会永远被重视,但一个有思维有活力有领域专长和市场洞察力的开发者,那就大大不同了。

4、至少懂得跟两类人进行沟通
    人是社会人,所以离不开社会,离不开沟通。软件开发又是多人合作的行当,单枪匹马总会显得势单力薄,难成大事。因此软件开发中最重要的技能之一就是能够与其他开发者一起高效工作——程序员,测试员,架构师等等。另外还必须跟软件的受众进行充分的沟通——客户,用户,老板等等。如果你能够很好地处理这些关系,那么成功的大路也就离你不远了。

5、要博客、写文章、与人交流
    有谁能够记住每件事?我不能,所以我把它们记下来。当需要的时候,可以回头翻阅参考。除此之外,可以借此从读者那里获得反馈,让我对同样的问题收获更多的解决方法。事实上,我已经获得了许多与我工作有关的反馈,虽然有好有坏,但我会一一验证,这个过程也让我受益匪浅。

    其实还有很多很多,比如:要保持自我学习和完善的习惯、停止无休止的抱怨、等等......在此就不逐一罗列了。最后,请记住不要永远只做个程序员。一旦自我满足并觉得自己是个优秀的程序员,就得重新规划你自己,扩展兴趣。搞开发只是这个过程的一部分,了解用户和商业,那才是真正的艺术,每个人应当以此为目标并努力掌握它。
    最近开发一个短信平台项目,基本上就是把业务系统中相关的数据以短信的形式发送给客户。功能类似于网上银行的短信提醒功能。由于具体的业务系统是其他公司的产品,并且该产品并没有为二次开发提供接口,这样我们就无法获取动作事件,也就不知道在什么时刻应该给哪个客户发送什么样的短信。

    为了解决这个问题,考虑另外一种解决方案。就是创建一个Windows服务(Windows Service)程序,利用此服务进程来检测业务系统的数据库变化,当满足特定条件时,即调用短信发送模块发送短信。这里就涉及到Windows Service的开发,在此仅以此为例,介绍一下Windows Service的一般开发步骤。

其实在Visual Studio中创建Windows服务是很简单的事情,一步一步创建并安装即可。

第1步:创建服务
在VS中创建一个 Windows 服务(Windows Service)项目,我们可以看到向导自动在工程文件中增加Service1.cs这个组件,在属性窗口我们可以看到这个组件有一些列属性:
1)Autolog :是否自动写入系统的日志文件
2)CanHandlePowerEvent :服务时候接受电源事件
3)CanPauseAndContinue:服务是否接受暂停或继续运行的请求
4)CanShutdown:服务是否在运行它的计算机关闭时收到通知,以便能够调用 OnShutDown 过程
5) CanStop:服务是否接受停止运行的请求
6) ServiceName:服务名

第2步:向服务中增加功能
Service1 .cs代码文件中我们可以看到,有两个Protected的函数OnStart和OnStop。
OnStart函数在启动服务时执行,OnStop函数在停止服务时执行。
protected override void OnStart(string[] args)
{
        //在这里加入服务启动时候的业务逻辑即可。
}
protected override void OnStop()
{
        //在这里加入服务停止时候的业务逻辑即可。
}
对应我们这个短信平台来说,在服务启动的时候需要检测短信发送设备是否连接成功等功能;在服务停止的时候需要释放一些串口资源,这里我就不详细说明了。
需要说的一点是,这个系统需要定时检测业务系统数据库,所以我们可以利用Timer组件来实现这个定时操作。这些主要的业务我们都在一下这个事件中处理:
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
        //这里是监测DB,并发送短信的主要业务逻辑。    
}
这里的Timer控件要注意,不是System.Windows.Form下的Timer,而是System下的Timer。最简单的辨别方法是看Timer控件的默认事件名,如果是timer_Tick则是System.Windows.Form.Timer,如果是timer_Elapsed,则是System.Timer。

第3步: 将安装程序添加到服务应用程序
Windows服务的安装与正常的应用程序安装不同,它需要把服务注册到服务控制管理器当中。这个过程实际比较复杂。但是VS都已经为我们做好了,只需要在Service1上鼠标右键选择【添加安装程序】,则可以添加ProjectInstaller组件。要正确安装服务,并不需要在安装程序中进行任何特殊编码。但是,如果需要向安装进程添加特殊功能,则可能偶尔需要修改安装程序的内容。
在ProjectInstaller有ServiceInstaller和ServiceProcessInstaller两个组件,通过简单设置这两个组件的属性就可以配置我们的Service1的一些特性。
1)确定如何启动服务,单击 ServiceInstaller 组件并将 StartType 属性设置为适当的值。
Manual      服务安装后,必须手动启动。
Automatic    每次计算机重新启动时,服务都会自动启动。
Disabled     服务无法启动。
2)确定用户启动规则,单击 ServiceProcessInstaller组件并将 Account属性设置为适当的值
LocalService
NetworkService
LocalSystem
User
将Account属性改为 LocalSystem,这样不论是以哪个用户登录的系统,服务总会启动。

第4步:生成服务程序
通过从生成菜单中选择生成来生成项目。注意,不要通过按 F5 键来运行项目——不能以这种方式运行服务项目。

第5步:安装服务
Windows服务的安装,我们需要用到VS提供的一个命令行工具InstallUtil。我们进入Visual Stuido命令行工具后:
键入InstallUtil Service1exe即可安装服务;
键入InstallUtil /u Service1exe即可卸载服务;


    成功者找方法,失败者找借口;蠃家说有可能,输家说不可能。如此简单而已!

 

在工作圈子内,在参与的各个项目当中,我总能见到许多乐于尝试创新的人。这些人认为:未来虽有不确定性,但总应该试试看,因为“有可能”获得成功,进而产生有价值的影响力。当然,我也总是看到另一批人,他们见到一个新的提案时,不假思索的第一个反应就是“不可能”,而且总有各种千奇百怪的理由来证明自己的这种“不可能”判断,并试图说服大家,让大家也都认为这一切是不可能的,从而停止或放弃新的尝试。

 

在职场上,不难发现把“不可能”这三个字挂在嘴边者大有人在。他们总是担任永远的“反对势力”,但却也总是没有其他任何更好的主张或建议,仿佛他们的角色就是否定而不需要建设性地解决问题。俗语说:成功者的字典里,没有不可能三个字!在成功者的眼中总是看到机会,他们会绞尽脑汁去想办法,他们面对事情的态度是积极的、勇于挑战的,越是不可能成功的事,对他们来说越值得去征服。

 

天底下没有不可能的事,起决定作用的是你选择什么样的态度去面对,用什么样的方法去解决问题。在不景气或市场低迷的情况下,总有些企业的业绩逆势独秀。假如人人都在惯性思维下宁愿相信“不可能”而不愿意去寻找可行的办法,不仅是自己失去信心,而且会严重打击组织或团队的士气。很多事实证明“不可能”只是暂时性的,只是在已有的经验法则之下无法立即找到解决之道。

 

    当遇到难题时,别让“不可能”三个字束缚自己的思维。有时候只需要换另一个角度思考,转换立场去探讨,更积极往前迈进,或者坚持一下,“不可能”就会变成“有可能”甚至“很可能”。成功者之所以能成功,除了他们能忍受过程中的各种艰辛、磨练、挫折,甚至旁人的嘲弄以外,也因为他们对“不可能”多了一分不肯低头的韧性和执著。自古以来,赢家总是因为愿意并做成了其他人不愿意做、不敢做的事情。

 

   

    新买的ThinkPad T400,本人一向不喜欢用自带的傻瓜恢复盘,总觉得那玩意儿太傻。于是自己格式化磁盘并安装WindowsXP(注:虽然已经预安装了OEM的Vista了,非常之不喜欢Vista,卸掉没商量)。

 

    以上纯属个人爱好,请勿模仿!

    这里主要想说一个问题,只要自己手动安装WindowsXP,每次都会碰到蓝屏如(STOP:0X0000007B)等字串)的错误,没有办法安装。这个问题一开始着实让我很是不爽,因为是新机并格式化磁盘,故基本可以排除病毒捣乱,所以就让人难免会想到是磁盘出现问题了。后来一分析,不大可能,毕竟这是ThinkPad嘛!

 

    言归正传,介绍一下这个蓝屏错误的解决办法。首先,说一下出现蓝屏错误的原因:就是ThinkPad自从T60/R60/X60开始改用SATA硬盘,而其BIOS中SATA默认的模式是AHCI(高级主控接口)。就是这个导致安装Windows XP出现蓝屏错误的。

 

    知道原因了,那解决就容易了。首先开机按f1进入BIOS设置,进入CONFIG,然后在SATA里面将SATA的模式设置compatibility (兼容模式),默认的是AHCI模式(高级主控接口)。然后按F10,回车,退出BIOS设置。再从新安装Windows吧,涛声依旧!!


    父母把你生下来,你的身体就是一台计算机,而上面运行的软件就是你的思想,这个软件版本高低功能的强弱,就看你的思想境界。思想软件需要你自己慢慢地去编写,可能父母教给了你最基本的语言,但是其他的高级语言和技能需要你长大以后要自己去学习,你能精通几门语言是你的本事。

 

  第一步,随着你渐渐的长大,你开始有了需求,各种各样的需求,一开始你只是想要一块巧克力糖,一个新书包,一件新衣服,一辆崭新的自行车;后来你可能就想要一栋房子、一辆好车,你开始追求高质量的的物质生活、精神生活,你追求成功与快乐、还要求更好的发展,希望得到别人的尊敬,过一份有尊严的生活。需求很多很多,仔细分析你的需求,想想你最想要什么?怎样去实现它。

 

  第二步,是很关键的一步,你要设计自己的人生程序。你首先要概要设计,你希望将来成为一个怎样的人,分几大步实现这个目标,少年、青年、成年、中年、老年。可能有求学程序、出国程序、恋爱程序、求职程序、事业程序、升职程序、结婚程序等等。概要设计后还要进行详细设计,你每个月每个星期做些什么,每个小模块里面有每个阶段的小的目标,小程序,这个星期读完一本书,下个月参加考试,然后写一篇论文等等,虽然说人生不可能完全规划出来,但是经过设计的人生远远比没有设计过的人有更有意义,好好的设计你的人生吧。

 

  第三步,是编码和测试,你大多数时间都在不停的编码,同时还要不停的测试,编码的过程十分的辛苦,需要耐心和思考,你会觉得苦闷、烦躁不安、寂寞、痛苦、迷茫与无奈,但有些时候又十分开心、兴奋虚荣、骄傲和满足。编码的过程充分体现了人生琐碎与不如意和艰难,bug永远存在,人生也在不断的犯错误和不断地总结。就像一个程序不能编写得完美一样,人生也是不完美的,你不可能处处要求完美,很多地方需要同别人交流和互相借鉴。测试可以分为内部测试和外部测试,经过测试,你发现自己的错误,并想方设法改正它,然后成长起来。

 

  第四步是集成和软件发版,你的设计的人生软件要拿到市场上去卖,能不能卖上好价钱,要看软件的功能和特色,性价比、看软件的包装,你有没有高人一等的杰出才能,你有没有于其它软件相比的竞争力,软件的价值,也就是你人生的价值。当然你可能是一个很高尚的人,编一些免费的软件,不做比尔盖茨,做linus torvols也挺好的,在自由的空气在互联网上空飘荡。看你自己的选择!不过这个世界好像更欢迎前者,linus住在拥挤的民用公寓里。而比尔盖茨住在自己像皇宫一样的豪宅里面当帝王,你首先要解决生存的问题,然后再去考虑其他得东东。

 

  好好的谱写你的人生程序,人这一辈子真是要追求点什么才有意义!

 

  宽泛地讲,需求来源于用户的一些“需要”,这些“需要”被分析、确认后形成完整的文档,该文档详细地说明了产品“必须或应当”做什么。所以如果只有一些零碎的对话、资料或邮件,你就以为自己已经掌握了需求,那是自欺欺人。需求是产品的根源,需求工作的优劣对产品影响最大。我们经常看到的是:人们并不清楚究竟该做什么,但却一直忙碌不停地开发。

 

需求调研中面临最普遍的问题是:用户说不清楚需求。

    有些用户真的不知道需求是什么,或者对需求只有朦胧的感觉,例如,早期的政府信息化项目用户通常只有一个朦胧的信息化感觉而已,需求分析中会这样写:'总之,要实现那种能够想到就能做到功能!'。如果需求调研人员的水平比较高,他就能够在用户不清楚自己要什么的情况下引导用户“消费”。

  有些用户虽然心里明白想要什么,但却说不清楚需求。 比如说买鞋子。我们非常了解自已的脚,但很难用语言说清楚脚的大小和形状。通常拿鞋子去试,试穿时感觉到舒服才会买鞋。一些企业的信息化项目,每个子部门对自身的需要很清楚,但不知道如何从系统角度来要求。

  

需求分析的结果——需求分析说明书:

  需求开发的目的是通过调查与分析,获取用户需求并定义产品需求。根据需求调查和需求分析的结果,进一步定义准确无误的产品需求,产生《产品需求规格说明书》。一个良好的需求说明书,应该有如下特征:

1 正确并且清楚
    需求规格说明书应当正确地反映用户的真实意图,开发者和用户自己都要明白用户究竟“想要什么”和“不要什么”。为确保需求是正确的,开发方和用户必须对《需求规格说明书》进行确认。
清楚的需求让人易读易懂,包括文档的结构、段落等是否清晰。

一致并且无二义性  
    “无二义性” 是指每个需求只有唯一的含义。
“一致”是指各个需求之间不会发生矛盾。矛盾常常潜伏在需求文档的上下文中。

必要并且完备  
    开发者应当集中精力先完成必要的需求,如果条件允许则再做“锦上添花”的需求。为了避免主次颠倒,应当在《产品需求规格说明书》中将那些“锦上添花”的需求设置为较低的优先级。
“完备”是指《产品需求说明书》中没有遗漏一些必要的需求,比如是否覆盖了所有的功能、性能、交叉、安全等需求。

 

需求变更——让我们热烈欢迎它吧!

  需求变更通常会对项目的进度、人力资源、经费产生很大的影响。如果在项目开发的初始阶段,开发人员和用户没有搞清楚需求或者搞错了需求,到了项目开发后期才将需求纠正过来,会导致产品的部分内容需要重新开发。这是要坚决避免的。

  如果由于市场变化而导致产品需求发生变更,开发商大可不必为此烦恼,应当高兴才对。倘若市场静如死水,那么开发商吃了“上一顿”就没有“下一顿”。正因为市场在变化,才会产生更多商机,聪明的开发商才会有活干,有钱赚。 

  其实需求变更并不可怕,可怕的是需求变更失去控制,导致项目混乱。所以需求变更控制是需求工程的重要活动。如果需求变更带来的好处大于坏处,那么允许变更,但必须按照已定义的变更规程执行,以免变更失去控制。 如果需求变更带来的坏处大于好处,那么拒绝变更。

  需求变更控制过程中最难办的事情是莫过于“拒绝客户提出的需求变更请求”。通常情况下开发方是不敢得罪客户的,但是无原则地退让将使开发小组陷入困境。解决这个问题的一个办法是事先建立规则:如开发方与客户方达成“事不过三”的约定,即允许客户变更三次需求;如果客户第四此变更需求,开发方有权提请客户补偿开发投入。

    需求变化是开发人员最讨厌的一件事了。可是,就像我们常说'哭不能解决问题'一样,讨厌能解决问题吗?拒绝客户的变更要求,要求客户在需求规格说明书上签字。这些做法只能是适得其反。没有任何正面的、积极的意义。需求变更要求我们的开发工作要迭代式进行,包括需求、设计、实现等阶段。这样才能将变更风险减到最小。

  

格式化一个文件的大小,虽然很简单,但却是很常用的,这里分享一个C#写的格式化文件大小的方法:

 

public static String FormatFileSize(Int64 fileSize)
{
    if (fileSize < 0)
    {
        throw new ArgumentOutOfRangeException('fileSize');
    }
    else if (fileSize >= 1024 * 1024 * 1024)
    {
        return string.Format('{0:########0.00} GB', ((Double)fileSize) / (1024 * 1024 * 1024));
    }
    else if (fileSize >= 1024 * 1024)
    {
        return string.Format('{0:####0.00} MB', ((Double)fileSize) / (1024 * 1024));
    }
    else if (fileSize >= 1024)
    {
        return string.Format('{0:####0.00} KB', ((Double)fileSize) / 1024);
    }
    else
    {
        return string.Format('{0} bytes', fileSize);
    }
}

 

        private string ToBigNumber(long number)
        {
            // 12345 一万贰仟叁佰肆拾伍
            string[] mm ={ '', '拾', '佰', '仟', '万', '拾', '佰',

                          '仟', '亿', '拾', '佰', '仟', '万' };
            string[] dx = { '零', '壹', '贰', '叁', '肆', '伍',

                      '陆', '柒', '捌', '玖', '拾' };

            if (number == 0)
            {
                return dx[0];
            }
            string numberStr = number.ToString();
            if (numberStr.Length > mm.Length)
            {
                throw new UserException('can not parser number, as it it too long.');
            }
            StringBuilder buff = new StringBuilder();
            int flag = 0;
            int preNum = -1;
            for (int i = numberStr.Length - 1; i >= 0; i--)
            {
                string currentBit = numberStr.Substring(flag++, 1);
                if (int.Parse(currentBit) == 0)// deal with 0.
                {
                    if (preNum != 0)// deal with 000
                    {
                        buff.Append(dx[int.Parse(currentBit)]);
                    }
                }
                else
                {
                    buff.Append(dx[int.Parse(currentBit)]).Append(mm[i]);
                }
                preNum = int.Parse(currentBit);
            }

            //remove the latest zero.
            string result = buff.ToString();
            if (result.EndsWith(dx[0]))
            {
                buff.Remove(buff.Length - 1, 1);
            }
            return buff.ToString();

        }