博文

李开复谈中国软件 (2005-05-10 13:58:00)

摘要: 很多人爱拿印度和中国比。人力资源方面两边都很强,相对印度,中国很大的优势是本身有很大的市场。印度的IT技术、软件外包方面有很多中国学习的地方,这方面印度甚至可以说占据世界的第一位。但印度没有像中国这么健全的本地市场,印度的软件开发集中在少数几个城市,但是并没有匹配的传统工业,而更多的是乡村。而中国有很多的传统产业,产业结构健全,很多产业也做得很出色。   中国的软件业应该是双管齐下。   一方面是做好已有的市场和产业。   另一方面是发展外包。   在财务、管理、运作等应用类的软件方面,都是很好的方向。对于中国企业的要求,中国软件在中国市场具有很高的占有率是很合理的事情。   我认为应选一个中国处于世界第一或者一流的市场。在这个市场做个测试点,冒些风险,做些新的投资,不管这个投资是新的网上服务、手机软件甚至硬件也有可能。因为中国具有很大的市场,中国的软件商占有一个优势,先开发,先尝试,中国成功后自然推到国外。除此之外,为了铺好基础,中国公司也应该愿意借一些较基础的项目,例如软件测试。   从上到下树立诚信至上的观念,对上市公司财务报表做到诚实准确。   相对可以说,外包才是市场真正需要的核心技术,有人说操作系统是最核心的技术,有多少外包的工作和有多少人需要的工作是操作系统的工作?大部分人需要的是财务软件、数据库合成等方面的工作,这些才是真的有市场价值的。   《李开复谈软件外包及软件安全》 ChinaByte 2003年11月05日   中国的软件产业在21世纪将拥有很多机会,但同时也会伴随诸多挑战。   第一个机会,中国的经济发展将为软件产业提供强有力的支撑。与印度相比,虽然中国目前的软件行业总产值远小于印度,在软件开发管理等方面也有许多不足之处,但中国却拥有世界上成长最快的国民经济和传统企业。而中国传统企业的信息化,还存在很大的发展空间。   第二个机会是外包。外包已成为全球IT业的一个趋势,美国和其他国家的公司希望将更多的IT工作外包到印度或中国,这会产生很多商机。   外包对中国来说,是一个很好的契机,但是不该是最终的目标。中国可以利用外包,训练出一批优秀的技术人员。中国也可以利用外包,训练一批在商业、业务、流程等方面有经验的管理人员。   第三个机会,中国可以获得跨越世界的领导机会。当世界上大部分人在做应用软件开发的时候......

阅读全文(50361) | 评论:0

把图片文件存到数据库时, 在通过WEB页查询时动态生成(2005-05-10 13:55:00)

摘要:需求是: 1.网站需要提供图片上传 2.图片不能用文件的方式保存, 只能保存到数据里. 3.查询页面里动态生成图像.     一般都是用保存图片文件的方式, 在服务器上找个地方存下来, 然后数据库保存这个文件的WEB链接. 但是如果不允许用保存文件的方式, 而要求必须将图片数据直接存在数据库里呢?     第一个问题是解决上传和保存的问题. 比如有一个网站提供DVD的资料, 用户可以自行加入新的DVD介绍文字和一个说明图片进去. 介绍和图片都放到数据库里, 文字资料不用说了, 主要是图片.     以SQLSERVER为例:     在SQLSERVER里建一个表来保存相关的信息,  如dvdimg, CREATE TABLE [dbo].[DvdImg] (      DVDID [int] NOT NULL ,      Img [image] NULL ,      filetype [char] (10)  NOT NULL ) ; DVDid是关联到DVD主信息表的DVD唯一识别符, 为了让数据库快一点, 我把数据和图像分开了. 在上传页面上放一个文件上传控件,  就是下面这个东西: protected System.Web.UI.HtmlControls.HtmlInputFile fEDImg; 名字就是: fEDImg 加一个保存按钮, 写个click事件的处理, 把数据insert到数据库里, 咱们主要说保存图片的这一段.              if (this.fEDImg.PostedFile.ContentLength != 0)        &......

阅读全文(44008) | 评论:0

整理出来的得到汉字拼音的代码(2005-05-10 13:53:00)

摘要: using System; using System.Text; namespace HXBTools.Util   {    /// <summary>   ///   /// </summary>   public class py    {    public py()     {     //     // TODO: 在此处添加构造函数逻辑     //    }    public static char GetPyChar(char c)     {     return GetPyChar("" + (char)c);    }    public static char GetPyChar(string strName)     {     short code;     if (strName == "" )      return ' ';     code = GetGB2312Code(strName);           // 英文字符区     if( code >= 32 && code <= 126 ......

阅读全文(34041) | 评论:0

成功程序员的七个秘密(2005-05-10 13:50:00)

摘要:7项使你成为开发者社区出色成员的技巧 1.为人的需求编码 计算机界的一个最普遍的误会是认为原始码是为计算机服务。计算机是工作在低级的二进制代码上,是在一系列的难以理解的1或0或者十六进制数字之上,而不是我们敲入的结构化高级计算机语言。 这些语言被开发出来的目的是为了帮助我们程序员。 在实践中,为人的需求编码通常意味着首先要有清楚透明的结构和思路,其次才是效率和速度。 2.经常的好的注释 注释是为人的需求编码的一种极端的语言元素例子。大多数编译器都会将注释与可执行程序分离开来。 注释的目的就是要告诉你(或者其他将来的开发着)程序的功能是什么。 把这些写进注释 - 并且避免只是简单重新叙述代码。 好的注释: Disable button to prevent its activation 糟糕的注释: Set cmd = False 一个很好的检验注释的标准是:如果只有注解没有去掉,有人能够知道你的程序的作用吗? 3.良好代码布局增加易读性 正如一位作家将一本书分成章和段落以帮助阅读,因此开发者考虑代码如何布局如何能能增强代码的易读性也是非常重要的。 特别在任何语句结构块中 (如 IF. . THEN. . . ELSE语句快) 和任何循环结构(如 WHILE. . . END WHILE) 代码应该缩进以便于很容易分清楚哪里是开始哪里是结束。 4.预测并处理 那意想不到的事情 你打开一个文件之前,确定文件为当前文件。你将焦点设定为控件之前,确定控制是看得见的并且可用。设法找出在什么条件下使你的代码失效,并在你的程序崩溃之前测试它。 5.命名变量增强易读性 有许多策略进行变量命名。首要原则是一致性和尽可能的能通过命名变量提供足够的信息。如果你命名一个变量为nMonth,你提供给程序员的信息是这个变量将被设计用来存储什么内容。 我自己倾向于使用匈牙利的命名风格 - 但是无论你使用哪一种风格,一致性是最主要的。 6.使你的方法和过程保持简洁 一个方法或者过程理想状况下应该只做一件事情。在我的经验方面,最大的误区是,一个过程通常被设计来完成许多的不同操作。 应该将他们按不同的操作拆分成各个不同方法处理各自的事情,这样各个功能可以很容易被重用,而且各个方法内的代码改变也很容易理解。 7.适当的方法和变量使用范围 功能和变量如果只在一个组件中使用,则在那一个组......

阅读全文(44193) | 评论:0

ActiveX、OLE和COM介绍(2005-05-10 13:49:00)

摘要:ActiveX、OLE和COM介绍 熟悉面向对象编程和网络编程的人一定对ActiveX、OLE和COM/DCOM这些概念不会陌生,但是它们之间究竟是什么样的关系,对许多人们还是比较模糊的。 在具体介绍它们的关系之间,我们还是先明确组件(Component)和对象(Object)之间的区别。组件是一个可重用的模块,它是由一组处理过程、数据封装和用户接口组成的业务对象(Rules Object)。组件看起来像对象,但不符合对象的学术定义。它们的主要区别是: 1)组件可以在另一个称为容器(有时也称为承载者或宿主)的应用程序中使用,也可以作为独立过程使用; 2)组件可以由一个类构成,也可以由多个类组成,或者是一个完整的应用程序; 3)组件为模块重用,而对象为代码重用。 现在,比较流行的组件模型有COM(Component Objiect Module,对象组件模型)/DCOM(Distributed COM,分布式对象组件模型)和CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)。到这里,已经出现了与本文相关的主题COM,而CORBA与本文无关,就不作介绍。之所以从组件与对象的区别说起,是想让大家明确COM和CORBA是处在整个体系结构的最底层,如果暂时对此还不能理解,不妨继续往下看,最后在回过头看一看就自然明白了。 现在开始阐述ActiveX、OLE和COM的关系。首先,让大家有一个总体的概念,从时间的角度讲,OLE是最早出现的,然后是COM和ActiveX;从体系结构角度讲,OLE和ActiveX是建立在COM之上的,所以COM是基础;单从名称角度讲,OLE、ActiveX是两个商标名称,而COM则是一个纯技术名词,这也是大家更多的听说ActiveX和OLE的原因。 既然OLE是最早出现的,那么就从OLE说起,自从Windows操作系统流行以来,“剪贴板”(Clipboard)首先解决了不同程序间的通信问题(由剪贴板作为数据交换中心,进行复制、粘贴的操作),但是剪贴板传递的都是“死”数据,应用程序开发者得自行编写、解析数据格式的代码,于是动态数据交换(Dynamic Data Exchange,DDE)的通信协定应运而生,它可以让应用程序之间自动获取彼此的最新数据,但是,解决彼此之间的“数据格式”......

阅读全文(44778) | 评论:0

C#程序调用外部程序(2005-05-10 13:48:00)

摘要:/* *  编程语言:Visual  Studio  .NET  C#  (Beta  2) *  作        者:迪泊威 *  功        能:通过C#程序调用  Windows  记事本程序  编辑一个 *  名为  test.txt  的文本文件。 * *  在整个程序中  System.Diagnostics.Process.Start(Info)   *  为主要语句。 *  如果只是单独执行一个外部程序,可用一条如下代码即可: *  System.Diagnostics.Process.Start( *  "外部程序名","启动参数"); */ using  System; class  test { static  void  Main() { //声明一个程序信息类 System.Diagnostics.ProcessStartInfo  Info  =  new  System.Diagnostics.ProcessStartInfo(); //设置外部程序名 Info.FileName  =  "notepad.exe"; //设置外部程序的启动参数(命令行参数)为test.txt Info.Arguments  =  "test.txt";......

阅读全文(45080) | 评论:0

Window 消息大全使用详解(2005-05-10 13:36:00)

摘要:消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg, 它在Windows单元中是这样声明的: type TMsg = packed record hwnd: HWND; / /窗口句柄 message: UINT; / /消息常量标识符 wParam: WPARAM ; // 32位消息的特定附加信息 lParam: LPARAM ; // 32位消息的特定附加信息 time: DWORD; / /消息创建时的时间 pt: TPoint; / /消息创建时的鼠标位置 end; 消息中有什么? 是否觉得一个消息记录中的信息像希腊语一样?如果是这样,那么看一看下面的解释: hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。 message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。 wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。 lParam 通常是一个指向内存中数据的指针。由于W P a r a m、l P a r a m和P o i n t e r都是3 2位的, 因此,它们之间可以相互转换。 WM_NULL = $0000; WM_CREATE = $0001; 应用程序创建一个窗口 WM_DESTROY = $0002; 一个窗口被销毁 WM_MOVE = $0003; 移动一个窗口 WM_SIZE = $0005; 改变一个窗口的大小 WM_ACTIVATE = $0006; 一个窗口被激活或失去激活状态; WM_SETFOCUS = $0007; 获得焦点后 WM_KILLFOCUS = $0008; 失去焦点 WM_ENABLE = $000A; 改变enable状态 WM_SETREDRAW = $000B; 设置窗口是否能重画 WM_SETTEXT = $000C; 应用程序发送此消息来设置一个窗口的文本......

阅读全文(43282) | 评论:0

用Visual C#来做组件(2005-05-10 13:32:00)

摘要: 用Visual C#来做组件,其实是一件很容易的事情。至少比用VISUAL C++要容易的多。在本文中,笔者将为您详细介绍如何来做一个组件。我们可以通过二个步骤来完成这个过程:1.制作一个组件;2.在客户端测试这个组件。 一.制作一个组件 1.首先建立一个新类库工程文件 选择File->New->Project->Visual C# Projects->Class Library。填入工程文件名称,并且通过Browse按钮选择文件要存放的目录。然后点击OK。 2.工程文件和他所包含的文件 此时的工程文件中的Solution Explorer已经加了两个C#的类。分别是AssemblyInfo.cs和Class1.cs我们只要关心的是Class1.cs就可以了,AssemblyInfo.cs可以不管它。 3.namespace mcMath(名称空间 mcMath) 双击Class1.cs,就会看到namespace mcMath,我们在客户端调用组件的时候,会涉及到这个namespace: public long Add (long val1, long val2) { return 0; } public bool Extra { get { return true; } set { } } 至此,在确认上面的事情都已经完成后,编译这个工程文件时就可以在bin/debug目录里面找到mcMath.dll,它就是组件。但此时的组件没有任何功能,下面我们将进一步的完善它。 4.加入一个方法 从View menu中打开ClassView,我们看到的Class1没有任何方法和属性。现在我们给它加上一个方法和一个属性。 点中Class1,右击,选择Add->Add Method... 这时会弹出VISUAL C#的方法制作向导窗口。你可以在此向导的帮助下,为你的组件加入方法的名称、访问类型、返回值、参数,甚至是注释。用Add和Remove按钮可以方便的从参数列表中增加或删除参数。我们在此加入一个方法:long Add( long val1,long val2 ),这个方法的功能是把两个数相加,然后返回他们的和。 5.加入一个属性 重复加入方法的过程,在同样的位置,打开C#的属性向导,按照下图为组件加入......

阅读全文(43078) | 评论:0