5
13
2013
4

我的 neocomplcache 升级步骤

志以备忘。

  1. 下载新的 neocomplcache 压缩包
  2. 找到最近的关于 neocomplcache 的「移除 text mode 支持」和「允许使用 sudo」的补丁,依次删除之
  3. 找到最近一次的 neocomplcache 安装,删除之
  4. 解压新的 neocomplcache,并删除vest目录,重新检出README.md
  5. 提交
  6. cherry-pick 最后一次「允许使用 sudo」的提交
  7. cherry-pick 最后一次「移除 text mode 支持」的提交,解决冲突。在必要的时候搜索包含「is_text_mode」的代码并删除之。提交
  8. 2013年7月18日更新cherry-pick 最后一次「安装 neocomplcache 时对 ftplugin/snippet 的修改」的提交。Tab 大小非八个空格的都给我去死!
  9. 更新 Vim 文档的 tags 文件
  10. 测试没有问题后推送到远程仓库

附注:

移除 text mode 支持」提交是为了在写一般文字(注释、git 提交信息、文章等)时依旧能够精确地按原大小写补全。因为我是中文用户,含有大写的单词是专有名词(如 Python、gVim、iOS、FreeBSD)的概率要远高于句首大写首字母单词。

允许使用 sudo」。在使用 sudo 命令并且$HOME环境变量被保持的时候不要显示错误信息并禁用 neocomplcache。在这种情况下继续使用 neocomplcache 可能造成生成的缓存文件无法被当前用户修改。我很少遇到这种情况,因为只有少数特定文件我才会使用 sudo 去编辑。作者给出了另外两种(对我来说不可行的)解决方案:

  1. 使用 sudo.vim 插件。这样将不会有备份文件,撒消文件的情况不清楚,交换文件亦可能有问题。没有备份文件将导致错误的配置无法被简单地撒消。sudo.vim 使用tee覆写文件,在文件还没写完时停机或者硬盘空间不足时将导致数据丢失,并且因为编辑的通常是重要系统文件而导致系统故障。(参见如何更安全地覆写数据文件。)就算没有遇到这种极端的情况,覆写文件亦将对正在使用此文件的其它进程造成不可预料的影响。

  2. 让 sudo 重置 $HOME 到相应用户的家目录。这样我自己的 Vim、zsh 等配置就用不了了。

Category: Vim | Tags: vim neocomplcache
5
8
2013
3

编译 Android 版 zsh,以及 strace

说明一下,示例中使用的是 zsh 语法。bash 用户的话——先在电脑上用上 zsh 再考虑给手机装吧 ^_^

在网上能够找到 zshaolin 这么个包含 zsh 的 Android 包,但是它是收费的。于是,在成功编译了不少 Android 的东东后, 我决定自己编译个 zsh。

首先,把 Android NDK 放到 $PATH 里来:

path+=/opt/android-ndk/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86/bin

其次是./configure命令。其中那个LDFLAGS的路径里有我之前编译的 ncurses。注意这里必须指定使用 ncurses 库,否则会莫名其妙地失败。使用 Android 自己的 Bionic 这个 C 库的话,就只好禁用多字节字符的支持了。

另外,ncurses 编译的时候记得禁用 C++ 支持。

LDFLAGS=-L/ldata/media/temp/android/installed_binaries/lib \
  CC='arm-linux-androideabi-gcc --sysroot=/opt/android-ndk/platforms/android-14/arch-arm' \
  ./configure --host=arm-linux-gnu --prefix=/system --with-term-lib=ncurses \
  --disable-multibyte --bindir=/system/xbin

然后做点小修改,将Src/init.cTIOCSETD相关的两处代码注释掉,不然程序会卡在这个ioctl调用上。还要把所有_mktemp函数调用换掉。在config.h中注释掉HAVE__MKTEMP宏的定义即可。

接下来是编译。完成之后修改最后一行链接代码,将 ncurses 静态链接进去:

arm-linux-androideabi-gcc --sysroot=/opt/android-ndk/platforms/android-14/arch-arm \
  -L/ldata/media/temp/android/installed_binaries/lib -rdynamic \
  -o zsh main.o `cat stamp-modobjs` -ldl -lm -lc /ldata/media/temp/android/installed_binaries/lib/libncurses.a

然后make install安装,把生成的zsh可执行文件弄到手机上任何你喜欢放可执行文件的地方,share目录弄到配置的目录里去(我这里是/system)。或者我猜设置fpath变量也行?

我第一次编译成功的 zsh 没有去掉TIOCSETDioctl调用,于是启动时卡在那里一动也不动了。要调试这种情况当然是 strace 了。但很不幸的是,strace 用到了太多 Bionic 不支持的宏定义、结构体成员等。后来我换了 zshaolin 使用的这个工具链静态链接了个 strace,终于可以用了。

最后,我编译好的二进制文件下载链接。要注意的是,此 zsh 并不支持多字节字符(如中文)(但是人家 Kindle 上的就支持呢)。

2014年3月8日更新:如果遇到任务控制(job control)时无法将后台任务切换到前台,打印出「unknown signal」的问题,可将Src/signal.c:435处的WCONTINUED改成WSTOPPED(注意不是WIFSTOPPED),即:

--- Src/signal.c
+++ Src/signal.c
@@ -432,7 +432,7 @@
          */
 #if defined(HAVE_WAIT3) || defined(HAVE_WAITPID)
 # ifdef WCONTINUED
-# define WAITFLAGS (WNOHANG|WUNTRACED|WCONTINUED)
+# define WAITFLAGS (WNOHANG|WUNTRACED|WSTOPPED)
 # else
 # define WAITFLAGS (WNOHANG|WUNTRACED)
 # endif

这个方案是我通过 strace 手机上的 busybox 的 sh 学来的 =w= 新编译的 zsh 5.0.5 可以由此下载

Category: Linux | Tags: linux Android zsh 交叉编译
5
8
2013
6

禁用 Xfce4 终端的 F1 和 F11 快捷键

我在 Xfce4 终端 0.6.1 的首选项中禁用掉了菜单快捷键,但是却没有找到禁用F1打开一个无趣的帮助窗口的方法。不过还好这个快捷键我很少用到。现在可能是经历一些升级之后,我发现F11也被拦截,变成全屏快捷键了……

解决方案与更改 Nautilus 的删除快捷键差不多,将以下内容写到~/.config/xfce4/terminal/accels.scm文件中:

(gtk_accel_path "<Actions>/terminal-window/fullscreen" "")
(gtk_accel_path "<Actions>/terminal-window/contents" "")

此方法来自 SuperUser

Category: Linux | Tags: linux gtk
4
30
2013
5

编译了点 Android 的网络命令行工具

在 Android 这个奇怪的平台想弄点 Linux-style 的东西用真不容易。网上现成的东西也比较少,这里有 stunnel、redsocks 和 iptables 等。另外 GAEProxy 里有 redsocks、iptables 和 Python 2.7,在/data/data/org.gaeproxy目录下。但它的 Python 不支持 readline,redsocks 不支持 UDP。

下边是我自己编译的几个工具和其特点(全部没有第三方库依赖):

  • redsocks:取自 git 版本,支持 UDP。其中,支持 UDP 需要search.h头和相关库函数,但是 Android 的 C 库中没有。我使用了 musl 这个 C 库中的相关文件。
  • socat:支持 readline 和 OpenSSL。openssl 这个命令行工具也作为附加文件得到了,但是感觉用处不大。
  • tcpdump:著名的网络抓包工具。没什么特别的。

编译全部使用的是 Android NDK。编译命令基本上类似于:

CC='arm-linux-androideabi-gcc --sysroot=/opt/android-ndk/platforms/android-14/arch-arm' \
  ./configure --host=arm-linux-androideabi --prefix=/ldata/media/temp/android/installed_binaries

但是不同的软件通常都会需要一些修改。比如上边说到的 redsocks。最无痛编译成功的是 LuaJIT 了,但是我这里没找到什么实际用途。另外记得把生成的可执行文件用arm-linux-androideabi-strip处理下,减小体积。

以上三个工具打包下载请点击这里备用地址)。

Category: Linux | Tags: linux 网络 Android 交叉编译
4
24
2013
12

Lua 中的一起文件描述符泄漏案

用上 Awesome 3.5 后,我发现 Awesome 占用的内存有点多。后来又发现,运行的时间越长,其占用的内存也就越多:

Awesome 占用了大量内存

这不是典型的内存泄漏吗!

然后我发现我只要按下Win+Ctrl+R重新载入 Awesome 配置,内存使用就会回去。看来是我的配置文件有问题。不过由于时间关系一直使用重新载入的方式应付着。今天终于有点时间和兴致,于是专心对付它了。

不过 Lua 脚本的内存泄漏要怎么查呢?我一开始想把_G打印出来。不过以前写的那个 Lua 对象转字符串函数似乎并不太喜欢 Awesome 加进去的那些对象,抛出了异常。瞪大双眼检查配置文件里的各种全局变量,特别是那里每隔几秒更新一次的指示器们,但也没发现什么。有些不知所措,随手又调出 htop 查看上图中那个占用了「巨量」内存的 Awesome 进程,右手无名指不自觉地按下,然后竟然发现了一个问题:

Awesome 中的文件描述符泄漏

怎么开了那么多/proc/net/route/proc/net/dev文件?这两个文件是我在网络指示工具中打开并读取了的,但是我不至于扔着打开的文件不管啊:

function update_netstat()
    local interval = netwidget_clock.timeout
    local netif, text
    for line in io.lines("/proc/net/route") do
        netif = line:match('^(%w+)%s+00000000%s')
        if netif then
            break
        end
    end
    if netif then
        local down, up
        for line in io.lines("/proc/net/dev") do
            -- Match wmaster0 as well as rt0 (multiple leading spaces)
            local name, recv, send = string.match(line, "^%s*(%w+):%s+(%d+)%s+%d+%s+%d+%s+%d+%s+%d+%s+%d+%s+%d+%s+%d+%s+(%d+)")
            if name == netif then
                if netdata[name] == nil then
                    -- Default values on the first run
                    netdata[name] = {}
                    down, up = 0, 0
                else
                    down = (recv - netdata[name][1]) / interval
                    up   = (send - netdata[name][2]) / interval
                end
                netdata[name][1] = recv
                netdata[name][2] = send
                break
            end
        end
        down = string.format('%.1f', down / 1024)
        up = string.format('%.1f', up / 1024)
        text = '↓<span color="#5798d9">'.. down ..'</span> ↑<span color="#c2ba62">'.. up ..'</span>'
    else
        netdata = {} -- clear as the interface may have been reset
        text = '(No network)'
    end

我是用io.lines函数打开文件的。印象中这家伙是会自动关闭文件的啊,我也没办法再手动关闭是不?不过既然是这地方的问题,那么再去仔细看看文档好了:

Opens the given file name in read mode and returns an iterator function that works like file:lines(···) over the opened file. When the iterator function detects the end of file, it returns nil (to finish the loop) and automatically closes the file.

什么?and automatically closes the file?也就是说如果文件没读完的话……

于是我立即打开 ilua 写下:

for i in io.lines('strprint.lua') do print(i) if i:sub(1,1) == '-' then break end end

执行完毕,再去 htop 里查看文件描述符,果然没关!

好吧,又一坑。于是改成像 C 语言中那样显式打开和关闭文件了(相关提交在此)。过几天再看看问题有没有完全解决。


2014年1月11日更新:后来还是依靠 inspect.lua完全解决我的 Awesome 配置中的内存泄漏

Category: 编程 | Tags: Lua awesome
4
23
2013
7

使用 sed 来切换 hosts 文件项

工作中经常会需要将一个域名映射到本地以调试,但是其余时间又需要让其正常解析。手工修改/etc/hosts文件烦耶!

于是有了以下脚本:

#!/bin/bash

if [[ $UID -eq 0 ]]; then
  sed -i '/^#127\.0\.0\.1\s\+example\.org/s/^#//;t;/^127\.0\.0\.1\s\+example\.org/s/^/#/' \
    /etc/hosts
  systemctl restart dnsmasq
else
  grep -m1 -F 'example.org' /etc/hosts
fi

使用 sed 是因为觉得没必要用 awk 这样复杂的东西,也正好更深入学习下 sed。此代码中用到了t命令,它的语义是:

当当前行的上一个s命令成功(至少替换一次)时,跳转到指定的标签。如果没有指定标签,则跳转到脚本尾部。上边的命令中,当example.org域名这行被注释掉时,s命令成功去掉其前的注释符,然后t命令跳过后边加注释符的s命令,到达脚本尾部。

标签使用冒号定义。以上命令使用标签时如下所示:

  sed -i '/^#127\.0\.0\.1\s\+example\.org/s/^#//;te;/^127\.0\.0\.1\s\+example\.org/s/^/#/;:e' \
    /etc/hosts

当然,以上脚本还做了另一件事:当以普通用户身份执行时,不修改 hosts 文件,而是显示相关行以查看状态。

Category: shell | Tags: sed shell
4
15
2013
8

lxc 初体验

Linux Containers 是一种系统级的虚拟化方案。其实也就是个增强型的 chroot,和 BSD 的 jail 差不多吧。

准备工作

安装 lxc 以及 bridge-utils 软件包。后者是用来建立网络的。关于对内核的要求什么的请查阅此文。虽然其内容有些过时了,但是参考价值还是很高的。当然,一般新一点的通用内核都支持的啦。

然后想好在建立的 Container 里放什么系统。比如我用的 Funtoo,安装教程在这里。但其实大部分内容没什么用的。按照这里的指示下载一个合适的 stage3 包,并解压到一个目录中。portage 的安装等后续工作就不说了。

创建一个网桥并分配 IP 地址:

$ sudo brctl addbr br0
$ sudo ifconfig br0 192.168.10.1

由于我使用的是无线网络,因此不能使用一般教程中的方法将 eth0 加到网桥中去。建立个 NAT 好了:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
sudo iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE

配置

按下边这样新建一个文本文件:

# Container 的名字
lxc.utsname = funtoo
# 网络类型。我使用的是 veth
lxc.network.type = veth
lxc.network.flags = up
# 刚刚建立的网桥名
lxc.network.link = br0
#lxc.network.hwaddr 不要乱写,会出错的!让 lxc 自己决定吧。
# IP 地址。和网桥同一网段即可
lxc.network.ipv4 = 192.168.10.2
lxc.network.name = eth0
# fstab 文件
lxc.mount = /home/lilydjwg/workspace/funtoo/funtoo_root/etc/fstab
# 新系统的根文件系统
lxc.rootfs = /home/lilydjwg/workspace/funtoo/funtoo_root
# tty 数量。如果不给出的话 lxc-console 是连不上去的
lxc.tty = 7

然后,修改 funtoo 里的配置文件啦。首先是/etc/fstab

none /home/lilydjwg/workspace/funtoo/funtoo_root/dev/pts devpts defaults 0 0
none /home/lilydjwg/workspace/funtoo/funtoo_root/proc    proc   defaults 0 0
none /home/lilydjwg/workspace/funtoo/funtoo_root/sys     sysfs  defaults 0 0
none /home/lilydjwg/workspace/funtoo/funtoo_root/dev/shm tmpfs  defaults 0 0
/home/lilydjwg/tmpfs /mnt bind 0 0

最后一行就是和主系统共享的目录啦。不过我这里没有生效 :-(

然后删掉/etc/mtab

修改/etc/inittab启动配置文件。lxc-start命令启动的那个终端会是 container 的/dev/console文件:

# TERMINALS
c1:12345:respawn:/sbin/agetty --noclear 38400 console linux
c2:2345:respawn:/sbin/agetty 38400 tty1 linux

ttyN 上的 agetty 可以留着,因为我已经分配了足够的 tty 给它们。使用lxc-console -t 3 -n funtoo就可以连上 tty3。

修改/etc/resolv.conf,配置一个 DNS 服务器。

删除/etc/runlevels/default下关于 udev 的项;udev 是不会工作的。

给新系统中的 root 设置个密码:

$ sudo chroot /path/to/funtoo/root/ /bin/bash
funtoo ~ # passwd

创建新的 container。注意创建之后那个配置文件就没有用了。lxc 会复制一份到/var/lib/lxc/funtoo/config,需要的时候可以改它。

$ sudo lxc-create -f /path/to/config/file -n funtoo

启动啦

如果我没记错的话,现在就可以启动 funtoo 啦:

$ sudo lxc-start -n funtoo

不想它占用一个终端的话就加-d选项让它在后台跑吧。

不过这时候网络还没配置好。虽然 eth0 已经有 IP 地址了,也可以和主系统相互通讯,但是路由表仍需要手动加上,不然访问不了外网的。

funtoo ~ # route add -net 0.0.0.0 gw 192.168.10.1

然后就尽情地玩儿吧 :-)

参考资料

其它链接

Category: Linux | Tags: linux lxc
4
13
2013
2

[转] 程序员妻子自述:那些程序员教给我的

来源:伯乐在线

声明:没有找到原文授权说明。文章所有权人如果有异议请联系我。


我曾经跟朋友开玩笑说,这个时代,有两种人的妻子应该要受人尊敬,第一种是军嫂,这是毫无争议的,第二种就是像我这样的,程序员的老婆。当然,这个 玩笑半分自嘲半分真。我的本科是穿着大白褂在各种挂着植物、动物、有机化学、无机化学的门牌的实验室里度过的,在显微镜下给三段生的夹竹桃画过横切片图, 在大头针和解剖剪子的辅助下找过蚯蚓的三条神经,闻过带有臭鸡蛋味的硫化氢气体……

是的,你们都猜对了,我确实是相貌平平,不修边幅,素面朝天的理科女。见了人就开始习惯性地科普:蝴跟蝶,蜻跟蜓,其实是不一样的,还有,白菜跟萝卜其实都是属于十字花科啦,香港的市花根本就不是紫荆,那是马蹄甲,还有,还有,那个康乃馨的学名其实更好听的,叫石竹花……

没有人欣赏我。

因 为没有人在意我在说什么。是啊,我说的那些东西根本就没什么用处,别人还不如去微博上关注科学松鼠会。他们说,女生就应该好好打扮自己嫁个好老公,谁关心 什么纲目科属种。他们说,女生就应该多读点张小娴和亦舒。他们说,女生就应该多学点礼仪和瑜伽。他们说,你要是什么都不会,就学点厨艺啊。他们说,理科的 女生就是木讷,又没有情调,不如去选修一个文科的双学位吧?

——为什么呢?

——为什么?!你不想嫁个好老公吗?!

——哦。

其 实,虽然我没有读过张小娴和亦舒,但是我读过三毛,读过张爱玲,读过严歌苓,读过杨绛,读过席慕容,读过冰心,读过安妮宝贝,读过七堇年,读过王安忆,读 过《飘》,读过《安娜·卡列尼娜》读过《苏菲的世界》……不是只有清新文学和治愈系才能诠释一个女性啊,难道严肃文学就不能解读一个女性了么?

虽然没有学过礼仪,可是我大一就开始报名学习街舞。难道只有学过礼仪的女生才值得被疼惜被怜爱,而一个戴着鸭舌帽跳街舞的女生就应该遭到集体鄙视么?

……

是的,你们都比我聪明,知道我会遇到一个正眼看我的男生。

他告诉我,你很特别啊,很好啊,不需要改变啊……

我顿时就觉得他的周围笼罩了耶稣一般的光辉。

他是个程序员。

当然我不否认我从小到大确实有被一些审美有问题的男生夸奖过长得好,或许是他们深知白富美不会给予垂怜,像我这样的不入流的长相应该可以徒添他们的自信。但是,从来没有一个人跟我说过那么一句话:

你很特别。

可惜晴天霹雳是个贬义词,不然我真的很想用来形容我当时听到这句话的心情。

然后呢,然后我就义无返顾地成了一位程序员的老婆。我继续给他科普各种知识,他从来都是饶有兴致地看着我,就算我口沫横飞手舞足蹈他都不会嫌我聒噪。我甚至在他的鼓励下一天一天觉得自己确实长得不错。

直到有一天,我看到了那个小黑窗,看到了各种在小黑窗上面跳跃的白色字符。

——这是什么意思啊?

——这个表示创建一个目录,这个表示进入这个目录,这个表示查看这个目录的列表内容……

——哦……我给你洗个苹果吧……

后来,我们一个房间两台电脑,我们都不知道彼此在做什么。

后来,我说要不你教教我学编程吧。

后来,他告诉我一个网站,里面是《笨办法学python》,告诉我他常常看cnbeta,看爱范儿,看瘾科技,看糗事百科,告诉我他用 google reader,gmail,告诉我什么是单核什么是双核,告诉我什么是bug,告诉我固件指的不是一个固态的硬件而是软件,他送给我手机, 然后帮我刷机,送给我ipod touch然后帮我越狱,给我的电脑里面装上ubuntu……

他不让我在手机上面贴膜,并花时间跟我解释为什么不需要这么做。也是摔了几次之后他才答应我给手机买个保护壳。

他常常给我普及隐私的重要性,告诉我要及时备份我的各种文件。

后来,我陪他看《生活大爆炸》看《行尸走肉》看《生化危机》……

后来,我陪他逛华强北,逛博物馆,陪他加班……

后来,我考上了研究生,我们结了婚,分隔两地。

我开始学习PHP,学习HTML,学习Java,学习Dreamweaver,学习PS……

然后我开始给身边的女生普及各种计算机知识,陪她们去买电脑,挑手机,告诉她们不要给手机贴膜……

后来,我认识了很多很多很多程序员。从我的老师到同学,从我的朋友到朋友的朋友,从我读的书里面。

我从他们身上学到了很多。

我知道了 Steve Jobs,知道了为什么 less is more,知道了为什么用户体验那么重要,知道了 stay hunger stay foolish.

我知道了 Steve Krug,知道了为什么面包屑会叫做面包屑,也知道了为什么网页要做得 Don’t make me think。

我还知道了 Norman,知道了诺曼门,知道了如果东西使用不便不是我的错,而是设计的问题。

……

我懂得了程序员的幽默。

看到了不一样的世界。

我真正开始从心底里肯定自己,也是因为他。

这是一个好男人带给我的。

所谓的独立,便是不向别人过多索求,也不过多抱怨。

很遗憾的是,我没能带给他什么不一样的东西。

于是就想起了张卫健那首很老的歌:

“我什么都没有,就是有一点吵,如果你感到寂寞,我带给你热闹……”

Category: 未分类 | Tags: 程序员
3
30
2013
7

Vim 的 Tornado 模板语法高亮

很简单的东西,竟然没有人来做。之前虽然没有高亮,但也没出什么问题,于是我忍了。可今天,我要在 HTML 模板里用小于号了,于是 Vim 给我高亮成错误。于是我就做了:

" Vim syntax file
" FileType:     Tornado template
" Author:       lilydjwg <lilydjwg@gmail.com>

" Add something like the following in modeline to your templates:
" {# vim:se syntax=html.tornadotmpl: #}

syntax region tmplCode matchgroup=PreProc start="{[%{]!\@!" end="[%}]}" contains=@Python,tmplKeyword containedin=ALL
syntax region tmplComment matchgroup=PreProc start="{#!\@!" end="#}"
syntax region tmplComment matchgroup=PreProc start="{%\s\+comment\s\+" end="%}"
syntax keyword tmplKeyword end include apply autoescape block extends module raw set

let b:current_syntax_save = b:current_syntax
unlet b:current_syntax
syntax include @Python syntax/python.vim
let b:current_syntax = b:current_syntax_save
unlet b:current_syntax_save

highlight link tmplCode Normal
highlight link tmplComment Comment
highlight link tmplKeyword Keyword

此文件可从 vim.org 下载(记得要评分哦),将其放入~/.vim/syntax即完成安装。使用方法很简单,比如 HTML 模板就写set syntax=html.tornadotmpl,JavaScript 的就写成set syntax=javascript.tornadotmpl。可以按注释里那样子写到模式行里去。详见手册:help 'syntax'

Category: Vim | Tags: vim tornado
3
24
2013
24

使用 Wine 运行腾讯 TM

TM 是腾讯出品的一款与 QQ 互通的即时通讯产品。用起来就是瘦过身、去过广告的 QQ。TM2009Beta3.4 是目前最新的、也是唯一能够正常使用的 TM 版本。目前最新版本为 TM2013preview1,按如下方法也可使用。TM官网。最新的 preview2 版本无法安装,请使用此地址下载 preview1 版本。

我这里使用的是 Wine 1.5.26。相比之前我运行修改版 QQ 2010 时使用的版本,此版本在 TM 输入密码时不会崩溃、没有黑影等。在线后数秒内自动变成离开状态的问题依然存在。

不像 Winhex 或者 Beyond Compare,TM / QQ 并无法在 Wine 上直接运行,需要使用 winetricks 命令安装一些东西。细节如下:

首先,因为需要使用 winetricks 安装一些东西,为干净考虑,可为 TM 设置单独的 prefix,即

$ export WINEPREFIX=$HOME/.wine4tm

我这里是 64 位的 Arch Linux,因此需要设置 Wine 使用 32 位 Windows 环境:

$ export WINEARCH=win32

注意这种情况下,不要建立未初始化的$WINEPREFIX目录。运行一下winecfg什么的,让 Wine 自己建立之。

因为是 32 位环境,所以有些库可能需要手动安装,比如 Arch 下我手动安装了以下 32 位库:

lib32-libpng lib32-libjpeg-turbo lib32-mpg123 lib32-libxml2

初次运行某个 exe 文件时,注意下终端的输出。如果其中提到某个.so文件没有找到,那么就手动安装上吧。Arch 下查询需要安装的包的方法是,使用 pkgfile 命令查询该文件名,如:

$ pkgfile libpng15.so.15
extra/libpng
multilib/lib32-libpng

lib32-开头那个即是需要安装的软件包。安装之后并不需要重新运行该 exe 文件,除非它已经导致了问题。

lib32-libpng不安装会导致部分界面显示异常,lib32-libjpeg-turbo不安装可能导致好友发送的图片无法显示。

然后使用 wine 运行 TM2009Beta3.exe 这个安装文件。同时可以开始 winetricks 相关工作。

需要使用 winetricks 安装的组件如下:

  1. riched20

    此组件将解决登陆成功后 TM 崩溃的问题。相关bug报告在此。

  2. ie6

    此组件将解决编辑消息时的崩溃。其错误消息为:

    ###!!! ABORT: Main-thread-only object used off the main thread: file /build/wine-mozilla-1.9/xpcom/base/nsCycleCollector.cpp, line 1151
    

    从 winetricks 提供的地址下载 ie6 很慢,并且有些限制。可以通过 Google 搜索「msie60.exe」得到另外的下载链接,比如这个

  3. mfc42

    此组件将解决启动时 TM 界面中的黄条警告,以及其它一些问题。

安装完毕后,在点击链接时 winebrowser 会崩溃。使用 Wine 内建的「urlmon.dll」即可。设置方法是,打开winecfg,切换到「函数库」选项卡,在「已有的函数库顶替」中编辑「urlmon.dll」项,设置其使用「内建」版本。

搞完这些,TM2009 就可以使用啦!来张高清全屏截图——

已知问题:

  • 截图仅能截取一个屏幕。快捷键仅在 Wine 程序拥有焦点时可以工作
  • 接收图片时的动画不正常
  • 输入法光标跟随无效。fcitx 输入框总是位于输入框下方(这里有补丁,据说可以修正这个问题)
  • 在 Awesome 下(特别是双显示器的扩展屏上时),鼠标拖动窗口上边缘可能导致窗口乱跑
  • 可能会卡死(线程死锁,wine 的已知 bug),特别是在打开聊天记录时
  • Awesome 下最大化等同于全屏,wibox 被遮挡
  • 数秒后会自动变成离开状态此问题已经在 Wine 1.7.6 中修复

语音和视频暂未测试。远程协助基本正常。

重要提示:TM 的截屏图片是以 JPEG 格式发送和显示的,会造成截图模糊、失真。(尽管截屏并保存的话是 PNG,从其截屏功能或者从剪贴板粘贴的、发送到会话的图片是 JPEG。)常见的可接受的截图格式只有 PNG、GIF 或 BMP。JPEG 只适合照片这种取自自然而非生成的图像。

Category: Linux | Tags: linux QQ windows wine TM 腾讯

| Theme: Aeros 2.0 by TheBuckmaker.com