新增加一个”读书”栏目
日常偶尔读点书,享受一点阅读的乐趣,也许需要记点什么,就开辟这个栏目。
现在正在读的书是南怀瑾先生的全集,好多本啊,累死我了。另外正在学习的技术类书籍(说文档可能更合适)是37signals的GettingReal,也是一篇让人拿起就放不下的文章。
希望自己能好好学习,天天向上。
学海无涯
日常偶尔读点书,享受一点阅读的乐趣,也许需要记点什么,就开辟这个栏目。
现在正在读的书是南怀瑾先生的全集,好多本啊,累死我了。另外正在学习的技术类书籍(说文档可能更合适)是37signals的GettingReal,也是一篇让人拿起就放不下的文章。
希望自己能好好学习,天天向上。
昨天Commit代码时,网络意外中断。今天再次Commit时,RapidSVN提示出错:
Error: Error while performing action: Working copy ‘… …’ locked.
看这描述的意思,是本地文件在上次操作时进行了锁定,由于没有正常退出解锁,导致后续操作无法再继续。
要解决也很容易,将上次的操作clean掉即可,点击菜单 Extras -> Cleanup,清理完成后,重新Commit即可成功。
据说WebRTC是Web方式进行语音、视频实时通信的框架。项目地址如下:
http://sites.google.com/site/webrtc/ (需翻墙浏览?)
暂时还不太清楚这个技术的细节,不过如果像Google宣传的那样,就可以实现高质量的web通信方式。传统的SIP软终端就面临很大的挑战,从另一方面来说,可能也是一次打破现有格局的机遇。
SIPp是一个非常好的SIP性能测试工具,我们一直用它,:-) 不过一直是在windows环境中使用这个软件。
而最近忙于将已有系统迁移到Linux环境,因此就有必要研究一下linux环境下的SIPp,我们以ubuntu环境为主。在ubuntu环境中安装、运行SIPp基本是非常简单的,因为ubuntu的软件源中已经加入了SIPp,不过运行时有些地方需要注意。
下面我们逐一进行介绍:
step 1: 安装SIPp
sudo apt-get install sip-tester
step 2: 运行SIPp
命令与windows环境的SIPp一样,需要注意的是Ubuntu/Kubuntu的网络环境中,缺省会安装一个循环网卡,如果运行SIPp时不指定本地地址,SIPp很可能会以该Loopback的地址填写SIP消息中的各项参数,导致大量呼损。因此我们只需注意以-i指定本地地址,以-p指定本地端口即可。下面是两个示例:
运行SIPp接收端程序:sipp -sn uas -i 192.168.1.10 -p 5060
运行SIPp发起端程序:sipp 192.168.1.20:5060 -sn uac -i 192.168.1.10 -p 5061 -r 3 -rp 1000 -m 30000
在运行SIPp进行测试时,经常有人会问到:“为什么我运行sipp会出现下面这个错误提示呢?”
Error opening terminal: cygwin
这个错误是说SIPp无法找到运行时必要的terminal信息,这有可能是由以下几方面的因素导致的:
(1)计算机上没有安装cygwin。cygwin是必须要有的。
(2)直接在command命令行窗口运行sipp。这个是最常见的错误。大家可能觉得把cygwin的bin目录以及sipp的目录加入到path路径就可以直接运行sipp了。直接运行时,还是没有指定cygwin的terminal信息,同样会出错。
那么该如何运行SIPp呢?
请注意SIPp安装后,在“start”程序组中建立了快捷方式“start sipp”,我们应点击这个快捷方式来运行SIPp。这个快捷方式,实际上是指向SIPp安装目录下的批处理文件:startterm.bat。打开这个批处理文件,我们可以很清楚地看到,首先进行了terminal信息的设置,然后进行了必要的mount操作,最后才能正常运行SIPp。
传统的通信协议通常采用字节序进行定义,与现代的VOIP协议采用文本方式定义截然相反。采用字节序方式的优点是效率高、节省空间,但是也引入了很多的问题,其中最普遍的就是big endian和little endian的问题。
Big Endian
低地址 高地址
—————————————–>
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 12 | 34 | 56 | 78 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Little Endian
低地址 高地址
—————————————–>
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 78 | 56 | 34 | 12 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#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。
比较简单,参考下面的示例:
compil32 /cc “c:\isetup\sample32\my script.iss”
Python的面向对象和C++颇有一些差异,主要体现在父类和子类的关系、函数重载、虚函数等方面。基本上可以说,在Python的内心,闪烁着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
从cnBeta网站看到一条信息(http://www.cnbeta.com/articles/116220.htm),大致的意思是:
让HSPA网络也可以承载语音数据,并且还可以在无SIM卡的情况下实现紧急呼叫。这意味着只要有HSPA数据连接,用户就可以直接通过数据网络拨打电话而不是走传统的蜂窝网。新的标准还优化了语音路由,并加入了一系列LTE手机的服务端API。
我比较感兴趣的是: