電影流水帳(2009/7/20~2009/7/28)

看片速度變慢了,這幾天要在晚上抽空看 Apple Seed,這片 3D 超細膩的,跟漫畫比起來真的差很多,希望可以如願完成看片計畫。

  • Night at the Museum: Battle of the Smithsonian(IMDB, Wikipedia),中譯:博物館驚魂夜2。這一次,主角已經是公司老闆了,不過他不是很快樂,所以主題就是要作自己快樂的事情。飾演Amelia EarhartAmy Adams比較吸引我目光,而且很面熟,原來她之前演過Enchanted (2007),這就難怪面熟了。
  • 河童のクゥと夏休み(Wikipedia),中譯:河童之夏。河童因為地震被封起來而穿越時空來到現代,遇到了人類所發生的事,很溫馨。原本以為後面會來個超級催淚彈的,後來幸好只是小催淚彈,最後當然是快樂的 happy ending,超適合小朋友看。

在 Ubuntu 9.04 使用 svk 出現 Can’t locate Time/Progress.pm

在公司正想用 svk 把 monodevelop source code 拉回來時,發現有 Can’t locate Time/Progress.pm 訊息,然後就停止運行了。
Launchpad 找了一下,發現已經有人回報了:Bug #317487 in svk (Ubuntu): “2.2.1 needs Time::Progress”,後續的回覆裡,也提供了好幾個 workaround,我選擇直接修改 Notify.pm,因為以後 apt-get upgrade 時,新檔案會把舊檔案覆蓋掉。

python twisted sendmail

buildbot 是用 twisted library 裡的 sendmail 寄信的,方法如下:

from email.Message import Message
from twisted.mail.smtp import sendmail
from twisted.internet import defer
from twisted.internet import reactor
m = Message()
m.set_payload("Hello world!!")
m['To']="someone@somewhere.com"
m['Subject'] = "Test"
m['From'] = "my@somewhere.com"
s = m.as_string()
done = sendmail( "mailserver", "my@somewhere.com", [ "someone@somewhere.com" ], s)
done.addCallback(lambda ignored: reactor.stop())
reactor.run()

但現在大多的 mail server 都需要先認證,這時候就得改用 ESMTPSenderFactory 來改寫了(可參考Twisted mail smtp API),mailing list 裡正好有人貼出程式

from twisted.mail import smtp
from twisted.internet import reactor
from twisted.internet import defer
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
def sendmail_auth(smtphost, user, password,
from_addr, to_addrs, msg, senderDomainName=None, port=25):
if not hasattr(msg,'read'):
msg = StringIO(str(msg))
d = defer.Deferred()
factory = smtp.ESMTPSenderFactory(user, password, from_addr, to_addrs, msg, d,
requireTransportSecurity=False)
if senderDomainName is not None:
factory.domain = senderDomainName
reactor.connectTCP(smtphost, port, factory)
return d

再套前面的例子,只要改動 sendmail 為 sendmail_auth 就行了:程式

done = sendmail_auth( "mailserver", "your_username", "your_password", "my@somewhere.com", [ "someone@somewhere.com" ], s)

WebDev.WebServer.exe

朋友傳給我幾個 ASP.Net 網頁,是用 3.0/3.5 寫的,懶得用 VWD 2008 開起來看,所以就偷懶用 WebDev.WebServer.exe 來跑,可是卻無法跑起來,會有找不到 System.Linq 的錯誤。原本以為 3.0/3.5 有另一個 WebDev.WebServer.exe,但卻遍尋不著,最後還是用 VWD 2008 開了,當然也能正常執行了。不過我就好奇了,所以用 ProcessExplorer 查了一下,發現我沒錯,的確是用 WebDev.WebServer.exe 執行。再仔細想了一下,才想到,可能是 web.config 裡有鬼,朋友傳給我的檔案裡沒有 web.config,直接執行 WebDev.WebServer.exe ,會使用 .Net 2.0 預設的 web.config。但用 VWD 2008 開過以後,補上了 web.config,裡面有這麼幾行:

<system.web>
<assemblies>
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>
</system.web>

一切真相大白,原來是補上了 3.0/3.5 所需的 Assembly,讓 WebDev.WebServer.exe 在跑 3.0/3.5 的 ASP.Net 網頁時沒有問題。

buildbot

Ubuntu上安裝Buildbot是很簡單的事情:sudo apt-get install buildbot。

比較麻煩的是設定,大致瀏覽了一下 Manual,還是不知道怎麼設定,轉而找 Google 大神,Mousebender 的這篇Installing buildbot,就很簡單易懂。但由於這篇提供的設定是 2006 年的,現在的設定稍稍有改變,c[‘bots’] 必須修正為 c[‘slaves’],後面會提到。

依據 ArchitectureBuildbot必須要有 master 跟 slave,master 負責提供 web 介面跟叫 slave 做事,而 slave 就只聽命令做事,所以設定的時候就要分別設定 master 跟 slave。

master 的設定,得先使用 buildbot create-master [目錄名] 來建立,這會幫你建立一個目錄,並提供你設定檔的範本(master.cfg.sample)。第一步就是要把 master.cfg.sample 改為 master.cfg,然後修改 master.cfg。要調整的基本上有這幾個:

  • c[‘schedulers’],要排程的時間。
  • f1.addStep(),這決定怎麼編譯。
  • c[‘slaves’]、c[‘slavePortnum’],slave的名稱、密碼以及要 listen 的 port,待會建立 slave 時會用到。
  • c[‘projectName’],你專案的名稱。
  • c[‘projectURL’],你專案的網址。

接著要建立 slave,這邊用 master.cfg.sample 來舉例,也就是假設你剛剛沒改 c[‘slaves’]、c[‘slavePortnum’] 的內容,所以這邊用 buildbot create-slave [目錄名] localhost:9989 bot1name bot1passwd 來建立 slave,接著把 slave 目錄下的 Makefile.sample 改為 Makefile 即可。

啟動的時候,要先啟動 slave 再啟動 master,啟動的指令都是 buildbot start [目錄名],例如 buildbot start myproject-master、buildbot start myproject-slave。

這樣就大功告成,你可以打開 http://localhost:8010 來看 build 的進度了。

下面是我的設定檔:

# -*- python -*-
c = BuildmasterConfig = {}
####### BUILDSLAVES
from buildbot.buildslave import BuildSlave
c['slaves'] = [BuildSlave("myproject-slave", "password", max_builds=1)]
c['slavePortnum'] = 9989
####### CHANGESOURCES
from buildbot.changes.pb import PBChangeSource
c['change_source'] = PBChangeSource()
####### SCHEDULERS
from buildbot.scheduler import Scheduler, Periodic
c['schedulers'] = [
Periodic("every_12_hours", ["buildbot-full"], 12*60*60 )
]
####### BUILDERS
from buildbot.process import factory
from buildbot.steps.source import CVS
from buildbot.steps.shell import Compile, ShellCommand
from buildbot.steps.python_twisted import Trial
f1 = factory.BuildFactory()
f1.addStep(ShellCommand(command=["/home/user1/build/build.sh"]))
f1.addStep(Compile())
b1 = {'name': "buildbot-full",
'slavename': 'myproject-slave',
'builddir': "full",
'factory': f1,
}
c['builders'] = [b1]
####### STATUS TARGETS
c['status'] = []
from buildbot.status import html
c['status'].append(html.WebStatus(http_port=8010))
####### PROJECT IDENTITY
c['projectName'] = "myproject"
c['projectURL'] = "http://myproject-server"
c['buildbotURL'] = "http://localhost:8010/"

無法移除的 Powershell v1.0

如果你也跟我一樣,因為要安裝 Powershell v2.0 而無法移除 Powershell v1.0 的話,可以研讀 Powershell team 貼的這篇:Windows PowerShell Blog : Behind PowerShell Installer (for Windows XP / Windows Server 2003):,了解一下 Powershell 安裝程式做了什麼。不過這篇字太多了,我其實是參考這篇:BUGBUG: poor title » Blog Archive » How to uninstall Powershell v1.0 from Windows Server 2003 R2 來移除的,除了 pwrshsip.dll 無法刪掉之外,基本上不刪掉也沒關係。接著就可以上 Powershell v2.0 CTP3 了。
為什麼要上 Powershell v2.0 CTP3 呢?這是因為 SQL Server 2008 Management Studio Express 的緣故。真是太機車了…

電影流水帳(2009/7/17~2009/7/19)

妹妹的朋友借了她 Apple Seed DVD,她看完了,現在換我看,我得在一個月內把它看完。前兩天有趁機看了一點,畫面真的很精彩,跟漫畫比起來真的是差很多,不愧是整個 3D 重新作過。看起來的感覺跟攻殼機動隊很相似。

  • Angels and Demons(IMDB, Wikipedia),中譯:天使與魔鬼。坦白說,劇情有點瞎,所謂的推理其實也不是很吸引人,不過最後的壞人倒是很出人意料之外,雖然我之前有看過別人寫的劇情,但是一直到後面,我還以為是那個侍衛長,沒想到最後真的是Ewan McGregor飾演的 Camerlengo Patrick McKenna。
  • The Game Plan(IMDB, Wikipedia),中譯:超級盃奶爸。劇情頗溫馨的片子,隨便看看就好,反正結局一定是溫馨的…

電影流水帳(2009/6/28~2009/7/16)

看了兩部小沈重的片子。話說當我看完 Crossing over 時,我真的已經忘了我之前看過Body of lies,還好我看之前都會貼一下 IMDB 的連結在 噗浪 上,這樣靠著回頭撈,才想起來。真的是糟,或許也是最近忙的關係吧。

  • Body of lies(IMDB, Wikipedia),中譯:謊言對決。這是一部諷刺美國中東策略的電影,有點沈重的片。最後以主角不幹了作為結局,不過這並沒有解決什麼,只是讓主角能脫離諜報生活而已。
  • Crossing over(IMDB, Wikipedia),中譯:越界驅逐令/穿越國境。這部片也是小沈重,主要探討移民問題。電影其實是好幾段故事,每段故事娓娓道出每個主角自身的遭遇,卻又巧妙地扣住另一位主角,這樣的說故事方法,我還蠻喜歡的。最後的最後沒有所謂的結局,只是把每個主角的遭遇做了交代。

Ubiquity 0.5 + findbook

Ubiquity 升級到 0.5 了,Parser API 也升級到了 2,語法有改變,所以參考轉換指南修正了一下之前的 findbook:

CmdUtils.CreateCommand({
names: ["findbook"],
contributors: ["elleryq"],
license: "MPL",
description: "讓買書變成更簡單的決定!",
arguments: [ {role: 'object', nountype: noun_arb_text, label: '書名關鍵字'} ],
icon: "http://findbook.tw/favicon.ico",
execute: function(args) {
Utils.openUrlInBrowser( "http://findbook.tw/search?keyword_type=keyword&q=" + encodeURIComponent(args.object.text) );
}
});

如果你想入門的話,這份文件可以作為參考:Labs/Ubiquity/Ubiquity Source Tip Author Tutorial
另外,在Ubiquity Command Editor頁面裡也有 command APIs,告訴你有哪些 API 可用。