<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1705789716225971320</id><updated>2011-11-28T07:32:33.923+08:00</updated><category term='embedded'/><category term='Diary'/><category term='Life'/><category term='android'/><category term='python'/><category term='Linux'/><category term='Investment'/><category term='wargame'/><category term='vim'/><category term='Hacking'/><category term='Graphic'/><category term='M$'/><category term='Programming'/><category term='Drama'/><category term='Computer'/><title type='text'>Rickey's pets</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>71</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-1967791677089891351</id><published>2011-09-07T22:20:00.001+08:00</published><updated>2011-09-07T22:21:27.557+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Anatomy of Android LockScreen</title><content type='html'>&lt;br /&gt;最近因為專案需求研究了一下Android LockScreen相關部分的類別，花了不少時間，但類別圖一畫出來便就豁然開朗。如下圖&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Fmp0YLu7E3M/Tmd8YG9RcJI/AAAAAAAAEiA/hLe7Rsj4dI4/s1600/pasted_image001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="405" src="http://3.bp.blogspot.com/-Fmp0YLu7E3M/Tmd8YG9RcJI/AAAAAAAAEiA/hLe7Rsj4dI4/s640/pasted_image001.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;整個LockScreen我把它分成5大部分，此處數字請與圖配合食用。&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;SecuritySettings為在setting app介面的顯示部分。它會用到LockPatternUtils來讀取現在Lock的類型。&lt;/li&gt;&lt;li&gt;LockPatternUtils為紀錄所有Lock相關資訊的類別，包含密碼正確判斷，密碼檔存放，Lock類型等。&lt;/li&gt;&lt;li&gt;這部分包含幾個類別，這些類別都是負責顯示的部分。其中最底下的3個類別，{PasswordUnlock,AccountUnlock,PatternUnlock}Screen，它們繼承了View類別，做真正顯示的部分。LockPatternKeyguardView以及用它的LockPatternKeyguardViewProperties會根據LockPatternUtils讀取到的Lock類型，來具現{PasswordUnlock,AccountUnlock,PatternUnlock}Screen。&lt;/li&gt;&lt;li&gt;KeyguardViewMediator為大魔王，它將第3部分那些複雜的東西，統一成一個類別方便使用(即Design Pattern裡的Mediator)，它主要用KeyguardView{Properties,Manager}&lt;/li&gt;&lt;li&gt;這部分就不用解說了，這是Android platform的部分。&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;相關修改LockScreen的APP&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Market可看到的LockScreen修改程式有很多，像是WidgetLocker、Flyscreen、Nolock等等。若是反組譯其中之一大概都可以看到這樣的code。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;      KeyguardManager localKeyguardManager = (KeyguardManager)getSystemService("keyguard");&lt;br /&gt;      // enable lockscreen&lt;br /&gt;      this.mKeyguardLock.reenableKeyguard();&lt;br /&gt;      // disable lockscreen&lt;br /&gt;      this.mKeyguardLock.disableKeyguard();&lt;/pre&gt;&lt;br /&gt;一直往下追最後就可以從剛才類別圖的第5部分的最上方類別WindowManagerService內的方法disableKeyguard()等等。&lt;br /&gt;&lt;br /&gt;有興趣的人再自己追追看囉~&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-1967791677089891351?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/1967791677089891351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=1967791677089891351' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/1967791677089891351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/1967791677089891351'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2011/09/anatomy-of-android-lockscreen.html' title='Anatomy of Android LockScreen'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Fmp0YLu7E3M/Tmd8YG9RcJI/AAAAAAAAEiA/hLe7Rsj4dI4/s72-c/pasted_image001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-4728484748799059782</id><published>2011-09-04T21:46:00.003+08:00</published><updated>2011-09-04T21:49:34.741+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Custom gesture support on Ubuntu</title><content type='html'>恰巧在IBM developer看到了一篇&lt;a href="http://www.ibm.com/developerworks/opensource/library/os-touchpad/index.html?ca=drs-"&gt;Ubuntu上gesture的教學&lt;/a&gt;，但因為那篇是perl及年久失修(?)，所以我稍微在Ubuntu 11.04及用python重寫了這個應用。&lt;br /&gt;&lt;br /&gt;這篇文章將會給介紹Ubuntu上怎麼來寫筆電的touchpad gesture應用，主要用python、synclient和xdotool。synclient是用來抓touchpad被按下的座標值及指數。xdotool則用來送出相對應的鍵盤行為。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;synclient&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;首先，在Ubuntu 11.04上，若要啟用synclient必需先修改xorg.conf，加入Option "SHMConfig" "on"，如下&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;//file: /usr/share/X11/xorg.conf.d/50-synaptics.conf&lt;br /&gt;Section "InputClass"&lt;br /&gt;        Identifier "touchpad catchall"&lt;br /&gt;        Driver "synaptics"&lt;br /&gt;        MatchIsTouchpad "on"&lt;br /&gt;        MatchDevicePath "/dev/input/event*"&lt;br /&gt;        Option "SHMConfig" "on"&lt;br /&gt;EndSection&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;接著可在terminal上使用synclient，來看一下他的輸出:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;doro@doro-UL80Jt ~/src/touchpad $ synclient -m 10&lt;br /&gt;    time     x    y   z f  w  l r u d m     multi  gl gm gr gdx gdy&lt;br /&gt;   0.000   418  413   0 0  0  0 0 0 0 0  00000000&lt;br /&gt;   0.617   363  359  31 1  0  0 0 0 0 0  00000000&lt;br /&gt;   0.627   362  356  31 1  0  0 0 0 0 0  00000000&lt;br /&gt;   0.637   363  352  31 1  0  0 0 0 0 0  00000000&lt;br /&gt;   0.657   364  349  31 1  0  0 0 0 0 0  00000000&lt;br /&gt;   0.677   368  347  31 1  0  0 0 0 0 0  00000000&lt;br /&gt;   0.688   371  344  31 1  0  0 0 0 0 0  00000000&lt;br /&gt;   0.708   373  340  31 1  0  0 0 0 0 0  00000000&lt;br /&gt;   0.728   375  336  31 1  0  0 0 0 0 0  00000000&lt;br /&gt;   0.738   376  333  31 1  0  0 0 0 0 0  00000000&lt;br /&gt;   0.849   376  333   0 0  0  0 0 0 0 0  00000000&lt;br /&gt;   1.688   232  672  31 2  0  0 0 0 0 0  00000000&lt;br /&gt;   1.718   274  679  31 3  0  0 0 0 0 0  00000000&lt;br /&gt;   1.799   274  679   0 0  0  0 0 0 0 0  00000000&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;這個指令會輸出目前touchpad被按下的點(x,y)以及f欄位標示出指數。因此我們便可利用這3個值來判斷手勢。最後再利用xdotool來執行我們要做的行為。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Example&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;底下這個例子，將會實作&lt;br /&gt;&lt;ul&gt;&lt;li&gt;若3指按下時，送出super+w，進入expo mode&amp;nbsp;&lt;/li&gt;&lt;li&gt;若3指按下後移動上/下/左/右超過100個單位，送出ctrl+alt+Up/Down/Left/Right，來做work space的切換&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#!/usr/bin/python&lt;br /&gt;# -*- coding: utf-8 -*-&lt;br /&gt;&lt;br /&gt;import logging&lt;br /&gt;logging.basicConfig(filename='/tmp/multitouch.log',&lt;br /&gt;        level=logging.DEBUG, &lt;br /&gt;        format='[%(asctime)s][%(name)s][%(levelname)s] %(message)s')&lt;br /&gt;logger = logging.getLogger('multitouch')&lt;br /&gt;&lt;br /&gt;import subprocess&lt;br /&gt;import re&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;    cmd = 'synclient -m 10'&lt;br /&gt;&lt;br /&gt;    p = subprocess.Popen(cmd, stdout = subprocess.PIPE, &lt;br /&gt;            stderr = subprocess.STDOUT, shell = True)&lt;br /&gt;    skip = False&lt;br /&gt;    try:&lt;br /&gt;        while True:&lt;br /&gt;            line = p.stdout.readline()&lt;br /&gt;            if not line:&lt;br /&gt;                break&lt;br /&gt;            try:&lt;br /&gt;                tokens = [x for x in re.split('([^0-9\.])+', line.strip()) if x.strip()]&lt;br /&gt;                x, y, fingers = int(tokens[1]), int(tokens[2]), int(tokens[4])&lt;br /&gt;                logger.debug('Result: ' + str(tokens))&lt;br /&gt;                if fingers == 3:&lt;br /&gt;                    if skip:&lt;br /&gt;                        continue&lt;br /&gt;                    skip = True&lt;br /&gt;                    start_x, start_y = x, y&lt;br /&gt;                else:&lt;br /&gt;                    if skip:&lt;br /&gt;                        diff_x, diff_y = (x - start_x), (y - start_y)&lt;br /&gt;                        if diff_x &amp;gt; 100:&lt;br /&gt;                            logger.info('send...diff_x &amp;gt; 100')&lt;br /&gt;                            subprocess.Popen("xdotool key ctrl+alt+Right", shell=True)&lt;br /&gt;                        elif diff_x &amp;lt; -100:&lt;br /&gt;                            logger.info('send...diff_x &amp;lt; -100')&lt;br /&gt;                            subprocess.Popen("xdotool key ctrl+alt+Left", shell=True)&lt;br /&gt;                        elif diff_y &amp;gt; 100:&lt;br /&gt;                            logger.info('send...diff_y &amp;gt; 100')&lt;br /&gt;                            subprocess.Popen("xdotool key ctrl+alt+Down", shell=True)&lt;br /&gt;                        elif diff_y &amp;lt; -100:&lt;br /&gt;                            logger.info('send...diff_y &amp;lt; -100')&lt;br /&gt;                            subprocess.Popen("xdotool key ctrl+alt+Up", shell=True)&lt;br /&gt;                        else:&lt;br /&gt;                            logger.info('send...super+w')&lt;br /&gt;                            subprocess.Popen("xdotool key super+w", shell=True)&lt;br /&gt;                    skip = False&lt;br /&gt;            except (IndexError, ValueError):&lt;br /&gt;                pass&lt;br /&gt;    except KeyboardInterrupt:&lt;br /&gt;        pass&amp;nbsp;&lt;/pre&gt;(keyboard is better, but just for fun :D)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-4728484748799059782?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/4728484748799059782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=4728484748799059782' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4728484748799059782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4728484748799059782'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2011/09/ibm-developer-ubuntugesture-perlubuntu.html' title='Custom gesture support on Ubuntu'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-3270190022760779088</id><published>2011-08-19T10:26:00.000+08:00</published><updated>2011-08-19T10:26:18.381+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Linux Kernel Initcall</title><content type='html'>Linux kernel module的module init function 如下，本文將以kernel module為例，說明他們是怎麼被kernel核心呼叫到。&lt;pre class="prettyprint"&gt;&lt;br /&gt;static int __devinit tegra_kbc_init(void) {	&lt;br /&gt;    pr_debug("KBC: tegra_kbc_init\n")&lt;br /&gt;	return platform_driver_register(&amp;tegra_kbc_driver)&lt;br /&gt;}&lt;br /&gt;module_init(tegra_kbc_init)&lt;br /&gt;&lt;/pre&gt;&lt;h2&gt;module_init&lt;/h2&gt;隨便找到有呼叫module_init的kernel module往上追，可以找到最後是呼叫到__define_inicall(level,fn,id)這個macro，如下&lt;pre class="prettyprint"&gt;&lt;br /&gt;// File: include/linux/init.h&lt;br /&gt;#define module_init(x)	__initcall(x)&lt;br /&gt;#define __initcall(fn) device_initcall(fn)&lt;br /&gt;#define device_initcall(fn)		__define_initcall("6",fn,6)&lt;br /&gt;#define __define_initcall(level,fn,id) \&lt;br /&gt;    static initcall_t __initcall_##fn##id __used \&lt;br /&gt;    __attribute__((__section__(".initcall" level ".init"))) = fn&lt;br /&gt;&lt;/pre&gt;其中以module_init(tegra_kbc_init)會被展開成&lt;pre class="prettyprint"&gt;&lt;br /&gt;static initcall_t __initcall_tegra_kbc_init6 __used &lt;br /&gt;__attribute__((__section__(".initcall6.init"))) = tegra_kbc_init &lt;br /&gt;&lt;/pre&gt;由__attribute__得知，它最後會被放到initcall6.init這個section裡。而linker連結時會根據vmlinux.lds.S來將它放到指定的section。如下的INIT_CALLS。&lt;pre class="prettyprint"&gt;// File: arch/arm/kernel/vmlinux.lds.S&lt;br /&gt;SECTIONS {		&lt;br /&gt;    INIT_SETUP(16)&lt;br /&gt;    INIT_CALLS&lt;br /&gt;    CON_INITCALL&lt;br /&gt;    SECURITY_INITCALL&lt;br /&gt;    INIT_RAM_FS&lt;br /&gt;&lt;/pre&gt;再往下追就看到了.initcall6.init。&lt;pre class="prettyprint"&gt;// File: include/asm-generic/vmlinux.lds.h&lt;br /&gt;#define INIT_CALLS							\&lt;br /&gt;		VMLINUX_SYMBOL(__initcall_start) = .;			\&lt;br /&gt;		INITCALLS						\&lt;br /&gt;		VMLINUX_SYMBOL(__initcall_end) = .;&lt;br /&gt;&lt;br /&gt;#define INITCALLS							\&lt;br /&gt;	*(.initcallearly.init)						\&lt;br /&gt;	VMLINUX_SYMBOL(__early_initcall_end) = .;			\&lt;br /&gt;  	*(.initcall0.init)						\&lt;br /&gt;  	*(.initcall0s.init)						\&lt;br /&gt;  	*(.initcall1.init)						\&lt;br /&gt;  	*(.initcall1s.init)						\&lt;br /&gt;  	*(.initcall2.init)						\&lt;br /&gt;  	*(.initcall2s.init)						\&lt;br /&gt;  	*(.initcall3.init)						\&lt;br /&gt;  	*(.initcall3s.init)						\&lt;br /&gt;  	*(.initcall4.init)						\&lt;br /&gt;  	*(.initcall4s.init)						\&lt;br /&gt;  	*(.initcall5.init)						\&lt;br /&gt;  	*(.initcall5s.init)						\&lt;br /&gt;	*(.initcallrootfs.init)						\&lt;br /&gt;  	*(.initcall6.init)						\&lt;br /&gt;  	*(.initcall6s.init)						\&lt;br /&gt;  	*(.initcall7.init)						\&lt;br /&gt;  	*(.initcall7s.init)&lt;br /&gt;&lt;/pre&gt;        &lt;h2&gt;do_initcalls&lt;/h2&gt;kernel是從那裡呼叫到init calls，可以從kernel的entry point，init/main.c，找到下面這個函式。&lt;pre class="prettyprint"&gt;// File: init/main.c&lt;br /&gt;extern initcall_t __initcall_start[], __initcall_end[], __early_initcall_end[];&lt;br /&gt;static void __init do_initcalls(void) {	&lt;br /&gt;    initcall_t *fn;&lt;br /&gt;	for (fn = __early_initcall_end; fn &lt; __initcall_end; fn++)&lt;br /&gt;        do_one_initcall(*fn);&lt;br /&gt;	/* Make sure there is no pending stuff from the initcall sequence */	&lt;br /&gt;    flush_scheduled_work();&lt;br /&gt;}&lt;/pre&gt;一路往上追可以知道do_initcalls()在start_kernel()的最後的函式裡面用一個kernel thread間接呼叫，這裡很容易就可以追到了，我就不再列出。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-3270190022760779088?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/3270190022760779088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=3270190022760779088' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3270190022760779088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3270190022760779088'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2011/08/linux-kernel-initcall.html' title='Linux Kernel Initcall'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-5394183034425659368</id><published>2011-08-17T01:05:00.001+08:00</published><updated>2011-08-17T01:06:43.841+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android上的LAN device</title><content type='html'>最近要在Android上加LAN device support，該LAN device 是USB interface的SMSC9514。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;ifconfig&lt;/h2&gt;&lt;br /&gt;adb shell後用以下指令可以看到目前板子上的網路裝置&lt;br /&gt;# busybox-armv6l ifconfig -a&lt;br /&gt;&lt;br /&gt;busybox可自行上網下載執行檔&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;ifconfig 運作方式&lt;/h3&gt;&lt;br /&gt;追busybox的code可以找到這段程式&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;// file: busybox-1.18.4/networking/interface.c&lt;br /&gt;#define _PATH_PROCNET_DEV               "/proc/net/dev"&lt;br /&gt;&lt;br /&gt;static int if_readlist_proc(char *target)&lt;br /&gt;{&lt;br /&gt;	static smallint proc_read;&lt;br /&gt;&lt;br /&gt;	FILE *fh;&lt;br /&gt;	char buf[512];&lt;br /&gt;	struct interface *ife;&lt;br /&gt;	int err, procnetdev_vsn;&lt;br /&gt;&lt;br /&gt;	if (proc_read)&lt;br /&gt;		return 0;&lt;br /&gt;	if (!target)&lt;br /&gt;		proc_read = 1;&lt;br /&gt;&lt;br /&gt;	fh = fopen_or_warn(_PATH_PROCNET_DEV, "r");&lt;br /&gt;	if (!fh) {&lt;br /&gt;		return if_readconf();&lt;br /&gt;	}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;可以看到它open了一個檔案_PATH_PROCNET_DEV，這個檔案為"/proc/net/dev"，所以得知ifconfig是從那裡抓network devices name&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;driver&lt;/h2&gt;&lt;br /&gt;&lt;h3&gt;秀出/proc/net/dev訊息&lt;/h3&gt;&lt;br /&gt;至於driver如何將這些資訊秀出可以參考 dev_seq_show() 如下 &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;// file: kernel/net/core/dev.c&lt;br /&gt;static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev)&lt;br /&gt;{&lt;br /&gt;	struct rtnl_link_stats64 temp;&lt;br /&gt;	const struct rtnl_link_stats64 *stats = dev_get_stats(dev, &amp;amp;temp);&lt;br /&gt;&lt;br /&gt;	seq_printf(seq, "%6s: %7llu %7llu %4llu %4llu %4llu %5llu %10llu %9llu "&lt;br /&gt;		   "%8llu %7llu %4llu %4llu %4llu %5llu %7llu %10llu\n",&lt;br /&gt;		   dev-&amp;gt;name, stats-&amp;gt;rx_bytes, stats-&amp;gt;rx_packets,&lt;br /&gt;		   stats-&amp;gt;rx_errors,&lt;br /&gt;		   stats-&amp;gt;rx_dropped + stats-&amp;gt;rx_missed_errors,&lt;br /&gt;		   stats-&amp;gt;rx_fifo_errors,&lt;br /&gt;		   stats-&amp;gt;rx_length_errors + stats-&amp;gt;rx_over_errors +&lt;br /&gt;		    stats-&amp;gt;rx_crc_errors + stats-&amp;gt;rx_frame_errors,&lt;br /&gt;		   stats-&amp;gt;rx_compressed, stats-&amp;gt;multicast,&lt;br /&gt;		   stats-&amp;gt;tx_bytes, stats-&amp;gt;tx_packets,&lt;br /&gt;		   stats-&amp;gt;tx_errors, stats-&amp;gt;tx_dropped,&lt;br /&gt;		   stats-&amp;gt;tx_fifo_errors, stats-&amp;gt;collisions,&lt;br /&gt;		   stats-&amp;gt;tx_carrier_errors +&lt;br /&gt;		    stats-&amp;gt;tx_aborted_errors +&lt;br /&gt;		    stats-&amp;gt;tx_window_errors +&lt;br /&gt;		    stats-&amp;gt;tx_heartbeat_errors,&lt;br /&gt;		   stats-&amp;gt;tx_compressed);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; *	Called from the PROCfs module. This now uses the new arbitrary sized&lt;br /&gt; *	/proc/net interface to create /proc/net/dev&lt;br /&gt; */&lt;br /&gt;static int dev_seq_show(struct seq_file *seq, void *v)&lt;br /&gt;{&lt;br /&gt;	if (v == SEQ_START_TOKEN)&lt;br /&gt;		seq_puts(seq, "Inter-|   Receive                            "&lt;br /&gt;			      "                    |  Transmit\n"&lt;br /&gt;			      " face |bytes    packets errs drop fifo frame "&lt;br /&gt;			      "compressed multicast|bytes    packets errs "&lt;br /&gt;			      "drop fifo colls carrier compressed\n");&lt;br /&gt;	else&lt;br /&gt;		dev_seq_printf_stats(seq, v);&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;driver註冊network device&lt;/h3&gt;&lt;br /&gt;driver要跟kernel註冊自己是個network device，註冊時最底層是用到 list_netdevice&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;// file: kernel/net/core/dev.c&lt;br /&gt;/* Device list insertion */&lt;br /&gt;static int list_netdevice(struct net_device *dev)&lt;br /&gt;{&lt;br /&gt;	struct net *net = dev_net(dev);&lt;br /&gt;&lt;br /&gt;	ASSERT_RTNL();&lt;br /&gt;&lt;br /&gt;	write_lock_bh(&amp;amp;dev_base_lock);&lt;br /&gt;	list_add_tail_rcu(&amp;amp;dev-&amp;gt;dev_list, &amp;amp;net-&amp;gt;dev_base_head);&lt;br /&gt;	hlist_add_head_rcu(&amp;amp;dev-&amp;gt;name_hlist, dev_name_hash(net, dev-&amp;gt;name));&lt;br /&gt;	hlist_add_head_rcu(&amp;amp;dev-&amp;gt;index_hlist,&lt;br /&gt;			   dev_index_hash(net, dev-&amp;gt;ifindex));&lt;br /&gt;	write_unlock_bh(&amp;amp;dev_base_lock);&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;最外層是用&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;// file: kernel/drivers/net/usb/usbnet.c&lt;br /&gt;int&lt;br /&gt;usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)&lt;br /&gt;{&lt;br /&gt;	status = register_netdev (net);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;usbnet_probe又是誰呼叫了，我們就是我們要用的LAN chip SMSC95XX用到了&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;// file: kernel/drivers/net/usb/smsc95xx.c&lt;br /&gt;static struct usb_driver smsc95xx_driver = {&lt;br /&gt;	.name		= "smsc95xx",&lt;br /&gt;	.id_table	= products,&lt;br /&gt;	.probe		= usbnet_probe,&lt;br /&gt;	.suspend	= usbnet_suspend,&lt;br /&gt;	.resume		= usbnet_resume,&lt;br /&gt;	.disconnect	= usbnet_disconnect,&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;SMSC9514&lt;/h2&gt;&lt;pre class="prettyprint"&gt;# $ adb shell&lt;br /&gt;# lsusb&lt;br /&gt;1d6b:0002 (bus 1, device 1)&lt;br /&gt;1d6b:0002 (bus 2, device 1)&lt;br /&gt;# # 插入裝置&lt;br /&gt;# lsusb&lt;br /&gt;1d6b:0002 (bus 1, device 1)&lt;br /&gt;1d6b:0002 (bus 2, device 1)&lt;br /&gt;0424:9514 (bus 1, device 2)&lt;br /&gt;0424:ec00 (bus 1, device 3)&lt;br /&gt;# busybox-armv6l ash&lt;br /&gt;/ # # 設IP跟DNS&lt;br /&gt;/ # busybox-armv6l ifconfig eth0 192.168.1.123&lt;br /&gt;/ # busybox-armv6l route add default gw 192.168.1.1&lt;br /&gt;/ # ping 168.95.1.1&lt;br /&gt;PING 168.95.1.1 (168.95.1.1) 56(84) bytes of data.&lt;br /&gt;64 bytes from 168.95.1.1: icmp_seq=1 ttl=242 time=670 ms&lt;br /&gt;64 bytes from 168.95.1.1: icmp_seq=2 ttl=242 time=989 ms&lt;br /&gt;64 bytes from 168.95.1.1: icmp_seq=3 ttl=242 time=589 ms&lt;br /&gt;#setprop net.dns1 168.95.1.1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;UI&lt;/h2&gt;&lt;br /&gt;這部分比較麻煩，可以自行參考android-x86的實作。&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-5394183034425659368?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/5394183034425659368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=5394183034425659368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5394183034425659368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5394183034425659368'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2011/08/androidlan-device.html' title='Android上的LAN device'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-3056777657504425217</id><published>2011-08-15T10:30:00.003+08:00</published><updated>2011-08-15T10:35:15.545+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android WIFI Service</title><content type='html'>需控制Wifi的App會透過system service來呼叫到wifi service，像是在packages/apps/Settings裡的wifi設定頁面，它們會用類似這樣的語法來取得wifi system service。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);&lt;br /&gt;&lt;/pre&gt;本文將探討由wifi system service到hardware做動的部分。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-CrW3iQjCD1Y/TkiEmKCmxkI/AAAAAAAAEh0/LkKg0eUHiB4/s1600/pasted_image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-CrW3iQjCD1Y/TkiEmKCmxkI/AAAAAAAAEh0/LkKg0eUHiB4/s320/pasted_image.png" width="257" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;WifiService 註冊&lt;/h2&gt;&lt;br /&gt;ServiceManager.addService() 為所有service註冊都要用到的函式。WifiService也是，程式如下。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;private ConnectivityService(Context context) {&lt;br /&gt;        for (int netType : mPriorityList) {&lt;br /&gt;            switch (mNetAttributes[netType].mRadio) {&lt;br /&gt;            case ConnectivityManager.TYPE_WIFI:&lt;br /&gt;                if (DBG) log("Starting Wifi Service.");&lt;br /&gt;                WifiStateTracker wst = new WifiStateTracker();&lt;br /&gt;                WifiService wifiService = new WifiService(context);&lt;br /&gt;                ServiceManager.addService(Context.WIFI_SERVICE, wifiService);&lt;br /&gt;                wifiService.checkAndStartWifi();&lt;br /&gt;                mNetTrackers[ConnectivityManager.TYPE_WIFI] = wst;&lt;br /&gt;                wst.startMonitoring(context, mHandler);&lt;br /&gt;&lt;br /&gt;                //TODO: as part of WWS refactor, create only when needed&lt;br /&gt;                mWifiWatchdogService = new WifiWatchdogService(context);&lt;br /&gt;                break;&lt;br /&gt;&lt;/pre&gt;ConnectivityService是在SystemServer建構函式用到，至於SystemServer如何被叫到，自行去找Zygote的介紹&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;try {&lt;br /&gt;                Slog.i(TAG, "Connectivity Service");&lt;br /&gt;                connectivity = ConnectivityService.getInstance(context);&lt;br /&gt;                ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);&lt;br /&gt;            } catch (Throwable e) {&lt;br /&gt;                Slog.e(TAG, "Failure starting Connectivity Service", e);&lt;br /&gt;            }&lt;br /&gt;&lt;/pre&gt;&lt;h2&gt;Service&lt;/h2&gt;&lt;br /&gt;開關Wifi是透過setWifiEnabled()，其Service內的實作程式如下&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;public synchronized boolean setWifiEnabled(boolean enable) {&lt;br /&gt;        enforceChangePermission();&lt;br /&gt;&lt;br /&gt;        if (DBG) {&lt;br /&gt;            Slog.e(TAG, "Invoking mWifiStateMachine.setWifiEnabled\n");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (enable) {&lt;br /&gt;            reportStartWorkSource();&lt;br /&gt;        }&lt;br /&gt;        mWifiStateMachine.setWifiEnabled(enable);&lt;br /&gt;&lt;/pre&gt;最重要的是它用了WifiStateMachine::setWifiEnabled()，它實作如下&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;public void setWifiEnabled(boolean enable) {&lt;br /&gt;        mLastEnableUid.set(Binder.getCallingUid());&lt;br /&gt;        if (enable) {&lt;br /&gt;            /* Argument is the state that is entered prior to load */&lt;br /&gt;            sendMessage(obtainMessage(CMD_LOAD_DRIVER, WIFI_STATE_ENABLING, 0));&lt;br /&gt;            sendMessage(CMD_START_SUPPLICANT);&lt;br /&gt;        } else {&lt;br /&gt;            sendMessage(CMD_STOP_SUPPLICANT);&lt;br /&gt;            /* Argument is the state that is entered upon success */&lt;br /&gt;            sendMessage(obtainMessage(CMD_UNLOAD_DRIVER, WIFI_STATE_DISABLED, 0));&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;可以看到它用了很多sendMessage()，這部分用了樹狀的有限狀態機，sendMessage是拿來叫目前所處的State物件，根據sendMessage要求的狀態來呼叫processMessage()處理。WifiStateMachine的樹狀結構如下&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;addState(mDefaultState);&lt;br /&gt;            addState(mInitialState, mDefaultState);&lt;br /&gt;            addState(mDriverUnloadingState, mDefaultState);&lt;br /&gt;            addState(mDriverUnloadedState, mDefaultState);&lt;br /&gt;                addState(mDriverFailedState, mDriverUnloadedState);&lt;br /&gt;            addState(mDriverLoadingState, mDefaultState);&lt;br /&gt;            addState(mDriverLoadedState, mDefaultState);&lt;br /&gt;            addState(mSupplicantStartingState, mDefaultState);&lt;br /&gt;            addState(mSupplicantStartedState, mDefaultState);&lt;br /&gt;                addState(mDriverStartingState, mSupplicantStartedState);&lt;br /&gt;                addState(mDriverStartedState, mSupplicantStartedState);&lt;br /&gt;                    addState(mScanModeState, mDriverStartedState);&lt;br /&gt;                    addState(mConnectModeState, mDriverStartedState);&lt;br /&gt;                        addState(mConnectingState, mConnectModeState);&lt;br /&gt;                        addState(mConnectedState, mConnectModeState);&lt;br /&gt;                        addState(mDisconnectingState, mConnectModeState);&lt;br /&gt;                        addState(mDisconnectedState, mConnectModeState);&lt;br /&gt;                        addState(mWaitForWpsCompletionState, mConnectModeState);&lt;br /&gt;                addState(mDriverStoppingState, mSupplicantStartedState);&lt;br /&gt;                addState(mDriverStoppedState, mSupplicantStartedState);&lt;br /&gt;            addState(mSupplicantStoppingState, mDefaultState);&lt;br /&gt;            addState(mSoftApStartedState, mDefaultState);&lt;br /&gt;&lt;br /&gt;        setInitialState(mInitialState);&lt;br /&gt;&lt;/pre&gt;要先確定自己目前的狀態才能知道程式會用那個State物件的processMessage()/enter()來處理。以上面的setWifiEnabled(true)為例，它會要求DriverUnloadedState::processMessage()處理CMD_LOAD_DRIVER。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;class DriverUnloadedState extends HierarchicalState {&lt;br /&gt;        @Override&lt;br /&gt;        public void enter() {&lt;br /&gt;            if (DBG) Log.d(TAG, getName() + "\n");&lt;br /&gt;            EventLog.writeEvent(EVENTLOG_WIFI_STATE_CHANGED, getName());&lt;br /&gt;        }&lt;br /&gt;        @Override&lt;br /&gt;        public boolean processMessage(Message message) {&lt;br /&gt;            if (DBG) Log.d(TAG, getName() + message.toString() + "\n");&lt;br /&gt;            switch (message.what) {&lt;br /&gt;                case CMD_LOAD_DRIVER:&lt;br /&gt;                    transitionTo(mDriverLoadingState);&lt;br /&gt;                    break;&lt;br /&gt;                default:&lt;br /&gt;                    return NOT_HANDLED;&lt;br /&gt;            }&lt;br /&gt;            EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);&lt;br /&gt;            return HANDLED;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;DriverUnloadedState又轉換狀態到DriverLoadingState，轉過去時會先做enter() method如下&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;class DriverLoadingState extends HierarchicalState {&lt;br /&gt;        @Override&lt;br /&gt;        public void enter() {&lt;br /&gt;            if (DBG) Log.d(TAG, getName() + "\n");&lt;br /&gt;            EventLog.writeEvent(EVENTLOG_WIFI_STATE_CHANGED, getName());&lt;br /&gt;&lt;br /&gt;            final Message message = new Message();&lt;br /&gt;            message.copyFrom(getCurrentMessage());&lt;br /&gt;            /* TODO: add a timeout to fail when driver load is hung.&lt;br /&gt;		        Similarly for driver unload.&lt;br /&gt;             */&lt;br /&gt;            new Thread(new Runnable() {&lt;br /&gt;                public void run() {&lt;br /&gt;                    mWakeLock.acquire();&lt;br /&gt;                    //enabling state&lt;br /&gt;                    switch(message.arg1) {&lt;br /&gt;                        case WIFI_STATE_ENABLING:&lt;br /&gt;                            setWifiState(WIFI_STATE_ENABLING);&lt;br /&gt;                            break;&lt;br /&gt;                        case WIFI_AP_STATE_ENABLING:&lt;br /&gt;                            setWifiApState(WIFI_AP_STATE_ENABLING);&lt;br /&gt;                            break;&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    if(WifiNative.loadDriver()) {&lt;br /&gt;                        Log.d(TAG, "Driver load successful");&lt;br /&gt;                        sendMessage(CMD_LOAD_DRIVER_SUCCESS);&lt;br /&gt;&lt;/pre&gt;在此method中呼叫了WifiNative.loadDriver()，它真正會呼叫到底層叫loading kernel module的動作。終於要進入JNI了。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;public class WifiNative {&lt;br /&gt;&lt;br /&gt;    static final int BLUETOOTH_COEXISTENCE_MODE_ENABLED = 0;&lt;br /&gt;    static final int BLUETOOTH_COEXISTENCE_MODE_DISABLED = 1;&lt;br /&gt;    static final int BLUETOOTH_COEXISTENCE_MODE_SENSE = 2;&lt;br /&gt;&lt;br /&gt;    public native static String getErrorString(int errorCode);&lt;br /&gt;&lt;br /&gt;    public native static boolean loadDriver();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;JNI&lt;/h2&gt;&lt;br /&gt;以上面的loadDriver()會呼叫到&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;static jboolean android_net_wifi_loadDriver(JNIEnv* env, jobject clazz)&lt;br /&gt;{&lt;br /&gt;    return (jboolean)(::wifi_load_driver() == 0);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;wifi_load_driver()則是HAL提供。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;HAL&lt;/h2&gt;&lt;br /&gt;HAL該提供的函式可參考hardware/libhardware_legacy/include/hardware_legacy/wifi.h，wifi_load_driver()的實作如下，可以看到insmod的關鍵system call。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;int wifi_load_driver()&lt;br /&gt;{&lt;br /&gt;    char driver_status[PROPERTY_VALUE_MAX];&lt;br /&gt;    int count = 100; /* wait at most 20 seconds for completion */&lt;br /&gt;&lt;br /&gt;    if (is_wifi_driver_loaded()) {&lt;br /&gt;        return 0;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG) &amp;lt; 0)&lt;br /&gt;        return -1;&lt;br /&gt;&lt;br /&gt;    if (strcmp(FIRMWARE_LOADER,"") == 0) {&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;其它&lt;/h2&gt;除了loading kernel driver外，其它有關wifi操作的部分皆是透過wpa_supplicant這套library，這套library很大，所以我不介紹了，有興趣的人可以參考external/wpa_supplicant。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-3056777657504425217?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/3056777657504425217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=3056777657504425217' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3056777657504425217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3056777657504425217'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2011/08/android-wifi-service.html' title='Android WIFI Service'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-CrW3iQjCD1Y/TkiEmKCmxkI/AAAAAAAAEh0/LkKg0eUHiB4/s72-c/pasted_image.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-7603242759177711227</id><published>2011-07-25T17:18:00.019+08:00</published><updated>2011-07-31T22:56:51.616+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='Diary'/><title type='text'>Synology DSM 3.2 Beta 之夜</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-2GbBdS-95yo/Ti4FSqjU85I/AAAAAAAAEhY/0Bj-lNR9XVs/s1600/cover.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 267px;" src="http://3.bp.blogspot.com/-2GbBdS-95yo/Ti4FSqjU85I/AAAAAAAAEhY/0Bj-lNR9XVs/s400/cover.JPG" alt="" id="BLOGGER_PHOTO_ID_5633446002105316242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;上週應以前大學同學之邀再加上抽獎獎項的誘惑，參加了&lt;a href="http://www.synology.com.tw/"&gt;Synology&lt;/a&gt; Beta之夜。其間為了抽獎非常認真做了筆記(沒抽到我，完全用不到^^||)，今天整理了一下筆記，順道介紹一下當天聽到了什麼新功能。&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-EJZW8RB3B3Y/Ti4IUexoqCI/AAAAAAAAEho/33lCWbOI20s/s1600/people_mountain_people_sea.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 267px;" src="http://2.bp.blogspot.com/-EJZW8RB3B3Y/Ti4IUexoqCI/AAAAAAAAEho/33lCWbOI20s/s400/people_mountain_people_sea.JPG" alt="" id="BLOGGER_PHOTO_ID_5633449331838724130" border="0" /&gt;&lt;/a&gt;圖：真是人山人海&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;先說明一下我大概是半年前買了他們家的DS211j，目的是1)拿來抓迷之片，2)當網芳使用，3)備份我重要的文件。使用到現在以現有功能我是很滿意，但是我還是覺得缺了一些功能，像是dropbox的功能，本來還期待這次發表會會發表，都只能怪主持人一直喊private cloud，讓我抱了一絲絲的期待。&lt;br /&gt;&lt;br /&gt;dropbox，不要說用NFS or curlftpfs or sshfs來做類似的應用(它們家的ssh service也沒有技援sshfs，這我也要抱怨一下)，但還是有很多dropbox可以達到的方便性是上述方案做不到。此外，現階段已經有很多open source的dropbox相關軟體，其實群暉只要花點時間改一下應該就可以用到他們的產品上 :)。&lt;br /&gt;&lt;br /&gt;上面講了那麼多不相關的東西，我還是要稱讚一下當天presenter的功力很棒，真是完全沒有冷場，2個小時根本就在歡笑中渡過。這應該算是我以前到現在所有參加過的宅宅活動裡頭，氣氛我覺得數一數二的好。此外當天是在君品酒店辦的，還有豐富的餐點，有考慮到有人是下班不吃飯直接衝去。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-xsmFQIY5iCc/Ti4CC41BSxI/AAAAAAAAEg4/jOCPjf-wRew/s1600/1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 266px;" src="http://1.bp.blogspot.com/-xsmFQIY5iCc/Ti4CC41BSxI/AAAAAAAAEg4/jOCPjf-wRew/s400/1.JPG" alt="" id="BLOGGER_PHOTO_ID_5633442432524831506" border="0" /&gt;&lt;/a&gt;圖：少不了要有豐盛的食物&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;廢話到此，我還是稍微來看圖說故事以及部分的新功能介紹。請讓我以Ubuntu/Android user and programmer的角度來看這些新功能，由喜好程度不需要-&amp;gt;很需要來介紹。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;以下是「&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;我不是企業用戶不需要這個功能&lt;/span&gt;&lt;span style="font-size:130%;"&gt;」的功能&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;LDAP (還好我家只有5個人)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;syslog aggregative (有經驗的阿宅網管應該會有自己的一套方法 )&lt;/li&gt;&lt;li&gt;Google cloud printer (我覺得有點不太實用，他有技援PDF or DOC？不論實用性，我是覺得不錯玩~ 好笑的是當天demo失敗，最後的presenter還補一槍)&lt;/li&gt;&lt;li&gt;監控系統，跨瀏覽器、方便佈署、效能提升 (如果那天我家遭小偷了或許我會買個ip cam試試）&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Opi0cLFqya4/Ti4FShf1yzI/AAAAAAAAEhg/dslcPBVUTZg/s1600/ldap.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 267px;" src="http://4.bp.blogspot.com/-Opi0cLFqya4/Ti4FShf1yzI/AAAAAAAAEhg/dslcPBVUTZg/s400/ldap.JPG" alt="" id="BLOGGER_PHOTO_ID_5633445999674772274" border="0" /&gt;&lt;/a&gt;圖：新版支援統一管理LDAP&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-sGB8p9wQ7XE/Ti4FSXZbDSI/AAAAAAAAEhQ/JpZPdL3OL3E/s1600/google_cloud_print.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 267px;" src="http://1.bp.blogspot.com/-sGB8p9wQ7XE/Ti4FSXZbDSI/AAAAAAAAEhQ/JpZPdL3OL3E/s400/google_cloud_print.JPG" alt="" id="BLOGGER_PHOTO_ID_5633445996963499298" border="0" /&gt;&lt;/a&gt;圖：demo google cloud print結果突搥了 XDDD&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;以下有了它「&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;世界更美好&lt;/span&gt;&lt;span style="font-size:130%;"&gt;」的功能&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;mount everything，簡單的說就是支援把別台電腦的samba資料匣mount到NAS上，還有mount iso檔。(很實用的功能，實作起來又非常非常非常簡單)&lt;/li&gt;&lt;li&gt;mobile app，也就是iOS or Android app也有支援軟體。(雖然還用不到，但上面可以做的東西大有可為）&lt;/li&gt;&lt;li&gt;全新的相簿介面，又可同步於facebook相簿。(我家頻寬自己都不夠用了，還要給別人用）&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-4hkFHWD7HAM/Ti4FSUFs9iI/AAAAAAAAEhI/I6VIfZxvTsk/s1600/android.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 267px;" src="http://2.bp.blogspot.com/-4hkFHWD7HAM/Ti4FSUFs9iI/AAAAAAAAEhI/I6VIfZxvTsk/s400/android.JPG" alt="" id="BLOGGER_PHOTO_ID_5633445996075480610" border="0" /&gt;&lt;/a&gt;圖：報告Mobile App的RD講者，可能原本就想說RD來報告一定很無聊，我想這位RD可以轉行做PM。&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 267px;" src="http://4.bp.blogspot.com/-afjM4AGP3aQ/Ti4FSOd3MsI/AAAAAAAAEhA/TGqAlUz_R8g/s400/album.JPG" alt="" id="BLOGGER_PHOTO_ID_5633445994566202050" border="0" /&gt;圖：PM在講相簿新增的功能&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;以下是「&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;考試100分&lt;/span&gt;&lt;span style="font-size:130%;"&gt;」的功能&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;拖拉檔案上傳功能&lt;/li&gt;&lt;li&gt;Youtube下載功能&lt;/li&gt;&lt;li&gt;免空下載功能&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;這三個功能是個人覺得比較有機會用到的功能，尤其是平常我常常在用bt抓ubuntu iso image(??)，如果可以用拖拉方式上傳種子真是非常方便。(我還是想要有個人的dropbox啦）&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-sQvsdlrWheI/Ti4OpsA_dQI/AAAAAAAAEhw/lFYCEYfTsZM/s1600/drag.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 292px;" src="http://2.bp.blogspot.com/-sQvsdlrWheI/Ti4OpsA_dQI/AAAAAAAAEhw/lFYCEYfTsZM/s400/drag.png" alt="" id="BLOGGER_PHOTO_ID_5633456293239813378" border="0" /&gt;&lt;/a&gt;講到拖拉種子進去網頁，如果Synology可以固定一個資料匣，讓我用網芳(NFS...)的方式拖拉進去，它就會幫我自動啟動Download Station抓資料，那我會覺得更實用。因為我根本就不想開網頁的管理介面。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;結論&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Synology的管理介面真的是獨樹一格，功能性也是NAS廠商中的佼佼者，我用了半年下來十分的滿意，我也因此慫恿了一些有相關需求的人買它們家的東西。&lt;br /&gt;&lt;br /&gt;這次藉由參加這個活動，也開始思考我會希望他們再提供什麼功能，列舉如下&lt;br /&gt;&lt;ul&gt;&lt;li&gt;dropbox&lt;/li&gt;&lt;li&gt;version control file folder (具有版本控制的資料匣)&lt;/li&gt;&lt;li&gt;open api&lt;/li&gt;&lt;li&gt;部分功能與nautilus or explorer結合&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;最後，若有興趣瞭解更多DSM 3.2 Beta功能的人可以參考當天投影片[&lt;a href="http://www.synology.com.tw/support/class_2011.php?lang=cht"&gt;這裡下載&lt;/a&gt;]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-7603242759177711227?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/7603242759177711227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=7603242759177711227' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7603242759177711227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7603242759177711227'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2011/07/synology-dsm-32-beta.html' title='Synology DSM 3.2 Beta 之夜'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-2GbBdS-95yo/Ti4FSqjU85I/AAAAAAAAEhY/0Bj-lNR9XVs/s72-c/cover.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-5684810447343144494</id><published>2011-06-09T15:07:00.008+08:00</published><updated>2011-06-10T00:03:13.400+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>zim plugins: 個人筆記軟體</title><content type='html'>&lt;span style="font-weight: bold;font-size:180%;" &gt;Why zim？&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;前陣子開始習慣用zim來當做個人筆記的軟體，在使用zim之前我survey了許多其他筆記軟體，像是Evernote，Nevernote，Tomboy，gnote等。最後我還是選擇了zim，主要有以下原因&lt;br /&gt;&lt;ul&gt;&lt;li&gt;wiki語法&lt;/li&gt;&lt;li&gt;所見即所得的介面&lt;/li&gt;&lt;li&gt;筆記以文字檔儲存&lt;/li&gt;&lt;li&gt;內建常用格式 (h1, h2, bold, italy, code...)&lt;/li&gt;&lt;li&gt;容易hack (python)&lt;/li&gt;&lt;li&gt;配合dokuwiki使用，可當公司內的文件分享系統&lt;/li&gt;&lt;li&gt;配合dropbox，便成雲端筆記本&lt;/li&gt;&lt;li&gt;配合shutter，螢幕截圖超方便&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;這篇文章，主要會介紹一個搜尋文件程式及如何將zim的文件發佈要dokuwiki上。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;zim search&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;zim search是一個視窗程式，以wxPython寫成，輸入欲搜尋字串，它會將有此字串的文件列出，並依照權重排序，雙點任何列便可直接在zim中開啟該文件。此工具截圖如下&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-8_So_L8nidQ/TfBx3zMhfeI/AAAAAAAAEcU/BHDISsbpJcQ/s1600/zim%2Bsearching_001.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 208px;" src="http://3.bp.blogspot.com/-8_So_L8nidQ/TfBx3zMhfeI/AAAAAAAAEcU/BHDISsbpJcQ/s320/zim%2Bsearching_001.png" alt="" id="BLOGGER_PHOTO_ID_5616113938780487138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;設定&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;這隻程式接受2個參數，第一為zim筆記本名，第二為筆記本路徑，zim裡的tools -&amp;gt; custom tools設定如下&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-gZAeRXln8XA/TfBzqAxRrJI/AAAAAAAAEck/KLsSSUgEiiA/s1600/%25E7%25B7%25A8%25E8%25BC%25AF%25E8%2587%25AA%25E8%25A8%2582%25E5%25B7%25A5%25E5%2585%25B7%2B-%2BZim_001.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 270px; height: 320px;" src="http://4.bp.blogspot.com/-gZAeRXln8XA/TfBzqAxRrJI/AAAAAAAAEck/KLsSSUgEiiA/s320/%25E7%25B7%25A8%25E8%25BC%25AF%25E8%2587%25AA%25E8%25A8%2582%25E5%25B7%25A5%25E5%2585%25B7%2B-%2BZim_001.png" alt="" id="BLOGGER_PHOTO_ID_5616115900929387666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;源碼find.py可由此抓到 &lt;a href="https://github.com/fcwu/zim-plugins"&gt;https://github.com/fcwu/zim-plugins&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;zim wiki deploy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;為了分享我的筆記給其他同仁觀看，我架了dokuwiki當做分享平台，dokuwiki的儲存格式(文字檔)及wiki語法跟zim只有些許的不同，為了做語法的轉換及附件(圖片，或附檔)的發佈，因此我寫了這個腳本。&lt;br /&gt;&lt;br /&gt;用此腳本發佈在dokuwiki的結果如下圖:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-1LK3t9OUeKM/TfB6KSvxJcI/AAAAAAAAEc8/9dYz720cc-Q/s1600/%25E6%2593%25B7%25E5%258F%2596%25E9%2581%25B8%25E5%258F%2596%25E5%258D%2580%25E5%259F%259F_003.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 217px;" src="http://1.bp.blogspot.com/-1LK3t9OUeKM/TfB6KSvxJcI/AAAAAAAAEc8/9dYz720cc-Q/s400/%25E6%2593%25B7%25E5%258F%2596%25E9%2581%25B8%25E5%258F%2596%25E5%258D%2580%25E5%259F%259F_003.png" alt="" id="BLOGGER_PHOTO_ID_5616123052580480450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;zim上觀看如下&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-6Jpq3WHL16w/TfB7y1CadII/AAAAAAAAEdE/LDFetWXBDFk/s1600/%25E6%2593%25B7%25E5%258F%2596%25E9%2581%25B8%25E5%258F%2596%25E5%258D%2580%25E5%259F%259F_004.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 304px;" src="http://4.bp.blogspot.com/-6Jpq3WHL16w/TfB7y1CadII/AAAAAAAAEdE/LDFetWXBDFk/s400/%25E6%2593%25B7%25E5%258F%2596%25E9%2581%25B8%25E5%258F%2596%25E5%258D%2580%25E5%259F%259F_004.png" alt="" id="BLOGGER_PHOTO_ID_5616124848491885698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;設定&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;此腳本接受的參數如下&lt;br /&gt;&lt;ol&gt;&lt;li&gt;筆記本名&lt;/li&gt;&lt;li&gt;dokuwiki root path&lt;/li&gt;&lt;li&gt;user name&lt;/li&gt;&lt;li&gt;附件路徑&lt;/li&gt;&lt;li&gt;文本路徑&lt;/li&gt;&lt;/ol&gt;其中user name是用來區別&lt;span style="font-weight: bold;"&gt;你&lt;/span&gt;的文件應該存放的位置。舉例來說dokuwiki root path為&lt;span style="font-style: italic;"&gt;/var/www/wiki/&lt;/span&gt;，user name為&lt;span style="font-style: italic;"&gt;doro&lt;/span&gt;則文件會發佈放在&lt;span style="font-style: italic;"&gt;/var/www/wiki/data/pages/doro&lt;/span&gt;，附件會發佈在&lt;span style="font-style: italic;"&gt;/var/www/wiki/data/media/doro&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;使用前請先確定已建立這些路徑，且擁有寫入權限。zim設定如下圖:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-zWNAJ06YPV8/TfB4tnsAa-I/AAAAAAAAEcs/onYLirdaVZQ/s1600/%25E7%25B7%25A8%25E8%25BC%25AF%25E8%2587%25AA%25E8%25A8%2582%25E5%25B7%25A5%25E5%2585%25B7%2B-%2BZim_002.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 270px; height: 320px;" src="http://1.bp.blogspot.com/-zWNAJ06YPV8/TfB4tnsAa-I/AAAAAAAAEcs/onYLirdaVZQ/s320/%25E7%25B7%25A8%25E8%25BC%25AF%25E8%2587%25AA%25E8%25A8%2582%25E5%25B7%25A5%25E5%2585%25B7%2B-%2BZim_002.png" alt="" id="BLOGGER_PHOTO_ID_5616121460474014690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;源碼deploy_wiki.py可由此抓到 &lt;a href="https://github.com/fcwu/zim-plugins"&gt;https://github.com/fcwu/zim-plugins&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-5684810447343144494?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/5684810447343144494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=5684810447343144494' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5684810447343144494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5684810447343144494'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2011/06/zim-plugins.html' title='zim plugins: 個人筆記軟體'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-8_So_L8nidQ/TfBx3zMhfeI/AAAAAAAAEcU/BHDISsbpJcQ/s72-c/zim%2Bsearching_001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-4640194667364187020</id><published>2010-09-14T11:27:00.002+08:00</published><updated>2010-09-14T11:28:35.256+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Publish Your WxWidget Program</title><content type='html'>&lt;br&gt;Publish Your wxWidget Program&lt;br&gt;&lt;br&gt;&lt;div&gt;&amp;#21021;&amp;#20837;wxWidget&amp;#26178;&amp;#65292;&amp;#26159;&amp;#20351;&amp;#29992;wxDev-C++&amp;#30070;&amp;#20316;&amp;#38283;&amp;#30332;&amp;#32232;&amp;#35695;&amp;#29872;&amp;#22659;&amp;#65292;&amp;#24460;&amp;#20358;&amp;#19981;&amp;#32147;&amp;#24847;&amp;#30340;&amp;#20351;&amp;#29992;&amp;#20102;VS2005&amp;#30340;&amp;#29872;&amp;#22659;&amp;#65292;&amp;#20415;&amp;#38283;&amp;#22987;&amp;#24859;&amp;#19978;cl.exe&amp;#37027;&amp;#40636;&amp;#39131;&amp;#24555;&amp;#32232;&amp;#35695;&amp;#36895;&amp;#24230;&amp;#12289;Visual Studio&amp;#33391;&amp;#22909;Debug&amp;#29872;&amp;#22659;&amp;#12290;&lt;br&gt;&lt;br&gt;&amp;#20294;&amp;#26368;&amp;#36817;&amp;#22312;&amp;#30332;&amp;#34892;wxWidget&amp;#31243;&amp;#24335;(Release Version)&amp;#26178;&amp;#65292;&amp;#22312;&amp;#20854;&amp;#20182;&amp;#26410;&amp;#23433;&amp;#35037;Visual Studio&amp;#30340;&amp;#38651;&amp;#33126;&amp;#19978;&amp;#28961;&amp;#27861;&amp;#22519;&amp;#34892;&amp;#30340;&amp;#21839;&amp;#38988;&amp;#65292;&amp;#23559;&amp;#37679;&amp;#35492;&amp;#35338;&amp;#24687;google&amp;#36942;&amp;#24460;&amp;#30332;&amp;#29694;&amp;#26159;&amp;#32232;&amp;#35695;&amp;#21443;&amp;#25976;/MD&amp;#30340;&amp;#38364;&amp;#20418;&amp;#65292;&amp;#23559;/MD&amp;#25913;&amp;#25104;/MT&amp;#20415;&amp;#34892;(&amp;#22312;project&amp;#23660;&amp;#24615;&amp;#38913;&amp;#30340;&amp;#32068;&amp;#24907;&amp;#23660;&amp;#24615;--&amp;gt;C/C++--&amp;gt;&amp;#31243;&amp;#24335;&amp;#30908;&amp;#29986;&amp;#29983;&amp;#35041;)&amp;#12290;&lt;br&gt;&lt;br&gt;&amp;#25913;&amp;#23436;&amp;#37325;&amp;#32232;&amp;#24460;&amp;#65292;&amp;#21448;&amp;#30332;&amp;#29983;&lt;br&gt;&lt;blockquote&gt;------ &amp;#24050;&amp;#21855;&amp;#21205;&amp;#20840;&amp;#37096;&amp;#37325;&amp;#26032;&amp;#29983;&amp;#25104;: &amp;#38917;&amp;#30446;: WxWidgetsWizardTest, &amp;#37197;&amp;#32622;: Debug Win32 ------&lt;br&gt;&amp;#27491;&amp;#22312;&amp;#21034;&amp;#38500;&amp;#38917;&amp;#30446;&amp;#12300;WxWidgetsWizardTest&amp;#12301;(&amp;#37197;&amp;#32622;&amp;#12300;Debug|Win32&amp;#12301;)&amp;#30340;&amp;#20013;&amp;#38291;&amp;#25991;&amp;#20214;&amp;#21644;&amp;#36664;&amp;#20986;&amp;#25991;&amp;#20214;&lt;br&gt;&amp;#27491;&amp;#22312;&amp;#32232;&amp;#35695;...&lt;br&gt;WxWidgetsWizardTestFrm.cpp&lt;br&gt;&amp;#27491;&amp;#22312;&amp;#32232;&amp;#35695;...&lt;br&gt;WxWidgetsWizardTestApp.cpp&lt;br&gt;&amp;#27491;&amp;#22312;&amp;#32232;&amp;#35695;&amp;#36039;&amp;#28304;&amp;#28165;&amp;#21934;...&lt;br&gt;&amp;#27491;&amp;#22312;&amp;#37832;&amp;#25509;...&lt;br&gt;MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: _free &amp;#24050;&amp;#32147;&amp;#22312; LIBCMT.lib(free.obj) &amp;#20013;&amp;#23450;&amp;#32681;&lt;br&gt;MSVCRTD.lib(ti_inst.obj) : error LNK2005: &amp;quot;private: __thiscall type_info::type_info(class type_info const &amp;amp;)&amp;quot; (??0type_info@@AAE@ABV0@@Z) &amp;#24050;&amp;#32147;&amp;#22312; LIBCMT.lib(typinfo.obj) &amp;#20013;&amp;#23450;&amp;#32681;&lt;br&gt;MSVCRTD.lib(ti_inst.obj) : error LNK2005: &amp;quot;private: class type_info &amp;amp; __thiscall type_info::operator=(class type_info const &amp;amp;)&amp;quot; (??4type_info@@AAEAAV0@ABV0@@Z) &amp;#24050;&amp;#32147;&amp;#22312; LIBCMT.lib(typinfo.obj) &amp;#20013;&amp;#23450;&amp;#32681;&lt;br&gt;LINK : warning LNK4098: &amp;#40664;&amp;#35469;&amp;#24235;&amp;#12300;LIBCMT&amp;#12301;&amp;#33287;&amp;#20854;&amp;#20182;&amp;#24235;&amp;#30340;&amp;#20351;&amp;#29992;&amp;#34909;&amp;#31361;&amp;#65307;&amp;#35531;&amp;#20351;&amp;#29992; /NODEFAULTLIB:library&lt;br&gt;LINK : warning LNK4098: &amp;#40664;&amp;#35469;&amp;#24235;&amp;#12300;MSVCRTD&amp;#12301;&amp;#33287;&amp;#20854;&amp;#20182;&amp;#24235;&amp;#30340;&amp;#20351;&amp;#29992;&amp;#34909;&amp;#31361;&amp;#65307;&amp;#35531;&amp;#20351;&amp;#29992; /NODEFAULTLIB:library&lt;br&gt;LINK : warning LNK4098: &amp;#40664;&amp;#35469;&amp;#24235;&amp;#12300;LIBCMTD&amp;#12301;&amp;#33287;&amp;#20854;&amp;#20182;&amp;#24235;&amp;#30340;&amp;#20351;&amp;#29992;&amp;#34909;&amp;#31361;&amp;#65307;&amp;#35531;&amp;#20351;&amp;#29992; /NODEFAULTLIB:library&lt;br&gt;D:\WxWidgetsWizardTest\Debug\WxWidgetsWizardTest.exe : fatal error LNK1169: &amp;#25214;&amp;#21040;&amp;#19968;&amp;#20491;&amp;#25110;&amp;#22810;&amp;#20491;&amp;#22810;&amp;#37325;&amp;#23450;&amp;#32681;&amp;#30340;&amp;#31526;&amp;#34399;&lt;br&gt;&amp;#29983;&amp;#25104;&amp;#26085;&amp;#35468;&amp;#20445;&amp;#23384;&amp;#22312;&amp;#12300;file://d:\WxWidgetsWizardTest\WxWidgetsWizardTest\Debug\BuildLog.htm&amp;#12301;&lt;br&gt;WxWidgetsWizardTest - 4 &amp;#20491;&amp;#37679;&amp;#35492;&amp;#65292;3 &amp;#20491;&amp;#35686;&amp;#21578;&lt;br&gt;========== &amp;#20840;&amp;#37096;&amp;#37325;&amp;#26032;&amp;#29983;&amp;#25104;: 0 &amp;#24050;&amp;#25104;&amp;#21151;, 1 &amp;#24050;&amp;#22833;&amp;#25943;, 0 &amp;#24050;&amp;#36339;&amp;#36942; ==========&lt;br&gt;&lt;/blockquote&gt;&amp;#25152;&amp;#20197;&amp;#25105;&amp;#21448;&amp;#21435;google&amp;#36889;&amp;#20491;&amp;#37679;&amp;#35492;&amp;#65292;&amp;#30332;&amp;#29694;&amp;#26159;library&amp;#37096;&amp;#20998;&amp;#20063;&amp;#35201;&amp;#20197;&amp;#32173;&amp;#25345;&amp;#19968;&amp;#33268;&amp;#24615;&amp;#65292;&amp;#38918;&amp;#25163;&amp;#23559;C:\wxWidgets-2.9.0\build\msw\wx_vc8.sln&amp;#25171;&amp;#38283;&amp;#24460;&amp;#65292;&amp;#20006;&amp;#23559;&amp;#25152;&amp;#26377;&amp;#30340;/MD&amp;#25913;&amp;#25104;/MT&amp;#65292;&amp;#37325;&amp;#32232;&amp;#24460;&amp;#20415;OK&amp;#20102;&amp;#12290;&lt;br&gt;&lt;br&gt;&amp;#33509;&amp;#36996;&amp;#26159;&amp;#26377;&amp;#36935;&amp;#21040;&amp;#21839;&amp;#38988;&amp;#65292;&amp;#19981;&amp;#24439;&amp;#27880;&amp;#24847;&amp;#19968;&amp;#19979;&amp;#33258;&amp;#24049;&amp;#36899;&amp;#32080;&amp;#30340;library&amp;#35041;&amp;#65292;&amp;#26159;&amp;#21542;&amp;#26377;&amp;#29992;&amp;#21040;debug&amp;#30340;&amp;#29256;&amp;#26412;&amp;#65292;library&amp;#21450;&amp;#31243;&amp;#24335;&amp;#32232;&amp;#35695;&amp;#21443;&amp;#25976;&amp;#26368;&amp;#22909;&amp;#19968;&amp;#27169;&amp;#19968;&amp;#27171;&amp;#65292;&amp;#36889;&amp;#27171;&amp;#30896;&amp;#21040;&amp;#30340;&amp;#21839;&amp;#38988;&amp;#26371;&amp;#36611;&amp;#23569;&amp;#12290;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-4640194667364187020?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/4640194667364187020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=4640194667364187020' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4640194667364187020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4640194667364187020'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2010/09/publish-your-wxwidget-program.html' title='Publish Your WxWidget Program'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-8003976708063199677</id><published>2010-08-26T13:26:00.002+08:00</published><updated>2010-08-26T13:30:34.110+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>wxWidget 初學</title><content type='html'>wxWidget 初學&lt;br&gt;&lt;br&gt;(廣告: 最近有人有case要外包嗎? 最近非常缺, 有要外包的, 請email給我)&lt;br&gt;&lt;br&gt;最近有人問起：「我想學C++ UI programming，我該學那套好？」可以用C++來寫UI的frameworks很多，如果是我推薦，我一定會選擇我最熟悉的[&lt;a href="http://www.wxwidgets.org/" id="tj:r" title="wxWidget"&gt;wxWidget&lt;/a&gt;]。&lt;br&gt;&lt;br&gt;師父引入門，修行靠自己。對於初學者最好從一個好用的IDE開始，wxWidget唯一(誤)可用的IDE是[&lt;a href="http://wxdsgn.sourceforge.net/" id="ln4." title="wxDev-C++"&gt;wxDev-C++&lt;/a&gt;]，要使用它來開發，基本上就是抓下來安裝好就可以開始玩了。其他的IDE可以參考[&lt;a href="http://wiki.wxwidgets.org/" id="ckhr" title="wxWiki"&gt;wxWiki&lt;/a&gt;]的[&lt;a href="http://wiki.wxwidgets.org/Tools" id="mp12" title="Tools"&gt;Tools&lt;/a&gt;]頁面，裡頭有介紹不少工具可用。&lt;br&gt;&lt;br&gt;在玩IDE的途中，一定會需要參考到那些物件及函式可用，這部分可到[&lt;a href="http://docs.wxwidgets.org/trunk/" id="gra0" title="Reference Manual"&gt;Reference Manual&lt;/a&gt;]一探一二。若需要有一整套完整的介紹可參考這本書[&lt;a href="http://www.amazon.com/gp/product/0131473816" id="f:j4" title="Cross-Platform GUI Programming with WxWidget"&gt;Cross-Platform GUI Programming with WxWidget&lt;/a&gt;]，網路上可找到電子版的。&lt;br&gt;&lt;br&gt;再進階一點，自己重編整個wxWidget library是少不了的，你可以在[&lt;a href="http://www.wxwidgets.org/downloads/" id="hrph" title="Download"&gt;Download&lt;/a&gt;]頁面，找到適合你的版本。以Windows + Visual Studio 2005重編也很容易，先將[&lt;a href="http://prdownloads.sourceforge.net/wxwindows/wxWidgets-2.9.0.tar.gz" id="c2oy" title="wxAll"&gt;wxAll&lt;/a&gt;]抓下來，解壓縮，用VS2005開，再按建置就完成了。&lt;br&gt;&lt;br&gt;需要範例可在source code的sample資料匣下找到。&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-8003976708063199677?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/8003976708063199677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=8003976708063199677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/8003976708063199677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/8003976708063199677'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2010/08/wxwidget.html' title='wxWidget 初學'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-2254955459618318756</id><published>2010-08-25T13:23:00.002+08:00</published><updated>2010-08-25T13:28:49.381+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Build Your Own Fedora and Ubuntu</title><content type='html'>Build Your Own Fedora and Ubuntu&lt;br&gt;&lt;br&gt;&amp;#26368;&amp;#36817;&amp;#22240;&amp;#28858;&amp;#20844;&amp;#21496;&amp;#31245;&amp;#38290;, &amp;#20415;&amp;#38283;&amp;#22987;&amp;#28858;&amp;#20102;&amp;#26410;&amp;#20358;&amp;#28310;&amp;#20633;&amp;#21450;&amp;#33288;&amp;#36259;&amp;#65292;&amp;#36880;&amp;#28472;&amp;#23559;&amp;#30446;&amp;#21069;&amp;#30340;&amp;#24037;&amp;#20316;&amp;#24179;&amp;#21488;&amp;#31227;&amp;#33879;Linux&amp;#19978;&amp;#12290;&amp;#36969;&amp;#36868;&amp;#21083;&amp;#22909;&amp;#26377;&amp;#20154;&amp;#21839;&amp;#25105;&amp;#22914;&amp;#20309;&amp;#35069;&amp;#20316;&amp;#33258;&amp;#24049;&amp;#30340;Fedora&amp;#65292;&amp;#25152;&amp;#20197;&amp;#35352;&amp;#36617;&amp;#19968;&amp;#19979;&amp;#24037;&amp;#20316;&amp;#23526;&amp;#37636;&amp;#12290;&lt;br&gt;&lt;br&gt;&lt;b&gt;Compile Fedora 13 and Ubuntu 10.04 kernel&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;How to compile a kernel on Ubuntu 10.04, &lt;a href="http://linuxtweaking.blogspot.com/2010/05/how-to-compile-kernel-on-ubuntu-1004.html"&gt;http://linuxtweaking.blogspot.com/2010/05/how-to-compile-kernel-on-ubuntu-1004.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Building a custom kernel, &lt;a href="http://fedoraproject.org/wiki/Docs/CustomKernel"&gt;http://fedoraproject.org/wiki/Docs/CustomKernel&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;b&gt;Build Your Own Fedora and Ubuntu&lt;/b&gt;&lt;br&gt;&lt;br&gt;Fedora&amp;#21487;&amp;#29992;[&lt;a href="http://revisor.fedoraunity.org/"&gt;Revisor&lt;/a&gt;]&amp;#36889;&amp;#20491;&amp;#24037;&amp;#20855;&amp;#20358;&amp;#35069;&amp;#20316;&amp;#65292;&amp;#22823;&amp;#21046;&amp;#19978;&amp;#22294;&amp;#22411;&amp;#20171;&amp;#38754;&amp;#19968;&amp;#27493;&amp;#27493;&amp;#24448;&amp;#19979;&amp;#36208;&amp;#23601;&amp;#21487;&amp;#35069;&amp;#20316;&amp;#20986;&amp;#20809;&amp;#30879;&amp;#22312;/svr&amp;#24213;&amp;#19979;&amp;#12290;&amp;#21807;&amp;#29544;2&amp;#20491;&amp;#23567;&amp;#22320;&amp;#26041;&amp;#35201;&amp;#20462;&amp;#27491;&amp;#65292;&amp;#21542;&amp;#21063;&amp;#26371;&amp;#20986;&amp;#29694;&amp;#12301;anaconda error code 1&amp;#12301;&amp;#30340;&amp;#37679;&amp;#35492;&amp;#35338;&amp;#24687;&amp;#65306;&lt;br&gt;&lt;ul&gt;&lt;li&gt;Copy /usr/lib/revisor/scripts/F12-buildinstall to /usr/lib/revisor/scripts/F13-buildinstall&lt;/li&gt;&lt;li&gt;Comment out two sections of &amp;#12300;anaconda-updates&amp;#12301; and &amp;#12300;anaconda-updats-source&amp;#12301; in /etc/revisor/conf.d/revisor-f13-i386.conf&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;Ubuntu&amp;#21487;&amp;#29992;[&lt;a href="http://maketecheasier.com/reconstructor-creating-your-own-ubuntu-distribution/2008/07/05"&gt;Reconstructor&lt;/a&gt;]&amp;#65292;&amp;#36899;&amp;#32080;&amp;#20839;&amp;#22294;&amp;#25991;&amp;#20006;&amp;#33538;&amp;#12290;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-2254955459618318756?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/2254955459618318756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=2254955459618318756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/2254955459618318756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/2254955459618318756'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2010/08/build-your-own-fedora-and-ubuntu.html' title='Build Your Own Fedora and Ubuntu'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-183251354888927129</id><published>2010-05-09T15:35:00.003+08:00</published><updated>2010-07-05T07:37:35.749+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Diary'/><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>舒跑杯路跑</title><content type='html'>5/2 &amp;#21435;&amp;#21443;&amp;#21152;&amp;#20102;&amp;#33298;&amp;#36305;&amp;#26479;&amp;#30340;&amp;#36335;&amp;#36305;&amp;#65292;&amp;#36889;&amp;#26159;3&amp;#24180;&amp;#24930;&amp;#36305;&amp;#29983;&amp;#28079;&amp;#30340;milestone&amp;#21543;&amp;#12290;&lt;br&gt;&lt;br&gt;&amp;#36889;&amp;#27425;&amp;#22240;&amp;#28858;&amp;#22826;&amp;#26202;&amp;#22577;&amp;#21517;&amp;#65292;&amp;#21482;&amp;#33021;&amp;#22577;&amp;#21040;3KM&amp;#30340;&amp;#20241;&amp;#38290;&amp;#32068;&amp;#65292;&amp;#20294;&amp;#25105;&amp;#36319;&amp;#25105;&amp;#22899;&amp;#21451;&amp;#36996;&amp;#26159;&amp;#20599;&amp;#20599;&amp;#36305;&amp;#21435;&amp;#21443;&amp;#21152;&amp;#20102;9KM&amp;#32068;&amp;#12290;&amp;#30070;&amp;#22825;&amp;#26089;&amp;#19978;&amp;#25105;&amp;#20497;&amp;#19981;&amp;#21040;5&amp;#40670;&amp;#23601;&amp;#36215;&amp;#24202;&amp;#20102;&amp;#65292;5:40&amp;#21040;&amp;#24066;&amp;#25919;&amp;#24220;&amp;#65292;&amp;#20808;&amp;#20570;&amp;#26262;&amp;#36523;&amp;#65292;&amp;#28310;&amp;#26178;6&amp;#40670;&amp;#38283;&amp;#22987;&amp;#36305;&amp;#12290;&lt;br&gt;&lt;br&gt;9KM&amp;#30340;&amp;#36335;&amp;#31243;&amp;#22823;&amp;#32004;&amp;#26159;&amp;#30001;&amp;#21488;&amp;#21271;&amp;#24066;&amp;#25919;&amp;#24220;&amp;#24310;&amp;#33879;&amp;#20161;&amp;#24859;&amp;#36335;&amp;#65292;&amp;#22823;&amp;#27010;&amp;#22312;&amp;#21488;&amp;#22823;&amp;#37291;&amp;#23416;&amp;#38498;&amp;#37027;&amp;#25240;&amp;#36820;&amp;#20877;&amp;#36305;&amp;#22238;&amp;#20358;&amp;#12290;&amp;#25105;&amp;#24179;&amp;#24120;&amp;#19981;&amp;#31649;&amp;#22312;&amp;#36305;&amp;#27493;&amp;#27231;&amp;#25110;&amp;#26159;&amp;#36939;&amp;#21205;&amp;#22580;&amp;#24478;&amp;#20358;&amp;#27794;&amp;#26377;&amp;#36305;&amp;#36229;&amp;#36942;7KM&amp;#65292;&amp;#27794;&amp;#24819;&amp;#21040;&amp;#36889;&amp;#27425;9KM&amp;#30340;&amp;#36335;&amp;#31243;&amp;#36305;&amp;#36215;&amp;#20358;&amp;#36996;&amp;#31639;&amp;#36629;&amp;#39686;&amp;#65292;&amp;#36305;&amp;#20986;&amp;#20358;&amp;#30340;&amp;#25104;&amp;#32318;&amp;#20063;&amp;#31639;&amp;#19981;&amp;#31639;&amp;#65292;9KM&amp;#33457;58&amp;#20998;&amp;#37912;&amp;#12290;&amp;#36889;&amp;#21487;&amp;#33021;&amp;#30340;&amp;#21407;&amp;#22240;&amp;#24456;&amp;#22810;&amp;#65292;&amp;#25105;&amp;#29468;&amp;#26368;&amp;#22823;&amp;#30340;&amp;#21407;&amp;#22240;&amp;#26159;&amp;#39080;&amp;#26223;&amp;#19968;&amp;#30452;&amp;#35722;&amp;#19981;&amp;#26371;&amp;#22826;&amp;#28961;&amp;#32842;&amp;#65292;&amp;#36305;&amp;#36215;&amp;#20358;&amp;#20063;&amp;#23601;&amp;#29305;&amp;#21029;&amp;#26377;&amp;#21147;&amp;#12290;&lt;br&gt;&lt;br&gt;&amp;#36889;&amp;#27425;&amp;#36305;&amp;#23436;&amp;#30340;&amp;#24863;&amp;#35258;&amp;#21313;&amp;#20998;&amp;#33391;&amp;#22909;&amp;#65292;&amp;#25105;&amp;#24819;&amp;#19979;&amp;#27425;&amp;#26377;&amp;#27231;&amp;#26371;&amp;#36996;&amp;#26371;&amp;#32380;&amp;#32396;&amp;#21443;&amp;#21152;&amp;#20854;&amp;#20182;&amp;#36335;&amp;#36305; :)&lt;br&gt;&lt;br&gt;&amp;#38468;&amp;#19978;&amp;#29031;&amp;#29255;&amp;#19968;&amp;#24373; [&lt;a class="gphoto-album-cover-link" href="http://picasaweb.google.com/FCWu.tw/20100502_"&gt;20100502_&amp;#33298;&amp;#36305;&amp;#26479;&amp;#36335;&amp;#36305;&lt;/a&gt;]&lt;br&gt;&lt;br&gt;&lt;div id="vdjk" style="text-align:left"&gt;&lt;img src="http://docs.google.com/File?id=ddt9hgn6_169dh4mt4hk_b" style="height:480px;width:640px"&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-183251354888927129?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/183251354888927129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/183251354888927129'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2010/05/blog-post.html' title='舒跑杯路跑'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-4538722833528457521</id><published>2010-05-09T15:06:00.002+08:00</published><updated>2010-05-09T15:07:33.185+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>打造自己的VIM: 源碼追蹤 call tree (CCTree)</title><content type='html'>&lt;a href="http://www.vim.org/scripts/script.php?script_id=2368" id="cwwc" title="CCTree"&gt;CCTree&lt;/a&gt; &amp;#26159;&amp;#19968;&amp;#20491;&amp;#23565;&amp;#26044;VIM&amp;#20351;&amp;#29992;&amp;#32773;&amp;#24456;&amp;#26041;&amp;#20415;&amp;#30340;&amp;#36861;&amp;#36452;&amp;#28304;&amp;#30908;&amp;#24037;&amp;#20855;&amp;#12290;&amp;#23427;&amp;#20027;&amp;#35201;&amp;#25552;&amp;#20379;2&amp;#31278;&amp;#21151;&amp;#33021;&amp;#65292;&amp;#19968;&amp;#26159;&amp;#26681;&amp;#25818;&amp;#36664;&amp;#20837;&amp;#30340;Symbol (&amp;#20989;&amp;#24335;&amp;#21517;)&amp;#29986;&amp;#29983;&amp;#25152;&amp;#26377;&amp;#21628;&amp;#21483;&amp;#21040;&amp;#27492;symbol&amp;#30340;&amp;#20989;&amp;#24335;&amp;#21517;&amp;#21015;&amp;#34920;&amp;#65307;&amp;#25110;&amp;#26159;&amp;#26681;&amp;#25818;&amp;#36664;&amp;#20837;&amp;#29986;&amp;#29983;&amp;#27492;symbol&amp;#25152;&amp;#26377;&amp;#21628;&amp;#21483;&amp;#21040;&amp;#30340;&amp;#20989;&amp;#24335;&amp;#27193;&amp;#29376;&amp;#22294;&amp;#12290;&lt;br&gt;&lt;br&gt;&amp;#23433;&amp;#35037;&amp;#27492;plugin&amp;#30340;&amp;#26041;&amp;#24335;&amp;#21313;&amp;#20998;&amp;#31777;&amp;#21934;&amp;#65292;&amp;#21482;&amp;#38656;&amp;#23559;CCTree.vim&amp;#31227;&amp;#33267;vim/plugin/&amp;#24213;&amp;#19979;&amp;#20415;&amp;#34892;&amp;#12290;&lt;br&gt;&lt;br&gt;&amp;#22312;&amp;#20351;&amp;#29992;CCTree&amp;#20043;&amp;#21069;&amp;#65292;&amp;#35531;&amp;#20808;&amp;#29986;&amp;#29983;cscope.out&amp;#65292;&amp;#33509;&amp;#26377;&amp;#19981;&amp;#28165;&amp;#26970;&amp;#30340;&amp;#26379;&amp;#21451;&amp;#20497;&amp;#65292;&amp;#21487;&amp;#21443;&amp;#32771;&amp;#23567;&amp;#24351;&amp;#20043;&amp;#21069;&amp;#30340;&amp;#25991;&amp;#31456;[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-srcexpl.html"&gt;&amp;#28304;&amp;#30908;&amp;#36861;&amp;#36452; ctags+cscope&amp;#21450;&amp;#38928;&amp;#35261;&amp;#35222;&amp;#31383;SrcExpl&lt;/a&gt;]&amp;#12290;&amp;#22312;&amp;#29986;&amp;#29983;&amp;#23436;&amp;#24460;&amp;#39318;&amp;#20808;&amp;#38656;&amp;#19979;CCTreeLoadDB&amp;#35712;&amp;#21462;cscope.out&amp;#65292;&amp;#36889;&amp;#38656;&amp;#35201;&amp;#19968;&amp;#20123;&amp;#26178;&amp;#38291;&amp;#65292;&amp;#25509;&amp;#33879;&amp;#23601;&amp;#33021;&amp;#38283;&amp;#22987;&amp;#20351;&amp;#29992;CCTree&amp;#20102;&amp;#12290;CCTree&amp;#20351;&amp;#29992;&amp;#19978;&amp;#21482;&amp;#26377;4&amp;#20491;&amp;#24555;&amp;#36895;&amp;#37749;&amp;#65292;&amp;#22914;&amp;#19979;&lt;br&gt;&lt;br&gt;&lt;div id="ufok" style="text-align:center"&gt;&lt;img src="http://docs.google.com/File?id=ddt9hgn6_163dw4x6qd8_b" style="height:261px;width:337px"&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;&amp;#33289;&amp;#20363;&amp;#20358;&amp;#35498;&amp;#65292;&amp;#25105;&amp;#22312;LoadBmpImage&amp;#19979;&amp;#25353;&amp;#19979;&amp;lt;C-\&amp;gt;&amp;lt;&amp;#65292;&amp;#22312;VIM&amp;#30340;&amp;#24038;&amp;#37002;&amp;#30340;window&amp;#65292;&amp;#20415;&amp;#26371;&amp;#39023;&amp;#31034;&amp;#26377;2&amp;#20491;&amp;#20989;&amp;#24335;&amp;#21628;&amp;#21483;&amp;#23427;&amp;#65292;&amp;#22914;&amp;#19979;&amp;#22294;&amp;#65306;&lt;br&gt;&lt;br&gt;&lt;div id="pi9v" style="text-align:left"&gt;&lt;div id="f:7s" style="text-align:center"&gt;&lt;img src="http://docs.google.com/File?id=ddt9hgn6_165f2cn54dh_b" style="height:187.544px;width:648px"&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&amp;#33509;&amp;#26159;&amp;#22312;LoadBmpImage&amp;#19979;&amp;#25353;&amp;#19979;&amp;lt;C-\&amp;gt;&amp;gt;&amp;#22312;VIM&amp;#30340;&amp;#24038;&amp;#37002;&amp;#30340;window&amp;#65292;&amp;#20415;&amp;#26371;&amp;#39023;&amp;#31034;&amp;#26377;LoadBmpImage&amp;#21628;&amp;#21483;&amp;#20102;&amp;#22810;&amp;#23569;&amp;#20989;&amp;#24335;&amp;#65292;&amp;#22914;&amp;#19979;&amp;#22294;&amp;#65306;&lt;br&gt;&lt;br&gt;&lt;div id="oycv" style="text-align:center"&gt;&lt;img src="http://docs.google.com/File?id=ddt9hgn6_166fdchdzf5_b" style="height:311.65px;width:648px"&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-4538722833528457521?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/4538722833528457521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=4538722833528457521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4538722833528457521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4538722833528457521'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2010/05/vim-call-tree-cctree.html' title='打造自己的VIM: 源碼追蹤 call tree (CCTree)'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-5395930617687526337</id><published>2010-04-14T17:05:00.002+08:00</published><updated>2010-04-14T17:11:05.963+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><title type='text'>透過SendMessage控制功能表項</title><content type='html'>&amp;#21069;&amp;#24190;&amp;#22825;&amp;#26377;&amp;#26379;&amp;#21451;&amp;#21839;&amp;#25105;&amp;#24590;&amp;#40636;&amp;#22312;Windows&amp;#20013;&amp;#25511;&amp;#21046;Windows Media Player&amp;#30340;&amp;#25773;&amp;#25918;&amp;#12289;&amp;#20572;&amp;#27490;&amp;#31561;&amp;#21151;&amp;#33021;&amp;#65292;&amp;#21487;&amp;#20197;&amp;#20570;&amp;#21040;&amp;#27492;&amp;#30446;&amp;#30340;&amp;#30340;&amp;#26041;&amp;#27861;&amp;#26377;&amp;#24456;&amp;#22810;&amp;#31278;&amp;#65292;&amp;#20854;&amp;#20013;&amp;#29992;Spy++&amp;#21450;SendMessage&amp;#21487;&amp;#20197;&amp;#36629;&amp;#26131;&amp;#36948;&amp;#25104;&amp;#12290;&amp;#25105;&amp;#36889;&amp;#35041;&amp;#31245;&amp;#24494;&amp;#31777;&amp;#36848;&amp;#19968;&amp;#19979;&amp;#26041;&amp;#27861;&amp;#65292;&amp;#35443;&amp;#32048;&amp;#27969;&amp;#31243;&amp;#21487;&amp;#20197;&amp;#21443;&amp;#32771;[&lt;a href="http://www.codeproject.com/KB/cs/wmp_pinvoke.aspx"&gt;Interoperating with Windows Media Player using P/Invoke and C# - CodeProject&lt;/a&gt;]&amp;#12290;&lt;br&gt;&lt;br&gt;&lt;h2&gt;&amp;#30446;&amp;#30340;&lt;/h2&gt;&lt;br&gt; &amp;#28858;&amp;#20102;&amp;#26041;&amp;#20415;&amp;#35498;&amp;#26126;&amp;#65292;&amp;#25105;&amp;#25913;&amp;#20197;&amp;#25511;&amp;#21046;PCMan&amp;#20013;&amp;#25105;&amp;#30340;&amp;#26368;&amp;#24859;&amp;#20854;&amp;#20013;&amp;#20043;&amp;#19968;&amp;#30340;&amp;#36899;&amp;#32080;&amp;#20358;&amp;#35498;&amp;#26126;&amp;#12290;&amp;#22914;&amp;#19979;&amp;#22294;&amp;#34987;&amp;#26694;&amp;#36215;&amp;#20358;&amp;#30340;&amp;#21151;&amp;#33021;&amp;#34920;&amp;#38917;&amp;#12290;&lt;br&gt;&lt;br&gt;&lt;div id="yqka" style="text-align:center"&gt;&lt;img src="http://docs.google.com/File?id=ddt9hgn6_156hcf2tbhm_b" style="height:162px;width:396px"&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align:left"&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;&amp;#25163;&amp;#27573;&lt;/h2&gt;&lt;br&gt; &amp;#20351;&amp;#29992;SendMessage&amp;#25720;&amp;#25836;&amp;#21151;&amp;#33021;&amp;#34920;&amp;#38917;&amp;#34987;&amp;#25353;&amp;#19979;&amp;#30340;&amp;#21205;&amp;#20316;&amp;#12290;&amp;#20854;&amp;#20013;SendMessage&amp;#30340;&amp;#21443;&amp;#25976;&amp;#22914;&amp;#19979;&amp;#65306;&lt;br&gt;&lt;br&gt;&lt;div id="go_." style="text-align:center"&gt;&lt;img src="http://docs.google.com/File?id=ddt9hgn6_157hkq37fc2_b" style="height:109px;width:184px"&gt;&lt;/div&gt;&lt;br&gt; &amp;#31532;&amp;#19968;&amp;#20491;&amp;#21443;&amp;#25976;&amp;#21487;&amp;#20197;&amp;#36879;&amp;#36942;&lt;i&gt;FindWindow&lt;/i&gt;&amp;#20358;&amp;#25214;&amp;#21040;&amp;#65292;&amp;#31532;&amp;#20108;&amp;#20491;&amp;#21443;&amp;#25976;&amp;#22240;&amp;#28858;&amp;#26159;&amp;#25353;&amp;#21151;&amp;#33021;&amp;#34920;&amp;#38917;&amp;#25152;&amp;#20197;&amp;#24517;&amp;#23450;&amp;#26159;WM_COMMAND&amp;#65292;&amp;#31532;&amp;#19977;&amp;#21450;&amp;#31532;&amp;#22235;&amp;#20491;&amp;#21443;&amp;#25976;&amp;#36611;&amp;#38627;&amp;#21462;&amp;#24471;&amp;#65292;&amp;#20294;&amp;#25105;&amp;#20497;&amp;#21487;&amp;#20197;&amp;#36879;&amp;#36942;Vistual Studio&amp;#20839;&amp;#38468;&amp;#30340;Spy++&amp;#20358;&amp;#30435;&amp;#35222;PCMan&amp;#30340;WM_COMMAND&amp;#35338;&amp;#24687;&amp;#20358;&amp;#21462;&amp;#24471;&amp;#12290;&lt;br&gt;&lt;br&gt; &amp;#39318;&amp;#20808;&amp;#25171;&amp;#38283;Spy++&amp;#20006;&amp;#25353;&amp;#19979;Ctrl-M&amp;#65292;&amp;#20006;&amp;#29992;&amp;#19979;&amp;#22294;&amp;#32005;&amp;#26694;1&amp;#30340;&amp;#26481;&amp;#26481;&amp;#25302;&amp;#21040;PCMan&amp;#36984;&amp;#21040;&amp;#27491;&amp;#30906;&amp;#35222;&amp;#31383;&amp;#65292;&amp;#22914;&amp;#19979;&amp;#22294;&amp;#32005;&amp;#26694;2&amp;#12290;&lt;br&gt;&lt;br&gt;&lt;div id="g9d0" style="text-align:center"&gt;&lt;img src="http://docs.google.com/File?id=ddt9hgn6_158fmz3mjfv_b" style="height:334px;width:489px"&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt; &amp;#25509;&amp;#33879;&amp;#25353;&amp;#21040;&amp;#35338;&amp;#24687;&amp;#30340;Tab&amp;#65292;&amp;#36984;WM_COMMAND&amp;#22914;&amp;#19979;&amp;#22294;&amp;#12290;&lt;br&gt;&lt;br&gt;&lt;div id="vmqu" style="text-align:left"&gt;&lt;div style="text-align:center"&gt;&lt;img src="http://docs.google.com/File?id=ddt9hgn6_159drdxqvch_b" style="height:335px;width:489px"&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt; &amp;#26368;&amp;#24460;&amp;#22312;PCMan&amp;#20839;&amp;#21435;&amp;#25353;&amp;#19979;[&amp;#25105;&amp;#30340;&amp;#26368;&amp;#24859;]-&amp;gt;[&amp;#21488;&amp;#22823;&amp;#25209;&amp;#36386;&amp;#36386;&amp;#23526;&amp;#26989;&amp;#22346;]&amp;#65292;&amp;#27492;&amp;#26178;&amp;#22312;Spy++&amp;#20839;&amp;#20415;&amp;#26371;&amp;#20986;&amp;#29694;&amp;#19979;&amp;#22294;&amp;#35338;&amp;#24687;&amp;#65292;&amp;#25353;&amp;#19979;&amp;#21491;&amp;#37749;&amp;#36984;[&amp;#23660;&amp;#24615;]&amp;#24460;&amp;#20415;&amp;#33021;&amp;#21462;&amp;#24471;wParam&amp;#21450;lParam&amp;#12290;&lt;br&gt;&lt;br&gt;&lt;div id="pma0" style="text-align:center"&gt;&lt;img src="http://docs.google.com/File?id=ddt9hgn6_160ckqx2jgc_b" style="height:253.422px;width:648px"&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt; &amp;#22312;SendMessage&amp;#22235;&amp;#20491;&amp;#21443;&amp;#25976;&amp;#37117;&amp;#20633;&amp;#40778;&amp;#24460;&amp;#65292;&amp;#25105;&amp;#23531;&amp;#20102;&amp;#19968;&amp;#25903;&amp;#31243;&amp;#24335;&amp;#21435;&amp;#20570;SendMessage&amp;#12290;&amp;#24213;&amp;#19979;&amp;#26159;&amp;#31243;&amp;#24335;&amp;#32080;&amp;#26524;&amp;#65292;&amp;#20854;&amp;#20013;&amp;#31243;&amp;#24335;&amp;#30340;4&amp;#20491;&amp;#21443;&amp;#25976;&amp;#20998;&amp;#21029;&amp;#28858;Program ClassName&amp;#12289;Event&amp;#12289;wParam&amp;#21644;lParam&amp;#12290;&lt;br&gt;&lt;br&gt;&lt;div id="d55o" style="text-align:center"&gt;&lt;img src="http://docs.google.com/File?id=ddt9hgn6_161f9xwzndc_b" style="height:131.077px;width:648px"&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt; &amp;#22519;&amp;#34892;&amp;#24460;ptt&amp;#20415;&amp;#26371;&amp;#22312;PCMan&amp;#20013;&amp;#34987;&amp;#25171;&amp;#38283;&amp;#20102;&amp;#12290;MessageControl&amp;#30340;&amp;#28304;&amp;#30908;&amp;#22914;&amp;#19979;&amp;#65306;&lt;br&gt;&lt;br&gt;&lt;font color="#804040"&gt;&amp;nbsp;1 &lt;/font&gt;&lt;font color="#0000ff"&gt;// MessageControl.cpp : &amp;#23450;&amp;#32681;&amp;#20027;&amp;#25511;&amp;#21488;&amp;#25033;&amp;#29992;&amp;#31243;&amp;#24335;&amp;#30340;&amp;#36914;&amp;#20837;&amp;#40670;&amp;#12290;&lt;/font&gt;&lt;br&gt;&lt;font color="#804040"&gt;&amp;nbsp;2 &lt;/font&gt;&lt;font color="#0000ff"&gt;//&lt;/font&gt;&lt;br&gt;&lt;font color="#804040"&gt;&amp;nbsp;3 &lt;/font&gt;&lt;br&gt;&lt;font color="#804040"&gt;&amp;nbsp;4 &lt;/font&gt;&lt;font color="#a020f0"&gt;#include &lt;/font&gt;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;&amp;quot;stdafx.h&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#804040"&gt;&amp;nbsp;5 &lt;/font&gt;&lt;font color="#a020f0"&gt;#include &lt;/font&gt;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#804040"&gt;&amp;nbsp;6 &lt;/font&gt;&lt;font color="#a020f0"&gt;#include &lt;/font&gt;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;&amp;lt;Windows.h&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#804040"&gt;&amp;nbsp;7 &lt;/font&gt;&lt;br&gt;&lt;font color="#804040"&gt;&amp;nbsp;8 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt;&amp;nbsp;EventMappingTable_t {&lt;br&gt;&lt;font color="#804040"&gt;&amp;nbsp;9 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LPCWSTR Name;&lt;br&gt;&lt;font color="#804040"&gt;10 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UINT Code;&lt;br&gt;&lt;font color="#804040"&gt;11 &lt;/font&gt;} g_eventMapping[] = {&lt;br&gt;&lt;font color="#804040"&gt;12 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;font color="#008080"&gt;_T&lt;/font&gt;(&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;&amp;quot;WM_COMMNOTIFY&amp;quot;&lt;/font&gt;&lt;/font&gt;),&amp;nbsp;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;0x0044&lt;/font&gt;&lt;/font&gt;}&lt;br&gt;&lt;font color="#804040"&gt;13 &lt;/font&gt;};&lt;br&gt;&lt;font color="#804040"&gt;14 &lt;/font&gt;&lt;br&gt;&lt;font color="#804040"&gt;15 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008080"&gt;_tmain&lt;/font&gt;(&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&amp;nbsp;argc, _TCHAR* argv[])&lt;br&gt;&lt;font color="#804040"&gt;16 &lt;/font&gt;{&lt;br&gt;&lt;font color="#804040"&gt;17 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#804040"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(argc !=&amp;nbsp;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;5&lt;/font&gt;&lt;/font&gt;) {&lt;br&gt;&lt;font color="#804040"&gt;18 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;stderr&lt;/font&gt;&lt;/font&gt;,&amp;nbsp;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;&amp;quot;Usage: &lt;/font&gt;&lt;/font&gt;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#6a5acd"&gt;%S&lt;/font&gt;&lt;/font&gt;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;&amp;nbsp;ClassName Event WPARAM LPARAM&lt;/font&gt;&lt;/font&gt;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#6a5acd"&gt;\n&lt;/font&gt;&lt;/font&gt;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;, argv[&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;0&lt;/font&gt;&lt;/font&gt;]);&lt;br&gt;&lt;font color="#804040"&gt;19 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#804040"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;&amp;nbsp;-&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;1&lt;/font&gt;&lt;/font&gt;;&lt;br&gt;&lt;font color="#804040"&gt;20 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;font color="#804040"&gt;21 &lt;/font&gt;&lt;br&gt;&lt;font color="#804040"&gt;22 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HWND hWnd =&amp;nbsp;&lt;font color="#008080"&gt;FindWindow&lt;/font&gt;(argv[&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;1&lt;/font&gt;&lt;/font&gt;],&amp;nbsp;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;&lt;/font&gt;);&lt;br&gt;&lt;font color="#804040"&gt;23 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#804040"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(hWnd ==&amp;nbsp;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;&lt;/font&gt;) {&lt;br&gt;&lt;font color="#804040"&gt;24 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;stderr&lt;/font&gt;&lt;/font&gt;,&amp;nbsp;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;&amp;quot;Cannot find window: &lt;/font&gt;&lt;/font&gt;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#6a5acd"&gt;%S&lt;/font&gt;&lt;/font&gt;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#6a5acd"&gt;\n&lt;/font&gt;&lt;/font&gt;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;, argv[&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;1&lt;/font&gt;&lt;/font&gt;]);&lt;br&gt;&lt;font color="#804040"&gt;25 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#804040"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;&amp;nbsp;-&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;2&lt;/font&gt;&lt;/font&gt;;&lt;br&gt;&lt;font color="#804040"&gt;26 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;font color="#804040"&gt;27 &lt;/font&gt;&lt;br&gt;&lt;font color="#804040"&gt;28 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WPARAM wParam;&lt;br&gt;&lt;font color="#804040"&gt;29 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LPARAM lParam;&lt;br&gt;&lt;font color="#804040"&gt;30 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UINT eventID =&amp;nbsp;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;0&lt;/font&gt;&lt;/font&gt;;&lt;br&gt;&lt;font color="#804040"&gt;31 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UINT i;&lt;br&gt;&lt;font color="#804040"&gt;32 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#804040"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(i =&amp;nbsp;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;0&lt;/font&gt;&lt;/font&gt;; i &amp;lt;&amp;nbsp;&lt;font color="#804040"&gt;&lt;b&gt;sizeof&lt;/b&gt;&lt;/font&gt;(g_eventMapping)/&lt;font color="#804040"&gt;&lt;b&gt;sizeof&lt;/b&gt;&lt;/font&gt;(EventMappingTable_t); ++i) {&lt;br&gt;&lt;font color="#804040"&gt;33 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#804040"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(&lt;font color="#008080"&gt;_wcsicmp&lt;/font&gt;(g_eventMapping[i].Name, argv[&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;2&lt;/font&gt;&lt;/font&gt;]) ==&amp;nbsp;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;0&lt;/font&gt;&lt;/font&gt;) {&lt;br&gt;&lt;font color="#804040"&gt;34 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;eventID = g_eventMapping[i].Code;&lt;br&gt;&lt;font color="#804040"&gt;35 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#804040"&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;;&lt;br&gt;&lt;font color="#804040"&gt;36 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;font color="#804040"&gt;37 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;font color="#804040"&gt;38 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#804040"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(i &amp;gt;=&amp;nbsp;&lt;font color="#804040"&gt;&lt;b&gt;sizeof&lt;/b&gt;&lt;/font&gt;(g_eventMapping)/&lt;font color="#804040"&gt;&lt;b&gt;sizeof&lt;/b&gt;&lt;/font&gt;(EventMappingTable_t)) {&lt;br&gt;&lt;font color="#804040"&gt;39 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;stderr&lt;/font&gt;&lt;/font&gt;,&amp;nbsp;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;&amp;quot;Cannot Event: &lt;/font&gt;&lt;/font&gt;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#6a5acd"&gt;%S&lt;/font&gt;&lt;/font&gt;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#6a5acd"&gt;\n&lt;/font&gt;&lt;/font&gt;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;, argv[&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;2&lt;/font&gt;&lt;/font&gt;]);&lt;br&gt;&lt;font color="#804040"&gt;40 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#804040"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;&amp;nbsp;-&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;3&lt;/font&gt;&lt;/font&gt;;&lt;br&gt;&lt;font color="#804040"&gt;41 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;font color="#804040"&gt;42 &lt;/font&gt;&lt;br&gt;&lt;font color="#804040"&gt;43 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wParam = wcstol(argv[&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;3&lt;/font&gt;&lt;/font&gt;],&amp;nbsp;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;&lt;/font&gt;,&amp;nbsp;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;16&lt;/font&gt;&lt;/font&gt;);&lt;br&gt;&lt;font color="#804040"&gt;44 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lParam = wcstol(argv[&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;4&lt;/font&gt;&lt;/font&gt;],&amp;nbsp;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;&lt;/font&gt;,&amp;nbsp;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;16&lt;/font&gt;&lt;/font&gt;);&lt;br&gt;&lt;font color="#804040"&gt;45 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;SendMessage&lt;/font&gt;(hWnd, eventID, wParam, lParam);&lt;br&gt;&lt;font color="#804040"&gt;46 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#804040"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font style="background-color:#f2f2f2"&gt;&lt;font color="#ff00ff"&gt;0&lt;/font&gt;&lt;/font&gt;;&lt;br&gt;&lt;font color="#804040"&gt;47 &lt;/font&gt;}&lt;br&gt;&lt;font color="#804040"&gt;48 &lt;/font&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-5395930617687526337?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/5395930617687526337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=5395930617687526337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5395930617687526337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5395930617687526337'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2010/04/sendmessage.html' title='透過SendMessage控制功能表項'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-4303731271594007365</id><published>2009-08-19T23:05:00.003+08:00</published><updated>2009-08-19T23:16:28.864+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>Vim tip: 使用快速鍵編譯C程式</title><content type='html'>上一篇，c9s大在COSCUP的投影片提供了一個編譯C/C++程式的快速鍵，如下：&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;nmap &amp;lt;C-c&amp;gt;&amp;lt;C-c&amp;gt;  :!gcc -Wall % -o %:r.exe&amp;lt;CR&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;試用了一下覺得還不錯，唯一的缺點是錯誤訊息不會輸出到QuickFix視窗。所以我稍微的給他改了一下，如下，將以下寫入_vimrc，以後編譯改成輸入:make，即會用gcc編譯，且訊息會導至QuickFix視窗。&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;set mp=gcc\ -Wall\ %\ -o\ %:r.exe&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-4303731271594007365?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/4303731271594007365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=4303731271594007365' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4303731271594007365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4303731271594007365'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/08/vim-tip-c.html' title='Vim tip: 使用快速鍵編譯C程式'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-6851429860326670459</id><published>2009-08-19T10:34:00.001+08:00</published><updated>2009-08-19T10:34:29.545+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>COSCUP: Vim Hack</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;今年CUSCOP有一場talk在討論Vim Hack，投影片可以參考[&lt;a href='http://www.slideshare.net/c9s/vim-hacks'&gt;這裡&lt;/a&gt;]，這份投影片簡單易懂又能讓初次碰到Vim人的快速上手且了解Vim的美，非常推薦想要入門Vim能花些時間將[&lt;a href='http://www.slideshare.net/c9s/vim-hacks'&gt;這份投影片&lt;/a&gt;]看過。&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=ba8c43fa-1eee-88a5-a6dd-8e6135d3a97d' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-6851429860326670459?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/6851429860326670459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=6851429860326670459' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6851429860326670459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6851429860326670459'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/08/coscup-vim-hack.html' title='COSCUP: Vim Hack'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-6083544325292684561</id><published>2009-08-10T02:05:00.004+08:00</published><updated>2009-08-10T02:16:50.400+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>Vim tip: 搜尋高亮度(search highlight)</title><content type='html'>VIM在搜尋時有個耳熟能詳的快速鍵*，它能搜尋游標所在字，同時若有設定高亮度搜尋字串(:set hls)，搜尋到的字會反白，如下圖是在aaa按下*的截圖：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_WxXxOGW5qJM/Sn8QvSwyO9I/AAAAAAAAC-c/Y5sKRE2nPqI/s1600-h/a.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 245px;" src="http://1.bp.blogspot.com/_WxXxOGW5qJM/Sn8QvSwyO9I/AAAAAAAAC-c/Y5sKRE2nPqI/s320/a.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5368027685525273554" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;有時我們會希望將目前搜尋到的目標(如上的aaa)再增加新的游標所在字(如bbb)，如下圖：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_WxXxOGW5qJM/Sn8RrHaCSCI/AAAAAAAAC-k/KX9xK30urH0/s1600-h/b.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 245px;" src="http://4.bp.blogspot.com/_WxXxOGW5qJM/Sn8RrHaCSCI/AAAAAAAAC-k/KX9xK30urH0/s320/b.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5368028713269217314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;我們可藉由正規表示式的|來達到，但其實命令有點複雜，所以這裡我提供一個快速鍵sa，來完成此目的，請將下圖的script加入你的.vimrc。&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;map sa :exec "/\\(".getreg('/')."\\)\\\\|".expand("&amp;lt;cword&amp;gt;")&amp;lt;CR&amp;gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-6083544325292684561?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/6083544325292684561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=6083544325292684561' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6083544325292684561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6083544325292684561'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/08/vim-tip-search-highlight.html' title='Vim tip: 搜尋高亮度(search highlight)'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_WxXxOGW5qJM/Sn8QvSwyO9I/AAAAAAAAC-c/Y5sKRE2nPqI/s72-c/a.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-7295357313610133128</id><published>2009-08-10T01:10:00.003+08:00</published><updated>2009-08-10T02:32:58.004+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Git for Windows</title><content type='html'>最近將原先的Code base由SVN換到Git，基本上轉過去的路還算順利，Git用起來也是十分順手，而且也迅速的感受到Git的優點，像是快、分散式(本地端可commit)、分支容易。以下提供一些載點及入手時參考的文章。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;安裝Git &lt;a href="http://git-scm.com/"&gt;http://git-scm.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;安裝與檔案總管結合的介面 &lt;a href="http://code.google.com/p/tortoisegit/"&gt;http://code.google.com/p/tortoisegit/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Git中文教程 &lt;a href="http://www.bitsun.com/documents/gittutorcn.htm"&gt;http://www.bitsun.com/documents/gittutorcn.htm&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Git原始碼管理 &lt;a href="http://www.qweruiop.org/nchcrails/posts/49"&gt;http://www.qweruiop.org/nchcrails/posts/49&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Why Git is Better than X  &lt;a href="http://zh-tw.whygitisbetterthanx.com/"&gt;http://zh-tw.whygitisbetterthanx.com/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-7295357313610133128?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/7295357313610133128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=7295357313610133128' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7295357313610133128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7295357313610133128'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/08/git-for-windows.html' title='Git for Windows'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-1621960025929231500</id><published>2009-07-31T14:27:00.001+08:00</published><updated>2009-08-10T02:03:52.294+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>VIM script: Header and Source file Switching</title><content type='html'>在寫C/C++時常要在header及source file之間做切換，因此我寫了一個小script來做此事。&lt;br /&gt;&lt;br /&gt;請將以下script加入_vimrc，以後做切換隻需輸入fh&lt;br /&gt;&lt;code class="prettyprint"&gt;map  fh          &amp;lt;esc&amp;gt;:call FileHeaderSource()&amp;lt;cr&amp;gt;&lt;br /&gt;&lt;br /&gt;function! FileHeaderSource()&lt;br /&gt; let fextname=expand("%:e")&lt;br /&gt; let fname=expand("%:r")&lt;br /&gt; if fextname=="h"&lt;br /&gt;   if filereadable(fname.".cpp")&lt;br /&gt;     exec ':e '.fname.".cpp"&lt;br /&gt;     return&lt;br /&gt;   endif&lt;br /&gt;   if filereadable(fname.".c")&lt;br /&gt;     exec ':e '.fname.".c"&lt;br /&gt;     return&lt;br /&gt;   endif&lt;br /&gt; else&lt;br /&gt;   if filereadable(fname.".h")&lt;br /&gt;     exec ':e '.fname.".h"&lt;br /&gt;     return&lt;br /&gt;   endif&lt;br /&gt; endif&lt;br /&gt; echo "file not found"&lt;br /&gt;endfunction&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-1621960025929231500?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/1621960025929231500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=1621960025929231500' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/1621960025929231500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/1621960025929231500'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/07/vim-script-header-and-source-file.html' title='VIM script: Header and Source file Switching'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-1024126923807344772</id><published>2009-04-02T11:21:00.001+08:00</published><updated>2009-04-02T11:22:42.927+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>輕輕鬆鬆寫VIM plugin: 流程控制 condition</title><content type='html'>&lt;big&gt;&lt;b&gt;IF&lt;/b&gt;&lt;/big&gt;&lt;br /&gt;跟一般常見的語法一樣，請看下例：&lt;br /&gt;&lt;code class="prettyprint"&gt; :if &amp;term == "xterm"&lt;br /&gt;:  " Do stuff for xterm&lt;br /&gt;:elseif &amp;term == "vt100"&lt;br /&gt;:  " Do stuff for a vt100 terminal&lt;br /&gt;:else&lt;br /&gt;:  " Do something for other terminals&lt;br /&gt;:endif&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;VIM最基本的判別式有以下這幾種：&lt;br /&gt;&lt;code class="prettyprint"&gt;a == b  equal to&lt;br /&gt;a != b  not equal to&lt;br /&gt;a &gt;  b  greater than&lt;br /&gt;a &gt;= b  greater than or equal to&lt;br /&gt;a &lt;  b  less than&lt;br /&gt;a &lt;= b  less than or equal to&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;正常來說不論數字或字串比較，a及b的型態最好都相同，但若不同時可以直接看下例：&lt;br /&gt;&lt;code class="prettyprint"&gt;:if 0 == "one"&lt;br /&gt;:  echo "yes"&lt;br /&gt;:endif&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;這個例子最後會輸出yes，當數字與字串比較時，字串會轉型為數字。由於one的第一個字元即不為數字所以它被直接翻成0，使得判別式成真。&lt;br /&gt;&lt;br /&gt;VIM另外還有針對字串的判別方式，如下：&lt;br /&gt;&lt;code class="prettyprint"&gt;a =~ b  matches with&lt;br /&gt;a !~ b  does not match with&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;左邊變數a會被成字串，右邊變數則會作為pattern，下面有個例子：&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;:if str =~ " "&lt;br /&gt;:  echo "str contains a space"&lt;br /&gt;:endif&lt;br /&gt;:if str !~ '\.$'&lt;br /&gt;:  echo "str does not end in a full stop"&lt;br /&gt;:endif&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;此外，關於不分大小寫比對的話，在VIM裡可就複雜了一些，VIM有個option ignorecase來設定大小寫比對，有些時候可能我們不想設定這個值則可以直接從比對的算符來設定，想知道的人自己看一下[&lt;a href="http://vimdoc.sourceforge.net/htmldoc/eval.html#expr-=="&gt;這個表格&lt;/a&gt;]。&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;b&gt;while and for&lt;/b&gt;&lt;/big&gt;    &lt;br /&gt;&lt;br /&gt;VIM的while迴圈大概長底下這樣，它跟一般的語言一樣也有continue及break關鍵字。&lt;br /&gt;&lt;code class="prettyprint"&gt;:while counter &lt; 40&lt;br /&gt;:  call do_something()&lt;br /&gt;:  if skip_flag&lt;br /&gt;:    continue&lt;br /&gt;:  endif&lt;br /&gt;:  if finished_flag&lt;br /&gt;:    break&lt;br /&gt;:  endif&lt;br /&gt;:  sleep 50m&lt;br /&gt;:endwhile&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;VIM的for迴圈，通常是跟著list及dictionary這兩種型態一起使用，所以for迴圈我就留到那時候再講唄。&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;b&gt;Exception&lt;/b&gt;&lt;/big&gt;    &lt;br /&gt;VIM跟C++ or Java一樣也有例外處理，用法跟他們都頗像，大概的用法就是try...cache...finally這三個關鍵字，請見以下範例：&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;:try&lt;br /&gt;:   read ~/templates/pascal.tmpl&lt;br /&gt;:catch /E484:/&lt;br /&gt;:   echo "Sorry, the Pascal template file cannot be found."&lt;br /&gt;:endtry&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;當檔案不存在時便會發生exception，在這個例子中是只catch E484:開頭的例外，當然，你也可以不要寫/E484:/，它就會抓所有的exception。&lt;br /&gt;&lt;br /&gt;底下是個有finally的例子，finally在不論try的程式片段成功執行與否皆會執行finally後的程式片段。&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;:let tmp = tempname()&lt;br /&gt;:try&lt;br /&gt;:   exe ".,$write " . tmp&lt;br /&gt;:   exe "!filter " . tmp&lt;br /&gt;:   .,$delete&lt;br /&gt;:   exe "$read " . tmp&lt;br /&gt;:finally&lt;br /&gt;:   call delete(tmp)&lt;br /&gt;:endtry&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-1024126923807344772?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/1024126923807344772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=1024126923807344772' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/1024126923807344772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/1024126923807344772'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/04/vim-plugin-condition.html' title='輕輕鬆鬆寫VIM plugin: 流程控制 condition'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-3786591531544127342</id><published>2009-03-31T16:30:00.005+08:00</published><updated>2009-04-01T09:06:13.343+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>輕輕鬆鬆寫VIM plugin: 變數及表示式</title><content type='html'>在開始之前，必需先介紹一下如何建立一個測試環境，小弟本身是有用兩種開發方式，一是開發小功能時用的，另一則是真正在開發一個plugin時用的。&lt;br /&gt;&lt;br /&gt;先來介紹第一種開發小功能的環境，一般小弟會先在_vimrc裡建一個函式，接著再用map指令將這個函式對應到一個快速鍵，舉例來說在_vimrc裡插入以下指令將會建立一個foo函式，並且當輸入rfa時會呼叫到它。&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;map  rfa         &amp;lt;ESC&amp;gt;:call Foo()&amp;lt;CR&amp;gt;&lt;br /&gt;function! Foo()&lt;br /&gt;  echo "Hello world 1"&lt;br /&gt;endfunction&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;藉此我們便可將小功能先放在_vimrc裡測試，等到功能成熟時再建立一個plugin。此外，若是在反覆測試這個函式時，不想每次做小更動就必需重開VIM讓它reload檔案，可以在更動完後用:source指令來使檔案重新生效。如下，將使_vimrc的設定重新讀取：&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;:source $VIM\_vimrc&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;第二種方式就較為複雜，這種方式會用在開發一個plugin時使用，因為它包含了一個plugin前後的一些readme、檢查、command或keymap，所以目前還先不介紹。等到這些基本的語法講解完後，準備踏入plugin開發時才會說明。接著將進入本篇的主題，說明時我儘可能用範例說，少說一些廢話。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;常數&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;數字常數除了一般十進位外，16進位的prefix為0x，8進位的為0，請看以下例子。&lt;br /&gt;&lt;code class="prettyprint"&gt;:echo 0x7f 036&lt;br /&gt;127 30&lt;br /&gt;:echo 0x7f - 036&lt;br /&gt;97&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;字串常數則有分單引號括住及雙引號，單引號的會乎略跳脫字元，VIM的跳脫字元有很下這些：&lt;br /&gt;&lt;code class="prettyprint"&gt;\t  &amp;lt;Tab&amp;gt;&lt;br /&gt;\n  &amp;lt;NL&amp;gt;, line break&lt;br /&gt;\r  &amp;lt;CR&amp;gt;, &amp;lt;Enter&amp;gt;&lt;br /&gt;\e  &amp;lt;Esc&amp;gt;&lt;br /&gt;\b  &amp;lt;BS&amp;gt;, backspace&lt;br /&gt;\"  "&lt;br /&gt;\\  \, backslash&lt;br /&gt;\&amp;lt;Esc&amp;gt;  &amp;lt;Esc&amp;gt;&lt;br /&gt;\&amp;lt;C-W&amp;gt;  CTRL-W&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;變數&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;變數的命令規則跟C很像，這個不再贅述，而VIM的變數根據類型及生存空間有以下幾種：&lt;br /&gt;&lt;code class="prettyprint"&gt;b:name  variable local to a buffer&lt;br /&gt;w:name  variable local to a window&lt;br /&gt;g:name  global variable (also in a function)&lt;br /&gt;v:name  variable predefined by Vim&lt;br /&gt;$NAME  environment variable&lt;br /&gt;&amp;name  option&lt;br /&gt;@r      register (list all by :reg)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;變數的建立及刪除有檢查存在，可用2個指令及1個函式&lt;br /&gt;&lt;code class="prettyprint"&gt;let&lt;br /&gt;unlet&lt;br /&gt;exists("s:call_count")&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;請看以下例子：    &lt;br /&gt;&lt;code class="prettyprint"&gt;:if !exists("s:call_count")&lt;br /&gt;:  let s:call_count = 0&lt;br /&gt;:endif&lt;br /&gt;:echo "called" s:call_count "times"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;    &lt;br /&gt;NOTE: 關於if判別式，若是字串型態則VIM會將它自動轉成數字型態，轉成數字型態的字串是根據字串開頭的數字當成轉型後結果。若是程式寫了如下的判別式&lt;br /&gt;&lt;code&gt;:if "true"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;則會回傳0，表false，因true的字首為t，不為一個數字，故回傳0。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;表示式&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;數字運算&lt;br /&gt;&lt;code class="prettyprint"&gt;a + b  add&lt;br /&gt;a - b  subtract&lt;br /&gt;a * b  multiply&lt;br /&gt;a / b  divide&lt;br /&gt;a % b  modulo&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;字串串接&lt;br /&gt;&lt;code class="prettyprint"&gt;:echo "foo" . "bar"&lt;br /&gt;foobar &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;執行表示式(:execute)用在用我們的命令需插入變數時使用，:execute的行為與eval是十分相似(或是一樣)的，請見以下例子。&lt;br /&gt;&lt;code class="prettyprint"&gt;:execute "normal " . normal_commands&lt;br /&gt;&lt;br /&gt;:let optname = "path"&lt;br /&gt;:let optval = eval('&amp;' . optname)&lt;br /&gt;&lt;br /&gt;:exe 'let optval = &amp;' . optname&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-3786591531544127342?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/3786591531544127342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=3786591531544127342' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3786591531544127342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3786591531544127342'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/03/blog-post.html' title='輕輕鬆鬆寫VIM plugin: 變數及表示式'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-6242260145362758045</id><published>2009-03-26T13:01:00.006+08:00</published><updated>2009-03-31T23:57:32.750+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>VIM: 製作跟VIM help一樣能跳來跳去的文字檔</title><content type='html'>最近想要自己製作VIM的help，VIM的help就是輸入:help後會顯示的說明頁，這種說明頁的好處除了有原本VIM的優點外，他還可以讓你用Ctrl-]和Ctrl+t[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-srcexpl.html"&gt;跳來跳去&lt;/a&gt;]。本文就是介紹這種"跳來跳去"的非源碼頁面。&lt;br /&gt;&lt;br /&gt;(題外話)&lt;br /&gt;會想試試看原因有好多，最大原因是最近工作雖忙但都是做無聊的事沒學到什麼東西感到很悶，另外最近訂了一隻gphone(htc dream)，整天在想要拿那隻手機做啥，沒什麼心情工作。最近常在想比起做韌體，我好像比較適合做軟體，做韌體有bug就是用一些bug tool不斷縮小縮圍找bug，之後看看腳位有沒有設對，釐清是誰的問題。才工作半年就對這份工作感到無趣會不會太快了點，相對於之前2份軟體的工作這份工作似乎太快就沒興趣了。&lt;br /&gt;&lt;br /&gt;(恢復正題)&lt;br /&gt;廢話不多說，馬上進入正題，我以範例來解說製作方式。現在我要製作2份文件分別為a.txt及b.txt，在a.txt內要有一個link連到b.txt的頭，而b.txt會有一個link連到a.txt的頭，以下就是他們的文件真實內容。&lt;br /&gt;&lt;br /&gt;a.txt的內容如下&lt;br /&gt;&lt;code&gt;*a.txt*&lt;br /&gt;|b.txt|&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt; vim:tw=78:fo=tcq2:isk=!-~,^*,^\|,^\":ts=8:ft=help:norl:&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;b.txt的內容如下&lt;br /&gt;&lt;code&gt;*b.txt*&lt;br /&gt;|a.txt|&lt;br /&gt; vim:tw=78:fo=tcq2:isk=!-~,^*,^\|,^\":ts=8:ft=help:norl:&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;我們以a.txt與b.txt相似，我們以a.txt為解說例。首先第一行以*...*括起來的a.txt是表示它是一個錨(anchor)用作於連結目的端，錨名為a.txt。第2行以|...|括起來的則是一個link連結到名為b.txt的錨。接著我們必需讓VIM將這些資料做成cache，輸入":helptag ."便會在工作徑下產生tags檔。現在便可以使用Ctrl+]跳來跳去了。&lt;br /&gt;&lt;br /&gt;大家看到這裡可能還會有個疑問，我在文件的最後一行輸入(vim:tw...)的是什麼東西，那行叫[&lt;a href="http://vimdoc.sourceforge.net/htmldoc/options.html#modeline"&gt;modeline&lt;/a&gt;]是用來指示這個檔案的VIM設定，像是這個範例就表示textwidth=78, iskeyword有那些, filetype為help等設定。若將這些都設定上檔案開起來就會像這樣：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_WxXxOGW5qJM/ScsNWdtb7fI/AAAAAAAACi0/K2I08Ol_Y6Q/s1600-h/a.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 242px;" src="http://2.bp.blogspot.com/_WxXxOGW5qJM/ScsNWdtb7fI/AAAAAAAACi0/K2I08Ol_Y6Q/s400/a.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5317358464624487922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;本文參考自：[&lt;a href="http://vim.wikia.com/wiki/Add_your_note_files_to_Vim_help"&gt;Add your note files to Vim help&lt;/a&gt;]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-6242260145362758045?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/6242260145362758045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=6242260145362758045' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6242260145362758045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6242260145362758045'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/03/vim-vim-help.html' title='VIM: 製作跟VIM help一樣能跳來跳去的文字檔'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_WxXxOGW5qJM/ScsNWdtb7fI/AAAAAAAACi0/K2I08Ol_Y6Q/s72-c/a.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-3883510806802693666</id><published>2009-03-26T09:28:00.001+08:00</published><updated>2009-03-31T23:57:41.109+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>VIM tip: 刪除搜尋到的行</title><content type='html'>剛好看到有人用sed來刪除比對到的字串行，VIM也有類似用法，有時這個功能還算滿有用的。若是想刪除出現Rickey is foolish的這些行可以輸入&lt;br /&gt;&lt;br /&gt;&lt;code&gt;:g/Rickey is foolish/d&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;開對的g是表所有的意思，尾巴的d則是刪除，中間被/包圍的則是要搜尋的字這是允許regex的。&lt;br /&gt;&lt;br /&gt;這些資料可以在vim doc的[&lt;a href="http://vimdoc.sourceforge.net/htmldoc/usr_10.html#10.4"&gt;10.4 The global command&lt;/a&gt;]及[&lt;a href="http://vimdoc.sourceforge.net/htmldoc/change.html#deleting"&gt;delete&lt;/a&gt;]找到，有時vim doc看一看，真覺得vim有一堆很真正去理解的命令。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-3883510806802693666?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/3883510806802693666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=3883510806802693666' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3883510806802693666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3883510806802693666'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/03/vim-tip_26.html' title='VIM tip: 刪除搜尋到的行'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-5358265456295827879</id><published>2009-03-20T14:05:00.001+08:00</published><updated>2009-03-20T14:08:08.814+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>VIM 系列文章的下一步</title><content type='html'>最近在思考這個部落格接下來可以寫些什麼，之前[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/make-vim-more-powerful-cont-and-prolog.html"&gt;打造自己的VIM系列&lt;/a&gt;]文章是寫給那些已經會使用VIM的人看的，目的是希望能藉著這個系列文章能讓各位用起VIM能更得心應手。現在有2個大方向可以讓VIM這個主題繼續GO，一是寫簡單的VIM教學，另一則是寫更難的。如果有熟悉我的朋友，應該猜的到我的選擇，選擇比較困難的地方前進。所以下個主題我打算來寫如何寫VIM plugin。&lt;br /&gt;&lt;br /&gt;學會寫plugin其實有很多好處。像之前我在用[&lt;a href="http://rickey-nctu.blogspot.com/2009/03/vim-easygrep_05.html"&gt;easygrep&lt;/a&gt;]這個plugin時，它並不支援不分大小寫的搜尋，所以我就稍微看一下它的程式，再把我需要的功能加進去，最後將修正的地方寄給原作者好讓原作者merge起來，作者也很快將把我把我的功能加進去而且上面還有我的名字(Doro Wu)(羞)。這就是open source的好處，需要什麼功能自己動手加進去。&lt;br /&gt;&lt;br /&gt;要會寫plugin的首要之務是要會寫VIM script，所以我會先對VIM script簡介並再介紹一些常用的內建函式，之後才會開始告訴各位如何將script組合成plugin。目前打算依照這樣介紹：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;變數及表示法&lt;/li&gt;&lt;li&gt;判斷句&lt;/li&gt;&lt;li&gt;函式&lt;/li&gt;&lt;li&gt;例外&lt;/li&gt;&lt;li&gt;事件 autocommand&lt;/li&gt;&lt;li&gt;syntax highlighting&lt;/li&gt;&lt;li&gt;window and buffer&lt;/li&gt;&lt;li&gt;命令輸出擷取&lt;/li&gt;&lt;li&gt;plugin簡介&lt;/li&gt;&lt;li&gt;輕輕鬆鬆寫個vim plugin&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-5358265456295827879?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/5358265456295827879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=5358265456295827879' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5358265456295827879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5358265456295827879'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/03/vim.html' title='VIM 系列文章的下一步'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-6379518167072962777</id><published>2009-03-14T15:40:00.002+08:00</published><updated>2009-03-31T23:58:01.441+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>打造自己的VIM: 源碼補齊 SuperTab OmniCppComplete Code_Complete</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;VIM的源碼補齊是我比較少用的部分(這就是身在系統廠的悲哀，幾乎沒什麼機會寫大一點的專案)，但就我以前寫code的經驗，小弟認為我這次要介紹的3個plugins應該是能滿足大部分的需求。這3個plugins為[&lt;a href='http://www.vim.org/scripts/script.php?script_id=1643'&gt;SuperTab&lt;/a&gt;]、[&lt;a href='http://www.vim.org/scripts/script.php?script_id=1520'&gt;OmniCppComplete&lt;/a&gt;]及[&lt;a href='http://www.vim.org/scripts/script.php?script_id=1764'&gt;Code_Complete&lt;/a&gt;]。&lt;br /&gt;&lt;br /&gt;&lt;big&gt;SuperTab&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;SuperTab是這3個源碼補齊我最喜歡的plugin，它使用不需要什麼設定，也不用產生tags檔案，裝好即用。它補齊的所使用的關鍵字是藉由搜尋所有被開啟的檔案內的字。而使用方式也很容易，當你打字打到一半需要它幫你補齊時就按下&amp;lt;tab&amp;gt;鍵，它就幫你把剩下的字補齊。但有時我們會希望是插入一個真正的Tab而不是要幫助補齊，這時需要按下Shift+Tab，它的使用就這樣而已，是不是很容易呀。以下是一張截圖，可以看到圖上有2個關鍵字AAAA及AABB，當我輸入AA後要它補齊，又有多個關鍵字被找到它會彈出一個popup menu讓你選擇。&lt;br /&gt;&lt;br /&gt;&lt;img src='http://lh3.ggpht.com/_WxXxOGW5qJM/Sbtdsjo5C2I/AAAAAAAACiI/7nPu9uGLFvA/%5BUNSET%5D.png?imgmax=800'/&gt;&lt;br /&gt;&lt;br /&gt;&lt;big&gt;OmniCppComplete&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;OmniCppComplete是針對C/C++程式所設計的源碼補齊方式，它需要tags檔案的幫忙，若是還不知道要怎麼產生tags檔案，可以參考我之前的文章，安裝：[&lt;a href='http://rickey-nctu.blogspot.com/2009/02/vim-srcexpl.html'&gt;打造自己的VIM: 函式列表 TagList&lt;/a&gt;]，產生：[&lt;a href='http://rickey-nctu.blogspot.com/2009/02/vim-taglist.html'&gt;打造自己的VIM: 源碼追蹤 SrcExpl&lt;/a&gt;]。關於OmniCppComplete的截圖可以到[&lt;a href='http://vissale.neang.free.fr/Vim/OmniCppComplete/ScreenShots/screenshots.htm'&gt;這裡&lt;/a&gt;]來看，那裡提供了很多圖，我就不再為各位截圖了。&lt;br /&gt;&lt;br /&gt;OmniCppComplete的使用除了先產生tags檔案外，另外可以用的鍵就只有&amp;lt;c-x&amp;gt;&amp;lt;c-o&amp;gt;，按下Ctrl+X及Ctrl+O後，它就會依據tags檔案及目前游標前的的字彈出相對應的popup menu供使用者選擇，就使用上也是很容易。&lt;br /&gt;&lt;br /&gt;而在設定上，我自己是什麼都沒設，如果有覺得使用上有什麼不便，可以看看它裡頭的doc，那裡有所以它可以設定的option，我稍微看了一下大概就是調整popup menu的顯示設定或是自動選擇第一個item。&lt;br /&gt;&lt;br /&gt;&lt;big&gt;Code_Complete&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;不知道各位有沒有看過一些在mac上的demo，那些人有些人是寫RoR有些是寫HTML(PHP)，他們只要輸入if或for等關鍵字，他們的文字編輯器就會幫他們把後面相關的文字補齊，一整個寫起程式來很帥，Code_Complete就是提供這種功能。相信有人還是不懂我在說什麼，我用下的套圖來說明，下面第一張圖是一個C的程式，一般include完檔案後會寫個main function，在我輸入完main再按下Alt+d如圖2，它便幫我把該補完的補完了，並且跳到要繼續寫程式的地方；接著我輸入if如圖3，再按下Alt+d，它又幫我把剩下補完。若是想跳到下一個`&amp;lt;...&amp;gt;`處，只要按下Alt+d它就會幫我們跳過去。&lt;br /&gt;&lt;br /&gt;&lt;img src='http://lh3.ggpht.com/_WxXxOGW5qJM/Sbtewo3pwqI/AAAAAAAACiM/j3c3zWJV5zs/%5BUNSET%5D.png?imgmax=800'/&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src='http://lh3.ggpht.com/_WxXxOGW5qJM/Sbte01QANUI/AAAAAAAACiQ/hQHRC5k9DTc/%5BUNSET%5D.png?imgmax=800'/&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src='http://lh6.ggpht.com/_WxXxOGW5qJM/Sbte4WWttMI/AAAAAAAACiU/c0ziXlsIirw/%5BUNSET%5D.png?imgmax=800'/&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src='http://lh5.ggpht.com/_WxXxOGW5qJM/Sbte-fJkJbI/AAAAAAAACiY/5Eo_UNKhAfk/%5BUNSET%5D.png?imgmax=800'/&gt;&lt;br /&gt;&lt;br /&gt;到這裡應該大家都知道基本用法，但是Code_Complete他是根據什麼來補齊呢？各位可以打開code_complete.vim，可以看到有一行寫著：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;let g:template['c']['main'] = "int main(int argc, char \*argv\[\])\&amp;lt;cr&amp;gt;{\&amp;lt;cr&amp;gt;".g:rs."...".g:re."\&amp;lt;cr&amp;gt;}"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;等於符號左邊的意思是遇到附檔名屬於c程式且游標前面是main時，一按下Alt+d便用等於符號右邊的字串補完。至於右邊字串的意思大家就自己跟main產生出來的東東比對一下大概就可以猜到它的意思。&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=ba290791-3d81-4a8b-a303-6d04a4c56008' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-6379518167072962777?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/6379518167072962777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=6379518167072962777' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6379518167072962777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6379518167072962777'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/03/vim-supertab-omnicppcomplete.html' title='打造自己的VIM: 源碼補齊 SuperTab OmniCppComplete Code_Complete'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_WxXxOGW5qJM/Sbtdsjo5C2I/AAAAAAAACiI/7nPu9uGLFvA/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-7123803939514152144</id><published>2009-03-11T13:49:00.004+08:00</published><updated>2009-03-31T23:58:30.495+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>VIM tip: TabBar的密技</title><content type='html'>TabBar裡其實有一些設定很少被提到，但是卻很實用，若需要更多的說明可以自己打開tabar.vim來看看，大概在100出頭行的地方，亦或是直接在code裡的某處。我這裡提一些看起來比較有用到的。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;g:Tb_MaxSize (Default = 1)&lt;/span&gt;&lt;br /&gt;有時開的檔案太多，TabBar視窗會容不下那麼多檔案同時在一行內被顯示，但是使用者(我)會希望它可以分成2行被顯示，這時只要將這個值設定2就行。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;g:Tb_TabWrap (Default = 0)&lt;/span&gt;&lt;br /&gt;若開啟檔案數超過一行可顯示且g:Tb_MaxSize又設成大於1時，超過一行可顯示的字會折到下一行而造成最後一個檔案標籤斷了，若設成1則它不會讓標籤斷掉，會直接讓行尾標籤放到下一行行首。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;g:Tb_SplitBelow (1 = below, 0 = above(Default))&lt;/span&gt;&lt;br /&gt;將TabBar視窗放在上面or下面&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;g:Tb_VSplit (0:top, 1:left)&lt;/span&gt;&lt;br /&gt;將TabBar放在上面or左邊&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;我自己是設定這些值&lt;br /&gt;&lt;code&gt;let g:Tb_MaxSize = 2&lt;br /&gt;let g:Tb_TabWrap = 1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;這篇文章已被收錄在原本[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-tabbar.html"&gt;TabBar介紹&lt;/a&gt;]的文章裡&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-7123803939514152144?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/7123803939514152144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=7123803939514152144' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7123803939514152144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7123803939514152144'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/03/vim-tip-tabbar.html' title='VIM tip: TabBar的密技'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-8429485918122163442</id><published>2009-03-10T01:20:00.003+08:00</published><updated>2009-03-31T23:58:51.604+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>VIM tip: 自動插入數字列號，使用巨集及VIM內建函式</title><content type='html'>在ptt上看到網友CyberFret問了一個問題：&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;[問題]vim如何作到ultraedit的自動插入數字列號&lt;br /&gt;input&amp;nbsp; int[0]&lt;br /&gt;input&amp;nbsp; int[1]&lt;br /&gt;input&amp;nbsp; int[2]&lt;br /&gt;input&amp;nbsp; int[3]&lt;br /&gt;如上面的sample code&lt;br /&gt;在ultraedit裡面, 可以用 "區塊--&amp;gt;插入數字列號" 來自動插入一整排的等差數列&lt;br /&gt;如上面的 0 -3, 請問在vim裡面要如何辨到? 謝謝&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;換句話說就是只輸入上列第一行，如何快速產生下面幾行。這個問題其實google一下應該能找到相關討論，我是從這[&lt;a href="http://vim.wikia.com/wiki/Increasing_or_decreasing_numbers"&gt;抄&lt;/a&gt;]來的，當然也不完全是抄啦 ^^"&lt;br /&gt;&lt;br /&gt;要達到這個功能方法有2：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;使用巨集&lt;/li&gt;&lt;li&gt;使用VIM built-in function&lt;/li&gt;&lt;/ol&gt;先來說說第一種方法。請在輸入完第一列(到底是列還是行??)後，在數字處按造下面keyin來製作巨集：&lt;br /&gt;&lt;code&gt;qa&lt;br /&gt;yy&lt;br /&gt;p&lt;br /&gt;Ctrl-a&lt;br /&gt;q&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;上面第一個命令表開始錄製巨集a；第二，複製游標所在列；第三，貼上；第四，將游標所在處的數字加1；第五，結束巨集。其中若要改成數字減一則在第四個命令改成Ctrl-x，另外，因為在windows中Ctrl-a對應到全選，所以對於windows的vim使用者必需先下:nunmap &amp;lt;C-A&amp;gt;將全選的功能取消。&lt;br /&gt;&lt;br /&gt;在錄製好巨集後，接著再輸入&lt;b&gt;15@a&lt;/b&gt;便會重覆執行巨集a，15次。以上是第一個方法。&lt;br /&gt;&lt;br /&gt;第二種方法為使用內建函式。先從一簡單的例子來看，以下命令：&lt;br /&gt;&lt;code&gt;:0put =range(11,15)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;將輸出&lt;br /&gt;&lt;code&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;以此類推，若要CyberFret的要求則輸入以下命令即可。&lt;br /&gt;&lt;code&gt;:for i in range(0,3) | put ='input int['.i.']' | endfor&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-8429485918122163442?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/8429485918122163442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=8429485918122163442' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/8429485918122163442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/8429485918122163442'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/03/pttcyberfret-vimultraedit-input-int0.html' title='VIM tip: 自動插入數字列號，使用巨集及VIM內建函式'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-6805619118312990677</id><published>2009-03-05T12:23:00.007+08:00</published><updated>2009-03-31T23:59:03.546+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>打造自己的VIM: 多檔字串搜尋 EasyGrep</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;在追蹤源碼時，除了最常用到的tags方式，另外搜尋也是不可少的功能之一，在Linux環境底下最常見的方式就是開個termianal用grep搜尋，再到自己的文字編輯器把相對應的檔案打開，當搜尋的機會變多，這樣的動作真是麻煩又囉嗦。為了縮短這些麻煩regular routine，有人寫了一個plugin [&lt;a href="http://www.vim.org/scripts/script.php?script_id=2438"&gt;EasyGrep&lt;/a&gt;]。EasyGrep主要是把Grep的功能整合在VIM裡，它可以使用跨平台VIM內建的vimgrep或是外部的指令grep、findstr等指令，而它是將搜尋結果輸出到QuickFix視窗，更多的QuickFix使用可以參考小弟寫得[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-quickfix.html"&gt;這篇文章&lt;/a&gt;]；基本上因為輸出到QF視窗的關係，也使得這個套件更好用了。要直接看demo可以到[&lt;a href="http://downloads.veryspeedy.net/vim/EasyGrep.gif"&gt;這裡看&lt;/a&gt;]。而底下是它的option截圖，大家可以看一下它提供那些功能。&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img style="max-width: 800px;" src="http://lh4.ggpht.com/_WxXxOGW5qJM/Sait95asAMI/AAAAAAAAChE/HxH94PylU9s/%5BUNSET%5D.png?imgmax=800" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;安裝方式請至官網下載EasyGrep.vim and EasyGrepFileAssociations到你的vim plugin資料匣，其中EasyGrepFileAssociations為設定搜尋檔案關連性，像上面那張圖的第30行，我設定ASM檔包括*.s *.asm...等5種檔案，各位可以修改Easy...Associations來更改這個值。&lt;br /&gt;&lt;br /&gt;基本上EasyGrep不需要什麼特別的配置，因為它提供的快速鍵就足夠使用了。以下我整理了我常用的指令(就4個而已)：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;leader&amp;gt;vv- Grep for the word under the cursor&lt;br /&gt;&amp;lt;leader&amp;gt;va - Like vv, but add to existing list&lt;br /&gt;&amp;lt;leader&amp;gt;vo - Select the files to search in and set grep options&lt;br /&gt;:Grep SearchString&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;leader&amp;gt;預設值是對應到"\"。&lt;br /&gt;&lt;br /&gt;大部分的調整是都在&amp;lt;leader&amp;gt;vo裡找的到，只是有少部分的預設值可以從vimrc裡修改，像我自己是加了底下這些預設值，這些預設值大都是for windows才需要的，除了第1個是為了很懶的我，連5個字都要建個mapping變只需打2個字，哈哈。&lt;br /&gt;&lt;code&gt;map  f/          &amp;lt;esc&amp;gt;:Grep&lt;br /&gt;let g:EasyGrepCommand = 1&lt;br /&gt;let g:EasyGrepFileAssociations = "C:\\Program Files\\Vim\\vim72\\plugin\\EasyGrepFileAssociations"&lt;br /&gt;let g:EasyGrepRecursive = 1&lt;br /&gt;let g:EasyGrepHidden = 0&lt;br /&gt;let g:EasyGrepExtraWarnings=0&lt;br /&gt;let g:EasyGrepIgnoreCase= 1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img src="http://img.zemanta.com/pixy.gif?x-id=48ba6c35-2989-4340-935b-4fef16ad6534" class="zemanta-pixie-img" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-6805619118312990677?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/6805619118312990677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=6805619118312990677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6805619118312990677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6805619118312990677'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/03/vim-easygrep_05.html' title='打造自己的VIM: 多檔字串搜尋 EasyGrep'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_WxXxOGW5qJM/Sait95asAMI/AAAAAAAAChE/HxH94PylU9s/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-8436785297404300391</id><published>2009-03-03T09:52:00.004+08:00</published><updated>2009-03-31T23:59:15.264+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>VIM tip: 搜尋不分大小寫及取代</title><content type='html'>&lt;code&gt;:set ic&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;ic是ignorecase的縮寫，不分大小寫在windows上常用到，Linux上就不太常用到了。若是需要用原字串作為取代一部分，可以再用&amp;amp;符號或\1之類的表示。舉例來說，若想取代所有AAA, AAa, Aaa...分別取代成AAA123, AAa123, Aaa123，可以這樣輸入：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;:set ic&lt;br /&gt;:%s/AAA/&amp;amp;123/cg&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-8436785297404300391?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/8436785297404300391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=8436785297404300391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/8436785297404300391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/8436785297404300391'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/03/vim-tip.html' title='VIM tip: 搜尋不分大小寫及取代'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-701663308918980400</id><published>2009-03-03T09:49:00.002+08:00</published><updated>2009-03-31T23:59:24.615+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Linux Tip: less從最後一行開始看</title><content type='html'>方法1:&lt;br /&gt;&lt;code&gt;less +G file_name&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;方法2:&lt;br /&gt;執行less後，G到最後一行，gg到第一行。這跟VIM是不是很像呢？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-701663308918980400?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/701663308918980400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=701663308918980400' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/701663308918980400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/701663308918980400'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/03/linux-tip-less.html' title='Linux Tip: less從最後一行開始看'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-6524469215552346807</id><published>2009-02-24T21:19:00.009+08:00</published><updated>2009-04-01T00:17:20.450+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>打造自己的VIM: 樹狀檔案列表 NERD Tree</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;在VIM中，提到樹狀的檔案列表一定會讓人馬上想到[&lt;a href="http://www.vim.org/scripts/script.php?script_id=1658"&gt;NERD Tree&lt;/a&gt;]。下圖為它的一個截圖，左邊紅框圈起處就是window of NERD Tree。[&lt;a href="http://www.flickr.com/photos/30496122@N07/2862367534/sizes/o/"&gt;這裡&lt;/a&gt;]是作者提供的一個demo，看完demo就能完全知道這個plugin在做啥了。&lt;br /&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="連結" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_WxXxOGW5qJM/SaS1I-nkwdI/AAAAAAAACg8/QGNDJfYFlow/s1600-h/a.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 296px; height: 400px;" src="http://2.bp.blogspot.com/_WxXxOGW5qJM/SaS1I-nkwdI/AAAAAAAACg8/QGNDJfYFlow/s400/a.png" alt="" id="BLOGGER_PHOTO_ID_5306565426801852882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;NERD Tree的特色有：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;樹狀顯示檔案及資料匣&lt;/li&gt;&lt;li&gt;資料匣或檔案的書籤&lt;/li&gt;&lt;li&gt;以各種不同方式開啟檔案 (split of buffer)&lt;/li&gt;&lt;li&gt;快速移動至各種節點&lt;/li&gt;&lt;li&gt;可自訂NERD Tree window的位置&lt;/li&gt;&lt;li&gt;支援滑鼠 (都在用VIM了，誰還在用滑鼠)&lt;/li&gt;&lt;li&gt;過濾檔案內容&lt;/li&gt;&lt;li&gt;檔案系統的操作 (刪除/移動檔案等等)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;安裝方式自己參閱[&lt;a href="http://www.vim.org/scripts/script.php?script_id=1658"&gt;官網&lt;/a&gt;]。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;快速鍵及目錄定義&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;一個在Tools底下的目錄及F5開啟/關閉NERD Tree&lt;br /&gt;&lt;br /&gt;&lt;code&gt;an 50.20 &amp;amp;View.File\ Viewer&amp;lt;Tab&amp;gt;&amp;lt;F5&amp;gt;        &amp;lt;ESC&amp;gt;:NERDTreeToggle&amp;lt;CR&amp;gt;&lt;br /&gt;map  &amp;lt;F5&amp;gt;        &amp;lt;ESC&amp;gt;:NERDTreeToggle&amp;lt;CR&amp;gt;  " Toggles NERD Tree view (file viewer)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;常用指令彙整&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;" ----------------------------&lt;br /&gt;" 基本操作&lt;br /&gt;o: 開檔/資料匣/書籤&lt;br /&gt;x: 關資料匣&lt;br /&gt;O: 開資料匣包含子資料匣&lt;br /&gt;X: 關資料匣包含子資料匣&lt;br /&gt;D: 刪除書籤&lt;br /&gt;&lt;br /&gt;" ----------------------------&lt;br /&gt;" 巡訪樹快速鍵&lt;br /&gt;P: 到根目錄&lt;br /&gt;p: 到母節點&lt;br /&gt;K: 到第一個兄節點&lt;br /&gt;J: 到最後一個兄節點&lt;br /&gt;Ctrl+j: 到下一個兄節點&lt;br /&gt;Ctrl+k: 到上個兄節點&lt;br /&gt;&lt;br /&gt;" ----------------------------&lt;br /&gt;" 檔案系統&lt;br /&gt;C: 改變根目錄至所選資料匣&lt;br /&gt;u: 改變根目錄至上一層的根目錄&lt;br /&gt;U: 改變根目錄至上一層的根目錄且原來的目錄開著&lt;br /&gt;cd: 改變工作目錄到現在所選目錄&lt;br /&gt;&lt;br /&gt;" ----------------------------&lt;br /&gt;" 書籤指令&lt;br /&gt;:Bookmark &amp;lt;name&amp;gt;&lt;br /&gt;:BookmarkToRoot &amp;lt;name&amp;gt;&lt;br /&gt;:RevealBookmark &amp;lt;name&amp;gt;&lt;br /&gt;:OpenBookmark &amp;lt;name&amp;gt;&lt;br /&gt;:ClearBookmarks [&amp;lt;name&amp;gt;]&lt;br /&gt;:ClearAllBookmarks&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-6524469215552346807?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/6524469215552346807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=6524469215552346807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6524469215552346807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6524469215552346807'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/02/vim-nerd-tree.html' title='打造自己的VIM: 樹狀檔案列表 NERD Tree'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_WxXxOGW5qJM/SaS1I-nkwdI/AAAAAAAACg8/QGNDJfYFlow/s72-c/a.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-1191138740177173802</id><published>2009-02-17T10:40:00.003+08:00</published><updated>2009-04-01T00:11:13.883+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>打造自己的VIM: 檔案搜尋 FuzzyFinder</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;小弟在為我心愛的VIM找如何快速尋找檔案的plugin時，不小心找到一個超強的plugin，[&lt;a href="http://www.vim.org/scripts/script.php?script_id=1984"&gt;FuzzyFinder&lt;/a&gt;]，FuzzyFinder的功能只能說強到爆炸，有了它真是為了VIM的愛好者帶來了巨大的便利性。&lt;br /&gt;&lt;br /&gt;FuzzyFinder它能夠幫我們快速找到好幾種東東，那些東東包含了：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Buffer (已開啟的檔案)&lt;/li&gt;&lt;li&gt;File&lt;/li&gt;&lt;li&gt;Tagged file (找在tag裡頭的檔案)&lt;/li&gt;&lt;li&gt;Most recently used(MRU) files (最近開過的檔案)&lt;/li&gt;&lt;li&gt;Directory (快速切換工作目錄)&lt;/li&gt;&lt;li&gt;Bookmark (使用FuzzyFinder建立及使用書籤)&lt;/li&gt;&lt;li&gt;Tag (模糊比較tag檔內的keyword)&lt;/li&gt;&lt;li&gt;MRU-Command (最近使用過的指令)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;它的安裝方式請自己去官網下載.vim，再將.vim放到plugin裡面。以下我將只介紹如何使用它來找檔案及找tag功能，而其它功能因為用法太類似，所以各位就自行抓回去好好享受用它來開檔的快感吧。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;File Mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;使用:FuzzyFinderFile指令來開啟FuzzyFinder的file mode，接著便能輸入一些pattern，FuzzyFinder就會幫我們找到類似的檔名，亦或者可以按下方向鍵的上下或Tab和Shift-Tab來直接選擇檔案。如下圖：&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_WxXxOGW5qJM/SZj82JsmKUI/AAAAAAAAB80/-e4D_L6Fn2o/s1600-h/1.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img id="BLOGGER_PHOTO_ID_5303266568474863938" alt="" src="http://1.bp.blogspot.com/_WxXxOGW5qJM/SZj82JsmKUI/AAAAAAAAB80/-e4D_L6Fn2o/s400/1.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 264px;" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;若是在資料匣上按下Enter，FuzzyFinder會幫我們自動補齊資料匣名，若是在檔案上則會直接開啟檔案，而開啟檔案的方式還有很多種，各位可以自己去參考文件，或是文章下面的指令彙整有稍微提到。&lt;br /&gt;&lt;br /&gt;剛才的搜尋只限定在同一資料匣內，若我們想在搜尋資料匣內包含子資料匣內的檔案的話我們可以使用**\的wildcard，舉例來說，若我要在當前資料匣包含所有子資料匣內找1.txt這個檔案，我就可以打**\1.txt。(**這個符號不只針對FuzzyFinder是這個意思，在VIM中的一些其他地方，像某些built-in function也是這個意思)。下圖是我在arch資料匣找所有的.S檔案。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_WxXxOGW5qJM/SZj82ZJohlI/AAAAAAAAB88/pKdvSVk9q5w/s1600-h/2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img id="BLOGGER_PHOTO_ID_5303266572623185490" alt="" src="http://4.bp.blogspot.com/_WxXxOGW5qJM/SZj82ZJohlI/AAAAAAAAB88/pKdvSVk9q5w/s400/2.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 298px;" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="font-weight: bold;"&gt;Tag Mode&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;FuzzyFinder的Tag mode有2種用法，一是不帶參數，第二則是帶參數。不帶參數如下圖，&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_WxXxOGW5qJM/SZj82YFP3FI/AAAAAAAAB9E/EesX3AHTaRE/s1600-h/3.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img id="BLOGGER_PHOTO_ID_5303266572336356434" alt="" src="http://3.bp.blogspot.com/_WxXxOGW5qJM/SZj82YFP3FI/AAAAAAAAB9E/EesX3AHTaRE/s400/3.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 307px;" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;它的用法跟File mode差不多，一樣先執行:FuzzyFinderTag，接著輸入tag來找tag檔內的關鍵字。但使用這種模式前，請先確認自己有tag file，若是不知道如何產生tag file，可以參考我[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-taglist.html"&gt;之前的文章&lt;/a&gt;]安裝並設定ctags，接著再參考[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-srcexpl.html"&gt;另一篇文章&lt;/a&gt;]產生tag file。&lt;br /&gt;&lt;br /&gt;以上是第一種用法。第2種用法是有帶參數的，其用法為:FuzzyFinderTag &lt;i&gt;關鍵字&lt;/i&gt;。這邊我會加上快速鍵Ctrl+\，因為在某些時候FuzzyFinderTag會比Ctrl+t好用。快速鍵的語法如下：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;map &amp;lt;silent&amp;gt; &amp;lt;C-\&amp;gt;      :FuzzyFinderTag! &amp;lt;C-r&amp;gt;=expand('&amp;lt;cword&amp;gt;')&amp;lt;CR&amp;gt;&amp;lt;CR&amp;gt; &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;配置好了，以後就只需在要查的關鍵字上按下Ctrl+\便能用FuzzyFinderTag來查詢，下圖是個範例，我在unwind_init函式上按下Ctrl+\則FuzzyFinderTag便直接開始查詢我要找的關鍵字。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_WxXxOGW5qJM/SZj82kufDKI/AAAAAAAAB9M/ArfAXVTNcMg/s1600-h/4.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img id="BLOGGER_PHOTO_ID_5303266575730543778" alt="" src="http://4.bp.blogspot.com/_WxXxOGW5qJM/SZj82kufDKI/AAAAAAAAB9M/ArfAXVTNcMg/s400/4.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 267px;" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;c-f12&gt;&lt;cr&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;指令彙整&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;以下我整理了一些關於FuzzyFinder的指令：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;:FuzzyFinderBuffer            " launchs Fuzzyfinder as Buffer mode.&lt;br /&gt;:FuzzyFinderFile              " launchs Fuzzyfinder as File mode.&lt;br /&gt;:FuzzyFinderDir               " launchs Fuzzyfinder as Directory mode.&lt;br /&gt;:FuzzyFinderMruFile           " launchs Fuzzyfinder as MRU-File mode.&lt;br /&gt;:FuzzyFinderMruCmd            " launchs Fuzzyfinder as MRU-Command mode.&lt;br /&gt;:FuzzyFinderBookmark          " launchs Fuzzyfinder as Bookmark mode.&lt;br /&gt;:FuzzyFinderTag               " launchs Fuzzyfinder as Tag mode.&lt;br /&gt;:FuzzyFinderTaggedFile        " launchs Fuzzyfinder as Tagged-File mode.&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;開啟選擇選項可以以下面這幾種模式：&lt;br /&gt;&lt;code&gt;&amp;lt;cr&amp;gt;   - opens in a previous window.&lt;br /&gt;&amp;lt;c-j&amp;gt; - opens in a split window.&lt;br /&gt;&amp;lt;c-k&amp;gt; - opens in a vertical-split window.&lt;br /&gt;&amp;lt;c-]&amp;gt; - opens in a new tab page.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;其他：&lt;br /&gt;&lt;code&gt;&amp;lt;c-l&amp;gt; or &amp;lt;c-o&amp;gt;            " To Switch the mode without leaving Insert mode.&lt;br /&gt;&amp;lt;c-t&amp;gt;                     " If you want to temporarily change whether or not to ignore case&lt;br /&gt;&amp;lt;c-e&amp;gt;                     " 暫時關閉pop視窗&lt;br /&gt;&amp;lt;c-x&amp;gt;&amp;lt;c-u&amp;gt;          " 重新打開pop視窗&lt;br /&gt;:FuzzyFinderRemoveCache   " 刪除Cache資料&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;快速鍵及目錄&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;小弟新增以下幾個常用功能為快速鍵，將這些加入自己.vimrc吧。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;map  ff       &amp;lt;esc&amp;gt;:FuzzyFinderFile&amp;lt;cr&amp;gt;&lt;br /&gt;map  fcd             &amp;lt;esc&amp;gt;:FuzzyFinderDir&amp;lt;cr&amp;gt;&lt;br /&gt;map  fba              &amp;lt;esc&amp;gt;:FuzzyFinderAddBookmark&amp;lt;cr&amp;gt;&lt;br /&gt;map  fbl             &amp;lt;esc&amp;gt;:FuzzyFinderBookmark&amp;lt;cr&amp;gt;&lt;br /&gt;map  fu                &amp;lt;esc&amp;gt;:FuzzyFinderBuffer&amp;lt;cr&amp;gt;&lt;br /&gt;map &amp;lt;silent&amp;gt; &amp;lt;c-\&amp;gt;      :FuzzyFinderTag! &amp;lt;c-r&amp;gt;=expand('&amp;lt;cword&amp;gt;')&amp;lt;cr&amp;gt;&amp;lt;cr&amp;gt;&lt;br /&gt;map  &amp;lt;c-f12&amp;gt;    &amp;lt;esc&amp;gt;:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .&amp;lt;cr&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;目錄部分則是，加在Tools裡頭，截圖如下：&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_WxXxOGW5qJM/SZj9gCIbVNI/AAAAAAAAB9U/LYnhc9wX1S0/s1600-h/5.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img id="BLOGGER_PHOTO_ID_5303267287998616786" alt="" src="http://2.bp.blogspot.com/_WxXxOGW5qJM/SZj9gCIbVNI/AAAAAAAAB9U/LYnhc9wX1S0/s400/5.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 318px; height: 251px;" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;其script為以下那幾行，各位可以加在自己的.vimrc也可以加在menu.vim，或是有人懶得自己加，可以直接抓我的[&lt;a href="http://sites.google.com/site/fcwunctu/vim"&gt;menu.vim&lt;/a&gt;]回去用。&lt;br /&gt;&lt;code&gt;an 40.310.10  &amp;amp;Tools.F&amp;amp;uzzyFinder.&amp;amp;File&amp;lt;tab&amp;gt;ff                                &amp;lt;esc&amp;gt;:FuzzyFinderFile&amp;lt;cr&amp;gt;&lt;br /&gt;an 40.310.10  &amp;amp;Tools.F&amp;amp;uzzyFinder.Tag&amp;amp;File                                        &amp;lt;esc&amp;gt;:FuzzyFinderTaggedFile&amp;lt;cr&amp;gt;&lt;br /&gt;an 40.310.20  &amp;amp;Tools.F&amp;amp;uzzyFinder.&amp;amp;Dir&amp;lt;tab&amp;gt;fcd                               &amp;lt;esc&amp;gt;:FuzzyFinderDir&amp;lt;cr&amp;gt;&lt;br /&gt;an 40.310.30  &amp;amp;Tools.F&amp;amp;uzzyFinder.&amp;amp;Bookmark&amp;lt;tab&amp;gt;fbl                      &amp;lt;esc&amp;gt;:FuzzyFinderBookmark&amp;lt;cr&amp;gt;&lt;br /&gt;an 40.310.40  &amp;amp;Tools.F&amp;amp;uzzyFinder.&amp;amp;BookmarkAdd&amp;lt;tab&amp;gt;fba                &amp;lt;esc&amp;gt;:FuzzyFinderAddBookmark&amp;lt;cr&amp;gt;&lt;br /&gt;an 40.310.50  &amp;amp;Tools.F&amp;amp;uzzyFinder.B&amp;amp;uffer&amp;lt;tab&amp;gt;fu                            &amp;lt;esc&amp;gt;:FuzzyFinderBuffer&amp;lt;cr&amp;gt;&lt;br /&gt;an 40.310.60  &amp;amp;Tools.F&amp;amp;uzzyFinder.&amp;amp;Tag                                                &amp;lt;esc&amp;gt;:FuzzyFinderTag&amp;lt;cr&amp;gt;&lt;br /&gt;an 40.310.70  &amp;amp;Tools.F&amp;amp;uzzyFinder.MRU-&amp;amp;File                                      &amp;lt;esc&amp;gt;:FuzzyFinderMruFile&amp;lt;cr&amp;gt;&lt;br /&gt;an 40.310.80  &amp;amp;Tools.F&amp;amp;uzzyFinder.MRU-&amp;amp;Command                                &amp;lt;esc&amp;gt;:FuzzyFinderMruCmd&amp;lt;cr&amp;gt;&lt;br /&gt;an 40.310.90  &amp;amp;Tools.F&amp;amp;uzzyFinder.-SEP1-                                           &amp;lt;nop&amp;gt;&lt;br /&gt;an 40.310.100 &amp;amp;Tools.F&amp;amp;uzzyFinder.ClearCache                                   &amp;lt;esc&amp;gt;:FuzzyFinderRemoveCache&amp;lt;cr&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img src="http://img.zemanta.com/pixy.gif?x-id=ae8846a2-f98f-457f-80b7-3ad1a442e750" class="zemanta-pixie-img" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-1191138740177173802?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/1191138740177173802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=1191138740177173802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/1191138740177173802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/1191138740177173802'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/02/vim-fuzzyfinder.html' title='打造自己的VIM: 檔案搜尋 FuzzyFinder'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_WxXxOGW5qJM/SZj82JsmKUI/AAAAAAAAB80/-e4D_L6Fn2o/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-5448839770365236054</id><published>2009-02-17T00:49:00.010+08:00</published><updated>2009-08-18T18:29:04.359+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>打造自己的VIM: 源碼追蹤(ctags+cscope)及預覽視窗SrcExpl</title><content type='html'>Windows上重量級的源碼追蹤程式Source Insight，其最重要的功能之一就是他能依據程式內的函式名、結構名或其他源碼內使用之關鍵字，快速跳躍至該關鍵字的宣告或定義處。&lt;br /&gt;&lt;br /&gt;超強編程軟體 - VIM - 也有這種能力。我們用VIM doc裡的文件來解釋一下什麼叫根據源碼關鍵字跳到定義處。如下圖：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://lh6.ggpht.com/_WxXxOGW5qJM/SZmYVHvQGsI/AAAAAAAAB9c/G-irLoHpCWw/%5BUNSET%5D.png?imgmax=800" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;我 們在write_block函式內用到write_line，若我們想看一下write_line的定義，在VIM裡只需將游標移到write_line 上，按下Ctrl+]就可以跳到該函式處。更進一步，在write_line裡頭用到write_char，我們也只需在write_char上按下 Ctrl+]，又能再跳到write_char定義處。這樣的功能在追蹤大型的程式時是很方便的功能，在VIM要有這樣的能力只需一些小小的設定就能達 到。&lt;br /&gt;&lt;br /&gt;本文參考2份VIM document，分別為[&lt;a href="http://vimdoc.sourceforge.net/htmldoc/usr_29.html"&gt;usr_29&lt;/a&gt;]及[&lt;a href="http://vimdoc.sourceforge.net/htmldoc/tagsrch.html"&gt;tagsrch&lt;/a&gt;]。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;big&gt;&lt;b&gt;ctags安裝及使用&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;&lt;br /&gt;要使用源碼追蹤的功能預設是必需在工作目錄下存在一個檔名為tags的檔案，該檔案會紀錄源碼內所有的關鍵字出現位置，tags file的產生可藉由ctags這支程式，ctags的安裝方法我在之前的文章[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-taglist.html"&gt;TagList&lt;/a&gt;]已經有介紹過了，所以這裡不再累述，需要安裝的人請參考那篇文章。&lt;br /&gt;&lt;br /&gt;產生tags方式，必需先切換工作目錄至源碼根目錄下，並輸入下面指令(在命令提示字元下則不要輸入:!喔)：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;如此就會產生一名為tags的檔案在此目錄下，是不是很容易呀。&lt;br /&gt;&lt;br /&gt;另 外，還有一種情形值得一提，有時源碼庫是很大一包，每次執行ctags產生tags file可能會需要一段不短的時間，而我們維護的程式可能只是這一大包源碼庫的其中一個小小的資料匣，因此我們有時會只希望更新我們維護的資料匣，而不是 一大包的源碼庫。這種情形可以只在源碼的所在位置產生一個local tags file，並且再藉著tags option將local tag file加入tag搜尋檔案中。&lt;br /&gt;&lt;br /&gt;首先在目前編輯檔案所在位置產生tags：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q -f "%:p:h\\tags" "%:p:h"&lt;cr&gt;&lt;/cr&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;因 為tags option預設為./tags,tags (輸入:set tags即會顯示出來)，因此只要產生local tags file即會自動被加入tag搜尋檔案中，不需再做設定tag搜尋檔案的工作。在網路上可以查到許多教各位如何將STL的header加入tags搜尋檔 案中，它的方法也是先在STL源碼庫內使用ctags產生tags file，接著再設定tag option。&lt;br /&gt;&lt;br /&gt;有了tags files我們便可以開始追蹤源碼了，追蹤源碼我較常用到這幾個功能，當然這些功能有不少被後後的快速鍵給取代掉了：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Ctrl+]              " 根據游標所在位置的字串常做關鍵字，跳進去(快速鍵:tj)。&lt;br /&gt;Ctrl+t     " 跳出來。&lt;br /&gt;:tselect        " 當有多個關鍵字在tags file中被找到時，可用tselect來選。&lt;br /&gt;:tags                 " 查看現跳到那裡了快速鍵:ta)。&lt;br /&gt;:tnext                " 跳到下一個被找到的tag(快速鍵:tn)。&lt;br /&gt;:tprev                "跳到前一個被找到的tag(快速鍵:tp)。&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;big&gt;&lt;b&gt;cscope安裝及使用&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;&lt;br /&gt;cscope與ctags十分類似，只是它有些功能是ctags所沒有的(cscope似乎可以完全取代ctags ??)，所以我在這裡就稍微提下它的安裝及用法。&lt;br /&gt;&lt;br /&gt;首先要安裝cscope.exe跟之前安裝ctags一樣，也是使用cygwin即可安裝它的windows版本，這裡我就不再贅述。另外對於VIM有人已經製作了它的keymapping及自動載入cscope reference file(cscope.out)的script [&lt;a href="cscope.sourceforge.net/cscope_maps.vim"&gt;cscope_maps.vim&lt;/a&gt;]，將它下載後放至vim72\plugin裡即可。&lt;br /&gt;&lt;br /&gt;如同ctags，cscope也要建立一個cscope.out的參考檔。建立方式如下：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cscope -Rbkq&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;除了讓它自己去搜尋所有檔案，你也可以自己指定一份檔案列表，我們可以先用find(cygwin, NOT windows find)找出所有.cpp及.h的檔案再讓cscope.exe去讀取。如下：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;find . -name "*.h" -o -name "*.c" -o -name "*.cc" &amp;gt; cscope.files&lt;br /&gt;cscope -Rbkq cscope.files&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;以下為cscope_maps.vim提供的功能及對應的按鍵：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Ctrl+\ s    "s表Symbol，列出所有參考到游標所在字串的地方，包含定義和呼叫。&lt;br /&gt;ctrl+\ g    "g表Global，與ctags的Ctrl+]相同。&lt;br /&gt;ctrl+\ c    "c表Call，列出所有以游標所在字串當函數名的地方。&lt;br /&gt;ctrl+\ t    "t表Text，列出專案中所有出現游標所在字串的地方。&lt;br /&gt;ctrl+\ f    "f表File，以游標所在字串當檔名，開啟之。&lt;br /&gt;ctrl+\ i    "i表Include，以游標所在字串當檔名，列出所有include此檔的檔案。&lt;br /&gt;ctrl+\ d    "d表calleD，以游標所在字串當函式名，列出所有此函式呼叫的函式。&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;若想知道其他更詳細的用法可以參考:cs內的內容。&lt;br /&gt;&lt;br /&gt;ps. 若是出現"沒有cscope連線"，這應該是你的工作目錄下沒有cscope.out檔案，若是想不想關掉VIM卻想自行加入cscope連線，可以參考:cs connect指令。&lt;br /&gt;&lt;br /&gt;參考資料: &lt;a href="http://www.yuanma.org/data/2006/0908/article_1487.htm"&gt;http://www.yuanma.org/data/2006/0908/article_1487.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;big&gt;&lt;b&gt;快速鍵設定&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;我設定了2個快速鍵來建立global and local tags file，分別為Ctrl+F12及F12。以及多個快速鍵來來方便tag的使用，其設定如下：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;map  &lt;f12&gt;       :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q -f "%:p:h\\tags" "%:p:h"&lt;cr&gt;&lt;br /&gt;map  &lt;c-f12&gt;     :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .&lt;cr&gt;&lt;br /&gt;map  &lt;c-f11&gt;     :!cscope -Rbkq&lt;cr&gt;&lt;br /&gt;nmap  &lt;tj&gt;       :exec "tjump ".expand("&lt;cword&gt;")&lt;cr&gt;&lt;br /&gt;nmap  &lt;tn&gt;  :exec "ts ".expand("&lt;cword&gt;")&amp;lt;&amp;gt;CR&amp;gt;&lt;br /&gt;nmap  &lt;tp&gt;  :exec "tnext"&lt;cr&gt;&lt;br /&gt;nmap  &lt;ta&gt;         :exec "tprevious"&lt;cr&gt;&lt;/cr&gt;&lt;/ta&gt;&lt;/cr&gt;&lt;/tp&gt;&lt;/cword&gt;&lt;/tn&gt;&lt;/cr&gt;&lt;/cword&gt;&lt;/tj&gt;&lt;/cr&gt;&lt;/c-f12&gt;&lt;/cr&gt;&lt;/f12&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;big&gt;&lt;b&gt;預覽視窗 SrcExpl&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;狂熱於使用VIM的開發人員至此還不是很滿意，他們想為什麼我們不分割一個視窗來做源碼預覽的效果，[&lt;a href="http://www.vim.org/scripts/script.php?script_id=2179"&gt;SrcExpl&lt;/a&gt;]也就因此誕生了。它的截圖如下：&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://lh4.ggpht.com/_WxXxOGW5qJM/SZmYWwarYMI/AAAAAAAAB9g/hHhJg9aJ5SY/%5BUNSET%5D.png?imgmax=800" alt="" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;呼 叫SrcExpl預覽視窗為指令:SrcExplToogle，以上圖為例原先在編輯init/main.c，在叫出SrcExpl預覽視窗後，當我們移 到任意的關鍵字上，SrcExpl預覽視窗就會自動將查詢到的tags顯示在視窗內。上圖為游標在boot_cpu_init()後，預覽視窗即馬上顯示 函式定義。&lt;br /&gt;&lt;br /&gt;說老實話，我大部份的時候很喜歡這個套件，但對於大project我很討厭它。主要原因是對於很大的project時，它tag檔很大，如果我開著這個功能我整個VIM都頓頓的，整個用起來很煩。各位看倌還是自己視情形用它吧&lt;br /&gt;&lt;br /&gt;另外，呼叫SrcExpl預覽視窗，我也定義快速鍵F7&lt;br /&gt;&lt;br /&gt;&lt;code&gt;map &lt;f7&gt; &lt;esc&gt;:SrcExplToggle&lt;cr&gt;&lt;/cr&gt;&lt;/esc&gt;&lt;/f7&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img class="zemanta-pixie-img" alt="" src="http://img.zemanta.com/pixy.gif?x-id=6e21fbc7-6ab4-8801-8bc1-4b3ebb073dbe" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-5448839770365236054?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/5448839770365236054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=5448839770365236054' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5448839770365236054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5448839770365236054'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/02/vim-srcexpl.html' title='打造自己的VIM: 源碼追蹤(ctags+cscope)及預覽視窗SrcExpl'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_WxXxOGW5qJM/SZmYVHvQGsI/AAAAAAAAB9c/G-irLoHpCWw/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-274784331394917071</id><published>2009-02-12T12:57:00.003+08:00</published><updated>2009-02-12T13:13:23.562+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>VIM tip: 單行註解一整個區塊</title><content type='html'>在C/C++或是其它有單行註解(//)語法的程式中，程式員有時會因為某些原因而不使用多行註解(/* */)，為了能快速使用單行註解註解一整個程式區塊，VIM有人寫了一些plugin來幫助註解。但實際上，有些小方法能快速在一片區域前快速加入一些字。&lt;br /&gt;&lt;br /&gt;以下有一段程式，假設我們要在210到215行插入註解為 "; Rickey modifies "。&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_WxXxOGW5qJM/SZOvsIDPESI/AAAAAAAAB8U/B5in8IU0OTI/s1600-h/1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 177px;" src="http://1.bp.blogspot.com/_WxXxOGW5qJM/SZOvsIDPESI/AAAAAAAAB8U/B5in8IU0OTI/s400/1.png" alt="" id="BLOGGER_PHOTO_ID_5301774358955364642" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;我們先用區塊選擇將210到215行選起來，Windows為Ctrl+Q，Linux上為Ctrl+V，如下圖：&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_WxXxOGW5qJM/SZOvsW28NcI/AAAAAAAAB8c/a9CHkqFnWQ0/s1600-h/2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 291px;" src="http://3.bp.blogspot.com/_WxXxOGW5qJM/SZOvsW28NcI/AAAAAAAAB8c/a9CHkqFnWQ0/s400/2.png" alt="" id="BLOGGER_PHOTO_ID_5301774362930329026" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;選起來後進入插入模式，按i，並輸入要插入的註解&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_WxXxOGW5qJM/SZOvsb6zW_I/AAAAAAAAB8k/GW87ACuvNxk/s1600-h/3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 292px;" src="http://2.bp.blogspot.com/_WxXxOGW5qJM/SZOvsb6zW_I/AAAAAAAAB8k/GW87ACuvNxk/s400/3.png" alt="" id="BLOGGER_PHOTO_ID_5301774364288703474" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;最後按ESC離開便完成了。  (傑克！這真是太神奇了)&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_WxXxOGW5qJM/SZOvsasF90I/AAAAAAAAB8s/J2h88CR4jzo/s1600-h/4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 290px;" src="http://4.bp.blogspot.com/_WxXxOGW5qJM/SZOvsasF90I/AAAAAAAAB8s/J2h88CR4jzo/s400/4.png" alt="" id="BLOGGER_PHOTO_ID_5301774363958572866" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-274784331394917071?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/274784331394917071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=274784331394917071' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/274784331394917071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/274784331394917071'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/02/vim-tip.html' title='VIM tip: 單行註解一整個區塊'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_WxXxOGW5qJM/SZOvsIDPESI/AAAAAAAAB8U/B5in8IU0OTI/s72-c/1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-6843858301294905372</id><published>2009-02-12T12:39:00.004+08:00</published><updated>2009-04-01T00:05:14.406+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>打造自己的VIM: 函式列表 TagList</title><content type='html'>[&lt;a href="http://www.vim.org/scripts/script.php?script_id=273"&gt;TagList&lt;/a&gt;]對於程式員而言是個不個貨缺的plugin。它提供了檔案內的結構、define及函式列表，並能讓使用者快速跳到這些變數的定義處。安裝TagList的過程中，除了將TagList抓下來，放到$VIM資料匣內，另外使用者必需提供一支外部程式ctags。本文將介紹在windows XP環境下如何安裝ctags及TagList的配置。&lt;br /&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;big&gt;&lt;b&gt;安裝&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;在將TagList解壓縮放到$VIM資料匣後，在Windows XP下我們必需再安裝ctags，小弟是用cygwin的安裝方式。進入[&lt;a href="http://www.cygwin.com/"&gt;cygwin的首頁&lt;/a&gt;]後，在首頁下方會看到一個setup.exe的程式下載處，抓下來執行後便開始安裝了，安裝的過程中我們要選擇從網路上取得套件、套件取得的server、安裝位置等，最後一步則是選擇套件，選擇套件記得一定要選ctags，它位於Devel下，如下圖(若是有需要，你可以一便在Devel下找到gcc及make的套件來安裝)，之後點選下一步後就開始安裝了。(在ubuntu下安裝因為太簡單，應該就不用介紹了)&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_WxXxOGW5qJM/SZOoKCA7e1I/AAAAAAAAB78/DFQfrA9Xwno/s1600-h/install.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 276px;" src="http://1.bp.blogspot.com/_WxXxOGW5qJM/SZOoKCA7e1I/AAAAAAAAB78/DFQfrA9Xwno/s400/install.png" alt="" id="BLOGGER_PHOTO_ID_5301766076638133074" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;安裝完後，ctags會放在c:\cygwin\bin下，接著我們就設PATH變數好讓TagList找得到ctags程式，在「我的電腦」上按右鍵選內容，其它步驟請看下圖。&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_WxXxOGW5qJM/SZOoKGtoxOI/AAAAAAAAB8E/vj6ZLB45ouM/s1600-h/path.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 221px;" src="http://2.bp.blogspot.com/_WxXxOGW5qJM/SZOoKGtoxOI/AAAAAAAAB8E/vj6ZLB45ouM/s400/path.png" alt="" id="BLOGGER_PHOTO_ID_5301766077899392226" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;接著我們打開「命令提示字元」應該打ctags應該就能執行ctags了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;big&gt;&lt;b&gt;配置TagList&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;快速鍵我是用F6，所以我在vimrc加入：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;map  &amp;lt;F6&amp;gt;        &amp;lt;ESC&amp;gt;:TlistToggle&amp;lt;CR&amp;gt; &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Menu我則是加在View底下，Menu加的方法請參考我以前我的[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-tuning.html"&gt;文章&lt;/a&gt;]。另外，底下是一些我覺得比較有機會用到TagList變數，我列在下方，後面都有註解，所以就自己看一下吧。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;let Tlist_Show_One_File = 1 " Displaying tags for only one file~&lt;br /&gt;let Tlist_Exist_OnlyWindow = 1 " if you are the last, kill yourself&lt;br /&gt;let Tlist_Use_Right_Window = 0 " split to the right side of the screen&lt;br /&gt;let Tlist_Sort_Type = "order" " sort by order or name&lt;br /&gt;let Tlist_Display_Prototype = 0 " do not show prototypes and not tags in the taglist window.&lt;br /&gt;let Tlist_Compart_Format = 1 " Remove extra information and blank lines from the taglist window.&lt;br /&gt;let Tlist_GainFocus_On_ToggleOpen = 0 " Jump to taglist window on open.&lt;br /&gt;let Tlist_Display_Tag_Scope = 1 " Show tag scope next to the tag name.&lt;br /&gt;let Tlist_Close_On_Select = 0 " Close the taglist window when a file or tag is selected.&lt;br /&gt;let Tlist_Enable_Fold_Column = 0 " Don't Show the fold indicator column in the taglist window.&lt;br /&gt;let Tlist_WinWidth = 40&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;以上都都設定完後，以後只要按下F6就可以叫去TagList了，如下圖。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_WxXxOGW5qJM/SZOoKRl5rKI/AAAAAAAAB8M/TBnuHofM68w/s1600-h/taglist.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 318px;" src="http://4.bp.blogspot.com/_WxXxOGW5qJM/SZOoKRl5rKI/AAAAAAAAB8M/TBnuHofM68w/s400/taglist.png" alt="" id="BLOGGER_PHOTO_ID_5301766080819735714" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img src="http://img.zemanta.com/pixy.gif?x-id=196af4b4-1d90-4a50-afc7-f1c6a8d8a132" class="zemanta-pixie-img" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-6843858301294905372?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/6843858301294905372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=6843858301294905372' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6843858301294905372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6843858301294905372'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/02/vim-taglist.html' title='打造自己的VIM: 函式列表 TagList'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_WxXxOGW5qJM/SZOoKCA7e1I/AAAAAAAAB78/DFQfrA9Xwno/s72-c/install.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-3586284281233970319</id><published>2009-02-11T14:35:00.008+08:00</published><updated>2009-04-02T11:26:52.116+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>打造自己的VIM: QuickFix 編譯視窗</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;QuickFix視窗(之後簡稱QF)在VIM裡是一個很方便的功能，它最常見的功能是將編譯時的輸出訊息導入到QF中，在QF中，我們可以快速切換至編譯錯誤的檔案及錯誤行上。除了這個功能外，我們亦可用一些plugin將搜尋字串或檔案的結果輸出到QF內，以方便我們快速瀏覽。&lt;br /&gt;&lt;br /&gt;本篇文章，將簡介如何將QF用在編譯除錯及常見指令彙整，最後我將為QF做一些更方便快速鍵。本篇文章參考自VIM document [&lt;a href="http://vimdoc.sourceforge.net/htmldoc/quickfix.html"&gt;quickfix&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;&lt;big&gt;QF簡介&lt;/big&gt;&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;在編譯程式時，不管在Linux平台或Windows平台，make是最常使用到的專案管理工具之一。VIM則提供了一個:make的指令去呼叫外部make，可能是gmake或nmake來協助編譯程式並輸出到QF視窗中。與:make有關的選項，各位可以參考:options中第23大項的內容，如下圖或VIM document [&lt;a href="http://vimdoc.sourceforge.net/htmldoc/quickfix.html"&gt;quickfix&lt;/a&gt;]。&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_WxXxOGW5qJM/SZJx2Pw2GUI/AAAAAAAAB7s/7F6aqoXIdEY/s1600-h/options.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 393px; height: 316px;" src="http://3.bp.blogspot.com/_WxXxOGW5qJM/SZJx2Pw2GUI/AAAAAAAAB7s/7F6aqoXIdEY/s400/options.png" alt="" id="BLOGGER_PHOTO_ID_5301424888126773570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="left"&gt;接著，我將由一個C的hello world帶領各位使用QF。因為編譯時會呼叫到外部指令，gcc或make，所以請各位在開始前先確定自己的shell(cmd.exe or bash)可以正確執行gcc及make。我的環境是Windows XP及Cygwin(包含make及gcc)，並且在環境變數PATH加入了cygwin bin的路徑。&lt;br /&gt;&lt;br /&gt;首先，我們先寫一個有問題的hello world，如下圖，在第6行處有一個變數未宣告。接著我們輸入&lt;br /&gt;&lt;br /&gt;&lt;code&gt;:make a&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;其中:make為VIM指令，a為檔名不包含副檔名。在這裡make與nmake會有差別，nmake必需輸入a.exe，這是由於兩種make程式的predefined rule不同的關係。按下enter後，a.c的視窗下方就會自動彈出QF視窗(若是沒彈出來，自己輸入:copen指令)，且包含了錯誤訊息，接著各位可以再試:cnext或:cprev的指令來切換下一個或前一個錯誤訊息，在切換的過程，若檔案或行號不同，它會自動幫我們跳到該處。&lt;br /&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_WxXxOGW5qJM/SZJx1-34b5I/AAAAAAAAB7k/BtXfNyumY6Y/s1600-h/error.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 356px;" src="http://4.bp.blogspot.com/_WxXxOGW5qJM/SZJx1-34b5I/AAAAAAAAB7k/BtXfNyumY6Y/s400/error.png" alt="" id="BLOGGER_PHOTO_ID_5301424883592884114" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;對於一般的小程式(只有一份source code，不用複雜的compile和link)，這樣的功能應該就夠了，對於稍有規模的專案則寫一個makefile就是必需的了，至於makefile要怎麼寫，各位就自己去查一下了，網上資源一堆。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;big&gt;&lt;b&gt;指令彙整&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;我只列出我常用的。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;:make      " 編譯程式&lt;br /&gt;&lt;br /&gt;:copen     " 打開QF視窗&lt;br /&gt;:cclose    " 關閉QF視窗&lt;br /&gt;&lt;br /&gt;:cnext     " 移到下一個錯誤&lt;br /&gt;:cprev     " 移到前一個錯誤&lt;br /&gt;&lt;br /&gt;:cnewer    " 若有多個QF buffer，移到下一個錯誤訊息列表&lt;br /&gt;:colde    " 若有多個QF buffer，移到前一個錯誤訊息列表&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;big&gt;&lt;b&gt;快速鍵&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;跟QF有關的指令真是又多又長，若是用了前幾篇的[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-tuning.html"&gt;自訂目錄&lt;/a&gt;]的話，應該可以發現我加了幾個快速鍵，如下圖，我將依此目錄我有修改的部份一個個講解。這些分別為：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;QuickFix switch&lt;/li&gt;&lt;li&gt;Newer List&lt;/li&gt;&lt;li&gt;Older List&lt;/li&gt;&lt;li&gt;Next Error&lt;/li&gt;&lt;li&gt;Previous Error&lt;/li&gt;&lt;/ul&gt;這些東西可以視自己的需要加到vimrc裡。&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_WxXxOGW5qJM/SZJx2MIyVVI/AAAAAAAAB70/oZOdHy-QOY4/s1600-h/menu.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 324px; height: 290px;" src="http://3.bp.blogspot.com/_WxXxOGW5qJM/SZJx2MIyVVI/AAAAAAAAB70/oZOdHy-QOY4/s400/menu.png" alt="" id="BLOGGER_PHOTO_ID_5301424887153448274" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;QuickFix Switch&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;切換QF視窗不只指令長，打開關閉也要用不同指令，實在是非常麻煩，所以小弟寫了一個小function及一個map便可用F8鍵來做切換QF的功能。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;map  &amp;lt;F8&amp;gt;        &amp;lt;ESC&amp;gt;:call QFSwitch()&amp;lt;CR&amp;gt;&lt;br /&gt;function! QFSwitch()&lt;br /&gt;    redir =&amp;gt; ls_output&lt;br /&gt;    execute ':silent! ls'&lt;br /&gt;    redir END&lt;br /&gt;&lt;br /&gt;    let exists = match(ls_output, "[Quickfix List")&lt;br /&gt;    if exists == -1&lt;br /&gt;        execute ':copen'&lt;br /&gt;    else&lt;br /&gt;        execute ':cclose'&lt;br /&gt;    endif&lt;br /&gt;endfunction&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;其它指令&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;因為其他都只是alias而已，我直接列出來我的設定。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;map  &amp;lt;F8&amp;gt;        &amp;lt;ESC&amp;gt;:QFSwitch&amp;lt;CR&amp;gt;&lt;br /&gt;map  &amp;lt;S-F8&amp;gt;      &amp;lt;ESC&amp;gt;:colder&amp;lt;CR&amp;gt;&lt;br /&gt;map  &amp;lt;C-F8&amp;gt;      &amp;lt;ESC&amp;gt;:cnewer&amp;lt;CR&amp;gt;&lt;br /&gt;map  &amp;lt;C-n&amp;gt;       &amp;lt;ESC&amp;gt;:cnext&amp;lt;CR&amp;gt;&lt;br /&gt;map  &amp;lt;C-p&amp;gt;       &amp;lt;ESC&amp;gt;:cprev&amp;lt;CR&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img src="http://img.zemanta.com/pixy.gif?x-id=bf249127-b8a6-4a55-ac8f-00c4fe33923f" class="zemanta-pixie-img" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-3586284281233970319?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/3586284281233970319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=3586284281233970319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3586284281233970319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3586284281233970319'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/02/vim-quickfix.html' title='打造自己的VIM: QuickFix 編譯視窗'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_WxXxOGW5qJM/SZJx2Pw2GUI/AAAAAAAAB7s/7F6aqoXIdEY/s72-c/options.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-8413383563160859647</id><published>2009-02-10T19:41:00.005+08:00</published><updated>2009-02-10T19:49:26.529+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='M$'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>QTTabBar: 為windows檔案總管加上快速鍵</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;在公司實在沒辦法的情況下，只能在windows上工作，windows的檔案總管不像nautilus一樣，有很方便的tab功能，因此我google找到了這個軟體，它不只為檔案總管加了tab，它還提供了一些自訂的快速鍵，這對於我未來會分享的VIM有點關係，所以我先跟大家分享一下這個軟體。&lt;br /&gt;&lt;br /&gt;[&lt;a href="http://qttabbar.wikidot.com/"&gt;QTTabBar&lt;/a&gt;]網上一堆介紹我也不簡介了，畢竟我不會寫的比他們好。我只用幾張圖說明如何利用檔案總管，快速在當前目錄開啟VIM(快速鍵Ctrl+Alt+V)。如果有人不想看如何設定，我把我的設定檔放在[&lt;a href="http://fcwu.tw.googlepages.com/doro_setting.reg"&gt;這&lt;/a&gt;]，需要的人安裝完QTTabBar後，把設定檔抓回去再雙點它就可以用我的設定了。&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_WxXxOGW5qJM/SZFoTi8vWJI/AAAAAAAAB7E/j9gDUEDeU80/s1600-h/qttabbar.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 473px; height: 152px;" src="http://1.bp.blogspot.com/_WxXxOGW5qJM/SZFoTi8vWJI/AAAAAAAAB7E/j9gDUEDeU80/s400/qttabbar.png" alt="" id="BLOGGER_PHOTO_ID_5301132921400154258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_WxXxOGW5qJM/SZFoaL-rmdI/AAAAAAAAB7M/myR6H4HgaHs/s1600-h/shortcut.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 351px; height: 194px;" src="http://3.bp.blogspot.com/_WxXxOGW5qJM/SZFoaL-rmdI/AAAAAAAAB7M/myR6H4HgaHs/s400/shortcut.png" alt="" id="BLOGGER_PHOTO_ID_5301133035493366226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_WxXxOGW5qJM/SZFokKm8f6I/AAAAAAAAB7U/g8-z6AFo9OY/s1600-h/gotooption.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 374px; height: 265px;" src="http://4.bp.blogspot.com/_WxXxOGW5qJM/SZFokKm8f6I/AAAAAAAAB7U/g8-z6AFo9OY/s400/gotooption.png" alt="" id="BLOGGER_PHOTO_ID_5301133206924066722" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_WxXxOGW5qJM/SZFokT6PUvI/AAAAAAAAB7c/yrdp4mbA-MU/s1600-h/gvim.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 360px; height: 400px;" src="http://4.bp.blogspot.com/_WxXxOGW5qJM/SZFokT6PUvI/AAAAAAAAB7c/yrdp4mbA-MU/s400/gvim.png" alt="" id="BLOGGER_PHOTO_ID_5301133209420911346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;題外話，在gnome檔案總管nautilus也可以達到類似功能，我的方法是自己寫個開啟VIM在當前目錄的script放在自己的nautilus script資料匣，以後要開VIM則按鍵盤上的打開popup menu鍵，接著按S到script的menu item，最後再用方向鍵選擇script即可。等我把VIM系列寫完，再跟大家分享。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-8413383563160859647?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/8413383563160859647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=8413383563160859647' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/8413383563160859647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/8413383563160859647'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/02/qttabbar-windows.html' title='QTTabBar: 為windows檔案總管加上快速鍵'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_WxXxOGW5qJM/SZFoTi8vWJI/AAAAAAAAB7E/j9gDUEDeU80/s72-c/qttabbar.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-3293747020908831713</id><published>2009-02-10T10:25:00.001+08:00</published><updated>2009-02-10T10:25:48.531+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>VIM tip: Pipe 使用外部命令處理VIM內資料</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;部分內容參考自[&lt;a href='http://dailyvim.blogspot.com/2008_03_01_archive.html'&gt;Daily VIM: Piping Buffers&lt;/a&gt;]，完整的VIM doc請參考[&lt;a href='http://vimdoc.sourceforge.net/htmldoc/change.html'&gt;change&lt;/a&gt;]&lt;br/&gt;&lt;br/&gt;想使用外部指令來處理VIM內容，關鍵在於"!"這個filter command，舉例來說現在讀取VIM內的文字並交由外部程式sort處，可以這樣做：&lt;br/&gt;&lt;br/&gt;&lt;code&gt;:% ! sort&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;其中%是表文本內容(?)(應該是檔名吧? 有誰知道這個從vim doc那來的)，最後的輸出結果也將目前文本內容全部取代。再舉一個例子，這個例子是用cat來加行號：&lt;br/&gt;&lt;br/&gt;&lt;code&gt;:% ! cat -n&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;有時我們是要由外部命令讀取資料進來，而且不想將外部指令的結果取代掉所有文本內容，這時我們可以用":r"這個命令。舉例來說，將ls輸出到游標所在處：&lt;br/&gt;&lt;br/&gt;&lt;code&gt;:r ! ls&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;再回到剛才cat的例子，我們若想插入文本內容，卻又不想取代掉現在文本內容，我們可以這樣做：&lt;br/&gt;&lt;br/&gt;&lt;code&gt;:exec ":r ! cat -n ".expand("%")&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;exec是叫VIM做這個命令，命令內容為後面那一串，其中expand("%")表示目前編輯的檔案檔名，所以這個命令在未儲存檔案時不能用的喔~~&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-3293747020908831713?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/3293747020908831713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=3293747020908831713' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3293747020908831713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3293747020908831713'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/02/vim-tip-pipe-vim.html' title='VIM tip: Pipe 使用外部命令處理VIM內資料'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-7267071282120643420</id><published>2009-02-10T00:30:00.001+08:00</published><updated>2009-02-10T00:30:12.505+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>打造自己的VIM: Folding</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;對於比較多行的程式，有時候源碼褶疊能隱藏函式或結構的定義，而只顯示函式的宣告，下圖是源碼折疊的一個簡單例子。&lt;br/&gt;&lt;br/&gt;&lt;div align='center'&gt;&lt;img src='http://lh5.ggpht.com/_WxXxOGW5qJM/SZBU7LyAG0I/AAAAAAAAB6s/kCs6FaMSt1o/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px;'/&gt;&lt;br/&gt;&lt;/div&gt;&lt;br/&gt;在VIM中，源碼折疊可以分成多種方法，我這裡只簡單介紹我會用到的幾種折疊方式，隨後會再介紹跟程式折疊有關的指令。本篇文章共參考到2份VIM document，分別為[&lt;a href='http://vimdoc.sourceforge.net/htmldoc/usr_28.html'&gt;user_28&lt;/a&gt;]及[&lt;a href='http://vimdoc.sourceforge.net/htmldoc/fold.html'&gt;fold&lt;/a&gt;]&lt;br/&gt;&lt;br/&gt;&lt;big&gt;&lt;big&gt;&lt;b&gt;折疊方式&lt;br/&gt;&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;&lt;br/&gt;我常用的折疊方式有3種，第1為syntax，簡單的說就是根據語言讓VIM幫你自動折疊程式，我大都使用這種。第2種為marker，很多VIM的script(plugin)都會採用這種，它是根據使用者在文檔中加入的特殊符號來折疊，VIM預設是用"{{{"及"}}}"來作為標示，並且為了讓這種標示不影響程式/文檔運行，通常這些標示會放在註解內，我們看一下下面2個例子。&lt;br/&gt;&lt;br/&gt;&lt;div align='center'&gt;&lt;img src='http://lh3.ggpht.com/_WxXxOGW5qJM/SZBVCWLtkLI/AAAAAAAAB6w/RCLsv8tQAGQ/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px;'/&gt;&lt;br/&gt;&lt;/div&gt;&lt;br/&gt;這個例子太簡單，相信大家看一下就懂。而底下的另一個例子則在標示後面增加了一個號碼來說明這是第幾層的折疊&lt;br/&gt;&lt;br/&gt;&lt;div align='center'&gt;&lt;img src='http://lh3.ggpht.com/_WxXxOGW5qJM/SZBVIqgY-cI/AAAAAAAAB60/BOvvFTwwkMU/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px;'/&gt;&lt;br/&gt;&lt;/div&gt;&lt;br/&gt;Mark這種折疊方式，我通常是用在整理某些特殊的比較沒有規則的文檔。&lt;br/&gt;&lt;br/&gt;第三種折疊方式為為indent，這是根據縮排來折疊，這種折疊方式用在python這種程式，特別好用。&lt;br/&gt;&lt;br/&gt;設置折疊的方式為foldmethod這個option&lt;br/&gt;&lt;br/&gt;&lt;code&gt;:set foldmethod=syntax&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;你可以把它加在vimrc裡，如果你常需要折疊功能的話。若你是像我一樣，偶爾用它，那就等文檔打開後再輸入這個指令，但這個指令也太長了，所以它有縮寫，像是上面的例可以取代成&lt;br/&gt;&lt;br/&gt;&lt;code&gt;:set fdm=syntax&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;此外，我比較常用的option為有這幾個foldnestmax(fdn)及foldcolumn(fdc)。foldnestmax它會限制最多折疊幾層，畢竟有時折疊太多層也很煩人，如下面這個指令它最多會折疊3種。&lt;br/&gt;&lt;br/&gt;&lt;code&gt;set foldnestmax=3&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;foldcolumn這個option則是設定在VIM最左邊預留一塊foldcolumn的空間顯示折疊情形，如下圖。&lt;br/&gt;&lt;br/&gt;&lt;div align='center'&gt;&lt;img src='http://lh3.ggpht.com/_WxXxOGW5qJM/SZBZkt5wvHI/AAAAAAAAB64/A9LfrUzS0xs/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px;'/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;br/&gt;&lt;big&gt;&lt;big&gt;&lt;b&gt;常用指令&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;&lt;br/&gt;&lt;br/&gt;&lt;code&gt;zi      "啟用/關閉折疊&lt;br/&gt;&lt;br/&gt;zo      "打開折疊&lt;br/&gt;zc      "關閉折疊&lt;br/&gt;zO      "打開所有折疊&lt;br/&gt;zC      "關閉所有折疊&lt;br/&gt;&lt;br/&gt;zx      "更新折壘，即除了游標所在折疊不關，其他都關掉&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-7267071282120643420?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/7267071282120643420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=7267071282120643420' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7267071282120643420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7267071282120643420'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/02/vim-folding.html' title='打造自己的VIM: Folding'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_WxXxOGW5qJM/SZBU7LyAG0I/AAAAAAAAB6s/kCs6FaMSt1o/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-2260066614945777621</id><published>2009-02-09T17:37:00.003+08:00</published><updated>2009-08-17T11:30:20.165+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>打造自己的VIM: 書籤及游標移動</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;有在用ultraEdit或pspad等編輯器的人，應該都知道我們可以設置一些標籤(編號通常由1到0)在檔案的某些地方，這些標籤可以讓使用者快速回到設置標籤的位置。&lt;br /&gt;&lt;br /&gt;在VIM裡當然也有這個功能且更強大，但就某方面來講，也可以說以便利性或是上手速度來說也較不容易。今天這篇文章會由簡入難，先跟大家簡述一下VIM的書籤功能，接著再介紹如何使用VisualMark來打造一個簡單易用的書籤環境，最後會跟各位分享我在VIM裡常用的游標移動功能，這些功能能讓各位更快的將游標移到自己想到的位置。&lt;br /&gt;&lt;br /&gt;有關VIM document裡有關游標移動的章節為[&lt;a href="http://vimdoc.sourceforge.net/htmldoc/motion.html"&gt;motion&lt;/a&gt;]，關於[&lt;a href="http://vimdoc.sourceforge.net/htmldoc/motion.html#mark-motions"&gt;書籤&lt;/a&gt;]的部分請參考這裡。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;&lt;big&gt;VIM的書籤功能&lt;/big&gt;&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;VIM的書籤分成2大類，1)同檔案內可以編號由a-z，2)跨檔案可以由編號A-Z，這兩類的差別是第一種在每個檔案內都有自己的書籤a-z，第二種則是所有檔案共享，換句話說，你可以由檔案A藉著書籤的方式跳至該書籤的所在檔案。&lt;br /&gt;&lt;br /&gt;書籤設置的方法為&lt;br /&gt;&lt;br /&gt;&lt;code&gt;m{a-zA-Z}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;舉例來說在normal mode底下輸入ma，即會設置書籤a。而輸入mA則是建立跨檔案書籤。&lt;br /&gt;&lt;br /&gt;跳到書籤處的方式為&lt;br /&gt;&lt;br /&gt;&lt;code&gt;`{a-zA-Z}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;"`"為1左邊的那個鍵。&lt;br /&gt;&lt;br /&gt;顯示書籤則為&lt;br /&gt;&lt;br /&gt;&lt;code&gt;:marks&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;使用後大家或許會發現VIM的書籤的有個致命的缺點，就是他不會在每行的最左邊顯示這裡有設置書籤及書籤編號，這個缺點可以用[&lt;a href="http://www.vim.org/scripts/script.php?script_id=152"&gt;ShowMarks&lt;/a&gt;]這個Plugin來改善，此外ShowMarks也提供一些不錯用的快速鍵，有需要的人自己看一下他們網頁，自己稍微試一下吧。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;&lt;big&gt;VisualMark&lt;/big&gt;&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;[&lt;a href="http://www.vim.org/scripts/script.php?script_id=1026"&gt;VisualMark&lt;/a&gt;]是另一個VIM書籤Plugin，請看下圖，它提供了2個功能，一是反白有書籤的行(圖362行及369)，二是逐一(根據行號)跳至書籤位置。這是我常用的功能，我也把他加入到我的功能表了。並且在vimrc加入這些key mapping。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;"&amp;lt;F9&amp;gt; mark: in plugin filesmap&lt;br /&gt;&amp;lt;F9&amp;gt;        &amp;lt;Plug&amp;gt;Vm_toggle_signmap&lt;br /&gt;&amp;lt;c-F9&amp;gt;      &amp;lt;Plug&amp;gt;Vm_goto_next_signmap&lt;br /&gt;&amp;lt;s-F9&amp;gt;      &amp;lt;Plug&amp;gt;Vm_goto_prev_sign&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_WxXxOGW5qJM/SY_57Y72f0I/AAAAAAAAB6k/VA71J3T2bmo/s1600-h/a.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 300px;" src="http://1.bp.blogspot.com/_WxXxOGW5qJM/SY_57Y72f0I/AAAAAAAAB6k/VA71J3T2bmo/s320/a.png" alt="" id="BLOGGER_PHOTO_ID_5300730085139447618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;&lt;big&gt;游標的瞬間移動&lt;br /&gt;&lt;/big&gt;&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;我以前幾乎不用這些游標移動的功能，後來發現螢幕愈來愈大光按著j (即向下)，從螢幕第一行要移到最後一行挺痛苦的，所以我這裡稍微跟大家分享我自己常用的有關游標移動的快速鍵。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;h    "左&lt;br /&gt;j    "下&lt;br /&gt;k    "左&lt;br /&gt;l    "右&lt;br /&gt;&lt;br /&gt;"這類移到我多到在選擇單字時&lt;br /&gt;w    "移動到下一個單字字首&lt;br /&gt;W    "移動到下一個單字字首，移動更多(某些標點符號不停)&lt;br /&gt;e    "移動到下一個單字字尾&lt;br /&gt;E    "移動到下一個單字字尾，移動更多(某些標點符號不停)&lt;br /&gt;H    "移到螢幕首&lt;br /&gt;M    "移到螢幕中&lt;br /&gt;L    "移到螢幕尾&lt;br /&gt;&lt;br /&gt;zz   "將目前所在行移到螢幕中&lt;br /&gt;zt   "將目前所在行移到螢幕第一行&lt;br /&gt;zb   "將目前所在行移到螢幕最後一行&lt;br /&gt;&lt;br /&gt;*    "往前找出游標所在字串 (按 n、N 繼續找)&lt;br /&gt;#    "往後找出游標所在字串 (按 n、N 繼續找)&lt;br /&gt;gd   "將游標所在字串視為 local 變數，找到定義此 local 變數的地方 (如果有的話)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;%    "找披配的括號&lt;br /&gt;[[   "找函數的開頭&lt;br /&gt;]]   "找下一個函數的開頭&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-2260066614945777621?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/2260066614945777621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=2260066614945777621' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/2260066614945777621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/2260066614945777621'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/02/vim.html' title='打造自己的VIM: 書籤及游標移動'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_WxXxOGW5qJM/SY_57Y72f0I/AAAAAAAAB6k/VA71J3T2bmo/s72-c/a.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-4055789085752976821</id><published>2009-02-07T23:01:00.005+08:00</published><updated>2009-04-01T00:14:24.982+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>打造自己的VIM: 多檔編輯TabBar</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;看圖比較快，如下圖，[&lt;a href="http://www.vim.org/scripts/script.php?script_id=1338"&gt;Tabbar&lt;/a&gt;]就是上面那個檔案列表視窗。Tabbar的操作包含了：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;切換至下個視窗 Ctrl-Tab&lt;br /&gt;&lt;/li&gt;&lt;li&gt;切換至上個視窗 Ctrl-Shift-Tab&lt;br /&gt;&lt;/li&gt;&lt;li&gt;切換至第n個視窗(n為數字0-9) Alt-n&lt;/li&gt;&lt;li&gt;用滑鼠雙點Tab名，像下圖的[2:iliad.h]&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;安裝方式請至[&lt;a href="http://www.vim.org/scripts/script.php?script_id=1643"&gt;他們的網頁&lt;/a&gt;]看一下唄。&lt;br /&gt;&lt;br /&gt;&lt;img style="max-width: 800px;" src="http://lh4.ggpht.com/_WxXxOGW5qJM/SY2ZUjbogFI/AAAAAAAAB6g/laG1lo8_XMo/%5BUNSET%5D.png?imgmax=800" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;此外，我在用他們的plugin時，有時會不小心在-TabBar-的window內，按到切換檔案的鍵(像是剛剛提到的Ctrl-Tab, Ctrl-Shift-Tab...)，降會要被切換到的檔案顯示在-TabBar- window中，若是想避免這種情形，其實是可以加一個自動指令及函式在vimrc裡，這個指令會在當window切換時自動被執行，加法如下：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;autocmd! BufEnter * nested call Test()&lt;br /&gt;func! Test()&lt;br /&gt;if bufname("%") == "-TabBar-"&lt;br /&gt;    wincmd j     ; 跳到下面的視窗&lt;br /&gt;endif&lt;br /&gt;endfunction&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;但是這樣寫會造成滑鼠雙點Tab名切換視窗的功能失效，要用的人自己斟酌一下。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;(2009/2/9 新增)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在使用TabBar還有一個情形也是十分困擾我的，每次下:bd刪除buffer時，時常下個被顯示的buffer不會按照順序，舉例來說，假使我現在看第4個buffer，若是我用:bd將它將它關掉，下個被打開的視窗通常不會按照一定的規律跳到第3或第5個buffer，這個壞處是有時要關一個以上的buffer，不能一直:bd的按，把大於某個號碼的視窗全部關掉。所以我加了一個小函式及快速鍵在vimrc，它能在關掉buffer後，一定跳到前一個buffer，程式如下。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;map  &amp;lt;C-F4&amp;gt;      &amp;lt;ESC&amp;gt;:call CloseTab()&amp;lt;CR&amp;gt;&lt;br /&gt;func! CloseTab()&lt;br /&gt;let s:buf_nr = bufnr("%")&lt;br /&gt;echo s:buf_nr&lt;br /&gt;exec ":Tbbp "&lt;br /&gt;exec ":bdelete ".s:buf_nr&lt;br /&gt;endfunction&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;(2009/3/11 新增)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;TabBar裡其實有一些設定很少被提到，但是卻很實用，若需要更多的說明可以自己打開tabar.vim來看看，大概在100出頭行的地方，亦或是直接在code裡的某處。我這裡提一些看起來比較有用到的。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;g:Tb_MaxSize (Default = 1)&lt;/span&gt;&lt;br /&gt;有時開的檔案太多，TabBar視窗會容不下那麼多檔案同時在一行內被顯示，但是使用者(我)會希望它可以分成2行被顯示，這時只要將這個值設定2就行。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;g:Tb_TabWrap (Default = 0)&lt;/span&gt;&lt;br /&gt;若開啟檔案數超過一行可顯示且g:Tb_MaxSize又設成大於1時，超過一行可顯示的字會折到下一行而造成最後一個檔案標籤斷了，若設成1則它不會讓標籤斷掉，會直接讓行尾標籤放到下一行行首。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;g:Tb_SplitBelow (1 = below, 0 = above(Default))&lt;/span&gt;&lt;br /&gt;將TabBar視窗放在上面or下面&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;g:Tb_VSplit (0:top, 1:left)&lt;/span&gt;&lt;br /&gt;將TabBar放在上面or左邊&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;我自己是設定這些值&lt;br /&gt;&lt;code&gt;let g:Tb_MaxSize = 2&lt;br /&gt;let g:Tb_TabWrap = 1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-4055789085752976821?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/4055789085752976821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=4055789085752976821' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4055789085752976821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4055789085752976821'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/02/vim-tabbar.html' title='打造自己的VIM: 多檔編輯TabBar'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_WxXxOGW5qJM/SY2ZUjbogFI/AAAAAAAAB6g/laG1lo8_XMo/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-5251331069004989347</id><published>2009-02-05T14:53:00.008+08:00</published><updated>2009-04-01T00:14:56.750+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>打造自己的VIM: 修改目錄(功能表)</title><content type='html'>本篇文章是[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/make-vim-more-powerful-cont-and-prolog.html" target="_blank"&gt;Make vim more powerful cont. and prolog&lt;/a&gt;]系列的第一篇。這篇文章要分享我修改vim目錄的一些分得，保括了修改目錄的方法、指令、希望修改的地方，最後將會貼一些修改後的圖及我的設定檔給各位取用。&lt;br /&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;br /&gt;VIM目錄基本上都會有一串數字來代表他的位置，舉例來說Close這個menu item所在的位置為10.330，如下圖所示，若想要再插入一個目錄在它底下其位址可介於10.330到10.335之間。若想在10.330處插入一個子目錄則是位址可以由10.330.0開始到10.330.9999。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_WxXxOGW5qJM/SYqNRNmUhrI/AAAAAAAAB54/Q_obm_gLp-o/s1600-h/vim_menu_hir.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 254px;" src="http://1.bp.blogspot.com/_WxXxOGW5qJM/SYqNRNmUhrI/AAAAAAAAB54/Q_obm_gLp-o/s320/vim_menu_hir.png" alt="" id="BLOGGER_PHOTO_ID_5299203238402492082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;big&gt;&lt;b&gt;指令&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;跟目錄有關的指令，基本上我只用到:anoremenu(abbr. :an)這個指令，它是用來插入一個目錄，而且不能remap。譬如說我想插入一個指令&lt;br /&gt;&lt;ol&gt;&lt;li&gt;在10.320的位置&lt;/li&gt;&lt;li&gt;第一層的menu item name為File且快速鍵為f&lt;/li&gt;&lt;li&gt;第二層的menu item name為Open Tab ...且沒有快速鍵&lt;/li&gt;&lt;li&gt;提示的指令為:tabnew&lt;/li&gt;&lt;li&gt;真正執行的指令為:browse tabnew&lt;cr&gt;。&lt;/cr&gt;&lt;/li&gt;&lt;/ol&gt;&lt;cr&gt;這個指令如下：&lt;/cr&gt;&lt;cr&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;:an 10.320 &amp;amp;File.Open\ Tab\.\.\.&amp;lt;TAB&amp;gt;:tabnew     :browse tabnew&lt;tab&gt;&lt;cr&gt;&amp;lt;CR&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;要注意的是有些特殊字元必需用"\"來跳脫，像是"."或" "。另外&amp;lt;&lt;cr&gt;TAB&amp;gt;是換行的意思。&lt;br /&gt;&lt;br /&gt;此外，若是想插入一個分隔線則指令如下：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;:an 10.400 &amp;amp;File.-SEP2-            &lt;nop&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;其中-SEP2-，同一階的目錄下名字必需不同。&lt;br /&gt;&lt;br /&gt;若是想知道更多指令，亦或是針對不同mode出現的目錄，就自行參考[&lt;a href="http://vimdoc.sourceforge.net/htmldoc/usr_42.html" target="_blank"&gt;vim document usr_42&lt;/a&gt;]。此外，如果有人有興趣瞭解script基本語法，像是流程控制、變數型態、變數類型等等，可再自己看一下[&lt;a href="http://vimdoc.sourceforge.net/htmldoc/usr_41.html" target="_blank"&gt;vim document usr_41&lt;/a&gt;]。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;big&gt;&lt;b&gt;目錄設定檔在哪？&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;可以用:version指令找到，截圖如下：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_WxXxOGW5qJM/SYqNjuEVx0I/AAAAAAAAB6Q/nq6c1aEXd-k/s1600-h/vim_version.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 53px;" src="http://4.bp.blogspot.com/_WxXxOGW5qJM/SYqNjuEVx0I/AAAAAAAAB6Q/nq6c1aEXd-k/s320/vim_version.png" alt="" id="BLOGGER_PHOTO_ID_5299203556355983170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;big&gt;&lt;b&gt;我想要改成...&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;在修改前，先列一下我們想要修改的地方吧：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;加入我自己的快速鍵&lt;/li&gt;&lt;li&gt;把不會用到的功能刪掉&lt;/li&gt;&lt;li&gt;一些我認為它擺錯地方的目錄移到正確的地方&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;修改後的結果...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Edit menu&lt;/b&gt;: 擴充了Find的指令，像是Find Files or Find in Files，還有一些有關設定的都放在這。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_WxXxOGW5qJM/SYqNjUrBU_I/AAAAAAAAB6A/3nBRTmjcHOQ/s1600-h/vim_edit.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 252px; height: 320px;" src="http://3.bp.blogspot.com/_WxXxOGW5qJM/SYqNjUrBU_I/AAAAAAAAB6A/3nBRTmjcHOQ/s320/vim_edit.png" alt="" id="BLOGGER_PHOTO_ID_5299203549538898930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tools menu:&lt;/span&gt; 加了不少自己工具，像是Code Trace、Virsual Mark等等，這些功能在之後的文章才會介紹。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_WxXxOGW5qJM/SYqNjnUd6GI/AAAAAAAAB6I/dP5tY9eyCnc/s1600-h/vim_tools.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 177px; height: 186px;" src="http://4.bp.blogspot.com/_WxXxOGW5qJM/SYqNjnUd6GI/AAAAAAAAB6I/dP5tY9eyCnc/s320/vim_tools.png" alt="" id="BLOGGER_PHOTO_ID_5299203554544576610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;View menu:&lt;/span&gt; 又加了不少特殊功能，F5到F7都是，這些都後面幾篇文章會介紹。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_WxXxOGW5qJM/SYqNju0-uuI/AAAAAAAAB6Y/11Vq_kqxR0w/s1600-h/vim_view.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 146px; height: 142px;" src="http://1.bp.blogspot.com/_WxXxOGW5qJM/SYqNju0-uuI/AAAAAAAAB6Y/11Vq_kqxR0w/s320/vim_view.png" alt="" id="BLOGGER_PHOTO_ID_5299203556559993570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;big&gt;&lt;b&gt;結論&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;「師父引入門，修行在個人」學習vim也是這樣，有心想要修改自己目錄的人都應該要自己開一下$VIMRUNTIME\menu.vim有看看，並且視自己的需求打造自己的編輯器，改過一些東西后就會發覺原來改目錄那麼簡單。所以，還等什麼，快點把你的設定檔打開吧！&lt;br /&gt;&lt;br /&gt;我的設定檔：&lt;a href="http://sites.google.com/site/fcwunctu/vim"&gt;http://sites.google.com/site/fcwunctu/vim&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/nop&gt;&lt;/cr&gt;&lt;/cr&gt;&lt;/tab&gt;&lt;/cr&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-5251331069004989347?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/5251331069004989347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=5251331069004989347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5251331069004989347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5251331069004989347'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/02/vim-tuning.html' title='打造自己的VIM: 修改目錄(功能表)'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_WxXxOGW5qJM/SYqNRNmUhrI/AAAAAAAAB54/Q_obm_gLp-o/s72-c/vim_menu_hir.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-7363285102166446327</id><published>2009-02-04T00:14:00.002+08:00</published><updated>2009-02-12T12:57:06.470+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>VIM tip: 將tab取代成space及程式縮排方式</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;最近找到一個vim的網站 &lt;a href="http://dailyvim.blogspot.com/" target="_blank"&gt;Daily VIM&lt;/a&gt;，是關於一些vim tips，裡頭有些東西還不錯，近期如果有空應該會轉錄一些我覺得比較有用的到我這來。&lt;br /&gt;&lt;br /&gt;過去將全文裡的tabs取代成space我多半用取代的方式：&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;:%s/\t/  /cgi&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;另一作法，vim控制tab距離是靠tabstop (option)，若是要根據tabstop來轉換tab成space，可以用這個方法：&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;:set expandtab&lt;br /&gt;:retab!&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;其中，tabstop的值可以用類似這種指令來控制：&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;:set tabstop=2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;稍微提一下，expandtab不是只用到這裡，若是想在編輯時自動將tab轉換成space可以用此命令。而取代所有tab成space的命令是retab這行。&lt;br /&gt;&lt;br /&gt;在縮排程式時，有另一個常用的情形是這樣，將某行右移一個tab距離，即在normal mode時，輸入&lt;i&gt;&lt;b&gt;&amp;gt;&amp;gt;&lt;/b&gt;&lt;/i&gt;。若要左移則輸入&lt;i&gt;&amp;lt;&amp;lt;&lt;/i&gt;。若要縮排一個區塊則可用V先選擇欲縮排的區塊，再輸入一個&lt;i&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/i&gt;或&lt;i&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/i&gt;即可。當然，若是想要多縮幾個tab距離則可以按&lt;i&gt;&lt;b&gt;.&lt;/b&gt;&lt;/i&gt;來重覆上一個動作。這裡的一個tab距離寬度是用shiftwidth這個option來控制的。&lt;br /&gt;&lt;br /&gt;另外，還有一種自動縮排的功能&lt;i&gt;&lt;b&gt;"="&lt;/b&gt;&lt;/i&gt;，跟之前一樣先選擇一塊區塊用&lt;i&gt;&lt;b&gt;V鍵&lt;/b&gt;&lt;/i&gt;，再輸入&lt;i&gt;&lt;b&gt;=&lt;/b&gt;&lt;/i&gt;則自動完成縮排。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-7363285102166446327?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/7363285102166446327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=7363285102166446327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7363285102166446327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7363285102166446327'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/02/vim-tips-tabspace.html' title='VIM tip: 將tab取代成space及程式縮排方式'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-2392242903123863070</id><published>2009-02-03T11:16:00.012+08:00</published><updated>2009-08-17T12:52:49.956+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>打造自己的VIM</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;一年前寫了一篇關於vim的文章[&lt;a target="_blank" href="http://rickey-nctu.blogspot.com/2008/04/make-vim-more-powerful.html"&gt;Make vim more powerful&lt;/a&gt;]， 那篇文章裡介紹了許多scripts或是小技巧，但現在來看這些scripts or tips都有一些更好的方法來取代之。此外，再加上最近因為開始了我的第一份"正式"的工作，所以我花了點時間，又重新修改我的vim環境，讓他更適合現 在的工作。這篇文章主要要介紹大都以之前那篇文章以底，並再做些更新，最後會再附上我目前的設定給大家參考。&lt;br /&gt;&lt;br /&gt;以下是我所做的所有增加或修改，並且在後面列出快速鍵(如果有的話)：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-tuning.html"&gt;menu修改&lt;/a&gt;]&lt;br /&gt;&lt;/li&gt;&lt;li&gt;[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-tabbar.html"&gt;多檔編輯TabBar&lt;/a&gt;]&lt;br /&gt;&lt;/li&gt;&lt;li&gt;[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-nerd-tree.html"&gt;檔案總管 NERD Tree&lt;/a&gt;] (F5)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;[&lt;a href="http://rickey-nctu.blogspot.com/2009/03/vim-easygrep_05.html"&gt;多檔字串搜尋 EasyGrep&lt;/a&gt;] (f/)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-fuzzyfinder.html"&gt;檔案搜尋 FuzzyFinder&lt;/a&gt;] (ff)&lt;/li&gt;&lt;li&gt;[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-folding.html"&gt;Folding 程式碼摺疊&lt;/a&gt;]&lt;br /&gt;&lt;/li&gt;&lt;li&gt;[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim.html"&gt;Marks 書籤&lt;/a&gt;&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim.html"&gt;及游標移動&lt;/a&gt;] (F9)&lt;/li&gt;&lt;li&gt;[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-quickfix.html"&gt;QuickFix 編譯視窗&lt;/a&gt;] (F8)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-taglist.html"&gt;函式列表 TagList&lt;/a&gt;] (F6)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;[&lt;a href="http://rickey-nctu.blogspot.com/2009/02/vim-srcexpl.html"&gt;源碼追蹤ctags+cscope及預覽視窗SrcExpl&lt;/a&gt;] (F7)&lt;/li&gt;&lt;li&gt;[&lt;a href="http://rickey-nctu.blogspot.com/2009/03/vim-supertab-omnicppcomplete.html"&gt;源碼補齊 SuperTab OmniCppComplete Code_Complete&lt;/a&gt;]&lt;/li&gt;&lt;/ol&gt;因為功能不少，所以我也順便修改了menu，除了把我自己增加的功能放到menu裡(提醒用)，也把原本gvim那不合理(我自認為)的MenuItems排列大搬家了一下，所以首先我會先介紹menu如何修改，並接序的主題儘量以menu來以一貫之。&lt;br /&gt;&lt;br /&gt;除了這些內容外，關於VIM的文章還有VIM tip系列，要找到他們可以直接從右邊的搜尋欄輸入vim tip即可找到他們，當然這些內容會持續的更新。&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img src="http://img.zemanta.com/pixy.gif?x-id=bfaa23df-9716-48e3-aafb-98ccc2065fd1" class="zemanta-pixie-img" /&gt;&lt;br /&gt;最後，我的設定檔可以在[&lt;a href="http://sites.google.com/site/fcwunctu/vim"&gt;這裡&lt;/a&gt;]抓，需要的人請自行取用。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;[&lt;a href="http://sites.google.com/site/fcwunctu/vim/_vimrc?attredirects=0"&gt;vimrc&lt;/a&gt;]&lt;/li&gt;&lt;li&gt;[&lt;a href="http://sites.google.com/site/fcwunctu/vim/menu.vim?attredirects=0"&gt;menu.vim&lt;/a&gt;]&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-2392242903123863070?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/2392242903123863070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=2392242903123863070' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/2392242903123863070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/2392242903123863070'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/02/make-vim-more-powerful-cont-and-prolog.html' title='打造自己的VIM'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-151396540076481226</id><published>2009-02-01T20:28:00.001+08:00</published><updated>2009-02-01T20:28:51.801+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Ubuntu: convert wav file to mp3</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;最近想在每天坐捷運時練練英文，我自認為英文讀寫的能力還不錯(比起聽說，聽說應該是爛到爆)，所以買了一本比較注重生活會話的雜誌來每天閱讀，不知道這股拚勁什麼時候會消磨光 :)。那本雜誌的會話光碟是給wav檔，我的ipod nano沒法放那種檔案，所以只好先來轉檔了。(ipod nano是我可愛的女友送我的，大概用了2個禮拜，心得是"頗爛"。原因由iTune不好用，放歌很麻煩，音質不好)&lt;br/&gt;&lt;br/&gt;前面都是廢話，跟本篇的主題一點關係都沒有。在Ubuntu中轉wav檔成mp3檔很簡單，先安裝lame &lt;br/&gt;&lt;code&gt;sudo aptitude install lame&lt;/code&gt;&lt;br/&gt;接著再使用lame指令來轉，像是&lt;br/&gt;&lt;code&gt;lame -h -b 128 1.wav 1.mp3&lt;/code&gt;&lt;br/&gt;上面是第一個方法，再介紹另一個方法，在ubuntu 8.10中的nautilus中己經有script可以幫助轉檔了，安裝這個套件 nautilus-script-audio-convert，再右鍵點選欲轉檔的檔案，選Scripts-&amp;gt;ConvertAudioFile，接著steps by steps就完成轉檔了。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-151396540076481226?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/151396540076481226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=151396540076481226' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/151396540076481226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/151396540076481226'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/02/ubuntu-convert-wav-file-to-mp3.html' title='Ubuntu: convert wav file to mp3'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-7673215081190339597</id><published>2009-01-30T00:06:00.001+08:00</published><updated>2009-01-30T00:06:07.022+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Write OS: 使用開源軟體-自己動手寫作業系統</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;今天終於把[&lt;a href='http://share.solrex.cn/WriteOS/index_cht.html' target='_blank'&gt;使用開源軟體-自己動手寫作業系統&lt;/a&gt;]看完，我一直都對寫作業系統很有興趣，但是一直遲遲找不到一個好的開始，因此很感謝[&lt;a href='http://solrex.cn/' target='_blank'&gt;楊文博&lt;/a&gt;]寫得這本免費電子書， 讓所有有心專研這方面的人能有個完整的學習， 雖然現在這本書還沒完成，但讀完後還是授益匪淺。&lt;br/&gt;&lt;br/&gt;目前這本書完成了3章，首先第一章的計算機啟動介紹了計算機啟動方式，基本硬體簡介及開發OS時所需使用的開源軟體。&lt;br/&gt;&lt;br/&gt;第2章則由OS版的Hello World開始介紹(example 2-1)，並進一步將Hello World放至FAT12的File system裡以擺脫512Bytes (Sector size)的限制 (example 2-2)。&lt;br/&gt;&lt;br/&gt;第3章則由real mode進入了protected mode，本章第一個例子 (example 3-1) 便說明了GDT (Global Descriptor Table)，Segment Selector 的重要觀念, 並且使用了 far jump 跳到 protected mode。接著 example 3-2 則代入了LDT (Local Descriptor Table)，LDT的存在主要是為了 multi-task 環境所設計，不同的 task 擁有自己的記憶體區段。在Descriptor裡，為了使OS更加安全，descriptor包含了權限的設計，Intel設計了ring 0(高)到ring 3(低)來加以區隔 user/kernel permission，為了使權限平和的轉移，便設計了call gate來輔助，call gate說穿了只是一種特殊的descriptor，example 3-3 展示了如何使用 call gate 由一 segment 跳至另一 segment。在 example 3-3尚未展示真正的權限轉移，example 3-4做了這方面的修正，由高權限跳至低權限。example 3-5則由低權限跳至高權限，並且一起做了Task State切換(TSS: Task State Segment)。Example 3-6開始使用了paging的技術，Example 3-7則對Page Directory Size根對計憶體大小作一最佳化，Example 3-8則真的了展示Virtual memory的作用。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;最後，對於有心要寫OS的人，Intel的這本書[&lt;a href='http://download.intel.com/design/processor/manuals/253668.pdf'&gt;Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A: System Programming Guide&lt;/a&gt;]的前幾章有些章節是必讀的，有心的人可以自己下載回來看看，想要紙本的人，也可以跟他們要。&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-7673215081190339597?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/7673215081190339597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=7673215081190339597' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7673215081190339597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7673215081190339597'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2009/01/write-os.html' title='Write OS: 使用開源軟體-自己動手寫作業系統'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-6085698531364901421</id><published>2008-07-08T12:19:00.002+08:00</published><updated>2008-07-08T12:35:55.491+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='Hacking'/><category scheme='http://www.blogger.com/atom/ns#' term='wargame'/><title type='text'>[Wargame]ccu Middle ~ Mid04</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Middle&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Given：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;一個看不到目錄內容的目錄&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Nothing ...&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Thinking:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;猜吧...&lt;/li&gt;&lt;li&gt;shell的執行檔名稱 ...&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Mid01&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Given：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;'less' with setuid&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt; Thinking:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;how to execute a external program by that program   &lt;/li&gt;&lt;li&gt;man less!!&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt; &lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Mid02&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;太簡單&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Mid03&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Given：&lt;br /&gt; &lt;ol&gt;&lt;li&gt;一堆指令&lt;/li&gt;&lt;li&gt;A program with setuid attribute is at ~mid04/bin/myshell&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;  Thinking:&lt;br /&gt; &lt;ol&gt;&lt;li&gt;Restricted-shell. How to escape?? vim??&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt; &lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Mid04&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; Given：&lt;br /&gt;  &lt;ol&gt;&lt;li&gt;A backdoor at??&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The password of backdoor&lt;br /&gt;  &lt;/li&gt;&lt;/ol&gt;   Thinking:&lt;br /&gt;  &lt;ol&gt;&lt;li&gt;登入後門後，建一個可以讓mid04轉到mid05的setuid程式。&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-6085698531364901421?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/6085698531364901421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=6085698531364901421' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6085698531364901421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6085698531364901421'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/07/wargameccu-middle-mid04.html' title='[Wargame]ccu Middle ~ Mid04'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-5402455348300916984</id><published>2008-07-07T21:58:00.002+08:00</published><updated>2008-07-07T22:08:45.855+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='Hacking'/><category scheme='http://www.blogger.com/atom/ns#' term='wargame'/><title type='text'>[Wargame]ccu Basic 6~9</title><content type='html'>&lt;a href="http://wargame.cna.ccu.edu.tw/"&gt;&lt;/a&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Basic 6&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Given：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;A file but where?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;DES code&lt;/li&gt;&lt;/ol&gt;Thinking:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;scanning port by nmap&lt;br /&gt;&lt;/li&gt;&lt;li&gt;get master.passwd&lt;/li&gt;&lt;li&gt;crack the password by &lt;a href="http://www.openwall.com/john/"&gt;John the ripper&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Basic 7&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Given：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The password is inside the binary program&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt; Thinking:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;How to get the strings inside the program (strings)&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Basic 8&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; Given：&lt;br /&gt; &lt;ol&gt;&lt;li&gt;A program with setuid and the source code&lt;/li&gt;&lt;/ol&gt;  Thinking:&lt;br /&gt; &lt;ol&gt;&lt;li&gt;可以在source code內找到它運用了getuid這個function，而此function是由某個library提供的。&lt;/li&gt;&lt;li&gt;是否可以用某些方式讓該程式不要去讀取原本的library，而去讀取我們自己的library&lt;/li&gt;&lt;li&gt;LD_PRELOAD ??&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt; &lt;br /&gt;&lt;br /&gt; &lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Basic 9&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  Given：&lt;br /&gt;  &lt;ol&gt;&lt;li&gt;A program with buffer overflow vulnerability&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;   Thinking:&lt;br /&gt;  &lt;ol&gt;&lt;li&gt;有一變數在複製資料進去時，並沒有做bound checking，也因此我們可利用寫超過的資料去覆蓋程式中其他變數的值&lt;br /&gt;  &lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-5402455348300916984?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/5402455348300916984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=5402455348300916984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5402455348300916984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5402455348300916984'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/07/wargameccu-basic-69.html' title='[Wargame]ccu Basic 6~9'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-1555909415101141396</id><published>2008-07-06T11:08:00.004+08:00</published><updated>2008-07-07T21:57:53.357+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='Hacking'/><category scheme='http://www.blogger.com/atom/ns#' term='wargame'/><title type='text'>[Wargame]ccu Basic 0~5</title><content type='html'>&lt;a href="http://wargame.cna.ccu.edu.tw/"&gt;台灣冒險傢俱樂部&lt;/a&gt;共有20關，分別從Basic 0~9，Mid00~Mid09&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Basic 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Given：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;A hostname&lt;/li&gt;&lt;li&gt;Password hint&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;第1至第4個及第7個字元在密碼表裡&lt;/li&gt;&lt;li&gt;第5,6,8個字元為任意字元&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;Thinking：&lt;ol&gt;&lt;li&gt;使用&lt;a href="http://nmap.org/"&gt;nmap&lt;/a&gt;去掃主機上的有開那些port，再telnet看看吧&lt;/li&gt;&lt;li&gt;任意字元是什麼意思，可以由shell來思考。&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Basic 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Given：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;A program with setuid&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The source code of the setuid program&lt;/li&gt;&lt;/ol&gt; Thinking： &lt;ol&gt;&lt;li&gt;看到該程式source code呼叫了system並且其參數不是使用絕對路徑，是否能改變系統找程式的路徑？&lt;br /&gt;&lt;/li&gt;&lt;li&gt;試試shell變數 path&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt; &lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Basic 2&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Given：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;nslookup&lt;/span&gt; with setuid&lt;/li&gt;&lt;/ol&gt; Thinking： &lt;ol&gt;&lt;li&gt;nslookup是否可執行外部程式，或是否有執行外部程式？help??&lt;/li&gt;&lt;li&gt;PAGER及PATH環境變數&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Basic 3&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Given：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;A program with setuid&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt; Thinking： &lt;ol&gt;&lt;li&gt;system函式的參數直接由外部存取，Command injection？&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Basic 4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Given：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;r-family指令, such as rsh, rcp...&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt; Thinking： &lt;ol&gt;&lt;li&gt;發現.rhost將權限給expose出來了&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Basic 5&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;這關太智障，猜一下就出來了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;待續...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-1555909415101141396?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/1555909415101141396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=1555909415101141396' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/1555909415101141396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/1555909415101141396'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/07/wargameccu-basic05.html' title='[Wargame]ccu Basic 0~5'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-4197104997240127341</id><published>2008-07-05T11:19:00.002+08:00</published><updated>2008-07-05T11:37:10.852+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='Hacking'/><category scheme='http://www.blogger.com/atom/ns#' term='wargame'/><title type='text'>Wargame</title><content type='html'>Wargame為專為有心成為駭客的玩家所設計的遊戲，當初我會接觸這類型的遊戲主要是因為學校的修課，那門課的期末project評分方式就是以你過了多少wargame，在那1~2個月裡，我過了一堆wargames並且將他們寫成了報告，從今天開始我會將這些報告整理出來，並且寫到這個部落格里讓大家參考解法，但為了保持wargame的挑戰性，答案我還是儘可能不會直接寫出來。&lt;br /&gt;&lt;br /&gt;以下是wargame網站的列表(我只列出我有玩的, ps. 有些大陸的wargame十分智障，可以不去玩)：&lt;br /&gt;&lt;ul&gt;&lt;li dragover="true"&gt;         &lt;a href="http://wargame.cna.ccu.edu.tw/index.php"&gt;台灣冒險傢俱樂部&lt;/a&gt;&lt;/li&gt;&lt;li dragover="true"&gt;&lt;a href="http://www.hackthissite.org/"&gt;Hack This Site&lt;/a&gt;  目前掛點，這個網站超好玩的&lt;br /&gt;&lt;/li&gt;&lt;li dragover="true"&gt;&lt;a href="http://hackerslab.cna.ccu.edu.tw/"&gt;台灣冒險傢俱樂部 Hackerslab&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;另外，有幾本書可以參考：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://search.books.com.tw/exep/prod_search.php?cat=all&amp;amp;key=chroot"&gt;CHROOT&lt;/a&gt; 我是看舊版的，不知新版的如何&lt;/li&gt;&lt;li&gt;&lt;a href="http://search.books.com.tw/exep/prod_search.php?key=hacking+exposed&amp;amp;x=0&amp;amp;y=0"&gt;Hacking exposed&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-4197104997240127341?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/4197104997240127341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=4197104997240127341' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4197104997240127341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4197104997240127341'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/07/wargame.html' title='Wargame'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-6619731269331050978</id><published>2008-06-19T10:50:00.009+08:00</published><updated>2008-06-20T15:33:04.985+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Investment'/><title type='text'>投資書：一個投機者的告白</title><content type='html'>&lt;a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010184756"&gt;一個投機者的告白&lt;/a&gt; by Andre Kostolany&lt;br /&gt;&lt;br /&gt;這本書我當個閒書來看，閒書就是看了會開心，大便無聊的時候可以，對於內容也不用太認真的書。以下是本書的書目及批眉：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. 金錢的魅力&lt;/span&gt;&lt;br /&gt;錢很重要，但不僅要懂得賺錢，更要懂得花錢，花錢是促進市埸活絡的重要因素，奢華是種美德。資本主義是原罪，卻很貼近人類的本性。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. 證券交易動物園&lt;/span&gt;&lt;br /&gt;8種在證交所的動物。&lt;br /&gt;成為一位投資者或投機者，投資者是證券市場的長跑者，投機者則介於證券玩家和投資者之間，投機家像新聞記者一樣，靠著自己追蹤收集來的新聞為生。新聞記者撰寫新聞，而投機家分析新聞，然後又必須像醫生一樣，作出診斷，投機者冒更大的風險獲取更大的暴利。&lt;br /&gt;經紀人 --&gt; 只管成交量 XDDDD&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. 憑什麼投資&lt;/span&gt;&lt;br /&gt;債券、外匯、原料、有形資產、房地產及股票。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. 奇幻的證券交易所&lt;/span&gt;&lt;br /&gt;作者對證交所的想法。能在證交所裡看到世界歷史的影子，這是一面扭曲的鏡子，能讀懂鏡子裡的人，就享有特權。證交所是經濟的溫度計(書裡說不是，換句話說對於投機者不是，投資者是)，雖然過程中會起起伏伏，但大方向仍與經濟發展相同。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. 指數有什麼道理&lt;/span&gt;&lt;br /&gt;指數就是會起起伏伏，這個起伏取決於供需原則。金錢的流動才會造成經濟成長。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6. 行情上漲的祕密(貨幣)&lt;/span&gt;&lt;br /&gt;貨幣+心理=趨勢。此章一直在討論利率調整、貨幣供給(外匯+利率)，與企業營運的關係。利率調整後，12個月之內會反應到股票指數，而此同時，債券會成為新寵。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7. 證券交易心理學(心理)&lt;/span&gt;&lt;br /&gt;固執的投資者與猶豫的投資者，固執的投資者具備四種要素：金錢、想法、耐心和運氣。科斯托蘭尼雞蛋。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8. 暴漲和崩盤是分不開的搭檔&lt;/span&gt;&lt;br /&gt;暴漲之後必拌隨著崩盤。這太多實例了，2000年的網路泡沫化、最近的滬股，都說明了這種情形。&lt;br /&gt;在閱讀這章時，有個地方看不太懂：當發生通貨緊縮，政府該如何對應？書上是寫讓幣值貶值，使得大家都能安心領得到錢(?)，但為何這會讓通貨緊縮的消失?(i.e.流通的現金增多)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9. 逆向是成功的要素&lt;/span&gt;&lt;br /&gt;做多不做空。&lt;br /&gt;如何判斷市場處於那個階段。(1)有利or不利消息與指數，(2)成交量與指數。&lt;br /&gt;有利消息，指數沒反應，行情高點的徵兆。不利消息，指數沒下跌，行情低點的徵兆。&lt;br /&gt;行情下跌，成交量大，股票轉移到固執的投資者手裡。成交量增加，行情下跌，接近下一次上漲的起點。成交量小，指數繼續下跌，市場前景堪慮。成交量愈來愈大，股票不斷看漲，市場前景堪慮。成交量小，指數看漲，情形有利。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10. 從預言家到顯示幕的訊息叢林&lt;/span&gt;&lt;br /&gt;最沒有意思的，就是那些和指數發展趨勢有關的訊息，這些都是先有指數，才有訊息的。&lt;br /&gt;既成事實的現象。既成事實--&gt;股價下跌。&lt;br /&gt;觀察新聞內的細節消息，並採取相對應的動作&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;11. 從證券交易所到交易股票&lt;/span&gt;&lt;br /&gt;投資最看重的是普遍的趨勢，其次才是選股。&lt;br /&gt;新興行業成「之」字型發展。(第一階段所有公司迅速發展，隨後淘汱不好的，剩下體質完整的公司)&lt;br /&gt;圖表可能賺錢，但肯定賠錢。可作為分析的其中一項依據，如雙重頂(m)或雙重底(w)。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;12. 用別人的錢交易的投機者&lt;/span&gt;&lt;br /&gt;基金、投資顧問、財產管理人。(老戲重提)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;13. 寫給敢做敢為的人&lt;/span&gt;&lt;br /&gt;十律與十戒。(我不想成為打字工，請自行翻書)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-6619731269331050978?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/6619731269331050978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=6619731269331050978' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6619731269331050978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/6619731269331050978'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/06/blog-post_19.html' title='投資書：一個投機者的告白'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-7029856266327306066</id><published>2008-06-19T10:18:00.002+08:00</published><updated>2008-06-19T10:50:47.904+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Investment'/><title type='text'>投資書單</title><content type='html'>研究生生活準備要告一個段落了，未來生活的目的，將會有一極大部分將會是為了賺更多的錢，也因此最近開始萌生投資的想法。在此之前，我已經投資了基金有2年之久，在去年次貸風暴之前，不論是各式的基金，其績效都還不錯，在次貸之後，一直到現在，績效一直不見好轉，於是我開始思考基金該如何投資才能有好的績效？其他的投資商品又該如何選擇？目前我打算先行藉著這一個月內的閱讀及觀察股票市場來加強自行判斷的能力，在這閱讀期間，會再挑選幾家有潛力的公司來觀察。以下是我預期要閱讀的書單，會選這些書是參考ptt stock版的一些長輩的文章，再加上自己在書店稍微翻一下決定的。&lt;br /&gt;&lt;br /&gt;第一批的投資書單：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010310342"&gt;操盤人教你看財務報表&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010318298"&gt;巴菲特勝券在握2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010400600"&gt;K線補習班：投資人的不敗祕笈&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010184756"&gt;一個投機者的告白&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;可能的第二批書單：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010396983"&gt;彼得林區選股戰略&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010373053"&gt;看見價值——巴菲特一直奉行的財富與人生哲學&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010244874"&gt;投機到投資谷月涵股市基本分析&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010383826"&gt;股價趨勢技術分析—典藏版（九版）(上)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010383831"&gt;股價趨勢技術分析—典藏版（九版）(下)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-7029856266327306066?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/7029856266327306066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=7029856266327306066' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7029856266327306066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7029856266327306066'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/06/blog-post.html' title='投資書單'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-3331109438835561932</id><published>2008-04-03T17:46:00.008+08:00</published><updated>2009-08-31T09:09:21.740+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>Make vim more powerful</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;在Linux下我最習慣使用的程式編輯環境是vim(我在windows很少寫程式)，或許過去習慣使用visual studio，Eclipse，Netbean或是相關IDE的人，會覺得怎麼會有人還會使用這種古董級的編程環境，它既難用，又少了一堆功能。但事實上真正會使用vim的人，他們的vim是可以比source insight這類的源碼追蹤環境還強大的。這篇文章我主要是來介紹「如何打造vim成為一個強大的編程環境」。這篇文章適合稍微對vim有一點瞭解的人來閱讀。&lt;br/&gt;&lt;br/&gt;在開始之前我先讓大家看一下我的vim視窗截圖&lt;br/&gt;&lt;a href='http://3.bp.blogspot.com/_WxXxOGW5qJM/R_Sq7zxlB6I/AAAAAAAABCo/M9D7qhwfJ8g/s1600-h/Screenshot-main.cpp+%28%7E-progs-stracker-src-skinstru2%29+-+GVIM1.png' onblur='try {parent.deselectBloggerImageGracefully();} catch(e) {}'&gt;&lt;img border='0' id='BLOGGER_PHOTO_ID_5184957015497443234' alt='' src='http://3.bp.blogspot.com/_WxXxOGW5qJM/R_Sq7zxlB6I/AAAAAAAABCo/M9D7qhwfJ8g/s320/Screenshot-main.cpp+%28%7E-progs-stracker-src-skinstru2%29+-+GVIM1.png' style='margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;'/&gt;&lt;/a&gt;這張圖內有幾個重點要觀察：&lt;br/&gt;&lt;ul&gt;&lt;li&gt;多檔編輯列表顯示在最上面的小視窗裡。&lt;/li&gt;&lt;li&gt;源碼有folding的功能，左邊中間的視窗。&lt;/li&gt;&lt;li&gt;字串搜尋的結果及編譯的訊息顯示在左下的視窗，這個視窗稱為quickfix window。&lt;/li&gt;&lt;li&gt;源碼的函式列表顯示在右邊視窗。&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;另外還有些功能是上圖沒顯示的：&lt;br/&gt;&lt;ul&gt;&lt;li dragover='true'&gt;源碼追蹤，這能讓你跳到你現在游標所在變數或函式的宣告或是定義的地方。&lt;/li&gt;&lt;li dragover='true'&gt;方便的瀏覽硬碟內的檔案並開啟。&lt;/li&gt;&lt;li dragover='true'&gt;源碼補齊，對於寫大專案很需要這種功能。&lt;/li&gt;&lt;/ul&gt;以下我將簡單介紹如何使用這些功能，詳細資訊請自己閱help document及&lt;a href='http://www.vim.org/'&gt;http://www.vim.org&lt;/a&gt; 有些快速鍵是以我的vimrc(vim設定檔，位於~/.vimrc)為基礎，所以有需的人可以參考我的&lt;a href='http://moon.cse.yzu.edu.tw/%7Es912356/vim_config.tbz'&gt;設定檔及plugin包&lt;/a&gt;。&lt;br/&gt;&lt;br/&gt;&lt;span style='font-size: 180%;'&gt;多檔編輯&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;這個功能是使用&lt;a href='http://www.vim.org/scripts/script.php?script_id=1338'&gt;tabBar&lt;/a&gt;的vim plugin，將該plugin下載並放在~/.vimrc/plugin/後，在多檔編輯時該視窗會自動跑出來。切換視窗的方法大略為Ctrl+Tab Ctrl+Shift+Tab 及 Alt+[number]。&lt;br/&gt;&lt;br/&gt;補充：在vim要開其他檔，可輸入:e 檔名來開啟其他檔。&lt;br/&gt;&lt;br/&gt;&lt;span style='font-size: 180%;'&gt;Folding&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;Folding又可以叫程式碼摺疊，這個功能是預設就有的，詳細指令可參考gvim裡的工具列Tools-&amp;gt;Folding，我平常不習慣使用這個功能，若要開啟我會設:set foldmethod=indent&lt;br/&gt;&lt;br/&gt;&lt;span style='font-size: 180%;'&gt;字串搜尋及編譯訊息列表&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;這兩項功能的訊息列表是放在quickfix window，開啟方式為:copen關閉為:cclose。我的快速鍵為F4。另外要跳到下一個及前一個訊息的指令為:cnext :cprev。我的快速鍵為Ctrl+n及Ctrl+p。&lt;br/&gt;字串搜尋的指令為:vimgrep [pattern] [file_list]。編譯的訊息，使用前提是你要有Makefile，編譯時只要打:make其訊息將自動放至quickfix裡。我的快速鍵為Ctrl+F3。&lt;br/&gt;&lt;span style='font-size: 180%;'&gt;&lt;br/&gt;函式列表&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;這是使用&lt;a href='http://www.vim.org/scripts/script.php?script_id=273'&gt;taglist&lt;/a&gt;這個plugin。我的快速鍵為F5。&lt;br/&gt;&lt;br/&gt;&lt;span style='font-size: 180%;'&gt;源碼追蹤&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;在vim裡必需有ctags檔案的技援，在使用前必需先安裝，在ubuntu內安裝很容易，在terminal輸入sudo apt-get install exuberant-ctags就安裝完了，產生該檔的指令有點複雜，在vim裡輸入":!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q ." 即可。我的快速鍵為Ctrl+F12。&lt;br/&gt;有了該檔案，在vim只要游標移到你想要查詢的函式或變數輸入Ctrl+]或Ctrl+t即可跳過去再跳回來，若是有同時找到多個類似keyword，你可以輸入:ts選擇你要跳那一個，或是當你已經跳過去了，想直接跳到下一個keyword可以輸入:tnext。&lt;br/&gt;另一種可能使用的情形是有些人想要直接開另一個window來看該keyword，這種情形可以使用&lt;a href='http://www.vim.org/scripts/script.php?script_id=2179'&gt;srcexplore&lt;/a&gt;這個plugin。我的快速鍵為F6。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style='font-size: 180%;'&gt;檔案列表&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;使用&lt;a href='http://www.vim.org/scripts/script.php?script_id=17'&gt;ls&lt;/a&gt;這個plugin，我的快速鍵為F2。&lt;br/&gt;&lt;br/&gt;&lt;span style='font-size: 180%;'&gt;源碼補齊&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;使用omnicppcomplete這個plugin，我平常不習慣用它，請大家自己參考plugin的網頁：&lt;br/&gt;&lt;a href='http://www.vim.org/scripts/script.php?script_id=1520'&gt;http://www.vim.org/scripts/script.php?script_id=1520&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style='font-size: 180%;'&gt;結論&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;其實vim還有很多很強大的功能，只是跟其他IDE比起來沒有一開就預設裝好，但藉著一些plugin，可以讓它擁有各式各樣的能力，此外，你還可以自行的修改它，讓它符合平常使用的習慣。這篇文章，主要介紹了一些plugin，主要是讓已熟悉使用vim的讀者們能更瞭解到vim的強大，並且將它運用在工作中，希望這篇文章能讓讀者們能更快快樂樂的用vim。&lt;br/&gt;&lt;br/&gt;&lt;span style='font-size: 180%;'&gt;參考資料&lt;/span&gt;&lt;br/&gt;&lt;ul dragover='true'&gt;&lt;li&gt;&lt;a href='http://greenisland.csie.nctu.edu.tw/wp/' dragover='true'&gt;紅塵一隅間拾得&lt;/a&gt;的&lt;a href='http://greenisland.csie.nctu.edu.tw/wp/category/comuter/vim/'&gt;vim&lt;/a&gt;文章&lt;/li&gt;&lt;li dragover='true'&gt;&lt;a href='http://edt1023.sayya.org/vim/' dragover='true'&gt;大家來學 Vim 一個歷久彌新的編輯器&lt;/a&gt;&lt;/li&gt;&lt;li dragover='true'&gt;&lt;a href='http://www.vim.org'&gt;vim official website&lt;/a&gt;&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-3331109438835561932?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/3331109438835561932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=3331109438835561932' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3331109438835561932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3331109438835561932'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/04/make-vim-more-powerful.html' title='Make vim more powerful'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_WxXxOGW5qJM/R_Sq7zxlB6I/AAAAAAAABCo/M9D7qhwfJ8g/s72-c/Screenshot-main.cpp+%28%7E-progs-stracker-src-skinstru2%29+-+GVIM1.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-4071774759289753708</id><published>2008-03-17T19:42:00.002+08:00</published><updated>2008-03-17T20:37:35.405+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>316綠營大遊行</title><content type='html'>這不是政治文，這絕對不是政治文。&lt;br /&gt;&lt;br /&gt;我的老闆是一位政治狂熱份子，每天的信箱總是會有固定幾封信是他寄來的，內容不外呼是馬19如何、國民黨又做什麼該死的事、要不然就是中國是如何的不好。不討論事實是如何，但這些行為多少都會有種催眠的效果。&lt;br /&gt;&lt;br /&gt;前幾天他更進一步的展現他的熱情，他邀請我們參加316大遊行，而我再過幾個月就要碩士口試，他的邀請就如同拿著刀子抵著我的脖子笑笑問我「你要不要來參加遊行」，「ok」，我只能很無耐的回答。姑且不論我是否是綠營支持者，但我是個阿宅，阿宅是不會參加這種活動的。&lt;br /&gt;&lt;br /&gt;當天早上，為了這個活動我從台北趕到新竹，回到新竹先吃個飯，吃完就睏了，睡了個小覺，睡到正爽，有個該死的電話吵醒了我，打開手機一看，心頭一涼「幹!!是老闆」，老闆很熱切的以為我到了找不到他們，還跟我說他們在那裡，我只能用很慌張的聲音說我還在路上&gt;_&lt;。掛上了電話，我只用了1分鐘的時間，整裝衝出了家門，一路狂飆到集合地，在路上己經有很多人集結了，在騎車的時候，阿妮一直跟別人比讚，大家都會回應我們，還滿好玩的。跟老師的集結地離學校有點遠，我騎了近20分鐘才到，到那還找了一下才找到他們。&lt;br /&gt;&lt;br /&gt;找到他們後，他們已經開始在往下一站的地方走了，而且不斷地跟遇到的人擊掌，擊掌的時候，還會說「加油」或「當選」之類的，因為我們走了好長一段距離，擊掌擊到手好酸，除了手酸外，一直在看跟我擊掌的是不是正妹，這應該是唯一的樂趣。&lt;br /&gt;&lt;br /&gt;整個活動大概就降，多多少少有一點感動到，但除了感動，究竟&lt;span style="font-weight: bold;font-size:130%;" &gt;誰當選對我最好，不是台灣不是其他人&lt;/span&gt;，而是我。這是我投下這一票所思考的，在心中我已經有了答案。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-4071774759289753708?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/4071774759289753708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=4071774759289753708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4071774759289753708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4071774759289753708'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/03/316.html' title='316綠營大遊行'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-2534286132699366171</id><published>2008-03-15T22:51:00.002+08:00</published><updated>2008-03-15T22:55:31.037+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>Gnucash: A personal finance tracking program</title><content type='html'>一個在Linux下的資金管理程式。&lt;br /&gt;&lt;br /&gt;有興趣的人可以看以下介紹：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;http://blog.xuite.net/michaelr/linux/16188248&lt;/li&gt;&lt;li&gt;http://blog.xuite.net/michaelr/linux/16196502&lt;/li&gt;&lt;li&gt;http://blog.xuite.net/michaelr/linux/16196596&lt;/li&gt;&lt;li&gt;http://blog.xuite.net/michaelr/linux/16196657&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-2534286132699366171?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/2534286132699366171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=2534286132699366171' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/2534286132699366171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/2534286132699366171'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/03/gnucash-personal-finance-tracking.html' title='Gnucash: A personal finance tracking program'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-2540499457818247271</id><published>2008-03-12T19:03:00.003+08:00</published><updated>2008-12-09T13:10:59.023+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Profiling tool: Valgrind with cachegrind</title><content type='html'>以下摘自官網：&lt;br /&gt;&lt;blockquote&gt;Valgrind is an  &lt;a href="http://valgrind.org/gallery/awards.html"&gt;award-winning&lt;/a&gt;  instrumentation framework for building dynamic analysis tools.  There are Valgrind tools that can automatically detect many memory management and threading bugs, and profile your programs in detail.  You can also use Valgrind to build new tools.&lt;/blockquote&gt;其中有個extension(skin)叫做cachegrind可用來做profile，而且還有qt-based的結果顯示介面，我做了個擷圖如下：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_WxXxOGW5qJM/R9e6p9j9qwI/AAAAAAAABCg/dWF6z6opxu4/s1600-h/k.png"&gt;&lt;img dragover="true" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_WxXxOGW5qJM/R9e6p9j9qwI/AAAAAAAABCg/dWF6z6opxu4/s320/k.png" alt="" id="BLOGGER_PHOTO_ID_5176811526748482306" border="0" /&gt;&lt;/a&gt;測試程式是apache。&lt;br /&gt;&lt;br /&gt;在ubuntu上安裝這些軟體很方便，全部都apt-get就行。感謝製作軟體、維護套件庫的大家。&lt;br /&gt;&lt;br /&gt;Ref.&lt;br /&gt;Valgrind &lt;a href="http://valgrind.org/"&gt;http://valgrind.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-2540499457818247271?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/2540499457818247271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=2540499457818247271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/2540499457818247271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/2540499457818247271'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/03/profiling-tool-valgrind-with-cachegrind.html' title='Profiling tool: Valgrind with cachegrind'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_WxXxOGW5qJM/R9e6p9j9qwI/AAAAAAAABCg/dWF6z6opxu4/s72-c/k.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-5157328053851919941</id><published>2008-03-12T18:45:00.004+08:00</published><updated>2008-03-12T19:27:24.879+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><title type='text'>Profiling Apache 1.3.34 using GProf</title><content type='html'>因為某些原因必需profile apache 1.3.34，其中與一般使用gprof不同的是編譯時要加特別的參數，我將過程紀錄如下，其中有些是pseudo code。&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;$ tar xvf apache1_3_34.tbz&lt;br /&gt;$ cd apache&lt;br /&gt;$ ./configure --prefix=/home/fcwu/apache/working --enable-module=rewrite --enable-module=proxy&lt;br /&gt;$ cat replace_cflags.sh&lt;br /&gt;   1  #!/bin/bash&lt;br /&gt;   2&lt;br /&gt;   3  TMP=`mktemp`&lt;br /&gt;   4  REPLACE="-pg -DGPROF -g -DNO_USE_SIGACTION -fno-stack-protector -fno-stack-protector-all"&lt;br /&gt;   5  #REPLACE="-pg -DGPROF -g -DNO_USE_SIGACTION -fno-stack-protector"&lt;br /&gt;   6  #REPLACE="-pg -DGPROF -g -DNO_USE_SIGACTION "&lt;br /&gt;   7&lt;br /&gt;   8  for file in `find src/ -name "Makefile"` ; do&lt;br /&gt;   9    echo "[Replace file=$file]"&lt;br /&gt;  10    grep -nH "^CFLAGS=" $file&lt;br /&gt;  11    sed "s/^CFLAGS=/&amp;amp; $REPLACE /" $file &gt; $TMP&lt;br /&gt;  12    cp $TMP $file&lt;br /&gt;  13    grep -nH "^CFLAGS=" $file&lt;br /&gt;  14  done&lt;br /&gt;  15&lt;br /&gt;  16  rm -f $TMP&lt;br /&gt;$ ./replace_cflags&lt;br /&gt;$ make&lt;br /&gt;$ cd src&lt;br /&gt;$ gcc -static -pg -g  -DLINUX=22 -DHAVE_SET_DUMPABLE -DNO_DBM_REWRITEMAP -DUSE_HSREGEX -g -pg `./apaci`   -rdynamic -o httpd buildmark.o modules.o modules/standard/mod_env.o modules/standard/mod_log_config.o modules/standard/mod_mime.o modules/standard/mod_negotiation.o modules/standard/mod_status.o modules/standard/mod_include.o modules/standard/mod_autoindex.o modules/standard/mod_dir.o modules/standard/mod_cgi.o modules/standard/mod_asis.o modules/standard/mod_imap.o modules/standard/mod_actions.o modules/standard/mod_userdir.o modules/standard/mod_alias.o modules/standard/mod_access.o modules/standard/mod_auth.o modules/standard/mod_setenvif.o main/alloc.o main/buff.o main/http_config.o main/http_core.o main/http_log.o main/http_main.o main/http_protocol.o main/http_request.o main/http_vhost.o main/util.o main/util_date.o main/util_script.o main/util_uri.o main/util_md5.o main/rfc1413.o os/unix/os.o os/unix/os-inline.o ap/ap_cpystrn.o ap/ap_execve.o ap/ap_fnmatch.o ap/ap_getpass.o ap/ap_md5c.o ap/ap_signal.o ap/ap_slack.o ap/ap_snprintf.o ap/ap_sha1.o ap/ap_checkpass.o ap/ap_base64.o ap/ap_ebcdic.o ap/ap_strtol.o regex/regcomp.o regex/regexec.o regex/regerror.o regex/regfree.o \&lt;br /&gt;modules/proxy/proxy_cache.o modules/proxy/proxy_connect.o modules/proxy/proxy_ftp.o modules/proxy/proxy_http.o modules/proxy/proxy_util.o modules/proxy/mod_proxy.o \&lt;br /&gt;modules/standard/mod_rewrite.o \&lt;br /&gt;-lm -lcrypt -lexpat -ldl -fno-stack-protector&lt;br /&gt;$ make install&lt;br /&gt;$ cd ~/apache/working/bin/&lt;br /&gt;$ ./httpd -X -f /home/fcwu/apache/working/conf/httpd.conf&lt;br /&gt;testing it&lt;br /&gt;$  gprof ./httpd ../logs/gmon.out&lt;/blockquote&gt;&lt;br /&gt;其中有個重點是在編譯apache時，要用幾個特別的define值："-DGPROF -DNO_USE_SIGACTION"。而為了讓gprof能work要加-pg的編譯參數，再為了讓時間的結果跑出來，必需用static的方式把所有的library以靜態的方式將所有想profile的部分編入(這就是我gcc很長長長的那一行)。&lt;br /&gt;&lt;br /&gt;另外有些小技巧像是find的使用，我在測時intensively使用，像是：&lt;br /&gt;&lt;blockquote&gt;find ~ -name "gmon.out" -exec ls -al {} \;&lt;br /&gt;find ~ -name "gmon.out" -exec rm -i {} \;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-5157328053851919941?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/5157328053851919941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=5157328053851919941' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5157328053851919941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5157328053851919941'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/03/profiling-apache-1334-using-gprof.html' title='Profiling Apache 1.3.34 using GProf'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-8158820454158685417</id><published>2008-03-07T16:30:00.003+08:00</published><updated>2008-03-07T17:14:47.293+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Diary'/><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>Busy and painful work</title><content type='html'>太久沒更新blog了，主要是因為忙著寫我的SocketTracker for thesis以及Chapter 1。&lt;br /&gt;&lt;br /&gt;寫程式是件愉快的事，而且上個禮拜解決很多好玩的問題，像是記錄在system call被呼叫時，user program最後執行EIP位置，以及一些kernel hacking。&lt;br /&gt;&lt;br /&gt;另一件事，寫Chapter 1就是件痛苦的事，真的很痛苦，一週我才有辦法寫個4面左右，問題不是出在英文，而是我這個人天生話少，一打開word又是坐在電腦前，什麼都不想做。&lt;br /&gt;( 我不是想用word寫論文，而是範本就是給我word，如果要換成openoffice會很麻煩，而且老師也不好review)&lt;br /&gt;&lt;br /&gt;接下來還要繼續痛苦下去。&lt;br /&gt;&lt;br /&gt;除此之外，最近打算參加2個talk。一個是jserv給的&lt;a href="http://blog.linux.org.tw/%7Ejserv/archives/001975.html"&gt;快快樂樂學GDB&lt;/a&gt;，另一個是&lt;a href="http://osdc.tw/"&gt;OSDC&lt;/a&gt;的conference。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-8158820454158685417?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/8158820454158685417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=8158820454158685417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/8158820454158685417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/8158820454158685417'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/03/busy-and-painful-work.html' title='Busy and painful work'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-4820823069161353048</id><published>2008-02-12T10:22:00.000+08:00</published><updated>2008-02-12T10:26:50.825+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Simple UDP server in kernel space with kernel thread</title><content type='html'>在Fred's blog看到的&lt;br /&gt;&lt;br /&gt;&lt;a href="http://kernelnewbies.org/Simple_UDP_Server" target="_blank"&gt;Simple UDP Server in Kernel-space&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://br.kernelnewbies.org/docs/modulos_guia.html#threads"&gt;Web Server in kernel-space&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;在這兩個例子可以看到如何在kernel裡撰寫網路程式以及如何使用kernel thread&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-4820823069161353048?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/4820823069161353048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=4820823069161353048' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4820823069161353048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4820823069161353048'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/02/simple-udp-server-in-kernel-space-with.html' title='Simple UDP server in kernel space with kernel thread'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-5847142627903679730</id><published>2008-02-09T05:07:00.000+08:00</published><updated>2008-02-09T05:27:14.604+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><title type='text'>Delete duplicate row without disarranging original order</title><content type='html'>這是在&lt;a href="telnet://ptt.cc"&gt;ptt&lt;/a&gt;的linux版看到的討論串，還蠻有趣的，有許多不同的語言作法。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;問題&lt;/span&gt;&lt;br /&gt;$ cat file.txt&lt;br /&gt;00120&lt;br /&gt;00345&lt;br /&gt;00345&lt;br /&gt;00567&lt;br /&gt;00789&lt;br /&gt;00789&lt;br /&gt;&lt;br /&gt;請問如何將重複的列刪除，變成下面這樣:&lt;br /&gt;00120&lt;br /&gt;00345&lt;br /&gt;00567&lt;br /&gt;00789&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Linux command (by kenduest) &lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;cat -n test.txt  | sort -k 2 -n -u | sort -k 1 -n | cut -f 2&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Bash (by FourDollars)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;#!/usr/bin/env bash&lt;br /&gt;&lt;br /&gt;declare -a db&lt;br /&gt;declare -i index=0&lt;br /&gt;&lt;br /&gt;cat file.txt | while read line; do&lt;br /&gt;  if ! echo ${db[*]} | grep $line &gt; /dev/null; then&lt;br /&gt;      db[$((index++))]="$line"&lt;br /&gt;      echo "$line"&lt;br /&gt;  fi&lt;br /&gt;done&lt;/blockquote&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Perl (by OuTian)&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;cat test.txt | perl -ne 'print unless($s{$_}++)'&lt;/blockquote&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;C (by HZYSoft)&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;stdio.h&gt;&lt;stdlib.h&gt;&lt;string.h&gt;/* File:    remove_dup.c: Remove duplicated string in a file.&lt;br /&gt;   Author:  PCMan (C) 2008.02.08&lt;br /&gt;   License: GNU GPL V2 */&lt;br /&gt;&lt;br /&gt;#include &amp;lt;stdio.h&lt;/string.h&gt;&lt;/stdlib.h&gt;&lt;/stdio.h&gt;&amp;gt;&lt;br /&gt;&lt;stdio.h&gt;&lt;stdlib.h&gt;&lt;string.h&gt;#include &lt;/string.h&gt;&lt;/stdlib.h&gt;&lt;/stdio.h&gt;&amp;lt;&lt;stdio.h&gt;&lt;stdlib.h&gt;&lt;string.h&gt;stdlib.h&lt;/string.h&gt;&lt;/stdlib.h&gt;&lt;/stdio.h&gt;&amp;gt;&lt;br /&gt;&lt;stdio.h&gt;&lt;stdlib.h&gt;&lt;string.h&gt;#include &lt;/string.h&gt;&lt;/stdlib.h&gt;&lt;/stdio.h&gt;&amp;lt;&lt;stdio.h&gt;&lt;stdlib.h&gt;&lt;string.h&gt;string.h&lt;/string.h&gt;&lt;/stdlib.h&gt;&lt;/stdio.h&gt;&amp;gt;&lt;br /&gt;&lt;stdio.h&gt;&lt;stdlib.h&gt;&lt;string.h&gt;int main( int argc, char** argv ) {&lt;br /&gt;    int i, j, n, buf_size = 1024;&lt;br /&gt;    char **strv, line[1024];&lt;br /&gt;    FILE *f;&lt;br /&gt;    if( ! (f = fopen( argv[1], "r" )) )  return 1;&lt;br /&gt;    strv = (char**)malloc(buf_size * sizeof(char*) );&lt;br /&gt;    for( n = 0; fgets( line, sizeof(line), f ); ++n ) {&lt;br /&gt;        if( n &gt;= buf_size ) {&lt;br /&gt;            buf_size += 1024;&lt;br /&gt;            strv = (char**)realloc( strv, buf_size );&lt;br /&gt;        }&lt;br /&gt;        strv[n] = strdup( line );&lt;br /&gt;    }&lt;br /&gt;    fclose(f);&lt;br /&gt;    for( i = 0; i &lt; n; ++i ) {&lt;br /&gt;        for( j = i + 1; j &lt; n; ) {&lt;br /&gt;            if( 0 == strcmp( strv[i], strv[j] ) ) {&lt;br /&gt;                free( strv[j] );&lt;br /&gt;#ifdef KEEP_ORDER /* 如果保持原有順序 */&lt;br /&gt;                memcpy( &amp;amp;strv[j], &amp;amp;strv[j+1], sizeof(char*) * (n-j-1) );&lt;br /&gt;#else   /* 如果不管順序，這樣速度會快很多 */&lt;br /&gt;                strv[j] = strv[n - 1];&lt;br /&gt;#endif&lt;br /&gt;                --n;&lt;br /&gt;            }&lt;br /&gt;            else {&lt;br /&gt;                ++j;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    if( ! (f = fopen( argv[1], "w" )) )  return 1;&lt;br /&gt;    for( i = 0; i &lt; n; ++i ) {&lt;br /&gt;        fputs( strv[i], f );&lt;br /&gt;        free( strv[i] );&lt;br /&gt;    }&lt;br /&gt;    fclose( f );&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/string.h&gt;&lt;/stdlib.h&gt;&lt;/stdio.h&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-5847142627903679730?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/5847142627903679730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=5847142627903679730' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5847142627903679730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5847142627903679730'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/02/delete-duplicate-row-without.html' title='Delete duplicate row without disarranging original order'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-5540106617251825325</id><published>2008-02-07T23:29:00.000+08:00</published><updated>2008-02-07T23:45:57.799+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><title type='text'>Difference between __cdecl and __stdcall</title><content type='html'>在呼叫函式的前，程式必需先將參數放到stack裡，隨後在函式執行完後，這些參數若是由caller負責清除則稱為__cdecl，反之若是callee負責則為__stdcall。&lt;br /&gt;&lt;br /&gt;他們有以下的不同點及討論：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;__stdcall的呼叫，程式大小會比較小一點。&lt;/li&gt;&lt;li&gt;printf這類不定量的參數的函式，只能使用__cdecl的呼叫&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Reference.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://whatilearned2day.wordpress.com/2007/04/13/__cdecl-and-__stdcall/"&gt;__cdecl and __stdcall&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.unixwiz.net/techtips/win32-callconv-asm.html"&gt;Intel x86 Function-call Conventions - Assembly View&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.unixwiz.net/techtips/win32-callconv.html"&gt;Using Win32 calling conventions&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-5540106617251825325?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/5540106617251825325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=5540106617251825325' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5540106617251825325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/5540106617251825325'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/02/difference-between-cdecl-and-stdcall.html' title='Difference between __cdecl and __stdcall'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-7116108656604494645</id><published>2008-02-07T20:48:00.000+08:00</published><updated>2008-02-07T22:59:10.788+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Diary'/><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>Happy lunar new year!?</title><content type='html'>今年的農曆年過得比以往較不同，一來是放假的時間沒有像快樂的大學生，以及無憂無慮的研一來的長，二來是在過外的老師沒有過中國年，想當然，我們這些研究生也別想過年。過年期間要煩惱的事有一堆，隨便舉就有論文數據有問題、SocketTracker的實驗要做、論文outline、老師叫我寫的paper要改，隨便舉舉就一堆，根本就快樂不起來。&lt;br /&gt;&lt;br /&gt;雖然很多事情要煩，但是該訂的電動還是一個也不能少，這次年假的主力放在2個遊戲，一個是&lt;a href="http://wii.orz.tw/?msel=detail&amp;amp;f_id=225&amp;amp;f_key=0&amp;amp;f_que=umbrella&amp;amp;f_que_mode=&amp;amp;f_order_fd=w02&amp;amp;f_order_md=desc&amp;amp;tT=07230522"&gt;Biohazared Umbrella&lt;/a&gt;，另一個是&lt;a href="http://wii.orz.tw/?msel=detail&amp;amp;f_id=228&amp;amp;f_key=0&amp;amp;f_que=Mario&amp;amp;f_que_mode=&amp;amp;f_order_fd=w02&amp;amp;f_order_md=desc&amp;amp;tT=07230635"&gt;瑪力歐的北京奧運&lt;/a&gt;的遊戲。Bio那款打到後來很想要有個什麼密技之類的，最後看到有人說只要所有scenario的chapter Hard等級打到Rank S就可以有無限彈，在我的不眠不休的實驗，結論"不可能"，在無技可施之下我只好去找別人已經都打到S的存檔，再複製到我的Wii裡，有了無限彈，打起來真的很爽，但是卻好像少了點樂趣。另一款北京奧運的遊戲我也很推薦，家裡有Wii的人可以買來玩。&lt;br /&gt;&lt;br /&gt;今年過年大概就在打電動吃東西中渡過。當然，為了初六要跟老師meeting，現在要開始改paper了。好痛苦喔。&lt;br /&gt;&lt;br /&gt;(好混的日記)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-7116108656604494645?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/7116108656604494645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=7116108656604494645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7116108656604494645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7116108656604494645'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/02/happy-lunar-new-year.html' title='Happy lunar new year!?'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-1136299381591658179</id><published>2008-02-07T15:39:00.000+08:00</published><updated>2008-02-07T15:46:39.930+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><title type='text'>2007 Turing Award</title><content type='html'>I think Turing Award is an important award for whom had great contribution towards computer science. However, it seem less people discussed it in Taiwan.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Edmund M. Clarke, E. Allen Emerson, and Joseph Sifakis are the recipients of the 2007 A.M. Turing Award for their work on an automated method for finding design errors in computer hardware and software.&lt;br /&gt;&lt;br /&gt;The method, called Model Checking, is the most widely used technique for detecting and diagnosing errors in complex hardware and software design. It has helped to improve the reliability of complex computer chips, systems and networks. &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Original article &lt;a href="http://www.ddj.com/206103622?cid=RSSfeed_DDJ_All"&gt;Dr.Dobb 2007 Turing Award Winners Announced&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-1136299381591658179?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/1136299381591658179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=1136299381591658179' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/1136299381591658179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/1136299381591658179'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/02/2007-turing-award.html' title='2007 Turing Award'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-3816675738646065334</id><published>2008-01-30T17:16:00.000+08:00</published><updated>2008-01-30T17:26:03.766+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Drama'/><title type='text'>Japan drama in winter '07. Vol 2.</title><content type='html'>到今天為止冬季日劇都已經演個2~3集了，推薦度也有所變更，之前我一直以為我是個劇情取向的人，不是個卡司取向或是xx取向，但是看到現在，結論是.....我是正妹取向 科科&lt;br /&gt;&lt;br /&gt;以下是由推薦到不推薦的排序：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SP (11集完)&lt;/li&gt;&lt;li&gt;沒有玫瑰的花店 (竹內結子跟釋由美子超正)&lt;/li&gt;&lt;li&gt;談判專家 (米倉涼子身材超好)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;明天的喜多善男 (小忍魂)&lt;/li&gt;&lt;li&gt;蜂蜜與四葉草 (內有正妹，請進)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;愛迪生之母 (這部在看劇情)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;齊藤太太 (觀月亞理莎太老了，不合我胃口)&lt;/li&gt;&lt;/ul&gt;以下提不起勁來看：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;一磅的福音&lt;br /&gt;&lt;/li&gt;&lt;li&gt;未來老師(雖然深田恭子很可愛，但劇情太爛)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-3816675738646065334?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/3816675738646065334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=3816675738646065334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3816675738646065334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3816675738646065334'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/01/japan-drama-in-winter-07-vol-2.html' title='Japan drama in winter &apos;07. Vol 2.'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-2403824386600584783</id><published>2008-01-29T16:37:00.000+08:00</published><updated>2008-01-30T13:51:14.663+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='embedded'/><title type='text'>Porting linphone to PXA270</title><content type='html'>&lt;span style="font-weight: bold;font-size:180%;" &gt;前言&lt;/span&gt;&lt;br /&gt;最近在幫別人做embeded system design的期末作業，這作業主要是要讓板子pxa270能有網路電話的功能voip。&lt;br /&gt;&lt;br /&gt;我嘗試了兩套softphone，分別為pjsip及linphone，就這兩套來講那一套比較適合拿來開發我會推薦使用pjsip，主要是因它是提供了一套library來讓開發者使用，所以對於往後的ui開發，需要增加自己的額外功能時，pjsip一定是首選。&lt;br /&gt;&lt;br /&gt;然而，我們這次作業並沒有使用pjsip，是因pjsip我們cross-compiler完後，使用它的voip功能，電話播通後卻無法成功將聲音播出或送出去，但直接使用其library放音卻可以。&lt;br /&gt;&lt;br /&gt;最後我們放棄使用pjsip，改換成linphone來porting，linphone有為需要cross-compile的人寫了一份參考文件，但該文件略嫌簡略，又有些地方有誤，故我將compile經過重新記錄一次，以供大家參考。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Porting過程&lt;/span&gt;&lt;br /&gt;在porting前必需先將需要幾個dependency package抓好(依編譯順序排列)：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;readline-5.2&lt;/li&gt;&lt;li&gt;ncurses-5.6&lt;/li&gt;&lt;li&gt;libosip2-3.0.3&lt;/li&gt;&lt;li&gt;libeXosip2-3.0.3&lt;/li&gt;&lt;li&gt;libogg-1.1.3&lt;/li&gt;&lt;li&gt;speex-1.2beta3&lt;/li&gt;&lt;li&gt;linphone-2.0.1&lt;/li&gt;&lt;/ul&gt;首先，先設定一些環境變數&lt;br /&gt;&lt;blockquote&gt;export ARM_INSTALL_TREE=/home/timy/armbuild&lt;br /&gt;export PATH=$PATH:/opt/microtime/pro/devkit/arm/pxa270/gcc-4.0.2-glibc-2.3.3/arm-unknown-linux-gnu/bin&lt;/blockquote&gt;開始編譯：&lt;br /&gt;Cross compiling ncurses for ARM:&lt;br /&gt;********************************&lt;br /&gt;&lt;blockquote&gt;./configure --prefix=/usr --host=arm-linux --with-gnu-ld --with-shared&lt;br /&gt;make&lt;br /&gt;make install DESTDIR=$ARM_INSTALL_TREE&lt;br /&gt;make install DESTDIR=`pwd`/armbuild&lt;br /&gt;&lt;/blockquote&gt;Cross compiling readline for ARM:&lt;br /&gt;*********************************&lt;br /&gt;&lt;blockquote&gt;./configure --prefix=/usr --host=arm-unknown-linux-gnu --with-gnu-ld --disable-static&lt;br /&gt;make&lt;br /&gt;make install DESTDIR=$ARM_INSTALL_TREE&lt;br /&gt;make install DESTDIR=`pwd`/armbuild&lt;br /&gt;&lt;/blockquote&gt;Cross compiling libosip for ARM:&lt;br /&gt;********************************&lt;br /&gt;&lt;blockquote&gt;./configure --prefix=/usr --host=arm-unknown-linux-gnu --with-gnu-ld --disable-static&lt;br /&gt;make&lt;br /&gt;make install DESTDIR=$ARM_INSTALL_TREE&lt;br /&gt;make install DESTDIR=`pwd`/armbuild&lt;br /&gt;&lt;/blockquote&gt;Cross compiling libeOsip for ARM:&lt;br /&gt;********************************&lt;br /&gt;&lt;blockquote&gt;./configure --prefix=/usr --host=arm-unknown-linux-gnu --with-gnu-ld --disable-static CFLAGS=-I$ARM_INSTALL_TREE/usr/include LDFLAGS=-L$ARM_INSTALL_TREE/usr/lib&lt;br /&gt;make&lt;br /&gt;make install DESTDIR=$ARM_INSTALL_TREE&lt;br /&gt;make install DESTDIR=`pwd`/armbuild&lt;/blockquote&gt;Cross compiling libogg for ARM:&lt;br /&gt;********************************&lt;br /&gt;&lt;blockquote&gt;./configure --prefix=/usr --host=arm-unknown-linux-gnu --with-gnu-ld --disable-static&lt;br /&gt;make&lt;br /&gt;make install DESTDIR=$ARM_INSTALL_TREE&lt;br /&gt; make install DESTDIR=`pwd`/armbuild&lt;/blockquote&gt;&lt;br /&gt;Cross compiling speex for ARM:&lt;br /&gt;********************************&lt;br /&gt;First you need to remove ogg headers from your build system to avoid a dirty conflict between your build machine binaries and the arm binaries. They are usually in a libogg-dev package (rpm or deb).&lt;br /&gt;Then:&lt;br /&gt;&lt;blockquote&gt;./configure --prefix=/usr --host=arm-unknown-linux-gnu --with-gnu-ld --disable-static --enable-arm-asm CFLAGS=-I$ARM_INSTALL_TREE/usr/include LDFLAGS=-L$ARM_INSTALL_TREE/usr/lib&lt;br /&gt;make&lt;br /&gt;make install DESTDIR=$ARM_INSTALL_TREE&lt;br /&gt;make install DESTDIR=`pwd`/armbuild&lt;br /&gt;&lt;/blockquote&gt;Cross compiling linphone for ARM&lt;br /&gt;********************************&lt;br /&gt;First you need to remove all .la files from the ARM_INSTALL_TREE because it confuses libtool and makes&lt;br /&gt;the linker use your build machine binaries instead of the arm-crosscompiled ones.&lt;br /&gt;&lt;blockquote&gt;rm -f $ARM_INSTALL_TREE/usr/lib/*.la&lt;br /&gt;&lt;/blockquote&gt;#for some reason pkg-config doesn't like cross-compiling...&lt;br /&gt;&lt;blockquote&gt;export PKG_CONFIG=/usr/bin/pkg-config./configure --prefix=/usr \&lt;br /&gt; --host=arm-unknown-linux-gnu \&lt;br /&gt; --with-osip=$ARM_INSTALL_TREE/usr \&lt;br /&gt; --with-readline=$ARM_INSTALL_TREE/usr \&lt;br /&gt; --includedir=$ARM_INSTALL_TREE/usr/include \&lt;br /&gt; --enable-gtk_ui=no \&lt;br /&gt; --enable-console_ui=yes \&lt;br /&gt; --includedir=$ARM_INSTALL_TREE/usr/include \&lt;br /&gt; --disable-video \&lt;br /&gt; SPEEX_CFLAGS="-I$ARM_INSTALL_TREE/usr/include" \&lt;br /&gt; SPEEX_LIBS="-L$ARM_INSTALL_TREE/usr/lib -lspeex -lspeexdsp"  \&lt;br /&gt; LDFLAGS="-L$ARM_INSTALL_TREE/usr/lib" \&lt;br /&gt; LIBS="-leXosip2 -losip2 -losipparser2" \&lt;br /&gt; CFLAGS="-I$ARM_INSTALL_TREE/usr/include"&lt;br /&gt;make&lt;br /&gt;make install DESTDIR='pwd'/armbuild&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;問題與討論&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;configure或compile時出現錯誤 T_T&lt;/span&gt;&lt;br /&gt;遇到錯誤時，我的處理方法大都是：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;判斷錯誤發生原因，藉由：&lt;/li&gt;&lt;ul&gt;&lt;li&gt;螢幕上的輸出&lt;/li&gt;&lt;li&gt;log檔(for example, config.log)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;重製錯誤(configure錯誤可以跳過此步)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;稍後會有詳細解說&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;解決問題&lt;/li&gt;&lt;ul&gt;&lt;li&gt;大部分的問題皆是修改CFLAGS, LIBS, LDFALGS這幾個參數，至於這幾個參數的用處，請自己google一下gcc的compile教學，或是問人會比較快。&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;底下我將舉一個make時發生的錯誤，這是在編linphone時發生的錯誤：&lt;br /&gt;&lt;blockquote&gt;gcc -shared  .libs/linphonecore.o .libs/exevents.o .libs/misc.o .libs/enum.o .libs/sdphandler.o .libs/presence.o .libs/proxy.o .libs/friend.o .libs/authentication.o .libs/lpconfig.o .libs/chat.o .libs/general_state.o  -Wl,--rpath -Wl,/home/fcwu/arm/src/linphone-2.0.1/mediastreamer2/src/.libs -Wl,--rpath -Wl,/home/fcwu/arm/usr/lib -leXosip2 -losipparser2 -losip2 ../mediastreamer2/src/.libs/libmediastreamer.so  -Wl,-soname -Wl,liblinphone.so.2 -o .libs/liblinphone.so.2.0.1&lt;br /&gt;/usr/bin/ld: cannot find -leXosip2&lt;br /&gt;collect2: ld returned 1 exit status&lt;br /&gt;make[2]: *** [liblinphone.la] Error 1&lt;br /&gt;make[2]: Leaving directory `/home/fcwu/arm/src/linphone-2.0.1/coreapi'&lt;/blockquote&gt;從倒數第4行可以看到ld(linker)找不到libeXosip2.so，我第一個假設會是"尋找library的路徑"設定有錯，換句話說就是LDFLAGS有問題，為了證實確實是發生這問題，我們可以到/home/fcwu/arm/src/linphone-2.0.1/coreapi目錄下輸入arm-linux那行(第一行)看看會不會產生這個錯誤，若確實產生這個錯誤再append "-L/home/fcwu/arm/usr/lib"，看看問題是否解決。等確定無誤後，重新./configure一次，並加入LDFALGS="-L/home/fcwu/arm/usr/lib"即可。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;../coreapi/.libs/liblinphone.so: undefined reference to `ms_alsa_card_new_custom'&lt;/span&gt;&lt;br /&gt;參考&lt;a href="http://www.mail-archive.com/linphone-users@nongnu.org/msg01437.html"&gt;這個討論串&lt;/a&gt;裡的diff檔，修改即可。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;出現asm...的錯誤&lt;/span&gt;&lt;br /&gt;這是由於arm-linux-gcc不支援inline assembly的某些寫法(?)造成了。解法我是移植Linux kernel source code裡的include/asm-arm/裡的__FD_ZERO等4個micro到compiling的機器上的/usr/include/sys/select.h(應該是這個位置)。&lt;br /&gt;這個問題應該有更好的解法，但是我很懶。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;參考資料&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Linphone的porting，可以參考以下幾個文件：&lt;/li&gt;&lt;li&gt;在linphone資料匣內的README.arm(最重要)&lt;/li&gt;&lt;li&gt;在linphone資料匣內的README.arm&lt;/li&gt;&lt;li&gt;在linphone資料匣內的INSTALL&lt;/li&gt;&lt;li&gt;./configure --help&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-2403824386600584783?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/2403824386600584783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=2403824386600584783' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/2403824386600584783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/2403824386600584783'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/01/porting-linphone-to-pxa270.html' title='Porting linphone to PXA270'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-414751245198656938</id><published>2008-01-26T15:54:00.000+08:00</published><updated>2008-12-09T13:10:59.244+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>Lunch today: steamed bread</title><content type='html'>steamed bread是刈包，如下圖：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_WxXxOGW5qJM/R5roGsMYP9I/AAAAAAAABB4/lBfjRGe7RQ4/s1600-h/DSC01367.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_WxXxOGW5qJM/R5roGsMYP9I/AAAAAAAABB4/lBfjRGe7RQ4/s320/DSC01367.JPG" alt="" id="BLOGGER_PHOTO_ID_5159691524746264530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;加1塊入口即化的豆腐(魯過的)、一塊素肉、一些花生粉、一些起士口味的素肉鬆、一些酸菜及香菜。我只能說：太好吃了....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-414751245198656938?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/414751245198656938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=414751245198656938' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/414751245198656938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/414751245198656938'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/01/lunch-today-steamed-bread.html' title='Lunch today: steamed bread'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_WxXxOGW5qJM/R5roGsMYP9I/AAAAAAAABB4/lBfjRGe7RQ4/s72-c/DSC01367.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-3653331940919336560</id><published>2008-01-26T14:04:00.000+08:00</published><updated>2008-01-26T14:25:46.850+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>Timy time: Hula hoop of WiiFit</title><content type='html'>Cute Timy came my home to play hula loop of WiiFit.&lt;br /&gt;&lt;br /&gt;Timy was playing...&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-97192142f22b5c63" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v7.nonxt2.googlevideo.com/videoplayback?id%3D97192142f22b5c63%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331565871%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D271EBE6D424863F830E87D5064958A43B0EB3637.1159DD7E37042759B2DA64CFC845ACB163446CB8%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D97192142f22b5c63%26offsetms%3D5000%26itag%3Dw160%26sigh%3D3RK1waT-eLTWNUJvC2bamAXWU1U&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v7.nonxt2.googlevideo.com/videoplayback?id%3D97192142f22b5c63%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331565871%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D271EBE6D424863F830E87D5064958A43B0EB3637.1159DD7E37042759B2DA64CFC845ACB163446CB8%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D97192142f22b5c63%26offsetms%3D5000%26itag%3Dw160%26sigh%3D3RK1waT-eLTWNUJvC2bamAXWU1U&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Rickey was play...&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-b16ee3c4210de00" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v11.nonxt6.googlevideo.com/videoplayback?id%3D0b16ee3c4210de00%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331565871%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D143859583CC7E5D2C7024870C7BE0F6BBFC41171.67AA628A404D6FFD9EDDF67F03E939F535BF2783%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Db16ee3c4210de00%26offsetms%3D5000%26itag%3Dw160%26sigh%3DLKviKMmn6gJUStJQg2eTvlGTK5k&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v11.nonxt6.googlevideo.com/videoplayback?id%3D0b16ee3c4210de00%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331565871%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D143859583CC7E5D2C7024870C7BE0F6BBFC41171.67AA628A404D6FFD9EDDF67F03E939F535BF2783%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Db16ee3c4210de00%26offsetms%3D5000%26itag%3Dw160%26sigh%3DLKviKMmn6gJUStJQg2eTvlGTK5k&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-3653331940919336560?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=97192142f22b5c63&amp;type=video%2Fmp4' length='0'/><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=b16ee3c4210de00&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/3653331940919336560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=3653331940919336560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3653331940919336560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3653331940919336560'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/01/timy-time-hula-hoop-of-wiifit.html' title='Timy time: Hula hoop of WiiFit'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-7527858324375676522</id><published>2008-01-24T12:24:00.000+08:00</published><updated>2008-01-24T12:29:27.656+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='Hacking'/><title type='text'>BackTrack: hacking tool</title><content type='html'>BackTrack: the highly popular and regarded Linux Security Distro for ethical hackers&lt;br /&gt;&lt;br /&gt;Get the demo video &lt;a href="http://www.ethicalhacker.net/content/view/167/2/" target="_blank"&gt;http://www.ethicalhacker.net&lt;wbr&gt;/content/view/167/2/&lt;/a&gt;&lt;br /&gt;I was so shocked by how easy to steal wlan password, hack gmail account, and invade someone computer.&lt;br /&gt;&lt;br /&gt;Official site: &lt;a href="http://www.remote-exploit.org/"&gt;Remote-Exploit&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-7527858324375676522?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/7527858324375676522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=7527858324375676522' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7527858324375676522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/7527858324375676522'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/01/backtrack-hacking-tool.html' title='BackTrack: hacking tool'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-3651586235629242256</id><published>2008-01-24T12:16:00.000+08:00</published><updated>2008-01-24T12:40:53.418+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer'/><category scheme='http://www.blogger.com/atom/ns#' term='Graphic'/><title type='text'>Seam Carving</title><content type='html'>剛才看到的一篇很好玩的影像處理技術。這種技術可以找到圖片裡不重要的橫軸或縱軸加以刪除，讓圖片能夠只縮長度或寬度並且看起來像是等比例的縮(不會失真)。這種方法又可以叫Retarget。&lt;br /&gt;&lt;br /&gt;&lt;a dragover="true" href="http://www.youtube.com/watch?v=6NcIJXTlugc"&gt;Image resizing by seam carsing (YouTube)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://plog.longwin.com.tw/news-technology/2008/01/24/gimp_image_liquid_rescale_resize_2008"&gt;原文&lt;/a&gt;，是從&lt;a href="http://plog.longwin.com.tw/"&gt;Tsung's Blog&lt;/a&gt;出來的。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-3651586235629242256?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/3651586235629242256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=3651586235629242256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3651586235629242256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3651586235629242256'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/01/seam-carving.html' title='Seam Carving'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-3305119277815111200</id><published>2008-01-22T18:45:00.000+08:00</published><updated>2008-01-22T19:23:09.431+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Diary'/><title type='text'>paper, vulnerability sensor</title><content type='html'>Vulnerability sensor，這是最近在趕的paper，老師叫我負責寫的部分有introduction，related works及最後的reference，其他部分是由william，工程師來寫，而老師是做最後的修訂。&lt;br /&gt;&lt;br /&gt;就我寫的部分，related works是比較不好寫的部分，在這裡我大概引用了20篇文章。在寫之前，首先我對他們做了分類，接下來再將這20篇的文章以優缺點的方法加以貫通。有時為了將一篇文章用簡單的1至2句話來說明，光是1句話就必需想很久，因為寫之前一定要對該文有基本的了解。&lt;br /&gt;&lt;br /&gt;趕這篇文章大概花了5個工作天，這幾天幾乎都沒什麼睡，醒著的時候都在寫，實在是很痛苦。如今，寫完了，真是一整個痛快。&lt;br /&gt;&lt;br /&gt;接下來還有很多事要做：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;1/25 論文計畫書&lt;/li&gt;&lt;li&gt;1/31 論文outline&lt;/li&gt;&lt;li&gt;1/31 實驗數據 (will miss deadline certainly)&lt;/li&gt;&lt;li&gt;2/?? 書的初稿&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;實驗數據我一定會miss first deadline，追根就底，會miss絕大是因為老師叫我幫他寫paper。當然，如果miss deadline，不會怎樣就算了，但是老師前幾天還寄信來說：你們這些碩二的如果有誰miss deadline，第一次，你們會受到10-10的處罰(早上10前到實驗室，晚上10點後才能離開)，第二次，扣你們的薪水。收到那封信時，當埸想回信罵他。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-3305119277815111200?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/3305119277815111200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=3305119277815111200' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3305119277815111200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/3305119277815111200'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/01/paper-vulnerability-sensor.html' title='paper, vulnerability sensor'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-4571783303779103618</id><published>2008-01-17T19:58:00.000+08:00</published><updated>2008-01-17T20:35:43.092+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Drama'/><title type='text'>Japan drama in winter '07. Vol 1.</title><content type='html'>目前正在追的2007冬季日劇(以我進薦程式來排序，推-&gt;不推)：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SP&lt;br /&gt;要人警護官，由岡田准一主演，此部劇情很緊湊，且拍片手法也獨樹一格，也又有不錯的武打動作&lt;br /&gt;&lt;/li&gt;&lt;li&gt;愛迪生之母&lt;br /&gt;由伊東美咲主演，劇情相當不錯，主要是描述一位天才兒童在學校學習碰到的問題，舉凡老師、家長等，其中在有些小孩提出的問題，都可讓"大人"們好好思考。舉例來說1+1為什麼會等於2(或許有些人會想到這是數論的問題)，都十分的有趣。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;明天的喜多善男&lt;br /&gt;比起前幾部，這部陰沉了許多，此片主角(小日向文世)主演，在劇中飾演一位決定在11天之後要自殺的人，為什麼他可以那麼平淡決定自己在11天後要自殺？而在這11天當中，他又有什麼事是想要完成的。小日向的演技十分優秀，在第一集中，他與自己的對話讓我雞皮疙瘩掉滿地。&lt;/li&gt;&lt;li&gt;沒有玫瑰的花店&lt;br /&gt;竹內結子主演，純脆是因為喜歡她，所以才在追這部片。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;談判專家&lt;br /&gt;米倉涼子主演，這部算是不錯的警察片，但是沒法讓我產生什麼共鳴，所以相對起來我沒有很推薦。&lt;/li&gt;&lt;li&gt;齊藤太太&lt;br /&gt;日本的「親戚不計較」。觀月亞理莎主演。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;蜂蜜與四葉草&lt;br /&gt;年輕人的愛情劇，內有正妹。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;一磅的福音&lt;br /&gt;愛情拳擊片，愛情佔了較多的部分。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;未來老師&lt;br /&gt;爛片，一點都不好笑，深田恭子主演，本來很期待這部，可是劇情太爛。&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;其中，明天的喜多善男是分隔線，以它之上(包含它)，是我認為比較好看的，下面的則是要不要繼續看都無所謂。&lt;br /&gt;&lt;br /&gt;每部片的詳細介紹自行參閱&lt;a href="http://bbs.btpig.com/forumdisplay.php?fid=306"&gt;豬豬字幕組的網頁&lt;/a&gt;。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-4571783303779103618?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/4571783303779103618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=4571783303779103618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4571783303779103618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/4571783303779103618'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/01/japan-drama-in-winter-07-vol-1.html' title='Japan drama in winter &apos;07. Vol 1.'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1705789716225971320.post-2762188435100845524</id><published>2008-01-17T17:06:00.000+08:00</published><updated>2008-01-17T17:22:12.338+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>To be a Ph.D?</title><content type='html'>前陣子老師認為我目前的論文方向很有趣，問我要不要繼續唸博班，當時給他的回答是「不要」。&lt;br /&gt;&lt;br /&gt;那時，主要不想繼續唸的原因大概有幾點：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;博班唸出來，除了學歷上是博士，對於工作上，並不會有太多的幫助。&lt;/li&gt;&lt;li&gt;我討厭寫paper。對於寫paper而言，動手實做更能得到更多樂趣。&lt;/li&gt;&lt;li&gt;讀博士會變窮人。若是我博班讀4年，這4年可能的月收入大約3萬。&lt;/li&gt;&lt;/ol&gt;讀博班的好處呢？&lt;br /&gt;&lt;ol&gt;&lt;li&gt;英文會變好。&lt;/li&gt;&lt;li&gt;思考更有邏輯，文章會愈寫愈好。&lt;/li&gt;&lt;li&gt;更會present&lt;/li&gt;&lt;/ol&gt;從優點與缺點看來，似乎我最不能忍受的是「收入3萬」這點。其次再來是讀博班會要很痛苦的寫paper。&lt;br /&gt;&lt;br /&gt;今天老師寫了一封信出來說：他現在有4個科技替代役名額，問如果有人想唸博班可以同時服替代役並且同時讀博班。當下，這讓我有點心動是否要讀博班。&lt;br /&gt;&lt;br /&gt;但是，心動不到一分鐘，我又繼續開始寫我的paper後，我就完全不思考這件事了......&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;寫paper實在是很痛苦&lt;/span&gt;&lt;/span&gt;。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1705789716225971320-2762188435100845524?l=rickey-nctu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickey-nctu.blogspot.com/feeds/2762188435100845524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1705789716225971320&amp;postID=2762188435100845524' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/2762188435100845524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1705789716225971320/posts/default/2762188435100845524'/><link rel='alternate' type='text/html' href='http://rickey-nctu.blogspot.com/2008/01/to-be-phd.html' title='To be a Ph.D?'/><author><name>Rickey</name><uri>http://www.blogger.com/profile/04260212349274165225</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/_WxXxOGW5qJM/S8Xy3d6J9pI/AAAAAAAADNc/r5z8Nhyk7Cw/S220/DSC04818.JPG'/></author><thr:total>0</thr:total></entry></feed>
