Building the Coming Soon

关于

Kaijia graduated from the Akademia. He is always proud to be a HFLSer!

Linux

合并Gettext PO文件

12/11/2016

对于有强迫症的人通常会对翻译错误无法忍耐,尤其是,老外翻译的中文。碰到这种情况时,Kaijia经常会联系软件商更正翻译错误。一般情况下个人开发者都会非常友好得接受Kaijia的翻译建议,然而总有几家中型软件商,通常没有大中华区市场,会拒绝Kaijia的建议,理由基本上是:我们外包的翻译虽然母语不是中文,但他们可是专业翻译。这种情况下,虽然无力吐槽但毕竟是开源软件,Kaijia会选择维护一个自有的译本更新部分错到离谱的翻译,然后重新编译软件。对于只需要修改几处的情况非常合适,每次软件发布更新,只需要重新替换几处译文便可重新编译,但对于大型软件涉及几十或者上百处更正的情况,每次更新时简单的人工替换显然不合适。通常情况下需要将Kaijia现有维护的译文与新版本自带的译文合并。此处合并需要满足两个需求:

  • 新版本自带翻译中新增字段需要进入源翻译文件(PO文件);
  • Kaijia自己修改的翻译需要被保留。

在Gettext环境下,可以通过msgcatmsgmerge(互有区别)两个命令实现这个操作。这两个命令均为Gettext自带的工具,Linux发行版中安装Gettext时会默认安装。语法分别为: 阅读更多

SmartGit“Unsupported system classloader”启动错误解决

12/02/2016

好久一段时间不用SmartGit,上一次使用应该还是在Ubuntu 14.04上(之后IntelliJ IDEA和命令行几乎包揽了日常Git工作),这次Kaijia重新在Ubuntu 16.04系统上安装SmartGit时却遇到了无法启动的窘境。按照往常安装顺序将安装包解压运行之后,Unity启动栏上出现了SmartGit的图标,但之后立即消失了,并且没有弹出载入界面。

Kaijia在命令行中运行了bin/smartgit.sh文件,获得了以下提示:

Unsupported system classloader jdk.internal.loader.ClassLoaders$AppClassLoader@16c0663d

不支持的系统类载入器 jdk.internal.loader.ClassLoaders$AppClassLoader@16c0663d

阅读更多

Linux命令行删除连字符“-”开头文件

11/30/2016

一般情况下如果对一个命令不熟悉,使用“–help”显示帮助信息在命令行程序中是约定俗成的传统。然而当传统碰到没有提供帮助信息的程序时就会出现尴尬。最麻烦的情况是,如果一个命令行程序设定的第一个参数是程序结果输出的文件时(虽然这样违背了管道原则),使用“–help”的结果就是生成了一个以连字符“-”开头的–help文件。

此时通常第一反映是删除这个文件

时却会发现此命令实际上显示了rm命令的帮助。同理以下命令均不能删除–help文件,它们在运行时都会被Shell转换成“rm –help”。

阅读更多

Ubuntu 16.04启用Laptop Mode Tools鼠标开机断电问题解决

03/15/2016

Laptop Mode Tools是笔记本运行Linux时的常用标配工具,在汉语Linux社区常被称为“省电模式”,其原理就是通过给硬盘和CPU降速、自动休眠部分USB等各种方式千方百计降低笔记本运行Linux的功耗。

此工具由于其大幅提升Linux笔记本的续航时间而大受欢迎,然而它也经常有误伤,比如Kaijia的USB鼠标则是每次中枪。鼠标在启动进入GRUB界面时一切正常,之后当Laptop Mode Tools启动(enabled)后,无论是否接入电源/即省电模式是否激活([not] active),鼠标都会自动断电休眠,每次都需要重新拔插后才可正常使用。

这个问题由来已久,中文社区也有大量的帖子和博文给出了解决方案。其中的核心思想是鼠标自动休眠是由Laptop Mode Tools工具的usb-autosuspend模块控制的,因此解决方案分两种:

  1. 编辑/etc/laptop-mode/conf.d/usb-autosuspend.conf将鼠标写入禁止自动休眠的黑名单,例如此篇文章
  2. 直接禁用usb-autosuspend模块,例如此篇帖子

阅读更多

设置Postfix使用TLS加密全部数据传输

02/19/2016

电子邮件在邮件服务器间是明文传输的这个事实和其他教科书式信息安全案例一样,即便是在斯诺登曝光了棱镜计划之后,仍然让许多网络管理员麻木。其中的原因有很多,通常情况下,除非运行组织内部的邮件组,服务器发送的邮件基本上都是通常不含隐私信息的通知邮件,其次便是常用的邮件服务器软件默认配置并没有开启加密。然而,最近Gmail出了个星辰大海的损招倒逼所有管理员开启加密——在所有收到的未加密邮件上增加了一个“未对此邮件进行加密”提示。

阅读更多

非调试模式下查看MySQL过程代码

10/20/2015

添加MySQL过程时间长了,难免会有需要查看过程代码的情况。比如Kaijia有一个过程自动清理数据库中大于指定时间的分区,这次Kaijia把这个指定的时间忘了,于是想通过查看过程的代码找回这个设定的时间。

根据MySQL文档,可以使用“SHOW PROCEDURE CODE”语法查看过程和自定义函数的代码,但Kaijia在执行此语法时却遇到了以下错误:

mysql> SHOW PROCEDURE CODE Kaijia的过程;
ERROR 1289 (HY000): The ‘SHOW PROCEDURE|FUNCTION CODE’ feature is disabled; you need MySQL built with ‘–with-debug’ to have it working

阅读此语法的文档Kaijia找到了相关提示:此扩展仅在编译时开启了调试模式的服务器中可用(This statement is a MySQL extension that is available only for servers that have been built with debugging support.)。而考虑到除了MySQL开发外,一般情况下使用的由软件包管理器(YUMAPT-GET)提供的MySQL预编译版均没有开启编译模式,这条命令对广大开发者和系统管理员来说基本上是没法用的……

阅读更多

重新生成SSH服务器端密钥方法

09/20/2015

理论上来说,每次安装服务器时SSH密钥(SSH Host Key)都是自动生成的,而生成出相同密钥的概率接近于0,这样避免了中间攻击等情况。但是,就是存在以下情况使得两台SSH密钥相同:

  • 在虚拟化技术中克隆了一台虚拟机;
  • 将原来的虚拟硬盘复制后新建虚拟机运行。

当然还有其他更加坑爹的情况,比如Kaijia碰到的VPS云服务器重装系统复制完模板数据后不重新生成SSH密钥的(某国内主流云提供商……),于是整个云平台所有的VPS都跑着相同的SSH密钥,如果要实现中间攻击只需要新建一台云就能获得私钥了。正是因为碰到了这种云主机,Kaijia研究了一下如何重新生成SSH服务器端密钥。

阅读更多

无法初始化前端界面Dialog工具问题解决

09/18/2015

其实这个问题Kaijia还碰到很久了,而且搜了一下网上并没有相关的中文资料,所以还是记录一下,希望可以帮之后遇到相同问题的朋友节省时间。

Kaijia之前在一些安装有精简版Ubuntu 14.04模板(例如ubuntu-14.04-x86_64-minimal)的OpenVZ VPS上使用apt-get安装软件时经常碰到以下提示:

debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)
debconf: falling back to frontend: Readline

或者在中文Locale下面:

debconf: 无法初始化前端界面:Dialog
debconf: (没有安装任何可用的对话框类程序,所以无法使用基于此种形式的界面。 at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)
debconf: 返回前端界面:Readline

由于这个错误提示并不会影响安装,于是Kaijia一开始也没有在意。

阅读更多

SSH Channel“open failed: connect failed: Connection timed out”问题解决

09/07/2015

在Hyper-V的虚拟机里面运行Linux网络性能果真要比KVM差一些,当然此间原因很多:驱动、NAT转换效率等等。这次Kaijia遇到的大量“open failed: connect failed: Connection timed out”问题,最后看来也是连接性能原因。

Kaijia用SSH转Socket连接到不同地区的IP,然后进行检测和数据采集,同时所有连接同时有流量传输,一开始一切正常,但是Socket运行时间久后就会慢慢出现“open failed: connect failed: Connection timed out”错误提示。于是Kaijia开启调试模式分析了一下错误信息,看到了很多类似以下的信息:

debugx: channel x: open confirm rwindow ?? rmax ??
channel x: open failed: connect failed: Connection timed out
debugx: channel x: free: direct-tcpip: listening port xxxxx for xxx.xxx.xxx.xxx port 80, connect from 172.16.1.xxx port xxxxx to 172.16.1.xxx port xxxxx, nchannels x
debugx: channel x: zombie
debugx: channel x: garbage collecting
debugx: channel x: read failed
debugx: channel x: close_read
debugx: channel x: input open -> drain
debugx: channel x: ibuf empty
debugx: channel x: send eof
debugx: channel x: input drain -> closed

结合错误提示,网上搜了一些,很好理解即连接在允许的时间内没有收到任何信息,于是发送了EOF结束,返回了连接超时错误,因此可以说是连接的性能问题。根本上解决问题是比较困难的,涉及到很多方面因素,比较现实的解决方法便是延长等待时间,避免连接超时(Timeout)以增加收到数据包的概率。

阅读更多

MySQL命令行操作限定单个数据库方法

09/06/2015

写这篇文章的原因出自Kaijia一次被Stack Overflow坑的经历,回头看来虽然Stack Exchange的Peer Review机制很好,但是错误照样还是很多的,以及Kaijia提交了Edit被Peer Review拒绝了……

之前某个插件神不知鬼不觉地删除了所有WordPress数据表的主键和自增,导致系统出现异常,如果手动恢复的话要处理近30余张主键规则不同的表非常麻烦,于是Kaijia决定采用数据恢复的方式,即先将现有数据导出并删除表,再导入数据库备份重建表结构,再将现有数据导入。这样一来数据是现有的数据,表结构是损坏前的正确结构完成修复。

按照这个步骤下去,第二步是导入备份,但是Kaijia的数据库备份是全数据库整盘备份,单个SQL文件里面包含了所有数据库的数据,而本次恢复涉及单个数据库,不能影响其他数据库。之前没有类似经验无从下手,于是Kaijia搜索了下找到了此篇Stack Overflow问题《Can I restore a single table from a full mysql mysqldump file?》,高票回答是使用sed命令(完全正确),但是显然没有后面的正面回答(后来证实是坑)方便。后面回答的要旨非常简单:

mysql命令最后加上指定的数据库名便可以了!这不科学!但鉴于此答案有还有人点赞,还有人评论“This is what most people need.”于是Kaijia就尝试了……结果果真其他的数据库都被还原了,当然幸亏操作前Kaijia给服务器快照了一下,直接恢复了。

阅读更多

较旧文章