想法源自百度贴练字吧的“每周一练”(http://tieba.baidu.com/p/2906841172)。
大体思路很简单:由某个或者某几个人,每周发布一道题目,感兴趣的人回帖,贴上自己的代码即可。
比较符合我的想法的帖子,来自@blacktulip: http://ruby-china.org/topics/13178
比较不符合我的想法的帖子: http://ruby-china.org/topics/12837
不符合我的想法,主要并不是因为涉及到了算法,而是上面帖子里的代码,几乎每个人都把注意力放在了解决这个问题上,而不是在 Ruby 的代码上面。所有人都把代码都写在了一个方法里,与其说是在写 Ruby 代码,不如说是在写 C 代码,只不过这个 C 代码有一些语法糖罢了。另外,我对上面这个帖子本身没有任何意见,我只是说不太符合我这里的想法。
我想如果每周能有一道合适的题目,让大家都可以参与进来,并且相互讨论,应该是件比较有趣的事。
这些都是初步想法,抛砖引玉吧,有兴趣的话,大家讨论讨论。
以下个人观点:不得不说,Ruby China 现在值得看,尤其是值得参与的帖子越来越少了,很多帖子看了之后,都不知道该说些什么好。既然有这么个环境,应该好好利用。 与其让自己的朋友跟自己有同样的兴趣,不如找和自己有同样兴趣的人做朋友,我觉得像这种“每周一题”的活动,在 Ruby China 弄是最合适的,虽然不是朋友,但大家都有同样的兴趣。没有必要自己再去做个 Web App,然后召集每个人都去那里答题、做题什么的。
/-------------------------------------------------------------------------------------------------/
更新一下我预想的一道题:
例如实现一个 Rails 中的 before_filter 或者 around_filter:
class PeopleController < ApplicationController
before_filter :locate_person, :only => [:show, :edit, :update]
def show
puts "showing a person's data"
end
def edit
puts "displaying a person edit form"
end
def update
puts "committing updated person data to the database"
end
def create
puts "creating a new person"
end
def locate_person
puts "locating a person"
end
end
或者是实现一个简单的 XML Builder 之类的,我所想的题目应该是尽可能和 Ruby 相关的,题目看一眼所有人都明白意思,不会对题目本身有什么疑惑,题目本身也没有不需要很严格的限制,例如输入、输出。
题目的解决时间根据个人水平的不同,花费 15-60 分钟为最佳。因为我觉得像这样的余兴活动,只有在不花费过多时间的情况下,才可以长久。
我觉得实现一个常用方法的精简版是个不错的方向。
例如上面提到的 Rspec 的 describe it should,或者 Factory Girl 常用接口的实现方法,又或者包装一下 Ruby China 的 API 等等。
看起来都不是非常的难,但每个人实现起来总会有好有坏。
#13 楼 @willmouse 要做就做好玩点产品向的吧,重写 rspec 这种再造轮子什么的太索然无味了……
比如,写一个音频过滤器,在线实现死神小学生的变声器,能把大叔声变成可爱的男孩子声,把女神音变成女汉字音等各种效果什么的……
class TimeSetter
def self.convert(d)
y = 1980
while (d > 365) do
if (y % 400 == 0 ||
(y % 4 == 0 && y % 100 != 0))
if (d > 366)
d -= 366
y += 1
end
else
d -= 365
y += 1
end
end
return y
end
end
这个代码不知道大家有没有兴趣重构。微软的,被翻译成 ruby 了(不是我翻译的,原来代码就存在 bug,所以翻译过来也有 bug)。
出题容易,Sphere Online Judge (SPOJ) 有整套系统,支持 Ruby,玩了很多年了。关键是怎么区别开其它语言,表现出 Ruby-style。
#29 楼 @ctrlaltdeletel 我预想的题目不是这种 Puzzle 类的风格,就是类似:
The Problem: Example Input: Example Output:
这种类似 ACM 的题目,我觉得很多时候,使用 Ruby 都不如其它语言合适,而且很容易写成算法类的代码,就像我在顶楼提到的后面一种。
Thin 作者这个属于撘个脚手架,你来进一步完成,这也不太适合在论坛展开啊,太广了。
更新一下我预想的一道题:
例如实现一个 Rails 中的 before_filter 或者 around_filter:
class PeopleController < ApplicationController
before_filter :locate_person, :only => [:show, :edit, :update]
def show
puts "showing a person's data"
end
def edit
puts "displaying a person edit form"
end
def update
puts "committing updated person data to the database"
end
def create
puts "creating a new person"
end
def locate_person
puts "locating a person"
end
end
或者是实现一个简单的 XML Builder 之类的,我所想的题目应该是尽可能和 Ruby 相关的,题目看一眼所有人都明白意思,不会对题目本身有什么疑惑,题目本身也没有不需要很严格的限制,例如输入、输出。
题目的解决时间根据个人水平的不同,花费 15-60 分钟为最佳。因为我觉得像这样的余兴活动,只有在不花费过多时间的情况下,才可以长久。
LZ 的想法很实际,如果能展开确实帮助很多人。
应该以具体某些实际常见功能为题,讨论不同场景的最合适的实现代码。
比如,controller test 中 每个 action 都测试 sign in / sign out 情况 是不是多余。
首先代码有 bug, 366 无限循环了... 直接的:
require 'date'
def year_for_days_after_1980 d
(Date.new(1980) + d).year
end
#33 楼 @willmouse 穷人版 before filter
def before_filter(filter, methods)
methods.each do |m|
alias_method "__before__#{m}", m
define_method(m) {send filter; send "__before__#{m}";}
end
end
class Foo
def show
p "show"
end
def edit
p "edit"
end
before_filter :bar, [:show, :edit]
def bar
p "bar"
end
end
#39 楼 @quakewang 挺简洁的实现方法,我没想到有这么个思路。
我觉这个 before_filter 不算很简单,也不算很难,但想实现的好也是绝对不是一件简单的事,其实比较符合我的初衷。
形式上面我觉得挺好的,不过我觉得内容上面不一定要 focus 在语言,可以放在一些稍微大一些的东西上面。比如如何设计一个 todolist,如何设计一个更好的 forum,如何设计一个更好的 SNS,当然大家要给原型。有点大,可能是一个周末项目了。