2009年5月26日星期二

TestCenter TCL env

Spirent's tcl env

pkgIndex.tcl 是包含在TestCenter的安装目录的:C:\Program Files\Spirent Communications\Spirent TestCenter 2.30\Spirent TestCenter Application

在pkgIndex.tcl文件中包含CTS_INSTALL_DIR,而这个变量并没有定义。
所以,如果想写tcl脚本使用TestCenter提供的API,就要设置环境变量CTS_INSTALL_DIR,并把CTS_INSTALL_DIR改为env(CTS_INSTALL_DIR).
比如:package ifneeded SpirentTestCenter 2.30 [list source [file join env(CTS_INSTALL_DIR)  SpirentTestCenter.tcl]]
另一个,更好点的办法是在pkgIndex.tcl开始部分添加下面一行,:
set STC_INSTALL_DIR [pwd]


然后把TestCenter的安装目录添加到autopath:
lappend auto_path $env(CTS_INSTALL_DIR)
puts $auto_path


这样,按照Spirent_TestCenter_Automation_Conf_Prog_Guide.pdf的描述,就可以运行下面的代码了:
lappend auto_path $env(CTS_INSTALL_DIR)
puts $auto_path

package require SpirentTestCenterConformance

set chassisAddress 172.18.101.31
set slot1 10
set slot2 9
set port1 11
set port2 12
puts "==== begin to create project"

set project [stc::create project]
puts "[ stc::get $project -children]\n"
set physicalChassisManager [stc::get system1 -children-physicalChassisManager]
puts "Connect to chassis...\n"
stc::connect $chassisAddress
puts "==== connect ok."

2009年5月23日星期六

reference about tcl debug


总的一个reference.   http://wiki.tcl.tk/8637

activestate关于开发工具的资源:  http://www.activestate.com/tcl_dev_kit/

一个免费的tcl debugger tool: http://gid.cimne.upc.es/RamDebugger/Ramdebugger_toc.html

与eclpse的集成开发,不仅仅是TCL了,还有python, ruby,...: http://download.eclipse.org/technology/dltk/downloads/drops/R1.0/S-1.0RC1b-200905210941/

2009年5月14日星期四

Eclipse's CheckboxCellEditor

项目中需要把表格中的某列用checkbox表示出来,按照《eclipse从入门到精通》中的步骤没有弄出来。
这是eclipse celleditor的一些samples: http://wiki.eclipse.org/index.php/JFaceSnippets#Snippet009CellEditors

TableViewerColumn TableColumn的区别?
TableViewerColumn .getColumn() 返回的是TableColumn对象。什么时候该用哪个呢?

尝试,ComboBoxCellEditor, 发现EditingSupport子类的getValue()需要返回Integer类型。CheckboxCellEditor则需要返回Boolean类型。
跟踪到CheckboxCellEditor的
protected Control createControl(Composite parent) {
return null;
},发现它根本没有实现。所以,CheckboxCellEditor是根本不能使用的。需要你继承它来完成这个方法。真是奇怪eclipse为什么不提供个实现呢?

最后发现了一个类似于CheckboxCellEditor的实现BooleanCellEditor: http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/BooleanCellEditor.java?view=markup 但是,BooleanCellEditor需要运行在eclipse3.4。

2009年5月12日星期二

和Martin交流

Martin告诉我:
解除依赖环在大型项目开发中尤其重要。否则, 你做好了,我改了一点东西后,就又坏了.
你改好之后, 我又不能编译了,故在大项目中不能存在依赖环,只能存在树状依赖. 中间没有环.


dahui said:
我以前一直觉得业务不是很重要,现在我觉得业务是基础,是你能够建立正确model的基础。

福祥 says:
有两个领域,一个是软件,一个domain.

dahui says:
我还在看domain drived development. 很多观点我都很认同。
其中也提到了敏捷开发的缺陷。 我也深有感触。
你想过没有为什么开始流行敏捷?

福祥 says:
CMM太繁琐,
并且中间件出现,
可以总结出一些模式.

dahui says:
我觉得是因为程序员的水平普遍提高了,程序员都有了一定的(甚至不错的)设计能力。有些分工就可以不那么明确了。 以前是系统分析员、设计员做的工作,分配到了程序员手里。
其实,这不一定适合所有项目、不适合所有项目组。

福祥 says:
?

dahui says:
一定要根据具体情况来开发。
说到底,还是跟人有关。 如果一个项目组没有“高人”,或是没把“高人”放在合适的位置上,不管你项目用CMMI还是agile,都不会成功的。我现在还是看重人的作用。

利用inferface切断依赖

背景:
存在模块A、模块B,其中A是common的,发现有些B中的class BClass应该移到A中。
当把BClass 移到模块A中后发现,BClass的有些方法依赖于模块B中的一个类BbClass。而BbClass又跟模块B中许多其它类强烈耦合。

问题:
总不能把所有依赖的东西都move到模块A中呀!

解决:
1)根据BbClass,抽象出一个接口(或抽象类)--比如叫做IBClass,这个接口要定义在模块A中。
2)让BbClass实现IBClass。
3)修改模块A中对BbClass的调用接口为对IBClass的调用。

ORM Relationships

DataNucleus的文档不错,写得很精要,可以读一下:Relationships

在ORM的表述中经常用到 Entity这个词,entity对应于OO的class,对应于DB的Table。

relationship: 1-1, 1-N, N-1, N-M,N-M是bidirectional的,其它的都分为unidirectinal 或者bidirectional。

各种关系中的life dependence是不同的,用GAE的JPA文档中的话来说就是owned和unowned关系。用UML的术语就是: aggregation和composition关系。聚集和合成是很强的耦合关系,在GAE中就是owned关系。在hibernate 中,这种关系就可以用来表达。如果用来表达,那么CascadeType就要进行合适的设置来表达owned或是unowned。CascadeType参数是跟对象生命期有关的。

one-to-one:
1)两个Entity共享主键。
2) Foreign Key。

Assigning Relationships:
With a bidirectional relation you must set both sides of the relation 。

Persisting Relationships - Reachability:
persistence-by-reachability。

Managed Relationships:

Casecading:
casecading要解决的问题是,你对一个object进行持久化操作时,它的域对象是否也执行相应的持久化操作。DataNucleus的casecading例子中描述的情景不错。一个“驾驶员”有一个“驾驶执照”,同时还拥有多辆“汽车”。当驾驶员不存在了,执照也跟随被删除,但是汽车不该被删除。如果汽车被删除,那么驾驶员应该还存在。这是符合现实常理的。用casecading的annotation解决此问题:
@OneToOne(cascade=CascadeType.ALL)
@OneToMany(mappedBy="owner", cascade={CascadeType.PERSIST, CascadeType.MERGE})
@ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})

想建立coder到project的many-to-many映射,但是GAE server却总是报错,才想起GAE对JPA中的
“多对多”是不支持的。需要在各个类中添加Key的集合,来模拟多对多。

2009年5月11日星期一

关于DRM的一点东西。

一些开源的。
Media-S http://www.sidespace.com/products/medias/
OpenIPMP
http://www.linuxdevices.com/news/NS7299359757.html

虎告诉我,wdrm收费。有被破解的wmdrm8,9可用。

国内的一些解决方案:
http://www.china-drm.com/ 价位在:7800元。 不过虎.无名说,这个是基于老的wdrm系统,存在缺陷,可以被破解、复制。
http://www.onlinecn.net/product/free.htm


wmdrm8,9,10的破解: http://forum.doom9.org/showthread.php?t=114916

2009年5月8日星期五

熟悉业务

这个项目搞可一个季度了,抛开纯技术的实现上的问题不说,越来越发觉自己距离真实需求很远。
感觉这个项目虽然不缺乏与用户的沟通,但是缺乏有效的沟通。软件设计之时并没有对dslam测试领域深入了解。所以,感觉这个项目并没有深入主题,或者说不能有效解决问题。

想申请去做测试了,以便熟悉这个domain。

对程序员来说,熟悉业务就是建立“正确”的domain。在正确上打引号是因为,domain没有觉得的正确,只有相对的“适合”。毕竟domain是抽象、提炼出来的东西。