2011年10月29日星期六

Keyboard Not Found

一台机子没有插键盘(PS/2),启动的时候会停在“Keyboard not found”的错误。如果要把这台机子当作服务器,显得没键盘装得才像。

可以通过BIOS设置来去除这个错误。不知道不同版本的BIOS是否设置一致,在我这里是这样的:
在BIOS的某个选项里,有 Halt on All errors,修改为 Halt on no error,然后会出现新的Keyboard选项,将其设置为disable,意思是忽略Keyboard的错误,重启即可。

2011年10月27日星期四

Bash 命令提示符

Bash 命令提示符是由环境变量PS1控制的,PS2控制命令多行输入时的提示符。Bash提供了
一些转义字符,供定制PS1(当然如果要定制PS2也可以使用,但一般很少定制PS2吧)时使用。
以下列举一些常用的:
  1. \h 主机名字
  2. \u 当前用户名字
  3. \w 当前工作目录
  4. \$ UID为0时(也就是root)效果为#,否则为$
  5. \t 当前二十四小时制时间
  6. \T 当前十二小时制时间
  7. \[ 开始一串非打印字符
  8. \] 非打印字符串结束

提示符颜色

还可以给提示符添加颜色,也是通过在PS1中使用特定的序列来实现的。"\e["表示颜色序列
的开始。后面紧跟表示颜色的数字,不同的数字代表不同的颜色,有些表示前景色,有些表
示背景色,有些表示光标闪烁颜色,数字间用“;"分隔,且没有顺序关系,最后"m"表
示颜色序列的结束。后续的字符将按照颜色序列的定义显示,直到"\e[0m"重置为默认值。

比如一个可能的PS1为:“export PS1="\e[32;40m\w> \e[0m”

编码 颜色动作
0 重新设置属性到缺省设置
1 设置粗体
2 设置一半亮度
4 设置下划线
5 设置闪烁
7 设置反向图象
22 设置一般密度
24 关闭下划线
25 关闭闪烁
27 关闭反向图象
30 设置黑色前景
31 设置红色前景
32 设置绿色前景
33 设置棕色前景
34 设置蓝色前景
35 设置紫色前景
36 设置青色前景
37 设置白色前景
38 在缺省的前景颜色上设置下划线
39 在缺省的前景颜色上关闭下划线
40 设置黑色背景
41 设置红色背景
42 设置绿色背景
43 设置棕色背景
44 设置蓝色背景
45 设置紫色背景
46 设置青色背景
47 设置白色背景
49 设置缺省黑色背景


\[ 和 \]的作用


还要特别提一下\[ 和 \]的作用,它通知Bash两者间的字符为非打印字符,
当Bash计算提示符长度时,会忽略这一串字符。这是很有必要的,比如对于定义颜色的特殊
序列,就应该包含在其中,因为颜色序列并非打印字符。如果没有将非打印字符(比如颜色
序列)包含在\[和\]之间,当输入较短命令时不会有问题,但是当输入长命令,超过使用的
终端窗口的宽度时,因为Bash将非打印字符都算入提示符长度,造成命令换行的错误,终端
窗口的显示将会错乱。


titlebar


默认情况下,
PS1=\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$

分析这一段代码,发现\[ 和 \]的“\e]0;\u@\h: \w\a”还是解释不了。其实"\e]0;" 与
"\a"之间的序列用于控制终端窗口titlebar的显示。还可以把0换成1或者2,分别控制任务
栏终端窗口titlebar显示和主窗口的titlebar显示,即:

\e]1;icon-title\a\e]2;main-title\a

参考资料


[1]Bash Shell PS1: 10 Examples to Make Your Linux Prompt like
Angelina Jolie

[2]Tip: Prompt magic
[3]http://tldp.org/HOWTO/Bash-Prompt-HOWTO/xterm-title-bar-manipulations.html
[4]tput 入门

2011年10月22日星期六

Ubuntu登录后死机

给一旧电脑安装Ubuntu ( 9.10 ),安装好后进入桌面没几秒就死机,屡试不爽。TTY登录则一切正常。猜测是机器过于陈旧,所以无法运行桌面。难道就因此放弃桌面么?但是由于以前有一台大抵相同配置的机器是可以运行GNOME,所以对上述轻率的结论还是有疑惑的。

良思无策,放狗一搜,发现这篇文章描述的状况与我遇到的并无二致,原因他也说了,是硬件不支持compiz造成的,但换个窗口管理器还是可以使用桌面环境的。按图索骥,登陆到tty,修改~/.gconf/desktop/gnome/applications/window_manager/%gconf.xml文件,把两个/usr/bin/compiz换成/usr/bin/metacity。重启系统,总算可以正常运行了。不得不感慨下这位同学发现问题和解决问题的能力还是极强的,而我连窗口管理器,X Windows,窗口环境等概念都分不清,差距阿。

compiz 和 metacity 都是窗口管理器,而且metacity是gnome默认的窗口管理器(吐槽:看到的资料是这么说,可是为什么安装好启动就是compiz,那算什么默认阿)。ubuntu wiki这里有提到一点,“系统--首选项--外观--视觉效果”如果不是选“无”,则compiz会作为窗口管理器(吐槽:metacity,你到底算个啥默认窗口管理器哦)。

2011年10月19日星期三

FAIL:20111019

DropBox的主页默认上不去(吐槽:难道我会以为是DropBox挂掉了么?!),但是可以通过某种途径登上,下载了dropbox的deb安装包。

dpkg安装好dropbox deb包(备注:安装的只是一个python程序,在/usr/bin/dropbox),在应用程序--互联网--DropBox 启动 dropbox,提示连接错误,并建议配置http_proxy环境变量。正常反应,我想,毕竟是有认证过的。那怎么配置http_proxy环境变量?写入/etc/profile?不妥,不知道会不会影响其他程序。放狗一搜,利用这篇文章中提到的方法:

http_proxy=http://127.0.0.1:8580 /usr/bin/dropbox start -i

开始下载安装dropbox主程序(第一次运行才会安装,安装在主目录下.dropbox-dist中)。接着会自动运行dropbox,但仍然连接不上服务器,不过有了新的提示:不能建立安全的连接,原因是你的时间和日期设置得不正确。当然系统的时间和日期设置是正确的,放狗搜索,看了N多贴,挣扎了几个小时,毫无头绪,只能用一个字来形容当时的心情:FAIL!

最后让我发现原因是网络没有国际出口权限!我猜dropbox会连接某国际时间服务器来验证本地系统时间是否正确,但不幸的是因为网络没有国际出口权限,它居然提示系统时间和日期设置不正确。还有一个小疑问,虽然DropBox的主页依然“正常”登陆不上去,但是客户端在没有用任何其他途径的情况下,能很好地工作,而且速度还不错(200KB/s),着实让我有点意外。

2011年10月16日星期日

ubuntu下goagent开机自启动

GoAgent的安装和部署可以参考一篇旧文。下面讨论的是如何开机运行GoAgent。

Windows下是没有这种烦恼的(吐槽:linux下其实也没烦恼,“庸人”自扰而已),只需将proxy.exe加入开机启动项即可。在Ubuntu上,每次需要执行python proxy.py才可以运行goagent,而且需要一直开着终端,着实有点不太方便。要实现开机启动GoAgent,可以在 ~/.profile (如果没有该文件,自己创建)中添加以下语句:

# goagent
cd /usr/local/phus-goagent-b1f5004/local
python proxy.py > /dev/null 2>&1 &
cd ~

/usr/local/phus-goagent-b1f5004是我解压goagent的目录。

有几个问题需要交代一下:
  1. nohup

    当我刚开始尝试开机启动GoAgent时,使用的方法是在~/.bash_login(Ubuntu默认没有该文件,自己创建的)中添加 python /usr/local/phus-goagent-b1f5004/local/proxy.py, 显然失败了。这其实有两个问题,一个问题下面会介绍,另一个问题就是没有使用nohup,使得当终端关闭时,程序也就结束了。

    nohup的作用就在于忽略所有挂断(SIGHUP)信号,在shell注销后保持程序继续运行。它会把输出重定向到nohup.out的一个文件中,保存在当前目录下,如果无法在当前目录下创建文件,则会保存在HOME/nohup.out。但是`nohup' does not automatically put the command it runs in the background; you must do that explicitly, by ending the command line with an `&'.",所以通常都需要在nohup后使用&。

    在上面的例子中,我把输出和err输出都重定向到/dev/null,这样就免得生成nohup.out文件。

    Update:
    很不幸地发现,不使用nohup也是完全可以正常使用的(吐槽:之前多么无知无畏阿),但上面关于nohup的介绍是没有任何问题的。提醒一点,即便没有使用nohup, 命令后添加&使得程序运行在后台,还是不能省略的。

  2. /etc/profile .bash_profile .bash_login .profile
    我开始尝试失败的另一个原因就是把命令写在了一个错误的地方~/.bash_login。其实当以图形界面登陆时,并没有读取.bash_login文件,使得命令根本没有运行。shell的初始化文件不同情景下读取顺序情况如下:

    1. 图形模式登录时,顺序读取:/etc/profile和~/.profile
    2. 图形模式登录后,打开终端时,顺序读取:/etc/bash.bashrc和~/.bashrc
    3. 文本模式登录时,顺序读取:/etc/bash.bashrc,/etc/profile和~/.bash_profile
    4. 从其它用户su到该用户,则分两种情况:
    (1)如果带-l参数(或-参数,--login参数),如:su -l username,则bash是lonin的,它将顺序读取以下配置文件:/etc/bash.bashrc,/etc/profile和~ /.bash_profile。
    (2)如果没有带-l参数,则bash是non-login的,它将顺序读取:/etc/bash.bashrc和~/.bashrc
    5. 注销时,或退出su登录的用户,如果是longin方式,那么bash会读取:~/.bash_logout
    6. 执行自定义的shell文件时,若使用“bash -l a.sh”的方式,则bash会读取行:/etc/profile和~/.bash_profile,若使用其它方式,如:bash a.sh, ./a.sh,sh a.sh(这个不属于bash shell),则不会读取上面的任何文件。
    7. 上述原则凡是读取到~/.bash_profile的,若该文件不存在,则读取~/.bash_login,若前两者不存在,读取~ /.profile。

    更详细的讨论可以前往这里参考一下。

参考资料

[1]nohup MAN Page
[2]shell的初始化文件
[2]Ubuntu开机自动启动GAppProxy

2011年10月13日星期四

shell之引用

在shell中有两类字符,一类是普通字符,另一类是所谓的"元字符",在shell中有特殊的含
义或用法。

当我们需要去掉元字符的特殊含义而恢复其字面意义时就必须使用"引用".通常有三种引用
方式,分别是转义(Escape,使用反斜杠字符\),强引用(使用单引号)和弱引用(使用双引号):
  1. 转义是用反斜杠放在需要转义的字符前,使得"元字符"变成普通字符。
  2. 强引用是用单引号把字符串包含起来,其中任何字符都看作普通字符(包括双引号),除
    了单引号自身。所以无法在两个单引号之间包含一个单引号,用\转义也不行(\已被当作普
    通字符,失去了转义的作用)。
  3. 弱引用是用双引号把字符串包含起来,除了“(双引号,double quote),\(反斜杠,
    backslash),$(美元符号),`(注意不是单引号,而是反引号,ESC下的那个键,作用是命令替
    换)之外,其他的大部分字符被当作普通字符。

好像上面已经把规则说得够清楚了,那么试着解读一下下面这个语句:
awk 'BEGIN {print "Here is a single quote <'"'"'>"}'
输出:
Here is a single quote <'>
乍一看,对于这个结果还是蛮惊讶而且比较迷糊。其实这里利用了shell的引用的一个原则:
引用与后面接着的非引用字符,或者其他引用,会整合一个命令参数
所以对于上面那个例子的解释是,其实包括了三个引用:
  1. 'BEGIN { print "Here is a single quote<'
  2. "'"
  3. '>" }'
然后三个引用连接成为一个参数。下面的两个语句会有同样的效果:
awk ’BEGIN { print "Here is a single quote <’\’’>" }’
awk "BEGIN { print \"Here is a single quote <’>\" }"


参考资料:这里

2011年10月11日星期二

FAIL:20111011

这两天遇到四个个问题:
  • 双系统 windows 和 ubuntu 时间差8小时.这是由于Linux 操作系统是以 CMOS 时间做为格林威治标准时间,再根据系统设置的时区来确定目前系统时间。但是Windows 会将CMOS 时间看作本地时间。解决方法之一是让Ubuntu 也使用本地时间,修改/etc/default/rcS,把里面的 UTC=yes 改为 UTC=no。
  • smplayer(源安装)播放 rmvb 时有噪音,略微话音不同步,而用mplayer播放时没有这问题。不得其解。忍,我用mplayer。
  • mplayer不能正常播放mms,话说之前有一阵子是可以播放的,windows下用mediaplayer 播放毫无压力。不得其解。忍?这怎么忍?!尝试用其他播放器(vlc),同样不能播放。
  • virtualbox 下播放视频,或者用mediaplayer播放mms,花屏。去除virtualbox 2D加速,3D加速后,可以正常播放。这是不是应验前几天看到的“VirtualBox 烂死了”的论调?不得其解。可能与我显卡有关(GT540M,nVidia驱动,非源安装)。
所以很自然地,我想重新编译mplayer,或许能解决不能播放mms的问题。这样就开始了一整天炼狱般的体验(吐槽:或许这才是常态,我太naive): 各种库的依赖(吐槽: 忘记了 apt-get build-dep),编译时的漫长等待,编译参数的深邃莫测,以及最重要的...仍然不能播放mms!

一个字:FAIL!

2011年10月9日星期日

Emacs 中的简单排版

Tabs的使用

emacs中的Tab默认长度是8个字符,而且Tabs的行为有点智能,它并不是简单地插入一个制
表符,而是会依照上行的非空白字符的位置,来选择光标的移动位置。比如:
输入:TAB TAB Hello World,得到:“\t \t Hello World”,接着按下ENTER另
起一行,再按下Tab,此时光标会直接跳到与Hello中‘H’对齐的那一列,而不是简
单地插入一个制表符。
通常情况下,这正是我们所需要的行为,但当我们正需要一个Tab时,这种“智能“的判
断会给我们造成困扰。这时,可以使用C-q TAB。

我们还可以对TAB的一些特性进行定制。比如把tab的长度设置为常用的4字符:

(setq-default tab-width 4)

因为TAB会根据非空白字符的位置来移动光标,当需要移动的距离不是TAB字符长度的倍数,
会插入制表符和空格符来满足要求。应用这样规则的文本在用别的编辑器打开时,因为
TAB长度的差异,可能会使排版变得难看,所以更好的方法是当使用TAB键时不要插入制表符
\t,而是插入同等长度的空格符。可以用以下语句实现要求:

(setq-default indent-tabs-mode nil)


Autofill mode与M-q


Autofill 和 M-q 都与一个变量有关系,那就是default-fill-column,它的作用是设定排版
时每行的最大长度,这样排版出来的文章才会显得整理。设置default-fill-column为80,因
为它刚好是我屏幕的一半,这样分屏时也挺不会折行 :)

(setq default-fill-column 80)

Autofill 是一个mini mode,它会使输入超过default-fill-column时自动换行,免去用M-q
命令排版的麻烦。可以在.emacs文件中加入以下语句:

;;所有模式都默认开启auto-fill
(setq-default auto-fill-function 'do-auto-fill)

M-q 的函数是 fill-paragraph,会对所在段落进行排版,主要操作是去除多余的空白字符,
并在超过default-fill-column处加入换行。需要注意的一点是,默认情况下,段落间的标志
是相隔一空行,所以如果只是用ENTER另起一行,在用 M-q 排版时会被当作是同一段落。

fill前缀


Autofill 在换行时,可以添加一些前缀(prefix)。前缀的自动识别由变量
adaptive-fill-regexp 决定,emacs在断行时自动识别出符合的前缀,新起的一行会添加该
前缀。默认情况下空格与制表符都包括在能被识别的前缀里,所以如果新起的一行会保持与
上一行相同的缩进,甚是方便,充分体现了emacs 的强大。

也可以在你需要使用的前缀后敲入"C-x .",则光标之前的字符串会被当作前缀,换行时就会
添加该前缀。利用这个功能,我们可以方便地写出类似下面这样的排版:
EMACS太强大了:我同意
EMACS太强大了:我举双手赞成
EMACS太强大了:我坚决支持
EMACS太强大了:呵呵
另起一行,再输入一次"C-x .",就会取消这个手动设置的前缀。

更详细的介绍可以参考这里

居中


居中是在排版中常见的任务,Emacs提供了函数来实现这个任务:
center-line 绑定键 M-o M-s 使当前行居中
center-paragraph 绑定键 M-o M-S 使当前段居中
center-region 使选中区域居中

缩进

按照上述的设置和使用,在编写时应该能写出符合要求的排版。如果在输入完后,才决
定需要对某段文字进行缩进,这时可以使用C-M-\ (indent-region),它对选中的区域缩进一
层。注意,如果需要缩进多层,不该使用该命令,不然会使排版变得很糟糕。有更适合的命
令来实现多层的缩进,那就是C-x TAB (indent-rigidly),默认情况下,该命令会缩进一个
字符,可以配合C-u 使用。

2011年10月8日星期六

ubuntu 下配置Java环境

下载,安装

在Ubuntu源中可以直接安装jdk,但是只能安装Openjdk,而且版本不一定是最新的。还是选择使用官方版,在Oracle Java SE Downloads(吐槽: SUN 阿 SUN)下载Linux平台的自解压包,后缀为bin,说明是可执行文件。把自解压包放在准备安装的目录(比如/usr/local),需要通过chmod添加可执行属性,然后执行该bin文件解压即可。

配置环境

要使用Java,还需要配置环境参数JAVA_HOME,CLASSPATH,为了在终端中使用JAVA,还需把$JAVA_HOME/bin加入到PATH中。

可以在$HOME/.bashrc 中使用(假设java安装在/usr/local/jdk1.6.0_27):

# JAVA Environment
JAVA_HOME=/usr/local/jdk1.6.0_27
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME CLASSPATH PATH


但这样有一个问题,环境变量并不是全局的(只在所谓的nologin shell中有效),也就是说安装eclipse后,如果在桌面中启动eclipse会提示找不到JRE(eclipse需要JRE环境)。

所以更合适的方法是在/etc/profile中添加上述语句,因为login shell 会读取该文件,使得环境变量是全局的。

2011年10月7日星期五

latex 生成带QR码的名片

抄袭地址:这里


生成的效果如下:


要开发QR CODE译码应用程序除了使用现成的译码库(比如zxing)外,其实还要知道各服务的标准协议才能开发出真正的应用程序。比方说要如何判别什么时候是联系人、什么时候是打电话、什么时候是发短信、什么时候是开启网页、什么时候是纯文本备注。
这些都有标准协议,以下就简单说明各QR CODE应用协议:
发送短信
SMSTO:13800138000:BABY I LOVE YOU
发送彩信
MMSTO:13800138000:send mms
发送网址
http://www.hoojar.com/
拨打电话
TEL:13800138000
发送邮件
MATMSG:TO:hoojar@hoojar.com;SUB:TEST;BODY:THIS IS TEST MAIL FOR QR CODE;;
电话本
MECARD:N:李,林;ADR:湖南省株洲市;TEL:+8313800138000;EMAIL:hoojar@hoojar.com;URL:http://m.hoojar.com/;;
书签
MEBKM:TITLE:慧佳生活网;URL:http://www.hoojar.com/;;

使用pst-barcode宏包生成QR码,QR码中包含的信息为电子名片信息,格式为MECARD。虽然Vcard是通用的电子名片标准,但由于二维码的信息量有限,Vcard的条目过于详细,所以在用QR码存储名片信息时,更常用MeCard格式

模板如下:

\documentclass[11pt,a4paper]{memoir}

\setstocksize{55mm}{85mm} % UK Stock size
\setpagecc{55mm}{85mm}{*}
\settypeblocksize{45mm}{75mm}{*}
\setulmargins{5mm}{*}{*}
\setlrmargins{5mm}{*}{*}

\setheadfoot{0.1pt}{0.1pt}
\setheaderspaces{1pt}{*}{*}
\checkandfixthelayout[fixed]

\pagestyle{empty}

\usepackage{pstricks}
\usepackage{pst-barcode}

\begin{document}
%\pagecolor[cmyk]{.22,.36,.51,.08}%
\begin{Spacing}{0.75}%
\noindent
\textbf{Andrew~Brampton~Ph.D.}\\
\rule{75mm}{1mm}\\
\begin{minipage}[t]{30mm}
\vspace{-1mm}%
\begin{pspicture}(30mm,30mm)
% The MECARD format is used to exchange contact information. More information at:
% http://www.nttdocomo.co.jp/english/service/imode/make/content/barcode/function/application/addressbook/index.html
\psbarcode{MECARD:N:Brampton,Andrew;EMAIL:a.bramptonATlancs.ac.uk;URL:http://bramp.net;;}{eclevel=L width=1.181 height=1.181}{qrcode}
\end{pspicture}
\end{minipage}
\hspace{1mm}
\begin{minipage}[t]{42mm}
\vspace{-1mm}%
\begin{flushright}
{\scriptsize
\begin{Spacing}{1.5}%
% \textbf{Research Associate}\\
\textbf{Network Researcher}\\
Computing Department\\
Lancaster University\vspace{9mm}\\
\end{Spacing}
}
{\tiny
\textbf{email:} a.brampton AT lancs.ac.uk\\
\textbf{web:} http://bramp.net/\\
\vspace*{2mm}
}
\end{flushright}
\end{minipage}
\rule{75mm}{1mm}
\end{Spacing}
\end{document}