2012年11月27日 星期二
Linux 解開 .rar .zip檔案
最近常收到同事寄過來的壓縮檔為rar格式或是zip格式
通常是windows 使用者,因為我要merge到我的code base底下
所以都會把他存到Linux系統下,結果才發現他不是linux常用的
壓縮檔.tar .gz,然後就想說linux應該也要可以解壓吧,就google
一下,果然別人也是有這樣的遭遇,方法如下
解.rar檔
1.要先裝一個檔案,到下面位址下載rarlinux
http://www.rarsoft.com/rar/rarlinux-4.2.0.tar.gz
2.再用tar把他解開
tar -xzvf rarlinux-4.2.0.tar.gz
3.然後把rar跟unrar都copy到/usr/bin底下
cp -a rar unrar /usr/bin
4.試試看可不可以解壓縮,cmd如下
unrar e filename
因為我的kernel比較舊所以會出現error message,如下
unrar: /lib/libc.so.6: version `GLIBC_2.7' not found (required by unrar)
看起來是glibc太舊,即使我更新(yum update glibc) glibc也只能更新到2.6
還是有問題,如果你也是這樣,你可以把解開資料夾裡面有一個rar_static檔案
copy到/usr/bin底下,使用static linking 版本,就不會有 glibc 不合的問題
5.在試一次解壓縮
rar_static e filename.rar
rar_static a filename.rar
這樣應該搞定了!
//====================================
解.zip檔
至於要解開傳統zip檔,linux是有支援的cmd如下
解壓縮 ==> unzip filename.zip
壓縮 ==> zip filename.zip 要壓縮filename
2012年11月14日 星期三
Static ARP using ioctl
ARP工作原理
首先先講ARP(Address Resolution Protocol )的工作機制,假設今天A要傳封包給B
1.當A要傳送封包B的時候,A會先檢查自己的 arp cache中有沒有B 的ip 與mac對應。
2.如果有﹐就直接使用此位址來傳送封包 如果沒有﹐則向網路發出一個 ARP Request broadcast
封包查詢B的實體位址,
3.這時網路上所有的主機都會收到這個廣播封包並檢查封包的 IP 欄位是否和自己的 IP 位址
一致
4.如果不是則忽略,如果是則會先將A的mac和 ip 資料更新到自己的 arp cache﹐如果已經有該
IP 的對應則更新覆蓋過去
5.然後B再回應一個 ARP Reply 封包給A﹐告知A自己的實體位址是多少,當A收到 ARP Reply
之後﹐也會更新自己的 ARP cache
ARP病毒
另外常聽到受到arp 病毒的攻擊,這是一種叫做ARP spoofing的病毒,主要是藉由
發送一個假的ARP封包竄改ARP Cache使得資料無法正確傳輸到目的地,造成網路無法連結,便稱作ARP攻擊。由於一般的ARP Cache是根據經過的ARP封包不斷的變更本身的ARP列表,假設接收到的ARP封包所提供的資料是偽造的,就會讓資料無法傳輸到實際的目的地。甚至可能因為資料導向某特定電腦,駭客可利用病毒竊取封包資料或修改封包內容。
Static ARP
這種arp病毒,可以藉由設定static arp 來讓主機不要發出arp request
進而不會收到假的arp 封包,static arp也可以讓主機不用浪費時間
去找相關的ip,mac對應,加快效率
SIOCSARP/SIOCDARP/SIOCGARP
下面使用ioctl方式配合SIOCSARP SIOCDARP
SIOCGARP來設定arp cache
其中
SIOCSARP = 負責add與modify arp entry
SIOCDARP=負責delete arp entry
SIOCGARP=負責get arp entry
可以參考下面的code來對arp 做set/del/get
1.StaticArpSet ==> 須給定ip與mac位址
1.StaticArpDel ==> 須給定ip位址
1.StaticArpGet==> 須給定ip位址與interface
這邊有一個地方要注意,就是arp_ha.sa_family如果沒填
就必需要指定interface name,否則會fail
//strcpy(arpreq.arp_dev, "eth0");也就是說這行不能省
我是設成arpreq.arp_ha.sa_family = AF_UNIX
如此kernel就會根據你所填的subnet ip給定所在的interface
然後如果是get則一定要給interface,不然也會fail
我也不太清楚為什麼!
ARP Flag
設定static arp時,一般給定flag為ATF_PERM(永久的)
與complete ATF_COM,下面flag值與意義供參考
標誌(flag) 值 含義(meaning)
ATF_COM 0x02 查找完成(Lookup complete)
ATF_PERM 0x04 永久記錄(Permanent entry)
ATF_PUBL 0x08 張貼記錄(Publish entry)
ATF_USETRAILERS 0x10 n求使用延伸檔名(Trailers requested)
ATF_NETMASK 0x20 使用網路掩碼(Use a netmask)
ATF_DONTPUB 0x40 不回復(Don't answer)
Check ARP Cache
要確認是否寫入arp cache,可以下commmand
cat /proc/net/arp
然後你就會看到如下格式的表格
IP address HW type Flags HW address Mask Device
192.168.10.1 0x1 0x2 00:50:56:C0:00:08 * eth0
192.168.10.2 0x1 0x2 00:50:56:EB:52:02 * eth0
192.168.10.11 0x1 0x6 00:23:FB:11:22:33 * eth0
reference code
//===============reference code========================//
#define SIN_ADDR(x) (((struct sockaddr_in *) (&(x)))->sin_addr.s_addr)
int StaticArpSet(char *ip, char *mac)
{
struct arpreq arpreq;
int flags;
int rtv;
int sock_fd;
printf("set arp entry IP=%s\tMac=%s\n", ip, mac);
memset(&arpreq, 0, sizeof(struct arpreq));
arpreq.arp_pa.sa_family = AF_INET;
arpreq.arp_ha.sa_family = AF_UNIX;
SIN_ADDR(arpreq.arp_pa) = inet_addr(ip);
sscanf(mac,"%02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX",
&arpreq.arp_ha.sa_data[0], &arpreq.arp_ha.sa_data[1],
&arpreq.arp_ha.sa_data[2], &arpreq.arp_ha.sa_data[3],
&arpreq.arp_ha.sa_data[4], &arpreq.arp_ha.sa_data[5]);
//strcpy(arpreq.arp_dev, "eth0");
arpreq.arp_flags = ATF_PERM | ATF_COM;
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
rtv = ioctl(sock_fd, SIOCSARP, (caddr_t)&arpreq);
close(sock_fd);
if (rtv < 0)
{
printf("%s\n", "set arp fail...");
return -1;
}
else
printf("%s\n", "success");
return 0;
}
int StaticArpDel(char *ip)
{
struct arpreq arpreq;
int rtv, sock_fd;
printf("del arp entry Ip : %s\n", ip);
memset(&arpreq, 0, sizeof(struct arpreq));
arpreq.arp_pa.sa_family = AF_INET;
arpreq.arp_ha.sa_family = AF_UNIX;
SIN_ADDR(arpreq.arp_pa) = inet_addr(ip);
//strcpy(arpreq.arp_dev, "eth0");
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
rtv = ioctl(sock_fd, SIOCDARP, (caddr_t)&arpreq);
close(sock_fd);
if (rtv < 0)
{
printf("%s\n", "del arp fail...");
return -1;
}
else
printf("%s\n", "success...");
return 0;
}
int StaticArpGet(char *ip, char *devname)
{
struct arpreq arpreq;
int rtv, sock_fd;
char macaddr[18]={0};
unsigned char *hw_addr;
printf("check arp table Ip : %s\n", ip);
memset(&arpreq, 0, sizeof(struct arpreq));
arpreq.arp_pa.sa_family = AF_INET;
arpreq.arp_ha.sa_family = AF_UNIX;
SIN_ADDR(arpreq.arp_pa) = inet_addr(ip);
strcpy(arpreq.arp_dev, devname);
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
rtv = ioctl(sock_fd, SIOCGARP, (caddr_t)&arpreq);
close(sock_fd);
if (rtv < 0)
{
printf("%s\n", "Not found in cache");
return -1;
}
else
{
printf("%s\n", "success");
hw_addr = (unsigned char *) arpreq.arp_ha.sa_data;
snprintf(macaddr,sizeof(macaddr),"%02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX",
hw_addr[0], hw_addr[1], hw_addr[2], hw_addr[3], hw_addr[4],
hw_addr[5]);
printf("macaddr [ %s ]\n",macaddr);
}
return 0;
}
首先先講ARP(Address Resolution Protocol )的工作機制,假設今天A要傳封包給B
1.當A要傳送封包B的時候,A會先檢查自己的 arp cache中有沒有B 的ip 與mac對應。
2.如果有﹐就直接使用此位址來傳送封包 如果沒有﹐則向網路發出一個 ARP Request broadcast
封包查詢B的實體位址,
3.這時網路上所有的主機都會收到這個廣播封包並檢查封包的 IP 欄位是否和自己的 IP 位址
一致
4.如果不是則忽略,如果是則會先將A的mac和 ip 資料更新到自己的 arp cache﹐如果已經有該
IP 的對應則更新覆蓋過去
5.然後B再回應一個 ARP Reply 封包給A﹐告知A自己的實體位址是多少,當A收到 ARP Reply
之後﹐也會更新自己的 ARP cache
ARP病毒
另外常聽到受到arp 病毒的攻擊,這是一種叫做ARP spoofing的病毒,主要是藉由
發送一個假的ARP封包竄改ARP Cache使得資料無法正確傳輸到目的地,造成網路無法連結,便稱作ARP攻擊。由於一般的ARP Cache是根據經過的ARP封包不斷的變更本身的ARP列表,假設接收到的ARP封包所提供的資料是偽造的,就會讓資料無法傳輸到實際的目的地。甚至可能因為資料導向某特定電腦,駭客可利用病毒竊取封包資料或修改封包內容。
Static ARP
這種arp病毒,可以藉由設定static arp 來讓主機不要發出arp request
進而不會收到假的arp 封包,static arp也可以讓主機不用浪費時間
去找相關的ip,mac對應,加快效率
SIOCSARP/SIOCDARP/SIOCGARP
下面使用ioctl方式配合SIOCSARP SIOCDARP
SIOCGARP來設定arp cache
其中
SIOCSARP = 負責add與modify arp entry
SIOCDARP=負責delete arp entry
SIOCGARP=負責get arp entry
可以參考下面的code來對arp 做set/del/get
1.StaticArpSet ==> 須給定ip與mac位址
1.StaticArpDel ==> 須給定ip位址
1.StaticArpGet==> 須給定ip位址與interface
這邊有一個地方要注意,就是arp_ha.sa_family如果沒填
就必需要指定interface name,否則會fail
//strcpy(arpreq.arp_dev, "eth0");也就是說這行不能省
我是設成arpreq.arp_ha.sa_family = AF_UNIX
如此kernel就會根據你所填的subnet ip給定所在的interface
然後如果是get則一定要給interface,不然也會fail
我也不太清楚為什麼!
ARP Flag
設定static arp時,一般給定flag為ATF_PERM(永久的)
與complete ATF_COM,下面flag值與意義供參考
標誌(flag) 值 含義(meaning)
ATF_COM 0x02 查找完成(Lookup complete)
ATF_PERM 0x04 永久記錄(Permanent entry)
ATF_PUBL 0x08 張貼記錄(Publish entry)
ATF_USETRAILERS 0x10 n求使用延伸檔名(Trailers requested)
ATF_NETMASK 0x20 使用網路掩碼(Use a netmask)
ATF_DONTPUB 0x40 不回復(Don't answer)
Check ARP Cache
要確認是否寫入arp cache,可以下commmand
cat /proc/net/arp
然後你就會看到如下格式的表格
IP address HW type Flags HW address Mask Device
192.168.10.1 0x1 0x2 00:50:56:C0:00:08 * eth0
192.168.10.2 0x1 0x2 00:50:56:EB:52:02 * eth0
192.168.10.11 0x1 0x6 00:23:FB:11:22:33 * eth0
reference code
//===============reference code========================//
#define SIN_ADDR(x) (((struct sockaddr_in *) (&(x)))->sin_addr.s_addr)
int StaticArpSet(char *ip, char *mac)
{
struct arpreq arpreq;
int flags;
int rtv;
int sock_fd;
printf("set arp entry IP=%s\tMac=%s\n", ip, mac);
memset(&arpreq, 0, sizeof(struct arpreq));
arpreq.arp_pa.sa_family = AF_INET;
arpreq.arp_ha.sa_family = AF_UNIX;
SIN_ADDR(arpreq.arp_pa) = inet_addr(ip);
sscanf(mac,"%02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX",
&arpreq.arp_ha.sa_data[0], &arpreq.arp_ha.sa_data[1],
&arpreq.arp_ha.sa_data[2], &arpreq.arp_ha.sa_data[3],
&arpreq.arp_ha.sa_data[4], &arpreq.arp_ha.sa_data[5]);
//strcpy(arpreq.arp_dev, "eth0");
arpreq.arp_flags = ATF_PERM | ATF_COM;
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
rtv = ioctl(sock_fd, SIOCSARP, (caddr_t)&arpreq);
close(sock_fd);
if (rtv < 0)
{
printf("%s\n", "set arp fail...");
return -1;
}
else
printf("%s\n", "success");
return 0;
}
int StaticArpDel(char *ip)
{
struct arpreq arpreq;
int rtv, sock_fd;
printf("del arp entry Ip : %s\n", ip);
memset(&arpreq, 0, sizeof(struct arpreq));
arpreq.arp_pa.sa_family = AF_INET;
arpreq.arp_ha.sa_family = AF_UNIX;
SIN_ADDR(arpreq.arp_pa) = inet_addr(ip);
//strcpy(arpreq.arp_dev, "eth0");
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
rtv = ioctl(sock_fd, SIOCDARP, (caddr_t)&arpreq);
close(sock_fd);
if (rtv < 0)
{
printf("%s\n", "del arp fail...");
return -1;
}
else
printf("%s\n", "success...");
return 0;
}
int StaticArpGet(char *ip, char *devname)
{
struct arpreq arpreq;
int rtv, sock_fd;
char macaddr[18]={0};
unsigned char *hw_addr;
printf("check arp table Ip : %s\n", ip);
memset(&arpreq, 0, sizeof(struct arpreq));
arpreq.arp_pa.sa_family = AF_INET;
arpreq.arp_ha.sa_family = AF_UNIX;
SIN_ADDR(arpreq.arp_pa) = inet_addr(ip);
strcpy(arpreq.arp_dev, devname);
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
rtv = ioctl(sock_fd, SIOCGARP, (caddr_t)&arpreq);
close(sock_fd);
if (rtv < 0)
{
printf("%s\n", "Not found in cache");
return -1;
}
else
{
printf("%s\n", "success");
hw_addr = (unsigned char *) arpreq.arp_ha.sa_data;
snprintf(macaddr,sizeof(macaddr),"%02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX",
hw_addr[0], hw_addr[1], hw_addr[2], hw_addr[3], hw_addr[4],
hw_addr[5]);
printf("macaddr [ %s ]\n",macaddr);
}
return 0;
}
2012年11月8日 星期四
明年開始十年車齡以上的小客車驗車收費省150元
因為最近去驗車發現已超過驗車期限
所以被罰了900元......心裡有點e04
沒事幹嘛驗那麼多次....ㄚ要驗也不通知一下...tmd
因為十年以上小客車每半年要驗一次車
上半年 收費=450元
下半年 收費=450-150=300元
在這個什麼都漲的年代,不無小補......
//===================================================//
記者彭夢竺/綜合報導
開車的車主們請注意,明年元旦起,車齡10年以上需要第2次檢驗的車種,每年可有一次定檢檢驗費調降3分之1的措施,大型車可省200元,小汽車也省了150元。交通部預估,每年會有將近310萬輛大小車的車主受益。
交通部公路總局針對立院提案,集結相關單位討論減收汽車檢驗費。現行10年車齡以上的自用小客車,估計超過300萬輛,每年2次定檢,每次要花費450元,營業用大客車要檢驗3次,每次600元。交通部表示,明年起10年以上車齡,每年第2次定檢費減收3分之1,若是必須要定檢3次的大客車,只有第2次減收,明年元旦起實施後,預估會有310萬輛車主受益,但國庫一年因此短收5億元稅收。
不過,提案立委管碧玲主張免收第2次檢驗費,她認為10年以上還無法換車者,多半是經濟弱勢者,基於行車安全方面的考量,每年驗車2-3次是必要的,但多收一次驗車費是對無力換車者的懲罰,不太合理。
所以被罰了900元......心裡有點e04
沒事幹嘛驗那麼多次....ㄚ要驗也不通知一下...tmd
因為十年以上小客車每半年要驗一次車
上半年 收費=450元
下半年 收費=450-150=300元
在這個什麼都漲的年代,不無小補......
//===================================================//
記者彭夢竺/綜合報導
開車的車主們請注意,明年元旦起,車齡10年以上需要第2次檢驗的車種,每年可有一次定檢檢驗費調降3分之1的措施,大型車可省200元,小汽車也省了150元。交通部預估,每年會有將近310萬輛大小車的車主受益。
交通部公路總局針對立院提案,集結相關單位討論減收汽車檢驗費。現行10年車齡以上的自用小客車,估計超過300萬輛,每年2次定檢,每次要花費450元,營業用大客車要檢驗3次,每次600元。交通部表示,明年起10年以上車齡,每年第2次定檢費減收3分之1,若是必須要定檢3次的大客車,只有第2次減收,明年元旦起實施後,預估會有310萬輛車主受益,但國庫一年因此短收5億元稅收。
不過,提案立委管碧玲主張免收第2次檢驗費,她認為10年以上還無法換車者,多半是經濟弱勢者,基於行車安全方面的考量,每年驗車2-3次是必要的,但多收一次驗車費是對無力換車者的懲罰,不太合理。
2012年10月30日 星期二
One to One NAT
最近在做1:1 NAT的東西.......趕快把這些日子的心得po上來
首先分兩種case來討論,single wan interface 與 multiple wan interface
如果是只有一個wan,那只要用L3 iptables就可以實現,如果是多wan
那就要在加上L2 ebtables 與 advanced route ,iproute2 (也就是要做策略性路由policy route)才行
假設你的wan = eth1, ip address=172.17.21.87
而你有一個external ip address=172.17.21.88
private ip address=192.168.1.100
你要讓100走88出去
1.single wan:
首先先做ip alias
ifconfig eth1:1 172.17.21.88 netmask 255.255.255.0 up
再來是加一條DNAT rule 讓外來封包的目的位址為88可以NAT到100
iptables -t nat -I PREROUTING -d 172.17.21.88 -i eth1 -j DNAT --to-destination 192.168.1.100
再來是加一條SNAT rule 讓內部封包的來源位址為100可以走專屬88出去
iptables -t nat -I POSTROUTING -s 192.168.1.100 -o eth1 -j SNAT --to-source 172.17.21.88
2.multiple wan:
如果是multiple wan,假設你有兩條好了
wan 1 = eth1 , ip address = 163.18.81.87 (假設這一條是default,也就是說routing走這條)
搭配subnet = 192.168.1.0/24
wan 2 = eth2 , ip address = 172.17.21.87
搭配subnet = 192.168.2.0/24
假設你有一個external ip address=172.17.21.88 ,private ip address=192.168.1.100
要讓.1.100走21.88出去(理論上1.100是走default route就是81.87出去)
首先先在iproute2裡面的rt_tables寫入一個routing tables名稱,這裡叫做pr_ABC,並給一個index 201好了
echo 201 pr_ABC >> /var/iproute2/rt_tables
然後在ebtables 加一條 為.1.100 做一個mark
ebtables -t broute -I BROUTING 1 -p ipv4 --ip-src 192.168.1.101 -j mark --mark-or 0x40000000 --mark-target CONTINUE
然後在ip rule上加一條mark值為所要的時候,這裡是4,就look up所屬route table,這裡是pr_ABC
ip rule add fwmark 0x40000000/0x40000000 table pr_ABC
最後再把這個table要走的route加上去,這裡假設是gateway是172.17.21.1
ip route add default via 172.17.21.1 dev eth2 table pr_ABC
然後再按single wan的步驟
ifconfig eth2:1 172.17.21.88 netmask 255.255.255.0 up
iptables -t nat -I PREROUTING -d 172.17.21.88 -i eth2 -j DNAT --to-destination 192.168.1.100
iptables -t nat -I POSTROUTING -s 192.168.1.100 -o eth2 -j SNAT --to-source 172.17.21.88
這樣應該就搞定了,這裡要提醒一下mark值要注意,不要衝到別人。
附記:
檢查ebtables command:
ebtables -t broute -L
檢查iptables command:
iptables -t nat -nvL
檢查ip rule command:
ip rule show
檢查default route command:
ip route show
首先分兩種case來討論,single wan interface 與 multiple wan interface
如果是只有一個wan,那只要用L3 iptables就可以實現,如果是多wan
那就要在加上L2 ebtables 與 advanced route ,iproute2 (也就是要做策略性路由policy route)才行
假設你的wan = eth1, ip address=172.17.21.87
而你有一個external ip address=172.17.21.88
private ip address=192.168.1.100
你要讓100走88出去
1.single wan:
首先先做ip alias
ifconfig eth1:1 172.17.21.88 netmask 255.255.255.0 up
再來是加一條DNAT rule 讓外來封包的目的位址為88可以NAT到100
iptables -t nat -I PREROUTING -d 172.17.21.88 -i eth1 -j DNAT --to-destination 192.168.1.100
再來是加一條SNAT rule 讓內部封包的來源位址為100可以走專屬88出去
iptables -t nat -I POSTROUTING -s 192.168.1.100 -o eth1 -j SNAT --to-source 172.17.21.88
2.multiple wan:
如果是multiple wan,假設你有兩條好了
wan 1 = eth1 , ip address = 163.18.81.87 (假設這一條是default,也就是說routing走這條)
搭配subnet = 192.168.1.0/24
wan 2 = eth2 , ip address = 172.17.21.87
搭配subnet = 192.168.2.0/24
假設你有一個external ip address=172.17.21.88 ,private ip address=192.168.1.100
要讓.1.100走21.88出去(理論上1.100是走default route就是81.87出去)
首先先在iproute2裡面的rt_tables寫入一個routing tables名稱,這裡叫做pr_ABC,並給一個index 201好了
echo 201 pr_ABC >> /var/iproute2/rt_tables
然後在ebtables 加一條 為.1.100 做一個mark
ebtables -t broute -I BROUTING 1 -p ipv4 --ip-src 192.168.1.101 -j mark --mark-or 0x40000000 --mark-target CONTINUE
然後在ip rule上加一條mark值為所要的時候,這裡是4,就look up所屬route table,這裡是pr_ABC
ip rule add fwmark 0x40000000/0x40000000 table pr_ABC
最後再把這個table要走的route加上去,這裡假設是gateway是172.17.21.1
ip route add default via 172.17.21.1 dev eth2 table pr_ABC
然後再按single wan的步驟
ifconfig eth2:1 172.17.21.88 netmask 255.255.255.0 up
iptables -t nat -I PREROUTING -d 172.17.21.88 -i eth2 -j DNAT --to-destination 192.168.1.100
iptables -t nat -I POSTROUTING -s 192.168.1.100 -o eth2 -j SNAT --to-source 172.17.21.88
這樣應該就搞定了,這裡要提醒一下mark值要注意,不要衝到別人。
附記:
檢查ebtables command:
ebtables -t broute -L
檢查iptables command:
iptables -t nat -nvL
檢查ip rule command:
ip rule show
檢查default route command:
ip route show
2012年9月29日 星期六
SourceInsight versus Kscope
這次想來討論一下兩大trace code軟體....
Source Insight 與 Kscope
因為一直以來...都用vi/vim在做progamming
vi/vim的功力自認為已算不錯.......
可人總是不願意滿足....看到別人大都使用這兩種
在coding,所以我也來學一下......
不過我今天不是要討論這兩個軟體的使用心得或
是比較表,因為從使用的人數已經證明他們的優勢
我是想來說說這兩個軟體的取名.......我覺得很有意思...
Source Insight (for Windows user),我查字典insight這個字有
然後source應該就是source code的意思 ,讓人覺得這個軟體
能對程式碼做trace/reference/definition....等都幫你處理好....
事實上也真的是如此,所以這名子取的好..
再來是kscope(for Linux based user),kscope是GUI介面的cscope,使用KDE的環境,
而cscope從字面上看起來是由兩個字組成 c + scope,c 應該是code的意思而scope
呢查字典是有 顯微鏡/ 望遠鏡等意思,所以就是說他能對程式碼做很細微的觀察
讓你無所遁形,怎樣都找的到你的意思,我覺得啦.......就是也能輕鬆自如的
對code做trace/reference/definition.....等處裡,這名子取的也不錯.....
所以我覺得這兩個名子取的都很好.....也很屌.....你是windows user就用
source insight,你是linux user就用kscope,至於究竟誰能勝出....
就看你用的習慣囉.......目前sourceinsight好像出到3.5版
kscope是到1.9版。
Source Insight 與 Kscope
因為一直以來...都用vi/vim在做progamming
vi/vim的功力自認為已算不錯.......
可人總是不願意滿足....看到別人大都使用這兩種
在coding,所以我也來學一下......
不過我今天不是要討論這兩個軟體的使用心得或
是比較表,因為從使用的人數已經證明他們的優勢
我是想來說說這兩個軟體的取名.......我覺得很有意思...
Source Insight (for Windows user),我查字典insight這個字有
洞悉; 深刻的理解等意思,再從英文的翻譯解釋有可以看透
內部所有一切或很深的檢查之意
(a sight or ciew of the interior of anything Or deep inspection)然後source應該就是source code的意思 ,讓人覺得這個軟體
能對程式碼做trace/reference/definition....等都幫你處理好....
事實上也真的是如此,所以這名子取的好..
再來是kscope(for Linux based user),kscope是GUI介面的cscope,使用KDE的環境,
而cscope從字面上看起來是由兩個字組成 c + scope,c 應該是code的意思而scope
呢查字典是有 顯微鏡/ 望遠鏡等意思,所以就是說他能對程式碼做很細微的觀察
讓你無所遁形,怎樣都找的到你的意思,我覺得啦.......就是也能輕鬆自如的
對code做trace/reference/definition.....等處裡,這名子取的也不錯.....
所以我覺得這兩個名子取的都很好.....也很屌.....你是windows user就用
source insight,你是linux user就用kscope,至於究竟誰能勝出....
就看你用的習慣囉.......目前sourceinsight好像出到3.5版
kscope是到1.9版。
訂閱:
意見 (Atom)