Conner's profile☆ Conner Wang ☆PhotosBlogListsMore Tools Help

Blog


    November 08

    Windows 7和Ubuntu 9.10双系统的安装步骤

    最近刷新了BIOS,并且安装了Windows7,用得还可以,决定以后摒弃Vista和Xp。而就在10月29日,Ubuntu也发布了其最新版的9.10,因此决定将以前的Xp,Vista,Ubuntu 8.10 & Mac Leopard四系统更新为Windows7,Ubuntu 9.l10和Snow Leopard。

    笔者以前写过两篇文章,1. XP、Vista和Ubuntu三引导系统安装;2. iPC Mac OSX Leopard安装成功。分别介绍了Xp,Vista,Ubuntu 8.10 & Mac Leopard四引导系统的安装,而现在要实现新的Windows7,Ubuntu 9.l10和Snow Leopard(日后再安装)三系统的安装,原理是一样的,这里再简单缀述一下。不同之处在于,摒弃了Xp,也就没有了Xp的boot.ini,但这样也更统一和简单了。

    初步设想:

    1. 先安装Windows 7
    2. 硬盘安装Ubuntu 9.10,并将其引导程序(grub2)安装在Ubuntu所在分区上,而不是MBR上
    3. 用Windows 7自已的bootloader来引导Ubuntu

    具体做法如下:

    1. 安装Windows 7

    2. 下载并安装Grub4Dos(如果你有Ubuntu安装光盘,则更简单,就不用Grub4dos了,直接光盘引导并转至第3.5步)

    将下载下来的Grub4Dos解压,并将其中的grldr,grub.exe,grldr.mbr,menu.ls等四个文件拷贝到C盘跟目录,以管理员身份打开命令行并执行如下命令,从而使Win7的bootloader能够引导Grub4dos:
    >dedit /create /d "Grub 4 Dos" /application bootsector
    项 {******} 成功创建。
    >bcdedit /set {******} device partition=c:
    >bcdedit /set {******}  path \grldr.mbr
    >bcdedit /displayorder {******}  /addlast

    3. 下载并从硬盘安装Ubuntu 9.10

    3.1) 从下载的Ubuntu的iso文件中解压出casper文件夹中的vmlinuz、initrd.lz并复制到C盘根目录下

    3.2) 编辑C盘根目录下建立menu.lst文件,加入:
    title Install Ubuntu
    root (hd0,0)
    kernel (hd0,0)/vmlinuz boot=casper iso-scan/filename=/ubuntu-9.10-desktop-i386.iso ro quiet splash locale=zh_CN.UTF-8
    initrd (hd0,0)/initrd.lz

    3.3) 将ubuntu-9.10-desktop-i386.iso复制到任意盘(如果是另一块硬盘、移动硬盘或U盘更好)根目录下

    3.4) 重启电脑,选择"Install Ubuntu"进入Ubuntu的Live CD系统

    3.5) 打开终端,执行sudo umount -l /isodevice(如果不执行这步,安装过程中将无法分区,不过如果你的iso文件在另外的硬盘或U盘上,则可省略这步)

    3.6) 点击桌面上的安装快捷方式进行安装 (你可以在安装的时候上上网或者玩会游戏,这点Ubuntu设计的比较好) \

    3.7) 注意安装过程中有一个高级选项,请不要将引导程序装到mbr里去,而要安装在Ubuntu所在的分区

    3.8) 安装完毕后先不要重启,称机将Ubuntu分区的前512字节拷贝出来,以备引导之用。
    假设Windows7安装在C盘,卷标为win7,而Ubuntu安装在sda3上,则你此时打开Unbuntu的终端,执行
    cd /media/win7
    sudo dd if=/dev/sda3 of=./ubuntu.lnx bs=512 count=1

    这样,Ubuntu的引导信息就保存在C盘里的一个名字叫ubuntu.lnx的文件中了。

    4. 让Windows7能够引导Ubuntu
    重新启动,进入Windows7,以管理员身份打开命令行并执行如下命令,将Ubuntu引导项加入到Win7的bootloader中:
    >bcdedit /create /d "Ubuntu 9.10" /application bootsector
    项 {******} 成功创建。
    >bcdedit /set {******}  device partition=c:
    >bcdedit /set {******}  path \ubuntu.lnx
    >bcdedit /displayorder {******}  /addlast

    大功告成!

    November 07

    xargs命令的用法

    摘抄自《LINUX与UNIX Shell编程指南》中的内容供参考。

      在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行。不幸的是,有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。Find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

    July 10

    如何在shell中改变输出字符的颜色

    用C或C++:
    #include <iostream>
    using namespace std;
    int main()  
    {  
        string beginRed;
        string beginGreen;
        string endColor;
        if(isatty(fileno(stdout)))
        {
            beginRed = "\033[40;31m";
            beginGreen = "\033[40;32m";
            endColor = "\033[0m";
        }
        cout << "TestCase1: " << beginRed << "[OK] " << endColor << endl;
        cout << "TestCase2: " << beginGreen << "[FAILED" << endColor << endl;
        cout << "TestCase3: " << beginRed << "[OK] " << endColor << endl;
        cout << "TestCase4: " << beginGreen << "[FAILED" << endColor << endl;
        return 0;
    }

    具体颜色代码参见这篇文章:

    So You Like Color !!! (The mysterious ^[[ characters)
    By Pradeep Padala

    The Color Code:     <ESC>[{attr};{fg};{bg}m
    I'll explain the escape sequence to produce colors. The sequence to be printed or echoed to the terminal is

        <ESC>[{attr};{fg};{bg}m

    The first character is ESC which has to be printed by pressing CTRL+V and then ESC on the Linux console or in xterm, konsole, kvt, etc. ("CTRL+V ESC" is also the way to embed an escape character in a document in vim.) Then {attr}, {fg}, {bg} have to be replaced with the correct value to get the corresponding effect. attr is the attribute like blinking or underlined etc.. fg and bg are foreground and background colors respectively. You don't have to put braces around the number. Just writing the number will suffice.

    {attr} is one of following

        0    Reset All Attributes (return to normal mode)
        1    Bright (Usually turns on BOLD)
        2     Dim
        3    Underline
        5    Blink
        7     Reverse
        8    Hidden

    {fg} is one of the following
        30    Black
        31    Red
        32    Green
        33    Yellow
        34    Blue
        35    Magenta
        36    Cyan
        37    White

    {bg} is one of the following
        40    Black
        41    Red
        42    Green
        43    Yellow
        44    Blue
        45    Magenta
        46    Cyan
        47    White

    So to get a blinking line with Blue foreground and Green background, the combination to be used should be
    echo "^[[5;34;42mIn color"
    which actually is very ugly. :-) Revert back with
    echo "^[0;37;40m"

    May 11

    在交互式shell脚本中设置读超时和缺省值

    最近在写一个auto test的工具,以使程序build完以后进入RT。
    想实现的功能为:编译完成以后提示是否进行RT,如果什么都不选,则10秒钟以后测试自动开始。
    我打算通过在makefile中调用shell脚本来实现的。关键是这个读取操作超时如何实现?
    通过man手册查到,在Linux下,read命令有一个超时参数-t,通过设置该参数可以直接控制read命令的超时时间。
    但我们的脚本要求能在Solaris和Linux下同时使用,很遗憾的是Solaris下的read命令没有这个-t参数。
    在Gary同志的提示下,终于找到了如下方案:
    ----------------------------------
    while :;
      do
      stty -icanon min 0 time 100
      echo -e "\n RT will automatically start in 10 sec. Run Test?[yes]: "
      read ANSWER
      case "$ANSWER" in
        y|Y|yes|YES|"") stty sane; break ;;
        n|N|no|NO) echo "RT not runned!"; stty sane; exit ;;
      esac
    done
    test code...
    ----------------------------------
    February 18

    Vimdiff的用法

    手工做code merge的时候,经常会用到文件比较与同步的工具。vimdiff是我比较喜欢的。

    首先保证系统中的diff命令是可用的。Vim的diff模式是依赖于diff命令的。

    Vimdiff的基本用法就是:
    # vimdiff  FILE_LEFT  FILE_RIGHT
    或者
    # vim -d  FILE_LEFT  FILE_RIGHT
    屏幕被垂直分割,左右两侧分别显示被比较的两个文件。两个文件中连续的相同的行被折叠了起来,以便使用者能 把注意力集中在两个文件的差异上。只在某一文件中存在的行的背景色被设置为蓝色,而在另一文件中的对应位置被显示为绿色。两个文件中都存在,但是包含差异 的行显示为粉色背景,引起差异的文字用红色背景加以突出。
    除了用这种方法启动vim的diff模式之外,我们还可以用分割窗口命令来启动diff模式:
    # vim FILE_LEFT
    然后在vim的ex模式(也就是"冒号"模式)下输入:
    :vertical diffsplit FILE_RIGHT
    也可以达到同样的效果。

    如果希望交换两个窗口的位置,或者希望改变窗口的分割方式,可以使用下列命令:
    1. Ctrl-w K(把当前窗口移到最上边)
    2. Ctrl-w H(把当前窗口移到最左边)
    3. Ctrl-w J(把当前窗口移到最下边)
    4. Ctrl-w L(把当前窗口移到最右边)
    其中1和3两个操作会把窗口改成水平分割方式。

    光标移动
    接下来试试在行间移动光标,可以看到左右两侧的屏幕滚动是同步的。这是因为"scrollbind"选项被设置了的结果,vim会尽力保证两侧文件的对齐。如果不想要这个特性,可以设置:
    :set noscrollbind
    可以使用快捷键在各个差异点之间快速移动。跳转到下一个差异点:
    ]c
    反向跳转是:
    [c
    如果在命令前加上数字的话,可以跳过一个或数个差异点,从而实现跳的更远。比如如果在位于第一个差异点的行输入"2]c",将越过下一个差异点,跳转到第三个差异点。

    文件合并
    文件比较的最终目的之一就是合并,以消除差异。如果希望把一个差异点中当前文件的内容复制到另一个文件里,可以使用命令
    dp (diff "put")
    如果希望把另一个文件的内容复制到当前行中,可以使用命令
    do (diff "get",之所以不用dg,是因为dg已经被另一个命令占用了)
    如果希望手工修改某一行,可以使用通常的vim操作。如果希望在两个文件之间来回跳转,可以用下列命令序列:
    Ctrl-w, w
    在修改一个或两个文件之后,vimdiff会试图自动来重新比较文件,来实时反映比较结果。但是也会有处理失败的情况,这个时候需要手工来刷新比较结果:
    :diffupdate
    如果希望撤销修改,可以和平常用vim编辑一样,直接
    , u
    但是要注意一定要将光标移动到需要撤销修改的文件窗口中。

    同时操作两个文件
    在比较和合并告一段落之后,可以用下列命令对两个文件同时进行操作。比如同时退出:
    :qa (quit all)
    如果希望保存全部文件:
    :wa (write all)
    或者是两者的合并命令,保存全部文件,然后退出:
    :wqa (write, then quit all)
    如果在退出的时候不希望保存任何操作的结果:
    :qa! (force to quit all)

    上下文的展开和查看
    比较和合并文件的时候经常需要结合上下文来确定最终要采取的操作。Vimdiff 缺省是会把不同之处上下各6行的文本都显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数,可以这样设置:
    :set diffopt=context:3
    可以用简单的折叠命令来临时展开被折叠的相同的文本行:
    zo (folding open,之所以用z这个字母,是因为它看上去比较像折叠着的纸)
    然后可以用下列命令来重新折叠:
    zc (folding close)

    February 10

    Solaris同Linux的一点区别

    Solaris经常会同时提供一些常用命令的两个版本,它们一般会分别位于以下两个文件夹中。
    /usr/bin         标准地System V命令
    /usr/ucb        传统地BSD命令
    虽然是同一条命令,但在这两个目录中的不同版本的用法可能不同。
    比如ps命令,两个目录下的ps分别属于不同风格的unix命令,其参数自然略有不同,输出也可能会有所不同。
    Solaris中默认使用/usr/bin中的ps版本,用惯了Linux的朋友可能发现ps aux不能work了。这时你可以尝试使用用ps -ef来替。或者使用BSD风格的/usr/ucb/ps aux命令,它和Linux地ps命令相当。
    January 18

    Windows/Linux/Unix/Mac多系统中时间不一致的问题

    先说两个概念吧:
      UTC即Universal Time Coordinated,协调世界时
      GMT即Greenwich Mean Time,格林尼治平时
    在这里,你可以把UTC认为是GMT+0。

    Windows(XP和VISTA)和(Linux/Unix/Mac)缺省看待系统硬件时间的方式是不一样的:
      * Windows把系统硬件时间当作本地时间(local time),即操作系统中显示的时间跟BIOS中显示的时间是一样的。
      * Linux/Unix/Mac把硬件时间当作UTC,操作系统中显示的时间是硬件时间经过换算得来的,比如说北京时间是GMT+8,则系统中显示时间是硬件时间+8。

    这样,当PC中同时有多系统共存时,就出现了问题。假如你的Ubuntu和WindowsXP中设置的时区都为北京时间东八区,而你在Ubuntu中把当前系统时间更改为9:00AM。则此时硬件中存储的实际是UTC时间1:00AM。这时你重启进入Windows后,你会发现windows系统中显示的时间是1:AM,比Ubuntu中慢了八个小时。同理,你在Windows中更改或用网络同步了系统时间后,再到Ubuntu中去看,系统就会快了8小时。在实行夏令时的地区,情况可能会更复杂些。

    原因知道了,那怎么来解决这种冲突呢。一种就是让Windows把硬件时间当作UTC,与Linux/Unix/Mac保持一致。另一种就是让Linux/Unix/Mac把系统时间当作本地时间,与Windows保持一致。

    1. 让Windows把硬件时间当作UTC
    开始->运行->CMD,打开命令行程序(Vista则要以管理员方式打开命令行程序方可有权限访问注册表),在命令行中输入下面命令并回车
    Reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1

    2. 如何让Linux/Unix把硬件时间当作本地时间(以Ubuntu为例,其它Unix类系统与之类似)
    修改/etc/default/rcS,
    将UTC=yes
    改为UTC=no

    3. 让Mac把硬件时间当作本地时间
    据说是有个时间补丁,自己到网上找找看吧。

    January 17

    iPC Mac OSX Leopard安装成功

    装了好多遍,最后终于成功装上了,在此记录一下。

    我的本本硬件配置如下:
    Intel Core2 P7350
    DDRII800 2G*2
    FUJITSU SATA 250G
    Geforce 9200M GS

    原有系统为:
    Windows Xp Professional(C:主分区)
    Windows Vista Ultimate(D:逻辑分区)
    Ubuntu 8.10(主分区)
    重新划分了一个主分区,准备用来装Mac。

    最初先尝试的ToH版的,刻了一张抹盘工具的CD和一张安装DVD。但是抹盘工具死活不能启动,显示still waiting for root device。不管是开启ACHI还是关闭ACHI都是这样。那张安装DVD倒是能启动,但老是抹盘不成功。

    后来刻了个iPC版DVD,一开始也是不能抹盘。后来用PM将分区ID改为AF,就可以成功抹盘了。

    安装过程一切顺利,就是装完后老是一出现苹果界面就重启。后来在安装过程中选择单CPU补丁,就可以成功启动了。

    但是新的问题又来了,重启开机后看到多语言欢迎后显示:
    unable to find a keyboard
    searching for your keyboard就不动了。
    安装过程中在自定义里面要选择PS/2 Device Support(mouse, keyboard都要选上),这样在没有USB键盘和鼠标的情况下就可以进系统了。

    总结一下,安装过程中要选择的部分如下:
    Intel ICHx SATA Driver
    CPUS=1 One Core Fix
    PS/2 Device Support(mouse, keyboard都要选上)
    DSDT Patches 里选择Patch DSDT
    另外,Application里除Marvin's AMD Utility外其它的我都选中了。

    安装完成后,运行如下命令将Mac系统启动项加如Vista的Boot Manager启动菜单中:C:>bcdedit /create /d "MAC OSX Leopard" /application bootsector
    项 {29f99265-d8cd-11dd-8f54-005056c00001} 成功创建。
    C:>bcdedit /set {29f99265-d8cd-11dd-8f54-005056c00001} device partition=C:
    操作成功完成。
    C:>bcdedit /set {29f99265-d8cd-11dd-8f54-005056c00001} path \tboot
    操作成功完成。
    C:>bcdedit /displayorder {29f99265-d8cd-11dd-8f54-005056c00001}
    /addlast
    操作成功完成。

    January 03

    XP、Vista和Ubuntu三引导系统安装

    先装Xp再安装Vista,由Vista的bootmgr引导ntldr,ntldr引导Xp。这没什么技巧,也没什么好说的。关键说说第三个系统Ubuntu 8.10 Desktop (Alternate版的安装也可借鉴此法)的安装。

    1、下载最新版本的Grub4DOS,解压缩后将目录中的grldr(不是grldr.mbr),grub.exe和menu.lst这三个文件复制到C盘根目录下

    2、在boot.ini 文件内容末尾加上一行 C:\grldr=“Grub 4 Dos”

    3、从下载的Ubuntu的iso文件中解压出casper文件夹中的vmlinuz、initrd.gz并复制到C盘根目录下

    4、编辑C盘根目录下建立menu.lst文件,加入:
    title Install Ubuntu
    root (hd0,0)
    kernel (hd0,0)/vmlinuz boot=casper iso-scan/filename=/ubuntu-8.10-desktop-i386.iso ro quiet splash locale=zh_CN.UTF-8
    initrd (hd0,0)/initrd.gz

    5、将ubuntu-8.10-desktop-i386.iso复制到任意盘(如果是另一块硬盘、移动硬盘或U盘更好)根目录下

    6、重启电脑,进入Ubuntu的Live CD系统

    7、打开终端,输入sudo umount -l /isodevice(如果不执行这步,安装过程中将无法分区,不过如果你的iso文件在另外的硬盘或U盘上,则可省略这步)

    8、成功后点击桌面上的安装快捷方式进行安装

    9、注意安装过程中不要将引导程序装到mbr里去,而要安装在Ubuntu所在的分区

    10、再次启动Ubuntu Live CD。假设Ubuntu安装在sda3上,则执行: sudo dd if=/dev/sda3 of=/dev/sda6/linuxloader/ubuntu.lnx bs=512 count=1

    11、重新启动,进入vista,将上一步生成的ubuntu.lnx拷入c盘根目录下

    12、用管理员权限运行cmd来添加ubuntu启动菜单:
    C:\>bcdedit /create /d "Ubuntu 8.10" /application bootsector
    项 {29f99260-d8cd-11dd-8f54-005056c00001} 成功创建。
    C:\>bcdedit /set {29f99260-d8cd-11dd-8f54-005056c00001} device partition=c:
    操作成功完成。
    C:\>bcdedit /set {29f99260-d8cd-11dd-8f54-005056c00001} path \ubuntu.lnx
    操作成功完成。
    C:\>bcdedit /displayorder {29f99260-d8cd-11dd-8f54-005056c00001} /addlast
    操作成功完成。

    重启系统就可以从菜单中选择进入Ubuntu了。

    至此,Grub 4 Dos 的任务就算完成了,你完全可以将它从C盘和boot.ini中去掉。不过你可能会想留着它可能还有用,万一以后又从硬盘装系统什么的,还能用到。但是它待在XP的ntldr的启动菜单中又很不方便,每次开机进XP都要从两层菜单中选择。其实可以不让 grub 4 dos 菜单待在XP系统的ntldr菜单中,而待在VISTA的bootmgr的菜单中。但必须做如下设置:

    13、将grldr.mbr、grldr、grub.exe和menu.lst拷到C盘根目录下

    14、用管理员权限运行cmd来添加grub 4 dos启动菜单:
    C:\Windows\system32>bcdedit /create /d "Grub 4 Dos" /application bootsector
    项 {29f99261-d8cd-11dd-8f54-005056c00001} 成功创建。
    C:\>bcdedit /set {29f99261-d8cd-11dd-8f54-005056c00001} device partition=c:
    操作成功完成。
    C:\>bcdedit /set {29f99261-d8cd-11dd-8f54-005056c00001} path \grldr.mbr
    操作成功完成。
    C:\>bcdedit /displayorder {29f99261-d8cd-11dd-8f54-005056c00001 /addlast
    操作成功完成。

    这样无论是XP、VISTA、UBUNTU 还是 GRUB 4 DOS 都统一由Vista的bootmgr来进行管理,启动时只做一层选择即可,很方便而又不容易出现什么问题。

    注:大家可以看出1、2两步所完成的功能完全可以用13、14这两步所用的方法来实现。

    嗯,很有成就感嘛!就还差一个Mac系统了,抽空也找个来装装玩!

    December 12

    Redhat Eterprise Linux 5允许root帐户的telnet和ftp服务

    其实这些东西都没什么技术含量,有时工作中需要用到,而时间长了又经常就会忘掉,所以为了以后查找方便,就记在这里了。
     
    1. 为root用户开启telnet服务

    红帽推荐用户使用安全的ssh来远程登录服务器,而不要使用telnet,因为telnet连接服务器时,密码是以明文方式传输。因此默认root是不允许telnet直接登录服务器的。
    希望强制允许root通过telnet连接服务器,可以修改/etc/pam.d/login
    注释掉这样的一行:
    auth required /lib/security/pam_security.so
    有的机器上可能是这样的一行:
    auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
    修改完成以后,用户应该就可以以root身份登录服务器了。

    如果还不行,那就将/etc/securetty这个文件改个名,该文件是定义root只能在tty1~tty6的终端上登录的,[man login]中有相关说明。
     
    2. 为root用户开启ftp服务

    修改/etc/vsftpd/vsftpd.conf
    local_enable=YES
    这样就允许本机Linux帐号进行ftp登录。
     
    注释掉/etc/vsftpd/ftpusers的root这行;
    注释掉/etc/vsftpd/user_list的root这行;
    这样就允许root帐号进行ftp登录了。
    November 28

    同时使用SSH命令行方式和PUTTY方式实现自动登录

        读本篇前请先阅读前些天写的ssh安全自动登录这篇文章,它是关于如何使用SSH命令行方式实现自动登录的。

        由于ssh-keygen -t rsa命令所生成的私钥文件与PUTTY所用的私钥格式是不一样的,所以要借助PUTTY提供的一个叫PUTTYGEN的工具来进行转换。

        打开PUTTYGEN.exe,导入用ssh-keygen -t rsa命令生成的私钥文件X,然后另存为私钥文件X.ppk,这样生成的私钥文件就可以被PUTTY使用了。

    具体使用方法如下:

    1. Session选项卡
       填入Host Name(or IP address)选项
       填入Saved Sessions选项
    2. Connection->Data选项卡
       Auto-login username 输入自动登录用户名
    3. Connection->SSH->Auth选项卡
       为Private key file for authentication选项选择私钥文件
    4. 保存session,这样以后就可以自动登录了。

    November 09

    tar命令的通常用法

    tar -cvf filename.tar files 将所有文件打包成filename.tar
    tar -zcvf filename.tar.gz files 将所有文件打包并用gzip压缩成filename.tar.gz
    tar -jcvf filename.tar.bz2 files 将所有文件打包并用bzip2压缩成filename.tar.bz2

    tar -tvf filename.tar 显示filename.tar包内的文件列表
    tar -ztvf filename.tar.gz 显示filename.tar.gz包内的文件列表
    tar -jtvf filename.tar.bz2 显示filename.tar.bz2包内的文件列表

    tar -xvf filename.tar 将filename.tar文件解包
    tar -zxvf filename.tar.gz 将filename.tar.gz文件解压缩并解包
    tar -jxvf filename.tar.bz2 将filename.tar.bz2文件解压缩并解包

    November 04

    ssh安全自动登录

    1.在本地主机上运行
      # ssh-keygen -t rsa (在本地$HOME/.ssh/目录中生成了公钥X.pub和私钥X,如果想自动登录就不要设置密码)
    2.将公钥(X.pub文件)拷贝到远程主机下的$HOME/.ssh目录下
    3.在远程主机上运行命令:
      # touch $HOME/.ssh/authorized_keys2 (如果这个文件不存在的话)
      # cat $HOME/.ssh/X.pub >> $HOME/.ssh/authorized_keys2 (将公钥的内容追加到authorized_keys2中)
    4.在本地主机上运行ssh命令并用-i 参数指定本地密钥来登录
      # ssh -i ~/.ssh/X username@远程主机IP

      如果密钥设置了密码, 就用密钥的密码登录,如果没设密码,就直接登录进去了。
      (注意这里的密钥的密码与远程主机unix帐户的密码没有关系,即使以后unix帐户的密码改了,仍然可以使用这个密钥来远程登录到unix上。)

      由于scp和sftp都是基于ssh的,因些这样生成的密钥亦可用于scp和sftp,这要你就不用每次都输入密码了。
      这样做的好处一个是节省输入,其实最大的好处是去除了交互的限制,可以利用脚本实现automation。例如下面的两个shell脚本,可以被很方便地调用:
    cphost1.sh
    **********************************************
    #!/bin/bash
    if [ $# -ne 2 ]
    then
        echo "Usage: cphost1 srcfile dstfile"
        exit
    fi

    echo "FROM: $1"
    echo "  TO: $2"

    if [ -e ~/.ssh/X ]
    then
      scp -i ~/.ssh/X "$1" "$2"
    else
      scp "$1" "$2"
    fi


    sftphost1.sh

    **********************************************

    #/bin/bash
    if [ -e ~/.ssh/X ]
    then
      sftp -o IdentityFile=~/.ssh/X connerw@host1
    else
      sftp connerw@host1
    fi
    October 31

    Vim-Ctags-Taglist阅读C/C++代码之(四)—快速打开工作空间

        很不幸,Ctags的auto-cursor-preview脚本并不能和Taglist很好的在一起工作。它们都借助于updatetime来更新信息,有时它们会出现窗口的错乱。所以我常会在两种模式下工作。

        我会在$HOME目录下建立一个文件夹来管理我的工作空间(估且这么叫吧),不妨叫viworkspace。我通常会这样组织我的工程,假定我的源码在.../src/目录下,我会在~/viworkspace/下建立一个符号链接src指向实际的源码目录.../src/。然后我在~/viworkspace/目录下运行ctags -R *,会在当前目录生成一个tags文件。然后我会在以下两种模式下工作:

    第一种就是auto-cursor-preview模式

    我在~/viworkspace/创建一个叫workspace1的文件,其内容为如下的vi脚本:
    "********************************************************
    set updatetime=50               "预览窗更新间隔

    set tags=~/viworkspace/tags "设置tags文件
    cd ~/viworkspace/src             "进入到源码目录
    edit .                                  "用netrw打开当前目录

    "设置自动预览
    au! CursorHold *.[ch] nested call PreviewWord()

    func PreviewWord()
      if &previewwindow                     " don't do this in the preview window
        return
      endif

      let w = expand("<cword>")             " get the word under cursor

      if w =~ '\a'                          " if the word contains a letter 
        " Delete any existing highlight before showing another tag
        silent! wincmd P                    " jump to preview window
        if &previewwindow                   " if we really get there...
          match none                        " delete existing highlight
          wincmd p                          " back to old window
        endif
        " Try displaying a matching tag for the word under the cursor
        try
          exe "ptag " . w
        catch
          return
        endtry

        silent! wincmd P                    " jump to preview window
        if &previewwindow                   " if we really get there...
          if has("folding")
            silent! .foldopen               " don't want a closed fold
          endif
          call search("$", "b")             " to end of previous line
          let w = substitute(w, '\\', '\\\\', "")
          call search('\<\V' . w . '\>')    " position cursor on match
          " Add a match highlight to the word at this position
          hi previewWord term=bold ctermbg=green guibg=green
          exe 'match previewWord "\%' . line(".") . 'l\%' . col(".") . 'c\k*"'
          wincmd p                          " back to old window
        endif
      endif
    endfun
    "********************************************************

     

    第二种就是Taglist模式

    "********************************************************
    set updatetime=50                    "设置标签窗口更新间隔

    let Tlist_Compact_Format=1       "设置标签列表为紧凑模式,去掉多余空行
    "let Tlist_Display_Prototype=1    "设置标签列表为原型模式
    let Tlist_File_Fold_Auto_Close=1 "设置不活动文件,自动折叠标签列表,仅显示当前文件列表

    TlistToggle                               "开启Taglist列表

    set tags=~/viworkspace/tags "设置tags文件
    cd ~/viworkspace/src             "进入到源码目录
    edit .                                  "用netrw打开当前目录
    "********************************************************

    最后,在.vimrc中添加键盘映射。

    "********************************************************
    map <F2> :source ~/viworkspace/workspace1<CR>
    imap <F2> <ESC>:source ~/viworkspace/workspace1<CR>
    map <F3> :source ~/viworkspace/workspace2<CR>
    imap <F3> <ESC>:source ~/viworkspace/workspace2<CR>
    "********************************************************

        这样,只要以后启动了vim,按下<F2>就会自动进入源码目录,用netrw打开文件列表,并进入auto-cursor-preview模式。同理,按下<F3>就会自动进入源码目录,用netrw打开文件列表,并进入Taglist模式。在这两种模式下,只要在文件列表中选择要打开的文件,并按回车,就可以开始代码之旅了。

    October 25

    Vim-Ctags-Taglist阅读C/C++代码之(三)—Taglist

     

        想不想一侧显示变量或函数列表,另一侧显示源代码窗口,Taglist可以帮你实现这点。

    1.下载taglist.zip并解压到 $HOME/.vim,会产生以下两个目录:
      plugin/taglist.vim - main taglist plugin file
      doc/taglist.txt    - documentation (help) file

    2.确保.vimrc文件中开启了:  filetype on

    2.切换到 $HOME/.vim/doc,启动Vim并执行":helptags ."命令来产生taglist的帮助文件,没有这一步,你在VIM中就无法查看taglist的帮助。

    3.使用":Tlist[Toggle]" 命令开启与关闭taglist窗口,使用TlistOpen和TlistClose来打开和关闭taglist窗口。

    4.使用回车键或鼠标双击来浏览相应tag。用o在新窗口中打开标签,用p在预览窗口打开标签使鼠标仍留在taglist窗口。

    5.为方便使用,在.vimrc中作如下设置:
    let Tlist_Compact_Format=1          “使用紧凑模式显示标签,不会添加空行
    let Tlist_Display_Prototype=1       “显示标签原型,而不仅是名字
    let Tlist_File_Fold_Auto_Close=1  ”自动折叠不活动的文件或buffer的标签

    下面这张效果图来自Taglist官方网站的Screenshot。

    Taglist

    October 24

    Vim-Ctags-Taglist阅读C/C++代码之(二)—Tag预览

        在使用Ctags生成的标签信息阅读代码的时候,可以在你的.vimrc中加入如下脚本来实现将当前光标下的标的签定义自动显示在预览窗口中。

    set updatetime=50

    "setup for ctags auto-cursor-preview
    au! CursorHold *.[ch] nested call PreviewWord()

    func PreviewWord()
      if &previewwindow                     " don't do this in the preview window
        return
      endif

      let w = expand("<cword>")             " get the word under cursor

      if w =~ '\a'                          " if the word contains a letter 
        " Delete any existing highlight before showing another tag
        silent! wincmd P                    " jump to preview window
        if &previewwindow                   " if we really get there...
          match none                        " delete existing highlight
          wincmd p                          " back to old window
        endif
        " Try displaying a matching tag for the word under the cursor
        try
          exe "ptag " . w
        catch
          return
        endtry

        silent! wincmd P                    " jump to preview window
        if &previewwindow                   " if we really get there...
          if has("folding")
            silent! .foldopen               " don't want a closed fold
          endif
          call search("$", "b")             " to end of previous line
          let w = substitute(w, '\\', '\\\\', "")
          call search('\<\V' . w . '\>')    " position cursor on match
          " Add a match highlight to the word at this position
          hi previewWord term=bold ctermbg=green guibg=green
          exe 'match previewWord "\%' . line(".") . 'l\%' . col(".") . 'c\k*"'
          wincmd p                          " back to old window
        endif
      endif
    endfun

    October 23

    Vim-Ctags-Taglist阅读C/C++代码之(一)—Ctags

        很多Linux/Unix程序员都希望能拥有Source Insight那样的杀手级的工具,能在代码之间无拘无束、来去自如。但是Source Insight只能用于Windows平台,而且价格也不菲。当然,我们会去找一些替代案,虽然功能无法超越Source Insight,但是够用就好,不是吗?Ctags就是一个很好的借助标签信息来实现代码跳转和补全的一个很好的选择。

    1.在源码根目录下执行ctags --sort=yes -R
    会在当前目录下生成一个名为tags的tagfile。
    如果不加--sort=yes,生成的文件头中也显示是sorted的(不知道是不是个bug,可能只在某些版本有吧),但是有时vim会提示tagsfile unsorted,查找会变慢。因为对于sorted tagfile,vim会使用二分查找法;对于unsorted tagfile,vim会使用线性查找法。而且有时错误会影响你的使用,通过set notagbsearch可以关闭错误提示,但vim将总是用线性查找法。

    2.vi -t $tag启动vim并自动定位到tag的定义处。如果不是在tagfile所在目录下打开vim,需在vim启动后设置set tags=path/tagfile。
    这样你就可以用CTRL+]定位tag的定义,用CTRL+T来返回,用tag $tag定位到特定tag。
    在编写代码的时调用CTRL+P、CTRL+N也会自动搜索tag信息来进行补齐。

    3.如果有鼠标的话,设置
    set mouse=a
    set scroll=5
    会较好用些。
    可用CRTL+left click来代替CTRL+]
    可用g+right click来代替CTRL+T

    4.如时标签有多个匹配,会显示tag i of N,可用:tfirst跳转到第一个匹配,:tlast跳转到最后一个匹配,:tprevious跳转到前一个匹配,:tnext跳转到下一个匹配,:tselect选择要跳转的匹配。

    5.其它
    用tag $tag+n次TAB进行tag的自动补齐来(别忘了在.vimrc中设置set wildmenu)定位到特定tag。set ignorecase会可能会影响到tag定位的结果。tags会显示tag堆栈的历史记录。

    6.常用命令助记
    ta[g] $tag+TAB
    tf[irst]
    tr[ewind]与tfirst等价
    tl[ast]
    number+tp[revious]
    number+tn[ext]
    number+tN[ext]与tprevious等价
    ts[elect] $tag
    tj[ump] $tag与tselect相似,但当只有一个匹配时,直接跳转到定义。
    sts[elect] $tag与tselect相似,但是会在新建水平分割窗口是显示所选的tag的定义。
    stj[ump] $tag是tj与sts相结合的产物

    g CTRL+] 与tjump等价

    下面这些命令与上面类似,但是都是在预览(preview)窗口中显示tag定义。
    pt[ag] $tag+TAB
    ptf[irst]
    ptr[ewind]与ptfirst等价
    ptl[ast]
    number+ptp[revious]
    number+ptn[ext]
    number+ptN[ext]

    October 20

    vim的目录浏览功能

    netrw插件是vim的标准插件,在.vimrc中只要设置了
        set nocp "不与vi兼容
        filetype plugin on "允许插件
    就可以使用netrw插件了。

    netrw插件的项是网络读写,但我们经常用到的却是它的目录浏览功能(取代了先前的explore.vim)。

    打开目录命令
    Ex[plore]   打开当前目录或指定目录
    Se[xplore] 分割并打开当前目录或指定目录He[xplore]
    Ve[xplore] 垂直分割并打开当前目录或指定目录
    Te[xplore] 新建标签并打开当前目录或指定目录

    浏览文件
    移动光标到感兴趣的文件或目录,按<cr>即可在当前窗口浏览该文件或目录;按p键在预览窗口中浏览该文件;按P键在上次使用的窗口中浏览该文件。

    命令列表
    <cr>   netrw 进入目录或读入文件 |netrw-cr|
    <del>  netrw 试图删除文件/目录 |netrw-del|
      -    netrw 往上走一层目录 |netrw--|
      a    在以下三种方式间切换: 正常显示,|netrw-a|
           隐藏 (不显示匹配 g:netrw_list_hide 的文件) 和
           显示 (只显示匹配 g:netrw_list_hide 的文件)
      c    使浏览中的目录成为当前目录 |netrw-c|
      d    建立目录 |netrw-d|
      D    netrw 试图删除文件/目录 |netrw-D|
      i    在瘦、长、宽和树形的各种列表方式间切换 |netrw-i|
    <c-l>  netrw 刷新目录列表 |netrw-ctrl-l|
      o    打开新浏览窗口,进入光标所在的目录。使用水平分割。|netrw-o|
      p    预览文件 |netrw-p|
      P    在前次使用的窗口里浏览 |netrw-P|
      r    反转排序顺序 |netrw-r|
      R    给指定的文件/目录换名 |netrw-R|
      s    选择排序方式: 按名字、时间或文件大小排序 |netrw-s|
      S    指定按名字排序的后缀优先级 |netrw-S|
      t    在新标签页里打开光标所在的文件/目录 |netrw-t|
      v    打开新浏览窗口,进入光标所在的目录。使用垂直分割。|netrw-v|

    October 16

    Ubuntu下Samba方式访问Vista

        经常要在VMware虚拟机下与windows主机共享文件,一个方案就是在Guest OS中装上VMware-tools,然后采用文件夹共享。但是并不是所有Guest OS都能找到对应的VMware-tools。而Samba则是一个很好的方案:

    我的Host OS是Vista,Guest OS是Ubuntu 8.04。

    1. 先在Vista中认置一个共享文件夹叫vmshare。

    2. 再在Ubuntu中安装Sambfs,执行如下:
    apt-get install smbfs

    3.手动挂载:
    sudo mount -t smbfs -o username=xxx,password=xxx,rw //192.168.1.10/vmshare /mnt/vmshare
    其中192.168.1.10是Vista的IP,username和password是有效的Vista帐号。

    4.开机自动挂载:
    vi /etc/fsab
    加入如下一行:
    //192.168.1.10/vmshare /mnt/vmshare smbfs auto,rw,username=xxx,password=xxx 0 0

    mount -a
    OK,可以自由共享了。

    October 09

    Red Hat Enterprise Linux 5上安装java运行环境

        今天在 Red Hat Enterprise Linux 5上安装eclipse的C/C++版本,但是提示JVM版本为1.4,必须1.5以上才能运行。于是下载了一个jdk-6u7-linux-i586-rpm.bin文件进行安装,但是安装完以后,运行java -version,仍然显示为版本1.4。
        要经过什么样的配置呢?从网上搜索了一些方法,凭我的直觉觉得这些方法都不是我想要的。经过摸索,我找到的方法如下。
        /usr/bin/目录中有4个链接文件:java、javac、javadoc、javaws。它们分别指向系统默认的java安装,即先前的1.4版本。
        从Sun网站下载的jre或jdk默认安装在/usr/java目录下。这个目录中还有两个链接文件:链接default指向latest,链接latest则指向java的最新版本目录。
     
        于是,我在/usr/bin/ 目录下执行以下4条命令,重建java链接:
            ln -sf /usr/java/default/bin/java
            ln -sf /usr/java/default/bin/javac
            ln -sf /usr/java/default/bin/javadoc
            ln -sf /usr/java/default/bin/javaws
     
        这时运行java -version,正确显示java version "1.6.0_07"。
        因为我不是java程序员,所以对java的配置不是很了解,但是上面的方法的确让我的eclipse工作了。如果您有更好的方法,请赐教,不胜感激!