发布新日志

  • ruby中eval方法的使用

    2009-03-28 18:04:55

    有时候要一组字符串能能够动态地执行,ruby中的eval方法就提供了这样的功能

    语法:
    eval( 可执行字符串)

    使用举例:
    a = 1
    b="true"
    c="false"
    str ="
    if a==1 then
    puts '输出:#{b}'
    else
    puts '输出:#{c}'
    end
    "
    eval(str)

    这样就输出为:输出:true
  • ruby 中访问mysql的一个例子

    2009-01-02 17:05:51

    require 'ActiveRecord'
    module Log
     ActiveRecord::Base.establish_connection(
        :adapter => "mysql",
        :encoding=> "utf8",
        :host => "localhost",
        :username => "root",
        :password => "baoju",
        :database => "test")  
     
      class Runstatus < ActiveRecord::Base 
        set_table_name 'runstatus' 
      end

     ActiveRecord::Base.connection.execute "SET NAMES GBK"
        class Describe < ActiveRecord::Base
          set_table_name 'testdescribe'
        end

        def log_run_status
          runstatus = Runstatus.new()
          runstatus.run_id = 3
          runstatus.run_status = 1
          runstatus.testcase = "登录hello"
          runstatus.save
          #     runstatus.start_time =
        end
        def log_test_describe

        end

        def get_data()
          Runstatus.find(:first).testcase
        end
      end

    include Log
    log_run_status
    puts get_data

  • Ruby 异常处理 rescue与ensure

    2008-12-31 23:13:51

    异常处理的结构:
    -------------------------------------
    begin 
    #开始
     
     
    raise.. #抛出异常
     
    rescue [ExceptionType = StandardException] 
    #捕获指定类型的异常 缺省值是StandardException
     $! #表示异常信息
     $@ #表示异常出现的代码位置
    else #其余异常
     ..
    ensure 
    #不管有没有异常,进入该代码块
     
    end 
    #结束
    -----------------------------------
    可以结合$!错误原因,和$@错误位置做一个错误捕获并提示的小程序,比如
    -----------------------------------
    begin
        puts 
        puts 
    "file: #{name = ARGV.shift}"
        file 
    = open(name)
        i 
    = 0
        file.read.each_line{
    |line| puts "#{i+=1}.#{line}" }
        puts
    rescue
        puts 
    "error:#{$!} at:#{$@}"
    ensure
        file.close
    end

    ------------------------------------
    上面的小程序读入一个指定的文件并加入行号进行输出,当产生错误时会输出错误信息以及提示,可以故意输入一个不存在的文件名。

    其实begin相当于c#的try
    rescue相当于c#的catch
    ensure相当于c#的finaly
    raise相当于c#的throw

    异常类的结构为:
  • Object
  • WMI 脚本 介绍

    2008-12-28 23:31:08

    什么是WMI?

    WMI最初于 1998 年作为一个附加组件与 Windows NT 4.0 Service Pack 4 一起发行,是内置在 Windows 2000、Windows XP 和 Windows Server 2003 系列操作系统中核心的管理支持技术。基于由 Distributed Management Task Force (DMTF) 所监督的业界标准,WMI 是一种规范和基础结构,通过它可以访问、配置、管理和监视所有的 — 几乎所有的 Windows 资源。

    要掌握 WMI 的强大功能和范围,需要考虑以前(或者现在)如何管理并监视 Windows 工作站和服务器。您可能用过或仍在使用众多的图形化管理工具来管理 Windows 资源 — 例如磁盘、事件日志、文件、文件夹、文件系统、网络组件、操作系统设置、性能数据、打印机、进程、注册表设置、安全性、服务、共享、用户、组等等。

    尽管图形化工具提供了一种功能管理解决方案,它们所共有的东西是什么呢?一种答案是,在 WMI 之前,所有的 Windows 图形化管理工具都依赖于 Win32 应用程序编程接口(Application Programming Interfaces,APIs)来访问和管理 Windows 资源。为什么?因为在 WMI 之前,能够以编程方式访问 Windows 资源的惟一方法就是通过 Win32 API。这种情况使 Windows 系统管理员无法通过一种简便的方法利用常见的脚本语言来自动化常用的系统管理任务,因为大多数脚本语言都不能直接调用 Win32 API。通过提供一致的模型和框架,WMI 改变了这种情况 — 通过模型和框架,所有的 Windows 资源均被描述并公开给外界。最好的一点是,系统管理员可以使用 WMI 脚本库创建系统管理脚本,从而管理任何通过 WMI 公开的 Windows 资源!

    使用 Windows scrīpt Host 和 Microsoft Visual Basic scrīpting Edition (VBscrīpt),或任何支持 COM 自动化的脚本语言(例如,ActiveState Corporation 的 ActivePerl),可以编写脚本来管理和自动化企业系统

    使用ruby和 WMI 来显示内存的一个例子

    require 'win32ole'

    mgmt = WIN32OLE.connect('winmgmts:\\\\.' + "\\root\\cimv2")

    processes = mgmt.InstancesOf('Win32_LogicalMemoryConfiguration')

    processes.each do |x|

      puts "Total Physical Memory (kb): " + x.TotalPhysicalMemory.to_s

    end

  • ruby 中使用activerecord来访问oracle

    2008-12-26 10:23:04

    1) 插件的安装:
       需要安装3个插件
       1) activerecord
       2)  activerecord-oracle-adapter
       3)  oci
      这些插件可以在 http://rubyforge.org/ 这个网站中找到
    2) 对数据库的操作方法如下:
    require 'rubygems'
    require 'ActiveRecord'
    module Log
    module Logcase
    #连接数据库
        ActiveRecord::Base.establish_connection(
          :adapter => "oracle",
          :username => "kkk",
          :password => "kkk",
          :database => "dev-db1",
          :host => "192.168.205.31"
        )

        class LogActiveRecord < ActiveRecord::Base
        end
        #建立与数据表的关联
        class Runlog < LogActiveRecord
          set_table_name "tt"
        end 
      end
    end
    include Log::Logcase
    #log = Runlog.new
    a = Runlog.find_by_sql("select * from tt t")
    puts a[0].b
      
  • gem更新出错时候的解决办法

    2008-12-14 14:36:31

    当执行gem install 命令时经常出现类似以下的错误:
    -----------------------------------------
    ERROR: while executing gem ... (Gem::installError)
    invalid gem format for ..............

    ------------------------------------------------------------------------

    解决办法,删除掉 d:\ruby\lib\ruby\gems\1.8\cache  目录下的安装文件,然后再重新安装一遍。

    另外,安装ruby1.8.6版本时自动安装了rubygem是0.9.2,现在已经有了最新版本1.3.1, 更新方法如下:

    gem install rubygems-update

    安装好之后,进入 D:\ruby\lib\ruby\gems\1.8\gems\rubygems-update-1.3.1 ,双击setup.rb,这样就升级成功了.

    实践试了下,新版本的rubygem下载速度更快,更人性化,如下载rails,如下:

    C:\Documents and Settings\allan.huangxr>gem install rails
    Successfully installed rails-2.2.2
    1 gem installed

    安装了新版本后既减少了以前多次选择安装项的麻烦,也提高了下载速度,并减少了出错的机率,一个字,爽!

  • ruby中赋值语句解析

    2008-12-13 17:11:04

    如下:

    a = [1,2,3,4]
    -----------------------------------------------
    b,c = a    => b=1,c=2
    当右边只有一个数组,ruby自动将右边的数组拆分,然后赋值给左边的变量
    -----------------------------------------------
    b,*c = a    =>b=1 ,c=[2,3,4]
    当左边变量前增加*,表明该变量是个数组
    --------------------------------------------------
    b,c = 10,a   =>b =10,c = [1,2,3,4]
    因为a是个数组,故c也是一个数组
    ---------------------------------------------------
    b,*c = 99,a   =>b = 99,c = [[1,2,3,4]]
    直接赋值,通过c前增加*,强制指定c是一个数组,但只有一个值被赋给c,故c对应的是的数组只有一个元素
    --------------------------------------------------
    b,c=99,*a      =>b=99,c=a 
    在右边的数组之前增加*,表明把数组当成多个变量使用
    ------------------------------------------------------
    b,*c = 9,*a   => b=5,c=[1,2,3,4]
    左边的c增加*,表明c是一个数组,右边的数组增加*,表明把数组当成多个值使用
    -------------------------------------------------------
    b,(c,d),e = 1,2,3,4  => b=1,c=2,d=nil,e=3
    左边的c,d被组成一个子并行赋值,对应右边的第二个值,但第二个值是一个单值,故导致只有c被赋值,e对应第三个值,也就是3
    --------------------------------------------------------
    b,(c,d),e = [1,2,3,4]  => b=1,c=2,d=nil,e=3
    当右边的值是一个数组时,系统自动将数组分成单个值,因此与前面效果相同了
    -------------------------------------------------------
    b,(c,d),e = 1,[2,3],4  => b=1,c=2,d=3,e=4
    ------------------------------------------------------
    b,(c,d),e = 1,[2,3,4],5 => b=1,c=2,d=3,e=5
    c,d 并行赋值,对应右边的[2,3,4],所以输出2,3
    --------------------------------------------------------------
    a,(c,*d),e = 1,(2,3,4),5  => b=1,c=2,d=[3,4],e=5

    上述赋值语句包含了并行赋值和嵌套赋值,在一些高级编程中经常会看到,使语句能够更加简化。









  • ruby 中如何获取当前的文件名和目录

    2008-12-09 13:34:25

    获取当前的文件名称
          puts   __FILE__  
    获取当前文件的目录名称
          puts File.dirname(__FILE__)
    获取当前文件的完整名称
          当要获取完整的路径时需要require 'pathname',代码如下:
         require ‘pathname’
         puts Pathname.new(__FILE__).realpath
        
    获取当前文件的完整目录
         require ‘pathname’
         puts Pathname.new(File.dirname(__FILE__)).realpath
    输出当前引用的路径:
            puts $:
  • ruby中几个类库文件的调用过程

    2008-12-08 21:00:33

    使用Watir的提供出来的几个方法比较简单,但是如果要了解这些方法的调用过程,还是需要花一定时间的。这里根据淘宝登录页面中的帐户名输入为例,说明下几个类库文件的调用过程,源码如下:
    ---------------------------------------------------------
    require 'watir'
    ie = Watir::IE.new
    urlsite = 'http://member1.taobao.com/member/login.jhtml?ssl=false&f=top&redirect_url=http%3A%2F%2Fwww.taobao.com%2F'
    ie.goto(urlsite)
    ie.text_field(:id,"TPL_username").set "baoju"
    ----------------------------------------------------------
    最简单的了解调用过程就是调试,但是对于ruby来说,现在好多ide还不支持调试,因此选择一款好的IDE也是比较重要的,我这里选择的是NetBeans6.5,一些调试方法,code complete等一些常用方法都已经有了,这里分析一下ie.text_field(:id,"TPL_username").set "baoju"  这句话的调用过程。

    首先查找Watir::IE类中的text_field方法,但是Watir::IE类中没有这个方法,由此到Container中查找text_field方法:
     def text_field(how, what=nil)
          TextField.new(self, how, what)
     end
    这个方法实现了TextField的初始化,调用TextField类,由于这个类的 initialize 方法在父类中实现,所以调试时直接跳到了类InputElement的initialize方法,代码如下:
    --------------------------------------------------------
    def initialize(container, how, what)
          set_container container
          @how = how
          @what = what
          super(nil)
        end
    ---------------------------------------------------------
    到此为止ie.text_field(:id,"TPL_username")执行完成,现在要做的是set方法,方法定义如下:
    ------------------------------------------------------------------------
    def set(value)
          assert_enabled
          assert_not_readonly
         
          highlight(:set)
          @o.scrollIntoView
          if type_keys
              @o.focus
              @o.select
              @o.fireEvent("onSelect")
              @o.fireEvent("onKeyPress")
              @o.value = ""
              type_by_character(value)
              @o.fireEvent("onChange")
              @o.fireEvent("onBlur")
            else
                    @o.value = limit_to_maxlength(value)
            end
          highlight(:clear)
        end
    --------------------------------------------------------------------------
    先调用 assert_enabled 方法,这个方法在父类Element(element.rb)中实现
    -----------------------------------------------------------
      def assert_enabled
          unless enabled?
            raise ObjectDisabledException, "object #{@how} and #{@what} is disabled"
          end
        end
    -------------------------------------------------------------
    这个方法中又调用了enabled? 方法,当没有时,就返回一个错误
    enabled? 的方法定义为:
    ------------------------------------------------------------
    def enabled?
          assert_exists
          return ! disabled
        end
    ------------------------------------------------------------
    这里又调用了assert_exitsts方法
    assert_exists的方法为:
    -------------------------------------------------------------
     def assert_exists
          locate if defined?(locate)
          unless ole_object
            raise UnknownObjectException.new(
              Watir::Exception.message_for_unable_to_locate(@how, @what))
          end
        end
    ---------------------------------------------------------------
    这里调用了locate方法,locate的实现为:
     def locate
          @o = @container.locate_input_element(@how, @what, self.class::INPUT_TYPES)
       end
    这里又调用了locate_input_elemen方法:
    -------------------------------------------------------------------------
     def locate_input_element(how, what, types, value=nil)
          case how
          when :xpath
            return element_by_xpath(what)
          when :ole_object
            return what
          end
          # else:
         
          locator = InputElementLocator.new self, types
          locator.specifier = [how, what, value]
          locator.document = document
          return locator.element if locator.fast_locate
          # todo: restrict search to elements.getElementsByTag('INPUT'); faster
          locator.elements = ole_inner_elements if locator.elements.nil?
          locator.locate
        end
    --------------------------------------------------------------------------------------

    这里返回具体元素,当元素有时,就定位到了元素,然后通过set下面的赋值来完成赋值操作。

  • Ruby 中类的几个概念

    2008-12-07 17:46:00

    1. 类的继承和消息
    继承允许创建一个新的类,作为另一个类的精炼和特化。 用符号<来表示继承
    如:有这么一个超类:
    -----------------------------------------------------------------
    class Song
      def initialize(name,artist,duration)
        @name = name
        @artist = artist
        @duration = duration   
      end
      def to_s
        "Song: #{@name} #{@artist}(#{@duration})"
      end
    end
    ----------------------------------------------------------------
    现在要定义一人卡拉OK的子类,来加上歌词,那么可以这样定义:
    -----------------------------------------------------------------
    class KaraokSong < Song
      def initialize(name,artist,duration,lyrics)
        super(name,artist,duration)
        @lyrics = lyrics
      end
     
      def to_s
        puts super + "#@lyrics"
      end
    end
    ---------------------------------------------------------------------
    puts song.inspect
    puts song.to_s
    --------------------------------------------------------------------
    执行结果为:
    #<KaraokSong:0x1021f34 @artist="wqs", @lyrics="my wqs", @duration=4, @name="ldh">
    Song: ldh wqs(4)my wqs
    ---------------------------------------------------------------------
    子类和超类的消息传递过程为:
    当调用song.to_s时,并不知道从何处找到to_s方法,而是将判定推迟到程序开始运行时再进行。在那时,Ruby查看song所属的类。如果该类实现了和消息名称相同的方法,就运行这个方法,否则,Ruby就查看其父类的方法 ,然后是祖父,如果在其所有祖先类中没有找到合适的方法,会引发一个错误。
    当类中没有指定父类时,默认以Object类作为父类。
    2. 对象和属性

    类的对象是有状态的,这些状态是对象私有的,其它对象无法访问一个对象的实例变量,当外部世界需要与之交互时,怎么办呢,对于java语言来说,可以定义一些方法来操作对象的状态,如:
    class song
       def name
        @name
      end
      def artist
        @artist
      end
    end
    定义name方法来返回name
    Ruby中提供了一种非常简单的方法,如:
    class song
        attr_reader :name,:artist
    end
    这里可以将:name看作是变量name的名字,而普通的name是变量的值,在这个例子中,将访问方法命名为name,artist对应实例变量@name,@artist会被自动创建。

    可写的属性 可以用attr_writer :name,:artist,如:
    class song
        attr_writer :name,:artist
    end
    虚拟属性 这类属性访问的方法并不必须是对象实例变量的简单包装

    class Song
      def duration_in_minutes
        @duration/60.0   # force floating point
      end
      def duration_in_minutes(value)
        @duration = (value*60).to_i
      end
    end

    这里我们使用属性方法创建了一个虚拟的实例变量。对外部世界来说,duration_in_minutes就象其它属性一样,然而在内部没有对应的实例变量。


  • ruby 中 Block 和 迭代器的混合使用

    2008-12-06 22:59:56

    Block是一种可以和方法调用相关联的代码块,有点象参数传递

    Block的表达方式:

    1) {........}

      如:puts {"good morning,baoju"}

    2) do .... end

    如:

      do

    puts "hello,jack"

    puts "nice to meet you"

      end

    一般来说只有一行那么使用{},如果有多行那么使用do...end

     Block与函数的关联

    block 可以和方法的调用相关联,block可以写在方法的后面,如:

    greet {puts "hi"}

    如果函数有参数,那么block写在参数的后面,如:

    greet("jack","morning") {puts "hi"}

    使用yield可以把调用block中的代码,如:

    def greet
       puts "test block"
       yield
       yield
       puts "call block two times"
    end

    puts greet {puts "hi"}

    那么输出为:

    test block
    hi
    hi
    call block two times
    ----------------------------------------------------------
    可以传递参数给对yield的调用,如:

    def hell()
      yield('morning','hxr')
    end

    puts hell {|m,n| puts "good "+m+","+n}

    那么输出为:

    good morning,hxr

    -------------------------------------

    在ruby中会经常使用block来实现迭代器,如

    (1..3).each {|i| puts i}

    输出为:

    1
    2
    3


     

     

     

  • watir中CheckBox的处理方法

    2008-11-25 22:35:03

    HTML SOURCE 如:

    Check me:<input type="checkbox",id="one",name="checkme">
    通过ID属性来操作设置checkbox
    ie.checkbox(:id,"one").set
    通过ID属性来清除设置checkbox
    ie.checkbox(:id,"one").clear

    也可以通过Name属性来操作:
    ie.checkbox(:name,"checkme").set
    ie.checkbox(:name,"checkme").clear






  • watir中Button控件的操作方法

    2008-11-25 22:15:22

    web中分为两种button控件,分别为:HTML Button 和 Image Button
    一.HTML Buttons
    Html source:
    <input type="button" id="one" name="clickme" value="Click Me">
    使用ID属性来操作:
    ie.button(:id,"one").click
    使用Name属性来操作:
    ie.button(:name,"clickme").click
    使用value属性来操作
    ie.button(:value,"Click Me").click
    二.Image Button
    Html source
    <input type="Image">
    这个标签看上去像个图片,但是像Button那样,可以通过ID,Name,Value来操作,还可以通过src标签来操作。
    如:
    <input type="image" src="images/doit.gif">
    可以使用下面的方法来操作:
    ie.button(:src,/doit/).click




  • 用户菜单

    我的栏目

    我的存档

    数据统计

    RSS订阅

    Open Toolbar