2007年12月24日星期一

重大利空:《常胜狐狸》被发现有不良资产注入

花荣一向自命风流潇洒,其京城大鳄操盘手的身份更是引起外界强烈的好奇,著书写博,引得粉丝无数。但近日被发现在其2006年初出版的《常胜狐狸》(经济管理出版社)一书中,有未经公告的资产注入(原书第3页),有分析师认为是对花荣人格的重大利空:

大数定理指出:当随机事件(X)发生的次数(n)很大时,偶然性会互相抵消。使这些事件 1 n 的结果(X1,X2,……,Xn)的算术平均值(-∑ Xk) 在概率意义下十分接近其数学期望(E(X))。 n k=1
比如,由于硬币的两面是均衡的,我们可以计算出它抛掷落地后任一面朝上的概率均应是0.5,这就是数学期望。如果我们真的抛掷了很多次,就会发现实际的频率与0.5十分接近。而由手颤、空气紊流等偶然因素造成的误差已被中和抵消。
有兴趣的读者还可以调查一下书中介绍博弈论的相关内容。

其实花荣的小说《操盘手》,在我看过不多的几本股市小说(还有《高位出局》,《基金经理》)中,我是最喜欢的,附带说一下,那本《基金经理》可以说是垃圾。他在博客以及狐狸系列丛书中所倡导的财富自由,盈利模式,盲点套利等理念都深得我心,终于找到一个投机(言语投机,投机客)的人来一起研究研究股票了。当然我的炒股水平比起花荣来,只是小学生一、二年级的样子(绝不自谦),所以心里是把花荣当老师看的

吾爱吾师......

2007年12月16日星期日

把你的Linux变做网桥

网桥的确是过时了,现在哪个单位没有交换机啊,不过研究研究总是没有坏处的,有人就用它在一台电脑上组建自己的虚拟网络。再说Linux已经超越Windows98了,下一个目标就是WindowsXP,而XP有的功能我们Linux怎么能没有呢?

可以很轻松的在Linux上实现网桥的功能。网桥功能自2.4开始已经集成进内核,不过我们还是要安装一个工具brctl

sudo aptitude install bridge-utils
使用起来也很简单。如果你是Ubuntu,你需要将/etc/network/interfaces配置成这样
auto eth0
iface eth0 inet static
address 0.0.0.0

auto eth1
iface eth1 inet static
address 0.0.0.0

auto br0
iface br0 inet static
address 192.168.1.89
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 192.168.1.1
bridge_ports eth0 eth1
br0就是网桥的名称,它桥接了eth0和eth1。注意eht0和eht1的IP地址都被设为0.0.0.0,如果这台机器你只想把它作为网桥使用,也可以将br0的地址设为0.0.0.0(当然网关,子网掩码之类的也统统不要),那我们就组建了一台透明网桥,它对于网络中的其它机器是不可见的(没有IP)。

顺便帮助理解一下网桥的概念。启用网桥后,可以看做网桥对外代替了被桥接的适配器,如果网络中的机器要与网桥服务器通讯,不管它从哪个适配器进出,使用的是网桥的ip。启用网桥
sudo ifup br0
那么我们安装的工具在哪儿呢?其实这背后的机制就是/etc/network/if-*目录中的bridge文件,我们仔细看看就知道其实它调用了brctl,这就是我们一开始安装的工具。

我们也可以自己手工使用brctl,比如创建和删除一个网桥:
brctl addbr bridgename
brctl delbr bridgename
关于brctl的用法和更多实例可以参见Net:Bridge

2007年12月10日星期一

Linux上的虚拟网卡

有时候,为了服务器测试,或虚拟机应用(VMware就自带了,但VBox没有),我们会需要一个虚拟网卡,这对Linuxer来说真是太简单了

如果使用Ubuntu,安装一条命令就够了

sudo apt-get install uml-utilities
现在,我们可以来创建虚拟网卡了
tunctl -t tap0 -u peter
创建了一个名为tap0的虚拟网卡(就象第一块网卡通常称为eth0),拥有者是用户peter。不过这里的拥有者不是指创建的设备文件/dev/net/tun的拥有者,有些应用可能需要对/dev/net/tun拥有写权限,需要另行处理,一个简单的办法就是把该用户加入uml-net用户组。

删除虚拟网卡tap0可以这样
tunctl -d tap0
我们可以象配置eth0那样配置它:
ifconfig tap0 192.168.0.12 netmask 255.255.255.0
如果需要一开机就自动创建,并且配置好,你可以在/etc/network/interfaces中添加如下内容
auto tap0
iface tap0 inet manual
up ifconfig $IFACE 192.168.0.12 up
down ifconfig $IFACE down
tunctl_user peter
如果你很好奇这一切是怎么创建的,可以查看interfaces的man页,以及/etc/network/if-*目录下的uml-utilities文件。

2007年12月9日星期日

用Linux做一个最简单的网关

你可以用一台淘汰的奔三电脑,装上Linux,做成一个最简单的网关

# iptables forward
echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -A FORWARD -i eth0 -j ACCEPT
# 或者你可以使用网段
#iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
这里eth0(或网段192.168.0.0/24)连接内网,eth1连接外网(另一个局域网,Internet等等)。

2007年12月8日星期六

李宇春牌音箱

昨天帮一个玉米重装电脑,为了看一下声卡驱动是否正常,接上她的音箱,上百度随便挑了首周杰伦的《忍者》来放,熟悉的音乐响起,耳边传来了李宇春的歌声“快使用双截棍......”

2007年12月7日星期五

Vista电源管理:睡眠、休眠与混合睡眠

哈姆雷特认为人生只有两种选择,生存或者毁灭,但懦夫都知道,还可以逃避。菜鸟们只知道电脑可以关机或重新启动,但高手知道我们还可以睡眠、休眠或者混合睡眠。

先来看一下我的系统支持哪些状态

这里可以看到,系统支持等待(睡眠,S3),休眠和混合睡眠。

睡眠,休眠,傻傻分不清楚?

睡眠

睡眠状态下,除内存之外,CPU、硬盘、风扇等其它外设都被关闭,数据依然在内存中,你不能拔掉外部电源,否则内存失去供电,数据丢失,相当于正常关闭计算机。这个功能在WindowsXP中被称作待机。

休眠

休眠状态下,内存数据会被保存到硬盘上,然后包括内存、CPU在内的几乎所有设备都被关闭,相当于仅主板接通电源时的状态。你可以关掉电源,下次开机时会从保存在硬盘的内存数据恢复关机前的模样。这个功能在WindowsXP中称作睡眠。

Vista的休眠目前有个Bug,从休眠中恢复过来后许多usb设备不能使用,包括鼠标、键盘等,乌龙的是WindowsXP似乎就有这么个Bug,后来还修复了,Vista又来一遍。估计到Vista SP1出来的时候会解决。

Vista默认开启了混合睡眠功能,这会使得休眠功能不可用。混合睡眠包含了休眠功能,如果你要使用单独的休眠功能,可以关闭混合睡眠。

你可以通过BIOS设置使得混合睡眠功能不可用:Power Management Setup->ACPI Suspend Type,选择S1 (PowerOn-Suspend) 。

当然你也可以保留S3 (Suspend-To-RAM),而选择在Vista中软关闭混合睡眠功能:控制面版->系统和维护->电源选项->更改计划设置->更改高级电源设置->睡眠->允许混合睡眠,选择关闭。

混合睡眠

混合睡眠是Vista中新增的一种电源管理模式,它结合了睡眠和休眠两种模式,简单说就是将数据同时保存到内存和硬盘的睡眠模式,这时如果切断了电源,就相当于成了休眠模式。

Vista在这里有容易引起误解的地方,如果你开启了混合睡眠(默认),开始菜单中的睡眠选项其实就是混合睡眠。只有在关闭混合睡眠的情况下,关机菜单中的睡眠才是上面所说通常意义上不能切断电源的睡眠。

日常使用中,微软建议使用混合睡眠。

只有当您需要安装或修理硬件时才关闭计算机,例如:安装新的硬盘或视频卡或者添加内存(RAM)。
无论是睡眠还是混合睡眠,我都遇到了炸尸现象,刚进入睡眠就立刻被唤醒。参考了这个帖子后,在设备管理器里,关闭鼠标的允许此设备唤醒计算机功能,问题解决。幸运的是即使切断电源,重启后也没有usb设备不能用的问题。偶尔碰到切断电源后唤醒,屏幕没有信号。

关于系统电源状态更技术性的介绍可以参看酷暑里的冰淇凌:PC功耗管理详细指南

2007年12月6日星期四

从硬盘安装Vista

我使用的是Windows Vista Ultimate OEM 21in1 简体中文版(终结版),你可以在这里查看光盘说明,下载BT种子(需要注册)。事实上BT的源很少,我是用电驴下的。

光盘大小:4.25G
md5: d1bfe0a40eb4d9a90fe579caf982c7bf
SHA1: 8485c7f8edbd94bdf8d3f6c381c04270138e4d54
CRC32:df37d91f

电驴下载链接
ed2k://|file|VISTA_OEM_CHS_UM_21in1.iso|4568154112|DBD051740EDAF0E2D9C296F681B2A119|h=5EBT574PE
Z2YH5WCBKSUJWBBWQBS7XPN|/
虽然一开始就准备硬盘安装,但我还是想刻盘收藏一份。遗憾的是我在Kubuntu下使用K3b,居然给我刻坏了2张DVD刻录盘,只有放弃。

据说Vista可以使用虚拟光驱进行安装,而不用解压缩iso文件。但了解和实践的结果都不符合我的要求:在已有的WindowsXP下使用虚拟光驱不能格式化C盘,WinPE下安装说找不到硬盘,我的可是老式的IDE硬盘!当然很可能是我的WinPE不是2.0,比较老的缘故(龙卷风系统维护光盘)。

本来也想整个新一点的WinPE玩玩,但看到有人说可以不用winPE,完全硬盘安装windows vista ultimate版,何乐而不为呢:

  1. 用WinRAR解压缩镜像文件到D:\vista21
  2. 拷贝D:\vista21目录中的bootefi目录,以及bootmgrsources\boot.vim文件到C盘根目录,注意保持目录和文件的相对路径。
  3. 打开命令窗口,进入C:\boot目录,运行
    bootsect.exe/nt60 c:
  4. 重启电脑,出现Vista安装界面,选择修复计算机,会自动搜索,稍等一会等它结束,点下一步,在新出现的界面中选择命令提示符
  5. 在命令行窗口中你可以格式化C盘
    format c: /fs:ntfs
  6. 转到D:\vista21\sources目录下,运行setup.exe正式开始安装。注意不是D:\vista21下的setup.exe,运行这个会提示找不到光驱驱动之类的错误,安装不下去。一开始没注意,在这里栽了跟头
  7. Vista的安装程序似乎更智能了,会自动选择安装联想OEM版。安装完第一次进入系统后会重启一次,不过感觉象遇到故障重启一样,一下子整个黑掉,而且这第1次甚至没问我创建用户名什么的,如果你装过WindowsXP,第2次启动就会感到很熟悉了。
一切完美,我抄在这里备忘。

2007年12月5日星期三

Vista安装准备工作——升技AV8 BIOS修改手记

在电信的电影网站看电影需要个插件Real2Asf,以前一直与Vista不兼容,也就一直XP用着,最近看到有了Vista专用插件,日常看电影的需求基本解决了(养驴乐此不疲的BT时代已离我远去),妹妹也嚷着要Vista尝鲜。于是决定动手了。

先去远景论坛侦查了一番,发现软激活在SP1下有很多失败的例子,我想微软已经在封流出来的序列号了,应该不会是检测OEM信息究竟是来自BIOS还是通过Grub Load的。但谁知道呢,封序列号会引发一大堆售后问题,决不能低估这个世界上电脑白痴的数量。抱着一丝丝侥幸的心理,决定选择更Geek的方法,改BIOS。

很幸运,发现有人已经实验成功了。根据这个线索,我也很顺利的成功了,甚至比原始的教程更简单,因为所用的修改软件已经更新了。

我的主板是升技的Av8,先去它的网站下载了最新的BIOS文件,解压后主要有两个文件,BIOS文件AV8_28.BIN和刷新工具awdflash.exe(事实上我后来用的是AwdFlash v8.73,而不清楚这个自带的工具版本)。

修改软件我使用的是最新的2007.0327 纯动态版 3.28日更新 新方法,解压后运行0327B1.exe
一切都是傻瓜式:选择BIOS文件AV8_28.BIN,选择使用哪个品牌的SLIC(我使用的是Lenovo),然后点击ONE KEY PATCH,然后会跳出几个Dos窗口,其中第一个需要你按3次回车,然后直接关闭即可。最后会在目录下生成新的BIOS文件LENOVO-AV8_28.BIN

附带说一下,软件的第2个标签是用于在已装好的Vista修改序列号的,第3个标签是用于删除BIOS文件中一些不重要的模块的,以便添加SLIC信息,如果你的BIOS文件所余空间太小的话。幸好我们的AV8_28.BIN空间足够。最后一个标签是使用说明。

最后一步就是把修改过的BIOS文件刷进主板BIOS芯片。我把LENOVO-AV8_28.BIN拷贝到D盘根目录,并改名为AV8.BIN,因为接下来的操作要在Dos下进行,原来的文件名已经超过8个字符,不方便,还有D盘是fat32文件系统。刷新工具awd873.exe也被拷贝到D盘根目录。

接下来使用深山红叶,龙卷风之类的工具光盘启动到Dos系统,转到D盘,注意Dos下盘符可能有所变化,你需要dir确认一下。最后刷新BIOS:

Awd873.exe AV8.BIN /PY /SN /CC /CD /CP
不带任何参数运行会显示帮助文档。

刷新后第1次重启,告诉我BIOS checksum错误,按F1继续,第2次启动就没这个提示了。不过这里我碰到一个问题,就是进不去XP了(我还没装Vista)。经过一番折腾后发现是老问题,主板不支持DDR 400,需要降频使用,想当初这块主板刚买来,就是因为这个问题老是造成系统重启,因为找不到原因而郁闷了半年。所以最好在第1次重启时就按F2,进行一番BIOS设置。

可以使用EVEREST Ultimate Edition V3.80.909_绿色多国语言版查看修改是否成功。

大功告成。

2007年12月3日星期一

给Portable Firefox安装Flash插件

Portable Firefox使用方便,更新及时,我甚至拿它来本地使用,即使重装系统也不怕丢失配置了。

不过Portable Firefox默认不带Flash插件,现在视频网站这么流行,这可是个大问题。解决也很简单:

首先下载ShockwaveFlash for Firefox,用7-zip解压,将NPSWF32.dllNPSWF32_FlashUtil.exe复制到app\firefox\pluginsflashplayer.xpt复制到App\firefox\components,重启Firefox,OK。

参考了这里,我怀疑NPSWF32_FlashUtil.exe不是必须的,但没试。

2007年11月3日星期六

Samba基本安全配置

创建用户密码

安装samba的时候会自动导入系统中的用户,但密码为空,假设你日常登录的用户名是myname,我们来设置密码:

sudo smbpasswd myname
......
sudo pdbedit -Lwu myname
[sudo] password for myname:
myname:1000:FB085DBF72E92604AAD3B435B51404EE:F62C03CB1000CBF94244057FD4E829F4:[U ]:LCT-472C5667:
如果密码为空,则上面输出中两个长字符串会是两长串X。你可以在这里设置一个和shell登录不同的密码。

没找到pdbedit为已有用户添加密码的方法,据说添加新用户时会要求密码,没试。

smbpasswd通过直接与Samba服务器通讯来管理用户和密码。所以相对于服务器密码后端无关。服务器密码后端即使不是smbpasswd,smbpasswd形式密码到默认的SAM密码转换应该也会由服务器完成。

配置文件

服务器配置文件是/etc/samba/smb.conf,这里主要列出需要添加和修改的部分,其余默认:
[global]
browseable = No
hosts deny = all
hosts allow = 192.168.0.33 127.
security = user
encrypt passwords = true
invalid users = root nobody

[winapps]
comment = Windows Program Files
path = /home/myname/share
writable = yes
valid users = myname
browseable = no
create mode = 0644
directory mode =0755
sync always = Yes
我们主要看global字段的设置:
  • 用户使用smbclientnet view之类的命令查看服务器上有哪些共享的资源时,什么也看不到,这是browseable的功劳
  • 两个host语句则限制了可以访问服务器的ip地址,127.表示127.0.0.1,注意不要省略小数点。这里deny和allow的设置顺序好象并无关系,当两者发生冲突时,hosts allow优先。
  • security保证了访问服务器需要密码,即访问服务器时会有提示输入密码,如果密码为空,可以直接回车,如匿名用户
  • 对密码进行加密
  • 禁止root和匿名用户访问,不过让人迷惑的是你还能看到Anonymous login successful的字样,以及一些关于服务器的信息:Domain=[MSHOME] OS=[Unix] Server=[Samba 3.0.26a],除此之外你什么也看不到,即使只是查询有哪些共享资源,你都会得到一个错误消息。
最后,大家可以参考一下Samba:整合 Windows Network,本文也借鉴了其中的许多内容。

2007年10月31日星期三

升级到Gutsy

流水帐一篇。

第一时间看到Gutsy发布后,先去论坛上看了看,发现现在有了个专门的升级工具do-release-upgrade,试着运行了一下:

sudo do-release-upgrade -d
没想到稀里哗啦的就检查起来,告诉我一个需要删除的软件列表,最后准备好要下载的软件列表时,我取消了。

还是用我习惯的aptitude

升级后果然遇到了device-mapper问题,按说明直接删除了evms包,它也在上述do-release-upgrade建议删除之列。

重启后一进入桌面就重启X,观察进入桌面时屏幕的闪动,似乎启动了Xgl,先删除Xgl再说:
sudo aptitude purge xserver-xgl
终于可以进入桌面了。

刚下载了变形金刚,急切的想看一下播放器是否正常,结果kaffeineMPlayer全部挂掉,kaffeine是直接崩溃,MPlayer只有声音没图像,SMPlayer也是直接崩溃。

首先怀疑显卡驱动,果然发现没使用fglrx,查看了Xorg.logfglrx版本居然是feisty的,在Ubuntu packages上寻求下载的过程中,发现了cn99的源,测试了一下速度很快。

装好驱动后居然还是没用上,查看了一下,linux-image-debug-2.6.22-14-386的目录下没有fglrx模块,重启使用linux-image-2.6.22-14-generic内核,一切正常。386内核通常用于兼容老机器,一般不建议使用,顺手删了。

用上了fglrx,可还是看不了电影。郁闷之下重新安装Xgl+CompizFusion
sudo aptitude install xserver-xgl
sudo aptitude install compiz compizconfig-settings-manager compiz-kde emerald
emerald主要用于窗口主题,也可以不装。

重启后顺利进入桌面,哈,可以看电影了。事后想想,也许是我的xorg.conf原本就是配置来跑Xgl+Beryl的吧,不起用Xgl的话可能要关掉某些设置,不深究了。

配置CompizFusion的过程中遇到了些麻烦,下回再讲。还有安装之前,先彻底删除了以前的Beryl以及kdmXgl登录session文件,因为Gutsy已经使用它做为默认桌面(或许这也是原因)。

K菜单变得混乱无比,原来是个Bug,已经有了两个解决办法,一个是修改kicker.po,我没尝试,还有一个是通过配置面板,选择“只有名称”(默认是“名称-描述”),勉强可以看了。

Kopete不能登录Msn,是klibs中ssl代码的问题,几天后的更新解决了这个问题

总之,一切还算顺利,阿门。

2007年10月8日星期一

Aspell引起的Leo不能启动问题

Leo是一个伟大的工具。我在Ubuntu 7.04上运行时出现了如下错误:

reading settings in /opt/leo/config/leoSettings.leo
reading /home/hero/.leoRecentFiles.txt
@enabled-plugins found in leoSettings.leo
rst3 plugin: SilverCity not loaded
err No word lists can be found for the language "zh_CN".
Traceback (most recent call last):
File "/opt/bin/leo", line 360, in
run()
File "/opt/bin/leo", line 125, in run
c,frame = createFrame(fileName)
File "/opt/bin/leo", line 192, in createFrame
c,frame = g.app.newLeoCommanderAndFrame(fileName=fileName,initEditCommanders=True)
File "/opt/leo/src/leoApp.py", line 575, in newLeoCommanderAndFrame
c.finishCreate(initEditCommanders)
File "/opt/leo/src/leoCommands.py", line 220, in finishCreate
c.frame.log.finishCreate()
File "/opt/leo/src/leoTkinterFrame.py", line 2081, in finishCreate
c.spellCommands.openSpellTab()
File "/opt/leo/src/leoEditCommands.py", line 7949, in openSpellTab
self.handler = spellTabHandler(c,tabName)
File "/opt/leo/src/leoEditCommands.py", line 8029, in __init__
self.loaded = self.init_aspell(c)
File "/opt/leo/src/leoEditCommands.py", line 8049, in init_aspell
self.aspell = AspellClass(c,dictionaryFileName,self.local_language_code)
File "/opt/leo/src/leoEditCommands.py", line 8333, in __init__
self.getAspellWithCtypes()
File "/opt/leo/src/leoEditCommands.py", line 8415, in getAspellWithCtypes
raise Exception('aspell checker not enabled')
Exception: aspell checker not enabled
那是因为 aspell 没有中文字典的缘故,稍作修改如下:
--- leoEditCommands.py.old      2007-09-15 19:41:04.000000000 +0800
+++ leoEditCommands.py 2007-10-06 21:08:08.000000000 +0800
@@ -8401,9 +8401,14 @@
print aspell_config_replace(sc, "lang",self.local_language_code)
print aspell_config_retrieve(sc, "lang")

+ # there is no chinese dictionary for aspell, so we replaced with english language
+ # aspell and aspell-en (dictionary) should be installed
+ if aspell_config_retrieve(sc, "lang") == "zh_CN":
+ aspell_config_replace(sc, "lang", "en")
+
possible_err = aspell.new_aspell_speller(sc)
aspell.delete_aspell_config(c_int(sc))
-
+
# Rudimentary error checking, needs more.
if aspell.aspell_error_number(possible_err) != 0:
print 'err', aspell_error_message(possible_err)
简单说就是把中文改成了英文,从而自动使用英文字典,当然,你得装有aspell和aspell-en (英文字典)。

不过我想更好的办法是可以在配置文件中设定。

2007年10月7日星期日

我的AutoInsert设置

AutoInsert是Emacs的模板系统。我的配置如下

;; auto-insert设置
(require 'autoinsert)
;; Adds hook to find-files-hook
(auto-insert-mode)
;; 注意路径中最后的斜杠不能省,但我们并不使用它
;; 我们使用skeleton,因为可以定位光标
;;(setq auto-insert-directory "~/.emacs.d/templates/")
;; 插入时不提示
(setq auto-insert-query nil)
(setq auto-insert-alist '(
;;("\\.txt$" . "rst.txt")
;;{{{ Rst
(("\\.txt$" . "Rst File")
nil
".. -*- coding: utf-8 -*-\n"
"\n"
""_"\n"
"\n"
"..\n"
" Local Variables:\n"
" mode: rst\n"
" indent-tabs-mode: nil\n"
" sentence-end-double-space: t\n"
" fill-column: 70\n"
" End:"
(rst-mode)
)
;;}}}
))
skeleton的语法参见SkeletonModeFeatures for Automatic Typing,注意那个那个下划线(后面紧跟个回车:\n)就是应用模板后,光标所在处,你可以方便的从这里开始编辑。

其实还有个TemplatesMode可以做这事(一个中文教程),不过skeleton应该也能做到,虽然可能复杂了点,但它是Emacs自带的,在自动输入(AutoType)方面还有其它更强大的应用,而且上面的基本配置也并不复杂,不是么?

此外这里也有个很好的设置可以参考。

2007年10月6日星期六

reStructuredText的Emacs支持:从一个节标记移动到另一个节标记

控制光标在节标记间顺序移动的函数是: rst-backward-sectionrst-forward-section 。 默认绑定到 C-c p pC-c p n (也可以用 C-c C-pC-c C-n )。

2007年10月1日星期一

DocBook安装手记

让我来说说XML DocBook的安装。

编辑器

你可以使用任何一个纯文本编辑器,比如Windows的记事本,来开始DocBook之旅。为了显得很专业,有更好的编辑体验,你需要一个XML编辑器

我使用Emacs+nXML,在.emacs中添加如下配置:

;;xml
(load "rng-auto.el")
(setq auto-mode-alist
(cons '("\\.\\(xml\\|xsl\\|rng\\|xhtml\\)\\'" . nxml-mode)
auto-mode-alist))
(mapc
(lambda (pair)
(if (or (eq (cdr pair) 'xml-mode)
(eq (cdr pair) 'sgml-mode)
(eq (cdr pair) 'html-mode))
(setcdr pair 'nxml-mode)))
magic-mode-alist)
nXML可以自动检查所编辑的XML文件的有效性。

文档验证

为了验证一个XML文档,我们需要该文档的文档结构定义。

nXML自带的验证文件是DocBook4.2的,可能需要自己下载一个来更新。DocBook的文档结构定义可以到这里下载,不过,如果你想使用还未正式发布的DocBook5.0,建议去DocBook.org看看,那里的比较新。出于我所不知道的原因,这个地址被和谐了。

一般nXML不需要什么特殊的设置或操作,就可以识别DocBook了,可以用C-c C-s C-w命令查看当前使用的验证文件。

也有单独的验证工具,比如xmllint。Windows版去这里下载,如libxml2-2.6.30.win32.zip。Ubuntu则需要安装libxml2-utilsxmllint支持使用rng验证:
xmllint --noout --relaxng docbook/DTD/rng/docbook.rng test.xml
DocBook充分体现了内容和表现分离的原则。它的文档结构定义是纯语意的,这里是标题,这里是段落,这里是引文等等,却不负责排版,如哪里需要黑体或使用什么字体。一份验证合格的DocBook通常并不用来直接发布,还需要排版成其它更用户友好的格式,如html和pdf。

文档处理工具

熟悉XML的人知道,XML使用XSL来排版,人们发现
准备 XML 文档以备显示的过程中执行的任务可以分成两个阶段:转换和格式化。转换是将一个 XML 文档(或其内存中的表示法)转换成另一个 XML 文档的过程。格式是将已转换的树状结构转换成两维图形表示法或可能是一维音频流的过程。XSLT 是为控制第一阶段“转换”而开发的语言。第二阶段“格式化”的开发工作还是进行中。
XSLT

XSLT规范由W3C制定,最新的是2.0版,今年1月23日正式成为W3C正式标准。DocBook用的还是1.0,2.0离实际应用有点远,目前似乎只有Saxon 8有很好的支持。

DocBook的XSLT样式表可以去sourceforge下载,如果使用DocBook5.0,需要下载DocBook XSL-NS,区别在于添加了名字空间。不过原来的XSL也还可以用,只是转换时可能有警告。

我们还需要一个软件来对用户的DocBook文档应用样式表并输出。最常用的工具之一是xsltproc,Windows用户去这里下载,需要的软件是
  • iconv-1.9.2.win32.zip:需要它的dll文件
  • zlib-1.2.3.win32.zip:需要它的dll文件
  • libxslt-1.1.22.win32.zip:提供了xsltproc程序,用于格式转换。
  • libxml2-2.6.30.win32.zip:需要它的dll文件。同时提供了验证工具xmllint和xmlcatalog。
下面是简单的用法:
xsltproc -o foo.html docbook/XSL/html/docbook.xsl foo.xml
除了xsltproc,还有许多工具可用,参见XSLT processors

XSL-FO

XSL-FO是上面提到的第2阶段关于“格式化”的规范,现在最新的是1.1版本,对中文支持较好。而目前的DocBook XSL
( 1.73.2 )似乎还是1.0版:
xmlns:fo="http://www.w3.org/1999/XSL/Format"
version='1.0'
中文处理相对比较弱

一个XSL-FO文件仍是一个XML文件,可以使用xsltproc来生成:
xsltproc \
--output myfile.fo
--stringparam fop1.extensions 1 \
docbook-xsl/fo/docbook.xsl \
myfile.xml
而要将fo文件“
转换成两维图形表示法或可能是一维音频流”(其实更常用的是转换成pdf),则需要另外的工具,FOP是个不错的选择。注意0.2.x适用于XSL-FO1.0,最新的0.9.x则实现了XSL-FO1.1。
fop.sh -fo myfile.fo -pdf myfile.pdf
也可以直接从xml文件生成pdf:
fop.sh -xsl /docbook-xsl/fo/docbook.xsl -xml myfile.xml -pdf myfile.pdf
可以看出,它的原理还是先生成fo,再输出pdf。

除了FOP,你还可以在XSL-FO processors发现很多处理FO文件的工具。

catalog.xml和ISO符号定义

ISO符号定义可以到这里去下载,其是就是些不方便直接在文档中使用的字符的符号常量。

比如左尖括号(<)在xml文件中被用作元素标记的一部分,要在xml中使用可以这样来表示:"&#60;"。 左尖括号在iso-num.ent中被定义为lt,我们可以这样引用:&lt。相对于十六进制方式,可以看出好记的多。

catalog.xml用来告诉xmllintxsltproc等处理工具,文档中引用的外部文件该到哪里去找。xmllintxsltproc首先使用环境变量XML_CATALOG_FILES的设定,如果为空,则使用/etc/xml/catalog

DocBook的文档结构定义、XSL、
ISO符号定义等软件包都自带了catalog.xml,可以参照着修改合并,符合自己的需要。

有用的资源

DocBook学习:limdou的文档 ,极佳。

DocBook 助你完成传世之作:该文规划宏伟,可惜只完成了环境搭建部分

DocBook学习笔记:前半部分抄自下面的"MS Windows 下建立 DocBook 的解譯環境"

在 MS Windows 下建立 DocBook 的解譯環境:入门读物,很有参考价值

DocBook XSL: The Complete Guide: 必读,DocBook XSL处理方面的权威著作,我上面有些例子就是抄它的。

i18n-zh:解说DocBook文档元素最权威的著作《DocBook: The Definitive Guide》的中文版,不过还没翻译完全。

2007年9月29日星期六

Bash下的自动完成

目录下有个文件名乱码,想要用convmv转换之,convmv需要乱码文件名做为参数,直接输入是不行的,我没有乱码输入法。写个脚本没有问题,以前就做过

有没有更简单的办法呢?

于是想到了WindowsXP的命令行窗口,它的自动完成是以一种称作menu-complete的方式进行的,呵呵,幸亏我刚刚翻译过一篇介绍ipython的文章,里面提到了这种方式,否则,都不知如何去搜索(啊,Google不让Google)。显然,让shell自动为我填上文件名是个不错的主意。

以下就是我的设置:

jack@kubuntu:~$ cat ~/.inputrc
set completion-ignore-case on
"\C-[[Z": menu-complete
第1行配置是说自动完成时忽略大小写,比如我输个a,tab一下,给出的结果可以是Abc.txt或者是abc.txt。

关键是第2行,设定menu-complete的快捷键是shift+tab。我是怎么得到这么个疑似乱码的键名的呢?技巧在这里
cat > tmp
然后按shift+tab,得到^[[Z,这里^表示Ctrol键,使用标准的readline语法表示就是\C-。有点混乱吧,怎么冒出个Ctrol来了呢?反正我就是这样试验成功的,可能是我的keymap有问题?其实我一开始是想用ctrl+tab的,可即使这种方法,也得不到正确的key sequence。

上面我说了“tab一下”,其实在Ubntu,默认是要tab两下的,但的确也有发行版只要tab一下就够了,比如Mandriva。关键的配置是这个:
set show-all-if-ambiguous off
其实说白了就是配置一下readline。建议看一下Bash readline 使用技巧和readline的man页。

不知是幸运还是必然,乱码文件第一个就被选中,转码成功,原来是个“新建 文本文件.txt”。

2007年9月24日星期一

TexLive2007安装手记

TeTex的作者宣布自2006年5月起不再发布新版了,号召大家都去用TexLive。

先去这里下载live (DVD),足有1.8G,建议使用bt方式,FTP方式在我这里估计要下一个礼拜。

我准备把texlive安装到~/opt/texlive:

mkdir ~/opt/texlive
不刻盘了,直接挂载下的ISO文件:
sudo mount -o loop texlive2007-live-20070212.iso /mnt
拷贝几个目录到本地硬盘上:
cp -R /mnt/bin/i386-linux ~/opt/texlive
cp -R /mnt/{texmf,texmf-dist} ~/opt/texlive
chmod u+w ~/opt/texlive/texmf-dist/ls-R
拷贝出来的ls-R文件权限不对,需要手动修改一下

将i386-linux目录加入到$PATH变量:
export PATH=~/opt/texlive/bin/i386-linux:$PATH
安装到此已经基本结束了。你可以运行一下tex来测试:
jackphil@kubuntu:~$ tex
This is TeX, Version 3.141592 (Web2C 7.5.6)
**
输入\relax\bye,按回车查看输出。第1次运行,会自动生成~/.texlive2007目录,用以存放临时文件及用户自己的配置。

查看tex环境的设置:
texconfig conf
中文处理

TexLive2007环境下,关于中文处理你要做的只是用xetex、xelatex分别代替tex和latex。

在你的文章中也需要稍许改变,看下面这个例子foo.tex:
\documentclass[12pt,a4paper]{article}
\usepackage{fontspec}
\usepackage{xunicode}
\usepackage{xltxtra}
\setromanfont{AR PL ShanHeiSun Uni}
\begin{document}
\XeTeX 可以使用系统自带的字体,而不需要再另外生成。
\end{document}
可以看到,我们这里明确指明了使用的字体AR PL ShanHeiSun Uni,这些字体是操作系统环境中的字体,这即是xetex的优点,也是它的缺点。

很明显,我们不必再为Tex环境生成各种编码的中文字体了,如果你看过这个,就知道摆弄Tex字体有多烦人了。缺点是源文件依赖于系统所带的字体,这显然脱离了Tex系统的控制,如果我的Windows上没有安装
AR PL ShanHeiSun Uni,上面的例子就不能在Windows上编译通过了。

Linux下要查看系统中可用字体,可以这样做:
fc-list
你可以这样来编译foo.tex:
xelatex foo.tex
该命令会直接生成pdf文档。

上面的示例来自Ubuntu中文论坛,帖子中还提到了直接使用外部字体文件(该字体不必被安装到Tex或操作系统环境中)的方法。

本文安装部分参考了最简单的 TeXLive CD 安装指南一文。

2007年9月9日星期日

reStructuredText的Emacs支持:保持目录是最新的

保持目录是最新的

这里有个问题是如何维护目录的更新?有一个函数可以帮上忙: rst-toc-insert-update 。 你可以将它添加到节标记调整函数的hook,以后你每次调整一个节标记时,目录也会被自动更新了。 在Emacs配置文件中添加如下内容:

(add-hook 'rst-adjust-hook 'rst-toc-insert-update)

当然也可以显式的呼叫函数了更新当前buffer,快捷键是 C-c p u

2007年9月8日星期六

reStructuredText的Emacs支持:大纲视图

大纲视图

在一份长文档中导航通常是一件困难的事情。为此,特意提供了一个函数,它可以迅速 分析文档,然后将文档的目录结构以缩进的形式在一个临时buffer中展示出来。 在这个临时buffer中,你可以方便的导航,选中一个标题,按回车,就会跳到主文档中 相应的地方。

这个函数就是 rst-toc (快捷键是 C-c p t )。临时buffer看起来 象这样

Table of Contents:
Debugging Meta-Techniques
Introduction
Debugging Solution Patterns
Recognize That a Bug Exists
Subdivide and Isolate
Identify and Verify Assumptions
Use a Tool for Introspection
Change one thing at a time
Learn about the System
Understanding a bug
The Basic Steps in Debugging
Attitude
Bad Feelings
Good Feelings
References

选中一个节标题后,临时buffer会消失(译按:但窗口还在),光标停留在 文档中相应节标题的最左端。

插入目录

一份较长的文档开头通常会有一个目录。就象你在互联网上大多数FAQs中 看到的那样。对于 reStructuredText 文档,目录由分析器根据指令 .. contents:: 自动生成,人们通常并不会在源文档中再添加纯文本目录,因为编辑和维护它都是件很麻烦的事。

但是Emacs的 reStructuredText 插件提供了一个函数,可以在文档中插入这样的目录。 注意纯文本目录不应该成为文档的主体内容之一,你需要把它放在注释中,这样就可以被分析器忽略了。 以下是最常见的用法:

. contents::
..
1 Introduction
2 Debugging Solution Patterns
2.1 Recognize That a Bug Exists
2.2 Subdivide and Isolate
2.3 Identify and Verify Assumptions
2.4 Use a Tool for Introspection
2.5 Change one thing at a time
2.6 Learn about the System
3 Understanding a bug
4 The Basic Steps in Debugging
5 Attitude
5.1 Bad Feelings
5.2 Good Feelings
6 References

可以使用快捷键 C-c p i 来呼叫这个函数,目录会从当前光标处开始插入。 目录的内容是在插入点所在节中(译注:插入点必须在某一节中)级别更低的所有节标题。 这样你就可以(在合适的地方)方便地插入本节的局部目录。

如果你的节标题嵌套很深,可以使用数字前缀来限定显示的目录深度。

下面的变量通常用来定制目录的显示:rst-toc-indent, rst-toc-insert-style, rst-toc-insert-max-level

2007年9月5日星期三

reStructuredText的Emacs支持:查看节标记的层次

想知道当前文档中各个级别的节标记到底使用什么符号也很简单: 呼叫rst-display-decorations-hierarchy 函数就可以了,快捷键是 C-c p h 。在一个临时buffer中会显示表示标题级别的节标题以及相应的 节标记。通常在编辑别人的文档时用来查询某个节标记符号是什么级别。

2007年9月4日星期二

ACPI问题,DSDT解决

如果你的系统有电源管理方面的问题,比如关机、挂起,笔记本电池等等, 或者是硬件传感器方面的问题,如CPU温度检测,风扇状态控制等,你可以考虑一下 是否是你的ACPI(Advanced Configuration and Power Interface)出了问题。

快速应用

  • 我们需要一个软件来处理dsdt,Intel提供了一个工具叫做 iasl(下载的是较小的 Unix Build Environment):

    sudo apt-get install bison flex-old
    make

    生成的可执行文件iasl,可以拷贝出来单独使用。

  • 得到系统当前使用的dsdt,生成asl文件dsdt.dsl:

    sudo cat /proc/acpi/dsdt > dsdt.dat
    iasl -d dsdt.dat
  • 编译dsdt.dsl文件:

    iasl -sa dsdt.dsl

    根据输出的Error,Warning信息修改dsdt.dsl文件,再次编译,直到 0 Errors, 0 Warnings

  • 使用新的dsdt.aml代替BIOS中的版本:

    cp /boot/initrd.img-2.6.20-16-generic /boot/initrd.img-2.6.20-16-generic-bak
    sudo cp dsdt.aml /etc/initramfs-tools/DSDT.aml
    sudo update-initramfs -u -k all

常见DSDT语法

在实例讲解怎样出错之前,我们先来了解一下DSDT文件的语法

  • Name (SWIT, One)

    One对象有了个新名字SWIT

  • Store (0x02, Local0)

    将0x02存储到Local0标示的一段内存中。

  • Method (INCS, 1, NotSerialized)

    定义一个函数INCS,INCS带1个参数等等。函数名也可以是规范中定义的一个对象名。

  • Multiply (Local0, 0x04, Local1)

    Local0中的数据乘以0x04,结果保存在Local1

  • CreateDWordField (BUF1, Local2, CAPB)

    为标示为BUF1的一段内存中第Local2个字节开始的4个字节(Dword:Double word)命名为CAPB

  • And (CAPB, 0xFFFFFFFC, CAPB)

    将CAPB中的值和0xFFFFFFFC按位与后,保存在CAPB中

DSDT的修改

这是一件令人头痛的事,我所能做的,只是依据编译时的错误(警告)信息,参考 《ACPI规范》 , 做一些语法上的修正。

  • 错误信息:

    dsdt.dsl   323:             Method (_CST, 0, NotSerialized)
    Warning 1086 - ^ Not all control paths return a value (_CST)

    查看323行开始的一段代码:

    Method (_CST, 0, NotSerialized)
    {
    If (CSMD) {}
    Else
    {
    ...
    }
    }

    很明显,意思是说if分句中没有返回值。

  • 错误信息:

    dsdt.dsl 1177: Method (_OSC, 5, NotSerialized)
    Warning 1075 - ^ Reserved method has too many arguments
    (_OSC requires 4)

    很清楚,_OSC的参数是4个,把Method中的5改作4即可。

  • 错误信息:

    dsdt.dsl 1191: CreateDWordField (BUF1, Local2, CAPB)
    Error 4111 - Creating a named object in a While loop ^

    这是个新修正的 bug ,命名对象BUF1不能用在一个while循环里。我用老版本的iasl
    编译并无此错,而可能关键的问题就是这个。我不知道该怎么修复这个问题。

  • 错误信息:

    dsdt.dsl  1193:                             And (CAPB, 0xFFFFFFFC)
    Warning 1104 - ^ Result is not used, operator has no effect

    查阅规范,And还可有第3个参数,用以存放比较后的值,我直接改为:

    And (CAPB, 0xFFFFFFFC, CAPB)

    我完全没把握这个改动是否恰当,因为它改变了内存中CAPB标示的一段内容

  • 错误信息:

    dsdt.dsl 1935: Method (INCS, 1, NotSerialized)
    Warning 1086 - ^ Not all control paths return a value (INCS)

    查看相应的代码:

    Method (INCS, 1, NotSerialized)
    {
    If (...)
    {...}
    ...
    IF (...)
    {...}
    }

    这里的错误是,如果所有If都不满足,Method将没有返回值。因为我不知道前面的If中为什么是那些值,我在最后添加了个Return(Zero),随便返回了个Zero对象,也不知是否会被正确处理。但至少,编译又少了个Warning

  • 许多Error或Warning是相关连的,解决1个往往连带消除好几个。 比如1个Not all control paths return a value类警告的修正, 会连带消除相关的Reserved method must return a valueCalled method may not always return a value警告

其它一些相关的资源

Gentoo论坛上有个非常详细的 教程

而Ubuntu的 HowTo 则参考了上面的教程。

我在 这里 还发现了一个和我一模一样的dsdt。去它的论坛上 了一下。回说论坛刚被黑过,所有附件都丢失了,估计原始帖除了这个附件,也没有什么实质性内容。

BenQ S73U似乎也有类似问题,而且 它的dsdt 和我的很相像。

一个中文 ACPI论坛 ,没什么人气。

Linux2下 ACPI PCI Hot-Plug 的实现 ,一些概念很名词的讲解

ACPI学习笔记 ,看来是干这行的,牛人。

Linux ACPI Howto ,linux下解决acpi问题的相关知识,和本文一样,有dsdt错误解决示范。

Linux-ready Firmware Developer Kit ,检查firmware(bios)Linux兼容性的工具,提供了可启动盘,不过几乎没有机器可以全部通过的,所以如果有项目没通过,并不意味着有问题。另外,它的源代码也可以参考一下。

acpiscoperead-write everythin 是Windows下两个查看提取各个acpi表、bios信息的工具。这里是我收藏的备份。

后记

当然ACPI还有个操作系统的支持问题。事实上,因为我的神舟L205T总是死不瞑目,关机时不能关闭电源,我开始找寻ACPI问题的解决办法,到现在,编译了自己的dsdt,问题依旧,我看Ubuntu的这个 bug报告 ,难兄难弟还真是不少。现在看来,内核的ACPI支持部分出了问题,可能性更大一点,毕竟MS Windows下关机正常。

(2008-11-19修订)

2007年9月3日星期一

reStructuredText的Emacs支持:节标记调整

rst插件并不彻底分析所有的 reStructuredText 指令, 但它还是能识别节标记并用来构建文档大纲结构。我们所说的节标记就是用来标记节标题 的那些下划线,或者是环绕标题的上下两行。

有一个函数可以为处理这个标记带来很大的方便: rst-adjust (默认绑定键 C-c p aC-c p =C-= )。这个函数就象一把瑞士军刀,可以被反复调用,实际效果 依赖于上下文:

  1. 如果标记不完整,例如:

    My Section Title
    ^^

    调用该命令就会帮你自动完成标记中剩余的部分。 你可以只输入节标记的开头然后调用这个函数来 补全。它也在你修改标题后被用来重新调整节标记的长度。

  2. 如果光标位置没有节标记,就添加一个。级别和上一个节标记相同。

  3. 如果节标记已经存在, 它的级别会被提升,如果反复调用,就会在当前存在的所有标题级别中循环。

如果在调用函数时使用了否定前缀,如 C-- C-= ,就会在标题级别中按反方向循环。 要在节标记的下划线或上下行包围两种风格间切换,你可以使用正规的命令前缀,就象这样 C-u C-= 。更多关于前缀的使用,参见 rst-adjust 的文档。

一次操作多个节的提升或降级

当你在重新编排文档结构的时候,经常会碰到需要一次改变多个节的级别的情况。这和改变 一个节标记的函数(以及绑定到该函数的快捷键)是一样的:你需要做的只是选中一个区域(region), 然后调用 rst-adjust 来提升区域中所有节标记的级别(或降级,如果使用了否定前缀的话)。

使节标记符合你的习惯

如果你在查看别人的文档,发现它使用了陌生的节标记符号,你会想要把它们替换成符合自己 习惯的符号。如果手工一个一个来改的话会很烦人。不要怕,有一个函数可以帮你轻松的完成 这件工作: rst-straighten-decorations (C-c p s)。该命令会影响整个buffer。

定制

你可以将你喜欢的节标记指定给变量 rst-preferred-decorations ,每个人都有他的 偏好。 变量 rst-default-indent 用来设置使用上下行包围风格的节标记时 标题文字缩进几个空格。

2007年9月2日星期日

reStructuredText的Emacs支持:基本设置

我会把Emacs Support for reStructuredText部翻译出来,为Blog充一下数吧


Emacs的所有支持由 rst.el 提供。为了使用它,你需要把rst.el放到 你的emacs的load-path中,然后加载它:

(require 'rst) ;; or (load "rst")

你可以在 rst.el 源代码中找到其它的配置。

接下来你要为那些最常用的命令设置键绑定。 rst.el 提供了一个 标准的text-mode hook函数来做这件事,你可以这样设置:

(add-hook 'text-mode-hook 'rst-text-mode-bindings)

所有的 rst.el 命令都有一个前缀。默认绑定是使用mode-specific-map变量和 p , 例如 C-c p ...

2007年8月24日星期五

皈依MPlayer

今天想看一下以前下的《Uncle Saddam》,avi格式,这个没问题。但字幕是Vobsub(sub+idx)的,Kaffeine-xine死活不能显示。也问了,也Google了,老版本的xine肯定是不支持的,目前版本,有说支持的(Freenode上的Kubuntu频道),有说正在开发的,具体可以看看这个,2004年的,的确很老了,可我找不到更新的线索了,晕的是上面说xine核心开发团队没人有兴趣Vobsub的问题,所以只能依靠其他外来的开发者了。而我的经历证明,问题依旧。

许多人推荐VLC,它的手册上也说支持Vobsub,但我终究试不出来。

据说MPlayer支持Vobsub字幕。为了让xine支持最多的媒体格式,我们大都安装了w32codecs,而这正是MPlayer开发的。这个号称“终极”(Ultimate)的播放器其实早有耳闻,只是早先的(1.0以前)大都需要自己编译,因为功能强大,但又大都可选,因而参数众多,好不容易编译过关,实际一用,却又经常崩溃。所以那段时间许多Linux论坛上充斥了这样的大同小异的求助帖,仿佛编译是否成功,更多的似乎取决于用户的人品。

各大发行版都已进化到2007年,这种情况好象有了很大的改观,而争论的焦点转移到易用性上了。正好发现了Smplayer,下来一用,标准播放器样式,非常顺手,最新的0.5.21版本稳定性也还不错,至少我随便放了几个avi和rmvb的片子,没有碰到崩溃的情况(由志愿者编译的适用与Edgy的0.5.19的确经常崩溃,比如在更换视频,调用打开文件对话框时)。程序使用Qt开发的,这对于习惯在Kde下干活的我来说,打消了最后一丝顾虑。

支持的格式就不说了,xine就是用它的codecs,而且还支持不全,所以只会更多。还是说说整个事件的缘起──字幕吧。Vobsub不用什么设置自动加载了。手头正好还有个ssa的字幕,第一次用的时候需要配置一下字体,我选了文泉驿,还可以设置字幕编码之类的,都是图形界面,非常方便,一下子就好了。而不象Kaffeine-xine,还需要自己编译字体(虽然也有现成的可用)。

我想以后我将以SMplayer(MPlayer)为主了,看看能不能抛弃Kaffeine-xine。唯一的担心是SMplayer会不会象许多开源项目一样,虎头蛇尾,到最后半死不活。

附带说一下,本来通过Kpart机制,我们也可以使用MPlayer作为Kaffeine的引擎,如0.8.3版本。但最晚从0.8.5版本开始,这条路也不通了,如果是出于故意,这样的封闭心态实在让人对前景感到担忧。

还有上面所说的字幕配置都是针对SMplayer的,而我安装的是mplayer-nogui,也可以直接手工使用如下命令:

mplayer abc.avi -vobsub abc
注意参数-vobsub后跟字幕文件名,但要省略后缀,按j切换字幕语种。

2007年8月3日星期五

不能说的秘密-Stunnel加密应用简介

如果你有一封信要发给某人,而又担心是否会被人偷看,在现实中,你可以选择儿童团团长海娃帮你送信;在人狗平等的网络上,你可以看看stunnel

stunnel提供第3方的TLS/SSL加/解密服务。可以为没有加密功能的客户端或没有解密功能的服务器提供服务。相应的stunnel有两种工作模式:客户端模式和服务器模式。

客户端模式

在客户端模式下Stunnel的工作流程是:

  • 接收指定端口传过来的数据,可以指定接收的IP范围,出于安全考虑,发送端通常就在本机。
  • 对数据进行加密
  • 发送到指定服务器
根据工作流程,就可以很容易理解下面的配置了:
;告诉stunnel工作在客户端模式
client = yes

[https]
;指定接收端口,客户端中用到
accept = 8081
;将接收的数据加密后发送到的地址
connect = 24.110.171.157:443
TIMEOUTclose = 0

[ssmtp]
accept = 465
connect = 24.110.171.157:443
第1段配置可能使你感到迷惑,现在的浏览器都支持https啊,为什么还要stunnel

?其实这里的地址是个代理服务器。你还在为GFW困扰吗,可以试一下动态网的代

理服务器。动态网就算了,基本上都是谣言。要注意的是,如果网站本身已

提供了https,比如gmail登录,代理就会失败。应该跟加密机制有关,不是很了

解。

第2段配置就是我们的鸡毛信了,如果邮件服务器支持ssmtp的话。

服务器模式

服务器模式正好相反,接收加密数据,解密后发给不支持解密功能的相应服务。

如果邮件服务器192.168.1.6不支持ssmtp的话,一个简单的配置如下:
;注释掉这行,使用服务器模式
; client = yes

[smtp]
accept = 1025
connect = 192.168.1.6:25

参考文献

Stunnel使用详解

2007年8月2日星期四

【翻译】使用IPython增强交互式体验

【译者前言】原文在这里。第一次翻译东西,一开始坚持直译,过了几天回头看,发现也就比Google、Yahoo的网页翻译稍微好一点,估计一个月后这样的介绍性文章都要看两遍才能读的懂了。于是就改为意译,简单说就是用自己的话再说一遍。由于本人英语水平和Python水平都很有限,错误在所难免,有些地方强作解人更可能贻笑大方。如果你发现什么一定要救哥们一把。

Python是一种用途广泛的编程语言:面向对象,动态,只要很少的代码就能完成复杂的功能,语法干净而优雅,“符合人们的思考习惯”,对不同年龄和编程水平的人 来说都是一个完美的选择。所有这些特性哺育着一个忠诚,博学,充满活力的社区。除此之外,使用Python的另一个好处是它的交互式解释器。 Python发行包中自带的标准交互式解释器允许用户在一个命令行提示符下输入python代码,然后执行它,你可以马上看到结果,它还可以深入源代码以 提供各种级别的自省。(Python的自省是指这样一种能力:允许用户在运行时检测对象的相关信息,诸如类型,属性,方法等等)Python交互式解释器 经常用于测试一小段代码,比如验证某个算法或熟悉某个库,也可用来完成某些特定任务,比如创建500个名字为dir_000-dir_499的目录。

标准Python解释器毫无疑问是许多Python程序员工具箱中极其重要的宝贝。然而IPython的开发者吸收了标准解释器的基本概念,在此基础上进行 了大量的改进,创造出一个令人惊奇的工具。在它的主页上是这么说的:“这是一个增强的交互式Python shell。” 这个说法太谦虚了。IPython优雅,设计精巧同时兼具极强的扩展能力。那些精心设计使得IPython如此有用:tab补全,对象自省,强大的历史机 制,内嵌的源代码编辑,集成Python调试器,%run机制,宏,创建多个环境以及调用系统shell的能力。

IPython 的产生源于Fernando Pérez试图将他自己的工作和Janko Hauser开发的IPP以及由Nathan Gray开发的LazyPython整合起来的努力。Pérez声称他的灵感还来自Stephen Figgin的文章《IPP和LazyPython》。Fernando现在是IPython项目唯一的开发人员。

Fernando喜欢强调IPython是一个“用于构建与特定问题相关的交互式环境的高度可配置工具”。本文将仅仅讲述它之所以能代替标准Python交互式解释器的相关功能

安装

在本文中,我假定你已经安装了Python2.2或更高版本。我编写并测试了所有的示例,环境是IPython0.6.6,Python2.4和Fedora Core 3 Linux。

要 运行IPython,你首先需要下载并安装它。截止到本文写作时,最新版本是IPython0.6.6。你需要选择合适的版本和格式下载。(比如,因为我 的Python2.4是从源代码安装的,所以最合适我的格式是IPython-0.6.6.tar.gz)Windows用户多半会下载并解压.zip文 件。某些时候,Windows用户还有一个选择就是下载Python Enthought Edition,它包含了IPython作为它的默认shell之一。如果你使用RPM系统,那就只要简单的运行一下rpm -Uvh 即可。否则,你需要解开压缩文件,进入生成的目录,你会发现一个setup.py文件。接下来的安装很简单,只需要以 root身份运行命令:

python setup.py install
在Unix系统上,上面的命令会在可执行文件python所在目录生成一个ipython文件。如果安装在Linux系统上,会有文档被安装在 /usr/share/doc/ipython/。第一次运行ipython时会自动生成配置目录 $HOME/.ipython,包含了一些配置文件适用于不同的环境:ipythonrc, ipythonrc-math, ipythonrc-numeric, ipythonrc-physics, ipythonrc-pysh, ipythonrc-scipy以及 ipythonrc-tutorial
[jjones@cerberus ~]$ /usr/local/python24/bin/ipython
**********************************************************************
Welcome to IPython. I will try to create a personal configuration directory
where you can customize many aspects of IPython's functionality in:

/home/jjones/.ipython

Successful installation!

Please read the sections 'Initial Configuration' and 'Quick Tips' in the
IPython manual (there are both HTML and PDF versions supplied with the
distribution) to make sure that your system environment is properly configured
to take advantage of IPython's features.
Please press to start IPython.
总结一下安装过程:
  • 下载合适的软件包。
  • 解压缩。
  • 运行python setup.py install
就象上面提到的,启动IPython就是运行可执行文件ipython。你会看到一个提示符,如果你曾经玩过标准Python命令行提示符,你会发现这个有点儿不同:
[jjones@cerberus ~]$ /usr/local/python24/bin/ipython
Python 2.4 (#2, Nov 30 2004, 09:22:54)
Type "copyright", "credits" or "license" for more information.

IPython 0.6.6 -- An enhanced Interactive Python.
? -> Introduction to IPython's features.
%magic -> Information about IPython's 'magic' % functions.
help -> Python's own help system.
object? -> Details about 'object'. ?object also works, ?? prints more.

In [1]:
要退出IPython(Linux系统上)就输入Ctrl-D(会要求你确认),也可以输入Exit或Quit(注意大小写)退出而不需要确认。

特性

Magic

IPython有一些"magic"关键字:
%Exit, %Pprint, %Quit, %alias, %autocall, %autoindent, %automagic,
%bookmark, %cd, %color_info, %colors, %config, %dhist, %dirs, %ed,
%edit, %env, %hist, %logoff, %logon, %logstart, %logstate, %lsmagic,
%macro, %magic, %p, %page, %pdb, %pdef, %pdoc, %pfile, %pinfo, %popd,
%profile, %prun, %psource, %pushd, %pwd, %r, %rehash, %rehashx, %reset,
%run, %runlog, %save, %sc, %sx, %system_verbose, %unalias, %who,
%who_ls, %whos, %xmode
IPython 会检查传给它的命令是否包含magic关键字。如果命令是一个magic关键字,IPython就自己来处理。如果不是magic关键字,就交给 Python(标准解释器)去处理。如果automagic打开(默认),你不需要在magic关键字前加%符号。相反,如果automagic是关闭 的,则%是必须的。在命令提示符下输入命令magic就会显示所有magic关键字列表以及它们的简短的用法说明。良好的文档对于一个软件的任何一部分来 说都是重要的,从在线IPython用户手册到内嵌文档(%magic),IPython当然不会在这方面有所缺失。

Tab自动补全

IPython一个非常强大的功能是tab自动补全。如果你对Python很了解,可能会想,标准Python交互式解释器也可以tab自动补全啊。你要做的只是:
[jjones@cerberus ~]$ /usr/local/python24/bin/python
Python 2.4 (#2, Nov 30 2004, 09:22:54)
[GCC 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import rlcompleter, readline
>>> readline.parse_and_bind('tab: complete')
>>>
是的,标准Python交互式解释器和IPython都支持“普通”自动补全和菜单补全。使用自动补全,你要先输入一个匹配模型,然后按Tab键。如果是“普通”自动补全模式(默认),Tab后会:
  • 匹配模型按最大匹配展开。
  • 列出所有匹配的结果。
例如:
In [1]: import os

In [2]: os.po
os.popen os.popen2 os.popen3 os.popen4

In [2]: os.popen
输入os.po然后按Tab键,os.po被展开成os.popen(就象在In [2]:提示符显示的那样),并显示os所有以po开头的模块,类和函数,它们是popenpopen2 popen3popen4

菜单补全稍有不同。关闭默认Tab补全,使用菜单补全,你需要修改配置文件$HOME/.ipython/ipythonrc。注释掉:
readline_parse_and_bind tab: complete
取消注释:
readline_parse_and_bind tab: menu-complete
不同于“普通”自动补全的显示当前命令所有匹配列表,菜单补全会随着你每按一次Tab键而循环显示匹配列表中的项目。例如:
In [1]: import os

In [2]: os.po
结果是:
In [3]: os.popen
接下来每次按Tab键就会循环显示匹配列表中的其它项目:popen2popen3popen4,最后回到po。菜单补全模式下查看所有匹配列表的快捷键是Ctrl-L:
In [2]: os.po
os.popen os.popen2 os.popen3 os.popen4

In [2]: os.po
自省

Python有几个内置的函数用于自省。IPython不仅可以调用所有标准Python函数,对于那些Python shell内置函数同样适用。典型的使用标准Python shell进行自省是使用内置的dir()函数:
>>> import SimpleXMLRPCServer
>>> dir(SimpleXMLRPCServer.SimpleXMLRPCServer)
['__doc__', '__init__', '__module__', '_dispatch',
'_marshaled_dispatch', 'address_family', 'allow_reuse_address',
'close_request', 'fileno', 'finish_request', 'get_request',
'handle_error', 'handle_request', 'process_request',
'register_function', 'register_instance',
'register_introspection_functions', 'register_multicall_functions',
'request_queue_size', 'serve_forever', 'server_activate', 'server_bind',
'server_close', 'socket_type', 'system_listMethods',
'system_methodHelp', 'system_methodSignature', 'system_multicall',
'verify_request']
嗯, 非常棒。事实上非常实用。几年来我一直这么做,对此非常满意。这是一个漂亮的列表,包含了SimpleXMLRPCServer.SimpleXMLRPCServer的所有方法,类,模块等等。因为dir()是一个内置函数,在 IPython中也能很好的使用它们。但是IPython的操作符???功能还要强大:
In [1]: import SimpleXMLRPCServer

In [2]: ? SimpleXMLRPCServer.SimpleXMLRPCServer
Type: classobj
String Form: SimpleXMLRPCServer.SimpleXMLRPCServer
Namespace: Interactive
File: /usr/local/python24/lib/python2.4/SimpleXMLRPCServer.py
Docstring:
Simple XML-RPC server.

Simple XML-RPC server that allows functions and a single instance
to be installed to handle requests. The default implementation
attempts to dispatch XML-RPC calls to the functions or instance
installed in the server. Override the _dispatch method inherited
from SimpleXMLRPCDispatcher to change this behavior.

Constructor information:
Definition: SimpleXMLRPCServer.SimpleXMLRPCServer(self, addr,
requestHandler=, logRequests=1)
?操作符会截断长的字符串。相反,??不会截断长字符串,如果有源代码的话还会以语法高亮形式显示它们。

历史

当你在IPython shell下交互的输入了大量命令,语句等等,就象这样:
In [1]: a = 1

In [2]: b = 2

In [3]: c = 3

In [4]: d = {}

In [5]: e = []

In [6]: for i in range(20):
...: e.append(i)
...: d[i] = b
...:
你可以快速查看那些输入的历史记录:
In [7]: hist
1: a = 1
2: b = 2
3: c = 3
4: d = {}
5: e = []
6:
for i in range(20):
e.append(i)
d[i] = b
要去掉历史记录中的序号(这里是1至6),使用命令hist -n:
In [8]: hist -n
a = 1
b = 2
c = 3
d = {}
e = []
for i in range(20):
e.append(i)
d[i] = b
这样你就可以方便的将代码复制到一个文本编辑器中。要在历史记录中搜索,可以先输入一个匹配模型,然后按Ctrl-P。找到一个匹配后,继续按Ctrl-P会向后搜索再上一个匹配,Ctrl-N则是向前搜索最近的匹配。

编辑

当 在Python提示符下试验一个想法时,经常需要通过编辑器修改源代码(甚至是反复修改)。在IPython下输入edit就会根据环境变量$EDITOR调用相应的编辑器。如果$EDITOR为空,则会调用vi(Unix)或记事本(Windows)。要回到IPython提示符,直接退出编 辑器即可。如果是保存并退出编辑器,输入编辑器的代码会在当前名字空间下被自动执行。如果你不想这样,使用edit -x。如果要再次编辑上次最后编辑的代码,使用edit -p。在上一个特性里,我提到使用hist -n可以很容易的将代码拷贝到编辑器。一个更简单的方法是edit加Python列表的切片(slice)语法。假定hist输出如下:
In [29]: hist
1 : a = 1
2 : b = 2
3 : c = 3
4 : d = {}
5 : e = []
6 :
for i in range(20):
e.append(i)
d[i] = b

7 : %hist
现在要将第4,5,6句代码导出到编辑器,只要输入:
edit 4:7
Debugger接口

IPython 的另一特性是它与Python debugger的接口。在IPython shell下输入magic关键字pdb就会在产生一个异常时开关自动debugging功能。在自动pdb呼叫启用的情况下,当Python遇到一个未 处理的异常时Python debugger就会自动启动。你在debugger中的当前行就是异常发生的那一行。IPython的作者说有时候当他需要在某行代码处debug时, 他会在开始debug的地方放一个表达式1/0。启用pdb,在IPython中运行代码。当解释器处理到1/0那一行时,就会产生一个 ZeroDivisionError异常,然后他就在指定的代码处被带到一个debugging session中了。

运行

有 时候当你在一个交互式shell中时,如果可以运行某个源文件中的内容将会很有用。运行magic关键字run带一个源文件名就可以在IPython解释 器中运行一个文件了(例如run <源文件> <运行源文件所需参数>)。参数主要有以下这些:

  • -n 阻止运行源文件代码时__name__变量被设为"__main__"。这会防止
if __name__ == "__main__":

块中的代码被执行
  • -i 源文件在就当前IPython的名字空间下运行而不是在一个新的名字空间中。如果你需要源代码可以使用在交互式session中定义的变量就会很有用。
  • -p 使用Python的profiler模块运行并分析源代码。使用该选项代码不会运行在当前名字空间。



宏允许用户为一段代码定义一个名字,这样你可以在以后使用这个名字来运行这段代码。就象在magic关键字edit中提到的,列表切片法也适用于宏定义。假设有一个历史记录如下:
In [3]: hist
1: l = []
2:
for i in l:
print i
你可以这样来定义一个宏:
In [4]: macro print_l 2
Macro `print_l` created. To execute, type its name (without quotes).
Macro contents:
for i in l:
print i
运行宏:
In [5]: print_l
Out[5]: Executing Macro...
在这里,列表l是空的,所以没有东西被输出。但这其实是一个很强大的功能,我们可以赋予列表l某些实际值,再次运行宏就会看到不同的结果:
In [6]: l = range(5)

In [7]: print_l
Out[7]: Executing Macro...
0
1
2
3
4
当运行一个宏时就好象你重新输入了一遍包含在宏print_1中的代码。它还可以使用新定义的变量l。由于Python语法中没有宏结构(也许永远也不会有),在一个交互式shell中它更显得是一个有用的特性。

环境(Profiles)

就象早前提到的那样,IPython安装了多个配置文件用于不同的环境。配置文件的命名规则是ipythonrc-。要使用特定的配置启动IPython,需要这样:
ipython -p
一 个创建你自己环境的方法是在$HOME/.ipython目录下创建一个IPython配置文件,名字就叫做ipythonrc_,这里是你想要的环境的名字。如果你同时进行好几个项目,而这些项目又用到互不相同的特殊的库,这时候每个项目都有自己的环境就很有用 了。你可以为每个项目建立一个配置文件,然后在每个配置文件中import该项目中经常用到的模块。

使用操作系统的Shell

使用默认的IPython配置文件,有几个Unix Shell命令(当然,是在Unix系统上),cdpwdls都能象在bash下一样工作。运行其它的shell命令需要在命令前加!!!。使用magic关键字%sc%sx可以捕捉shell命令的输出。

pysh环境可以被用来替换掉shell。使用-p pysh参数启动的IPython,可以接受并执行用户$PATH中的所有命令,同时还可以使用所有的Python模块,Python关键字和内置函数。 例如,我想要创建500个目录,命名规则是从d_0_d到d_500_d(译注:呵呵,作者这里犯了个小小的计算错误,你能看出来吗),我可以使用-p pysh启动IPython,然后就象这样:
jjones@cerberus[foo]|2> for i in range(500):
|.> mkdir d_${i}_d
|.>
这就会创建500个目录:
jjones@cerberus[foo]|8> ls -d d* | wc -l
500
注意这里混合了Python的range函数和Unix的mkdir命令。

注意,虽然ipython -p pysh提供了一个强大的shell替代品,但它缺少正确的job控制。在运行某个很耗时的任务时按下Ctrl-z将会停止IPython session而不是那个子进程。

问题和方法

虽然作为标准Python shell的替换,IPython总的来说很完美。还是有两个问题给我带来了一些麻烦。感谢IPython的开发者,这两个问题都可以通过配置来解决,每个配置都有清晰的文档。

第 一个问题是关于颜色的。在我的一个系统上,我使用的是一个白色背景的xterm。当我使用???查询一个对象或模块的信息时,对象的定义会被显示,但看起来好象那些参数丢失了。那是因为在构造函数中的的参数默认显示为白色。我的解决办法是在IPython shell中输入colors LightBG

第二个问题是关于自动缩进和代码粘贴的。如果autoindent被启用,IPython会对我粘贴的已排好缩进的代码再次应用缩进。例如下面的代码:
for i in range(10):
for j in range(10):
for k in range(10):
pass
会变成:
for i in range(10):
for j in range(10):
for k in range(10):
pass
在这里它并不是个问题,因为在它自身中缩进都保持一致。在其它一些情况下(例子一下子举不出来了),可能会成为真正的问题。可以使用magic关键字autoindent来开关自动缩进,告诉IPython不要添加多余的缩进──就象在vim中设置粘贴set paste一样。

结论

IPython 并不是革命性的,也不是完全创新的。Tab自动补全,历史记录搜索,配置环境,配置文件等都早已在其它shells中存在有些年头了。Python拥有各种级别的自省能力也有一段时间了。但IPython把来自成熟的Unix shell,标准Python shell以及Python语言中的一些最强大的功能整合到了一起。产生出了一个强大的令人难以置信的性能增强工具,我想我会很乐意在接下来的几年中一直使用它。套用阿基米德的话来说,给我一个强大而又灵活的文本编辑器(vim),一个交互式shell(IPython)以及一个语言(Python),我就能撬动整个世界。

2007年7月29日星期日

PC电源的短接测试

近日在淘宝买了个Tt电源:KK500A。第1次收到的有问题,退回去换了一个。旺旺上联系人好象在上海(老板?),实体店在武汉。武汉店负责人不错,一口答应在没收到退货的情况下就发货给我。一切还算顺利。

顺便学了一招怎样在不接任何负载的情况下测试电源好坏。其实很简单,将电源接通市电,用导线短接一下20针(24针)电源借口的绿线和任意一根黑线,如果电源是好的话,风扇就会转起来了。

2007年6月13日星期三

Emacs minibuffer中的自动补全功能

你有3种选择:Icicles功能最强InteractivelyDoThings(Ido)次之,最后一个是IswitchBuffers。其中后 2个Emacs有自带(我用的是Emacs 23),而Icicles更侧重于图形界面下的体验。

2007年6月5日星期二

我爱命令行:tar

tar

详见 GNU tar官方文档 。处理tar, tar.gz, tar.bz2, tgz等格式文件,用于备份和打包。

常用命令选项

-c 创建归档文件。
-u 更新文件,如果要添加的文件比tar包中的新或tar包中不存在,则文件被添加。不支持压缩tar包,如tar.bz2等。如过被更新的tar包 不存在,则直接创建。所以如果创建非压缩的tar包,则可以用u选项代替c选项。注意,旧的文件依旧被保存,解压时如果有多个同名文件,默认是最后添加 (参见-t选项)的文件会覆盖先前的文件,不会询问,看前来就象是只有最后添加的文件被解压缩。
-r 添加文件,用法与-u参数相同,区别是不比较文件,只是简单的添加。
--delete 从tar包中删除文件,不支持压缩tar包。
-x 解压缩归档文件。
--occurrence=n 在一个tar包中有多个同名文件时,指定要操作的是第n个。默认是1,这时=n可以省略
-t 列出tar包中的文件。支持压缩tar包。注意文件列表是有次序的,排在最后的说明最后添加。
-v 详细模式。显示处理进程,如正在处理的文件等等。
-f 使用文件而不是stdin/stdout
-p 保留文件的所有外部属性。默认,可以省略。解压缩时以root身份(如sudo)即可恢复文件属性。以普通用户身份解压缩则文件属主变为该用户自己。
-P 保留归档时目录名中的根目录标志/。不建议使用,因为一不小心就会把文件解压到系统目录中,而不是当前目录。此选项默认关闭。
-j 使用bzip2压缩/解压缩tar包
-z 使用gzip压缩/解压缩tar包
-C 解压锁到指定目录。
--exclude 不归档指定的目录。除个别子目录之外,归档某个目录。

示例

打包用户目录,默认已保留所有文件外部属性
tar jcvf foo.tar.bz2 /home/jack
tar zcvf foo.tar.bz2 /home/jack
添加foo到foo.tar,注意不支持foo.tar.gz这样的压缩格式
tar uvf foo.tar /home/jack/foo
解压缩foo.tar.bz2到当前目录,并保留文件外部属性。
sudo tar jxvf foo.tar.bz2
解压缩foo.tar.gz到当前目录,但文件属主被改为当前用户
tar zxvf foo.tar.gz
只解压缩指定的文件,如果有多个同名文件,可以指定解压哪一个。
tar jxvf foo.tar.bz2 foo.txt
tar jxvf foo.tar.bz2 --occurrence=2 foo.txt
备份系统,注意要把备份文件自己放到exclude例外中。
tar jcvf backup.tar.bz2 --exclude=/proc --exclude=/lost+found --exclude=/backup.tar.bz2 --exclude=/mnt --exclude=/sys /
解压缩到根目录,通常用于备份的恢复。
sudo tar jxvf backup.tar.bz2 -C /
显示foo.tar.bz2中的文件及其详细信息(v参数)。
tar tvf foo.tar.bz2
从foo.tar中删除foo/foo2,不支持压缩tar档,注意文件路径(可用tar tf先查看)
tar --delete -f foo.tar foo/foo2
如果有多个同名文件,可以指定要删除哪一个。
tar --delete -f foo.tar --occurrence=2 foo1/foo2.txt

Kaffeine配置:中文字幕

为了要看NHK的纪录片《激流中国》,开始动手配置Kaffeine的中文字幕显示。

我的Kaffeine使用xine引擎,字幕问题其实就是xine的字幕支持问题。

需要用到个小工具xine-fontconv,用来将其它字体转换成xine可用的格式。我是在LinuxSir下载的。

准备好中文字体,我就试了4个,uming.ttf、simhei.ttf和SimSun18030.ttc好用,SimSun-Bold不行。显示效果simhei稍好一点。uming是Ubuntu自带的字体。

cp /usr/share/fonts/truetype/arphic/uming.ttf .
./xine-fontconv uming.ttf uming gb18030
完了会在当前目录生成许多字体文件uming-xx.xinefont.gz,拷贝到xine的字体目录:
sudo cp uming-* /usr/share/xine/libxine1/fonts/
接下来是Kaffeine的配置。

设置->xine引擎参数->subtitles

新手选项里可以设置字幕编码和字体大小,我的编码默认是gb18030,不去改它了。

字体大小对应字体文件名中的数字xx。注意对于某个字体,有些大小的字体不能使用,你可以通过查看字体文件大小来大致确定。如simhei-20.xinefont.gz的大小只有10,所以small大小不能使用。因为我这里默认大小就是small,我一开始还以为simhei不能使用。

专家选项里填入刚生成的字体名,比如uming

好了,和Windows下一样,只要字幕文件名和相应视频文件名只相差一个后缀,Kaffeine就能自动加载了。

我用的字幕是ssa格式,在Google解决方案的时候看到xine好象并不支持sub,idx格式的字幕,也不知道现在解决了没有。

顺便说一下激流中国的《喉舌和良心》与《富人和农民工》。穷人的生活太沉重了,7岁的孩子读作文《我的理想》,把自己读哭了。

Hokkee的blog说:When times are good, be happy; but when times are bad, consider.

对于这些一出生就在贫困山区的人来说,我怀疑他们有多少good time,又可以consider多少。

推荐大家看一下,尤其是身在国内的同胞们,“不识庐山真面目,只缘身在此山中”,NHK固然有偏颇,我们何尝没有?

2007年4月22日星期日

Feisty升级二三事

最新的kubuntu 7.04(开发代号Feisty)已经正式(4月19日)释出,你又可以免费订购光盘了。我自己订购的10套Ubuntu 5.10(开发代号Breezy)一份都没送出去,自己留一份,其余都进垃圾箱了。不好意思再申请了。

看了一下官方的升级指南,不支持跨版本的升级。也就是说我也不能等到下一个版本出来直接升级到7.10,还是与时俱进吧。去官方论坛中文论坛侦察了一天,发现都是些grub、声卡之类的问题,没有其他严重的bug,反正我是升级,应该没grub多少事,声卡在Edgy下本来就没有声音,如果还是没有声音也没有什么损失。于是决定升级:

  1. 我还是选择手动命令行升级,好象官方并不怎么推荐。首先修改源:
    sudo sed -e 's/\sedgy/ feisty/g' -i /etc/apt/sources.list
  2. 进入到recovery模式,开始升级:
    sudo aptitude update

    sudo aptitude dist-upgrade

    下载用了不到2个小时,你也可以使用-d参数在普通模式下先下载,再到recovery模式下安装,这样你可以在这段时间内上上网,听听歌。
  3. 安装开始,首先碰到的是关于RAID配置的询问,我这里用不着,关掉了事。
  4. 接下来就碰到严重的问题,装不下去了。错误显示有软件包依赖关系无法解决,第1个是apache2-common,后面还跟了一串软件包(python-dev等等)。于是aptitude、apt-get -f、remove、purge的试了很久,还跑到正常模式下查看出错信息,因为我不知道怎样在Console下滚屏,结果都是无法安装下去。最后用dpkg -r删除apache2-common,问题解决。
  5. 安装完后不要马上重启,重复运行aptitude dist-upgrade直到没有更新。
  6. 重启后进入正常模式,进入桌面一切正常。第一个惊喜是桌面启动差不多结束时的那一段音乐──我的声卡自动识别了。但是显卡驱动不对。查看xorg-driver-fglrx和linux-restricted-modules-2.6.20-15-generic也都已经安装。又去查看配置文件/etc/X11/xorg.conf和日志文件/var/log/Xorg.0.log,仍旧看不出所以然。终于想到Edgy时自己编译显卡驱动,修改了/etc/default/linux-restricted-modules-common,取消了Edgy自带fglrx模块的加载。有够晕的。
  7. 安装apache2-common,一切正常。
  8. 输入法被自动换成了scim,兼容性问题依旧多多,Firefox中不能激活。改回fcitx,但是一旦输入就会崩溃。去irc上询问,karron建议删掉.fcitx试试,好了,fcitx也正常了。
  9. 进入Xgl+Beryl,系统响应变慢,Beryl效果也没出来,虽然窗口管理器已换成Beryl。按照beryl wiki上的指南,降级beryl-core后一切正常:
    sudo aptitude install beryl-core=0.2.0~0beryl1
    为了不被自动升级,可以将beryl-core设置为保持:
    sudo aptitude hold beryl-core
    Feisty源中的Beryl是0.2.1版本,与Xgl兼容有问题。Beryl源里的就是降级后的版本0.2.0
  10. 最近要在Windows下写几个小软件,VirtualBox也是个关心的问题,去这里下载了feisty对应deb文件后安装,需要自己编译内核模块,预编译的都是针对beta版Feisty内核的,一切正常。
  11. 目前唯一明显的问题是关机不能自动关闭电源,老办法,用重启代替,再手动关电源。
总的说来,升级十分顺利,主要是被几个愚蠢的疏忽/错误耽搁了一些时间。初步感觉系统速度有明显提升,这次升级还是很值得的。

Dell的老板也在使用这个系统(这里是中文的新闻),你为什么不也来试一下呢?

2007年4月18日星期三

我和书签不得不说的故事

一段无聊的经历,就用一个庸俗的题目吧

最开始用的网络书签是365key,用了一段时间感觉不对胃口,就跑去注册了del.icio.us,好象正赶上del.icio.usYahoo收购不久,一些功能也在调整,其中使我决定暂时不享用这顿美味的一个原因是import功能被停掉了,这就意味着我不能把在365key上的收藏转移过来了,我觉得不时要找一下被你抛弃的前女友,是件很没面子的事,说明你现在过得并不好。

于是我又开始寻找新的目标。在试用了几个之后,选择了blinklist,就一直用着。一开始还不时去del.icio.us看看,是不是可以import了,算是三心而意吧,也一直没见动静,渐渐的就不再去了。后来Google也出了书签,真佩服Google连这样的东西都敢拿出来见人。就这样一直和Blinklist混着,虽然是注释经常有乱码,我的耐性也越来越好,直到发生了去年年底的台湾地震,彻底上不去了。

正如keso所说的,Google不怕天灾怕人祸,Google居然好使,Google的书签虽然还是一副性无能的样子,却发现跟一直在用的Google工具栏有很好的集成,可算是挺而不坚。但这不是微软惯用的伎俩吗?

百度好象也适时的推出了百度搜藏,速度很快,也可以搜索注释,只是好象有中文分词限制,比如有个网页叫“和谐社会”,如果你搜“谐社”就搜不到,当然“和谐”或“社会”就都可以,它的网页快照功能也是一个特色。只是秉承了一贯封闭的作风,只许导入,却没有导出功能,我不是非得吊死在你这颗树上吗?

正好在邮箱里发现有哥们索要邀请,我一时不知道是哪个邀请,回信问了一下,说是diigo,啊想起来了,以前还专门到人家Blog上讨过邀请呢,估计这家伙就是在那儿看到我的邮箱地址的。不知什么原因注册后进去转了一圈就出来了。密码都忘了。费了一番劲找回了密码,给那家伙发了个邀请,导入blinklist上的书签,第一件事就试用了一下搜索。

说一下搜索吧,这是我现在找书签最在意的一个功能了,几百个书签要是搜索功能弱的话在多也是白搭,更多的书签反而为寻找一个曾经的网页增加难度,许多书签服务仅仅支持标签搜索如blinklist,由于标签的随意性,虽然收藏的时候往往绞尽脑汁想标签,一到要找的时候往往想不起来当初用的是什么标签,如果上天再给我一次机会收藏同一张网页,我一定会想出另外一个标签。所以最好能从url、标签、注释(评论)中全文搜索。顺便提一下,Google bookmarks的搜索本来也还可以,最近居然在这个老本行上有退化现象。

diigo的搜索功能看上去很全,甚至还能从被高亮选择的网页文字中搜索。试用下来叫人失望,中文搜索结果都是0,想去论坛问一下,怎么也发不了帖。老子有点火了,不是说是几个中国人在搞吗,还不是中国人办的美国公司?后台在中国是什么意思?如果包括服务器的话那就算了。如果是主力开发团队,没有中文界面,没有中文搜索,有博客还说要大家多多支持,就这样?还是小心别给愤青看到吧。我还是推荐开源的zotero

转了一圈又回到del.icio.us,简单实用,我想会用一段时间了。

2007年4月17日星期二

曹础基:不知为不知

有一次我问不许联想为什么三联书店把《知音》、《家庭》这样的性启蒙读物和小学生教辅放在一起卖,却没有《三联生活周刊》,不许不联想说:“不知道”,我再问:“你不是三联的吗,怎么会不知道呢?”不许不联想火了:“SB,知道就知道,不知道就是不知道,知道了吧。”

这话不知怎么让于丹老师听见了,于丹老师说大家别以为孔夫子和他的《论语》高不可及,现在我们必须得仰望它,也许倒退2500年,不许不联想就是孔子,你别看他现在只能自己开个博客删帖为乐,要是在2500年前,他就直接杀人了,可怜的少正卯,早生了2500年。你看他说的这句话,用2500年前的话说就是“知之为知之,不知为不知,是知也”。2500年后,有一个人为这句话写了一本书,书名就叫《无知者无畏》。

于丹老师说了这翻话后,有人不干了,说什么只许他们抄书不许于丹说书。他们有的没出过书,有的抄过很多书,他们大都坐过冷板凳。于丹老师不想去演三国舌战群儒,她把三国留给她在百家讲坛的同事宜种田,自己跑去说《庄子》了。

于丹老师说庄子是诸子百家中一个重要的代表人物,人们把孔子称为“圣人”,称庄子为“神人”。按我的理解圣人是说了一辈子大道理,自己跑去见南子,娶了学生的人。神人就是他做的事别人都做不了,如分开红海海水之类。圣人就是吾庐独破受冻死亦足,神人是仰天大笑出门去,我辈岂是蓬蒿人。

我觉的做神人比较不错,于是也找了本《庄子》看起来装样子。神人的书到底不一样,许多地方读不懂,比如这一句

是以无有为有。无有为有,虽有神禹且不能知,吾独且奈何哉?
可惜于丹老师也没有解释。于是找了许多白话,今译来看,大家都说:
这就是把没有当做有,把没有当做有,即使是神明如大禹也不能理解,我又能如何呢?
看了等于白看,结合上下文还是不能理解,他们就不能在这里讲点心得吗?怎么这时候没见博士教授出来为中国文化哭丧呢?估计这些书跟他们的书一样没几个人原意看吧。

今天看到一本曹础基先生写的《庄子浅注》,顺手就翻到那一段,想看看曹先生是怎么解释的。曹先生的解释很简单,值得大家学习:
不知道,无法理解

谨与刘心武老师共勉。

2007年4月15日星期日

Kubuntu下玩转数码相机

题目有点大啊,只不过是如何将相片从数码相机拷贝到系统而已,Kubuntu下其实很简单,安装digikam即可。

不过目前Edgy好象有个小bug,需要修改/etc/udev/rules.d/45-libgphoto2.rules文件,否则内核模块不能正确加载:
#BUS!="usb*", GOTO="libgphoto2_rules_end"

SUBSYSTEM!="usb_device", GOTO="libgphoto2_rules_end"

如果不安装digikam,系统好象也能识别数码相机,默认使用konqueror打开,不过存储卡上的东西都看不到。

无论是digikam还是konqueror,好象都没mount任何设备,查看/dev下也没多个sdb,所以我也不知道如果在Console下应该如何使用数码相机。

2007年2月8日星期四

给Beryl降级

2个星期没碰我的本本了,今日得空,先顺路去recover mode下升级了一下系统,主要是beryl和wine,升级完毕后正常进入系统,发现 beryl不能用了,网上搜了一下,目前的办法要么是降级使用,要么等待beryl更新。看了一下这个帖子,决定降级,不过把命令换成了aptitude:

sudo aptitude remove beryl beryl-core beryl-manager beryl-plugins beryl-plugins-data beryl-settings beryl-settings-bindings emerald emerald-themes libberyldecoration0 libberylsettings0 libemeraldengine0

sudo aptitude install beryl=0.1.99.2~0beryl1 beryl-core=0.1.99.2~0beryl1 beryl-manager=0.1.99.2~0beryl1 beryl-plugins=0.1.99.2~0beryl1 beryl-plugins-data=0.1.99.2~0beryl1 beryl-settings=0.1.99.2~0beryl1 beryl-settings-bindings=0.1.99.2~0beryl1 emerald=0.1.99.2~0beryl1 libberyldecoration0=0.1.99.2~0beryl1 libberylsettings0=0.1.99.2~0beryl1 libemeraldengine0=0.1.99.2~0beryl1 emerald-themes=0.1.99.2~0beryl1

为什么aptitude不支持*之类的通用匹配符呢,看它的手册页,有个~可用,但在我这里也根本没有作用
aptitude -s remove '~beryl'
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
Reading state information... 完成
正在读取扩展状态文件
正在初始化软件包状态... 完成
创建标签数据库... 完成
下列软件包已经被自动阻止升级:
beryl-core beryl-manager beryl-plugins beryl-plugins-data beryl-settings
emerald emerald-themes libberyldecoration0 libberylsettings0
libemeraldengine0
下列软件包已经被阻止升级:
beryl beryl-settings-bindings
0 个软件包被升级,新安装0 个, 0 个将被删除, 同时 12 个将不升级。
需要获取 0B 的存档。 解包后将要使用 0B。
将要下载/安装/卸载软件包。

顺便想起个人觉得aptitude另一个不便的地方,就是不支持本地软件包的安装,你会说apt-get也不支持,还是要dpkg来解决问题,可我还是觉得有这个必要吗,一个命令解决常用安装卸载不是很好吗?

2007年1月24日星期三

换了电源管理小程序──kde-guidance-powermanager

kde-guidance-powermanager似乎是kubuntu的开发者自己搞的一个kde电源管理前端工具,又似乎还引起了一些kde开发者的不满:“为什么要重新发明发轮子呢?为什么不来帮助我们改进已有的工具(kpowersave)呢?”

kde-guidance-powermanager基于HAL(硬件抽象层:Hardware Abstraction Layer),根据开发者的说法,原来的klaptopdaemon使用了过时的技术而难以维护,而kpowersave从Ubuntu的电源管理中复制了大量功能,造成可能会与Ubuntu的软件包冲突和支持上的困难。

口水中涉及的软件包管理以及编程问题以我的水平也就能了解个大概,不过Edgy已经作为默认安装了,由于我是从dapper升级到edgy的
sudo aptitude --purge dist-upgrade
不过,purge似乎没有作用,默认使用的还是klaptopdaemon,先删除之:

sudo aptitude purge klaptopdaemon
然后安装:

sudo aptitude install kde-guidance-powermanager
装好后,重启一下就OK了。你会发现当鼠标移动到那个闪电+电池的图标上时,除了象klaptopdaemon一样显示电池容量外(kpowersave没用过),还能显示CPU的实时工作频率,而且正确识别了我的双核T2050,有两个指示器分别显示一个核心,不过在开启beryl后,Processor2的部分被主面板遮住了,不知道算不算是个bug,此外还增加了休眠挂起等实用功能。

现在还只是0.7版本,界面也只有英文的。

一个小东西,我平时也不大用到,就此打住吧