7/28/2007

Active Scaffold Upload Branch

我真的被 rails plugin 嚇到了。這幾天試著做 web development, 大家應該都知道我跟這個領域不太熟吧?可是,忽然間我覺得,這樣幾乎什麼都能做了。三個 plugin, 依照我嘗試的時間順序:

1. FileColumn
2. LoginGenerator
3. Active Scaffold Upload Branch

由於一開始使用 FileColumn 碰到了點問題,所以我有稍微 trace 他的 code, 基本上這個 plugin 我覺得算是小玩具,很簡單的小功能,居然沒內建到 rails 中我覺得有點奇怪。畢竟 binary file 一般都是存到 file system 而非 db 中吧?搭配 rmagick 的感覺還算不錯,可惜 helper 似乎不太健全,雖然堪用了。

接下來碰到需要 auth 的部份,懶得自己寫,因為只是小地方需要,並不真正屬於我目前所要寫的東西的一部份。重新發明輪子我覺得不是問題,但如果只是想到旁邊的便利商店買罐飲料卻因此得重新發明輪子,呃,這是成本考量與優先序的問題啊。

於是試了一下 LoginGenerator, 發現﹍。嗯,還真的是很方便。雖然他是個 gem, 但是 generate 出來之後就沒有 dependency 了,而且要自己改什麼也都很容易。於是 auth 的部份也解決了,畢竟我只是要最簡單的 auth.(雖然他安全性做得如何我就不清楚了,沒有仔細看他的程式碼)

到這裡,我都還不覺得怎麼樣。第三個 ActiveScaffold 就真的嚇到我了。因為那真的是非常完整的實做。rails 內建的 scaffold 實在陽春過頭,(儘管陽春過頭了,第一次看到還是著實相當驚豔,現在有種鄉巴佬進城的感覺)除非是最簡單的資料,不然碰上 association 或是 file column, 全部都沒辦法應付。當然,我是可以自己去改自己去擴充,但同樣是成本與優先序的問題,一定得需要用別人的東西。

先是找到了 scaffold extensions, 其實我是比較欣賞這種模式。不要產生一堆程式碼,要改什麼,利用 ruby 的 dynamic 機制就好了。只是他文件實在不多,看來看去要擴充好像還滿有難度的,而且雖然號稱支援 association, 卻是﹍。我只能說真的很難用,不過是多個 link 出來罷了,是比沒有好啦,但是應該會邊用邊想打人吧?

接下來我乾脆直接 google file column + scaffold 算了。就找到了 Active Scaffold Upload Branch, which is evolved from ajax scaffold. 他的 file column 範例,呃,問題一大堆,有些根本就寫錯了,害我試半天試不出來,有點火大。想說調查一下他的 form 到底是怎麼回事,卻發現他居然整個是用 ajax 寫的,所以 rails 有錯誤不見得會回傳,而且 form 也因為動態產生而無法顯示!

幸好有 firefox 的 web developer 這個 add-on, 裝了很久卻很少在用,帶有僥倖的心情找了一下,發現他的 display 功能非常強大,舉凡頁面上出得來的,全部都能顯示。然後才發現,active scaffold 額外產生了一個 record 去存,這樣的話下面這一行就明顯不正確了!
<%= file_column_field 'entry', 'file' %>
我還是頭一次看到範例有這麼嚴重錯誤的,太相信他結果找錯誤找半天。:( 害我又一直懷疑到 file column 和 rmagick 上,看半天覺得應該沒錯才對。而且這一個 method 也不知道是幹嘛的:
 def file_form_column(record, input_name)
  file_column_field 'record', :file
 end
不是明明就有 partial 了嗎?還是這可以取代 partial? 存疑,不管了。

總而言之,現在不只是 file column 的 image upload 沒問題,要自訂欄位也沒問題,版面上又相當漂亮,不會因為拉扯而變形,排序、搜尋等等,也都相當不錯。最重要的是,他的 association 模式跟我所需要的幾乎完全一致!可以同步修改,可以隱藏,可以追加,所有基本功能似乎都有了。

本來昏昏欲睡的我,看到這邊實在是很興奮,這東西就算要直接拿來用,都夠格了。而且我相信有什麼不足的話,要修改也容易得很。這有一大半要感謝 Ruby :)

老實講,我真想知道硬幹派的 php programmer 看到這些會有什麼想法。一個 phpBB 我看隨便寫一寫說不定就跑出來了﹍。搞不好再過不久,寫網站就真的是只要呼叫 => 修改 => 呼叫 => 修改就結束了。這還真的是很恐怖的一件事。不過同時這也代表著,我們應該把眼光放遠點了。來做個 YouOS 吧!! XD

==

最後我還想講一件事,就是寫程式寫這麼久,從來沒碰過幾次時程預估是太長的。但寫 rails 這兩次,很明顯我都估太長了。而且縮短的程度也是非常的多!我想除了要感謝 library 的強大外,雖然我還沒引進 unit test, 只用了人工 test, debug 難度就已經沒有很高了,大部份的錯誤都不會很難抓。當然,這有一個很大的原因是我現在在寫的東西難度很低,可是在這麼不熟悉的情況下,我覺得能夠這樣就真的是非常厲害的了。

另一方面其實我是覺得寫 Flash 有趣得多,難度也高得多。但 Flash debug 真的是會讓人想抓狂的一件事﹍。不知道有沒有什麼好用的 debug tool? 不然寫 Flash 永遠進度落後實在是很煩。

==

script/plugin install http://opensvn.csie.org/rails_file_column/plugins/file_column/trunk

gem install login_generator
script/generate login

svn export http://activescaffold.googlecode.com/svn/branches/upload vendor/plugins/active_scaffold_upload

有時候真不知道用 rubygems 好還是 rails plugin 好,但我想比較不穩定的東西,用後者應該是會好很多吧?self contained 這種事,有時候還滿重要的。

鄉巴佬全文完。

2007.07.28

7/25/2007

[心得] RubyCocoa

轉自 ptt MacDev 板

作者 godfat (godfat 真常) 看板 MacDev
標題 [心得] RubyCocoa
時間 Tue Jul 24 21:40:20 2007
──────────────────

嫌 objective-c 太難用嗎?還在等 obj-c 2.0 嗎?先試試 RubyCocoa 吧 XD
http://rubycocoa.sourceforge.net/

[quote]
It lets you write full-stack Cocoa applications in Ruby. It is also possible to write a Cocoa application that mixes Ruby and Objective-C code.
[/quote]

how to install?
有灌 macports 的話:(當然,xcode 是一定要灌的)
sudo port install ruby
sudo port install rb-rubygems(非必要,但建議)
sudo port install rb-cocoa

文件放在:
/Developer/Documentation/RubyCocoa

範例放在:(相當豐富)
/Developer/Examples/RubyCocoa

我這裡有一個簡化的 hello world, 可以小瞥一下:

require 'osx/cocoa'
include OSX

app = NSApplication.sharedApplication

hello = NSWindow.alloc.initWithContentRect_styleMask_backing_defer [200.0, 300.0, 100.0, 100.0], 15, 2, 0
hello.setTitle 'Hello'

btn = NSButton.alloc.initWithFrame [10.0, 10.0, 80.0, 80.0]
hello.contentView.addSubview btn
btn.setTitle 'Hello World!'
btn.setAction 'stop:'
btn.setBezelStyle 4

hello.display
hello.orderFrontRegardless

app.run

另外可以順便請教一下,如何讓視窗在按下 X 時關閉而不是隱藏嗎?我沒寫過 obj-c(XD), 昨天文件翻來翻去找不到要怎麼做



另一方面,如果只是要做 GUI 而不需要 call mac 的 api 的話,個人強力推薦 QtRuby

sudo port install qt4-mac(這個會 build 很久)
sudo port install cmake

QtRuby 沒有這麼方便的安裝法,要到
http://rubyforge.org/projects/korundum/
抓 qt4-qtruby, 然後進到目錄下:

cmake .
make
sudo make install

於是就可以正常使用 QtRuby 了,hello world 如下:

require 'qt'
include Qt
app = Application.new ARGV
hello = PushButton.new "Hello World!"
hello.resize 100, 30
hello.show
app.exec



Qt 是什麼?
http://trolltech.com/products/qt
是我用過最棒的 GUI toolkit, 使用 C++ 語言。可用 GPL 授權或用商業授權(很貴),二擇一(這是 Qt 唯一被批評的點)

Ruby 是什麼?
http://ruby-lang.org/
是我用過最方便的 programming language, 使用 Ruby license(很自由)歡迎來 ptt Ruby 板參觀 :p



Mac OS 10.5 將搭載 Ruby 1.8.6 + Rails 1.2.3, 想試試 Rails 寫網站嗎?
sudo gem install rails
不需要等 10.5 就可以輕鬆試驗了 XD
http://rubyonrails.org/

==

發完神經了,有傷眼請見諒 XD

--
#!/usr/bin/ruby          [露比] /Programming (Kn|N)ight/            看板《Ruby》
# if a dog nailed extra legs that http://www.ptt.cc/bbs/Ruby/index.html
# walks like an octopus, and Welcome ~Ruby@ptt~
# talks like an octopus, then ◢█◣ http://www.ruby-lang.org/
# we are happy to treat it as █ http://www.ruby-doc.org/
# if it were an octopus. ◥ ◤ http://www.rubyforge.org/
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.28.18

7/22/2007

Ruby GUI

[begin edited2]
夠了,不要再修改了,後續請看 telnet://ptt.cc 的 Ruby 板或是:
http://godfat.tw/viewtopic.php?p=1779#1779
(我電腦關機或沒使用網路時連不上)
[end edited2]

[begin edited]

作者 godfat (godfat 真常) 看板 Ruby
標題 Re: [心得] GUI
時間 Sun Jul 22 18:13:32 2007
───────────────────────────────────────

說是這樣說,不過真正開始測試的時候,我發覺﹍

1. wxRuby
實在有點難用﹍有一堆不該有的參數要傳來傳去﹍放棄

2. FXRuby
mac 上其實是可以用啦﹍只是需要 X11, 不能用 Aqua
結果就是﹍對 user 來說很難用,放棄

3. QtRuby
結果還是得回到 QtRuby...
cmake .
make
sudo make install

測試了一下,正常可用 Qt4
不過市面上的文件好像以 Qt3 為多就是了

嘖,沒有 port install qtruby 真的很可惜
這樣以後要升級或是反安裝就比較麻煩了
不知道當初安裝的 source 是不是要留下來以便反安裝作業

--
--
※ 發信站: 批踢踢實業坊(ptt.cc)

[end edited]

關於 computer science 這個領域,除了程式語言(programming language)與物件導向(object-oriented)外,再下一個興趣大概就是使用者圖形介面了吧(GUI). 所以我一直想找個自己喜歡的 toolkit 來用,在 C++ 中無非就是 Qt4 了,不過在 Ruby 中,似乎沒有一個比較完美的 solution, 一個個來看。

在這之前,我先說明一下我用過的 C/C++/Java GUI toolkit.

1. MFC, 學校在教如何剪貼 MFC code, 我是叛逆份子,所以一個字都沒聽進去。不用別人說很糟,光看第一眼就覺得很糟,更何況他又是被罵得半死的東西。

2. wxWidgets, 這算是我第一個使用的 GUI toolkit, 基本上,我認為這真的是個很強大的東西,沒話說。不過最令人嘖嘖稱奇的應該是他跨平台的能力,如果我沒記錯的話,他跨的平台好像比 Java 還多!不過因為風格問題,我不是很喜歡。基本上,我認為 wxWidgets 的風格有些過於老舊,寫起來感覺不是很好。Ruby binding 叫 wxRuby.

3. Qt, 我想正是因為 wxWidgets 跟我不太合,所以才繼續找下去。不料找到 Qt4, 我認為這應該是接近完美的 solution 了。有人說,Qt 至少領先其他人十年,也許這麼講並不為過。最令人詬病的,大概就是你只能從 GPL 或超昂貴的商業 solution 兩種 license 中選一種。其實我不覺得這對我來說會是很大的困擾,open source 沒什麼不好,雖然 GPL 是有點太激進了些。Ruby binding 叫 QtRuby.

4. GTK+, 這個其實我不只沒用過,甚至連看都沒看過。理由很簡單,就是我不想用 C 想用 C++. 當然我知道 GTK+ 評價不錯,也有 Glade 和 win32 的 port, 只是似乎沒有足夠的推力讓我去嘗嘗看。

5. Swing, 會碰這個完全只是因為需要用 Java. 我個人是覺得他跟 wxWidgets 各有千秋,但同樣遠遜於 Qt. 不過也許這樣比較並不太公平,Java 天生就是沒 C++ 強。所以 Qt 遠勝可能是理所當然的?Ruby 要用可以使用 JRuby.

6. Ultimate++, 其實這個我沒用過,不過看起來是不錯。沒去試主要有三個原因,一,他綁 IDE, 這個我很不爽。二,他的命名法我不能接受。三,Qt 很好。XD 其實你去看他的網站,他有一個範例程式,並用各種 toolkit 來實做。我個人認為這個動作滿不誠懇的,他有故意挑其他人弱點的嫌疑。而且各 toolkit 做到的東西明顯有差異,這樣比並不公平。不誠懇,不喜歡。

7. Notus/VCF, 這兩樣 toolkit 都有一個很大的特色,就是 template template and template... 基本上用 C++ 當然是要用 template 啊!!不過知道這兩樣東西時我已經有一段時間沒碰 GUI 了,所以並沒有仔細調查這兩個 toolkit 感覺如何。但我想如果沒辦法接受 Qt 的話,這兩套 toolkit 值得一看。

8. .NET/mono, 這個其實我只用過 Visual C++ 2005 Express 稍微拉了一下介面,感覺還不錯,但直接寫起程式不知道是什麼感覺。Ruby 要用的話,或許可以試試 IronRuby, 不過我個人對 .NET 沒什麼好感,就不去試了。

9. VCL, Borland 的招牌,我用過 Turbo C++ Explorer, 感覺是﹍基本上我覺得沒有 .NET 好的感覺。而且要跨平台恐怕有點難,所以就不考慮了。更何況這些好像也不算 open source 的吧?

10. FOX, 這個是我最沒聽過的 toolkit, 是去找 Ruby GUI 時才發現他的存在,所以我一點都不知道他的狀況究竟如何。評價似乎是不錯,而且好像很年輕。只是呢﹍FXRuby 似乎沒有 mac 的 port, 而我也已經有點懶得用 C++ 寫 GUI 了,所以還是暫時跳過吧﹍。基本上沒有跨 win32/x11/aqua 三大系統的 toolkit, 我就沒什麼興趣試了。

本來只想隨意講一點的,不知不覺就扯多了。接下來看 Ruby 能使用的東西:

1. tk, 沒記錯的話,這個被 ruby 內建起來了。不過似乎是用過的都說爛,所以還是不要多考慮吧?

2. FXRuby, FOX 的 ruby binding, 評價相當不錯,唯一的缺點也許是還沒有 mac 版的樣子?我想未來應該值得繼續關切,雖然我還沒看過他程式寫起來像什麼樣子。要試用的話,除了需要安裝 FOX, FXRuby 就:gem install fxruby

3. wxRuby, wxWidgets 的 ruby binding, 我是看到有人批評寫起來像在寫 C++, 這應該算是一個滿大的缺點,不過看在他功能強大,跨平台能力驚人的份上,還是值得試試看吧。要試用的話,除了需要安裝 wxWidgets, wxRuby 就:gem install wxruby

4. QtRuby, Qt3 與 Qt4 的 ruby binding, 基本上評價仍然是相當地好,唯一的兩大缺點,第一個是沒有 gem, 不能 gem install qtruby, 第二個是在 windows 上要安裝似乎非常困難,沒有簡單的方法。但我相信假以時日,這兩個問題都能夠解決(嗚嗚)。

5. Swing, 要灌 JRuby, 我的 macports 似乎找不到 jruby, 我又不想從 sun 的網站抓下來灌,再說,我也沒喜歡過 swing 過,所以就懶得試了。

6. Mono, 我有灌 mono, 不過不是很清楚能不能用 IronRuby 之類的東西存取,之所以寫在這,算是做個筆記,說不定可以使用這樣。

7. GTK+, 我不是很確定有沒有 ruby binding, 但我想應該會有才是。不試的理由同上,所以也只是暫時筆記。

Ruby 的 GUI 比較有名的大概就這幾個了吧。其實我是一直想試 QtRuby 的,雖然 windows 上似乎不太容易使用,但相信假以時日一定可以的。而讓我卻步最大的問題點在於,不能用 gem 安裝,macports 也找不到 QtRuby. 也就是說,我得親自 ./configure make make install, 但我不喜歡這樣,管理不便。所以我決定還是暫時放下他,等他有 gem 或是 port 時再說吧!

FXRuby 因為沒用過 FOX, 所以也還是放著再說。更何況據說是沒有 mac 版,那我試屁啊﹍。所以左右思量之下,我還是決定先試 wxRuby! 安裝方便,強大的跨平台能力,雖然是 C++ style 而非 the ruby way, 但對我來說 C++ style 也不是那麼地令人排斥,也許有點詭異,但我覺得也可以用自己想要的方式重新 wrap 一次,對 ruby 來說那是如此簡單的事!

so have a try with wxRuby!

this is the hello world:

require 'rubygems'
require 'wx'

class HelloWorld < Wx::App
include Wx
def on_init
helloframe = Frame.new nil, -1, "Hello World"
StaticText.new helloframe, -1, "Hello World"
helloframe.show
end
end

HelloWorld.new.main_loop


sudo port install wxwidgets
sudo gem install wxruby

閉關百日

即日起,本人即將到關西營區閉關百日,休養生息以及盡男生該盡的義務,大概今年十一月回來。新兵訓練出來後,就是國防役的生活啦。

對了,因為新訓好像可以看點書,所以預計會帶本練功秘笈進去練功
HTTP:The Definitive Guide
前陣子太忙了,都沒時間看書練鍊基本功好像也不錯。

7/11/2007

Passion

昨天我的一個好朋友告訴我「我好像失去了程式設計的熱情了。」我聽著這句話,突然覺得我蠻幸福。

要說我從來沒有這種感嘆是騙人的。上上次擁有這種想法的時候,我那時正被論文跟 PHP 搞的很疲憊,剛好遇到 Ruby on Rails ,那種超乎想像的設計讓我完全掉入這個世界,也重新找回程式真正的熱情。

上次出現這樣的想法的時候,剛好是前陣子案子太忙,事情多到我想殺人。一連串的忙碌讓我忘記了寫程式帶給我的快樂,只是一直感覺到累累累。Ruby on Rails 的東西也是這樣,成長的很快,但是我是不是跟著他一起成長呢?還是一直原地踏步呢?我到底追求的是什麼呢?我得到了什麼呢?

很幸運,這種疲憊感很快的就不見了,因為我接了這個 Case ,29屆瓊斯盃網站
小時候,我看著東方,阿龍,阿三等人在瓊斯盃奮鬥,現在呢?我以官網製作者的身份,坐在場邊看著中華隊在場上奮鬥。不一樣的我,一樣為中華隊加油的心情。我為了這個案子,連續熬夜好幾個晚上,連 Blog 都沒時間寫了,就是為了呈現一個最好的瓊斯盃網站。這麼堅持的理由不是因為專業,只是因為我是一個運動迷,我是一個中華隊的球迷,我要為他們加油。

累是超級累,但是我找回了失去的「Passion」。一個專門屬於我的 Passion。不瞞各位,我 7/23 就要進去軍中新訓三個月,在進去軍中之前可以做出一個這們有意義的東西,真的很開心。

一年前我開了這個 Blog ,也是這樣的熱情不是嗎?

我以身為 Ruby on Rails 使用者自豪,我以身為第29屆瓊斯盃官網製作者自豪。不管你是誰,用什麼語言,什麼 Framework,別忘記你的熱情,千萬要對你的工作感到自豪。

7/08/2007

ruby facets

老實講,ruby 有一個地方真討厭,那就是每次都把我想做的東西做完了。有了 ruby, 我不覺得還有需要再自己弄一個程式語言,做得比我想像中的還好。唯一的缺點大概只有 lib 還不夠多,但有了 facets 的話,那也真的是差不多了。
http://facets.rubyforge.org/
該有的幾乎都有了,差的只剩下一些小東西。如果早點發現這東西,大概就不會想弄 ludy 了吧。

不過想用 facets 有點麻煩,例如我想用 Array#shuffle, 就必須
require 'rubygems'
require 'facets'
require 'array/shuffle'
這麻煩到爆炸了吧!!不過有個好東西:

require 'rubygems'
require 'facets/automatic'

接下來,就放心使用 Array#shuffle 吧!因為 automatic 會自動幫你 require... 我沒去看他的實做,但我猜是建 table 吧。有一個小缺點,例如你想這樣做:

[1,2,3].shuffle.map &:to_s

很不幸,這樣會失敗。shuffle 可以正常自動 require, 但是 Symbol#to_proc 不能藉由這個方法自動 require. 如果你寫:

[1,2,3].shuffle.map &:to_s.to_proc

這樣是 ok 的,automatic 可以自動 require 該 require 的東西。問題大概出在,&:to_s 是 implicit call, automatic 偵測不到。所以第一次使用,還是必須明確說明需要用到 Symbol#to_proc, 接下來就可以快樂地使用

[1,2,3].shuffle.map &:to_s

了。或是前面自己手動 require:

require 'rubygems'
require 'facets'
require 'facets/automatic'

第二行的 require 可以讓你使用 Symbol#to_proc, 所以就可以直接寫:

[1,2,3].shuffle.map &:to_s

快去安裝 facets 吧!!
gem install facets
另一個 ruby web framework nitro 0.41.0 也有用到 facets !! 雖然是用 1.4.5 版的,而現在最新的 facets 是 1.8.54(以 2007.07.08 為準的最新版本)有機會也可以試試 nitro
gem install nitro
官方網站是:
http://www.nitroproject.org/
缺點非常明確!幾乎沒有文件 XD 我很少看到一個東西的文件可以少到這樣。

不多說了,我現在頭痛就算了,眼睛也很痛。