IronPython(2) – 使用 rsstoolkit

世界上總是有許多人願意提供他們的心血,我們只需要站在他們的肩膀上,就可以快速的發展出我們自己的東西來。
ASP.NET RSS Toolkit 是一個存取 RSS 的 library,其他相關的 Library 還有 RSS.Net,但是目前RSS.Net還沒有釋出 for .Net 2.0 的版本,所以我們選用 ASP.NET RSS Toolkit
首先下載並解開作者所提供的壓縮檔案,將 bin 目錄下的 RssToolKit.dll 複製到 IronPython 目錄下的 lib,以方便 IronPython 取用。
執行 IronPython,要在 IronPython 使用別人寫好的 library(Assembly),有兩個步驟,首先要載入 library,然後再 import 裡面的類別。

import clr
clr.AddReferenceToFile(“RssToolkit.dll”)
from RssToolkit import *

話說回來 ASP.NET RSS Toolkit的說明文件真的是可以用 Poor 來形容,裡面附的一份 Word 文件,就僅描述如何在 Visual Studio 2005 下使用而已,完全沒提及ASP.NET RSS Toolkit裡面有什麼類別,類別又有什麼屬性… Orz…
還好ASP.NET RSS Toolkit有附原始碼,Trace 一下就能瞭解一二。
所以接下來先 initialize 變數。
Python處理變數也蠻像 BASIC 的,隨寫即用:

r = RssDataSource()

連 new 都不用寫。
RSS 的構造主要是以 Channel 為主,所以 r.Channel 就表示 Channel,r.Channel.Items 就表示 Channel 裡面的各個項目。
有了這些資訊,就可以寫出取 RSS 資訊的程式了。
可是Python的迴圈該怎麼寫呢?因為我們要取出 Items 裡的每個項目。
for…next 的寫法

for i in range(5):
print i

foreach 的寫法

for item in r.Channel.Items:
print item[“title”]

總結這些,我們就可以寫出一個取出 RSS 內各項目的程式了:

import clr
clr.AddReferenceToFile( “RssToolkit.dll” )
from RssToolkit import *
r = RssDataSource()
r.Url = “http://tw.news.yahoo.com/rss/realtime”
print r.Channel[“title”]
for item in r.Channel.Items:
print item[“title”]
print item[“link”]

下次的目標,一個簡單的視窗 + 縮小到 System tray。
參考資料:

NAnt(3) – 各個擊破

一個 solution (方案)裡面可能不只一個 project,可能會有許多個。
以前,我會寫在同一個 build 檔案裡面,可是這樣會讓 build 變得很大而且難以維護。
NAnt可以讓你在 build 檔案裡面再去呼叫另外一個 build 檔案,如此一來,我們就可以讓各 build 檔案負責自己的事情,避免都放到同一個 build 檔案裡面了。
語法很簡單,利用 nant 這個 task 就可以達成:

<nant>
  <buildfiles>
    <include name="subdir/default.build" />
  </buildfiles>
</nant>

或者是偷懶一點,讓NAnt找到目前所在目錄下所有子目錄下的 build 檔案,然後進行 build

<nant>
  <buildfiles>
    <include name="**/default.build" />
  </buildfiles>
</nant>

如果,要執行的並不是 build 這個預設 target 的話,該怎麼辦呢?
你可以為 nant task 加上 target 這個 attribute,就行了。

<nant target=”clean”>….</nant>

最後,我們達到各個擊破的目的。

IronPython(1) – 安裝與執行 script

IronPython 是一個移植到 .Net framework 之上的 Python 分支,與其他 Python 最大的不同點就是他可以直接調用 .Net framework 內的所有類別庫。
安裝前的必要條件:

官方既下載網址:

目前最新的版本是 Beta 8,下載以後的安裝非常簡單,解開以後就可以了。
點選 IronPythonConsole.exe 就可以執行。
還記得以前的 BASIC 嗎?(我想大概很少人知道這種古早又親切的語言了)
你可以試著輸入

print “Hello world!”

或是

print 1+2

就可以快速看到你指令的輸出結果。
接著我們試試看執行官方提供的範例:

execfile( “tutorial/wfdemo.py” )

畫面會帶出一個視窗,你可以試試看在上面以滑鼠隨意點選一點,視窗會出現 “Hello” 的字樣。
讓我們將視窗關閉,按下 ctrl+z 離開 PythonConsole。
學習需要目標,我想試著用 IronPython 重寫 RSSMSN
甚至以後再用 Python + PyGTK(或 wxWidget) 來重寫看看。
明天的目標,讀取 RSS。
其他可以參考的資料:

MSN bot – Smart Child

Encarta (encarta at conversagent.com)是微軟提供的一個 MSN bot ,你可以與他聊天打屁,我常常沒事就會跟他聊天練英文,他老是從Encyclopedia.com撈一堆答案給我。
今天下午寫程式之餘,感覺無聊,就問了一堆人關於現在的天氣。
是的,我也跟這個 bot 聊天了。
結果他說他不知道關於天氣的事情,然後跟我說可以去問另外一個 bot – SmartChild (smarterchild at hotmail.com)。
於是我就把 SmartChild 加入了聯絡人清單,開始跟他哈啦。
一開始他會問你一些問題,結束以後,就可以問他問題了。
以下就是我跟他的無聊對話:

mimi: 暴走程式、午後雷雨、好喝自製冷泡茶 說:
what’s the weather?
– SmarterChild – 說:
For what city, state, country or zip code do you want the weather?
mimi: 暴走程式、午後雷雨、好喝自製冷泡茶 說:
taipei
– SmarterChild – 說:
I know several places called Taipei or containing towns called Taipei. Which do you mean?
1 Taipei, Taiwan
2 Taipei/Sungshan, Taiwan
mimi: 暴走程式、午後雷雨、好喝自製冷泡茶 說:
1
– SmarterChild – 說:
Current weather conditions for Taipei, Taiwan:
Currently: 81 F
Condition: Clear
Heat Index: 86 F
Dewpoint: 73
Humidity: 79 %
Visibility: 6.21 mi
Wind: N/2 mph
To get the forecast for Taipei, Taiwan, just type “forecast.”

他還有蠻多服務的,有興趣的人不妨玩玩看。

Grep in vim

怎麼直接在 vim 裡面直接去 grep 檔案呢?
答案在這裡:grep.vim – Grep search tools integration with Vim
安裝步驟很簡單,下載以後,把 grep.vim 丟到 $HOME/.vim/plugins (Windows 就是 c:\documents and settings\your_name\vimfiles\plugins)。
接著就是設定啦,打開你的 $HOME/.vimrc (Windows 是 c:\documents and settings\your_name\_vimrc ),加入下面設定,主要是告訴 grep.vim grep 與 find 的路徑。因為我是用Native Win32 ports of some GNU utilities,又安裝在 c:\tools,所以就是:

let Grep_Path=’C:\tools\UnxUtils\usr\local\wbin\grep.exe’
let Grep_Find_Path=’C:\tools\UnxUtils\usr\local\wbin\find.exe’
let Grep_Xargs_Path=’C:\tools\UnxUtils\usr\local\wbin\xargs.exe’
let Grep_Skip_Dirs=’CVS’
let Grep_Default_Options=’-ir’
let Grep_Cygwin_Find=0
let Grep_Null_Device=’NUL’
let Grep_Shell_Quote_Char=””

完成這些步驟之後,重新打開vim,就可以用 :Grep your_pattern 來進行搜尋了。
搜尋的結果,vim會切割出另外一個 Windows 來顯示(通常在下面),你可以切換到該視窗(ctrl+w j),直接瀏覽搜尋結果,如果確定該行是你要的結果,也可以直接按下 Enter,vim 就會自動打開那個檔案並移到該行去。
這比你利用 console 去 grep,再手動切回 vim 來開檔要快多了。
如果要關閉搜尋結果,輸入 :cclose 就可以關閉。
:copen 是打開搜尋結果。
:colder 是切換到上一個搜尋結果。
:cnewew 是切換到較新的搜尋結果。
更多的用法,可以參照官方網頁

cvs2cl.pl

早上試了半天,怎麼樣都無法讓 cvs log 輸出成比較美的樣子…
後來還是請 Google 大神幫忙,很快他就告訴我,可以用 cvs2cl.pl 這個 perl script 來幫忙。
由於我是在 CygWin 下執行 CVSNT,所以我稍稍修改了一下 script,將這行

my @log_source_command = qw( cvs log );

修改為

my @log_source_command = ( “/cygdrive/c/program files/cvsnt/cvs”, “log” );

果然很快就搞定了~~
輸出的結果果然就跟坊間的 ChangeLog 一樣。
Note:
Perl 的 qw( ) 會把內容拆成字串陣列,所以 qw( cvs log ) 會被拆開成兩個字串 “cvs” 與 “log”。
非常感謝這位大德的投影片

以 script 產生 5000 首 mp3

5000 首 mp3 ?!
去哪裡生啊,靈機一動,不如使用 script 來產生,快又有效。
最早的一個版本是拿一個樣板的 mp3 來複製,可是又怕內容有版權問題,所以後來改用 Text to Speech 的軟體來將文字轉成聲音…
我的環境:Fecora Core 5
會用到的套件:Festival (text2wave)、lame (轉 wave 為 mp3)、id3tag (為轉好的 mp3 上 id3 tag)。
程式碼如下:

#!/bin/sh
#
# run2.sh
# This script is used to generate short songs.
# You can decide how many songs should be generated by modify LIMITSONGS variable.
#
# Dependency:
# festival (Text to speech by text2wave)
# lame (convert wave to mp3)
# id3tag (tag the generated mp3)
#
# Tested environment:
# Fedora Core 5
#
ITER=1
LIMITSONGS=5002
((TOTAL=LIMITEDSONGS – 1))
while (($ITER text.txt
text2wave -F 19200 -o $WAVEFILE text.txt
lame $WAVEFILE $NEWFILENAME
id3tag –artist=$ARTIST –album=$ALBUM –song=$TITLE –genre=classic –track=$ITER –desc=”generated by script.” –total=$TOTAL $NEWFILENAME
((ITER = ITER + 1 ))
rm -f $WAVEFILE
done
rm -f text.txt
echo “done.”

LIMITESONGS 用來控制要產生的數量。
TEXT 則是要說的文字,目前 festival 還不支援中文,所以只能放一些英文字串。
托福,也因此我學到 bash script 裡面可以運算變數內容,作加減乘除,以前我以為只能運算文字內容而已,真的是不經一事不長一智。

錯誤 1935

在某些時候,安裝 .Net framework redistributable package 會失敗,出現如下的錯誤訊息:
錯誤 1935。An error occured during the installation of assembly component {….}. HRESULT: -2147319761.
netframeworkinstallation_1935_error
這時候你可以參考這位大老寫的剖析,相當清楚:Troubleshooting 1935 and 2908 errors during installation
我(或者應該說是我朋友)遇到的情況是用如下步驟就可解決:

  1. 將 %windir%\system32\mscoree.dll (在 Windows 98/me 上是 %windir%\system\mscoree.dll) 更名。
  2. 如果 %windir%\system32\urttemp 存在的話,刪除掉。(在 Windows 98/me 上是 %windir%\system\urttemp)
  3. 重新執行 .Net framework redistributable package 安裝程式

sp_attach_db

用法很簡單…

EXEC sp_attach_db @dbname = N’pubs’,
@filename1 = N’c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf’,
@filename2 = N’c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf’

在 osql command line mode 下輸入以後,記得再輸入 go,表示執行指令。
參考資料:

冷泡茶

兩三年前在看電視的時候,就發現了冷泡茶的方法。

後來經過實驗之後,的確蠻好喝的,可以幾乎 100% 複製出回甘的感覺。

方法如下:找個寶特瓶,抓適量茶葉丟進去,加開水,丟到冰箱,放置約五到六小時就大功告成。以 600 cc 為例,茶葉的量約半個掌心。

注意事項:

  1. 不要拿茶包,拿好一點的茶,否則你永遠也別想泡出好喝的冷泡茶。
  2. 不要用熱開水或溫開水,要用冷開水。
  3. 不要丟在冰箱太多天。