‘Ruby’ 分类的存档

老婆出去玩了,我一个人在家里没事干,花了一天用Ruby写了一个开心网的Shell。目前支持“争车位”的功能。

2008年9月21日02:19 | 1 条评论
分类: Ruby, Web
标签: ,

我认识的很多人都是开心网的用户。而这些人中,又几乎所有的人都在玩“争车位”的组建游戏。我也玩了一下,一开始觉得挺能满足人的虚荣心的,毕竟可以通过鼠标就可以买到自己梦想的车了。但是不到一星期,我就有了写一个程序,自动去玩的冲动。
最开始写了一个简单的贴条程序,也就是根据一些策略,给自己车位上的车贴条。(这就是为什么有的人会发现我早上6点多给他们的车贴条的原因,显然我是不可能6点钟起床的)后来,老婆说有一个人老贴他的条,想小小的报复他一下。我就又写了一个小程序,定期的据报那个人的车(如果在自己的车位上就直接贴条了)。这个程序没有怎么使用,老婆就说已经和平解决矛盾了。
共享一下我对于“争车位”游戏的技术分析:
首先,因为开心网登录没有使用capcha,就是经常看到的验证码机制,所以给写程序登录开心网亮了绿灯。
第二,这个游戏的算法简直太简单了,因该不能称为游戏吧,因为它的交互性很少,都是一个人自己玩(这个与从Facebook上抄袭过来的朋友买卖是鲜明的对比)。更像是一个初学级别的算法题。
第三,这个游戏前台即使使用的是Flash也没有对HTTP请求的内容进行加密。这样我就可以轻易的截取这个游戏发送的所有HTTP请求进行分析了。发现,制造类似的请求非常之简单。
介绍四个“争车位”游戏的内部机制:

在“争车位”游戏的首页,源代码中找到var v_userdata=这一行JavaScript,后面就是一个JSON格式的数据信息,包含了自己车位的信息。(比如,车位上停了什么车,谁的车,挣了多少钱,车位的ID,等等,另外还有自己车的信息)找到var g_verify=这一行,后面就是一个verify string,只要有了这个字符串,开心网就会认为对面是一个用户。
/parking/post.php是贴条的网址。只要把自己的某个车位ID以及那个验证字符串和一个置为空的下划线变量POST到这个网址。这个车位上的车就会被贴条。(当然必须是你自己的车位)
/parking/usercar.php是获得好友的“争车位”数据的的网址。只要把好友的用户ID(是一串数字,并不是用户名,在任何开心网的URL里面看到uid=xxxxxxx,这个就是用户ID了)以及验证信息作为参数GET这个网址,就会得到这个好友的车位信息和所有的汽车的信息。包括,几辆车,停在哪里,等等。这个没有好友限制,任何人的信息都可以得到。(只要你能知道对方的用户ID)
/parking/call.php是举报的网址。只要把指定的车位ID以及验证信息POST给这个网址,就把该车位上的车举报了。这个是有好友限制的,也就是必须是好友才能举报。

只要搞定了这4条,写程序去“争车位”就应该没有什么问题了。
最后附上一个简单的贴条程序:(用Ruby写的)
http://www.zhangdi.name/UserFiles/File/kx_parking.rb

2008年9月17日17:40 | 2 条评论
分类: Ruby, Web
标签: , ,

在Ubuntu或者Debian中,使用gem安装某些程序的时候,会出现下列错误:

extconf.rb:1:in `require’: no such file to load — mkmf (LoadError)

解决方法很简单:

sudo apt-get install ruby1.8-dev

2008年9月16日00:47 | 没有评论
分类: Ruby
标签: ,

一直在非常缓慢的学习RubyOnRails。工欲善其事,必先利其器。程序员的利器之一就是编辑器。所有接触过Rails的人,都会对一个叫做TextMate的编辑器记忆深刻。但是我不是Mac用户,而TextMate又坚持不出Linux和Windows版本。想花钱用都没有机会。(当然,除非先花钱买个MacBook)这就坚定了我继续使用我自己的利器--Vim的决心。
在Ubuntu里面配置Vim非常简单。apt-get吧。然后gem install vim-ruby吧。这样你的Vim就有了最新的对于Ruby的支持。这还不够,因为我要开发Rails应用。要让Vim懂Rails。有个非常帅的Vim插件,rails.vim。它可以让人不离开Vim把Rails的一切都搞定。比如,script/generate model xxx,只需要在Vim里面:Rgenerate model xxx。还可以帮助非常快速的在Rails项目中切换文件。功能很强大,具体看这里吧。
不过,我使用的Rails是2.1+版本,这个rails.vim有一点问题。在:Rgenerate migration xxx的时候,总是打开一个空文件,而不是自动生成的migration文件。经过研究,发现原来是Rails2.1+后,每个migration文件的前缀由原来的序号变成了一个UTC的时间字符串。而rails.vim的策略是先-p执行一下命令,然后分析生成的文件名,再真正执行命令,最后打开文件。这个逻辑对于其他的命令都OK,只有migration不行。就是因为它的命名规则中加入了UTC时间字符串。导致了第一次-p执行和第二次真正执行之间文件名不同(因为时间还是稍微有差别的,比如1秒)。
知道了问题,就可以轻松把它修正。这就是源代码的力量。
在rails.vim中搜索这句话:

1
edit `=RailsRoot().’/’.file`

替换为:

1
2
3
4
5
6
7
if target == "migration"
let suffix = strpart(file, stridx(file, "_"))
let filename = system(’ls ‘.RailsRoot().’/db/migrate/*’.suffix)
edit `=filename`
else
edit `=RailsRoot().’/’.file`
endif

2008年8月26日18:53 | 没有评论
分类: Ruby
标签: , , ,

最近流行一种游戏,叫做“数独”,英文叫Sudoku,听着应该是从日本那边过来的。我曾经做过几个,发现这个东西如果纯粹用眼睛和大脑来解决确实有很大的难度。但是如果你加上纸和笔,那么难度就会降低95%,而如果你借助于更先进的Excell,那么难度就会降低99%。我最终的结论就是,这个东西是个体力劳动。
如果有人还没有接触过数独,那这里就来大概介绍一下:数独应该算是一种九宫格游戏。他是由3*3个九宫格组成的一个大正方形。要求你在9*9个格子里面分别填入适当的1..9的数字,然后让每一行,每一列中的9个数字都包含1..9。另外,每个九宫格中也要包含1..9。下图就是一个数独。

我曾经和LP说过,这个东西实在变态,是一个纯粹的浪费时间的东西。我就异常后悔曾经花了几个人时去做数独。不过,这个月买了《新知客》后,遇到了更变态的事情,那就是,它变态到附赠了一个增刊,其中有28个数独。而且说:“空前震撼!28道数独让你过足瘾!”。更过分的是,其中有些数独本身就是错的(比如,一个九宫格内竟然出现了两个8~)。答案更是错误百出。不知道这些编辑们都是不识数呢,还是不明白数独的规则。
学习Ruby也有一段时间了,突然就想,正好拿这个练习一下。所以花了3个晚上和一个白天的时间用Ruby写了一个解决数独的程序。目前经过我做的一些基本测试,工作还算正常。如果有兴趣,可以在这里下载玩一玩。当然,因为是Ruby,所以还需要Ruby的Interpreter。然后在命令行窗口运行ruby sodoku.rb就可以了。(我是在Windows下写的,所以没有shebang。)
我的感觉就是,用Ruby写程序真的是一种享受。感觉需要用到的东西都是非常straightforward,没有什么要用到的东西需要你自己去费劲配置和研究的。而且大多数API,都可以直接猜出来。比如我写这个的时候,很多用到的API都是先猜着写,然后再看Ruby的API文档,竟然发现没有什么错误。证明了我是一个聪明的人。。。更证明Ruby的API和语法设计的非常友善。呵呵。
我用的算法应该也不是最优的(类似于判别树的算法),但应该比纯粹的枚举要好多了。欢迎讨论,如果大家对算法有兴趣。我正在打算专门写一个网页来介绍我的程序逻辑,不出意外,应该下周一之前写完。欢迎大家提意见。
另外,也有一个计划就是把它变成一个网络应用。不过那就需要更多的测试和调优了。

2007年9月6日22:33 | 2 条评论
分类: Fun, Ruby

module OutputHelper
def print_line(msg)
print msg + “\\n”
end
end

class SayHello
include OutputHelper
private :print_line
def initialize(name, &sayHello)
@name, @sayHello = name, sayHello

if @sayHello == nil
@sayHello = proc { |msg| print_line msg }
[...]

2007年8月22日15:27 | 6 条评论
分类: Ruby
标签: , ,

今天看到railschina论坛上一篇贴子在讨论在Ruby中,puts str是不是等于print str + “\n”。因为一位同学做了实验,在irb中,在多线程环境下使用puts似乎有问题,有的时候字符串和换行的顺序会乱,而用print就没有问题,所以得出结论,认为puts是不等于print + “\n”的。又有人提出质疑,因为做了另外的实验,在非irb环境下,puts和print都没有问题,所以认为多线程问题只是主观臆测,有可能是irb的问题。甚至还有人写信给Dave,结果Dave也没有给出明确的答复~
正好手头上有Ruby的源代码,所以翻出来看了一下,在io.c中,明确的写明了Ruby中ios.puts方法的实现:

VALUE
rb_io_puts(argc, argv, out)
int argc;
VALUE *argv;
VALUE out;
{
int i;
VALUE line;

/* if no argument given, print newline. */
if (argc == 0) {
[...]

2007年8月21日22:18 | 没有评论
分类: Ruby