What have you found for these years?

2011-09-05

We're hiring!

As I've mentioned in rubyconf.tw/2011, we're hiring!
Preferably in Taipei, but we can discuss in detail.
Please contact us (or me) if you're interested, or
forward to whom might be interested. Thank you!

For now, we are developing iOS apps along with their
websites in Ruby on Heroku. Also, we have servers on
Rackspace and EC2, we can try out if anything is
suitable for us.

More information:
http://cardinalblue.com/jobs

2011-09-04

google analytic for godfat.org

from 2010-03-03 to 2011-09-03

Browsers

1. Chrome 47% (331 visits)
2. Firefox 40%
3. Safari 8%
4. Opera 2%
5. IE 1.4%
6. Android 0.3%
7. RockMelt 0.3%
8. Mozilla 0.14%
9. Mozilla Compatible 0.14%

OS

1. Mac 44%
2. Windows 41%
3. Linux 13%
4. FreeBSD 0.7%
5. Android 0.6%
6. iPad 0.3%
7. Symbian 0.1%
8. UNIX 0.1%
9. iPod 0.1%

Languages

1. en-us 53%
2. zh-tw 38%
3. en 1.5%
4. en-gb 1.3%
5. de 1%
6. zh-cn 0.9%
7. fr 0.7%
8. ru 0.7%
9. ru-ru 0.4%
10. cs 0.3%

Sources

1. (direct) 41%
2. google (organic) 12%
3. facebook.com (referral) 11%
4. github.com (referral) 8%
5. blogger.com (referral) 5%

Keywords

1. godfat 31%
2. godfat.og 11%
3. spbk 6%
4. 飽和脂肪星 5%
5. godfat.org 4%
6. http://godfat.org 4%
7. cardinalblue godfat 2%
8. http://godfat.org/ 2%
9. panel de pon 2%
10. "cardinalblue" "godfat" 1%

Visitors

1. New Visitor 75%
2. Returning Visitor 25%

google analytic for this blog

from 2010-03-03 to 2011-09-03

Browsers

1. Firefox 42% (8,770 visits)
2. Chrome 31%
3. IE 18%
4. Safari 5%
5. Mozilla 5%
6. Opera 2%
7. Mozilla Compatible 0.2%
8. Android 0.09%
9. IE with Chrome Frame 0.07%
10. RockMelt 0.03%

OS

1. Windows 60%
2. Mac 23%
3. Linux 17%
4. Android 0.3%
5. iPad 0.3%
6. iPhone 0.3%
7. Unknown 0.2%
8. FreeBSD 0.2%
9. iPod 0.04%
10. PSP 0.01%

Languages

1. zh-tw 68%
2. en-us 26%
3. zh-cn 3%
4. en 1%
5. zh-hk 0.7%
6. ja 0.4%
7. en-gb 0.3%

Sources

1. google (organic) 61%
2. (direct) 18%
3. blogger.com (referral) 6%
4. yahoo (organic) 4%
5. google.com (referral) 3%

Keywords

1. 2.3.3
2. git rebase
3. multi thread rand
4. git gui
5. llvm
6. 星之一角
7. git submodule
8. 攻強皇國機甲
9. 無茶苦茶
10. yajl
11. godfat
12. oauth
13. xterm color 256
14. git merge
15. boost spirit
16. chomsky hierarchy
17. rubinius
18. aramary
19. redmine git
20. git rebase

Visitors

1. New Visitor 62%
2. Returning Visitor 38%

[ANN] rest-core 0.3.0 released

rest-core

by Cardinal Blue http://cardinalblue.com

DESCRIPTION:

A modular Ruby REST client collection/infrastructure

CHANGES:

rest-core 0.3.0 – 2011-09-03

  • [facebook] RestGraph is Facebook now.
  • [facebook] Facebook::RailsUtil is imported from rest-graph
  • [facebook] Use json_decode instead of auto_decode as rest-graph
  • [facebook] No longer calls URI.encode on Facebook broken URL
  • [twitter] Fixed opts in Twitter#tweet
  • [twitter] Introduced Twitter::Error instead of RuntimeError!
  • [twitter] By default log nothing
  • [rest-core] We no longer explicitly depends on Rack
  • [rest-core] Added a shorthand RC to access RestCore
  • [rest-core] Eliminated a lot of warnings
  • [cache] All clients no longer have default hash cache
  • [oauth2_query] Now we always use the term “access_token”
  • [config] Now Config#load and Config#load_for_rails take namespace e.g. rest-core.yaml:
    development:
      facebook:
        app_id: 123
      twitter:
        consumer_key: abc
    

INSTALLATION:

gem install rest-core

Or if you want development version, put this in Gemfile:

gem 'rest-core', :git => 'git://github.com/cardinalblue/rest-core.git',
                 :submodules => true

2011-09-03

[ANN] rib 0.9.5 released

Rib

by Lin Jen-Shin (godfat)

DESCRIPTION:

Ruby-Interactive-ruBy – Yet another interactive Ruby shell

CHANGES:

Rib 0.9.5 – 2011-09-03

  • [rib-rails] Fixed Rails3 (sandbox) and Rails2 (env) console. Thanks bootleq
  • [rib-min] Fixed not being really minimum
  • [rib] Now you can run it with rib -wdIlib, isn’t it convenient? It’s equivalent to rib -w -d -I lib or rib -w -d -I=lib

INSTALLATION:

gem install rib

SYNOPSIS:

Screenshot

撰寫 ruby 好似無所不能..?

事情是這樣的...

我覺得在發佈一個新的版本之後,最好也同時發佈一份 ann (announcement)
而理想上的 ann 內容大概是 README 的一小部份加上 CHANGES 的一小部份,
也就是最新的那個版本的更新內容。

可以想像這是一個非常容易自動化的動作,但其實事情沒那麼單純。首先是
我怎麼確認我要抓取哪些段落? DESCRIPTION? INSTALLATION?
LICENSE? 要怎麼挑出來?

作法是觀察 README 的格式,用 regexp 想辦法切出 name => paragraph 的
hash table. 接下來我就可以任意安排段落,調整 ann 的輸出格式。
除了 README 需要這樣切外,CHANGES 也同樣要。

之前這邊很複雜,因為我同時想相容 markdown 和 rdoc. 現在我已經徹底
放棄 rdoc 了,所以就變得單純些。放棄 rdoc 的原因是 yard 本身也支援
markdown, 那我何苦使用拿來寫文件不太方便的 rdoc?

得到方便的 hash table 後,就可以任意組織、調整段落的順序,看看哪種
ann 看起來能夠讓第一次看到的人和已經看過很多次的人,都能快速找到
他想看的段落。前者會希望知道「這是什麼」,而後者會希望知道「改變了
什麼」。

還不只這樣。

由於我是要放在 blog 上,也就是嵌入的 html. 這樣原本的 h1 不太適合繼續
是 h1. 因此我會希望每個 hn 都是 h(n+1), 也就是 h1 改 h2, h2 改 h3.
以 markdown 為例,就是前面多加一個 #

最後,由於 kramdown (markdown => html) 會把所有 hn 都加上 id,
這我也要拿掉,原因同上。可能同一頁裡面就有不同的 ann, 如果 id 相同的
話怎麼辦?從簡就好了。

有點複雜,自己也沒確定要怎麼做比較好,因此我每一次 ann 都寫得有點
不同。最近由於頻繁在開發,就常常需要放新版本,因此開始覺得不堪其擾。
終於在今天下午,由於一些小原因,開始進行程式化的動作...

* * *

或許只是單純因為我很熟 ruby 了,我覺得我可以非常專注在「尋找問題」
並「解決問題」這個層面上,而不是思索如果我要達到這件事,我應該怎麼
做的層次上。當然,這也很可能是因為我的思緒已被 ruby 侷限住了。總之,
整個作業大概是這樣進行的...

首先讀出 README 的內容,然後想一個 regexp 去切出我要的段落。
找到正確的切法之後,則是把切好的內容做成一個 hash table.

其實 regexp 不太是個想出來就立刻可以用的東西,大概都要前後試個幾次,
才能確定怎麼寫比較好。這時候當然又是拿出 rib 啦~ 只要加個

require 'rib/config'
Rib.anchor Gemgem
就可以慢慢試到自己滿意為止... anchor 在 Gemgem 上是因為那是我拿來處理
這些有的沒的的 module.

做到這裡,可以順便把之前抓取 DESCRIPTION 的程式改掉,因為現在
既然有比較 general 的版本了,就沒必要用之前針對 DESCRIPTION 寫的。
同樣的事,也要對 CHANGES 做一次,因為兩個格式不完全一樣。

接著由於我已經抓出我要的所有 paragraph, 我就可以在每個 header 前面
多加一個 #, 這樣就解決 h(n+1) 的問題。唔,然後有些 header 希望再做
一些小小的調整,例如第一個 header 希望加個 link. 同樣用 regexp 稍微
試一下就行了,畢竟所有資料都能輕易 travel 了,還有什麼不能做?

最後要把 markdown 轉成 html, 我自己是用 kramdown. 一個作法是由於
他也是 ruby 寫成的,我可以從記憶體裡面叫出來用。不過我懶得去查到底
要怎麼用,所以還是用平常習慣的方式去用他 -- UNIX command.
stdin 輸入 markdown, 他會 stdout 輸出 html.

在 ruby 裡就 IO.popen, 灌入我調整好的 markdown, 然後讀出 html,
接著再餵給偉大的 nokogiri... 我講真的,這可能是我最喜歡的 gem 之一。
不只是穩而且快,他的介面非常好用,不是其他 html/xml parser 可以比的...
除了 css 和 xpatch 可以很方便地搜尋 node 外,也可以把整個 tree 看成
一個很大的 ruby hash 去操作。

簡單地說,nokogiri 的介面設計得非常符合 ruby 的使用習慣。絕不是...
可以比擬的。以下省略數百字抱怨。

接著當然也是一樣,直接用 Rib.anchor html 去看要怎麼刪除所有的 id,
因為 nokogiri 其實我沒那麼常用,用法記不太起來。這邊我是用 XML 去
parse, 然後輸出 html. 因為 html 去 parse 會產生一些 html 的東西,而
kramdown 輸出的 html 其實完全符合 xml. 但是輸出又要用 html 模式,
因為輸出 xml 格式的話會包含 <?xml 那些東西。

也就是說,就跟上次做投影片一樣,用 rib + nokogiri 去調整輸出格式...
簡單的東西都是靠直覺寫,不夠熟悉的東西,就是用非常 interactive 的
方式慢慢去試,試到對為止... 自己其實不用動太多腦去思考解決的「方法」,
只要思考要怎麼解決即可。

大概是這樣吧。成果在 gemgem.rb, 用在所有我管理的 gem 上。
> rake
rake ann:html               # Generate ann html
rake ann:md                 # Generate ann markdown
rake clean                  # Remove ignored files
rake doc                    # Generate rdoc
rake gem:build              # Build gem
rake gem:install            # Install gem
rake gem:release            # Release gem
rake gem:spec               # Generate gemspec
rake test                   # Run tests in memory
rake test:shell[RUBY_OPTS]  # Run tests with shell

2011-09-03

仔細想想,其實早就沒那麼強烈,我好像只是把那當做藉口罷了。
每天想來想去好像也只是習慣而已,拿來打發時間的方式之類的。

昨天睡覺躺在床上時在想,現在的現實感實在很薄弱。每天會想
或是會做的事情就那幾種,翻來覆去都差不多,像是在玩什麼
遊戲似的.. 只是沒辦法停也沒辦法換口味罷了。最多只能稍微
休息一下。

2011-09-02

my commits stats...

It's not all of them, but for what I don't feel too shamed
or boring to talk about. Til today, 2011-09-02

(*for closed source) project name: commits number (language)
(**for duplication)

*photo: 2476 (ruby)
*travelballoon: 1149 (ruby)
*friendmkt: 1009 (ruby)
rest-core: 943 (ruby)
**rest-graph: 692 (ruby)
rib: 502 (ruby)
*heroku-scaler: 384 (ruby)
*pageclub: 280 (ruby)
cubeat: 266 (c++)
dot-rc: 238
*roodo-player: 238 (actionscript 2)
**ripl-rc: 220 (ruby)
godfat.org: 219
*mot: 214 (ruby)
*pic-collage: 212 (ruby)
ludy: 192 (ruby)
app-deploy: 187 (ruby)
dm-is-reflective: 186 (ruby)
*summer2007: 180 (ruby)
*member: 175 (ruby)
minei: 171 (scala)
*roodo-rc: 157
*ffbapi: 150 (ruby)
*cas: 149 (ruby)
sandbox: 141
spellbook: 132 (scala)
cerealize: 129 (ruby)
pagify: 120 (ruby)
*snapbit: 109 (ruby)
dev-tool: 108 (ruby)
*summer2008: 106 (ruby)
gw-templates: 97
friendly_format: 94 (ruby)
source-tools: 88 (ruby)
avatarblock: 57 (actionscript 3)
thumbo: 51 (ruby)

language: projects (commits)

total commits: 10909

ruby: 24 (10045)
scala: 2 (303)
c++: 1 (266)
actionscript 3: 1 (57)
actionscript 2: 1 (238)
haskell: 0

I want to have a Haskell project! Any idea what should I do?

rails 的 console 實作 (2)

Got a few requests for the detail (詳細希望?)
一個在 buzz 上面,就是上篇自動轉到 buzz 的那篇。
另一個是上篇的 comments

先貼上寫在 buzz 上關於 optparse 的想法:

不用 optparse 其實現在已經沒有很強的理由了 orz
原本不用的原因是,我不希望修改 ARGV, 希望 ARGV
保持原本的狀態。另一方面,這 Runner 還是由 ripl
那邊改來的,他原本也沒有用 optparse, 基於什麼理由我就不清楚了

但是後來由於要實作 rib-rails, 導致不修改 ARGV 會變得不好做
於是我也開始修改 ARGV 了。既然都改了 ARGV, 那似乎就沒有
強烈不用 optparse 的理由了.. 但既然都寫好了,似乎也沒啥理由
再換成 optparse.

那個修改不修改 ARGV 的差別在,要讓 rib-rails 和 rib rails 以一致的
方式運作的話,勢必得修改 ARGV. 也就是說,在 rib-rails 裡可以直接
使用 ARGV, 而在 rib rails 裡則把 rails 這個值幹掉,使得兩者用一致的
方式去看 ARGV. 這樣所有的 bin 都可以直接使用 Runner.

另外,我不太清楚 optparse 可以支援 --abc=def 和 --abc def 和 -wvI 嗎?
然後剛剛 released 的 0.9.5.pre.1 支援上篇提到不支援的用法了。
rib -wdIlib
等同於
rib -w -d -I lib
等同於
rib -w -d -Ilib
等同於
rib -wd -I=lib
一般常見的用法都可以用,挑自己喜歡或是習慣的用即可 :P

ok, 接下來我們來看 rails console... 看法是從 rails 2 開始看,
然後看看 rails 3.1 有沒有改進。

* rails 2 是用 exec 去跑 $PATH 中的 irb, 假設我現在想用 jruby
跑 ./script/console, 如果我用 jruby ./script/console 去跑的話,
基本上因為他還是去讀 irb, 所以會完全沒效果。取而代之, rails 2
提供了 --irb 的選項,可以讓我換別的 irb 去讀。所以如果我有
jirb 的話,大概就可以跑 ./script/console --irb jirb 吧... 但是如果
沒有 jirb, 平常都是用 jruby -S irb 去跑的話,那只能恭喜我沒救了。

這點總算在 rails 3.1 有所改進,總算是直接從原本的 process 直接
讀出 irb 然後跑起來。因此 jruby -S rails console 有效了,可喜可賀。

* rails 2 有一大堆檔案全部都沒有 prefix. 比方說 console_app.rb,
console_with_helpers.rb, 都是直接放在 $LOAD_PATH 裡面。
我以為用個 prefix 是常識。如果跑 require 'commands' 實際上會
require 到 rails 2 的程式。還有很多類似的... 總算 rails 3.1 不再
做這種蠢事了。

* rails 2 把所有的 commands 都寫在 top level, 沒有在任何 module
底下。這個.. 除了 quick and dirty 外我想不太到該下什麼評論,也懶得
多說為什麼這樣不好了。rails 3.1 有改進,不過沒完全改善這個部份。

* interface 不一致。為什麼 server 是 rails server -e production 但
console 卻是 rails console production 呢?在 rails 2 是
./script/server -e production 和 ./script/console production.
還是一樣不一致。不過對 rails 2 -> rails 3 這點來看的話,倒是一致。

仔細想想,大概就以上四點比較重要吧。其中 rails 3 算是改進了兩個半。
簡單地說,rails 很多的程式,我覺得都寫得很草莽。或是說沒有整體的
設計,完全是用一堆 patch 疊起來的東西。其中 rails 2 還有 RAILS_ENV
這莫名其妙的東西... 跟 ENV['RAILS_ENV'] 和 Rails.env 還不一樣?

大概先這樣吧。

2011-09-01

rails 的 console 實作

(不吐不快)做得實在是爛到一種很驚人的境界,尤其是 rails 2.
由於很晚了,而且其實有太多地方可以罵了,所以就暫時不講了,
有人有興趣的話再說吧。

我只是很吃驚這麼爛的東西居然到現在都還沒改好一點。
是說 2 -> 3 已經改善很多了,但還是滿爛的。

我對 Rib 裡的 Runner 實作滿有信心的...

* 只差一點點就跟 ruby 的介面一樣了,還不行的是像 -vwI lib 這種不行
* 順序沒差
* --arg ment 或 --arg=ment 是一樣的意思
* command 之後的 argument 自動 pass 給 app

參考 rib-auto

heroku 的 command line interface 也很好笑。順序不能亂換就算了,
--app abc 跟 --app=abc 不能互用就算了,打錯字還會有 syntax error,
真只能用莫名其妙來形容...

[ANN] rib 0.9.4 released

Rib

by Lin Jen-Shin (godfat)

CHANGES from 0.9.2:

Rib 0.9.4 – 2011-09-01

  • [rib-rails] So now we replicated what Rails did for its console, both for Rails 2 and Rails 3. You can now fully use rib rails or rib auto as rails console or ./script/console in respect to Rails 2 or 3. For example, it works for:

    rib auto production
    rib rails production
    rib auto test --debugger # remember to add ruby-debug(19)? to Gemfile
    rib auto test --sandbox
    rib rails test --debugger --sandbox
    

    It should also make Rails 3 print SQL log to stdout. Thanks tka.

Rib 0.9.3 – 2011-08-28

  • [rib] Calling Rib.shell would no longer automatically require 'rib/core' anymore. This is too messy. We should only do this in bin/rib. See: commit #7a97441afeecae80f5493f4e8a4a6ba3044e2c33

    require 'rib/more/anchor'
    Rib.anchor 123
    

    Should no longer crashed… Thanks Andrew.

  • [extra/autoindent] It has been greatly improved. A lot more accurate.
  • [extra/autoindent] Fixed a bug when you’re typing too fast upon rib launching, it might eat your input. Thanks bootleq.

next step for rib and rest-core! (中文)

速記,所以寫中文,列一些接下來要做的事。

Rib:

* 首先是看來 rails 3.1 或是 rails 3 的 console 的讀取方式
並不完全就像是 ripl-rails 那樣。至少,看起來 rails 3.1 的
rails console 會把 SQL log 丟到 $stdout 上。

這應該不難修,只是又要看 rails source 很頭痛而已。
可能晚點就修掉吧,感謝 tka 的告知。

* 就像我丟到 issue tracker 上的 Don't rely on require order!

https://github.com/godfat/rib/commit/7a97441afeecae80f5493f4e8a4a6ba3044e2c33

So here we have a problem. Some plugins are expecting to override
some other plugins. The order can't really be arbitrary.....
Actually, users won't care about order either. We just want to
enable/disable plugins, not really composability.

So it really should be a bucket of plugins. At least for built-in plugins,
so that we would be aware of the order. Users shouldn't pay attention
on the order of built-in plugins.
不過這個沒那麼容易處理,我還在想要怎麼做比較好。相關的問題是,
要不要像 rack 一樣,把 stack 太深的問題一起處理掉?畢竟現在這種
作法,會跟 rack 一樣,如果 plugins 用太多的話,會導致 call stack 變得
很深。

一個可能的想法是,plugins 會放在一個 list 中,然後他們也都有一個
dummy parent, 使得原本很簡單的 overriding 的方式還可以繼續用。
不過實際上可能沒那麼單純,沒辦法做成這樣。畢竟重點在於,如果是
一個 blocking call 的話,那勢必會用掉 stack frames. 在 rack 裡,
還能很簡單地用 before 或是 after 來處理,但 rib 裡面那麼多 API,
難道要每個都加入個 before/after? 這樣會讓寫 plugin 的成本變得高很多。

* 總之,stack frames 還不算大問題吧,重點是要處理掉 require order 的
問題。在 rack 或 rest-core 中,順序還是重要的,意思不同。但是在 rib 中,
通常我們只會希望有個功能有或沒有而已,至少,內建的 plugins 是這樣!

而在處理這個的過程中,如果可以一併處理 stack frames 的問題則處理,
不能的話就當另一個問題,再考慮到底值不值得去換這個好處。

rest-core:

* 目前 twitter client 還沒有分析 return error, 可能翻翻 twitter gem 或是
Error Codes & Responses 來看看怎麼做比較好吧。這是花時間沒難度的。

* 然後是把 rest-graph 的 RailsUtil 和 TestUtil 搬過來。這個.. 算是苦工?
不過重點在於,到底該怎麼安排?放在 rest-core/util/ 底下嗎? dependency
怎麼處理?user 應該怎麼使用?要手動 require, 還是自動 require?
test 要怎麼跑?等等。

* 接著相關的是,要把 RestGraph 改名為 Facebook. 只改名字自然是很容易,
但接下來的問題則是,現在完全針對 RestGraph 寫的 test 該如何調整?
有些 tests 其實是對任意 client 都適用,但有些是針對 rest-graph.
要怎麼安排這些 test? 現在的狀況是,跟 rest-graph 的 test 是一模一樣的。
這樣做的原因是,我希望原本的使用方式,在 rest-core 裡面都能繼續用。
事實證明,這種作法確實抓到不少我原本沒想到的 bugs. 都修好啦。不過
也因此使得程式內部實作十分複雜就是了。邊寫邊覺得原來原本是這麼複雜...

這個應該算苦工吧。調整 tests 是十分痛苦的差事.... 要拆掉我自己原本花了
很多時間做的 tests 也很令人難過 ><

* 同上面 rib 那邊提到的,既然 rack 會有的問題,在 rest-core 裡當然也有。
用一個 list of middlewares 加上 before/after 和原本的 call 應該可以
有機會可以解決 stack 太深的問題。這邊應該會比 rib 好處理很多...

* asynchrony call? 原本 rest-graph 本身是有支援 em-http-request,
這邊要怎麼處理?其實這跟上個問題是相關的。evented 的世界本身就不是
用 stack 去組織流程的,因此解決了上面的問題,evented 的問題應該也
解決了吧?或是先讓 block 成為 callback 也可以。這個問題應該比上面的
問題要來得容易,不過由於上面解決了這個也解決了,因此放在下面。

另外,如果要用 fiber 的話,應該是不用調整架構吧。

* twitter 的 RailsUtil?

All texts are licensed under CC Attribution 3.0