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中需要做这样的配置。

基于HTML5的SIP客户端

基于HTML5的SIP客户端

项目名称是:sipml5,地址:http://code.google.com/p/sipml5/

该项目基于Google的WebRTC项目。这点与我以前写的一篇blog吻合,将SIP引入WebRTC不仅是可能,而且已经有人搞定了!

粗略地看了一下该项目的情况,界面是比较丑陋,不过看介绍应该是基本可用的。这是个好消息啊,尤其对企业用户而言,可能都不需要每个员工安装部署SIP终端,直接部署该终端即可,再结合云通信平台,整个系统都能简化不少。

如果该项目能覆盖Chrome, Firefox以及IE三个主要平台,基本就可以在实际环境中部署。非常让人期待啊。

在Ubuntu/Kubuntu中以非root用户身份运行wireshark

在Ubuntu/Kubuntu中以非root用户身份运行wireshark

缺省情况下,只允许以root身份运行wireshark,否则无法抓包,命令如下:

sudo wireshark

每次都这样启动实在是比较麻烦,最好还是允许普通用户也运行wireshark并抓包。为此,需要执行以下命令即可:

sudo dpkg-reconfigure wireshark-common
sudo chmod o+x /usr/bin/dumpcap
RFC4028的不足与SIP keep-alive方法

RFC4028的不足与SIP keep-alive方法

在SIP族协议中,只有RFC4028明确讨论了对话keep-alive问题。实际上这在工程应用、生产环境部署中,是个非常重要的话题,尤其是SIP基于UDP协议时,网络原因丢包是很常见的,另外还有软终端任意退出对话等情况。缺乏keep-alive保护的SIP服务器毫无疑问将会严重消耗资源,最终导致整个server被迫退出服务。

RFC4028协议考虑到有状态Proxy、无状态Proxy等情况,提出扩展Session-Expires以及Min-SE两个新的Header,并且通过reINVITE消息来keep-alive dialog。基本上,这个协议本身没有太多问题,按照它的思路,的确是可以解决keep-alive的问题,但是在实际部署中,该协议未必可取,有很大的缺陷:

(1)SIP运营商可能会拒绝reINVITE消息。实际上很多SIP运营商会拒绝reINVITE消息,这是出于SIP运营商媒体处理方面的考虑。最初应用reINVITE就是为了修改媒体流,而这毫无疑问会导致SIP运营商媒体服务器重新分配资源等情况出现。RFC4028中只是定义了新增Header和callFlow,不幸的是,却没有区分出这个reINVITE与更改媒体流的reINVITE,因此实际部署时是否有效,我们需要打一个很大的问号。

(2)采用reINVITE流程太过重型了。正如前面所说,keep-alive的reINVITE消息是没有与更改媒体流的reINVITE进行区分,因此可以肯定绝大部分SIP服务器或者终端,在收到这个reINVITE消息时,会启动媒体更改流程。对话内重改媒体毫无疑问是个很重型的流程,一旦对话内本身就可能有媒体类业务,例如Music On Hold等,就很有可能导致冲突。

如果不采用reINVITE消息,在4028协议中也同时建议可以采用UPDATE消息。在UPDATE消息中可以不携带SDP更改媒体。这种方式可能是比较可行,但是未必所有的SIP设备会支持UPDATE消息并用于keep-alive过程。

方案之二应该采用SIP最基础协议RFC3261中定义的OPTIONS消息。理由如下:

(1)该消息定义在RFC3261协议中,这个协议是整个SIP协议族的基础。基本上不可能有SIP设备(包括服务器、Proxy、终端等)会不支持这个消息。

(2)我们注意到,这个消息可以在对话内,也可以在对话外使用。在RFC3261中很明确地定义了:

An OPTIONS request received within a dialog generates a 200 (OK) response
that is identical to one constructed outside a dialog and does not
have any impact on the dialog.

(3)对话内使用OPTIONS,最显著的优点就是“does not have any impact on the dialog”,对现有对话没有任何影响,更不可能去更改媒体。

(4)对端设备如果由于某种原因已经退出,当然就不能产生200OK响应消息,此时可以理所当然地拆除当前对话,从而保护服务器自身资源,达到keep-alive的目的。

对于设备层级的keep-alive,采用OPTIONS没有任何问题。但是对于dialog层级的keep-alive,则会有问题。原因在于:dialog内的OPTIONS消息有可能被对端作为对话外的OPTIONS来处理。也就是说,如果设备是alive的,但是dialog的BYE消息丢失了,无论dialog内还是dialog外,设备对OPTIONS都可能会返回200OK。

Requests that do not change in any way the state of a dialog may be 
received within a dialog (for example, an OPTIONS request).  They are 
processed as if they had been received outside the dialog.

方案三是采用RFC5626协议,对于UDP-SIP的情况,该协议建议采用STUN keep-alive方式。缺陷在于:定义有些复杂,而且很多SIP设备未必会支持。

呼叫服务器和媒体服务器合一的情况下,当然也可以由媒体服务器检测RTP/RTCP来keep-alive,不过这是另外一个topic了,这种方式可能更合适于SIP终端设备。

一款轻量级的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。

WebRTC与SIP

WebRTC与SIP

毫无疑问,WebRTC是个好东西。之所以这么说,是因为他居然开源了GIPS的audio引擎。GIPS的回声抑制、噪声消除等方面的技术,几乎独步天下。当年GIPS仅靠这些个算法包,就活得有滋有味。Skype、MSN、QQ等等,凡是做IP语音通信的,都无一例外地使用了GIPS的技术,这里还没包括各硬件芯片厂商。

Google居然将它开源了,牛啊!实在是让人佩服!

既然已经开源了,我们也希望在已有的free项目中引入webrtc的相关模块(主要是EC, NS等)。看了一下webrtc的文档(目前还是非常简陋),忽然有个想法,其实我们没有必要将webrtc的模块引入我们的项目,相反,我们只需要基于webrtc,将我们已经实现的SIP会话层以及GUI层添加到webrtc中。从webrtc的模块分层看,这样似乎更可行一些。

替换掉webrtc的会话层,或者新增SIP会话层似乎都是可行的。不过编译webrtc实在是麻烦,居然要vc2005(还不能是express版本)/ Win7 SDK / DirectX SDK等等,个个都是巨无霸。

另外,这个对Speex项目应该也有影响吧?Speex项目自己实现了一个audio引擎,不过其中的EC,NS等关键部件效果还是不太让人满意,不知道他们会不会从webrtc中获得灵感。

RTMP

RTMP

RTMP全称是Real Time Messaging Protocol。这个协议由Macromedia公司开发,为Flash player以及Flash media server提供语音、视频流媒体服务的私有协议。目前Macromedia已经公开了这个协议的细节。

值得注意的是,虽然Flash player/media server/RTMP通常用于提供网络视频流媒体,例如各种各样的视频网站,它们的组合也可以提供在线会议的功能。考虑到几乎所有的浏览器都可能安装有flash,因此终端用户几乎不需要另外安装软件,就可以访问视频、会议等服务,对这些业务的在线部署实在是非常方便。

Macromedia公开RTMP协议,可能是出于与HTML5竞争的需要。这对最终用户而言,无疑是有利的。

而吸引我注意的则是另外一则消息:FreeSwitch最新版本中实现了mod_rtmp模块,通过这个模块,FreeSwitch可以成为RTMP Server,并与传统的SIP进行转换和互通。这是个很不错的想法,让人有很多想象空间。

Ruby on Rails实战圣经

Ruby on Rails实战圣经

一位台湾技术人士的网站:http://ihower.tw/rails3/index.html 。不需要翻墙阅读,难得啊。

还没有仔细阅读,无法评价是否是精品。不过从作者文章的布局看(据说也会出实体书),至少是花了不少精力的。也许和Django book互有短长。

Django book 2.0

Django book 2.0

最近的项目中需要开发web services,目前主要考虑两个框架: Raby on Rails和Django。网络上比较推荐RoR,但是考虑到我们目前已有的项目和技术积累,我更偏向Python一些,因此更关注Django。

网络上有免费的Django入门教材:

http://www.djangobook.com/

其中文翻译为以下网址:

http://djangobook.py3k.cn/2.0/