今天需要写一个copy/paste的功能。copy的动作执行以后得到都是data的reference。需要一个clone的动作。而以前的数据对象根本没有定义clone()。
可以总结一条了:当一个数据对象需要被copy/paste时,请准备好clone()方法。
对于糟糕的遗留系统的补丁,我真的觉得是浪费生命。平时觉得稀松平常的原理,在这种系统面前凸显价值,但是,这种价值此时也只能成为教训了。
今天还给诺西的同事show了一下如何用itcl写spirent testcenter的tcl。 如果当初他们写tcl之前好好建模,好好学习itcl,现在对新需求的应付应该是很轻松,很轻松了。
一个项目的成功也许是因为技术的失败而失败。但是,归根结底是因为管理的失败而失败,决策的失败而失败,用人的失败而失败。
技术上的保障只是项目成功保障链条上的最后一环,前面的环节更具决定性。
面向对象的方法是一种思考问题、解决问题的方法,不单纯的是一种语言。
2009年7月21日星期二
2009年7月16日星期四
技术平台
断断续续地琢磨CLTF也好久了。今天再看Jelly,却发现有些需要的特性是Spring提供的,而在Jelly中不能获得。再一想,Jelly提供的最基本的功能,其实自己也可以比较容易的模拟出来。看来需要考虑使用一下Spring了。
Groovy其实也应该是很好的。毕竟是解释型的,改动一起来应该很容易。
最基本的技术选择,看上去简单,确实最具影响力的。
Groovy其实也应该是很好的。毕竟是解释型的,改动一起来应该很容易。
最基本的技术选择,看上去简单,确实最具影响力的。
2009年7月15日星期三
Object System for TCL
下面这篇文章很好地讲述了用TCL语法模拟一个简单的Object system。http://users.telenet.be/koen.vandamme1/papers/tcl_objects/tcl_objects.html
对文章中的“Object orientation is really just a way of thinking; it has more to do with design than with implementation.” 深有体会。
http://www.tcl.tk/about/oo.html
这是一篇关于object tcl情况的简单介绍。到tcl 8.6,TCL将内置一个object system了。
目前存在的用于tcl的object system有:incr tcl, Snit, XoTcl ...
incr TCL的HomePage: http://incrtcl.sourceforge.net/itcl/
对文章中的“Object orientation is really just a way of thinking; it has more to do with design than with implementation.” 深有体会。
http://www.tcl.tk/about/oo.html
这是一篇关于object tcl情况的简单介绍。到tcl 8.6,TCL将内置一个object system了。
目前存在的用于tcl的object system有:incr tcl, Snit, XoTcl ...
incr TCL的HomePage: http://incrtcl.sourceforge.net/itcl/
2009年6月25日星期四
Spirent testcenter 的基本模型。
chassis就理解成一个基础设备,对应一个IP。
slot是设备上的一个插卡,其中有若干ports。
每个port上有一个generator,用这个Generator可以发送多个StreamBlock.
slot是设备上的一个插卡,其中有若干ports。
每个port上有一个generator,用这个Generator可以发送多个StreamBlock.
Something about tcl programming for Spirent TestCenter
前两天为了解决遗留程序的一个bug,动手写了点TCL程序。
TCL作为解释型的语言,并不在你第一次定义变量时给你预设一个值,哪怕是随机的值。所以,刚用起来有点不顺手。
TCL的数组其实很类似hashtable,tcl数组的index可以是任意值。所以,虽然tcl不支持多维数组,但是依旧有些小技巧模拟多维数组。这很重要,因为tcl同时没有structure类型。复杂的需要分层的数据结构只能依赖所模拟出来的多维数组了。
如下的一段代码,就是用来模拟多维数组的:
需要注意的是,必须跟后面的字符串紧挨着。
有了“多维”数组,再利用tcl的namespace eval 语句,就可以完成基本的数据结构的定义了。再写点函数,就可以模拟一个类了。
StcTools ::Traffic就可以理解为一个类。
construct()就是构造方法。
setting(handle, name, value)就可以理解为setter方法, 业务逻辑的方法就可以自己随便起名、定义了。
用这种思路写出程序比遗留代码强多了---清晰。清晰了,当然就易维护。这种思路是从TCPMP项目中学来的。TCPMP利用C语言开发,但是它利用c的结构体,以及其它技术,也构造了自己的简单的面向对象架构。我都怀疑面向对象的初始想法可能就是基于这种简单的程序架构发展而来的了。
程序开发中数据与逻辑的分离,数据层次的划分、组织,是很基本的事情。
数据的组织,又是直接和业务模型的抽象、建立相关的。
TCL作为解释型的语言,并不在你第一次定义变量时给你预设一个值,哪怕是随机的值。所以,刚用起来有点不顺手。
TCL的数组其实很类似hashtable,tcl数组的index可以是任意值。所以,虽然tcl不支持多维数组,但是依旧有些小技巧模拟多维数组。这很重要,因为tcl同时没有structure类型。复杂的需要分层的数据结构只能依赖所模拟出来的多维数组了。
如下的一段代码,就是用来模拟多维数组的:
set trafficConfig($trafficHandle,Transmit_mode) $transmit_mode;
set trafficConfig($trafficHandle,LoadUnit) $loadUnit;
set trafficConfig($trafficHandle,FixedLoad) $loads;
需要注意的是,必须跟后面的字符串紧挨着。
有了“多维”数组,再利用tcl的namespace eval 语句,就可以完成基本的数据结构的定义了。再写点函数,就可以模拟一个类了。
package provide DataCenter 0.1
set trafficConfig(NULL) NULL;
namespace eval StcTools {
namespace eval Traffic {
proc construct { trafficHandle transmit_mode loadUnit loads} {
global trafficConfig;
puts "Traffic construct() for $trafficHandle "
set trafficConfig($trafficHandle,Name) $trafficHandle;
set trafficConfig($trafficHandle,Transmit_mode) $transmit_mode;
set trafficConfig($trafficHandle,LoadUnit) $loadUnit;
set trafficConfig($trafficHandle,FixedLoad) $loads;
}
proc setting { trafficHandle name value } {
global trafficConfig;
set trafficConfig($trafficHandle,$name) $value;
}
proc printTrafficSettingInfo { } {
global trafficConfig;
puts "trafficSettingInfo:"
foreach {key value} [array get trafficConfig] {
puts " trafficConfig($key)= $value";
}
}
StcTools ::Traffic就可以理解为一个类。
construct()就是构造方法。
setting(handle, name, value)就可以理解为setter方法, 业务逻辑的方法就可以自己随便起名、定义了。
用这种思路写出程序比遗留代码强多了---清晰。清晰了,当然就易维护。这种思路是从TCPMP项目中学来的。TCPMP利用C语言开发,但是它利用c的结构体,以及其它技术,也构造了自己的简单的面向对象架构。我都怀疑面向对象的初始想法可能就是基于这种简单的程序架构发展而来的了。
程序开发中数据与逻辑的分离,数据层次的划分、组织,是很基本的事情。
数据的组织,又是直接和业务模型的抽象、建立相关的。
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的描述,就可以运行下面的代码了:
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."
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/
订阅:
博文 (Atom)