skydrive+fuse?

好像沒人寫,先找資料看看。

收集資料:

整體看起來,不要使用python,使用 mono+fuse+SkyDrive .Net API Client 似乎是比較好的解?!

學校教材的下載

有些科目的教材好多,用滑鼠可能會按到死。本想用 curl 來硬幹的,可是從登入頁面一路解析到教材下載頁面的時候,發現 ASP.NET 的頁面還真是難搞,後來選擇放棄。

於是想了一下看Firefox有沒有現成的AddOn可用,有,的確是有,那是DownthemAll,可是,教材下載頁面的”下載”是用javascript埋起來,所以必須解析div的onclick屬性,把真正的連結拿出來。這時候GreaseMonkey又再次派上用場,就是你啦!!於是就弄了這個userscript,他會在原來的下載圖形下方增加一個download連結,這樣DownthemAll就可以抓到。要用的話,可以直接到userscripts.org這邊安裝,下面是原始碼:

wordpress以SSH自動更新

考量到以後wordpress的更新問題,可是又不想開FTP的洞,所以研究了一下不使用FTP的方式,大致上就是照這一篇WordPress Automatic Update with SSH來操課即可。第一次更新失敗,在調整 wp-content/plugins 與 wp-content/themes 以後,就解決了。我把這兩個目錄的owner調整為apache:groupname,然後permission調整為0775。

wordpress開多站(blog)

好久沒用,印象中有WPMU,上去wordpress看,發現已經被廢棄了,現在只有一套wordpress。

一開始是找到這篇Installing Multiple Blogs,但裏面介紹的方法,第1種是教你把wordpress放到多個目錄,然後用多個資料庫來切,第2種也是把wordpress放到多個目錄,然後以table的prefix來切。不管怎麼樣,這兩種方法都會讓維護變得麻煩。後來是看到這篇Create A Network,這個是3.0以後才有的新功能,正是我要的。

大致描述一下方法,我用的是分目錄的方法,而非分網域的方法:

  1. 先把wordpress裝好。看你是要放在根目錄還是建個wordpress的目錄來放都可以。
  2. 改wp-config.php,找到註解”Happy blogging!”,然後把 define(‘WP_ALLOW_MULTISITE’, true); 放在該行上方。
  3. 重新登入,你可以在管理介面的左邊找到 Tools,裏面多了一個Network Setup,點選,然後填資料,Network Title填你要的名字,Admin E-Mail address填你的e-mail位址,點選Install。
  4. 依照畫面的顯示去修改wp-config.php、在wordpress目錄下建立.htaccess並且在wp-content/下建立blogs.dir目錄。這裡可能會遇到的陷阱,比較常發生的是.htaccess未生效,請檢查httpd.conf,看有無載入mod_rewrite,然後檢查AllowOverride,AllowOverride不能是None,應該填All。我個人是因為眼花,少貼了一行在wp-config.php裡,導致我重來了好幾次。第2塊說要改_SALT的那邊,我都沒改,這邊我要再查一下,看要怎麼產生,再填入。不過看起來對後面沒啥影響。
  5. 登出,再登入,到右上角的下拉選單,就可以發現有Network Admin,選了這個以後,就可以去管理站點了,像是建立新站、刪除站點…等等的。這樣就大功告成了。

Create A Network的後面還有介紹一些plugin,讓你可以每個站點有自己的plugin,不需要透過Administrator來安裝。

Tail call

簡單的說是遞迴的特例,好處是可以避免call stack的損耗。Stack Overflow上的回答蠻清楚的,還附了python範例:algorithm – What is tail-recursion?,英文維基百科上的說明:Tail call比中文維基百科上的來的好。
跟遞迴比較大的差別,目前我認知到的是會利用另外一個參數來傳遞結果,實際應用上應該只要是遞迴都可以改寫成Tail call吧,再想想可以怎麼應用。

Greasemonkey-輔助續借學校圖書

還是忍不住寫了,畢竟每次要為十幾本書打勾還是蠻累的。基本上就是多加兩個按鈕,一個幫我全打勾,一個幫我取消打勾。不過第二個按鈕好像永遠都用不到,這就是所謂的 over design 嗎? :-p

currying

前兩天看Wikipedia上的Currying時,突然頓悟了(可見之前都沒認真)。這個不看英文Wikipedia的說明,還真的是不容易看懂。簡單的說,假設有個 function 是 f( x, y, z ),currying 就是令 f1=f(1),當呼叫 f1( 2, 3 ) 時,就等於是呼叫 f( 1, 2, 3 )。

目前想到可以應用在 c/c# 沒辦法帶預設參數的情況上,像:[c]void func( int x, int y, int z ) { }
void new_func1( int y, int z ) { return func( 1, y, z ); }
void new_func2( int y, int z ) { return func( 2, y, z ); }
[/c]
你可以想像到,這是一項複製、貼上的體力活,用 currying 的話,可以很快創造出新函數:[c]/* 以下為虛擬碼 */
void func( int x, int y, int z ) { }
new_func1 = func(1); /* new_func1 仍是函數 */
new_func2 = func(2); /* new_func2 仍是函數 */
[/c]
在 python 裡,透過 *arg、**kwargs 可以很容易實現,文章可以參考 Currying and Python, a practical example,裏面有點複雜,其實只要看 curry 類別的部份,下面就是直接摘錄出來的實例:[python]class curry:
def __init__(self, fun, *args, **kwargs):
self.fun = fun
self.pending = args[:]
self.kwargs = kwargs.copy()
def __call__(self, *args, **kwargs):
if kwargs and self.kwargs:
kw = self.kwargs.copy()
kw.update(kwargs)
else:
kw = kwargs or self.kwargs
return self.fun(*(self.pending + args), **kw)
def func( a, b, c ):
print( a, b, c )
return (a+b+c)
func1 = curry( func, 1, 100 )
func2 = curry( func, 2 )
print( func1( 200 ), func2( 300, 400 ) )
[/python]
原理就是利用類別的特殊方法 __call__ ,呼叫 func2=curry( func, 2 ) 時,實際上是得到 curry 類別的實體。curry 類別的 __init__ 裡去做參數的判斷跟預存,等到把 func2 當函數執行時,就會執行到 __call__,這裡再去呼叫真正的函數。

pixnetalbummaker(3)

承蒙jnlingslin二位pixnet開發者的幫忙,現在連後端都不用刻了,只要搞定前台的javascript就可以去PIXNET album撈圖。就用jQuery.getScript()與PIXNET API 吐jsonp就可以達成。
然後也參考這篇Asynchronous Image Loading with jQuery,為圖片加上了動態載入的效果。目前比較傷腦筋的問題就排版問題,發生的情況有以下幾個:一個是當圖寬高值過大時,一個是當圖片數目過多時。這再想辦法好了。
之後可能會來看OAuth吧,看可不可以自動去 PIXNET blog 、blogger、facebook 貼文,就不用手動複製然後貼上了。
對了,網址是http://pixnetalbummaker.appspot.com

jsonp

前兩年有使用過,可是最近想起來時,卻發現什麼記憶都不剩,只記得好像是解決 cross domain 的方案。上網找了一下,終於讓我給想起來了,下面用我懂的話來寫,這樣下次又忘記時,可以很快想起來。
在利用 xmlhttp(或form) post/get 時,目標的網址(action)跟目前網頁的網址必須是在同一個網域上,否則會無法post/get。該怎麼解決呢?就要利用所謂的 jsonp。jsonp 是利用動態安插 script tag 的方式來繞過 cross domain 的限制,script tag 裡的 src 不受 cross domain 的限制,一般來說,src 裡的網址會多加一個參數 callback (當然,不一定要叫作callback),也就是說,後端收到這個 request 時,會去進行處理(一般會處理為json資料),最後輸出時,會輸出 javascript ,並且將 json 資料傳入你指定的 callback並執行,這樣就完成了。
本來以為 PIXNET API 可以直接利用 jsonp,就不需要另外刻後台來拉資料,結果今天去看時,發現沒有,大概是之前眼花了吧…