xxBSD,想说爱你不容易

xxBSD,想说爱你不容易

最近在应用linux时,运到一些问题,比较典型的就是gcc, bfd, core等各个部件之间的版本配合问题。每次linux的升级,包括内核的升级,gcc的升级以及几个关键库的升级,都会给我们造成或多或少的麻烦。相比较之下,在windows平台作开发,我们基本没有遇到过类似的后向兼容问题。

所以当我看到FreeBSD据说是比较稳定,对各种库的依赖关系处理比较好时,怦然心动。于是下载FreeBSD8.1版本,在VMPlayer上安装试试。结果非常失望,安装界面是极其简陋的,基本上就和我还在上大学那会儿的linux安装界面差不多。换句话说,相比linux的安装界面,FreeBSD看上去落后了十年,而且非常不人性化。例如,安装时选择配置网络,居然只能配置固定IP,而不同配置DHCP。费了九牛二虎之力后,发现很多很基本的东西都没有安装或者没有配置,需要自己手工去下载或者配置,实在是很麻烦。最后不得不放弃。

转而下载了一个叫做PCBSD的版本,安装时,界面比FreeBSD好多了,可是不幸的是,在VMPlayer中安装时,频繁出错,最后没能安装成功。

这段时间一直在使用linux(包括尝试各种版本,例如Fedora,Centos,Ubuntu,redhat,OpenSUSE等),很明显,linux已经有了长足的进步,尤其是Ubuntu,已经达到大规模工业应用的水平了。但是相比windows,linux仍然还有很长的路要走,还需要更严谨和进行更多的考量。而FreeBSD/PCBSD相比linux,也有很长的路要走,而与windows相比,我想我们中短期之内不会再考虑它们了。

另一个新闻:关于360

另一个新闻:关于360

刚看到新浪科技上的一则新闻,360推出密盘服务。具体信息参考链接:http://tech.sina.com.cn/i/2010-12-09/11134963302.shtml

这则新闻号称有各种先进技术等等,不过我有个疑问:如果流氓说推出可以保一万年的保险业务,你敢用么?没错,ta可能是给装了个铁门,不过ta在门后面干什么可没人知道,更没有人知道ta哪天会作个“艰难的决定”。

这不是个别公司的问题,而是整个中国互联网的问题,甚至是现在社会的问题。在流氓横行的社会里,自己看好自己的东西才靠谱。

微软推出在线office了

微软推出在线office了

简单地试用了一下Word,Excel以及Note,感觉很不错,比Google doc要专业很多。没有Google doc的tag功能,管理文档可能会不太方便,不过貌似提供了搜索功能,还不清楚是不是够强大。

用Chrome上office web会提示不安全,可能是因为需要安装activex插件的原因。以前一直是用chrome,今天因为office web又重新用上了IE!微软还是很强大啊。

希望这么好的产品,不会再被和谐掉。这个世界真奇妙,和谐居然会变成一个这样的动词。

按条件编译版本

按条件编译版本

在我们开发的软件中,需要根据宏定义的不同,区分编译出不同的版本。例如,代码中有如下定义:

#if MSS_USER_VERSION == 1000
… …
#elif MSS_USER_VERSION == 100
… …

比较丑陋的方式,当然可以在代码中先定义好MSS_USER_VERSION ,然后再编译版本。但是我们通常采用自动化脚本编译,上述做法无法自动进行区分,需要人工干预。

我们希望在脚本执行时能通过设置不同的环境变量,从而自动编译出相应的执行文件。

以上述代码为例,我们可以修改qt的pro文件,增加如下定义即可:

DEFINES += MSS_USER_VERSION=$$(MSS_USER_VERSION)

脚本在编译前,先设置好环境变量,编译不同的版本,设置不同的环境变量值即可:

set MSS_USER_VERSION=1000

最后,如果只是单纯编译console程序,需要显示地在pro文件中说明,否则qmake缺省会按照window程序编译,导致在命令行中无法看到输入输出信息。

CONFIG += console

VC 2008 Express编译QT程序时产生MAP文件

VC 2008 Express编译QT程序时产生MAP文件

MAP文件对于定位程序crash问题非常有用,一般情况下,我们总是希望能产生MAP文件以便将来出问题时好进行查找。

在VC 2008 Express中生成MAP文件比较简单,只需要修改工程属性中的link相关项即可。

可是在QT应用中,如何设置呢?这种情况下,是先使用qmake编译pro文件,然后使用VC的命令行方式编译程序,没有相应的VC工程进行设置。

我们可以修改QT在VC2008环境下的全局编译、链接开关。以QT4.6.2为例,假设qt安装在d:/qt/4.6.2目录下。

进入qt安装目录下的子目录: mkspecs\win32-msvc2008

用notepad打开该目录下的qmake.conf文件,找到QMAKE_LFLAGS项,将其修改为:

QMAKE_LFLAGS            = /NOLOGO /MAP /MAPINFO:EXPORTS

注意,全部都是需要大写格式。

修改完成后,重新qmake各pro工程文件并编译,就会在生成exe/dll/lib的同时,生成map文件。

上述方法修改的是QT全局的qmake连接标志,编译任何工程都会产生map文件。在实际应用中,我们可能只是希望部分工程产生map文件,这种情况下可以修改工程的pro文件,单独添加QMAKE_LFLAGS即可:

QMAKE_LFLAGS         += /MAP /MAPINFO:EXPORTS

远程访问MySQL数据库

远程访问MySQL数据库

Linux版本的MySQL数据库缺省不允许从远程访问(Windows版本在安装时可以进行选择),因此我们需要简单修改一下来放开这个限制。

通过软件中心安装MySQL,这没有什么好介绍的。网上有些这方面的介绍,不过中文版本的基本上都有些错误,估计大部分都只是转载,作者并没有真正尝试。

以下步骤基于Ubuntu版本。

step1:mysql> grant all privileges on *.* to 'root'@'%' identified by '1234';

其中,‘1234’是指密码,‘root‘是指远程访问的账户名。’%’是指允许从任何一个远程计算机访问。’*.*’是指所有数据库、所有表。

step2:mysql> flush privileges;

step3:修改/etc/mysql/my.cnf文件,注释掉以下行:

bind-address     = 127.0.0.1

step4: 重启MySQL服务

sudo service mysql restart

完成上述步骤后,就可以用root账户,以‘1234’为password,从任何一个远端计算机上登录并访问MySQL数据库了。

2018-09-29 更新, Debian 9之后又有了很多变化:

最大的变化莫过于MariaDB正式替换了MySQL,当然mariadb的各项操作、库(尤其是基本的操作和基本库)与MySQL还是保持兼容。同时,配置文件变更为 /etc/mysql/mariadb.conf.d/50-server.cnf。

在完成上述那些操作后,在其他用户的shell里,使用root账号登录MariaDB,会提示以下信息:

ERROR 1698 (28000): Access denied for user ‘root’@’localhost’

而直接在root用户的shell里登录是没有问题的。这种情况下,root要登录进MariaDB后,选择“mysql”数据库,然后

update user set password=password('1234') where user='root' and host='localhost';

此时设置从本机登录时,root用户的密码。

update user set plugin='' where user='root';
flush privileges;

清除root用户的plugin字段,允许root用户从其他shell里登录。

另外要注意的是,重新启动MariaDB,命令也有变换,采用 systemctl 进行操作:

systemctl stop mariadb.service
systemctl start mariadb.service
VMware player真不错

VMware player真不错

以前一直是使用VirtualBox来运行linux操作系统。原因很简单,virtualBox(简称VB)是免费的,而且功能也很不错,基本满足了我们的要求。

前几天发现VMware居然有一款VMware Player产品(简称VMP),而且从介绍看,它不仅仅是个player,它也能创建虚拟机。这可真不错。下载来试试,感觉比VB要好用些。

最让人称道的是,VMP比VB占用的内存要少得多,速度也快得多,除了系统安装以及启动那会儿,基本上客户机运行时,对主机影响不太大。主机上的各项操作仍然很流畅,而运行VB时,主机是明显受到来影响,各项操作都比较慢。

另外,VMP中的shared folder比VB的数据空间要好用些。客户机系统run起来后就能直接在/mnt目录下使用来,而VB的数据空间要进行人工进行mount(当然,也可以修改配置文件,在系统启动时mount)。相比之下,shared folder好用很多。

使用几天后,感觉很满意。将VB卸掉,换成VMP了。

通信协议与字节序问题

通信协议与字节序问题

传统的通信协议通常采用字节序进行定义,与现代的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。

linux系统产生UUID的方法

linux系统产生UUID的方法

1 #include <stdio.h>
2 #include <time.h>
3 #include <stdlib.h>
4 #include <uuid/uuid.h>
5
6 void display_uuid(uuid_t uu)
7 {
8     int i=0;
9     for(i=0; i<16; i++)
10     {
11         printf(“%02x”, uu[i]);
12     }
13
14     printf(“\n”);
15 }
16
17 int main()
18 {
19     uuid_t uu1, uu2;
20
21     uuid_generate(uu1);
22
23     uuid_generate(uu2);
24
25     display_uuid(uu1);
26
27     display_uuid(uu2);
28
29     int result = uuid_compare(uu1, uu2);
30
31     printf(“result = %d\n”, result);
32
33     return 1;
34 }
编译命令:gcc demo.c -luuid