重定向

此博客已停止更新,新址: http://blog.scicooking.net


2008年12月9日星期二

Sun xVM VirtualBox 安装和设置

Ubuntu 软件仓库中的 VirtualBox 是开源版本,即 virtualbox-ose, 开源版本缺少一些功能,比如 USB 支持。如果不在乎是否开源可以安装非开源版本。

安装

我们仍然通过方便的软件源安装:
1、添加 key:
wget -q http://download.virtualbox.org/virtualbox/debian/sun_vbox.asc -O- | sudo apt-key add -
2、添加软件源:
deb http://download.virtualbox.org/virtualbox/debian intrepid non-free
deb http://download.virtualbox.org/virtualbox/debian hardy non-free
deb http://download.virtualbox.org/virtualbox/debian gutsy non-free
deb http://download.virtualbox.org/virtualbox/debian dapper non-free
deb http://download.virtualbox.org/virtualbox/debian lenny non-free
deb http://download.virtualbox.org/virtualbox/debian etch non-free
deb http://download.virtualbox.org/virtualbox/debian sarge non-free
deb http://download.virtualbox.org/virtualbox/debian xandros4.0-xn non-free

设置

1、要把当前用户加到 vboxusers 组中才能启动 virtualbox:
系统 -> 系统管理 -> 用户和组。先解锁,然后点管理组, 选择 vboxusers 组的属性,加入 当前用户到这个组。
或者命令帮当前用户加到 vboxusers 组:
sudo adduser $USER vboxusers
2、使用 USB 设备:
需要 vboxusers 用户能够存取 /dev/udev 设备权限
让所有用户都有权限访问 usb, 但是不安全, 编辑 /etc/fstab 加上:
# 对所有用户开放USB设备的读写权限
none /proc/bus/usb usbfs devmode=666 0 0

更好的方法: 8.04 hardy 编辑 /etc/udev/rules.d/40-basic-permissions.rules

# USB devices (usbfs replacement)
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664", GROUP="vboxusers"
SUBSYSTEM=="usb_device", MODE="0664", GROUP="vboxusers"

3、编辑 /etc/init.d/mountdevsubfs.sh
找到 Magic to make /proc/bus/usb work,把下面几行的注释去掉
mkdir -p /dev/bus/usb/.usbfs
domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,listmode=0644
ln -s .usbfs/devices /dev/bus/usb/devices
mount --rbind /dev/bus/usb /proc/bus/usb


重启后就可使用 usb


无法捕获键盘和鼠标输入, 安装 scim-bridge-client-qt
sudo apt-get install scim-bridge-client-qt


参考资料:

2008年12月8日星期一

IEs4Linux 安装

IEs 4 Linux 使用 Wine 模拟器运行。
1、先安装 wine, 如果没有安装, 先按 Wine 安装 这篇文档安装 Wine。另外需要 cabextract
sudo apt-get update && sudo apt-get install wine cabextract
2、下载和安装 IEs 4 Linux:
wget http://www.tatanka.com.br/ies4linux/downloads/ies4linux-latest.tar.gz
tar zxvf ies4linux-latest.tar.gz
cd ies4linux-*
./ies4linux



参考资料:

wine 安装

软件仓库中的 wine 升级比较慢,使用 wine 官方源。

图形方式:
1、打开 系统-> 系统管理 -> 软件源, 选择“第三方软件”, 按添加,加入对应版本的源:
Ubuntu Intrepid (8.10):
deb http://wine.budgetdedicated.com/apt intrepid main #WineHQ - Ubuntu 8.10 "Intrepid Ibex"
Ubuntu Hardy (8.04):
deb http://wine.budgetdedicated.com/apt hardy main #WineHQ - Ubuntu 8.04 "Hardy Heron"
2、下载 key: http://wine.budgetdedicated.com/apt/Scott%20Ritchie.gpg 在软件源中选择“身份验证”,按“导入密钥文件...”

-------- NB 的分割线 --------

命令行方式添加:
1、导入密钥文件:
wget -q http://wine.budgetdedicated.com/apt/387EE263.gpg -O- | sudo apt-key add -
2、添加软件源:
Ubuntu Intrepid (8.10):
sudo wget http://wine.budgetdedicated.com/apt/sources.list.d/intrepid.list -O /etc/apt/sources.list.d/winehq.list
Ubuntu Hardy (8.04):
sudo wget http://wine.budgetdedicated.com/apt/sources.list.d/hardy.list -O /etc/apt/sources.list.d/winehq.list
3、更新软件源,安装 wine:
sudo apt-get update && sudo apt-get install wine


参考资料:

2008年12月2日星期二

sort 排序 tab 分隔的文件

sort 排序,默认空白(空格,tab)都分开字段。想要在某列上排序 tab 分隔文件,这时候空格不应该作为分隔符。
例子文件:
example.txt:
A 2 1
B 1 0 341
C 3 231

假设排列 第3字段:
sort -k 3 -t "\t" example.txt 报错
sort -k 3 -t ‘\t’ example.txt 报错
sort -k 3 -t \t example.txt 没报错,可是结果不正确
解决方法:
TAB=`echo -e '\t'`; sort -k 3 -t "$TAB" example.txt
或者
sort -k 3 -t $'\t' example.txt
再或者,shell 里可以输入控制字符的,按 ctrl-v, 然后 tab 键就能输入 tab 字符,汗...
sort -k 3 -t "[ctrl-v]+[tab]" example.txt

2008年11月19日星期三

ubuntu 上安装 ibus 输入法

ibus 输入法的安装


deb 包安装:
到其项目网站下载 deb 包。
ubuntu 8.04: http://archive.ubuntu.org.cn/ubuntu-cn/dists/hardy/main/binary-i386/ibus/
ubuntu 8.10: http://archive.ubuntu.org.cn/ubuntu-cn/dists/intrepid/main/binary-i386/ibus/

共 3 个包, ibus 是输入法平台, ibus-pinyin 是拼音输入法, ibus-table 是五笔等其他输入法。python-dbus 是 ibus 依赖的包,ubuntu 系统中有,但版本较低,可能需要安装这个。
依次安装 python-dbus, ibus, 和 ibus-pinyin 或者 ibus-table 即可。

从软件源安装:
加入源,ibus目前还没纳入官方源:
deb http://ubuntu.cn99.com/ubuntu-cn/ hardy main restricted universe multiverse
8.10 把 hardy 改为 intrepid

更新源:
sudo apt-get update

然后搜索软件包
apt-cache search ibus |grep ^ibus
ibus - iBus - Intelligent Input Bus for Linux / Unix OS
ibus-pinyin - ibus-pinyin
ibus-table - IBus-Table


安装 ibus:
sudo apt-get install ibus

安装输入法:
sudo apt-get install ibus-pinyin
或者
sudo apt-get install ibus-table


安装完后启用 ibus:
im-switch -s ibus
注销用户,重新登录。

ibus 图标会出现在通知栏。这时候按 ctrl+空格会提示没有安装任何输入法。

右键-->首选项(或运行 ibus-setup)调出选项,在“输入法引擎”里启用需要的输入法即可。

项目主页: http://code.google.com/p/ibus/

2008年11月17日星期一

crontab + rhythmbox 定时播放音乐

直接用 rhythmbox 是不行的,因为需要图形,cron 仅设置了少数几个变量。

# 每天7点整运行,设置显示设备,启动 rhythmbox, 等待加载完成,开始播放
0 7 * * 1-5 export DISPLAY=:0 && rhythmbox-client && sleep 3 && rhythmbox-client --play

2008年11月14日星期五

Crontab 详解

主要信息来源于 info crontab

crontab 要做的事就是:“在指定日期指定时间运行指定的命令”。每个用户都有自己的 crontab, crontab 里的每个命令都以 crontab 拥有者的身份运行。

空行、前导空格和制表符(tab)都会被忽略。 首个非空白字符是 # 的行是注释。注意:和命令同一行的 # 不会当作注释,会当成命令的一部分。在设置环境变量的行也是同样的。也就是说,注释是单独成行的

crontab 里有效的行可以是 设置环境变量 或者 cron 命令。环境变量设置类似于: name = value “=” 两边的空格可选(这点和 bash 不同, bash 中变量赋值=号两边不能有空格)。如果想要在值中保留前后空格,可以用单引号或者双引号包含起来。注意,这里设置的值不会被环境解析和替代,也就是所谓变量不会被展开。比如:PATH = $HOME/bin:$PATH 不会像预期一样工作。

cron 守护进程只设置了少数几个环境变量。 SHELL 设置为 /bin/sh, LOGNAME 和 HOME 设置为 用户相关的目录 (来自 /etc/passwd 相关的信息), PATH 设置为 “/usr/bin:/bin“。 HOME, SHELL, PATH 可以在 crontab 中重新设置,LOGNAME 是 job 运行的用户, 无法被改变。
(注: LOGNAME 在 BSD 系统上叫做 USER, 其他系统上 也设置了 USER 变量)

除了 LOGNAME, HOME 和 SHELL, 如果在当前的 crontab 中因为任何原因要发送命令运行结果的邮件, cron 会查找 MAILTO 这个变量. 如果定义了 MAILTO 变量(并且非空),邮件就会发送给这个用户。MAILTO 可以指定多个接收人,用逗号 "," 分隔。如果 MAILTO 定义成空 (MAILTO=""),将不会发送任何邮件。否则邮件将发送给 crontab 所属的用户。
特性:如果 crontab 中的命令有任何输出结果,cron 就会发送邮件把输出发送给用户,如果 MAILTO="" 将关闭这个特性不会发送邮件。

默认情况下, cron 发送邮件使用的 "Content-Type:" 邮件头是"text/plain", 并带有"charset=" 参数来设置到 crond 启动所在的区域字符集。比如,LC_* 环境变量指定的区域 或者 如果没有 LC_* 环境变量就使用默认系统区域。你可以为发送到 mail 的 cron job 的输出使用不同的字符编码,通过在 crontab 中设置 CONTENT_TYPE 和 CONTENT_TRANSFER_ENCODING 变量为正确的 mail 头信息。

------------ 小节分割线 ---------------

cron 命令格式是非常的 V7 标准 - -; 也带有向前兼容的数字扩展。每行有 5 个时间和日期字段,跟着是命令,然后是换行("\n")。系统级的 crontab (/etc/crontab) 使用相同格式, 除了在时间日期之后,命令之前指定了一个用于执行命令的用户名。字段可以用一个或者多个空格或者tab分隔。

当分钟、小时和月份匹配当前时间,并且两个天的字段(几号或者星期几)中至少一个匹配当前时间(看下面的注释!), cron 就开始执行命令. cron 每分钟都检查一次。时间和日期的字段:

字段 允许的值
---- --------
分钟 0-59
小时 0-23
日 1-31
月 1-12 (或者英文名称)
星期 0-7 (0 和 7 都是星期天,或者使用英文名称)

字段可以使用星号(*),总是代表“first-last”,也就是所有的值。

允许数字范围。范围就是2个数字之间用连字号(-)连接, 包括这两个数字。 比如, 小时字段 8-11 表示在 8, 9, 10 和 11 点执行。

也允许列表。列表是一组数字(或者范围),由逗号(,)分隔。比如 “1,2,5,9”, “0-4,8-12”。

步进值可以和范围结合。在范围后跟着“/数字”指定从范围中跳过指定数字。比如,小时字段“0-23/2”可以用来指定每几小时执行(V7 标准另一写法是 “0,2,4,6,8,10,12,14,16,18,20,22”)。步进当然也允许跟在星号后,所以如果你想要的是“每2小时”,直接用“*/2”就可以了。

月份和星期可以使用英文名称。使用星期或者月份的前3个字母的缩写(无论大小写)。不能在范围或者列表中使用英文名称。

第6个字段(也就是这一行的剩余部分)就是指定要运行的命令了。整个命令部分,到换行(\n)或者 % 字符,会交给 /bin/sh 或者 crontab 文件里 SHELL 变量指定的 shell 来执行。命令中的百分号(%),除了加上反斜杠(\)转义的,会被转为换行符,并且第一个 % 之后的所有数据都会发送给命令当作标准输入。这里没办法像 shell 跟着 "\" 一样把命令写成多行的。

注意:
命令执行的天可以由2个字段来指定 -- 几号和星期几。如果2个都有限制(不是 *),那么只要其中一个匹配当前时间命令就会执行。比如:“30 4 1,15 * 5” 会导致命令在每月1号和15号加上每个星期五运行。

以下 8 个特殊的字符串可以替代开头的 5 个字段:

字符串 含义
------ ----
@reboot 启动时运行一次
@yearly 每年运行一次,“0 0 1 1 *”
@annually (同 @yearly)
@monthly 每月运行一次,“0 0 1 * *”
@weekly 每周运行一次,“0 0 * * 0”
@daily 每天运行一次,“0 0 * * *”
@midnight (同 @daily)
@hourly 每小时运行一次,“0 * * * *”


例子:

# 使用 /bin/bash 来运行命令, 替代默认的 /bin/sh
SHELL=/bin/bash
# 设定发送运行结果给 “ken”, 而不管这个 crontab 是谁的
MAILTO=ken
#
# 每天 00:05 运行,输出重定向到 用户目录的下的 tmp/out 文件,错误也重定向到这个文件
5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# 每月 1 号的 14:15 -- 输出发送给 ken(上面 MAILTO 指定的接收者)
15 14 1 * * $HOME/bin/monthly
# 每个工作日 22:00 运行, 这条命令就是定时发邮件,骚扰 Rock, %都会变成换行,第一个 % 后的数据都作为标准输入给 mail
0 22 * * 1-5 mail -s "It's 10pm" rock%Rock,%%Where are your kids?%
# 每天每2小时在23分时运行
23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
# 每周日 04:05 运行
5 4 * * sun echo "run at 5 after 4 every sunday"


再说几句总结:
  • 指定星期时, 0 和 7 都会被当作星期天。 BSD 和 ATT 貌似不这么认为。
  • 列表和范围可以在同一个字段并存。 但是“1-3,7-9”会被 ATT 或 BSD cron 拒绝 -- 他们只想看到 “1-3” 或者 “7,8,9”。
  • 范围可以包括步进,因此 “1-9/2” 等同于 “1,3,5,7,9”。
  • 月份和星期可以用名称。
  • 可以在 crontab 中设置环境变量。 BSD 或 ATT 中,交给子进程的环境变量来基本来自 /etc/rc。
  • 命令的输出发送给 crontab 的拥有者(BSD不会这么做),可以发送给其他人(SysV 不能这么干),或者可以关闭这个特性根本不发送邮件(SysV 还是不能这么干)。
  • 所有出现在前面 5 个字段位置 @ 命令是扩展。
---- 到此结束的分割线 ----

看到这里说明你很有耐心很想了解 crontab 设置……以上就那么多, 转载请注明来源,谢谢!

2008年11月13日星期四

从软件源中安装 Code::Blocks

Code::Blocks 是开源的跨平台的免费的 C++ IDE, 使用 wxWidgets

1、加入第三方源公钥
wget -q http://apt.wxwidgets.org/key.asc -O- | sudo apt-key add -
wget -q http://lgp203.free.fr/public.key -O- | sudo apt-key add -


2、添加软件源
系统 -> 软件源 -> 第三方软件, 添加:
deb http://apt.wxwidgets.org/ hardy-wx main
deb http://lgp203.free.fr/ubuntu/ hardy universe


hardy 是 ubuntu 8.04, 其他版本修改成对应的名称

3、安装
sudo apt-get update
sudo apt-get install codeblocks

Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

启动 Apache 经常出现警告
Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

使用 hostname 设置主机名,仅当前会话中有效:
sudo hostname yourhostname
想永久生效修改这个:
sudo gedit /etc/hostname

或者
在 httpd.conf 中加入 ServerName 指令
ServerName 127.0.0.1

参阅:http://httpd.apache.org/docs/2.2/mod/core.html#servername

2008年11月12日星期三

Ubuntu 8.04 升级到 8.10 的问题

问题1: 再也无法打开 软件源, 在 终端下运行 gksu software-properties-gtk 出现 FutureWarning: apt API not stable yet
google 了一下,运行 sudo apt-get update && sudo apt-get remove --purge software-properties-gtk && sudo apt-get install software-properties-gtk 删除软件源管理器再安装,问题依旧。
打开新立得,发现很多软件版本都不是 intrepid 的。 可能我使用了第三方源,导致更新问题。 更改 apt 到 intrepid 版本,安装更新后,软件源管理界面终于打开了。

问题2:更新管理器总是出现部分升级选项,但又无法安装。运行 sudo apt-get dist-upgrade 给我列了一大堆要安装的包,300多兆,让慢慢它下去吧。

更新完毕,终于一切正常了 :)

2008年11月11日星期二

Evolution 使用 IMap 收发 Exchange 的设置

Evolution 可以同过 exchange 插件访问 Exchange. 也可以通过 IMap 方式访问 Exchange.

首选项 -> 邮件帐户 -> 添加
填好 邮件地址, 前进, 然后 服务器类型 可以选择 IMAP。
  1. 服务器填 exchange 地址, 在 Outlook 设置好后,查看帐户就能看到这个地址。
  2. 用户名就是域上的用户名,和 Outlook 一样。
  3. 认证类型,点一下检查支持的类型,通常 Windows 网路是 NTLM/SPA
前进,选择需要的选项,这样收部分就完成了。

前进,这部分设置发送邮件。通常 SMTP, 服务器地址同 exchange 服务器地址,用户名一样

打完收工。

2008年11月3日星期一

Ubuntu 发行版本升级

Ubuntu 发行版本升级:
比如从 8.04 升级到 8.10

sudo update-manager -dc

sudo update-manager --help
Usage: update-manager [options]

Options:
-h, --help show this help message and exit
-V, --version 显示版本然后退出
-c, --check-dist-upgrades
检测新版本发布
-d, --devel-release 验证是否能够升级到最新版本
-p, --proposed 尝试进行版本升级
--dist-upgrade, --dist-ugprade
尝试进行版本升级