自己编译vim,解决Ubuntu 12.04 terminal里执行gvim会挂起的问题

2012年05月08日 22:51

对于我这样的vim党来说,Ubuntu 12.04有一个非常讨厌的问题,就是在terminal里执行gvim命令的时候会挂起。使得gvim根本无法正常使用。据猛禽说这个问题已经持续了几个版本了,不知道为什么到今天都得不到解决。

在ubuntu的bug track上给出了一个workround , 就是用gvim -f 代替 gvim。当然,我表示这种使用方法非常的不爽。

今天猛禽也遇到类似的问题了,我就想干脆找找看有没有彻底解决问题的方法。幸运的是,还真有。

这个帖子就对这个问题提出了讨论。然后有人给出了一个patch,据说能解决这个问题。

虽然很不想在Ubuntu下自己编译软件,不过抱着试试看的态度,我加上了那个patch之后编译了一下,还真是成功了。

在这里把编译步骤记录一下。

首先安装vim的编译依赖:

sudo apt-get build-dep vim

然后去获取vim的源码:

hg clone https://vim.googlecode.com/hg/ vim

当然了,上面那一步需要事先安装mercurial,这个很简单,就不说了。

然后把上面那个patch抓到vim目录(就是项目的根目录)里来。

cd vim
wget https://raw.github.com/gist/2576464/dcbc773312b1488f00eb8b8cb24dd74983349d89/fix-gui-gtk-fork-issue.diff

我个人觉得不是用于开发目的的话,直接编译主线代码不太好。所以先切换到某一个tag做编译比较好。一般当然是用最新的那个tag。

先用

hg tags | head

查询一下当前tags,比如我这里最新的是 v7-3-515

再用

hg update v7-3-515

切换到指定的tag。

然后开始打补丁:

patch src/gui.c fix-gui-gtk-fork-issue.diff

打完补丁之后当然应该去确认一下代码,看看补丁代码是不是已经在了,更简单的方法是直接用 hg diff 确认。这个也不细说了。

假设补丁已经正确打上。那接下来就是很熟悉的编译步骤了。不过这里要注意的是,默认的编译选项好像不行,至少要加上 --with-features=huge 才能使补丁生效。这个部分我没有深究,有兴趣的可以看看为什么。

我用的编译选项是:

./configure --enable-pythoninterp \
--enable-cscope \
--enable-multibyte \
--with-features=huge \
--with-compiledby=ch.linghu@gmail.com

configure完成之后就是 make 和 make install,这个没什么好说了的吧?

安装完成之后的程序在 /usr/local/bin 里,正常情况下会优先使用。可以用 gvim --version 确定一下(看版本号和编译者以及编译时间)。

编译安装完成之后,再执行gvim,应该是没有问题了。(至少我这里已经正常了)

Update:

这样编译出来的vim无法读取Ubuntu系统原有的系统配置,需要做一个软链接:

ls -n /usr/share/vim /usr/local/share/vim

这样编译版的vim表现才会和原来的完全一致。

本文推送至[go4pro.org]

bottlepy及其它

2012年05月07日 16:55

真的是好久好久没写blog了,现在都快不知道怎么写了。

闲话少叙,直接入正题吧。

前段时间我们的VPS上因为有人玩web开发而出现了一些些小问题,作为admin的我自然要开始解决这些问题。其中一个问题是,几乎所有用户在配置自己的 apache vhost 时都没有指定自己的日志文件,但系统默认的日志文件是需要root权限才能查看的。于是造成普通用户出问题时不知道问题出在哪里。

我当然不想为普通用户开放太多的root权限,所以我想写一个小的web服务来读取日志给VPS用户查看。当然这么简单的任务我也不想动用太大的框架,作为python爱好者的我选择一个轻型python web框架就成了当务之急,顺便公司里也需要用到一些web服务,这个选型也考虑到了公司需求。

目前比较流行的轻量级框架大概有这么几个:flask、web.py和bottle.py。我首先去看了一下Flask,因为它的知名度貌似是最高的,而且有一大堆插件可以用,社区支持度不错。不过真的去安装了一下我马上就决定放弃了。原因是它依赖其它的包。在VPS上当然是不成问题,不过我们公司的生产服务器是与网络隔离的,所以不想把依赖关系搞得太复杂。

webpy和bottlepy都是没有附加依赖的,猛禽用的是webpy,已经作出了一些东西了,于是webpy有实践性上的保证。不过我对它那种一个class带GET POST两个方法的语法结构总是感觉有些怨念。后来看了一些资料,我觉得还是bottle比较符合我的口味。于是就选了bottle。

对我来说bottle有以下好处:1、比webpy还要精简,单文件结构,代码干净俐落,容易阅读。2、标准wsgi结构,方便集成其它的wsgi中间件也方便部署。3、独立运行时,支持多种服务器。

另外bottle用decorator做url route的方法也比较合我的胃口。

再另外,bottle居然有 Google+ Page,我喜欢(这一点纯属个人恶趣味,跟技术无关-_-)。

不过bottle的缺点也是显而易见的,最大的缺点就是功能太少了,很多东西都需要依赖第三方的库。当然,它的简洁至少有一个好处,就是对于最最最最简单的应用可以不用为不需要的功能浪费资源。

另外有一个我挺纠结的缺点,就是它没有提供 url_for 这样的 urlhelper 支持,当把项目以mod_wsgi形式部署到一个子目录的时候就很麻烦了。不过这个应该可以有一些workround,回头我再想想。

实际应用中,我使用了 bottle + jinja2 + beaker 的组合来实现那个 apache_log_viewer。jinja2大概大家都知道了,是一个Template Engine,如果大家以前看过我的blog可能还记得我以前推荐过mako。现在怎么又换了呢?答案是,我想换换口味(又是个人恶趣味 -_-)。另外jinja2的语法确实比mako要简洁一些,速度相差无几,而且貌似更流行,试试没什么坏处。反正bottle对mako和jinja都有内置支持,如果这个不爽以后新项目换mako也没什么大不了的。beaker是一个wsgi session middleware。使用它的原因是因为bottle没有内置session支持,不过好在beaker用起来很简单,跟bottle的集成也很简单,这个也算不上什么太大的缺点了。

实际的代码很简单,而且没有太大的参考价值。就不献丑了。

另外这次开发让我也尝试了一些(对我来说)新鲜的玩意儿。第一是发现pip比easy_install好,对我来说好处有两点,一是有uninstall支持,二是源码安装而不是那个该死的egg包;第二是发现nose这个单元测试工具很不错,你只需要写测试代码,甚至不需要import unittest,也不需要写test loader。然后nose本身可以单独测试某些接口,不需要自己去修改单元测试的代码,把testXXX改成utestXXX,这对于测试代码的编写和管理都更容易了。

隔了很久之后重新写blog,絮絮叨叨的我也不知道在说啥。大家随便看看就算了。

使用BIND服务转换特定网址

2011年09月16日 18:16

UPDATE:

用dnsmasq,把需要自定义的IP放在/etc/hosts文件中即可。可以更简单的满足类似需求。


有的时候我们需要使用特定的IP访问特定的网站。现在比较流行的方法是修改hosts文件。但这方法需要对每一个客户端做修改,比较麻烦。为了方便起见,我在自己的服务器上尝试了配置DNS服务器来为特定网址提供特定IP的方法。

首先安装bind,在Ubuntu服务器上当然就是:

sudo apt-get install bind9

然后我们将服务器先配置成缓存模式,在 named.conf.options 文件中增加以下内容:

        forwarders {
            8.8.8.8;
            8.8.4.4;
        };
        allow-recursion { any; };

其中forwarders是将DNS请求转发,allow-recursion是设置客户端的访问权限,如果是内网使用,也可以设置网址段。

然后我们使用一个新的配置文件 named.conf.redirect 专门处理特定网址转发请求。在named.conf中增加一句:

include "/etc/bind/named.conf.redirect";

然后新建一个 named.conf.redirect 文件,将特定的网址变成master类型(由本机处理):

zone "plus.google.com" {

    type master;

    file "/etc/bind/redirect/zone_plus.google.com";

};

然后我们去 /etc/bind/redirect 目录下新建一个 zone_plus.google.com 文件,配置DNS规则,简单起见,我们可以这样配置:

$TTL    86400
@ IN    SOA     localhost. root.localhost. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                          86400 )       ; Negative Cache TTL
;

@ IN  NS  localhost.
@ IN   A    1.2.3.4
* IN   A    1.2.3.4

上面的部分可以作为模板,关键就是配置 @ 和 * 两个A地址解析而已。其中 * 可以作为泛域名配置,匹配全部的子域名。

that's all.

注:在named.conf.redirect里可以配置多个zone,他们使用的规则file可以相同也可以不同,可以视情况而定。

注2:如果DNS服务器在国外,这样做仍然无法解决DNS污染的问题。

注3:文中所用IP为演示用,并非真实IP。

推送到[go4pro.org]

[tip]去除mercurial的警告信息

2011年04月23日 00:09

升级到Ubuntu 11.04之后,每次做hg操作都会出现一个warning信息:

warning: fanfoudroid.googlecode.com certificate with fingerprint 34:4b:90:e7:e3:36:81:0d:52:1f:10:c0:4c:98:66:90:4a:9e:05:c9 not verified (check hostfingerprints or web.cacerts config setting)

不胜其烦。

今天终于忍不住去找了一下解决方法:

http://kiln.stackexchange.com/questions/2816/mercurial-certificate-warning-certificate-not-verified-web-cacerts

Debian/Ubuntu

On Debian and Ubuntu you can use this global configuration:

[web]
cacerts = /etc/ssl/certs/ca-certificates.crt

动手玩pypy(一)

2011年03月16日 10:59

这篇似乎没有什么技术含量,就不收录到go4pro了。

虽然写着(一),但是我自己也不知道能写到几,也许就这么一篇吧。

那天看到pypy进了python.org官网的Download下载区,成为了Alternative Implementations的一员,心头又痒了。于是打算把自己的python环境切换成pypy,用上一阵子,如果好用,以后就这么用了,如果实在不好用,那就换回来,也没什么了不起。

先在工作电脑的Windows系统上折腾。安装没什么好说的,下载解压配置路径,一切OK。

写了几行代码,也没什么不一样,只是把原来的python命令改成了pypy。

然后想起来自己有一个基于web.py的小页面,要不就把它跑起来吧。

pypy server.py  失败。说web.py没安装。好吧,去web.py的安装目录,pypy setup.py install,搞定。

再来,还是失败,说sqlite3.dll加载错误。原来pypy没有自带dll,去sqlite网站下载sqlite3.dll放到系统路径,搞定。

再来,还是失败,说Mako库没有安装。囧。好吧,去折腾mako库。mako推荐是使用easy_install安装的,但是pypy貌似没办法折腾出来,于是就下载了源码,用pypy setup.py install的方式安装。其中有一个库给出了warning,说无法编译带C扩展的部分,改用纯python的模式编译成功。并且给出了一个错误码。开始还以为是安装失败了,后来一看,似乎已经装上了。而且尝试运行了一下,也没有问题。

虽然第一个脚本迁移成功,不过感觉还是存在很多侥幸因素的。主要是第三方库的问题,如果第三方库用到了C-API,极有可能会安装失败。不知道会对未来的工作产生多大的影响,再用一段时间试试了。

使用txt2tags制作PDF文档

2011年03月08日 14:01

(本文收录于[go4pro.org]

一直很不喜欢使用Word做文档制作工具。除了平台相关性太严重之外,二进制文件也给版本管理带来了很多麻烦。于是这次在新的项目里,就尝试使用格式化文本制作工具。

选工具的时候,在asciidoctxt2tags之间犹豫了一下。最终选择了txt2tags。有几个理由:

  • asciidoc从功能上来说比txt2tags强大很多,但是强大的功能带来了写作时的不流畅感,你要在内容之外考虑太多的东西,非常不舒服。而且其实对于我写的大部分文档来说,txt2tags够用了。
  • txt2tags工具链配置简单,编译速度非常快。
  • txt2tags我之前用过,比较熟悉。

txt2tags的语法规则其实没几条,去网站上看一下,10分钟就可以学会了。所以这一点我就不罗嗦了。txt2tags可以直接产生网页,我之前的很多文档也是用它写的。这个也没什么好说。

但是公司文档用html一个是不方便,另外一个也显得太不正式。所以,我需要一个工具链,来把它转换成PDF。

txt2tags不支持直接到PDF的转换,但是它可以转换成很容易生成pdf文件的latex格式。所以我就非常自然的想走 txt2tags -> latex -> PDF 这条路了。

首先去下载了了一个CTEX安装包,避免在latex中文问题上做过多的纠缠。

然后将txt2tags文件转换成latex文件:

python "d:\Program Files\txt2tags-2.6\txt2tags" -t tex README_deploy.t2t

没错,Windows下就是这么麻烦,在Linux下简单很多:

txt2tags -t tex README_deploy.t2t

就行了。不过还好我们可以写脚本,这个下面再提。

这样会生成 README_deploy.tex 文件,但是这个文件默认是无法编译的,因为里面没有引用中文的相关包。所以我们需要对这个tex文件做一些预处理。我写了一个简单的python脚本来自动完成这件事:

#encoding:utf-8
import sys

# 在\usepackage{graphicx}的后面加上一行\usepackage{CJKutf8}
# 将\usepackage[urlcolor=blue,colorlinks=true]{hyperref}
#   替换成\usepackage[unicode,urlcolor=blue,colorlinks=true]{hyperref}
# 用于支持中文书签和目录
# 在\begin{document}的后面加上一行\begin{CJK}{UTF8}{song}
#   并加上\CJKcaption{zh-Hans}用于生成中文目录
# 在\end{document}的前面加上两行:\newpage(中文目录hack)和\end{CJK}

input_file, output_file = sys.argv[1:3]

content = open(input_file, "rt").read()
content = content.replace("\\usepackage{graphicx}", "\\usepackage{graphicx}\n\\usepackage{CJKutf8}")
content = content.replace("\\usepackage[urlcolor=blue,colorlinks=true]{hyperref}", "\\usepackage[unicode,urlcolor=blue,colorlinks=true]{hyperref}")
content = content.replace("\\begin{document}", "\\begin{document}\n\\begin{CJK}{UTF8}{song}\n\\CJKcaption{zh-Hans}")
content = content.replace("\\end{document}", "\\newpage\n\\end{CJK}\n\\end{document}")

open(output_file, "wt").write(content)

经过这样处理之后的tex,我们就可以使用pdflatex命令直接生成pdf了。

下面给出我用于这个文件的批处理脚本,有进一步的应用可以在这个基础上改进。

set PYTHON=d:\python27\python.exe
set TXT2TAGS="d:\Program Files\txt2tags-2.6\txt2tags"
set PDFLATEX="D:\CTEX\MiKTeX\miktex\bin\pdflatex.exe"

rem generate latex source file
%PYTHON% %TXT2TAGS% -t tex README_deploy.t2t

rem Patch tex file for Chinese support
%PYTHON% pdf_cjk_patch.py README_deploy.tex temp.tex
copy temp.tex README_deploy.tex
rm temp.tex

rem Generate PDF file
%PDFLATEX% README_deploy.tex

另外要注意的一点是,latex不支持“没有编号的章节”生成目录。所以在标识章节的时候,一定要记得用"+"而不是"="

[tips]在Ubuntu中快速制作漫画pdf

2011年03月01日 22:17

自从有了Kindle3之后恨不得把所有可看的东西都放上去。想起家里还有一套丁丁在美洲,于是也想弄到Kindle上去。

不过Kindle似乎看漫画并不像想象的那么方便,我用的是多看系统,如果把图片都扔到DK_Picture目录则无法使用分类统一管理,如果放到DK_Documents则只能把图片打成zip包,但是看的时候那个顺序非常诡异。

装懒人而不得,只能自己动手了。查了一点资料,发现最合适的方式应该是将图片按顺序做成PDF,不过大部分资料介绍的都是Windows的软件。终于找到一个Ubuntu下可用的方法,实际非常简单:

前提:1. 图片本身大小合适、对比度合适,不用做进一步处理。2. 图片严格按顺序命名

其实只要安装imagemagik这个软件包,然后使用其中的convert命令就能批量将图片转换为pdf:

convert *.jpg dingding_1.pdf

就这么简单。有了这个命令,写一个脚本对所有书做批处理也不难了。

BTW:实际上imagemagik也非常适合用于做图片的增强处理,因此即使不满足前提1,也可以用它做一些预处理的。只是我这次没有试。

拿Ubuntu当XServer显示远程机器的窗口

2011年02月23日 15:39

(本文收录于[go4pro.org]

原来以为比较简单,没想到遇到了一些麻烦。

言简意赅言简意赅。

其实本来按理说在Linux上做XServer显示远程窗口应该比Windows更简单才对。但是现在大多发行版因为安全原因,默认禁止了XServer的TCP监听功能,所以有了一些麻烦。

所以我们首先要去掉这个禁止项:

对于Ubuntu这种配置了gdm的系统来说,在 /etc/gdm/custom.conf中增加两行:

[security]
DisallowTCP=false

然后重启就行了。重启之后X就有了TCP监听的能力。

接下来的事情就简单了,是XServer的基本操作:(假设远程电脑(XClient)IP为192.168.0.100,本地端(XServer)为192.168.0.2)

首先在本地机(XServer端)增加客户端IP认证:

xhost + 192.168.0.100

允许客户端的X通讯

然后在客户端指定XServer:

export DISPLAY=192.168.0.2:0

然后在客户端执行X程序,界面就会显示到本地了。

可以执行一个 xclock 看一下效果。

就这样。

言简意赅,嗯。

Design downloaded from free website templates.