會自殺的類別

坦白說,我從沒想過物件可以自殺這件事情。當我看到這樣寫的時候,實在是很令我驚訝…實驗的結果,還真的是可以。

#include 
class SuicideSample {
public:
SuicideSample() { std::cout << "ctor." << std::endl; }
~SuicideSample() { std::cout << "dtor." << std::endl; }
void DoIt( void ) {
delete this;
}
};
int main( int argc, char* argv[] )
{
SuicideSample* obj=new SuicideSample();
obj->DoIt();
// of course, object can kill itself, but if you try to kill it again
// program will crash.
//delete obj;
return 0;
}

電影流水帳(2009/8/14~2009/8/24)

為什麼家裡裝了 CentOS 的 Server 的 CD-ROM 會莫名其妙地 eject 出來?是因為太熱導致 CD-ROM 短路而自動 eject 嗎?完全找不到原因,看來過幾天要來拔電源線,一方面是避免莫名其妙地 eject,一方面是避免二位公子去亂搞。

  • Blood: The Last Vampire(IMDB, Wikipedia),中譯:血戰:最後的吸血鬼。聽了J同事的說明,才知道這部片子是由漫畫改編的,2000年的時候還有出動畫的版本。劇情的主軸是個復仇的故事,女主角是翼手(類似吸血鬼的生物)跟人類的混血兒,由於翼手將他的父親殺害了,所以她決心報仇,故事的最後,她發現自己要殺的人居然是他的母親。真人演出的這部,坦白說,讓女主角以人類身份將自己母親殺害的理由有點薄弱,而且,她的母親也被殺的太快了,最後,Alice 看起來也應該是會被關到精神病院的,卻在莫名其妙的審問狀態下結束。雖然沒看過動畫或是漫畫,不過我想動畫版或漫畫應該會比較好看吧~
  • Terminator Salvation(IMDB, Wikipedia),中譯:魔鬼終結者-未來救贖。開始一個新的故事架構是正確的,不過誠如朱學恆大大所說,設定實在有些不太合理啊~The matrix 裡,人類都在地底活動,這我可以理解,那是電腦故意放水,但是 Terminator 前三集不是說,人類都被打趴嗎?怎麼會有空軍還能跟機器周旋?這實在是有點奇妙啊~算了,總之看起來應該是會有第五集,希望是可以說明的更清楚一些,這一集普普通通。
  • Ice Age: Dawn of the dinosaurs(IMDB, Wikipedia),中譯:冰原歷險記3恐龍現身。故事借用了地心理論,讓恐龍繼續存活在地底,相當的不錯。個人覺得這個續集的笑點不錯,我很喜歡Buck、Crash跟Eddie這三個瘋狂的傢伙,特別是他們要經過充滿笑氣的峽谷那段,讓我不自覺地笑了好幾次~這部片子是不難看的續集電影。

Python 練習 – 將 Bing 的每日桌面圖像變成 GNOME 桌面

上星期看到這篇:如何将Bing的每日桌面图像变成我的Windows 7桌面,就順手試試看改用 Python 來作,執行這個 script 以後,會自動拿 bing 的圖片來作為你 GNOME 的桌面背景圖片。
目前只有一個小問題,就是 xml.dom.minidom 有時候會因為 & 的關係導致解析失敗。

#!/usr/bin/env python
import random
import os.path
import subprocess
import urllib2
import xml.dom.minidom
from xml.dom.minidom import Node
def get_xml():
response = urllib2.urlopen('http://feeds.feedburner.com/bingimages')
xml = response.read()
return xml
def parse_and_get_first_image_uri( xml_str ):
if xml_str=="":
return ""
doc=xml.dom.minidom.parseString( xml_str )
urls=[]
for node in doc.getElementsByTagName("enclosure"):
urls.append( node.getAttribute("url") )
index=random.randint( 0, len(urls)-1 )
if len(urls)>0:
return urls[ index ]
else:
return ""
def get_uri( uri, output ):
response = urllib2.urlopen( uri )
image_file=open( output, 'w' )
image_file.write( response.read() )
image_file.close()
return
def set_wallpaper( filename ):
args=[]
args.append( 'gconftool-2' )
args.append( '/desktop/gnome/background/picture_filename' )
args.append( '--set' )
args.append( filename )
args.append( '--type=string' )
subprocess.call( args )
uri=parse_and_get_first_image_uri( get_xml() )
tmp_dir = os.path.join( *(os.path.expanduser("~"), "tmp") )
if uri!="":
if not os.path.exists( tmp_dir ):
os.mkdir( tmp_dir )
filename, extname = os.path.splitext( os.path.basename( uri ) )
image_filename=os.path.join( *( tmp_dir, "bing" + extname ) )
get_uri( uri, image_filename )
set_wallpaper( image_filename )
else:
print "get nothing."

電影流水帳(2009/7/29~2009/8/3)

趁著家庭休憩日,把蘋果核戰記以及續集看完了,很讚的電影。看完以後把昨天去 IKEA 買的書櫃組合起來,這次組的很成功,超有成就感的,當然也很佩服 IKEA 的貼心設計,讓組裝變得簡單許多。

  • Watchmen(IMDB, Wikipedia),中譯:守護者。這片超級對我胃口的,我很喜歡這部電影。跟超人特攻隊一樣,這片其實想說的是超級英雄的內心世界。片子的最後,是英雄選擇了當大壞人,讓世界各國能因此攜手合作,完成世界和平的目標,不看到最後,絕對不知道為什麼 Ozymandias 要這麼作。裡面的演員除了演一代絲靈的Carla Gugino大姊姊我認識以外,其他人都不認識。
  • Appleseed(IMDB),中譯:蘋果核戰記。很讚的 3D 電影,跟漫畫的話風差很多,雖然有些地方交待不清,不過還是很讚。
  • Appleseed Ex Machina(IMDB, Wikipedia)。很讚的 3D 動畫,這集是吳宇森擔綱製作人,裡面很多的動作、場景都借鏡了駭客任務以及吳宇森的風格,所以動作場面就顯得很讚。

jquery 與 iframe

假設 iframe 的 id 是 f,裡面有個按鈕 id 是 btn,那麼要存取 iframe 裡的元素,可以這樣寫:
[javascript]
// http://simple.procoding.net/2008/03/21/how-to-access-iframe-in-jquery/
alert( $(‘#f’).contents().find(‘#btn’).html() );
[/javascript]
再假設父頁面裡有個 id 是 ta 的 text,iframe 裡要存取父頁面裡的元素,有兩種寫法:
[javascript]
// 方法一 (http://webdevel.blogspot.com/2007/03/iframes-and-jquery-working-with-iframes.html)
alert( parent.$(“#ta”).val() );
// 方法二 (http://groups.google.com/group/jquery-en/browse_thread/thread/5997ef4a60a123af?pli=1)
alert( $(“#ta”, parent.document.body).val() );
[/javascript]
不過,在碰到 cross domain 的情況時,就會行不通了。拜 Google 大神 的時候,大神有提到一些,但我嫌麻煩就沒再去試了…

參考資料:

電影流水帳(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/"