随笔(2015.1)

来源:互联网 发布:js为div添加事件 编辑:程序博客网 时间:2024/05/29 04:18

1.序列化可以实现远程过程调用,远程过程调用都是通过对象序列化?

2.反射机制可以让系统开放.

3.equals比较的是两个对象里面数值是否一样,==比较的是这两个包装类引用是否指向同一对象。

4.垃圾回收并不能强制执行,只能通过接口建议执行。why?,虽然垃圾回收机制会对系统造成一定的影响,但是对于目前硬件的处理能力而言,不是很大。

5.垃圾回收是标记被引用的对象,用排除的方法来找到垃圾,然后在清除未被标记的垃圾。

6.总线是各种功能传递信息的公共通信干路。为减少线程竞争,每个设备操作可以通过一个总线来控制,但是总线可能是双向的 。网络通信也需要通过总线。

7.链接器存在的原因是为了把个个单独的文件分开编译,否则全部代码会在一个文件中。

8.对象更新一半容易造成问题。在使用锁的时候,要特别注意,拿到对象的指针的锁,与拿到对象的锁的差异。

9.产品质量与过程质量改进是持续改进过程。

10.成功公司服务占利润30%以上。

11.线程不安全的函数并不是一无是处,它的效率会比线程安全函数高。在提供给别人的sdk的时候,接口方法可能是线程不安全的,这就涉及到锁的位置的问题,如果在sdk内部加锁,那么上层可能不必加锁。我的理解,为了防止使用者产生“这个接口是线程安全”的假设,最好提供的方法接口都是线程安全的。这样,即时sdk内部加了锁,在使用的时候又加了锁防止错误,虽然加了两次锁,但是如果在外部加锁正常,在sdk内部就不会有锁竞争,也就是说sdk内锁没有开销。

12.可重入函数为线程安全函数的真子集,可重入函数没有锁机制,一般效率比其他线程安全函数高。

13.带参数带指针的为隐形的可重入函数,因为如果使用不当,例如指针为静态或全局变量,就为不可重入函数。

14.虚拟内存不仅使得计算机进程结构设计容易,而且对进程有保护作用。可以理解为,虚拟内存这样一个设计是为了满足程序员易用性的需求。

15.61850的中在查询数据时候返回的顺序应该与FCDA中出现的对象数据一致(主要是为了节省带宽),这点与“结构化编程”类似,要求代码执行的顺序基本与书写的顺序一致。这样会使得读代码的时候非常舒服。在调用子程序的时候,如果每个子程序只调用一次,那么可以通过调整子程序的顺序很容易达到这个要求。

16. rcp(Rich Client Platform),“从 RCP的结构体系上,可以看出RCP在基于扩展点的设计思想上是怎么去设计的,它的设计思路采取的就是从顶至下、按照职责进行划分、形成插件的方法,插件中需要支持动态扩展的部分则做成扩展点,从而形成一个非常容易扩展的开发平台。即插即用、即删即无的支持使得系统可以很好的以插件的方式来进行组装,做系统的时候就象在种树,先把系统的根撒下,让根长出主干,在主干上培育出枝叶,枝叶上结出果实,整颗树就这么培育成了,当不需要了某个果实的时候,把它摘下来吃了,当不需要了某颗枝叶的时候,把那颗枝叶砍了,而这都不会影响到主干,当希望树上形成别的果实的时候,甚至都可以接上不同的枝叶,让它长出不一样的果实”

http://www.51cto.com/specbook/319/44641.htm

17. 平台与框架的区别http://yunli.blog.51cto.com/831344/168862

      “框架是针对一定的应用领域进行开发的,比如,ACE(Adaptive Communication Environment)就是针对网络通讯而开发的一个框架。框架通常对于应用进行了一定的抽象,将需要的一些通用的功能做成了软件模块。当用户(或开发人员)需要对应用进行开发时(即实现应用的功能时),如果采用框架,则只要实现针对应用的特定代码就行了。或者,我们可以理为:解框架为相类似的应用设计了一个骨架,而具体的应用只是在这个骨架上填上肉和皮肤。假如要做一个Server/Client程序,如果采用ACE,我们可以在Server侧用Acceptor来监听连接请求,而在Client侧则用Connector来发起连接。最后,Server与Client之间是一定有协议的,这些协议是针对特点的应用的,并不是框架的一部分,是用户必须其于框架去实现的特定的代码。

      平台是通常和一定的操作系统相关,是对操作系统更高层次的抽象。平台一方面提供了所有使用硬件资源的API,另一方面也实现了一些通用的组件,这些组件可以服务于不同的应用领域比如,常用的平台模块有,内存管理模块、Log管理模块、设备管理模块,等等。

      如果用分层的概念来看框架和平台,假设上面是应用层,下面是硬件层,那么,我们可以认为框架是在平台之上的,是更加接近应用的。而平台是在框架之下的,是更加的通用的。同一个平台可以为不同的框架(应用领域)服务的。

      框架和平台是目前行业很重要的开发方向,这足以体现了其重要性,那为什么会如此重要呢?我想总的来说应当是:为了代码重用和开发出高质量的软件。无论是框架还是平台,其思想都是为了代码重用。代码重用的好处,一是缩短开发时间,二是可以少犯相同的错误,而这也就提高了软件质量。此外,两者都是更高抽象层次的软件开发方法,是避免“重新造轮子”的开发方法。

      通常一个好的框架设计都会基于一定的平台的,当然,平台可以有简单和复杂,框架中所使用的平台是应当是简单还是复杂,其标准应当是:保证框架能很快的被移植到新的操作系统。可见,有平台概念的框架有更强的适应性和生命力。应当说JAVA的兴起,给框架的发展打开了全新的篇章。

      平台的设计除了对于现有的操作系统进行更高抽象层次的封装外,我认为基于虚拟机的语言的开发是一种新形式的平台开发。比如,Python、Java,其本身是构建在虚拟机上的,而其丰富的库可以说构建了平台的功能。这种形式的好处是,跨平台成了开发虚拟机的工作,而这通常都是由语言的创造者(社区或是公司)去完成的。

      自己的理解,框架距离应用需求更接近,是为了满足一类需求,而平台距离需求较远,但是能够实现的需求种类较多。粗糙的理解,框架像一个没有装修的房子,而平台可以理解为一堆盖房子的工具与原料,挖掘机,沙子水泥啥的。说“平台与操作系统相关”并不大认同,像新浪和腾讯的开发平台,其实与操作系统关系不大~~

18. 回调函数、消息和事件例程(在学习rcp 的ui线程中遇到的问题,事件与消息有和区别?)

      “调用(calling)机制从汇编时代起已经大量使用:准备一段现成的代码,调用者可以随时跳转至此段代码的起始地址,执行完后再返回跳转时的后续地址。CPU为此准备了现成的调用指令,调用时可以压栈保护现场,调用结束后从堆栈中弹出现场地址,以便自动返回。借堆栈保护现场真是一项绝妙的发明,它使调用者和被调者可以互不相识,于是才有了后来的函数和构件,使吾辈编程者如此轻松愉快。若评选对人类影响最大之发明,在火与车轮之后,笔者当推压栈调用。话虽这样说,此调用机制并非完美。回调函数就是一例。函数之类本是为调用者准备的美餐,其烹制者应对食客了如指掌,但实情并非如此。例如,写一个快速排序函数供他人调用,其中必包含比较大小。麻烦来了:此时并不知要比较的是何类数据--整数、浮点数、字符串?于是只好为每类数据制作一个不同的排序函数。更通行的办法是在函数参数中列一个回调函数地址,并通知调用者:君需自己准备一个比较函数,其中包含两个指针类参数,函数要比较此二指针所指数据之大小,并由函数返回值说明比较结果。排序函数借此调用者提供的函数来比较大小,借指针传递参数,可以全然不管所比较的数据类型。被调用者回头调用调用者的函数(够咬嘴的),故称其为回调(callback)。回调函数使程序结构乱了许多。Windows API 函数集中有不少回调函数,尽管有详尽说明,仍使初学者一头雾水。恐怕这也是无奈之举。无论何种事物,能以树形结构单向描述毕竟让人舒服些。如果某家族中孙辈又是某祖辈的祖辈,恐怕无人能理清其中的头绪。但数据处理之复杂往往需要构成网状结构,非简单的客户/服务器关系能穷尽。Windows 系统还包含着另一种更为广泛的回调机制,即消息机制。消息本是 Windows 的基本控制手段,乍看与函数调用无关,其实是一种变相的函数调用。发送消息的目的是通知收方运行一段预先准备好的代码,相当于调用一个函数。消息所附带的 WParam 和 LParam 相当于函数的参数,只不过比普通参数更通用一些。应用程序可以主动发送消息,更多情况下是坐等 Windows 发送消息。一旦消息进入所属消息队列,便检感兴趣的那些,跳转去执行相应的消息处理代码。操作系统本是为应用程序服务,由应用程序来调用。而应用程序一旦启动,却要反过来等待操作系统的调用。这分明也是一种回调,或者说是一种广义回调。其实,应用程序之间也可以形成这种回调。假如进程 B 收到进程 A 发来的消息,启动了一段代码,其中又向进程 A 发送消息,这就形成了回调。这种回调比较隐蔽,弄不好会搞成递归调用,若缺少终止条件,将会循环不已,直至把程序搞垮。若是故意编写成此递归调用,并设好终止条件,倒是很有意思。但这种程序结构太隐蔽,除非十分必要,还是不用为好。

      利用消息也可以构成狭义回调。上面所举排序函数一例,可以把回调函数地址换成窗口 handle。如此,当需要比较数据大小时,不是去调用回调函数,而是借 API 函数 SendMessage 向指定窗口发送消息。收到消息方负责比较数据大小,把比较结果通过消息本身的返回值传给消息发送方。所实现的功能与回调函数并无不同。当然,此例中改为消息纯属画蛇添脚,反倒把程序搞得很慢。但其他情况下并非总是如此,特别是需要异步调用时,发送消息是一种不错的选择。假如回调函数中包含文件处理之类的低速处理,调用方等不得,需要把同步调用改为异步调用,去启动一个单独的线程,然后马上执行后续代码,其余的事让线程慢慢去做。一个替代办法是借 API 函数 PostMessage 发送一个异步消息,然后立即执行后续代码。这要比自己搞个线程省事许多,而且更安全。
如今我们是活在一个 object 时代。只要与编程有关,无论何事都离不开 object。但 object 并未消除回调,反而把它发扬光大,弄得到处都是,只不过大都以事件(event)的身份出现,镶嵌在某个结构之中,显得更正统,更容易被人接受。应用程序要使用某个构件,总要先弄清构件的属性、方法和事件,然后给构件属性赋值,在适当的时候调用适当的构件方法,还要给事件编写处理例程,以备构件代码来调用。何谓事件?它不过是一个指向事件例程的地址,与回调函数地址没什么区别。
不过,此种回调方式比传统回调函数要高明许多。首先,它把让人不太舒服的回调函数变成一种自然而然的处理例程,使编程者顿觉气顺。再者,地址是一个危险的东西,用好了可使程序加速,用不好处处是陷阱,程序随时都会崩溃。现代编程方式总是想法把地址隐藏起来(隐藏比较彻底的如 VB 和 Java),其代价是降低了程序效率。事件例程使编程者无需直接操作地址,但并不会使程序减速。更妙的是,此一改变,本是有损程序结构之奇技怪巧变成一种崭新设计理念,不仅免去被人抨击,而且逼得吾等凡人净手更衣,细细研读,仰慕至今。只是偶然静心思虑,发觉不过一瓶旧酒而已,故引得此番议论,让诸君见笑了

      事件驱动程序设计是围绕着消息基础形成的,发生一个事件,伴随着一大堆的消息。”

      上面说了很多,关于消息与调用的比较多,消息与事件的区别还不是明白,自己先从字面上理解,“消息”的重点在于information,消息更侧重于传递一些数据,有点像传递函数的参数,而“事件”更侧重于trigger,更侧重于发生的这个动作和过程,用户点击一个按钮,很明显这是一个事件,而处理这个事件的时候可能会在操作系统中产生多个消息。所以可以说“事件是基于消息的”。

“事件有系统事件和用户事件。系统事件由系统激发,如时间每隔24小时,银行储户的存款日期增加一天。用户事件由用户激发,如用户点击按钮,在文本框中显示特定的文本。事件驱动控件执行某项功能。”(百度百科)

In computing, an event is an action or occurrence detected by the program that may be handled by the program. Typically events are handled synchronously with the program flow, that is, the program has one or more dedicated places where events are handled, frequently an event loop. Typical sources of events include the user (who presses a key on the keyboard, in other words, through a keystroke). Another source is a hardware device such as a timer. Any program can trigger its own custom set of events as well, e.g. to communicate the completion of a task. A computer program that changes its behavior in response to events is said to be event-driven, often with the goal of being interactive.

Event driven systems are typically used when there is some asynchronous external activity that needs to be handled by a program. For example, a user who presses a button on his mouse. An event driven system typically runs an event loop, that keeps waiting for such activities, e.g. input from devices or internal alarms. When one of these occur, it collects data about the event and fires it, i.e. it dispatches the event to the event handler software that will deal with it.

A program can choose to ignore events, and there may be libraries to dispatch an event to multiple handlers that may be programmed to listen for a particular event. The data associated with an event at a minimum specifies what type of event it is, but may include other information such as when it occurred, who or what caused it to occur, and extra data provided by the event source to the handler about how the event should be processed.

Events are typically used in user interfaces, where actions in the outside world (mouse clicks, window-resizing, keyboard presses, messages from other programs, etc.) are handled by the program as a series of events. Programs written for many windowing environments consist predominantly of event handlers.

Events can also be used at instruction set level, where they complement interrupts. Compared to interrupts, events are normally handled synchronously: the program explicitly waits for an event to be serviced (typically by calling an instruction that dispatches the next event), whereas an interrupt can demand service at any time.

http://en.wikipedia.org/wiki/Event_(computing)

上面是wiki上对event的说明,"an event is an action or occurrence", 听上去挺抽象,event一般是由什么东西触发的,而消息目的比较简单,就是为了传递信息,可以由程序产生。从广义上理解,一个事件封装之后,也可以看成消息。event一般是用户界面触发,(有时候定时器的触发也当作一个event);而且event一般是同步处理的,有一个显式的事件循环,等待事件的到来,不像什么前摄器啥的,整的复杂难理解。

19. 对于数据库中的表,与写程序的时候有点类似,在使用select、update的时候都会有一定的加锁,释放锁的过程,很多过程是数据库自己完成。但是在设计的时候一定要注意,一些经常更新的表最好不要外键约束,否则每次更新都会跟相关的表加锁,在大量并发的情况下,甚至会影响到其他表的更新操作。例如数据表、告警表,不要轻易的去加外键。

20.对于java中的异常,有一些用户自定义异常,并不是所有函数返回错误都是用异常表示的,“异常”通常表示一些非逻辑错误的问题,例如xml文件不错在,xml文件中的某个节点不存在,等等。

21.  让windows关闭错误提示框的注册表项:

编写reg文件内容如下:

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting]
"DontShowUI"=dword:00000001

java -cp .;D:\MyWorkJava\MyConsoleApp\build\classes;D:\MyWorkJava\MyConsoleApp\jaybird-full-2.1.6.jar com.znv.power.tools.IEC61850MapModelGenerator

22. 分布式程序,分布式事务?如何实现。第一原则,尽量避免

23. java不支持运算符重载,但是从面向对象角度来说,运算符重载并不够面向对象,对象一般只有方法,而+这样的符号并不像是方法。这个String是个特例,貌似+的时候是重载的append方法。

24.第一:为什么string类型这种标准库类型也需要人为地声明为DLL导出类型?如果要声明该怎么声明?第二:为什么在DEBUG模式下,这种错误不会对程序运行产生引用?

25. 对于不可恢复的严重错误,一般是要停止进程,但是有时候“严重”的程度还要看业务需求而定,多个相干的业务,也有优先级之分,一个业务出错不能影响到别的业务的进行。

26. 对于锁的问题,不要可以关注一个地方的锁是否有无,效率高低,在上下文中可能别的地方会锁也会收到影响,这个地方不用锁别的地方可能会需要多用锁。

27. 对接上,如果需要提供sdk,并且有自己的server,那么尽可能把逻辑放在server上去做,让sdk简单,安全,不要影响到调用者使用。

28. 对于锁的使用,一些内部的私有方法可以不加锁“安全”的使用,在调用此方法的上层注意加锁即可。

0 0