文档库 最新最全的文档下载
当前位置:文档库 › osip编译方法

osip编译方法

osip编译方法
osip编译方法

OSIP协议栈(及eXoSIP,Ortp等)使用入门-- 第一阶段

发布: 2009-6-22 10:03 | 作者: deep3gadmin | 查看: 8次

Linux下oSIP的编译使用应该是很简单的,其Install说明文档里也介绍的比较清楚,本文主要就oSIP在Windows平台下VC6.0开发环境下的使用作出描述。

虽然oSIP的开发人员也说明了,oSIP只使用了标准C开发库,但许多人在Windows下使用oSIP时,第一步就被卡住了,得不到oSIP的LIB库和DLL库,也就没有办法将oSIP使用到自己的程序中去,所以第一步,我们将学习如何得到oSIP的静态和动态链接库,以便我们自己的程序能够使用它们来成功编译和执行我们的程序。

第一阶段:

---------------------------------------

---------------

先创建新工程,网上许多文档都介绍创建一个Win32动态链接库工程,我们这里也一样,创建一个空白的工程保存。

同样,将oSIP2版本3.0.1 src目录下的Osipparser2目录下的所有文件都拷到我们刚创建的工程的根目录下,在VC6上操作:

Project-AddToProject-Files

将所有的源程序和头文件都加入到工程内,保存工程。

这时,我们可以尝试编译一下工程,你会得到许多错误提示信息,其内容无非是找不到osipparser2/xxxxx.h头文件之类。

处理:在Linux下,我们一般是将头文件,lib库都拷到/usr/inclue;/usr/lib 之类的目录下,c源程序里直接写#include 时,能直接去找到它们,在VC里,同样的,最简单的方法就是将oSIP2源码包中的Include目录下的 osipparser2

目录直接拷到我们的Windows下默认包含目录即可,这个目录在VC6的Tool-Options-Directories里设置,(当然,如果你知道这一步,也可以不用拷贝文件,直接在这里把oSIP源码包所在目录加进来就可以了),默认如果装在C盘,目录则为 C:\Program Files\Microsoft Visual Studio\VC98\Include。

这时,我们再次编译我们的工程,顺利编译,生成osipparser2.dll,这时,网上很多文档里可能直接就说,这一步也会生成libs目录,里面里osipparser2.lib文件,但我们

这里没有生成:)

最简单的方法,不用深究,直接再创建一个工程,同上述创建动态链接库方法,创建一个Win32静态链接库工程,直接编译,即可得到osipparser2.lib。

------------------------------------------------------

上面,我们得到了Osip的解析器开发库,下面再编译完整的Osip协议栈开发库,同样照上述方法,分别创建动态链接库工程和静态链接库工程,只是要拷的文件换成src

下的osip目录下文件和include下的osip目录,得到osip2.dll和osip2.lib。

在编译osip2.dll这一步可能会再次得到错误,内容含义是找不到链接库,所以,我们要把前面编译得到的osipparser2.lib也拷到osip工程目录下,并在VC6中操作:Project-Setting-Link中的Object/Library

Modules:

kernel32.lib user32.lib ... xxx.lib之类的内容最后增加: osipparser2.lib 保存工程后再次编译,即可成功编译osip2.dll。

------------------------------------------------------

至此,我们得到了完整的oSIP开发库,使用时,只需在我们的程序里包含oSIP的头文件,工程的链接参数里增加osipparser2.lib和osip2.lib即可。

------------------------------------------------------

下面我们验证一下我们得到的开发库,并大概了解一下OSIP的语法规范。

在VC里创建win32控制台程序工程,将libosip源码包的SRC目录下的Test目录内的C源程序随便拷一个到工程时,直接编译(工程设置里照前文方法在link选项里增加

osip2.lib,osipparser2.lib引用我们之前成功编译得到的静态库文件)就可以运行(带参数运行,参数一般为一个文本文件,同样从Test目录的res目录里拷一个与源文件同名的纯文本文件到工程目录下即可)。

该目录下的若干文件基本上是测试了Osip的一些基本功能函数,例如URI解析之类,可以大概了解一下oSIP的语法规范和调用方法,同时也能校验一下之前编译的OSIP开发库能否正常使用,成功完成本项工作后,可以进入下一步具体的oSIP的使用学习了。

------------------------------------------------------

由于oSIP是比较底层的SIP协议栈实现,新手较难上手,而官方的示例大都是一

些伪代码,需要有实际的例子程序参考学习,而最好的例子就是同样官方发布的oSIP的扩展开发库exosip2,使用exoSIP可以很方便地快速创建一个完整的SIP程序(只针对性地适用于SIP终端开发用,所以我们这里只是用它快速开发一个SIP终端,用来更方便地学习oSIP,要想真正掌握SIP的开发,需要掌握oSIP并熟读RFC文档才行,exoSIP

不是我们的最终学习目的),通过成功编译运行一个自己动手开发出的程序,再由浅入深应该是初学都最好的学习方法通过对使用exosip开发库的使用创建自己的SIP程序,熟悉后再一个函数一个函数地深入学习exosip提供的接口函数,就可以深入理解osip 了,达到间接学习oSIP的目的,同时也能从eXoSIP中学习到正确使用oSIP的良好的编程风格和语法格式。

而要成功编译ExoSIP,似乎许多人被难住了,直接在XP-sp2上,用VC6,虽然你使用了eXoSIP推荐的winsock2.h,但是会得到一个 sockaddr_storage结构不能识别的错误,因为vc6自带的开发库太古董了,需要升级系统的PlatformSDK,下载地址如下:

https://www.wendangku.net/doc/188164832.html,/msdownl ... PSP2FULLInstall.htm(VC6的支持已经停止,这是VC6能使用的最新SDK)

成功安装后编译前需加OSIP_MT宏,以启用线程库,否则在程序中使用eXoSIP库时会出错,而编译时也会得到许多函数未定义的Warning提示,编译得到exosip2.lib供我们使用,当然,在此之前需要成功编译了osip2和osipparser2,而在之后的实际使用时,发现oSIP也需要增加OSIP_MT宏,否则OSIP_MT调用oSIP的线程库时会出错,所以我们需要重新编译oSIP了:),因为eXosip是基于oSIP的(同上方式创建静态和动态链接库工程,并需在Link中手工添加oSIP和oSIPparser的lib库)。

---------------------------------------

---------------

创建新工程,可以是任意工程,我们从最简单的Win32控制台程序开始,为了成功使用oSIP,我们需要引用相关库,调用相关头文件,经过多次试验,发现需要引用如下的库:

exosip2.lib osip2.lib osipparser2.lib WSock32.Lib IPHlpApi.Lib

WS2_32.Lib Dnsapi.lib

其中,除了我们上面编译得到的三个oSIP库外,其它库都是系统库,其中有一些是新安装的PlatformSDK所新提供的。

至此,我们有了一个简单的开发环境了,可以充分利用网上大量的以oSIP为基础的

代码片段和官方说明文档开始具体函数功能的测试和使用了:)

------------------------------------------------------

我们先进行一个简单的纯SIP信令(不带语音连接建立)的UAC的SIP终端的程序开发的试验(即一个只能作为主叫不能作为被叫的的SIP软电话模型),我们创建一个MFC应用程序,对话框模式,照上面的说明,设置工程包含我们上面得到的oSIP的相关开发库及SDK的一些开发库,并且由于默认LIBC的冲突,需要排除MSVCRT[D]开发库(其中D代表Debug模式下,没有D表示Release模式下),直接使用eXosip的几个主要函数就可以创建一个基本的SIP软电话模型。

其主要流程为:

初始化eXosip库-启动事件监听线程-向SIPProxy注册-向某SIP终端(电话号码)发起呼叫-建立连接-结束连接

初始化代码:

int ret = 0;

ret = eXosip_init ();

eXosip_set_user_agent("##YouToo0.1");

if(0 != ret)

{

AfxMessageBox("Couldn't initialize eXosip!\n");

return false;

}

ret = eXosip_listen_addr (IPPROTO_UDP, NULL, 0, AF_INET, 0);

if(0 != ret)

{

eXosip_quit ();

AfxMessageBox("Couldn't initialize transport layer!\n");

return false;

}

启动事件监听线程:

AfxBeginThread(sip_uac,(void *)this);

向SIPProxy注册:

eXosip_clear_authentication_info();

eXosip_add_authentication_info(uname, uname, upwd, "md5", NULL);

real_send_register(30); /* 自定义函数代码请见源码 */

发起呼叫(构建假的SDP描述,实际软电话使用它构建RTP媒体连接):

osip_message_t *invite = NULL; /* 呼叫发起消息体 */

int i = eXosip_call_build_initial_invite (&invite, dest_call, source_call, NULL, "## YouToo test demo!");

if (i != 0)

{

AfxMessageBox("Intial INVITE failed!\n");

}

char localip[128];

eXosip_guess_localip (AF_INET, localip, 128);

snprintf (tmp, 4096,

"v=0\r\n"

"o=josua 0 0 IN IP4 %s\r\n"

"s=conversation\r\n"

"c=IN IP4 %s\r\n"

"t=0 0\r\n"

"m=audio %s RTP/AVP 0 8 101\r\n"

"a=rtpmap:0 PCMU/8000\r\n"

"a=rtpmap:8 PCMA/8000\r\n"

"a=rtpmap:101 telephone-event/8000\r\n"

"a=fmtp:101 0-11\r\n", localip, localip, "9900");

osip_message_set_body (invite, tmp, strlen(tmp));

osip_message_set_content_type (invite, "application/sdp");

eXosip_lock ();

i = eXosip_call_send_initial_invite (invite);

eXosip_unlock ();

挂断或取消通话:

int ret;

ret = eXosip_call_terminate(call_id, dialog_id);

if(0 != ret)

{

AfxMessageBox("hangup/terminate Failed!");

}

可以看到非常简单,再借助于oRTP和Mediastreamer开发库,来快速为我们的SIP软电话增加RTP和与系统语音API接口交互及语音编码功能,即可以快速开发出一个可用的SIP软电话,关于oRTP和Mediastreamer的相关介绍不是本文重点,将在有空的时候考虑增加相应使用教程

第二阶段:

---------------------------------------------------

得到了一个SIP软电话模型后,我们可以根据软电话的实际运行表现(结合用Ethereal抓包分析)来进行代码的分析,以达到利用eXoSIP来辅助我们学习oSIP的最终目的(如要快速开发一个可用的SIP软电话,请至前面提到的论坛去下载使用oRTP和Mediastreamer快速搭建的一个基本完整可用的SIP软电话##YouToo 0.1版本的VC源码工程文件作参考)。

现在从eXosip的初始化函数开始入手,来分析oSIP的使用,这是第二阶段,第三阶段就是深入学习oSIP的源码了,但大多数情况下应该没有必要了,因为在第二阶段就有部分涉及到第三阶段的工作了,而且oSIP的源码也就大多是一些SIP数据的语法解析和状态机的实现,能深入理解了SIP协议后,这些只是一种实现方式,没必要完全去接受,而是可以用自己的方式和风格来实现一套,比如,更轻量化更有适用目的性的方式,oSIP则只起参考作用了。

eXosip_init()是eXosip的初始化函数,我们来看看它的内部实现: 首行是定义的osip_t *osip,这在oSIP的官方手册里我们看到,所有使用oSIP的程序都要在最开始处声明一个osip_t的指针,并使用 osip_init(&osip)来初始化这个指针,销毁这个资源使用osip_release(osip)即可。

我们可以在代码中看到很多OSIP_TRACE,这是调试输出宏调用了函数osip_trace,可以用ENABLE_TRACE宏来打开调试以方便我们开发调试。

其它就是很多的eXosip_t的全局变量eXosip的一些初始化操作,包括最上面的memset (&eXosip, 0, sizeof (eXosip))完全清空和下面的类似https://www.wendangku.net/doc/188164832.html,er_agent = osip_strdup ("eXosip/" EXOSIP_VERSION)的exosip变量的一些初始值设置,其中有一个

eXosip.j_stop_ua = 0应该是一个状态机开关,后面可以看到很多代码检测这个变量来决定是否继续流程处理,默认置成了0表示现在exosip的处理流程是就绪的,即ua是 not stop 的。

osip_set_application_context (osip, &eXosip)是比较有意思的,它让下面的eXosip_set_callbacks (osip)给osip设置大量的回调函数时,能让osip能访问到eXosip 这个全局变量中设置的大量程序运行时交互的信息,相当于我们在VC下开启一个线程时,给线程传入的一个void指针指向我们的MFC应用程序的当前dialog对象实例,可以用void *osip_get_application_context (osip_t * osip)这个函数来取出指针来使用,不过好象exosip中并没有用到它,可能是留给个人自已扩展的吧:)

还能看到初始化代码前面有一段WIN32平台下的SOCK的初始化代码,可以知道eXosip是用的原生的winsock api函数,也就是我们可能以前学过的用VC和WINAPI写sock 程序时(不是MFC),用到的那段SOCK初始代码,还有一段有意思的代码,就是 jpipe()函数,它们返回的是一个管道,一个有2个整型数值的数组(一个进一个出),查看其代码发现,非WIN32平台是直接使用的pipe系统函数,而WIN32下则是用一对TCP的本地SOCK连接来模拟的管道,一个SOCK写一个SOCK读,这段代码是比较有参考价值的:)

j = 50;

while (aport++ && j-- > 0)

{

raddr.sin_port = htons ((short) aport);

if (bind (s, (struct sockaddr *) &raddr, sizeof (raddr)) < 0)

{

OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL,

"Failed to bind one local socket %i!\n", aport));

} else

break;

}

含义即,依次检测50个端口,从static int aport = 10500;即10500~10550端口找出一个可用的本地端口来绑定listen模拟pipe的一对sock。

eXosip_set_callbacks (osip)没有什么好看的,无非是和oSIP官方文档介绍的一样,设置一大堆的回调函数,关键是回调函数的实现,这也是许多初学者使用oSIP被卡壳的主要原因,不知道oSIP构建的程序是怎样跑起来的,随便选几个回调函数看一下eXosip是怎样实现的,有许多是形如下文的函数:

static void

cb_sndbye (int type, osip_transaction_t * tr, osip_message_t * sip)

{

OSIP_TRACE (osip_trace

(__FILE__, __LINE__, OSIP_INFO3, NULL, "cb_sndbye (id=%i)\r\n",

tr->transactionid));

}

即,只是打印一下调试,并没有完整实现什么功能,我们学习时,完全可以用相同的方法,定义一大堆回调函数,并不忙想怎么完全实现,先都是只打印一下调试信息,看具体的应用逻辑根据抓包测试分析和看调试看程序走到了哪一步,调用了哪一个回调,来明白具体回调函数要实现什么用途,再来实现代码就方便多了,当然,如果看透了RFC文档,应该从字面就能知道各个回调函数的用途了,这是后话,不是谁都能快速完全看懂RFC的,所以我们要参考eXosip:)

我们对其中的重要的回调函数进行逐个的分析:

---------------------------

osip_set_cb_send_message (osip, &cb_snd_message) SIP消息发送回调函数这个函数可能是最重要的回调函数之一,消息发送,包括请求消息和回应消息,一般情况下,状态机的状态就是由它控制的,发起一个消息初始化一个状态机,回应一个消息对状态机修改,终结消息发送结束状态机……

看cb_snd_message的函数实现,要以发现,其主要代码是对参数中的要发送的消息osip_message_t * sip进行分析,找出消息要发送的真实char *host,int port的值(这些参数可以省略,但要发送消息肯定需要host和port,所以要从sip中解析),最后根据sip中解析出的传输方式是TCP还是 UDP选择最终进行消息发送处理的函数

cb_udp_snd_message,cb_tcp_snd_message处理(它们的参数一致,即本函数只是补全一些省略的参数并对消息进行合法性检查)。

**毕竟eXosip是一个通用的开发库,它考虑了要支持TCP,UDP,TCPs,IPV4,IPV6,

WIN32,*nix,WINCE等等多样化的复杂环境,所以,我们可以略过我们暂时不需要的部分,比如,IPV6相关的代码实现等。

由于我们大多数情况下SIP是用的UDP,所以先来看一下cb_udp_snd_message的实现,它从全局变量exosip中获取可用的 sock,并尽最大能力解析出host和port(??难道前面的函数还不够解析彻底??如最终仍无port信息则默认设置为5060),使用

osip_message_to_str (sip, &message, &length)函数将要发送的格式化的SIP消息转换成能用SOCK传输的简单数据并发送即完成消息发送,代码中有许多复杂的环境探测和错误控制等等等等,我们可以暂时不用过多关注,可以继续向下,结尾处有一个keeplive相关代码,从代码字面分析,可能是SIP的Register消息的自动重发相关代码,可以在后面再细化分析。

cb_tcp_snd_essage的函数实现要比上文的udp的实现简单很多,主要是环境探测错误控制方面,因为毕竟tcp是稳定连接的,对比一下代码,可以看到主要流程还是将SIP消息转换后,发送到从SIP消息中解析出的host和port对应的目标。

看完两个函数,可以知道,eXosip需要有两个sock,是一个数组,0是给UDP用的,1是给TCP用的,要用SOCK当然要初始化,就是下文要介绍的eXosip的网络相关的初始化了,上面的exosip_init可以看成是这个开发库的系统初始化吧:)至些,我们应该知道了oSIP开发的SIP应用程序的消息是从哪里发出的吧,对了,就是从这个回调函数里,所谓万事开头难,就象开发WIN32应用程序时,找到了WIN32程序的main函数入口下面的工作就好办了,下面就都是为一些事件消息开发对应的处理函数而已了:)

osip_set_kill_transaction_callback事务终结回调函数

对应ICT,IST,NICT,NIST客户/服务器注册/非注册事务状态机的终结,

主要是使用osip_remove_transaction (eXosip.j_osip, tr)将当前tr事务删除,再加上一系列的清理工作,其中,NICT即客户端的非Invite事务的清理比较复杂一些,要处理的内容也比较多,可以根据实际应用的情况进行有必要的清理工作:)

cb_transport_error 传输失败处理回调

对应于上面说到的四种事务状态机,如果它们在处理时失败,则在这时进行统一处理。

从代码可知,只是在NOTIFY,SUBSCRIBE,OPTION操作失败才进行处理,其它错误可直接忽略。

osip_set_message_callback 消息发送处理回调

根据type不同,表示不同的消息发送状态

OSIP_XXX_AGAIN 重发相关消息

OSIP_ICT_INVITE_SENT 发起呼叫

OSIP_ICT_ACK_SENT ACK回应

OSIP_NICT_REGISTER_SENT 发起注册

OSIP_NICT_BYE_SENT BYE发出

OSIP_NICT_CANCEL_SENT Cancel发出

OSIP_NICT_INFO_SENT,OSIP_NICT_OPTIONS_SENT,OSIP_NICT_SUBSCRIBE_SENT,OSIP_NICT_NOTIFY_SENT,OSIP_NICT_UNKNOWN_REQUEST_SENT

我们可以看到,eXosip没有对它们作任何处理,我们可以根据自己需要,比如,重发2xx消息前记录一下日志之类的,扩展一下retransmission的处理方式,发起Invite前记录一下通话日志等等。

OSIP_ICT_STATUS_1XX_RECEIVED uac收到1xx消息,一般是表示对端正在处理中,这时,主要是设置一下事务状态机的状态值,并对会话中的osip的一些参数根据返回值进行相应设置,里面有许多条件判断,但我们常用的一般是100,180,183的判断而已,暂时可以忽略里面复杂的判断代码。

OSIP_ICT_STATUS_2XX_RECEIVED uac收到2xx消息,这里主要跟踪一下Register情况下的2xx,表示注册成功,这时会更新一下exosip的注册字段值,以便让eXosip能自动维护uac的注册,BYE的2xx回应是终结消息,Invite的2xx回应,则主要是初始化一下会话相关的数据,表示已成功建立连接。

其它4xx,5xx,6xx则分别是对应的处理,根据实现情况进行概要的查看即可。

report_event (je, sip)是代码中用来进行事件处理的一个函数,跟踪后发现,其最终

是使用了我们上文提到的jpipe管道,以便在状态机外实时观测状态机内的处理信息。

OSIP_NIST_STATUS_XXX_SENT即对应于上面的uac的处理,这里是uas的对应的消息处理,相比较于uac简单一点。

前面简单介绍了一下大量的回调函数及它们的概要处理逻辑,可能会比较混乱,暂时不用管它,只需要记得一个大概的形象,知道一个SIP处理程序是通过

osip_set_cb_send_message回调函数来实现真实地发送各种SIP消息,并且SIP的标准事务模型是由oSIP实现好了,我们只需要给不同的事务状态设置不同的回调处理函数来处理事务,具体的状态变化和内部逻辑不用管就可以了。

下面来说一下消息处理回调函数用到的SOCK的初始化函数,即我们上面说的除了系统初始化外的网络初始化函数eXosip_listen_addr:

从上文知道了,系统将初始化两个SOCK,一个UDP一个TCP,但查看代码发现还有第三个,TCPs的,但好象还不能实用,现在不管它,代码首先是根据传输是UDP还是TCP来设置对应的数组值,并且如果没有提供IP地址和端口号,系统会自动取出本机网络接口并创建可用的SOCK(http_port 的方式暂不用考虑)。

SOCK初始化后,如何开始SIP事务的呢?看到这个调用eXosip.j_thread = (void *) osip_thread_create (20000, _eXosip_thread, NULL),对的,这里启用了一个线程,即,eXosip是调用oSIP的线程函数(没用系统提供的线程函数,是为了跨平台)进行事务处理的状态机逻辑是在一个线程中处理的,这样就明白了为什么一直没能看到顺序执行下来的程序启动代码了,接下去看,线程实际处理函数是_eXosip_thread,这里面的代码中,我们看到了上文提到的状态机控制开关变量while (eXosip.j_stop_ua == 0),即,当j_stop_ua设置为1时,osip_thread_exit ()结束事务处理即程序终结,再接下去看,_eXosip_execute是最终的处理函数了,而且它在程序未终结情况下是一直逻辑在执行,注意,要启用oSIP的多线程宏OSIP_MT。

看到_eXosip_execute的代码中有很多时间函数和变量,仔细看,除去一些控制代码,主要处理函数是eXosip_read_message (1, lower_https://www.wendangku.net/doc/188164832.html,_sec, lower_https://www.wendangku.net/doc/188164832.html,_usec),即取出消息,1表示只取出一条消息,其代码量非常的大,但同样的,其中也许多的控制代码和错误检测代码,我们在查看时可以暂时忽略掉它们。

eXosip_read_message读取消息时,即没有采用sock的block也没有用非block方式,

而是采用了select方式,具体应用可查询fd_set相关文档。

根据jpipe_read (eXosip.j_socketctl, buf2, 499),我们可以估计,buf2中应该是保存的我们的控制管道的数据,具体作用至些还没有表现出来,应该是用来反映一些状态机内部的警示之类的信息,实际的SIP的处理的状态机的数据是存放在buf中,使用

_eXosip_recvfrom获取的,获取后sipevent = osip_parse (buf, i)解析,使用

osip_find_transaction_and_add_event (eXosip.j_osip, sipevent)来查询事件对应的事务状态机,找到后就如同其注解所说明的,/* handled by oSIP ! */,即我们上文设置的那一大堆回调函数,至此,我们知道了整个SIP应用所处理的大概流程了。

如果没有找到事务状态机呢?直接丢弃吗?不是的,如果这是一个回应消息,但没有事务状态机处理它,那它是一个错误的,要进行清理后才能丢弃,而如果是一个请求,那更不能丢弃了,因为UAS事务状态机要由它来启动创建的(回应消息表示本地发出了请求消息,即UAC行为,事务状态机应是由启动UAC的代码初始化启动的),整个逻辑应该是很简单的,但eXosip的实现代码却非常多,可见其花了非常多的精力在保证会话的稳定性和应付网络复杂情况上,我们可以对其进行大量的精简来构建满足我们需求的代码实现。

先来看错误的回应消息的处理函数eXosip_process_response_out_of_transaction,

可以看到其代码就是一大堆的赋值语句,XXX= NULL,即将一大堆的运行时变量清空,再调用osip_event_free清空事件,或者就是一些复杂的情况下,需要通过解析现在的运行时数据,从中分析出“可能”的正在等待回应的对端,并发送相关终结通知消息等等,可以根据实际需要进行简化。

请求事件的处理 eXosip_process_newrequest,首先是对事件进行探测,

MSG_IS_INVITE、MSG_IS_ACK、 MSG_IS_REQUEST……,对事件进行所属状态机分类,随后使用_eXosip_transaction_init (&transaction,(osip_fsm_type_t) tx_type,eXosip.j_osip, evt->sip)根据探测结果进行状态机初始化,实际调用的是osip_transaction_init,初始

化后即将事件入状态机 osip_transaction_add_event (transaction, evt),由状态机自动处理后调用相应回调函数处理逻辑了。当然,eXosip为方便快速开发SIP终端应用,在下面又添加了许多自动化的处理代码,来和我们在回调函数中设置的处理代码相区分。

线程调用的事件处理函数代码最后是

if (eXosip.keep_alive > 0)

{

_eXosip_keep_alive ();

}

这段代码印证了上文提到了,keep_alive是用来设置是否自动重新注册,由

_eXosip_keep_alive函数来实现自动将eXosip全局变量中保存的注册消息解析后自动根据需要重新向SIP服务器发起Register注册。

同样,因为注册消息发起是UAC的行为,将它放在这里,可以看出来所有事件消息的事务状态机处理都是在这里,只不过这里只创建UAS的事务状态机,UAC的事务状态机的创建则要继续到下面找了,从我们的YouToo软电话代码中可知,发起呼叫和发起注册分别调用了 eXosip_call_send_initial_invite,eXosip_register_send_register这两个函数(另外用到的两个build函数则是分别构建这两个send函数要发送的SIP消息),查看这两个函数可知,UAC的事务处理状态机是在这里进行初始化的。

eXosip_register_send_register中可以看到是_eXosip_transaction_init

(&transaction, NICT, eXosip.j_osip, reg)初始化UAC状态机,实际也同UAS是调用的osip_transaction_init函数,同样使用 osip_transaction_add_event (transaction, sipevent)将事件入状态机,状态机随后将自动处理调用相应回调函数处理逻辑了。

另有osip_new_outgoing_sipmessage(reg),表示发送消息,到这里,我们应该可以理解,真实的发送操作,是要到由状态机处理后,调用了消息发送回调函数才真正地将注册消息发送出去的。

同注册消息发送,它是NICT状态机,呼叫消息的发送是ICT,由

eXosip_call_send_initial_invite处理,_eXosip_transaction_init (&transaction, ICT, eXosip.j_osip, invite)初始化了状态机,之前还有一个eXosip_call_init是用来初始化eXosip的一些参数的,暂时不管它,同样 osip_new_outgoing_sipmessage (invite)发送

呼叫消息,但实际还是要状态机处理后调用消息发送回调函数真实发送呼叫请求函数的,osip_transaction_add_event (transaction, sipevent)则标准地,将事件入状态机,状态机将能处理随后的应用逻辑调用相应的回调函数了。

好了,作了这么多的分析,我们了解了eXosip是怎样调用oSIP来形成被我能方便地再次调用的了,可以看到,为了实现最大限度的跨平台和兼容性,代码中有大量的测试代码,宏定义和错误再处理代码,看起来非常吃力,但了解了其主要的调用框架:初始化,回调函数设置,UAC和UAS事务处理状态机的启动,事件处理流程等,就可以基本明白了oSIP各个函数的主要作用和正确的用法了,下一步,可以参考eXosip来针对某个应用,去除掉大量暂时用不到的代码,来构建一个简单的SIP软电话和SIP服务器,来进一步深入oSIP学习应用了。

文中的platform SDK包到

https://www.wendangku.net/doc/188164832.html,/softdown/3344520.asp?id=38&url=1下载。记住VC6要在tools->options->directories 中的include files,executable files,Library files 的 VC6自带目录前面加入SDK的目录。

编辑新闻稿的几种技巧

新闻中的白描语言 写作技巧 新闻写作中,为了增强写作的可阅读性,常常会使用白描语言,也就是描写性的语言。 举例:美国《时代》(Time) 杂志中的一则关于邓小平访美的新闻中有这样一段:“正像礼宾程序要求的那样,上个星期,中国国歌在白宫南草坪上鸣奏(play)起来了。然后美国陆军军乐团演奏(perform)了美国国歌《星条旗》。在相互致词(deliver)之后,两国领导人登上(step on)一个阳台,向一千名鼓掌欢迎的来宾致意(greet) 。突然邓小平一反常规,他紧紧抓住(hold tight)卡特总统(Jimmy Carter)的手,高举(hold high) 起来。” 为了使用白描语言,我们一般要这样: 多用子概念。 譬如,生活水平——食物——肉类——鱼肉——鲍鱼 天气很热——气温高达38度, 受到热烈欢迎——掌声持续达10分钟之久 举例:美联社条例:不要去说“华莱士神经紧张”。要这样:在一次40分钟的飞行中间,他嚼了21根口香糖,他洗了一副牌,数了数,又洗了一遍。他看了看头上和脚下的云彩,系紧安全 带,又把它松开了。 但是,由于白描语言本身的具体性和画面感使得有时文章显得过于灵活,对于初学新闻写作的人来说显得很有难度,尤其是这些往往是在外宣中使用,所以要注意学习这种语言的使 用。 对“五段新闻法”的再认识 写作技巧 此前,我们专门介绍过对外宣传中的“五段新闻法”。作为对外宣传中的一个比较简介的新闻写作方法来讲,很有必要引起我们的重视。但是在实际的运用过程中还有一些东西要引起我们的 注意: 1.不是所有的新闻都能使用这种方法,因为这种方法一般在社会新闻中使用,往往由于富于现 场感而通过一定的描写来增强可读性和吸引力。 2.对于很多我们涉及的新闻,类似于三段叙述式的写法仍然是一个更常用的东西。我们在实际 写作中还是要大量的使用叙述式的新闻写法,这一点要引起注意。 3.在区分是否使用“五段新闻法”的过程中,我们要有自己的体会,此前我们也有专门的稿子可以 模仿,现在要告诉大家的就是要注意区分什么时间使用,什么时间不用。 4.有的时间看到同学们写的外宣稿,采用直接引语时,人物既不具有新闻性,话语也平淡无

20个代码生成框架

20个代码生成框架 11.1 CodeSmith http: 官方论坛: http: 版权形式:30天试用 开源:否需要先注册确认后才能下载 1.2 MyGenerator MyGenerator是又一个国外很不错的代码生成工具,有人觉得比CodeSmith 简单、好用。 所有api可以在帮助菜单中找到。 http: 官方论坛: 版权形式: 免费 开源:否 1.3 NHibernate. http: 官方论坛: 版权形式:

免费 开源:否 1.4湛蓝.Net代码生成器 http: 官方论坛: http: 版权形式: 免费 开源:否 1.5动软.NET代码自动生成器 一款人气很旺的免费C#代码生成器 http: 官方论坛: 版权形式: 免费 开源:否 1.6 CodePlus 专为sql server c#语言设计的代码生成器,功能还是很强大http: 官方论坛:

版权形式: 需要少量的注册费用 开源:否下载地址很神秘 1.7 CodeMaker http: 官方论坛: 版权形式: 免费 开源:否 https://www.wendangku.net/doc/188164832.html,代码生成器 可以使用本工具生成https://www.wendangku.net/doc/188164832.html,和C#语言的代码,以及三层架构与ORM架构代码,并且使用的ORM持久化组件是开源的,您可以在本软件的安装目录下找到它 官方论坛: 版权形式: 免费 开源:否 1.9 BMW业务模型及代码生成器 一款人气很旺的免费C#代码生成器

官方论坛: 版权形式: 免费 开源:否 1.10飞鹰CoolCoder 专门为采用nhibernate做关系对象影射架构的系统提供代码的工具,简单易用,虽然不提供源码,我们可以用反编译工具对其反编译看源码。这是个很不错的学习机会。 官方论坛: 版权形式: 免费 开源:否 1.11 AutoCoder自动代码生成器 AutoCoder自动代码生成器是一个根据模板自动生成代码的代码生成工具,根据模板的不同,可以生成任何语言(如: ASP、C#、C++BUILDER、DELPHI、JAV A、JSP、PHP、V B、https://www.wendangku.net/doc/188164832.html,……),不同层次结构(B/S、C/S、n-tiger……),基于不同数据库(ORACL E、MSSQL、MYSQL、

osip编译方法

OSIP协议栈(及eXoSIP,Ortp等)使用入门-- 第一阶段 发布: 2009-6-22 10:03 | 作者: deep3gadmin | 查看: 8次 Linux下oSIP的编译使用应该是很简单的,其Install说明文档里也介绍的比较清楚,本文主要就oSIP在Windows平台下VC6.0开发环境下的使用作出描述。 虽然oSIP的开发人员也说明了,oSIP只使用了标准C开发库,但许多人在Windows下使用oSIP时,第一步就被卡住了,得不到oSIP的LIB库和DLL库,也就没有办法将oSIP使用到自己的程序中去,所以第一步,我们将学习如何得到oSIP的静态和动态链接库,以便我们自己的程序能够使用它们来成功编译和执行我们的程序。 第一阶段: --------------------------------------- --------------- 先创建新工程,网上许多文档都介绍创建一个Win32动态链接库工程,我们这里也一样,创建一个空白的工程保存。 同样,将oSIP2版本3.0.1 src目录下的Osipparser2目录下的所有文件都拷到我们刚创建的工程的根目录下,在VC6上操作: Project-AddToProject-Files 将所有的源程序和头文件都加入到工程内,保存工程。 这时,我们可以尝试编译一下工程,你会得到许多错误提示信息,其内容无非是找不到osipparser2/xxxxx.h头文件之类。 处理:在Linux下,我们一般是将头文件,lib库都拷到/usr/inclue;/usr/lib 之类的目录下,c源程序里直接写#include 时,能直接去找到它们,在VC里,同样的,最简单的方法就是将oSIP2源码包中的Include目录下的 osipparser2 目录直接拷到我们的Windows下默认包含目录即可,这个目录在VC6的Tool-Options-Directories里设置,(当然,如果你知道这一步,也可以不用拷贝文件,直接在这里把oSIP源码包所在目录加进来就可以了),默认如果装在C盘,目录则为 C:\Program Files\Microsoft Visual Studio\VC98\Include。 这时,我们再次编译我们的工程,顺利编译,生成osipparser2.dll,这时,网上很多文档里可能直接就说,这一步也会生成libs目录,里面里osipparser2.lib文件,但我们

新闻编辑管理办法(2013修订)

新闻网站编辑管理办法 一、总则 为保证网站健康运行,保证百度收录效果,鼓励编辑高效工作,特制定此考核办法。即日起施行。 二、考核制度 (1)编辑以分数考核工作量,当月分数构成为基本分+加分项-减分项。 当月基本分为225分,基本工资:1800元;每分以8元计算当月工资。 值班分为周末及法定节假日值班补分,每天补10分,未完成任务不补分。 (2)补助: 餐费:20元/天,按工作日天数计算 交通费:10元/天,按工作日天数计算 (3)主编与副主编分别考核30分、10分,视当月表现决定是否给予奖励或扣除。 三、工作时间 正常班8:30-17:30 早班7:00-16:00 午休11:30-12:30

四、要闻值班制度 编辑为当天网站头条、官方微博、青岛新闻、各栏目头条的第一责任人,应统筹当天青岛新闻、制作头题、维护官方微博。 下班后,值班编辑也需随时留意青岛及全国重大新闻,如有突发事件,应第一时间电话通知内容部主任,并上新闻、发布微博,如果记者部调配记者采访,应协助准备资料。 五、栏目更新时效要求 1.青岛新闻:13,焦点图:3,话题:5 2.企业:10,蓝色商讯:10,蓝色硅谷:5,青岛世园:3 3.综合:5,楼市:3,车市:3,美食:3,教育:3, 旅游:3,图片汇:1。 总计: 7:00-9:30,青岛13+话题5+焦点图3=21条 9:30-11:30,企业10+商讯10+硅谷5=25条 12:30-17:00,世园3+综合5+楼市等16=24条 4.首先录重点新闻,审核后立刻添加到“栏目碎片”及“山东半岛蓝色经济区”碎片; 首页头条碎片最多添加一条山东网青岛频道的曝光(挑重点),不可全为负面新闻,剩余两个碎片分别添加不同新闻源的时事新闻。5.“青岛通讯社”每天更新10条微博

网页新闻编译的原则与技巧

网页新闻编译的原则与技巧 文章详细论述了把汉语网页新闻编译成英语网页新闻时所要遵循的原则与技巧,分别阐述了英语网页新闻标题、新闻电头、新闻导语及其新闻主体编译时应遵循的原则,希望网页新闻编译工作能正规化,国际化。 标签:编译标题电头导语 1 概述 当今社会经济快速发展,中国已经成为全球第二大经济强国,因而有关中国的一切事情,无论是政治、经济等各个领域备受世人关注。目前中国已经有China Daily,Global Times等几家英文报纸让世界了解中国,除此之外网络也成为外界了解中国的重要途径,但由于中西方文化差异以及中西方新闻写作范式的差异等原因,要把汉语新闻编译成英语新闻或者把汉语网页新闻编译成适合西方读者阅读的英语网页新闻,就必须遵循英语网页新闻编写的原则和技巧,这样才可以做一个合格的新闻编译人员,才能提高新闻的关注度和兴奋点。 2 网页新闻编译的原则和技巧 2.1 英语网页新闻标题的行文规范 新闻标题(题目)是用精辟的词语,对新闻内容和中心思想富有特色的浓缩和概括,网络新闻的标题具有揭示新闻内容,评价新闻内容,索引选择信息和说明报道形态的功能。俗话说:“看书看皮,看报看题”,这句俗语很好的诠释了一个好的标题对于新闻的重要性。美国知名的民意调查公司盖洛普所做的一项联合调查研究表明:44%的读者去网站浏览新闻都是先浏览新闻标题,然后决定是否继续来阅读这则消息。因而新闻标题只有足够吸引读者才能激起读者继续浏览网页的兴趣,才能提高新闻的关注度和兴奋点,所以一定要选好新闻标题。当然英语新闻标题有其自身的写作原则和范式,把汉语网页新闻编译成英语新闻时要严格遵循这些原则和范式。 2.1.1 英语新闻标题的写作原则 和汉字相比较而言,英文字长,所占空间大,因此英语新闻标题用字必须节省空间,为了节省空间,英语新闻标题往往在语法方面大做文章,尽量使用有实质内容的字词,能省则省;尽量使用熟词,避免使用花哨的词藻;尽量用具体的词汇而不是使用抽象词语。常见的规则如下: ①英语新闻标题大量使用较短的词语,如下例: Palestinians Blast Israel For Not Implementing UN Resolution

语料库常用统计方法

3.5语料库常用统计方法 第3章前几节对语料库应用中的几种主要技术做了介绍。通过语料检索、词表和主题词表的生成,可以得到一定数量的句子、词汇或结构。为能更好说明所得到的结果的真正意义,常常需要对它们加以统计学分析。本章主要介绍语料分析中的一些常用统计方法。 3.5.1 语料库与统计方法 介绍相关统计方法之前,首先需要了解为什么语料库应用中需要运用统计方法。在2.1节讲到文本采集时,我们知道文本或会话构成了最终的语料库样本。这些样本是通过一定的抽样方法获得的。研究中,我们需要描述这些样本的出现和分布情况。此外,我们还经常需要观察不同语言项目之间在一定语境中共同出现(简称共现)的概率;以及观察某个(些)语言项目在不同文本之间出现多少的差异性。这些需要借助统计学知识来加以描写和分析。 理论上说,几乎所有统计方法都可以用于语料库分析。本章只择其中一些常用方法做一介绍。我们更注重相关统计方法的实际应用,不过多探讨其统计学原理。这一章我们主要介绍语料分析中的频数标准化(normalization )、频数差异检验和搭配强度的计算方法。 3.5.2 频数标准化 基本原理 通常语料检索、词表生成结果中都会报告频数(frequency, freq 或raw frequency )。那么某词(如many )在某语料库中出现频数为100次说明什么呢?这个词在另一个语料库中出现频数为105次,是否可以说many 在第二个语料库中更常用呢?显然,不能因为105大于100,就认定many 在第二个语料库中更常用。这里大家很容易想到,两个语料库的大小未必相同。按照通常的思维,我们可以算出many 在两个语料库中的出现百分比,这样就可比了。这种情况下,我们是将many 在两个语料库中的出现频数归到一个共同基数100之上,即每100词中出现多少个many 。这里通过百分比得到的频率即是一种标准化频率。有些文献中标准化频率也称归一频率或标称频率,即基于一个统一基准得出的频率。 实例及操作 频数标准化,首先需要用某个(些)检索项的实际观察频数(原始频数,raw frequency )除以总体频数(通常为文本或语料库的总词数),这样得到每一个单词里会出现该检索项多少次。在频数标准化操作中,我们通常会在此基础上乘以1千(1万、1百万)得到平均每千(万、百万)词的出现频率。即: 1000?=总体频数 观测频数标准化频率(每千词) (注:观测频数即检索词项实际出现的次数;总体频数即语料库的大小或总形符数。) 例如,more 在中国学生的作文里出现251次,在英语母语者语料中出现475次。两个语料库的大小分别为37,655词次和174,676词次。我们可以根据上面的公式很容易计算出251和475对应的标准化频率。另外,我们还可以利用Excel 或SPSS 等工具来计算标准化频率。比如,可以将实际观察频数和语料库大小如图3.5.1输入相应的单元格,然后在C1单元格里输入=(A1/B1)*1000即可得到中国学生每千词使用more 约为6.67次。要得到母语

会议新闻的剪辑方法

会议新闻的剪辑方法 会议新闻是电视台新闻栏目中必不可少的重要内容之一,党和政府召开的各类会议,是新闻报道中不可或缺的题材和内容。这些会议,特别是重要会议,往往包含着群众关心,非常希望看到的信息和新闻。作为把握时代脉搏、反映时代进程的新闻媒体,作为党和人民喉舌的新闻媒体,搞好会议报道既是自己的义务,也是义不容辞的职责。事实上,很多社会关注的重大新闻出自会议报道,受众对与国计民生紧密相关的政策法规的了解更是出自于会议报 道。能不能用受众喜闻乐见的形式,及时、准确、生动地把党委、政府的声音传达到基层干部群众中去;能不能通过生动活泼的会议报道把基层干部、群众想了解的内容传达出去,是衡量新闻报道水平的一个重要标准。 现在改革会议新闻的呼声很高,措施已经在各个电视台的新闻栏目中实施。如何让会议更有看头,更吸引广大电视观众的眼球,我个人觉得画面是关键之一。 电视新闻是以现代电子技术为传播手段,以图像、声音、文字为传播符号,对新近发生或正在发生的事实的报道。电视新闻最大的优点在于其视觉上的直观性,能够将新闻现场直接呈现在屏幕上,最大限度地让观众感受到新闻的真实感。所以会议新闻画面的重要性就凸显出来了。

会议新闻的画面稳、丰富和搭配连接合理都能够达到意想不到的效果。下面,我就从几个方面来谈谈会议新闻画面的剪辑方法。 会议新闻图像的一般剪辑方法 1.主席台领导镜头的剪辑主席台领导镜头的剪辑要突出主要领导。主席台前排主要领导可根据排次采用单个特写镜头进行连接,其他领导可根据排次选用固定双人、三人图像左、右对称或向右、向左摇镜头连接。这样的编辑方式对于介绍出席会议的领导显得十分实用。一条片子可根据时间的长度来确定编辑主席台领导镜头的次数。一般三四分钟片长的新闻出两次,五六分钟片长的新闻出三次。每次编辑领导镜头时,都要尽量选用不同神态和姿势拍摄得好的镜头,一是避免镜头的重复使用、二是树立了领导的形象。 2.主要领导讲话镜头的剪辑剪辑主要领导讲话的镜头时,首先应选用拍摄神态好的、正面的领导讲话特写镜头,并保持一定的长度。这里也可以用拉镜头,即在主要领导讲话的固定镜头达到一定长度时逐渐拉开,同时介绍其他主要领导。以后领导讲话的镜头的剪辑,根据新闻稿的内容和长度来确定,可以选用固定、推、拉等方式的侧面或正面的镜头。

STM8S开发环境编译方法

STM8S开发环境搭建IAR For STM8 标签:STM8SSTM8S-Discovery IAR 2013-12-29 15:593139人阅读评论(0) 收藏举报分类: STM8S单片机(3) 作者同类文章X 版权声明:本文为博主原创文章,未经博主允许不得转载。 /* ********************************************************************************************************************** ************ * Name : STM8S开发环境搭建IAR For STM8 * Author : MingMing * Release : 2013/12/29 * Update : 2013/12/29 * E-mail : clint.wang@https://www.wendangku.net/doc/188164832.html, ********************************************************************************************************************** ************ */ 本文采用的是STM8S-Discovery开发板,开发板上半部分为ST Link调试器,芯片采用的是STM32F103C8,下半部分是STM8S105C6的开发板。

对于STM8的开发环境,主要采用两种,一种是IAR For STM8,另一种是官方的ST Toolset。ST Toolset中包含了两个工具STVD(ST Visual Develop)和STVP(ST Visual Programmer)。STVD是一款开发工具,它自身并没集成编译器,因此需要安装第三方编译器Cosmic。STVP 是一款烧录工具,它支持.hex .s19 .sx三种文件的烧录,对IAR编译出的.hex文件的烧录我们就不用太担心了。 下载IAR For STM8 1.3.1(IAR Embedded Workbench for STMicroelectronics STM8 1.31)并安装。 下载ST Toolset 4.3.2并安装(在这里安装它,只为了使用它的STVP烧录工具)。 如果想采用官方的开发环境,可以下载Cosmic并安装。 环境安装完毕后,就可以连接开发板到你的PC机了,如果连接OK的话,那么你的电脑会多出一个盘符,30M左右的大小,里面包含几个网址,想了解更多的同学可以去逛一逛。 打开STVP烧录工具,按照图中的方法来配置。 打开一个.hex文件。

新闻编辑要点

新闻编辑知识要点 新闻编辑工作与媒介形态变化 1、新闻编辑作为一种职业,是在新闻媒介产生以后才出现的。随着新闻传播的发展,报纸,新闻性杂质,报道新闻的广播、电视、网站依次都有了专职的新闻编辑。 2、新闻编辑业务伴随着媒介形态的变化而发展,报纸新闻编辑的原理和规范为后来各类新媒介的新闻编辑业务奠定了基础,新媒介的编辑特点是总是在汲取传统媒介的编辑经验中衍生出来的,而且这种特点后来还会反过来影响传统媒介的编辑业务改革。 新闻编辑工作内容及其流程 1、负责新闻采访编辑工作的组织机构是编辑部,编辑部内有“采编合一”与“采编分离”两种不同的分工模式,也有媒介混合采用这两种模式。 2、新闻编辑的工作种类按管辖范围和责任大小划分,有总编辑、编辑部主任、版面编辑、版式编辑、新闻编辑、校对等;按业务程序划分,有日班新闻编辑、夜班新闻编辑、内务编辑;按编辑内容的专业划分,可分为政治编辑、文教编辑、经济编辑、体育编辑等。 3、新闻编辑工作是新闻编辑在新闻媒介产品生产过程中所进行的一系列工作。新闻编辑工作的内容包括:新闻信息载体设计、新闻报道的策划与组织、新闻作品的修正与把关、新闻信息的整合与展示、新闻互动与公共交流的组织与引导。 4、新闻编辑工作流程是将新闻媒介由创办伊始至产品问世作为一个完整的生产周期,新闻编辑在这一周期中各项工序的安排程序。 5、报纸编辑工作流程图:确定报纸的编辑方针;设计报纸结构、规模和风格;设计报纸的各个版和专栏;策划、组织当前的新闻报道;分析、选择稿件;修改稿件;制作标题;配置稿件;设计版面;校正、签发。(接受信息反馈、处理信息) 媒体融合进程中新闻编辑部的变化 , 1、世纪之交,西方媒体集团的一些改革实验表明,传统的新闻媒体力图通过与新媒体的融合,将其内容优势转化成市场利润。在集中和融合的媒体集团中,不同的媒体可以通过某种流程控制实现资源重整,利用各自的介质差异,在新闻信息传播上实现资源共享而又产品各异,联手做大区域市场,并且在这一市场上占据垄断地位。 2、我国媒体融合正在经历由“互动”到“一体”的递进式发展过程。“报网互动”是报纸与网站作为两个相互独立的媒体进行合作。“报网一体”是报纸与网站的整体融合。

20个代码生成框架

20个代码生成框架 1 1.1 CodeSmith 一款人气很旺国外的基于模板的dotnet代码生成器 官方网站:http://https://www.wendangku.net/doc/188164832.html, 官方论坛:http://https://www.wendangku.net/doc/188164832.html,/default.aspx 版权形式:30天试用 开源:否 需要先注册确认后才能下载 1.2 MyGenerator MyGenerator是又一个国外很不错的代码生成工具,有人觉得比CodeSmith简单、好用。 所有api可以在帮助菜单中找到。 官方网站:http://https://www.wendangku.net/doc/188164832.html,/portal/default.aspx 官方论坛: 版权形式:免费 开源:否 1.3 NHibernate. NHibernate是Hibernate公司在Java自动生成领域取得巨大成功后推出的一款ORM工具. 官方网站:http://https://www.wendangku.net/doc/188164832.html,/ 官方论坛: 版权形式:免费 开源:否 1.4 湛蓝.Net代码生成器

一款基于软件自动生成理念,能直接生成应用的dotnet代码生成器 官方网站:http://https://www.wendangku.net/doc/188164832.html, 官方论坛:http://https://www.wendangku.net/doc/188164832.html,/ 版权形式:免费 开源:否 1.5 动软.NET代码自动生成器 一款人气很旺的免费C#代码生成器 官方网站:http://https://www.wendangku.net/doc/188164832.html, 官方论坛: 版权形式:免费 开源:否 1.6 CodePlus 专为sql server c#语言设计的代码生成器,功能还是很强大 官方网站:http://https://www.wendangku.net/doc/188164832.html, 官方论坛: 版权形式:需要少量的注册费用 开源:否 下载地址很神秘 1.7 CodeMaker asp,jsp,php代码生成工具,自动生成维护数据库信息的动态网页的代码生成器。它可以帮助ASP、JSP、PHP开发人员快速的开发简单的数据库维护程序。无需任何编码,只需将数据库结构导入到CodeMaker中并做简单的设置,CodeMaker即可生成完整的数据库操作页面。用CodeMaker可以简单快速的创建网站后台维护程序。提高开发效率数十倍以

新闻编辑知识要点

新闻编辑知识要点

新闻编辑知识要点 新闻编辑工作与媒介形态变化 1、新闻编辑作为一种职业,是在新闻媒介产生以后才出现的。随着新闻传播的发展,报纸,新闻性杂质,报道新闻的广播、电视、网站依次都有了专职的新闻编辑。 2、新闻编辑业务伴随着媒介形态的变化而发展,报纸新闻编辑的原理和规范为后来各类新媒介的新闻编辑业务奠定了基础,新媒介的编辑特点是总是在汲取传统媒介的编辑经验中衍生出来的,而且这种特点后来还会反过来影响传统媒介的编辑业务改革。 新闻编辑工作内容及其流程 1、负责新闻采访编辑工作的组织机构是编辑部,编辑部内有“采编合一”与“采编分离”两种不同的分工模式,也有媒介混合采用这两种模式。 2、新闻编辑的工作种类按管辖范围和责任大小划分,有总编辑、编辑部主任、版面编辑、版式编辑、新闻编辑、校对等;按业务程序划分,有日班新闻编辑、夜班新闻编辑、内务编辑;按编辑内容的专业划分,可分为政治编辑、文教编辑、经济编辑、体育编辑等。 3、新闻编辑工作是新闻编辑在新闻媒介产品生产过程中所进行的一系列工作。新闻编辑工作的内容包括:新闻信息载体设计、新闻报道的策划与组织、新闻作品的修正与

编辑方针的具体内容包括:媒介的受众对象、新闻传播的内容、传播的水准和媒介的风格特色。 新闻产品设计(重点) 1、新闻产品设计,是对媒介产品中以传播新闻为主要职能的组成部分的设计,包括确定新闻产品在整个媒介产品中的位置和比重,以及进一步设计新闻产品中的每一个组成部分。 2、新闻产品设计是一种集体性的创造活动,也是一项难度极大的系统工程,运行过程包括设计预备阶段、方案设计阶段和方案试行阶段。 3、新闻产品设计需要注意的问题是:充分的占有信息并准确的分析信息,保证新闻产品设计的合理性和可行性;在可行性与超前性之间找到平衡点;产品设计应该与采编机制改革同步;正确处理借鉴与创新、变革与稳定的关系。新闻报道策划及其主要类型(重点) 1、新闻报道策划是新闻编辑通过对新闻资源的开发与配置,实现最佳传播效果的创造性活动。新闻报道策划的主要内容包括:选题决策、报道方案设计、在报道实施过程中接受反馈并修正设计方案。 2、新闻报道策划本质上是主客观相结合的产物,它应遵循的原则是:取信原则、创新原则、变通原则、实效原则、可行原则。

汉英新闻编译

汉英新闻编译 New Writing in English Based on Information in Chinese 新闻:新近发生的事实的报道(时效性,客观性) 对外新闻:中国新闻机构发布的以国外读者为对象的有关中国的新闻 特点:①明确的针对性和目的性 ②采用西方读者的思维方式和写作方法 ③国家主导 汉英新闻编译:按照既定的编辑方针,以中文稿件(信息)为基础,集英语新闻写作、翻译、编辑于一体 翻译:信、达、简、雅 写作:西方新闻写作模式(“倒金字塔”、直接引语、段落句子短、一段一个意群) 编辑:确定主题①、事实取舍→符合外交政策和对外宣传方针 导语②、选取材料③(支持主题,避免重复) 提供背景介绍、解释或起过渡性作用的字词句段④ 选题:按新闻报道规律:有关、有用、有趣(冲击力、冲突性、显要度、时效性) 按党的宣传方针:有利于国家的正面形象、有利于营造良好的国际舆论环境 按外国读者的需要:我国政治、经济大局,环境、灾祸、民族宗教问题…… 选材:强有力的支持主题 导语分类:直接披露新闻人物 延后披露新闻人物 总结性 多成分 第二人称导语 编译:遵循主题;包含新闻要素;SVO结构;“今天”相关;言简意赅;提供来源主体编译:

引语:新闻中记述的人的言论 分类:直接引语——引号内的忠实于讲话人语言和思想的话 现场感、真实性 间接引语——没有引号,新闻人物所讲的主要意思 节省文字和篇幅 部分引语——直接引语+间接引语 用词:said(可反复使用),added,went on,continued 头衔:党政双重身份使用行政职务;优先采用技术专家的言论再考虑行政职务高者的言论 背景和解释:涉及新闻中why和how的问题 新闻标题:对新闻内容与中心思想富有特色的浓缩和概括 特点:①新闻的重要组成部分 ②标题表达编辑的方针主张与政治倾向 ③用语凝练,言简意赅,涵义深邃 英文标题:①简短,明显的政治宣传 ②一行,有时两行(主题+副题;引题+主题),注重虚词(系助动词、连接词、冠词)的省略 ③现在式表过去,不定式表将来,动名词表进行 编译原则:主动语态、用词准确简单语义丰富、SVO结构避免重复、符合主题、慎重缩写、注意标点(英文标题单引号,中文标题双引号) 优秀编译稿件的八项标准 1.标题简短,一语中的,能提示全文,启示读者,吸引受众 2.导语言简意赅(<30words)提示全文,有实质内容,有新闻来源,引人入胜 3.“倒金字塔”体例。主体部分新闻事实扎实丰富,材料紧扣主题。写作层次分明,重要的新闻事实排在前面,转折过渡自然得当 4.必要的背景和解释 5.用事实说话。记者编译者不在新闻中阐发个人见解 6.新闻中要有“人”,要善于使用直接引语,三种方式引语混合使用。 7.篇幅、句子、段落较短,一句一段,一段一意。SVO结构,多动作动词,少用副词形容词。多用短的简单词汇。 8.立意清新,朴实无华,给读者美的享受。

语料库

关于语料库的三点基本认识:语料库中存放的是在语言的实际使用中真实出现过的语言材料;语料库是以电子计算机为载体承载语言知识的基础资源;真实语料需要经过加工(分析和处理),才能成为有用的资源; 在语言学中,语料库(Corpus)指大量文本的集合,库中的文本(称为语料)通常经过整理,具有既定的格式与标记,特指计算机存储的数字化语料库。 语料库是语料库语言学研究的基础资源,也是经验主义语言研究方法的主要资源。应用于词典编纂,语言教学,传统语言研究,自然语言处理中基于统计或实例的研究等方面。 分类 语料库有多种类型,确定类型的主要依据是它的研究目的和用途,这一点往往能够体现在语料采集的原则和方式上。有人曾经把语料库分成四种类型:(1)异质的(Heterogeneous):没有特定的语料收集原则,广泛收集并原样存储各种语料;(2)同质的(Homogeneous):只收集同一类内容的语料;(3)系统的(Systematic):根据预先确定的原则和比例收集语料,使语料具有平衡性和系统性,能够代表某一范围内的语言事实;(4)专用的(Specialized):只收集用于某一特定用途的语料。 除此之外,按照语料的语种,语料库也可以分成单语的(Monolingual)、双语的(Bilingual)和多语的(Multilingual)。按照语料的采集单位,语料库又可以分为语篇的、语句的、短语的。双语和多语语料库按照语料的组织形式,还可以分为平行(对齐)语料库和比较语料库,前者的语料构成译文关系,多用于机器翻译、双语词典编撰等应用领域,后者将表述同样内容的不同语言文本收集到一起,多用于语言对比研究。目前已经累积了大量各种类型的语料库,如:葡萄牙语种树库、面向文本分类研究的中英文新闻分类语料库、路透社文本分类训练语料库、中文文本分类语料库、大开放字幕库OpenSubtitles的多语言平行语料数据(OpenSubtitles Corpus)、《圣经》双语语料库("Bible" bilingual corpus)、Short messages service(SMS ) corpus(短消息服务(SMS)语料)等。 特征 语料库有三点特征 1.语料库中存放的是在语言的实际使用中真实出现过的语言材料,因此例句库通常不应算作语料库; 2.语料库是承载语言知识的基础资源,但并不等于语言知识;

编译方法实验报告模板

编译方法实验报告 东北大学软件学院 2006年4月

一、实验目的 熟悉算术表达式的语法分析与中间代码生成原理。 二、实验内容 (1) 设计语法制导翻译生成表达式的四元式的算法; (2) 编写代码并上机进行调试运行 三、实验原理及基本步骤 1.递归子程序: (1) 算术表达式文法 G(E):E →E ω0 T | T T →T ω1 F | F F →i | (E) (2) 文法变换 G’(E) E →T {ω0 T} T →F {ω1 F} F →i | (E) (3) 属性翻译文法: E →T {ω0“push(SYN, w)” T “QUAT”} T →F {ω1“push(SYN, w)” F “QUAT”} F →i “push(SEM, entry(w))” | (E) 2.LL(1): (1) 算术表达式文法 G(E):E →E ω0 T | T T →T ω1 F | F F →i | (E) (2) 文法变换 G’(E) E -> T E` E` ->ω0 T E` | e T -> F T` T` ->ω1F T` | e F -> i | ( E ) (3) 属性翻译文法: E -> T E′① E′-> +T {GEQ(+)} E′②| -T {GEQ(-)} E′③| e④ T -> F T′⑤ T′-> *F {GEQ(*)} T′⑥| /F {GEQ(/)} T′⑦| e⑧ F -> i {PUSH(i)} ⑨| ( E ) ⑩ (4) LL(1): 分析表:

四、数据结构设计 1. 递归子程序: 数据结构:SYN —算符栈; SEM —语义栈; 2. LL(1): 五、关键代码分析(带注释)及运行结果

新闻编辑的方法及注意事项

新闻编辑 面对越来越庞大的海量信息和越来越多的同质新闻,新闻编辑不仅要成为信息的“把关人”和“控制者”,还要成为信息的“加工者”和“整合者”,其策划、整合、取舍新闻的能力和作用,以及各项沟通协调能力都显得越来越重要。那么,怎样才能培养高素质的新闻编辑人才呢? 新闻编辑要有高度的政治敏感性 新闻编辑发布的信息较之其他类型的编辑所发布的信息具有覆盖面广、即时性强、信息量大等特点。新闻编辑在发布信息时,稍有不慎,发布不应发的信息,或者出现某种政治纰漏,将会造成相当大的负面影响。这就要求新闻编辑必须在思想上,要有高度的政治责任感,不断强化自己的政治责任意识,提高自己的思想政治素质。特别是在有关政治的新闻报道时,政治的敏感性更是不可缺少。 新闻编辑要有高度的职业道德感 我们要求新闻稿件真实、公正、及时,就得要求新闻编辑诚实、公正、与时俱进。编辑要有事业心、责任感和职业道德,要兢兢业业,甘为他人作嫁衣,精心编稿,精心做题,精心排版,一心扑在工作上,老老实实做人,认认真真办事——这就是诚实。不保守,敢于创新,支持记者写好稿,扶持新人走正道,努力贴近读者需求,坚持正确的舆论导向,紧紧跟上时代步伐——这就是与时俱进。不要因为经济上的诱惑而丧失做一个新闻编辑应有的职业道德感,新闻编辑是要为人民大众说话的,是人民大众的表达思想的“中介人”,而不能只成为有钱人的“发言人”,成为经济的傀儡。 为做到诚实、公正、与时俱进,新闻编辑要提高自身的职业道德。职业道德高则报纸长盛不衰,备受欢迎;职业道德低则报纸起伏波动,备受责难。要一直保持很高的职业道德,实际做起来很不容易。但这是考验新闻编辑是否成熟的一块试金石。 新闻编辑要提高自身的文化素质

语料库的应用(最终)

语料库的应用 语料库方法广泛应用于语言学理论研究、军事等领域。当代语料库语言学(以语料库方法为取向的研究语言的分支就被称为语料库语言学)已是高歌猛进,日新月异,新的语料库更是层出不穷,经过科学选材和标注,具有适当规模的语料库能够反映和记录语言的实际使用情况,人们通过语料库观察和把握语言事实,分析和研究语言系统的规律,极大地方便了语言研究者。 军事语料库对信息化条件下的军事斗争具备潜在价值,积极开展军事语料库的研究和建设实践活动,并把研究成果转化到实战之中。和平时期对信息化高科技武器的建设不可小视,对战场态势的综合信息捕捉、把握和利用的能力建设至关重要,但对身边已有的各类信息的综合收集和利用也同样不可忽视。军事语料库的建设正是针对实现信息化战争中争夺与占有信息资源、获取不对称的战争中的信息掌握和信息利用的不对称优势。 【一】、语料库成为语言学理论研究的基础资源 语料库是计算语言学的基础。语料库对应的英文是corpus,复数形式为corpora。这个词既可以指语料也可以表示语料库。英国语言学专家戴维?克里斯特尔认为,语料库“指收集的一批语言学数据,或为书面文本或为言语录音的转写,可用作语言学描写的出发点,也

可作为验证语言假说的手段。计算机语料库是一大批机器可读文本的结集。各种为不同目的而建立的语料库可以应用在词汇、语法、语义、语用、语体研究,社会语言学研究,口语研究,词典编纂,语言教学以及自然语言处理、人工智能、机器翻译、言语识别与合成等领域。 起初语料库主要用于语言学研究,而且建成的语料库多为通用语料库,服务的研究领域主要集中于词典编纂、词语搭配与结构、基于平行语料库的英汉互译、文学作品和作家语言风格的研究以及基于语料库的外语教学研究等。随着研究的不断深入,各种专业领域语料库也相继建立,语料库的应用研究逐渐扩大到其他学科。 我国在语料库的应用上还处于起步阶段,在计算语言学和语言信息处理领域,语料库主要用来为统计语言模型提供语言特征信息和概率数据,在语言研究的其他领域,多使用语料的检索和频率统计结果。 目前国外已建成且较有影响的主要为以下的语料库:美国:布朗大学的今日美国英语标准语料库(The Brown University Standard Corpusof Present Day American English)、兰卡斯特一奥斯陆/卑尔根语料库(The Lancast-er-Oslo/Bergen (LOB) Corpus)、英语语库(TheBank of English)、英国国家语料库(The BritishNational Corpus(BNC、伦敦一隆德语料库(Lon-don -Lund Corpus(LLC》、美国传统中介语料(American Heritage Intermediate(AHI) Corpus)以及英语国际语料库(The Intemational Corpus ofEnglish(ICE》等。

新闻编译

新闻英语是一门时间性很强的学问,有自身的特点,主要表现在四个方面,即“快”、“新”、“俗”和“广”所谓“快”,是指某一新事物或新概念的表达能很快地在当代报刊中出现,比如“爱心活动”(love outreach), ―民工潮”(sudden influx of migrant laborers), ―环保型汽车‖ (environmentally friendly car; eco-friendly car), ―技术入股”(contribute one’s technology to become a shareholder), ―双赢”(win-win)等词语的英语表达,首先都是见诸英语报刊新闻,这是传统教科书和一般词典所望尘莫及的。 所谓“俗”,指新闻英语通俗易懂、简洁明快,有别于诸如科技英语、体育英语、经贸英语等较深奥费解的各类“行业英语”。 新闻写作ABC原则: A—Accuracy 力求报道内容的精确性 B—Brevity 语言文字的简洁度 C—Clarity 语句结构上的清晰感 至于“广”这一特点,是指新闻英语所涉及的体裁很广。

消息报道、特写文章、新闻评论、小品文、天气预报、广告等等 英文News一词是由new通过构词法中的附加法,在后面加s 派生出来的。这里的new 的英文意义是“新发生的”、“初次的”、“新鲜的”、“新颖的”,其共核为一个“新”字,而“新”正是新闻报道的一个关键要素。 1、News is a fresh report of events, facts, or opinions that people did not know before they read your story. 新闻就是针对人们读你的报道之前所未知的事件、事实或观点的一种全新报道。 3、News is any event, idea or opinion that is timely, that interests or affects a large number of people in a community and that is capable of being understood by them. 新闻是指人们能及时获悉的事件、观点或见解,它能吸引或影响社会上的许多人,并能为他们所理解。4、says it is. News is full and current information made available to an audience. 新闻是向受众所提供的完整且及时的信息。

美篇常见使用问题.doc

美篇常见使用问题 1、如何分享文章? 文章正文底部点击分享按键即可选择需要的分享平台。目前可分享渠道包含:微信好友、微信群、朋友圈、微博、QQ、QQ空间、其它。2、文章分享到微信后,如何关闭标题前显示的昵称? 点击“我的”页面左上角齿轮符号,选择“通用设置—分享标题含昵称”,将此项开关关闭后,分享的缩略框即不再显示昵称。 3、文章如何投稿? 打开需要投稿的文章,正文底部点击“分享——我要投稿上美篇首页”,选择专题或圈子,点击右侧的“投稿”按钮即可。目前一篇文章只能投稿一次,且每7天只可投一次。 4、如何修改已经发布的文章? 在需要修改的文章正文界面,右击右上角“操作——编辑”,即可重新调整文章内容,修改后请及时发布。 5、文章标题如何居中? 文章标题暂时不支持手动居中操作,建议更换为标题居中展示模板。目前多数模板都是支持标题居中展示的,可根据需要选择添加。 6、如何修改文章权限? 文章正文的右上角点击“操作——文章设置——谁可以看”,即可调整文章阅读权限。 目前可设置的权限类型为:1公开(所有人可见,且录入个人专栏); 2、不公开(自信控制分享范围,仅被分享的人可见); 3、加密(设

置一个密码,凭密码访问);4、私密(仅自己可见)。 7、如何让文章自动播放? 文章编辑完成后点击“下一步——模板”,选择动态模板后完发布,文章就可以以自动播放的形式展示。 8、如何开启水印? 点击“我的”页面左上角齿轮符号,选择“通用设置——图片水印”,打开后再发文。老文章的图片不会自动生成水印,需要把老文章复制一篇,新复制的文章就会显示水印了。 9、如何修改文章的显示日期? 美篇文章目前还不支持修改日期,文章默认每一次编辑的时间,如需要显示最新的日期,需把文章复制一篇,复制的副本显示当天的日期。 10、如何复制文章? 在文章正文界面,点击右上角的“操作——复制”,复制成功后新文章以草稿形式存大,可点击进入正文,编辑调整后发布文章。 11、如何删除文章? 目前删除文章分为两种方式: 1、打开文章,点击右上角的“操作——删除”; 2、“我的——全部文章”页面,安卓手机长按文章点击删除。 3、注:删除后的文章在“回收站”内,回收站的文章支持手动恢复,安卓手机长按文章点击“恢复” 12、如何删除评论? 删除评论只能在客户端内操作,目前仅以下两种情况可删除:

新闻编辑处理稿件的原则和方法

龙源期刊网 https://www.wendangku.net/doc/188164832.html, 新闻编辑处理稿件的原则和方法 作者:崔吉廷 来源:《科教导刊·电子版》2015年第10期 摘要进入21世纪以来,社会文化事业迅猛发展,新闻报道作为文化建设的重要组成部分之一,是百姓获取资讯信息的主要途径,其受到的关注度自然较高。面对新闻事业进一步改革的新趋势,新闻编辑人员在处理稿件时,一定要坚持科学的原则,重视处理方法的选取。在追求稿件真实、公正的基础上,提升稿件的报道意义,完善新闻价值。为了切实达到这一目标,本文就结合我国新闻编辑处理稿件的实际情况,简单阐述一下如何做好稿子的处理工作,坚持正确原则的使用,找到科学方法对新闻实施处理,为我国新闻事业的进一步发展奠定坚实的基础。 关键词新闻编辑稿件处理原则有效方法 中图分类号:G222.1 文献标识码:A 众所周知,新闻报道和资讯内容的好坏,不仅由报道内容决定,稿件的处理原则和处理方法以及编辑人员的工作能力也是提高稿件价值的重要指标。想要提高稿件的真实性,凸显新闻的重要价值,我国新闻编辑人员一定要坚持科学的工作原则,不断提升自身素质,以优秀的工作作风实施正确作业。本文就结合我国新闻传播的实际情况,谈谈如何做好稿件处理工作,以科学的方法实现新闻内容的传播,促进稿件质量的提升。 1新闻编辑处理稿件时必须具备的技巧与能力 1.1新闻敏感度 优秀的新闻编辑所要具备的重要能力之一就是新闻敏感度,新闻之所以能够称之为新闻,其区分于一般信息的最重要的能力就是新闻敏感度。敏感度有时是与生俱来的,是对新闻价值的准确判断,编辑人员要在众多稿件中选取最具价值的新闻稿件进行报道,对信息进行筛选、提炼和整合,及时找到百姓身边最有意义的新闻,传递最具价值的内容,提升稿件传递能力。 1.2扎实的岗位功底 新闻编辑人员每天与文字打交道,他们应具备良好的专业功底和扎实的岗位能力。具体而言要具有流利的表达水平,能够将内心的想法和所要表达的情感通过文字进行传达。此外,还要具有高端的审美力、对现场实施有效控制、实现思维扩散,根据报道内容的不同做好稿件类型的选取工作,并逐步提升评价能力,对稿件进行精确处理,夯实岗位基础。 1.3新闻素养和编辑素养

相关文档