What have you found for these years?

2008-08-18

目前在樂多做過的東西 (0)

不好意思回覆還是暫緩一下,這拖太久我怕忘記就沒寫到了。

*

w01



唔... 時間大概是從去年六月(2007-06)左右開始,第一個是化妝品的什麼報名網站...
基本上對於我不感興趣的東西,內容不會多看幾眼,所以完全不記得這是在做什麼。
反正就是類似留言板的東西,算是拿來練習 rails 用的吧。code name 是 w01,
就是 works 01 的縮寫。

不過我剛剛發現我電腦裡還有留著他,所以打開來看了一下。view 裡面啥都沒有,
controller 裡面只有一個類似報名的東西。rails 版本是 1.2.3.
我在寫這個東西的時候,還認為要遵守別人給我的 html 版面,所以命名完全沒有修正。
在 controller 裡面就有這樣的東西:


def index
flash[:notice] = 'thanks for your registering'

begin
user = User.new
user.nickname = params[:textfield]
user.realname = params[:textfield2]
user.birthday = params[:year] + '.' + params[:month] + '.' + params[:day]
user.email = params[:textfield3]
user.blog_url = params[:textfield4]
user.blog_description = params[:textfield5]
user.mailing_address = params[:textfield6]
user.telphone_number = params[:textfield7]
user.save!
rescue
flash[:notice] = 'Invalid input'
end
end


來猜猜看這個命名習慣是什麼軟體?我猜是 DreamWeaver, 對嗎? XD
然後就被說這樣寫完全沒有用到 rails 的特性 @_@

幾天後,下一個案子就是夏日的 blog 傳說了。
之前的網址是設在 http://summer.blog.roodo.com/
現在應該已經連不上了,所以不用去點了。
今年的網址是 http://summer2008.blog.roodo.com/
不好意思報名只剩幾個小時就截止了 @_@b

照時間順序來說,今年的最後再講。總之,其實 summer2007 可以說是我第一個 rails 成品,
那個 w01 應該不能算吧..? 全部好像也才上面列出的那段程式,有寫等於沒寫。



summer2007



summer2007 也是 rails 1.2.3, 我大概做了一個禮拜左右吧?基本上因為可以算是第一個
rails 寫的程式,裡面的程式碼也是非常的難看,我只挑幾個重點講就好了。寫這個的時候,
我還是遵守著以不修改原本 html 版面內容為主的原則。不過 form 我就照實修改了,
使用了 form_for, 錯誤訊息也是照 giive 所說的習慣,簡單地使用 window.alert @_@

這個方法真是有夠方便,然而,總覺得對 user 有夠不親切的。再加上後來聽到有人把
js 的這個功能關掉,我後來還是決定乖乖印出錯誤訊息。所以在 summer2008 裡就能
看到我是在表格之上印出紅色的文字訊息。基本上這也是從 model.errors 產生出來的。
中文化的部份,則是改寫 ActiveRecord::Errors.default_error_messages.

回到 summer2007, 除此之外,另一個愚蠢的地方是寫了:


def self.included target
CatalogSize.times{ |i|
target.module_eval <<-END
def g#{human_number i}
self.top_img_tag = ''
# @latest_challengers = Challenger.find_all_by_catalog #{i},
# :limit => 15, :order => 'created_at DESC'
# @challenger_count = count_challengers_by_catalog #{i}
@challenger_pages, @challengers = paginate :challengers,
:per_page => 15, :conditions => ['catalog = ?', #{i}], :order => 'cache_latest_article_time DESC'
@challenger_count = @challenger_pages.item_count

@latest_challengers = Challenger.find_all_by_catalog #{i},
:limit => 25, :order => 'cache_latest_article_time DESC'
render :action => 'gxx'
end
END
}
end


這邊可以看到圖片我還是沿用原本的圖片名稱。甚至是網址名稱,才會寫得這麼奇怪。
這也是後來 giive 跟我說 routes 差不多就是在做這件事... XD
所以主題網站的網址就像是:

http://summer.blog.roodo.com/summer2007/g01
http://summer.blog.roodo.com/summer2007/g02
...
http://summer.blog.roodo.com/summer2007/g10

那時我還覺得這是很正常的寫法哩,因為那時候我只知道 routes 是:
:controller/:action, 那我要只修改部份的東西,當然只能靠 meta-programming 了 XD

還有為了應付 top 圖大小不同,寫下這個:

@catalog_image_width = [90, 130, 130, 130, 130, 130, 130, 130, 130, 130]

也在 helper 寫出:


CatalogTitle = [
'尋人啟示30天',
'達人經濟!勸敗日誌30天',
'文藝青年30天',
'我想試一次看看的事─30天30件事情',
'極限節能30天',
'驚奇招牌100拍',
'造型日誌30天',
'美味早餐30天',
'感恩心生活30天',
'自訂主題30天'
]


現在這種東西我都用 fixtures 解決了。resource 還是用 resource 的方式比較好。
除此之外的雜項,大概就是試著用 gmail 寄信,先是找到 msmtp, 一個外部程式寄信。
缺點很大,就是要在 server 上額外安裝 msmtp, 而且由於是直接 invoke shell,
直到寄信結束前,整個 request 不會結束... 對使用者來說就像是卡住一樣。

後來找到有人寫了 pure ruby 的 smtp_tls, 情況就稍微好一點。這個後來有被加入
facets 裡。不過我拿 facets 的來用都怪怪的,後來都還是回頭找這隻程式。
ruby 1.8.7 還是 1.9 的 net/smtp 就開始支援 ssl/tls, 就不用這樣找外部程式了。

不過最後也不是用這幾隻程式寄信,而是直接用樂多的 smtp, 他只允許 private ip 連接,
寄件者可以隨便設定 XD 曾經不小心寫成自己的,結果我就在收件夾看到自己寄給自己 @_@
這個 smtp server 好像特別調校過,滿好用的,都不會被別人當成 spam,
所以後來我也都放棄使用 gmail. 因為我自己的帳號可以用,樂多的不曉得為什麼就一直失敗。

另一個比較棘手的就是爬 rss 的部份。我那時是用 ruby 內建的 rss,
不過好像沒聽過有人用這個喲? XD 那時其實我也有找很多 library 來試,
只是發現 ruby 內建的能用,想說就用標準的就好了,反正測試是可以用的。

一開始我覺得為了讓使用者看到最新的結果,所以覺得需要每次 request 都去 fetch 一次。
不過 giive 說還是定期去爬,記在 database 比較好。那時我腦裡想到的只有用 Timer,
也就是 thread 的方式。現在我很慶幸我沒真的去試 thread 的方式,前一陣子測試,
mongrel 根本就會把你自己生出來的 thread 殺掉..... thin 就不太確定了。

前幾天總算看到這篇:Josh Peek officially joins the Rails core
rails 2.2 開始終於可以是 thread-safe 了嗎?真的是很漫長啊。
這樣 mongrel 可以不用把 thread 幹掉了吧? @_@ 看到 mongrel 這樣直接吃掉,
老實講有點傻眼... 不過照 Zed Shaw 的說法,要在 ruby 裡真的跑 multi-thread,
似乎是一件不太妙的事情。我猜也因此他才會把 mongrel 寫成這樣把 user thread 吃掉...

anyway, 總之就是完全不知道 crontab 是什麼。我對於 unix 環境所知的,
大概僅止於 ls, grep, mkdir 之類的吧 XD

這也是為什麼我一開始是說我完全不熟 linux, 對 rails 也完全不熟,
php 只寫過一點,完全只知道基礎而已。然後似乎就被覺得完全是個初學者... XD
well, 不熟就是不熟,我從來就不喜歡講著自我膨脹的話。另一方面,大概是我標準
也比一般人高很多吧... 所謂不熟可能就比多數人熟了... 這樣講好像很囂張喔? @_@

只是老實講,那時會被這樣覺得,我是滿意外的啦。
這裡也感謝 giive 在這邊幫了我不少,不然我後來應該也會很頭大吧 XD

比較值得一提的大概就到這邊吧。嗯,還有那時我 scm(not teacher XD)是用
svk 連 svn. 這應該也算是第一次正式使用 svk. 至於 svn 則是沒用過 XD

後來在 deploy 的時候,其實我還滿感到困擾的。因為 linux 我完全不會操作啊...
mysql 要怎麼開 database? 我檔案要怎麼傳到 server 上?crontab 要怎麼設?
dns 要怎麼設?喔,還有,那時 RMagick 一直有問題,結果後來證實是 ImageMagick
有問題。自己抓 latest stable version, ./configure + make, 失敗。
由於 C++ 也算熟了,就看他的錯誤一個個修 @_@ 結果根本修不完,完全失敗。

最後是另一個人用 emerge 才把 ImageMagick 灌好... 至此我對 gentoo 印象很差。
還有後來安裝新版 rubygems 也是,gentoo 自己都改過程式,不用他們的跑起來會有問題。
這點真的是很討厭... 尤其那錯誤又往往是莫名其妙 :(

那時就覺得,實在應該把 linux 基本的東西搞熟,不然很簡單的東西都還要一直問人,
別人沒煩死我自己就先煩死了...

另外其實我後來曾經想把整個程式重新寫好過,也真的有動手,修了一點點,
然後就懶掉了。畢竟活動都要結束了,我修這個好像沒什麼意義,而且好累 =_=b

所以說 summer2007 差不多就是我第一個 rails 程式吧,
很多東西都是第一次,跌跌撞撞的。

r1 | godfat | 2007-07-09 13:38:32 +0800 (Mon, 09 Jul 2007)



flash music player (roodo_player)



沒記錯的話,這應該是第二個比較花時間的東西。用的是 flash 8 + action script 2.
我自認這隻程式寫得非常好,把 model 和 view 完全分離了。基本上你可以進 flash
任意亂拉 movie clip, model 的部份跟那些完全沒有關係。這樣做的原因大概有兩個,
我希望版面要調整的時候,不要叫我自己去調整那些版面。真的是等一下調出來別人又不滿意 @_@

可惜這點倒是完全失敗,因為後來都還是我在調整。算了,還是程式比較會學著配合人 @_@
另一點則是因為除了要完整版外,另外還有一個 mini 版。我兩個可以完全套同一隻程式。

這邊最大的難題其實要放到網路上才看得出來。首先會碰到時間亂跳的問題,
flash 沒辦法正確預測 mp3 的播放時間... 奇怪,
他是不會 head 一下看 content_length 喔?不過 get 應該也會有啊...

總之就是他時間會亂跳,所以輸入的 playlist xml 就需要指明播放時間。
除此之外,亂拉 elapsed bar 也很容易造成問題,這邊也要額外處理。
再加上上下首亂按、playlist 盡頭、播放要跳下一首、碰到邊界要暫停、
按 back 要先跳到目前曲目的開頭、這些全部加起來,真的滿容易碰到 bug.

我看很多網站我狂按一通也很容易掛掉... 這邊我自認寫得比大部份的都好 @_@
還要小心 memory leak 的問題。我記得曲目好像還有照片,上下首也要切換。
是個乍看好像很容易,其實繁瑣的細節很多的問題。程式架構要先架得好,
才有辦法應付這些變化。可以看看一些程式片段:
mini player 的 control 定義:


// button appearence
self.onRollOver = function(){
if(self.state == "play")
self.gotoAndStop(self.frame_play_over);
else
self.gotoAndStop(self.frame_pause_over);
};
self.onRollOut = function(){
if(self.state == "play")
self.gotoAndStop(self.frame_play);
else
self.gotoAndStop(self.frame_pause);
};
self.onReleaseOutside = self.onRollOut;


mini player 的 elapsed bar control 定義:


selector.onMouseMove = function(){
if(selector.pressed){
if(elapse._xmouse < 0){
selector._x = bar.elapsed._width = 0;
model.jump(0);
}
else if(elapse._xmouse > limit){
selector._x = bar.elapsed._width = limit;
model.jump(100);
}
else{
// don't even try to pass over the loading progress!
if( model.loaded < (elapse._xmouse/limit)*100 ){
selector._x = bar.elapsed._width = limit*(model.loaded/100);
model.jump(model.loaded);
}
else{
selector._x = bar.elapsed._width = elapse._xmouse;
model.jump(100*elapse._xmouse/limit);
}
}
}
};


callback 和 ie workaround (ie 會根據網址 cache 住 playlist...):


// init the callbacks for whom need to be called
// whenever the track_list is done
var callbacks: Array = new Array();
// why do the push is in reversed order??
// below it would do track_panel_.init first...
callbacks.push(Delegate.create(this, this.init));
callbacks.push(Delegate.create(track_panel_, track_panel_.init));

// track_list_ = new TrackList(url, callbacks);
var for_suck_ie: String = Math.random().toString();
for_suck_ie = "?for_suck_ie=" + for_suck_ie.substring(2, for_suck_ie.length);
track_list_ = new TrackList(url + for_suck_ie, callbacks);

// setup the ugly callback that comes from the track_view
// maybe we should introduce the real signal/slot mechanism
body_.change_track = Delegate.create(this, function(track: Track){
this.change_track(track);
});


播放時會做的動作,非常複雜,還包含音量控制...

// panel button functionality
function play(){
if( current_track_number_ == -1 ) current_track_number_ = 0;
current_track.play(Delegate.create(this, this.next_track));
current_view.hide_image(); // prevent from memory leak...
current_view.show_image();
current_view.show_playing();
this.volume = cache_volume_;
parent_.onPlay();
}


這邊程式看起來都很單純,當然都是因為做了非常複雜的包裝...
summer2007 大約花一個禮拜,這我應該有做兩個禮拜,
難度遠遠超過 summer2007 好幾倍吧...

讓我感到非常可惜的是,這東西只用了幾天就下架了。辛苦作成的耶 orz
另一方面其實也有點想改寫成 action script 3... 覺得是值得繼續利用的成果。



誰來看過我 (foaf) / nokia 小案子 (nokia)



沒記錯的話,這應該是 2007-08 做的?其實我不是很確定,我只記得我後來都在寫 flash.
這東西我應該是包得更好了。是用 flash 9 + action script 3 做的。
基本上成果大概就是重製一份 flickr 的 flash, 那個一堆方格,然後會放大縮小那個。
這本來是說要拿來放誰來看過我,也就是每一格都是來看過你的朋友的 avatar...

這東西我取名為 avatar_block, 擴充性應該是做到非常高了。後來也拿來做 nokia 的
一個小案子。唉唉,這麼偉大的東西一個最後沒用,另一個是做無聊的案子... @_@

這我應該也做了一兩個禮拜吧,能調整的大概是 padding, width, height,
width pixel, height pixel, 取圖的 strategy, 播放的 strategy,
主要應該是這些。目前寫好的有 BlockImpStatic, BlockImpOrdered, 還有
BlockImpRandom. static 重點只有這一段:


public override function pick_master(): Master{
if(block_masters.length > 0)
return block_masters.shift();
else
return block_fake_master();
}


master 是 friend 的 model, 對應到 FOAF 中的 Person,
這是一個定義 Friend of a Friend 的 XML 標準... 會用這個的原因,
只是單純 friends 主開發者在玩 Semantic Web XD
well, 只是資料傳遞而已,用什麼規格我沒意見,反正 flash parse xml 的工具
也不缺,只要格式定義好,我暴力寫死抓取順序都沒關係。

回主題,所以 static 的 strategy 就只是依序抓出 master, 不足的話補假貨上去。
ordered 則是 pick 法近似 static, 只是不足的用空的,不是假的。
然後要定義 work, 大概就是抓隨機抓位置和方向,做出漸變效果,然後要歸位:


public override function work(){
if(disable_) return;

const region: int = block_pick_region();
const direct: int = block_pick_direct();
const xy: Array = Helper.for_xy(region, direct, block_xcount);
const picked: Avatar = block_make_avatar(
masters_[xy[1]*block_xcount+xy[0]], function(){
block_work(picked, region, direct);
setTimeout(work, 1000*5);
}
);
}


這邊的 Avatar 則是從 Master 的 resource 中抓出來的圖片,作成的 model.
分成兩個 model 的理由非常明顯,就是 avatar 需要 release, 而 master 不用。
如果 flickr 不做這件事的話,flash 跑久了就會大 lag... XD

核心演算法只有這樣:


if(region == -1) region = pick_region();
if(direct == -1) direct = pick_direct();

const shadow: Array = pick_shadow(region);
const zombie: Avatar = pick_zombie(region, direct);

picked.no_alpha();
picked.expand(region);
picked.fade_in(function(){
for each(var s in shadow)
s.full_alpha();
setTimeout(function(){
picked.slide_to(direct, function(){
kick_zombie(picked, region, direct, zombie);
});
}, 2000);
});

for each(var s in shadow)
s.fade_out();


一開始是在說如果沒有指定位置和方向的話,由預設行為決定。
shadow 是指所有會被放大圖片蓋住的圖片,zombie 則是最後會整個被蓋住的圖片。
fade_in 接受的 argument 是 fade_in 完畢之後的 callback.
先看下面,所有的 shadow 一開始就要 fade_out,
所以是四個 fade_out, picked 則是 fade_in.
fade_in 完畢之後,shadow 要恢復 full alpha, setTimeout 暫停一段時間,
然後 slide_to 到定位,最後 kick_zombie 把 memory release 掉。

其他的就是 strategy 間如何取得 master, 如何取得 region, direction 的差異。

基本上我的設想是正方形的網狀,但套到 nokia 的案子上,左右 padding 超大的形狀,
倒也是運作正常,這點還滿值得欣慰的。所以只是稍微修了點細節,大概就可以運作了。

最煩的還是 crossdomain.xml 吧 =_=b



紫晶三國大戰小案子 (three_kindoms)



這個其實沒啥好提的,就是一個簡單會轉的輪盤... 跟丟骰子差不多,
不過為了做好看一點,輪盤一開始是會加速,然後減速,最後停下來。
擲出傷害 1d6 + base, 滿無聊的。不過為了防止作弊,所以其實運算是 server,
我寫了一隻 ruby script 跑跟 flash 一樣的演算法,然後把數值丟給 flash,
叫他照著這個數字跑一次... 所以 flash 完全只是圖形顯示而已,運算都在 server.

不過老實講,我懷疑就算是寫在 flash 上,有誰真的會來作弊 XD
這麼無聊的「遊戲」恐怕沒啥作弊的價值....

比較值得一提的是紫晶看起來果然滿沒品的... 細節我不太記得了,別問我 @_@
畢竟我只是實作者,對我來說不是直接的影響。比較直接的是,素材要半天才給,
而且簡直像是湊出一堆垃圾這樣丟過來...

另一方面,好像 flash 就沒有用 scm 的習慣 @@
幸好現在用 git 了,要記得沒像 svn 那樣麻煩,所以要弄。
還有 giive 聽到我後來都在寫 flash 嚇了一跳 XD



decemberboys



其實我不是很確定這是不是下一個。七八月大概就是上面那些了,再來就進入 part time.
什麼十二月男孩,好像是一個電影吧。這只是留言板而已...
連著版面、錯字修改等等,才 35 個 revision, 用 rails 1.2.3.

r1 | godfat | 2007-09-17 18:02:50 +0800 (Mon, 17 Sep 2007)



寄 email 的 script



時間忘了,幾行而已,把一個固定格式的文字檔抓出 email,
然後對所有人寄出 email, 中獎通知之類的吧,有點忘了。

-rw-r--r--@ 1 godfat godfat 1.8K Oct 29 2007 send_mails.rb



ma19_baseball



這個案子分成 rails 與 flash 兩塊。我本來是預計只做 flash 的部份,
不過後來也去支援了 rails 的部份。這邊也是連著假日趕工才做完的,
跟政治牽扯上關係向來不會有什麼好下場,所以只能這樣趕工?

不過老實講,這案子內容我已經不太記得了。一來很無聊,沒啥特別好提的,
二來太趕了,寫得好累 =_=b 而且這邊還有麻煩別人做一些機械性的動作,
把那啥鬼 100 個人的臉用 flash 標出來...

ㄟ都,寫程式雖然累,不過倒是有個好處。就是機械性的動作可以丟給別人做 XD
像是把人臉標出來這種事,應該沒有人會想先寫人臉辨識吧?反正也才 100 個人,
幾個小時就標完了... 人臉辨識幾個小時應該寫不出來 XD

然後這個 flash 跟後端 server 溝通,判斷該人找到沒。沒找到的話,
可以送出幫助尋找該人的資訊,丟給 server 記錄下來。

這邊後台就不是我寫的了,rails 我只寫了一小部份,好像是活動網站吧。
投票也不是我寫的。雖然那 flash 很簡單,但還是很費工夫。

另外,說是很趕做完的,但其實也遠遠沒有在學校趕作業趕。
不曉得為什麼,學校裡都像是在拚命一樣... 真的不奉陪對不起,
從來就不覺得那些事有重要到需要拚命,還無給薪,又要看人臉色。

這邊用的是 rails 1.2.5, 升級囉。

r1 | godfat | 2007-11-03 16:47:08 +0800 (Sat, 03 Nov 2007)



xmas_trees



這個本來是要以外掛的形式掛到樂多朋友(http://friends.roodo.com/)上,
不過後來時程實在太趕,而且外掛的東西根本就完全還沒準備好嘛.....
所以後來就沒有上。不過這個是我第一次使用 has_many :through,
覺得本來很簡單的東西,跑到 relational database 上就變得好複雜...
雖然後來我也覺得用 has_many :through 是有點 overkill :o

很狠的是,這一次我把整個 html 改寫成 xhtml + css, 順便貼上 w3c 的貼紙... XD
也算是我自己的一點實驗吧,驗證 xhtml 的成效如何。這邊我其實做了相當繁複的動作,
弄了這個東西:


def default_render
template = "#{self.controller_name}/#{self.action_name}.xhtml.erb"
respond_to{ |format|
format.html{ render :template => template }
format.xhtml
format.xml{ render :template => template, :layout => '_xmas.xml.erb' }
}
end


細節我就不多說了,總之我要的最終成果大概是這樣:
如果 browser 是 ie, 則吐出 text/html 和 xhtml 1.0 transitional
如果 browser 是 firefox/opera/safari, 等支援 xhtml 的 browser,
則吐出 application/xhtml+xml 和 xhtml 1.1 ! 是 1.1 喲 XD
這邊為了 ie 真的調校很久.....

另外也在上面試了 capistrano, 然後發現他瘋狂 checkout, 所以後來完全放棄他了。
sqlite3 也由於是 rails 2.0.2 的 default, 在此第一次嘗試。

同時也是第一次在 slicehost 上放測試的程式。仔細想想,
只為了測試就每個月花 20 USD 好像不是很划算... @@
不過刷都刷了,實在懶得多想...
另一方面,最早刷其實是為了做另外一個 flash 的案子,不過跟樂多無關就不多提了。
那東西一開始寫得還可以,後來碰到一點事就越寫越亂,最後就差不多變一團...
還沒到垃圾啦,畢竟一開始還是有好好寫的。anyway, 別人滿意就好,我自己是不太滿意。

這個 xmas_trees 其實寫得很混亂。一開始說可以用 rfacebook,
三兩下寫好,後來發現 facebooker, 用起來更順手。結果 friends 不支援... XD

只好換成之前的 foaf api + 什麼資策會的奇怪 api @@
必須同時使用兩者,因為兩個 api 都有缺陷....
我忘記是什麼缺陷了,總之兩個要合起來用,資料才足夠。然後會有一堆重複的資料 XD

這東西我前後大修了非常多次,最後還是沒有上,因為太混亂了,滿殘念的。
裡面還有好像是跟博客來合作的東西?把那些一堆商品轉成 fixtures,
就是麻煩別人幫忙做的,辛苦了... @@ 雖然格式不是很合 XD
沒差,有固定規格接下來我寫 script 轉就好了。應該也是第一次正式寫 fixtures.

測試的部份,也是第一次嘗試引入!天啊,現在想想,才發覺這個案子裡面超多實驗品...
這樣會做這麼慢,大概也是難怪吧... XDD 我也是在這邊體會到 spec 改變太快,
測試寫起來真的是會累死... 所以最新版的 test case 應該不會過吧 @@ 不管了。

r1 | wang | 2007-11-30 16:37:41 +0800 (Fri, 30 Nov 2007)

那時沒 svn 權限,別人幫我開的。用 rails 2.0.2
喔對對,剛剛翻到其他檔案才發現,這原本是用 rails 1.2.6 寫的...
算算裡面至少超過 10 個不確定因素吧 @@ 接近是亂搞嘛 XD
啊,還有,發現 ajax 無論如何都不能 cross domain!
還是 google 半天才發覺的 orz 這邊可以很明顯看出,我對於寫網站沒啥 sense.



戳戳朋友 (poke)



本來像是上面那個聖誕樹一樣,是要用外掛的形式。但等不及了,
所以後來直接合併進 friends 裡面。http://friends.roodo.com/poke

這程式其實沒有寫得很好,普普通通吧。後來為了整合進 friends,
這部份不是我進行的,大部份東西應該都修掉了。因為有些我沒按照原本規格寫。

到這邊我也是一直在實驗哪一種登入的實作方式最好。從一開始到現在,
我寫法幾乎都完全改變了...

還有這邊其實也在用那個半殘的 foaf api @_@
當然是合併前的事就是了,合併後當然沒有用 http api 的必要。

由於前一個測試失敗,所以這次沒寫測試。同樣是 rails 2.0.2.

r834 | godfat | 2008-01-07 16:11:28 +0800 (Mon, 07 Jan 2008)
(svk 所以數字這麼大 @@)



epaper



忠泰建設要的電子報發佈系統。用 rails 2.0.2, 第一次嘗試 git,
第一次嘗試 github, 第一次把 rake task 當作必寫的作業、
第一次幫人從 setup 到 deploy 一次弄到好、第一次用 sendmail(好簡單 XD)、
第一次嘗試輸出 patch 和 apply patch, 第一次非常確定 html 是正確的 @_@
一來是版面不多,二來是對方很囉唆,一點點變形都不行... XD
我要是改寫成 xhtml + css 就是自討苦吃了,幸好沒這樣做,因為只是當小案子。

不過是到這邊,我才比較確定 login/logout 要怎麼做。還是存到 session 最好,
最不會碰到 flash 被 expire 掉,結果 referer info 漏掉...
ludy paginator 應該已經用一段時間了,最早好像是為戳戳朋友設計的。
這邊替他加入了 Ludy::NullPage, 可以省掉一些邊界判斷。

好像也是第一次用比較嚴謹的方式做 ajax, 然後碰到了無法在兩個狀態切換的難題@@
這很有趣... 我按下 A 後,希望文字變成 B, 並且按下 B 後,又會變回 A,
然後按下之後會變成 B. 我以為這是很簡單的邏輯,就是兩個狀態間切換嘛,很單純。
結果換算成 ajax, 考慮到 link 也必須被回傳,這樣卻造成無窮遞迴@@

怪不得很多網站的 ajax 都只能動一次,不能兩邊切換@@
我試了各種古怪的方式,包括由 server 回傳,由 js 產生,
到最後還是失敗。我猜應該還是有辦法的,只是到這我累了,只想早點結案。

基本上這個 epaper 算是做得滿完整的,不像上面很多完成度都不高。
另一方面也是這個很簡單花不了多少時間,就做得比較完善了。
我可是連 1x 層,甚至快 20 層的 table 都手動幫他排版了咧 XD
老林說,不過 table 還排得滿漂亮的,真不幸,那是我手動排的 XD
這也花掉不少時間... 只是不排的話,我肉眼可分辨不出 15 層 table 要怎麼切。
饒了我的眼睛吧...

還有在這裡搞懂 protect_from_forgery 是要 protect 什麼。
後來我決定把他關掉,因為本來就是要跨給別人 subscribe 的。

deploy 由於他們是用 lighttpd, 所以我用 lighttpd + fast-cgi.
發現還滿容易設定的,祈禱不會掛掉吧 XD 咦?可是我記得原本是 apache,
可能是後來改的吧?我還先設 epaper.godfat.org 給他們測試 @@
現在當然拿掉了。也後來才知道他們 BIND 也架在那台上。(可是我不會用...)
非常古老的一台 fedora... 上面沒跑什麼東西,但 ram 吃滿滿,原因不明。

commit 5bcd1ae66b9ca4da460b8e0ece5ee63923865711
Author: godfat <godfat@Macintosh.local
Date: Mon May 19 12:11:47 2008 +0800

時間差有點多,中間很多都是在支援 friends 的部份,
包括幫忙把 rails 1.2.3 升級到 2.0.2, 還有 javascript 壞掉、
tuning, 架設不用寫程式的網頁、修理 oauth, emailcash, 等等等...
期間應該還有 ffbapi 沒講到,現在都還在跑的東西放到最後講,因為比較不容易忘。



rubi



這不知道是啥,好像是電影什麼記者會諸如此類的......
我記得那天做完這個,跟吃去哪個電影院?一路上一直看到眼熟的海報... XD
由於擺明就是一次性的垃圾,所以我根本就在亂寫,沒啥好提的,
也沒用 scm... 裡面 bug 一堆 XD 最煩的還是切 view.

真不好意思,那一陣子我也有其他事,所以有點亂寫。

drwxr-xr-x 15 godfat godfat 510B May 22 01:00 rubi



*

待續好了,連續寫四個小時沒休息,有點受不了了... 左手都有點酸痛了。
我打字左右手分配不太平均,左手的負擔比右手大很多。正好平衡平常右手用太多...

接下來是 ffbapi 與 photo, 還有 summer2008. 還有別的嗎?

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0