登華山

嶺高步步艱
萬步升半天
半天松獨立
獨迎遲至仙

繼續閱讀

發表在 人在旅途, 某時雨集, 浮光掠影 | 留下評論

無題

屋裡開着一盞橘黃色的小燈。她把嬌小的身子散在一張睡椅上。耳邊貼着手機等待對方接通。雖然上齒只是輕微地抵着下唇,但還是讓人擔心那顆飽滿晶瑩的櫻桃小嘴會被壓破。她一邊等待,一邊抓着自己的小辮子去刷桌面上那隻絨布熊的掌心,偶爾發出少女特有的調皮笑聲。

他在馬路對面。對着一家帶着柔和的橘黃燈光的酒吧。端莊的打扮,深沉的步履,無不透露中年男子的成熟--唯一格格不入的只有那一張茫然無助的臉。他只是在路邊來回徘徊。右手放在褲兜里,連同一隻叫個不停的手機……

發表在 某時雨集 | 留下評論

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 | 留下評論

宣州謝朓樓餞別校書叔雲 李白

棄我去者,昨日之日不可留;
亂我心者,今日之日多煩憂。
長風萬里送秋雁,對此可以酣高樓。
蓬萊文章建安骨,中間小謝又清發。
俱懷逸興壯思飛,欲上青天攬明月。
抽刀斷水水更流,舉杯銷愁愁更愁。
人生在世不稱意,明朝散發弄扁舟。

發表在 詩詞精選 | 留下評論