Bức tranh

Tháng Một 27, 2009

Ngày xưa, có một họa sĩ tên là Ranga, một người siêu việt, vẽ được rất nhiều kiệt tác đáng ghi nhớ khiến ai cũng đều khen ngợi.

Ông mở một lớp học mỹ thuật để dạy nghề cho mọi người và cũng để tìm đệ tử nối nghiệp. Ông không mấy khi khen ngợi ai, cũng không bao giờ đề cập đến thời gian của khóa học. Ông nói, một học trò chỉ có thể thành công khi ông hài lòng với kỹ năng và hiểu biết của người đó. Ông truyền cho học trò những phương pháp đánh giá, ước định của ông, và chúng cũng độc đáo như những tác phẩm của ông vậy. Ông không bao giờ thổi phồng tầm quan trọng của những bức tranh hay sự nổi tiếng, mà ông luôn nhấn mạnh đến cách xử sự, thái độ với cuộc sống của học trò.

Trong một số lượng lớn học trò, Rajeev là một người có tài nhất, chăm chỉ, sáng tạo, nên anh ta tiếp thu nhanh hơn nhiều so với các bạn đồng môn. Ông Ranga rất hài lòng về Rajeev.

Một ngày kia, sau bao nhiêu cố gắng, Rajeev được ông Ranga gọi đến và bảo:

– Ta rất tự hào về những tiến bộ mà con đã đạt được. Bây giờ là thời điểm con làm bài thi cuối cùng trước khi ta công nhận con thực sự là một họa sĩ tài năng. Ta muốn con vẽ một bức tranh mà ai cũng phải thấy đẹp, phải khen ngợi.

Rajeev làm việc ngày đêm, trong rất nhiều ngày và đem đến trình thầy Ranga một bức tranh tuyệt diệu. Thầy Ranga xem qua rồi bảo:

– Con hãy đem bức tranh này ra đặt ở quảng trường chính, để tất cả mọi người có thể chiêm ngưỡng. Hãy viết bên dưới bức tranh là tác giả sẽ rất biết ơn nếu bất kỳ ai có thể chỉ ra bất kỳ sơ suất nào trên bức tranh và đánh một dấu X vào chỗ lỗi đó.

Rajeev làm theo lời thầy: đặt bức tranh ở quảng trường lớn với một thông điệp đề nghị mọi người chỉ ra những sơ suất.

Sau hai ngày, Ranga đề nghị Rajeev lấy bức tranh về. Rajeev rất thất vọng khi bức tranh của mình đầy dấu X. Nhưng Ranga tỏ ra bình tĩnh và khuyên Rajeev đừng thất vọng, cố gắng lần nữa. Rajeev vẽ một kiệt tác khác, nhưng thầy Ranga bảo phải thay đổi thông điệp dưới bức tranh. Thầy Ranga nói phải để màu vẽ và bút ngay cạnh bức tranh ở quảng trường và đề nghị mọi người tìm những chỗ sai trong bức tranh và sửa chúng lại bằng những dụng cụ để vẽ ấy.

Hai ngày sau, khi lấy tranh về, Rajeev rất vui mừng khi thấy bức tranh không bị sửa gì hết và tự tin đem đến chỗ Ranga. Ranga nói:

– Con đã thành công vào ngày hôm nay. Bởi vì nếu chỉ thành thạo về mỹ thuật thôi thì chưa đủ, mà con còn phải biết rằng con người bao giờ cũng đánh giá bừa bãi ngay khi có cơ hội đầu tiên, cho dù họ chẳng biết gì về điều đó cả. Nếu con luôn để cả thế giới đánh giá mình, con sẽ luôn thất vọng. Con người thích đánh giá người khác mà không nghĩ đến trách nhiệm hay nghiêm túc gì cả. Mọi người đánh những dấu X lên bức tranh đầu tiên của con vì họ không có trách nhiệm gì mà lại cho đó là việc không cần động não. Nhưng khi con đề nghị họ sửa những sơ suất thì không ai làm nữa, vì họ sợ bộc lộ hiểu biết – những thứ mà họ có thể không có. Nên họ quyết định tránh đi là hơn. Cho nên, những thứ mà con phải vất vả để làm ra được, đừng dễ dàng bị ảnh hưởng bởi đánh giá của người khác. Hãy tự đánh giá mình. Và tất nhiên, cũng đừng bao giờ đánh giá người khác quá dễ dàng.

Advertisements

Merb | A hacker’s framework

Tháng Một 27, 2009

Source: http://merbivore.com/

Faster, Lighter, More Agile.

Merb is an MVC framework that is ORM-agnostic, JavaScript library agnostic, and template language agnostic, preferring plugins that add in support for a particular feature rather than trying to produce a monolithic library with everything in the core. In fact, this is a guiding principle of the project, which has led to third-party support for the ActiveRecord, DataMapper, and Sequel ORMs.

In addition, it means that the core code in Merb is kept simple and well organized. This has multiple benefits. It means it’s faster for one thing. It’s also easier to understand, maintain and extend.

Merb is already packed with good stuff; flexible routing, gem plugins, the provides API, part and mail controllers etc. To get a better idea check out the features.

Or if you’re feeling impatient, just get to it and install Merb!

Install it

$ sudo gem install merb

Generate & Run

$ merb-gen app  my_application
$ cd my_application
$ merb

Who needs an API ?

Tháng Một 27, 2009

Source: http://errtheblog.com/posts/90-who-needs-an-api

GitHub is a pretty fun site to work on, I’m not gonna lie. On more than one occasion, we thought it would be pretty cool to setup a service allowing public projects to receive donations.

Sounds like an Itch

Pledgie being the venerable service it is, I decided one night it couldn’t possibly be that hard to integrate it with GitHub. It’s a pretty standard Rails site with some simple forms to make the magic happen (eg. setup a donation page).

They don’t have an API (yet), but in this day and age, you really don’t need one if you procure the proper tools.

Enter Mechanize. You can do all I’m about to describe with just Net::HTTP, but seriously, who wants to do that?

Start Scratching

Step 0: Drive girlfriend to airport, buy a case of Anchor Steam, and turn off the Xbox.

Step 1: Sign up for a Pledgie account, cause GitHub’s a regular user after all.

Step 2: Write the interface on GitHub to accept the user’s Paypal address.

Step 3: Figure out the form fields I should be filling out to login and create a new pledge on Pledgie.

Step 4: Write the Mechanize code:

def pledgify(email)
  agent = WWW::Mechanize.new
  page  = agent.get('http://pledgie.org/accounts/login')
  form  = page.forms[1]
  form['account[login]']    = GitHub::PledgieUser
  form['account[password]'] = GitHub::PledgiePass
  page  = agent.submit(form)

  link  = page.links.text(/Create A Campaign/)
  page  = agent.click(link)
  form  = page.forms[1]
  form['campaign[title]']        = "FooBarz" 
  form['campaign[paypal]']       = email
  form['campaign[description]']  = "The best project evar!" 
  form['campaign[end_date(1i)]'] = 10.years.from_now.year.to_s
  page = agent.submit(form, form.buttons.last)
  update_attribute(:pledgie, page.uri.to_s[/\d+/])
end

Step 5: Take the pledgie attribute we just grabbed and put a cool badge in their repository’s detail box.

Step 6: Watch the millions pour in for GitHub’s hard-working open source committers.

The obvious caveat here is that it relies on Pledgie not drastically changing the structure of its HTML, but it’s incredibly satisfying to throw something together like this in such a short amount of time.

PS. If you’re on GitHub and wondering how you missed the original announcement, the post is here: http://github.com/blog/57-getting-paid-the-open-source-way

Đường hầm xuyên trái đất

Tháng Một 26, 2009

Hai anh em cậu bé kia có lần quyết định đào một cái hố sâu phía sau nhà. Khi hai cậu bé đang đào, vài đứa trẻ khác đến xem và hỏi họ đang làm gì. Cậu bé đào hố hào hứng trả lời rằng anh em cậu muốn đào một đường hầm xuyên qua trái đất.

Mấy đứa trẻ cười phá lên, chế giễu anh em cậu. Thế nhưng hai cậu bé vẫn tiếp tục đào. Một lúc sau, một cậu nhảy từ cái hố đang đào lên mặt đất, tay cầm một cái chai cũ kỹ đầy nhện, sâu bọ, côn trùng đáng sợ và tay kia giơ cao một túi chứa các viên đá xinh xắn đang lấp lánh phản chiếu ánh mặt trời. Cậu chỉ cho những đứa trẻ kia xem những viên đá tuyệt đẹp ấy và tự hào nói: “Ít nhất bọn mình cũng có thể tìm được những viên đá đẹp như thế, và mình cũng đã có dịp khuất phục lũ côn trùng gớm ghiếc này!

Không phải mục tiêu nào cũng hoàn thành trọn vẹn.

Không phải công việc nào cũng đều kết thúc thành công.

Không phải nỗ lực nào cũng được đền đáp xứng đáng.

Không phải mối quan hệ nào cũng giữ được bền lâu.

Không phải tình yêu nào rồi cũng là vĩnh cửu.

Không phải ước mơ nào cũng trở thành hiện thực.

Nhưng nếu bạn luôn lo sợ và không dám bắt đầu, bạn sẽ không bao giờ có cơ hội đặt chân lên con đường đến thành công, bạn sẽ không bao giờ.

Cuốn sách & giỏ đựng than

Tháng Một 26, 2009

Có một câu chuyện kể rằng tại một trang trại ở miền núi xa xôi, miền Đông bang Kentucky, có một ông cụ sống với người cháu của mình. Mỗi buổi sáng, ông cụ đều dậy rất sớm để đọc sách. Có những cuốn sách ông đã đọc nhiều lần, đến mức cuốn sách sờn cũ, nhưng lúc nào ông đọc cũng say mê và chưa một buổi sáng nào ông quên đọc sách.

Cậu cháu trai cũng bắt chước ông, cũng cố gắng mỗi ngày đều ngồi đọc sách. Rồi một ngày, cậu hỏi ông:

– Ông ơi, cháu cũng thử đọc sách như ông, nhưng cháu không hiểu gì cả. Hoặc là có những đoạn cháu hiểu, nhưng khi gấp sách lại là cháu quên ngay. Thế thì đọc sách có gì tốt đâu mà ông đọc thường xuyên thế ạ…

Ông cụ lúc đó đang đổ than vào lò, quay lại nhìn cháu và chỉ nói:

– Cháu hãy đem cái giỏ đựng than này ra sông và mang về cho ông một giỏ nước nhé!

Cậu bé liền làm theo lời ông, dù rằng tất cả nước đã chảy ra hết khỏi giỏ trước khi cậu bé quay về đến nhà.

Nhìn thấy cái giỏ, ông cụ cười và nói:

– Nước chảy hết mất rồi! Có lẽ lần sau cháu sẽ phải đi nhanh hơn nữa!

Rồi ông bảo cháu quay lại sông lấy một giỏ nước.

Lần này cậu bé cố chạy nhanh hơn, nhưng lại một lần nữa, khi cậu về đến nhà thì cái giỏ đã trống rỗng. Thở không ra hơi, cậu nói với ông rằng “đựng nước vào cái giỏ là điều không thể”, rồi đi lấy một chiếc xô để múc nước. Nhưng ông cụ ngăn lại:

– Ông không muốn lấy một xô nước. Ông muốn lấy một giỏ nước cơ mà! Cháu có thể làm được đấy, chỉ có điều cháu chưa cố hết sức thôi!

Rồi ông lại bảo cháu ra sông lấy nước. Vào lúc này, cậu bé đã biết rằng không thể đựng nước vào giỏ được, nhưng cậu muốn cho ông thấy rằng dù cậu chạy nhanh đến đâu, nước cũng sẽ chảy hết ra khỏi giỏ trước khi cậu về đến nhà. Thế là cậu bé lại lấy nước, lại chạy nhanh hết sức, và khi về đến chỗ ông, cái giỏ lại trống rỗng.

– Ông xem này – Cậu bé hụt hơi nói – Thật là vô ích!

– Cháu lại nghĩ nó là vô ích ư… – Ông cụ nói – Cháu thử nhìn cái giỏ xem!

Cậu bé nhìn vào cái giỏ, và lần đầu tiên, cậu bé nhận ra rằng cái giỏ trông khác hẳn ban đầu. Nó không còn là cái giỏ than đen bẩn nữa, mà đã được nước rửa sạch sẽ.

– Cháu của ông, đó là những gì diễn ra khi cháu đọc sách. Có thể cháu không hiểu hoặc không nhớ được mọi thứ, nhưng khi cháu đọc, sách sẽ thay đổi cháu từ bên trong tâm hồn, như nước đã làm sạch giỏ than kia vậy.

Đêm cuối năm

Tháng Một 26, 2009

Một kẻ lang thang đem cuối năm. Một quán vắng ven đường.

Chỉ có tiếng Piano văng vẳng trong không gian tĩnh lặng.

Một ly chanh rhum uống dở, vài bản piano buồn làm nên đêm cuối năm của một kẻ cô đơn

Ngoài kia, gió xuân vẫn về, người người vẫn nói cười vui vẻ …

Tương phản cuộc sống

Tháng Một 22, 2009

–oOo–

http://www.vietbds.com/4Community/tuong_phan_cuoc_song/index.htm

World shift, just when you don’t realize it

Ngày 25 tết Kỷ Sửu, Lần đầu tiên UBND Hà nội đứng ra tổ chức” Phố Ông Đồ”, nơi vỉa hè Văn Miếu – Quốc Tử Giám, nhưng nhiều cụ đồ có hàng chục năm ngồi viết thư pháp trên con phố này, như nhà Thư pháp – Tiến sỹ Cung Khắc Lược, nhà thư pháp trẻ Trịnh Tuấn…, đã tỏ thái độ phản đối BTC, bằng cách không chấp nhận vào ngồi trong”lều bạt” mà tự trải chiếu ngồi vỉa hè, như đúng câu vè “ Ông đồ vỉa hè, cụ nghè ngồi xổm”.


Tiến sĩ Cung Khắc Lược, được nhiều người coi là một trong “tứ trụ Thư pháp Việt Nam” (cùng các bậc lão thành về thư pháp: Lê Xuân Hoà, Nguyễn Văn Bách, Lại Cao Nguyện) đang viết chữ tặng miễn phí cho nhưng ai yêu thích nghệ thuật thư pháp.

..và ngay sau đó, cũng chính ông cũng phải van lạy lực lượng công quyền, khi họ thẳng tay giật tung những bức thư pháp mà ông đã mất nhiều công sức thể hiện.

Trung tá Lê Quý Luận, đội trưởng đội trật tự Công an Phường Quốc Tử Giám – Quận Ba ĐÌnh đang “chỉ đạo các lực lực lượng chức năng” xử lý theo nghị định 227 về lấn chiếm lòng lề đường của UBND TP Hà Nội.. (Trung tá cảnh sát nhìn hồ đồ thế này thì đến Cụ đồ Liên sống lại cũng không dám bày mực tàu, giấy đỏ ngồi cho chữ, huống hồ cụ Lược)





Chẳng cần những lời nhẹ nhàng, giải thích thấu tình đạt lý, ngay sau đó.. những hình ảnh..giật – giằng – vò, ném… thực sự là kg đẹp mặt và vô văn hóa, thách thức công luận của lực lượng công quyền đã diễn ra ngay tại Văn Miếu – Quốc Tử Giám, nơi thờ Khổng Tử, Chu Văn An, những bậc hiền hiền triết luôn dạy chúng ta… Làm Người cũng cần phải học.

Như cảm thấy chưa đủ mạnh tay, Trung tá Lê Quý Luận, đội trưởng đội trật tự Công an Phường Quốc tử Giám, đã gọi điện xin chi viện của lực lượng phản ứng nhanh 113 công an Q. Ba Đình xuống ”giải quyết”



Chứng kiến những hành động không đẹp mắt này, Người dân cảm thấy phân nộ và bức xúc với cách mà lực lượng cảnh sát và lực lượng dân phòng đang hành xử.
“Việc các cụ đồ viết câu đối trong mấy ngày tết, là tái hiện một nét văn hóa của của nguời Hà Nội xưa, sao lại xua đuổi và gọi họ là buôn bán chữ, kinh doanh trái phép được” – “Những người mặc sắc phục cảnh sát đó, đã mất niềm tin với người dân chúng tôi, sự việc vừa diễn ra thật sự làm chúng tôi đau xót”, ông Văn Quý cán bộ Bộ Kế hoạch đầu tư, bức xúc nói.


.. nhà Thư Pháp như Tiến sỹ Cung Khắc Lược, Trịnh Tuấn.. tỏ rõ sự thất vọng và chán nản, khi nhìn những bức Thư Pháp, những chữ Tâm, chữ Nhẫn, chữ Đức, chữ Tài, và những lời dăn dạy của các bậc tiền nhân, bị lực lượng công quyền giật, ném lên xe không thương tiếc.
“Thật vớ vẩn, quá vớ vẩn, họ đã thiếu hiểu biết và vô văn hóa, họ có thể không cho chúng tôi ngồi đó, nhưng xin đừng đối xử với chúng tôi như những tên tội phạm”, nhà thư pháp Tiến sỹ Cung Khắc Lược nói.

Nhà thư pháp Trịnh Tuấn giãi bày, “Mỗi Tết tôi ra đây tìm niềm vui, muốn được góp phần làm hoằng dương lại nét văn hóa của một Thăng Long xưa, chưa thời nào thư pháp nào nuôi được người cả, nhất là với “văn hóa nghìn đô” bây giờ thì lại càng không”. Chính quyền đừng đối xử với chúng tôi thiếu công bằng và cứng nhắc như thế.

Chúng tôi không đi làm thuê, chúng tôi viết chữ không phải vì tiền, không thể chấp nhận cảnh một ông đồ ngồi viết và một cô tân thời đứng bên cạnh thu tiền. Đó không phải là truyền thống ngàn đời của Thăng Long xưa”, nhà Thư pháp Vũ Xuân Hợp gay gắt nói.

LB: Cảnh sát có chức năng bảo vệ dân và chấn áp tội phạm, tội phạm tày đinh đôi khi cũng cần tình người để thu phục nhân tâm, huống hồ những ông thày đồ, những người cả đời chỉ dùng cây bút để “viết lên trời xanh”, gìn giữ những tinh hóa văn hóa của cha ông để lại, gìn giữ những giá trị vô hình mà do sức ép của của thời buổi cơm áo gạo tiền, giờ đã mất dần. Họ là những ông đồ, họ có thể là những người “buôn bán chữ nho trái phép”(lời của lực lượng cảnh sát 113) vì kế sinh nhai, họ có thể vi phạm quy định này, nghị định kia, nhưng chắc chắn, họ không đáng bị đối xử, bị xua đuổi như những kẻ làm “bẩn phố phường” khác, họ cần sự trân trọng của người đời.
Đừng cào bằng giá trị, đừng mang quyền lực và tiền ra để đánh đổi văn hóa. Văn hóa.. không thể dùng dui cui để trấn áp, như đã từng trấn áp với tội phạm.
Cho dù có giải thích, biện minh gì gì đi nữa, việc cơ quan công quyền, cụ thể là cách hành xử với người dân, với những ông đồ, với giá trị văn hóa của tiền nhân xưa…của công an, lực lượng dân phòng Phường Quốc Tử Giám, đáng bị lên án và kg thể chấp nhận được!
(theo Mai ky’s blog)
Nguồn: http://www.i4vn.com.vn/forum/showthread.php?p=491343

Active Merchant

Tháng Một 22, 2009

Taken from http://railscasts.com/

Active Merchant is a great library for handling credit card transactions.

Install: sudo gem install activemerchant

Sample usage:

require "rubygems"
require "active_merchant"

ActiveMerchant::Billing::Base.mode = :test

gateway = ActiveMerchant::Billing::PaypalGateway.new(
  :login => "seller_1229899173_biz_api1.railscasts.com",
  :password => "FXWU58S7KXFC6HBE",
  :signature => "AGjv6SW.mTiKxtkm6L9DcSUCUgePAUDQ3L-kTdszkPG8mRfjaRZDYtSu"
)

credit_card = ActiveMerchant::Billing::CreditCard.new(
  :type               => "visa",
  :number             => "4024007148673576",
  :verification_value => "123",
  :month              => 1,
  :year               => Time.now.year+1,
  :first_name         => "Ryan",
  :last_name          => "Bates"
)

if credit_card.valid?
  # or gateway.purchase to do both authorize and capture
  response = gateway.authorize(1000, credit_card, :ip => "127.0.0.1")
  if response.success?
    gateway.capture(1000, response.authorization)
    puts "Purchase complete!"
  else
    puts "Error: #{response.message}"
  end
else
  puts "Error: credit card is not valid. #{credit_card.errors.full_messages.join('. ')}"
end

Source: http://railscasts.com/episodes/144-active-merchant-basics

Integrating ActiveMerchant into a project: (make sure to add the card numbers to the filter_parameter_logging call in your application.rb file so they are not logged.)

rake gems:install

script/generate nifty_scaffold order new cart_id:integer ip_address:string first_name:string last_name:string card_type:string card_expires_on:date

script/generate model order_transaction order_id:integer action:string amount:integer success:boolean authorization:string message:string params:text
# controllers/application.rb
filter_parameter_logging :card_number, :card_verification

# config/environment.rb
config.gem "activemerchant", :lib => "active_merchant", :version => "1.4.1"

# config/environment/development.rb
config.after_initialize do
  ActiveMerchant::Billing::Base.mode = :test
  ::GATEWAY = ActiveMerchant::Billing::PaypalGateway.new(
    :login => "seller_1229899173_biz_api1.railscasts.com",
    :password => "FXWU58S7KXFC6HBE",
    :signature => "AGjv6SW.mTiKxtkm6L9DcSUCUgePAUDQ3L-kTdszkPG8mRfjaRZDYtSu"
  )
end

# config/environment/test.rb
config.after_initialize do
  ActiveMerchant::Billing::Base.mode = :test
  ::GATEWAY = ActiveMerchant::Billing::BogusGateway.new
end

# config/environment/production.rb
config.after_initialize do
  ActiveMerchant::Billing::Base.mode = :production
  ::GATEWAY = ActiveMerchant::Billing::PaypalGateway.new(
    :login => "seller_1229899173_biz_api1.railscasts.com",
    :password => "FXWU58S7KXFC6HBE",
    :signature => "AGjv6SW.mTiKxtkm6L9DcSUCUgePAUDQ3L-kTdszkPG8mRfjaRZDYtSu"
  )
end

# orders_controller.rb
def create
  @order = current_cart.build_order(params[:order])
  @order.ip_address = request.remote_ip
  if @order.save
    if @order.purchase
      render :action => "success"
    else
      render :action => "failure"
    end
  else
    render :action => 'new'
  end
end

# models/cart.rb
has_one :order

# models/order.rb
class Order < ActiveRecord::Base
  belongs_to :cart
  has_many :transactions, :class_name => "OrderTransaction"

  attr_accessor :card_number, :card_verification

  validate_on_create :validate_card

  def purchase
    response = GATEWAY.purchase(price_in_cents, credit_card, purchase_options)
    transactions.create!(:action => "purchase", :amount => price_in_cents, :response => response)
    cart.update_attribute(:purchased_at, Time.now) if response.success?
    response.success?
  end

  def price_in_cents
    (cart.total_price*100).round
  end

  private

  def purchase_options
    {
      :ip => ip_address,
      :billing_address => {
        :name     => "Ryan Bates",
        :address1 => "123 Main St.",
        :city     => "New York",
        :state    => "NY",
        :country  => "US",
        :zip      => "10001"
      }
    }
  end

  def validate_card
    unless credit_card.valid?
      credit_card.errors.full_messages.each do |message|
        errors.add_to_base message
      end
    end
  end

  def credit_card
    @credit_card ||= ActiveMerchant::Billing::CreditCard.new(
      :type               => card_type,
      :number             => card_number,
      :verification_value => card_verification,
      :month              => card_expires_on.month,
      :year               => card_expires_on.year,
      :first_name         => first_name,
      :last_name          => last_name
    )
  end
end

# models/order_transaction.rb
class OrderTransaction < ActiveRecord::Base
  belongs_to :order
  serialize :params

  def response=(response)
    self.success       = response.success?
    self.authorization = response.authorization
    self.message       = response.message
    self.params        = response.params
  rescue ActiveMerchant::ActiveMerchantError => e
    self.success       = false
    self.authorization = nil
    self.message       = e.message
    self.params        = {}
  end
end

<!-- views/orders/new.html.erb -->
<% form_for @order do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :first_name %><br />
    <%= f.text_field :first_name %>
  </p>
  <p>
    <%= f.label :last_name %><br />
    <%= f.text_field :last_name %>
  </p>
  <p>
    <%= f.label :card_type %><br />
    <%= f.select :card_type, [["Visa", "visa"], ["MasterCard", "master"], ["Discover", "discover"], ["American Express", "american_express"]] %>
  </p>
  <p>
    <%= f.label :card_number %><br />
    <%= f.text_field :card_number %>
  </p>
  <p>
    <%= f.label :card_verification, "Card Verification Value (CVV)" %><br />
    <%= f.text_field :card_verification %>
  </p>
  <p>
    <%= f.label :card_expires_on %><br />
    <%= f.date_select :card_expires_on, :discard_day => true, :start_year => Date.today.year, :end_year => (Date.today.year+10), :add_month_numbers => true %>
  </p>
  <p><%= f.submit "Submit" %></p>
<% end %>

<!-- views/orders/success.html.erb -->
SUCCESS!

<!-- views/orders/failure.html.erb -->
FAILURE

Source: http://railscasts.com/episodes/145-integrating-active-merchant