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來安裝。

電影流水帳(2011/10/8~2011/11/8)

  • Transformers: Dark of the moon(IMDB, Wikipedia),中譯:變形金剛3。故事很簡單,但加入了感情衝突的片段,一個是背叛,一個是嫉妒。背叛,是Autobot的前任領袖,原來很早以前他駕船逃出Cybertronian,是因為已經跟Decepticons談好條件,所以帶著Pillars飛走,可是卻墜落在月球的背面。之後,Decepticons故意讓Optimus Prime知道這個消息,讓他去把Sentinel Prime救回來。想不到Sentinel Prime被救回之後,搶走Pillars,打算把Cybertronian移動到地球,把地球人當作奴隸。第二個背叛則是人類,美國總統跟國會因為Deceptions的威脅,而決議把能幫助地球人的Autobots給遣返。而嫉妒,則是Sam嫉妒他女友的上司,想不到他女友的上司家族已經跟Deceptions狼狽為奸了好幾十年了。在一堆梗都交代以後,那就是開打了。Deceptions先開始打Chicago,打的亂七八糟,這裡我是很納悶,不是說要讓地球人當奴隸嗎?怎麼還亂殺?殺完是有人可以當奴隸嗎??然後Sentinel Prime就用Pillars準備開始傳送了。假裝離去的Optimus Prime回頭跟Sam的人一起殺入Chicago,一陣亂打之後,當然Autobots就贏了,故事結束。
  • 武俠(IMDB, Wikipedia)。我覺得還蠻好看的。劉金喜一開始因為有強盜,被迫出手,但卻以偽裝的方法殺了他們。徐百九來查案,非常懷疑劉金喜,一陣試探之後,雖然金喜自白了一切,但徐百九還是覺得很擔心,後來發現他是七十二地煞的人,唐龍。這一段的試探相當好看,也很搶戲,前面的鋒頭都被他搶走了。於是徐百九回縣城找人來幫忙,好不容易跟前妻借了錢,找到人要去捉金喜,結果卻讓七十二地煞的人找上了劉金喜。惠英紅演的十三娘先出現在金喜的村子裡,大開殺戒,這段真的很莫名其妙的開始,然後莫名其妙地在十三娘掉到河裡結束。徐百九帶著人到了村子,發現村子被打的亂七八糟,村民也逃難去了,而他帶的人,也因為不想淌渾水,而想走避。然後他遇到金喜,他的仁慈之心又出現,決定幫金喜,所以他用針灸幫金喜假死,但只能假死15分鐘。在出村子的時候,遇到了七十二地煞,七十二地煞的領頭確定金喜死了,領著人唱悲歌。唱悲歌唱太久了,徐百九趕緊救人,金喜醒來,發現四周都是七十二地煞的人,他坐起身開始笑,他知道失敗了。然後他趁勢抽了七十二地煞領頭的刀,把自己的手砍斷,說明自己脫離七十二地煞的決心。七十二地煞知道他的決心以後,告訴他,你還有一關,是教主,他在你家裡。於是最後的大魔王出現了,他挾持著金喜的兒子跟妻子,在哈拉一陣以後,教主不肯放他走,說要一人換一人,想把小兒子帶走。金喜為了救妻兒而展開拼博,可是教主非常厲害,一身橫練的金鐘罩,刀槍不入,再加上拳勁驚人,斷了左手的金喜根本沒勝算。最後在徐百九跟老天的幫助下,終於把教主給殺了,可是徐百九也受了嚴重的內傷死去。徐百九看著即將死去的徐百九那一幕,有點像是死神的精準度裡的情節。金喜活了下來,成功地擺脫了唐龍的身份,繼續跟妻兒過著平淡的日子。

ANativeWindow::query = query

在FramebufferNativeWindow.cpp裡看到這樣的用法:ANativeWindow::query = query; 回頭看ANativeWindow的定義,query是一個函式指標,那照理來說應該不能這樣指定,應該要在ANativeWindow實體化以後才可以。好吧,我搞迷糊了。

重新追蹤代碼:

  • query 是一個在 FramebufferNativeWindow 裡的 static function
  • FramebufferNativeWindow其實繼承了ANativeWindow,所以在FramebufferNativeWindow裡使用ANativeWindow::query,就是指定父類別的query。

就這兩點看下來,可以使用ANativeWindow::query=query這點,就不會覺得奇怪了。

UEFI secure boot impact on Linux閱讀小記

文章:Red Hat, The Linux Foundation and Canonical Publish White Paper on Unified Extensible Firmware Interface的最後有個連結,點選以後可以下載一份PDF文件,標題是UEFI secure boot impact on Linux。文件的前面很仔細的分析了UEFI的種種好處跟壞處,然後分析了對Linux的影響。我有大略看過一遍,最主要的問題都是在於key,UEFI開機時會拿key去驗證bootloader,如果驗證失敗,就不再繼續開機。可是對Linux來說,不可能針對每個OEM製造的機器去簽署bootloader啊,因為這樣會要做很多份bootloader,太麻煩。如果要改那個key的話,又沒辦法。中間後段的時候還有提到一些有的沒的,我偷懶跳過去了,直接看最後的結論。最後就提出幾點建議:

  • 建議OEM可以提供很方便可以開關secure boot的介面
  • 建議OEM(在BIOS廠商的協助下)可以在系統軔體裡提供標準機制去設置key
  • 建議以setup模式賣出,讓作業系統去負責安裝初始key的動作

BaseHTTPServer

模組的文件簡單到不行,而網路上查到的文件大多都是跟你講怎麼弄一個簡單的HTTP Server,真的要寫一個簡單的應用時,卻沒告訴你該怎麼去parse參數。這篇有答案:PyMOTW: BaseHTTPServer

基本上,do_GET時,要用 parsed_path = urlparse.urlparse(self.path) 。而 do_POST 時,要[python]form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={‘REQUEST_METHOD’:’POST’,
‘CONTENT_TYPE’:self.headers[‘Content-Type’],
})
[/python]拿到的 form,可以用 form[“your_key”] 去找到指定參數的值,但拿到的值,型態是MiniFieldStorage,要用 value 屬性去拿真正的值,也就是 form[“your_key”].value 才是真正的值,該文裡也有上傳檔案處理的範例。

twisted筆記

原本想用deferred搭subprocess去做的,想不到twisted已經有包這部份了,就呼叫reactor.spawnProcess就好,文件可以看Twisted Documentation: Using Processes。主要要實作ProcessProtocol,這可以用來知道process狀態,或是拿process輸出做處理…等等的。

作HTTP Server時,會要實作twisted.web.resource.Resource,render_GET裡的request可以參考twisted.web.http.Request : API documentation,引用參數,可以用args屬性,這是一個dictionary。除了render_GET,當然也可以用render_POST、request_HEAD…

Tail call

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

Mining the Social Web – Example 1-3

實作這個範例時,出現錯誤:TwitterHTTPError: Twitter sent status 404 for URL: trends.json using parameters: ()

有人回報給作者:Example 1-3 fails with 404 errors,也有人去 StackOverflow 上問:Problem with Twitter package by sixohsix,可是都沒有解決問題的答案。

答案在twitter API -GET trends上:因為deprecated了。要改用GET trends/:woeid,也就是像這樣的網址 http://api.twitter.com/1/trends/1.json 才可以取得。

換言之,程式要改為:
[python]import twitter
t=twitter.Twitter(api_version=’1′)
t.trends(id=1)
[/python]