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}