Jan 28, 2009

Routing software on linux

還記得當時讀研究所時,使用過一套叫 zebra routing software,當時的感覺有如在linux建意一台cisco,當時最主要是為了IPv6而架起來試看看,剛讀了 IPv6 in Linux,文章中提到 RADVD (Linux IPv6 Router Advertisement Daemon),官網上的開頭簡介
The router advertisement daemon (radvd) is run by Linux or BSD systems acting as IPv6 routers. It sends Router Advertisement messages, specified by RFC 2461, to a local Ethernet LAN periodically and when requested by a node sending a Router Solicitation message. These messages are required for IPv6 stateless autoconfiguration.

This release includes support for Mobile IPv6, 6to4 addressing, router preferences and more specific routes, and non-broadcast multiple-access links such as ISATAP. Both Linux and BSD are supported. For more information about recent modifications, please see the CHANGES file included with the latest release of radvd.

從簡介可以得知,他是一套專門幫我們發送各種RA資訊的routing software,且支援Mobile IPv6, 6to4 ... bala bala,或許之後工作上於V6上的開發,這個會比Zebra更試合我 :),對了,Zebra於05年之後就不在maintain而目前主要是改過另一個計劃 Quagga

Jan 26, 2009

我的 VIM 整理

Search 搜尋功能
「 * 」 #vim 就會幫你尋找出這個字串的邊界,並且搜尋該字串。
「 \< 」 #表示的是一個字的頭 「 \> 」 : 代表的是一個字的尾,當你寫\就是以link結尾的字,
「 g* 」 #如果我不想打那麼多字,可是我想要的又不要完全是一樣的


Regular Expression
/blue119$ #找「blue119」結尾的字串
/^blue119 #找「blue119」開頭的字串
/blue[119] #找出 blue加上任何119的組合
/lemon tree\|lemon soup\|lemon juice #「 \| 」這個「或(or)」運算
/.*[^。] #找出忘了在句末補上句號的地方 (中括號出現「 ^ 」就表示除了 "。" 以外的字元都是想要比對的字元)
\{1,} #表示至少要出現一次(至少選一次)
\{,1} #表示最多出現一次(最多選一次)
「 * 」, \{0,} #0個到任意個都可以的
/1234[-]\{,1}[0-9]\{1,} && /1234-[0-9]\{1,}\|1234[0-9]* #1234- 1234-5 1234-56 1234-567 1234-789 1234-2399 1234349898

更詳細的資料
:h regular
:h pattern
:h regular-expression


游標移動
#跳下一頁
#跳上一頁
「zz」 #游標目前位置放置螢幕中間
:行數 #跳到你指定行數
m + (大小寫英文字母) #Mark完後,利用 ['(大小寫英文字母)]回到剛剛Mark的位置. ex.如我在第10行換下 [ma],移到二十行後在換下 ['a]就可回到剛剛的第十行位置
「`」連按兩次 #回到上一次跳到的地方

更詳細的資料
:h mark


取代置換功能「s」

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

:'<,'>s/xxx/XXXX/g #利用 Visual mode 設定 [range], 按下大寫「V」然後移動游標反白到你想要的位置之後按「:」會跳到輸入指令的狀態
:1,300s/vim/VIM/g #設定[range]行數
:.,$s/vim/VIM/g #從現在游標所在行之後的所有行都置換
:.,1s/vim/VIM/g #從現在所在行之前的都要置換

範例:
aaaaaaaaa 111111111 111111111 aaaaaaaaa
bbbbbbbbb 222222222 222222222 bbbbbbbbb
ccccccccc 333333333 -> 333333333 ccccccccc
ddddddddd 444444444 444444444 ddddddddd
eeeeeeeee 555555555 555555555 eeeeeeeee
:%s/\([^0-9]\{1,}\)\([0-9]\{1,}\)/\2 \1/g

\( \) #括起來的,表示這是一個的單元, 依照它出現的順序而使用 \1, \2,…
[^0-9] #就表示非數字的部分
\{1,} #代表出現至少一次或用「\+」來代表至少出現一次

:h /multi #看到更多這些替代符號。


全域指令「:g」( global )

:[range]g[lobal]/{pattern}/[cmd]

:g/^[ \t]*$/d #砍掉空白行
:g/^$/d #砍掉空白行
:g/blue119/ #尋找
:g/小柴胡湯/nu #尋找+行數
:g!/[red123]/ #尋找但不包含特定字

:{range1}g/pattern1/{offset1};/pattern2/{offset2}{command}
:g/^.\{1,}$/,/^$/join! #段落只是用連續的分開,而你想要把所有的這些段落都合在一起
「join!」就是告訴 vim,在 /^.\{1,}$/ 和 /^$/ 之間的段落,通通都要合在一起(join)
「!」表示合併時不使用空白


vim 小技巧

計算有多少個搜尋關鍵字
:%s/pattern/&/g #&代表的意思就是用來表示前面比對的字串

整份文件全部合成一行
ggVGgJ (:%j!)(中文模式), ggVGJ (:%j)(英文模式)

移除文章中的^M
:%s/^M//g #^M = Ctrl+V & Ctrl+M or tr -d "\015" < filename1 > filename2


vim 的選擇模式 ( visual mode )

"ax #把整段程式碼剪下並貼到到暫存區 a
"ay #y 代表 yank,「拖拉」進指暫存器 a
"ap #貼上暫存器a的內容 (put)

更詳細的資料
:h visual-index


vim 的暫存區 register 功用

registers(暫存器)有下列幾種:
1. The unnamed register “”
2. 10 numbered registers “0 to “9
3. The small delete register “-
4. 26 named registers “a to “z or “A to “Z
5. four read-only registers “:, “., “% and “#
6. the expression register “=
7. The selection and drop registers “*, “+ and “~
8. The black hole register “_
9. Last search pattern register “/

Register 0 #register 0 就是幫你把最近一次做 yank 動作所存進去的東西。
Registers [1-9] #當你刪了某些字行會先進入 “1,當你又刪別的字行時,原先在 “1 的東西就會被放到 “2,這次刪的東西會進入 “1。
Registers [a-z] & [A-Z] #當你指定才會使用
"* #指的就是系統「剪貼簿」裡面的內容
": #就是指打的命令的暫存器
"/ #就是放搜尋的字串
". #放最近 insert 插入的文字
"- #放砍掉但不超過一行的文字
"% #指現在編輯的檔名
"_ #(黑洞暫存器),如果你刪除的動作不想要牽涉到任何暫存器

:let @a="Hello, world" #於"a 這個 register 放入 Hello, world 字串。
:let @a="" #清除某個暫存器
"[A-Z] #是附加方式而不是覆蓋
:di #看 register 裡有什麼東西
:g/pattern/y a #把每次比對到的那行都 yank 到 "a
:g/pattern/y A #指定的內容是要做附加到 “A
:g/pattern/. w >> filename #寫到某個檔案

更詳細的資料
:h registers


行數的顯示與利用

cat -n input_filename > output_filename #使用bash時

:%s/^.*$/\=line(".") . " " . submatch(0)/g #於行首加入行號
:%s/^/\=line(".")." "/ #於行首加入行號
line() #用來代表行數的
line()裡面的 "." #用來表示目前游標所在的地方
submatch(0) #用來表示前面所尋找的整個字串(pattern)
submatch(1) #用來表示第一個以 \(…\) 夾起來的子字串
開頭用 "\=" #可以作一些運算
「.」 #用來將字串與運作的結果相連

:set nu #看行號

更詳細的資料
:h sub-replace-expression


寫程式相關

「%」的游標移動方式。這個功能會選擇這些符號「 { [ ( 」的配對組合,也就是說當你在這些符號上面,比方說是「 { 」這個符號上按「 % 」游標會從「 { 」跳到它所對應「 } 」


Ctags 相關使用說明
Sigle folder

只需要 ctags -R 建立好索引後,進入 source code 就可利用 Ctrl+] 來找,回到原處按 Ctrl+t
臨時想到有個 function # :tag curve_extraction_algo
變數名字取得都一樣,在這個時候就會有多個選擇 #:tn & :tp

:h tags 得到更詳細的資訊


multi folder

1. making a shell script, call it "dirtags.sh"
#!/bin/sh
cd $1
ctags *

2. Now execute the following command:
find * -type d -exec dirtags.sh {} \;
to rebuild while making changes within a directory. The following vim key mapping :nmap ,t :!(cd %:p:h;ctags *.[ch])&

3. Build the global tag file:
cd ~/project
ctags --file-scope=no -R

4.
:set tags=./tags,tags,~/iEmbeddedSystem/QuantaSwitchSystem/LB4M-DIAG/tags

5. 推薦使用的 key map
imap :ls:bu
map :ls:bu
map :tn
map :tp


taglist 相關使用說明

:Tlist


cscope 相關使用說明

If you want, you can start it with a C symbol (ex: 'vim -t main')

Type "CTRL-\ s" (Control-backslash, then just 's') in quick succession, and you should see a menu at the bottom of your vim window showing you all the uses of the symbol in the program.
you can nest searches and CTRL-t will unwind them one at a time
via "CTRL-spacebar s". This time, your vim window will split in two horizontally , and the Cscope search result will be put in the new window.

:cs find {querytype} {name}
0 or s: Find this C symbol
1 or g: Find this definition
2 or d: Find functions called by this function
3 or c: Find functions calling this function
4 or t: Find this text string
6 or e: Find this egrep pattern
7 or f: Find this file
8 or i: Find files #including this file

setting the $CSCOPE_DB environment variable to point to a Cscope database you create, so you won't always need to launch vim in the same directory as the database.
find `pwd` -name '*.[sch]' > /tmp/cscope.files
cd /tmp
cscope -b -q
CSCOPE_DB=`pwd`/cscope.out; export CSCOPE_DB; cd -


Using Cscope on large projects (example: the Linux kernel)
For many projects, your find command may be as as simple as
cd /
find /my/project/dir -name '*.java' >/my/cscope/dir/cscope.files
For the Linux kernel
LNX=/home/jru/linux-2.4.18
cd /
find $LNX \
-path "$LNX/arch/*" ! -path "$LNX/arch/i386*" -prune -o \
-path "$LNX/include/asm-*" ! -path "$LNX/include/asm-i386*" -prune -o \
-path "$LNX/tmp*" -prune -o \
-path "$LNX/Documentation*" -prune -o \
-path "$LNX/scripts*" -prune -o \
-path "$LNX/drivers*" -prune -o \
-name "*.[chxsS]" -print >/tmp/cscope/cscope.files
Generate the Cscope database
cd /tmp/cscope # the directory with 'cscope.files'
cscope -b -q -k
Using the database.
CSCOPE_DB=/tmp/cscope/cscope.out; export CSCOPE_DB


視窗操作

Ctrl+w n #即 :new。開一空的新視窗。
Ctrl+w v #開一空的垂直新視窗。
Ctrl+w s #即 :sp(lit),會開一新視窗,且原檔分屬兩個視窗
Ctrl+w f #開一新視窗,並編輯游標所在處之 word 為檔名的檔案
Ctrl+w q #即 :q 結束分割出來的視窗
Ctrl+w o #即 :only! 使游標所在之視窗,成為目前唯一顯示的視窗其它視窗會隱藏起來
Ctrl+w j #移至下視窗
Ctrl+w k #移至上視窗
Ctrl+w _ #將此視視窗變大
Ctrl+w = #視窗同大
Ctrl+w 上、下、左、右 #移動curosr到其它視窗
:sp 檔名 #開另一新視窗來編輯檔案。


tabpage

:tabnew #開一個新的tab
:tabedit #filename 在新的tab編輯filename
:tabclose #關掉一個tab
gt #跳到下一個tab
gT #跳到前一個tab


[new undo] 用時間來做undo的依據

g- Go to older text state. With a count repeat that many
times. {not in Vi}

*:ea* *:earlier*
:earlier {count} Go to older text state {count} times.
:earlier {N}s Go to older text state about {N} seconds before.
:earlier {N}m Go to older text state about {N} minutes before.
:earlier {N}h Go to older text state about {N} hours before.

*g+*
g+ Go to newer text state. With a count repeat that many
times. {not in Vi}


*:lat* *:later*
:later {count} Go to newer text state {count} times.
:later {N}s Go to newer text state about {N} seconds later.
:later {N}m Go to newer text state about {N} minutes later.
:later {N}h Go to newer text state about {N} hours later.



拼字

]s #移至下一個拼錯或罕用的字。
[s #移至上一個拼錯或罕用的字。
]S #同 ]s,但只認完全拼錯的字。
[S #同 [s,但只認完全拼錯的字。
z= #檢查游標所在處的建議 words。
zg #加字於家目錄的字典檔。undo 鍵:zug,移除該字。
zw #同 zg,但標示此字為完全錯誤的字。undo 鍵 zuw,移除該字。

Jan 21, 2009

yum的常用指令整理

最近因為工作的關係,需要用CentOS,但平時自已都是使用Debian/GNU or Ubuntu,對yum用起來一直很不習慣,稍為整理一下,常會使用的指令

yum update [套件1] [...] #用來更新套件,若後面不加任何的套件,則會更新所有系統目前已經安裝了的套件
yum install 套件1 [...] #用來安裝套件
yum upgrade [套件1] [...] #連一些過舊即將洮汰的套件也一起版本升級動作
yum remove 套件1 [...] #移除套件
yum clean [packages|headers|oldheaders|all]
yum list [updates|installed|extras]
yum check-update #檢查可以更新的套件
yum info [updates|installed|extras]
yum provides 套件1 [...] #列出套件提供哪些檔案
yum search [參數] #搜尋套件

[轉錄]Google給網路創業者的14堂課

剛讀了 2006年3月 Cheers雜誌 Google給網路創業者的14堂課 簡短整理以下重點

【創業初期】
1.創業時規模愈小愈好
創業團隊愈少人,愈有助於建立共識,並有助於減少初期發展理念的爭執。
剛創立的新公司,最好只要有一個明確的目標,把這個目標全力做好就行了,別野心勃勃的想要做太多事情,那只會使發展方向與有限的資源分散,對新公司來說不是好事情。
創業團隊人數愈少,也愈能提高執行的效率,縮短團隊彼此溝通的時間。

2.別尋找臭味相投的創業搭檔
創辦人之間專業太相似,反而無法產生互補的效益。理想的創業團隊中,技術工程與業務能力是2項關鍵的能力,創辦人當中,若能彼此分工有人負責後台的技術工程,另外又有人在前線負責業務,將可提高成功機率,在此時,優先考量的是建立起工程與業務的基礎能力,那才是公司持續營運的關鍵。

3.採用開放原始碼的軟體
在創業資金有限的情況下,採用免費且開放原始碼的軟體,作為網站的基礎架構,將有助於減少資訊設備的花費。不管使用哪一種開放原始碼軟體,前提都是要確定對這個軟體有充分了解,下載之後的程式碼,能針對本身的需求自行修改程式。

4.使用現成的標準硬體設備
在兼顧價格與效能的考量上,採用高度標準化的PC。

5.早點宣布產品規劃,並經常宣布
可善用Blog做產品推廣,透過Blog,可以直接得知使用者的想法與建議,要注意的是,一旦使用者提出了具體的需求,若不能滿足,得要讓使用者知道不提供的原因。

【經營與資金】

6.別一開始就急著花大錢
一旦開始有新的產品或服務上市,別太急著砸大錢做行銷與宣傳,在尚未進入獲利的「燒錢」階段,手中的每一塊現金都十分珍貴,在產品還沒有被市場廣泛接受之前,將手中的現金,規畫到公司進入獲利階段才是上策。

7.適當時機尋找創投資金進入
當你的產品或是服務,已經開始在網路上流傳,或是至少有上千個使用者開始使用後,這時差不多該是你尋找創投資金的時候了,代表你的產品已經通過市場的初步考驗,證明你的公司可以站穩腳步,透過適度的引進創投資金,可以把經營規模放大,讓產品能更快、更有效率的推廣出去,加速跨過獲利的門檻。

8.別花太多時間在等待與尋找資金
在第一個產品成功之後,盡快展開第二階段的產品規劃,提高本身繼續經營的實力,這時,若手中還有現金,就別花太多心力與時間去尋找創投資金的奧援,延遲了後續產品持續開發的進度,妥善規畫現金運用以及產品開發的進度。

9.不用與金主過度妥協
對多數的創投來說,投資新公司最大的考量,就是標的盡快掛牌上市或是出售等「短期目標」,為創投公司創造投資報酬,因此,往往會干預標的公司的經營自主性。在尋找資金階段,最重要的是找到理念相近,並且能協助拓展的創投進入,若在經營方向發生衝突之際,適度堅持自主性則更重要。

【管理成長】
10.尋找聰明員工
企業最大資產就是員工的腦袋,而不是既有的軟體、硬體設備,尋找夠聰明、有創意的員工,是經營成功的必備條件。此外,當公司營運規模擴大之後,持續建構行銷與業務團隊也很重要,千萬別等到產品已經發展成功,能為公司創造營收之後,才開始找行銷與業務方面的員工。

11.慷慨且公平的對待員工
如何讓員工持續賣命則是最大的挑戰。若你希望優秀的員工,選擇投入經營風險更高的網路產業,而放棄好聽的頭銜、穩定的工作,那就應該在報酬上厚待員工。無論是股票選擇權或是薪資獎金上,將經營成果與員工共享,留住優秀的員工,在網路產業的經營上,都比任何產業重要。

12.業務從自身做起
在企業經營上有句諺語:明快果決的解雇不適任員工,並深思熟慮的雇用新員工。這句話現在已經不僅僅適用於業務員了,其他部門的員工也該奉行此準則,在企業營運中,最重要的莫過於銷售團隊的建立,透過創辦人親自帶領與建立銷售團隊,能維持一致的對外形象與服務品質。

13.開始尋找王牌主管帶領團隊
一旦你成功建立起銷售產品的團隊之後,下一步你可以開始思考聘請專家來帶領。所謂專家,往往是來自知名企業的業務主管,具有多年的業務經驗,在網路公司由小而大的關鍵時刻,能將過往的經驗帶入團隊中,開創更新、更大型的銷售專案,或是帶頭搶攻重要的企業客戶,過了這一關,你的網路公司就開始擺脫創立初期的階段,開始邁向業績起飛。

14.交棒給專業經理人
一旦成立的網路公司進入成長階段之後,最初的創辦人往往無法把公司帶往下一個階段,因此,創辦人選擇退位時機,尋找專業經理人來管理,將直接影響到下一步的成長。

Jan 20, 2009

[引用]redirect output from serial port

不過,我已經放了之前在那一個Blog找到的資料 XD

1. modify bios:
(1)Change BIOS settings /Server/Serial Console Features/BIOS Redirection Port to
[Serial port 1 or 2]
(2)change direct to modem

2. modify /boot/grub/menu.lst for suse
modify /boot/grub/grub.conf for red hat
console=ttyS0, 115200,vt100

3. modify /ect/inittab
c0:2345:respawn:/sbin/agetty ttyS0 19200 vt100

4. modify /etc/securetty
ttyS0

The Software Development Process

下面這段話是在 "A Byte of Pytho"所看到的

We have now gone through the various phases in the process of writing a software. These phases can be summarised as follows:
1. What (Analysis)
2. How (Design)
3. Do It (Implementation)
4. Test (Testing and Debugging)
5. Use (Operation or Deployment)
6. Maintain (Refinement)

Jan 9, 2009

rename your network card by udev config

my os is debian 5.0 testing
~# dpkg -l | grep udev
ii udev 0.125-7 /dev/ and hotplug management daemon


# This file was automatically generated by the /lib/udev/write_net_rules
# program, probably run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single line.
# MAC addresses must be written in lowercase.

# PCI device 0x1106:0x3065 (via-rhine)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:05:5d:07:48:e5", NAME="eth2"

# PCI device 0x8086:0x1079 (e1000)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:04:23:a5:a4:b5", NAME="eth1"

# PCI device 0x8086:0x1079 (e1000)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:04:23:a5:a4:b4", NAME="eth0"


define via-rhine is eth0, e1000(dual port) are eth1 and eth2

# PCI device 0x1106:0x3065 (via-rhine)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:05:5d:07:48:e5", NAME="eth0"

# PCI device 0x8086:0x1079 (e1000)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:04:23:a5:a4:b4", NAME="eth1"

# PCI device 0x8086:0x1079 (e1000)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:04:23:a5:a4:b5", NAME="eth2"