<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[C.Y Go! Go! Go! - 程序人生]]></title>
<link>http://www.cyggg.cn/</link>
<description><![CDATA[爱自己2010]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[veekchen@hotmail.com(C.Y)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>C.Y Go! Go! Go!</title>
	<url>http://www.cyggg.cn/images/logos.gif</url>
	<link>http://www.cyggg.cn/</link>
	<description>C.Y Go! Go! Go!</description>
</image>

			<item>
			<link>http://www.cyggg.cn/article.asp?id=57</link>
			<title><![CDATA[【ZT】PostMessage与SendMessage的区别]]></title>
			<author>veekchen@hotmail.com(veekchen)</author>
			<category><![CDATA[程序人生]]></category>
			<pubDate>Mon,06 Sep 2010 10:40:27 +0800</pubDate>
			<guid>http://www.cyggg.cn/default.asp?id=57</guid>
		<description><![CDATA[在做基于窗口的Windows程序的时候，我们避免不了要向窗口发送消息，有两种方式，一种是PostMessage，另外一种是SendMessage。关于这两个宏，我是通过狠狠的看MSDN才搞明白的，那里讲的是最权威的。它们的区别如下：<br/>1、PostMessage会将消息压入窗口所在线程的消息队列，然后返回；而SendMessage则不经过消息队列，SendMessage可认为是直接调用了该窗口的窗口过程，因此在我们需要获得消息处理后的返回值的时候，就要用到SendMessage。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如：当在程序中指定如下使用：PostMessage（hWnd, WM_MSG,0,0），那么当程序执行到PostMessage的时候，仅将消息WM_MSG压入到创建hWnd所指窗口的那个线程的消息队列，然后程序将继续执行下去，而至于程序什么时候响应该消息，则要看那个线程什么时候得到控制权；<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而指定如下使用：SendMessage（hWnd, WM_MSG,0,0），那么当程序执行到该处时，将发生一次跳转：从当前位置，跳转到hWnd的窗口过程中去响应WM_MSG消息，当消息处理结束，窗口过程返回，程序又将从SendMessage后面继续执行，当然，我们可以获得窗口过程对该消息的处理结果，也即取SendMessage的返回值。（这里只是针对单线程）。<br/> <br/>2、在多线程应用中，PostMessage的用法还是一样，但SendMessage则不同了。如果在线程A中向线程B所创建的一个窗口hWndB发送消息SendMessage（hWndB，WM_MSG，0，0），那么系统将会立即将执行权从线程A切换到线程B，然后在线程B中调用hWndB的窗口过程来处理消息，并且在处理完该消息后，执行权仍然在B手中！这个时候，线程A则暂停在SendMessage处，等待下次线程A获得执行权后才继续执行，并且仍然可以获得消息处理的结果（返回值）。一般，为了避免死锁，在B中对WM_MSG做出处理之前，要加上：<br/>&nbsp;&nbsp;&nbsp;&nbsp; 　if(InSendMessage()) <br/>　　　&nbsp;&nbsp; 　RelpyMessage(lResult)；<br/><br/>即判断：如果该消息是发自另外一个线程，则立即 RelpyMessage，回复消息，参数lResult即是返回值。而如果是在同一个线程内，则InSendMessage()将会返回FALSE。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.cyggg.cn/article.asp?id=50</link>
			<title><![CDATA[【ZT】DirectUI介绍]]></title>
			<author>veekchen@hotmail.com(veekchen)</author>
			<category><![CDATA[程序人生]]></category>
			<pubDate>Sun,13 Jun 2010 10:50:37 +0800</pubDate>
			<guid>http://www.cyggg.cn/default.asp?id=50</guid>
		<description><![CDATA[DirectUI 界面库 取名自微软的一个窗口类名“DirectUIHWND”，意为Paint on parent dc directly。即子窗口不以窗口句柄的形式创建，只是逻辑上的窗口，绘制在父窗口之上。微软的“DirectUI”技术广泛的应用于Window XP系统，Media Player播放器，即时通讯工具MSN Messager。<br/><br/>传统的window界面，是用户窗口的层次排列，这种方式有很多局限性。目前的开发环境我们可以很快的使用win32控件构造出标准的干净的界面，但是我们同时也会立刻意识到如果我想像界面更加漂亮，更加炫一点就比较麻烦了。Windows控件提供的Custom-Draw/Ower-Draw技术局限太多，基本上没有透明等效果支持，同时控件布局方面也比较古板。<br/><br/>DirectUI界面库使用XML来描述界面风格，界面布局，使用脚本语言（如 vbscript，javascript，lua）等来作为界面元素和程序逻辑的交互。从这方面来看，DirectUI界面库可以看成是一个迷你的微软 WPF，mozilla XUL，或者Adobe的Flex，这些平台代表的应用程序的发展方向，同时也有很多相似的架构，比如多采用类似XML的方式描述定义界面，使用脚本语言（xul使用javascript，flex使用Action Script）来作为控制界面元素并和程序逻辑之间交互。DirectUI 界面库采用相似的设计，使用xml描述界面，同时使用javascript，或者vbscript来作为界面和逻辑的粘合。在控件设计方面，DirectUI界面库更多的融入了XUL，WPF，Flex等控件设计理念，并没有一味的照搬window标准控件，以期望其成为一款真正使用实用的界面库。<br/><br/>这种界面库设计的最大的好处在于可以很方便的构建高效，绚丽的，非常易于扩展的界面。国外如微软，国内如腾讯，百度等公司的客户端产品多采用这种方式来组织界面，从而很好的将界面和逻辑分离，同时易于实现各种超炫的界面效果如换色，换肤，透明等。 DirectUI 界面库旨在满足客户端界面快速开发的需要，同时融入业界前沿的皮肤技术，为用户创建更加高效，专业的界面。<br/>其他特性：<br/>* 使用xml配置界面控件布局<br/>* 使用脚本(vbscript, jscript)控制控件属性，响应事件<br/>* 使用xml描述界面风格<br/>* XML语法简单，易于学习和掌握<br/>* 基于Win32 API，没有framework依赖。<br/>* 支持改变皮肤色调<br/>* 支持大多数控件透明，包括子窗口透明<br/>* 支持png, bitmap, gif, ico图片格式。支持带透明通道的png图片<br/><br/>DirectUI在微软内部使用的很广泛了，为什么不公布出来呢?估计有三点原因:<br/><br/>1. 最初写这套框架的人太牛了，根本没写什么注释文档，又经过一堆牛人一通乱改，估计能看懂和用好的人不多。发布出来，大家一看原来微软的代码也可以这么乱，对Vista的信心更是大跌。<br/><br/>2. DirectUI只是一个UI框架，没有什么数据库，网络，WebSerivice支持，更别说同MFC,ATL集合，甚至可能冲突，为了顾全MFC的地位，WTL都可以牺牲，DirectUI更别说了。<br/><br/>3.DirectUI是C++开发的，这是什么时代了还用C++开发，有了多快好省的DirectUI，谁还用.NET开发客户端程序，同微软的发展战略不一致呀。<br/><br/>--------------------------------------<br/><br/><a href="http://visualstudiogallery.msdn.microsoft.com/zh-cn/1B69C9FE-E422-4799-9EB5-6AC7034C52E1" target="_blank" rel="external">http://visualstudiogallery.msdn.microsoft.com/zh-cn/1B69C9FE-E422-4799-9EB5-6AC7034C52E1</a><br/>DirectUI GUI库更像是一个Firefox的XUL的一个子集，Adobe Flex的，或Microsoft WPF中，但在Win32平台上运行。它具有以下特点：<br/>1。 DirectUI使用XML进行布局的对话框控件，并使用脚本，JScript中，卢阿提供流量控制和对象操作功能是无法在XML可用。<br/>2。 DiectUI定义stylelike CSS来描述的外观和感觉的应用，因此它是灵活的。您可以加载样式表或更改控制在运行时的外观。<br/>3。它具有很高的绘图效率。<br/>4。 DirectUI可以实现一些非常简单，如透明度，动画，花式效果。<br/>5。 DirectUI分离UI和程序逻辑。您可以处理用户界面相关的逻辑使用XML和脚本。<br/>6。您可以构建一个很好的应用迅速与DirectUI。<br/>7。在Win 32 API，该以便它不依赖于任何框架Directui基地。<br/>8。的色调和饱和度的调整。您可以调整色彩计划顺利进行。<br/>9。支持在运行时改变皮肤，你也可以在运行时使用不同的风格。<br/>10。支持Unicode。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.cyggg.cn/article.asp?id=48</link>
			<title><![CDATA[【ZT】使用Excel COM组件导出数据后释放Excel资源]]></title>
			<author>veekchen@hotmail.com(veekchen)</author>
			<category><![CDATA[程序人生]]></category>
			<pubDate>Tue,01 Jun 2010 11:37:45 +0800</pubDate>
			<guid>http://www.cyggg.cn/default.asp?id=48</guid>
		<description><![CDATA[以前做过的项目曾经出现过此问题，解决方法是杀掉excel.exe的进程，指标不治本，且不安全。<br/>今天偶尔逛csdn看到一解决此问题的方法，特此共享。（注意：暂时只测试过office03能通过）<br/><br/>【ZT】内容：<br/>到底是为什么无法释放Excel呢？<br/>最后发现一篇MSDN上文章：<a href="http://support.microsoft.com/kb/317109" target="_blank" rel="external">http://support.microsoft.com/kb/317109</a><br/>大家可以看看！<br/><br/>文章的意思是创建的每个对象都得释放掉，Excel进程才会关闭。<br/>如果你写的代码导出Excel老是无法关闭Excel,可以看看我下面的代码。<br/><br/>private void ExportExcel(DataTable dt, string _strTitle)<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string newpath = Server.MapPath(&#34;.&#34;) + @&#34;\&#34; + Guid.NewGuid() + &#34;.xls&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_excel.Application app = new _excel.Application();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_excel.Workbooks wbooks = app.Workbooks;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_excel.Workbook wbook = wbooks.Add(System.Reflection.Missing.Value);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//VS2003中最好不要如下创建<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// _excel.Workbook wbook = app.Workbooks.Add(System.Reflection.Missing.Value);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_excel.Worksheet tsheet = (_excel.Worksheet)wbook.ActiveSheet;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//为 tsheet.Cells 创建 Range ，方便释放资源<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_excel.Range rans = (_excel.Range)tsheet.Cells;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建ran为了下面赋值时候使用<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_excel.Range ran = null;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; dt.Rows.Count; i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int j = 0; j &lt; dt.Columns.Count; j++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ran = (_excel.Range)rans[i + 1, j + 1];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ran.Value2 = dt.Rows[i][j];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NAR(ran);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//不要如下方式赋值<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//tsheet.Cells[i + 1, j + 1] = dt.Rows[i][j];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NAR(rans);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NAR(tsheet);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//保存信息<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wbook.Close(true,newpath, System.Reflection.Missing.Value);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NAR(wbook);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NAR(wbooks);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;app.Quit();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NAR(app);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// 释放资源<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;param name=&#34;o&#34;&gt;&lt;/param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private void NAR(object o)<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Runtime.InteropServices.Marshal.ReleaseComObject(o);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch { }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/><br/><br/>经过测试VS2003 和VS2005中都可以正常的自动关闭Excel。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.cyggg.cn/article.asp?id=46</link>
			<title><![CDATA[【ZT】Tomcat服务器漏洞，解决方法]]></title>
			<author>veekchen@hotmail.com(veekchen)</author>
			<category><![CDATA[程序人生]]></category>
			<pubDate>Mon,10 May 2010 11:53:22 +0800</pubDate>
			<guid>http://www.cyggg.cn/default.asp?id=46</guid>
		<description><![CDATA[Tomcat是一款小型的Web应用服务器，颇受小型企业站长的青睐。Tomcat服务器开放源代码，占用的系统资源小，扩展性好，支持负载平衡与邮件服务等，特别是在Linux系统平台上它优势明显，有广泛的用户群。<br/>　　最近，Tomcat爆出新漏洞。攻击者利用该漏洞轻松进入Web站点后台，然后上传jsp网页木马，通过进一步的提权渗透就可获得服务器的控制权。<br/>　　在攻击者如火如荼地利用该漏洞实施攻击的时候，站长们如何修补该漏洞以报Tomcat服务器的安全呢?笔者曾经在论坛中看到了很多针对该漏洞的修补方法，经过笔者的测试这些方法根本不能有效防范该漏洞。另外还有一些伪技巧，这些所谓的技巧不但不能修补漏洞而且会造成服务器故障。<br/><br/><strong>修补漏洞</strong><br/>　　1、漏洞根源<br/>　　笔者通过测试发现，Tomcat漏洞是由于tomcat-users.xml文件引起的。该文件保存了Tomcat后台登录的用户名和密码，并且默认状态下成功的登录者获得的是manager权限即管理员权限。 下面是默认状态下的tomcat-users.xml文件内容，倒数第二行是最关键的。<br/>&lt;?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39;?&gt; <br/>&nbsp;&nbsp;&lt;tomcat-users&gt; <br/>&nbsp;&nbsp;&lt;role rolename=&#34;tomcat&#34;/&gt; <br/>&nbsp;&nbsp;&lt;role rolename=&#34;role1&#34;/&gt; <br/>&nbsp;&nbsp;&lt;role rolename=&#34;manager&#34;/&gt; <br/>&nbsp;&nbsp;&lt;role rolename=&#34;admin&#34;/&gt; <br/>&nbsp;&nbsp;&lt;user username=&#34;admin&#34; password=&#34;admin&#34; roles=&#34;admin,manager&#34;/&gt; <br/>&lt;/tomcat-users&gt;<br/>　　2、漏洞修补<br/>　　知道了原因，我们的漏洞修补就是对tomcat-users.xml文件进行修改。针对该漏洞我们有两种修改方法，一种是改用户名和密码，一种是修改权限。<br/>　　1、修改用户名及密码<br/>　　我们把tomcat-users.xml文件倒数第二行中的改为，即把登录用户改为lw，登录密码改为gslw。最后重新登录后台测试，用默认的用户名和密码admin登录失败见图4，而用新用户名和密码登录成功。<br/><br/>　　2、修改权限<br/>　　我们把tomcat-users.xml文件倒数第二行中的改为，去掉了admin后面的manager，即取消了管理员权限。然后重启tomcat(必须要重启，因为Tomcat重启时会加载配置文件，这样刚才的修改才会生效。)和图4一样登录失败。<br/>　　总结：本文针对Tomcat服务器漏洞的演示及其修补方法在技术上没有什么难度，但是这些大家不经意的细节往往成为服务器杀手，服务器管理者要提高自己的安全素养。另外，作为服务器管理者要勤于动手，善用分析修补类似本文提及的这样的漏洞。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.cyggg.cn/article.asp?id=45</link>
			<title><![CDATA[【ZT】任务计划无法启动,提示代码:0X80041315 0x80070005]]></title>
			<author>veekchen@hotmail.com(veekchen)</author>
			<category><![CDATA[程序人生]]></category>
			<pubDate>Fri,07 May 2010 10:45:03 +0800</pubDate>
			<guid>http://www.cyggg.cn/default.asp?id=45</guid>
		<description><![CDATA[任务计划无法启动,提示代码:0X80041315 0x80070005<br/><br/>错误1：在创建任务计划之后，提示80041315<br/><br/>答：这有两种可能，一是系统中的“Task Scheduler”服务没有启动，你可在运行中键入“services.msc”，查看“Task Scheduler”服务是否被设置成了“已禁用”，若是，只要双击它将启动类型改为“自动”，重新设定一个计划任务就可以执行了。 <br/><br/>如果你当前账户设置了自动登录，而其登录密码又为空，也有可能导致任务计划不能按时执行，在XP专业版中，需要运行“gpedit.msc”来编 辑组策略：展开“计算机配置→Windows设置→安全设置→本地计算机策略→安全选项”；双击右侧的“账户：使用空白密码的本地账户只允许进行控制台登 录”项，在弹出对话框中选择“已禁用”。<br/><br/>错误2：启用task scheduler 服务之后，出现800700的错误。<br/><br/>在添加任务计划时出现如下错误：<br/><br/>已经创建新任务,但可能不能运行,因为无法设置帐户信息. 指定的错误是:0x80070005:拒绝访问. 请试着使用&#34;任务&#34;的浏览按钮来定位应用程序. <br/><br/>解决办法：<br/><br/>一、设置仅在登陆后运行<br/>在任务计划的属性－任务－勾选“仅在登录后运行”<br/><br/>（测试通过）<br/><br/>二、设置组策略　<br/><br/>（设置过了，但好像还不可以，我只需要第一种，也就不测试了）<br/><br/>1、开始－运行－GPEDIT.MSC<br/><br/>2、计算机配置 --- Windows 设置 --- 安全设置 --- 本地策略::<br/><br/>1) 用户权利指派 --- 从网络访问此计算机 --- 添加用户名 <br/><br/>3) 用户权利指派 --- 作为批处理作业登录 --- 添加用户名<br/><br/>4) 用户权利指派 --- 允许计算机和用户被信任以便于委托 --- 添加用户名<br/><br/>2) 安全选项 --- 域控制器: 允许服务器操作者计划任务 --- 启用<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.cyggg.cn/article.asp?id=40</link>
			<title><![CDATA[【ZT】Schtasks 计划任务参数详解]]></title>
			<author>veekchen@hotmail.com(veekchen)</author>
			<category><![CDATA[程序人生]]></category>
			<pubDate>Fri,16 Apr 2010 10:11:36 +0800</pubDate>
			<guid>http://www.cyggg.cn/default.asp?id=40</guid>
		<description><![CDATA[ <br/>安排命令和程序定期运行或在指定时间内运行。从计划表中添加和删除任务，按需要启动和停止任务，显示和更改计划任务。<br/><br/>若要查看该命令语法，请单击以下命令：<br/><br/>schtasks cr&#101;ate<br/><br/>创建新的计划任务。<br/><br/>语法<br/>schtasks /cr&#101;ate /tn TaskName /tr TaskRun /sc schedule [/mo modifier] [/d day] [/m month[,month...] [/i IdleTime] [/st StartTime] [/sd StartDate] [/ed EndDate] [/s computer [/u [domain\]user /p password]] [/ru {[Domain\]User | &#34;System&#34;} [/rp Password]] /?<br/><br/>参数<br/>/tn TaskName <br/>指定任务的名称。 <br/>/tr TaskRun <br/>指定任务运行的程序或命令。键入可执行文件、脚本文件或批处理文件的完全合格的路径和文件名。如果忽略该路径，SchTasks.exe 将假定文件在 Systemroot\System32 目录下。 <br/>/sc schedule <br/>指定计划类型。有效值为 MINUTE、HOURLY、DAILY、WEEKLY、MONTHLY、ONCE、ONSTART、ONLOGON、ONIDLE。 <br/>值<br/>说明<br/><br/>MINUTE、HOURLY、DAILY、WEEKLY、MONTHLY<br/>指定计划的时间单位。<br/><br/>ONCE<br/>任务在指定的日期和时间运行一次。<br/><br/>ONSTART<br/>任务在每次系统启动的时候运行。可以指定启动的日期，或下一次系统启动的时候运行任务。<br/><br/>ONLOGON<br/>每当用户（任意用户）登录的时候，任务就运行。可以指定日期，或在下次用户登录的时候运行任务。<br/><br/>ONIDLE<br/>只要系统空闲了指定的时间，任务就运行。可以指定日期，或在下次系统空闲的时候运行任务。<br/><br/><br/>/mo modifier <br/>指定任务在其计划类型内的运行频率。这个参数对于 MONTHLY 计划是必需的。对于 MINUTE、HOURLY、DAILY 或 WEEKLY 计划，这个参数有效，但也可选。默认值为 1。 <br/>计划类型<br/>修饰符<br/>说明<br/><br/>MINUTE<br/>1 ～ 1439<br/>任务每 n 分钟运行一次。<br/><br/>HOURLY<br/>1 ～ 23<br/>任务每 n 小时运行一次。<br/><br/>DAILY<br/>1 ～ 365<br/>任务每 n 天运行一次。<br/><br/>WEEKLY<br/>1 ～ 52<br/>任务每 n 周运行一次。<br/><br/>MONTHLY<br/>1 ～ 12<br/>任务每 n 月运行一次。<br/><br/>LASTDAY<br/>任务在月份的最后一天运行。<br/><br/>FIRST、SECOND、THIRD、FOURTH、LAST<br/>与 /d day 参数共同使用,并在特定的周和天运行任务。例如，在月份的第三个周三。<br/><br/><br/>/d dirlist <br/>指定周或月的一天。只与 WEEKLY 或 MONTHLY 计划共同使用时有效。 <br/>计划类型<br/>日期值<br/><br/>WEEKLY<br/>可选项。有效值是 MON ~ SUN 和 * （每一天）。MON 是默认值。<br/><br/>MONTHLY<br/>在使用 FIRST、SECOND、THIRD、FOURTH 或 LAST 修饰符 (/mo) 时，需要 MON ～ SUN 中的某个值。1 ～ 31 是可选的，只在没有修饰符或修饰符为 1 ～ 12 类型时有效。默认值是 1 （月份的第一天）。<br/><br/><br/>/m month[,month...] <br/>指定一年中的一个月。有效值是 JAN ～ DEC 和 * （每个月）。/m 参数只对于 MONTHLY 计划有效。在使用 LASTDAY 修饰符时，这个参数是必需的。否则，它是可选的，默认值是 * （每个月）。 <br/>/i InitialPageFileSize <br/>指定任务启动之前计算机空闲多少分钟。键入一个 1 ～ 999 之间的整数。这个参数只对于 ONIDLE 计划有效，而且是必需的。 <br/>/st StartTime <br/>以 HH:MM:SS 24 小时格式指定时间。默认值是命令完成时的当前本地时间。/st 参数只对于 MINUTE、HOURLY、DAILY、WEEKLY、MONTHLY 和 ONCE 计划有效。它只对于 ONCE 计划是必需的。 <br/>/sd StartDate <br/>以 MM/DD/YYYY 格式指定任务启动的日期。默认值是当前日期。/sd 参数对于所有的计划有效，但只对于 ONCE 计划是必需的。 <br/>/ed EndDate <br/>指定任务计划运行的最后日期。此参数是可选的。它对于 ONCE、ONSTART、ONLOGON 或 ONIDLE 计划无效。默认情况下，计划没有结束日期。 <br/>/s Computer <br/>指定远程计算机的名称或 IP 地址（带有或者没有反斜杠）。默认值是本地计算机。 <br/>/u [domain\]user <br/>使用特定用户帐户的权限运行命令。默认情况下，使用已登录到运行 SchTasks 的计算机上的用户的权限运行命令。 <br/>/p password <br/>指定在 /u 参数中指定的用户帐户的密码。如果使用 /u 参数，则需要该参数。 <br/>/ru {[Domain\]User | &#34;System&#34;} <br/>使用指定用户帐户的权限运行任务。默认情况下，使用用户登录到运行 SchTasks 的计算机上的权限运行任务。 <br/>值<br/>说明<br/><br/>[domain\}User?<br/>指定用户帐户。<br/><br/>&#34;System&#34; 或 &#34;&#34;<br/>指定操作系统使用的 NT Authority\System 帐户。<br/><br/><br/>/p Password <br/>指定用户帐户的密码，该用户帐户在 /u 参数中指定。如果在指定用户帐户的时候忽略了这个参数，SchTasks.exe 会提示您输入密码而且不显示键入的文本。使用 NT Authority\System 帐户权限运行的任务不需要密码，SchTasks.exe 也不会提示索要密码。 <br/>/? <br/>在命令提示符显示帮助。 <br/>注释<br/>XOX <br/>SchTasks.exe 不验证程序文件的位置或用户帐户密码。如果没有为用户帐户输入正确的文件位置或正确的密码，任务仍然可以创建，但不会运行。另外，如果帐户的密码更改或过期，而且没有更改存储在任务中的密码，那么任务也不会运行。 <br/>NT Authority\System 帐户没有交互式登录权限。用户看不到以系统权限运行的程序，不能与之交互。 <br/>每个任务只运行一个程序。但是，可以创建一个批处理文件来启动多个任务，然后计划一个任务来运行该批处理文件。 <br/>只要创建了任务就可对其测试。使用 run 操作来测试任务，然后从 SchedLgU.txt 文件 ( Systemroot\SchedLgU.txt ) 中查阅错误。<br/>每个计划类型的语法和范例。<br/>若要查看该命令语法，请单击以下命令：<br/><br/>schtasks cr&#101;ate minute<br/><br/>语法<br/>schtasks /cr&#101;ate /tn TaskName /tr TaskRun /sc minute [/mo {1 - 1439}] [/st StartTime] [/sd StartDate] [/ed EndDate] [/s computer [/u [domain\]user /p password]] [/ru {[Domain\]User | &#34;System&#34;} [/rp Password]]<br/><br/>范例<br/>计划任务每 20 分钟运行一次。<br/>下面的命令计划安全脚本 Sec.vbs 每 20 分钟运行一次。由于命令没有包含起始日期或时间，任务在命令完成 20 分钟后启动，此后每当系统运行它就每 20 分钟运行一次。请注意，安全脚本源文件位于远程计算机上，但任务在本地计算机上计划并执行。<br/><br/>schtasks /cr&#101;ate /sc minute /mo 20 /tn &#34;Security Script&#34; /tr \\central\data\scripts\sec.vbs<br/><br/>作为响应，SchTasks.exe 显示一条消息来说明任务会以当前用户的权限运行并需要当前用户的密码。输入密码时，SchTasks.exe 不显示键入的文本。<br/><br/>DE&gt;The task will be cr&#101;ated under current logged-in user name.Please enter the password************DE&gt;然后 SchTasks.exe 显示一条消息表明已计划该任务：<br/><br/>DE&gt;成功：计划任务 &#34;Security Script&#34; 已成功创建。DE&gt;<br/><br/>查询显示命令计划的任务：<br/><br/>DE&gt;TaskName Next Run Time Status========================= ======================== ==============Security Script 10:50:00 AM , 4/4/2001 DE&gt;schtasks cr&#101;ate hourly<br/><br/>语法<br/>schtasks /cr&#101;ate /tn TaskName /tr TaskRun /sc hourly [/mo {1 - 365}] [/st StartTime] [/sd StartDate] [/ed EndDate] [/s computer [/u [domain\]user /p password]] [/ru {[Domain\]User | &#34;System&#34;} [/rp Password]]<br/><br/>范例<br/>计划命令在每小时过五分的时候运行。<br/>下面的命令将计划 MyApp 程序从午夜过后五分钟起每小时运行一次。因为忽略了 /mo 参数，命令使用了小时计划的默认值，即每 (1) 小时。如果该命令在 12:05 A.M 之后生成，程序将在第二天才会运行。<br/><br/>schtasks /cr&#101;ate /sc hourly /st 00:05:00 /tn &#34;My App&#34; /tr c:\apps\myapp.exe<br/><br/>计划命令每五小时运行一次<br/>下面的命令计划 MyApp 程序从 2001 年 3 月的第一天起每五小时运行一次。它使用 /mo 参数来指定间隔时间，使用 /sd 参数来指定起始日期。由于命令没有指定起始时间，当前时间被用作起始时间。<br/><br/>schtasks /cr&#101;ate /sc hourly /mo 5 /sd 03/01/2001 /tn &#34;My App&#34; /tr c:\apps\myapp.exe<br/><br/>schtasks cr&#101;ate daily<br/><br/>语法<br/>schtasks /cr&#101;ate /tn TaskName /tr TaskRun /sc daily [/mo {1 - 365}] [/st StartTime] [/sd StartDate] [/ed EndDate] [/s computer [/u [domain\]user /p password]] [/ru {[Domain\]User | &#34;System&#34;} [/rp Password]]<br/><br/>范例<br/>计划任务每天运行一次<br/>下面的范例计划 MyApp 程序在每天的 8:00 A.M. 运行一次，直到 2001 年 12 月 31 日结束。由于它忽略了 /mo 参数，所以使用默认间隔 1 来每天运行命令。<br/><br/>schtasks /cr&#101;ate /tn &#34;My App&#34; /tr c:\apps\myapp.exe /sc daily /st 08:00:00 /ed 12/31/2001<br/><br/>计划任务每隔一天运行一次<br/>下面的范例计划 MyApp 程序从 2001 年 12 月 31 日起每隔一天在 1:00 P.M. (13:00) 运行。命令使用 /mo 参数来指定两 (2) 天的间隔。<br/><br/>schtasks /cr&#101;ate /tn &#34;My App&#34; /tr c:\apps\myapp.exe /sc daily /mo 2 /st 13:00:00 /sd 12/31/2001<br/><br/>schtasks cr&#101;ate weekly<br/><br/>语法<br/>schtasks /cr&#101;ate /tn TaskName /tr TaskRun /sc weekly [/d {MON - SUN | *}] [/mo {1 - 52}] [/st StartTime] [/sd StartDate] [/ed EndDate] [/s computer [/u [domain\]user /p password]] [/ru {[Domain\]User | &#34;System&#34;} [/rp Password]]<br/><br/>范例<br/>计划任务每六周运行一次<br/>下面的命令计划 MyApp 程序在远程计算机上每六周运行一次。该命令使用 /mo 参数来指定间隔。它也使用 /s 参数来指定远程计算机，使用 /ru 参数来计划任务以用户的 Administrator 帐户权限运行。因为忽略了 /rp 参数，SchTasks.exe 会提示用户输入 Administrator 帐户密码。<br/><br/>另外，因为命令是远程运行的，所以命令中所有的路径，包括到 MyApp.exe 的路径，都是指向远程计算机上的路径。<br/><br/>schtasks /cr&#101;ate /tn &#34;My App&#34; /tr c:\apps\myapp.exe /sc weekly /mo 6 /s Server16 /ru Admin01<br/><br/>计划任务每隔一周在周五运行<br/>下面的命令计划任务每隔一周在周五运行。它使用 /mo 参数来指定两周的间隔，使用 /d 参数来指定是一周内的哪一天。如计划任务在每个周五运行，要忽略 /mo 参数或将其设置为 1。<br/><br/>schtasks /cr&#101;ate /tn &#34;My App&#34; /tr c:\apps\myapp.exe /sc weekly /mo 2 /d FRI<br/><br/>schtasks cr&#101;ate monthly<br/><br/>语法<br/>常规月计划语法 <br/>schtasks /cr&#101;ate /tn TaskName /tr TaskRun /sc monthly [/mo {FIRST | SECOND | THIRD | FOURTH | LAST | LASTDAY] [/d {MON - SUN | 1 - 31}] [/m {JAN - DEC[,JAN - DEC...] | *}] [/st StartTime] [/sd StartDate] [/ed EndDate] [/s computer [/u [domain\]user /p password]] [/ru {[Domain\]User | &#34;System&#34;} [/rp Password]] <br/>指定周的语法 <br/>schtasks /cr&#101;ate /tn TaskName /tr TaskRun /sc monthly /mo {FIRST | SECOND | THIRD | FOURTH | LAST} /d {MON - SUN} [/m {JAN - DEC[,JAN - DEC...] | *}] [/st StartTime] [/sd StartDate] [/ed EndDate] [/s computer [/u [domain\]user /p password]] [/ru {[Domain\]User | &#34;System&#34;} [/rp Password]] <br/>Lastday 语法 <br/>schtasks /cr&#101;ate /tn TaskName /tr TaskRun /sc monthly /mo LASTDAY /m {JAN - DEC[,JAN - DEC...] | *} [/st StartTime] [/sd StartDate] [/ed EndDate] [/s computer [/u [domain\]user /p password]] [/ru {[Domain\]User | &#34;System&#34;} [/rp Password]] <br/>指定日期的语法 <br/>schtasks /cr&#101;ate /tn TaskName /tr TaskRun /sc monthly /d {1 - 31} [/m {JAN - DEC[,JAN - DEC...] | *}] [/st StartTime] [/sd StartDate] [/ed EndDate] [/s computer [/u [domain\]user /p password]] [/ru {[Domain\]User | &#34;System&#34;} [/rp Password]]<br/>范例<br/>计划任务在每月的第一天运行<br/>下面的命令计划 MyApp 程序在每月的第一天运行。因为默认修饰符是 none（即：没有修饰符），默认天是第一天，默认的月份是每个月，所以该命令不需要任何其它的参数。<br/><br/>schtasks /cr&#101;ate /tn &#34;My App&#34; /tr c:\apps\myapp.exe /sc monthly<br/><br/>计划任务在每月的最后一天运行<br/>下面的命令计划 MyApp 程序在每月的最后一天运行。它使用 /mo 参数指定在每月的最后一天运行程序，使用通配符 (*) 与 /m 参数表明在每月的最后一天运行程序。<br/><br/>schtasks /cr&#101;ate /tn &#34;My App&#34; /tr c:\apps\myapp.exe /sc monthly /mo lastday /m *<br/><br/>计划任务每三个月运行一次<br/>下面的命令计划 MyApp 程序每三个月运行一次。.它使用 /mo 参数来指定间隔。<br/><br/>schtasks /cr&#101;ate /tn &#34;My App&#34; /tr c:\apps\myapp.exe /sc monthly /mo 3<br/><br/>计划任务在每月的第二个周日运行<br/>下面的命令计划 MyApp 程序在每月的第二个周日运行。它使用 /mo 参数指定是每月的第二周，使用 /d 参数指定天。<br/><br/>schtasks /cr&#101;ate /tn &#34;My App&#34; /tr c:\apps\myapp.exe /sc monthly /mo SECOND /d SUN<br/><br/>计划任务在五月和六月的第 15 天运行。<br/>下面的命令计划 MyApp 程序在五月 15 日和六月 15 日的 3:00 PM (15:00) 运行。它使用 /d 参数来指定日期，使用 /m 参数指定月份。它也使用 /st 参数来指定开始时间。<br/><br/>schtasks /cr&#101;ate /tn &#34;My App&#34; /tr c:\apps\myapp.exe /sc monthly /d 15 /m MAY,JUN /st 15:00:00<br/><br/>schtasks cr&#101;ate once<br/><br/>语法<br/>schtasks /cr&#101;ate /tn TaskName /tr TaskRun /sc once /st StartTime /sd StartDate [/s computer [/u [domain\]user /p password]] [/ru {[Domain\]User | &#34;System&#34;} [/rp Password]]<br/><br/>范例<br/>计划任务运行一次<br/>下面的命令计划 MyApp 程序在 2002 年 1 月 1 日午夜运行一次。它使用 /ru 参数指定以用户的 Administrator 帐户权限运行任务，使用 /rp 参数为 Administrator 帐户提供密码。<br/><br/>schtasks /cr&#101;ate /tn &#34;My App&#34; /tr c:\apps\myapp.exe /sc once /st 00:00:00 /sd 01/01/2002 /ru Admin23 /rp p@ssworD1<br/><br/>schtasks cr&#101;ate onstart<br/><br/>语法<br/>schtasks /cr&#101;ate /tn TaskName /tr TaskRun /sc onstart [/sd StartDate] [/s computer [/u [domain\]user /p password]] [/ru {[Domain\]User | &#34;System&#34;} [/rp Password]]<br/><br/>范例<br/>计划任务在每次系统启动的时候运行<br/>下面的命令计划 MyApp 程序在每次系统启动的时候运行，起始日期是 2001 年 3 月 15 日。<br/><br/>schtasks /cr&#101;ate /tn &#34;My App&#34; /tr c:\apps\myapp.exe /sc onstart /sd 03/15/2001<br/><br/>schtasks cr&#101;ate onlogon<br/><br/>语法<br/>schtasks /cr&#101;ate /tn TaskName /tr TaskRun /sc onlogon [/sd StartDate] [/s computer [/u [domain\]user /p password]] [/ru {[Domain\]User | &#34;System&#34;} [/rp Password]]<br/><br/>范例<br/>计划任务在用户登录到远程计算机的时候运行<br/>下面的命令计划批处理文件在用户（任何用户）每次登录到远程计算机上的时候运行。它使用 /s 参数指定远程计算机。因为命令是远程的，所以命令中所有的路径，包括批处理文件的路径，都指定为远程计算机上的路径。<br/><br/>schtasks /cr&#101;ate /tn &#34;Start Web Site&#34; /tr c:\myiis\webstart.bat /sc onlogon /s Server23<br/><br/>schtasks cr&#101;ate onidle<br/><br/>语法<br/>schtasks /cr&#101;ate /tn TaskName /tr TaskRun /sc onidle /iIdleTime [/sd StartDate] [/s computer [/u [domain\]user /p password]] [/ru {[Domain\]User | &#34;System&#34;} [/rp Password]]<br/><br/>范例<br/>计划某项任务在计算机空闲的时候运行<br/>下面的命令计划 MyApp 程序在计算机空闲的时候运行。它使用必需的 /i 参数指定在启动任务之前计算机必需持续空闲十分钟。<br/><br/>schtasks /cr&#101;ate /tn &#34;My App&#34; /tr c:\apps\myapp.exe /sc onidle /i 10<br/><br/>更多范例<br/>若要查看范例，请单击范例名称：<br/><br/>创建以 System 权限运行的任务<br/><br/>下面的命令计划 MyApp 程序以 NT Authority\System 帐户权限运行。在这个范例中，任务计划在每月的第一天运行，但对于以系统权限运行的任务可以使用所有的计划类型。<br/><br/>该命令使用 /ru &#34;System&#34; 参数指定系统安全上下文。因为系统任务不需要密码，所以忽略了 /rp 参数。<br/><br/>schtasks /cr&#101;ate /tn &#34;My App&#34; /tr c:\apps\myapp.exe /sc monthly /d 1 /ru &#34;System&#34;<br/><br/>作为响应，SchTasks.exe 显示一个信息性消息和一个成功消息。它不提示输入密码。<br/><br/>DE&gt;信息：此任务将被创建于用户名下 (&#34;NT AUTHORITY\SYSTEM&#34;)。成功：计划任务 &#34;My App&#34; 已成功创建。DE&gt;创建运行多个程序的任务<br/><br/>每个任务只能运行一个程序。但是可以创建一个运行多个程序的批处理文件，然后计划一个任务来运行该批处理文件。下面的过程说明了这个方法：<br/><br/>创建一个启动要运行程序的批处理文件。 <br/>在这个范例中创建了一个启动“事件查看器”(Eventvwr.exe) 和“系统监视器”(Perfmon.exe) 的批处理文件。<br/><br/>启动文本编辑器，例如“记事本”。 <br/>键入每个程序的名称和指向可执行文件的完全合格的路径。在这种情况下，文件包含有下列语句。 <br/>C:\Windows\System32\Eventvwr.exe<br/>C:\Windows\System32\Perfmon.exe<br/><br/>将文件存储为 MyApps.bat。<br/>使用 SchTasks.exe 创建一个运行 MyApps.bat 的任务。 <br/>下面的命令创建了 Monitor 任务，每当有人登录它就运行。它使用 /tn 参数命名任务，使用 /tr 参数运行 MyApps.bat。它使用 /sc 参数来指明 OnLogon 计划类型，使用 /ru 参数指定 Administrator 帐户。<br/><br/>schtasks /cr&#101;ate /tn Monitor /tr C:\MyApps.bat /sc onlogon /ru Reskit\Administrator<br/><br/>该命令的结果是，每当用户登录到计算机，任务就启动“事件查看器”和“系统监视器”。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.cyggg.cn/article.asp?id=39</link>
			<title><![CDATA[【ZT】Memcache]]></title>
			<author>veekchen@hotmail.com(veekchen)</author>
			<category><![CDATA[程序人生]]></category>
			<pubDate>Fri,26 Mar 2010 15:43:59 +0800</pubDate>
			<guid>http://www.cyggg.cn/default.asp?id=39</guid>
		<description><![CDATA[ 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Memcache是什么<br/>Memcache是danga.com的一个项目，最早是为 LiveJournal 服务的，目前全世界不少人使用这个缓存项目来构建自己大负载的网站，来分担数据库的压力。<br/>它可以应对任意多个连接，使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间，然后建立一个HashTable，Memcached自管理这些HashTable。<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>为什么会有Memcache和memcached两种名称？<br/>其实Memcache是这个项目的名称，而memcached是它服务器端的主程序文件名，<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>Memcache官方网站：<a href="http://www.danga.com/memcached" target="_blank" rel="external">http://www.danga.com/memcached</a>，<br/> <br/>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Memcache工作原理<br/>首先 memcached 是以守护程序方式运行于一个或多个服务器中，随时接受客户端的连接操作，客户端可以由各种语言编写，目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。客户端在与 memcached 服务建立连接之后，接下来的事情就是存取对象了，每个被存取的对象都有一个唯一的标识符 key，存取操作均通过这个 key 进行，保存到 memcached 中的对象实际上是放置内存中的，并不是保存在 cache 文件中的，这也是为什么 memcached 能够如此高效快速的原因。注意，这些对象并不是持久的，服务停止之后，里边的数据就会丢失。<br/> <br/>与许多 cache 工具类似，Memcached 的原理并不复杂。它采用了C/S的模式，在 server 端启动服务进程，在启动时可以指定监听的 ip，自己的端口号，所使用的内存大小等几个关键参数。一旦启动，服务就一直处于可用状态。Memcached 的目前版本是通过C实现，采用了单进程，单线程，异步I/O，基于事件 (event_based) 的服务方式.使用 libevent 作为事件通知实现。多个 Server 可以协同工作，但这些 Server 之间是没有任何通讯联系的，每个 Server 只是对自己的数据进行管理。Client 端通过指定 Server 端的 ip 地址(通过域名应该也可以)。需要缓存的对象或数据是以 key-&gt;value 对的形式保存在Server端。key 的值通过 hash 进行转换，根据 hash 值把 value 传递到对应的具体的某个 Server 上。当需要获取对象数据时，也根据 key 进行。首先对 key 进行 hash，通过获得的值可以确定它被保存在了哪台 Server 上，然后再向该 Server 发出请求。Client 端只需要知道保存 hash(key) 的值在哪台服务器上就可以了。<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其实说到底，memcache 的工作就是在专门的机器的内存里维护一张巨大的 hash 表，来存储经常被读写的一些数组与文件，从而极大的提高网站的运行效率。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.cyggg.cn/article.asp?id=37</link>
			<title><![CDATA[【ZT】手把手教你估算软件项目成本]]></title>
			<author>veekchen@hotmail.com(veekchen)</author>
			<category><![CDATA[程序人生]]></category>
			<pubDate>Tue,09 Mar 2010 10:50:46 +0800</pubDate>
			<guid>http://www.cyggg.cn/default.asp?id=37</guid>
		<description><![CDATA[[背景]<br/><br/>&nbsp;&nbsp; 软件项目一般来说可以分成两种：<br/><br/>A.&nbsp;&nbsp;&nbsp;&nbsp; 客户定制系统<br/><br/>B.&nbsp;&nbsp;&nbsp;&nbsp; 研发产品化系统<br/><br/>目前，国内绝大多数的都是在做A类型的客户定制系统，从接客户的单，到做客户的需求，拿到客户的合同，做开发，做实施，做后期维护之类的工作。<br/><br/>另外一种B类的，做产品研发的工作，国内涉及的人不多，而且它的项目估算里面涉及的问题很多，这里就不展开谈了。<br/><br/>做一个正常的软件项目，作为经营者和管理者，都想清楚地知道，这个软件项目有多大，要花掉多少成本，我能拿到的利润有多少，所以能不能准确地估算出软件项目的规模就显得很重要的。<br/><br/>下面我们来剖析一个小小的软件项目的规模估算。<br/><br/>[项目的需求文档]<br/><br/>&nbsp;&nbsp; 假设现在，我们接到了一个项目，项目的名称是×××会员综合管理平台，决定采取传统的B/S架构来设计，我们首先要干的事情就是具体的分析这个项目的需求文档，只有在熟悉需求的情况下才能知道整体的规模。<br/><br/>&nbsp;&nbsp; 具体的需求文档参见：<br/><br/>附件---系统的需求文档<br/> <br/><br/> <br/><br/>[项目规模的概算]<br/><br/>&nbsp;&nbsp; 我们大家都知道，正常的软件开发模式，比如瀑布开发模式的话，会分成<br/><br/>A.&nbsp;&nbsp;&nbsp;&nbsp; 需求分析<br/><br/>B.&nbsp;&nbsp;&nbsp;&nbsp; 基本设计<br/><br/>C.&nbsp;&nbsp;&nbsp;&nbsp; 详细设计<br/><br/>D.&nbsp;&nbsp;&nbsp;&nbsp; Codeing<br/><br/>E.&nbsp;&nbsp;&nbsp;&nbsp; UT<br/><br/>F.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CT<br/><br/>G.&nbsp;&nbsp;&nbsp;&nbsp; RT<br/><br/>H.&nbsp;&nbsp;&nbsp;&nbsp;后期维护<br/><br/>这么多阶段和步骤。但是根据，我所了解到的，国内除了少部分对日的大型公司会严格按照这种流程来做事情之外，绝大多数的国内公司还是随着自己的性子来。其中不乏，东软，联创之类的著名企业。所以我在制定项目概算的时候，还是按照国内的开发步骤来做：<br/><br/>大项目<br/> 中项目<br/> 小项目<br/> 人日<br/> <br/>系统设计<br/> 数据库设计(大概10张表左右)<br/> ------<br/> 6<br/> <br/>系统结构设计<br/> ------<br/> 6<br/> <br/>画面demo<br/> ------<br/> 10<br/> <br/>系统开发框架搭建<br/> ------<br/> 3<br/> <br/>开发作业<br/> 会员管理子模块<br/> 会员开卡画面<br/> 1.5<br/> <br/>会员开卡确认画面<br/> 0.5<br/> <br/>会员信息检索画面<br/> 1<br/> <br/>会员信息修改画面<br/> 1<br/> <br/>会员休息修改确认画面<br/> 0.5<br/> <br/>批量生成卡号<br/> 1<br/> <br/>会员积分输入和修改<br/> 2<br/> <br/>会员卡延期画面<br/> 2<br/> <br/>会员卡挂失画面<br/> 2<br/> <br/>商品管理子模块<br/> 商品录入画面<br/> 1<br/> <br/>商品录入确认画面<br/> 0.5<br/> <br/>商品检索画面<br/> 1<br/> <br/>商品信息维护画面<br/> 1<br/> <br/>库存管理<br/> 库存检索画面<br/> 1<br/> <br/>库存新建画面<br/> 1<br/> <br/>库存修改画面<br/> 1<br/> <br/>库存信息确认画面<br/> 0.5<br/> <br/>～省略～<br/> <br/>测试作业<br/> 测试数据和计划的准备<br/> ------<br/> 3<br/> <br/>分模块测试<br/> 分画面测试<br/> ～省略～<br/> <br/>后期维护<br/> 系统上线安装<br/> 硬件安装，布线<br/> 1<br/> <br/>环境安装，项目部署<br/> 1<br/> <br/>简单的客户培训<br/> 3<br/> <br/>维护<br/> 日常数据的维护<br/> 4<br/> <br/>BUG的修正<br/> 5<br/> <br/>总计<br/> 大约7人月以上<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/> <br/><br/> [结论] <br/><br/>软件公司在算钱的时候有几种方法：<br/><br/>A.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 国内的比如联创之类，用项目分段方法收钱，做到哪一个阶段，或者完成了一个模板的上线就算前<br/><br/>B.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 外包公司一般采用一个人月多少钱来收钱，比如对日外包一般是1万～2万一个人月。<br/><br/>对于老板而言，他要计算出项目的成本，也要这样算，比如以下：<br/><br/>（总人月：7人月）<br/> 项目成本<br/> 对客户收费<br/> <br/>总价<br/> 7万(市价：1万/人月)<br/> &gt;=8万<br/> <br/><br/># 为什么项目成本里面，一个人月会有1万呢<br/><br/>&nbsp;&nbsp;因为如果我们假设项目的成员构成如下：<br/><br/>&nbsp;&nbsp;职位<br/> 月工资<br/> <br/>PM<br/> 60,00<br/> <br/>SE<br/> 45,00<br/> <br/>PG(5人)<br/> 25,00×6<br/> <br/>公司日常运营费用(包括文职人员，会计，场地租金，旅游福利，公司上层的工资，电脑设备，和客户打交道的关系费-----)<br/> 500,00<br/> <br/><br/>于是我们就能得到：<br/><br/>月开销合计<br/> 75,500<br/> <br/>平均一个人月<br/> 10,786<br/> <br/><br/> <br/><br/># 为什么项目最后的售价一定会大于8万呢<br/><br/>在今天的IT市场上，一般来说作客户定制系统的公司，利润率只有10%～20%，厉害一点的比如联创，日恒一般也就15%。<br/><br/> 特别是现在每年5%的通货膨胀率，如果一个企业不拿到10%以上的利润，那这个公司一定会完蛋。<br/><br/> 所以，7万×(最起码的利润率)10%&gt;=8万。<br/><br/> 证明完毕<br/><br/><br/><br/>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/nanjingjiangbiao/archive/2010/03/04/5346859.aspx" target="_blank" rel="external">http://blog.csdn.net/nanjingjiangbiao/archive/2010/03/04/5346859.aspx</a>]]></description>
		</item>
		
			<item>
			<link>http://www.cyggg.cn/article.asp?id=23</link>
			<title><![CDATA[Visual Studio 2008 Team Suite Edition注册方法]]></title>
			<author>veekchen@hotmail.com(veekchen)</author>
			<category><![CDATA[程序人生]]></category>
			<pubDate>Fri,20 Nov 2009 16:30:21 +0800</pubDate>
			<guid>http://www.cyggg.cn/default.asp?id=23</guid>
		<description><![CDATA[今天不知为何一向都是破解版本的VS突然变成试用版，30日后过期，十分不解。看来是RP不好，所以在网上搜到以下方法，经本人测试，第一种方法可行！<br/><br/>Visual Studio 2008 Team Suite Edition的注册或是破解很简单，有两种方法：<br/>1. 安装完90天试用版后，在“添加或删除应用程序”，删除vs 2008，点击“卸载”，在卸载里有让输入序列号的地方，把正式版的序列号PYHYP-WXB3B-B2CCM-V9DX9-VDY8T输入进去就行了。<br/>2. 这种方法也是序列号的问题，把iso文件中的setup文件夹中的setup.sdb文件中的[Product Key]下的一行的原来的序列号换为能用的正式版的序列号就行了。如：<br/>[Product Key]<br/>PYHYPWXB3BB2CCMV9DX9VDY8T]]></description>
		</item>
		
			<item>
			<link>http://www.cyggg.cn/article.asp?id=13</link>
			<title><![CDATA[【ZT】用C#开发opengl ]]></title>
			<author>veekchen@hotmail.com(veekchen)</author>
			<category><![CDATA[程序人生]]></category>
			<pubDate>Thu,10 Sep 2009 09:55:32 +0800</pubDate>
			<guid>http://www.cyggg.cn/default.asp?id=13</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;已经很久没耍过OpenGL了，但还保留着当年对做游戏的热情。今天性起突然想在C#中搞OpenGL，考虑把以前做过的东西写成C#版本，不过我怕最后还是把以前的东西封成DLL直接调用而已。唉····懒惰啊。。。<br/><br/>【转贴正文】<br/>&nbsp;&nbsp;&nbsp;&nbsp;微软提供较少的标准支持，对于和他们竞争的东西—比如CORBA(COM的竞争对手)和OpenGL(DirectX的竞争对手)。<br/>不过在C＃中实现Opengl也并非没有可能，有很多很好的第3方库可以使用，这里列举2个。<br/>（1）CsGL<br/><a href="http://csgl.sourceforge.net/index.html" target="_blank" rel="external">http://csgl.sourceforge.net/index.html</a><br/>名气较大的opengl库，有稳定版本。sf上的项目地址<a href="http://sourceforge.net/project/showfiles.php?group_id=33241" target="_blank" rel="external">http://sourceforge.net/project/showfiles.php?group_id=33241</a>。<br/>目前有多个3D引擎项目使用的这个库。<br/><br/><br/><br/>（2）CSopenGL<br/><a href="http://www.ia.hiof.no/gb/ptools/csharp/p-csharp.html" target="_blank" rel="external">http://www.ia.hiof.no/gb/ptools/csharp/p-csharp.html</a><br/>有较详细的文档和例子。sf上的项目地址<a href="http://sourceforge.net/project/showfiles.php?group_id=54966" target="_blank" rel="external">http://sourceforge.net/project/showfiles.php?group_id=54966</a>&amp;package_id=49782。<br/><br/>CSopenGL的一个例子（我在VS2005上编译)<br/>－－－－－－－form1.cs－－－－－－－<br/>#region Using directives<br/><br/><br/><br/>using System;<br/>using System.Collections.Generic;<br/>using System.Drawing;<br/>using System.Collections;<br/>using System.ComponentModel;<br/>using System.Windows.Forms;<br/>using System.Data;<br/>using CSOpenGL;<br/>#endregion<br/><br/><br/><br/>namespace opentest<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;partial class Form1 : System.Windows.Forms.Form<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//private System.ComponentModel.Container components = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private GLView view;<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Form1()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view = new GLView();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Parent = this;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Cr&#101;ateControl();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Dock = DockStyle.Fill;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view._OnPaint = new Painter();<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected override void Dispose(bool disposing)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (disposing)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (components != null)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;components.Dispose();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Dispose();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base.Dispose(disposing);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void Form1_Load(object sender, EventArgs e)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public class Painter : GLViewPainter<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Painter() { }<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public override void Paint(GLView view)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glViewport(0, 0, view.Width, view.Height);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glMatrixMode(GL_PROJECTION);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glLoadIdentity();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gluPerspective(45.0f, 1.0f, 0.1f, 100.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glShadeModel(GL_SMOOTH);<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glClearColor(0.0f, 0.0f, 0.0f, 0.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glClearDepth(1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glEnable(GL_DEPTH_TEST);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glDepthFunc(GL_LEQUAL);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glMatrixMode(GL_MODELVIEW);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//drawPyramid();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//drawSphere();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawCube();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glFlush();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void drawPyramid()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glLoadIdentity();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTranslatef(-0.2f, 0.3f, -4.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glRotatef(45.0f, 1.0f, 1.0f, 1.0f);<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glBegin(GL_TRIANGLES);<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// front face triangle:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor3f(1.0f, 0.0f, 0.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(0.0f, 1.0f, 0.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor3f(0.0f, 1.0f, 0.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(-1.0f, -1.0f, 1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor3f(0.0f, 0.0f, 1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(1.0f, -1.0f, 1.0f);<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// right face triangle:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor3f(1.0f, 0.0f, 0.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(0.0f, 1.0f, 0.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor3f(0.0f, 0.0f, 1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(1.0f, -1.0f, 1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor3f(0.0f, 1.0f, 0.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(1.0f, -1.0f, -1.0f);<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//back face triangle:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor3f(1.0f, 0.0f, 0.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(0.0f, 1.0f, 0.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor3f(0.0f, 1.0f, 0.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(1.0f, -1.0f, -1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor3f(0.0f, 0.0f, 1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(-1.0f, -1.0f, -1.0f);<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// left face triangle:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor3f(1.0f, 0.0f, 0.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(0.0f, 1.0f, 0.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor3f(0.0f, 0.0f, 1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(-1.0f, -1.0f, -1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor3f(0.0f, 1.0f, 0.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(-1.0f, -1.0f, 1.0f);<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glEnd();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void drawCube()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// enable color blending:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glEnable(GL_BLEND);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glLoadIdentity();<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTranslatef(0.0f, 0.2f, -6.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glRotatef(45.0f, 1.0f, 1.0f, 1.0f);<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glBegin(GL_QUADS);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// tegner først de sidene som ikke skal være gjennomsiktige:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//the back:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor4f(1.0f, 1.0f, 0.0f, 1.0f); // yellow<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(1.0f, -1.0f, -1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(-1.0f, -1.0f, -1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(-1.0f, 1.0f, -1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(1.0f, 1.0f, -1.0f);<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//the bottom:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor4f(1.0f, 0.5f, 0.0f, 1.0f); // o&#114;ange<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(1.0f, -1.0f, 1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(-1.0f, -1.0f, 1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(-1.0f, -1.0f, -1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(1.0f, -1.0f, -1.0f);<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//the right face:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor4f(1.0f, 0.0f, 1.0f, 0.75f); // cyan<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(1.0f, 1.0f, -1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(1.0f, 1.0f, 1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(1.0f, -1.0f, 1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(1.0f, -1.0f, -1.0f);<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// de sidene som skal være gjennomsiktige:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// setter DepthBuffer read-only:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glDepthMask(0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//the front:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor4f(1.0f, 0.0f, 0.0f, 0.75f); // red<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(1.0f, 1.0f, 1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(-1.0f, 1.0f, 1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(-1.0f, -1.0f, 1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(1.0f, -1.0f, 1.0f);<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//the top:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor4f(0.0f, 1.0f, 0.0f, 0.75f); // green<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(1.0f, 1.0f, -1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(-1.0f, 1.0f, -1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(-1.0f, 1.0f, 1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(1.0f, 1.0f, 1.0f);<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//the left face:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glColor4f(0.0f, 0.0f, 1.0f, 0.75f); // blue<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(-1.0f, 1.0f, 1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(-1.0f, 1.0f, -1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(-1.0f, -1.0f, -1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glVertex3f(-1.0f, -1.0f, 1.0f);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glEnd();<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glDepthMask(1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glDisable(GL_BLEND);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void drawSphere()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float[] ambient = { 1.0f, 1.0f, 0.0f, 1.0f };<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float[] diffuse = { 1.0f, 1.0f, 0.0f, 1.0f };<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float[] specular = { 1.0f, 1.0f, 1.0f, 1.0f };<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float[] position = { 4.0f, 0.0f, 6.0f, 0.0f };<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glLightfv(GL_LIGHT0, GL_SPECULAR, specular);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glLightfv(GL_LIGHT0, GL_POSITION, position);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glEnable(GL_LIGHT0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glEnable(GL_LIGHTING);<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gluLookAt(-4.0, -5.0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);<br/><br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPtr hdc = gluNewQuadric();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gluSphere(hdc, 2.0, 40, 40);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gluDel&#101;teQuadric(hdc);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/><br/><br/>}<br/><br/>-------------program.cs--------------<br/>#region Using directives<br/><br/><br/><br/>using System;<br/>using System.Collections.Generic;<br/>using System.Windows.Forms;<br/><br/><br/><br/>#endregion<br/><br/><br/><br/>namespace opentest<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;static class Program<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// The main entry point for the application.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[STAThread]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static void Main()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Application.EnableVisualStyles();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Application.EnableRTLMirroring();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Application.Run(new Form1());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}<br/>]]></description>
		</item>
		
</channel>
</rss>
