6
2
2013
9

转换文本照片为 DjVu 格式

前几天听群里的网友聊起 DjVu 文档格式对扫描文本的压缩率很不错,又忆起自己手头有本书的照片版,不光近百兆占地方,而且一堆 JPEG 图片也不方便阅读,于是想着把它转成 DjVu 格式试试。

Google 了一下,发现有 DjVuLibre 这么套工具。用法没能指望上 Google,还是老老实实地看 man 文档的。

首先,把一张张的 JPEG 图片转成一个个单页的 DjVu 文档。命令名字很奇怪,叫c44(我还一不小心打成了c99囧)。转换比较费 CPU,所以用parallel来利用多核:

parallel c44 ::: *.JPG

然后当前目录下就出现了一堆与 JPEG 图片同名的.djvu文件。

接下来,把这些文档合并起来。命令叫djvmm想来指的是多页(multi-page)。

djvm -c doc.djvu *.djvu

这样就好啦。页面顺序是按照在命令行上给出的顺序。这里是按文件名排序的。看了看生成的doc.djvu,只有 15M 耶。我对比了下 DjVu 文档和原图片的质量,在放大的时候还是能看到差了一些的,不过文本清晰得足够阅读就好啦。

Category: Linux | Tags: DjVu
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
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
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 腾讯
12
8
2012
7

iptables 访问控制规则两则

防 ssh 暴力破解

一直以来,面对 Vim 显示的 auth.log 里满屏的红色 ssh 登录失败记录,要么容忍,要么换端口号,要么是 fail2ban。换端口号显然会造成很多不便,尤其是使用者比较多的时候。fail2ban 以前也用得挺好的,但是需要手工编辑配置文件,阅读其中长长的注释并且小心翼翼地修改参数。配置好之后还会经常收到 fail2ban 发出的邮件。这些都可以忍受。直到有一天,某位使用者不小心登录失败多次以后,那个 IP 被封掉了。我从 /etc/hosts.deny 中删除了对应的项目,但是没有用,因为 fail2ban 会去检查 auth.log,然后把那个 IP 给加回去……

前两天本来是寻找限速的命令的,却无意之中看到了防 ssh 暴力破解的命令,如下:

iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

第一句是说,对于外来数据,如果是 TCP 协议,目标端口号是 22,网络接口是 eth0,状态是新连接,那么把它加到最近列表中。第二句是说,对于这样的连接,如果在最近列表中,并且在 60 秒内达到或者超过四次,那么丢弃该数据。其中的-m是模块的意思。

也就是说,如果有人从一个 IP 一分钟内连接尝试四次 ssh 登录的话,那么它就会被加入黑名单,后续连接将会被丢弃。这是对付 ssh 暴力破解的绝佳规则了。不用修改 openssh,也不用另启一个容易招麻烦的服务。不过不知道多久以后那个 IP 才能重新连接上。

我实际使用时正有一北京 IP 在尝试 ssh 登录。命令执行后,auth.log 里的红色失败消息又出现了四次,然后就没有了。后来再查看时,虽然还是能看到不少红色,但是没有以前那么密集了。更重要的是,每四条登录失败消息间的时间间隔比较大了。可谓效果显著啊。

网络限速

这是我这次搜索 iptables 相关信息的本意。起因是这样子的,在本地测试的时候,经常会发现本地连接的速度实在是太快了。对于网站,不能反映其真实的使用体验;对于网络程序,无法测试其在网络不良时的表现,由于测试的规模小,一些真实使用时容易出现的竞态也由于操作完成得太快而无法重现。

很早就知道 iptables 能够对转发流量进行限速。既然是 iptables 而不是某些商业软件,它就没理由只能对外部流量而不对本地接口 lo 进行限速。于是最后弄到如下命令:

iptables -A INPUT -s 127.0.0.1 -p tcp -d 127.0.0.1 --dport 6900:6901 -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -p tcp -d 127.0.0.1 --dport 6900:6901 -j DROP

这两条规则组合起来是说,对于所有从 127.0.0.1 到同样的地址的 6900 到 6901 端口的 TCP 连接,每秒只接受一个数据包,多余的丢弃。后边那句是必要的,如果不写的话就没作用了,因为默认策略是接受。

要注意的是,如果使用域名localhost的话,很可能会使用 IPv6 地址::1而不是127.0.0.1了。

参考链接

Category: Linux | Tags: linux 网络 iptables
12
2
2012
5

rrdtool 初体验

rrdtool 是「Round Robin Database tool」的缩写,是一个存放固定数量的数值型数据库,适合随时间变化的量的统计。比如网络传输速度、CPU 使用率、聊天室在线人数等。与大部分数据库软件不一样的是,它可以直接可视化数据,生成 PNG 图像。第一次使用,找点容易快速获取又有意义的数据源——ping 延迟好了。

第一步,确定数据库怎么存放什么数据。我打算发一千个 ping 包,然后存储其延迟。rrdtool 本来是按时间存储的,我用序号来骗骗它好了。起始时间为现在时间。数据的时间间隔为 1 秒,但实际上是一个序号。聚集函数为平均值,存储 1000 个数据。命令如下(百分号提示符表示 shell 是 zsh,下同):

% start=$(date +'%s')
% rrdtool create ping.rrd --start=$start -s1 DS:ping:GAUGE:1:0:U RRA:AVERAGE:0.5:1:1000

其中,DS是「数据源(data source)」的意思,RRA 是「round robin archives」。-s1表示间隔为 1s。时间点是以距 epoche 的秒数表示的。

DS 部分,ping 是数据的名字,GAUGE表示这就是一个值,不是累加(COUNTER,如已传输字节数)或者其它的。1是 heartbeat,超时这个时间还没收到数据的话就当作UNKNOWN值了。再后边是最小值和最大值,超出的话也会被当成UNKNOWN。那里的U表示「UNKNOWN」。

RRA 部分,AVERAGE是求平均值的聚集函数。类似的还有MAX之类的。用于决定一个区间内的多个值如何归并为一个值。0.5部分没看太懂。1即每秒取一个值,1000则是存储 1000 个这样的值。

取得数据:

% ping -c 1000 google.com > ping.log

把数据处理后喂给 rrdtool 的数据库,每次喂最多 1000 条数据:

% grep -oP '\d+\sttl\S+ \S+' ping.log | sed 's/ttl.*=//g' | awk -vstart=$start '{print $1+start ":" $2}' | xargs -n 1000 rrdtool update ping.rrd 

生成每 1、5、15 秒的统计图像:

% for i in 1 5 15; do rrdtool graph ping_$i.png --start=$start --end=$(( $start + 1000 )) -S $i --vertical-label=ms --width=800 --height=300 DEF:v=ping.rrd:ping:AVERAGE 'AREA:v#00dd00'; done

其中,-S是指定绘图的步长。其它参数很好理解。后两部分解释如下:

DEF设置变量v为 ping.rrd 数据库中的 ping 变量。还有可选的CDEF,比如可以写CDEF:s=v,1000,/,即令变量s等于v / 1000。这里是逆波兰表达式。'AREA:v#00dd00'表示绘制矩形图,纵轴变量为v,颜色为 #00dd00。画线的话可以用'LINE1:v#00dd00'这样子,LINE后边的数字是线的宽度。

好啦,图像如下:

Category: Linux | Tags: rrdtool 数据统计
10
25
2012
24

使用 TLS/SSL 加密你的 HTTP 代理

HTTP 代理是明文的,这导致实际访问的 URL 可以被他人监测到。即使使用 HTTPS 协议,经过 HTTP 代理时会发送CONNECT请求,告诉代理要连续到远程主机的指定端口。于是,访问的目标域名暴露了。

有没有办法将传输内容加密呢?比如像 HTTPS 那样,使用 TLS 协议连接到代理服务器,然后再进行 HTTP 请求。很遗憾的是,我在 ziproxy 的配置里没有发现这样的选项。在 shlug 邮件列表里询问后,Shell Xu 提到了 stunnel 这个工具。以前我试过用它把 HTTP 的网站转成 HTTPS 的,但是网站后端程序无法知晓用户实际上使用的是 HTTPS,有些郁闷,就没管它了。

这次再次请出 stunnel,在代理服务器上执行如下命令:

sudo stunnel -d 0.0.0.0:8081 -r localhost:8080 -p /etc/stunnel/stunnel.pem

这样,所有到服务器的 8081 端口的请求,都会经过 TLS 解密后传递给 8080 端口。同时响应的数据也会被加密后再返回请求方。

接下来的问题是,浏览器无法直接使用这种代理。实际上除了拿 openssl 命令手动连接外,我不知道任何程序能够使用这种代理。那好,本地弄个反过来加密/解密的服务好了。还是使用 stunnel。不过出了点意外:Arch Linux 的 stunnel 是第四版,不再用命令行参数,转而使用配置文件了。于是参考这篇 Upgrading to stunnel 4,写了份 stunnel4 的配置文件:

compression = zlib
foreground = yes
output = /dev/stdout
client = yes
pid = /tmp/stunnel.pid
# or will output to syslog :-(
output = /tmp/stunnel.log

[name]
accept = 8082
connect = server.com:8081

这样在本地 8082 端口监听,把所有请求加密后转发到 server.com 的 8081 端口。同时响应的数据会被解密后再返回。

现在,所有与代理服务器传输的数据都被加密了,不怕被偷窥啦。

后记:

后来,我发现其实代理服务器和我本机都装了两个版本的 stunnel,只是名字中不带版本号的一个是第三版而另一个是第四版而已……

再后来,我猛然想起神器 socat——这家伙是支持 OpenSSL 的!比如客户端这边像下边这样子就可以了:

$ socat tcp-listen:8082,fork openssl:server.com:8081,verify=0

socat 真是神器啊,cat、netcat、rinetd、stunnel 的功能都覆盖了!

这样使用的时候,每次来新请求时,socat 会 fork 一个新进程来处理。有点浪费资源。不过略微查看了下,stunnel 似乎也一样。

10
7
2012
11

Fcitx Lua 插件:国际音标输入

GTK 右键的输入法菜单中有一项「IPA」,用于输入国际音标的。不过为了输入几个国际音标去够鼠标点菜单太麻烦了。既然是输入,交给我最爱的 fcitx 输入法去处理就好了嘛。

GTK 的国际音标输入很简单,每一两个字符对应一个音标字符。不过,因为通常是连续输入好几个国际音标,因此简单地使用 fcitx 的「快速输入」模块的话,每输入一个得打一次前缀,太痛苦了。于是我用 fcitx 的 Lua 模块来做。

要注意的是,fcitx 的 Lua 支持默认没有开启,编译时需要在 cmake 参数中加上-DENABLE_LUA=On。Arch 用户可以从 archlinuxcn 源安装 fcitx-lilydjwg-git。其它发行版可能有单独的fcitx-lua包,也可能需要自行编译。

安装方法很简单,把ipa.lua放到~/.config/fcitx/lua目录下即可。然后按Ctrl-5(默认)重新加载 fcitx 配置即可。

使用方法是,使用预定义的快速输入快捷键(默认是;)进入「快速输入」模式后,输入命令前缀yb,然后按 GTK 那个 IPA 输入法的方式输入即可,按空格提交输入。不知道对应关系的可查看脚本源码。

[ˌðæts ˈɔːl ˈθænks].

Category: Linux | Tags: fcitx Lua 中文支持

Mastodon | Theme: Aeros 2.0 by TheBuckmaker.com