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 可用。

Skia and framebuffer

根據 Jserv 大的淺談 Google Skia 圖形處理引擎,得知 skia 只能畫在 Memory buffer 上,那麼,可以直接畫在 Framebuffer 上嗎??

Jserv 大文章裡的例子,SkBitmap 得先呼叫 allocPixels() 來配置所需要的 Memory buffer,根據 SkBitmap.h 裡的宣告,allocPixels 事實上是使用 allocator 來配置所需要的 Memory buffer,如果未指定,會以 stdalloc(HeapAllocator) 來進行配置。因此如果要直接使用 framebuffer,可以繼承 SkBitmap::Allocator 類別之後,改寫 allocPixelRef() 來達到目的。

大致的代碼就像這樣子:[c]
#include “SkTypes.h”
#include “SkRefCnt.h”
#include “SkBitmap.h”
#include “SkDevice.h”
#include “SkPaint.h”
#include “SkRect.h”
#include “SkMallocPixelRef.h”
class FrameBufferAllocator: public SkBitmap::Allocator
{
public:
FrameBufferAllocator();
virtual ~FrameBufferAllocator();
virtual bool allocPixelRef(SkBitmap*, SkColorTable*);
private:
char* m_addr;
int fd;
};
FrameBufferAllocator::FrameBufferAllocator()
{
}
FrameBufferAllocator::~FrameBufferAllocator()
{
// munmap framebuffer pointer.
// close the framebuffer device we opened
}
bool FrameBufferAllocator::allocPixelRef(SkBitmap* dst, SkColorTable* ctable)
{
size_t size = dst->getSize();
// open framebuffer
fd = open( “/dev/fb0”, O_RDWR );
// setup framebuffer device via ioctl.
// mmap framebuffer
m_addr = (char *)mmap(0, screensize, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
// call original procedures in HeapAllocator::
dst->setPixelRef(new SkMallocPixelRef(m_addr, size, ctable))->unref();
dst->lockPixels();
return true;
}
[/c]

接著,Jserv 大的範例只要修改一行:[c]
bitmap.allocPixels( new FrameBufferAllocator, NULL );
[/c]
就可以順利運作了。

p.s. 在 link libskia.a 時,遇到很鳥的狀況,skia 的 Makefile 在製作時,是直接以帶有路徑的 .o 去作,而我 toolchain 的 gcc 居然無法處理,必須要以沒有路徑的 .o 去重新製作,這樣才能 link 成功。

石碇

106縣道往平溪方向,在石碇的地方叉出106乙,下面這幾張照片就是在這個三叉口的路邊拍的。照片不是很清楚,這是因為我沒帶數位相機,所以只能拿手機湊合著用。
20090626-石碇-0120090626-石碇-0220090626-石碇-03

電影流水帳(2009/6/24~2009/6/27)

聽海角七號原聲帶之後才看電影,然後才明白為什麼原聲帶裡有這些曲目,這樣也挺有趣的。

  • Star Trek(IMDB, Wikipedia),中譯:星際爭霸戰。之前看到中譯片名時,我還聯想不到這是星艦系列的片子。看完這部片以後,我開始有點痛恨時空因果律了,因為我開始搞不清楚因果關係,最後甚至老Spock跟年輕的Spock也碰面了,這是怎樣??
  • 海角七號(IMDB, Wikipedia)。終於把去年的熱門片看完了,看到最後暖場時,真的有熱血的感覺出來。不過為什麼,看完以後我腦海裡只記得李佩甄露出好身材的那幾個片段??在網路找IMDB檔案時,赫然發現片名是以台語發音-Hái-kak chhit-ho,有趣。
  • Paul Blart: Mall Cop(IMDB, Wikipedia),中譯:百貨戰警。我想這是我第一次看到Segway亂跑的畫面,這部片裡,是拿來當作賣場警衛的代步工具,真的很酷。除此之外,這部片子很普通…很普通…很普通…簡單說就是一個胖子警衛靠著喜歡某人的熱情而單槍匹馬解決掉賣場危機。
  • Zack and Miri Make a Porno(IMDB, Wikipedia),中譯:淫幕初體驗。這是我第一次挑戰完全沒有字幕的電影,老實說,片裡的對話我了解不到四成吧,所以有些笑點,就不是那麼的了解。這是一部浪漫喜劇,最後也是男女主角大和解的結局。