| Lin's profileHappy life of WEI LinPhotosBlogLists | Help |
|
7/10/2008 C# operation in visio drawing-controlExperience:
1. Page size default present in inch in visio's drawing-control. 2. For compability of coding in different page size presenting mode, need convert logic point to inch or reversly. Microsoft.Office.Interop.Visio.Application.ConvertResult provide it. 3. Get master object should use stencil document's Masters[] interface, don't use get_ItemU because sometimes failed. (Don't know why.) 4. Page size can be modified with in sample code. this.current_page_.PageSheet.get_CellsSRC((short)VisSectionIndices.visSectionObject, (short)VisRowIndices.visRowPage, (short)VisCellIndices.visPageWidth).Formula = "8"; // in inch
this.current_page_.PageSheet.get_CellsSRC((short)VisSectionIndices.visSectionObject, (short)VisRowIndices.visRowPage, (short)VisCellIndices.visPageHeight).Formula = "8"; // in inch
5. Glue action can move shape automatically to the target shape.
6. The source object's connection pointer can be found using visRowConnectionPts in shape's get_CellsSRC method's second parameter, but while it become a target object, its connection pointer just can be found using parameter visRowConnectionPts + 2. (Don't know why.) 7. Sometimes, find the target object's connection pointer firstly just can through parameter visRowConnectionPts + 2. (Don't know why.) 8. Glue with 2 2D shapes directly just can use static mode using connection pointer, but glue 2 2D shape with connector can use static or dynamic mode using connection pointer or section object. (Refer to sample code.) 9. Master can be repeatly dropped on page to generates mutilple shapes. Problems:
1. Layout is still a difficulty in coding with drawing-control. 2. Principle of connection pointer in Shape is still a puzzle to me. A: Connection pointer of master can be defined with ShapeSheet, it's a window in office visio application, Accordingly the first connection pointer also can be defined, it can be referred in code using visRowConnectionPts, and the second referred using visRowConnectionPts + 1, and so on.
1/22/2008 对于软件设计的理解 - 记于儿子满两岁半 其实自己也一直没有好好整理过思路,今天同一个朋友聊天说到这个问题,其实说来说去都是在说一个概念,终于有了点思路,觉得应该记录下来,算是一个开始的足迹吧。
1、设计就是设计,和设计的大小无关,也和应用于的项目大小无关。
2、设计的目的不是为了给应用的程序增加开销,增加程序的体积,而是为了提高编码的质量和复用性,当然能提高效率也体现了好设计的附加价值。
3、每个公司每个人都有自己的设计风格,条条道路通罗马,最终的启到效果应该都是一样的。
4、软件设计目前尚未形成体系,是个大空白,亟待知识和方法的整理归纳。
5、软件设计知识不是为了统一设计方法,更不是为了禁锢思路,举个例子来说吧:
我喜欢开始时不断去做碗,不断做,到最后我知道这种碗最结实,也最受欢迎后,我再生产个模具出来;
从这个例子来说,软件设计知识是:并不是告诉你以后碗该怎么做或你就按这么做就行了,不是这样的,而是告诉你为什么这样做行,那样做不行,得说出个道理来。
6、知识和方法是给大多数人学习的,对于聪明人来说不是不讲方法,而是这些方法他已经通过其他途径学会了。 7、总而言之,软件设计知识是让你能够以一种科学的方法去设计软件,而不是告诉你应该设计成什么样,提高了设计的成功率而已。 9/26/2007 高效异步IO的设计开发(3) 异步I/O中的Edge-Triggered和Level-Triggered是非常重要的概念;Edge-Triggered字面上理解就是指“边界触发”,说的是当状态变化的时候触发,以后如果状态一直没有变化或没有重新要求系统给出通知,将不再通知应用程序;Level-Triggered是指“状态触发”,说的是在某种状态下触发,如果一直在这种状态下就一直触发。两种触发方式各有用途,应根据不同的应用采用不同的触发方式。select一般默认采用的是Level-Triggered,而EPoll既可以采用Edge-Triggered,也可以采用Level-Triggered,默认是Level-Triggered,而MS的CPIO按这种定义来说应该属于Edge-Triggered。对于已经封装好的异步I/O架构来说,具体采用哪种方式其实无伤大雅,因为无论采用哪种方式,都需要在内部都实现正确了,并且让使用者不再关心这种具体的触发方式为好。
void EPollReactor::NotifyMeWrite(SOCKET handle, SvcHandler *handler)
{ DIAMON_ASSERT(handle != INVALID_SOCKET); EPoll_Mod_Handle_Events(handle, EPOLLOUT/* | EPOLLET*/); } 上述代码中,就是在每次写完数据后需要异步I/O框架再通知应用程序关于写完,其中EPoll_Mod_Handle_Events函数告诉系统给handle注册上EPOLLOUT消息,这样当handle完成写操作后,系统将通知框架写完消息,是否加上EPOLLET完全取决于框架同应用者之间的协议,其实本质上就是框架对外提供的接口和调用约定。在Diamon::ACE中,采用的是Level-Triggered方式。
void IOCPReactor::NotifyMeWrite(SOCKET handle, SvcHandler *handler)
{ DIAMON_ASSERT(handle != INVALID_SOCKET); IOCPSvcHandler *iocphandler = (IOCPSvcHandler *)handler; iocphandler->event_ &= (~IOCP_EVENT_READ); iocphandler->event_ |= IOCP_EVENT_WRITE; } 对比一下,CPIO中的NotifyMeWrite做的不是通知系统,而是告诉异步I/O框架自己接下来应该处理写事件了,而对系统的触发工作完全是交给WSAWrite...之类的函数来完成的。想想啊,每次调用WSAWrite...不正是对系统说,我给这个handle注册一下写事件啊,下次还通知我,你可以试试不调用WSAWrite...了,下次肯定收不到写通知了。 8/14/2007 高效异步IO的设计开发(2) 说到select重复的维护句柄的开销,其实也是有解决方法的,好的解决方法效率会提高很多,但是重复工作还是要做的,比如当select返回结果是0,或者当能确定不需要增减IO句柄时,我们可以简单的把原先保存的FD_SET副本重新写入,这样可以减少重新生成FD_SET的开销,内存复制效率显然高于队列的一次次遍历,这是显而易见的。当然对于大并发量的IO操作来说,这种方法对于效率的提高也是很有限的,说到底即使采用异步IO效率也并不一定就高,还要取决于很多其它因素。其中很重要一点大家别忘记把侦听端口设置成异步的,虽然不设置的话程序运行后好像没有什么不正常,但光从表面上就可以看到CPU占用率明显偏高,当然还会有一些其它问题产生,这个问题比较复杂,这里不作描述了。并发操作的效率还取决于“连接-->断开->连接”的频度,频繁的“连接-->断开->连接”也会产生不小的开销,当然这些开销和之后要讲的真正实现业务操作需要的开销比起来其实要小得多,而且也是有很多方法可以规避的,对于采用不同的异步IO实现方法也是很不同的,效率差异会非常大。对我们来说,归根结底是根据不同的模型采用不同的方法来提高效率,作为一个异步IO的前端“发生器”应该尽可能避免在自己的工作上消耗过多的CPU资源,而是尽可能把CPU资源让给具体的业务实现者。 8/3/2007 高效异步IO的设计开发 高效异步IO,按我理解起来应该不光要达到程序运行时的高效,当然也要达到开发效率的高效,其中还包括很重要一点就是质量,对于很多从未做过异步IO的人来说,初次尝试异步IO肯定会碰到不少困难,因为不光是对编程能力的考验,也需要开发者对操作系统的IO操作有相当的了解,包括他的机制和部分原理。异步IO中也有高效低效之分,但主要还是要看具体的应用到底需要什么样机制。比如大家熟知的select就是个非常通用且跨平台的方法,由于select中需要把大量的时间花在维护IO句柄上,导致其效率大打折扣,一般来说,对于小并发的异步IO操作,比如普通的客户端或者是小并发量的服务器,它的效率可能也足够了。关于select的效率问题其实从各平台上对于FD_SETSIZE的定义就能看出一些来,在windows平台上,FD_SETSIZE是64,在Linux平台上是1024,也就是说,对于平台提供商来说也不指望他们提供的select能给你多大的并发吞吐能力,但由于select的简单和普及,其应用面还是很广,很多时候确实也不需要太多的并发量。其实说到高效异步IO的开发,我们也说了,不光是考虑到程序运行时的效率,还要考虑开发的效率和软件的质量,说到这里,其实select这么个简单的机制有时候用起来也不那么简单,而且还会出很多错误。 9/30/2006 关于程序库,写在国庆前夕 有关程序库的名称其实是很多的,什么代码库、复用库、组件(库)、共享库、...,凡是你觉得合适的名字都可以用。从最早开始写程序漫无目的几乎是胡乱涂鸦,到后来形成一些意识觉得需要让代码能够重复使用,再到后来可以单独写程序库并可被很多项目使用,这是个循序渐进的过程,很多时候会觉得自己的知识不够用,有时候也会觉得自己的想法不切实际,实用轻盈的程序库其实更容易被接受和重复使用,但是过于轻盈的程序库功能可能会很不够用,繁重复杂的程序库使得学习成本增高,使得项目开发人员的技术要求提高,同时导致了繁重的构建过程,这又导致了项目不愿意使用程序库了。
程序库工作的重要性在于2点:收集和组织。灵感是随时会产生的,每个人都会写出优秀的代码,如果单纯的靠冥思苦想的写程序库,那一方面你怎么会知道有那么多需求,另一方面你哪有那么多测试时间,如何保证程序库的质量呢,因此收集优秀有实用功能,能解决实际需求的代码是必须的。有了代码,如果无机的堆在一起,那对使用者不尊重啥的且不说,你又怎么能把这些代码堆得起来呢,所以对功能作认真的分析,将其进行归类,然后组织成一套程序库,从逻辑上讲,减少了程序库对外部的耦合,也增强了程序库的内聚,另外对使用者来说逻辑关系比较清晰,更便于使用和记忆。
其实程序库的开发是一种知识积累的过程,也是一个生产的过程,缺少必要的规划要么让程序库显得繁赖拖沓,难以学习和使用,要么使程序库淡薄无力。在此我向大家推荐Diamon,目前支持C/C++语言,需要的话可以给我留言。 9/1/2006 分析还是设计,普遍性原则吗? 好久没写关于这方面的文章了,今天看到设计模式的经典著作,觉得忽然又想起了什么,所以写出来同大家分享一下,其实这些想法在我心里很早就有了,一直没写下来。对于面向对象思想的应用,我个人更倾向于不但要重视设计,更要重视分析,这也正是我在同别人交流时总说“我把面向对象思想已经上升到了哲学的高度”的原因,关于为啥这么做,其实原因很简单:要深刻理解一件事物并不容易。可以这么说面向对象思想从哲学高度来说更像是一套观察、分析、描述事物的方法。
通常我们接触到一个东西时,常常喜欢类比,比如看到Pocket-PC,我们会把它和手机电脑做比较,找出它们之间的异同点,这样做能够加速我们对这个东西的了解,这是一个很形象的方法,对很多人都很管用。这里面也反映出一点,我们更容易接受或理解同以前接触过的东西更加类似的东西。计算机程序对我们来说其实是非常抽象的,所以我们刚开始写程序时也常常会有在纸上描画简单设计的习惯,随着工作经验的增加,这种习惯会越来越强烈,而不同的是我们设计的技能提高了。既然我们对身边的东西比较熟悉了解,如果能应用已有的经验去认识新事物,显然会使我们加速熟悉和了解新事物的特征,当然有时候这也是会有负面效应的,比如过多的依赖经验,会使我们的思维趋于定势,缺乏创造能力(不过这不是我这里所要说的,呵呵)。如果我们把对事物的熟悉和了解的过程称为分析,那么显然分析过程中很多方法也是来自于类比,用直观熟悉的事物来类比或表达我们所要描述的分析的“对象”(这个对象不是面向对象的对象),不论对自己还是对别人都会更加容易理解,省去了很多解释这个到底是什么的麻烦,同时也更容易进一步类比去挖掘该事物更深层次的内容。
分析是一切的开始,需要循序渐进,不断深入。如果说设计是对开发内容的自然语言的描述,那么分析就是对为什么会得到某种设计的一个详尽的解释。就像我们在开始做一件事情之前需要好好思考一下该怎么把这件事做好,我们总是力图去发现事物的本质,而且我们总是相信(实际上经验也是这么告诉我们的)深入分析会带来好的结果。其实一件看似简单的东西往往并不像我们表面上看到的那样,其内部构造也是非常复杂的,由于“视力”的局限性,我们通常只能看到暴露给我们的外表,如果要看到内在,必须把外表“剥去”,其实这个过程是长时间的。横看成林侧成峰,随着时间的推移和经验的增长,我们会发现原先看到的是假的,这时候我们至少得到了关于这件事物的两个理解,不要急于抛弃任何一种理解,通过对比,我们的理解才会更加深入。这个过程往往不是第一次就能得到的,我们也常常会为了这种理解的偏差付出代价,不过幸好这还是可以解决的(可以通过增加更宽泛的设计来解决,不过这里不讨论)。千万不要因为第一次分析可能会错误就拒绝分析,可以肯定地是分析带给我们的好处远比没有它所带来的更多。
分析能够提高设计的质量。分析所处的地位在于发掘事物的本质,了解事物到底是什么,设计的地位在于描述用某种工具实现它的方法。可见设计其实是分析的结果产物。我们回忆一下会发现,有时候我们确实是直接做了设计,在没有分析的情况下完成工作的,我自己就有过这种经历,但是现在回忆起来,其实准确的说不是没有分析,而是没有把分析的结果书面化,其实我们常常是在脑海里进行分析的,这来自于我们以往的习惯,但是这种方法在软件项目上可能行不通。关于为啥要文档化,显然不是我们这里要讨论的,但我还是要简单的说一下:比如一个项目很大很复杂,你能担保所有的分析结果都在脑海里产生储存不会遗漏或遗忘吗,另外,项目的其他成员如何了解你的分析结果,你难道只能一遍一遍向小组的每个成员甚至小组外的市场测试人员重复你的理解吗。因此通常的结果是我们并不是没有分析,而是没有认识到我们经常做的事情其实就是分析,这里更重要的是提高分析的质量,效率和效果,好的(书面化)分析结果会很大程度提高设计的质量。如何提高分析的质量内容太多了,不是只字片语就能说清楚的,我也不具备这种能力,呵呵。 4/19/2006 The Top 18 Quotes from Web 2.0 - By Kareem Mayan3/2/2006 Microsoft Visual Studio 2005试用笔记(不断更新)我用的是Team Suite和Professional版的,另外两版没有用过,这里将不同的记录下来,供朋友们参考:
1、第一次启动时会让你选择需要使用的界面及键盘等设置的风格,比如:类似于Visual Studio 6 - 2003、Test、Database、...,这是比较人性化的设置,我用惯了Visual Studio 2003了,当然喜欢保留原来的习惯了。
2、增加了Refactor功能,但这项功能不适用于C++(我也只试了C#),虽然功能没有VS2003 + ReSharper那么丰富,也不如在Eclipse下可以通过增加插件增加C++的Refactor功能,但相比Microsoft的传统,这已经进步了不少了。
3、增加代码风格的设置,但是同ReSharper相比,功能还是很少,当然对于C++就更少了,就好像故意保留C++作者的土得掉渣的风格一样。
4、工具栏停靠功能的人性化,这是微软的又一项改进,从前停靠工具栏还是比较费劲的,有时候怎么也弄不好,现在当你用鼠标抓起工具栏需要重新停靠时,会显示导航图标,只需将鼠标放入导航图标既可完成停靠,这种方式可靠而方便,而且导航图标是浮动显示的,显得非常自然贴心。
5、增加了类图设计功能,并且保持了类图和代码的一致,可以直观的通过图形来编码了,这个相信很多OO开发者都已经很熟悉了,不再多介绍。不过相比2003上诸多OO设计开发插件来说,好像Microsoft加入这个功能有些不乐意,不管怎么说总是一个大进步了。关于设计方面的事情如果有兴趣我们可以多多探讨。
6、对以往工程的兼容性,这当然是使用过老本的Visual Studio开发过项目的最关心的问题了,可以说2005的兼容性完全没有问题,我之前用的是2003,解决方案和工程中的配置可以完整无损的转换过来。更具魅力的是2005会把之前的解决方案和工程文件作备份,防止由于各种原因又想使用老版本的问题。
7、再说一下解决方案和项目文件的转换问题,如果你打定主意要用2005了,你可以不备份老的解决方案和项目文件,否则请你一定要备份一下,否则当你想转回2003时会发现已经无能为力了(当然也不是完全的,你可以重建解决方案和项目文件,这个工作项目越大越麻)。
8、用VS2005编译VS2003或VS6的代码时,可能会出现warning C4996: 'xxxxxx' was declared deprecated的警告信息。这并不是错误,而是VS2005对您使用的老(标准)函数或者使用习惯的警告,原因可能是微软觉得某些老函数的使用或使用方法上不安全,同时编译器还会给出建议使用的函数或使用方法。这个错误不会导致编译失败,也不会影响目标代码的生成,但如果你不想看到这些警告可以在C/CPP文件中把此警告关闭,在源代码中加入#pragma warning(disable : 4996),当然你不愿意对每个文件都加入这句代码可以在:项目属性-->C/C++-->强制包含(Force Include)中关闭警告(这个方法我没试过)。
9、VS2005中对语法的控制比VS2003要严格得多,VS2003较VS6来说较宽松,最常见的就是变量或函数类型缺失和隐式强制类型转换的问题,但是这类问题一般都比较好解决,只需进行简单的修改大部分的项目都能编译通过。从另一方面讲,严格良好的编码习惯是成功的开始,因此既然新的编译器已经给出了更加严格的控制,那么我们也有充分的理由让自己的习惯有所提升了。
10、在VS2005的默认情况下,在你按下Build Solution(生成解决方案)时,已经编译通过的项目不会再重复出现,这个同VS2003相比好处在于减少了由此产生的视觉疲劳。 6/24/2005 面向对象设计之我见 在面向对象设计方面我只是一只小小的菜鸟,因此没有什么勇气去谈看法或理解,更不能全释其理论和含义,本文中我只是从一个程序开发人员的角度来谈谈我眼中的面向对象设计。 关于面向对象设计的一些感悟《面向对象启示录》是一本好书,作者的功力很深厚,看这本书的时候有一种志同道合的感觉,作者把面向对象上升为一种哲学来看待,非常欣赏。我觉得作者想表达一种想法:“面向对象设计并不是靠对象来构建设计,而是通过这种方法得到较好的设计”。 |
|
|