What have you found for these years?

2011-05-18

oauth 筆記

先看這篇搞清楚 1.0 跟 2.0 之間的差別。

Top Differences between OAuth 1.0 and OAuth 2.0 for API Calls

簡單來說就是,由於 1.0 設計跑在 HTTP 上,所以要自己發明一套安全檢查,
有各式各樣的驗證來確保使用者不會受到任何形式的攻擊。

超 複 雜 (OAuth 1.0)

然而 2.0 雖然在草稿中,但由於設計跑在 HTTPS 上,所以大部份的安全
檢查都不用做了,完全靠 HTTPS 即可。

超 簡 單 (OAuth 2.0 (draft-ietf-oauth-v2-15))

是說超簡單,但 spec 總是寫得落落長,看重點就好了。重點在
7.1. Access Token Types 裡的:

GET /resource/1 HTTP/1.1
Host: example.com
Authorization: Bearer h480djs93hd8
就這樣,不用一堆麻煩的 signature. 這種簡易的 Bearer access token,
要看 OAuth 2.0 Bearer Tokens. 總共有三種用法,分別是 HTTP header,
POST with form-encoded, 和 GET. (那不就是全部都行的意思?)
HTTP header 的話就像上面那樣,然後有個示範是這樣:
GET /resource HTTP/1.1
Host: server.example.com
Authorization: OAuth2 vF9dft4qmT
或許還在草稿中的關係,不知道到底要叫 Bearer 還是 OAuth2...
但總之用在 GET/POST 裡應該是叫 oauth_token. 也只要不要算
signature, 然後不要一堆各式各樣的 token (as in OAuth 1.0),
大抵上就算滿好處理的了。

唯一的麻煩只在最初的 authorization, 需要 redirect 那部份,
而這方面在 OAuth 2.0 看起來也簡單多了,就一個 code 而已。

大抵上確實跟 facebook Graph API 作法差不多,只有一些小細節不同。

* * *

我已經從 rest-graph 中拆出 rest-core, 接下來可能把他拆成一個
git submodule, 然後看情況要不要做成獨立的 gem. 接著大抵上
就能在上面再加蓋一層 OAuth 1.0/2.0 的 wrapper. 做 2.0 基本上
是沒什麼改變,重點是 1.0 真的好複雜,其實我不太想做。但現有的
oauth gem 我覺得滿難用的...

另一方面,透過 oa-oauth, 我注意到 faraday, 其地位大概就類似
目前用的 rest-client 吧。基本上我對 rest-client 是算相當滿意,
所以沒意外並不想換掉 rest-client. 但是 faraday 乍看之下,模組化
似乎做得比較徹底,或許能夠直接在上面做 OAuth 的東西,而不是
額外再去用一個 gem.

也就是說,也許 rest-graph 本身可以做成 faraday 的 middleware.

想到這裡,就有點猶豫不知道該不該動手。基本上雖然很多東西我都想
自己做,但那都是基於對現有的東西不滿。如果有一個我很滿意的東西
會動,我也就懶得重新造輪了。oauth gem 不行,oa-oauth 可以,
faraday 還沒細看,但有潛力。

怎麼辦呢...

關於這些考量,再下次某一篇中再重新描述。說真的,覺得有點沮喪。

* * *

OAuth 1.0 真的覺得很棘手。現在很可能需要他,但 oauth gem
我不喜歡,而且這雖然是個應該還會活很久的標準,可我對重做舊東西
興致實在不高。

而另一方面,看起來 linkedin 是想要另一個 client, 這是個機會。

真的不知道怎麼做好哩...

最後這是之前看 OAuth 1.0 的筆記。spec 落落長看起來真的很累,
簡單的範例比什麼都有用。

(server) init callback -> get oauth_token (tmp) / oauth_token_secret (tmp)
(client) redirect with oauth_token -> (from callback)
get oauth_verifier (tmp) + above oauth_token (tmp)
(server) authorize with oauth_verifier (tmp) and oauth_token (tmp) ->
get real oauth_token and real oauth_token_secret

(taken from my buzz notes)

2011-05-17

strictness, laziness, and termination

自從讀了 The Point of Laziness 之後,想了很多這方面的問題......

一個不是很容易區分的概念是,non-strict 跟 lazy evaluation (call by need)
要如何區別?就我最早的理解,前者是概念,後者是實作,也就是說,可能有其他
方式來達到 non-strict.

後來的理解則是,strictness 表達的是 const unit ⊥ 究竟會是 unit 還是 ⊥,
跟 evaluation 倒沒有直接的關係。只要 const unit ⊥ 可以是 unit, 則算是
non-strict, 反之則是 strict.

不過要明確地區分,或許還是找到另一種實作 non-strict 的方式,會比較
容易理解。後來想了很多 pattern matching 和 strictness 之間的關係後,
大概得到一些結論。

想像一個 haskell 程式就是一個巨大的 term, 而所謂 execute, 或所謂的
evaluation, 其實就是把整個巨大的 term, reduce 成最小的 normal form.

這在 eager (call by value) 程式裡,應該是沒什麼問題,反正就是全部都
reduce 掉就對了。strict 程式應該亦然,反正只要某個地方得到 ⊥, 整個程式
就是 ⊥ 了。這裡先不考慮可以被 catch (rescue) 的 exception.... 先假設
一旦發生 exception, 整個程式就是 ⊥. 程式不會 terminate, 反正也是 ⊥,
差別在前者我們知道程式 crash 了,後者則面臨 halting problem.

lazy evaluation (call by need) 則讓人玩味了。究竟什麼時候,或是說哪個
地方,才應該是「引爆點」?哪個地方是那個 "need" ? 以 haskell 而言,
大概就是 main 這個 IO monad (action) 吧。但引爆之後,究竟是誰要爆?

我覺得我一直卡在這個問題上。雖然這樣講或許有點倒果為因,但感覺上
只要是被 main 用 IO monad 的 bind 給 bound 住的 IO monad, 就會被
evaluate, 然後順著一路 evaluate 到 (some kind of) normal form.

但除了 IO monad 的 bind 外,我們要怎麼求得一個 pure value?
似乎還是需要某種「強迫」,或是說某種方式表達我們真的 "need" 那個 value.
假使 pattern matching 是 strict, 則這一切都很好處理。因為我們就可以靠
pattern matching 來「強迫」取得某個 value, 於是程式就能順利執行下去...

另一方面,我們知道 lazy evaluation 其實是在身上掛無數的包裹,或說肉團...
上面所提到的「強迫」,就是打開這個包裹,或是割掉這塊肉的動作。算了,
我還是不要形容成肉塊好了,有點怪。總而言之,會有非常多懸而未決的包裹,
我們不知道究竟什麼時候要打開那些包裹,也不知道包裹裡面究竟還有多少
包裹。如果 pattern matching 是 lazy 的,意味著包裹裡面也會有很多的
"branch", 也就是非常有可能是一個很巨大的 term (包裹). 如果有太多
懸而未決的這些東西,現實上,很可能會吃掉太多的記憶體。

我想這也是為什麼聽說很多 haskell 程式,會有很恐怖的記憶體用量歷史圖。
裡面很可能就是懸著一個太過於巨大的包裹。懸著太大的包裹,吃掉太多記憶體
(space), 面臨打開的時候,很可能又變成瞬間面臨太多的運算 (time).

這或許是 lazy evaluation 的一個問題,但似乎不是 non-strict 的問題。

假使我們有某種方法,可以把整個 program 的這個 term, 一切為四個 sub-term,
然後分別交由四個 core 去 eagerly (non-lazy) 運算,同時由於我們希望程式
本身是 non-strict 的,因此碰上 ⊥ 時,就應該忽略他,除非我們現在真的 "need" 的
那個 value 也 "need" 這個 ⊥, 不然 const unit ⊥ 還是應該 reduce 成 unit.

可惜理論上這是不可能的,因為這面臨了 halting problem. 我們可以知道
exception 的 ⊥, 但沒辦法知道 non-terminating 的 ⊥, 因此希望透過事先運算
來避免攜帶太大的包袱,又能同時達到 non-strict 的性質,或許是無解的。
折衷方式或許是,給定一定的運算時間,如果超過了,則跳開先算其他的 sub-term....
也就是說,語意上或許仍然是 lazy evaluation, 實際上卻偷偷在別人背後拆禮物,
如果發現某個禮物一時拆不完,就跳過先拆其他的小禮物..... 雖然可能浪費了時間
拆開了用不到的禮物(裡面是磚塊),但至少或許可以減緩攜帶太大包的問題。

說來好像很簡單,實際上這運作起來應該會異常複雜恐怖吧...
似乎是某種極端複雜的 scheduling 問題?

但如果達成了,或許可以看成是某種 non-strict 程式,但不是 lazy 的?

另外,要做這種分析,確實就需要區分各種不同的 ⊥, 這樣我們才會知道
某個 term 到底是不是真的 ⊥, 因為只要他沒有 "need" 到那個 ⊥, 他就可以
不是 ⊥.

假使我們有個 list = [0, ⊥1, 2, ⊥3], 那麼 head list0,
head (tail list)list-1, 依此類推,也意味著我不能把
他們全部 reduce 成一個東西,還是得把這些東西都當成一個不能
reduce 的 term (包裹) 看待...

那豈不是還是沒解決包裹太大的問題?

於是就能理解為什麼 non-strict 的程式很討厭,一大堆 ⊥ 很討厭了...

可話說回來,ruby 很好用,沒人理解 ruby 程式是怎麼運作的,
以「寫程式」的觀點來看,其實我也不想搞清楚那些 ⊥ 是怎麼回事。
反正我開心就只試著「描述」程式,我不管我描述出來的程式,是不是
其實有 20% 是一坨完全用不到的贅肉,是完全不合理的大便程式,
我只管我實際上真正跑出來的對不對就好了。

其實寫 ruby 是抱持著這種心情在寫的。所以很愉快,像在隨意塗鴨,
毫無理由地任意描繪揮灑。

那麼,可不可以也這樣說,用 haskell 寫著摻雜各種 ⊥ 的程式,
各種不合理的程式,其實也無所謂?更何況 haskell 寫出來的程式,
本來就遠比 ruby 要來得合理多了?

反正 haskell 又不是 theorem prover?

另一方面,單就只是 strict 的程式,面臨 ⊥ 一樣還是無解(吧?)
那是否乾脆就像 agda 那樣,做最嚴格的 termination check,
需要給 type checker 各種 proofs, 告訴他我的程式一定會
terminate? 這不是比 strict 程式要來得更加「正確」嗎?

所以還是 haskell 和 ruby 好啊 (誤)


可惡,都沒有時間好好想好好寫 ><

2011-05-16

kalafina live 2010

上一篇提到的 mplayer dvd:// 是在看這個,日前在 95 晃了幾下,
覺得反正也不貴就拿起來了。但事後才意識到,所謂不貴根本是拿日版
cd 去比了,實際上似乎並不能叫不貴.... but anyway

之前在 AA 看到別人說他們現場滿厲害的,後來自己看 Seventh Heaven
[0][1] 附的 dvd, 自己聽來感覺現場真的是比較有活力,反之 cd 聽起來
就比較死板一點。而那張附的 dvd, 只有少數幾首有 live 而已,其他則是
奇怪的 mv 之類的。那... 這整張的 live 應該會不錯吧?心裡是這樣想的。

剛剛大致上是全部看完了。老實講,中間有點打瞌睡 orz
倒不是說不好,只是最近體力確實很差,當自己感受不到進展時,
很快就會開始打瞌睡... 而 kalafina 的曲子,我也覺得曲目跟曲目間
差異其實沒有很大,雖然自己還算喜歡,但聽久就會覺得很膩。

自己比較不能接受的,大概是很多地方燈光都一直閃,看久了眼睛
覺得很不舒服,再加上想睡,就會想切回 inbox 查看信件 @@

總而言之,live 真的比 cd 生動很多。中間那位平常講話聲音並不會
很低,但唱起來真的很低沉,很厲害。左右兩位,原諒我常常搞不清楚
誰是誰... 聲音都還滿特別的。

那天在 95 還有看到好幾片梶浦的新 cd 的樣子。自從他開始配起鋼彈的
音樂後,我就漸漸沒在注意他了。感覺最近好像也很活躍的樣子。
不知道新的那幾片如何... 因為還買了別的了,所以就沒買了。

仔細想想,現在大概只有 sound horizon 和志方的 cd 我會看到就拿吧。
倒是看到 sound horizon 七月好像會出新的 live, 有點猶豫不知道要不要
訂哩。他後來實在出太多了,多到我懶得注意了...
還有個 4 片 dvd 的版本,好像是 2009 還 2010 的
live, 兩天份。似乎是有藍光版本的那個?

現在看到藍光都很猶豫,畫質好像差很多,但我沒機器放呀 :(


還在想要不要買那四片 dvd 的... 那兩天的我好像都沒看過。
但說真的很貴耶 :( 雖然說已經比分開買便宜一點點了...


updated 2011-05-16 01:44
喔對了,忘記說,不知道有沒有在賣 kokia live 的 dvd?
有的話我要,看他在 youtube 上的影片,也是比 cd 生動許多.....

2011-05-15

mplayer dvd://

放入 dvd, mac 先是自動跳出 DVD Player. 本來是想說就用沒差,
但發現不知道怎麼快轉,而且我最討厭自動跳出了,還是自動全螢幕....
所以還是關掉,打開用來用去都最沒問題的 mplayer.

但其實我不記得 mplayer 怎麼播 dvd. 記得以前有查過,而且我記得
跟 dvd:// 有關,因此就在 fish 裡打了 dvd, 然後按上。果然立刻跳出

mplayer -slang zh dvd://

然後就很開心地按下去,心想果然還是 mplayer 最好。

結果播著播著,有時候聲音就會消失,然後又再出現,很明顯有問題...
果然 terminal 上顯示著一些錯誤訊息。我懶得細看,想說反正 player
很多,就再換一個就好。研究 mplayer 怎麼使用其實滿花時間的...

接著想起自己應該沒灌 vlc, 就去抓 vlc. 這段時間,先試一下 gui 介面的
MPlayerX. 沒一開始就打算試他的原因是,覺得也沒有很穩,而且之前
聲音一直有問題。打開之後,發現不知道怎麼開 dvd. 只好跳到 dvd 目錄
裡面,隨便選一個來播。乍看之下好像沒什麼問題,結果聲音全部爆音,
非常大聲,嚇我一大跳,只好很不舒服地立刻切掉。我猜 MplayerX 有
自己在做混音?結果接到外部裝置有時候就爛掉。

另一方面我也不太喜歡 MPlayerX 沒有完全用 mplayer 本身的快鍵,
游標移到畫面上跳出來的控制面板也覺得很礙眼。然後我決定繼續嘗試
mplayer, 而不是 vlc.

最早他給的訊息是這樣的:
Too many video packets in the buffer: (4096 in 8281449 bytes).
Maybe you are playing a non-interleaved stream/file or the codec failed?
For AVI files, try to force non-interleaved mode with the -ni option.
所以我就改下這樣試試:

mplayer -ni -slang zh dvd://

發現沒什麼用。接著注意到,上面其實有更多的訊息,這樣寫的:
           ************************************************
           **** Your system is too SLOW to play this!  ****
           ************************************************

Possible reasons, problems, workarounds:
- Most common: broken/buggy _audio_ driver
  - Try -ao sdl or use the OSS emulation of ALSA.
  - Experiment with different values for -autosync, 30 is a good start.
- Slow video output
  - Try a different -vo driver (-vo help for a list) or try -framedrop!
- Slow CPU
  - Don't try to play a big DVD/DivX on a slow CPU! Try some of the lavdopts,
    e.g. -vfm ffmpeg -lavdopts lowres=1:fast:skiploopfilter=all.
- Broken file
  - Try various combinations of -nobps -ni -forceidx -mc 0.
- Slow media (NFS/SMB mounts, DVD, VCD etc)
  - Try -cache 8192.
- Are you using -cache to play a non-interleaved AVI file?
  - Try -nocache.
開頭那個 your system is too slow to play this 沒什麼大不了的,
我的電腦完全不可能太慢 (又不是 1920p), 而且這個訊息很常看到,
像是檔案有點問題,或是同時電腦在跑別的東西,或是移動視窗,
快轉之類的都有可能顯示那個。但總之就把他說的一個個試過就知道了。

由於我確實是碰到聲音會斷掉的問題,所以就先試了第一個:

mplayer -ao sdl -slang zh dvd://

結果發現還真的這樣就可以了,一切都很正常。不過這是什麼意思?
表示我電腦上有個 buggy audio driver? 為此我還更新了 mplayer,
不過結果似乎是一樣,一定得切換到 sdl 才不會有問題。其他的選項,
用了反而會連影片看起來都斷斷續續的。

啊,然後打這段時,我才注意到原來還有這句話:
- Slow media (NFS/SMB mounts, DVD, VCD etc)
  - Try -cache 8192.
試了一下,發現果然這樣也可以耶? =_=b 看來這應該才是問題所在才對。
多虧我剛剛還一直在擔心用了 sdl 會不會導致聲音多混音一次變差。


果然我對這方面真的是完全一竅不通呀。
還有就是說不定好好研究 mplayer 怎麼操作設定是值得的投資。
我覺得用起來其實很直覺。上下左右控制進度,f 全螢幕,q 關閉,
space 暫停,介面也極端乾淨簡單(根本沒有介面,只有畫面...)
照理說這些按鍵也可以改。gui 的很多用來還沒這麼方便...


vlc 下載完也懶得解壓縮了,乾脆直接刪除 :s

updated 2011-05-15 22:50
mplayer -cache 8192 -slang zh dvd:// -chapter 4
按 ! 是 previous chapter, 按 @ 是 next chapter

mac is not for people who...

wants large fonts. (from Propane App)


man, this is what on my FireFox:


guys, please protect your/our eyes! It hurts!

Let users pick their preferred fonts! Please!!

2011-05-15

愈覺得時間不夠用,就愈覺得焦慮,好不容易進入狀況,一被打斷就要
很長的時間才能恢復平靜。

早上約九點多醒來,想說雖然有點睡不著了,但還有點早,可以繼續睡。
然後幾秒鐘後就睡著了吧。下一次有印象醒來看表的時間,約是十點多。
這次想說應該夠晚了,可以起來了,但又幾秒後就睡著了。接下來大概
就懶得看表了,一路到一點多才又看了一次。想著可以起來了,然後就
又睡著了。最後拖到快三點才爬起來...

我覺得,對我來說,有沒有辦法爬起來,真是最簡單的狀況指標...

沒辦法爬起來的時候,要不是覺得有太多事要做很煩不想起來面對,
要不就是什麼也不想做不知道爬起來要做什麼有什麼意義。能一醒來
就爬起來的日子,是多麼地美好呀。好像每天都是新的一天似的。
反之,則是覺得明天也是今天的延續,沒有一個可以重新開始的起點...


打完這些希望有振作些

GUI 視窗陰影

可以看到右方得到 focus 的視窗,在左方視窗上留下了陰影。
乍看覺得是無意義的特效,然後忽然覺得其實這是很有效地
讓使用者能夠一眼就理解右方的視窗在左方之上,也就是得到
focus. 這確實是非常直覺的方式。想像兩個沒有框的幾何圖形
重疊,這樣就完全沒有任何資訊可以判斷層次。


雖然人類通常不會注意到自然界的細節,但一旦不符合自然界的
感受,很容易就會覺得哪裡怪怪的。忽然想起上次好像是在 ptt
GameDesign 看到 yoco 提到一些關於視覺速度感的事。

然後就會覺得,人類的感受真的相當程度地曲解了這個世界。
下略萬字...



All texts are licensed under CC Attribution 3.0