<?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>Eyal's Posts</title>
	<atom:link href="http://www.epocalipse.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.epocalipse.com/blog</link>
	<description></description>
	<lastBuildDate>Tue, 11 Sep 2007 23:23:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>Avoiding &quot;connection: close&quot; when returning a 304 (Not Modified) status code in ASP.NET (Part 2)</title>
		<link>http://www.epocalipse.com/blog/2007/09/11/avoiding-connection-close-when-returning-a-304-not-modified-status-code-in-aspnet-part-2/</link>
		<comments>http://www.epocalipse.com/blog/2007/09/11/avoiding-connection-close-when-returning-a-304-not-modified-status-code-in-aspnet-part-2/#comments</comments>
		<pubDate>Tue, 11 Sep 2007 21:51:09 +0000</pubDate>
		<dc:creator>Eyal Post</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.epocalipse.com/blog/2007/09/11/avoiding-connection-close-when-returning-a-304-not-modified-status-code-in-aspnet-part-2/</guid>
		<description><![CDATA[In&#160;part 1&#160;I discussed how to return a HTTP&#160;304 status code when you don&#8217;t want to send clients an entire response if the client already has an updated version of the page in their cache. How can&#160;you verify this is actually working as you expect? You can an HTTP monitoring tool to see the requests your [...]]]></description>
			<content:encoded><![CDATA[<p>In&nbsp;<a href="http://www.epocalipse.com/blog/2007/09/11/avoiding-connection-close-when-returning-a-304-not-modified-status-code-in-aspnet-part-1" target="_blank">part 1</a>&nbsp;I discussed how to return a HTTP&nbsp;304 status code when you don&#8217;t want to send clients an entire response if the client already has an updated version of the page in their cache. </p>
<p>How can&nbsp;you verify this is actually working as you expect? You can an HTTP monitoring tool to see the requests your browser send and the responses the web server sends back. My favorite tool for this is <a href="http://www.fiddler2.com/" target="_blank">Fiddler</a>.&nbsp; </p>
<p>Here&#8217;s a screen capture&nbsp; of fiddler (click the link to see a larger image):</p>
<p><a href="http://www.epocalipse.com/blog/Avoidingconnectionclosewhenretu.NETPart2_287/Fiddler.png" target="_blank" atomicselection="true"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="282" alt="Fiddler" src="http://www.epocalipse.com/blog/Avoidingconnectionclosewhenretu.NETPart2_287/Fiddler_thumb.png" width="557" border="0"></a></p>
<p>Notice that the first request we get is a regular HTTP 200 response with the actual data (5 bytes in our case as seen in the <em>body</em> column). The second and third requests return a 304 response as expected. </p>
<p>If you look at the request headers you&#8217;ll see the expected If-Modified-Since (upper right pane)&nbsp;:</p>
<p><a href="http://www.epocalipse.com/blog/Avoidingconnectionclosewhenretu.NETPart2_287/Fiddler2.png" target="_blank" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 5px; border-right-width: 0px" height="282" alt="Fiddler2" src="http://www.epocalipse.com/blog/Avoidingconnectionclosewhenretu.NETPart2_287/Fiddler2_thumb.png" width="385" border="0"></a>&nbsp;<br />The Fiddler Timeline add-in provides a graphical layout of the requests, their timing, cache status and connection status. If you&#8217;ll go back to the first image you&#8217;ll notice that the second and third requests have a floppy icon near them which means these requests were served from the local cache instead of the server. You might also notice a red circle near that floppy.. That&#8217;s what this post is all about.</p>
<p>The red circle means the connection will be&nbsp;ended by the server after the response is over. This is also indicated by a &#8220;Connection: Close&#8221; header that was added to the response (which you can see in image 2 in the lower right pane). Why was the connection closed? The simple answer is because there&#8217;s no <em>content-length</em> header in the response. <em>Yeah, so?</em> So, if there&#8217;s not content-length header, then the client has no way of knowing when the response is finished and will just keep waiting for more data from the server. <em>Ahh.., but why wasn&#8217;t the content-length header added?</em> Well, I have no idea why. What I can tell you is that if your client is going to send another request to your server right after this one, it won&#8217;t be able to reuse that connection and will have to open a new one which, in some cases, is just a waste of time. So how do you avoid that? Simple:</p>
<p><code>context.Response.AddHeader("content-length", "0");</code>
<p>&nbsp;<br />Since we&#8217;re not sending any content (That&#8217;s what a 304 response is all about), we simply add that header. ASP.NET will now realize that the response is actually empty and there&#8217;s no reason to close the connection and will not add that header.</p>
<div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:c38fd811-80b8-4b2e-9149-c9e7d0ec7c29" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<p style="font-size: 10px; text-align: right">Technorati: <a href="http://technorati.com/tags/HTTP" rel="tag">HTTP</a>, <a href="http://technorati.com/tags/Caching" rel="tag">Caching</a>, <a href="http://technorati.com/tags/304" rel="tag">304</a>, <a href="http://technorati.com/tags/Fiddler" rel="tag">Fiddler</a>, <a href="http://technorati.com/tags/Tuning" rel="tag">Tuning</a>, <a href="http://technorati.com/tags/Performance" rel="tag">Performance</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.epocalipse.com/blog/2007/09/11/avoiding-connection-close-when-returning-a-304-not-modified-status-code-in-aspnet-part-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Avoiding &quot;connection: close&quot; when returning a 304 (Not Modified) status code in ASP.NET (Part 1)</title>
		<link>http://www.epocalipse.com/blog/2007/09/11/avoiding-connection-close-when-returning-a-304-not-modified-status-code-in-aspnet-part-1/</link>
		<comments>http://www.epocalipse.com/blog/2007/09/11/avoiding-connection-close-when-returning-a-304-not-modified-status-code-in-aspnet-part-1/#comments</comments>
		<pubDate>Tue, 11 Sep 2007 21:38:59 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.epocalipse.com/blog/2007/09/11/avoiding-connection-close-when-returning-a-304-not-modified-status-code-in-aspnet-part-1/</guid>
		<description><![CDATA[First, a short introduction to the 304 status code and how to use it in ASP.NET.Let&#8217;s say you&#160;have an ASP.NET page&#160;that returns data which can be cached on the client. Let&#8217;s also assume that this data doesn&#8217;t change often and you want the client to &#8220;ask&#8221; whether the data has changed before you return it. [...]]]></description>
			<content:encoded><![CDATA[<p>First, a <strike>short</strike> introduction to the 304 status code and how to use it in ASP.NET.<br />Let&#8217;s say you&nbsp;have an ASP.NET page&nbsp;that returns data which can be cached on the client. Let&#8217;s also assume that this data doesn&#8217;t change often and you want the client to &#8220;ask&#8221; whether the data has changed before you return it. How do you that on the web? You use a few standard HTTP headers and the 304 response code. </p>
<p>Let&#8217;s start with a very useless but simple example. Suppose&nbsp;we have an <a href="http://msdn2.microsoft.com/en-us/library/bb398986(vs.90).aspx" target="_blank">HTTP handler</a> that returns the current time updated to the minute:</p>
<pre class="code"><span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">void</span> ProcessRequest(<span style="color: rgb(43,145,175)">HttpContext</span> context)
{
    <span style="color: rgb(43,145,175)">DateTime</span> now = <span style="color: rgb(43,145,175)">DateTime</span>.Now;
    <span style="color: rgb(43,145,175)">DateTime</span> time = <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(43,145,175)">DateTime</span>(now.Year, now.Month,
        now.Day, now.Hour, now.Minute, 0);
    context.Response.Write(time.ToString(<span style="color: rgb(163,21,21)">"HH:mm"</span>));
}</pre>
<p>We just grab the current time, turn it into a DateTime without seconds and send it to the response stream. </p>
<p>Now, Since we only provide the time up to the second, It seems reasonable to tell the client to cache this result and don&#8217;t bother us again at least for another.. well for another minute. How do we do that? We set the <em>Expires</em> header:</p>
<pre class="code"><span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">void</span> ProcessRequest(<span style="color: rgb(43,145,175)">HttpContext</span> context)
{
...    <strong>context.Response.Cache.
        SetExpires(time.AddMinutes(1));</strong>
    context.Response.Write(time.ToString(<span style="color: rgb(163,21,21)">"HH:mm"</span>));
}</pre>
<p>This basically tell the client not to bother contacting the server for another minute since there won&#8217;t be any changes anyway. </p>
<p>But what will a user do if he&#8217;s sure&nbsp;that a minute already passed but the page still displays the old time? He&#8217;ll click the Refresh button. The browser will now send the request again and our handler will return the time again. </p>
<p>Since it takes a lot of resources to process that request, we would like our client to send the server something like &#8220;I have a cached version of&nbsp;this page from date XY. Do you have a newer version?&#8221;. To do that, our client has to know when was this resource last updated. If you&#8217;re retuning files, you can use the&nbsp;last modification date of the file. If you&#8217;re reading records from a database and you have a &#8220;MODIFICATION_DATE&#8221; column, you can use that. In our case, we simply return the time itself:</p>
<pre class="code"><span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">void</span> ProcessRequest(<span style="color: rgb(43,145,175)">HttpContext</span> context)
{
...    <strong>context.Response.Cache.SetLastModified(time);
</strong>    context.Response.Cache.
        SetExpires(time.AddMinutes(1));
    context.Response.Write(time.ToString(<span style="color: rgb(163,21,21)">"HH:mm"</span>));
}</pre>
<p>Now, when the user hits the refresh button, the browser will send an&nbsp; HTTP request&nbsp;with the following header:<br /><em>If-Modified-Since: Sun, 09 Sep 2007 18:19:00 GMT</em></p>
<p>All we have to do now, is check whether the&nbsp;client passed this header, check if our data has changed since that time and if nothing has changed, send a 304 response code without sending the data itself:</p>
<pre class="code"><span style="color: rgb(43,145,175)">NameValueCollection</span> headers =
    context.Request.Headers;

<span style="color: rgb(43,145,175)">DateTime</span> ifMod;
<span style="color: rgb(0,0,255)">if</span> (<span style="color: rgb(43,145,175)">DateTime</span>.TryParse(headers[<span style="color: rgb(163,21,21)">"If-Modified-Since"</span>],
    <span style="color: rgb(0,0,255)">out</span> ifMod))
{
    <span style="color: rgb(43,145,175)">TimeSpan</span> delta = <span style="color: rgb(43,145,175)">DateTime</span>.Now - ifMod;
    <span style="color: rgb(0,0,255)">if</span> (delta &lt; <span style="color: rgb(43,145,175)">TimeSpan</span>.FromMinutes(1))
    {
        <span style="color: rgb(0,128,0)">//nothing has changed, return 304
</span>        context.Response.StatusCode = 304;
        <span style="color: rgb(0,0,255)">return</span>;
    }
}</pre>
<p>Great, so what does all this have to do with this post title? This, and more in the next episode of..</p>
<div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:4ebb5896-149e-4d2f-9fd2-def9855ffecd" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<p style="font-size: 10px; text-align: right">Technorati: <a href="http://technorati.com/tags/HTTP" rel="tag">HTTP</a>, <a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a>, <a href="http://technorati.com/tags/Caching" rel="tag">Caching</a>, <a href="http://technorati.com/tags/304" rel="tag">304</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.epocalipse.com/blog/2007/09/11/avoiding-connection-close-when-returning-a-304-not-modified-status-code-in-aspnet-part-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JSON Viewer</title>
		<link>http://www.epocalipse.com/blog/2007/06/03/json-viewer/</link>
		<comments>http://www.epocalipse.com/blog/2007/06/03/json-viewer/#comments</comments>
		<pubDate>Sat, 02 Jun 2007 22:19:13 +0000</pubDate>
		<dc:creator>Eyal Post</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.epocalipse.com/blog/2007/06/03/json-viewer/</guid>
		<description><![CDATA[I just published a new project on CodePlex called JSON Viewer. The project is exactly what you&#8217;d expect: A viewer for JSON strings. The viewer comes in 3 flavors: A standalone viewer &#8211; JsonView.exe A plugin for Fiddler 2 (http://www.fiddler2.com) &#8211; FiddlerJsonViewer.dll A visualizer for Visual Studio 2005 &#8211; JsonVisualizer.dll [More screen shots] As you can see [...]]]></description>
			<content:encoded><![CDATA[<p>I just published a new project on <a href="http://www.codeplex.com/" target="_blank">CodePlex</a> called <a href="http://www.codeplex.com/JsonViewer" target="_blank">JSON Viewer</a>.</p>
<p>The project is exactly what you&#8217;d expect: A viewer for JSON strings. The viewer comes in 3 flavors:</p>
<ol>
<li>A standalone viewer &#8211; JsonView.exe</li>
<li>A plugin for Fiddler 2 (<a href="http://www.fiddler2.com" target="_blank">http://www.fiddler2.com</a>) &#8211; FiddlerJsonViewer.dll</li>
<li>A visualizer for Visual Studio 2005 &#8211; JsonVisualizer.dll</li>
</ol>
<p><a href="http://www.epocalipse.com/blog/JSONViewer_EEE/viewer_3.png" target="_blank"><img style="border-width: 0px" height="311" alt="viewer" src="http://www.epocalipse.com/blog/JSONViewer_EEE/viewer_thumb_3.png" width="440" border="0" /></a><br />
<a href="http://www.codeplex.com/JsonViewer/Wiki/View.aspx?title=More%20screen%20shots" target="_blank">[More screen shots]</a></p>
<p>As you can see above, the viewer simply shows a tree structure representation of the JSON format, But it has a few other cool features:</p>
<ol>
<li>The <a href="http://www.codeplex.com/JsonViewer/Wiki/View.aspx?title=More%20screen%20shots#textview" target="_blank">Text View</a> allows you to format the JSON string to make it more readable. It will also show you when there are errors in the string and <em>try</em> to show where the error is.</li>
<li>A simple and easy to use Find dialog let&#8217;s you find nodes within the JSON structure.</li>
<li>You can customize the viewer with 2 types of plug-ins:
<ul>
<li>Text providers allow you to show a different text representation for a JSON node. In the above screen shot, notice that the @99976124000000@ string is also shown as (Ajax.Net Date: 12/08/2002..)</li>
<li>Visualizers allow you to write custom UI that visualizes any JSON object in the way you find most appropriate. <a href="http://www.codeplex.com/JsonViewer/Wiki/View.aspx?title=More%20screen%20shots#visualizer" target="_blank">In this screen shot</a>, notice how the grid node is shown on the right inside a List View control.</li>
</ul>
</li>
</ol>
<p>You can download the latest version from <a href="http://www.codeplex.com/JsonViewer" target="_blank">here</a>. If you tried it, let me know what you think.</p>
<div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:068b4faf-a850-46ad-898a-2a2bdbd49895" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<p style="font-size: 10px; text-align: right">Technorati: <a href="http://technorati.com/tags/JSON" rel="tag">JSON</a>, <a href="http://technorati.com/tags/CodePlex" rel="tag">CodePlex</a>, <a href="http://technorati.com/tags/Fiddler" rel="tag">Fiddler</a>, <a href="http://technorati.com/tags/Viewer" rel="tag">Viewer</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.epocalipse.com/blog/2007/06/03/json-viewer/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>TFS Work Item plug-in for Cropper</title>
		<link>http://www.epocalipse.com/blog/2007/06/02/tfs-work-item-plug-in-for-cropper/</link>
		<comments>http://www.epocalipse.com/blog/2007/06/02/tfs-work-item-plug-in-for-cropper/#comments</comments>
		<pubDate>Sat, 02 Jun 2007 20:52:14 +0000</pubDate>
		<dc:creator>Eyal Post</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.epocalipse.com/blog/2007/06/02/tfs-work-item-plug-in-for-cropper/</guid>
		<description><![CDATA[My friend Dudu&#160;released a nifty plug-in for Cropper&#160;that allows you to&#160;take&#160;a screen capture and instantly create&#160;a Team Foundation Server Work Item with that image attached&#160;to it. Check it out Technorati: Cropper, Team Foundation Server, Work Items]]></description>
			<content:encoded><![CDATA[<p>My friend <a href="http://notsosmartbuilder.blogspot.com/" target="_blank">Dudu</a>&nbsp;released a nifty plug-in for <a href="http://www.codeplex.com/cropper" target="_blank">Cropper</a>&nbsp;that allows you to&nbsp;take&nbsp;a screen capture and instantly create&nbsp;a Team Foundation Server Work Item with that image attached&nbsp;to it. </p>
<p><a href="http://notsosmartbuilder.blogspot.com/2007/05/cropper-tfs-work-item-plugin.html" target="_blank">Check it out</a></p>
</p>
<div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:1d139dd3-1d7b-4764-8c1f-600b2188d7b9" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<p style="font-size: 10px; text-align: right">Technorati: <a href="http://technorati.com/tags/Cropper" rel="tag">Cropper</a>, <a href="http://technorati.com/tags/Team%20Foundation%20Server" rel="tag">Team Foundation Server</a>, <a href="http://technorati.com/tags/Work%20Items" rel="tag">Work Items</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.epocalipse.com/blog/2007/06/02/tfs-work-item-plug-in-for-cropper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VssConneXion and SourceConneXion for Delphi 2007</title>
		<link>http://www.epocalipse.com/blog/2007/04/28/vssconnexion-and-sourceconnexion-for-delphi-2007/</link>
		<comments>http://www.epocalipse.com/blog/2007/04/28/vssconnexion-and-sourceconnexion-for-delphi-2007/#comments</comments>
		<pubDate>Sat, 28 Apr 2007 19:06:28 +0000</pubDate>
		<dc:creator>Eyal Post</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.epocalipse.com/blog/2007/04/28/vssconnexion-and-sourceconnexion-for-delphi-2007/</guid>
		<description><![CDATA[The final Preview versions of VssConneXion and SourceConneXion for Delphi 2007 are now available for download from our site. If you&#8217;re a VssConneXion 4 or SourceConneXion 3 licensed user then your current license key will work for this version.]]></description>
			<content:encoded><![CDATA[<p>The final <strike>Preview</strike> versions of VssConneXion and SourceConneXion for Delphi 2007 are now available for <a href="http://www.epocalipse.com/downloads.htm">download</a> from our site. If you&#8217;re a VssConneXion 4 or SourceConneXion 3 licensed user then your current license key will work for this version.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.epocalipse.com/blog/2007/04/28/vssconnexion-and-sourceconnexion-for-delphi-2007/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Delphi 2007</title>
		<link>http://www.epocalipse.com/blog/2007/04/17/delphi-2007/</link>
		<comments>http://www.epocalipse.com/blog/2007/04/17/delphi-2007/#comments</comments>
		<pubDate>Tue, 17 Apr 2007 06:10:54 +0000</pubDate>
		<dc:creator>Eyal Post</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.epocalipse.com/blog/2007/04/17/delphi-2007/</guid>
		<description><![CDATA[The good news &#8211; Due to large demand, I ported Unit Expert to Delphi 2007. You can download the latest version from here: http://www.epocalipse.com/downloads.htm The somewhat good news &#8211; I&#8217;m working on the Delphi 2007 version of VssConneXion and SourceConneXion and things are looking good. I&#8217;m still waiting for Delphi 2007 support from&#160;one vendor and [...]]]></description>
			<content:encoded><![CDATA[<p>The good news &#8211; Due to large demand, I ported Unit Expert to Delphi 2007. You can download the latest version from here: <a title="http://www.epocalipse.com/downloads.htm" href="http://www.epocalipse.com/downloads.htm">http://www.epocalipse.com/downloads.htm</a></p>
<p>The somewhat good news &#8211; I&#8217;m working on the Delphi 2007 version of VssConneXion and SourceConneXion and things are looking good. I&#8217;m still waiting for Delphi 2007 support from&nbsp;one vendor and then I&#8217;ll be able to upload a new version &#8211; It looks like it will take another week or so.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.epocalipse.com/blog/2007/04/17/delphi-2007/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows Terminal Services Client</title>
		<link>http://www.epocalipse.com/blog/2006/11/05/windows-terminal-services-client/</link>
		<comments>http://www.epocalipse.com/blog/2006/11/05/windows-terminal-services-client/#comments</comments>
		<pubDate>Sat, 04 Nov 2006 22:01:13 +0000</pubDate>
		<dc:creator>Eyal Post</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.epocalipse.com/blog/2006/11/05/windows-terminal-services-client/</guid>
		<description><![CDATA[My friend Dudu Shmaya uploaded to CodePlex a utility that he and I developed together (He did most of the work, I only did the hacks that made it work just a little better..;-)) The project is a multi-tab terminal services (RDP) client that is very simple yet powerful (That&#8217;s a standard line in marketing brochures for utilities). [...]]]></description>
			<content:encoded><![CDATA[<p>My friend <a href="http://notsosmartbuilder.blogspot.com/">Dudu Shmaya</a> uploaded to <a href="http://www.codeplex.com">CodePlex</a> a utility that he and I developed together (He did most of the work, I only did the hacks that made it work just a little better..;-))</p>
<p>The <a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=Terminals">project</a> is a multi-tab terminal services (RDP) client that is very simple yet powerful (That&#8217;s a standard line in marketing brochures for utilities).</p>
<p><a href="http://www.epocalipse.com/blog/WindowsTerminalServicesClient_14513/TerminalsNew19.png" target="_new"><img style="margin: 0px; border: 0px" height="138" src="http://www.epocalipse.com/blog/WindowsTerminalServicesClient_14513/TerminalsNew_thumb18.png" width="190" border="0" /></a> <a href="http://www.epocalipse.com/blog/WindowsTerminalServicesClient_14513/TerminalsMain19.png" target="_new"><img style="border: 0px" height="135" src="http://www.epocalipse.com/blog/WindowsTerminalServicesClient_14513/TerminalsMain_thumb20.png" width="190" border="0" /></a></p>
<p>Highlights:</p>
<ol>
<li>Intuitive and simple UI.</li>
<li>Manage all your connections in a single location.</li>
<li>Allows you to define a group of connections, so you can easily connect to multiple sessions in a click.</li>
<li>Grab Input &#8211; when you click inside a terminal window, all input is automatically redirected to that terminal, so key like ALT+TAB and the &#8220;Windows&#8221; key work as expected. Click anywhere outside the terminal window to return the control to the host (If you&#8217;re a VMWare user &#8211; you know how this feature works).</li>
<li>Supports command line parameters to directly open a connection when it starts.</li>
<li>Supports a Full Screen mode where the terminal window gets all the screen but moving the mouse to the upper part of the screen still shows the tabs toolbar.</li>
<li>More to come soon..</li>
</ol>
<p>Download it here:<br />
<a href="http://www.codeplex.com/Terminals">http://www.codeplex.com/Terminals</a></p>
<p>By the way, If you&#8217;re using TFS, you might want to read Dudu&#8217;s <a href="http://notsosmartbuilder.blogspot.com">blog</a>. Don&#8217;t be fooled by the name of his blog, He&#8217;s actually a very smart guy &#8211; The name is just an <a href="http://www.smarteam.com">internal</a> joke.</p>
<p> </p>
<div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:23bc56ff-b9c0-4a16-9483-8bcfd237a088" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<p style="font-size: 10px; text-align: right">Technorati: <a href="http://technorati.com/tags/Terminal" rel="tag">Terminal</a>, <a href="http://technorati.com/tags/RDP" rel="tag">RDP</a>, <a href="http://technorati.com/tags/Tabbed" rel="tag">Tabbed</a>, <a href="http://technorati.com/tags/Utility" rel="tag">Utility</a>, <a href="http://technorati.com/tags/CodePlex" rel="tag">CodePlex</a>, <a href="http://technorati.com/tags/RDP%20Client" rel="tag">RDP Client</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.epocalipse.com/blog/2006/11/05/windows-terminal-services-client/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>.NET Web Services and STA COM Objects on MSDN Magazine</title>
		<link>http://www.epocalipse.com/blog/2006/11/04/net-web-services-sta-com-objects-and-msdn-magazine/</link>
		<comments>http://www.epocalipse.com/blog/2006/11/04/net-web-services-sta-com-objects-and-msdn-magazine/#comments</comments>
		<pubDate>Sat, 04 Nov 2006 20:52:04 +0000</pubDate>
		<dc:creator>Eyal Post</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.epocalipse.com/blog/2006/11/04/net-web-services-sta-com-objects-and-msdn-magazine/</guid>
		<description><![CDATA[Jeff Prosise wrote an article&#160;about running .NET web services on STA threads. The article appears in the October 2006 issue of MSDN Magazine and he bases his code example on my solution to this problem. I know I get many hits to my blog from people looking for a solution to this problem, So I&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p>Jeff Prosise wrote an <a href="http://msdn.microsoft.com/msdnmag/issues/06/10/WickedCode/">article</a>&nbsp;about running .NET web services on STA threads. The article appears in the October 2006 issue of MSDN Magazine and he bases his code example on <a href="http://www.epocalipse.com/blog/2006/03/04/aspnet-web-services-and-sta-com-objects/">my solution to this problem</a>.</p>
<p>I know I get many hits to my blog from people looking for a solution to this problem, So I&#8217;m linking to his article here. He explains the subject and my solution much better than me.. <img src='http://www.epocalipse.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:6f74b0d2-c7ce-446c-b28e-6c22d8e4feac" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<p style="font-size: 10px; text-align: right">Technorati: <a href="http://technorati.com/tags/STA" rel="tag">STA</a>, <a href="http://technorati.com/tags/COM" rel="tag">COM</a>, <a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a>, <a href="http://technorati.com/tags/Web%20Services" rel="tag">Web Services</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.epocalipse.com/blog/2006/11/04/net-web-services-sta-com-objects-and-msdn-magazine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VSSConverter GUI on CodePlex</title>
		<link>http://www.epocalipse.com/blog/2006/11/02/vssconverter-gui-on-codeplex/</link>
		<comments>http://www.epocalipse.com/blog/2006/11/02/vssconverter-gui-on-codeplex/#comments</comments>
		<pubDate>Thu, 02 Nov 2006 08:57:57 +0000</pubDate>
		<dc:creator>Eyal Post</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.epocalipse.com/blog/2006/11/02/vssconverter-gui-on-codeplex/</guid>
		<description><![CDATA[After several requests (Last one from Jeff Atwood, who&#8217;s blog I recommend for anyone using TFS),  I decided to upload VSSConverter GUI to CodePlex and make it an open source project. Hope someone will find this helpful. http://www.codeplex.com/VssConverterGui Technorati: Team System, VSSConverter, CodePlex]]></description>
			<content:encoded><![CDATA[<p>After several requests (Last one from Jeff Atwood, who&#8217;s <a href="http://blogs.vertigosoftware.com/teamsystem/">blog</a> I recommend for anyone using TFS),  I decided to upload VSSConverter GUI to CodePlex and make it an open source project. Hope someone will find this helpful.</p>
<p><a href="http://www.codeplex.com/VssConverterGui">http://www.codeplex.com/VssConverterGui</a></p>
<div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:20189212-8388-44cc-a348-d4d08ca66592" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; height: 18px">
<p style="font-size: 10px; text-align: right">Technorati: <a href="http://technorati.com/tags/Team%20System" rel="tag">Team System</a>, <a href="http://technorati.com/tags/VSSConverter" rel="tag">VSSConverter</a>, <a href="http://technorati.com/tags/CodePlex" rel="tag">CodePlex</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.epocalipse.com/blog/2006/11/02/vssconverter-gui-on-codeplex/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Using IFilter in Delphi</title>
		<link>http://www.epocalipse.com/blog/2006/04/30/using-ifilter-in-delphi/</link>
		<comments>http://www.epocalipse.com/blog/2006/04/30/using-ifilter-in-delphi/#comments</comments>
		<pubDate>Sun, 30 Apr 2006 05:43:46 +0000</pubDate>
		<dc:creator>Eyal Post</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.epocalipse.com/blog/2006/04/30/using-ifilter-in-delphi/</guid>
		<description><![CDATA[I noticed (by looking at my blog statistics) that&#160;I get&#160;quite a few&#160;visitors looking for IFilter and Delphi in google. The reason is that I have a article on using IFilter in C# (http://www.codeproject.com/csharp/IFilter.asp) and that I mention Delphi quite often in this blog.Anyway, I don&#8217;t have that information here, but I can point you to [...]]]></description>
			<content:encoded><![CDATA[<p>I noticed (by looking at my blog statistics) that&nbsp;I get&nbsp;quite a few&nbsp;visitors looking for IFilter and Delphi in google. The reason is that I have a article on using IFilter in C# (<a href="http://www.codeproject.com/csharp/IFilter.asp">http://www.codeproject.com/csharp/IFilter.asp</a>) and that I mention Delphi quite often in this blog.<br />Anyway, I don&rsquo;t have that information here, but I can point you to the right place:</p>
<p>Go to <a href="http://www.shorterpath.com/develop/spfree/default.asp">http://www.shorterpath.com/develop/spfree/default.asp</a>&nbsp;, and click &ldquo;download now&rdquo;. The zip file contains numerous free components from ShorterPath. The SPFilter.pas file contains a function that extracts text from a document using the IFilter interface. </p>
<p style="FONT-SIZE: 10px; TEXT-ALIGN: right">Technorati: <a href="http://technorati.com/tag/IFilter" rel="tag">IFilter</a>, <a href="http://technorati.com/tag/Delphi" rel="tag">Delphi</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.epocalipse.com/blog/2006/04/30/using-ifilter-in-delphi/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

