Browsed by
Category: 计算机技术

mkfifo与select

mkfifo与select

基本上,创建有名管道和平常的文件操作没有太大的差别。在用select对有名管道句柄进行操作时,有些比较奇怪的地方。

例如,我们有两个程序(进程),一个向有名管道写,另一个负责从有名管道读。逻辑很简单,因此我们很自然地在读进程程序中设置read_only,然后用select等待数据。

奇怪的事情发生了,select总是能返回成功,可是read的数据为空。这个问题让我们百思不得其解,结果google后发现,对于只读的有名管道,也需要设置为“读写”模式,否则它对select总是会立刻返回成功。

经过多次测试,对linux下的有名管道,如果采用select判断是否可读,需要设置以下参数:

(1)非阻塞

(2)可读可写

例如以下演示代码:

fd = open(COMMAND_PIPE, O_NONBLOCK | O_RDWR);
... ...
int ret = select(fd+1, &read_set, NULL, NULL, &timeVal);
Kubuntu12.04中apache2配置上的一些变化

Kubuntu12.04中apache2配置上的一些变化

在以前的版本中,如果需要配置HTTPS访问方式, 只需要修改/etc/apache2/sites-available/default-ssl文件即可。

可是在新版本中,如果仅仅是修改这个问题,还是无法以https方式访问apache2. 在apache的error.log中,会出现以下错误提示:

Invalid method in request \x16\x03\x01

需要多做几个配置来解决:

在/etc/apache2/mods-enabled目录下,添加以下链接:

sudo ln -sf /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled/ssl.conf
sudo ln -sf /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled/ssl.load

在/etc/apache2/sites-enabled目录下,添加以下链接:

sudo ln -sf /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled/000-default-ssl

然后重启apache2即可:

sudo service apache2 restart

对比检查Kubuntu10.04以及11.10中的配置,以前的版本中都已经自行创建了上述这些链接,不知道为什么在新版本中没有这么做。

linux系统对比商业操作系统,一个非常大的不足就是兼容性考虑不足,实在是太随意了。兼容性不仅仅是二进制运行程序的兼容性,也包括库,配置,头文件等等。像上面这样的配置上的变化,说大也不大,可是如果是生产环境上的系统进行升级,就不知道有多少这样的“小改动”了。

QT程序自动重启

QT程序自动重启

一行代码就可以了:

// restart application
QProcess::startDetached(qApp->applicationFilePath(), QStringList());
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()