Browsed by
Category: 计算机技术

kubuntu12.04下的中文输入问题

kubuntu12.04下的中文输入问题

升级到Kubuntu12.04(英文版本)后,感觉很好,系统各方面都很让人满意。 不过有个意外的情况,所有的纯qt程序,例如kconsole, kate等, 按Ctrl+Space无法调出fcitx中文输入法。

在kate中,Ctrl+Space快捷方式被占用了,因此需要修改掉冲突。在kate主界面, 点击菜单“settings / configure shortcuts”, search “ctrl+space”, 然后将其修改为其他值。

完成上述修改后,还是无法在kate中调出fcitx. 需要配置qtconfig。缺省情况下,居然没有安装该软件。

sudo apt-get install qt4-qtconfig

安装后, 运行qtconfig, 在interface中,设置”default input method”为fcitx。

然后重启kate/konsole等qt程序即可。

让人比较奇怪的是, 以前的kubuntu版本中没有遇到这个问题,不知道为什么在12.04中需要做这样的配置。

一款轻量级的php编辑工具gPHPEdit

一款轻量级的php编辑工具gPHPEdit

在Ubuntu环境中,一般可以采用gEdit来编辑php文件。不过gEdit有个很大的不足:无法显示php函数、类列表,毕竟gEdit只是定位在简单的文本编辑功能上。

我们也可以使用Eclipse+PDT模块,不过Eclipse实在是太重型了,不太讨人喜欢。

后来发现Ubuntu软件中心有一款非常轻型的php编辑工具:gPHPEdit。它的界面、配置、操作都与gEdit非常像,重要的是它支持对PHP文件中的函数和类进行列表,大大方便了开发工作。

安装命令如下:

sudo apt-get install gphpedit php5-cli

gPHPEdit使用php5-cli进行PHP语法检查。如果不想要语法检查功能,可以不安装php5-cli。

更改访问网上邻居的默认用户名

更改访问网上邻居的默认用户名

当前电脑(XP)的登录用户名是wang,而另一台电脑设置(Ubuntu)的共享目录只允许yxh用户登陆。从当前电脑登陆该电脑时,会被直接拒绝。需要修改为以yxh名义登陆。(当然,也可以注销当前用户,换成yxh登陆当前电脑,不过这样就要中断当前正在进行的工作。)

采用net命令进行设置即可,例如目标电脑名是linuxubuntu:

net use \\linuxubuntu /user:yxh

输入yxh的密码后,就可以在当前电脑直接登陆linuxubuntu这台电脑了。

RapidSVN: Working copy locked

RapidSVN: Working copy locked

昨天Commit代码时,网络意外中断。今天再次Commit时,RapidSVN提示出错:

Error: Error while performing action: Working copy ‘… …’ locked.

看这描述的意思,是本地文件在上次操作时进行了锁定,由于没有正常退出解锁,导致后续操作无法再继续。

要解决也很容易,将上次的操作clean掉即可,点击菜单 Extras -> Cleanup,清理完成后,重新Commit即可成功。

通信协议与字节序问题

通信协议与字节序问题

传统的通信协议通常采用字节序进行定义,与现代的VOIP协议采用文本方式定义截然相反。采用字节序方式的优点是效率高、节省空间,但是也引入了很多的问题,其中最普遍的就是big endian和little endian的问题。

x86CPU采用little endian字节序,而power系列采用big endian字节序。little endian是低地址存放最低有效字节,而big endian是指低地址存放最高有效地址。通常又把big endian称为网络字节序。
big endian比较符合人类的思维习惯,例如数字0x12345678在CPU中的存储顺序如下:

Big Endian

低地址                                             高地址
—————————————–>
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      12      |       34     |      56       |      78     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian

低地址                                             高地址
—————————————–>
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      78      |       56     |      34       |      12     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

在通信协议中,往往采用Big endian定义。

在通信协议设计时,位域的定义也有这个顺序的问题。另外,对16/32位整数,也需要注意进行主机字节序和网络字节序的转换。

下面以RTP协议的一个定义为例:

相应的C代码定义为:
struct RTPHeader
{
#ifdef RTP_BIG_ENDIAN
uint8_t version:2;
uint8_t padding:1;
uint8_t extension:1;
uint8_t csrccount:4;
uint8_t marker:1;

uint8_t payloadtype:7;

#else // little endian
uint8_t csrccount:4;
uint8_t extension:1;
uint8_t padding:1;
uint8_t version:2;

uint8_t payloadtype:7;
uint8_t marker:1;
#endif // RTP_BIG_ENDIAN

uint16_t sequencenumber;
uint32_t timestamp;
uint32_t ssrc;
};

其中,sequencenumber,timestamp,ssrc在发送和接收时,需做字节序转换。C语言中,常用函数为:htons,htonl,ntohl,ntohs。

Python中面向对象的一点概念

Python中面向对象的一点概念

Python的面向对象和C++颇有一些差异,主要体现在父类和子类的关系、函数重载、虚函数等方面。基本上可以说,在Python的内心,闪烁着C的光芒。

这样说可能太文绉绉了些,看下面这段代码,就能了解到一些基本的概念了:

子类的实例需要调用父类定义的函数时,必须在子类中重定义父类函数。
class A(object):
def __init__(self):
print “a::__init__”
def func1(self):
print “a::func1”
self.func2()   #注意:func2在A中没有定义!
class B(A):
def __init__(self):
super(B,self).__init__() #子类不会自动调用父类的构造函数,需要显示定义
print “b::__init__”
def func1(self):
print “b::func1”
super(B,self).func1()
def func2(self):
print “b::func2”
bObj = B()
bObj.func1()
用Python扩展C/C++程序的小技巧

用Python扩展C/C++程序的小技巧

通常都是用C/C++来扩展Python应用。而在我们程序中是反过来的,核心是C/C++程序,嵌入Python来提供扩展脚本,满足业务开发的需要。

这种模式下,很难应用现有的一些IDE工具来查错和调试。通常我们总是通过输出打印信息来检查python脚本逻辑是否出错。但是对一些语法错误,由于没有IDE工具辅助,反而不易排查,经常阻碍开发进度。后来发现可以应用traceback模块来迅速定位出错的地方,这可真是个很不错的模块。具体实现如下:

def TraceError(self):

exc_type, exc_value, exc_traceback = sys.exc_info()
exc_list = traceback.format_exception(exc_type, exc_value,exc_traceback)
exc_len = len(exc_list)
index = 0

while exc_len > 0:
self.Trace(exc_list[index])  # 自定义输出函数
index += 1
exc_len -= 1
return