YD Blog

欢迎来到杨冬的博客
 
 

与我联系

  • 发短消息

搜索

 

常用链接

  • 我的随笔
  • 我的空间
  • 我的短信
  • 我的评论
  • 更多链接
  • 我的参与
  • 我的新闻
  • 最新评论
  • 我的标签

留言簿

  • 给我留言
  • 查看留言

随笔分类

  • .NET 开发随笔(10) (rss)
  • Ruby学习笔记(3) (rss)
  • TortoiseSVN 学习笔记 (Subversion)(7) (rss)

随笔档案

  • 2008年6月 (1)
  • 2008年5月 (3)
  • 2008年4月 (1)
  • 2007年11月 (3)
  • 2007年10月 (2)
  • 2007年9月 (3)
  • 2007年5月 (2)
  • 2007年4月 (2)
  • 2007年1月 (1)
  • 2006年8月 (1)
  • 2006年5月 (2)
  • 2006年4月 (1)

文章分类

  • .net 杂烩(5) (rss)
  • C++(6) (rss)
  • Design Patterns(1) (rss)
  • 有意思的方法(1) (rss)

同学

  • J&X's Blog
  • Tony Style | 桔子的博客

最新评论

  • 1. re: 小说阅读器 2.0
  • 打开和转编码的速度上有点慢···要等好长时间!是用多线程么?建议搞个书签
  • --LYM
  • 2. re: 6. 创建 Subversion 服务
  • 空格、引号和斜杠,一个都不能错。建议把这里的命令拷贝到记事本上然后修改
  • --YD
  • 3. re: 6. 创建 Subversion 服务
  • 为什么我总是失败呢
    输入的命令不执行
  • --cocowool
  • 4. re: 6. 创建 Subversion 服务
  • 还有视频教程:/Help/3.shtml ...
  • --SVN服务
  • 5. re: 小说阅读器 2.0
  • 这网站提供TXT下载。可以用的
  • --YD

阅读排行榜

  • 1. 1. 初识 TortoiseSVN(1194)
  • 2. 6. 创建 Subversion 服务(1119)
  • 3. C# 中信号量的使用(1119)
  • 4. 2. 创建你的 Repository(704)
  • 5. Task Manager 1.1(669)

评论排行榜

  • 1. Task Manager 1.1(5)
  • 2. 播放 wave 文件(4)
  • 3. 简单 Socket 通信(4)
  • 4. 小说阅读器 2.0(3)
  • 5. 6. 创建 Subversion 服务(3)

Powered by: 博客园
模板提供:沪江博客
博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅订阅 | 管理

2008年6月11日

如何查找某一函数的定义
今天在学《Agile Web Development with Rails, 2nd ed》的functional testing of controllers一节的时候。遇到了模拟浏览器get方法的一个函数,get。它的第三个参数可以往session里面放东西。我看的书是beta版,没有对get的参数列表的解释。开始我以为在rails文档库中可以找到定义。谁知道竟然没有。所以只能自已定位了。

原书上的函数调用代码为:
get :index, {}, { :user_id => users(:dave).id }

为了查找调用的这个get到底是哪个类的。我使用了set_trace_func这个函数。这个函数在ruby one-click installer安装后附带的《Programming Ruby》里详细介绍。它是Kernel模块的一个方法。在ruby的core文档库里可以找到说明。使用它,源码为:
    set_trace_func proc { |event, file, line, id, binding, classname|
      if (id.to_s == "get")
        printf "%8s %s:%-2d %10s %8s"n", event, file, line, id, classname
      end
    }
    get :index, {}, { :user_id => users(:dave).id }
    set_trace_func nil

这样,我就可以在控制台运行测试程序的时候查看输出了。输出为:
Loaded suite test/functional/login_controller_test
Started
    call c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.6/lib/action_controller/test_process.rb:354        get Test::Unit::TestCase
    line c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.6/lib/action_controller/test_process.rb:355        get Test::Unit::TestCase
    line c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.6/lib/action_controller/test_process.rb:355        get Test::Unit::TestCase
    line c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.6/lib/action_controller/test_process.rb:356        get Test::Unit::TestCase
  return c:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.6/lib/action_controller/test_process.rb:355        get Test::Unit::TestCase
..
Finished in 6.499 seconds.

2 tests, 6 assertions, 0 failures, 0 errors

这样,我就可以在test_process.rb里找到get的源代码和注释了。

posted @ 2008-06-11 14:32 YD 阅读(68) | 评论 (0) | 编辑
 

2008年5月25日

Ruby 线程--生产者、消费者
今天看了Ruby的线程部分。《Programming Ruby》第一版的HTML版的线程和进程部分讲得很详细。看完后感觉就好像又把操作系统的这一部分重温了一遍。尤其是Spawning New Processes那一节,如果没有学过操作系统还真不知道他说什么。

IO.popen,其中的popen,我理解应该是应该是"piped open"的意思。其中这段代码,
pipe = IO.popen("-","w+")
if pipe
  pipe
.puts "Get a job!"
  
$stderr.puts "Child says '#{pipe.gets.chomp}'"
else
  
$stderr.puts "Dad says '#{gets.chomp}'"
  puts 
"OK"
end
简直和Unix课里面的fork代码示例一样,父子进程共享同一段代码。《Programming Ruby》对这段代码的解释是“There's one more twist to popen. If the command you pass it is a single minus sign (``--''), popen will fork a new Ruby interpreter. Both this and the original interpreter will continue running by returning from the popen. The original process will receive an IO object back, while the child will receive nil. ”。第一次看我完全没看出来他说的是什么。看了代码后一时间也没往fork去想。结果过了十分钟后灵光一现才知道是怎么回事。同志们,看英文的东西不容易啊!

线程还挺好学。Ruby线程的功能是自已实现的。与操作系统无关。为了达到平台无关性,这种牺牲我觉得有点大。不说作者开发时得费多少力气。就是使用起来,也没有本地线程的种种优势。比如说线程饥饿。下面我写了一个练习性质的生产者--消费者例子。实话说,比Ruby中thread.rb里的例子要长太多……好处是,这里解决了屏幕输出时的窜行问题。
require 'thread'

class Consumer
  def initialize
(queue, stdout_mutex)
    @queue 
= queue
    @stdout_mutex 
= stdout_mutex
  
end
  
  def consume
    product 
= @queue.pop
    @stdout_mutex
.synchronize {
      puts 
"Product #{product} consumed."
      
$stdout.flush
    }
  
end
end

class Producer
  def initialize
(queue, stdout_mutex)
    @queue 
= queue
  
end
  
  def produce
    product 
= rand(10)
    @queue
.push(product)
    @stdout_mutex
.synchronize {
      puts 
"Product #{product} produced."
      
$stdout.flush
    }
  
end
end

sized_queue 
= SizedQueue.new(10)
stdout_mutex 
= Mutex.new
consumer_threads 
= []

100.times {
  consumer_threads 
<< Thread.new {
    consumer 
= Consumer.new(sized_queue, stdout_mutex)
    consumer
.consume
  }
  
  Thread
.new {
    producer 
= Producer.new(sized_queue, stdout_mutex)
    producer
.produce
  }
}

consumer_threads
.each { |thread| thread.join }

posted @ 2008-05-25 23:04 YD 阅读(160) | 评论 (0) | 编辑
 

2008年5月23日

Ruby的函数指针

本人目前正在重新学一遍Ruby语言,以期能达到一定的熟练程度。看到了块的部分,想起了C、C++、C#中无比亲切的函数指针。这东西在实现访问者模式时有很大用处。在《Programming Ruby》的HTML版中最后的部分有一节对访问者模式的实现方法的介绍。我还没有看到那里。这里说一下我的方法。

Ruby的块功能只能外挂一段代码。相比C语言家族的函数指针不是那么灵活。核心库的Proc类可以将块代码封装起来。利用它,可以将多个块一并作为参数传给调用函数。下面的代码演示了一个具体的过程。visit_node方法作为一个带两个参数的函数和proc方法一起,被传给traverse调用。注意最后一行是如何将visit_node和proc方法封装成Proc对象的。

def traverse(visit_proc, proc)
    i 
= 0
    while 
(i < 10)
        visit_proc
.call(i, i + 1)
        proc
.call
        i 
+= 1
    
end
end

def visit_node
(i, j)
    
print("#{i}, #{j}")
    puts
end

def print_sharp
    puts
("###################")
end

traverse
(Proc.new { |i, j| visit_node(i, j) }, Proc.new { print_sharp })

这样就可以达到类似于函数指针的效果了。有点类似于C#中的代理。

posted @ 2008-05-23 11:25 YD 阅读(96) | 评论 (0) | 编辑
 

2008年5月21日

Rails2.0学习--真困难
     摘要: Rails 2.0的学习不容易~~  阅读全文
posted @ 2008-05-21 23:40 YD 阅读(109) | 评论 (0) | 编辑
 

2008年4月13日

加班赶工,得不偿失——历史给你上六课
     摘要: 为什么一周工作五天,一天工作八小时?因为这会给企业带来最大效益,因为这可以更好地维护企业与员工良好的雇佣关系。

"经过上一个世纪的研究表明,每周五天且每天8小时的工作时间,从长远看其产出将会最大。有什么理由让我们认为:我们这个行业(IT业)可以不遵守这个规则呢?"  阅读全文
posted @ 2008-04-13 18:06 YD 阅读(45) | 评论 (0) | 编辑
 

2007年11月25日

7. 创建Subversion服务之补充
     摘要: 使用两个 JScript 脚本来创建和删除服务,避免手工操作的麻烦。  阅读全文
posted @ 2007-11-25 09:33 YD 阅读(209) | 评论 (0) | 编辑
 

2007年11月17日

Task Manager 1.1
     摘要: 实现了不同的权值分配策略并更改了添加/修改任务界面。  阅读全文
posted @ 2007-11-17 13:46 YD 阅读(669) | 评论 (5) | 编辑
 

2007年11月15日

开源软件:(Task Manager)任务管理-找出自己最需要完成的任务
     摘要: 使用加权算法来区分各个任务的优先级。  阅读全文
posted @ 2007-11-15 22:11 YD 阅读(269) | 评论 (0) | 编辑
 

2007年10月4日

小说阅读器 2.0
将上次发布的小说阅读器重构了一遍。除了核心的几个函数外全部换了。现在的结构应该是可以很大地改善可读性和可扩展性。

源代码下载
程序下载

又修改了bug,现在的版本是 2.0.21.3

源代码下载
程序下载

修改了 bug,版本为 2.0.23.10

源代码下载
程序下载
posted @ 2007-10-04 19:26 YD 阅读(132) | 评论 (3) | 编辑
 

2007年10月2日

6. 创建 Subversion 服务
     摘要: 如何以 Windows 服务方式来启动 Subversion 的服务器进程  阅读全文
posted @ 2007-10-02 13:21 YD 阅读(1119) | 评论 (3) | 编辑
 
仅列出标题  下一页