fxzeng

ruby && watir

统计

留言簿(3)

阅读排行榜

评论排行榜

2006年12月23日 #

小组里面又有一个人开始玩ruby了

小组里面又有一个人开始玩ruby了.. :)
看来他的兴致比我还高啊..
一个尽的说ruby的好..
:)
不过最近ruby论坛怎么就没什么人呢??
ruby太简单了?? 没什么好讨论的??

posted @ 2006-12-23 10:14 Fxzeng's space 阅读(628) | 评论 (0)编辑 收藏

2006年11月12日 #

上海公交真烂

上海公交真烂上海公交真烂上海公交真烂上海公交真烂上海公交真烂上海公交真烂上海公交真烂上海公交真烂

posted @ 2006-11-12 09:59 Fxzeng's space 阅读(219) | 评论 (1)编辑 收藏

2006年10月29日 #

split用法

前几天用split的时候发现一个programming ruby里没提到的用法, 刚刚开始还吓了一大跳..
不知道大家知道不, 分享一下先
"aa,bb,cc".split(/(,)/)
结果是['aa', ',', 'bb', ',', 'cc']
而不是期望中的 ['aa', 'bb', 'cc']
原来正则表达式中的括号搞的鬼
如果写成"aa,bb,cc".split(/,/)就是会得到期望中的结果了

posted @ 2006-10-29 20:06 Fxzeng's space 阅读(1039) | 评论 (1)编辑 收藏

2006年9月27日 #

今天老板请客

今天老板请客,, 很早就回家了,,好爽啊,,天天如此多好啊..
不过如果真是这样就没人当leader了,,呵呵..

posted @ 2006-09-27 20:05 Fxzeng's space 阅读(165) | 评论 (0)编辑 收藏

2006年9月19日 #

为百度鸣不平

最近百度被多家公司上告, 接着又招黑客攻击, 各大门户网站纷纷对此事大做文章, 好象这类事情只要一摆出来评论, 骂声总比理解的声音多, 作为一个网民, 尤其是一个中国的网民, 仅在此声援百度, 希望百度能够顶住这一关. 有评论说百度的使用者大多是学生, 这点我深有体会, 但是, 今天的学生, 不就是明天的社会支柱么?

posted @ 2006-09-19 21:41 Fxzeng's space 阅读(154) | 评论 (0)编辑 收藏

cvs 命令 [转载]

原作者:weiqiong#g.com
首发于
www.linuxmine.com

1. 导入一个源代码库:
源代码库在目录/home/weiqiong/project,其下有文件test.c和test.h
shell>cd /home/weiqiong/project
shell>cvs import -m "test project" test(需要导入的项目名) weiqiong(开发商信息) start(版本信息)

2. 获得第一份工作copy
shell>cd /home/weiqiong
shell>cvs checkout test
则目录/home/weiqiong/test中就会有test.c和test.h两个文件

3. 检查工作拷贝(-Q为去除无关的提示文字)
shell>cvs -Q update(将cvs上的更新下载到本地)
shell>cvs -Q diff -c(比较cvs上和本地的代码的不同)
如果希望查看某一特定文件的变化,在最后加上文件名

4. 浏览记录信息
shell>cvs log test.c

5. 查看两个版本的不同之处:
shell>cvs diff -c -r 1.3 -r 1.4 test.c

6. 恢复旧版本:如果当前最新版本为1.4,而你想将其恢复到1.3版本,重新建立一个新版本1.5
shell>cvs -Q update -p -r 1.3 hello.c > hello.c
(如果没有-p,表示检验出1.3版本,但是会sticky;加上-p,将1.3版本打到标准输出中,且没有sticky,此处覆盖hello.c文件)
shell>cvs update hello.c
(可选,但是一般ci之前都要update一次)
shell>cvs ci -m "reverted to 1.3 code" hello.c
或者
shell>cvs update -j 1.4 -j 1.3 hello.c
(将1.4->1.3的差异,应用到当前版本上)
shell>cvs update hello.c
(可选,但是一般ci之前都要update一次)
shell>cvs ci -m "reverted to 1.3 code" hello.c

如果是目录
在你需要恢复的目录下
cvs tag TAG_R1_0_0_2
cvs update -j TAG_R1_0_0_2 -j TAG_R1_0_0_1
cvs update
cvs ci -m "restore to R1_0_0_1"
或者
在你需要恢复的目录的上一级目录中
cvs export -d project_name.old -r TAG_R1_0_0_1 project_name
cp -rf project_name.old/* project_name/
rm -rf project_name.old
cvs update
cvs ci -m "restore to R1_0_0_1"

请注意,内容是恢复到了TAG_R1_0_0_1,但是版本一直在增加。

7. 增加文件
vi newfile
cvs add newfile(若为二进制文件则用cvs add -kb readme.doc)
cvs ci -m "add newfile" newfile

8. 删除文件
rm newfile.c
cvs remove newfile.c
cvs ci -m "removed newfile.c" newfile.c

9. 增加目录
mkdir newdir
cvs add newdir

10. 要增加带有多级目录和文件的子目录,方法是导入一个目录
比如原项目叫abc,在abc目录下想增加一个带有多级目录和文件的目录jni,
cd jni
cvs import -m "new dir jni" abc/jni weiqiongimport R1_0_0_0
然后,客户端(自己和其他人的客户端)需要
cvs update -d 获取最新的目录更新

11. 删除目录
先删除目录下的所有文件,然后
cvs update -P 从工作copy中删除空目录,但是源代码库依然保留着空目录
如果需要更新工作copy的目录与源代码库完全一致(主要是包括空目录),需要
cvs update -d

如果不需要恢复,应该
到服务器上rm -rf删除该目录
在客户端,rm -rf删除该目录,然后在该目录的同级CVS目录下,修改Entries文件,删除带有该目录名的一行

12. 导出不带CVS目录的源文件,export只能针对一个TAG或者日期导出,空目录不会被导出:
cvs export -r release1 project_name
cvs export -D 20021023 project_name
cvs export -D now project_name
cvs export和cvs co module的区别在于export不生成CVS目录,也不导出空目录,用于作发布

13. 确认版本里程碑
cvs tag release_1_0

14. 开始一个新的里程碑,标记所有文件开始进入2.x的开发
cvs commit -m "make all release 2.0" -r 2.0
cvs up -A

15. 版本分支的建立
在开发项目的2.x版本的时候发现1.x有问题,但2.x又不敢用,
则从先前标记的里程碑:release_1_0导出一个分支release_1_0patch
cvs rtag -b -r release_1_0 release_1_0patch projname

一些人先在另外一个目录下导出release_1_0patch这个分支:解决1.0中的紧急问题,
cvs checkout -r release_1_0patch
而其他人员仍旧在项目的主干分支2.x上开发

在release_1_0patch上修正错误后,标记一个1.0的错误修正版本号
cvs tag release_1_0patch_1
如果2.0认为这些错误修改在2.0里也需要,也可以在2.0的开发目录下合并release_1_0patch_1
中的修改到当前代码中:
cvs update -j release_1_0patch_1
(将release_1_0patch->update -j release_1_0patch_1的改变,merge到当前的版本中)

16.修改某个版本注释:
每次只确认一个文件到CVS库里是一个很好的习惯,但难免有时候忘了指定文件名,
把多个文件以同样注释commit到CVS库里了,以下命令可以允许你修改某个文件某个版本的注释:
cvs admin -m 1.3:"write some comments here" file_name
修改从1.2->1.3checkin时的注释

17.在注释中可以加入以下宏,cvs会自动将其替换为相应的项
$Id$ $Header$ $Author$ $Date$ $Revision$ $Log$ $Source$ $Name$

18.查看当前各文件的状态,包括文件的当前编辑版本号,源代码库版本号,文件的状态
cvs status filename

19.粘着选项
cvs update -D "1999-04-09"
删除粘着,回到当前最新版本
cvs update -A

posted @ 2006-09-19 20:26 Fxzeng's space 阅读(528) | 评论 (0)编辑 收藏

2006年9月16日 #

rubychina.org

http://www.rubychina.org/
一个关于ruby/rails 以及相关技术的论坛, 偶是斑竹之一, 大家多多关照.

posted @ 2006-09-16 08:19 Fxzeng's space 阅读(629) | 评论 (0)编辑 收藏

2006年9月10日 #

UTF-8与UNICODE [转载自 http://www.cppblog.com/zuroc/archive/2006/02/15/3269.html ]

看到有前辈写了一个 UTF-8与UNICODE相互转换的代码 , 顺便提一下,希望可以给大家提供一点帮助.
下面是一些编码格式的bit长

Examples of fixed-width encoding forms:

Type Each character
encoded as
Notes
  7-bit a single 7-bit quantity example: ISO 646
  8-bit G0/G1 a single 8-bit quantity with constraints on use of C0 and C1 spaces
  8-bit a single 8-bit quantity with no constraints on use of C1 space
  8-bit EBCDIC a single 8-bit quantity with the EBCDIC conventions rather than ASCII conventions
16-bit ( UCS -2) a single 16-bit quantity within a code space of 0..FFFF
32-bit ( UCS -4) a single 32-bit quantity within a code space 0..7FFFFFFF
32-bit ( UTF -32) a single 32-bit quantity within a code space of 0..10FFFF
16-bit DBCS process code a single 16-bit quantity example: UNIX widechar implementations of Asian CCS's
32-bit DBCS process code a single 32-bit quantity example: UNIX widechar implementations of Asian CCS's
DBCS Host two 8-bit quantities following IBM host conventions

Examples of variable-width encoding forms:

Name Characters are encoded as Notes
UTF -8 a mix of one to four 8-bit code units in Unicode
and one to six code units in 10646
used only with Unicode/10646
UTF -16 a mix of one to two 16 bit code units used only with Unicode/10646

Boost中提供了一个UTF-8 Codecvt Facet,可以在utf8和UCS-4(Unicode-32)之间转换.
使用方式如下

  //...
  // My encoding type
  typedef wchar_t ucs4_t;

  std::locale old_locale;
  std::locale utf8_locale(old_locale,new utf8_codecvt_facet<ucs4_t>);

  // Set a New global locale
  std::locale::global(utf8_locale);

  //  UCS-4 转换为 UTF-8
  {
    std::wofstream ofs("data.ucd");
    ofs.imbue(utf8_locale);
    std::copy(ucs4_data.begin(),ucs4_data.end(),
          std::ostream_iterator<ucs4_t,ucs4_t>(ofs));
  }

  // 读入 UTF-8 ,转换为 UCS-4 
  std::vector<ucs4_t> from_file;
  {
    std::wifstream ifs("data.ucd");
    ifs.imbue(utf8_locale);
    ucs4_t item = 0;
    while (ifs >> item) from_file.push_back(item);
  }
  //...
UTF-8 Codecvt Facet详见

http://www.boost.org/libs/serialization/doc/codecvt.html

posted @ 2006-09-10 13:12 Fxzeng's space 阅读(566) | 评论 (0)编辑 收藏

昨天买了一个新手机

昨天我买新手机, 呵呵, samsung anycall e900, 欧版, 电池超垃圾, mp3音质一般般. 呵呵, 不过2100的价格也是超值了,

posted @ 2006-09-10 09:13 Fxzeng's space 阅读(236) | 评论 (0)编辑 收藏

2006年9月2日 #

watir 处理弹出窗口 [fxzeng 原创]

watir 处理弹出窗口 [fxzeng 原创] (转载请保留此标志)

fxzeng
mail: fxzeng@126.com


处理弹出窗口是进行web测试的必经之路, 对于对于初学者这似乎是一个并不太好解决的问题, watir 自带的unittests里有这样的例子,但是牵扯的文件多, 而且还涉及到块的调用, 往往初学者只能照葫芦画瓢的解决这个问题.

这里介绍一种简便的处理方法, 先看看unittests中是如何处理弹出窗口的:
共牵扯到三个文件
#-----------------unittests/jscript_test.rb-------------------------------
     # check_dialog, to create a new thread to help push the dialog button
     #
    def check_dialog(extra_file, expected_result, &block)
        goto_javascript_page()
       
Thread.new { system("rubyw \"#{$mydir}\\#{extra_file}.rb\"") }
        # system(), call win cmd to run
jscriptExtraAlert.rb

        block.call
        testResult = $ie.text_field(:id, "testResult").value
        assert_match( expected_result, testResult ) 
    end

    # test method
    def test_alert_button()
        check_dialog('jscriptExtraAlert', /Alert OK/){ $ie.button(:id, 'btnAlert').click }
    end
#--------------END--jscript_test.rb-------------------------------

#---------------unittests/jscriptExtraAlert.rb-------------------------------
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..') if $0 == __FILE__

require 'watir/WindowHelper'

helper = WindowHelper.new
helper.push_alert_button()


#-------------END--jscriptExtraAlert.rb-------------------------------

#-------------watir/WindowHelper.rb------------------------------
require 'win32ole'

class WindowHelper
    def initialize( )
        @autoit = WIN32OLE.new('AutoItX3.Control')
    end

    def push_alert_button()
        @autoit.WinWait "Microsoft Internet Explorer", ""
        @autoit.Send "{ENTER}"
    end
#------------END--WindowHelper.rb--------------------------
文件之间的调用关系真是够复杂的, : ) 涉及到了三个文件, 如果需要按Cancel键的话还得增加一个jscriptExtraConfirmCancel.rb, 需要处理安全警告的话还得增加一个...., 或许你会说, 这些文件都不复杂, 写在主文件里不就行了么, 干吗还得调用文件?? 呵呵, 试试就知道为什么了...
这里介绍的方法用一个文件就可以代替原来的多个文件, 即可以处理确认, 撤消, 安全警告, 选择文件等多种情况的弹出窗口.
#----------main-method-----------------------------
def test_push_button
    ... ...
    thrs = []
    thrs << Thread.new{system("rubyw #{mydir}\\myWinHelper.rb Microsoft delete TAB ENTER")}
    # Microsoft, title of the popup window, delete, text contained in the window, TAB ENTER, push TAB key then ENTER
    thrs << Thread.new{$ie.button(:id, 'btnAlert').click }
    thrs.each{|x| x.join}
    ... ...
end
#---------END--main-method--------------------

#--------myWinHelper.rb-----------------------
require 'win32ole'

autoit = WIN32OLE.new"AutoItX3.Control"

title = ARGV[0]
texts = ARGV[1]
operation = []
for i in 2..(ARGV.lengh - 3)
    operaton << ARGV[i]
end
autoit.WinWait(title,texts)
operatoin.each{|x|
    autoit.Send"{x}"
}
#---------END--myWinHelper.rb------------

这样, 弹出窗口问题就可以轻松解决了, 只需一个myWinHelper.rb就可以处理确定取消等常见问题, 这里的myWinHelper.rb只是一个例子, 如果有兴趣, 可以在里面添加语句, 可以轻松处理更多问题, 比如
安全警告窗口:
    thrs << Thread.new{system("rubyw #{mydir}\\myWinHelper.rb \"TAB 3\" ENTER")}
    # push TAB key three times, and ENTER
选择文件窗口:
    thrs << Thread.new{system("rubyw #{mydir}\\myWinHelper.rb d:\\file\\test.txt !o")}
    # enter the directory of the file, and then push Alt+o

watir 处理弹出窗口 [fxzeng 原创]

fxzeng
mail: fxzeng@126.com

posted @ 2006-09-02 19:50 Fxzeng's space 阅读(2186) | 评论 (3)编辑 收藏

仅列出标题