存档

‘Windows’ 分类的存档

关于rabbitMQ在Windows上的安装

2011年2月25日

今天由于项目需要在Windows server 2003上安装rabbitMQ服务器,结果总是无法启动成功。

在安装了erlang最新程序并设置好环境变量,然后下载最新的rabbitMQ服务器程序2.3版本后,无论如何怎么也启动不了:

 

rabbit-2.3服务器

 

最新版的rabbitMQ服务器在Windows上报“init terminating in do_boot ()”错误。在Google了长时间无果后,实在没有解决办法,只好使用最笨的办法碰碰运气了。

在rabbitMQ的归档下载处找了一个以前的版本,此处我下载的是1.8的。尝试运行后,My god,居然成功启动运行了:

rabbit-1.8服务器

rabbit-1.8服务运行界面

我比较疑惑,为什么最新的rabbitMQ 2.3无法成功运行,而相对较老的版本1.8在相同的环境下却可以成功运行呢?

如果你在windows上无法成功运行某一个rabbitMQ服务器,那么你换一个相对较老一点的运行,或许可以解决问题。

 

Windows , ,

救活失效的IE8 Developer Tools

2010年3月24日

  IE8 Developer Tools是一个不错的查看页面元素的工具,类似于Firefox的Firebug。至于哪个更好用,不是本文的主题。在用了一段时间以后,实然有一天,这个工具失效了,也就是窗口出不来了,在IE上点击”Developer Tools”后了出现以下不正常的窗口:

  

Developer Tools

Developer Tools

  首先我不知道是什么原因造成这样的,不过我猜测是更新补丁的问题(我的系统是Windows Server 2008 R2)。这个工具不能用了,对测试Web页面将是一个损失。怎么办?换Firefox吗?先自己动手试试,看能不能救活它。

  经反复试验,想完全”救活”它,使它像以前那样正常工作似乎是不可能的(如果你重装系统,并且不再更新补丁的情况例外)。下面的办法可以部分使它能工作,就是麻烦了一些:

  • 在出现了上述情况时,在那个空白的窗口上点右键,选择最大化:

  

Developer Tools

Developer Tools

  • 这时,你会发现窗口出来了,和以前一模一样。现在可以用它来干活了。

  不过很快你就会,这个窗口只能最大化使用。其它的任何操作都会使它像刚打开时的那样”空白”并缩到任务栏上。至少在我的机器上是这样。如果它又”空白”并缩到任务栏上了,再右击,选择最大化选项。

  就目前来说,只能这样不方便地凑和着使用了。如果确实是微软的补丁的问题,希望能尽快再放个补丁让Developer Tools恢复原状。

  

  

  原创文章如转载,请注明:转载自张文杰的博客http://zhangwenjie.net ]

  本文链接地址:http://zhangwenjie.net/archives/335.html

Windows , ,

关于暂停PJSIP开发指南中文翻译的通知

2010年2月25日

  前一段时间,我曾经翻译过PJSIP Dev’s Guide,中文叫《PJSIP开发指南》,具体可以从这里下载到PDF文件。当时只翻译到第六章,这一段时间也在翻译其它的部分。由于自己近期在研究SIP协议,看到此文档后,决定翻译成中文,方便自己学习,也为学习SIP的朋友提供一些帮助。

  不过,今天发生的一件事,让我决定不再翻译其余的部分。这件事起因于我和PJSIP的作者Benny Prijono的一封邮件,见下图:

  

PJSIP开发指南邮件

PJSIP开发指南

  我给Benny Prijono必了一封邮件询问关于翻译PJSIP开发指南的版权问题,希望作者能同意。很快,Benny回邮件了,非常爽快同意了翻译工作,并且会支持此项目工作。但是作者指出了一个比较严重的问题,这是我没有注意且很沮丧的问题。

  作者指出的问题是:此份PJSIP Dev’s Guide是在PJSIP version 0.5时写成的,现在已经到了1.5.5版本了,同时作者指出,”While most of the key concepts stays the same,some of the details may have changed”,以至于”the concern is that you’re spending a lot of time for something that is not relevant anymore”。也就是说尽管大部分关键概念保持不变,但也有一部分内容改变了,因此很有可能在许多不相关的东西上花费了大量时间。

  在最后,作者说:”So I would say it’ll be more effective if we update the PDF doc first,then translate it to Chinese. Unfortunately we can’t say when we will have time to do this either.”就是说作者希望在先更新了文档后再做翻译工作。但作者又说他他不好说什么时候能有时间做这个工作。

  看了这封邮件后,我觉得没有必须再翻译这份文档了。主要原因是它太旧了,很多概念已经变化了,翻译出来会对使用它的朋友产生误导结果对于已经下载了1-6章的朋友,请仔细研究以确认哪些内容可用,哪些内容已经过时。谢谢!

  不过,现在我仍在研究PJSIP的源代码,以后会不时将自己的心得分享给大家,请大家多多关注。

  

  原创文章如转载,请注明:转载自张文杰的博客 [ http://zhangwenjie.net ]

  本文链接地址:http://zhangwenjie.net/archives/289.html

Windows , ,

Windows 7下文件改名的一个小技巧

2010年2月23日

  昨天从网上下载了新概念英语第一册的英音版mp3,准备今年练练自己的英语口语和听力。

  下载下来的mp3文件名是诸如lesson1.mp3,…lesson10.mp3,…lesson100.mp3,也就是说这些mp3文件的文件名不规则,播放器播放时读取的文件不连续,这时需要对文件改名。

  我需要的文件名规则是:lesson001.mp3,…,lesson010.mp3,…,lesson100.mp3,…。这样播放器播放时读取的文件将是连续的。

  对文件改名本身有许多办法,比如使用改名软件、写程序等等。对于不是很多文件的改名,可以使用Windows本身就有的改名方法,如下:

  1. 和以前一样,选中一个文件按F2键进入编辑状态,这里在windows 7系统下只有文件名被选中(不像以前的系统扩展名也被选中了,可能会误改扩展名),更改名称;
  2. 这里不要按其它键,而是按tab键,这时你会发现windows会将上一个文件的改名生效,并将编辑状态应用到下一个要更改名称的文件上,如此这样,可以反复进行多个文件改名,而不需要多次按F2键。

  这是我无意中发现的用windows本身更改文件名的方法,相对以前要便利多了。大家可以试用一下。

  原创文章如转载,请注明:转载自张文杰的博客 [ http://zhangwenjie.net ]

  本文链接地址:http://zhangwenjie.net/archives/285.html

Windows , ,

PJSIP开发指南中文版(1-6章)

2010年2月8日

     PJSIP是一个SIP协议栈,它支持多种SIP的扩展功能,下面列出其重要的几种优点:
   1.高度的可移殖性 
      只需简单的编译一次,它能够在多种平台上运行(所有Windows 系统列, Windows Mobile, Linux, 所有Unix 系列, MacOS X, RTEMS, Symbian OS, 等等)。 

2.极小的内存需求 
      完全实现SIP的功能只需要150K的内存空间,这使得PJISP不仅仅是嵌入开发的理想平台,并且实用于那些内存运行于极小内存平台的应用,这也意味着极小的用户下载时间。

 3.高效的性能 
      这意味着极小的CPU运算需求下能同时实现更多的通话。

4.支持多种SIP功能及扩展功能 
      多种SIP功能和扩展功能,例如多人会话,事件驱动框架,会话控制(presence),即时信息,电话传输,等等在库文件里得以实现。 

5.丰富文档资料 
      对于软件开发人员来说,文档资料从来都是多多益善,因此我们要求PJSIP开发人员提供了大量的极有价值的文档资料供大家使用。

      PJSIP开发指南详细解释了大多数PJSIP对象的概念、关系(“类图”)以及其他描述;此文档也可以作为PJSIP协议栈的通用设计文档。点这里下载PJSIP开发指南中文版(1-6章)。

   首发张文杰的博客:http://zhangwenjie.net (转载请保留,谢谢。) 本文地址:http://zhangwenjie.net/archives/280.html

Windows ,

PJSIP开发指南翻译系列之第二章

2010年2月3日

  说明:此系列文章是根据PJSIP Dev’ Guide文档翻译而来,所有版权归原作者所有。这里的翻译仅仅是用作学习、交流等用途。本人近期在学习SIP,鉴于网上SIP资料比较少,自己就翻译了此文章,限于自己的SIP及英语水平,错误之处在所难免,希望高手多多指教,也希望有此爱好者一起学习交流。

第二章 模块

模块框架是在PJSIP程序中的各个软件组件中派发SIP消息的主要方法。PJSIP中的所有软件组件,像事务层(transaction layer)和对话层(dialog layer),都以模块的方式来实现。如果没有模块,核心协议栈(pjsip_endpoint和transport)根本不知道如何去处理SIP消息。

模块框架是基于简单但强大的接口抽象。对到来的消息,endpoint(pjsip_endpoint)从优先级高的模块开始向所有的模块派发消息,直到其中一个模块告诉框架它自己处理了此消息。对出去的消息,endpoint在消息真正开始发送到网络之前派发这些消息到所有模块,允许所有模块有机会对消息做最后的修改。

2.1模块特性

2.1.1模块声明

模块接口是在<pjsip/sip_module.h>中声明的:

模块声明

在此声明中,所有的函数指针都是可选的;如果没有指定这些函数指针,那么他们将被认为是成功返回值的。

其中的四个函数指针,load、start、stop、unload是由endpoint调用来控制模块的状态。下面的图显示了模块状态的生命期:

状态图

状态图

on_rx_request()和on_rx_response()函数指针是模块从endpoint(pjsip_endpt)或其它模块接受SIP消息的主要方法。这些回调函数的返回值是很重要的。如果回调函数返回非0值,从语义上意味着这个模块处理了这个消息;这个情况下,endpoint将停止向其它模块派发此消息。在节2.1.3 模块对到来消息的处理中会详细描述这个问题。

on_tx_request()和on_tx_response()函数指针在消息传送之前由传输管理器来调用。这使一些类型的模块(如sigcomp、message signaling)有机会对消息做最后的修改。所有的模块必须返回PJ_SUCCESS(如0状态),否则消息传输将会取消。在节2.1.4 模块对外出消息的处理中会详细描述这个问题。

on_tsx_state()用来在每次事务状态改变时接受通知消息。事务状态改变可能由接受到消息、消息发了出去、定时器消息、传输错误事件等引起。更多关于这个回调函数将在节2.1.5“事务用户和状态回调”中描述。

2.1.2模块优先级

模块优先级指定了哪个模块将被优先调用来处理回调函数的顺序。拥有高优先级的模块(优先级的数字较小)的on_rx_request()和on_rx_response()将先被调用,它的on_tx_request()和on_tx_response()将最后被调用。

下面表出了标准的可设置的模块优先级:

优先级

优先级

记住:较低的优先级数字意味着较高的优先级。

优先级PJSIP_MOD_PRIORITY_TRANSPORT_LAYER是由传输管理器使用的。这个优先级当前只是用于控制消息的传输,比如比这个优先级低的模块(也就是优先级数字较高),它的on_tx_request()/on_tx_response()函数将在消息被传输层(transport layer)处理之被调用;而有高优先级的模块的on_tx_request()/on_tx_response()函数将在消息被传输层(transport layer)处理之被调用。参见2.1.4模块对外出消息的处理以获得更多信息。

PJSIP_MOD_PRIORITY_TSX_LAYER是被传输层(transport layer)模块使用的优先级。传输层(transport layer)将吸收所有属于同一个事务的到来消息。

PJSIP_MOD_PRIORITY_UA_PROXY_LAYER是由UA(如dialog framework)或代理层(proxy layer)使用的优先级。UA层吸收所有属于同一个对话集(dialog set)的到来消息(这也意味着有分歧的回应)。(这里的翻译可能不准确:this means forked responses as well)。

PJSIP_MOD_PRIORITY_DIALOG_USAGE由dialog usages使用。当前PJSIP实现了两种类型的dialog usages:邀请会话(INVITE session)和事件订阅会话(event subscription session)(包括REFER订阅)。Dialog Usage吸收所有在同一个对话中属于一个特定会话的消息。(The dialog usage absorbs messages inside a dialog that belong to particular session)。

PJSIP_MOD_PRIORITY_APPLICATION是典型应用程序模块想使用transactions、dialogs、及dialog usages时可使用的合适优先级值。

  首发张文杰的博客:http://zhangwenjie.net(转载请保留,谢谢)(第二章翻译未结束,待续)

Windows ,

PJSIP开发指南翻译系列之第一章

2010年2月3日

  说明:此系列文章是根据PJSIP Dev’ Guide文档翻译而来,所有版权归原作者所有。这里的翻译仅仅是用作学习、交流等用途。本人近期在学习SIP,鉴于网上SIP资料比较少,自己就翻译了此文章,限于自己的SIP及英语水平,错误之处在所难免,希望高手多多指教,也希望有此爱好者一起学习交流。

  

第一章 通用设计

1.1架构

1.1.1通信图

下面的示意图显示了(SIP)消息是如何在PJSIP组件之间来回传递的。

图表1:协作图

图表1:协作图

1.1.2类图

下面的示意图显示了“类图”:

图表2:类图

图表2:类图

1.2 Endpoint

SIP协议栈的核心就是SIP Endpoint,由不透明的类型pjsip_endpoint来表示。Endpoint具体有以下的属性和职责:

  • 它有内存池工厂,为所有SIP组件分配内存池;
  • 它有定时器堆实例,为所有SIP组件调度定时器;
  • 它有传输管理器实例。传输管理器有SIP传输商品,且控制消息解析和显示;
  • 它拥有单实例的PJSIP ioqueue类型。Ioqueue是用来分派网络事件的proactor 模式;
  • 它提供线程安全的轮询功能,这样应用程序中的线程可以轮询定时器和网络事件(PJSIP本身不创建任何线程);
  • 它管理模块。PJSIP模块是扩展协议栈的主要方法,而协议栈扩展并不局限于消息的解析和显示;
  • 它从传输管理器接受到来的消息,并将这些消息分派到模块。

一些基本功能将会在下面的部分讲述,其余的会在后面的章节讲述。

1.2.1 内存池的分配和释放

SIP组件的所有内存分配都是通过endpoint来完成的,以在整个应用程序中保证线程安全及强制策略的一致性。可应用策略的一个例子是内存池缓存,这里未使用的内存将保留以备将来使用,而不是释放。

Endpoint提供以下方法来分配和释放内存池:

	pjsip_endpt_create_pool()
	pjsip_endpt_release_pool()

当创建endpoint时(使用pjsip_endpt_create()),应用程序必须指定endpoint使用的内存池工厂。Endpont将在自己的生命期内保持此内存池工厂的指针,并由此来分配和释放内存池。

1.2.2定时器管理

Endpoint保留一个单实例的定时器堆来管理定时器。所有定时器的创建和所有SIP组件的定时器调度皆由endpoint来完成。

Endpoint提供以下方法来管理定时器:

	pjsip_endpt_schedule_timer()
	pjsip_endpt_cancel_timer()

当endpont的轮询函数被调用时,endpoint将检查定时器是否过期。

1.2.3轮询协议栈

Endpoint提供了一个单一的函数调用(pjsip_endpt_handle_events())来检查定时器和网络事件的出现。应用程序可以指定它将等待多长时间后去检查这些事件的出现。

PJSIP协议栈从不创建线程。整个协议栈中的代码执行完全代表着应用程序创建的线程,无论是在一个API被调用时,或是应用程序调用轮询方法时。

轮询功能是可以基于定时器堆的内容来优化等待时间的(The polling function is also able to optimize the waiting time based on the timer heap’s contents.)。例如,如果它知道一个定时器将在下一个5秒过期,它等待网络事件的时间将不会超过这5秒;在无网络事件出现时这样做将无必要地延长等待时间。当然定时器的精度在每个平台上都不同。

1.3线程安全和线程复杂性

1.3.1线程安全

线程安全的讨论是一个相当复杂的事情。但是,比较幸运的是,下面的设计原则在整个协议栈中的一致应用:

对象必须是线程安全的;而数据结构必须不是线程安全的。

具体到现在的话题,很自然,对象和简单数据结构的区别不是非常清楚。但是一些例子将会使你对此更明白一点。

数据结构的例子有:

  • PJSIP的数据结构,如链表(lists)、数组(arrays)、哈希表(hash tables)、字符串(strings)、以及内存池。
  • SIP的消息元素,如URLs、header fields、以及SIP消息。

这些数据结构不是线程安全的;这些数据结构的线程安全由包含它们的对象来保证。如果使数据结构也线程安全,这将严重影响协议栈的性能,并消耗操作系统的资源。

相比之下,SIP对象必须是线程安全的。我们称之为对象的例子有:

  • PJLIB对象,如ioqueue
  • PJSIP对象,如endpoint、transactions、dialogs、dialog usages,等等

1.3.2线程复杂性

使事情变糟的是,一些对象在头文件中暴露了它们的声明(例如pjsip_transaction和pjsip_dialog)。尽管这些对象暴露的API是保证线程安全的,应用程序代码在访问这些数据结构之前仍然必须在对象的互斥变量(mutex)上调用pj_mutex_lock()来获取正确的锁。

使事情变得更糟的是,一个dialog提供不同的API来锁定dialog。这样应用程序应该调用pjsip_dlg_inc_lock()和pjsip_dlg_dec_lock(),而不是pj_mutex_lock()和pj_mutex_unlock()。这两种方法的区别是,dialog的inc/dec锁保证dialog不会在函数调用过程中被销毁;不然由于gialog已经被销毁,会使pj_mutex_unlock()崩溃。

考虑下面的例子:

	pj_mutex_lock(dlg->mutex);
	psip_dlg_end_session(dlg,…);
	pj_mutex_unlock(dlg->mutex);

在上面的例子中(假想的),程序可能会在第三行代码处崩溃,因为psip_dlg_end_session()有可能在一定情况下销毁dialog。例如,出去的初始INVITE事务没有得到任何回应,因此事务会马上被销毁,造成dialog也被销毁。Dialog的inc/dec锁通过临时增加dialog会话的计数器来避免这个问题,因而在end_session()中dialog不会被销毁。Dialog可能会在dec_lock()方法中销毁。因此正确锁定dialog的顺序应该像这样:

	pj_mutex_lock(dlg->mutex);
	psip_dlg_end_session(dlg,…);
	pj_mutex_unlock(dlg->mutex);

最后,真正使情事变糟的是,锁定的顺序必须正确,否则可能发现死锁。例如,应用程序在dialog中想既锁定dialog,又锁定transaction,应用程序必须在获取transaction锁之前获取dialog锁,否则当另一个线程正在以相反的顺序获取相同dialog和transaction的锁时,死锁将会发生。

1.3.3解决方法(The Relief)

幸运的是,应用程序很少需要直接获取对象的锁。因此几乎不会出现以上所述的问题。

如果可用,应用程序应该使用对象的API 来存取对象。由于会对对象进行检查,对象的API保证加锁的正确性及避免死锁和崩溃的出现。

当一个对象调用应用程序的回调函数时(如dialog和transaction),这此回调函数在对象的锁获取后正常调用,因此应用程序可以安全访问对象的数据结构而不用获取对象的锁。

  首发张文杰的博客:http://zhangwenjie.net(转载请保留,谢谢)(未完待续)

Windows ,

Windows7成微软史上销售最快的系统

2010年1月30日

  Windows7成微软史上销售最快的系统 盈利大幅增长

  微软公布了2010财年第二季度报告显示,截止2009年底微软经历了创纪录的一个季度,营收190.2亿美元,同比增长14%。这都要感谢Windows 7带来的销量刺激。本季度Windows 7副本共卖出6000万份,是微软有史以来销售的最快的产品。微软宣布,操作系统收入85.1 亿美元(增长43%),网络业务收入66.6亿美元(增长60%),每股收益0.74美元(增长57%)。

  微软首席财务官Peter Klein说,Windows 7在增长中占了绝对主要的部分,这将使微软调高日后的收入增长预期。微软首席运营官Kevin Turner则表示“我们为消费者迅速接受Win7和商业上热情的适应Win7感到非常兴奋。”

  截至12月31日的第二财季,微软的净利润为66.6亿美元,每股收益74美分,这一业绩分别较上年同期上涨60%和57%。

  2009年10月22日,微软发布Windows7操作系统,之后,Windows7受到了消费者、企业和媒体的一致好评。2009年11月份,在上市大约两周的时间中,Windows7的市场份额成功地超越苹果“雪豹”操作系统的市场份额。
  2009财年第二财季,微软的净利润为41.74亿美元,每股收益47美分。微软第二财季运营利润为85.13亿美元,上年同期为59.39亿美元。微软第二财季营收为190.2亿美元,较上年同期的166.29亿美元增长14%。微软第二财季业绩超过了市场预期。汤姆路透调查显示,市场分析师此前预计,微软第二财季每股收益为59美分,营收为178.4亿美元。

  查看:微软FY2010Q2财报

   

Windows , , ,

VMware 6.5的一些序列号

2010年1月26日

VMware Workstation 6.5系列虚拟机是大家目前常用的虚拟机。不过,VMware Workstation 6.5系列虚拟机的序列号却不是那么好找。我找到几个,现在分享给大家。希望对大家有帮助。

序列号:

9V8A1-5H34C-80J4U-4P8NQ

T30HW-GHEFG-02H6U-4MXZ7

W30KE-MP20J-A85DG-4WWQ3

YKNF5-DYZ40-A25DY-4PDX7

ALEKR-UHHFD-YA4DV-4Y8N3

EV8Y1-RHKAL-4AHDG-4MDN2

FTJP4-A4Z6W-W0N4Z-4M9Q2

CTXKX-MUW4Y-YA4FZ-4MDN3

PJW6W-YFZ8Z-025FZ-4M8X7

RUN6H-82A8M-404DY-4WXX7

PJ0DW-P2MFJ-D8MDF-4PRXL

2CTK9-EDE6V-42J6A-4MDQL

3080T-W6A85-821FY-4YWZQ

A98UJ-PMCDP-4804Y-4W9Q3

H9DWR-J8267-00MDG-4M8X3

63XPE-AUD07-M0NDY-4YEZL

首发张文杰的博客:http://zhangwenjie.net (转载请保留,谢谢)

Windows , ,

微软确定正式发布Visual Studio 2010和.NET Framework 4的日期

2010年1月15日

  2009年年底微软Visual Studio开发部门高级主管Somasegar宣布,由于受性能问题的影响,微软决定延长Visual Studio 2010和.NET Framework 4的测试阶段,因此原定于2010年3月22日正式发布的Visual Studio 2010和.NET Framework 4将无法如期发布,用户要多等待几周。

  现在微软终于确定了Visual Studio 2010和.NET Framework 4的正式发布日期,微软Visual Studio开发架构师Rob Caron在官方博客中写道:“有一个简短的好消息,Visual Studio 2010和.NET Framework 4将在2010年4月12日周一正式发布。

  微软去年10月份发布了Visual Studio 2010和.NET Framework 4的Beta 2,之后很多用户反映其性能方面存在很多问题,尤其是在一些关键的方面比如虚拟内存使用。为了完全解决存在的性能问题,微软决定延长测试阶段,新增RC候选版本,预计在2010年2月发布。

  Visual Studio 2010包括旗舰版、高级版和专业版。自Visual Studio 2010 Beta 2开始正式启用了新的Logo,其正式版售价也已经确定,完整版Visual Studio 2010售价如下:旗舰版为11924美元、高级版为5469美元、专业版为1199美元;升级版Visual Studio 2010售价分别为:3841美元、2299美元、799美元。

vs2010

Visual Stusio 2010

Visual Studio, Windows , ,