What have you found for these years?

2011-05-28

Logicomix

先感謝借閱,書主心得

剛開始看的時候,說真的很不習慣,心裡在想的是,這漫畫也未免太靜態了
一點,比較像是一張一張的截圖。難道是我太習慣日本漫畫的關係嗎?
再仔細想想,其實這本似乎確實比較像是圖畫式的小說。也確實書中
有提及這樣的名詞幾次,在 wikipedia 上也是這樣寫

倒是沒發現原來最早的出版是希臘文。

怎麼說呢,先從或許不是很重要的細節開始。我有看到一個不太正確的翻譯,
還有書本最後面的,不知道是誰寫的一段話,人名翻譯有不一致的地方。
然後我實在受不了 tautology 的翻譯,這本身又不是一個邏輯....

除此之外,光中文的份量我覺得也滿不錯,書本身算滿重的,全彩印刷才賣
這個價錢,只能說好便宜...。不過我大概不會想買了,看完就算了。說是這樣
說,我卻是一口氣兩、三個小時一次看完。或許有點矛盾,但這些都是出自
不同的考量。

誠如 jaiyalas 所說,那什麼編輯會議是什麼鬼?這本書的行文和行圖都相當
流暢,可以很快速不停地看下去,但每次跳回現實,變成編輯們在聊天,
我就覺得被打斷了,看他們任意對劇情下評語,有些實在覺得沒什麼意義。
或許他們覺得情節不該怎麼緊湊,所以安插這些來緩和吧?可我卻覺得像是
進廣告似的,覺得浪費時間...

除此之外,我覺得這本書算是滿可讀的小說,或要說是漫畫我也沒什麼意見。
對於不熟悉數學與邏輯的人,或許可藉此一窺其中面貌。深入的話,當然是
沒有。是有提到不少名詞,尤其是書本最後的附錄,再藉此去查的話,是能
當個起點吧。

至於所謂「寫人」,漫畫小說不向來如此? XD

大概是這樣。

接著一些個人感想的話... 我並不知道那一陣子是在挑戰數學的根基?
或許那也表示,數學也如電腦科學,還有很多發展的空間吧?

然後關於那些瘋狂...

其實我覺得我還滿能想像那種感覺的?裡面有一段提到,正因為害怕,
所以才訴諸那些沒有情緒的解釋。不禁在想,我是否也是如此呢..?
只是我並沒有那個能耐,現代能玩的東西也多太多罷了。


打這篇加了三個詞彙至 y 輸入法
借閱、邏輯、根基

rest-core (0)

事情是這樣的,前幾週看到 faraday, 驚覺這是個比較好的方法。
不過他的實作我不太喜歡,總有種 "rails" 味的感覺,但其實也沒有
那麼嚴重。於是這陣子我一直有些掙扎,不知道到底該不該重做這塊。
這期間的一些心境過程先跳過,現在先描述目前的狀況與碰到的問題。

前幾天才正式開始弄 rest-core, 希望能更有效組織 rest-graph 的功能,
並提供 linkedin 等其他 service 所需要用到的東西。其中一個原因也是
rest-graph 做到後期,我自己都覺得有點亂,並沒有很單純了(難過)。
很多不同功能的程式交錯在不同的 method 中。雖然靠著 test case 與
耐心最終是能把想變的東西變出來(好幾個小時只改了幾行),但在製作
偽造 POST 這個功能時,一直覺得自己處於某種 "twisted mind" 的
狀態中...

所以如果能改善這部份的話,我會很高興的。

目前的成果就是仿造 rack middleware/app 的模式,來把各種功能掛
上去。我沒細看 faraday 的程式,因為我想直接仿效 rack 的單純,而
faraday 乍看之下並沒有那麼單純就不想看了。

所以 middleware/app 的結構大概是類似這樣:
(middleware (middleware (middleware app)))
如果 middlewares 是一個 list, 那這就會是
foldr (:new.to_proc) app middlewares (mixed haskell and ruby)
不明白我的意思的話沒關係,請直接看 Rack::Builder#to_app

所以對於一個 middleware 而言,他可以掌控的流程大概是:
def call env
  do_something
  response = app.call(env)
  do_something_again
end
比方說,RestCore::Cache#call 是這樣:
def call env
  cache_get(env) || cache_for(env, app.call(env))
end
單單都是這樣的話,一切都很好。不過 RestCore::Cache 並不能只是這樣。
當 server response 回來,透過 RestCore::ErrorDetector 會知道這個
response 是我們要的或是不要的。比方說 server 掛了,或是 request
limit reached, 這時候這個 response 則不該被 cache, 以利下次重試。

目前,我讓 middleware 實作 fail 這個 method, 以下是 RestCore::Cache#fail
def fail env
  cache_assign(env, nil)
  app.fail(env)
end
也就是說,有錯誤發生時,要把 cache 清掉。不過這樣做確實是很奇怪,
(感謝 jaime!) 有以下幾個理由:

0) 由於這也是透過 middleware 串起來的,而 middleware 本身是個
cons list (linked list) (所以 app 其實是某種 nil), 因此順序變得很重要。
不同的順序會有截然不同的結果,這不是我想要的。

1) 如果發生錯誤要把 cache 清掉,那是不是應該寫成,如果發生錯誤,
就不要 cache, 而不是事後把他清掉?

用 exception 來做這件事,是有可能的。可是我後來想來想去,還是覺得
很難把 exception 套上去。原因是我是希望把 cache 清掉,但不希望有
exception. 那麼應該 raise 什麼?又該由誰來 rescue? 其他不在乎這件事的
middleware, 碰上 exception 又該如何處理?似乎把問題變得更複雜了。

所以我想我要的應該是,某種 error notification, 告訴 middleware 說,
現在發生了某件事情,可以處理,也可以不處理。原本的 fail 應該能達成
這個問題,但順序變得太過重要,使得安排 middleware 變成一種麻煩。
另一方面,有沒有可能透過其他方式,達成上面 (1) 所提到的,不是事後,
而是當初就不該 cache?

Cache 這個 middleware 本身就應該放在前面,因為如果 cache hit
那就要直接出去了。因此在 Cache 的 call 裡面,是否需要某種方式知道
ErrorDetector 確認了這邊有錯誤產生,因此不要 cache? 在 env 裡留下
某種線索嗎?像這樣?
def call env
  cache_get(env) || if (response = app.call(env)) && response['error']
                      response
                    else
                      cache_for(env, response)
                    end
end
仔細想想,說不定這樣做確實比較好。包含 logging 的部份。確實 rack spec
中有明確規範 rack.logger 這樣東西。但其實我是想做得抽象一點,不是直接
操作 logger, 而是使用某些 Event struct, 這樣也能確保輸出格式。

另一方面,以上可能還只是小問題。另一個我現在沒什麼頭緒的問題是,
許多 middleware 會去調整 env 的內容,也就是說會改變 request URI.
那麼我應該用什麼方式,去取得這個最終的 request URI, 而不用真的呼叫
call 呢?這個問題是之前 rest-graph 有這樣的 method, 為了相容性,
再加上這確實很方便,所以還是希望能夠實作這個。但如果像現在這樣,
最終資訊在於 list 的最裡面,那我要怎麼取得那個資訊?

我先是試著在 env 裡面加入個 DRY_CALL 之類的 flag 表達不要 request,
但覺得這樣會使得 middleware 太難實作。後來想說要有些 method 可以去
詢問修改後的 env, 但要嘛就變成得實作兩次 (call + ask env), 要嘛就會變成
很怪的狀況,在 call 裡面呼叫 ask, 但真正的 ask 需要詢問 app, 在原本的
call 裡面又不用。

所以目前有點卡在這...

愈寫愈長就乾脆寫在 blog 上了,莫怪 @@"
懶得看也是完全可以理解的,沒關係 XD 感謝詢問!

2011-05-25

得證,一切都是哲學

updated 2011-05-25 18:22 buzz 討論

xkcd comic: Extended Mind
老實講,裡面字一堆,又很小,又是全大寫,根本懶得看。
不過 xkcd 的重點 alt text 還是要看的:

Wikipedia trivia: if you take any article, click on the first link in the
article text not in parentheses or italics, and then repeat, you will
eventually end up at "Philosophy"

老實講我不太相信 XD 但這也不難驗證,自己試幾個就知道了。
結果我試了三、四個,真的最後都回到哲學了。一開始沒回到
哲學是因為我按錯了,在括號裡的連結不能按。以下是其中一個示範:

Another World (video game)
1991 in video gaming
Namco
Kabushiki gaisha (Japanese corporation)
Law of Japan
Japan
East Asia
Subregion
Region
Geography
Earth
Planet
Orbit
Physics
Natural science
Science
Knowledge
Fact
Information
Sequence
Mathematics
Quantity
Property (philosophy)
Modern philosophy
Philosophy
Reason
Rationality
Philosophy

得證,一切都是哲學。


其實也可以寫個程式驗證,很容易... 把所有詞庫都丟到 wikipedia 去查即可。
不過我想只要 wikipedia 的文章都有遵照標準格式去寫,這應該會是真的。


還看不到哲學,太對(right)了 XD:Purity
philosophy is too right (pure) to be seen

永遠的最近

好像沒有一件事能做好,也不知道自己在做什麼,
該做想做的事也不斷累積,茫茫然然渾渾噩噩悽悽慘慘戚戚(?)

然後又被煩 (嘆)
為什麼半夜也要煩...

只有在決定今日什麼也不做,準備去睡覺之後,
才能稍微鬆懈一點。然後有時候又會碰到上面提到的煩,像剛才。
精神又開始緊繃...

太累了,我真不知道我到底是為了什麼。
感覺只有為了打發時間罷了。
還有少掉一點不愉快。

天亮了。究竟是開始還是結束。有時候想要至少一週不講一句話。
看著電腦發呆。想著那些不存在的事情。想著沒有病痛就是幸福。
躺在床上的茫然感。不想下床的掙扎。為了 estiah 兩點 reset 的
爬起。什麼時候這變成像是每日最重要的事似的?沒有緊迫的感覺,
只要時限前按個幾下就好了。像這樣漫長卻又不急迫,也需要細想的
遊戲,還真適合我?

嗯,然後累個半死之後,在床上滾兩圈就睡著了。

如果沒有睡眠的話,不知道究竟該怎麼靜下來,世人也會很嘈雜吧。
其實也不是那麼討厭喧囂,只是在茫然時總想靜一點。探索內心,
究竟什麼才是自己覺得值得的。找到之後,才有辦法參與這吵鬧的
世界,不管是吵自己,或是吵別人。

random links:
Grelling–Nelson paradox
In logical terms, the situation for "autological" is:

"autological" is autological if and only if "autological" is autological
A if and only if A, a tautology

while the situation for "heterological" is:

"heterological" is heterological if and only if "heterological" is autological
A if and only if not A, a contradiction.
DotCloud Acquires Duostack
What papers should everyone read?
godfat Achievements
國小個人舞台賽第一名
Reflections on Trusting Trust

2011-05-24

Heroku locale

I forgot if I had mentioned this before, but since I got trapped again,
I should memo this once again.

By default, the locale on Heroku is `POSIX`, which is fine,
but in Ruby 1.9.2, this would affect `Encoding.default_external`,
and which would make Rails break for UTF-8 strings somehow.

So I have set LC_ALL to en_US.UTF-8 on some apps:

heroku config:add LC_ALL=en_US.UTF-8
and forgot to set it on other machines.

The other way, we can simply set Encoding.default_external = 'utf-8'
somewhere in the program (e.g. Gemfile), so that we're not relying on
locale.

Also, favor psych in 1.9.2 would be good. Put this in Gemfile:
begin
  require 'psych'
  YAML::ENGINE.yamler = 'psych'
rescue LoadError
end

ok, I think I have said it here:
1930. 04-25 Ruby gotcha from 1.8 to 1.9

書店

日前在 sogo 金石堂晃了幾圈,裡面的日文書多到快滿出來了,
感覺比中文書還多很多,英文書的話只有一點點。奇怪的是,英文書
好像又會被叫「原文書」。啊日文就不是原文,都是翻譯的?中文勒?

無意間就晃到放電腦相關的書櫃,好吧,其實我多少都會晃一下。
不過每次都是看到一堆操作應用軟體的書就覺得很無趣。但仔細看
一下,其實程式設計的書也滿多的耶。然後居然看到一排 ruby 的書:


驚奇之下,每一本都拿起來翻翻。不愧是日本人要支持國貨嗎?
perl 和 python 的都很少,忘記注意 php 了。
不過更驚奇的是,我居然看到 haskell 的書... 就在 ruby 書的旁邊。


一瞬間忽然有收一本做紀念的衝動。不過還好我從來就沒有那麼衝動..? XD
但不管怎麼樣,這理所當然要拿起來翻翻,看看他說些什麼東西。

他的編排讓我滿吃驚的。感覺他是針對程式初學者,什麼東西都從頭解釋。
這本書也不厚,因此理所當然根本講不了什麼東西,篇幅就用完了。可是,
他最後一篇卻居然在講用 haskell 寫 CGI 程式 XDDD

是說也沒有講得很難啦。但我真的滿懷疑初學者看到這邊,實際要練習時,
會不會撞得滿頭包發現只能抄上面的範例用?是說可能很多初學者就是如此吧 :s

* * *

沒有相機,只能用手機破爛的相機功能拍.. 我體認到根本懶得拿相機,
而畫質太差,也根本懶得拍。要同步到電腦上有點麻煩,也是個問題。
不知道再過多久可以解決這些問題。

* * *

買了 mei 推薦的發條鳥年代記。好便宜喔,早知道這個價錢的話,大概
兩三本都先拿了。在金石堂看了前面一點點,目前還不知道想表達啥。

然後今天到辦公室,企圖在背包裡找我早已拿出來的滑鼠時[0],看到一個
不知道是啥的包裝,才忽然想起來我完全忘記這件事了。唔,那捷運上
應該看 kindle 還是發條鳥年代記?反正很薄,帶著看好像也沒關係。

* * *

在書店晃時,也想起一些之前到日本晃的事。那時才忽然發覺,其實無聊的
是旅遊團老是要看那些早就都看膩的東西。我還滿想看看各地的書店長啥
樣子,賣些啥書,這裡的人都在看些什麼。還有學校長得什麼樣子,裡面
有些什麼,學生長啥樣子,有什麼言行舉止與衣著。交通狀況如何,一般
人是怎麼在這邊過上一天,諸如此類的。

不過這些我好像說過了...

總而言之,觀光勝地似乎通常很無聊就是了... 要嘛就是公式化,要嘛就
很假,像是走入什麼圈套似的?


上週五的事

[0] "包包翻半天才發現我要找的滑鼠早就拿出來了............."

2011-05-22

Haskell/Category theory (0)

(希望沒寫錯的,沒啥時間細琢 ><)

零零碎碎斷斷續續悽悽慘慘戚戚(?)讀了些 category theory 的東西,
最有系統的一次大概是讀 Abstract and Concrete Categories -
The Joy of Cats
吧。不過我只看了前面一點,沒多久就看不下去了。
除了他所謂的 concrete 對我來說還是太 abstract 外[0], 沒多久忽然
間就變得很難,定義和定理看了一堆我也不知道能做什麼.....

我大概還是不適合看太抽象的東西 (笑)

所以還是比較希望能在程式裡表現這些東西。無奈在 haskell 中,
因為需求與環境不同使然,很多東西都無法直接對應,而是用另一種
方式來表現或是傳達。有時候不同的東西,就會被當成同一種東西來
呈現。這樣光從程式裡去看,就根本看不出來背後的意義究竟有什麼
差別。就像太早去看 design pattern, 大概很難看出到底有什麼意義。

因此看來看去,還是不太清楚 category theory 中的 functor 跟
haskell 中的 functor 到底是怎麼接在一起的。haskell 中的 functor,
光看字面我覺得沒什麼好特別說的,就很單純是 generalized map...
fmap :: Functor f => (a -> b) -> f a -> f b
而在 category theory 中,直接引用該書中的一段描述...

Notice that a functor F : A → B is technically a family of functions;
one from Ob(A) to Ob(B), and for each pair (A,A′) of A-objects, one
from hom(A,A′) to hom(FA,FA′).

講白話一點可能可以說是分成兩個部份,一個能夠將 A 變成 B, 另一個則是
將所有 A -> A 的 morphism 都變成 B -> B. 可是 haskell 中,看起來就
只有那個孤獨的 fmap 而已。我們說 List 是 functor, 那 fmap 就是
map, 然後呢?

這個問題困擾我一段時間了。

一陣子前,從 jaiyalas 那邊得知 Edward Z. Yang 的 blog, 然後從他的
個人網站中,看到他推薦閱讀 Brent Yorgey 撰寫的 Typeclassopedia,
發表在 Monad.Reader issue 13.

這篇非常明確地說明了不少在 haskell 中,這一堆的 class 之間究竟有
什麼關係,還有為什麼 haskell 有些 class 設計很怪,跟理論上的東西
好像有點接不起來。還提到了 Pointed 這個應該有卻沒有的 class[1].

可惜後面 Category 和 Arrow 的 class 都太複雜了,我一時三刻還沒
看懂。另一方面,有幾段的 further reading 裡提到 Haskell wikibook
裡的 category theory:

Haskell/Category theory

這個在 google search 上通常都在很前面,所以我也翻過很多次了,不過
一直沒有仔細細看過,或是其實只是單純沒看懂?總之這時回頭來翻,發現
這篇對於解釋 category theory 跟 haskell 間關係,說不定是最清楚的
一篇也說不定?

關鍵在於,假使 haskell 的 type 是 object, function 是 morphism,
令 Hask 是 haskell 的 category, 則 fmap 中的:
fmap :: Functor f => (a -> b) -> (f a -> f b)
ab 是 Hask 的 object, 而 a -> b 則是 Hask 的 morphism,
借用上面的定義:

Notice that a functor F : A → B is technically a family of functions;
one from Ob(A) to Ob(B), and for each pair (A,A′) of A-objects, one
from hom(A,A′) to hom(FA,FA′).

這邊的 a -> b 就是上面的 (A, A'), 也就是 hom(Hask, Hask'), 後面的
f a -> f b 即是 hom(F Hask, F Hask'). 也就是說,F Hask 和 F Hask'
就是 B, 也就是 haskell 中的 f af b. 假使這個 functor 是 List,
則 B 這個 category, 則是 Hask 中的 sub-category, 也就是 Lst (List),
即所有的 List value 和所有的 List function.
(
functor law 這邊都先跳過... identity 和 composition (associative?)
這些有時候我覺得滿直覺的,最後再討論就好了。
)
也就是說,fmap 本身確實就是 functor 中 morphism 的部份。
那 object 的部份呢?以 List 為例的話,那就是 List 本身了。
因此,構成 functor 的部份,實際上是這兩部份:
map  :: (a -> b) -> (List a -> List b)
List :: Hask -> Lst
map 是 morphism 的 mapping, List 是 object 的 mapping,
給一個 Hask object, 轉換成一個 Lst object. 令這邊的 Hask 是
Int, 則 List Int 是一個 Lst 的 object.

因此應該可以說,List 本身和其 fmap 的實作構成一個 functor
A -> B, 這邊的 A 是 Hask (所有 haskell type), 而 B 則是 Lst
(所有 List of something).

同時,或許也可以說,所有 haskell 裡的 functor, 全部都是 Hask -> ?

想到這裡,就覺得想在 haskell 裡 model category theory 應該不對吧。
怎麼可能用一個比較小的東西,去描述一個比較大的東西?遑論描述自己
都沒辦法了,因此只有 quasicategory of all categories, 沒有
category of all categories... (暈)

* * *

很多東西之所以看半天搞不懂,總覺得是有些最基本的概念,或是動機
不理解。不過大概也只能這樣不斷摸索揣測歸納吧。至少我自己的理解
方式大概是這樣。

接下來看能不能搞懂 category theory 中的 natural transformation 和
monad 了。然後再像 functor 那樣找到究竟是怎麼跟 haskell 連在一起。


不過仔細想想,這些東西好像離程式有點遠了喔..? @@


[0] 他 concrete example 我只有 set 的東西比較能看懂,
其他什麼 group, vector, monoid (現在或許比較懂了), topology,
ring, matrix, relation, automata, metric, Banach, 諸如此類...
有些之前我根本沒聽過 :s

[1] 這篇比較難,比較簡單的描述可以看 Learn You a Haskell for Great Good!
一個讓我很恍然的東西是,其實應該是 Functor => Pointed => Applicative
=> Monad 這樣一路串起來才對。然後 fmap 就是 liftM, 與其把 fmap 看成:
fmap :: Functor f => (a -> b) -> f a -> f b
不如看成:
fmap :: Functor f => (a -> b) -> (f a -> f b)
這樣就能很容易理解 fmap 其實就是 liftM... 就是上面提到
「A -> A 的 function 都變成 B -> B」的那一部份。
接著 Pointed 提供 pure, 也就是 unit, 也就是 return... Applicative
提供 <*>, 也就是 ap. 然後 class Monad 本身沒有限制一定要是
Applicative 只是單純因為 Monad 比 Applicative 還早加入 haskell.

呃,難道就不能改一下嗎? :s 這樣很混淆...



All texts are licensed under CC Attribution 3.0