优化 ibus-table 性能

ibus-table 是 Python 语言实现的 ibus 输入法框架的码表引擎,ibus 的绝大多数形码输入法使用该引擎,如郑码、五笔等等。

使用过该引擎的用户或多或少有这样的感觉,就是反应慢,尤其在低性能的计算机上感觉格外明显。无需复杂的性能分析工具,仅用 top 命令就不难发现,用一个约有20万条记录的郑码码表,在连续输入中文时,ibus-table 进程的CPU使用率几乎100%,这还是在一个 i3 2.5GHz 的 PC 平台上。那么在一个更低性能的平台上,输入体验可以想象。

再通过 pref 工具跟踪可以发现,在连续输入时,大部分CPU使用主要来自于 sqlite 数据库查询操作和候选词排序。在阅读引擎代码后,我做了一个实验,在 tabsqlitedb.py 的 select_words 中删除掉 sqlite 查询与排序,返回静态记录。结果CPU使用率降低到了只有5%左右。

因此,给 select_words 加个缓存应该是个不错的选择,就用 HashMap 来实现这个缓存,按键输入作为 key,排序后的结果作为 value。结果很明显,连接输入中文时的进程CPU使用率从几乎100%下降到了10%。

已经合并至 1.9.18: https://github.com/kaio/ibus-table/releases/tag/1.9.18

Over!

HevSCGIHandlerCGI 的多用户配置

HevSCGIHandlerCGI 是 HevSCGIServer 的 CGI 接口 Bridge,目前它被用于我的博客,实现 Web Server 与 PHP 的连接。现在它己支持多用户,根据 Web Server 的不同用户请求使用不同的用户权限执行 CGI 程序。

HevSCGIHandlerCGI 的用户与组配置默认会从两个地方读取:首先是解析 Web Server 的“环境变量”;其次就是模块的配置文件。取得即被应用,不会覆盖。在我的博客应用中没有在模块配置文件中配置用户与组,而是从 Web Server 的变量中取得,下面是 Nginx 的配置示例:

server {
    ...
 
    location ~ \.php$ {
        ...
        scgi_param  _USER heiher;
        scgi_param  _GROUP heiher;
        ...
    }
 
    ...
}

Over!

简单的 HTTP 文件共享服务 – FileBox

FileBox 是一个基于 HTTP 的简单文件共享服务,支持匿名的文件上传与下载、文件有效期限管理等。它实现为 HevSCGIServer 的一个 Handler,通过 SCGI 协议与 Web Server 交互。

filebox

安装部署
1. Web Server (Nginx)
Nginx 自身的安装部署就不多说了,主要说一下与 HevSCGIServerFilebox 相关的配置文件部分:

server {
    ...
 
    location /scgi {
        client_max_body_size 1024m; # 限制每组最大上传大小
        scgi_pass   127.0.0.1:9000; # HevSCGIServer 侦听地址端口
        #scgi_pass   unix:/opt/extra/hev-scgi-server/run/conn.sock; # 安全配置建议使用 Unix Socket
        include     scgi_params;
    }
 
    ...
}

2. HevSCGIServer Core
a. 创建目录结构

mkdir -p /opt/extra/hev-scgi-server/{bin,conf,lib/modules,run}
mkdir -p /var/lib/hev-scgi-server/filebox/{pool,meta,temp}

b. 下载、安装 hev-scgi-server-library

git clone git://gitcafe.com/heiher/hev-scgi-server-library.git
cd hev-scgi-server-library
make
cp bin/libhev-scgi-server.so /opt/extra/hev-scgi-server/lib/

c. 下载、安装 hev-scgi-server

git clone git://gitcafe.com/heiher/hev-scgi-server.git
cd hev-scgi-server
make
cp bin/hev-scgi-server /opt/extra/hev-scgi-server/bin/

3. FileBox

git clone git://gitcafe.com/heiher/hev-scgi-handler-filebox.git
cd hev-scgi-handler-filebox
make
cp bin/libhev-scgi-handler-filebox.so /opt/extra/hev-scgi-server/lib/modules/
cp -r ui/* /srv/http/ # 复制到 Web 根目录

4. 配置文件
/opt/extra/hev-scgi-server/conf/main.conf

[Server]
Address=127.0.0.1:9000
ModuleDirPath=/opt/extra/hev-scgi-server/lib/modules

/opt/extra/hev-scgi-server/conf/modules.conf

[Module0]
Alias=HevSCGIHandlerFilebox
Pattern=^/scgi/fb((/|\\?)(.*))?$
FileName=libhev-scgi-handler-filebox.so
 
BaseURI=/scgi/fb/
CleanInterval=600
FilePoolPath=/var/lib/hev-scgi-server/filebox/pool
FileMetaPath=/var/lib/hev-scgi-server/filebox/meta
FileTempPath=/var/lib/hev-scgi-server/filebox/temp

Tips: 命令行上传

curl -i -F filedata=@文件名称 -F one-off=true http://127.0.0.1/scgi/fb/upload # one-off=true 即“下后即删”

Over!

Vim 居中光标所在行与大小写切换

经常忘记了,记录一下 😉

居中光标所在行
曾经用Emacs的时候发现那个Ctrl-L特别好用,看到光标在下面了按一下就把那行提到屏幕中间来了,于是想在vim中找类似的功能,想想也该有嘛,所以就找到了,而且有三条~

zz: 将当前行置于屏幕中间(不是转载…)
zt: 将当前行置于屏幕顶端(不是猪头~)
zb:底端啦~

还有一条就是移动光标所在行的位置,就是说,比如我光标在第10行,我想光标不动,但是所在行向上移,ctrl-e啦,然后向下的话,ctrl-y~

大小写切换
在vim中,通过v选中的文字可以用u切换到小写,U切换到大写,~在大小写之间切换,但是如果需要对选定的词做大小写操作,就需要用到%s中的\u,\U,\l和\L,\u是把后续的字符串第一个字符转成大写而\U是把后续的都转成大写(upper case),\l和\L是转成小写(lower case)

例如如果要把所有行首的单词首字母大写后面的所有字母都小写,可以这么折腾:

:%s/^\(\w\)\(.*\)/\u\1\L\2/g

需要注意的一点是,如果\L和\U后面跟有别的字符串,也会被弄成大写,如对字符串abcdefg运行 %s/abcd/\Uefgh/g 的结果就是 EFGHefg,这一点在使用反向引用\1, \2等的时候比较麻烦,例如我\1取到的是一个单词,我需要把它们都大写化了,然后后面的\2也会被变成大写。刚好下午试的是给变量改名字,在需要变大写的单词后面有一条下划线,于是就这么用了:

:%s/_\([a-z]\)_\(.*\)/_\U\1\l_\2/g

\l 对下划线没影响,刚好用来抵消 \U 的作用,满好,至于别的情况,暂时没想法……

Over!

From: http://www.hzmangel.info/blog/archives/490 http://www.hzmangel.info/blog/archives/491

Raspberry Pi 平台最合适的 GStreamer VideoSink

受到 Wayland 的影响,想当然的认为 waylandsink 应该是不错的 Videosink,事实并非如此呀,或许我真是个笨蛋,使用仅支持 BGRA 的 waylandsink 输出 I420 格式视频,CS 转换是 Rpi 所承受不了的。

更好的选择应该是 eglglessink,目前官方的源代码中就已经包含了对 Rpi 窗口系统的支持,编译启用后测试下地效果是很好的。看上去它是使用 Overlay 实现,默认使用当前的 dispmanx display,在 Wayland 桌面上运行看不到任何输出,要到 FrameBuffer 上运行可见到全屏的视频图像输出。不知道它是否支持设置 Window handle,晚上再写个程序测试一下吧。

Over!

Running GStreamer on Raspberry Pi

在 Raspberry Pi 上已经有很多的多媒体应用程序可以使用了,如 omxplayer, xbmc 等,但我想用 GStreamer 1.0 和 Wayland。

IMAG0061

在 Arch Linux ARM 的源中 GStreamer 1.0 的相关包 gstreamer, gst-plugins-base, gst-plugins-good, gst-plugins-bad, gst-plugins-ugly 等都可以用了,但他们还依赖于 X11,虽然我是想只使用 Wayland 啦,所以就重新编译去掉这些我不需要的依赖吧。

目前先把 GStreamer 1.0 和 Pulseaudio 及 Wayland 整合起来,并能正常运行,下一步就是 GstOMX 啦,初步看了一下 Raspberry Pi 的 OpenMax 实现中包含了 Audio 和 Video Sinks,不知道我使用 GStreamer 的 pulsesink 和 waylandsink 的效果会怎么样?先试试吧。

步骤
1. pango
2. pulseaudio
3. gst-plugins-base
4. gst-plugins-good
5. gst-plugins-bad
6. gst-plugins-ugly

1. pango
pango 除去了对 X11 的依赖。
源码包:pango-1.34.0-1.src.tar.gz

2. pulseaudio
pulseaudio 除去了对 X11 的依赖。
源码包:pulseaudio-3.0-3.src.tar.gz

3. gst-plugins-base
gst-plugins-base 除去了对 X11 的依赖。
源码包:gst-plugins-base-1.0.6-2.src.tar.gz

4. gst-plugins-good
gst-plugins-good 除去了对 X11 的依赖。
源码包:gst-plugins-good-1.0.6-2.src.tar.gz

5. gst-plugins-bad
gst-plugins-bad 除去了对 X11 的依赖,编入了 eglglessink (for rpi)
源码包:gst-plugins-bad-1.0.6-3.src.tar.gz

6. gst-plugins-ugly
gst-plugins-ugly 可直接从官方源安装。

例子
1. 音频回放测试

gst-launch-1.0 audiotestsrc ! pulsesink

2. 视频回放测试

gst-launch-1.0 videotestsrc ! waylandsink

Over!

Running Wayland (Weston) on Raspberry Pi

在 Raspberry Pi 上编译与运行 Wayland (Weston Compositor),此为不依赖于 X11 的版本,所有与 X11 相关的依赖我都移除了,我只想跑个 Wayland Compositor,再跑个 GStreamer 1.0 就足够啦。

IMAG0060

环境
1. Raspberry Pi B
2. ArchLinux ARM (Base system & Compile toolchains (clang 3.2))

步骤
1. raspberrypi-firmware-pkgconfig
2. cairo (with glesv2 & openvg)
3. wayland
4. xkeyboard-config
5. weston

1. raspberrypi-firmware-pkgconfig
raspberrypi-firmware-pkgconfig 是 raspberrypi-firmware-tools 包的扩展,包含了 raspberrypi-firmware-tools 中库的 pkg-config 配置文件,后面的 cairo 与 weston 等程序编译将会依赖。
源码包:raspberrypi-firmware-pkgconfig-0.1-1.src.tar.gz

2. cairo (with glesv2 & openvg)
cairo (with glesv2) 为 weston compositor 的依赖,用于 2D 图形的渲染,需要关闭 GL 并打开 OpenGL ES v2 与 OpenVG 的支持。
源码包:cairo-1.12.14-4.src.tar.gz

3. wayland
Wayland 协议库,升级了基础协议。
源码包:wayland-1.0.90-1.src.tar.gz

4. xkeyboard-config
xkeyboard-config 提供了 xkb 的一切配置文件,weston 将会依赖,去除了对 libx11 的依赖等。
源码包:xkeyboard-config-2.8-1.src.tar.gz

5. weston
weston compositor 关闭了 x11, drm, fbdev, wayland 等 backend 支持,启用 raspberry pi 的 backend,并设置为默认。
源码包:weston-1.0.90-3.src.tar.gz

Over!

How to set GObject and subclass types property in gst-launch cmdline

Example 0

gst-launch-0.10 playbin2 uri=file:///home/heiher/movies/a.rmvb \
video-sink="fakesink"

Example 1

gst-launch-0.10 playbin2 uri=file:///home/heiher/movies/a.rmvb \
video-sink="ffmpegcolorspace ! xvimagesink"

Over!