作者归档:船长

用Benchmark测试不同ruby代码的运行速度

如果比较功能相同的几组代码的运行速度, 可以使用ruby语言里的Benchmark模块.
(开始前 设置中文环境, $KCODE = ‘u’)
比如, 连接两个字串, 如:
str1 = "中国"
str2 = "一定强!!!"

可以使用+
?> str1 + str2
=> "中国一定强!!!"
也可使用
>> "#{str1}#{str2}"
=> "中国一定强!!!"
还可以使用<<
>> str1 << str2
=> "中国一定强!!!"
(注意这种方法会改变str1的值,
>> str1
=> "中国一定强!!!")

如果想要知道这三种方法哪一个速度更快, 就可以使用Benchmark比较.
先定义三个不同的方法:

def joined_by_plus(str_a, str_b)
    500000.times do; str_a.dup + str_b; end
end

def joined_by_uniting(str_a, str_b)
    500000.times do; "#{str_a.dup}#{str_b}"; end
end

def joined_by_adding(str_a, str_b)
    500000.times do; str_a.dup << str_b; end
end

因为这三种方法速度都很快, 比较一次的时间很难分出上下, 所以每种方法都做500000次.
因为<< 会改变变量, 所以在第三个方法中使用了str_a.dup, 备份出一个str_a来测试, 其它二个方法虽然从理论上不须要这个dup, 但为了时间上的公平, 也给它们加上了.

下面是测试代码:
require ‘benchmark’

Benchmark.bmbm(10) do |t|
  t.report(‘加号连接’) { joined_by_plus(str1, str2) }
  t.report(‘放进引号’) { joined_by_uniting(str1, str2)}
  t.report(‘使用<<’) { joined_by_adding(str1, str2)}
end

bmbm是Benchmark的测试方法, 这是双重测试, 用来提高精确度. 里面参数10用来调节标签在结果里的显示占位宽度, 不对结果产生影响.
report(‘加号连接’)里的参数是为相应测试的标签名, 用来区别测试结果.

下面就是结果:

Rehearsal ————————————————
加号连接   1.800000   0.580000   2.380000 (  2.435614)
放进引号   2.080000   0.590000   2.670000 (  2.706669)
使用<<       2.000000   0.580000   2.580000 (  2.635540)
————————————— total: 7.630000sec

                   user     system      total        real
加号连接   1.810000   0.600000   2.410000 (  2.476613)
放进引号   2.050000   0.600000   2.650000 (  2.656080)
使用<<       1.960000   0.600000   2.560000 (  2.567434)

因为使用了bmbm方式, 所以会有两个结果, 第一个是演习结果, 第二个是真实结果.  如果使用bm方法, 将只会有一组结果.
结果有user时间, 系统时间, 总时间和实际花费的时间. 单位为秒.

从结果可以看出, 使用+连接两个字串时速度最快, 而放进引号的方法最慢. 不过从结果也可以看出即使进行500000执行的结果也相差在0.3秒之内, 平时换用问题不大.

看来不是这一次, 希望下次你在自己的Benchmark试验中, 会发现给你的程序带来巨大速度提供的代码.

发表在 Ruby on Rails | 留下评论

用ruby语言以句子为单位拆分一个字串

目标, 用ruby语言以句子为单位拆分一个字串. 如:
给出字串:
s="这是一个句子,另一个句子.一个新句子!难道这不是另一个句子吗?"
将它分拆为:
 ["这是一个句子,"], ["另一个句子."], ["一个新句子!"], ["难道这不是另一个句子吗?"]
样式.
测试前将ruby的$KCODE环境变量设置为’u', 启动UTF8编码支持中文.
$KCODE=’u’
尝试1:
>> s.split(/\.|,|\?|\!/)
=> ["这是一个句子", "另一个句子", "一个新句子", "难道这不是另一个句子吗"]
等同于:
>> s.split(/[.,!?]/)
=> ["这是一个句子", "另一个句子", "一个新句子", "难道这不是另一个句子吗"]
虽然分开了句子, 但失去了标点.

>> s.split(/([.,!?])/)
=> ["这是一个句子", ",", "另一个句子", ".", "一个新句子", "!", "难道这不是另一个句子吗", "?"]
用括号将正则组成一组, 标点出来了, 但和句子是分开的.

改用scan
>> s.scan /.+?[.,?!]/
=> ["这是一个句子,"], ["另一个句子."], ["一个新句子!"], ["难道这不是另一个句子吗?"]
成功了!!

如果一定要这样:
>> s.scan(/(.+?(\.|\?|\!))/).collect{|p|p[0]}
=> ["这是一个句子,另一个句子.", "一个新句子!", "难道这不是另一个句子吗?"]
也是可行的.

发表在 Ruby on Rails | 留下评论

svnX出错的解决办法

svnX是苹果上的svn图形管理软件, 下面是我总结的常见错误解决办法.
1.导入一个已经被SVN管理过的文件夹, 这时要先删除原有的svn记录:
到新移入目录的根目前执行:
find ./ -name ".svn" | xargs rm -Rf
2.用svnx删除一个文件夹出现 has no URL 错误.
手动用命令删除:
svn delete app/folder
svn commit -m ‘mission impossible’
3.覆盖文件后出现commit错误
先拿开那个文件或文件夹, 执行delete文件/文件夹操作, 然后放入新文件/文件夹, 执行add操作
4.ignore已经被收录的文件/文件夹
方法同上, 先移开这些文件/文件夹, 执行delete操作, 然后
svn propset svn:ignore "*" app/folder
svn commit -m ‘ignore!!!’
然后再移回旧文件.
另: 今天刚下载了苹果上的另一个svn管理工具Versions beta, 还没详细试用, 不清楚效果.

发表在 信息处理 | 一条评论

GPS

就在超市口的一个拐角, 他靠着绿化栏半躺在地上. 破破烂烂的衣服一块灰一块黑. 领域内摆着一个变形了的搪瓷碗. 碗里零星地散着几个硬币.
刚吃完午饭的他一边有节奏地上下晃着斜歪着的头, 一边哼着什么. 显然是那种很适合看女人大腿时哼着的东西.
苍蝇不时落在他的脚上. 他已经不对苍蝇动手了. 开始是讨厌, 然后他慢慢同情起这些飞虫起来, 认为这些虫子大概也样是无家可归的. 但, 现在这种同情也慢慢地淡漠了. 生活就是残酷的 — 也许这就是三天后他认为更成熟的想法…
三天了! 终于三天了… 他一边感觉到一种解脱, 同时竟也感觉到一种怀念…
就在这时, 突然传来一首"月亮之上". 是一条短信: "北, 200米, 光头".
他立马起身, 从身后掏出一手枪.
"他妈的北在哪里???"他愣了2秒, 但随即掏出一手机大小的设备, 中间是一个血红的大箭头, 箭头上方是四个斗大的汉字– "他妈的北"!

发表在 某时雨集 | 留下评论

感古都许昌

悠悠今日水
依依古灞陵
枭雄挥剑去
闲云却长停

发表在 某时雨集 | 留下评论

崔颢《长干行》(其一)

君家何处住?
妾住在横塘.
停船暂借问,
或恐是同乡.

看来古代的美女很会泡帅哥啊…

发表在 诗词精选 | 留下评论

Rails string字符串相关转换

总结字串转变到其它与它相关的object的方法. 在这里整理分享一下, 希望能帮助到你.

变量相关
读取

instance_variable_get("@name")     #返回@name值

设置

instance_variable_set("@name", "三国演义") #@name =  "三国演义"

method相关
string到method名
send

book.send("name") #返回 book.name值

注意: book.send("name") = "三国演义" 会出错.
但可以:

book.send("name=", "三国演义") #book.name = "三国演义"

单复数转化
string复数化
pluralize
可用于生成table_name

"country".pluralize #=> "countries"

string单数化
singularize
和上面的相反

"posts".singularize #=> "post"

table和class相关

将表格名转成class名
classify

"blog_pictures".classify #=> "BlogPicture"

转成table_name(和上面的相反)
tableize

"BlogPicture".tableize #=> "blog_pictures"

将class名转成class
constantize

"Country".constantize #=> Country

可以将classify和constantize联用将string转成class model

"books".classify.constantize.find_by_name("三国演义")
#=> Book.find_by_name("三国演义")
发表在 Ruby on Rails | 留下评论

google走得远 因为知道自己要去哪里

用google很久了, 但最近看google map中的street view功能后, 我才明白什么叫真实的google earth — google正在企图将整个地球, 甚至宇宙数字化后装入自己的服务器!!!
google的目标从来就很明确, 它要管理世界上的信息. 先是管理现成的, 已经数字化的网页信息, 然后开始着手原来还没有那么数字化的图书, 广告, 视频, 地图… 现在是信息时代, 称霸信息领域其实就是称霸世界. 随着网络, 信息化的普及, 世界依靠数字信息联系成了一个整体, 人类生活和社会必会随之变革, 有一天或会不在有国家或总统, 地球最高的权威也许就是google董事…
microsoft则是在不断的变化, 先是做操作系统办公软件, 现在还一边生产游戏机和键盘, 一边跟着google搞网络.. 一心想要赚钱的当然有的会赚到大钱, 却远没有一些一直埋头做兴致的“事业”的赚钱来得潇洒.
yahoo我不知道, 我只知道它有出色的历史地位.
甚至因此可以不用过于关心后面大堆的跟风者, 因为有明确的目标, 只管走自己的路, 把自己想做的做到最好, 也许这也是google的想法.

发表在 信息处理, 成败几何 | 留下评论

半semantic, 数据的价值和数据显示

让机器读懂之前先让人读懂!
出发点?
 数据的价值不一, 因此不应该用同样的方式显示这些数据.
 
价值?
价值针对不同个体应该是不一样的, 有条件最好做到面向不同个体(根据IP地址, 性别, 年龄, 历史记录), 如果做不到就尽量力求满足最大群体.

数据怎样的价值?
有用?/没有用?
重要?/不重要?
要紧?/不要紧?

不同的显示?
文字:字体, 字体大小, 颜色, 底色… 直接改用图标?
位置,:左上角?  扔到最下面?

方案
数据和显示的对接
数据输出时附带显示模式信息, 对准备好的view pattern直接对接
out => (data, view_options)
@title, @content, @sidebar, @item.name, @item.content 变量名直接附带意义

比rails更rails
使用统一的column名, 如name, content…
使用统一的变量名, 如@title, @item…
使用统一的view patterns, 如用来显示列表的index页面, 换到哪个model一样使用.
使用统一的view 局部pattern(最简单, google, wikipedia化, 实用, 可以指出数据的重要性, 美观不是第一的, 美观还费带宽和美工), 如可以重复使用的list显示pattern, comments显示pattern….

发表在 Ruby on Rails, 信息处理 | 留下评论

成功:两种途径

这里讨论成功的两种典型途径, 为了功成名就, 希望大家耐心看完枯燥的本文.

讨论之前也许我应该先说明一下"成功"的概念. 但我以为这有点多余, 因为大凡活在世上的人都知道什么是成功.

那我直接谈成功的两种典型途径, 第一个是蓄意拼搏, 第二个是无心插柳.

先说第一个,简单地说就是通过 目标-计划-执行 实现的成功. 这是一个比较科学, 比较可操作的方法. 举例来说明. 先立一个目标, 这里对目标有几个要求: 首先目标要可行, 要相信自己通过努力可以做到, 不要把目标定得太高, 但也不要太容易实现; 第二目标要明确, 比如要量化(赚30万人民币), 比如要有清楚的时限(2012年3月6日20点11分止); 第三要时刻想到这个目标, 想到这个目标实现后能给你带来的好处, 这样在做任何事件时都会潜移默化地做对这个目标有帮助的事. 现在有了目标, 下一步就是做计划. 计划怎样实现目标, 比如在2012年前赚30万, 先考虑一个大的实现方案, 比如开包子店, 然后把目标细分: 今天是2008年3月6日, 到实现目标还有整4年时间, 为了赚30万, 四年分别赚2, 5, 10, 13万元, 那就先计划今年的2万, 那今年头一个月的目标就是把店搞起来, 那最近半个月的时间就做调查, 那明天就去选店址, 那晚上就查地图… 就类似这样的计划, 总体上计划了四年, 但晚上的分工也出来了, 以后就每天边照新的计划走, 边制定/调整新的计划.    目标-计划-执行这个现在应该算比较成熟的成功模式了.有很多优秀的相关教程, 详细大家可以参考Anthony Robbins的《Personal Power》教程和陈安之的成功学视频教程. 经过四年的认真执行后, 你的银行存款多了33万元, 那你就成功了.

然后是第二种途径, 简单地说就是忘记成功, 做你喜欢做的事, 直到有一天别人说你成功了. 也举个例子说明吧. 比如说你喜欢玩音乐, 你就整天玩吉它. 因为太喜欢了, 你加入了吉它俱乐部. 有一天你发现区上组织了一次比赛, 因为感兴趣, 你参加了, 最后你用娴熟的技能和激情的表演赢得了第二名. 两年后同样因为感兴趣, 参加了大学生乐器比赛. 但你与冠军再次失之交臂只得了复赛倒数第3名. 半年的沮丧后, 终于你的女朋友因受不起你的颓废毅然离你而去. 此时你感觉一无所有. 音乐给你带来太多的快乐和泪水, 你决心通过参加一次全国性的比赛来与它做一个了结. 如果被出局了就从此不再碰音乐, 并听从你母亲的话在毕业后去参加公务员考试…那个你走进决赛赛场的慢镜头终成为整部电影的转折点. 你再次出来时掌声淹没了你激动的哽咽, 鲜花屏蔽了你失控的鼻涕. 最感人的是其实你的女朋友也偷偷地赶去了香港到现场观看这个比赛, 此时她已经和你抱在一起. 当听到很多记者问你是怎样成功的时候, 你突然明白自己成功了. 你不但赢回了你的女友, 得到了3万奖金, 而且为你的家人, 学校, 国家, 地球争得了荣誉!

通过计划, 或通过兴趣都可以实现"成功". 但这是两个很不一样的过程, 甚至是两个很不一样的结果.
计划模式总的来说偏理性, 计划成功可操作性强, 这种成功很容易复制和再现, 而且只要目标选择得适当, 努力执行后实现的机率比较高. 设定目标和做计划比较好办, 特别是设定目标, 可能会让人感觉亢奋, 如果一心想着几年后赚上几千万,甚至可能会带来失眠这样的副产品. 但最难的是执行. 伴着执行的虽然会是对目标的憧憬, 但更多的时候是一种责任感. 长久可能会感觉自己很累, 在成功的路上很孤独… 因此要时常提醒自己, 提醒自己的目标, 并告诉自己要坚持.
通过兴趣达到成功, 整个过程都很感性. 过程的操作细节几乎没有, "跟着感觉走"就可以了, 但最大的问题是"感觉会把你带到哪里去?"  如果你最终没能在比赛中得到名次呢? 毕竟像电影主角一样拿到第一名的只有一个, 更多的是其它的参赛者!!!

两种途径说完了, 但现在我又很想反问一下"什么是成功呢?"
成功是一路艰辛地实现目标? 那人生是过程重要还是目标重要呢? 人生是过程的比例大还是目标的比例大呢? 又, 四年前的目标真的是四年后的今天你最想要的东西吗????
或, 成功是得到世人的认同? 成功的界限是奖牌, 证书或职称吗? 那你快乐地拨动着你心爱的吉它的阳光透过窗户的每个下午呢? 在得奖之前你是不是成功着的呢???
还是读者你说的"成功的标准是汽车和洋房二奶"?
你真的明白什么是成功吗?

也许这个文章本身就是一个骗局, 为什么计划和兴趣就不能并举呢? 为什么不让你的成功即能声名在外又使快快乐乐地度过每一天呢? 自己写一篇第三种成功, 第三种途径?

PS
其实这是我这几天在考虑的文章. 结合感性和理性, 结合别人的看法和自己的感受, 让自己在快乐的生活中, 有计划地做自己感兴趣的事, 慢慢地, 快乐地名利双收. 哈哈哈

发表在 成败几何 | 4 条评论