November 24th, 2009progress on login

这里是指在linux下, 在我们的环境中由于在登录系统的时候需要比较久的时候(5-15秒), 在那里看着不动的屏幕总归会有些不爽, 于是便写了一个小小的进度条来.
首先呢, 我们先完成一个画一个转圈的直线的程序来(其实就是轮流打印”-\|-/”这几个字符, 它每转完一圈后会打印一个加号.) — 当然每次打印要有一个间隔, 不然会很快, 这个时间间隔我们能过程序参数来传递.

#! /bin/bash
count=0
#c is the array for the characters we'll print
c[0]='-\b' 
c[1]='\\\b'
c[2]='|\b'
c[3]='/\b'
c[4]='-\b'
c[5]='+'

while true
do
     let "count = $count %6"
     echo -n -e "${c[$count]}"
     sleep $1  #sleep sometime to continue....
     let "count = $count + 1"
done

在上面我们使用了echo 的两个参数, -n 是让它不打印一个多余的换行, -e让它解释转义字符, 而\b则是退格符.
好的, 下面就保存这个脚本并让它可执行(chmod +x ), 这里我把它命名为~/bin/timedot, 能过执行 ./timedot 0.2 来看一下效果吧. (请确定你的sleep程序可以接受小数形式的参数).

嗯, 看上去不错, 好的, 让我们把它加入到启动脚本里, 基本思路是把它作为一个后台程序运行.

~/bin/timedot 0.2&
timedotPID=$! #$! 是bash的内置变量, 它保存最后一个后台进行的pid.
...... #把你的很慢的代码放在这里.

kill $timedotPID  #杀掉打印进度条的进程.

好了, 试一下, 嗯, 似乎工作的还不错. 不过似乎有一个问题: 在每次启动的时候你都会看到一个类似下面的消息:

[1234]-  Terminated                 ~/bin/timedot 0.2&

之所以会有这行消息是因为你在后台运行一个程序的时候, bash会关注所有属于它的后台进程的状态, 并在后台进程结束后通知前台程序某个程序已经死掉啦(或者是已经完成了), 不过毫无疑问我们不希望看到关于timedot的通知消息(太丑陋了), 于是我们可以通过disown 命令来让bash放弃对timedot的管理.

好, 在这里似乎一切都很完美了, 不过假如你在一次登录的时候, 实在忍受不了长时间的等待了, 于是你按下了ctrl+c来中止当前的初始化脚本, 然后你就会发现了另外一个问题… 你会发现在你打字的时候总是会有”|/|-+”这几个字符蹦出来 —- 而这是因为你的ctrl+c虽然中止了你的初始化脚本, 但它却没有中此我们的这个后台进行的进度条进程. 好吧, 让我们修好它:

~/bin/timedot 0.2& 
timedotPID=$! #$! 是bash的内置变量, 它保存最后一个后台进行的pid.
my_control_c()
{
     kill $timedotPID #杀死后台进程<br />
     trap SIGINT  #重置SIGINT, 
}
trap my_control_c SIGINT   #我们设置一个control+c的钩子, 当用户按下control+c的时候会调用我们的my_control_c函数
...... #把你的很慢的代码放在这里.

kill $timedotPID  #杀掉打印进度条的进程.
trap SIGINT #重置SIGINT为默认值. 

这里使用了trap命令来设置ctrl+c的钩子, 这样每次要中止初始化脚本的时候就会调用我们自己的函数, 而它会杀掉后台进度条进程, 当然不要忘记重置钩子, 我们不需要再以后用到它了.

用javascript写程序, 想不到使用的感觉不错, 对js萌生出不少好感来, 有了好感后便是想着能在所有的地方用它, 于是便yy能在写本地程序的时候也用上js — 如果写本地程序可以用像写网页的方式写下来, 那该多完美哪 (当时yy的是一个程序可以以native/网页的形式运行的东西~~~). 记得当时找了一些, 貌似没有太多收获, 今天偶然又google了一把, 居然找到了一篇有趣的blog介绍gtk Seed, 果然有点意思.

Seed是个什么东西, 它的主页上有了介绍, 它是一个库, 解释器以及可以在运行时和webkit javascript核心引擎协作的东西.一句话它提供了你创建本地javascript程序的能力. 这个项目比较新的, 2008年11月8号才发布第一个版本. 这里有篇blog给了一些用它实现的小程序, 看上去还不错, 它封装的本地gtk api应该基本够用了, 没有仔细研究, 但至少文件/窗口消息啥的都有了. 另外貌似这里还用到了Gobject Introspection, 貌似很牛X的, 这个东西的目标之一应该是使用系统语言(像C之流)写的Gtk对象的窗口对象可以不经过任何额外的封装操作都都可以在其他语言中使用(像python/javascript) — 这样还是比较方便的. seed主页可以找到很多例子程序, 看了几个, 貌似很方便. 抽时间了搞下来折腾一下, 不知道有没有提供windows下的版本…

另外与Seed类似的还有另外一个项目:GJS, 这两个引擎的目标都很相似, 貌似都是为了提供本地化的开发能力, 区别就是Seed采用了webkit的js 核心, 而GJS则是使用的mozilla firefox的js引擎(Spidermonkey ). 使用spidermokey引擎的好处之一据说就是可以使用很多webkit中尚不支持的javascript5中引入的新语言特性. 不过看了一些文章, 似乎Seed和GJS的老大们还有过一些讨论目的是使得这两个引擎提供良好的兼容性, 其中Seed的老大似乎还同意修改Seed中Enum/import的实现以保持和GJS的一致.  不过相比较而言似乎Seed项目相对比较活跃一些, 更新比较频繁, 今年已经发而了五六个版本. 而GJS则相对比较沉闷了一些了, 似乎这半年没啥动静, 有点怀疑是不是要黄了……

另外既然讲到本地化的javascript开发, 就不得不提到adobe 的AIR了, 这个应该是和我原来yy的比较相似, 它支持html+js的本地程序, 看了一些文档, 提供了一些本地化的api(文件啊, 剪贴析啊之类的), 不过相对于前两者来讲应该是对于开发的限制应该多了不少. 但是这个酷在确实做到了web+native的双向执行啊, 另外就是它的开发工具相对全一些, 但是要收费滴.再另外就是Air的linux版本是incomplete的, 所以有些功能可能还是不支持地. 当然前面的两个有没有windows/mac的版本还不知道呢:)

April 14th, 2009my shell tips

最近无聊的时候记下来的两个小tip:)

1. login的时候随即打印一个ASCII的图案。

这个比较无聊,基本原理就是把一些预先准备好的ASCII图案分别写成一个文件,在登陆的时候就是随机选取一个文件然后cat就可以啦.

Sample code:

#print out a logo to the screen...
logoDir="~/.logo"
if [ -d $logoDir ] ; then
cd $logoDir
# '*' is a filename wildcard to match all files in the current directory
set *
# Use the syntax for arithmetic expressions.  "%" is the modulo operator
# Shift arguments by a random number between 0 and the number of files
shift $(($RANDOM % $#))
echo -e '\e[0;32m'
cat "${logoDir}/$1"
echo -e "\e[0m"
fi

上面的代码就是把所有的ASCII图案放在~/.logo下面,然后再登陆的时候首先使用cd进入~/.logo目录,然后用set *来默认匹配所有文件名,
shift $(($RANDOM % $#)) 则是随即一个整数然后和文件数取模并选择对应的文件名,
echo -e ‘\e[0;32m’ 这一句是用来是后面的字符为绿色(因为白色的图案不好看啊…)
echo -e “\e[0m” 中止前面的改变字体颜色的效果,这样就不会影响后面的打印结果。

当然, 要记得去找一些ascii 图片放到你的.logo目录里啊:)

2. 动态更新putty的窗口标题

使用putty的ssh的同学们都会想putty可以向其他的终端模拟器一样根据当前目录啥的动态更新标题栏,其实这个也可以再putty里实现,这里需要注意两点:

a. 确保没有打开putty的禁止远程改变窗口标题的选项,这个选项可以在Terminal==>Features 里找到。

putty

b. 在你的登陆脚本里export 一个名为PROMPT_COMMAND的变量,顾名思义它需要是一个命令,下面是我的配置(注意开始的和末尾的数字都是必须的):

PROMPT_COMMAND='echo -ne "\033]0;${HOSTNAME}: ${PWD} -$USER\007"';export PROMPT_COMMAND

打印的格式为:hostname: /home/pangwa/src – pangwa

重新登陆或者source一下你的初始化脚本就可以了:)

January 8th, 2009colinux && xming (part 3)

上篇, 下面进行xming的安装和使用

首先来介绍一下xming, xming是一个免费的Windows下的X server程序. 它是Windows源生程序, 不是使用minggw/cgywin之类的东西封装后的linux API实现的, 这样相比速度应该还是占优势的.

废话不多讲, 下面就开始下载xming, 我下载的是6.9.0.31的最新版本, 下载后运行安装. 不用多讲, (这里建议把xming的字体包也安装上, 据说会省却不少奇怪的问题, 不过我暂时没有遇到因为字体原因造成的问题), 安装后就准备开始运行xming吧.

首先找到xming的安装目录, 运行xlaunch, 在出来的窗口里, 选择Multiple Windows, Display number采用默认值0 (这里是在一个机器上可以同时有多个xserver, 就是通过这个数字来区分具体的xserver), 然后下一步, 选择Start no client, 下一步, 在这一页把No Access Control的选项勾上 (这是一个不推荐的选项, 会有安全问题, 这里为了简单起见先把它选上, 后面后解释), 然后点完成, 这时xming就会启动, 可以在系统托盘可以看到它的图标.

这时我们启动linux, 登录系统.

运行以下命令

export DISPLAY=192.168.0.102:0

这里的ip地址是你windows机器的ip地址(就是xming所用机器的ip), :后面的数字就是在前面xlaunch中设置的Display Number, 在我们这里是0. 然后试试命令 xterm吧, 应该可以看到会有一个窗口显示在你的windows里啦:). 如果想以后默认就用这个作为显示, 可以把这一行放到~/.bash_profile中去, 这样在登录的时候就会自动把它export了.

简单的设置完成, 我们来继续讲刚才的No Access Control的选项, 因为这个选项有安全问题, 在xming的说明上是不推荐使用的. 那么如果尝试把这个选项在xlaunch里取消的, 你会发现你的程序会无法打开显示, 并且会在xming的log中发现类似”Xming: client 4 rejected from IP”的消息, 这是因为在有Access Control的情况时, xming会拒绝不被信任的来源ip, 那么我就需要把colinux所在的机器的ip加入到xming的信任的ip里去. 在xming的安装目录中找到Xn.hosts (其中n为你的Display Number对应的值), 在里面新加一行colinux的ip 地址(这个文件中每个ip占一行) ,  之后重新启动xming就可以生效了.

上面讲的是单显示一个窗口的配置, 如果想要打开一个类似于远程桌面的东西, 可以使用xdmcp, 则需要修改colinux xdm/gdm/kdm之类的登陆程序的配置文件, 把xdmcp打开, 对于gdm, 则修改/etc/gdm/gdm.conf, 找到[xdmcp]这一段, 加入Enable=true一行, 然后重启gdm即可

[xdmcp]
Enable=true

这时候使用xlaunch, 在第一页选择除了Multiple window之外的一个选项(因为它不支持xdmcp.), 下一步选项Open session via XDMCP, 下一步选择connect to host, 把ip填为colinux的ip, 然后再一步, 点Finsh就成了. 这样应该就可以看到linux的图形化登录界面了. 其他就不用多讲啦.

最后赞一下xming, 效果很不错, 很好用, 不过在我的window7下偶尔会有程序崩溃的情况. 但是窗口的显示都和本地窗口区别不大, 下面是我的一个对比图, 图里分别是colinux通过xming显示的emacs, 另外一个是本地的emacs窗口. 你知道哪个是本地的窗口哪个是xming显示的窗口没? 😛

emacs

January 8th, 2009colinux && xming (part 2)

上篇, 下面来进行网络设置, 这里我们采用共享的方式连接网络.

colinux后会创建一个虚拟的网卡设备, 名字应该是 以“TAP-Win32 Adapter V8”开始的, 首先把这个网卡改成英文名像linuxNet以确保在配置文件中引用的时候不会出现中文的啥问题. 如果你安装colinux后没有发现的新的网络连接, 请检查安装时是不是有网络相关的选项上没选上:)

首先把你的本地网卡的那个连接(假设它的名字为本地连接)禁用, 不然无法共享, 右键本地连接, 选择属性, 在打开的窗口中选择 “共享”那一页, 勾上”允许其他网络用户通过此计算机的Internet连接来连接”, 并在出现的下拉列表中选择”linuxNet”, 这样你的linuxNet就可以通过本地连接访问网络了. 在这之前再做最后一步, 编辑linuxNet的属性, 注意linuxNet的ip地址是不是和你网关的ip相冲突, 如果冲突就把它改成其他的ip, 例如, 假设网关ip为192.168.0.1, 那就把liuxNet的ip改成192.168.1.1就成了.

编辑linuxcfg.txt, 加入如下行:

eth0=tuntap,”linuxNet”

这里就相当于把linuxNet映射为colinux中的eth0设备.

启动colinux, 这样应该就可以正常识别eth0了.

登录系统后需要修改一下linux系统的网络配置:

auto eth0
iface eth0 inet static
address 192.168.1.102  #ip要和gateway在一个网段
netmask 255.255.255.0
gateway 192.168.1.1  #gateway的值就是你linuxNet的ip

然后/etc/init.d/networking restart 重新启动eth0(这里或者使用ifconfig来搞, 就请自己研究吧:) ), 这时应该就可以连到网络了.  可ping一下网关看看通没通.

ping 192.168.1.1 来看看网络是不是连通

最后是更新/etc/resolve.conf文件, 指定域名服务器为网关地址就好

$cat /etc/resolve.conf

nameserver 192.168.0.1 #这里的地址根据实际情况作相应修改.

另外colinux的网络连接还有另外一种方式, 有时间再写.

再接下来的问题, colinux不支持X, 所以我们会发现只能使用命令行, 这样的colinux当然不是我们想要的, 于是让我们明天再开始下一篇 xming和colinux.

January 8th, 2009colinux && xming (part 1)

前段时间由于准备在linux下做些开发的事情, 但是还要经常在windows下上网(聊天)游戏(实况), 兼之还是有些认为linux桌面做的不够精致, 用着不甚习惯, 所以经常要在两个系统间来回切换, 不过这切换的代价比较大, 需要重启才能进入另外的系统.

终于在一个偶然的机会发现了有colinux这个东西(已经出来很久很久了… 足显现在我是多么的圡), 于是便开始了我的colinux尝试,

啊, 什么是colinux? 简单来讲就是可以在linux下以一个本地程序来运行linux的东西, 它和虚拟机不太相同, 是直接使用本地计算机资源, 速度相对快一些. 更说的介绍可以参照其主页上的说明.

下面是一些设置步骤, 仅供参考.

首先讲一下我的电脑的分区情况:

主硬盘前四个分区都是ntfs格式, 给windows用的, 然后一个是boot分区, ext2格式, 接着是swap, 再接着是root分区, ext3格式, 最后一个分区为lvm, 其中有一些卷挂载到linux下的usr/home之类的地方.在安之前自己对colinux的lvm支持还是有一点点小疑问的, 不过事实证明自己的担心是错误的 (不过因为一些先入为主的观念就导致走了弯路.), 再另外我的windows现在用的是window 7 build 7000, 在安装之前也会担心colinux不兼容……

1. 是从www.colinux.org找到colinux最新版的下载, 我下的是0.7.3的版本(0.7.3-linux-2.6.22.18)

2. 安装下载好的可执行文件.

3. 开始配置colinux

配置过程:

新版本的colinux抛弃了原来的xml配置文件格式, 而采用了name=value之类语句的配置方案, 具体的参数列表可以参考在colinux安装目录中的colinux-daemon.txt中的说明. 为了方便起见, 我们先配置它启动再说.

我们这里把所有需要的文件都放在一个单独的目录中, 假设为mylinux目录,

1. 我们需要把colinux安装目录里的vmlinux,initrd.gz, vmlinux-modules.tar.gz拷贝到mylinux中,  这几个文件是colinux提供的已经打过补丁的内核程序, 我们可以用它们来启动系统, 当然, 你也可以根据你的需要自己编译内核, 不过需要手动给内核打补丁, 这个我们之后再议.

2. 创建colinux的配置文件, 命名为linuxcfg.txt, 首先加入以下两行:

kernel=vmlinux
initrd=initrd.gz

这就是用来指定我们启动用的内核文件.

3. 我们需要在配置文件里指定本地硬盘在colinux中的设备的映射关系, 这里可以把本地硬盘的分区映射为colinux的一个分区, 也可以把一个文件或者目录映射为它的一个分区, 后面的方式对于和host系统之间的文件共享很有帮助.

在colinux中分区编号是从1开始的,  按顺序为1,2,3,4…, 这里值得注意的一点是, 分区的编号和linux的/dev/sdaX的方法不太相同, 这里没有主分区和逻辑分区之间可能会差几个数字, colinux中的编号是连续的.  所以按照我的分区来讲, 前面的ntfs分区应该是分别为1,2,3,4, boot为5, swap为6, root为7, lvm为8, 因为windows正在使用ntfs的分区, 我们就暂为把ntfs分区也挂到colinux中, 只创建其他linux分区到colinux中的设备映射.

在colinux的设备中, 硬盘设备是以cobdX的格式命名的, 对于本地硬盘分区的映射, 采取下面的方式

\Device\HarddiskX\PartitionY    Harddisk从0开始编号    Partition 从1开始编号

所以对于我的几个本地设备, 可以下几行配置:

cobd0=\Device\Harddisk0\Partition7
cobd1=\Device\Harddisk0\Partition5
cobd2=\Device\Harddisk0\Partition6
cobd3=\Device\Harddisk0\Partition8

分区映射指定好之后, 就是要指定启动时的根分区了, 因为我的根分区没有在lvm中, 所以我直接指定根分区所映射的那个设备即可,在这里应该是cobd0,

root=/dev/cobd0

tip: 如果你的根分区在lvm管理的卷上, 直接用类似于原来在linux下的卷名指定即可, 假设你的根分区在为lvmVolumn/root, 则可以用以下方式指定:

root=/dev/lvmVolumn/root

colinux在启动的时候会和普通启动一样先把lvm的所有卷扫描出来. 当然前提是你已经把你的lvm的分区映射到colinux的一个设备上了(在我这里就是: cobd3=\Device\Harddisk0\Partition8 做的事情),

在做完这些后, 我们就可以开始尝试启动colinux了, 打开cmd窗口, 并进入mylinux目录, 用如下命令

colinux-daemon.exe  @c:\mylinux\linuxcfg.txt  -v 3

在我们第一次启动时可能会遇到一些问题: 像有些分区会挂载不上, 这是因为colinux的硬盘设备映射名称都和原来系统中的不一样了, 所以我们需要修改/ets/fstab文件, 来更新挂的分区, 不过对于lvm中的卷来讲一般不用, 因为lvm的卷的名字不会变. 这里就是根据自己的需要把原来相应的设备改为/dev/cobdX, 不再多讲了.

到这里, 你的colinux应该就可以正常启动了, 在短暂的欢呼雀跃后你可能会发现一个问题: 它怎么联不上网络……, 欲知后事如何, 请听下回分解, 明天再写网络配置部分.


© 2007 pangwa's Blog | iKon Wordpress Theme by Windows Vista Administration | Powered by Wordpress