<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Thinking more...-資訊相關Idea與筆記</title>
<link>http://blog.roodo.com/thinkingmore/archives/cat_82804.html</link>
<description>Just thinking more...&amp;nbsp;訂閱 RSS














  google.load(&quot;jquery&quot;, &quot;1.2&quot;);
  google.setOnLoadCallback( function() {
    _uacct = &quot;UA-97150-7&quot;;
    urchinTracker();
    if( dp!=&#039;undefined&#039; ) {
      $(&quot;pre &gt; br&quot;).each( function() { $(this).replaceWith( &quot;\n&quot; ); } );
      $(&quot;textarea &gt; br&quot;).each( function() { $(this).replaceWith( &quot;\n&quot; ); } );
      dp.SyntaxHighlighter.ClipboardSwf = &#039;http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/clipboard.swf&#039;;
      dp.SyntaxHighlighter.HighlightAll(&#039;code&#039;);
    }
  } );

</description>
<language>zh-tw</language>
<generator>Roodo Blog System</generator>
<copyright>All Rights Reserved</copyright>
<atom:link href="http://blog.roodo.com/thinkingmore/archives/cat_82804.xml" rel="self" type="application/rss+xml" />
<item>
	<title>Convert vdi to vmdk using CloneZilla</title>
	<description><![CDATA[
			利用 qemu-img convert 要把 VirtualBox vdi 轉為 vmdk 時，似乎有 2G 的限制，轉出的 vmdk 檔案永遠只有 2G。
沒辦法，只好把腦筋動到 VirtualBox 上。

VirtualBox 可以掛載 vmdk，所以可以用 qemu-img 建立 vmdk 檔案，然後再用 Clonezilla 來進行磁碟複製的工作，雖然麻煩，但不失為一個好方法。

		]]>
	</description>
	<content:encoded><![CDATA[
			利用 qemu-img convert 要把 <a href="http://www.virtualbox.org/">VirtualBox</a> vdi 轉為 vmdk 時，似乎有 2G 的限制，轉出的 vmdk 檔案永遠只有 2G。<br />
沒辦法，只好把腦筋動到 <a href="http://www.virtualbox.org/">VirtualBox</a> 上。<br />
<br />
<a href="http://www.virtualbox.org/">VirtualBox</a> 可以掛載 vmdk，所以可以用 qemu-img 建立 vmdk 檔案，然後再用 <a href="http://drbl.nchc.org.tw/clonezilla/">Clonezilla</a> 來進行磁碟複製的工作，雖然麻煩，但不失為一個好方法。<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/7707439.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/7707439.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Tue, 25 Nov 2008 17:40:35 +0800</pubDate>
</item>
<item>
	<title>svk mirror 錯誤</title>
	<description><![CDATA[
			如果你在 svk mirror 時，出現類似 "xxx is not a mirrored path." 或 "xxx 不是一個映射路徑。" 的錯誤時，請使用 svk propedit svm:mirror // 指令進行編輯，將有問題的路徑移除之後，就不會有問題了。

解法參考自：#6000: Renaming a mirror loses its source[svk-devel] misutilization

		]]>
	</description>
	<content:encoded><![CDATA[
			如果你在 svk mirror 時，出現類似 "xxx is not a mirrored path." 或 "xxx 不是一個映射路徑。" 的錯誤時，請使用 svk propedit svm:mirror // 指令進行編輯，將有問題的路徑移除之後，就不會有問題了。<br />
<br />
解法參考自：<ul><li><a href="http://of.openfoundry.org/rt/Ticket/Display.html?ShowHeaders=1;id=6000">#6000: Renaming a mirror loses its source</a></li><li><a href="http://lists.bestpractical.com/pipermail/svk-devel/2007-January/000503.html">[svk-devel] misutilization</a></li></ul><br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/7570645.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/7570645.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Fri, 14 Nov 2008 15:00:20 +0800</pubDate>
</item>
<item>
	<title>python + opengl = pyopengl</title>
	<description><![CDATA[
			安裝：安裝Python，我用 2.5。安裝EasyInstall，這是類似 Perl CPAN、Ruby Gems的工具。等等會利用這個來安裝 PyOpenGL。打開命令提示字元，切換到 c:\python25\scripts，執行 easy_install pyopengl。最後，你還需要 GLUT：Nate Robins - OpenGL- GLUT for Win32，下載以後，丟到 c:\windows\system32 即可。

都好了以後，你就可以試試看下面這個小程式了：
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

def display():
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    glPushMatrix()
    #glTranslatef(0.,1.,-1.) #move to where we want to put object
    glBegin( GL_TRIANGLES )
    glColor3f( 1., 0., 0. )
    glVertex2d( -1., 0. )
    glColor3f( 0., 1., 0. )
    glVertex2d( 1.,0. )
    glColor3f( 0., 0., 1. )
    glVertex2d( 0., 1. )
    glEnd()
    glPopMatrix()
    glutSwapBuffers()
    return

glutInit( sys.argv )
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB |GLUT_DEPTH)
glutInitWindowSize(400,400)
glutCreateWindow("Hello, World")
glClearColor(0.,0.,0.,1.)
glutDisplayFunc(display)
glutMainLoop()


想試試的原因，最主要是想說，Python 可以比較方便地進行測試與練習，接觸以後，發現代碼也很容易轉換為 C/C++，就這樣。

參考資料：#148 (pyOpenGL egg needs to include glut32.dll.) - EPD Trac - TracPython short course


		]]>
	</description>
	<content:encoded><![CDATA[
			安裝：<ol><li>安裝<a href="http://www.python.org">Python</a>，我用 2.5。</li><li>安裝<a href="http://peak.telecommunity.com/DevCenter/EasyInstall">EasyInstall</a>，這是類似 <a href="http://www.perl.org">Perl</a> <a href="http://www.cpan.org">CPAN</a>、<a href="http://www.rubygems.org">Ruby Gems</a>的工具。等等會利用這個來安裝 <a href="http://pyopengl.sourceforge.net/">PyOpenGL</a>。</li><li>打開命令提示字元，切換到 c:\python25\scripts，執行 easy_install pyopengl。</li><li>最後，你還需要 GLUT：<a href="http://www.xmission.com/~nate/glut.html">Nate Robins - OpenGL- GLUT for Win32</a>，下載以後，丟到 c:\windows\system32 即可。</li></ol>

都好了以後，你就可以試試看下面這個小程式了：<pre name="code" class="python">
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

def display():
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    glPushMatrix()
    #glTranslatef(0.,1.,-1.) #move to where we want to put object
    glBegin( GL_TRIANGLES )
    glColor3f( 1., 0., 0. )
    glVertex2d( -1., 0. )
    glColor3f( 0., 1., 0. )
    glVertex2d( 1.,0. )
    glColor3f( 0., 0., 1. )
    glVertex2d( 0., 1. )
    glEnd()
    glPopMatrix()
    glutSwapBuffers()
    return

glutInit( sys.argv )
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB |GLUT_DEPTH)
glutInitWindowSize(400,400)
glutCreateWindow("Hello, World")
glClearColor(0.,0.,0.,1.)
glutDisplayFunc(display)
glutMainLoop()
</pre>

想試試的原因，最主要是想說，<a href="http://www.python.org">Python</a> 可以比較方便地進行測試與練習，接觸以後，發現代碼也很容易轉換為 C/C++，就這樣。<br/>

參考資料：<ul><li><a href="https://svn.enthought.com/epd/ticket/148">#148 (pyOpenGL egg needs to include glut32.dll.) - EPD Trac - Trac</a></li><li><a href="http://www.wag.caltech.edu/home/rpm/python_course/">Python short course</a></li></ul>

				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/7520377.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/7520377.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Thu, 06 Nov 2008 15:30:50 +0800</pubDate>
</item>
<item>
	<title>trinity.vim</title>
	<description><![CDATA[
			前兩天想說找找看 Vim 有沒有 GNU Global 的 plugin 時，看到了 trinity.vim。
這個 plugin 整合了三個 plugin：Source explorer, taglist, NERD tree 在 Vim 模擬出接近 Source Insight 的效果。
有用過 Source Insight 的人，相信都知道很難找到替代品，我前幾年也曾經試圖找過，但都一直沒找到。
這個 plugin 真的不錯，讓Vim更好用了～

有優點當然也有缺點：Source explorer 裡呼叫 ctags 的地方是寫死的，所以如果你的 ctags 放在別的地方，最好自行去搜索有呼叫到 ctags 的地方，加上路徑。把 Source explorer 打開的時候，速度會變慢，這是因為它試圖利用 ctags 資料庫去找跟游標所在位置有關的程式片段。我自己是比較少用，不能用對我影響不大。

		]]>
	</description>
	<content:encoded><![CDATA[
			前兩天想說找找看 <a href="http://www.vim.org">Vim</a> 有沒有 <a href="http://www.gnu.org/software/global/">GNU Global</a> 的 plugin 時，看到了 <a href="http://www.vim.org/scripts/script.php?script_id=2347">trinity.vim</a>。<br />
這個 plugin 整合了三個 plugin：<a href="http://www.vim.org/scripts/script.php?script_id=2179">Source explorer</a>, <a href="http://www.vim.org/scripts/script.php?script_id=273">taglist</a>, <a href="http://www.vim.org/scripts/script.php?script_id=1658">NERD tree</a> 在 <a href="http://www.vim.org">Vim</a> 模擬出接近 <a href="http://www.sourceinsight.com/">Source Insight</a> 的效果。<br />
有用過 <a href="http://www.sourceinsight.com/">Source Insight</a> 的人，相信都知道很難找到替代品，我前幾年也曾經試圖找過，但都一直沒找到。<br />
這個 plugin 真的不錯，讓<a href="http://www.vim.org">Vim</a>更好用了～<br />
<br />
有優點當然也有缺點：<ol><li><a href="http://www.vim.org/scripts/script.php?script_id=2179">Source explorer</a> 裡呼叫 ctags 的地方是寫死的，所以如果你的 ctags 放在別的地方，最好自行去搜索有呼叫到 ctags 的地方，加上路徑。</li><li>把 <a href="http://www.vim.org/scripts/script.php?script_id=2179">Source explorer</a> 打開的時候，速度會變慢，這是因為它試圖利用 ctags 資料庫去找跟游標所在位置有關的程式片段。我自己是比較少用，不能用對我影響不大。</li></ol><br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/7515251.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/7515251.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Wed, 05 Nov 2008 16:38:59 +0800</pubDate>
</item>
<item>
	<title>以 bash script 為 sqlite database 產生 C/C++ struct</title>
	<description><![CDATA[
			最近寫的一個 bash script，用來幫你把 sqlite database 裡的 table schema 轉成 C/C++ struct。
這裡只處理 text 與 integer 型態，text 轉成 wstring/string，integer 則轉為 int。轉換的工具是使用 awk/sed。

只要稍稍改動一下，也適用在其他語言上。

#!/bin/bash
if test -z "$1"
then
	echo "You need to specify the database file name."
	exit -1
fi

db=$1
dbname=`basename $1 .db`
tables=`sqlite3 $db ".table"`
output="db_${dbname}_schema.h"

touch $output

cat >> $output > $output
	sqlite3 $db ".schema $table" | awk '/^\ /{printf("%s %s;",$2,$1);}' | sed -e 's/,/\ /g' | sed -e 's/text/db_string /g' | sed -e 's/integer/int /g' >> $output
	struct_name=`echo $table | awk -f cap.awk`
	echo "}$struct_name;" >> $output
	echo "" >> $output
done

cat >> $output 
		]]>
	</description>
	<content:encoded><![CDATA[
			最近寫的一個 bash script，用來幫你把 sqlite database 裡的 table schema 轉成 C/C++ struct。<br/>
這裡只處理 text 與 integer 型態，text 轉成 wstring/string，integer 則轉為 int。轉換的工具是使用 awk/sed。<br/>
<br/>
只要稍稍改動一下，也適用在其他語言上。<br/>

<pre name="code" class="bash">#!/bin/bash
if test -z "$1"
then
	echo "You need to specify the database file name."
	exit -1
fi

db=$1
dbname=`basename $1 .db`
tables=`sqlite3 $db ".table"`
output="db_${dbname}_schema.h"

touch $output

cat >> $output << EOF
#ifndef __db_${dbname}_schema_h__
#define __db_${dbname}_schema_h__

#include &lt;string&gt;

#ifdef _UNICODE
typedef std::wstring db_string;
#else
typedef std::string db_string;
#endif

EOF

for table in $tables
do
	echo "typedef struct {" >> $output
	sqlite3 $db ".schema $table" | awk '/^\ /{printf("%s %s;",$2,$1);}' | sed -e 's/,/\ /g' | sed -e 's/text/db_string /g' | sed -e 's/integer/int /g' >> $output
	struct_name=`echo $table | awk -f cap.awk`
	echo "}$struct_name;" >> $output
	echo "" >> $output
done

cat >> $output << EOF
#endif
EOF

# call "astyle" to format the code.  Beside "astyle", you can use "indent".
astyle $output

exit 0
</pre>
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/7413717.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/7413717.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Tue, 21 Oct 2008 14:52:24 +0800</pubDate>
</item>
<item>
	<title>Project.vim</title>
	<description><![CDATA[
			同事最近拋棄了 Source Insight 3，開始用 Vim 寫 code，所以有人跟我一起研究了。
他最近介紹我一個 plugin : project - Organize/Navigate projects of files (like IDE/buffer explorer)，看起來不錯用，他可以把某個目錄下所有檔案都建立為專案檔，讓你可以快速瀏覽所有檔案，不過美中不足的是他沒有把 CVS、.svn、_svn 等目錄過濾掉，我在 VimDirListing 函數裡添加了兩行把這些目錄過濾掉。
這是原來的樣子：
    if isdirectory(glob(fname))
        let {a:dirvariable}={a:dirvariable}.a:padding.fname.a:separator
        let {a:dircount}={a:dircount} + 1
    else
    " other stuff


改過以後：
    if isdirectory(glob(fname))
        if fname != 'CVS' && fname != '.svn' && fname != '_svn'
            let {a:dirvariable}={a:dirvariable}.a:padding.fname.a:separator
            let {a:dircount}={a:dircount} + 1
        endif
    else


如果你懶得看英文的話，對岸的朋友翻譯了該 plugin 的文檔：VIM-Project Plugin - I Know you Know - C++博客

		]]>
	</description>
	<content:encoded><![CDATA[
			同事最近拋棄了 Source Insight 3，開始用 <a href="http://www.vim.org">Vim</a> 寫 code，所以有人跟我一起研究了。<br/>
他最近介紹我一個 plugin : <a href="http://www.vim.org/scripts/script.php?script_id=69">project - Organize/Navigate projects of files (like IDE/buffer explorer)</a>，看起來不錯用，他可以把某個目錄下所有檔案都建立為專案檔，讓你可以快速瀏覽所有檔案，不過美中不足的是他沒有把 CVS、.svn、_svn 等目錄過濾掉，我在 VimDirListing 函數裡添加了兩行把這些目錄過濾掉。<br/>
這是原來的樣子：<pre>
    if isdirectory(glob(fname))
        let {a:dirvariable}={a:dirvariable}.a:padding.fname.a:separator
        let {a:dircount}={a:dircount} + 1
    else
    " other stuff
</pre>

改過以後：<pre>
    if isdirectory(glob(fname))
        if fname != 'CVS' && fname != '.svn' && fname != '_svn'
            let {a:dirvariable}={a:dirvariable}.a:padding.fname.a:separator
            let {a:dircount}={a:dircount} + 1
        endif
    else
</pre>

如果你懶得看英文的話，對岸的朋友翻譯了該 plugin 的文檔：<a href="http://www.cppblog.com/DrMagic/archive/2007/11/19/36964.html">VIM-Project Plugin - I Know you Know - C++博客</a>
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/7374995.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/7374995.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Tue, 14 Oct 2008 16:33:15 +0800</pubDate>
</item>
<item>
	<title>Ubiquity command - findbook(更新)</title>
	<description><![CDATA[
			上一版沒有對 uri 作 encoding，所以找中文時會出錯，現在補上，只要呼叫 Ubiquity 內建的 encodeURIComponent() 就行了...


CmdUtils.CreateCommand({
  name: "findbook",
  contributors: ["elleryq"],
  license: "MPL",
  description: "讓買書變成更簡單的決定！",
  takes: {"書名關鍵字": noun_arb_text},
  icon: "http://findbook.tw/favicon.ico",
  execute: function(directObject) {
    Utils.openUrlInBrowser( "http://findbook.tw/search?keyword_type=keyword&q=" + encodeURIComponent(directObject.text) );
  }
});


		]]>
	</description>
	<content:encoded><![CDATA[
			上一版沒有對 uri 作 encoding，所以找中文時會出錯，現在補上，只要呼叫 Ubiquity 內建的 encodeURIComponent() 就行了...

<pre name="code" class="javascript">
CmdUtils.CreateCommand({
  name: "findbook",
  contributors: ["elleryq"],
  license: "MPL",
  description: "讓買書變成更簡單的決定！",
  takes: {"書名關鍵字": noun_arb_text},
  icon: "http://findbook.tw/favicon.ico",
  execute: function(directObject) {
    Utils.openUrlInBrowser( "http://findbook.tw/search?keyword_type=keyword&q=" + encodeURIComponent(directObject.text) );
  }
});
</pre>
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/7237339.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/7237339.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Wed, 24 Sep 2008 14:47:54 +0800</pubDate>
</item>
<item>
	<title>Ubiquity command - findbook</title>
	<description><![CDATA[
			Ubiquity已經很多人介紹了，這裡是分享一個 commands，如果你有用 Findbook 的話，可以用用看...
安裝 command 方法很簡單，打開 Ubiquity Command Editor 後，把下面的程式碼貼上去即可：
CmdUtils.CreateCommand({
  name: "findbook",
  author: { name: "elleryq"},
  contributors: ["elleryq"],
  license: "MPL",
  description: "讓買書變成更簡單的決定！",
  takes: {"書名關鍵字": noun_arb_text},
  icon: "http://findbook.tw/favicon.ico",
  execute: function(directObject) {
    Utils.openUrlInBrowser( "http://findbook.tw/search?keyword_type=keyword&q=" + directObject.text );
  }
});


		]]>
	</description>
	<content:encoded><![CDATA[
			<a href="http://labs.mozilla.com/2008/08/introducing-ubiquity/">Ubiquity</a>已經很多人介紹了，這裡是分享一個 commands，如果你有用 <a href="http://findbook.tw">Findbook</a> 的話，可以用用看...
安裝 command 方法很簡單，打開 <a href="chrome://ubiquity/content/editor.html">Ubiquity Command Editor</a> 後，把下面的程式碼貼上去即可：
<pre name="code" class="javascript">CmdUtils.CreateCommand({
  name: "findbook",
  author: { name: "elleryq"},
  contributors: ["elleryq"],
  license: "MPL",
  description: "讓買書變成更簡單的決定！",
  takes: {"書名關鍵字": noun_arb_text},
  icon: "http://findbook.tw/favicon.ico",
  execute: function(directObject) {
    Utils.openUrlInBrowser( "http://findbook.tw/search?keyword_type=keyword&q=" + directObject.text );
  }
});
</pre>
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/7048255.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/7048255.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Fri, 29 Aug 2008 10:54:20 +0800</pubDate>
</item>
<item>
	<title>Banshee 的 PlayQueue</title>
	<description><![CDATA[
			1.0 版以後多了一個新功能-PlayQueue，我很喜歡這功能，因為你可以一直把想聽的歌丟進去，Banshee會播放這個Queue裡的歌直到Queue沒有歌為止。
本來以為這是內建的功能，後來看了之後，才發現這是一個 Extension。
它主要繼承 PlaylistSource、IBasicPlaybackController，把自己實作成一個 Playlist 來源，在Banshee播放時，實際上來源已經不是原來的 Music library 了。

所以如果要取得這個 Source，應該是利用 ServiceManager.SourceManager 來取得，要加入 PlayQueue 的話，則是使用 AddSelectedTracks()。
目前我還沒研究出如何在 Extension 裡面呼叫其他 Extension 的方法...

		]]>
	</description>
	<content:encoded><![CDATA[
			1.0 版以後多了一個新功能-PlayQueue，我很喜歡這功能，因為你可以一直把想聽的歌丟進去，<a href="http://banshee-project.org/">Banshee</a>會播放這個Queue裡的歌直到Queue沒有歌為止。<br />
本來以為這是內建的功能，後來看了之後，才發現這是一個 Extension。<br />
它主要繼承 PlaylistSource、IBasicPlaybackController，把自己實作成一個 Playlist 來源，在<a href="http://banshee-project.org/">Banshee</a>播放時，實際上來源已經不是原來的 Music library 了。<br />
<br />
所以如果要取得這個 Source，應該是利用 ServiceManager.SourceManager 來取得，要加入 PlayQueue 的話，則是使用 AddSelectedTracks()。<br />
目前我還沒研究出如何在 Extension 裡面<strong>呼叫</strong>其他 Extension 的方法...<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/6544067.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/6544067.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Wed, 23 Jul 2008 08:42:57 +0800</pubDate>
</item>
<item>
	<title>.NET framework essential Chapter 5</title>
	<description><![CDATA[
			這一章主要講 ADO.Net。
DataSet、DataTable、DataRow、DataRelation... 這一組類別完全是一個抽離實體層的類別，所以有 DataAdapter 這一組與 Connection、Command、DataReader ...等類別溝通。

GetChildRows[] 可以依據 Relationship 來取得子Table與父Table相關的資料列。一個 DataAdapter 基本上對應一個 DataTable，但他不管所在的 DataSet，所以你可以都塞到同一個 DataSet 裡面去。另外 DataAdapter 不處理 Relationship，所以用 Fill 取得資料並放到 DataSet 裡的 DataTable 之後，得自己加上 Relationship。由於 DataSet 與 XML 有一定的關係，第五章最後簡單地介紹了 XML 的相關函數。

		]]>
	</description>
	<content:encoded><![CDATA[
			這一章主要講 ADO.Net。<br />
DataSet、DataTable、DataRow、DataRelation... 這一組類別完全是一個抽離實體層的類別，所以有 DataAdapter 這一組與 Connection、Command、DataReader ...等類別溝通。<br />
<br />
<ul><li>GetChildRows[] 可以依據 Relationship 來取得子Table與父Table相關的資料列。</li><li>一個 DataAdapter 基本上對應一個 DataTable，但他不管所在的 DataSet，所以你可以都塞到同一個 DataSet 裡面去。另外 DataAdapter 不處理 Relationship，所以用 Fill 取得資料並放到 DataSet 裡的 DataTable 之後，得自己加上 Relationship。</li><li>由於 DataSet 與 XML 有一定的關係，第五章最後簡單地介紹了 XML 的相關函數。</li></ul><br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/6536721.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/6536721.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Mon, 21 Jul 2008 13:16:58 +0800</pubDate>
</item>
<item>
	<title>foxyproxy 自動組態指令碼的小問題</title>
	<description><![CDATA[
			因為有在用 foxyproxy 的關係，昨天遇到一個問題，就是 foxyproxy 突然無法解析 pac 檔案了。Log 裡面有這樣的訊息：TypeError: invalid 'in' operand this._sandBox

我試了好久，也找了好久，最後找到官方這篇討論串：PAC support，討論串裡面，作者很熱心想要解決，可是在他那邊複製不出這個問題，所以後面他就乾脆說，有遇到問題的，可以寫信跟他要測試版的 foxyproxy 試試看～

我實在是懶得寫信去要，所以就繼續試，結果無意中被我試出一個 workaround，於是趕緊貼上討論串給其他人參考。
今天去看的時候，發現有人說我的 workaround 有效～蠻令人高興的。

我的 workaround 就是，先把 foxyproxy 關閉，接著重新去把你的樣式設定為"使用自動組態指令碼"，然後關閉。接著再切換你剛剛設置的樣式，就行了。
如果沒有先把 foxyproxy 關閉的話，在關閉的時候會出現錯誤訊息。

		]]>
	</description>
	<content:encoded><![CDATA[
			因為有在用 <a href="https://addons.mozilla.org/zh-TW/firefox/addon/2464">foxyproxy</a> 的關係，昨天遇到一個問題，就是 <a href="https://addons.mozilla.org/zh-TW/firefox/addon/2464">foxyproxy</a> 突然無法解析 pac 檔案了。Log 裡面有這樣的訊息：<blockquote>TypeError: invalid 'in' operand this._sandBox</blockquote><br />
<br />
我試了好久，也找了好久，最後找到官方這篇討論串：<a href="http://foxyproxy.mozdev.org/drupal/content/pac-support">PAC support</a>，討論串裡面，作者很熱心想要解決，可是在他那邊複製不出這個問題，所以後面他就乾脆說，有遇到問題的，可以寫信跟他要測試版的 <a href="https://addons.mozilla.org/zh-TW/firefox/addon/2464">foxyproxy</a> 試試看～<br />
<br />
我實在是懶得寫信去要，所以就繼續試，結果無意中被我試出一個 workaround，於是趕緊貼上討論串給其他人參考。<br />
今天去看的時候，發現有人說我的 workaround 有效～蠻令人高興的。<br />
<br />
我的 workaround 就是，先把 <a href="https://addons.mozilla.org/zh-TW/firefox/addon/2464">foxyproxy</a> 關閉，接著重新去把你的樣式設定為"使用自動組態指令碼"，然後關閉。接著再切換你剛剛設置的樣式，就行了。<br />
如果沒有先把 <a href="https://addons.mozilla.org/zh-TW/firefox/addon/2464">foxyproxy</a> 關閉的話，在關閉的時候會出現錯誤訊息。<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/6443363.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/6443363.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Wed, 09 Jul 2008 17:41:04 +0800</pubDate>
</item>
<item>
	<title>在 .reg 表明要移除 key</title>
	<description><![CDATA[
			謝謝你，Rob van der Woude！

原來在 .reg 裡面也可以表明要移除某個 key。
參考Rob van der Woude的這篇文章：Batch files - Use REGEDIT to add, read or delete registry values，只要這樣寫就行了：;表明移除整個 DummyTree [-HKEY_CURRENT_USER\DummyTree];表明移除指定項目[HKEY_CURRENT_USER\DummyTree]"ValueToBeRemoved"=-
文章裡面還有許多其他關於 registry 的技巧喔～

		]]>
	</description>
	<content:encoded><![CDATA[
			謝謝你，<a href="http://www.robvanderwoude.com">Rob van der Woude</a>！<br />
<br />
原來在 .reg 裡面也可以表明要移除某個 key。<br />
參考<a href="http://www.robvanderwoude.com">Rob van der Woude</a>的這篇文章：<a href="http://www.robvanderwoude.com/regedit.html">Batch files - Use REGEDIT to add, read or delete registry values</a>，只要這樣寫就行了：<pre>;表明移除整個 DummyTree <br/>[-HKEY_CURRENT_USER\DummyTree]<br/>;表明移除指定項目<br/>[HKEY_CURRENT_USER\DummyTree]<br/>"ValueToBeRemoved"=-</pre><br />
<a href="http://www.robvanderwoude.com/regedit.html" title="Batch files - Use REGEDIT to add, read or delete registry values">文章</a>裡面還有許多其他關於 registry 的技巧喔～<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/5835589.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/5835589.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Wed, 09 Apr 2008 15:16:07 +0800</pubDate>
</item>
<item>
	<title>以 public key 進行 SSH 登入</title>
	<description><![CDATA[
			首先，謝謝你！HowToForge。

環境：以下都是從電腦 A 要登入到 Server B (Linux)

步驟：先為電腦A產生Private/Public keyLinux: 用 ssh-keygenWindows: 用 puttygen.exe把產生好的 Public key (用 ssh-keygen 的話，通常是 id_dsa.pub﹔用 puttygen.exe 的話，它就在上面的方塊裡。)附加到 Server B 登入帳號的 .ssh 目錄下的 authorized_keys2 裡面，如果沒有 authorized_keys 就自己建一個！舉例來說，如果你帳號是 xyz，那麼就是 $HOME/.ssh/authorized_keys 。收工。

參考資料：How To Set Up SSH With Public-Key Authentication On Debian Etch | HowtoForge - Linux Howtos and Tutorials

		]]>
	</description>
	<content:encoded><![CDATA[
			首先，謝謝你！<a href="http://www.howtoforge.com">HowToForge</a>。<br />
<br />
環境：以下都是從電腦 A 要登入到 Server B (Linux)<br />
<br />
步驟：<ol><li>先為電腦A產生Private/Public key<ul><li>Linux: 用 ssh-keygen</li><li>Windows: 用 <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">puttygen.exe</a></li></ul></li><li>把產生好的 Public key (用 ssh-keygen 的話，通常是 id_dsa.pub﹔用 puttygen.exe 的話，它就在上面的方塊裡。)附加到 Server B 登入帳號的 .ssh 目錄下的 authorized_keys2 裡面，如果沒有 authorized_keys 就自己建一個！舉例來說，如果你帳號是 xyz，那麼就是 $HOME/.ssh/authorized_keys 。</li><li>收工。</li></ol><br />
<br />
參考資料：<a href="http://www.howtoforge.com/set-up-ssh-with-public-key-authentication-debian-etch">How To Set Up SSH With Public-Key Authentication On Debian Etch | HowtoForge - Linux Howtos and Tutorials</a><br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/5795979.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/5795979.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Wed, 02 Apr 2008 13:42:02 +0800</pubDate>
</item>
<item>
	<title>Banshee hack</title>
	<description><![CDATA[
			從 src/Core/Banshee/Services/Banshee.Database/BansheeDbFormatMigrator.cs 的InitializeFreshDatabase()裡面可以看到 Banshee 建立了這些 table：CoreConfigurationCoreTracksCoreArtistsCoreAlbumsCorePlaylistsCorePlaylistEntriesCoreSmartPlaylistsCoreSmartPlaylistEntriesCoreRemovedTracksCoreTracksCacheCoreCache
並且針對各個 Table 建立了必要的 Index (好吧，我的疑慮解除了，其實 Banshee 有幫建檔的音樂作索引，那還要繼續看下去嗎?)

BansheeDbFormatMigrator.cs 裡面還可以看到以 Migrate_ 開頭的函式前面有 [DatabaseVersion] 這個 Attribute，這些函式是用來作 Migrate(升級)的函式，Banshee 會先檢查 CoreConfiguration table 的 DatabaseVersion 欄位，看目前 Database 是什麼版本，然後再決定要怎麼去作升級(這部份可以參考 Migrate(), InnerMigrate())。

存取資料庫的部份被包在 src/Core/Banshee.Services/Banshee.Collection.Database下的各個以 AlbumInfo 結尾的檔案裡面，裡面都大同小異，provider 成員為主要的提供者，這裡會傳入 ServiceManager.DbConnection 讓 BansheeModelProvider 的 instance 能根據此 connection 去存取資料庫。
所有的 connection 都是由 ServiceManager.DbConnection (src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs) 而來，而 DbConnection 其實只是一個服務 (src/Core/Banshee.Services/Banshee.Database/BansheeDbConnection.cs)，在 ServiceManager 被初始化(static ServiceManager())的時候被註冊進去。

BansheeDbConnection 繼承自 HyenaSqliteConnection (src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteConnection.cs)，從 HyenaSqliteConnection.cs 看起來似乎是為了要把存取資料庫這整個部份獨立為 Thread 以提昇 UI 效率，所以才另外作 Hyena.Data.Sqlite。
不過最終底層還是 Sqlite 3。

Banshee 的 Main() 在 Client 類別 (src/Client/Nereid/Nereid/Client.cs)，Client 繼承自 GtkBaseClient (src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs)，扣掉註解不到 30 行...

補充1：HACKING Guide
補充2：我看的 code 是目前最新的版本，後來看過 0.13 的資料庫，發現的確沒有建 Index。

		]]>
	</description>
	<content:encoded><![CDATA[
			從 src/Core/Banshee/Services/Banshee.Database/BansheeDbFormatMigrator.cs 的InitializeFreshDatabase()裡面可以看到 Banshee 建立了這些 table：<ul><li>CoreConfiguration</li><li>CoreTracks</li><li>CoreArtists</li><li>CoreAlbums</li><li>CorePlaylists</li><li>CorePlaylistEntries</li><li>CoreSmartPlaylists</li><li>CoreSmartPlaylistEntries</li><li>CoreRemovedTracks</li><li>CoreTracksCache</li><li>CoreCache</li></ul><br />
並且針對各個 Table 建立了必要的 Index (好吧，我的疑慮解除了，其實 <a href="http://www.banshee-project.org">Banshee</a> 有幫建檔的音樂作索引，那還要繼續看下去嗎?)<br />
<br />
BansheeDbFormatMigrator.cs 裡面還可以看到以 Migrate_ 開頭的函式前面有 [DatabaseVersion] 這個 Attribute，這些函式是用來作 Migrate(升級)的函式，Banshee 會先檢查 CoreConfiguration table 的 DatabaseVersion 欄位，看目前 Database 是什麼版本，然後再決定要怎麼去作升級(這部份可以參考 Migrate(), InnerMigrate())。<br />
<br />
存取資料庫的部份被包在 src/Core/Banshee.Services/Banshee.Collection.Database下的各個以 AlbumInfo 結尾的檔案裡面，裡面都大同小異，provider 成員為主要的提供者，這裡會傳入 ServiceManager.DbConnection 讓 BansheeModelProvider 的 instance 能根據此 connection 去存取資料庫。<br />
所有的 connection 都是由 ServiceManager.DbConnection (src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs) 而來，而 DbConnection 其實只是一個服務 (src/Core/Banshee.Services/Banshee.Database/BansheeDbConnection.cs)，在 ServiceManager 被初始化(static ServiceManager())的時候被註冊進去。<br />
<br />
BansheeDbConnection 繼承自 HyenaSqliteConnection (src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteConnection.cs)，從 HyenaSqliteConnection.cs 看起來似乎是為了要把存取資料庫這整個部份獨立為 Thread 以提昇 UI 效率，所以才另外作 Hyena.Data.Sqlite。<br />
不過最終底層還是 <a href="http://www.sqlite.org/">Sqlite 3</a>。<br />
<br />
<a href="http://www.banshee-project.org">Banshee</a> 的 Main() 在 Client 類別 (src/Client/Nereid/Nereid/Client.cs)，Client 繼承自 GtkBaseClient (src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs)，扣掉註解不到 30 行...<br />
<br />
補充1：<a href="http://svn.gnome.org/viewvc/banshee/trunk/banshee/HACKING?view=markup">HACKING Guide</a><br />
補充2：我看的 code 是目前最新的版本，後來看過 0.13 的資料庫，發現的確沒有建 Index。<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/5732279.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/5732279.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Fri, 21 Mar 2008 10:36:50 +0800</pubDate>
</item>
<item>
	<title>我的第一個 Greasemonkey user script - ClickNextPage</title>
	<description><![CDATA[
			為了看線上漫畫方便而寫的，本來是要滑鼠按上一頁、下一頁，現在只要按下'x'或'c'就可以到上一頁或下一頁，目前只能使用於九啦啦動漫～
原理不難，就只是請 Greasemonkey 在頁面載入時，幫忙掛上寫好的 userscript，而這個 userscript 也只是去處理 keyup 事件而已。

從看Dive Into Greasemonkey入門到完成，大概花了一個小時多一點的時間，應該算慢的吧～
我估計如果對 Javascript DOM 熟的人，應該可以比我更快寫好，我對 Javascript DOM 並不是那麼熟悉，而且，我已經被 jQuery 給馴化了...唉～沒辦法，jQuery 實在是好用又好查啊～

完成的作品在這裡，如果你有裝Greasemonkey的話，點選連結以後，就會有對話框問你是否要安裝了～

		]]>
	</description>
	<content:encoded><![CDATA[
			為了看線上漫畫方便而寫的，本來是要滑鼠按上一頁、下一頁，現在只要按下'x'或'c'就可以到上一頁或下一頁，目前只能使用於<a href="http://www.9lala.com/">九啦啦動漫</a>～<br />
原理不難，就只是請 <a href="https://addons.mozilla.org/en-US/firefox/addon/748">Greasemonkey</a> 在頁面載入時，幫忙掛上寫好的 userscript，而這個 userscript 也只是去處理 keyup 事件而已。<br />
<br />
從看<a href="http://diveintogreasemonkey.org/">Dive Into Greasemonkey</a>入門到完成，大概花了一個小時多一點的時間，應該算慢的吧～<br />
我估計如果對 Javascript DOM 熟的人，應該可以比我更快寫好，我對 Javascript DOM 並不是那麼熟悉，而且，我已經被 <a href="http://www.jquery.com">jQuery</a> 給馴化了...唉～沒辦法，<a href="http://www.jquery.com">jQuery</a> 實在是好用又好查啊～<br />
<br />
完成的作品在<a href="http://elleryq.googlepages.com/clicknextpage.user.js">這裡</a>，如果你有裝<a href="https://addons.mozilla.org/en-US/firefox/addon/748">Greasemonkey</a>的話，點選<a href="http://elleryq.googlepages.com/clicknextpage.user.js">連結</a>以後，就會有對話框問你是否要安裝了～<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/5728249.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/5728249.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Thu, 20 Mar 2008 14:43:25 +0800</pubDate>
</item>
<item>
	<title>VisualSVN Server</title>
	<description><![CDATA[
			想到可以來介紹一下這個：VisualSVN Server。
讓我想想～記得應該是去年年底的時候，不知在哪兒逛到的～
原本以為會不會跟VisualSVN一樣，是個商業化的產品，後來看過以後，才知道並不是。

言歸正傳，VisualSVN Server骨子裡其實就是Apache HTTP Server+Subversion，另外再加上VisualSVN製作的一個簡單管理介面。
如果你覺得自己手動安裝 Apache HTTP Server+Subversion很麻煩而你剛好又不想用 Linux 的話，不妨試試看這個，我自己試過了，如果你沒有要綁什麼特別的認證機制(如 SSPI)的話，這個軟體可說是相當地方便。

p.s. VisualSVN是一個給 Visual Studio 用的 plugin，讓 Visual Studio 也能直接以Subversion來作代碼管理。

		]]>
	</description>
	<content:encoded><![CDATA[
			想到可以來介紹一下這個：<a href="http://www.visualsvn.com/server/">VisualSVN Server</a>。<br />
讓我想想～記得應該是去年年底的時候，不知在哪兒逛到的～<br />
原本以為會不會跟<a href="http://www.visualsvn.com/" title="VisualSVN - Subversion plugin for Visual Studio">VisualSVN</a>一樣，是個商業化的產品，後來看過以後，才知道並不是。<br />
<br />
言歸正傳，<a href="http://www.visualsvn.com/server/">VisualSVN Server</a>骨子裡其實就是<a href="http://httpd.apache.org/">Apache HTTP Server</a>+<a href="http://subversion.tigris.org/">Subversion</a>，另外再加上<a href="http://www.visualsvn.com/" title="VisualSVN - Subversion plugin for Visual Studio">VisualSVN</a>製作的一個簡單管理介面。<br />
如果你覺得自己手動安裝 <a href="http://httpd.apache.org/">Apache HTTP Server</a>+<a href="http://subversion.tigris.org/">Subversion</a>很麻煩而你剛好又不想用 Linux 的話，不妨試試看這個，我自己試過了，如果你沒有要綁什麼特別的認證機制(如 SSPI)的話，這個軟體可說是相當地方便。<br />
<br />
p.s. <a href="http://www.visualsvn.com/" title="VisualSVN - Subversion plugin for Visual Studio">VisualSVN</a>是一個給 Visual Studio 用的 plugin，讓 Visual Studio 也能直接以<a href="http://subversion.tigris.org/">Subversion</a>來作代碼管理。<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/5716755.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/5716755.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Tue, 18 Mar 2008 13:55:14 +0800</pubDate>
</item>
<item>
	<title>[軟體]Text to VBString</title>
	<description><![CDATA[
			最近都在寫 ASP/HTML/Javascript，今天剛好在訂閱的 MSDN Feeds 裡面看到 Joe Stagner的這篇文章：Utility to Convert Text / HTML to a Visual Basic String
內容是介紹Text to VB String這工具，這下可以省掉不少把 html 轉成 vb string 的功夫了~

p.s. 這個光頭的照片我經常看到，由此可推斷，這傢伙在網路上相當活躍，應該是個牛人。

		]]>
	</description>
	<content:encoded><![CDATA[
			最近都在寫 ASP/HTML/Javascript，今天剛好在訂閱的 MSDN Feeds 裡面看到 <a href="http://blog.msdn.com/joestagner/">Joe Stagner</a>的這篇文章：<a href="http://blogs.msdn.com/joestagner/archive/2008/03/13/utility-to-convert-text-html-to-a-visual-basic-string.aspx">Utility to Convert Text / HTML to a Visual Basic String</a><br />
內容是介紹<a href="http://www.softpedia.com/progDownload/Text-to-VB-String-Download-29794.html" title="Text to VB String Download - Softpedia">Text to VB String</a>這工具，這下可以省掉不少把 html 轉成 vb string 的功夫了~<br />
<br />
p.s. 這個光頭的照片我經常看到，由此可推斷，這傢伙在網路上相當活躍，應該是個牛人。<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/5695179.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/5695179.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Fri, 14 Mar 2008 10:17:25 +0800</pubDate>
</item>
<item>
	<title>如何在指令列改變 Registry key 的權限</title>
	<description><![CDATA[
			首先要謝謝你，Wikipedia 上的 Windows Registry 條目。

裡面提到了微軟其實有釋出一個工具：SubInACL.exe
用這個，就可以改變某個 Key 的權限。

這一行就是讓自己可以得到 HKEY_LOCAL_MACHINE\software 這個 key的完全控制權：subinacl /keyreg HKEY_LOCAL_MACHINE\software /grant=%USERNAME%=F
但是這邊要注意， /key 只針對該 key，在之下的 subkey，你仍然沒有完全控制權，如果你要得到 subkey 的完整控制權，你應該改用：subinacl /subkeyreg HKEY_LOCAL_MACHINE\software /grant=%USERNAME%=F

p.s. 如果你需要刪除某個指定 key，可以參考這篇文章：Delete OE Identity from HKCU\Identities using WSH Script。

		]]>
	</description>
	<content:encoded><![CDATA[
			首先要謝謝你，<a href="http://en.wikipedia.org/wiki/Windows_Registry">Wikipedia 上的 Windows Registry 條目</a>。<br />
<br />
裡面提到了<a href="http://www.microsoft.com">微軟</a>其實有釋出一個工具：<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e8ba3e56-d8fe-4a91-93cf-ed6985e3927b&amp;DisplayLang=en">SubInACL.exe</a><br />
用這個，就可以改變某個 Key 的權限。<br />
<br />
這一行就是讓自己可以得到 HKEY_LOCAL_MACHINE\software 這個 key的完全控制權：<pre>subinacl /keyreg HKEY_LOCAL_MACHINE\software /grant=%USERNAME%=F</pre><br />
但是這邊要注意， /key 只針對該 key，在之下的 subkey，你仍然沒有完全控制權，如果你要得到 subkey 的完整控制權，你應該改用：<pre>subinacl /subkeyreg HKEY_LOCAL_MACHINE\software /grant=%USERNAME%=F</pre><br />
<br />
p.s. 如果你需要刪除某個指定 key，可以參考這篇文章：<a href="http://www.pcreview.co.uk/forums/thread-1713621.php">Delete OE Identity from HKCU\Identities using WSH Script</a>。<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/5674483.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/5674483.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Mon, 10 Mar 2008 16:15:16 +0800</pubDate>
</item>
<item>
	<title>jquery.ingrid</title>
	<description><![CDATA[
			最近使用了jquery.ingrid這個jQuery的插件，這裡分享幾點心得：
官方文件提供的資訊極有限，所以原始碼沒事最好要看一下。Client 端的 html 只要在 &lt;table&gt; 裡面放 &lt;thead&gt;, &lt;thead&gt;, &lt;th&gt; 即可，不需要放別的。另外最好用一個 &lt;div&gt; 包起來，這樣可以比較方便於作 requery，因為在呼叫 ingrid() 之後，DOM 會作必要的改變，因此原來你使用 selector 指定到的 element，可能就再也找不到了。使用 &lt;div&gt; 包起來的好處是，可以藉由 html() 重新指定 &lt;div&gt; 的內容。這樣就能再次使用 selector 找到要改變的 table。Server 端需要處理 page, sort, dir 三個參數，這是由 Client 端的 ingrid() javascript 送出的，此外，如果 dataType 是 HTML (預設也是) 的話，只要輸出 &lt;table&gt;、&lt;tbody&gt;與&lt;td&gt;即可。如果你還需要指定其他的參數，可以藉由複寫 extraParams 來達到你的目的：var options={
  url: 'remote.html',
  extraParams: {param1: 'param1', param2: 'param2' }
};
$("#grid").ingrid( options ); 
記得要指定 colWidths，有幾個 column，就要指定幾個，這是官方文件沒提及的部份。如果不指定，會很殘忍的給你錯誤。$("#grid").ingrid( {
  // other stuff...
  colWidths: [ 225,225,225,225 ],
  // other stuff...
}); 


此外它還有排序、調整欄寬...等等的功能，整體來說，是個相當不錯的插件。

		]]>
	</description>
	<content:encoded><![CDATA[
			最近使用了<a href="http://reconstrukt.com/ingrid/">jquery.ingrid</a>這個<a href="http://www.jquery.com">jQuery</a>的插件，這裡分享幾點心得：
<ul><li><a href="http://reconstrukt.com/ingrid/">官方文件</a>提供的資訊極有限，所以原始碼沒事最好要看一下。</li><li>Client 端的 html 只要在 &lt;table&gt; 裡面放 &lt;thead&gt;, &lt;thead&gt;, &lt;th&gt; 即可，不需要放別的。另外最好用一個 &lt;div&gt; 包起來，這樣可以比較方便於作 requery，因為在呼叫 ingrid() 之後，DOM 會作必要的改變，因此原來你使用 selector 指定到的 element，可能就再也找不到了。使用 &lt;div&gt; 包起來的好處是，可以藉由 html() 重新指定 &lt;div&gt; 的內容。這樣就能再次使用 selector 找到要改變的 table。</li><li>Server 端需要處理 page, sort, dir 三個參數，這是由 Client 端的 ingrid() javascript 送出的，此外，如果 dataType 是 HTML (預設也是) 的話，只要輸出 &lt;table&gt;、&lt;tbody&gt;與&lt;td&gt;即可。如果你還需要指定其他的參數，可以藉由複寫 extraParams 來達到你的目的：<pre name="code" class="javascript">var options={
  url: 'remote.html',
  extraParams: {param1: 'param1', param2: 'param2' }
};
$("#grid").ingrid( options ); 
</pre><li>記得要指定 colWidths，有幾個 column，就要指定幾個，這是官方文件沒提及的部份。如果不指定，會很殘忍的給你錯誤。<pre name="code" class="javascript">$("#grid").ingrid( {
  // other stuff...
  colWidths: [ 225,225,225,225 ],
  // other stuff...
}); 
</pre></li></ul>

此外它還有排序、調整欄寬...等等的功能，整體來說，是個相當不錯的插件。
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/5628631.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/5628631.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Mon, 03 Mar 2008 17:39:04 +0800</pubDate>
</item>
<item>
	<title>適合程式設計師用的字型</title>
	<description><![CDATA[
			陸陸續續在網路上看到很多文章介紹，不過並沒有列出所有不錯的字型，這兒列出來的是目前我有試過而且感覺不錯的，同時直接提供下載連結：
Consolas，下載位址：Consolas Font Pack for Microsoft Visual Studio 2005Inconsolata，下載位址在此Andale Mono，下載位址：andale32.exe(from sourceforge.net)

其他參考：Choosing the Best Font for your Delphi / Pascal Code

		]]>
	</description>
	<content:encoded><![CDATA[
			陸陸續續在網路上看到<a href="http://www.google.com.tw/search?q=programmer+fonts&ie=utf-8&oe=utf-8&aq=t">很多文章介紹</a>，不過並沒有列出所有不錯的字型，這兒列出來的是目前我有試過而且感覺不錯的，同時直接提供下載連結：<br />
<ul><li><a href="http://zh.wikipedia.org/wiki/Consolas">Consolas</a>，下載位址：<a href="http://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&amp;displaylang=en">Consolas Font Pack for Microsoft Visual Studio 2005</a></li><li><a href="http://www.ghostscript.com/~raph/type/myfonts/inconsolata.html">Inconsolata</a>，下載位址<a href="http://www.ghostscript.com/~raph/type/myfonts/Inconsolata.otf" title="OpenType file">在此</a></li><li><a href="http://corefonts.sourceforge.net/">Andale Mono</a>，下載位址：<a href="http://prdownloads.sourceforge.net/corefonts/andale32.exe">andale32.exe(from sourceforge.net)</a></li></ul><br />
<br />
其他參考：<ul><li><a href="http://delphi.about.com/od/standards/a/best_ide_font.htm">Choosing the Best Font for your Delphi / Pascal Code</a></li></ul><br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/5603463.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/5603463.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Wed, 27 Feb 2008 16:28:36 +0800</pubDate>
</item>
<item>
	<title>指定 Google maps API script 的編碼</title>
	<description><![CDATA[
			是的，Google maps API 的 javascript 預設編碼是 utf-8，如果你的網頁編碼是 big5 或其他的，你應該要同時調整 javascript 的輸出編碼，否則你可能會遇到奇怪的錯誤。
方法就是加上隱藏的參數 oe，以 big5 為例：

&lt;script src="http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;key=your_key&amp;amp;oe=big5" type="text/javascript"&gt;&lt;/script&gt;


或許你也跟我注意到了，這兒並不是使用 &amp;，而是使用 &amp;amp;，並不是我故意寫錯，而是官方提供的範例就是如此，而且 IE6、IE7、Firefox 都可以接受...

		]]>
	</description>
	<content:encoded><![CDATA[
			是的，<a href="http://code.google.com/apis/maps/">Google maps API</a> 的 javascript 預設編碼是 utf-8，如果你的網頁編碼是 big5 或其他的，你應該要同時調整 javascript 的輸出編碼，否則你可能會遇到奇怪的錯誤。<br/>
方法就是加上隱藏的參數 oe，以 big5 為例：
<pre name="code" class="html">
&lt;script src="http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;key=your_key&amp;amp;oe=big5" type="text/javascript"&gt;&lt;/script&gt;
</pre>
<br/>
或許你也跟我注意到了，這兒並不是使用 &amp;，而是使用 &amp;amp;，並不是我故意寫錯，而是<a href="http://code.google.com/apis/maps/documentation/examples/">官方提供的範例</a>就是如此，而且 IE6、IE7、Firefox 都可以接受...
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/5559477.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/5559477.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Mon, 18 Feb 2008 17:18:28 +0800</pubDate>
</item>
<item>
	<title>plugin_syntaxhighlighter</title>
	<description><![CDATA[
			在 blogger 使用 dp.syntaxhighlighter 的話，你會發現根本無法生效，主要是因為 blogger 把換行符號都替換成 &lt;br/&gt; 了，而且還沒有設定可以決定是否要替換。
很幸運地，有人已經提出解決方法：yehyeh: Blogger dp.SyntaxHighlighter斷行問題解決方法

只是，我已經套用blogger-ext2了，於是想說，是不是可以寫一個blogger-ext2的 plugin 來解決這個問題。
非常感謝jQuery的強大功能，不到半天就完成了，最重要的是，不用像上面解決方法一樣，寫了一堆 code。

// Register dp.SyntaxHighLighter
// Dependency:
//   jQuery-1.2.1
//   blogger-ext2-core (最新版，0.7.x 的樣子)
//   dp.syntaxhighlighter-1.5.1
BloggerExt.SH = function() {
  // Plugin 會由此開始
  if( dp!='undefined' ) {
    // 找到 pre, textarea 下所有 br，然後替換成換行符號，收工。
    jQuery("pre > br").each( function() { jQuery(this).replaceWith( "\n" ); } );
    jQuery("textarea > br").each( function() { jQuery(this).replaceWith( "\n" ); } );
    dp.SyntaxHighlighter.ClipboardSwf = 'http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/clipboard.swf';
    dp.SyntaxHighlighter.HighlightAll('code');
  }
};
BloggerExt.SH.user_pref = function() {
	var prefs = [];
	return prefs;
};
BloggerExt.SH.update_pref = function(prefs) {
};
BloggerExt.register('SH', { SH: true} );


使用範例：

  &lt;script type="text/javascript" src="jquery-1.2.1.pack.js"&gt;&lt;/script&gt;
  &lt;script src="blogger_ext2.js" type="text/javascript"&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shCore.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushCSharp.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushVb.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushPhp.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushJScript.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushSql.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushXml.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushPython.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushCss.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushCpp.js'&gt;&lt;/script&gt;
  &lt;!--假設你已經把上面代碼存為 plugin_syntaxhighlighter.js 了 --&gt;
  &lt;script type="text/javascript" src='plugin_syntaxhighlighter.js'&gt;&lt;/script&gt;


		]]>
	</description>
	<content:encoded><![CDATA[
			在 <a href="http://www.blogger.com">blogger</a> 使用 <a href="http://code.google.com/p/syntaxhighlighter/">dp.syntaxhighlighter</a> 的話，你會發現根本無法生效，主要是因為 <a href="http://www.blogger.com">blogger</a> 把換行符號都替換成 &lt;br/&gt; 了，而且還沒有設定可以決定是否要替換。<br/>
很幸運地，有人已經提出解決方法：<a href="http://yehhou.blogspot.com/2007/06/blogger-dpsyntaxhighlighter.html">yehyeh: Blogger dp.SyntaxHighlighter斷行問題解決方法</a><br/>
<br/>
只是，我已經套用<a href="http://code.google.com/p/blogger-ext2/">blogger-ext2</a>了，於是想說，是不是可以寫一個<a href="http://code.google.com/p/blogger-ext2/">blogger-ext2</a>的 plugin 來解決這個問題。<br/>
非常感謝<a href="http://www.jquery.com">jQuery</a>的強大功能，不到半天就完成了，最重要的是，不用像上面解決方法一樣，寫了一堆 code。<br/>
<pre name="code" class="javascript">
// Register dp.SyntaxHighLighter
// Dependency:
//   jQuery-1.2.1
//   blogger-ext2-core (最新版，0.7.x 的樣子)
//   dp.syntaxhighlighter-1.5.1
BloggerExt.SH = function() {
  // Plugin 會由此開始
  if( dp!='undefined' ) {
    // 找到 pre, textarea 下所有 br，然後替換成換行符號，收工。
    jQuery("pre > br").each( function() { jQuery(this).replaceWith( "\n" ); } );
    jQuery("textarea > br").each( function() { jQuery(this).replaceWith( "\n" ); } );
    dp.SyntaxHighlighter.ClipboardSwf = 'http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/clipboard.swf';
    dp.SyntaxHighlighter.HighlightAll('code');
  }
};
BloggerExt.SH.user_pref = function() {
	var prefs = [];
	return prefs;
};
BloggerExt.SH.update_pref = function(prefs) {
};
BloggerExt.register('SH', { SH: true} );
</pre>
<br/>
使用範例：
<pre name="code" class="html">
  &lt;script type="text/javascript" src="jquery-1.2.1.pack.js"&gt;&lt;/script&gt;
  &lt;script src="blogger_ext2.js" type="text/javascript"&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shCore.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushCSharp.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushVb.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushPhp.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushJScript.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushSql.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushXml.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushPython.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushCss.js'&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src='http://syntaxhighlighter.googlecode.com/svn/tags/1.5.1/Scripts/shBrushCpp.js'&gt;&lt;/script&gt;
  &lt;!--假設你已經把上面代碼存為 plugin_syntaxhighlighter.js 了 --&gt;
  &lt;script type="text/javascript" src='plugin_syntaxhighlighter.js'&gt;&lt;/script&gt;
</pre>
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/4685373.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/4685373.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Wed, 19 Dec 2007 17:44:01 +0800</pubDate>
</item>
<item>
	<title>Postfix log 出現 Database files are not up-to-date 的解法</title>
	<description><![CDATA[
			Google it!! 請參照：[CentOS] Postfix /etc/aliases problem
postconf -e "alias_maps = hash:/etc/aliases"
postconf -e "alias_database = hash:/etc/aliases"

Then run 'newaliases' to rebuild the aliases.db file from the text file.


		]]>
	</description>
	<content:encoded><![CDATA[
			Google it!! 請參照：<a href="http://lists.centos.org/pipermail/centos/2006-April/064210.html">[CentOS] Postfix /etc/aliases problem</a><br />
<blockquote>postconf -e "alias_maps = hash:/etc/aliases"<br />
postconf -e "alias_database = hash:/etc/aliases"<br />
<br />
Then run 'newaliases' to rebuild the aliases.db file from the text file.<br />
</blockquote><br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/4676643.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/4676643.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Tue, 18 Dec 2007 23:04:14 +0800</pubDate>
</item>
<item>
	<title>SyncToy</title>
	<description><![CDATA[
			AllwaySync是可以用，但卻有限制，如果一次同步超過 20000 個檔案，抱歉，請買原版，現在有特價，約美金 20 元。該買嗎？

我不死心地再找了一次，突然想起前一陣子丟在桌面的 SyncToy，既然是Microsoft的好意，不如裝起來試試吧。
喔！
不錯用呢～ (對不起，不附圖片了...因為，豆漿濃...)
使用的體驗與 AllwaySync 接近，而且比 AllwaySync 聰明，會自動判定檔案是否被更名，而不會傻傻的刪除，再重新複製。

好東西，下載網址：SyncToy: a free powertoy download for file synchronization

p.s. 官方說法 XP/Vista 適用，經過我的實驗，Windows 2000 也可以用，只要有裝 .Net framework 2.0 即可。

		]]>
	</description>
	<content:encoded><![CDATA[
			<a href="www.allwaysync.com/">AllwaySync</a>是可以用，但卻有限制，如果一次同步超過 20000 個檔案，抱歉，請買原版，現在有特價，約美金 20 元。該買嗎？<br />
<br />
我不死心地再找了一次，突然想起前一陣子丟在桌面的 <a href="http://www.microsoft.com/windowsxp/using/digitalphotography/prophoto/synctoy.mspx">SyncToy</a>，既然是<a href="http://www.microsoft.com">Microsoft</a>的好意，不如裝起來試試吧。<br />
喔！<br />
不錯用呢～ (對不起，不附圖片了...因為，豆漿濃...)<br />
使用的體驗與 <a href="www.allwaysync.com/">AllwaySync</a> 接近，而且比 <a href="www.allwaysync.com/">AllwaySync</a> 聰明，會自動判定檔案是否被更名，而不會傻傻的刪除，再重新複製。<br />
<br />
好東西，下載網址：<a href="http://www.microsoft.com/windowsxp/using/digitalphotography/prophoto/synctoy.mspx">SyncToy: a free powertoy download for file synchronization</a><br />
<br />
p.s. 官方說法 XP/Vista 適用，經過我的實驗，Windows 2000 也可以用，只要有裝 .Net framework 2.0 即可。<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/4559081.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/4559081.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Thu, 29 Nov 2007 18:16:10 +0800</pubDate>
</item>
<item>
	<title>用 Python smtplib 寄信出現認證失敗</title>
	<description><![CDATA[
			如果你使用 Python smtplib.py 寄信時，遇到認證錯誤訊息(Authentication error)，不妨試試改變一下認證的順序，請在 smtplib.py 裡面找
        # List of authentication methods we support: from preferred to
        # less preferred methods. Except for the purpose of testing the weaker
        # ones, we prefer stronger methods like CRAM-MD5:
        preferred_auths = [AUTH_CRAM_MD5, AUTH_PLAIN, AUTH_LOGIN]
然後修改一下順序，        preferred_auths = [AUTH_LOGIN, AUTH_CRAM_MD5, AUTH_PLAIN]
或許就能迎刃而解。

		]]>
	</description>
	<content:encoded><![CDATA[
			如果你使用 <a href="http://www.python.org">Python</a> smtplib.py 寄信時，遇到認證錯誤訊息(Authentication error)，不妨試試改變一下認證的順序，請在 smtplib.py 裡面找
<pre name="code" class="python">        # List of authentication methods we support: from preferred to
        # less preferred methods. Except for the purpose of testing the weaker
        # ones, we prefer stronger methods like CRAM-MD5:
        preferred_auths = [AUTH_CRAM_MD5, AUTH_PLAIN, AUTH_LOGIN]</pre>
然後修改一下順序，<pre name="code" class="python">        preferred_auths = [AUTH_LOGIN, AUTH_CRAM_MD5, AUTH_PLAIN]</pre>
或許就能迎刃而解。
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/4506713.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/4506713.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Mon, 19 Nov 2007 17:38:28 +0800</pubDate>
</item>
<item>
	<title>Prism 的網路設定</title>
	<description><![CDATA[
			如果你已經安裝了Prism 0.8(下載)，而環境正好有該死的 Proxy 的話(是的，目前Prism 0.8不提供網路設定的選項)，那麼你可以試著修改 C:\Documents and Settings\your_username\Application Data\Prism\Profiles\xxxxxxx.default\prefs.js，在後面加上這幾行：
如果是自動偵測的話，user_pref("network.proxy.type","4");如果已經知道 proxy 位址與 port的話，user_pref("network.proxy.http","localhost");
user_pref("network.proxy.http_port","3128");
user_pref("network.proxy.type","1");如果知道Proxy自動設定網址的話，user_pref("network.proxy.autoconfig_url", "http://isawp1.msi.com.tw:80/wpad.dat");
user_pref("network.proxy.socks_version", 0);
user_pref("network.proxy.type", 2);

		]]>
	</description>
	<content:encoded><![CDATA[
			如果你已經安裝了<a href="http://labs.mozilla.com/2007/10/prism/" title="Mozilla Labs Blog » Blog Archive » Prism">Prism 0.8</a>(<a href="http://starkravingfinkle.org/projects/webrunner/prism-0.8-win32.exe" title="Prism 0.8">下載</a>)，而環境正好有該死的 Proxy 的話(是的，目前<a href="http://labs.mozilla.com/2007/10/prism/">Prism 0.8</a>不提供網路設定的選項)，那麼你可以試著修改 C:\Documents and Settings\<b>your_username</b>\Application Data\Prism\Profiles\xxxxxxx.default\prefs.js，在後面加上這幾行：<br />
<ol><li>如果是自動偵測的話，<pre>user_pref("network.proxy.type","4");</pre></li><li>如果已經知道 proxy 位址與 port的話，<pre>user_pref("network.proxy.http","localhost");<br />
user_pref("network.proxy.http_port","3128");<br />
user_pref("network.proxy.type","1");</pre></li><li>如果知道Proxy自動設定網址的話，<pre>user_pref("network.proxy.autoconfig_url", "http://isawp1.msi.com.tw:80/wpad.dat");<br />
user_pref("network.proxy.socks_version", 0);<br />
user_pref("network.proxy.type", 2);</pre></li></ol><br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/4386905.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/4386905.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Mon, 29 Oct 2007 16:08:57 +0800</pubDate>
</item>
<item>
	<title>Apache SSL on Windows</title>
	<description><![CDATA[
			新版的Apache Windows 版最近加上了 SSL 支援，建立憑證的方法跟在 Linux 下一樣，需要的話可以參考：鳥哥的Linux私房菜：建立 SSL (https) 網站

指令大致都一樣，只有一點點不同：
cd "C:\Program Files\Apache Group\Apache2\conf"
mkdir ssl.key
..\bin\openssl genrsa -out ssl.key\server.key 1024
mkdir ssl.crt
..\bin\openssl req -new -x509 -key ssl.key\server.key -out ssl.crt\server.crt -config .\openssl.cnf

接著修改你的 httpd.conf/mod_ssl.conf ，修改完成以後，重新安裝 Apache 到"服務"裡面去：
..\bin\apache -k stop
..\bin\apache -k uninstall
..\bin\apache -D SSL -k install

接著重新啟動，就完成了。
..\bin\apache -k  start

		]]>
	</description>
	<content:encoded><![CDATA[
			新版的<a href="http://httpd.apache.org">Apache</a> Windows 版最近加上了 SSL 支援，建立憑證的方法跟在 Linux 下一樣，需要的話可以參考：<a href="http://linux.vbird.org/linux_server/0360apache.php#www_ssl">鳥哥的Linux私房菜：建立 SSL (https) 網站</a><br/>
<br/>
指令大致都一樣，只有一點點不同：
<pre>cd "C:\Program Files\Apache Group\Apache2\conf"
mkdir ssl.key
..\bin\openssl genrsa -out ssl.key\server.key 1024
mkdir ssl.crt
..\bin\openssl req -new -x509 -key ssl.key\server.key -out ssl.crt\server.crt -config .\openssl.cnf</pre>
<br/>
接著修改你的 httpd.conf/mod_ssl.conf ，修改完成以後，重新安裝 Apache 到"服務"裡面去：<br/>
<pre>..\bin\apache -k stop
..\bin\apache -k uninstall
..\bin\apache -D SSL -k install</pre>
<br/>
接著重新啟動，就完成了。
<pre>..\bin\apache -k  start</pre>
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/4285587.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/4285587.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Thu, 11 Oct 2007 16:33:22 +0800</pubDate>
</item>
<item>
	<title>ImageMagicK 範例大全</title>
	<description><![CDATA[
			今天打算寫 script 來產生圖片，這當然要用 ImageMagicK 囉～
上官方網站一看，範例都幫你寫好好的了：ImageMagick v6 Examples

這下只要套用之前寫過的產生 5000 首 mp3 的 script ，稍作修改就行了。

		]]>
	</description>
	<content:encoded><![CDATA[
			今天打算寫 script 來產生圖片，這當然要用 <a href="http://www.imagemagick.org/">ImageMagicK</a> 囉～<br />
上官方網站一看，範例都幫你寫好好的了：<a href="http://www.imagemagick.org/Usage/">ImageMagick v6 Examples</a><br />
<br />
這下只要套用之前寫過的產生 5000 首 mp3 的 script ，稍作修改就行了。<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/4164865.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/4164865.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Wed, 19 Sep 2007 19:01:50 +0800</pubDate>
</item>
<item>
	<title>Vim folding</title>
	<description><![CDATA[
			今天無聊把玩Vim的 :help，想起了以前有試過，但忘記的功能 - folding～

可是跟以前記得的用法好像不太一樣，總之，現在的用法很簡單：
set foldmethod=syntax
(Python或Boo的話，可以用 set foldmethod=indent
這樣就行了。其他的用法請參考 :help。)

你會看到Vim已經依照語法自動幫你把相關的 function/class 都折疊起來了。
接著就可以用 zo 打開，zc 關閉，zO 打開目前 folding 裡面的所有 folding，zC 則是關閉目前 folding 裡面的所有 folding～


		]]>
	</description>
	<content:encoded><![CDATA[
			今天無聊把玩<a href="http://www.vim.org">Vim</a>的 :help，想起了以前有試過，但忘記的功能 - folding～<br />
<br />
可是跟以前記得的用法好像不太一樣，總之，現在的用法很簡單：<br />
<pre>set foldmethod=syntax</pre><br />
(<a href="http://www.python.org">Python</a>或<a href="http://boo.codehaus.org/">Boo</a>的話，可以用 <pre>set foldmethod=indent</pre><br />
這樣就行了。其他的用法請參考 :help。)<br />
<br />
你會看到<a href="http://www.vim.org">Vim</a>已經依照語法自動幫你把相關的 function/class 都折疊起來了。<br />
接著就可以用 zo 打開，zc 關閉，zO 打開目前 folding 裡面的所有 folding，zC 則是關閉目前 folding 裡面的所有 folding～<br />
<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/4142293.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/4142293.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Sat, 15 Sep 2007 21:25:01 +0800</pubDate>
</item>
<item>
	<title>如何使用 Box.Net API?</title>
	<description><![CDATA[
			當然，已經有人開發好 Library 的話，那麼直接使用是最快的。
所以第一步就是上 Box Enabled - Sources 看看，是否有合用的。
目前已經有 PHP、Python、Action Script 3 的版本可以使用。

找不到的話，第二步就是去 Box Enabled - Projects 找找看是否有人正在寫。

再不成，那麼就是要自己寫了。
官方的文件其實相當齊全，你可以參考Box Enabled - Documents。
你有三種方式可以存取：SOAP、XML POST、REST

我這裡以REST來舉例：取得 API key：你得先註冊成 developer，建立你的 project，才能取得 API Key。要使用任何功能前，你必須先取得 Ticket，訪問 http://www.box.net/api/1.0/rest?action=get_ticket&api_key=your_api_key (your_api_key請自行帶入)，Parse 收到的XML，取得 ticket，這裡有輸出結果的範例。利用 Ticket 進行 login，這個動作實際上就是 POST 這些資訊dologin=1
__login=1
login=your_email
password=your_password到 http://www.box.net/api/1.0/auth/your_ticket 這個網址去。取得 auth_token：登入完成以後，就可以訪問 http://www.box.net/api/1.0/rest?action=get_auth_token&api_key=your_api_key&ticket=your_ticket，再 Parse 收到的 XML，取得 auth_token，同樣地，這兒有很好的釋例。拿到的 auth_token，接下來想幹麼就可以幹麼了。例如，上傳檔案，你只要 POST 檔案(your_file)到 post 到 http://upload.box.net/api/upload/your_auth_token/your_file 就可以了。

事實上，有 SOAP (就是Web Service)的話，在某些語言來說，是很方便的，例如 .Net 就可以直接利用 Add web reference 或是利用 wsdl 指令列工具來產生代碼：wsdl /language:cs http://box.net/api/1.0/soap?wsdl ...


		]]>
	</description>
	<content:encoded><![CDATA[
			當然，已經有人開發好 Library 的話，那麼直接使用是最快的。<br />
所以第一步就是上 <a href="http://enabled.box.net/sources">Box Enabled - Sources</a> 看看，是否有合用的。<br />
目前已經有 PHP、Python、Action Script 3 的版本可以使用。<br />
<br />
找不到的話，第二步就是去 <a href="http://enabled.box.net/projects/">Box Enabled - Projects</a> 找找看是否有人正在寫。<br />
<br />
再不成，那麼就是要自己寫了。<br />
官方的文件其實相當齊全，你可以參考<a href="http://enabled.box.net/docs/">Box Enabled - Documents</a>。<br />
你有三種方式可以存取：SOAP、XML POST、REST<br />
<br />
我這裡以REST來舉例：<ol><li>取得 API key：你得先註冊成 developer，建立你的 project，才能取得 API Key。</li><li>要使用任何功能前，你必須先取得 Ticket，訪問 http://www.box.net/api/1.0/rest?action=get_ticket&api_key=your_api_key (your_api_key請自行帶入)，Parse 收到的XML，取得 ticket，<a href="http://enabled.box.net/docs/rest#get_ticket">這裡</a>有輸出結果的範例。</li><li>利用 Ticket 進行 login，這個動作實際上就是 POST 這些資訊<pre>dologin=1<br />
__login=1<br />
login=your_email<br />
password=your_password</pre>到 http://www.box.net/api/1.0/auth/your_ticket 這個網址去。</li><li>取得 auth_token：登入完成以後，就可以訪問 http://www.box.net/api/1.0/rest?action=get_auth_token&api_key=your_api_key&ticket=your_ticket，再 Parse 收到的 XML，取得 auth_token，同樣地，<a href="http://enabled.box.net/docs/rest#get_auth_token">這兒</a>有很好的釋例。</li><li>拿到的 auth_token，接下來想幹麼就可以幹麼了。例如，上傳檔案，你只要 POST 檔案(your_file)到 post 到 http://upload.box.net/api/upload/your_auth_token/your_file 就可以了。</li></ol><br />
<br />
事實上，有 SOAP (就是Web Service)的話，在某些語言來說，是很方便的，例如 .Net 就可以直接利用 Add web reference 或是利用 wsdl 指令列工具來產生代碼：wsdl /language:cs http://box.net/api/1.0/soap?wsdl ...<br />
<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/4036199.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/4036199.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Tue, 28 Aug 2007 18:10:18 +0800</pubDate>
</item>
<item>
	<title>About Box.Net</title>
	<description><![CDATA[
			Box.Net是這兩年來蠻紅火的一個網路硬碟服務，特色是夠大：1G，而且可以分享。

為什麼會知道這個，是因為以前同學的介紹，當時我還以為他家裏要開站呢～結果才發現是Box.Net，也因此開始使用，不過實在用的不多。

最近想到可以拿這個東西來作備份，於是上Box.Net看看，發現有For Deveoper的 API，看了一看，用的軟體還真不少，像是FireUploader...等等。不過好像沒有適當的 library ?於是決定自己看Documentation來幹一個，語言就用最近看到的Boo吧～

於是就申請了專案：BooBoxNet，也去 Google code開了專案：BooBoxNet，浩浩蕩蕩的開始。今天終於有了點成果，再次回到官方網站，卻發現已經有Library了？！這還真是尷尬...算了，反正都寫了，也沒打算寫很大，能作簡單的 Upload、刪除就行了～這幾天應該就可以完工了。

		]]>
	</description>
	<content:encoded><![CDATA[
			<a href="http://www.box.net">Box.Net</a>是這兩年來蠻紅火的一個網路硬碟服務，特色是夠大：1G，而且可以分享。<br />
<br />
為什麼會知道這個，是因為<a href="http://cold-joke.blogspot.com/" title="冷笑話的暖暖包">以前同學</a>的介紹，當時我還以為他家裏要開站呢～結果才發現是<a href="http://www.box.net">Box.Net</a>，也因此開始使用，不過實在用的不多。<br />
<br />
最近想到可以拿這個東西來作備份，於是上<a href="http://www.box.net">Box.Net</a>看看，發現有<a href="http://enabled.box.net/">For Deveoper</a>的 API，看了一看，用的軟體還真不少，像是<a href="http://enabled.box.net/project/138">FireUploader</a>...等等。不過好像沒有適當的 library ?於是決定自己看<a href="http://enabled.box.net/docs">Documentation</a>來幹一個，語言就用最近看到的<a hef="http://boo.codehaus.org/">Boo</a>吧～<br />
<br />
於是就申請了專案：<a href="http://enabled.box.net/project/519">BooBoxNet</a>，也去 <a href="http://code.google.com">Google code</a>開了專案：<a href="http://code.google.com/p/booboxnet/">BooBoxNet</a>，浩浩蕩蕩的開始。今天終於有了點成果，再次回到官方網站，卻發現已經有<a href="http://enabled.box.net/sources">Library</a>了？！這還真是尷尬...算了，反正都寫了，也沒打算寫很大，能作簡單的 Upload、刪除就行了～這幾天應該就可以完工了。<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/3924343.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/3924343.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Mon, 13 Aug 2007 21:30:58 +0800</pubDate>
</item>
<item>
	<title>svk</title>
	<description><![CDATA[
			本想利用 svk 把 CastleProject 拉(Mirror/Sync)下來，然後在官方還沒修正之前，先在本地端作一些小修正，然後自己用的。不過，在 Windows 上，不管是拉全部還是只拉 HEAD 都失敗，只好殘念。

而用我的 Ubuntu Notebook 卻是 ok，我猜應該是 perl library / svk 在 Windows 上有些問題。本想試著用 cygwin + perl + svk，可是卻安裝失敗，懶得繼續試了。

雖然結果是失敗，可是 svk 仍然是個好物。我個人想到兩種情況，svk會特別好用(這也是官方所推薦的幾種用法之二)：出差，畢竟出門在外不一定都會有網路，而且也不一定能連到公司的 Repository server，這時就可以拉 code 到 Notebook，然後在 Notebook 上作版本控制，等到回公司了，再把 code 推回去公司的 Repository server。專案內使用了某 Open source，通常 Open source 專案會不時變動，開發時期會需要固定一個版本下來，這時候就可以拉一份下來作管理，到時候可以很容易釐清是哪裡的問題

基本上整個用法都跟 Subversion 很接近，所以應該不用多作介紹吧～這邊列出幾篇文章作為參考：Version Control with SVK開始使用 SVK(1)開始使用 SVK(2)Jserv's blog: 使用 svk 建立開發分支

目前在 Linux 下，除了可以拉 Subversion 的 code 之外，也可以拉 Perforce、CVS 的 code(資料來自Wikipedia)...可說是好用的不得了～(在 Windows 的話，就別說了，2.0.0-1 只支援 Subversion...)

		]]>
	</description>
	<content:encoded><![CDATA[
			本想利用 <a href="http://svk.bestpractical.com/">svk</a> 把 <a href="http://www.castleproject.org">CastleProject</a> 拉(Mirror/Sync)下來，然後在官方還沒修正之前，先在本地端作一些小修正，然後自己用的。不過，在 Windows 上，不管是拉全部還是只拉 HEAD 都失敗，只好殘念。<br />
<br />
而用我的 <a href="http://www.ubuntulinux.com">Ubuntu</a> Notebook 卻是 ok，我猜應該是 <a href="http://www.perl.org/">perl</a> library / <a href="http://svk.bestpractical.com/">svk</a> 在 Windows 上有些問題。本想試著用 <a href="http://www.cygwin.com/">cygwin</a> + <a href="http://www.perl.org/">perl</a> + <a href="http://svk.bestpractical.com/">svk</a>，可是卻安裝失敗，懶得繼續試了。<br />
<br />
雖然結果是失敗，可是 <a href="http://svk.bestpractical.com/">svk</a> 仍然是個好物。我個人想到兩種情況，<a href="http://svk.bestpractical.com/">svk</a>會特別好用(這也是官方所推薦的幾種用法之二)：<ul><li>出差，畢竟出門在外不一定都會有網路，而且也不一定能連到公司的 Repository server，這時就可以拉 code 到 Notebook，然後在 Notebook 上作版本控制，等到回公司了，再把 code 推回去公司的 Repository server。</li><li>專案內使用了某 Open source，通常 Open source 專案會不時變動，開發時期會需要固定一個版本下來，這時候就可以拉一份下來作管理，到時候可以很容易釐清是哪裡的問題</li></ul><br />
<br />
基本上整個用法都跟 <a href="http://subversion.tigris.org">Subversion</a> 很接近，所以應該不用多作介紹吧～這邊列出幾篇文章作為參考：<ul><li><a href="http://svkbook.elixus.org/">Version Control with SVK</a></li><li><a href="http://www.newzilla.org/2004/08/05/svk_tutorial/">開始使用 SVK(1)</a></li><li><a href="http://www.newzilla.org/2004/08/05/svk_tutorial/index1.html">開始使用 SVK(2)</a></li><li><a href="http://blog.linux.org.tw/~jserv/archives/001900.html">Jserv's blog: 使用 svk 建立開發分支</a></li></ul><br />
<br />
目前在 Linux 下，除了可以拉 <a href="http://subversion.tigris.org">Subversion</a> 的 code 之外，也可以拉 <a href="http://en.wikipedia.org/wiki/Perforce">Perforce</a>、<a href="http://en.wikipedia.org/wiki/Concurrent_Versions_System">CVS</a> 的 code(資料來自<a href="http://en.wikipedia.org/wiki/Svk" title="SVK - Wikipedia, the free encyclopedia">Wikipedia</a>)...可說是好用的不得了～(在 Windows 的話，就別說了，<a href="http://home.comcast.net/%7Eklight/svk/svk-2.0.0-1.exe">2.0.0-1</a> 只支援 <a href="http://subversion.tigris.org">Subversion</a>...)<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/3848197.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/3848197.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Wed, 01 Aug 2007 21:35:01 +0800</pubDate>
</item>
<item>
	<title>如何加入 Feed 閱覽器在 FireFox 的Feed選項裡？</title>
	<description><![CDATA[
			看這篇文章就對了：Adding feed readers to Firefox - MDC

在網址列輸入 about:config在 Filter 欄輸入 browser.contentHandler自己去新增或是修改既有的項目即可，記得，數字不要重複。重新啟動 FireFox

文章也有提到用 Javascript 的方式，所以你可以在網頁裡面利用 navigator.registerContentHandler() 這個函數來註冊到 FireFox 裡面。

		]]>
	</description>
	<content:encoded><![CDATA[
			看這篇文章就對了：<a href="http://developer.mozilla.org/en/docs/Adding_feed_readers_to_Firefox">Adding feed readers to Firefox - MDC</a><br />
<br />
<ol><li>在網址列輸入 about:config</li><li>在 Filter 欄輸入 browser.contentHandler</li><li>自己去新增或是修改既有的項目即可，記得，數字不要重複。</li><li>重新啟動 <a href="http://www.getfirefox.com">FireFox</a></li></ol><br />
<br />
文章也有提到用 Javascript 的方式，所以你可以在網頁裡面利用 navigator.registerContentHandler() 這個函數來註冊到 <a href="http://www.getfirefox.com">FireFox</a> 裡面。<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/3725083.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/3725083.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Fri, 27 Jul 2007 15:30:21 +0800</pubDate>
</item>
<item>
	<title>ActiveRecord SessionScope/Transaction</title>
	<description><![CDATA[
			ActiveRecord是很方便沒錯，只是如果你要處理大量時，底層的NHibernate會以你意想不到的方式去逐條更新資料表格，可想而知，這很慢～
幸好官方有提供了文件(Using Scopes :: Castle Project, Understanding Scopes :: Castle Project)，告知你如何利用SessionScope來完成批次處理，也就是先行處理完畢以後，再一次寫入，這樣子速度就可以達到一定程度的提昇。

		]]>
	</description>
	<content:encoded><![CDATA[
			<a href="http://www.castleproject.org/activerecord/index.html">ActiveRecord</a>是很方便沒錯，只是如果你要處理大量時，底層的<a href="http://www.hibernate.org/">NHibernate</a>會以你意想不到的方式去逐條更新資料表格，可想而知，這很慢～<br />
幸好官方有提供了文件(<a href="http://www.castleproject.org/activerecord/documentation/v1rc1/usersguide/scopes.html">Using Scopes :: Castle Project</a>, <a href="http://www.castleproject.org/activerecord/documentation/v1rc1/manual/scopes.html">Understanding Scopes :: Castle Project</a>)，告知你如何利用SessionScope來完成批次處理，也就是先行處理完畢以後，再一次寫入，這樣子速度就可以達到一定程度的提昇。<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/3724915.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/3724915.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Fri, 27 Jul 2007 14:33:48 +0800</pubDate>
</item>
<item>
	<title>用 foobar2000 來將 APE 轉為 MP3</title>
	<description><![CDATA[
			多虧了這篇APE 轉 MP3 圖解教學，我才得以進行轉檔。
這邊就不再多作贅述了...
簡單的說，就是要開啟 cue 檔案，然後進行轉換。

我碰到的問題是，cue 檔案可能會有編碼的問題，所以得先利用ConvertZ來轉換檔案內碼。

		]]>
	</description>
	<content:encoded><![CDATA[
			多虧了這篇<a href="http://wwwvic.myweb.hinet.net/APE2.htm">APE 轉 MP3 圖解教學</a>，我才得以進行轉檔。<br />
這邊就不再多作贅述了...<br />
簡單的說，就是要開啟 cue 檔案，然後進行轉換。<br />
<br />
我碰到的問題是，cue 檔案可能會有編碼的問題，所以得先利用<a href="http://alf-li.pcdiscuss.com/">ConvertZ</a>來轉換檔案內碼。<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/3661881.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/3661881.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Sun, 15 Jul 2007 10:22:43 +0800</pubDate>
</item>
<item>
	<title>在 Windows 下 build php 的方法</title>
	<description><![CDATA[
			幾個月前嘗試著要自己重新 build PHP...

其實方法都可以在原始碼解開以後的 README.WIN32-BUILD-SYSTEM 裡面找到。這裡只是算是一些小補充而已。
不過，我最後的結果是失敗，好像還缺了些東西，後來也沒有繼續試，這邊還是先記錄下來，有機會繼續嘗試。

下載官方提供的原始碼壓縮檔。解開，請先看過 README.WIN32-BUILD-SYSTEM 一遍，這會是很好的指引。安裝以下東西：Visual Studio 6 或 Visual Studio 2003Platform SDK官方提供的 win32build.zip 其他必要的 library(自己參考說明吧)打開 Command Prompt，切換到解壓以後的目錄下。輸入 buildconf 並按下 enter。解開 win32build.zip。設定環境變數：set lib=win32build_unzipped_directory\lib
set include=win32build_unzipped_directory\include
set path=%path%;win32build_unzipped_directory\bin
接著再執行 C:\Program Files\Microsoft Platform SDK\setenv.cmd。"C:\Program Files\Microsoft Platform SDK\setenv.cmd" /2000或"C:\Program Files\Microsoft Platform SDK\setenv.cmd" /xp32
進行設定，這會產生 Makefile。cscript /nologo configure.js --disable-ipv6 --disable-fastcgi --enable-cli-win32 --disable-calendar --disable-filter --disable-ftp --disable-zlib --without-wddx --without-xml --disable-xmlreader --disable-xmlwriter --without-dom --without-simplexml --without-gd --without-t1lib --disable-ctype --without-iconv --disable-bcmath --disable-com-dotnet --disable-json執行 nmake，應該就會大功告成。

		]]>
	</description>
	<content:encoded><![CDATA[
			幾個月前嘗試著要自己重新 build <a href="http://www.php.net">PHP</a>...<br/>
<br/>
其實方法都可以在原始碼解開以後的 README.WIN32-BUILD-SYSTEM 裡面找到。這裡只是算是一些小補充而已。<br/>
不過，我最後的結果是失敗，好像還缺了些東西，後來也沒有繼續試，這邊還是先記錄下來，有機會繼續嘗試。<br/>
<br/>
<ol><li>下載官方提供的原始碼壓縮檔。</li><li>解開，請先看過 README.WIN32-BUILD-SYSTEM 一遍，這會是很好的指引。</li><li>安裝以下東西：<ul><li>Visual Studio 6 或 Visual Studio 2003</li><li>Platform SDK</li><li>官方提供的 win32build.zip </li><li>其他必要的 library(自己參考說明吧)</li></ul></li><li>打開 Command Prompt，切換到解壓以後的目錄下。輸入 buildconf 並按下 enter。</li><li>解開 win32build.zip。</li><li>設定環境變數：<pre>set lib=win32build_unzipped_directory\lib
set include=win32build_unzipped_directory\include
set path=%path%;win32build_unzipped_directory\bin
</pre>接著再執行 C:\Program Files\Microsoft Platform SDK\setenv.cmd。<pre>"C:\Program Files\Microsoft Platform SDK\setenv.cmd" /2000</pre>或<pre>"C:\Program Files\Microsoft Platform SDK\setenv.cmd" /xp32
</pre></li><li>進行設定，這會產生 Makefile。<pre>cscript /nologo configure.js --disable-ipv6 --disable-fastcgi --enable-cli-win32 --disable-calendar --disable-filter --disable-ftp --disable-zlib --without-wddx --without-xml --disable-xmlreader --disable-xmlwriter --without-dom --without-simplexml --without-gd --without-t1lib --disable-ctype --without-iconv --disable-bcmath --disable-com-dotnet --disable-json</pre></li><li>執行 nmake，<b>應該就會</b>大功告成。</li></ol>
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/3661861.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/3661861.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Sun, 15 Jul 2007 09:57:19 +0800</pubDate>
</item>
<item>
	<title>Regular expression 是貪婪的</title>
	<description><![CDATA[
			前兩天才赫然發現，自己完全忽略了這個特性，導致結果完全不是我所預期...
這個特性就是貪婪(請參考:一輩子受用的 Regular Expressions -- 兼談另類的電腦學習態度)。

所以當你想要利用這個式子：\&lt;title\&gt;(?&lt;titleStr&gt;.*)\&lt;/title\&gt; 去這堆文字： &lt;title&gt;AAA&lt;/title&gt;...other tags...&lt;title&gt;BB&lt;/title&gt; 取得每對 &lt;title&gt;...&lt;/title&gt; 裡面的文字時，實際上只得到一個結果，內容是 AAA&lt;/title&gt;...other tags...&lt;title&gt;BB

&gt;_&lt; 這下該怎麼辦？
我想到幾種方式：取得每個 &lt;title&gt; 的位置，然後再利用 String.IndexOf 去搜尋 &lt;/title&gt;，取得位置之後，就可以取得&lt;title&gt;...&lt;/title&gt; 裡面的文字。分別用 Regular Expression 取得&lt;title&gt;與&lt;/title&gt;的位置，然後再依據結果，去取裡面的字串。

希望是能有更好的解～
		]]>
	</description>
	<content:encoded><![CDATA[
			前兩天才赫然發現，自己完全忽略了這個特性，導致結果完全不是我所預期...<br />
這個特性就是<b>貪婪</b>(請參考:<a href="http://saturn.stu.edu.tw/~ckhung/b/gnu/regexp.php">一輩子受用的 Regular Expressions -- 兼談另類的電腦學習態度</a>)。<br />
<br />
所以當你想要利用這個式子：\&lt;title\&gt;(?&lt;titleStr&gt;.*)\&lt;/title\&gt; 去這堆文字： &lt;title&gt;AAA&lt;/title&gt;...other tags...&lt;title&gt;BB&lt;/title&gt; 取得每對 &lt;title&gt;...&lt;/title&gt; 裡面的文字時，實際上只得到一個結果，內容是 AAA&lt;/title&gt;...other tags...&lt;title&gt;BB<br />
<br />
&gt;_&lt; 這下該怎麼辦？<br />
我想到幾種方式：<ul><li>取得每個 &lt;title&gt; 的位置，然後再利用 String.IndexOf 去搜尋 &lt;/title&gt;，取得位置之後，就可以取得&lt;title&gt;...&lt;/title&gt; 裡面的文字。</li><li>分別用 Regular Expression 取得&lt;title&gt;與&lt;/title&gt;的位置，然後再依據結果，去取裡面的字串。</li></ul><br />
<br />
希望是能有更好的解～				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/3460377.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/3460377.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Wed, 13 Jun 2007 12:25:26 +0800</pubDate>
</item>
<item>
	<title>Vim 7.1 / MRU / TagMenu</title>
	<description><![CDATA[
			最近 Vim 釋出了 7.1 版，這兩天順手更新了。
在下載的同時，邊找一下有沒有好用的 Plugin：
mru - Plugin to manage Most Recently Used (MRU) files，顧名思義，就是在 Menu 安插一個 Most recent used (最近使用) 的選單，讓你可以從選單選到最近編輯的檔案。
TagsMenu - Creates a menu of all the tags in the current file.，這個其實跟 taglist 很像，只是 taglist 是分割一個視窗出來顯示 Tag，而 TagsMenu 則是在選單安插一個 Tags 項目，顯示出所有 Tags。他的 ctags 指令比較不一樣，記得要加上 -f - --fields=+K，例如：let TagsMenu_ctagsCommand='c:\tools\ctags.exe -f - --fields=+K '

		]]>
	</description>
	<content:encoded><![CDATA[
			最近 <a href="http://vim.org">Vim</a> 釋出了 7.1 版，這兩天順手更新了。<br />
在下載的同時，邊找一下有沒有好用的 Plugin：<br />
<ul><li><a href="http://www.vim.org/scripts/script.php?script_id=521" title="MRU">mru</a> - Plugin to manage Most Recently Used (MRU) files，顧名思義，就是在 Menu 安插一個 Most recent used (最近使用) 的選單，讓你可以從選單選到最近編輯的檔案。</li><br />
<li><a href="http://www.vim.org/scripts/script.php?script_id=55" title="TagsMenu">TagsMenu</a> - Creates a menu of all the tags in the current file.，這個其實跟 <a href="http://www.vim.org/scripts/script.php?script_id=273">taglist</a> 很像，只是 <a href="http://www.vim.org/scripts/script.php?script_id=273">taglist</a> 是分割一個視窗出來顯示 Tag，而 <a href="http://www.vim.org/scripts/script.php?script_id=55" title="TagsMenu">TagsMenu</a> 則是在選單安插一個 Tags 項目，顯示出所有 Tags。他的 ctags 指令比較不一樣，記得要加上 <b>-f - --fields=+K</b>，例如：<blockquote>let TagsMenu_ctagsCommand='c:\tools\ctags.exe -f - --fields=+K '</blockquote></li></ul><br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/3265357.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/3265357.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Thu, 17 May 2007 16:54:04 +0800</pubDate>
</item>
<item>
	<title>CVSNT 混合使用 protocol</title>
	<description><![CDATA[
			我們 team 的 CVSNT 一直是用 SSPI 方式，直接與公司內部的 Active Directory 接軌作認證。
如果你想要一些不是在網域的人也能存取 CVS Repostiroy 的話，該怎麼辦呢？

其實 CVSNT 安裝的時候，預設就已經是同時開啟 SSPI 與傳統的使用者認證了～
所以，你需要更動 Server Repository 的 CVSROOT 目錄下的 users、passwd 檔案。
users 的檔案格式是 username:e-mail
passwd 的檔案格式是 username:password:alias

這邊的 password 應該要填入加密過的，不過你可以先不填，稍後再利用 CVS passwd 指令來更改。
舉例來說，你在 users 檔案加入了一行 paul:paul@xxx.com，在 passwd 檔案加入了一行 paul::paul
接著在 client 端使用 cvs -d :pserver:paul@your_server:/your_module login 登入，在詢問密碼時，按下 Enter。
再使用 cvs -d :pserver:paul@your_server:/your_module passwd 更動密碼即可。

如果你要把混合認證的功能關掉的話，得去修改 CVSNT 安裝目錄下的 protocol_map.ini，加入一行 pserver=none，重新啟動 CVSNT 服務以後就可以關閉了。

參考資料：CVS Installation on Windows

		]]>
	</description>
	<content:encoded><![CDATA[
			我們 team 的 <a href="http://www.cvsnt.org/">CVSNT</a> 一直是用 SSPI 方式，直接與公司內部的 Active Directory 接軌作認證。<br />
如果你想要一些不是在網域的人也能存取 CVS Repostiroy 的話，該怎麼辦呢？<br />
<br />
其實 CVSNT 安裝的時候，預設就已經是同時開啟 SSPI 與傳統的使用者認證了～<br />
所以，你需要更動 Server Repository 的 CVSROOT 目錄下的 users、passwd 檔案。<br />
users 的檔案格式是 username:e-mail<br />
passwd 的檔案格式是 username:password:alias<br />
<br />
這邊的 password 應該要填入加密過的，不過你可以先不填，稍後再利用 CVS passwd 指令來更改。<br />
舉例來說，你在 users 檔案加入了一行 paul:paul@xxx.com，在 passwd 檔案加入了一行 paul::paul<br />
接著在 client 端使用 cvs -d :pserver:paul@your_server:/your_module login 登入，在詢問密碼時，按下 Enter。<br />
再使用 cvs -d :pserver:paul@your_server:/your_module passwd 更動密碼即可。<br />
<br />
如果你要把混合認證的功能關掉的話，得去修改 CVSNT 安裝目錄下的 protocol_map.ini，加入一行 pserver=none，重新啟動 CVSNT 服務以後就可以關閉了。<br />
<br />
參考資料：<ul><li><a href="http://www.devguy.com/fp/cfgmgmt/cvs/cvs_admin_nt.htm#pserver">CVS Installation on Windows</a></li></ul><br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/3250105.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/3250105.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Mon, 14 May 2007 18:10:32 +0800</pubDate>
</item>
<item>
	<title>BSP 使用技術概觀</title>
	<description><![CDATA[
			這篇純粹是一篇 Overview...
BSP 大致可以分為三個部份來討論：BSP主頁面、blogger的個人頁面、blogger文章管理平台。
BSP 主頁面，主要就是聚合所有blogger的文章，依照發表先後順序來顯示。這部份就是直接從資料庫去Query資料出來顯示，基本上不困難。額外要補充的部份，在外面你可能還會看到本身不提供 BSP 服務，但提供聯播服務的站台，那他們又是怎麼做的呢？大致上有兩種，一種是由站台本身定期去 pull RSS/ATOM feed 回來作整合(所以想要參加聯播的人，得提出申請；或者有些blog線上閱覽器(Aggregator)會順便提供聯播Widget，如：NewsGator或Google Reader，因為這只是舉手之勞。)；另外一種，則是站台提供有 Weblog ping service的位址，使用者需要在 BSP 的設定去填入此位址，那麼在發表文章的同時，BSP就會去通知該站台說有新文章發表了，該站台再根據這資訊來作顯示或是其他動作(所以新增文章的時候，你會用到這個，當然也可以不提供，這主要是增加 blogger 在其他網站曝光的機會)。blogger個人頁面，只聚合blogger本身的文章，可以依照使用者在管理平台上指定的順序來顯示。文章的產出，一般有常見的兩種作法：一種是從資料庫Query資料出來顯示，這方法相對來說，是比較簡單的，但是資料庫的負載會比較重；另外一種，則是在文章有更動的時候，除了更新到資料庫之外，還同時產生一份 html 檔在對應的位置上，當訪客瀏覽的時候，實際上是直接瀏覽這份 html 檔，把負載集中在 Web server 上，速度會比較快些，缺點則是要修改相關 html 檔案的連結，著名代表是：Movable Type 2.x。關於要不要產生靜態 html 檔案的討論，我記得國外或對岸有人寫專文來討論。TrackBack與留言：留言就不用說了，就留言，有些 BSP 可以讓你在管理介面上直接回覆留言，而不是作者自己要在文章上再留言一次；TrackBack則是類似 Weblog ping services，如果你在文章裡面有引用到其他人的文章，那麼你可以在發表文章的時候，指定 TrackBack 網址，那麼在發表的時候，就會通知該文章，該文章就會知道你有引用，然後在文章後面列出相關資訊。個人化網址，目前國內 BSP 都讓你可以自訂後綴的目錄名稱，但國外的Blogger則可以讓你自訂域名，例如 http://someone.blogspot.com。實作上，多半是利用 Url rewrite 或是直接在 web server 建立相對應的目錄；Blogger的作法我並不清楚，我猜測應該是直接在 DNS 處理掉。
blogger文章管理平台，管理部落格基本設定，新增/修改/刪除文章，或是邀請別人一起來編輯。一般還有提供的功能：變更版面配置(有些則乾脆整份頁面讓你自己去改，如早期的 Blogger)、自訂 CSS、自訂邊欄、簡單的照片管理...等等。

此外還有：RSS/ATOM，這兩種格式，說穿了，就是 XML，只要依照規範去撰寫，大致上就沒什麼問題。Server 的管理、負載平衡、流量管理...

		]]>
	</description>
	<content:encoded><![CDATA[
			這篇純粹是一篇 Overview...<br />
BSP 大致可以分為三個部份來討論：BSP主頁面、blogger的個人頁面、blogger文章管理平台。<br />
<ul><li>BSP 主頁面，主要就是聚合所有blogger的文章，依照發表先後順序來顯示。這部份就是直接從資料庫去Query資料出來顯示，基本上不困難。額外要補充的部份，在外面你可能還會看到本身不提供 BSP 服務，但提供聯播服務的站台，那他們又是怎麼做的呢？大致上有兩種，一種是由站台本身定期去 pull <a href="http://zh.wikipedia.org/w/index.php?title=Rss&amp;variant=zh-tw" title="RSS - Wikipedia">RSS</a>/<a href="http://zh.wikipedia.org/wiki/ATOM" title="Atom - Wikipedia">ATOM</a> feed 回來作整合(所以想要參加聯播的人，得提出申請；或者有些blog線上閱覽器(Aggregator)會順便提供聯播Widget，如：<a href="http://newsgator.com">NewsGator</a>或<a href="http://reader.google.com">Google Reader</a>，因為這只是舉手之勞。)；另外一種，則是站台提供有 <a href="http://www.weblogs.com/api.html" title="Weblogs.com : API">Weblog ping service</a>的位址，使用者需要在 BSP 的設定去填入此位址，那麼在發表文章的同時，BSP就會去通知該站台說有新文章發表了，該站台再根據這資訊來作顯示或是其他動作(所以新增文章的時候，你會用到這個，當然也可以不提供，這主要是增加 blogger 在其他網站曝光的機會)。</li><li>blogger個人頁面，只聚合blogger本身的文章，可以依照使用者在管理平台上指定的順序來顯示。<ol><li>文章的產出，一般有常見的兩種作法：一種是從資料庫Query資料出來顯示，這方法相對來說，是比較簡單的，但是資料庫的負載會比較重；另外一種，則是在文章有更動的時候，除了更新到資料庫之外，還同時產生一份 html 檔在對應的位置上，當訪客瀏覽的時候，實際上是直接瀏覽這份 html 檔，把負載集中在 Web server 上，速度會比較快些，缺點則是要修改相關 html 檔案的連結，著名代表是：Movable Type 2.x。關於要不要產生靜態 html 檔案的討論，我記得國外或對岸有人寫專文來討論。</li><li><a href="http://zh.wikipedia.org/wiki/TrackBack" title="TrackBack - Wikipedia">TrackBack</a>與留言：留言就不用說了，就留言，有些 BSP 可以讓你在管理介面上直接回覆留言，而不是作者自己要在文章上再留言一次；<a href="http://zh.wikipedia.org/wiki/TrackBack" title="TrackBack - Wikipedia">TrackBack</a>則是類似 Weblog ping services，如果你在文章裡面有引用到其他人的文章，那麼你可以在發表文章的時候，指定 <a href="http://zh.wikipedia.org/wiki/TrackBack" title="TrackBack - Wikipedia">TrackBack</a> 網址，那麼在發表的時候，就會通知該文章，該文章就會知道你有引用，然後在文章後面列出相關資訊。</li><li>個人化網址，目前國內 BSP 都讓你可以自訂後綴的目錄名稱，但國外的<a href="http://blogger.com">Blogger</a>則可以讓你自訂域名，例如 http://someone.blogspot.com。實作上，多半是利用 Url rewrite 或是直接在 web server 建立相對應的目錄；<a href="http://blogger.com">Blogger</a>的作法我並不清楚，我猜測應該是直接在 DNS 處理掉。</li></ol></li><br />
<li>blogger文章管理平台，管理部落格基本設定，新增/修改/刪除文章，或是邀請別人一起來編輯。一般還有提供的功能：變更版面配置(有些則乾脆整份頁面讓你自己去改，如早期的 <a href="http://blogger.com">Blogger</a>)、自訂 CSS、自訂邊欄、簡單的照片管理...等等。</li></ul><br />
<br />
此外還有：<ul><li><a href="http://zh.wikipedia.org/w/index.php?title=Rss&amp;variant=zh-tw" title="RSS - Wikipedia">RSS</a>/<a href="http://zh.wikipedia.org/wiki/ATOM" title="Atom - Wikipedia">ATOM</a>，這兩種格式，說穿了，就是 XML，只要依照規範去撰寫，大致上就沒什麼問題。</li><li>Server 的管理、負載平衡、流量管理...</li></ul><br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/3115987.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/3115987.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Thu, 03 May 2007 12:31:57 +0800</pubDate>
</item>
<item>
	<title>轉移到Thunderbird</title>
	<description><![CDATA[
			Mozilla Thunderbird前一陣子已經推出 RC1，所以按照預定計畫，開始進行轉換的工作。

轉換的工作其實很簡單～
不過也就是安裝好 RC1，打開Mozilla Thunderbird，執行"工具"&gt;"匯入"，把郵件以及設定都匯入進來～
接著再檢查看看郵件有沒有問題、帳號密碼，最後把原來配合 Outlook express 的 popfile 移除掉。

就這樣，簡單到不行。

		]]>
	</description>
	<content:encoded><![CDATA[
			<a href="http://www.mozilla.org/projects/thunderbird/">Mozilla Thunderbird</a>前一陣子已經推出 RC1，所以按照預定計畫，開始進行轉換的工作。<br />
<br />
轉換的工作其實很簡單～<br />
不過也就是安裝好 RC1，打開<a href="http://www.mozilla.org/projects/thunderbird/">Mozilla Thunderbird</a>，執行"工具"&gt;"匯入"，把郵件以及設定都匯入進來～<br />
接著再檢查看看郵件有沒有問題、帳號密碼，最後把原來配合 Outlook express 的 popfile 移除掉。<br />
<br />
就這樣，簡單到不行。<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/3005575.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/3005575.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Sat, 14 Apr 2007 16:44:49 +0800</pubDate>
</item>
<item>
	<title>cvs2svn 實戰</title>
	<description><![CDATA[
			我主要是參考這篇：HOWTO: smooth CVS to SVN migration (and back again)。
基本上步驟還真的是...很簡單。

目前我先在Ubuntu上試驗，想說先搞定之後，再到 Windows server 上試試看。
首先得安裝cvs2svn：#sudo apt-get install cvs2svn
又，因為 Windows 上用的是CVSNT，我再安裝了CVSNT(是的，Ubuntu有包進去)：#sudo apt-get install cvsnt

接著把 Windows 上的 CVS Repository (除專案目錄之外，CVSROOT目錄也要！這是我踩到的第一個雷，如果你是整個搬，就不會有這困擾。)複製到 Linux 機上的 /work/cvs 放著，然後切換到該目錄下之後，輸入：#cvs2svn -v -s /svn/my_new_project my_project
-v 表示 verbose-s 指定 svn repository 位置，這邊不需要特別先執行 svnadmin create 去建立，cvs2svn會自動建，如果你已經有一份建好的，那麼你得加上 --existing-svnrepos最後是 cvs repository 位置

cvs2svn就開始跑啦～
過沒多久，cvs2svn告訴我：
ERROR: The command '['co', '-q', '-x,v', '-p1.1', '-kk', 'my_project/aaa/bbb/si_template,v']' failed with exit status: 1
and the following output:
co: my_project/aaa/bbb/si_template,v:28: unknown character `_'
co aborted


這個問題卡了我很久，我找不到原因。後來找到這篇討論串：error encountered with co: unknown character '_'，最後解法是使用 --use-cvs，也就是不要用 rcs 指令去處理 CVS repository，改用 cvs 指令去處理。

用了這參數以後，原本以為這下就都搞定了，但天不從人願，cvs2svn告訴我另外一個噩耗：
ERROR: The command '['cvs', '-q', '-R', 'co', '-r1.1', '-p', '-kk', 'my_project/my_project.mak']' failed with exit status: 1
and the following output:
cvs [checkout aborted]: Cannot check out files into the repository itself


這問題又再次卡了我很久，我甚至去 trace cvs2svn 的 code...後來發現這完全是因為我的愚蠢所造成...反覆閱讀CVS--Concurrent Versions System - Troubleshooting之後，我終於知道原因，原來我不可以在 /work/cvs 下執行cvs2svn！
於是我切到 /work，然後再執行一次就行了。最後指令如下：cvs2svn --use-cvs -v -s /svn/my_new_project /work/cvs/my_project

參考資料：HOWTO: smooth CVS to SVN migration (and back again)
後來整個弄完以後又發現的另外一份參考資料～冏：轉戰 Subversion - cvs2svn 注意事項 « Peace Palace - 技術、評論、生活

		]]>
	</description>
	<content:encoded><![CDATA[
			我主要是參考這篇：<a href="http://sam.zoy.org/writings/programming/svn2cvs.html">HOWTO: smooth CVS to SVN migration (and back again)</a>。<br />
基本上步驟還真的是...很簡單。<br />
<br />
目前我先在<a href="http://ubuntulinux.com" title="Ubuntu">Ubuntu</a>上試驗，想說先搞定之後，再到 Windows server 上試試看。<br />
首先得安裝<a href="http://cvs2svn.tigris.org/">cvs2svn</a>：<blockquote>#sudo apt-get install cvs2svn</blockquote><br />
又，因為 Windows 上用的是<a href="http://www.cvsnt.org" title="CVSNT">CVSNT</a>，我再安裝了<a href="http://www.cvsnt.org" title="CVSNT">CVSNT</a>(是的，<a href="http://ubuntulinux.com" title="Ubuntu">Ubuntu</a>有包進去)：<blockquote>#sudo apt-get install cvsnt</blockquote><br />
<br />
接著把 Windows 上的 CVS Repository (除專案目錄之外，CVSROOT目錄也要！這是我踩到的第一個雷，如果你是整個搬，就不會有這困擾。)複製到 Linux 機上的 /work/cvs 放著，然後切換到該目錄下之後，輸入：<blockquote>#cvs2svn -v -s /svn/my_new_project my_project</blockquote><br />
<ul><li>-v 表示 verbose</li><li>-s 指定 svn repository 位置，這邊不需要特別先執行 svnadmin create 去建立，<a href="http://cvs2svn.tigris.org/">cvs2svn</a>會自動建，如果你已經有一份建好的，那麼你得加上 --existing-svnrepos</li><li>最後是 cvs repository 位置</li></ul><br />
<br />
<a href="http://cvs2svn.tigris.org/">cvs2svn</a>就開始跑啦～<br />
過沒多久，<a href="http://cvs2svn.tigris.org/">cvs2svn</a>告訴我：<blockquote><br />
ERROR: The command '['co', '-q', '-x,v', '-p1.1', '-kk', 'my_project/aaa/bbb/si_template,v']' failed with exit status: 1<br />
and the following output:<br />
co: my_project/aaa/bbb/si_template,v:28: unknown character `_'<br />
co aborted<br />
</blockquote><br />
<br />
這個問題卡了我很久，我找不到原因。後來找到這篇討論串：<a href="http://www.arcknowledge.com/gmane.comp.version-control.subversion.cvs2svn.devel/2005-08/msg00033.html">error encountered with co: unknown character '_'</a>，最後解法是使用 --use-cvs，也就是不要用 rcs 指令去處理 CVS repository，改用 cvs 指令去處理。<br />
<br />
用了這參數以後，原本以為這下就都搞定了，但天不從人願，<a href="http://cvs2svn.tigris.org/">cvs2svn</a>告訴我另外一個噩耗：<br />
<blockquote>ERROR: The command '['cvs', '-q', '-R', 'co', '-r1.1', '-p', '-kk', 'my_project/my_project.mak']' failed with exit status: 1<br />
and the following output:<br />
cvs [checkout aborted]: Cannot check out files into the repository itself<br />
</blockquote><br />
<br />
這問題又再次卡了我很久，我甚至去 trace cvs2svn 的 code...後來發現這完全是因為我的愚蠢所造成...反覆閱讀<a href="http://www.wincvs.org/howto/cvsdoc/cvs_21.html">CVS--Concurrent Versions System - Troubleshooting</a>之後，我終於知道原因，原來我不可以在 /work/cvs 下執行<a href="http://cvs2svn.tigris.org/">cvs2svn</a>！<br />
於是我切到 /work，然後再執行一次就行了。最後指令如下：<blockquote>cvs2svn --use-cvs -v -s /svn/my_new_project /work/cvs/my_project</blockquote><br />
<br />
參考資料：<ul><li><a href="http://sam.zoy.org/writings/programming/svn2cvs.html">HOWTO: smooth CVS to SVN migration (and back again)</a></li></ul><br />
後來整個弄完以後又發現的另外一份參考資料～冏：<ul><li><a href="http://scw1109.wordpress.com/2006/11/26/%E8%BD%89%E6%88%B0-subversion-cvs2svn-%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85/">轉戰 Subversion - cvs2svn 注意事項 « Peace Palace - 技術、評論、生活</a></li></ul><br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/2683799.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/2683799.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Wed, 31 Jan 2007 14:23:16 +0800</pubDate>
</item>
<item>
	<title>cvs2svn 實戰</title>
	<description><![CDATA[
			我主要是參考這篇：HOWTO: smooth CVS to SVN migration (and back again)。
基本上步驟還真的是...很簡單。

目前我先在Ubuntu上試驗，想說先搞定之後，再到 Windows server 上試試看。
首先得安裝cvs2svn：#sudo apt-get install cvs2svn
又，因為 Windows 上用的是CVSNT，我再安裝了CVSNT(是的，Ubuntu有包進去)：#sudo apt-get install cvsnt

接著把 Windows 上的 CVS Repository (除專案目錄之外，CVSROOT目錄也要！這是我踩到的第一個雷，如果你是整個搬，就不會有這困擾。)複製到 Linux 機上的 /work/cvs 放著，然後切換到該目錄下之後，輸入：#cvs2svn -v -s /svn/my_new_project my_project
-v 表示 verbose-s 指定 svn repository 位置，這邊不需要特別先執行 svnadmin create 去建立，cvs2svn會自動建，如果你已經有一份建好的，那麼你得加上 --existing-svnrepos最後是 cvs repository 位置

cvs2svn就開始跑啦～
過沒多久，cvs2svn告訴我：
ERROR: The command '['co', '-q', '-x,v', '-p1.1', '-kk', 'my_project/aaa/bbb/si_template,v']' failed with exit status: 1
and the following output:
co: my_project/aaa/bbb/si_template,v:28: unknown character `_'
co aborted


這個問題卡了我很久，我找不到原因。後來找到這篇討論串：error encountered with co: unknown character '_'，最後解法是使用 --use-cvs，也就是不要用 rcs 指令去處理 CVS repository，改用 cvs 指令去處理。

用了這參數以後，原本以為這下就都搞定了，但天不從人願，cvs2svn告訴我另外一個噩耗：
ERROR: The command '['cvs', '-q', '-R', 'co', '-r1.1', '-p', '-kk', 'my_project/my_project.mak']' failed with exit status: 1
and the following output:
cvs [checkout aborted]: Cannot check out files into the repository itself


這問題又再次卡了我很久，我甚至去 trace cvs2svn 的 code...後來發現這完全是因為我的愚蠢所造成...反覆閱讀CVS--Concurrent Versions System - Troubleshooting之後，我終於知道原因，原來我不可以在 /work/cvs 下執行cvs2svn！
於是我切到 /work，然後再執行一次就行了。最後指令如下：cvs2svn --use-cvs -v -s /svn/my_new_project /work/cvs/my_project

參考資料：HOWTO: smooth CVS to SVN migration (and back again)
後來整個弄完以後又發現的另外一份參考資料～冏：轉戰 Subversion - cvs2svn 注意事項 « Peace Palace - 技術、評論、生活

		]]>
	</description>
	<content:encoded><![CDATA[
			我主要是參考這篇：<a href="http://sam.zoy.org/writings/programming/svn2cvs.html">HOWTO: smooth CVS to SVN migration (and back again)</a>。<br />
基本上步驟還真的是...很簡單。<br />
<br />
目前我先在<a href="http://ubuntulinux.com" title="Ubuntu">Ubuntu</a>上試驗，想說先搞定之後，再到 Windows server 上試試看。<br />
首先得安裝<a href="http://cvs2svn.tigris.org/">cvs2svn</a>：<blockquote>#sudo apt-get install cvs2svn</blockquote><br />
又，因為 Windows 上用的是<a href="http://www.cvsnt.org" title="CVSNT">CVSNT</a>，我再安裝了<a href="http://www.cvsnt.org" title="CVSNT">CVSNT</a>(是的，<a href="http://ubuntulinux.com" title="Ubuntu">Ubuntu</a>有包進去)：<blockquote>#sudo apt-get install cvsnt</blockquote><br />
<br />
接著把 Windows 上的 CVS Repository (除專案目錄之外，CVSROOT目錄也要！這是我踩到的第一個雷，如果你是整個搬，就不會有這困擾。)複製到 Linux 機上的 /work/cvs 放著，然後切換到該目錄下之後，輸入：<blockquote>#cvs2svn -v -s /svn/my_new_project my_project</blockquote><br />
<ul><li>-v 表示 verbose</li><li>-s 指定 svn repository 位置，這邊不需要特別先執行 svnadmin create 去建立，<a href="http://cvs2svn.tigris.org/">cvs2svn</a>會自動建，如果你已經有一份建好的，那麼你得加上 --existing-svnrepos</li><li>最後是 cvs repository 位置</li></ul><br />
<br />
<a href="http://cvs2svn.tigris.org/">cvs2svn</a>就開始跑啦～<br />
過沒多久，<a href="http://cvs2svn.tigris.org/">cvs2svn</a>告訴我：<blockquote><br />
ERROR: The command '['co', '-q', '-x,v', '-p1.1', '-kk', 'my_project/aaa/bbb/si_template,v']' failed with exit status: 1<br />
and the following output:<br />
co: my_project/aaa/bbb/si_template,v:28: unknown character `_'<br />
co aborted<br />
</blockquote><br />
<br />
這個問題卡了我很久，我找不到原因。後來找到這篇討論串：<a href="http://www.arcknowledge.com/gmane.comp.version-control.subversion.cvs2svn.devel/2005-08/msg00033.html">error encountered with co: unknown character '_'</a>，最後解法是使用 --use-cvs，也就是不要用 rcs 指令去處理 CVS repository，改用 cvs 指令去處理。<br />
<br />
用了這參數以後，原本以為這下就都搞定了，但天不從人願，<a href="http://cvs2svn.tigris.org/">cvs2svn</a>告訴我另外一個噩耗：<br />
<blockquote>ERROR: The command '['cvs', '-q', '-R', 'co', '-r1.1', '-p', '-kk', 'my_project/my_project.mak']' failed with exit status: 1<br />
and the following output:<br />
cvs [checkout aborted]: Cannot check out files into the repository itself<br />
</blockquote><br />
<br />
這問題又再次卡了我很久，我甚至去 trace cvs2svn 的 code...後來發現這完全是因為我的愚蠢所造成...反覆閱讀<a href="http://www.wincvs.org/howto/cvsdoc/cvs_21.html">CVS--Concurrent Versions System - Troubleshooting</a>之後，我終於知道原因，原來我不可以在 /work/cvs 下執行<a href="http://cvs2svn.tigris.org/">cvs2svn</a>！<br />
於是我切到 /work，然後再執行一次就行了。最後指令如下：<blockquote>cvs2svn --use-cvs -v -s /svn/my_new_project /work/cvs/my_project</blockquote><br />
<br />
參考資料：<ul><li><a href="http://sam.zoy.org/writings/programming/svn2cvs.html">HOWTO: smooth CVS to SVN migration (and back again)</a></li></ul><br />
後來整個弄完以後又發現的另外一份參考資料～冏：<ul><li><a href="http://scw1109.wordpress.com/2006/11/26/%E8%BD%89%E6%88%B0-subversion-cvs2svn-%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85/">轉戰 Subversion - cvs2svn 注意事項 « Peace Palace - 技術、評論、生活</a></li></ul><br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/2683798.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/2683798.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Wed, 31 Jan 2007 14:23:16 +0800</pubDate>
</item>
<item>
	<title>subversion 與 file:// protocol</title>
	<description><![CDATA[
			在 Windows 上，想偷懶不架設 svn server 或 http server 的話，可以這麼作。
首先你得安裝TortoiseSVN。
然後建立 repository，TortoiseSVN的方法是這樣子的：
先建立一個空目錄再該目錄上按下滑鼠右鍵，選 TortoiseSVN &gt; create repository here

建立成功之後，緊接著，再按下滑鼠右鍵，將這個目錄分享出來。
之後，到你的工作目錄，用TortoiseSVN去 check out
URL of repository 就打 file:////your_computer/your_share 即可。

		]]>
	</description>
	<content:encoded><![CDATA[
			在 Windows 上，想偷懶不架設 svn server 或 http server 的話，可以這麼作。<br />
首先你得安裝<a href="http://tortoisesvn.tigris.org/" title="TortoiseSVN">TortoiseSVN</a>。<br />
然後建立 repository，<a href="http://tortoisesvn.tigris.org/" title="TortoiseSVN">TortoiseSVN</a>的方法是這樣子的：<br />
<ol><li>先建立一個空目錄</li><li>再該目錄上按下滑鼠右鍵，選 TortoiseSVN &gt; create repository here</li></ol><br />
<br />
建立成功之後，緊接著，再按下滑鼠右鍵，將這個目錄分享出來。<br />
之後，到你的工作目錄，用<a href="http://tortoisesvn.tigris.org/" title="TortoiseSVN">TortoiseSVN</a>去 check out<br />
URL of repository 就打 file:////your_computer/your_share 即可。<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/2674227.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/2674227.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Sat, 27 Jan 2007 17:10:40 +0800</pubDate>
</item>
<item>
	<title>Make Link 與 Site Advisor</title>
	<description><![CDATA[
			Make Link與McAfee SiteAdvisor Plug-in for Firefox也有衝突，如果同時安裝了這兩個 Add-on，Make Link會複製到錯誤的結果。

解決方法：停用McAfee SiteAdvisor Plug-in for Firefox。
		]]>
	</description>
	<content:encoded><![CDATA[
			<a href="https://addons.mozilla.org/firefox/142/">Make Link</a>與<a href="http://www.siteadvisor.com/download/ff.html" title="McAfee SiteAdvisor Plug-in for Firefox">McAfee SiteAdvisor Plug-in for Firefox</a>也有衝突，如果同時安裝了這兩個 Add-on，<a href="https://addons.mozilla.org/firefox/142/">Make Link</a>會複製到錯誤的結果。<br />
<br />
解決方法：停用<a href="http://www.siteadvisor.com/download/ff.html" title="McAfee SiteAdvisor Plug-in for Firefox">McAfee SiteAdvisor Plug-in for Firefox</a>。				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/2664241.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/2664241.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Tue, 23 Jan 2007 11:50:09 +0800</pubDate>
</item>
<item>
	<title>Make Link 與 Digg This!</title>
	<description><![CDATA[
			不知道裝了什麼 Addon 之後，Make Link得到的結果就錯了，每次要取頁面標題或是選取文字時，都會得到 "[object Object]"。
經過一番奮戰之後，終於發現 Make Link 與 Digg This! 都個別定義了 getSelectedText() 這個函數，Make Link因為呼叫到Digg This!的getSelectedText()，所以判斷的時候，就出錯，而得到 "[object Object]"。

所以只要移除掉Digg This!這個 Addon 之後就好了。
或者，你也可以自行為某 Addon 中的 getSelectedText() 作更名，再重新打包即可。

		]]>
	</description>
	<content:encoded><![CDATA[
			不知道裝了什麼 Addon 之後，<a href="https://addons.mozilla.org/firefox/142/">Make Link</a>得到的結果就錯了，每次要取頁面標題或是選取文字時，都會得到 "[object Object]"。<br />
經過一番奮戰之後，終於發現 <a href="https://addons.mozilla.org/firefox/142/">Make Link</a> 與 <a href="https://addons.mozilla.org/firefox/1477/">Digg This!</a> 都個別定義了 getSelectedText() 這個函數，<a href="https://addons.mozilla.org/firefox/142/">Make Link</a>因為呼叫到<a href="https://addons.mozilla.org/firefox/1477/">Digg This!</a>的getSelectedText()，所以判斷的時候，就出錯，而得到 "[object Object]"。<br />
<br />
所以只要移除掉<a href="https://addons.mozilla.org/firefox/1477/">Digg This!</a>這個 Addon 之後就好了。<br />
或者，你也可以自行為某 Addon 中的 getSelectedText() 作更名，再重新打包即可。<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/2662542.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/2662542.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Mon, 22 Jan 2007 14:20:41 +0800</pubDate>
</item>
<item>
	<title>mod_rewrite</title>
	<description><![CDATA[
			使用上很簡單，看mod_rewrite官方說明，應該就可以明白，要不也可以利用Google找到很多教學(關鍵字：mod_rewrite tutorial)。

要特別注意的一點，得記得把該目錄的 AllowOverride 設置為 All (Apache設定檔裡面)。
如果是 None 的話，mod_rewrite 不會生效。

像我的CentOS預設就是把 /var/www/html 的 AllowOverride 設置為 None，所以得去編輯 /etc/httpd/conf/httpd.conf ，找到 &lt;Directory "/var/www/html"&gt; ... &lt;/Directory&gt; 裡面的 AllowOverride，改為 All，再重新啟動 httpd 即可。


		]]>
	</description>
	<content:encoded><![CDATA[
			使用上很簡單，看<a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html" title="mod_rewrite - Apache HTTP Server">mod_rewrite官方說明</a>，應該就可以明白，要不也可以利用<a href="http://www.google.com" title="Google">Google</a>找到很多教學(關鍵字：mod_rewrite tutorial)。<br />
<br />
要特別注意的一點，得記得把該目錄的 AllowOverride 設置為 All (Apache設定檔裡面)。<br />
如果是 None 的話，mod_rewrite 不會生效。<br />
<br />
像我的<a href="http://www.centos.org" title="CentOS">CentOS</a>預設就是把 /var/www/html 的 AllowOverride 設置為 None，所以得去編輯 /etc/httpd/conf/httpd.conf ，找到 &lt;Directory "/var/www/html"&gt; ... &lt;/Directory&gt; 裡面的 AllowOverride，改為 All，再重新啟動 httpd 即可。<br />
<br />
				]]>
	</content:encoded>
	<link>http://blog.roodo.com/thinkingmore/archives/2649363.html</link>
	<guid>http://blog.roodo.com/thinkingmore/archives/2649363.html</guid>
	<category>資訊相關Idea與筆記</category>
	<pubDate>Tue, 16 Jan 2007 12:43:01 +0800</pubDate>
</item>
<item>
	<title>IE7的&quot;Open in new Tab&quot; 消失了</title>
	<description><![CDATA[
			安裝 IE7 正式版以後，發現一個問題，滑鼠右鍵點選連結時，應該要出現 "Open in new Tab" 的，可是卻消失了。
我納悶了很久，不知道該怎麼解決。

某天因緣際會之下，看到了這篇文章：IE7 Tabbed Browsing Q & A ，作者說如果有任何關於 Tab browsing 疑問的話，請儘管留言，他會努力解決，於是我留下問題。
過了許久，等我想起這件事情的時候，再次回來看這篇文章，發現作者已經很詳細的回答了我的問題。

@elleryq, most likely you have an add-on that decided to override IDocHostUIHandler in order to provide a custom context menu. The fix is to look at your add-ons and upgrade or un-install them. Some, such as the Google toolbar, have fixed this in the newest versions.

To provide more detail, the problem is that they're loading the IE6 version of the context menu out of shdoclc.dll, which is no longer part of IE, but is still part of Windows Explorer. There was some bad documentation on our part (well, legacy) which suggested loading otherwise undocumented IE resources out of shdoclc.dll, which a handful of add-ons followed. 

IDocHostUIHandler was primarily intended to be used by 3rd party browsers such as Maxthon, and not IE extensions. The recommended advice for 3rd party developers is to use standard context menu extensions whenever possible (see the "Context Menus and Extensions" section in http://msdn2.microsoft.com/en-us/library/aa770042.aspx) and if you really *have* to override IDocHostUIHandler, load your own resources for the context menus.

tonyschr 


所以我照著他的建議，更新 Google toolbar 到最新版，問題就解決啦～
		]]>
	</description>
	<content:encoded><![CDATA[
			安裝 IE7 正式版以後，發現一個問題，滑鼠右鍵點選連結時，應該要出現 "Open in new Tab" 的，可是卻消失了。<br />
我納悶了很久，不知道該怎麼解決。<br />
<br />
某天因緣際會之下，看到了<a href="http://blogs.msdn.com/tonyschr/archive/2006/12/06/ie7-tabbed-browsing-q-a.aspx" title="IE7 Tabbed Browsing Q & A ">這篇文章：IE7 Tabbed Browsing Q & A </a>，作者說如果有任何關於 Tab browsing 疑問的話，請儘管留言，他會努力解決，於是我留下問題。<br />
過了許久，等我想起這件事情的時候，再次回來看這篇文章，發現作者已經很詳細的回答了我的問題。<br />
<blockquote><br />
@elleryq, most likely you have an add-on that decided to override IDocHostUIHandler in order to provide a custom context menu. The fix is to look at your add-ons and upgrade or un-install them. Some, such as the Google toolbar, have fixed this in the newest versions.<br />
<br />
To provide more detail, the problem is that they're loading the IE6 version of the context menu out of shdoclc.dll, which is no longer part of IE, but is still part of Windows Explorer. There was some bad documentation on our part (well, legacy) which suggested loading otherwise undocumented IE resources out of shdoclc.dll, which a handful of add-ons followed. <br />
<br />
IDocHostUIHandler was primarily intended to be used by 3rd party brows