Browsed by
Category: 学习

学海无涯

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
Voice over LTE

Voice over LTE

从cnBeta网站看到一条信息(http://www.cnbeta.com/articles/116220.htm),大致的意思是:

让HSPA网络也可以承载语音数据,并且还可以在无SIM卡的情况下实现紧急呼叫。这意味着只要有HSPA数据连接,用户就可以直接通过数据网络拨打电话而不是走传统的蜂窝网。新的标准还优化了语音路由,并加入了一系列LTE手机的服务端API。

我比较感兴趣的是:

  • 这个VoLTE和VoIP有什么区别?
  • LTE手机的服务端API是指什么?
  • 是否所有电话都可以通过LTE手机的数据网络完成?
VIM基本配置

VIM基本配置

Linux下的vim是个不错的编辑软件,不过在Fedora和ubuntu环境下,缺省配置不太如意。我们需要修改它的缺省配置文件,进行一些简单的定制. 以下操作是基于Fedora系统。

我们需要以root身份,修改/etc/vimrc文件(如果是ubuntu,则应当修改/etc/vim/vimrc文件),这个文件对系统所有用户的vim配置起作用。如果只是想修改当前用户的vim配置,可以在当前用户的home目录下,创建.vimrc文件进行配置。

“显示行号
set nu

“语法高亮显示
syntax on

“格式自动对齐
set autoindent

“按tab后退四格
set ts=4
set shiftwidth=4

“扩展tab为空格键
set expandtab

在OpenOffice.calc文档中设置密码

在OpenOffice.calc文档中设置密码

这个设置很让人意外。在菜单“工具-〉保护”中提供了对工作表和工作簿的保护,可是从使用过程看,似乎没有起到什么保护作用。

实际上是通过另外的方法来设置密码保护:保存文档时,在对话框中选择“密码保护”,然后输入密码即可。

对比Microsoft Office,感觉OpenOffice在各方面还有待加强啊。例如,上述密码保护,没有区分只读和可写等情况(也可能是我不熟悉,没找到正确的地方?)。在保存对话框中进行密码设置也比较另类,如果客户直接通过工具条上的“保存”按钮,就不会知道这些设置。

SIPp简单使用手册

SIPp简单使用手册

Windows下应用SIPp非常简单, 直接下载SIPp的安装文件安装即可。

需要注意的是,不要直接从cmd窗口启动SIPp,而是 点击SIPp的快捷方式“start sipp”,这样,它会将SIPp的安装目录加入路径中。或者,可以将sipp的安装目录加入系统的PATH路径,然后也可以直接在cmd窗口启动 SIPp。

sipp 192.168.1.100:5060 -sf caller_basic.xml -p 5062 -m 1 -r 1 -rp 2000 -d 2000

-sf     加载外部的xml定义文件
-inf    从外部csv文件导入数据信息
-p      指定本地端口。 如果不指定的话,系统使用一个随机的空闲端口;
-m  呼叫次数
-d  每个呼叫的保持时间(毫秒)

其他常用配置参数:

-r -rp Specify the rate period for the call rate.
Example: -r 7 -rp 2000 ==> 7 calls every 2 seconds.

实际上SIPp内置了缺省的UAS和UAC,因此,我们可以不需要定制xml脚本,直接用下面的命令进行测试:

启动SIPp做呼出:sipp 192.168.1.100:5060 -sn uac -p 5062 -r 1 -rp 2000 -d 2000

启动SIPp接受呼叫:sipp 192.168.1.100:5060 -sn uas -p 5063

应用在Fedora系统
下载sipp的源代码在Fedora 9下编译时,会有编译错误“INT_MAX未定义”。 解决方法:
修改sipp.hpp文件,增加以下宏定义即可:

#ifndef INT_MAX
#define INT_MAX 0xFFFFFFFF
#endif

直接使用命令make即可进行编译,在当前目录下产生sipp可执行文件。