游戏人生

颂山川,吟古道,偏失半点笔墨;言世事,问苍生,更差一声长嗟。

vim对于大多数在Ubuntu下使用vim作为常用编辑器的同学来讲,他们遇到的第一个比较大的麻烦来自于vim与外部应用的复制粘贴。

当然,愿意选择ubuntu以及vim的同学肯定是google好手。不幸的是,各大论坛告诉你,你可以在命令模式下使用类似"*p或者"+p的命令将已经复制或剪切到系统剪切板的外部内容粘贴进来,也可以使用类似"*y或者"+y的命令将vim中的内容复制到系统剪切板中。很多同学照此操作解决了这个问题,然而也有一些同学则悲剧的发现,这个方法没有任何作用。

这一切都可以从vim帮助中找到答案。

无论是vim内部抑或外部的复制([y]ank)、删除([d]elete)、粘贴([p]ut),在vim中都是借助registers(寄存器)实现的,vim共有9类寄存器:

  1. 无名(unnamed)寄存器:"",缓存最后一次操作内容;
  2. 数字(numbered)寄存器:"0 - "9,缓存最近操作内容,复制与删除有别;
  3. 行内删除(small delete)寄存器:"-,缓存行内删除内容;
  4. 具名(named)寄存器:"a - "z"A - "Z,指定时可用;
  5. 只读(read-only)寄存器:":, "., "%, "#,分别缓存最近命令、最近插入文本、当前文件名、当前交替文件名;
  6. 表达式(expression)寄存器:"=,只读,用于执行表达式命令;
  7. 选择及拖拽(selection and drop)寄存器:"*, "+, "~,存取GUI选择文本,可用于与外部应用交互,使用前提为系统剪切板(clipboard)可用;
  8. 黑洞(black hole)寄存器:"_,不缓存操作内容(干净删除);
  9. 模式寄存器(last search pattern):"/,缓存最近的搜索模式。

上面的说明为简要概述,并不完全准确,详细说明须参考手册:

:help copy-move

无图形界面的vi或vim下可用的寄存器只包括{a-zA-Z0-9.%#:-"},显然,这里面没有包含上面提到的"*或者"+等选择及拖拽存器。

由此可见,实现vim与外部应用相互复制、粘贴的关键在于系统剪切板对于vim是否可用。查看vim剪切板是否可用的命令为vim --version,下面是我的系统下面的结果(我只保留了xterm_clipboard一项):

VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Apr 16 2010 12:47:47)
包含补丁: 1-330
编译者 buildd@
巨型版本 无图形界面。  可使用(+)与不可使用(-)的功能:
-xterm_clipboard

对于非GUI版本的vim,剪切板是不可用的,解决方案很简单,安装一下就是了:

sudo apt-get install gvim

下面是安装之后的结果:

VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Apr 16 2010 12:40:58)
包含补丁: 1-330
编译者 buildd@
巨型版本 带 GTK2-GNOME 图形界面。
  可使用(+)与不可使用(-)的功能:
+xterm_clipboard

笔记本上之前装的双系统(Vista + Ubuntu 9.10),在刚拿到机器的时候,把Vista从home换成ultimate,之前OEM的序列号竟然有效,所以就一直开着Windows Update,前段时间终于遭遇了传说中的黑屏。想想算了,自从使用Ubuntu,慢慢觉得使用盗版软件是一件可耻的事情,也就不想再去激活Vista了(当然也不会去买正版),不用就是了。

所以这次Ubuntu 10.04升级失败之后,决定不再要双系统,只装10.04(这次之所以急于安装10.04,是因为10.04开始支持iPhone和iPodTouch了)。我对恢复系统没有十足的把握,本来想好是要备份的,一冲动,只把自己需要的东西转到老婆的电脑上,没有备份/etc/var/usr下面的内容。于是这两天没做什么事情,开始重复噩梦:

==== evince中文支持问题 ====

evince是Ubuntu下默认的pdf阅读器,对于没有内嵌中文字体的pdf文件,evince无法显示。evince使用Poppler作为pdf渲染库,因此需要安装Poppler编码库poppler-data以支持中文显示:

apt-get install poppler-data

==== emacs中文输入问题 ====

Ubuntu中文输入从9.10开始默认使用ibus,安装新的输入法倒是比较简单,但默认的输入法切换使用Ctrl+Space。emacs23内置中文支持,但中文输入还是使用ibus更习惯一些。emacs下Ctrl+Space作为Mark Set快捷。

查了一下,是locale的问题,因为装的是英文环境,默认变量均为en_US.utf8,其中LC_CTYPE定义系统的字符处理编码,在/etc/environment(这是Ubuntu下的环境配置,个人的~/.bashrc文件中也可以)中添加LC_CTYPE="zh_CN.utf8",并在/var/lib/locales/supported.d/zh-hans中加入下面几行:

zh_CN.UTF-8 UTF-8
zh_SG.UTF-8 UTF-8
zh_HK.UTF-8 UTF-8
zh_TW.UTF-8 UTF-8
zh_CN.GB2312 GB2312
zh_CN.GBK GBK
zh_CN.GB18030 GB18030

执行sudo locale-gen,将在/usr/lib/locale/下生成对应的环境编码数据。

==== 本文重点1:安装trac ====

使用了几个月,感觉trac+svn也成了我的个人知识管理(KM)的一个标配。之前没有记录下自己的安装过程,这次重装的时候,顺便理一下整个重装过程(参考TracInstall)。

如果没有特别需求的话,不用svn最新的版本,下载稳定版本的Trac就可以了。

trac使用python(Ubuntu 10.04的python版本为2.6.5)开发,使用easy_install安装,如果没有:

wget http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py

可以直接使用下面的命令安装trac、SQLite、Genshi:

sudo easy_install Trac

Searching for Trac
Best match: Trac 0.11.7
Processing Trac-0.11.7-py2.6.egg

还可以选用MySQL、PostgreSQL作db,对于个人来说,SQLite够用了,就一个文件,很方便。

创建trac项目(在~/yulefox下创建名为km的项目),除指定项目名称和代码仓库位置外,其它我都使用了默认配置,所有配置都可以在项目目录下的conf/trac.ini中修改:

trac-admin ~/yulefox/km initenv
Creating a new Trac environment at /home/fox/yulefox/km
...
项目名称:Project Name [My Project]> FoxKM
数据库:Database connection string [sqlite:db/trac.db]>
代码版本管理工具:Repository type [svn]>
代码仓库位置:Path to repository [/path/to/repos]>/home/fox/yulefox/svn
Creating and Initializing Project
...
---------------------------------------------------------------------
Project environment for 'FoxKM' created.
If you'd like to take this new project environment for a test drive,
try running the Trac standalone web server `tracd`:

tracd --port 8000 /home/fox/yulefox/km

Then point your browser to http://localhost:8000/km.
...
Congratulations!

看到Congratulations!我就放心了:),按照上面说的方式就可以测试一下了,不过我们显然希望用apachenginx现在挺时髦的,不知道trac会不会支持nginx)搭建一个合适的Web Server。

Trac提供对CGI、FastCGUI、mod_python的支持(新加对mod_wsgi的支持),我对这一块并不是很熟悉,一般使用Apache + mod_python配置。

配置主机

我在自己的机器上使用fox.com作为虚拟主机名,反正我也不会去访问FOX,就用它了:D。我指定的IP是127.0.1.1,因为我只想在本地访问,你可以指定其他可用的IP:

# Adds virtual hosts to /etc/hosts

$ sudo emacs /etc/hosts
127.0.1.1   fox.com
127.0.1.1   www.fox.com
127.0.1.1   km.fox.com

创建虚拟主机配置:

# Adds one site named 'fox.com'
$ sudo emacs /etc/apache2/sites-available/fox.com

NameVirtualHost 127.0.1.1:80

ServerAdmin Fox
ServerName km.fox.com

DocumentRoot "/home/fox/yulefox/km"
# trac

SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnv /home/fox/yulefox/km
PythonOption TracUriRoot /

# trac login

Require valid-user
AuthType Basic
AuthName "TracLogin"
AuthUserFile /etc/home/fox/yulefox/km.passwd

启用虚拟主机配置:

sudo apt-get install libapache2-mod-python libapache2-mod-python-doc
sudo a2ensite fox.com
sudo /etc/init.d/apache2 reload

有可能会得到下面的提示:

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

需要在/etc/apache2/conf.d/目录下创建名为fqdn的文件,并添加配置的服务器:

ServerName fox.com

此时再reload Apache就清净了,访问一下http://km.fox.com/,提示:

TracError: The user www-data requires read _and_ write permissions to the database file /home/fox/yulefox/km/db/trac.db and the directory it is located in.

原来是访问权限的问题:

$ sudo chown -R www-data /home/fox/yulefox/km/
$ ls -l yulefox/km
total 44
drwxr-xr-x  9 www-data fox 4096 2010-04-11 16:25 ./
drwxr-xr-x 14 fox      fox 4096 2010-04-11 16:25 ../
drwxr-xr-x  2 www-data fox 4096 2010-04-11 16:25 attachments/
drwxr-xr-x  2 www-data fox 4096 2010-04-11 16:25 conf/
drwxr-xr-x  2 www-data fox 4096 2010-04-11 16:25 db/
drwxr-xr-x  2 www-data fox 4096 2010-04-11 16:25 htdocs/
drwxr-xr-x  2 www-data fox 4096 2010-04-11 16:25 log/
drwxr-xr-x  2 www-data fox 4096 2010-04-11 16:25 plugins/
-rw-r--r--  1 www-data fox   98 2010-04-11 16:25 README
drwxr-xr-x  2 www-data fox 4096 2010-04-11 16:25 templates/
-rw-r--r--  1 www-data fox   27 2010-04-11 16:25 VERSION

搞定!

==== 本文重点2:恢复trac备份 ====

之前的trac我是备份了的,恢复起来也很方便:直接把备份的文件夹内容copy到上面的km中即可:D。关于trac使用的细节和更多丰富功能的插件,本地文档或者官方网站上面都介绍的非常详细,这也是我喜欢使用它的一个原因。

时隔2年,Canonical的第3个LTS(Long Term Support,长期支持)版本Ubuntu 10.04(Lucid Lynx)即将(4月29日)正式发布。

ubuntu 10.04 LTS

LinuxPlanet的最新报告,10.04尚未正式发布,Ubuntu当前用户已达1200万。

使用Ubuntu刚半年,感觉还是比较好。10.04 beta1刚出,就把家里的本子从9.10在线升级10.04 beta1,不幸的是——升级失败:标题栏无法显示,很多快捷键和功能无法使用(Alt+F2、Alt+F7、Alt+F8)。而我又找不到出错的原因,只好考虑把系统备份之后重装。

之前还没有备份过系统,查了一下,关键是几个地方:

* 整理需要备份的内容并确认这些内容的对应的目录和文件;

* 用tar、dpkg等工具备份这些目录和文件及安装的应用列表。

* 整理需要备份的内容并确认这些内容的对应的目录和文件

对于个人用户(非商业应用或服务器应用),需要备份的内容主要包括:

* 个人数据:文档、书籍、代码、图片、音乐、视频、个人配置等,这些内容一般保存在/home下用户目录中;

* 应用程序:安装的一些应用程序及其对应配置:依照文件系统层次标准FHS,/usr中存放的应该是可共享的只读数据,因此除了/usr下的应用、数据、手册、源码等以外,还有这些应用(web、mail、ftp等)的可写配置及数据库等,一般位于/etc、/var中;/opt用于保存外部应用程序安装包,这些数据视需要也可以备份。

有些内容(如大多数应用程序)不一定需要备份,只要你的网络足够好,reinstall的时间也不会长,还有一个原因就是,一些应用更新的速度比较快,备份的意义不大,尤其是在系统升级或更换其他系统的时候,但个人数据和一些应用的配置、数据库等就不是网络好能替代的了。

可以参考一下这篇文章:Backup Basics and Different types of backup

总结一下,需要备份的目录主要是:

/boot
/etc
/home
/opt
/root
/srv
/var/lib/mysql
/usr/local
/var/www
/var/www

* 用tar、dpkg等工具备份这些目录和文件及安装的应用列表

一种简单、直观的方式:

tar cvpzf backup.tgz / –exclude=/backup.tgz –exclude=/dev –exclude=/lost+found –exclude=/media –exclude=/mnt –exclude=/proc –exclude=/sys

如果需要定期备份,可以写入shell,借助/etc/crontab实现自动备份。

对于来自Windows的懒人来说,这些算是比较麻烦的了,ubuntu下安装sbackup工具可以替代上述工作:

sudo apt-get install sbackup

详情见:Backup and Restore Your Ubuntu System using Sbackup

dpkg主要用于备份和恢复安装的所有应用程序:

* 备份

dpkg –get-selections | grep -v dnstall > ~/softlist

* 恢复

sudo dpkg –set-selections < ~/softlist


话说10.04 beta2今天已经发布,这个周末,有的搞。

最近有点忙,本来要用autoconf+automake把自己的代码梳理一下的,因为工作停了近两周。

本想看看有什么工具可以自动生成Makefile.am,答案是:Automake不支持通配符,而且还口口声声,振振有词。既然说的这么言词凿凿,情深意切,我想我也没有必要用shell生成Makefile.am了。

用着用着,我有点怀疑人生了:不知道什么时候需要用autoconf和automake。如果我只是平时自己写一些toy codes的话,感觉用autoconf和automake有点大炮打蚊子的感觉,而且每次新加代码或者是移除代码、甚至是更改目录,都要重新执行autoconf、automake(不知道我说的对与不对)。对于一个大型项目,执行一次configure和make是很痛苦的一件事,make的中间目标文件或者库文件、执行文件倒是不一定非得完全rebuild,configure的配置检查呢?是不是也有类似机制?反正我在用ogre或者cegui的时候,每次执行./configure是重新配置了的。

实际在开源项目里面也不可能维护两套makefile吧。

看了一下googletest的配置,倒是清爽的很,最大的特点是只有一个Makefile.am,这样在一个项目里面只需要维护一个Makefile.am就够了。

cegui比较常规,每个子目录都会维护一个Makefile.am。

需要特别注意的是ogre从1.7.0开始已经开始使用cmake了……

请听题:管理中小型项目,你倾向于下面哪个工具?

o make:钻木取火,玩的就是个技术,编译代码,只用装B的,不用牛B的,你要是用什么cmake,你都不好意思跟别人打招呼,这么经典的东西,精通需要多久?要我说怎么着也得个把俩月吧,个把俩月?那是入门,至少半年,就这还得有Feldman的悟性,不舍昼夜;

o autoconf+automake:既有群众基础,又有技术含量,你是那样拉轰的男人,不管在什么地方,就好像漆黑中的萤火虫一样,那样的鲜明,那样的出众。你那忧郁的眼神,稀嘘的胡喳子,神乎其技的指法;既可以耻笑原始人的生产力低下,还可以鄙视现代人的不学无术。

o cmake:在MSVCers面前抬不起头,在UNIXers面前似乎更抬不起头;而cmake对WINDOWS和UNIX平台的完美支持,足以让所有的MSVCers和UNIXer在你面前抬不起头,你是公鸡中的战斗机。所以你还是可以趾高气昂的丢下一句:走NB的路,让SB说去吧。

到目前为止,所参与的项目使用过的版本控制(VC)工具全是Windows下的:VSS(Microsoft Visual SourceSafe)和AlienBrain。

只发现一个缺点:

o 版本以文件为核心,回滚、封版本比较麻烦;

和同事讨论之后,决定换用SVN,原因就是SVN fix了上面的缺点。SVN或许不是目前最好、最先进的VC,因为Git其实也是个不错的选择。对比之下,大家对SVN更加熟悉,而且足以解决目前VC中遇到的问题。

因为这事儿我来做,所以,我就按自己的喜好选择了Linux。

在Linux下使用SVN虽然不像Windows下那么方便,但也完全在可控范围之内。

我于Linux并没有太多经验,只是在使用Ubuntu桌面系统而已。因为FreeBSD的广泛应用,于是一开始考虑过使用FreeBSD作代码服务器,没别的理由,就是有人说好,我也觉得FreeBSD专业一点儿,有UNIX的血统在。

找系统部同事装服务器的时间,一位同事结合自己的经验,推荐我使用CentOS。心想,装一个试试吧。装好之后,觉得不太合自己的操作习惯,还是准备安装 FreeBSD。

FreeBSD相比其他系统要复杂的多,我和同事之前都没用过FreeBSD,整个安装和配置过程,一直要查资料,后来实在受不了了,只好放弃。

最后还是选择了自己稍为熟悉的Ubuntu Server版,换成Ubuntu的确舒服多了,很快就配置好了网络和服务器环境。

后面又花时间在上面放了一个blog。

在Ubuntu下虽然没有Windows下那么方便的VisualSVN,但搭建Apache2+SVN的过程也不复杂,并不一定要编译安装。

o 这篇文章详细介绍了Linux下Apache2+SVN的配置过程;

o 这篇文章详细介绍了通过Web修改SVN账号密码的配置过程。

第一次弄的时候,这些东西都折腾了很久,后面稍微熟悉一些之后,觉得Apache和PHP的东西还是都很强大的,都值得花时间去好好消化一下。

从接触和使用make以来,前前后后写了不少Makefile(添添减减、修修补补,累计上千行是有的),今天在重新整理代码的组织结构之后,突然就想:我为什么不使用Autotools呢?

在开始体验功能强大的Autotools之前,简单(详细)回忆总结一下我使用make的经历和思考的过程,反省一下看看自己在接触这些新鲜事物的时候到底走了多少弯路。

o Cygwin

今年3月份,拜Kevin Lynx所赐,每次对Linu浅尝辄止的我终于下决心接触了Cygwin环境,并一发不可收拾。

刚开始的时候,就像大学刚接触编程那样,写“hello, world”,在终端用gcc命令直接编译,然后开始写最简单的只有一个all的Makefile。因为Emacs、GCC、make对我来说都是崭新的 工具,后面重心就不是放在写代码上了,而是急于掌握他们,以求达到在Windows下的开发效率。

去年11月底,当时还没有开始用Cygwin,就买了一本《Managing Projects with GNU Make》,此时也算物尽其用了。慢慢开始使用variables、macros、phony targets、functions,按步就班的系统学习应用。

o Ubuntu

磨磨蹭蹭过了半年,其间因为忙着毕业,对Cygwin和Emacs、GCC、make也算比较熟悉了。

今年10月份,开始使用Ubuntu,刚开始在Windows下用wubi安装,很快就直接用新的硬盘分区物理安装,并随着Ubuntu 9.10的发布,升级到了9.10

这前后写Makefile最大的区别就是,之前纯粹是为了写而写,之后是为了用而写。

随着整个代码结构的不断膨胀和修改,Makefile也不断的变化。

Makefile自身的最大变化是从之前的因为编写错误、通用性差而不断修改,演变到最后代码增减不会影响Makefile,只是为了增加tags、优化结构而改动。

经历了这个过程后,对于Makefile的结构就比较熟悉了,而且可以从其他使用automake的项目的Makefile中学习借鉴了。


之所以想到使用autotools,是因为接触的很多开源项目的代码都使用了这一组工具。

对于用户而言,一般的项目编译安装的过程:

o bootstrap:检测autoconfautomakelibtool及其版本并完成初始化,生成configure;

o configure:检测系统平台及软硬件环境,确定适用本地环境的编译策略,生成Makefiles;

o make:编译、链接;

o make install:安装;

o ldconfig:配置环境变量。

对于开发者而言,则需要通过autoconf、automake为用户组织起上面的过程:

Autoconf 流程

Autoconf 流程

对于这一流程,我的方法是照葫芦画瓢,参考OGRE等项目的相关文件和工具的GNU文档。

写个Hello, Kitty。

操作的流程和期间出现的几个问题总结一下:

o cd project_dir:转到项目目录;

o emacs Hello.cpp

#include <iostream>

int main(int argc, char** argv)
{
std::cout << “Hello, Kitty!” << std::endl;
return 0;
}

o autoscan:生成configure.scan

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.64])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([Hello.cpp])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT

o mv configure.scan configure.in:改名;

O emacs configure.in:编辑configure.in

AC_PREREQ([2.64])

# 这个是自动生成的,因为代码中没有相关初始化信息,这里手动修改一下,非必要
AC_INIT([CgFox], [0.0.1], [http://www.yulefox.com])

# 这个是必须的,否则无法生成aclocal.m4
AM_INIT_AUTOMAKE([CgFox], 0.0.1)

AC_CONFIG_SRCDIR([Hello.cpp])

o aclocal:生成aclocal.m4(太长了,还没去仔细了解)和autom4te.cache;

o autoconf:生成configure(也很长,先不看);

o automake –add-missing。

……


本来想等明天(今天)弄完了再详细整理一下。不过我没有打算把这个东西搞成一篇教程。记下来更多的只是为了给自己留下一个lable,知道自己这几天在做什么。

最近又是两点左右睡。脑子里有个家伙告诉我这样不好;另一个家伙告诉我他还不困;还一个家伙告诉我明天还要上班。

我去你大爷的!

昨天的问题解决了:安装uuid-1.6.2之后,还需要执行ldconfig更新其soname(详见下文)和缓存文件(/etc/ld.so.cache)。

顺便翻译了一下下面的内容,整节内容太多,就不想翻了。


3.1.1. 共享库名称(原文在这里

每一个共享库都有一个名为“共享名称”的额外名称。共享名称由“lib”前缀、库名、“.so”、一个句点和一个随库的接口改变而递增 的版本号组成(作为特例,最底层的C库没有“lib”前缀)。完整意义上的共享名称包含所在目录作为前缀;工作系统中,完整意义上的共享名称只是一个 指向共享库“真实名称”的符号链接。

每个共享库还有一个“真实名称”,包含实际库代码的文件名,真实名称是共享名称后跟句点、次版本号、句点、发布版本号,最后的句点和发布版本号 是可选的。次版本号和发布版本号通过配置控制,可以使用户确切知道当前安装的共享库的版本。注意,这些数字可能与文档描述中使用的数字不同。

此外,还有一个编译器请求库时使用的名称(我称之为“链接名称”(linker name)),该名称是不包含任何版本号的共享名称。管理共享库的关键在于这些名称的区分。程序内部在列举所需共享库时应只列举共享名称。反之,当你创建 一个共享库时,只创建特定名称(包含详细版本信息)的库。

安装新版本共享库时,你将其安装到某一指定目录下,随后运行ldconfig(8)程序。ldconfig检测已经存在的文件并创建共享名称符号链接指向真实名称,同时更新缓存文件/etc/ld.so.cache(稍后描述)。

ldconfig并不设置链接名称;通常这项工作在安装库时完成。链接名称只是简单创建一个指向“最新”共享名称的符号链接。我推荐拥有链接到 共享名称的链接名称,因为大多数情况下,如果你更新了库,你希望自动使用最新的库进行链接。我曾问过H. J. Lu为什么ldconfig不自动设置链接名称,他解释说或许你在运行代码时希望使用最新版本的库,但在开发时却希望链接到老版本(新版本可能不兼容)。 故而ldconfig并不考虑你希望程序链接到哪个第版本,因此安装者必须明确修改符号链接以更新链接器使用的库。

/usr/lib/libreadline.so.3是完整意义的共享名称,ldconfig会将其设置为符号链接指向某个真实名称如/usr /lib/libreadline.so.3.0。同时会有一个链接名称/usr/lib/libreadline.so,作为符号链接同样指向/usr /lib/libreadline.so.3。


像因为类似的问题导致半天半天的时间流逝,让我极其不爽。

更不爽的是,uuid-1.6.2的库主要是C语言写成的,虽然也提供了C++实现,但都是包含了所有UUID版本的实现。我其实只需要一个可以生成UUID的API,所以我还是自己在其C语言版本上自己封装了一个简单的单件,却感觉写的真TMD丑陋,尤其是上面蹩脚的英文注释,写的烂、还最浪费时间,为了TMD一个单词憋半天,结果还是觉得恶心。Fucking GFW(不好意思,我也不知道这和GFW有什么关系)!

By comparison, OSSP uuid (current stable version is 1.6.2) is selected for UUIDs generation in my application.

MS’s GUID is random-number-based (it may have confidence in its prng) and its variant is 10 but not 11.

I have installed uuid-1.6.2 in /usr/local/lib successfully. It ran normally when I was in company. However, I got this with my thinkpad SL500 (the OS is the same Ubuntu 9.10):

error while loading shared libraries: libuuid.so.16: cannot open shared object file: No such file or directory.

The symbol links of libuuid.so and libuuid.so.16 are both /usr/local/lib/libuuid.so.16.0.22.

My Makefile is as follows:

CPPFLAGS = -I ../pub -I ../src/app
bindir = bin
libdir = ../lib
libs += -lgtest -luuid
tar = $(bindir)/unit_test
all: $(tar)
$(tar): $(objs) $(libs)
$(COMPILE.cpp) -o $@ $^

I will try to fix it tomorrow.

折腾Ubuntu折腾的我不亦乐乎,之所以用毕业这个词,是因为基本功能折腾的差不多了,我可以像Windows下去使用。接下来我需要把精力更多的投入到开发上了。

汇报几点:

o 浏览器:使用Firefox(3.5.4)。亮点:Space向下翻页,Shift-Space向上翻页,Ctrl-0、Ctrl–、Ctrl-+进行缩放,这些功能可能大家都有,但在Ubuntu下,轻易不动鼠标的习惯让人更自觉的去敲键盘。Firefox的配置管理等丰富的功能也让我很快就习惯了它;

o 阅读器:Evince(Document Viewer 2.28.1)。亮点:Space & Shift-Space在这里一样有效;每次打开文档,停留在你上次阅读的位置。当然,一般的阅读器提供书签,但使用书签毕竟多了取放书签的操作,谁不是在看过之后,直接一个关闭呢?

o 在Windows下,不管是开发还是其他应用,我应该算是使用快捷键比较多的了。来到Ubuntu,我依然时常有原来这个功能也有快捷键这样的感慨;

o 再次感慨Make、Emacs、Gdb、SVN的博大精深,同时也说明我对他们的使用还没有到驾轻就熟的地步。

我不确定我现在做的事情会在什么时候能够确切的体现到工作中,所以在工作例会上我强调这是我的个人兴趣。但因为个人兴趣导致了工作内容的滞后(虽然并不是开发任务,只是组织学习讨论),但在意识到这种情况之后,我也提出希望利用周末时间好好整理一下;

o iBus输入法没有软键盘,输入特殊字符比较麻烦,需要使用其Chinese-PinYin输入法以ifu为前缀。


本周早些时候,FH问我要不要Google Wave,我兴奋的直呼:我要!不过GW的邀请通过真是慢,直到周五才拿到,大概等了三天。刚开始使用,可以交流的人并不多,在我看来,其最大的特点是对Google产品(尤其是搜索产品)的优势整合。我不希望抱着玩的心态去体验,只是希望可以随着GW的普及,为工作、学习和生活带来更多的便利。

有人在洗刷GW的难以理解:我们看到,大多数人认为GW比自平衡二叉查找树、C14年代测定、死神、新古典主义经济学、组合博弈论、男人、人自身的存在、Google Fast Flip等要难懂。

当然,GW不是这个世界上最难理解的。因为,还有Obama获得诺贝尔和平奖、美国免税代码、多级静电加速器、中国的电报码、女人、Microsoft Visio 2004等让人费解。

通过Google搜索,如果输入中含有什么,页面竟然会被重置,这是为什么

对于使用Ubuntu刚1周的我来说,从9.04升级到9.10,最明显的差异只是集中在视觉感受上,确实好很多,画面更加丰富。不幸的是,同样是ext3,9.10启动明显比9.04慢,准备转换成ext4再试试。据说10.04 10秒启动,不知能否实现。

Ubuntu 9.10明显是支持ibus替代scim作为中文输入,之前安排的scim输入法已经被删除。而使用ibus的五笔输入倒也没有感觉比scim差。只是看到ibus的引擎是用python写的,至于具体的比较,我暂时没有这样的需求:)。

emacs的版本升级到了23.1.50.1,因为我之前就已经在使用23.0.91.1,所以也没有感觉到特别的不同。

使用过程中,这次更新似乎对wine产生了一定的影响,跑War3的时候,全屏显示和声音会出问题,大家也是各说一词,问题不尽相同。我是通过Wine Configure对Audio和Graphics随便改了一下就过了。反正只是玩游戏的时候用一下,也懒得深究。

遇到的其他问题大都不是升级造成的,而是语言选择带来的。因为之前只是在安装时选择了英文,后面发现系统里像日期显示、一些提示信息和一些菜单名称 等还是汉字,开始也没理。这次升级之后,看了一下Language Support,才发现没有装英文包,而中文的我又没装全,导致了这样的问题。于是装了英文包,所有显示都正常了。结果后面发现Emacs、GEdit的 中文都无法正常显示,连War3也无法启动了。后面在/etc/environment里面加上LC_CTYPE=”zh_CN.UTF-8″才正常,于 是我的locale就成了这样:

LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE=zh_CN.UTF-8
LC_NUMERIC=”en_US.UTF-8″
LC_TIME=”en_US.UTF-8″
LC_COLLATE=”en_US.UTF-8″
LC_MONETARY=”en_US.UTF-8″
LC_MESSAGES=”en_US.UTF-8″
LC_PAPER=”en_US.UTF-8″
LC_NAME=”en_US.UTF-8″
LC_ADDRESS=”en_US.UTF-8″
LC_TELEPHONE=”en_US.UTF-8″
LC_MEASUREMENT=”en_US.UTF-8″
LC_IDENTIFICATION=”en_US.UTF-8″
LC_ALL=

总之,如果你希望为自己构建一个英文的系统环境,但又要使用中文输入和一切带有其他语言文字的文档、程序,这就和在Ubuntu下用Wine一样,都有一点想脱俗没脱掉的感觉,还是比较恶心的。


最近甲流比较肆虐,官方的说法是:目前中国所流行的流感病毒中,近80%是甲型H1N1流感病毒,随着天气转冷,疫情上升趋势将会进一步呈现。

大家注意身体!