作者归档:船长

登华山

岭高步步艰
万步升半天
半天松独立
独迎迟至仙

继续阅读

发表在 人在旅途, 某时雨集, 浮光掠影 | 留下评论

无题

屋里开着一盏橘黄色的小灯。她把娇小的身子散在一张睡椅上。耳边贴着手机等待对方接通。虽然上齿只是轻微地抵着下唇,但还是让人担心那颗饱满晶莹的樱桃小嘴会被压破。她一边等待,一边抓着自己的小辫子去刷桌面上那只绒布熊的掌心,偶尔发出少女特有的调皮笑声。

他在马路对面。对着一家带着柔和的橘黄灯光的酒吧。端庄的打扮,深沉的步履,无不透露中年男子的成熟--唯一格格不入的只有那一张茫然无助的脸。他只是在路边来回徘徊。右手放在裤兜里,连同一只叫个不停的手机……

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

Ruby on Rails的session和session存储方案

session:页面间的信息保存手段。

使用:
赋值
session[:person] = @user
读取
Hello #{session[:person]}
清除
session[:person] = nil
全部清除
reset_session

Ruby on Rails提供的session存储方案:
PStore (文件存储,默认方式)
ActiveRecordStore(数据库)
DRbStore
FileStore
MemoryStore

各存储方案在性能上的比较:
Ruby on Rails Session Container Performance

如何使用ActiveRecordStore(数据库)做为session存储方案
使用数据库作为session储存方案可以让网站更方便地扩展成多服务器网站。使用方法:
1. 运行 rake db:sessions:create
2. 将config/environment.rb, uncomment 中下行的注释#去除:
       config.action_controller.session_store = :active_record_store
3. 运行rake db:migrate
4. 重启服务器。

linux上用来清除长时不用的session的cron命令:
$RAILS_APP_DIR/script/runner ‘ActiveRecord::Base.connection.delete("DELETE FROM sessions WHERE updated_at < now() – INTERVAL 1 HOUR")

发表在 Ruby on Rails | 标签为 | 3 条评论

男朋友

大作<男朋友>即将推出,敬请期待。
先占个位。。。呵呵

发表在 某时雨集 | 一条评论

webMASTER

秒刷千行码
日志万页文
网页出千里
帷幄坐一人

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

前赤壁赋 苏轼

王戌之秋,七月既望,苏子与客泛舟游于赤壁之下。清风徐来,水波不兴。举酒属客,诵《明月》之诗,歌《窈窕》之章。少焉,月出于东山之上,徘徊于斗牛之间。白露横江,水光接天。浩浩乎如冯虚御风,而不知其所止;飘飘乎如遗世独立,羽化而登仙。
于是饮酒乐甚,扣舷而歌之。歌曰:“桂棹兮兰桨,击空明兮溯流光。渺涉兮予怀,望美人兮天一方。”客有吹洞箫者,倚歌而和之。其声呜呜然,如怨,如慕,如泣,如诉,余音袅袅,不绝如缕。舞幽壑之潜蛟,泣孤舟之嫠妇。
苏子愀然,正襟危坐而问客曰:“何为其然也?”
答曰:“‘月明星稀,乌鹊南飞’,北非曹际德之诗乎?西望夏口,东望武昌,山川相缪,郁乎苍苍,此非曹孟德之困于周郎者乎?方其破荆州、下江陵,顺流而东也,舳舻千里,旌旗蔽空,酾酒临江,横槊赋诗,固一世之雄也,而今安在哉!况吾与子渔樵于江渚之上,侣鱼虾而友麋鹿;驾一叶之扁舟,举匏樽以相属;寄蜉蝣于天地,渺沧海之一粟。哀吾生之须臾,羡长江之无穷。挟飞仙以遨游,抱明月而长终。知不可乎骤得,托遗响于悲风。”
苏子曰:“客亦知夫水与月乎?逝者如斯,而未尝往也;盈虚者如彼,而卒莫消长也。盖将自其变者而观之,则天地曾不能以一瞬;自其不变者而观之,则物与我皆无尽也,而又何羡乎?且夫天地之间,物各有主;苟非吾之所有,虽一毫而莫取。惟江上之清风,与山间之明月,耳得之而为声,目遇之而成色;取之无禁,用之不竭,是造物者之无尽藏也,而吾与子之所共适。”
客喜而笑,洗盏更酌,肴核既尽,杯盘狼藉。相与枕藉乎舟中,不知东方之既白。

发表在 诗词精选 | 标签为 , | 留下评论

The Mid-autumn Festival Song 译自苏轼《水调歌头》

With a cup of wine, I ask the sky:
How often will the moon be so bright?
What date is today, on the fairyland, from where comes the moon light?
I’d like to ride the wind to fly.
Yet I fear it will be too cold to be so high.
Then, I’d just dance with my moon-lit shadow,
This dancing make me forget the daily life style.

Turning around the mansion, through the window,
you shines on a sleepless heart.
Why you’re so wholly full, even when nice people are long way apart?
We have sorrow or joy, be together or separated afar,
while you get dim or bright, wax or wane.
Maybe, that is just how things are going on.
But, may we live long!
At least, for the reason that, no matter how far apart we are,
we still can share the same moon, that is so beautiful, just upon.

不能读懂原文中国诗词的外国人应该是一个很大的不幸,我更替他们悲伤的是甚至他们不知道自己失去了多少好诗好词。
刚才看到有人翻译的苏轼《水调歌头》(参看:http://edu.qq.com/a/20060918/000194.htm),自以为不然。于是乎平生第一次翻译了诗词。我感觉翻译诗词是一件不可能的任务(mission impossible),不要说翻译成外文,就是翻译成白话文也是不可能的。甚至就连同是读原文,每个人也会有不可能的理解。于是我的翻译只能是用我有限的语言水平说出我看到的苏轼《水调歌头》。

《水调歌头》原文
丙辰中秋,欢饮达旦,大醉,作此篇,兼怀子由。

明月几时有?把酒问青天。
不知天上宫阙,今夕是何年。
我欲乘风归去,又恐琼楼玉宇,高处不胜寒。
起舞弄清影,何似在人间?

转朱阁,低绮户,照无眠。
不应有恨,何事长向别时圆?
人有悲欢离合,月有阴晴圆缺,此事古难全。
但愿人长久,千里共婵娟。

发表在 某时雨集, 诗词精选 | 留下评论

定风波 苏轼

三月七日沙湖道中遇雨。雨具先去,同行皆狼狈,余独不觉。已而遂晴,故作此词。
莫听穿林打叶声,何妨吟啸且徐行。
竹杖芒鞋轻胜马,
谁怕, 一蓑烟雨任平生?
料峭春风吹酒醒,
微冷,山头斜照却相迎。
回首向来萧瑟处,
归去,也无风雨也无晴。

这是我非常喜欢的一首词。它不如“黄河之水天上来”的豪迈,亦虽不如“寻寻觅觅,冷冷清清,凄凄惨惨戚戚”深情,却无疑是诗词中思想最积极向上的一首。
它外表看起来平平淡淡,但我每读一次,内心深处却总能汹涌澎湃。
每读到它我就想起苏东坡乐观的坚韧。这坚韧有如顽石,固若金刚。如果这顽石被抛至深山,其上也一定会挣扎着长出青苔,即使只是青苔,亦或也会迎风微笑,而山间微笑着的青苔,苏老或可以之为伴,与之对奕深山!
“也无风雨也无晴“,这是我人生之称的准心。它提醒我在得意时不要忘形,在失意时不要伤悲。但琐碎的生活却经常让我忘记了苏轼的定风波,于是在重读它时总会发觉自己的行径同这个原子钟的差离,于是每每读它是我都在自责和又一次的对苏轼之提醒的深切感激之中澎湃。也因为这个原因,为了更多的机会看到这词,我把它转到blog里。

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

RailsSpace: Building a Social Networking Website with Ruby on Rails 学习笔记

RailsSpace: Building a Social Networking Website with Ruby on Rails>是一本从Ruby on Rails基础教起的实例教程。但与共为实例教程的<Agile Web Development with Rails> 相比,<RailsSpace: Building a Social Networking Website with Ruby on Rails>有着自己明显的特色。后者教授的不仅是Ruby on Rails的语言知识, 而且夹杂了更多的编程技巧和思想,我感觉更适合具有一定Ruby on Rails基础的人员,使之从“知道Ruby on Rails知识”提升到“在实战中运用Ruby on Rails"的新层次。

虽然我看过<Agile Web Development with Rails>, 但还是我在<RailsSpace: Building a Social Networking Website with Ruby on Rails>中发现的新奇的东西:

<%= link_to_unless_current "Home",     :action => "index" %>
原来Rails中还有link_to_unless_current。

MySQL的发音是"My-Ess-Cue-Ell".

YAML 是 Ain’t a Markup Language 的缩写。

rake db:migrate VERSION=0, 可以用来月光宝盒数据库版本。

save比save()有更重的ruby味。

在irb的console中可以使用reload!来重载被修改后的环境(我原来一直是退出来再进一次!)

正则实例:    /^[A-Z0-9._%-]+@([A-Z0-9-]+\.)+[A-Z]{2,4}$/i,
这个用来校验email地址。
^:字串行的开始
[A-Z0-9._%-]+:至少一位下列有效字符:大写字母,数字,点,下划线或杆线
@
([A-Z0-9-]+\.)+:至少一组以点分隔的带有大写字母,数字或杆线的字串
[A-Z]{2,4}:2至4位的大写字母
$:字串行结束
i:因为电邮地址不区分大小写字母,这个i指定正则不对字母的大小写不感冒。

用户的密码不一定要加密后存到数据库中去。

为了使fieldset/legend HTML标签在IE中正常显示,可能要进行CSS Hack.
/* Hack to get IE to display fieldset/legend correctly */
html fieldset {
  position: relative;
}
html legend {
  position:absolute;
  top: -1em;
  left: .5em;
}
html fieldset {
  position: relative;
  margin-top:1em;
  padding-top:2em;
  padding-bottom: 2em;
}

可以在layout中加入显示debug信息的功能。

分离出SCREEN_NAME_SIZE = 20,PASSWORD_SIZE = 10,EMAIL_SIZE = 30等HTML表格参数,方便统一管理。在view中以下面的方法调用:
<div class="form_row">
<label for="email">Email:</label>
<%= form.text_field :email,
:size => User::EMAIL_SIZE,
:maxlength => User::EMAIL_MAX_LENGTH %>
</div>

inspect可以用来显示post的内容:aise params[:user].inspect

在Ruby中只有false和nil才是false的。

可以为系统的错误指示息做一套漂亮的CSS外衣。如:
/* Error Reporting Styles */
.fieldWithErrors {
  margin: 2px;
   padding: 2px;
   background-color: red;
   display: table;
}
#errorExplanation {
  border: 2px solid red;
  padding: 7px;
  padding-bottom: 12px;
  margin-bottom: 20px;
  background-color: #f0f0f0;
}
#errorExplanation h2 {
  text-align: left;
  font-weight: bold;
  padding: 5px 5px 5px 15px;
  font-size: 12pt;
  margin: -7px;
  background-color: #c00;
  color: #fff;
}
#errorExplanation p {
  color: #333;
  margin-bottom: 0;
  padding: 5px;
}
#errorExplanation ul li {
  font-size: 11pt;
  list-style: square;
}
…………..

rake doc:app可以用来生成实例文档。

title = assigns(:title) 产生 title = @title的效果.

测试的命令:rake test:functionals,rake test:units, rake, rake stats,ruby test/functional/user_controller_test.rb -n /test_login_failure/, rake recent….

关于错误信息,0的使用还有sprintf:
>> @error_messages = ActiveRecord::Errors.default_error_messages; 0
=> 0
>> @error_messages[:too_short]
=> "is too short (maximum is %d characters)"
>> sprintf(@error_messages[:too_short], 17)
=> "is too short (maximum is 17 characters)"

使用数据库作为session储存方案可以让网站更方便地扩展成多服务器网站。使用方法:
1. 运行 rake db:sessions:create
2. 将config/environment.rb, uncomment 中下行的注释#去除:
       config.action_controller.session_store = :active_record_store
3. 运行rake db:migrate
4. 重启服务器。

当发生与session相关的错误时,可以试着清空数据库的session表。

用下列语句来快速校验用户密码。
user = User.find_by_screen_name_and_password(screen_name, password)

session[:user_id]返回的是数值,而not session[:user_id].nil?返回的是boolean值,有时候使用两者程序效果一样,但对编程者本身的头脑逻辑清晰度却会有区别。

使用mixin,将一个通用method放到helper中去,这样不但view中,而且在controller中加入include ApplicationHelper语句后也可以使用这个method.甚至test…

大量使用外套(abstraction layer)!!

user.save和user.save!都可以用来发送将user存储到数据库这一指令。区别在存储失败之后的表现上。user.save失败后只会返回一个false值(可以用if user.save判断), 而一旦user.save!失败,将会产生一个exception错误。所以在使用意图上,允许一定条件下(控制之中的)失败时,用user.save,而期望它一定要成功(不然就要启动应急rescue措施)时,用user.save!.

在一class内可以省略语句中attribute和function里的self关键字(self.id->id),但有一例外,就是在赋值的时候, self.name = "Jom"不能省为name = "Jom",因为后者只会产生一个值为"Jom"的本地变量!

这个实例可以用来解决找不到定义好的变量的问题:<% field_title = nil if not defined?(field_title) -%>

用名词命名controller,用动词命名action.

当发现所有instance变量为nil时,检查一下是不是误用到了RoR的保留字。

将类DB_STRING_MAX_LENGTH = 255的常量放到config/environment.rb文件中,这样可以在全局中引用。

@user.spec["first_name"]和@user.spec.send("first_name")等同于@user.spec.first_name

在rout.rb中加入
map.profile ‘profile/:screen_name’, :controller => ‘profile’, :action => ‘show’
后可以使用  profile_url(:screen_name => ‘foobar’)生成profile的url.
在view之外的地方引用可以先 helper :profile (它和include ProfileHelper的不同点???)
included ProfileHelper 是为了使用 profile_for. partial中引用的话要用helper: profile????

MySQL的TEXT栏不支持默认值。手动设置方法
  def initialize
    super
    QUESTIONS.each do |question|
      self[question] = ""
    end
  end

initial function在class新建instance时会被运行。如果class有上级,会自动继承上次的initialize function. 在子class中加initialize function, 使用super,这样会调用上级initialize function.

生成所有单字母串的方法:
"ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("")
或 %w(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)

使用列表样式的实例:
<% @letters.each do |letter| %>
<% letter_class = (letter == @initial) ? "letter_current" : "letter" %>
<%= link_to letter, { :action => "index", :id => letter },
:class => letter_class %>
<% end %>

如果action之后还要用到id, rout.rb中没有用到id的url要加入:id=>nil的参数。

pluralize的用法
>> pluralize(0, "box")
=> "0 boxes" #0时用复数
>> pluralize(1, "box")
=> "1 box"
>> pluralize(2, "box")
=> "2 boxes"
>> pluralize(2, "box", "boxen")
=> "2 boxen" #自定义复数形式的方法

原来安装和使用ferret搜索引擎的方法这样简单:
1安装ferret gem
> sudo gem install ferret
2下载安装acts_as_ferret插件
> ruby script/plugin install svn://projects.jkraemer.net/acts_as_ferret/tags/stable/acts_as_ferret
Feeret首次搜索一个model时会耗费一定的时间在Rails的根目录下的index目录生成索引文件。当Ferret出问题时,可以试着在停止网页服务器后删除这个索引目录,让它重新生成索引文件。

合并两个实例列用concat+uniq!
@users.concat(hits.collect { |hit| hit.user }).uniq!

为实例列排序
@users = @users.sort_by { |user| user.spec.last_name }

search form 使用GET request

可用   Spec.find(:all, :conditions => ["gender = :gender", params])来取代Spec.find(:all, :conditions => ["gender = ?", params[:gender]])

改写默认string class的方法在lib/string.rb中
class String
#写自己的method
end

replace能用另一个object取代自己,如:
  def capitalize_each
    space = " "
    split(space).each{ |word| word.capitalize! }.join(space)
  end
  # Capitalize each word in place.
  def capitalize_each!
    replace capitalize_each
  end

写一个检查整数的method:
class Object
  # Return true if the object can be converted to a valid integer.
  def valid_int?
    begin
      Integer(self)
      true
      rescue ArgumentError
      false
    end
  end
end
注意nil.valid_int? 返回 true (Integer(nil) == 0) 但 nil.valid_float? 返回 false(Float(nil) 产生 ArgumentError exception).

使用.errors.add("xxx")的方法写校检method.
  def valid_input?
    @spec = Spec.new
    if @spec.valid? and not zip_code.blank? and location.nil?
      @spec.errors.add(:zip_code, "does not exist in our database")
    end
    unless miles.nil? or miles.valid_float?
      @spec.errors.add("Location radius")
    end
    # The input is valid iff the errors object is empty.
    @spec.errors.empty?
  end
在view中定制引用错误提示信息:
<%= error_messages_for(‘spec’).sub(‘prohibited this spec from being saved’,
‘occurred’) %>

没有super class的module helper中不带任何class.所以要自己require:
module ApplicationHelper
  require ‘string’

使用File.join生成文件目录,以适应不同平台的操作系统?

为了上传图片,必须使用multipart encoding。
<form action="upload" enctype="multipart/form-data" method="post">
<input id="avatar_image" name="avatar[image]" size="30" type="file" />
</form>

PNG (发音:"ping"), 指Portable Network Graphics格式.

使用system("ls")可以调用系统的ls命令。

上传的文件如果小于15K,将是StringIO (string input-output)类,如果大于15K,将是Tempfile (temporary file)。 为了统一两者,可以用File.open(source, "wb") { |f| f.write(@image.read) }将文件写出,"wb" 这里指 "write binary"。

errors.add(:image, "totally doesn’t work")将错误信息加到一个attribute之上。 errors.add_to_base("There’s no freaking way that worked")会将错误信息加到全局。

默认情况下电邮将以text格式发出; 参考:
http://wiki.rubyonrails.org/rails/pages/HowToSendHtmlEmailsWithActionMailer

重写ActiveRecord的子class的initialize function后,可以在保留它的validation function的同时避免将数据写到数据库里。

Active Record的create=new+save, save返回boolean, create直接返回object.

在class内引用此class的class method可以省略class名。

destroy比delete更强大,更适合用来消除Active Record objects.

user.friends
user.requested_friends
user.pending_friends
可以这样连串!!!
has_many :friendships
has_many :friends,
:through => :friendships,
:conditions => "status = ‘accepted’"
has_many :requested_friends,
:through => :friendships,
:source => :friend,
:conditions => "status = ‘requested’"

RESTful式的URLs没有action部分,因为它的格式是:/controller/id;modifier

has_many可以加上order参数:
has_many :posts, :order => "created_at DESC"

内置的time_ago_in_words method,毕竟有!!虽然我不喜欢这个。
Posted <%= time_ago_in_words post.created_at %> ago

format.html用来回应HTML文件请求,format.js可以用来回应Javascript请求。

使用js更新页面
        render :update do |page|
            format.js
        end
action.rjs
          page.hide "add_comment_link_for_post_#{@post.id}"
          page.replace_html "new_comment_form_for_post_#{@post.id}",
          :partial => "new"
使用RJS文件,将controller中view的部分分开来,更合理。

Ajax的运行有可能使客户机,特别是老机子变得很慢甚至瘫痪。

http://wiki.script.aculo.us/scriptaculous/show/CombinationEffectsDemo
中的很多特效中我最喜欢的是
 blind down/up, highlight,puff

如果Ajax运行不正常,可以先检查log文件。

链接的href选项可以为不支持JavaScript的用户提供常规链接。

rake db:migrate RAILS_ENV=production,准备production数据库

- Linux/Apache/mod_proxy_balance/Mongrel 发布方案
- Caching和shared nothing scaling方案
- Subversion 版本管理
- Capistrano 发布版本控制

为网站写一个管理后台??

在console中按production环境启动
> ruby script/console production
> ruby script/console production –sandbox 不修改数据库

查看日志的最后一页:
tail -f log/production.log

在本地访问时Rails会公布全文错误信息,但远程用户会指向public/404.html 或 public/500.html 文件。

更多关注的书:
Practical Rails Social Networking Sites (Expert’s Voice)
The Rails Way (Addison-Wesley Professional Ruby Series)
Pro ActiveRecord: Databases with Ruby and Rails (Pro)
Advanced Rails Recipes: 72 New Ways to Build Stunning Rails Apps
Agile Testing with Ruby and Rails

发表在 Ruby on Rails | 留下评论

宣州谢朓楼饯别校书叔云 李白

弃我去者,昨日之日不可留;
乱我心者,今日之日多烦忧。
长风万里送秋雁,对此可以酣高楼。
蓬莱文章建安骨,中间小谢又清发。
俱怀逸兴壮思飞,欲上青天揽明月。
抽刀断水水更流,举杯销愁愁更愁。
人生在世不称意,明朝散发弄扁舟。

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