2009年10月19日 星期一

使用Scaffold在Ruby on Rails敏捷開發

首先,我想先說一下結論好了

在這次玩了scaffolding還有console才體會到什麼是敏捷開發

不過敏捷開發不代表新手也能像宣傳一樣,15分鐘架好部落格

要去理解後面整個概觀花上幾天都不是什麼稀奇的事

但是一旦了解了,你還是會不禁讚嘆這實在是太棒了

-- -- -- -- -- --

這次主要是因為資料庫程設作業一就出個一很夭壽的題目

所以才會決定要來玩玩rails

一方面是因為題目要求的東西根本就是網頁程式(包含動作和內容)

另一方面是就算使用VB(or c++, java)開發,同樣需要一些時間去摸

不同趁此機會再把玩一下rails ^_^

至於ASP...一開始IIS伺服器就不給我動作,所以就放棄了

這次用的配備一樣,instantRails+AptanaStudio

(AptanaStudio有更新了,剛開始用一整個不適應,找不到一些常用指令產生器的頁面

不過後來發現用到機會不大...另外有新增一些視窗,用起來更方便)

使用scaffold的方法很簡單,但是也很重要:

依照慣例設計資料表

怎麼設計資料庫就不是這邊的重點就不談了

主要是釐清資料表與資料表之間的關係(關聯)

如果一張資料表a1有用到foreign key:fk參考到table a2的屬性id

那麼這個foreign key的資料表屬性名稱就應該命名為a2_id

另外,如果是多對多的表格b1, b2(像是書和作者的關係,一本書可能會有多個作者,

而一個作者可能寫過多本書這樣的關係就是多對多)

就必須再拉出一個表格 b1_b2包含屬性b1與b2的key,用來存放b1,b2的關係

當然,table b1_b2中的屬性都是foreign key,所以命名一樣要遵照上面的慣例

假設分別對是對應到b1與b2的id,屬性欄位就應該是b1_id, b2_id

這邊要注意的是這張多出來的表格命名不是隨便把兩張資料表中間用個底線連起來

而是依照名字的排列順序來命名,把較小的放在前面

如果真的不知道誰大誰小...就開啟irb把兩個名稱去做比大小吧XD

決定好整個資料庫架構的時候,就可以開始scaffold啦

指令為:
ruby script/generate scaffold TableName attribute:dataType ....

#請參考: 第一個資料庫應用(with scaffold)--Ruby on Rails 完全新手手冊

(有一點要修正,scaffold的目標應為單數型態,出來的資料庫會自動成複數形態)

等scaffold完所有的table之後,就可以下rake db:nirgrate

作migrate的動作,一次建立所有資料表,然後就可以直接用啦

接下來就可以直接利用scaffold的出來的網頁與程式,修改成需要的樣子

節省掉很多類似的程式碼key in,可以專注在其他程式與頁面的設計,測試也方便

當然做scaffold*還是有缺點,一但資料庫調整,scaffold出來的網頁就掛了

所以在設計時就要很小心(*本文的scaffold是靜態的,動態scaffold已在rails 2.0捨棄)

談完scaffold之後來說說active record的關係

常見的關聯式資料庫關係:一對多,多對一,一對一,多對多;分別可以對應


has_many, belongs_to, has_one, has_and_belongs_to_many

向上面的例子在a1就是belongs_to a2, a2 has_many a1,

b1 has_and_belongs_to_many b2, b2 has_and_belongs_to_many b1

要對資料表設定關係,就是在該model中加入一行簡單的指令即可

以a1為例
class a1 < ActiveRecord::Base
belongs_to :a2
end
就是這麼簡單~ 但是這邊要一樣注意一下單複數形態,has_one, belongs_to接的是單數

而其他兩個關係接的當然就是複數形啦

好處?

假設你都依慣例設定好書籍與作者的關係,那麼要從書籍取得作者的名稱就異常簡單..

書籍.作者 , 沒錯,就是這麼簡單,反之要取得某個作者寫過的書

作者.書籍 , 嗯~結束

最後是console

這個是不起眼,卻是了不起的工具

可以把它看成是for rails的irb

只要打上ruby script/console就可以使用

簡單說的應用,就像很多mysql初學者不知道該怎麼下sql一樣

這時候就可以使用 MySQLQueryBrowser,直接對資料庫下Sql指令一樣

設定好的關係,可以利用console去驗證是不是自己要的結果

當然,就像irb一樣,也可以下一些ruby指令,不過已經和整個資料庫連線

可以去對資料庫作測試、查詢、修改等動作,一整個就是超方便

雖然篇幅只有佔一點點,不過卻是不得不說的好功能

2009年8月25日 星期二

使用VB讀取Unicode字元


嗚~好久都沒寫了,這次先來點清淡一點的布丁吧XD

這次處理客語統計的資料的時候,發現到不像國文的統計一樣,系統對該文全部的unicode有辦法以System.Char來讀取,而是客語使用System.Char來讀取則會發生嚴重的錯誤。原因是有許多無法顯示的字,而這些字並非對應到標準的字元區間(就是落在字定字元內),而在這一區段的字元System.Char會以標準字元去做讀取,也就是那些看不見的字,會被拆成許多個小區段來作處理。所以最終導致我在整理資料時會出錯。

這次解決方法所使用的類別為StringInfo以及TextElementEnumerator,都是在System.Globalization下的類別,使用方法很簡單

Dim tee As TextElementEnumerator = StringInfo.GetTextElementEnumerator(data)
Dim s As String
While tee.MoveNext
 s = tee.Current
 ...
End While

上述data是要讀取的unicode字串,該字串的每個unicode字元則是s。因為TextElementEnumerator並不是實作IEnumerable,而是實作IEnumerator,所以不能用for each來存取,要用上述的方式來讀取字串中每一個unicode字元。不過是IEnumerator要實作成IEnumerable也不會太難,只不過有沒有那個必要就看個人吧~
下次要寫處理unicode的程式就這樣小心的用吧^^

2009年1月16日 星期五

使用InstantRails架設可以對外的網站

嗯...久違的文章,距離上次發文好像已經過了五個月。這次會PO文也是剛好需要用到這個東西,網路上又找不到相關資料(我記得我有看過,但是就是找不到),所以經過大概4~5個小時try error(好像也沒這麼久拉),終於把站給架好了...沒想到意外的簡單,想到就想捶心肝(汗)。

ma...就直接來進入重點好了,這次使用的原理是利用Apache proxy對應的方法,一般網路上都是使用proxy balance,先製造cluster然後再用Mongrel對應的設定的cluster,最後再把cluster掛到proxy上面。但是,偏偏InstantRails的模組裡面硬是沒有proxy balance。所以在大腦快要壞掉之前終於try出了一種方法,就是既然可以先對應到cluster再對應到proxy,那我就乾脆把mongrel直接對應到proxy上就好了阿~在這邊我是利用InstantRails裡面附的typo來做例子,首先打開老東西,httpd.conf。如果不知道的話....就這樣也可以。

然後直接拉到最下面,更改下面的值


 

 
<virtualhost :8080>
ServerName typo
ProxyPass / http://localhost:3002/
ProxyPassReverse / http://localhost:3002
</virtualhost>

這樣就已經把虛擬的主機架好,而對應的PORT是8080(是Tomcat預設的listening port,如果有裝Tomcat就再選一個其他的Port吧)。不過這樣測試還是會連不到...原因很簡單,你沒有去listen port 8080...所以雖然伺服器會自動把從port 8080過來的資料轉給mongrel,但是沒有listen的情況下,OS根本不會丟port 8080的資料給他(伺服器)...所以,不要急著關掉httpd.conf,開始在拉到最上面,然後慢慢往下拉,接下來就會看到這幾行
#Listen 3000
#Listen 12.34.56.78:80
#Listen 127.0.0.1:80
Listen 80

只要在Listen 80後面再加上一行,Listen 8080,好,大工結束。存檔就可以等者看結果了,可以在瀏覽器打上 http://你的IP:8080/ 應該可以看到辛苦作的網站了,可以用力的推出去分享給別人,不用再望著localhost孤芳自賞。

2008年8月18日 星期一

使用全域熱鍵(Global hotkey)在VB .NET

這篇文章是介紹如何使用VB 2005來編寫可以讀取全域熱鍵(foobar翻成整體熱鍵)的程式,如果你是要找怎麼利用整體熱鍵,那很抱歉你可能迷路了XXD。
在開始寫程式之前,先來稍微介紹一下整體熱鍵的運作方式。
如左圖所示,一般來說,鍵盤上面的訊號是先送給OS處理後,經過管理程序再送給目前活動中(in active)的程序;所以當程式並不是在活動中,那麼自然就不會接收到目前鍵盤的訊號。
而全域熱鍵的用處就在於即使我的程式已經是在背景中,假如鍵盤有相對應的鍵被按下,我的程式也能夠做出想要的回應。而在XP系統下,提供了一個動態函式庫來讓我得以達成以上的需求:user32.dll。我可以藉由user32.dll向管理程序去通知說,我也要接收某些特定的鍵盤訊號,不論我是不是在活動中。註冊完畢後,當鍵盤有訊號進來,管理程序就會看目前進來的訊號是不是有人註冊過,如果有,這個值除了會丟給目前活動中的程序,也會丟給我註冊過的程序。
打個比方好了,就像是像在很常見的網路促銷活動,在一般的情況下如果要知道某商家有沒有特價或是促銷,只能透過商家固定的廣告來得到該資訊,或是要直接到賣場去才能看到。這就是一般的模式下情況,只有固定的一些程序(像是活動中的程序)才能獲得目前鍵盤的資訊。而假如我加入商家的會員,或是到他們的網站上去註冊,那麼就只要打開email(或是實體信箱),就可以知道商家最近有沒有什麼新的特價方案,就只要等著商家就會把訊息傳過來。我的程序也是一樣,一但完成了註冊的動作,負責管理鍵盤訊號的程序就會在有我所觀察的把訊發生之後,一並通知我。
所以在程式的一開始,我必須做這兩行的宣告:
Private Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer
Private Declare Sub UnregisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer)
告訴程式說,在接下來的程式碼中我需要這兩個從user32函式庫中的函式。
接下來的步驟比較繁複一點,須要參看程式碼,不過部落格中的空白都會被清空,內縮的格式會跑掉變得很難看,所以程式碼就貼在google文件中,連結在這
從form load開始看起,可以看到其中只有一行程式碼,裡面寫的是RegisterGlobalHotKey這個函式,目的是完成整個註冊全域熱鍵的動作,如果懶的去改直接就整個抓去用。比較要注意的是,取得hotkeyID的atomName,原程式碼中是利用threadID去做,不過用這麼麻煩的東西是可以用拉~。而其中 GlobalAddAtom函式就是取得一個類是hash code的東西,他會在系統的atom table寫入原字串以及獲得的atom(類似hash後的key值),在此程式中是利用此函式來得到用來註冊的hotkeyID值。
從form load上面一點看,會看到許多常數的宣告,那些是代表alt, shift, ctrl之類的鍵,不用做任何改變就可以。然後既然有註冊hotkey,當然也要有反註冊的函式UnregisterHotKey,當我們程式要結束的時候通知一下,這個程式已經死掉拉~~不要再寄訊息過來了。所以就照著程式碼那樣把反註冊函式寫完整在UnregisterGlobalHotKey,然後補在form closed(或是closing都可)裡面,讓程式結束後可以把hotkey反註冊掉。
接下來就是最重要的地方拉,如果要讓全域鍵按下後程式有所反應,程式碼就要寫在WndProc裡面。這個函式主要是接收從其他程序丟過來的訊息,所以當丟過來的訊息使說有使用者按下了我所設定的全域鍵,那麼就要給他好好處理一下拉。如果有要在全域熱鍵按下後所執行的程式碼,那麼就要寫在If m.Msg = WM_HOTKEY的裡面。在這個範例中,只做了一個計數器,來計算全域熱鍵被按下幾次,並且在全域熱鍵按下後,將自己設定為活動中的狀態。
這篇就寫到這樣吧,如果要加入全域熱鍵,直接把整篇程式碼給加進去其實也就差不多了XXD,只要把一些地方給改變一下,像是全域熱鍵的設定、按下熱鍵後的處理等比較重要的地方改一下,就可以用了。
在網路上還有找到另外一種做法,一樣是利用user32這個函式庫,又興趣的人可以參考一下^^。
參考網址:
http://www.codeguru.com/vb/gen/vb_system/keyboard/article.php/c4829/
http://www.vbforums.com/showthread.php?t=506461

2008年8月10日 星期日

將音樂檔案轉換成TAK格式

ㄐㄧㄤ~因為上一篇聆聽TAK音樂檔案看起來增加了不少點擊數,所以就先把這篇給補起來吧。^^
其實要將檔案轉換成TAK其實還蠻簡單的,首先到TAK的官網下載最新版本的編碼器(encoder)。目前最新的版本(打這篇文章的時候)是1.0.4
下載解壓縮,可以發現有幾個資料夾:
  • Applications
  • Deco_Lib
  • Sdk
  • Winamp
而要編碼須要用的只有Applications資料夾內的東西,其他就參看Contents.txt裡面的解說,其中有寫各資料夾內含物是什麼。
在這裡利用foobar2000配合takc.exe來進行轉檔,foobar真是個不錯的東西阿,不但可以拿來聽音樂,支援多種音樂格式,也可以透過各種不同音樂的編碼器來對音樂檔案進行轉檔。把在剛剛解壓縮後的資料夾Applications內的takc給複製到foobar資料夾下(這樣以後管理編碼器可能會比較方便),這樣檔案的準備工作也就可以說是完成了,等等就要開始參數的設定工作。
  1. 打開foobar後,選擇Preferences,然後在Tool中選擇Converter。
  2. 在Converter畫面的中間有個Encodeng Presets,在其右邊選擇Add New。
  3. 最上方的Encoder選擇custom,而接下來那個encoder則是編碼器的路徑,在這邊是Takc.exe的路徑。Extention則填入tak;Parameters請填入-e -ihs -p2 -overwrite - %d;中間那bit depth control不用管,用預設值即可;Encoder name當然就填入TAK,setting就填normal吧。
  4. 在播放清單中,對想要轉檔的檔案按下滑鼠右鍵,選擇convert=>convert to=>在encoding preset挑選 TAK normal就可以把該音樂檔轉成TAK格式。
知到了該怎麼去設定參數,那麼也應該了解一下參數所代表的意義。我們這邊用的參數是:-e -ihs -p2 -overwrite - %d。其中-e是代表我們是要對檔案編碼;-ihs是要給多執行緒用的特殊指令;-p2是壓縮比的模式;-overwrite是直接複寫掉已存在的檔案;%d是foobar給的檔案名稱。

這邊比較重要的是壓縮模式,tak總共提供了6種不同程度的壓縮,由p0到p5壓縮比越來越大,壓縮所需要的時間也越長;另外每個不同的程式還提供了該程度的最大壓縮m,與該程度較高壓縮的e,像是p1的最大就是p1m、較高就是p1e,p2最大就是p2m、較高就是p2e,p5最大則是p5m,也是所有壓縮比中最高的,也可以用pMax來表示。所以6種不同的程度再加上每個壓縮程度還擁有一個max與Extra,所以全部共有18種不同壓縮的比率。雖然官方所認定的noraml是p2,不過記然要壓縮當然要壓最高,所以一般在使用還是會設定到pMax,雖然在編碼的時候需要多花點時間,不過壓縮比還算高,而且也比ape的解碼速度還要來的快。

除了使用foobar配合takc之外,也可以直接使用官方所提供的壓縮解壓縮軟體,與takc同一資料夾內的tak.exe。操作也不難,選擇compress(壓縮)後,把要壓縮的檔案(wav檔)加入,並在option設定好一些參數就可以了。不過因為只支援wav檔,基本上還是foobar來的方便。

這邊也有教學,只要會一些簡單的英文就可以看得懂,如果是使用EAC的人可以去參考看看,這邊因為沒有玩過EAC所以就不寫了~。

p.s. 這篇東西老實說寫的我很灰心,怎麼寫都沒辦法合我的意,寫出來的東西有點...如果有人能夠提一些如何改進這篇文章的意見我會很開心的XD。

2008年7月24日 星期四

談假考部隊

ma...記然是小學生,基本上還是和教育拖離不了關係阿~~(茶
從今天大學聯考前,假考部隊的消息就一直不斷的流出來,除了之前颱風淹大水的新聞把這件是壓掉了好一段時間外,一直到今天剛好是大學網路選填志願的第一天。所以今天就無聊上網看看,有沒有網頁可以一探究竟。不過沒想到除了新聞之外,大多是一些批評的文章,讓人有點失望。
很多人都在擔心,假考部隊會造成怎樣的後果。有的人說會影響考試的公平性,有人說被否認了他們的努力,有人說這是藐視弱勢。我說,終於看到這塊土地的成長,雖然還差得遠。從這些批評當中,我們可以看到許多人已經跳脫在反對的這塊思維,進而到反反對。這是一種進步,是讓人高興的,不過為什麼還差得遠呢?因為放長遠一點來看,假考部隊是一種"現象",或是一個"結果"。而不是一個"因"。批評的人只看到這個現象所帶來的後果,而恐懼擔心。但真正應該憂心的不是現象,應該是造成這個現象的"因",其從何而來?
說穿了,假考部隊不就是台灣社會變遷中的一附帶現象。他的訴求很簡單明瞭:加速大學的退場機制,目的是:提升大學品質,如此而已。
那出現的原因呢?太多太多了...要談太麻煩了,所以就不談了。
屁!就是麻煩事才要談,台灣的每一個錯誤的政策後面,都有太多的原因。不過可以做個簡單的假想歸納:事情是要有人去想要達成才會去做,有很多人的希望,所以有人為了完成別人的願望所以去做,然後有人把這些件事(大家的願望)弄成了大家的事,這就變成了政治。不管中間的過程如何,政策的後面是人的期望,這篇土上的人的期望。不過我們也知道,這塊土地上的人太過於純樸(尤其是前一批的生產階級),一心只想要有個好環境,一直努力消耗、生產。不過,現在的我們知道了新的想法,另一種思維。過去的人不是錯的,但現事是有問題的。解了"因",接下了就是去"改變現況"。
從現象下手嗎?那就太膚淺了。
那?解現在的問題,只有新的想法,只屬於現在的方法。從根本上,我們的教育已經有在改變,我們的孩子現在學習的,思考的已經不同於以往。這條大學之路是否正確,應該要讓他們(準備上路的那群人XD)來思考。

後記:我覺得市場機制還不錯,只不過要建立在健全的認知上,不少台灣人還是不能接受。也許...台灣接受共產也是另一種選擇,我不喜歡就是了...