資訊相關Idea與筆記分類文章 顯示方式:簡文 | 列表

September 8,2009

quilt

今天終於試用了 quilt,這是一個可以管理 patch 的工具,最早由 Andrew Morton 的一些 script 而來。 專案本來就有寫一些 script 來作 apply 的工作,只是,在想要倒回去或向前的時候,會變得非常麻煩!用 quilt 的話,可以方便的向前或向後。 因為已經有 patch 了,所以施作的方法很簡單,先 import,再 push。
quilt import patch01
quilt push
quilt import patch02
quilt push
之後就可以用 pop 往回推,或用 push 繼續往前了。 小記:坦白說,本來想放棄直接用 git 來作的...因為剛好在看 ProGit,覺得 git 或許會更適用也不一定,不過只是想簡單地往前或往後測試 patch,用 quilt 應該就夠了。 參考資料:

Posted by elleryq at 樂多Roodo!16:47回應(0)引用(0)
標籤:linux,scm

September 2,2009

Python 練習 - 抓書

早上用了大概兩個小時搞這個,這是用來抓的,除了抓以外,還直接把 script 、廣告...等都清掉,只留下書的內容。用法很簡單,執行這個 script,參數帶上那本書的網址就行了。

程式碼怎麼排都不行,所以丟到這裡了。


Posted by elleryq at 樂多Roodo!16:48回應(0)引用(0)
標籤:python

August 17,2009

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."

Posted by elleryq at 樂多Roodo!19:08回應(0)引用(0)
標籤:linux,python

August 4,2009

jquery 與 iframe

假設 iframe 的 id 是 f,裡面有個按鈕 id 是 btn,那麼要存取 iframe 裡的元素,可以這樣寫:
  // http://simple.procoding.net/2008/03/21/how-to-access-iframe-in-jquery/
  alert( $('#f').contents().find('#btn').html() );
再假設父頁面裡有個 id 是 ta 的 text,iframe 裡要存取父頁面裡的元素,有兩種寫法:
  // 方法一 (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() );
不過,在碰到 cross domain 的情況時,就會行不通了。拜 Google 大神 的時候,大神有提到一些,但我嫌麻煩就沒再去試了...
參考資料:

Posted by elleryq at 樂多Roodo!16:40回應(0)引用(0)
標籤:jquery,javascript,iframe

July 28,2009

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)

Posted by elleryq at 樂多Roodo!15:13回應(0)引用(0)
標籤:python

July 24,2009

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/"

Posted by elleryq at 樂多Roodo!15:58回應(5)引用(0)
標籤:c,c++,note,python

July 20,2009

無法移除的 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 的緣故。真是太機車了...

Posted by elleryq at 樂多Roodo!1:04回應(0)引用(0)
標籤:powershell

July 11,2009

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

Posted by elleryq at 樂多Roodo!0:09回應(0)引用(0)
標籤:javascript,firefox

June 18,2009

cvs diff with meld

公司還在用 CVS,Windows 下有 wincvs 這個方便的軟體,Linux 下,我還是習慣用 console 介面,console 介面下,很多事情就要自己來了。

wincvs 可以選用自訂的軟體來比對。但在 console 下,只能用 cvs diff,cvs diff 的話,只會列出 diff 的結果,沒辦法以視覺化的方式呈現比對結果。

所以只好刻一個,簡單的說就是利用 cvs update -p -r(revision) 將結果輸出到暫存檔,再用 meld 來比對這暫存檔與目前檔案:
#!/bin/bash
# author: elleryq
# version: 0.1
# distro: ubuntu
# dependency: cvsnt

if [ ! -e $1 ]; then
    echo "$1 is not existed, run 'cvs update $1' first!"
    exit -1
fi

[ -z $DIFF ] && DIFF=meld
 
function usage() {
    prog=`basename $0`
    echo "Usage:"
    echo "    $prog filename revision"
    exit 0
}
 
[ -z $1 ] && usage
if [ -z $2 ]; then
    revision=`cvs log $1 | grep head | awk '{print $2;}'`
else
    revision=$2
fi

tmpfile=/tmp/$1.$revision
cvs update -r $revision -p $1 > $tmpfile
$DIFF $tmpfile $1
rm -f $tmpfile
 
exit 0
你可以自訂 diff 軟體,只要設置好 DIFF 這個環境變數即可,預設是 meld

Posted by elleryq at 樂多Roodo!0:24回應(0)引用(0)
標籤:linux,cvs,scm,diff

June 17,2009

Firefox 附加元件收藏集

最近 Mozilla 推的 Firefox 附加元件收藏集 真的是好東西。

年初趁重裝 Firefox 3.1 的時候,很有心地用 Google docs 整理了一份附加元件的清單,只是後來又安裝/移除了一些元件以後,就忘了再去維護。現在有了 Firefox 附加元件收藏集 就可以方便地管理自己的附加元件了。另外,也可以訂閱別人的收藏集,來找到適合自己的附加元件,這個收藏集的功能實在是很感心啦~

這是目前我的收藏集:elleryq's collection,也就是我公司 Firefox 有裝的附加元件,居然也不知不覺地裝了 35 個...XD...

Posted by elleryq at 樂多Roodo!3:31回應(0)引用(0)
標籤:note,browser,firefox,mozilla
 [1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]  [9]  [10]  [下10頁]  [最終頁]