<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; 开放源代码</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/category/open-source/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Mon, 06 Feb 2012 03:24:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>HTML5之Web Storage</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/12/26/html5web-storage/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/12/26/html5web-storage/#comments</comments>
		<pubDate>Mon, 26 Dec 2011 04:00:27 +0000</pubDate>
		<dc:creator>章政</dc:creator>
				<category><![CDATA[Android 开发]]></category>
		<category><![CDATA[Blog Challenge]]></category>
		<category><![CDATA[全国博客大奖赛]]></category>
		<category><![CDATA[全国大学生软件创新大赛专栏]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[图形和视觉计算]]></category>
		<category><![CDATA[并行计算]]></category>
		<category><![CDATA[开放源代码]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[移动技术]]></category>
		<category><![CDATA[英特尔® 软件网络 2.0]]></category>
		<category><![CDATA[英特尔信息技术峰会]]></category>
		<category><![CDATA[虚拟化技术]]></category>
		<category><![CDATA[软件开发工具]]></category>
		<category><![CDATA[软件技术学习及认证]]></category>
		<category><![CDATA[高校博客大奖赛]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/12/26/html5web-storage/</guid>
		<description><![CDATA[WebStorage的出现是为了弥补cookie的不足,cookie一方面是容量小，4k/8k，存几个电子邮件都不够，二来是全局的，容易被误用，盗用。 在HTML5中网络存储按照生命周期分为2种，一种是基于会话(session),这种存储周期只是当前会话，当网页[注1]被关被后，或者被转到其他网站后，存储也就被销毁； sessionStorage.varName = “生成新变量”; sessionStorage.varName = “变量操作”; delete sessionStorage.varName; //删除变量 另外一种是本地存储，当网页下次被打开的时候，你仍然可以访问上次打开该网页时存储的数据，比如本地存储的网站用户名就可以使用这种方式。 用法和基于会话的存储一样，只是前缀名改成了localStorage localStorage.varName = “生成新变量”; localStorage.varName = “变量操作”; delete localStorage.varName; //删除变量 从上面可以看出web storage其实也只是解决了轻量级的数据存储问题，如果是大量的数据查询，比如商品列表，还是得靠数据库,HTML5中有Web Database来支持这一操作，基本操作和SQL一致。 注1：现在的浏览器基本都支持多窗口了，一个窗口对应一个网页 注2：官方参考]]></description>
			<content:encoded><![CDATA[<p>WebStorage的出现是为了弥补cookie的不足,cookie一方面是容量小，4k/8k，存几个电子邮件都不够，二来是全局的，容易被误用，盗用。<br />
在HTML5中网络存储按照生命周期分为2种，一种是基于会话(session),这种存储周期只是当前会话，当网页[注1]被关被后，或者被转到其他网站后，存储也就被销毁；</p>
<pre name="code" class="js">
sessionStorage.varName = “生成新变量”;
sessionStorage.varName = “变量操作”;
delete sessionStorage.varName;  //删除变量
</pre>
<p>另外一种是本地存储，当网页下次被打开的时候，你仍然可以访问上次打开该网页时存储的数据，比如本地存储的网站用户名就可以使用这种方式。<br />
用法和基于会话的存储一样，只是前缀名改成了localStorage</p>
<pre name="code" class="js">
localStorage.varName = “生成新变量”;
localStorage.varName = “变量操作”;
delete localStorage.varName;  //删除变量
</pre>
<p>从上面可以看出web storage其实也只是解决了轻量级的数据存储问题，如果是大量的数据查询，比如商品列表，还是得靠数据库,HTML5中有Web Database来支持这一操作，基本操作和SQL一致。<br />
注1：现在的浏览器基本都支持多窗口了，一个窗口对应一个网页<br />
注2：<a href="http://dev.w3.org/html5/webstorage/">官方参考</a></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/12/26/html5web-storage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ICC 编译 Google Mock 和 Google Test 的问题</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/12/23/icc-google-mock-google-test/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/12/23/icc-google-mock-google-test/#comments</comments>
		<pubDate>Fri, 23 Dec 2011 05:56:52 +0000</pubDate>
		<dc:creator>Hao Jiang (Intel)</dc:creator>
				<category><![CDATA[开放源代码]]></category>
		<category><![CDATA[软件开发工具]]></category>
		<category><![CDATA[12.1]]></category>
		<category><![CDATA[C++ TR1]]></category>
		<category><![CDATA[Google Mock]]></category>
		<category><![CDATA[Google Test]]></category>
		<category><![CDATA[Intel C++]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/12/23/icc-google-mock-google-test/</guid>
		<description><![CDATA[最近发现 Google Test (Google C++ Testing Framework 的非正式称谓) 非常受欢迎，很多公司的研发团队都在使用它编写 C++ 测试案例。其中包括著名的 Chromium project (熟悉Chrome 浏览器和操作系统的，对这个名字一定不会陌生)，国内不少基于 C++ 的大型项目在测试中也会经常使用它。 Google Test 跨平台的好处不用多说，单是简单易用，就能极大提高编写测试案例的效率。与此相关，Google的工程师们还提供了另外一个开源项目 Google C++ Mocking Framework (简称 Google Mock)， 它也是基于 Google Test的。 如果我们当前的工程已经使用 Intel C++ 编译器作为缺省的编译器，此时加入基于 Google Mock 或者 Goolge Test 编写的测试代码时，可能会发现如下的编译错误信息： /usr/local/include/gmock/internal/gmock-generated-internal-utils.h(70): error: name followed by "::" must be a class or namespace name struct MatcherTuple&#60; [...]]]></description>
			<content:encoded><![CDATA[<p>最近发现 Google Test (Google C++ Testing Framework 的非正式称谓) 非常受欢迎，很多公司的研发团队都在使用它编写 C++ 测试案例。其中包括著名的 Chromium project (熟悉Chrome 浏览器和操作系统的，对这个名字一定不会陌生)，国内不少基于 C++ 的大型项目在测试中也会经常使用它。</p>
<p>Google Test 跨平台的好处不用多说，单是简单易用，就能极大提高编写测试案例的效率。与此相关，Google的工程师们还提供了另外一个开源项目 Google C++ Mocking Framework (简称 Google Mock)， 它也是基于 Google Test的。</p>
<p>如果我们当前的工程已经使用 Intel C++ 编译器作为缺省的编译器，此时加入基于 Google Mock 或者 Goolge Test 编写的测试代码时，可能会发现如下的编译错误信息：</p>
<blockquote><p>/usr/local/include/gmock/internal/gmock-generated-internal-utils.h(70): error: name followed by "::" must be a class or namespace name<br />
  struct MatcherTuple&lt; ::std::tr1::tuple &gt; {<br />
                              ^<br />
/usr/local/include/gmock/internal/gmock-generated-internal-utils.h(70): error: expected an identifier<br />
  struct MatcherTuple&lt; ::std::tr1::tuple &gt; {<br />
                                         ^<br />
/usr/local/include/gmock/internal/gmock-generated-internal-utils.h(70): error: expected an identifier<br />
  struct MatcherTuple&lt; ::std::tr1::tuple &gt; {<br />
                                           ^<br />
…<br />
compilation aborted for UnitTest/xxxTestSuite.cpp (code 4)</p></blockquote>
<p>这类错误产生的原因，其实在于上诉 Google Mock 自身的代码需要编译器能够提供对 C++ Technical Report 1  (简称 TR 1) 标准扩展 的支持。注意，TR1 只是 C++ Library Extensions。</p>
<p>而 Intel C++ 编译器从 2011 年 8 月发布的版本 <strong>C++ Composer XE 2011 update 6</strong> (也就是常说的 12.1 版本) 起，开始正式对 TR1的支持，特别是支持编译 gcc 或者 MSVC 提供的有关 TR1 的头文件。 当然在编译的时候，还请务必要添加选项 <strong>–std=C++0x</strong> 来激活 Intel 编译器对标准扩展的支持。</p>
<p>所以简单地说，如果发现错误消息中包含类似 ::std::tr1 这类的，估计多半是还在使用比较早期的版本，例如 11.x，10.x 等等。 请尽早升级到最新的编译器版本，同时使用 –std=c++0x 吧。</p>
<p>附录：<br />
1) Google C++ Testing Framework: http://code.google.com/p/googletest/<br />
2）Google C++ Mocking Framework: http://code.google.com/p/googlemock/<br />
3）C++ Technical Report 1 (TR1): http://en.wikipedia.org/wiki/C%2B%2B_Technical_Report_1<br />
C++ Technical Report 1 (TR1) is the common name for ISO/IEC TR 19768, C++ Library Extensions, which was a document proposing additions to the C++ standard library for the C++03 language standard. The additions include regular expressions, smart pointers, hash tables, and random number generators.<br />
4) Intel Software Network Knowledge Base (KB): http://software.intel.com/en-us/articles/some-gcc-headers-will-not-compile-due-to-use-of-c0x-variadic-templates/</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/12/23/icc-google-mock-google-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux 多线程编程 之 信号量互斥同步</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/12/02/linux-3/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/12/02/linux-3/#comments</comments>
		<pubDate>Fri, 02 Dec 2011 09:10:48 +0000</pubDate>
		<dc:creator>zhongguo</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[开放源代码]]></category>
		<category><![CDATA[移动技术]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/12/02/linux-3/</guid>
		<description><![CDATA[  本文在上一篇的基础上进一步说明，Linux下多线程编程的互斥与同步。上一篇实现线程之间同步采用了互斥锁，同步采用条件变量，本文将说明如何使用信号量实现线程之间的互斥与同步。互斥锁只有0，1两中状态，适合于线程对共享资源的独占访问，很多时候每个资源可以同时被有限的线程访问，此时互斥锁将无法满足；条件变量同步也同样存在这种问题。信号量实际是一种非负整型计数器，可以很好的控制线程之间资源访问，互斥锁能实现的功能，信号量同样可以。 信号量控制资源共享主要是PV原语操作， PV原语是对整数计数器信号量sem的操作。一次 P操作使 sem减一，而一次 V操作使sem 加一。进程（或线程）根据信号量的值来判断是否对公共资源具有访问权限。当信号量sem 的值大于等于零时，该进程（或线程）具有公共资源的访问权限；相反，当信号量 sem的值小于零时，该进程（或线程）就将阻塞直到信号量 sem的值大于等于 0 为止。 Linux 实现了POSIX 的无名信号量，主要用于线程间的互斥同步。这里主要介绍几个常见函数。 · sem_init用于创建一个信号量，并能初始化它的值。 · sem_wait和sem_trywait相当于P操作，它们都能将信号量的值减一，两者的区别在 于若信号量小于零时，sem_wait将会阻塞进程，而 sem_trywait则会立即返回。 · sem_post相当于V操作，它将信号量的值加一同时发出信号唤醒等待的进程。 · sem_getvalue用于得到信号量的值。 · sem_destroy用于删除信号量。 所需头文件 #include 函数原型 int sem_init(sem_t *sem,int pshared,unsigned int value) sem：信号量 pshared：决定信号量能否在几个进程间共享。由于目前Linux还没有实现进程间共享信号量，所以这个值只能够取0 value：信号量初始化值 函数返回值 成功：0 ，出错：-1 所需头文件 #include 函数原型 int sem_wait(sem_t *sem) int sem_trywait(sem_t *sem) int sem_post(sem_t *sem) [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p>本文在上一篇的基础上进一步说明，Linux下多线程编程的互斥与同步。上一篇实现线程之间同步采用了互斥锁，同步采用条件变量，本文将说明如何使用信号量实现线程之间的互斥与同步。互斥锁只有0，1两中状态，适合于线程对共享资源的独占访问，很多时候每个资源可以同时被有限的线程访问，此时互斥锁将无法满足；条件变量同步也同样存在这种问题。信号量实际是一种非负整型计数器，可以很好的控制线程之间资源访问，互斥锁能实现的功能，信号量同样可以。</p>
<p>信号量控制资源共享主要是PV原语操作， PV原语是对整数计数器信号量sem的操作。一次 P操作使 sem减一，而一次 V操作使sem 加一。进程（或线程）根据信号量的值来判断是否对公共资源具有访问权限。当信号量sem 的值大于等于零时，该进程（或线程）具有公共资源的访问权限；相反，当信号量 sem的值小于零时，该进程（或线程）就将阻塞直到信号量 sem的值大于等于 0 为止。</p>
<p>Linux 实现了POSIX 的无名信号量，主要用于线程间的互斥同步。这里主要介绍几个常见函数。<br />
· sem_init用于创建一个信号量，并能初始化它的值。<br />
· sem_wait和sem_trywait相当于P操作，它们都能将信号量的值减一，两者的区别在 于若信号量小于零时，sem_wait将会阻塞进程，而 sem_trywait则会立即返回。<br />
· sem_post相当于V操作，它将信号量的值加一同时发出信号唤醒等待的进程。<br />
· sem_getvalue用于得到信号量的值。<br />
· sem_destroy用于删除信号量。<br />
所需头文件 #include</p>
<p>函数原型 int sem_init(sem_t *sem,int pshared,unsigned int value)<br />
sem：信号量<br />
pshared：决定信号量能否在几个进程间共享。由于目前Linux还没有实现进程间共享信号量，所以这个值只能够取0<br />
value：信号量初始化值<br />
函数返回值 成功：0 ，出错：-1</p>
<p>所需头文件 #include<br />
函数原型<br />
int sem_wait(sem_t *sem)<br />
int sem_trywait(sem_t *sem)<br />
int sem_post(sem_t *sem)<br />
int sem_getvalue(sem_t *sem)<br />
int sem_destroy(sem_t *sem)<br />
函数传入值 sem：信号量<br />
函数返回值 成功：0 ，出错：-1</p>
<p>从上面函数来看，实现线程之间同步信号量比互斥锁使用起来相对容易一些，操作简单，容易理解，适用范围广。</p>
<p>下面上一篇的问题用信号量来实现，线程使用部分没变，主要改变了对资源的控制方式：（代码本人亲自编译通过）</p>
<p>view plaincopy to clipboardprint?<br />
01.#include<br />
02.#include<br />
03.#include<br />
04.#include<br />
05.#include<br />
06.#include<br />
07.<br />
08.int g_Flag = 0;<br />
09.sem_t sem_mutex; // 用于互斥<br />
10.sem_t sem_syn; // 用于同步<br />
11.<br />
12.void *thread1( void *arg );<br />
13.void *thread2( void *arg );<br />
14.int main()<br />
15.{<br />
16. pthread_t tid1, tid2;<br />
17. int rc1, rc2;<br />
18.<br />
19. sem_init( &amp;sem_mutex, 0, 1 );<br />
20. sem_init( &amp;sem_syn, 0, 0 );<br />
21. printf( " Inter main !\n" );<br />
22.<br />
23. rc2 = pthread_create( &amp;tid2, NULL, thread2, NULL );<br />
24. if( rc2 != 0 )<br />
25. printf( " %s, %d \n", __func__, strerror( rc2 ) );<br />
26.<br />
27. rc1 = pthread_create( &amp;tid1, NULL, thread1, &amp;tid2 );<br />
28. if( rc1 != 0 )<br />
29. printf( " %s, %d \n", __func__, strerror(rc1) );<br />
30. printf( " Leave main!\n\n" );<br />
31.<br />
32. sem_wait( &amp;sem_syn ); // 同步等待，阻塞<br />
33. exit( 0 );<br />
34.}<br />
35.<br />
36.void *thread1( void *arg )<br />
37.{<br />
38. pthread_t *ptid = NULL;<br />
39. printf( " Enter thread1\n" );<br />
40. printf( " thread1 id: %u, g_Flag: %d \n", ( unsigned int )pthread_self(), g_Flag );<br />
41.<br />
42. if( sem_wait( &amp;sem_mutex ) != 0)<br />
43. {<br />
44. perror(" pthread1 sem_mutex\n");<br />
45. }<br />
46.<br />
47. if( g_Flag == 2 )<br />
48. sem_post( &amp;sem_syn );<br />
49. g_Flag = 1;<br />
50.<br />
51. if( sem_post( &amp;sem_mutex ) != 0)<br />
52. {<br />
53. perror( "pthread1 sem_post\n" );<br />
54. }<br />
55. printf( " thread1 id: %u, g_Flag: %d \n",( unsigned int )pthread_self(), g_Flag );<br />
56. printf( "Leave thread1 \n\n" );<br />
57.<br />
58. ptid = ( pthread_t *)arg;<br />
59. printf( " ptid = %u \n", *ptid );<br />
60. pthread_join( *ptid, NULL );<br />
61. pthread_exit(0 );<br />
62.}<br />
63.<br />
64.void *thread2( void *arg )<br />
65.{<br />
66. printf( " Enter thread2 !\n" );<br />
67. printf( " thread2 id: %u , g_Flag: %d \n", ( unsigned int)pthread_self(), g_Flag );<br />
68.<br />
69. if( sem_wait( &amp;sem_mutex ) != 0 )<br />
70. {<br />
71. perror( "thread2 sem_wait \n" );<br />
72. }<br />
73.<br />
74. if( g_Flag == 1 )<br />
75. sem_post( &amp;sem_syn );<br />
76.<br />
77. g_Flag = 2;<br />
78.<br />
79. if( sem_post( &amp;sem_mutex ) != 0)<br />
80. {<br />
81. perror( " thread2 sem_post\n" );<br />
82. }<br />
83. printf( " thread2 id: %u , g_Flag: %d \n", ( unsigned int )pthread_self(), g_Flag );<br />
84. printf( "Leave thread2 \n\n" );<br />
85.<br />
86. pthread_exit(0);<br />
87.}</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/12/02/linux-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenCV轻松进阶初级篇（二）编译OpenCV</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/12/01/opencvopencv-2/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/12/01/opencvopencv-2/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 03:30:05 +0000</pubDate>
		<dc:creator>Yanqing Wang (Intel)</dc:creator>
				<category><![CDATA[Blog Challenge]]></category>
		<category><![CDATA[图形和视觉计算]]></category>
		<category><![CDATA[开放源代码]]></category>
		<category><![CDATA[移动技术]]></category>
		<category><![CDATA[英特尔® 软件网络 2.0]]></category>
		<category><![CDATA[软件技术学习及认证]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/12/01/opencvopencv-2/</guid>
		<description><![CDATA[&#160; OpenCV的源文件编译需要使用CMake，所以在编译之前需要下载和安装CMake。 &#160; 哪里可以下载CMake？ 现在最新的CMake版本是2.8.6，我们可以从http://cmake.org/cmake/resources/software.html 处下载到，如图1所示。 图1 &#160; 如何生存VC2010项目文件？ 在OpenCV轻松进阶初级篇（一）安装OpenCV中，笔者已经介绍了下载OpenCV的方法。CMake就是要将它的配置文件转化成相应平台的项目文件，本例以windows7平台VC2010为例，其他平台方法一致。 第一步：运行CMake工具，如图2所示。 图2 &#160; 第二步：生成项目文件，如图3所示。 这里细分为4小步： 1）&#160; 进入OpenCV的源代码目录，笔者将它存放在C:\opencv-2.3.1目录中。 2）&#160; 进入生成库文件的目标目录，笔者在C:\opencv-2.3.1的目录下自建了一个MyBuild目录 3）&#160; 选择需要编译生成的项目。 4）&#160; 点击Generate按钮生成项目文件。 图3 &#160; 第三步：查看生成后的配置信息，如图4所示。 图4 注意：在第一次配置CMake的时候，VC2010是需要在一个下来框中选择的，一旦选择好了，下次就无需再选，仅仅改变编译选项就OK了。 &#160; 第四步：查看VC2010项目文件是否已经生成完毕，如图5所示。 图5 &#160; OK，现在万事俱备只欠东风，还不点击OpenCV.sln来体验一下J。 &#160;]]></description>
			<content:encoded><![CDATA[<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">OpenCV</span><span style='font-family:宋体'>的源文件编译需要使用</span><span lang="EN-US">CMake</span><span style='font-family:宋体'>，所以在编译之前需要下载和安装</span><span lang="EN-US">CMake</span><span style='font-family:宋体'>。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><b><span style='font-size:12.0pt;font-family:宋体'>哪里可以下载</span></b><b><span lang="EN-US" style='font-size:12.0pt'>CMake</span></b><b><span style='font-size:12.0pt;font-family:宋体'>？</span></b></p>
<p class="MsoNormal" style='text-indent:21.2pt'><span style='font-family:宋体'>现在最新的</span><span lang="EN-US">CMake</span><span style='font-family:宋体'>版本是</span><span lang="EN-US">2.8.6</span><span style='font-family:宋体'>，我们可以从</span><span lang="EN-US"><a href="http://cmake.org/cmake/resources/software.html">http://cmake.org/cmake/resources/software.html</a><br />
</span><span style='font-family:宋体'>处下载到，如图</span><span lang="EN-US">1</span><span style='font-family:宋体'>所示。</span></p>
<p class="MsoNormal" align="center" style='text-align:center'><span lang="EN-US"><img border="0" width="554" height="447" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/21.png"></span></p>
<p class="MsoNormal" align="center" style='text-align:center'><span style='font-family:宋体'>图</span><span lang="EN-US">1</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><b><span style='font-size:12.0pt;font-family:宋体'>如何生存</span></b><b><span lang="EN-US" style='font-size:12.0pt'>VC2010</span></b><b><span style='font-size:12.0pt;font-family:宋体'>项目文件？</span></b></p>
<p class="MsoNormal" style='text-indent:21.2pt'><span style='font-family:宋体'>在</span><span lang="EN-US"><a href="http://software.intel.com/zh-cn/blogs/2011/11/30/opencvopencv/" title="永久链接到 OpenCV轻松进阶初级篇（一）安装OpenCV">OpenCV<span lang="EN-US" style='font-family:宋体'><span lang="EN-US">轻松进阶初级篇（一）安装</span></span>OpenCV</a></span><span style='font-family:宋体'>中，笔者已经介绍了下载</span><span lang="EN-US">OpenCV</span><span style='font-family:宋体'>的方法。</span><span lang="EN-US">CMake</span><span style='font-family:宋体'>就是要将它的配置文件转化成相应平台的项目文件，本例以</span><span lang="EN-US">windows7</span><span style='font-family:宋体'>平台</span><span lang="EN-US">VC2010</span><span style='font-family:宋体'>为例，其他平台方法一致。</span></p>
<p class="MsoNormal"><span style='font-family:宋体'>第一步：运行</span><span lang="EN-US">CMake</span><span style='font-family:宋体'>工具，如图</span><span lang="EN-US">2</span><span style='font-family:宋体'>所示。</span></p>
<p class="MsoNormal" align="center" style='text-align:center'><span lang="EN-US"><img border="0" width="411" height="476" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/22.png"></span></p>
<p class="MsoNormal" align="center" style='text-align:center'><span style='font-family:宋体'>图</span><span lang="EN-US">2</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style='font-family:宋体'>第二步：生成项目文件，如图</span><span lang="EN-US">3</span><span style='font-family:宋体'>所示。</span></p>
<p class="MsoNormal"><span style='font-family:宋体'>这里细分为</span><span lang="EN-US">4</span><span style='font-family:宋体'>小步：</span></p>
<p class="MsoListParagraph" style='margin-left:18.0pt;text-indent:-18.0pt'><span lang="EN-US">1）<span style='font:7.0pt "Times New Roman"'>&nbsp; </span></span><span style='font-family:宋体'>进入</span><span lang="EN-US">OpenCV</span><span style='font-family:宋体'>的源代码目录，笔者将它存放在</span><span lang="EN-US">C:\opencv-2.3.1</span><span style='font-family:宋体'>目录中。</span></p>
<p class="MsoListParagraph" style='margin-left:18.0pt;text-indent:-18.0pt'><span lang="EN-US">2）<span style='font:7.0pt "Times New Roman"'>&nbsp; </span></span><span style='font-family:宋体'>进入生成库文件的目标目录，笔者在</span><span lang="EN-US">C:\opencv-2.3.1</span><span style='font-family:宋体'>的目录下自建了一个</span><span lang="EN-US">MyBuild</span><span style='font-family:宋体'>目录</span></p>
<p class="MsoListParagraph" style='margin-left:18.0pt;text-indent:-18.0pt'><span lang="EN-US">3）<span style='font:7.0pt "Times New Roman"'>&nbsp; </span></span><span style='font-family:宋体'>选择需要编译生成的项目。</span></p>
<p class="MsoListParagraph" style='margin-left:18.0pt;text-indent:-18.0pt'><span lang="EN-US">4）<span style='font:7.0pt "Times New Roman"'>&nbsp; </span></span><span style='font-family:宋体'>点击</span><span lang="EN-US">Generate</span><span style='font-family:宋体'>按钮生成项目文件。</span></p>
<p class="MsoNormal" align="center" style='text-align:center'><span lang="EN-US"><img border="0" width="554" height="416" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/23.png"></span></p>
<p class="MsoNormal" align="center" style='text-align:center'><span style='font-family:宋体'>图</span><span lang="EN-US">3</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style='font-family:宋体'>第三步：查看生成后的配置信息，如图</span><span lang="EN-US">4</span><span style='font-family:宋体'>所示。</span></p>
<p class="MsoNormal" align="center" style='text-align:center'><span lang="EN-US"><img border="0" width="554" height="416" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/24.png"></span></p>
<p class="MsoNormal" align="center" style='text-align:center'><span style='font-family:宋体'>图</span><span lang="EN-US">4</span></p>
<p class="MsoNormal"><span style='font-family:宋体'>注意：在第一次配置</span><span lang="EN-US">CMake</span><span style='font-family:宋体'>的时候，</span><span lang="EN-US">VC2010</span><span style='font-family:宋体'>是需要在一个下来框中选择的，一旦选择好了，下次就无需再选，仅仅改变编译选项就</span><span lang="EN-US">OK</span><span style='font-family:宋体'>了。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style='font-family:宋体'>第四步：查看</span><span lang="EN-US">VC2010</span><span style='font-family:宋体'>项目文件是否已经生成完毕，如图</span><span lang="EN-US">5</span><span style='font-family:宋体'>所示。</span></p>
<p class="MsoNormal" align="center" style='text-align:center'><span lang="EN-US"><img border="0" width="554" height="389" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/25.png"></span></p>
<p class="MsoNormal" align="center" style='text-align:center'><span style='font-family:宋体'>图</span><span lang="EN-US">5</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">OK</span><span style='font-family:宋体'>，现在万事俱备只欠东风，还不点击</span><span lang="EN-US">OpenCV.sln</span><span style='font-family:宋体'>来体验一下</span><span lang="EN-US" style='font-family:Wingdings'>J</span><span style='font-family:宋体'>。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/12/01/opencvopencv-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5之Worker Thread</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/11/22/html5worker-thread/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/11/22/html5worker-thread/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 08:33:18 +0000</pubDate>
		<dc:creator>章政</dc:creator>
				<category><![CDATA[Blog Challenge]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[并行计算]]></category>
		<category><![CDATA[开放源代码]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[移动技术]]></category>
		<category><![CDATA[英特尔® 软件网络 2.0]]></category>
		<category><![CDATA[英特尔信息技术峰会]]></category>
		<category><![CDATA[软件开发工具]]></category>
		<category><![CDATA[软件技术学习及认证]]></category>
		<category><![CDATA[高校博客大奖赛]]></category>
		<category><![CDATA[HTML5 workerthread]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/11/22/html5worker-thread/</guid>
		<description><![CDATA[传统网页中嵌入的JSP语言都是执行在UI的上下文中，一般来说这种JSP处理的都是简单逻辑，没啥问题，随着Web复杂度越来高，JSP能处理的事情也越来越复杂，如果JSP计算量比较大的话，这就会导致UI页面假死。HTML5中的WorkerThread可以缓解这个问题，Worker Thread通过UI thread创建一个新的线程来进行计算，消息和结果通过Web Message来进行通讯，由于这种异步性，UI便可以较为流畅地响应新到来的事件。 调用过程如下： 1.新的工作线程执行体放在一个单独的JS文件中，比如worker.js. self.onmessage = function(event){ //do the real compute ---begin // //do the real compute ---end //post message back to UI thread self.postMessage(XXXX); }; 2.在UI的执行线程中生成一个worker对象，worker对象的构造函数参数就是worker.js var worker = new Worker("worker.js"); 3.下面就可以发送消息让worker干活了 worker.postMessage("perise"); 4.活干完了给UI发送消息,也就是第一步中的 self.postMessage(XXXX); 5.UI进行响应 worker.onmessage = function(event){ //update UI here }; Notes: *在Chrome中调试的时候会出现SECURITY_ERR: DOM Exception 18，传说是Webkit的bug,没有细究，可以通过搭建一个本地的HTTP服务器来解决，把HTML文件放到本地服务器上就可以绕开这个安全问题了，我使用的是WAMP。 *也许是为了控制Worker Thread的复杂度，Chrome的Worker Thread中不能再生成新的worker thread，其实这个很容易绕开，发送一个消息到UI中，让UI生成新的Worker [...]]]></description>
			<content:encoded><![CDATA[<p>传统网页中嵌入的JSP语言都是执行在UI的上下文中，一般来说这种JSP处理的都是简单逻辑，没啥问题，随着Web复杂度越来高，JSP能处理的事情也越来越复杂，如果JSP计算量比较大的话，这就会导致UI页面假死。HTML5中的WorkerThread可以缓解这个问题，Worker Thread通过UI thread创建一个新的线程来进行计算，消息和结果通过Web Message来进行通讯，由于这种异步性，UI便可以较为流畅地响应新到来的事件。<br />
调用过程如下：<br />
1.新的工作线程执行体放在一个单独的JS文件中，比如worker.js.</p>
<pre name="code" class="js">self.onmessage = function(event){
        //do the real compute ---begin
        //
        //do the real compute ---end
        //post message back to UI thread
	self.postMessage(XXXX);
};</pre>
<p>2.在UI的执行线程中生成一个worker对象，worker对象的构造函数参数就是worker.js</p>
<pre name="code" class="js">var worker = new Worker("worker.js");</pre>
<p>3.下面就可以发送消息让worker干活了</p>
<pre name="code" class="js">worker.postMessage("perise");</pre>
<p>4.活干完了给UI发送消息,也就是第一步中的</p>
<pre name="code" class="js">self.postMessage(XXXX);</pre>
<p>5.UI进行响应</p>
<pre name="code" class="js">worker.onmessage = function(event){
                        //update UI here
			};</pre>
<p>Notes:<br />
*在Chrome中调试的时候会出现SECURITY_ERR: DOM Exception 18，传说是Webkit的<a href="http://stackoverflow.com/questions/2704929/uncaught-error-security-err-dom-exception-18">bug</a>,没有细究，可以通过搭建一个本地的HTTP服务器来解决，把HTML文件放到本地服务器上就可以绕开这个安全问题了，我使用的是<a href="http://www.wampserver.com/en/">WAMP</a>。<br />
*也许是为了控制Worker Thread的复杂度，Chrome的Worker Thread中不能再生成新的worker thread，其实这个很容易绕开，发送一个消息到UI中，让UI生成新的Worker Thread就好,Firefox可以支持subworker,但Chrome是可以支持sharework，这种shareworker可以共享JS文件里面的全局数据。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/11/22/html5worker-thread/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何用C语言清空特定文件夹中的所有文件</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/10/12/c-13/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/10/12/c-13/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 07:14:29 +0000</pubDate>
		<dc:creator>dp900</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[并行计算]]></category>
		<category><![CDATA[开放源代码]]></category>
		<category><![CDATA[高校博客大奖赛]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/10/12/c-13/</guid>
		<description><![CDATA[最近笔者在做一个有关计算机视觉的项目，需要对提前的视频帧进行实验，当数据量很大且文件夹中的子文件夹和文件很多时，手工删除这些文件不现实，笔者今天写了一个程序，通过机器自动删除所有相关文件，十分快速，删除时间几乎可以不计。 代码如下，仅供参考。 #include "iostream.h" //由于该博客系统发布是不能显示正常，代码如需调试，只需将改成""即可 #include "string.h" #include "stdlib.h" #include "time.h" #include "math.h" #include "windows.h" #include "stdio.h" #include "shellapi.h" #include "fstream.h" #include "string" using namespace std; void main() { //清空特定文件夹中的所有文件 char* a="."; char* b=""; WIN32_FIND_DATA FileData,FileData_0; HANDLE hSearch,hSearch_0; BOOL fFinished=FALSE; hSearch=FindFirstFile("C:\\experiment\\results_stat\\*.*",&#38;FileData); //输入特定文件的绝对路径名 if(hSearch==INVALID_HANDLE_VALUE) { printf("No files found."); return; } while(!fFinished) { if(FileData.cFileName[0]!=a[0]){ b=FileData.cFileName; string addr=string("C:\\experiment\\results_stat\\")+string(b)+string("\\")+string("*.*"); [...]]]></description>
			<content:encoded><![CDATA[<p>最近笔者在做一个有关计算机视觉的项目，需要对提前的视频帧进行实验，当数据量很大且文件夹中的子文件夹和文件很多时，手工删除这些文件不现实，笔者今天写了一个程序，通过机器自动删除所有相关文件，十分快速，删除时间几乎可以不计。<br />
代码如下，仅供参考。</p>
<p><code><br />
#include "iostream.h"    //由于该博客系统发布是不能显示正常，代码如需调试，只需将改成""即可<br />
#include "string.h"<br />
#include "stdlib.h"<br />
#include "time.h"<br />
#include "math.h"<br />
#include "windows.h"<br />
#include "stdio.h"<br />
#include "shellapi.h"<br />
#include "fstream.h"<br />
#include "string"<br />
using namespace std;</p>
<p>void main()<br />
{<br />
	//清空特定文件夹中的所有文件<br />
	char* a=".";<br />
	char* b="";</p>
<p>	WIN32_FIND_DATA FileData,FileData_0;<br />
	HANDLE hSearch,hSearch_0;<br />
	BOOL fFinished=FALSE;<br />
	hSearch=FindFirstFile("C:\\experiment\\results_stat\\*.*",&amp;FileData);     //输入特定文件的绝对路径名<br />
	if(hSearch==INVALID_HANDLE_VALUE)<br />
	{<br />
		printf("No   files   found.");<br />
		return;<br />
	}<br />
	while(!fFinished)<br />
	{<br />
	  if(FileData.cFileName[0]!=a[0]){</p>
<p>		  b=FileData.cFileName;<br />
		  string addr=string("C:\\experiment\\results_stat\\")+string(b)+string("\\")+string("*.*");		//输入特定文件的绝对路径名<br />
		  hSearch_0=FindFirstFile(addr.c_str(),&amp;FileData_0);<br />
		  while(FindNextFile(hSearch_0,   &amp;FileData_0)){<br />
			  if(FileData_0.cFileName[0]!=a[0]){<br />
				  string addr_0=string("C:\\experiment\\results_stat\\")+string(b)+string("\\")+FileData_0.cFileName;		//输入特定文件的绝对路径名<br />
				  DeleteFile(addr_0.c_str());			//清空特定文件夹中的子文件夹中的所有文件<br />
			  }<br />
		  }<br />
	  }<br />
	  if(!FindNextFile(hSearch,&amp;FileData))<br />
	  {<br />
		  if(GetLastError()==ERROR_NO_MORE_FILES)<br />
		  {<br />
			  fFinished=TRUE;<br />
		  }<br />
		  else<br />
		  {<br />
			  printf("Couldn't   find   next   file.");<br />
			  return;<br />
		  }<br />
	  }<br />
	}<br />
	FindClose(hSearch);<br />
	FindClose(hSearch_0);<br />
}<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/10/12/c-13/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C 五子棋</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/09/26/c-12/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/09/26/c-12/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 03:56:35 +0000</pubDate>
		<dc:creator>liuyueyi</dc:creator>
				<category><![CDATA[图形和视觉计算]]></category>
		<category><![CDATA[开放源代码]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[高校博客大奖赛]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/09/26/c-12/</guid>
		<description><![CDATA[用C语言写的一个图形菜单的人人对战五子棋的源代码，比较简单，可以看看 #include #include #include #include #include #include #define UP 0x48 #define DOWN 0x50 #define RIGHT 0x4d #define LEFT 0x4b #define ENTER 0x0d void board(void); void chessPieces(int i,int j,int state); void check(int i,int j,int state); void playGame(void); int specialkey(void); void out(int state); void mycircle(void); int gmode,gdriver=DETECT; void main() { char c; registerbgidriver(EGAVGA_driver); initgraph(&#38;gdriver,&#38;gmode,""); do { board(); [...]]]></description>
			<content:encoded><![CDATA[<p>用C语言写的一个图形菜单的人人对战五子棋的源代码，比较简单，可以看看</p>
<p>#include<br />
#include<br />
#include<br />
#include<br />
#include<br />
#include</p>
<p>#define UP 0x48<br />
#define DOWN 0x50<br />
#define RIGHT 0x4d<br />
#define LEFT 0x4b<br />
#define ENTER 0x0d</p>
<p>void board(void);<br />
void chessPieces(int i,int j,int state);<br />
void check(int i,int j,int state);<br />
void playGame(void);<br />
int specialkey(void);<br />
void out(int state);<br />
void mycircle(void);</p>
<p>int gmode,gdriver=DETECT;</p>
<p>void main()<br />
{<br />
char c;<br />
registerbgidriver(EGAVGA_driver);<br />
initgraph(&amp;gdriver,&amp;gmode,"");<br />
do<br />
{<br />
board();<br />
playGame();<br />
c=specialkey();<br />
if(c!='Y'||c!='y'||c!='N'||c!='n') c=specialkey();<br />
}while(c=='Y'||c=='y');<br />
getch();<br />
closegraph();<br />
}</p>
<p>int specialkey(void)<br />
{<br />
int key;<br />
while(bioskey(1)==0);/*waiting */<br />
key = bioskey(0); /*read key*/<br />
key=key&amp;0xff?key&amp;0xff:key&gt;&gt;8; /*只读取特殊键的扫描值，其余为0*/<br />
return(key);/*返回键值*/<br />
}</p>
<p>void board() /*画棋盘函数*/<br />
{<br />
int i=0;<br />
cleardevice();<br />
setbkcolor(WHITE);<br />
setcolor(RED);<br />
for(i=0;i&lt;=20;i++)<br />
line(20,20+20*i,620,20+20*i);<br />
for(i=0;i&lt;=30;i++)<br />
line(20+20*i,20,20+20*i,420);<br />
}</p>
<p>void chessPieces(int i,int j,int state) /*画棋子的三种状态， 1：红子； 2：黑子 ； 0：清除待走棋子的痕迹*/<br />
{<br />
switch (state){<br />
case 0: setcolor(RED);<br />
setfillstyle(SOLID_FILL, WHITE);<br />
bar(21+20*j,21+20*i,39+20*j,39+20*i); break;<br />
case 2: setcolor(DARKGRAY);<br />
setfillstyle(SOLID_FILL,DARKGRAY);<br />
circle(30+20*j,30+20*i,8);<br />
floodfill(30+20*j,30+20*i,DARKGRAY); break;<br />
case 1: setcolor(RED);<br />
setfillstyle(SOLID_FILL,RED);<br />
circle(30+20*j,30+20*i,8);<br />
floodfill(30+20*j,30+20*i,RED);break;<br />
}<br />
}</p>
<p>void playGame()<br />
{<br />
int line[20][30];<br />
int i,j,n1,n2,n3,n4,n5,n6,m1,m2,m3,m4,m5,m6;<br />
int k1,k2,k3,k4;<br />
int t1,t2,t3,t4;<br />
int state=0;<br />
char c;<br />
chessPieces(0,0,state+1);<br />
setcolor(WHITE);<br />
circle(30,30,5);<br />
for(i=0;i&lt;=19;i++)<br />
for(j=0;j&lt;=29;j++)<br />
line[i][j] = 0;<br />
i=0;j=0;<br />
while(1)<br />
{<br />
while((c=specialkey())!=ENTER) /*操纵待走的棋子的移动*/<br />
{<br />
if(c==RIGHT)<br />
{<br />
chessPieces(i,j,0);<br />
chessPieces(i,j,line[i][j]);<br />
if(j0) --j;<br />
else j=29;<br />
chessPieces(i,j,state+1);<br />
setcolor(WHITE);<br />
circle(30+20*j,30+20*i,5);<br />
}</p>
<p>if(c==UP)<br />
{<br />
chessPieces(i,j,0);<br />
chessPieces(i,j,line[i][j]);<br />
if(i&gt;0) --i;<br />
else i=19;<br />
chessPieces(i,j,state+1);<br />
setcolor(WHITE);<br />
circle(30+20*j,30+20*i,5);<br />
}</p>
<p>if(c==DOWN)<br />
{<br />
chessPieces(i,j,0);<br />
chessPieces(i,j,line[i][j]);<br />
if(i=5)||(k2&gt;=5)||(k3&gt;=5)||k4&gt;=5) /*判断是否有五子，是则输出*/<br />
{<br />
out(state);<br />
break;<br />
}<br />
++state;<br />
state=state%2;<br />
}<br />
}<br />
}<br />
}<br />
void out(int state) /*输出赢家*/<br />
{<br />
settextstyle(0,0,4);<br />
setcolor(DARKGRAY);<br />
state?outtextxy(100,300,"BLACK WIN!"):outtextxy(100,300,"RED WIN!");<br />
settextstyle(0,0,2);<br />
setcolor(RED);<br />
outtextxy(30,350,"PRESS 'Y' TO CONTINUE AND 'N' TO EXIT!");<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/09/26/c-12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>持续集成系统介绍</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/09/22/400008533/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/09/22/400008533/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 05:32:12 +0000</pubDate>
		<dc:creator>Zhibin Niu (Intel)</dc:creator>
				<category><![CDATA[开放源代码]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/09/22/400008533/</guid>
		<description><![CDATA[在这里总结一下常用的CI原理，常用工具及一些操作建议，请参看附件中的视频。 （注：有些图表取自互联网，无法一一对应，向其原作者致歉，欢迎联系我并修改。另外，也欢迎大家针对PPT的内容进行探讨。） CI-system-introduction]]></description>
			<content:encoded><![CDATA[<p>在这里总结一下常用的CI原理，常用工具及一些操作建议，请参看附件中的视频。<br />
（注：有些图表取自互联网，无法一一对应，向其原作者致歉，欢迎联系我并修改。另外，也欢迎大家针对PPT的内容进行探讨。）</p>
<p><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/09/CI-system-introduction.wmv">CI-system-introduction</a></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/09/22/400008533/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/09/CI-system-introduction.wmv" length="6981912" type="video/asf" />
		</item>
		<item>
		<title>从log文件看meego播放器性能</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/09/15/logmeego/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/09/15/logmeego/#comments</comments>
		<pubDate>Thu, 15 Sep 2011 01:56:22 +0000</pubDate>
		<dc:creator>Zhibin Niu (Intel)</dc:creator>
				<category><![CDATA[全国大学生软件创新大赛专栏]]></category>
		<category><![CDATA[图形和视觉计算]]></category>
		<category><![CDATA[开放源代码]]></category>
		<category><![CDATA[英特尔® 软件网络 2.0]]></category>
		<category><![CDATA[软件技术学习及认证]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/09/15/logmeego/</guid>
		<description><![CDATA[视频播放器的性能随播放视频码率的不同而不同，有一些工具能够实现这些功能，比如VideoPerf，这里介绍一种通过看log记录的大致性能估计方法。 下载：Meego Video Player播放性能测试方法 1. 下载gstreamer最新的包gstreamer-0.10.32-6.9.i586.rpm ： http://repo.meego.com/MeeGo/builds/1.2.0.90/1.2.0.90.8.20110712.5/repos/oss/ia32/packages/i586/ gstreamer 5.1中gst debug log被disable掉了，需要安装6.9才行 2. 查询系统已经安装的gstreamer包，并卸载： rpm -qa &#124;grep gstreamer rpm -e --nodeps gstreamerxxxx. 3. 安装最新gstreamer包： rpm –ivh gstreamer-0.10.32-6.9.i586.rpm 4. 设置输出参数 export GST_DEBUG=3 5. 在终端里启动videoplayer: meego-qml-launcher --fullscreen --opengl --app meego-tk-videoplayer --cmd -normal-log &#62;tmp.log 2&#62;&#38;1 生成的Log可以用vim打开，并拷贝到PC上处理，工具可以使用Notepad++或ultraEdit。 注意：安装软件包可以在在ctrl+alt+f1下用root权限删除/安装 rpm包，但是启动videoplayer需要使用app的那个终端在meego用户权限下操作。 6. 计算播放性能，在log中： Debug: [ 111 :][ "18:15:08.594" ] "onPositionChanged : [...]]]></description>
			<content:encoded><![CDATA[<p>视频播放器的性能随播放视频码率的不同而不同，有一些工具能够实现这些功能，比如VideoPerf，这里介绍一种通过看log记录的大致性能估计方法。<br />
下载：<a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/09/Meego-Video-Player播放性能测试方法.pdf" class="broken_link">Meego Video Player播放性能测试方法</a></p>
<p>1. 下载gstreamer最新的包gstreamer-0.10.32-6.9.i586.rpm ：</p>
<p>http://repo.meego.com/MeeGo/builds/1.2.0.90/1.2.0.90.8.20110712.5/repos/oss/ia32/packages/i586/</p>
<p>gstreamer 5.1中gst debug log被disable掉了，需要安装6.9才行<br />
2. 查询系统已经安装的gstreamer包，并卸载：<br />
rpm -qa |grep gstreamer<br />
rpm -e --nodeps gstreamerxxxx.<br />
3. 安装最新gstreamer包：<br />
rpm –ivh gstreamer-0.10.32-6.9.i586.rpm<br />
4. 设置输出参数<br />
export GST_DEBUG=3<br />
5. 在终端里启动videoplayer:<br />
meego-qml-launcher --fullscreen --opengl --app meego-tk-videoplayer --cmd -normal-log &gt;tmp.log 2&gt;&amp;1<br />
生成的Log可以用vim打开，并拷贝到PC上处理，工具可以使用Notepad++或ultraEdit。<br />
注意：安装软件包可以在在ctrl+alt+f1下用root权限删除/安装 rpm包，但是启动videoplayer需要使用app的那个终端在meego用户权限下操作。<br />
6. 计算播放性能，在log中：<br />
Debug: [ 111 :][ "18:15:08.594" ] "onPositionChanged : 29917"<br />
Debug: [ 112 :][ "18:15:09.594" ] "onPositionChanged : 30912"<br />
GST_EVENT gstevent.c:847:gst_event_new_qos:[00m creating qos proportion 1.623329, diff 1147552000, timestamp 0:00:17.083306000<br />
其中：<br />
Timestampe：某一帧图像在时间序列中的位置；<br />
onPositionChanged：时间轴，每一秒钟移动一次；<br />
综上所述：<br />
计算平均帧率 = (all frames)/all time<br />
视频流畅度 = Var(abs(F_Video-F_Pad))<br />
平均丢帧率= (∑(F_Video-F_pad))/(all frames)<br />
其中：F_Video视频实际帧率，用Mediainfo获得，F_pad为实际帧率，通过Log计算得到;<br />
丢帧率和实际帧率可以通过曲线和数字量化和可视化，工具可以使用Excel或SciLab等。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/09/15/logmeego/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Meego开发常用测试工具及流程</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/09/15/meego-30/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/09/15/meego-30/#comments</comments>
		<pubDate>Thu, 15 Sep 2011 01:51:37 +0000</pubDate>
		<dc:creator>Zhibin Niu (Intel)</dc:creator>
				<category><![CDATA[全国大学生软件创新大赛专栏]]></category>
		<category><![CDATA[开放源代码]]></category>
		<category><![CDATA[英特尔® 软件网络 2.0]]></category>
		<category><![CDATA[软件技术学习及认证]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/09/15/meego-30/</guid>
		<description><![CDATA[1. 开源产品经验 从UBUNTU的开发测试中可窥典型开源产品测试之一斑: 1) ISO testing 2) SRU testing 3) Bug triage 4) Feature testing 5) Daily smoke testing 6) General testing：Ubuntu is more than its default installation and basic tasks - it's an entire repository of software and possible configurations. We need to test as much of it as possible, and some things aren't [...]]]></description>
			<content:encoded><![CDATA[<p>1. 开源产品经验<br />
从UBUNTU的开发测试中可窥典型开源产品测试之一斑:<br />
1) ISO testing<br />
2) SRU testing<br />
3) Bug triage<br />
4) Feature testing<br />
5) Daily smoke testing<br />
6) General testing：Ubuntu is more than its default installation and basic tasks - it's an entire repository of software and possible configurations. We need to test as much of it as possible, and some things aren't well covered by established test cases and procedures. General testing is as simple as attempting to use the development release and reporting whatever problems you run into.<br />
7) Application testing：Application testing is the manual testing of specific things (test cases) in applications. Regression tests are specific tests for potential breakages from one release to another (they're also relevant for SRU testing, above).<br />
 <img src='http://software.intel.com/zh-cn/blogs/wordpress/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> Automated testing：Automated testing is the conversion of large numbers of test cases into simple scripts. They can often be run in bulk with a single command.<br />
9) Laptop testing</p>
<p>2. Meego软件开发测试<br />
2.1. 从meego 开发流程看测试流程<br />
Meego开发流程：<br />
<img class="alignleft" src="http://software.intel.com/file/38412" alt="" width="740" height="380" /></p>
<p>测试主要发生在Develop Debug阶段，包括单元测试和系统测试。一般经验是在开发过程中伴随单元测试，系统集成完之后进行系统测试，从持续集成观点看，鼓励快速集成，日/夜构建及测试。具体测试流程需要和腾讯及OTC商议确定。<br />
2.2. 单元测试阶段<br />
单元测试在软件开发阶段，由开发人员编写test case并执行测试。Meego官方推荐了22+种测试工具，简要介绍如下几个：<br />
• Valgrind, Coverity, gprof, gcov<br />
• Tdriver – Test automation driver for UI or functionality testing<br />
• Test Runner – An automated test execution tool, takes XML test plan as input<br />
• QTestlib<br />
• QML性能检测工具<br />
具体细节参见文档《Meego单元测试工具汇总》<br />
测试出来的Bug使用bugzilla或Trac管理.<br />
2.3. 系统测试阶段：<br />
分为手动/半自动和自动化测试，Meego官方分别给出了这两种测试流程：<br />
2.3.1. 手动/半自动化测试流程<br />
<img class="alignleft" src="http://software.intel.com/file/38414" alt="" width="740" height="300" /><br />
主要流程包括：</p>
<p>1) 测试规划；<br />
2) 执行测试：可以使用一些命令行工具，如：Testrunner 和 testrunner-lite 。<br />
3) 生成测试报告；<br />
2.3.2. 自动化测试流程<br />
<img class="alignnone" src="http://software.intel.com/file/38415" alt="" width="740" height="158" /><br />
主要流程包括：<br />
1) BOSS creates test automation enabled images from OBS projects (This part is not working yet. Currently OTS uses self made images.)<br />
2) OTS downloads the image and installs it to a device under test<br />
3) OTS executes tests found in the image<br />
4) OTS sends results to qa-reports.meego.com</p>
<p>2.3.3. OTS简要介绍：<br />
目标：提升自动化测试效率及设备上软件测试质量(可以在硬件上如N900执行)，其所提供服务和主要功能见下表：<br />
<img class="alignnone" src="http://software.intel.com/file/38416" alt="" width="740" height="130" /></p>
<p>主要功能 Distribution Load balancing Remote command running Hardware control Data Acquisition Data Analysis<br />
所提供的服务 Fully Open Source Web server Extensible Architecture Interoperability</p>
<p>OTS工作流程：<br />
<img class="alignnone" src="http://software.intel.com/file/38417" alt="" width="750" height="550" /></p>
<p>2.3.4. Meego开发主要系统测试内容<br />
1) Functionality quality characteristics<br />
a) Functional (accuracy) testing:<br />
b) Functional (suitability) testing：Testing shall also evaluate the application's or component's tolerance to faults in terms of handling unexpected input values, data, messages or triggers (so-called negative tests).<br />
c) Technical Security Testing:<br />
2) Efficiency quality characteristics<br />
Frame rate，Latency，Response，Benchmark，Throughput，Memory，Load，etc.<br />
3) Reliability quality characteristics<br />
Robustness Testing, Recoverability Testing, Iterative, Long-lasting.<br />
4) Usability quality characteristics<br />
Test type User experience<br />
5) Maintainability quality characteristics<br />
Dynamic maintainability testing, Changeability testing,<br />
6) Portability quality characteristics<br />
Install ability testing, Compatibility testing, Adaptability testing, Replace ability testing</p>
<p>3. 总结<br />
1. 开发阶段，应以开发和单元测试为主，后期可以配合其他app及系统开发执行持续集成，实现日/夜构建及测试。<br />
2. 单元测试有开发人员实现和执行，可以借助于相应工具实现内存，功能，性能等测试。<br />
3. 集成完之后，执行系统测试，如果可以借助于OTS则测试流程更加规范，但复杂度也远高于手工测试。</p>
<p>4. 参考：<br />
[1] Development process for 3rd Party MeeGo Application Developers（PPT）<br />
[2] http://wiki.meego.com/Quality/QA-tools<br />
[3] http://www.youtube.com/user/meegoqatools<br />
[4] http://wiki.meego.com/Quality/Test_management_overview<br />
[5] http://wiki.meego.com/Quality/QA-tools/OTS/ExampleSetup<br />
[6] http://wiki.meego.com/Quality/Test_areas_and_types</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/09/15/meego-30/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

