What have you found for these years?

顯示具有 程式 標籤的文章。 顯示所有文章
顯示具有 程式 標籤的文章。 顯示所有文章

2008-07-19

rails 太流行了

流行到一天到晚看到一些莫名其妙的誤用...
很多都只是基本的 ruby 問題,有稍微看過 ruby 都不會犯這個錯吧。

還有一堆只求可以動,只會模仿,copy, 卻從不追究其原理,
導致無數濫用,buggy, error prone, 等等......

連 ruby 都搞成這個樣子,還真難想像 php 會變成什麼鬼樣?

不過就某方面而言,其實這樣也好。畢竟這表示 ruby 不單只是一群
死忠在用,隨時會有新血加入,雖然也可能隨時離開...

對於社群而言,我想可能還是好處稍微大於壞處吧?

2008-07-14

完整的遊戲開發工具?

(btw, 真的是虛弱到一種程度了,本來想好好寫的,)
(現在只想打混過去... 也才忽然發現前幾個月有一篇寫一半的...)

以 cubeat 的經驗和一些希望的改善與強化的話:

library dependency:
* 3d engine (irrlicht, zlib license)
* sound library (irrklang, free for non-commercial)
* scripting (ruby, ruby license)
* scripting c++ binding (rice/swig, bsd/bsd license)
* database (sqlite, PUBLIC DOMAIN!!!)
* orm (data-mapper, mit license)
* beyond the c++ standard library (boost, boost license)

development dependency:
* standard compliant c++ compiler (g++, gnu public license)
* building automation (cmake, bsd license)
* task automation (rake, mit license)
* source code management (git, gnu public license)
* issue tracker (redmine, gnu public license)
* code generator (erubis, mit license)

其中主要 cubeat 沒用到的是 database 和 orm.
當然,cubeat 本身應該是沒有必要引入這兩樣東西。
只是我總覺得,如果遊戲本身複雜度不斷成長的話,
有一個 database 能用會少掉很多麻煩。而 orm 則是
理所當然一定要用的,不然用 sql 會死人的。

理想上就是只有核心是用 c++ 寫成,其餘的操作,
例如遊戲流程、操作流程等等,這些東西需要修改的可能性極高,
用 ruby 撰寫真是再方便也不過了。
如此一來,引入 data mapper, 則可以使得 ruby object
具有 persistent 的特性。當然,用 marshal 應該也不是不行,
不過用 data mapper 比較 once and for all.

比方說,可以對現在的遊戲狀況做 snapshot,
例如 RTS 的戰場儲存。比 yaml 或 zzml 更方便的
config 能力,preload RPG 的 weapon, unit,
skill, 以 spellbook 來說,spell 資訊,character,
item, 這些全部能以方便的方式儲存,也能夠有方便的方式編輯。
say, rails scaffold? 用 browser 當 map editor,
unit editor, weapon editor, etc...

由於使用了 database 當底層,也可以進行一些 search,
sorting 等動作。當然這可能比較沒必要啦...
一般來說,除非 MMOG, 不然應該不會有超大量的資料需要搜尋。
所以我也一直在想,這樣是否 overkill 了?

不過還是很想試試看可能性,畢竟 data mapper 看起來滿好用的。
希望 1.0 時真的能取代掉 active record + migration combo...

剛剛也有看到有人在 ruby-core 上抱怨 rails 擴充 test/unit 的
手法太過暴力 :o 既然這麼多人在開發,希望以後 rails 程式可以漂亮些。
不然我還真的滿想換一個 framework, 只是大部份都不夠成熟罷了。

2008-06-26

words from Matz

http://www.ruby-forum.com/topic/157571#694113

[quote="Matz"]

So unless something went terribly wrong,
we would enjoy playing with 1.9 stable on our Christmas holidays.

matz.

[/quote]

也就是說,1.9.1 將會是 stable version?
1.9.0-2 前一陣子釋出了,不過我一直沒試。
一方面 macports 沒有,二方面常常在看 trunk 的話,
哪個 tag 倒是沒有太大的差別...(可能穩定度有差啦)

只能說 ruby 1.9 穩定度遠遠不到我的預期,
看 The Ruby Programming Language 一書的作者,
似乎也是怨聲連連... XD 不過在他堅持 spec 時,
也會被大部分的人抗議,因為 ruby 1.9 是目前的 trunk,
而大家都希望能讓 ruby 持續進步。

結果後來他也住口了,大概民意就是如此吧 XD
雖然我也比較支持持續修改,但總覺得遭眾人圍剿很可憐,
更何況 1.9 真的早該 stable 了...

盼望這次的 Christmas 真的能夠開始用 1.9,
去年的 Christmas 那 1.9 根本就差太多了...

然後 trunk 就快往 2.0 前進吧。這樣 1.9 才有穩定的可能。
照他們的說法我感覺是這樣。因為 trunk 就是要充滿實驗性的東西? XD

*

不過這次 ruby 漏洞的事件,官方真的處理得很糟。
要嘛就不要那麼早 release tag, 要嘛就應該確定可用。
而且官方網站幾乎什麼資訊也沒有,也沒對後來的錯誤出面聲明什麼。

[quote="ruby-lang.org"]
Solution

1.8 series
Please upgrade to 1.8.5-p231, or 1.8.6-p230, or 1.8.7-p22.

[/quote]

結果這裡面好像好幾個版本連跑 rails test 都會 segmentation fault...
雖然我總覺得 rails 程式很髒,但會跑到 segmentation fault 就肯定是
ruby 的錯了 :(

振作啊...

這是民間 patch:
http://www.ruby-forum.com/topic/157392

2008-06-25

ruby character encoding detection

最早是 mozilla 的程式:
Mozilla Charset Detectors
source code
相關文獻

有人移植到 Python 上:
http://chardet.feedparser.org/

非常好,再移植到 Ruby 上吧:
http://rubyforge.org/projects/chardet/

沒什麼文件的樣子,這邊寫個範例:

> sudo gem install chardet
Password:
Successfully installed chardet-0.9
1 gem installed

> irb
irb(main):001:0> require 'rubygems'; require 'UniversalDetector'
=> true
irb(main):002:0> require 'open-uri'
=> true
irb(main):003:0> UniversalDetector.encoding open('http://www.falcom.co.jp').read
=> "SHIFT_JIS"
irb(main):004:0> UniversalDetector.encoding open('http://godfat.org').read
=> "utf-8"
irb(main):005:0> UniversalDetector.encoding open('http://www.blizzard.com').read
=> "ascii"
irb(main):006:0> UniversalDetector.encoding open('http://sysoev.ru/nginx').read
=> "KOI8-R"
irb(main):007:0> UniversalDetector.encoding open('http://www.softstar.com.tw').read
=> "Big5"
irb(main):008:0> UniversalDetector.encoding open('http://www.baidu.com').read
=> "GB2312"
irb(main):009:0> UniversalDetector.encoding open('http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html').read
=> "ISO-8859-2"

效能不清楚,大小寫不論,正確性應該還可以。

btw, 雖然我討厭 unicode 以外的編碼,
不過希望這些網站 encoding 不會改,不然就跟這裡的範例對不上了 XD
(其實我還以為要找到 big5 的網站很難了說...)

2008-06-19

RailsFieldsFilters

(所有程式 licensed under Apache License 2.0, see ludy.)

目的是在文章儲存前,先做一些額外的處理再存進去。
一直擴充下去最後就變這樣了,大概是做到這種感覺:

require 'rails_fields_filters'
require 'xhtml_formatter'

class Article < ActiveRecord::Base
extend RailsFieldsFilters
# before_save 時,對 content 做 format_autolink.
rff_filters[:before_save] << [:content, XhtmlFormatter.method(:format_autolink)]
# before_save 時,對 author 做 titileize
rff_filters[:before_save] << [:author, :titleize.to_proc]

# after_save 時,對 author 做 reverse 再做 downcase.
rff_filters[:after_save] << [:author, [:reverse.to_proc, :downcase.to_proc]]

# after_save 時,對 content 和 author 做 format_article,
# 下面那一串是允許的 tag. 其他所有的 tag 都會 escape 掉。(只 escape <)
# 有針對 pre 做處理,所有 \r\n, \n, \r 全部轉換成 br, 除了 pre 之內
rff_filters[:after_save] << [
[:content, :author],
lambda{ |input|
XhtmlFormatter.format_article input,
:a, :pre, :object, :img, :b, :strong, :em, :li, :ul, :ol, :i
}
]

rff_setup
end


詳細測試程式看這吧:test/ludy/test_rails_fields_filters.rb

實作很短:
module Ludy
module RailsFieldsFilters
def rff_filters
@rff_filters ||= Hash.new{|h,k|h[k]=[]}
end
def rff_setup
rff_filters.each{ |event, tasks|
tasks.each{ |task|
fields, filters = task
__send__ event, lambda{ |record|
[fields].flatten.each{ |field|
record.__send__ "#{field}=",
[filters].flatten.inject(record.__send__(field)){ |result, filter|
filter[result]
}
}
}
}
}
end
end
end


xhtml_formatter 比較長,看外部連結吧:lib/ludy/xhtml_formatter.rb

用到了 hpricot 來修復和分析 (x)html,
這是前一陣子寫好的,有一小段時間了。

主角 RailsFieldsFilters 其實一開始寫得很長,
應該有接近百行吧?功能還不怎麼多哩...
後來一直修最後就只剩 20 行,彈性還是最強的 @_@

平均每小時程式碼行數產量應該是負的吧|||b
寫程式還停留在 if else 是不行的啊

另外想抱怨的是,active support 用掉了 Proc#bind 這個名字,
害我的 test case 只要一 require 到他就會掛掉。 :(
也許這是無解的問題,短時間內... 超級 namespace 的機制,
就算在 ruby 2.0 可能也不會加進去(聽說,因為太複雜了)。

對了,還有一件事。更新到 ruby 1.8.7 之後,
我 rails 相關的 test case 要花 2~3 倍的時間!?
真不曉得為什麼?難道是 1.8.7 效能差很多嗎?
還是 rails 的程式對 1.8.6 tune 過,所以 1.8.7 就會慢??
因為我跑其他 test case 好像並不會說比較慢?存疑,懶得求證了...

2008-06-18

Inside Rails (2)

Bug #34 auto_link
06/18/2008 05:29 PM - godfat 真常

其實這也是我很討厭 rails 的一點:
什麼東西都 include 就對了!
事實上,不 include 反而會不行,
因為他們都是寫成 instance method!

我是覺得這很沒必要。helper 都應該用 module_function 才對。

所以說,如果放棄 rails 的那些 tag_option,
或是說,修改 rails 的 helper 成為 module_function?
那初步測試這樣可行:

require 'auto_link_content'
require 'xhtml_formatter'

class Article < ActiveRecord::Base
include AutoLinkContent
self.auto_link_function = XhtmlFormatter.method(:format_article)
auto_link_field :content
end


我相信這樣彈性應該很大,可以再擴充為對任意 field 做 filter.
如果要用 rails 的 tag_option 的話,可能會變成:

require 'auto_link_content'
require 'drupal_filter_url'

class Article < ActiveRecord::Base
include AutoLinkContent
include DrupalFilterUrl
auto_link_method :__filter_url
auto_link_field :content
end


也就是說,強迫你 include 一堆東西到 model 裡面。
include 一堆東西進來的危險,首當其衝的當然就是名稱衝突。
這跟濫用多重繼承的動作,其實是類似的...
ruby 的 mixin 其實比 multiple inheritance 還要強大哩。

2008-06-17

資訊爆炸

雖然我一直覺得資訊爆炸是一種污染,
不過其實就某方面而言,我也滿仰賴這種狀況的。

之前曾經在 ptt hate 板上閱讀大量的垃圾藉此沖淡其他東西,
不過我實在沒辦法接受這麼多毫無意義的文字... 因此沒幾天就放棄了。
後來改進 ptt 聊天室看別人聊天,其實有時候內容還滿有趣的。
也曾經幾次把那裡當影片在看...

只是大部分的人都在掛網,大部分的時間總是一群人而一片沉寂,
這樣也讓我很不舒服,最後也放棄了。更何況那種地方本來內容就很難掌握,
也不是每一次的內容都能夠有趣。

結果說來還是看 mailing list 最適合,老實講。原本都是看
comp.lang.c++.moderated 和 comp.std.c++ 這兩個,
後來因為 ruby 太有趣了,也比較沒那麼辛苦,
所以就看起 comp.lang.ruby(跟 ruby-talk 轉信)了。
不過那裡的水準有點太差了,文章品質不是很高...
最後大概就只看 ruby-core 了。

雖然有時候在講 implementation detail 的東西,
例如 YARV bytecode, 像那種就完全看不懂。
不過大抵上來說,平均而言的討論深度是適中的,
比 ruby-talk 難,比 comp.lang.c++.moderated 簡單。

至於 paper, 那又更難了,而且那很難有用資訊衝腦的感覺...

結論就是要找到平衡點不容易,還有 mailing list 真是好朋友...

Inside Rails

前一陣子為了擴充 rails 的功能,翻看了一些 rails 的 source code.

在多數語言中,例如 c/c++, 這樣的擴充通常必須修改 lib source code,
然後整個 rebuild 一次。如果說想要真的大翻修,其實這樣也 ok,
with git, 或許也能很方便地 merge 回最新 stable 版。
但是如果只是要改一點小東西,這樣就顯得非常麻煩。
就像之前 cubeat 上的 irrlicht, 不得不 fork 一份,
要 update irrlicht 時就需要一些方法,不能直接覆蓋。

不過在 ruby 裡,quick and dirty 實在太容易了,幾乎任何東西
都能輕易地 monkey patch. 雖然之前碰到沒有 un-include 或
un-extend 的問題... 至少大部分都能隨便 patch,
於是不需要修改 library 本身,application 本身仍然能夠是在
官方 release 的 library 上 portable.

各有優缺點啦。只是 ruby 多個 monkey patch 的選擇。

其實我想說的是,我總覺得 rails 的程式寫得,該怎麼說呢,
非常具有某種形式的色彩在內吧?當然,每個程式多少都會這樣,
但感覺 rails 就特別明顯。

當然在還沒把整個 rails source code 讀完前,不能下什麼評論,
但是我真的邊讀邊懷疑 rails 需要這麼複雜的架構嗎?感覺內部有不少
inconsistent, 尤其在看到這個的時候:

http://api.rubyonrails.org/classes/HashWithIndifferentAccess.html

不是有 symbolize_keys 可以用嗎?為什麼又需要這個?搞不太懂...
有的地方用 symbolize_keys, 有的地方又用 with_indifferent_access?
當然 source code 都放在那,仔細讀下去應該可以知道原因。
只是就介面看起來,Hash#symbolize_keys 和 Hash#with_indifferent_access
是沒什麼差別。而後者,api documents 裡好像沒寫?

另一方面,controller 中的 params 和 request. ??? parameter
又不太一樣。還有大量使用 class variable, 也讓我滿感冒的。
嗯,還有 AbstractRequest 中用了不少 global variable, $1, $2, etc.
這樣當然不 thread-safe? 我以為堅持不用 $1, $2 等等是基本的?

不過反正我也只是要 monkey patch rails, 只要他沒有 bug, 夠穩定,
內部要怎麼寫,我也沒什麼意見就是了。這也是為什麼也只是在這邊碎碎念
而不是真的去看他 source code 怎麼寫的....

總而言之,我覺得 ruby 會比 rails 穩定是理所當然的?
儘管 ruby 1.9 的 bug 還是一堆,離 production 應該還早...
2.0 大概又更是遙遙無期吧。希望不會走上 Perl 6 的老路...
另外不知道 Python 3 發展得如何了?這似乎是最有希望的? XD

2008-06-12

git 很好很強大...

(前情提要:我把某一段程式碼,從一個檔案 cut 下來,paste 到另一檔案)

雖然剛剛看了 redmine 的 svn diff,
好像也會顯示不同檔案間程式碼的移動?
不過看起來就怪怪的,如果我不知道他是移動的話,
應該會看不懂才對,因為沒什麼說明,
而且變成兩個不同的檔案在做 diff @@

但是在 git commit -a 時,看到神奇的訊息,讓我吃了 LCD:

* added app_ext for AbstractRequest patch, which extracted from photos/upload.rb
for ActiveRecord::Base.exists_and_find

# Please enter the commit message for your changes.
# (Comment lines starting with '#' will not be included)
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# renamed: lib/ffbapi/photos/upload.rb -> config/initializers/app_ext.rb
# modified: lib/ffbapi/photos/upload.rb


噢,他居然知道我程式碼是從 upload.rb 移動到 app_ext.rb @_@

commit 完之後的訊息是:

godfat ~/p/g/photo_app> git commit -a
Created commit 183997a: * added app_ext for AbstractRequest patch,
which extracted from photos/upload.rb
2 files changed, 22 insertions(+), 151 deletions(-)
rename lib/ffbapi/photos/upload.rb => config/initializers/app_ext.rb (90%)
rewrite lib/ffbapi/photos/upload.rb (90%)
godfat ~/p/g/photo_app>


他知道移動了 90% 的 code @_@
雖然說 rename 這個詞似乎有點不直接就是了...

上傳:

godfat ~/p/g/photo_app> git svn dcommit
Committing to svn+ssh://svn.roodo.com/var/svn/photo_app ...
Password:
C lib/ffbapi/photos/upload.rb => config/initializers/app_ext.rb
M lib/ffbapi/photos/upload.rb
Committed r504
A config/initializers/app_ext.rb
M lib/ffbapi/photos/upload.rb
r504 = aa436378cba9d0fad39780a98b29995ae9e74951 (git-svn)
No changes between current HEAD and refs/remotes/git-svn
Resetting to the latest refs/remotes/git-svn


為什麼是 C 啊 @_@ 看起來不是 conflict 的意思...
總覺得應該再多看一點 git 的概念的,可惜一直沒仔細讀過。

gitk 裡則這樣顯示:

---------- config/initializers/app_ext.rb ----------
similarity index 90%
copy from lib/ffbapi/photos/upload.rb
copy to config/initializers/app_ext.rb
index cd39bc4..1ec4ac3 100644

這就非常容易看懂了 XDD

2008-06-04

request.query_parameters

updated:
原來 request.query_parameters 是 get variable,
而 request.request_parameters 才是 post variable...
兩個都要用,就要寫:request.request_parameters.merge(request.query_parameters)
這樣是優先 get 其次 post...

因為 rails 的 params 會對 input 做額外處理,
例如 user[account] 會變成 params[:user][:account],
還有 params 裡面被額外加入 params[:controller] 和 params[:action].
為了避免這個狀況,想要直接抓出最早 post 過來的資料,
在文件裡 AbstractRequest 中的 parameters 的 source 中看到:

     # File vendor/rails/actionpack/lib/action_controller/request.rb, line 286
286: def parameters
287: @parameters ||= request_parameters.merge(query_parameters).update(path_parameters).with_indifferent_access
288: end


發現在 ActionController::Base 中可以用 request.query_parameters
取得該我所要的資料。(i.e. no :controller and no :action)
不過相較於 params, 最主要的差異就是 params 用 symbol 當 key,
但 request.query_parameters 卻是用 string!

我想這是因為我從 request 中抓值的關係?一開始我想乾脆 map 一次,
不過 map 的結果會是 array, 可能只能 fold 如:

request.query_parameters.inject({}){|r,i|r[i.first.to_sym]=i.last; r}

只是忽然想到幾件事:

1. 本來 post 過來的就是 string, 最後也要轉成 string 輸出,
那需要多此一舉做轉換嗎?除非經常需要 lookup?

2. 之前想模擬 request, 直接複製 server log,
就會看到 "api_key"="abcdefg", "sig"="hijklmn", ...
這樣我要模擬,還要把 = 左邊的 string 改寫成 symbol,
如果我原本就是要 string, 不就不需要轉換了?

...firefox 3 rc1 顯示問題還是不少。這方面,最穩的還是 safari...
opera 有時候也會出這種問題... 字型亂跑。可惡的是我猜只有 mac 版
firefox 和 opera 有這些問題。

anyway, 總之,那我乾脆全面改成 string 當 key 算了。
初步測試結果,似乎沒問題!之前 test case 和獨立 server 都正常,
上線 server 卻總是怪掉的問題,看來永遠也不會有答案了.....

*

另一方面,這能算是 undocumented api 嗎?
我對於所謂如果沒用到 undocumented api, 表示程式沒什麼的這個說法,
實在有點不能接受。一來許多程式的價值完全不在使用 api 上,
最簡單的例子就是提供 api 本身的程式,東西當然要自己寫。

二來總覺得這是 document 撰寫失敗的問題,或是更嚴重的,
library 本身就設計失敗,使得 programmer 需要用到
本來就不是給 client 用的 function.

感覺,最容易碰到這種問題的是 end-user 用的 desktop application.
因為如果要做得很華麗,就必須大量使用 os dependent api,
如 win32 api, cocoa, 等等。而這種超級龐大的 api 架構,
因為過於複雜,本來文件就很難寫,而且設計本身也很容易不夠完美。
想要做一些比較特別的東西,例如入侵其他 desktop 上的 process,
像是 dr.eye 之類的東西... 應該有很多 dirty hack 在裡面?

再加上,這種程式的困難度往往都在 dependent on os api 的部份,
例如要怎麼 animate dock, 要怎麼修改 registry (windows),
等等,其實根本就不是難在程式本身上,全部是難在跟 os 溝通,也就是 api
有沒有查到、有沒有正確使用等等問題...
(還有,怎麼 workaround with the buggy/badly-designed api?)

我是覺得,其實絕大多數的程式,都跟以上無關就是了。
而且我真的覺得 api 的問題真的是很無趣,別人一改就 break 掉了,
還不如自己設計 api, 去 break 別人的程式 XD

2008-06-03

再見 svk...

> sudo port uninstall svk

然後怎麼砍掉那一堆 p5-xxx ?
雖然我很想直接用 shell 幹掉,
但是我發現這對我來說還是困難了些...
只好再搬出 ruby:

> port installed "p5-*" | ruby -e "while s = gets; \
puts `sudo port uninstall #{Regexp.last_match[1]}` \\
if s =~ /(p5-[\w-]*)/; end"

跑個兩次之後就差不多全砍了,剩下的是 git-core 用到的,砍不了。

git dependency 也滿多的其實...

另一方面,fish 對於 shell 用字滿嚴格的,
害我不知道要怎麼 pass $1 給 ruby, 只好用 Regexp.last_match[1]

另外,ruby 1.8.7 正式版終於出了,不過 macports 還沒有,那就先不灌。
倒是 1.9.0-1 macports 居然有了?那就順手灌一下。

multiruby 不知道要不要砍掉,好像意義不大。

2008-05-28

finder 大垃圾,爛爛爛

updated4:
試用了最有名氣的 Path Finder:
http://www.cocoatech.com/pf4/
果然比 Finder 好太多了... 也不會生出該死的 .DS_Store.
雖然還是有幾點我不滿意,例如字實在是太小了,
調整了「兩個地方」的字型,只有兩個地方放大,
還缺少 cmd + i 時的字型設定....
就不能 global 設字型嗎?我不能理解要四處用不同字型的道理。
就算要,也要每個地方都能設啊,缺一個實在是...
preference 分成兩邊也有點討厭,不過這設一次就好,比較無妨。
就試用一陣子看看吧... 不過正式版也不便宜...

接下來該跑 rm **/.DS_Store 跑一天試試嗎?
要全部移除 .DS_Store 也很費力啊...

updated3:
試用了一下 muCommander:
http://www.mucommander.com/
看起來功能比 Finder 強大多了,可是...

一樣會產生 .DS_Store =口=
救命啊...

updated2:
果然是密技:
$ defaults write com.apple.finder AppleShowAllFiles true
$ defaults write com.apple.desktopservices DSDontWriteNetworkStores true
寫在選項裡有這麼難嗎?嗯,我知道,要寫 UI 本來就比較麻煩,是吧?
還是 command line 最方便齁?所以都寫成密技最好了...

updated:
http://lists.apple.com/archives/applescript-users/2006/Jul/msg00404.html
怎麼設定看隱藏檔的啊?某個 script? finder 本身幾乎毫無設定可言。

Preventing writing of ".DS_Store" and "._filename" resource to network drives.

該死,那個奇怪的 _filename 果然是 mac 生出來的。
每次看到壓縮檔裡面一堆怪東西,我還以為是 tar 都會這樣...
原來是 mac 的 tar 才會。看來該全面改用 7za 了,反正他也會 tar.

*

第一個要解決的問題是,如何阻止 .DS_Store 產生

http://en.wikipedia.org/wiki/.DS_Store
http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_16831

"To avoid creating .DS_Store files, do not to use the OS X Finder to view folders.
An alternative way to view folders is to use UNIX command line."

well, 檔案管理用 command line 真的是很痛苦的一件事。

$ sudo find / -name ".DS_Store" -depth -exec rm {} \;

這樣很吃系統資源的感覺,還設 cron 會不會太...

http://support.apple.com/kb/HT1629

懶得看,而且只有 network 的話也不夠啊。
最重要的是,不要入侵 flash disk 好嗎...

另外幾個問題是:

1. 無法顯示檔案大小,只有磁碟大小(這有時候很重要,
老實講,我根本就不 care 磁碟大小。)

2. 複製取代時幾乎毫無任何資訊,windows explorer
都會顯示雙方檔案大小!最好是還能跑 diff 或 md5 check ._.

3. 可不可以把 directory 固定放最上面啊!

4. 為什麼不能 sudo? 這樣我要怎麼用 finder 處理系統檔案?
只好切 root 或用 shell

5. 讓我看隱藏檔!windows explorer 都能顯示隱藏檔!

6. 垃圾桶,我不知道這算不算 finder 的一部份,清除部份檔案
不行嗎?為什麼一定要一次倒光光??simple workaround 是
進 shell 去 rm.... 或是先把垃圾收回去,把要清除的清掉,
再把其他垃圾放回去。

結論:
windows explorer 實在是太好用了!finder 實在太垃圾了。
(雖然 Thumbs.db 也非常非常討厭,不過產生率遠沒 .DS_Store 高)
(我自己沒開預覽就不會產生那鬼東西)
其實我還真的有在想是不是乾脆回去用 windows 算了...
反正 cygwin 也不是不能用...?
再加上 mac 根本就沒有一個堪用的 browser......
改用 opera 結果還會跟 open vanilla 打架 -_-b
firefox 又有其他不少問題... 而這些在 windows 上的 fx 都沒有 @@

除了寫程式方便、畫面美觀漂亮,其他幾乎都輸 windows 嘛 @@
10.5 穩定性又不足... 又沒有遊戲可以玩 XD

其他想抱怨的還很多... 像是內建的 tar 會生出奇怪的檔案??
du 沒有 -b option... 這也許是 linux 才有的?
順便抱怨 fish 只要進入含非 ascii 字元的目錄名稱,就會死在 sed...
這考慮下次投書給 fish 開發團隊,畢竟這問題他們可能永遠不會發現...
反之 bash 就跑得超快,utf-8 目錄名稱也都不會有問題
不過就預設的設定而言,fish 實在好用多了...

啊對了,windows 不分大小寫也很討厭...

還是乾脆來搞 linux 算了,不過這樣就不能開 audiofire 2 了
我記得 flash 也沒有 linux 版...

結論:linux 快統治世界,這樣其他軟體才有 linux 版

2008-05-16

DataMapper 0.3.x to 0.9

我一直嫌棄 rails 用 migration + active record 很難用。
但更不要叫我去碰 SQL... 因此我一直想找個更好的 ORM,
第一個看到的當然就是 nitro 的 Og. 無奈剛剛翻翻 nitro 的
mailing list, nitro 除了已經一年沒有進展外,看來也不會
再有什麼進展了。除非,有什麼人真的有心要做吧。

http://adam.speaksoutofturn.com/articles/moving_on_up.html

看了半天,要至少能有 Og 感覺的東西,目前好像只有這個 DataMapper.
稍微試了 0.3.2, 還不錯,不知道複雜的東西跑起來會不會有問題?
希望哪一天 rails 能捨棄掉這種 table driven 的討厭模式....

我真不懂為什麼 rails 要強迫把 model 分成兩個部份?

另一方面,nitro 的後繼者似乎是 ramaze.
http://ramaze.net/

既然 nitro 可能難產了,就期望 ramaze 可以站出來吧!

其實 rails 很多地方我是真的不太喜歡。隨便舉些例子好了:

1. 請不要把 main wrap 起來好嗎,wxWidgets 就這樣搞。Qt 沒有!
2. 不要產生一堆垃圾好嗎... 一個空 rails projects 也挺大的...
3. model 被強迫切成兩塊,這是最討厭的一點

嗯,大概就以上三點,其他大部分都還不錯,期望 ramaze 趕快追上來,
nitro 一看到就非常喜歡,真無奈就是不做了...
好多人都說很可惜啊,怎麼會落到這種下場?
也許就像 mailing list 上某人說的,還是需要 rubyforge 的 svn 吧。
darcs 會用的人大概不多?

另外不知道 merb 進展得如何。聽說他跟 rails 很像,那,why merb?
maybe some improvement... but i want some thing fresher.

==

我在思索 blog 與 forum 之間的關係。對我來說,如果有 forum 就
不會想要 blog 了。但是自己架的東西又怕掛掉,這樣會很慘。
所以也許以後就寫個 script, 把 forum 上的東西彙整過來,
當作備份,當作另一個 entrance, 或許這是比較好的方式吧。

好多計畫 :(

2008-05-13

git, redmine, and others (2)

眼睛又開始很疲倦了,趕快打完要休息了...
今天打字太多,手也酸了 :(

總之,總算把 Redmine 架起來了:
http://pm.godfat.org

server os: Arch Linux (版本:Don't Panic)
load balancer & static files server: nginx 6.3 with unix domain socket
rails server: thin 0.8.1 with unix domain socket *3
database: PostgreSQL 8.3.1 with unix domain socket
ruby: 1.8.6 p-114 [x86_64-linux]
redmine: 0.7.1

嗯,真的弄了很久,先是更新 nginx 的版本,我原本是自己灌的,
現在 pacman 裡面已經有 nginx 了,就改用他的版本。
然後我發現現在有 /etc/rc.d, 跟 red hat 系的 init.d 好像啊!
用起來超方便的...(痛哭流涕)

不過理所當然的,用那邊的東西,就變成都用預設的設定。
為了更改成我要的設定,真的是搞了半天...

先是權限的問題,不知道要怎麼設權限...
我現在的結論是,server 的東西好像真的不要放在 /home/godfat 底下。
除非你想用自己的帳號去跑 server... XD

權限管理真的很嚴格,真的是很引誘人都全部用 root 跑就好了 XD
這大概也是為什麼 postgresql 限制你絕對不可以用 root 跑吧 XD
真的是很好很強大,不過我不太會用...

想說設 unix socket, 也搞半天。最後才發現,原來不用設定就有了。
害我試半天,加上 safari 的 cache, 讓我沒發現我一直在看舊頁面...

這樣 rails 裡 database 的設定就可以非常單純,只要 user, database,
adapter 這三樣就好了。不用 password 是因為反正我 postgres 只允許
local 的 unix socket 通過,其他通通關掉。(不知道 user 能不能再省略?)

不過 postgresql 的概念和 mysql 差異滿大的,我不是很清楚
schema 和 database 之間有什麼差異... 我記得那時候看到的資料是說,
mysql 缺少其中一種概念。

其他的就都很好搞定了。nginx 的設定非常簡單,之前設 beast 也都搞過。

==

試用之後發現...
Redmine 真的是超強啊!!
scm 有一堆可以選,設了 subversion, 連到:
http://shooting-cubes.googlecode.com/svn

等半天,我還想說怎麼那麼不穩,這樣就掛了。
有回應之後才發覺,他大概是把所有的 revision 都抓下來了?
看看這精美的 log:

http://pm.godfat.org/repositories/changes/cubeat/trunk/include/model/Cube.hpp.eruby

看看這精美的 annotate:

http://pm.godfat.org/repositories/annotate/cubeat/trunk/include/model/Cube.hpp.eruby

看看這精美的 diff!! 任意挑兩個 revision!!

http://pm.godfat.org/repositories/diff/cubeat/trunk/include/model/Cube.hpp.eruby?rev=263&rev_to=259

多棒的顏色標記,各種 revision 的顏色都不同,
花花綠綠五彩繽紛,每一行的作者都有寫!!
這根本就完全幹掉 google code 上的 source browse 了啊 XD

更別提這只是 redmine 裡其中一個,repository 的瀏覽功能,
而且這只是 svn!! 晚點我一定要試試他對 git 的支援如何?
不知道會不會為每個 scm 客製化!?

所以我也開了這個:
飽和脂肪星 暫時論壇 XD

他的權限控制也很強大,可以自己增加 role,
每個 role 都可以設定不同的權限。可惜的是,
他畢竟不是論壇,太細節的設定不能設,例如
我不能開一個公告區的權限跟一般討論不同。
這樣可能要開其他的專案出來才能區分。

但這本來就不是 project management 的內容,所以以 pm 而言,
我覺得這根本就已經是接近完美了 XD

是時候來試試 issue tracker, wiki, 等等功能了!

待續

git, redmine, and others (1)

後來我放棄那些 svk mirror 的資料了,因為我還是找不到方法。
所以全部重新 git svn clone 下來。花了好幾個小時,畢竟網路比較慢。
還順便把 svn user 換成正常的狀態...

全部 clone 下來後發現,git 的壓縮能力真的很強!
佔用的硬碟空間也許是 svn 的 1/10 ? 甚至更多?

後來用 git 工作了一下,發現他的功能真的很強大,
恐怕是比 svk 強太多了... XD 想要 svk push,
就用 git svn dcommit, 結果他卻說不能在 dirty index 下 dcommit?
還是 git svn rebase 我有點忘了... 幾天前的事,最近一直沒空紀錄。

總之,google 半天,發現直接照他給我的提示做就好了:

$ git stash

這樣可以把目前 working copy 上的 change 隱藏起來!
接著就可以 git svn dcommit/rebase. 跑完之後,可以再用:

$ git stash apply

把剛剛的 change 叫回來。果然是很方便地在 branch 間移動啊。
感覺他的概念跟 svk 差異滿大的,我想我需要好好讀一下手冊。

除此之外,雖然 git gui 很陽春,不過可以用滑鼠真是一件快樂的事... XD
我用他來做類似 svk commit --interactive 的模式。
目前找不到 git 有類似 svk commit --interactive 的方式,
不知道是不是只是我沒找到,或是以後會加入這樣的功能?

我記得 git 能做的好像還是一個個看檔案,不會像 svk 那樣分片段。
我猜,在 darcs 裡面有更強的功能。期望 git 以後也會加入這種的...

所以我就是 stage 一個檔案,寫一次 log, 然後一個個 commit 出去。
接著 git svn dcommit, 就看到裡面一次塞了一堆我的 revision XD

希望以後 log 不只是 per commit, 可以 per file, 甚至 per line!
因為有些 comment 像廢話,我不想寫在 source code 裡,
但有時候還是會想稍微提一下,這種我覺得就可以寫在 log 裡面。
真的需要時可以調出來,不需要的時候,也不用看到他。

下次再試試 qgit 可以做到什麼。上次開他,跑好慢...
誰叫 rubinius 是個大專案呢?而且 Qt 本來就跑比較慢...
(倒是 Qt 4.4 居然出了... 可是我不想再 rebuild 一次...)

這篇當單純講 git 好了,下篇講 redmine 和其他的。

2008-05-10

svk => git 的麻煩...

我以為這是件很簡單的事,可惜試了幾個方式都失敗了 :(
問題是這樣,一開始我是希望能把 svk local branch 轉移到 git 上,
後來有點失敗,想說好吧那就轉移 svk mirror 就好了,這成功了。

現在我想把 svk 丟掉,所以想把 git svn 的 url 改成 remote svn server.
結果怎麼做都失敗 :(
難道不能這樣轉嗎?

錯誤是:

$ git svn rebase
Unable to determine upstream SVN information from working tree history

重新 build svn metadata 的錯誤是:

$ git svn fetch
[...]
Filesystem has no item: REPORT request failed on '/svn/!svn/vcc/default': No results returned from filesystem read operation. at /opt/local/bin/git-svn line 3833

不明白啊... orz

解決辦法大概就是:捨棄 svk mirror, 直接 clone remote svn repository :(
不想這樣做的原因是我不想要全部的 revision, 但也不想要只有 HEAD
我要 svk 上跳躍的 revision 啊... orz(因為有些時候我會 skip 掉不少 change)

本日昏昏沉沉

含淚送走 svk...

留言明天再回 ._. 我眼睛快張不開了,只是要做紀錄...
這有時效性,人類記憶有限,電腦記憶... 很大 XD

剛剛不想寫程式,所以就來試試 git
參考 google 肯定找得到的:(我亂查關鍵字他幾乎都是前幾筆...)
http://utsl.gen.nz/talks/git-svn/intro.html

不過他那些什麼 proplist, svm:source, svm:uuid,
這些我都不知道是什麼。svn:ignore 也不是很確定要怎麼用?
不去了解他的原因很簡單,我不喜歡在檔案上面貼標籤,
除了感覺非常不 portable 外,懶得學新把戲...

總之,反正我的東西都很單純,沒什麼大專案,簡單來就行:

(/home 打比較習慣,雖然我電腦不是這樣,還是照 /home 吧)
(我實在很討厭 apple 自己弄了一堆怪名字出來,尤其是那 Frameworks...)

$ git svn init file:///home/godfat/.svk/local/mirror/ludy
$ git svn fetch

這樣就行了,他那些 property 我不懂,也沒在用,不管他...
需要注意的是,因為我想放到同一個目錄下,所以我是 cd
到原本的 working copy 上。而上面其實也有不少沒放到 svk 上的東西,
git svn fetch 時如果沒把會重複的東西砍掉,會沒辦法 checkout?
總之就是 git status 會吐出一堆訊息... 手動處理這邊是稍微麻煩了點。
(不過也是因為 working copy 有很多額外的東西在裡面... 沒有的話就全砍就行)

一個個 fetch 完後(真的花了好長的時間........),先比比大小:

$ du -h ~/.svk
176M .svk

至於 git, 全部八個專案加起來,約 80M ~ 100M
果然是有比較小啊!取約略值的原因是,有些東西我沒轉到 git 上,
像是一些我確定不可能會再去看,或是有點重複累贅的東西,就沒弄了。

呃,怎麼說呢,其實我真的覺得這有一點不公平。可能是因為 Linus
號召力太大了?我不知道,我沒有去研究 git 的歷史。重點是,
感覺 git 的 support 一大堆,可是 svk 好像就沒這麼大的 community.

也許就真的如同上次在 rails community 上看到有人說的,
git 的 market 比 svk, mercurial, darcs 都好太多了。
嘛,其實 darcs 已經做得很好了吧?想想他還是 Haskell 寫的哩!

對我來說,最重要的是這兩點:

1. git support 真的很多,光看 git gui, 雖然不太好用,就覺得 svk 很可憐
居然到現在還沒有一個像樣的 gui 可以用...

2. git svn 看起沒問題,可以良好與 svn 合作

其他我不太喜歡 svk 的重點:

1. 可能是因為 svn 的包袱吧,在 svk 上改檔案名字實在是很討厭...
偏偏我又很愛改名字...

2. 沒辦法方便地攜帶整個 repository, 老實講,svk 有很多操作我還搞不太懂
總覺得應該有比較簡便的方式...
不過我覺得他中央管理所有專案的方式,也是有不少優點,
或許還需要一些改良吧?我猜?等 svk 3.0?

另一方面,捨棄 svk 對我來說還有個好處:

svk 的 dependency 真的很多,雖然說 port install svk 就搞定,
但是除了他以外,我真的沒有用到 perl 的東西了...
砍掉 svk 的話,perl 的一堆東西我也都能全砍掉了



那麼 git 有什麼缺點呢?老實講,還沒真的開始用,不知道,
也有點擔心最後還是會回去用 svk XD
不知道為什麼,對 svk 有某種好感 :p

第一次「使用」git 是為了抓 rubinius, 那時想說他怎麼用個
這麼少見的東西,找我麻煩。後來才發覺 git 現在真的很先進。
rubinius 也是少數用 rake 包裝包得不錯的專案,有機會想讀讀
他的原始碼,我覺得他自稱是「最先進」確實是有他的道理在。
可惜的是,在我的程式測試下,他真的跑得很慢...
而且相容性更是非常差,我沒一個程式真的能跑起來...
雖然 jruby 也一樣爛,不過 jruby 至少跑得很快...
(btw, 我對 jruby 很多執行檔不前綴 j 很感冒,他又強迫要設 PATH,
這樣我不去動手腳就一定會跟官方 ruby 衝突,很討厭)

另一個現在有印象用 rake 的專案是 IronRuby,
excellent, 我不改他 Rakefile 根本就不能 compile...
他路徑我記得設定很有問題,非常 windows style 之類的?
不知道現在有沒有改進,很久沒有在看進度了。

至於 parrot...
雖然我不是很喜歡把軟體跟建築拿來比較,
可是不得不說,有時候他們確實是很相像。
say, 比薩斜塔怎麼辦?拆掉嗎?
還是很期待他能跑起來就是了啦,萬能 vm 多好

不小心扯遠了,回主題。那時候在用 git 就對他印象很差:

1. 好慢
2. revision 為什麼要用 hash... 雖然這可能是概念完全不同之故

不過我現在自己測試才發現其實 git 真的很快,比 svk 快很多!
是因為 rubinius 本身太龐大,才會變得這麼慢吧?我猜。
只是這樣說來,svn 真的是個很... 殘廢的東西。
怪不得之前會看到有人像是一臉鄙視地說別人 svn 中毒。

雖然是這樣說,但好樣也有不少人連 svn 都不打算用...
只能說落差要大,要大到多恐怖都沒問題。

anyway, svk repository 應該會再留一陣子,看情況決定。
感覺 git 很多概念和 svk 還有段差距,所以在真的詳細用之前,
我想先讀讀其他文章看看。當初用 svk 也是四處看了不少東西
才漸漸習慣起來的 ˇ

而且看這些東西還蠻省腦力的,我喜歡...
真的比較技術或學術細節的東西,那真的是很傷神,不能當娛樂啊...

等 git 用得差不多後,就可以架 redmine 看看怎麼跟 git 整合了。
屆時我就不用四處亂貼奇怪的筆記了...

2008-05-09

module XhtmlFormatter

(updated: 也許可以試著加上 <code lang="ruby" style="twilight"> 或是
<code lang="c++"> 的 coderay support, 翻譯完就丟掉 code tag)

因應古怪需求,用 hpricot 硬幹一個 xhtml formatter...
輸入是文章,輸出是可以當作留言的 (x)html code

format_article '文章', :a, :img, :pre, :b, :em, :strong, :i
第一個參數是文章內容,後面的則是所有允許的 tag
不被允許的 tag 會被 escape 掉 <
目前只 escape < 成 &lt;, 原因是...
(updated: pre 內的 & 也會 escape 掉)
我忘了 @@ 總之剛剛測試是全部 escape 掉會有小麻煩...
所以有關於 & 之類的東西,可能會有點 bug, 這要再試試看
(其實是有點不爽,再加上今天整天注意力都很不集中...)
(換言之就是狀況差)

擇日再加到 ludy 中...

轉換的原則如下:
1. 除了 pre 包起來的區塊外,所有的 \n, \r\n, \r 全部換成 <br />
2. pre 包起來的區塊內,禁止使用 html, 全部一律 escape 掉 < 和 &
3. 因為上面的規則,加上 regexp 採用 greedy 原則,所以只有最外層 pre 有效
4. 忘記關閉 pre 的話,自動在文章最末端補上
5. 所有網址會轉換成有 a href 的連結,regexp 取自 drupal...
6. 網址包含各種通訊協定開頭的字串,還有 www. 開頭的網址,還有 email address.
7. pre 包起來的區塊內也有網址轉換成連結的效果

hpricot 效果蠻強的,還會自動修復一些 html,
不過介面敬謝不敏,細節不多說了(我現在只想筆記)

source code(正好試試效果如何!):


require 'set'
require 'rubygems'
require 'hpricot'

# 2008-05-09 godfat
module XhtmlFormatter
module_function
def format_article html, *allowed_tags
allowed_tags = Set.new allowed_tags
XhtmlFormatter.format_article_elems Hpricot.parse(
XhtmlFormatter.escape_all_inside_pre(html, allowed_tags)), allowed_tags
end

def format_autolink html
doc = Hpricot.parse html
doc.each_child{ |c|
next unless c.kind_of?(Hpricot::Text)
c.content = format_url c.content
}
doc.to_html
end

def format_url text
# translated from drupal-6.2/modules/filter/filter.module
# Match absolute URLs.
text.gsub(
%r{((http://|https://|ftp://|mailto:|smb://|afp://|file://|gopher://|news://|ssl://|sslv2://|sslv3://|tls://|tcp://|udp://|www\.)([a-zA-Z0-9@:%_+*~#?&=.,/;-]*[a-zA-Z0-9@:%_+*~#&=/;-]))([.,?!]*?)}i){ |match|
url = $1 # is there any other way to get this variable?
caption = XhtmlFormatter.trim url
if url =~ %r{^http://}
'<a href="'+url+'" title="'+url+'">'+caption+'</a>'
else # Match www domains/addresses.
'<a href="http://'+url+'" title="'+url+'">'+caption+'</a>'
end

# Match e-mail addresses.
}.gsub( %r{([A-Za-z0-9._-]+@[A-Za-z0-9._+-]+\.[A-Za-z]{2,4})([.,?!]*?)}i,
'<a href="mailto:\1">\1</a>')
end

def format_newline text
# windows: \r\n
# mac os 9: \r
text.gsub("\r\n", "\n").tr("\r", "\n").gsub("\n", '<br />')
end

private
def self.trim text, length = 50
# Use +3 for '...' string length.
if text.size <= 3
'...'
elsif text.size > length
"#{text[0...length-3]}..."
else
text
end
end
def self.escape_all_inside_pre html, allowed_tags
return html unless allowed_tags.member? :pre
# don't bother nested pre, because we escape all tags in pre
html = html + '</pre>' unless html =~ %r{</pre>}i
html.gsub(%r{<pre>(.*)</pre>}mi){
# stop escaping for '>' because drupal's url filter would make &gt; into url...
# is there any other way to get $1?
"<pre>#{XhtmlFormatter.escape_lt(XhtmlFormatter.escape_amp($1))}</pre>"
}
end
def self.format_article_elems elems, allowed_tags = Set.new, no_format_newline = false
elems.children.map{ |e|
if e.kind_of?(Hpricot::Text)
if no_format_newline
format_url(e.content)
else
format_newline format_url(e.content)
end
elsif e.kind_of?(Hpricot::Elem)
if allowed_tags.member? e.name.to_sym
if e.empty?
e.to_html
else
e.stag.inspect +
XhtmlFormatter.format_article_elems(e, allowed_tags, e.stag.name == 'pre') +
(e.etag || Hpricot::ETag.new(e.stag.name)).inspect
end
else
if e.empty?
XhtmlFormatter.escape_lt(e.stag.inspect)
else
XhtmlFormatter.escape_lt(e.stag.inspect) +
XhtmlFormatter.format_article_elems(e, allowed_tags) +
XhtmlFormatter.escape_lt((e.etag || Hpricot::ETag.new(e.stag.name)).inspect)
end
end
end
}.join
end
def self.escape_amp text
text.gsub('&', '&amp;')
end
def self.escape_lt text
text.gsub('<', '&lt;')
end
end

2008-05-07

Ruby 程式壓縮...

不要問我為什麼半夜心血來潮搞這個...
dependency 是 ruby2ruby,
ruby2ruby 的 dependency 是 ParseTree,
ParseTree 的 dependency 是 RubyInline
(其實還很蠢地 dependent on hoe, 不重要就不提了(雖然還是提了))

#!/usr/bin/env ruby

require 'zlib'
require 'rubygems'
require 'ruby2ruby'

class Ruby2Ruby
def indent s # 壓縮當然不要排版!
s.to_s
end
end

puts <<-END
require 'zlib'
eval(Zlib::Inflate.inflate('
#{[Zlib::Deflate.deflate(Ruby2Ruby.translate($stdin.read))].pack('m')}'.unpack('m')[0]))
END

隨便找了一個程式試,壓縮率約 51%

godfat ~/p/ludy> ruby rgz.rb < unit.rb > unit2.rb
godfat ~/p/ludy> ls -l
[...]
-rw-r--r--@ 1 godfat godfat 278 May 7 03:44 rgz.rb
-rw-r--r--@ 1 godfat godfat 1407 Apr 9 17:34 unit.rb
-rw-r--r--@ 1 godfat godfat 722 May 7 03:47 unit2.rb

試壓 ruby2ruby 更好,23172 壓到 6460, 約 27%

壓出來的程式就長這樣:

require 'zlib'
eval(Zlib::Inflate.inflate('
eJyNU81u3CAQvvMUyL3YSYOSSDl01Y3cW18gp9VqxeLxGokFCjhR0vTdM4Dt
dbxbtQcDnpnvm3+huPf0SctAeAhu54A34MqV5kf4Sld8L5UMEnyV1VwI8N6g
gTBGNeZFo1Fn8TjaijTQUolUkiv5BmXkqEgdL7qm8SL1RIiS35T+IfVIhIK6
s/E8xvOWgG4So9kHLvUuI1/L4caA8oMhFhwiPKh25mAz6qPjLeqH/8QbP5FS
/zFIF+kl0upiTQJ3Bwg7JX3IKWeBL6+yqJ4ZoNt4kRgbE8pomNLi1qpX8oU2
hmoTOqkPk6rXf1FaZwKIAM1/lPpzmj+BK/p9ynYBNzZgh31vMc2iQ9MCyaIQ
yeK1CDplkyrEsFc3a5oINisFz6C29IresYeKOdMjKtnOKsKAiw5b/x7eaWDY
8Otz+H2FgzFzMo3IdQ5nM03f9qxml2A357B/hnUhq2VYx4vBz3LPLZPPPMDn
Scr1juqDaVoexySuINPwUhZZhB3ID5aWYnin1bi7HVWL1YhNThw5Grp+RFuc
2NOKPdL7b1VFHPzqpYOysBb92B6Ht9hDaxzQofvWltlHVhMugjT6FMhpzfK8
bNm4BXNYWfA24HIOpJmE5UYtPWR7LJtZmI+dXQI+AE53nsY=
'.unpack('m')[0]))

基本上應該是可以直接跑,完全等價。不過我剛剛試了另一個會有路徑問題,
這點可能是 parse tree 搞的鬼... 要怎麼做才能完全正確我就懶得試了。
總之... zlib 不錯。

另外,ruby2ruby 有 bug...

Ruby2Ruby.translate '[1,2,3, *a]'
出來會是:
'1, 2, 3, *a'
外層的 [] 被吃掉了...
有空去 bug report 一下好了

2008-05-04

svk, we're done; hello git-svn

http://boodebr.org/main/done-with-svk-hello-git

有空時我就會試試看把 svk 的資料轉移到 git 上
理由是...

1. 看起來 git-svn 確實可以取代 svk
2. svk 有些狀況確實讓我覺得有點討厭...
3. 嘗試新東西沒有壞處
4. svn 好像真的該被淘汰了,這樣 svk 也會有太多 svn 包袱
5. git-gui 好棒!

希望會有個好結果!

訂閱: 文章 (RSS)