What have you found for these years?

2009-11-21

rails 2.3.4 encoding bug

Encoding error in Ruby1.9 for templates

用 Hector E. Gomez Morales 的 patch,
不過改成這樣比較好:

source.force_encoding(Encoding.default_external) if
'1.9'.respond_to?(:force_encoding)

不要寫死 utf-8, 用 default_external,
utf-8 愛好者如我,當然是全設成 utf-8, 只是不要寫死...

這樣 rails 可能就能跑在 1.9 下了吧我猜?
你看到 2.3.4 都多久了,還有這麼嚴重的問題...

2009-11-20

2009-11-20

最近幾天心情 ok, 不過現在卻顯得焦躁,原因不明...

2009-11-19

heroku heroku (static file serving)

quite stupid, but.. that's it.

# special branch heroku for heroku specific stuffs
> git checkout -b heroku

# rack static file serving
> echo "use Rack::Static, :urls => ['/']
run lambda{ |dummy_never_called| }" > config.ru

# let's commit
> git add config.ru
> git commit -m '[config.ru] for heroku static file serving'

# start herokuing
> heroku create NAME

# push your heroku branch to heroku remote branch master
> git push heroku heroku:master

# stupid launchy, extra dependency...
> heroku open

agda front-end design thoughts

Hi,

由於我的時間比較零碎一點,暫時還沒辦法很有系統地
閱讀現有程式,並思索是否有個周詳的設計方式。所以
想在這邊丟一點想法出來,看看大家是否有什麼想法?

現在 agda 是用 emacs 做 front-end, 如果要跳脫這個模式,
似乎是得重新設計 front-end 與 back-end 的協定。
現在 http 正大力(誤),因此第一個浮現在腦裡的,
也就是把這樣的協定做在 http 上。極端一點,
就可以有個 browser based agda front-end, 用 browser
寫 agda 之類的。就像很多 virtual private server 的廠商,
也有提供跑在 browser 上的 terminal, 讓你就好像用
ssh client 登入你的 virtual server 那樣。

另一方面,如果做在 http 上,我會希望可以做在 Hack 上:
這是模仿 ruby 的 rack, 而 ruby 的 rack 則是模仿 python 的 wsgi.

他大概的想法是,由於我們可能會有各種 http server,
也會有各種 web framework/application, 因此如果要讓
所有的後者跑在所有的前者上,直接溝通會導致產生
n * m 種組合。但如果中間有個 hack 做橋接,http server
針對 hack 來寫,web framework/application 也針對
hack 來寫,這樣頂多就只需要 n + m 種組合即可。

整個 http request 進入後端的流程大概會像這樣:

request -> happstack -> happstack hack handler ->
hack -> web framework adapter -> web application

因此畫成圖可能會長成這樣:

http server A -> A handler -> hack -> web framework C adapter -> ...
http server B -> B handler _/ \_ web framework D adapter -> ...

其中 handler 和 adapter 的部份,如果 http server 或
framework 直接支援的話,就不需要額外寫。
同時,hack 的介面非常單純,一個 Application 就是:
  type Application = Env -> IO Response

Env 裡面記錄了 query path, query string, request method 等資訊。
最笨的 hello world application, 不管 request 什麼,都回傳 hello world,
只要寫這樣:(from Hack readme
  hello :: Application
hello = \env -> return $ Response
{ status = 200
, headers = [ ("Content-Type", "text/plain") ]
, body = pack "Hello World"
}

另一個重要的元件,則是 Middleware, type 是:
  type Middleware = Application -> Application

middleware 希望做到的是,像是 design pattern 中的
decorator pattern, 透明地讓 middleware 成為 application 的
任意組件。例如計算 Content-Length 的 application,
可以透過串接而使得原本的 application 不需要做此計算,
只需要組合即可享有自動計算 Content-Length 的能力。
  content_length :: Middleware

他會從 target 中抽出 IO Response, 然後根據 body 計算 bytes,
再把 Content-Length 加到 headers 中,最後再吐出去。

於是我們只要做各種 Middleware 和 Application,
即可達到非常理想的模組化程度。

介紹大概到這..

如果把 agda front-end 做到上面,大概會長什麼樣子呢?
例如:
  POST /session/begin

這樣告訴 agda front-end 需要一個新的 session,
如果允許的話,就給予一個有效的 session cookie.
  Set-Cookie: agda-session=a-random-session-id

client 得知 session 開始後,就可以開始 parse 檔案:
  PUT /agda/parse
Cookie: agda-session=a-random-session-id
...整個 agda 檔案內容

agda front-end 應該回傳什麼,需要看一下目前的資料格式...
後端的處理,或許大抵上可以這樣想:

1. 第一次收到 parse request 時,建立完整 parse tree
  data ParseTree = ...

2. 每一次 parse 完,建立完整資訊
  type ParseResult = (SourceCode, ParseTree)

3. 如果不是第一次 parse, 則做 delta parse
  source_diff :: SourceCode -> SourceCode -> SourceDiff
parse_delta :: ParseResult -> SourceDiff -> ParseResult

第一個 ParseResult 是上一次的 parse 結果,
藉此只針對有變動的部份做 parsing.
  parse_delta previousResult
(source_diff (fst previousResult) client_input)

不想玩時,則叫 agda front-end 釋放資源:
  POST /session/end

目前還沒細看 agda source code, 大概想到這裡。
有什麼想法嗎?

2009-11-18

estiah racing

覺得他 racing 的句子很有趣,按了幾場 random race 列出一些。
以 lexical order 排列。順手翻譯自己覺得比較有趣的。
當然,[] 請代入寵物的名字。

A cook abducted [] in a hurry.
A fireball was hurled at []'s direction.
A huge tree fell on [].
A hunter mistook [] for his prey.
[] began to stare at the shiny gold trophy.
(吸血跳蚤開始瞪著閃亮的黃金獎盃)
[] disliked the commotion around it.
[] failed to fuse with its persona
[] failed to transform into Super [].
(吸血跳蚤變身成超級吸血跳蚤失敗了)
[] fell asleep.
[] fell in love with the animal next to it.
[] finally exited the matrix
(吸血跳蚤最終離開了母體)
[] never understood the reason it was there in the first place.
(吸血跳蚤永遠不了解他為什麼會來到這個世上)
[] picked up a shiny coin on the ground for its master.
(吸血跳蚤為他的主人,在地上撿了一個閃亮的硬幣)
[] ran out of breath.
[] refused to run for its master's sake.
[] said something about its master's cruelty.
[] shouldn't have eaten those mushrooms on the way.
(吸血跳蚤不該吃掉路上的蘑菇)
[] slipped on a banana peel.
[] sought the answer to Death, Life and Everything.
(吸血跳蚤開始尋找死亡、生命、還有一切的答案)
[] started to dance.
[] started to meditate about life.
[] stopped in a sulk.
[] stopped to make traps for other runners.
(吸血跳蚤開始對其他跑者設陷阱)
[] stopped to re-evaluate its life's goals
(吸血跳蚤停了下來,並開始重新評估他生命的目標)
[] strayed from the course in search of food.
[] thinks playing is better than running.
[] thought it died for his honorable master's sake.
[] thought the sky was so beautiful.
(吸血跳蚤認為天空是如此的美麗)
[] tripped on its untied shoelaces.
[] wanted to run with scissors
[] was attracted by the cheers of the crowd.
[] was captured and forced to test make-up and perfumes
(吸血跳蚤被強迫抓去測試化妝品和香水)
[] was confident about winning the next day.
(吸血跳蚤對於下次的勝利非常有信心)
[] was distracted by a flower.
[] was foiled by the Roadrunner... again
[] was frozen by a frost spell.
[] was hit by a vicious blue shell.
[] was struck by lightning.
[] was sucked up into an improbable wormhole
[] was surrounded by a horde of monsters.
[] was too hungry to continue.
[] was trapped in a pitfall.


*

[] crossed the goal line under the crowd's applause.
[] finished the race gloriously.
[] proved justice would always prevail.
[] walked over the goal line in triumph.
[] was kicked over the goal line.

2009-11-17

perhaps it's a boring day and a sleepy night.
...enough of english.

一直用英文思考,還是不太順。
寫這種垃圾話還是要隨意一點...腦裡浮現什麼字就丟出什麼字。
雖然可能很對不起讀者.... 不過怎麼說,以前我不知道,
現在只覺得很虛幻,好像一切都是假的。

這真的講過太多次了,太多太多。但現在總覺得,
一來不是每個人都聽過,一來聽過也是會忘記的,
一來則是其實那只是一種省思而已,
一來這也可以當做是一種表達訓練,
一來心中想過和說過和或寫過其實都不一樣,
一來...

總是會被認為一直往自己要的路上走。
如果把層次拉高一點,或許確實是這樣沒有錯。
但如果降到森林裡去,我只看到無止盡的混亂...

不過我卻仍然不把這種事放在心上,
我不覺得相較於其他的事,這種事有比較重要。

可是最近真的不斷讓我思考這些事。
思考自己究竟該走哪條路,自己想要的生活究竟是什麼。
雖然或許那永遠也不會有答案-在現實裡的答案-
但卻仍然不斷迫使我去思索。
我不知道真正的動機是什麼,
也或許只是壓死駱駝的最後一根稻草,
畢竟,我渾渾噩噩的日子,又究竟過了多少年?
我甚至想不起來究竟又有什麼時候,我是清醒著。
永遠永遠,只是期待或不期待明天,然後投注在現在的一分一秒鐘。
甚至是偶爾的出神,好像不知道飄到什麼世界,
現實無法再引起我的任何注意之類...

最近 loop 了梶浦的 Seventh Heaven 很多次。

儘管很累很累,明天還要早起,還有一堆無聊繁瑣的事要做

也許想辦法適應這個世界,根本就不是一個我能走的路
又也許其他的路會有更多更險惡的陷阱(孔明的?)

離題了。思考著,這樣下去真的對嗎?
還是說,反正短暫片段的快樂還是有的,
例如每天打 estiah 的時候,因此其他時候,
根本就無所謂,這樣更能放開一切?

有時候不禁在想,是否痛苦時要想痛苦事,
才能因此覺得無所謂?快樂時也就不要沒事折磨自己了...
但這樣是否又變得更加虛假,所有的情緒都要偽造。

anyway, 真的要睡著了,再說吧...

2009-11-17

Ruby and UAO

~/p/g/ruby master> autoconf
~/p/g/ruby master> ./configure --prefix=~/...
~/p/g/ruby master> make
[...]
converter from Big5 to UTF-8
converter from UTF-8 to Big5
converter from Big5-HKSCS to UTF-8
converter from UTF-8 to Big5-HKSCS
converter from Big5-UAO to UTF-8
converter from UTF-8 to Big5-UAO
[...]

>> s = "\xA1u\xA6\xE6\xC6\xF7\xA1ILoki\xA1I\xA1v\xA1]rocky \xC7\xE9\xC7\xBF\xC7\xA9\xC6\xE3\xA1^\n"
>> puts s.force_encoding('big5-uao').encode('utf-8')
「行け!Loki!」(rocky ロッキー)
>> s = "\xA5\xCD\xA6\xBA\xA5h\x83S\xA1B\xB4\xD7\xC0Y\xB3\xC8\xC0w\xA1B\xA4@\xBDu\x8A\xCA\xAE\xC9\xA1B\xB8\xA8\xB8\xA8\xBDU\xBDU\n"
>> puts s.force_encoding('big5-uao').encode('utf-8')
生死去来、棚頭傀儡、一線断時、落落磊磊


More encoding (Big5 series) support?
Added by Lin Jen-Shin 123 days ago.
Updated about 6 hours ago.

big5-uao 和 big5-hkscs 都能用了。
~/p/g/r/install *master> bin/ruby -v
ruby 1.9.2dev (2009-11-17 trunk 25823) [x86_64-darwin10.2.0]

有機會看要怎麼樣藉此讓 ssh 直接連 ptt.

很無聊

不過平時確實一天到晚在聯想這種無聊笑話

Lin Jen-Shin:
四海遊龍 => 八方雲集 => 十六進位 => 三二位元 => 六四事件 => ?
about an hour ago

A: 果然是真常笑點
B: 真常笑啊 ~
A: 夠了
還2連發

不過這對話不是出自上面那個 XD

==
jaiyalas 應該最熟悉這個 XDD

V470 藍牙雷射鼠

對他除了已經習慣的 delay 問題外,另一點是電池實在很難裝。
有時候裝進去就是會卡住按鍵,使得按鍵變超緊很難按。
我曾經就這樣裝了好幾個小時不知道有沒有???
可是我應該沒那麼多耐心才是?

後來請 nana (007?) 幫我裝,他居然裝上癮了,還要拿去吃飯...

結果半路上居然就裝好了!?我試了一下,還真的對了。
james 說只要在中間壓一下就行了。

...
好厲害。後來我每一次裝電池,真的都是中間用力一壓就行了。
不需要再拆開,測試按鍵,拿出,重新裝入,測試按鍵,拆開...
重複到天荒地老。

真的只要一壓,他就自動定位耶....

特此留念。居然受到這麼不 geeky 的人指導 XD

2009-11-16

pagify for Innate

幾小時前上傳了 pagify 0.7.0, 加上了 Innate helper,
因此順便把一些相同的程式從 Rails helper 中抽出來。

用法非常單純,就 require 'pagify/helper/innate',
然後 controller/node 裡面加上 :pagify 就行了。
例如我用了這些 helper:

helper :xhtml, :form, :flash, :pagify

在 view 裡面就這樣用就好:
pagify_links(@comments)

我在想會不會把結構拆太細了,因為這邊其實套了兩個 helper.
一個是 html helper, 另一個是 innate helper,
前者處理 link 的產生,後者處理 page 與 uri 的問題。

程式也變得愈來愈慢,測試要跑的時間愈來愈長...
有時候會覺得這樣很恐怖。不過反正能動,而且看起來挺好的,
那就先這樣吧。效率的問題,page cache 比較重要對吧?

倒是我急著放出去,然後離開。結果文件都忘記更新.....
算了,反正也只有我在用而已 :/ 慢慢再補就好。

***

另一方面,Innate 的 render_file 不合我預期。
我找不到可以對應 Rails 的 render :partial
居然抓不到目前 action 的 instance variable.

翻翻程式碼..... 我講真的,Innate/Ramaze,
去查手冊,絕對比看程式碼還要慢 @@
Innate/Ramaze 程式碼太簡潔易懂了,看不用幾分鐘就懂了。
文件反而不見得會寫出你想知道的事。

看了幾分鐘就發現他有 sync_variables, 但是沒效果,
因為後面又有 action.variables = variables 蓋掉了。
想了一下,覺得不應該是這樣,就稍微改了一下,順手加上 spec,
噢他的 spec 超乾淨好懂,每個部份都是獨立分開的,
測試都非常簡潔,數量也不是很多。我想數量不多是因為,
行為本身都很單純,所以並不需要複雜的測試!

我 commit 了之後就 send pull request.
幾分鐘後發覺 variables.dup 很不必要,
因此再 commit 了一次,把他拿掉。但這次就沒
send pull request 了,避免 spam.

再幾分鐘後,我就看到 manveru 回應了,而且兩個 patch
都 merge 了。不需要我說,他自己會注意。同時也就是說,
到目前為止我替 Innate 寫的三個 patch, 全部都 merge 了,
而且時間差都非常短,尤其這次只有幾分鐘...

這讓我想到之前替 rubycas-server 寫了一堆 patch,
有 merge 的沒幾個,而且有些修正的 patch 他沒 merge...
這樣變成修一半,中文翻譯會有缺陷 :/
我應該有跟他講過才是,不知道他到底有沒有看到。

天差地遠,天差地遠....

manveru 真好(灑花)

看到這麼乾淨的程式,真自嘆不如 @@
比 DataMapper 或 Merb 都強很多,
但跟 Unicorn 比又是另一種不同的乾淨。
最欣賞的還是 Innate/Ramaze.

也許應該模仿一下他的架構的,
尤其我 test case 幾乎都亂寫的,超亂...... -__-

2009-11-15

銀魂筆記

這樣推薦比較快,畢竟我覺得良率不好... XD

100 話火鍋篇
229 話修行篇(教練篇)
237 話失眠篇

這三篇我都笑滿久的,尤其是後面兩篇。
失眠那篇我每次想到那畫面還是會忍不住笑.....
怎麼能那麼低能 XD

另一個是 274 話,murmur (13) 裡有提到,算是個人因素吧。

estiah skills

updated: 2009-11-15 18:28
順便加上 wiki 的 link, 程式是:

html.css('.skill').select{|s| s.css('.c2 strong')}.map{|s|
title = s.css('.c2 strong').text
link = '<a href="http://estiah.aswt.net/index.php?title='
sprintf('%-20s %-15s %s',
title,
s.css('.percent').text.strip,
s.css('.rank').text.strip).
gsub((title == '' ? /\A\Z/ : title),
"#{link}#{title.gsub(' ','_')}\">#{title}</a>") }


要展示 skills 給別人看滿麻煩的.. 我討厭一直抓圖 @@
隨手寫了個 ruby script 印出來。就把原始檔存在
skills.html 裡,然後用 nokogiri 去 parse,
css selector 抓出想要的內容:
>> html = Nokogiri::HTML.parse(File.read('skills.html'))
>> puts html.css('.skill').select{|s| s.css('.c2 strong')}.
map{|s| sprintf('%-20s %-15s %s',
s.css('.c2 strong').text,
s.css('.percent').text.strip,
s.css('.rank').text.strip) }
Rank
Twin Blades mastered 2
Lightning mastered 2
Spear 156/180 2
Ward 142/180 2
Armor 139/180 2
Holy 87/180 2
Frost 49/180 2
Sword 22/180 2
Fire 18/180 2
Mace 13/180 2
Balance mastered 1
Empowerment mastered 1
Self Defense mastered 1
Tactician mastered 1
Heroism 80/100 1
Survival 78/100 1
Earth 49/100 1
Cheat Death 40/100 1
Sap 30/100 1
Leadership 29/100 1
Spirituality 24/100 1
Quickness 20/100 1
Fist Weapons 17/100 1
Burst 15/100 1
Shadow 14/100 1
Destruction 6/100 1
Defender 3/100 1
Axe 1/100 1
Rank
Animal Friendship 24/220 3
Horse Riding mastered 2
Animal Tamer 70/180 2
Animal Raising 80/100 1
Mentoring 36/100 1
Shop Management 18/100 1
First Aid 7/100 1
Appraisal 6/100 1
Bargain 6/100 1
Rank
Herbalist 108/180 2
Condenser 72/180 2
Miner 36/180 2
Extreme Condenser 24/180 2
Logger 24/180 2
Treasure Hunter mastered 1
Explorer 96/100 1
Extreme Logger 44/100 1
Extreme Miner 40/100 1
Extreme Herbalist 24/100 1
Rank
Sewer Cleaner mastered 1
Spirit Appeaser 24/100 1
Element Soother 18/100 1
Golem Crusher 10/100 1
Pumpkin Delice 5/100 1

尋找問題

日前聽到尋找問題,而非答案,並不是很放在心上。
因為印象中類似的說法聽過滿多次了。

不過剛剛在 ptt Java 板看到 AmosYang 所說的(#1A_pc1o8):

在我的觀念裡,許多人說 OOP 好難懂、 calculous 好難懂、 pointer 好難懂 …
是因為他們還沒有真正遇到需要用到這些工具的問題
一般來說,鑽研工具本身對了解問題的本質並沒有太大的幫助

忽然間回想起自己以前讀 Design Patterns, 真的是每字每句
都看得懂,但全部看過去,不明白為什麼要這樣做,不明白這樣做
能換到什麼,不明白這樣的東西有何價值。

強自去套 pattern, 然後宣稱有 pattern 這種事就別提了。

但後來回過頭再來看時,忽然間就覺得有些作法極其漂亮,
甚至是,有些本來自己就有在用了,只是並沒有給他一個名字,
並沒有把這件事當成一個 pattern 在用,只是一種模糊的概念。

有時候也會覺得,強分這些 pattern 並不是真的很有意義。
例如 template method, factory method, abstract factory,
strategy, state, blah blah, 總覺得概念上其實是相近的,
不需要特別說有這麼多種,也並不是有一個唯一的定義。

或許應該要整理出來的是問題,而非答案。
以答案去尋求問題,似乎本末倒置。

The Hitchhiker's Guide to the Galaxy 裡的最終答案,
找到了答案,卻不知道問題,總覺得也是在嘲諷這種現象。

也許 Monad 也是如此。一直在看 Monad 的定義與作法,
恐怕會迷失掉吧...

On Understanding Data Abstraction (0)

William Cook: 物件 v.s. 抽象資料型別
William Cook 談物件導向與抽象資料型別

全文在這
On Understanding Data Abstraction, Revisited

對這樣的主題很感興趣,一直想細讀,剛剛才找到機會翻了一下前面。
明天希望可以把他看完。怎麼說,我覺得這篇可以把 OO 那套,
跟 functional programming 的 ADT 做出很漂亮的連結。
這應該可以解答很多我以前想過,與不曾想過的疑問。

insightful, i would say

==
看完時講心得



All texts are licensed under CC Attribution 3.0