Showing posts with label linux. Show all posts
Showing posts with label linux. Show all posts

2010-10-21

[读书笔记] LVM (更新)

原始版本: http://hi.baidu.com/lidaobing/blog/item/9509a344ed416a87b3b7dc2a.html


updated: ext2resize 不再可用,换到 resize2fs


它是什么?


LVM(逻辑卷管理)能将多个储存设备(包括分区,RAID设备等)合并成为一个新的储存设备。在这设备上可以建立多个分区。他支持动态调整分区大小,动态添加或删除底层设备。


安装



sudo apt-get install lvm2
sudo apt-get install e2fsprogs



创建


LVM 可以在磁盘的分区或者RAID上的分区(如/dev/md0)上创建



# pvcreate /dev/sdb /dev/sdc # 格式化分区为LVM格式
# vgcreate vg0 /dev/sdb /dev/sdc # 创建volume group
# vgdisplay vg0 # 显示volume group 信息
# apt-get install dmraid # 安装raid device map
# lvcreate -L 500G -n vol1 vg0 # 创建逻辑卷
# mke2fs -j /dev/vg0/vol1 # 在逻辑卷上创建 ext3 分区
# mount /dev/vg0/vol1 /mount/path


扩容 (无须停机)



# pvcreate /dev/sdd
# vgextend vg0 /dev/sdd
# lvextend -l +100%FREE /dev/vg0/vol1
# resize2fs -p /dev/vg0/vol1


磁盘损坏


还有额外的地方可以连接新的硬盘 (无须停机)


比如 /dev/sdb 损坏,接入的新硬盘叫 /dev/sde



# pvcreate /dev/sde # 格式化新硬盘
# vgextend vg0 /dev/sde # 添加新硬盘到卷组
# pvmove /dev/sda /dev/sde # 移动数据
# vgreduce vg0 /dev/sda # 卸载硬盘


没有额外的地方可以连接新硬盘


需要先缩小分区至可容纳在剩余的硬盘上



# pvmove /dev/sda # 移动数据至同组的其他硬盘
# vgreduce vg0 /dev/sda # 卸载硬盘
# 更换硬盘
# pvcreate /dev/sda
# vgextend vg0 /dev/sda
# 接上面的扩容步骤



参考文献


2010-10-08

approx

打包时经常需要反复下载一些包, 如果你的网速不够快,建议安装 approx 透明代理, 可以缓存大部分包。

1. 如何安装 approx
安装方法: "sudo apt-get install approx", 然后修改配置文件 /etc/approx/approx.conf 为
ubuntu http://cn.archive.ubuntu.com/ubuntu
debian http://mirrors.163.com/debian
修改 /etc/apt/sources.list, 修改为如下的内容
deb http://127.0.0.1:9999/ubuntu lucid main restricted universe multiverse
deb http://127.0.0.1:9999/ubuntu lucid-security main restricted universe multiverse
deb http://127.0.0.1:9999/ubuntu lucid-updates main restricted universe multiverse

2. approx 的优点
2.1 可以在局域网内共享, approx 缺省绑定在 0.0.0.0, 所以一个局域网内用户可以共享这个源,互相加速, 如果使用安装法部署大量机器时也非常快速
2.2 i386 和 amd64 系统可以互相加速(因为可以互相共享架构无关的包),karmic 和 lucid 也可以互相共享包 (某些包在这两个版本是一致的), 但 debian 和 ubuntu 之间不能共享包
2.3 即使单人使用, approx 也很有帮助,比如可以快速重建 linux chroot, pbuilder, 或者在虚拟机内重装一份debian/ubunu
2.4 可以模拟多线程下载,比如你要同时安装 vim 和 emacs, 可以先运行 "sudo apt-get install vim", 然后在下载时按 Ctrl+C 终端,然后运行 "sudo apt-get install emacs23", 这时候 approx 会在后台帮你下载 vim 所需的包 (一般会帮你下载前面5个)
2.5 智能cache, debian/ubuntu 仓库有逐级签名, approx 能快速判定一个文件,是不是完整的,是不是最新的, 也可以定时清理掉不再被使用的文件。

2010-08-28

关于 Debian 的一些事实

昨天在 SHLUG 的每月聚会上, 和朋友聊起 Debian, 是 Debian Developer (简称为 DD), 当时另外一位 developer zigo 也在 (法国人,定居中国), 就跟大家介绍了 Debian 的一些工作方式, 发现大家对 Debian 还是有误解和不理解。现整理如下

  • Debian 是纯社区支持的发行版,没有一个公司主导, 这个与 Ubuntu, Fedora 不一致
  • Debian 没有需要付薪水员工, 一个也没有
  • Debian 后面与钱有关的组织叫 SPI, 一般是有事的时候才开始募钱, 所以收支少的时候一个月就 1000 美金左右,多的时候大概是几万美金(比如每年的 DebConf), DD 可以加入他们的列表,每月有一份账单, openoffice, postgresql 的钱似乎也归他们管,所以也能看到他们的账单,他们的账单比 Debian 还要小。
  • Debian 的领导人每年选举一次, 每个DD把候选人进行排序, 如果其中一人严格优于其他候选人,那么他就当选,否则重选, 比如 2010 年的选举: http://www.debian.org/vote/2010/vote_001
  • 尽管领导人每年一选,但具体执行事务的人不需要进行选举,也很少更换
  • Debian 的大部分事务都是动议,反对制, 也就是说你有一个想法, 就把想法发到邮件列表,没人反对你就可以做了,有人有意见,就大家讨论,达成一致你就可以实施了。
  • 对于一些有重大分歧的, 可以使用 General Resolution, 提出几个方案,大家再来投票, 比如以前的 GFDL 是否满足 DFSG, 是否引入 DM 等。
  • Debian 的沟通方式以 email 为主, IRC 为辅, 甚至报告 bug 也是通过 email, 对 email 方式不熟的话还是通过 reportbug 或者 reportbug-ng
  • 一个软件包需要进入 Debian, 只需要通过一个 DD 的同意即可, 另有一个小组(叫 ftp-master) 负责检查软件的 license 是否干净。
  • 申请 DD 的流程很长, 中位值时间大概是 10 个月, 我花了一年多。
  • 中国的 DD 总共 7 个(包括 zigo), 但其中一个帐号被锁, 可以通过 http://db.debian.org/ 查询
  • 现在有八百多 DD, 但上次Debian Leader 选举只有不到 400 人参加

2009-03-17

尝试了一下直接写 gobject

先说结论吧: 1. 痛苦的体验,2. 用面向过程的语言来做面向对象的事时你需要处理很多繁琐的事情 3. 用 gob2 之类的工具可以改善体验。

基本结构


这部分有模板可以套(30-40行),你只需要把里面的名字换成自己的类的名字, 不过由于存在全大写, 首字母大写,用下划线分割的小写三种情况,所以你需要替换三次。

在这一步,你定义了 6 个宏,两个 struct 和两个函数 xxx_init 和 xxx_class_init.


处理析构


如果你的对象引用了其他对象,或者有动态分配的内存(比如字符串), 那么你就需要处理析构的问题。 gobject 为了解决循环引用的问题,所以析构分为两步, 第一步是解除对其他对象的引用(这一步叫做 dispose), 第二步是释放动态分配的内存(叫做 finialize)。在这一步中,你需要添加一个全局静态变量保存 parent_class, 定义 xxx_dispose 和 xxx_finalize (记得通过 parent_class 调用父类的对应的析构函数), 在 xxx_class_init 代码中初始化 parent_class, 已经把 xxx_dispose 和 xxx_finalize 关联到这个类。

私有成员


封装很重要,所以私有成员不应当放到头文件中,所以类 Xxx 的定义应该如下所示。

struct _Xxx {
GObject parent_instance;
XxxPrivate* priv;
}

gobject 用了一个小技巧来防止生成一个对象时分配两次内存,他可以让生成对象时申请的内存大小为 sizeof(Xxx) + sizeof(XxxPrivate),当然这个是可选的。

通常,你为了支持私有成员,你需要添加一个宏,同时在 xxx_init 和 xxx_class_init 中加入必要的初始化代码。

属性


gobject 的属性主要功能是为了实现事件监听,你可以在属性上挂回调函数来监听属性的改变。如果你不需要的监听的话,那么简单的一个私有成员,再加上 set 和 get 函数即可。实现属性是一件很郁闷的事,你首先要定义一个 enum 来给每个属性一个顺序号, 然后定义 xxx_get_property 和 xxx_set_property 来覆盖基类的实现,然后在 xxx_class_init 中为没个属性定义一个包含属性元数据的结构,最后依次用 g_object_class_install_property 安装。

仅有这些似乎还不够,你一般还需要定义一些辅助函数或辅助宏来降低用户使用的难度,包括 set, get, signal_connect 等。

信号


其实属性的大部分的功能都可以用信号来实现(在属性的 set 函数上 emit 一个 foo-changed 信号),而且 signal 的写法比较简单,无须重写 xxx_set_property 和 xx_get_property。

总之


总之,写的很烦,而且写了半天还没有写到业务代码,每增加一个属性或者信号都需要不少的工作量。看了一下 python 的 gobject 封装感觉很漂亮(见下), gob2 也不错,能让你开发得开心一点。


import gobject

class MyObject(gobject.GObject):

foo = gobject.property(type=str, default='bar')
boolprop = gobject.property(type=bool, default=False)

def __init__(self):
gobject.GObject.__init__(self)

@gobject.property
def readonly(self):
return 'readonly'



最后补一句,虽然 C 语言有些繁琐,但 C 平台真的非常成功,有空再补一下我对平台,库,语言三者关系的观点。

2009-03-13

在 Java 服务端使用 syslog 作为日志系统

1. 为什么要用 syslog?


使用 syslog 的最大理由就是可以集中处理日志,通常一个中小型的服务端10来台机器,如果日志集中到一台服务器处理起来就非常方便。

其次,你可以很方便地利用 syslog-ng 这一类的服务器来对日志进行分流,在只需要跟踪某一种类型的日志时就比较方便。

除此之外,用文件做日志在部署时总会出现目录不存在,目录没有权限的情况,而用 syslog 就没有这个问题。

2. 配置 log4j


把如下的一段加入 log4j.properties 即可把日志重定向到 syslog(同时保留了终端,方便调试)

log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender
log4j.appender.SYSLOG.syslogHost=192.168.101.101
log4j.appender.SYSLOG.facility=local3
log4j.appender.SYSLOG.facilityPrinting=false
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSLOG.layout.ConversionPattern=%d{dd-MM-yyyy HH:mm:ss} %-5p (%C:%M:%L) - %m%n

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{dd-MM-yyyy HH:mm:ss} %-5p (%C:%M:%L) - %m%n

log4j.rootLogger=info, CONSOLE, SYSLOG


syslog 的每一条记录有两个属性,一个是 facility(可用于日志分类), 另外一个是 priority.

facility 就在上面的 log4j.appender.SYSLOG.facility 属性中配置,缺省值是 user, 对于服务器,我觉得在 local0 到 local7 之间选一个比较好,便于将日志分类。所有可用的 facility 可以参考log4j的文档

priority 在我们用 log.error, log.warn 之类地命令进行日志操作时就已经指定了,syslog 有 8 个优先级,log4j 用了其中的 5 个,对应关系如下(syslog的 ALERT, CRIT, NOTICE 3个等级未被使用)

log4j.FATAL = 0 = syslog.EMERG
log4j.ERROR = 3 = syslog.ERR
log4j.WARN = 4 = syslog.WARNING
log4j.INFO = 6 = syslog.INFO
log4j.DEBUG = 7 = syslog.DEBUG


log4j.appender.SYSLOG.syslogHost 这个配置选项用于配置 syslog 机的 IP, log4j.appender.SYSLOG.facilityPrinting 设为 true 时会在每条日志前打印 "local3:", 在日志没有分流时打开此选项可以用 tail -f /var/log/syslog | grep local3 来只跟踪从你的服务器传来的日志。

syslog 服务端


我一般使用 syslog-ng 来作为 syslog 服务器,安装后打开 /etc/syslog-ng/syslog-ng.conf,把 "udp()" 这一行取消掉注释后重启 syslog-ng 服务即可正常使用,所有的日志会被输出到 /var/log/syslog。(注意,如果日志服务器在外网,建议修改 /etc/hosts.deny 和 /etc/hosts.allow, 防止被人灌数据灌着玩)

一般我们会把服务器的日志定向一个单独的文件来进一步处理,最简单的情况就是把如下的一段追加到 /etc/syslog-ng/syslog-ng.conf, 然后重启 syslog-ng 服务。

filter f_foo { facility(local3); };
destination df_foo { file("/var/log/foo.log" owner("foo")); };
log {
source(s_all);
filter(f_foo);
filter(f_at_least_warn);
destination(df_foo);
};

syslog-ng 也支持把日志的输出重定向到你的程序,具体可以参见 syslog-ng 的文档。

最后你可能需要把你的日志文件加入 logrotate 的配置, 这样方便日志滚动。

2009-02-14

tegaki 0.1 is ready for ubuntu 8.10 (a handwriting input method)

Hello,

tegaki 0.1 is ready for ubuntu 8.10 in my ppa. (need more refinement before submit it to the Debian/Ubuntu official repos)

tegaki provide a handwriting input method for scim, support japanese and simplified chinese.

INSTALL:


  1. add the following line to your /etc/apt/sources.list:

    deb http://ppa.launchpad.net/lidaobing/ppa/ubuntu intrepid main

  2. run "sudo apt-get update"

  3. run "sudo apt-get install scim-tegaki"

  4. if you want to recognize Simplified Chinese, run "sudo apt-get install tegaki-zinnia-simplified-chinese"

  5. if you want to recognize Japanese, run "sudo apt-get install tegaki-zinnia-japanese"



这个情人节过得很充实

ibus 0.1.1 for ubuntu 8.10 is ready

Hello,

I have add ibus 0.1.1 to my ppa (ubuntu 8.10), you can install this by add the following line to your /etc/apt/sources.list:

deb http://ppa.launchpad.net/lidaobing/ppa/ubuntu intrepid main


all packages are in this site except two:
1. ibus-chewing: have some packaging issue not resolved.
2. ibus-table-zengma: law issue

this site is slow in China (also slow for me), if anyone want to setup (or already have setup) a mirror for this site, leave me a information, thanks.

2009-02-07

dell inspiron 1420 打开 mic 的方法

启动 gnome-volume-control 后

1. Device 选择 HDA Intel (Alsa mixer)
2. 选择 Options Tab
3. Digital Input Source 改为 Digitial Mic 1

2008-10-19

sound card support for Dell Inspiron 1420 under Debian



$ sudo udevadm trigger

2007-09-11

在 Openoffice.org 中插入矢量图

Openoffice.org 支持的矢量图格式有 EPS, EMF, WMF, SVM 等,但最容易获得的 EPS 的支持效果非常差。其他容易获得的矢量图格式 PS, PDF, SVG 都不支持。所以我需要将 EPS 转换为 EMF 格式。

你需要如下的工具:
1. pstoedit: http://www.pstoedit.net/pstoedit
2. transfig: http://www-epb.lbl.gov/xfig/
我的 Ubuntu 系统自带这两种工具

步骤:
1. pstoedit -f fig a.eps a.fig
pstoedit 还支持从 ps 和 pdf 格式转换
2. fig2dev -L emf a.fig a.emf

附:
1. pstoedit 的 man 中提到可以直接转换为 emf, wmf 格式,但我的 Ubuntu 自带的版本不支持。
2. pstoedit 支持转换到 svm 格式,但图片失真严重。






2007-08-17

Emacs


在 en_US.UTF-8 环境下使用emacs

  1. 建议在 LC_CTYPE=zh_CN.UTF-8 环境下运行 emacs, 否则emacs无法正确判定应当使用何种字体来显示中文字符(他会优先使用日语、繁体中文字体来显示简体中文),细节可以参看 mule-cmds.el
  2. 在 $HOME/.emacs 中加如下两句
    (setq current-language-environment "Chinese-GB")
    (prefer-coding-system 'utf-8)
    这时你用"C-h v coding-category-list"可以看到coding-category-list等于
    (coding-category-utf-8 coding-category-iso-8-2 coding-category-big5 coding-category-iso-7-else coding-category-iso-8-1 coding-category-utf-16-be coding-category-utf-16-le coding-category-iso-7-tight coding-category-iso-7 coding-category-iso-8-else coding-category-emacs-mule coding-category-raw-text coding-category-sjis coding-category-ccl coding-category-binary)
    其中coding-category-iso-8-2就是chinese-iso-8bit,也就是gb2312

2007-07-12

前不久有人抱怨说Linux下使用虚拟机vmware运行windows无法使用招商银行信用卡。

今天拿 qemu+win2k+ie6 试了一下,网络管理和支付都成功了

可能是
1. 招商银行不检测虚拟机了
2. 招商银行只检测vmware,不检测qemu
3. win2k 下面检测功能失效

从 sunny 的反馈来看,他的 vmware+win2k 没有成功,那么成功的原因很可能是2

以前用过vmware,似乎记得他的虚拟硬件都带有 vmware 的标记,也许是招行的控件根据这个来判定这个是否是虚拟机。qemu似乎没有这个问题。

P.S. 以前某个版本的超星阅读器可以防止打印到 PDF,后来发现把 PDF 打印机改个名就可以继续打印了,不知道 把vmware 的显卡之类的硬件改个名是否能避开招行的检测。不过招行仍然可以检测硬件驱动、硬件ID等,也许仍然不管用。

2007-05-30

Linux 下的 2D 分子作图软件

1. bkchem
基于Python+Tk, 现在的版本是 ?
  • 整体不错,用SVG+CDML储存, 不过canvas没有AA
  • 还未加入debian

2. gchempaint
基于GNOME, 现在的版本是 0.6.6
  • 分子的自带标签系统自由度极小,不过有独立的标签系统补充
  • 标签周围的空白区域过大
  • Ctrl-C, Ctrl-V 不能工作 (或者不是你想象的那样工作)
  • 带AA的Canvas,非常漂亮

3. chemtool
基于GTK+, 现在的版本是1.6.10
  • 标签与键会重叠
  • 不支持从命令行将文件转化为图片
  • 文件不基于XML

4. xdrawchem
基于 QT, 现在的版本是 1.9.9,主要问题是
  • bug1: 保存后重新打开时部分文字移位
  • bug2: 编辑过程中文字消失
  • bug3: 保存后重新打开时部分双键变形,本来是等长的双键,会变得一长一短。
  • 不支持从命令行打开文件, "xdrawchem foo.xdc" 会报错。
  • 不支持从命令行将文件转化为图片(只支持PNG格式)

5. easychem
基于GTK+, 现在的版本是 0.6
  • 不支持标签,这是一个画线条的系统


2007-03-18

KDE/QT 程序的中文字体配置

目的: 让大部分KDE/QT程序无须配置即可显示中文,并且优先使用bitstream之类的字体来显示英文,再用宋体来显示中文。

1. 安装qt3-qtconfig
2. 运行LC_ALL=C qtconfig-qt3
2.1 打开fonts tab
2.2 在"Fonts Substitution"下面的下拉框里选择"Serif"
2.3 在最下面的"Select substitution Family"右边的下拉框选择"Bitstream Vera Serif", 点击右边的"Add"按钮
2.4 重复2.3步,把"DejaVu Serif", "FreeSerif", "AR PL ShanHeiSun Uni"加入列表
2.5 重复2.2-2.4步,设置"Sans Serif", "Monospace"的替换字体,注意选择对应的字体
2.6 保存
3. 运行LC_ALL=zh_CN.utf8 qtconfig-qt3,重复2的步骤,把"文鼎PL细上海宋Uni"加入替换列表
4. 运行qtconfig-qt4,重复2-3的步骤
5. 备份 $HOME/.qt/qtrc, $HOME/.config/Trolltech.conf

注意,最后的两个配置文件的位置可能在不同的发行版之间略有不同,建议用strace -o ~/qtconfig.log qt3-qtconfig来追踪位置。

2007-03-09

现有银行对于自由软件的支持情况


http://wiki.billxu.com/moin/CampaignBankStatus


2006-09-25

1. 安装reportbug, msmtp
2. 修改 $HOME/.reportbugrc
reportbug_version "3.29.3"
mode advanced
offline
no-cc
header "X-Debbugs-CC: lidaobing@gmail.com"
mta /usr/bin/msmtp
# 实际上是先运行"reportbug --config",然后再手动修改的
# 使用offline的原因是reportbug自带的bug查询太慢了,比我用firefox打开bugs.debian.org/packagename还慢
# 使用msmtp的原因是reportbug自带的smtp服务器不稳定,经常不能用(至少对于我来说是如此)
3. 修改 $HOME/.msmtprc
host smtp.gmail.com
port 465
auth plain
from lidaobing@gmail.com
user lidaobing@gmail.com
password "xxxxxxxx"
tls
tls_nostarttls
logfile ~/.msmtp.log
# 我使用的是gmail,如果你们用其他邮箱,这个配置文件可能不适用
# from, user, password 记得改成你自己的
4. 运行 reportbug qterm ,就可以向qterm提交bug了

2005-06-01

My things in UTF8

My things in UTF8

我准备把我的Linux平台的编码从zh_CN.GB2312改为zh_CN.UTF-8,希望能够一切 顺利。

我的系统是Debian/Linux, sid, 2.6。

基本配置

bash的设置没有改,.xsession是.xinitrc的软链接。 .xinitrc内容如下:
# .xinitrc
source $HOME/.bash_profile

LANG=zh_CN.UTF-8
LC_MESSAGES=en_US
LC_TIME=en_US
export LANG LC_MESSAGES LC_TIME

export GDK_USE_XFT=1
export GTK_IM_MODULE='scim'
export XMODIFIERS="@im=SCIM"
scim -d

xscreensaver -no-splash &
esd &

icewmbg &
icewmtray &
exec icewm

文件名

可以用convmv来转换
convmv -f gb2312 -t utf8 -r --notest *

-r表示包含所有子目录 不加--notest就表示只看看有什么需要转换的,不做实际转换

文件内容

  • 可以用iconv,不过我更喜欢用emacs.用emacs打开文件
    C-x <return> f utf-8 <return> C-x C-s
    搞定。
  • 或者用vim(Thanks to fishy9@SMTH)
    :set fenc=utf8
    :w

xterm

理论上uxterm, rxvt-unicode-ml, mlterm, gnome-terminal都应该支持的,但 似乎uxterm, rxvt总有莫名奇妙的问题,所以我用mlterm(gnome-terminal的粘 贴风格我不喜欢)

输入法

Emacs

只需加如下两句

(setq current-language-environment "Chinese-GB")
(prefer-coding-system 'utf-8)

这时你用

C-h v coding-category-list

可以看到coding-category-list等于

(coding-category-utf-8
coding-category-iso-8-2 coding-category-big5 coding-category-iso-7-else
coding-category-iso-8-1 coding-category-utf-16-be
coding-category-utf-16-le coding-category-iso-7-tight
coding-category-iso-7 coding-category-iso-8-else
coding-category-emacs-mule coding-category-raw-text
coding-category-sjis coding-category-ccl coding-category-binary)

其中coding-category-iso-8-2就是chinese-iso-8bit,也就是gb2312

LaTeX

CJK

cjk-latex支持UTF8,但需要cyberb(debian没有提供),只好拿ttf-arphic-gbsn00lp伪装一个。

首先安装tetex-bin, cjk-latex, ttf-arphic-gbsn00lp,然后运行脚本unisong

unisong含两个文件,Makefile和c70song.fd

Makefile:

all: build
build:
ln -s /usr/share/fonts/truetype/arphic/gbsn00lp.ttf unisong.ttf
ttf2tfm unisong.ttf -w unisong@Unicode@ > unisong.log
rm -f unisong.map
for i in *.tfm; do base=`basename $$i .tfm`; echo "$${base} <$${base}.enc > unisong.map; done

install:
install -d /usr/share/texmf/fonts/tfm/arphic/unisong/
cp *.tfm /usr/share/texmf/fonts/tfm/arphic/unisong/
install -d /usr/share/texmf/dvips/arphic/
cp *.enc /usr/share/texmf/dvips/arphic/
cp unisong.map /etc/texmf/dvips/
cp unisong.map /usr/share/texmf/dvips/omega/
cp unisong.ttf /usr/share/texmf/fonts/truetype/arphic/
grep '^unisong@Unicode@ unisong.ttf' /etc/ttf2pk/ttfonts.map || echo "unisong@Unicode@ unisong.tff" >> /etc/ttf2pk/ttfonts.map
cp -f c70song.fd /usr/share/texmf/tex/latex/CJK/UTF8/
grep "^map +unisong.map" /etc/texmf/pdftex/pdftex.cfg || echo "map +unisong.map" >> /etc/texmf/pdftex/pdftex.cfg
mktexlsr
clean:
rm -f unisong*.tfm
rm -f unisong*.enc
rm -f unisong.map
rm -f unisong.ttf
rm -f unisong.log
.PHONY: build

c70song.fd(cjk-latex自带的c70song.fd,再将cyberb改成unisong就可以了):

% This is the file c70song.fd of the CJK package
% for using Asian logographs (Chinese/Japanese/Korean) with LaTeX2e
%
% created by Werner Lemberg
%
% Version 4.5.1 (17-Jun-2002)

\def\fileversion{4.5.1}
\def\filedate{2002/06/17}
\ProvidesFile{c70song.fd}[\filedate\space\fileversion]


% character set: Unicode U+0080 - U+FFFD
% font encoding: Unicode

\DeclareFontFamily{C70}{song}{\hyphenchar \font\m@ne}

\DeclareFontShape{C70}{song}{m}{n}{<-> CJK * unisong}{}
\DeclareFontShape{C70}{song}{bx}{n}{<-> CJKb * unisong}{\CJKbold}

\endinput

OK, make; su; make install就可以了

然后把你的latex文章转成UTF8编码,把\begin{CJK*}{GB}{song}改成 \begin{CJK*}{UTF8}{song}就可以了。

non-CJK

如果在英文文档中,你想直接输入Å,而不是去输入\AA的话, 可以使用latex-ucs来帮你实现。

安装完latex-ucs后,在tex文件的头部加入

\usepackage{ucs}
\usepackage[utf8]{inputenc}
就可以在正文中输入任何unicode字符了。

如果在文件头加入

\usepackage[C10,T1]{fontenc}
\usepackage[cjkgb]{ucs}
\usepackage[utf8]{inputenc}
那么输入中文也没有问题,不过就不能享受CJK带来的其他好处了。

FTP

很多FTP的文件名是GB2312编码的。解决方法有:

  1. 用mozilla系列浏览器来访问FTP,可以自行设置编码。
  2. 用lftp,在$HOME/.lftp/rc或/etc/lftp.conf文件中加入(感谢:yabozj AT zju.edu.cn)
    set ftp:charset "gbk"
    set file:charset "UTF-8"

MP3 ID3 tag

xmms 里边一堆的乱码,看来是ID3的编码的问题,没办法,又写了一个脚本。注意,这个脚本依赖于pyid3lib, 你可以到 http://pyid3lib.sourceforge.net/ 下载,如果你用debian的话,可以直接用 apt-get install python-id3lib 安装
#!/usr/bin/python
# mp3iconv.py
import os
import pyid3lib

def texticonv(text, fcode, tcode):
try:
text.decode(tcode)
except UnicodeDecodeError:
try:
newtext = text.decode(fcode)
except UnicodeDecodeError:
return False, None
newtext = newtext.encode(tcode)
return True, newtext
os.rename(fname, newfname)
return False, None


def mp3iconv(fname, fcode='gb2312', tcode='utf8'):
tag = pyid3lib.tag(fname)
needupdate = False
for key in ['artist', 'title', 'album']:
try:
text = getattr(tag, key)
except AttributeError:
continue
r, newtext = texticonv(text, fcode, tcode)
if r:
setattr(tag, key, newtext)
needupdate = True
if needupdate:
tag.update()

def main():
import sys
assert len(sys.argv) > 1
for x in sys.argv[1:]:
mp3iconv(x)

if __name__ == '__main__':
main()