<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Gurock Software Blog</title>
	
	<link>http://blog.gurock.com</link>
	<description>Our products, programming &amp; business.</description>
	<lastBuildDate>Mon, 02 Nov 2009 14:00:23 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/gurock" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Aspect-oriented logging for .NET with PostSharp and SmartInspect</title>
		<link>http://blog.gurock.com/postings/aspect-oriented-logging-for-net-with-postsharp-and-smartinspect/848/</link>
		<comments>http://blog.gurock.com/postings/aspect-oriented-logging-for-net-with-postsharp-and-smartinspect/848/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 14:00:23 +0000</pubDate>
		<dc:creator>Tobias Gurock</dc:creator>
				<category><![CDATA[Gurock Software]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[SmartInspect]]></category>
		<category><![CDATA[si-article]]></category>

		<guid isPermaLink="false">http://blog.gurock.com/?p=848</guid>
		<description><![CDATA[This article is part of a series about aspect-oriented logging with SmartInspect, our logging tool for .NET, Java and Delphi. Please see the first article of this series for a complete overview over the available posts.
There are various AOP frameworks available for each of the three platforms SmartInspect supports, so why did we decide to [...]]]></description>
			<content:encoded><![CDATA[<p><em>This article is part of a series about aspect-oriented logging with <a href="http://www.gurock.com/smartinspect/">SmartInspect</a>, our logging tool for .NET, Java and Delphi. Please see the <a href="http://blog.gurock.com/postings/aspect-oriented-logging-and-smartinspect/814/">first article of this series</a> for a complete overview over the available posts.</em></p>
<p>There are various AOP frameworks available for each of the three platforms SmartInspect supports, so why did we decide to start with <a href="http://www.postsharp.org/">PostSharp</a> for the first part of this blog series about apsect-oriented logging? PostSharp has become the de-facto standard AOP framework for .NET and there are many things to like about PostSharp:</p>
<ul>
<li>PostSharp is really easy to use. It integrates nicely with MSBuild (and therefore Visual Studio) and you just need to complete the PostSharp setup and are good to go.</li>
<li>It provides different APIs depending on what you are trying to accomplish. You can use a low-level API for injecting snippets of MSIL code for complexer tasks (PostSharp.Core) or a very simple high-level API (PostSharp.Laos) to develop aspects with custom .NET attributes.</li>
<li>It&#8217;s very well documented. The APIs are fully documented and there are getting started tutorials, videos, a plugin repository and lots more. Can&#8217;t get a lot better than that.</li>
<li>It&#8217;s a compile-time AOP framework. Unlike other tools which inject the AOP code at runtime, it post-processes the assemblies directly after compliation which is more efficient and allows for more flexibility.</li>
<li>Last but not least, some SmartInspect customers were already successfully using PostSharp in their applications and told us that they liked the combination of both tools (that&#8217;s how we became aware of PostSharp in the first place).</li>
</ul>
<p>We will be using the simpler Laos API for our SmartInspect PostSharp aspects, as we found it sufficient for all our needs. The resulting library is able to automatically trace method execution, log exceptions and watch changes of field variables. The library comes with three aspects for the different tasks, each implemented as a custom .NET attribute.</p>
<h2>Using the SmartInspect aspects</h2>
<p>The general procedure of using a PostSharp aspect is to install the <a href="http://www.postsharp.org/download">PostSharp framework</a> and to add the <code>PostSharp.Public</code> and <code>PostSharp.Laos</code> assembly references to your application. PostSharp injects itself into the MSBuild build process and automatically processes all assemblies that reference PostSharp.</p>
<p>For our logging aspects, you further need to add references to the <code>Gurock.SmartInspect</code> and <code>Gurock.SmartInspect.PostSharp</code> assemblies (the logging library and PostSharp aspects, respectively). The logging library is included in the <a href="http://www.gurock.com/smartinspect/trial/">SmartInspect trial download</a> and the SmartInspect AOP plugin can be downloaded from the <a href="http://www.gurock.com/smartinspect/resources/">SmartInspect resources page</a>.</p>
<h2>Tracing method execution</h2>
<p>The first aspect I am going to demonstrate is for tracing method execution. This aspect makes it really easy to generate a complete call trace of your application, showing you the entire application flow and letting you inspect stack traces at each execution point. It automatically generates two log messages for each method call: one for entering a method and one when a method exits. You can also log the passed method arguments (when entering a method) and the method result (when exiting a method), respectively.</p>
<p>To use this aspect, simple add the <code>SiTrace</code> custom attribute to your application as follows (note how you can continue to use SmartInspect for complementary log messages, of course):</p>
<pre class="brush: csharp;">
using System;
using Gurock.SmartInspect;
using Gurock.SmartInspect.PostSharp;

[assembly:SiTrace(SessionName=&quot;Main&quot;)]

namespace Gurock.SmartInspect.PostSharp.Samples
{
	class Program
	{
		static void Main(string[] args)
		{
			SiAuto.Si.Enabled = true; // Enable logging
			Hello(&quot;World&quot;);
			Goodbye(&quot;World&quot;);
		}

		static void Hello(string name)
		{
			SiAuto.Main.LogMessage(&quot;Hello, {0}.&quot;, name);
		}

		static string Goodbye(string name)
		{
			string msg = String.Format(&quot;Goodbye, {0}.&quot;, name);
			SiAuto.Main.LogMessage(msg);
			return msg;
		}
	}
}
</pre>
<p>The attribute can be specified on a per-class/per-method basis or, like in our example, for the entire assembly. You can further specify filters for including/excluding certain modules/classes (called attribute targets in the PostSharp terminology), set aspect priorities (useful with nested aspects) <a href="http://www.postsharp.org/contributions/documentation">and much more</a>.</p>
<p>Our aspects have a few additional SmartInspect-related options. First, as you can see in the example above, you can set the session name used for sending log messages. If you do not want a hard-coded session name, you can tell the aspect to make use of the logging context and automatically adjust the name based on the current namespace or class. You can do so by setting a so called session policy. For example, to automatically use a session name that equals the name of the current class context, you can use a session policy of <code>SessionPolicy.TypeName</code> and omit the session name:</p>
<pre class="brush: csharp;">
...
[assembly:SiTrace(SessionPolicy=SessionPolicy.TypeName)]
...
</pre>
<p>There are additional options for including the method arguments (<code>IncludeArguments</code>) and method return value (<code>IncludeReturnValue</code>). With both options enabled, the resulting log looks as follows in the <a href="http://www.gurock.com/smartinspect/tour/1/">SmartInspect Console</a> (SmartInspect&#8217;s viewer application). Note how the automatic enter/exit messages are mixed with the manual log messages:</p>
<div style="text-align: center">
<a href="/wp-content/uploads/2009/10/postsharp-sitrace.png"><br /><img src="/wp-content/uploads/2009/10/postsharp-sitrace-small.png" alt="The SiTrace sample log shown in the SmartInspect Console" title="The SiTrace sample log shown in the SmartInspect Console" width="550" height="334" class="size-full wp-image-892" /></a><br /><em>The SiTrace sample log shown in the <a href="http://www.gurock.com/smartinspect/tour/1/">SmartInspect Console</a></em></div>
<h2>Logging exceptions</h2>
<p>Another typical use-case for logging is recording all occurring exceptions and this is usually done by adding log calls to your exception handlers. Adding log statements to all your exception handlers can get tedious and error-prone though (e.g., you could forget to rethrow the exception after logging it), so we&#8217;ve added an aspect to automate this task for you. To use it, just add the <code>SiException</code> attribute to your code:</p>
<pre class="brush: csharp;">
using System;
using Gurock.SmartInspect;
using Gurock.SmartInspect.PostSharp;

...

[assembly: SiException(SessionName=&quot;Main&quot;)]

...

		static void Hello(string name)
		{
			SiAuto.Main.LogMessage(&quot;Hello, {0}.&quot;, name);
			throw new Exception(&quot;This is a test exception&quot;);
		}

...
</pre>
<p>Note how the exception is now automatically included in the resulting log (within the expected method context):</p>
<div style="text-align: center">
<a href="/wp-content/uploads/2009/10/postsharp-siexception.png"><br /><img src="/wp-content/uploads/2009/10/postsharp-siexception-small.png" alt="The SiException sample log shown in the SmartInspect Console" title="The SiException sample log shown in the SmartInspect Console" width="550" height="334" class="size-full wp-image-892" /></a><br /><em>The SiException sample log shown in the <a href="http://www.gurock.com/smartinspect/tour/1/">SmartInspect Console</a></em></div>
<h2>Watching field values</h2>
<p>Arguably the most advanced aspect in this library is the <code>SiField</code> attribute. This attribute lets you automatically record any changes to values of object or class fields. The aspect gets notified whenever the value of a field changes and then logs the name of the field along with its old and new value. You can configure whether the aspect should send the name and values as normal log messages or as SmartInspect watches (for showing the latest values of a variable in the watches toolbox or for displaying its history as a chart in the watches graph). By default, both watches and normal messages are logged.</p>
<p>Let&#8217;s have a look at the following example which demonstrates <code>SiField</code> in practice. Note how we use <code>SiField</code> as an attribute for the entire assembly again. We could also limit it to individual classes or fields, either by writing the attribute above the classes/fields we want to inspect or by specifying filters/attribute targets for the global attribute.</p>
<pre class="brush: csharp;">
using System;
using Gurock.SmartInspect;
using Gurock.SmartInspect.PostSharp;

[assembly: SiField(SessionName = &quot;Main&quot;)]

namespace Gurock.SmartInspect.PostSharp.Samples
{
	class Program
	{
		public static int FIELD;

		static void Main(string[] args)
		{
			SiAuto.Si.Enabled = true; // Enable logging
			Counting();
		}

		static void Counting()
		{
			Random r = new Random();

			for (int i = 0; i &lt; 10; i++)
			{
				FIELD = r.Next(100);
				Thread.Sleep(1000);
			}
		}
	}
}
</pre>
<p>And here&#8217;s the generated log in the SmartInspect Console:</p>
<div style="text-align: center">
<a href="/wp-content/uploads/2009/10/postsharp-sifield.png"><br /><img src="/wp-content/uploads/2009/10/postsharp-sifield-small.png" alt="The SiField sample log shown in the SmartInspect Console" title="The SiField sample log shown in the SmartInspect Console" width="550" height="334" class="size-full wp-image-892" /></a><br /><em>The SiField sample log shown in the <a href="http://www.gurock.com/smartinspect/tour/1/">SmartInspect Console</a></em></div>
<p>As you can see, every field change is automatically logged and shown in the Console. The watches toolbox in the lower left of the Console displays the latest value of <code>FIELD</code> in addition to the normal log messages in the main view. Also note the watches graph on the right that displays the field&#8217;s history as a chart (with its values over time). I believe an upcoming version of PostSharp will also be able to watch properties and we will update our library accordingly when this feature is available.</p>
<p>The nice thing about these aspects is that they can be freely combined as you like. You can mix and match the aspects as needed. If you plan to use our aspects and library, I also recommend taking a look at the <a href="http://www.postsharp.org/">PostSharp documentation</a> for more details about aspects, AOP and PostSharp in general as well as how to configure PostSharp for more complex scenarios.</p>
<p>Feel free to <a href="mailto:tg@gurock.com">send me an email</a> or leave a comment on this blog in case you have any questions <a href="http://www.gurock.com/smartinspect/resources/">about this plugin</a>.</p>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Faspect-oriented-logging-for-net-with-postsharp-and-smartinspect%2F848%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Faspect-oriented-logging-for-net-with-postsharp-and-smartinspect%2F848%2F" height="61" width="51" /></a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/gurock?a=s5sJXu-Idyo:2E-7x1yTiLU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/gurock?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=s5sJXu-Idyo:2E-7x1yTiLU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/gurock?i=s5sJXu-Idyo:2E-7x1yTiLU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=s5sJXu-Idyo:2E-7x1yTiLU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/gurock?i=s5sJXu-Idyo:2E-7x1yTiLU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=s5sJXu-Idyo:2E-7x1yTiLU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/gurock?i=s5sJXu-Idyo:2E-7x1yTiLU:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.gurock.com/postings/aspect-oriented-logging-for-net-with-postsharp-and-smartinspect/848/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using a custom Log4net appender with SmartInspect</title>
		<link>http://blog.gurock.com/postings/using-a-custom-log4net-appender-with-smartinspect/948/</link>
		<comments>http://blog.gurock.com/postings/using-a-custom-log4net-appender-with-smartinspect/948/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 14:00:16 +0000</pubDate>
		<dc:creator>Dennis Gurock</dc:creator>
				<category><![CDATA[Gurock Software]]></category>
		<category><![CDATA[SmartInspect]]></category>

		<guid isPermaLink="false">http://blog.gurock.com/?p=948</guid>
		<description><![CDATA[A popular logging framework with .NET developers is log4net, a text-only logging library that has been ported to .NET from the well-known Java logging library log4j. Similar to how I already outlined in our recent log4j blog posting, we regularly get emails from users who are interested in switching from log4net to SmartInspect. They want [...]]]></description>
			<content:encoded><![CDATA[<p>A popular logging framework with .NET developers is log4net, a text-only logging library that has been ported to .NET from the well-known Java logging library log4j. Similar to how I already outlined in <a href="http://blog.gurock.com/?p=804">our recent log4j blog posting</a>, we regularly get emails from users who are interested in switching from log4net to SmartInspect. They want to take advantage of SmartInspect&#8217;s rich logging capabilities, our Console (SmartInspect&#8217;s monitoring and analysis tool) and all the unique protocol options available in SmartInspect (such as log file encryption, the memory protocol, backlog queues etc).</p>
<p>Switching to a new logging library is not an easy task if you have to replace all existing logging calls with new ones. Luckily, you can extend log4net with custom appenders that allow you to route the log messages to a new destination, for example, to SmartInspect. We have developed such an appender (two, actually) and demonstrate how to use them in a new article:</p>
<p><strong><a href="http://www.gurock.com/smartinspect/using-a-custom-log4net-appender-with-smartinspect.a.html">Using a Custom Log4net Appender with SmartInspect</a></strong></p>
<p>We hope this will make it a lot more attractive for .NET developers to port existing projects that make use of the classic log4net log framework to SmartInspect.</p>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Fusing-a-custom-log4net-appender-with-smartinspect%2F948%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Fusing-a-custom-log4net-appender-with-smartinspect%2F948%2F" height="61" width="51" /></a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/gurock?a=clwKoS5U2hI:Z4t0aunBbec:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/gurock?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=clwKoS5U2hI:Z4t0aunBbec:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/gurock?i=clwKoS5U2hI:Z4t0aunBbec:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=clwKoS5U2hI:Z4t0aunBbec:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/gurock?i=clwKoS5U2hI:Z4t0aunBbec:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=clwKoS5U2hI:Z4t0aunBbec:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/gurock?i=clwKoS5U2hI:Z4t0aunBbec:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.gurock.com/postings/using-a-custom-log4net-appender-with-smartinspect/948/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aspect-oriented logging and SmartInspect</title>
		<link>http://blog.gurock.com/postings/aspect-oriented-logging-and-smartinspect/814/</link>
		<comments>http://blog.gurock.com/postings/aspect-oriented-logging-and-smartinspect/814/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 08:00:04 +0000</pubDate>
		<dc:creator>Tobias Gurock</dc:creator>
				<category><![CDATA[Gurock Software]]></category>
		<category><![CDATA[SmartInspect]]></category>

		<guid isPermaLink="false">http://blog.gurock.com/?p=814</guid>
		<description><![CDATA[One of the things that bugs me a bit when adding logging code to applications is that they make the actual code harder to read. Each line of logging code competes with a real line of application code. You have to find a good trade-off between readability, logging performance and log coverage and that&#8217;s not [...]]]></description>
			<content:encoded><![CDATA[<p>One of the things that bugs me a bit when adding logging code to applications is that they make the actual code harder to read. Each line of logging code competes with a real line of application code. You have to find a good trade-off between readability, logging performance and log coverage and that&#8217;s not easy to do in every case. Ideally, your entire application is well-instrumented and you can switch logging on or off for certain application modules depending on your needs. But this usually results in hundreds or thousands of additional lines of code, just for logging. Of course, the benefits from having all those log statements in place far outweighs the disadvantages of the code inflation, but still, those lines are anything but beautiful.</p>
<p>Another issue with logging is that adding all those log calls takes time and getting a good log coverage can get tedious when instrumenting a large existing application. That&#8217;s not necessarily the case if you add logging from the very beginning of development, but let&#8217;s face it, most applications have already reached a mature state before you think of adding diagnostics and logging features. Adding such features often comes as an afterthought (which it shouldn&#8217;t, ideally), so when you or a customer experience a problem which you cannot easily reproduce, you are instrumenting your application or parts of it and that isn&#8217;t any fun at all. We usually recommend instrumenting the most important parts of an application first and then building from there, but it&#8217;s still, well, time-consuming.</p>
<p>Fortunately, there are approaches and techniques to solve both of these problems, with one of the most promising being <em><a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming">aspect-oriented programming</a></em> (or AOP for short):</p>
<blockquote><p>&#8220;Aspect-oriented programming (AOP) is a programming paradigm that increases modularity by enabling improved separation of concerns. This entails breaking down a program into distinct parts (so-called concerns, cohesive areas of functionality). All programming paradigms support some level of grouping and encapsulation of concerns into separate, independent entities by providing abstractions (e.g. procedures, modules, classes, methods) that can be used to implement, abstract and compose these concerns. But some concerns defy these forms of implementation and are called crosscutting concerns because they &#8220;cut across&#8221; multiple abstractions in a program.&#8221;</p></blockquote>
<p>It&#8217;s been several years since I first heard about AOP. Back then, AOP was being marketed as one of the next big things in programming (okay, it&#8217;s been <em>several, several</em> years now). Supporters of AOP claimed it would change programming and software development as much as object-oriented programming did 20 years ago. We now know that it hasn&#8217;t and probably never will to that extend, but it&#8217;s for sure a nice addition to the developer&#8217;s toolbox.</p>
<p>So, what&#8217;s so special about AOP? The most beautiful aspect of AOP is that it improves the modularity of your application by putting parts that logically belong together in one central location. You can implement security concepts, caching, transactions, <a href="http://en.wikipedia.org/wiki/Design_by_contract">design by contract</a> and of course a complete logging solution without touching any of your existing classes or methods. This means there&#8217;s no need for repeated boiler plate code for checking method arguments for <code>null</code> values, no repetitions of the same begin/commit/rollback transaction code or for adding exception logging code to every exception handler. You simply tell the AOP framework which parts of your application should make use of which features (also called <em>aspects</em> in AOP terminology) and the AOP framework does all the work wiring those aspects to your application modules.</p>
<p>In the coming weeks, we will take a look at some of the available AOP frameworks for the different platforms supported by SmartInspect here on this blog and show how to build a sophisticated logging layer with these frameworks and our own <a href="http://www.gurock.com/smartinspect/">logging tool SmartInspect</a>. Stay tuned!</p>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Faspect-oriented-logging-and-smartinspect%2F814%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Faspect-oriented-logging-and-smartinspect%2F814%2F" height="61" width="51" /></a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/gurock?a=H6i6aJ73KLw:F1S5D6cP7hg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/gurock?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=H6i6aJ73KLw:F1S5D6cP7hg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/gurock?i=H6i6aJ73KLw:F1S5D6cP7hg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=H6i6aJ73KLw:F1S5D6cP7hg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/gurock?i=H6i6aJ73KLw:F1S5D6cP7hg:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=H6i6aJ73KLw:F1S5D6cP7hg:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/gurock?i=H6i6aJ73KLw:F1S5D6cP7hg:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.gurock.com/postings/aspect-oriented-logging-and-smartinspect/814/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Using a custom Log4j appender with SmartInspect</title>
		<link>http://blog.gurock.com/postings/using-a-custom-log4j-appender-with-smartinspect/804/</link>
		<comments>http://blog.gurock.com/postings/using-a-custom-log4j-appender-with-smartinspect/804/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 12:21:50 +0000</pubDate>
		<dc:creator>Dennis Gurock</dc:creator>
				<category><![CDATA[Gurock Software]]></category>
		<category><![CDATA[SmartInspect]]></category>

		<guid isPermaLink="false">http://blog.gurock.com/?p=804</guid>
		<description><![CDATA[If you are a Java developer you mostly likely know Log4j, a text-only logging library provided by the Apache foundation. Now, we regularly get inquiries from log4j users who want to switch to SmartInspect, as they want to benefit from SmartInspect&#8217;s additional capabilities such as the Console (our log viewer), log server, advanced protocol options [...]]]></description>
			<content:encoded><![CDATA[<p>If you are a Java developer you mostly likely know Log4j, a text-only logging library provided by the Apache foundation. Now, we regularly get inquiries from log4j users who want to switch to SmartInspect, as they want to benefit from SmartInspect&#8217;s additional capabilities such as the Console (our log viewer), log server, advanced protocol options and so on.</p>
<p>Porting an existing application with thousands of <a href="http://www.gurock.com/smartinspect/smartinspect-log4j.l.html">log4j</a> log statements isn&#8217;t easy if you have to replace each and every log call. To make it easier to switch to SmartInspect, we are now providing <a href="http://www.gurock.com/smartinspect/writing-a-custom-log4j-appender-for-smartinspect.a.html">custom log4j appenders</a> that can be used to forward all log messages to SmartInspect. Once you include and configure one of our appenders, you can benefit from SmartInspect&#8217;s infrastructure and, depending on which appender you use, also directly benefit from SmartInspect&#8217;s additional logging capabilities.</p>
<p>We hope this will make it a lot easier to port existing projects that make use of the classic log4j log framework to SmartInspect. Take a look at the full article here:</p>
<p><strong><a href="http://www.gurock.com/smartinspect/writing-a-custom-log4j-appender-for-smartinspect.a.html">Writing a Custom Log4j Appender for SmartInspect</a></strong></p>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Fusing-a-custom-log4j-appender-with-smartinspect%2F804%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Fusing-a-custom-log4j-appender-with-smartinspect%2F804%2F" height="61" width="51" /></a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/gurock?a=L2-xm9aCfJ0:NG3QJCkO9f8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/gurock?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=L2-xm9aCfJ0:NG3QJCkO9f8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/gurock?i=L2-xm9aCfJ0:NG3QJCkO9f8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=L2-xm9aCfJ0:NG3QJCkO9f8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/gurock?i=L2-xm9aCfJ0:NG3QJCkO9f8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=L2-xm9aCfJ0:NG3QJCkO9f8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/gurock?i=L2-xm9aCfJ0:NG3QJCkO9f8:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.gurock.com/postings/using-a-custom-log4j-appender-with-smartinspect/804/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Working with Delphi’s new Exception.StackTrace</title>
		<link>http://blog.gurock.com/postings/working-with-delphis-new-exception-stacktrace/730/</link>
		<comments>http://blog.gurock.com/postings/working-with-delphis-new-exception-stacktrace/730/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 16:30:16 +0000</pubDate>
		<dc:creator>Tobias Gurock</dc:creator>
				<category><![CDATA[DelphiFeeds.com]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[SmartInspect]]></category>
		<category><![CDATA[si-article]]></category>

		<guid isPermaLink="false">http://blog.gurock.com/?p=730</guid>
		<description><![CDATA[One feature I often miss when using Delphi is the support for proper exception stack traces at run-time. You know, those useful stack traces that show you exactly where an exception occurred, ideally with the method name and line number of where the exception was raised. Both .NET and Java have excellent stack trace support [...]]]></description>
			<content:encoded><![CDATA[<p>One feature I often miss when using Delphi is the support for proper exception stack traces at run-time. You know, those useful stack traces that show you exactly where an exception occurred, ideally with the method name and line number of where the exception was raised. Both .NET and Java have excellent stack trace support built right into the framework and the Exception classes. You just call <a href="http://msdn.microsoft.com/en-us/library/system.exception.stacktrace.aspx">Exception.StackTrace</a> (.NET) or <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html#getStackTrace%28%29">Exception.getStackTrace</a> (Java) and get a detailed analysis of where the exception was thrown and how it got passed to your exception handler.</p>
<p>Unfortunately, Delphi never had good (built-in) run-time support for stack traces. The features for stack traces during debugging in the IDE are/were okay, but there were nothing in the language or framework which helped you to find out programmatically where an exception occurred at run-time and, more importantly, how it got passed to your exception handler (besides the original exception address, maybe). So, I was happy to see that Delphi 2009 finally introduced a new StackTrace property which, I hoped, would return a full-blown stack trace when you caught an exception.</p>
<p>The initial happiness soon wore off when I realized that the StackTrace property was really just a placeholder to <em>return a stack trace from a possible stack trace provider</em> rather than a real stack trace implementation. So, without such a provider (and there&#8217;s none that comes directly with Delphi), there is still no way to get a stack trace for your exceptions. Though a bit disappointing, the good thing is that there&#8217;s now finally a standardized way to get a stack trace, even if it&#8217;s not implemented by default.</p>
<p>Exception reporting tools such as <a href="http://www.eurekalog.com/">Eurekalog</a> or <a href="http://www.madshi.net/madExceptDescription.htm">madExcept</a> or debug helpers such as the <a href="http://sourceforge.net/projects/jcl/">JclDebug</a> unit can register themselves as providers and use their engines to return a stack trace when an exception is raised. I&#8217;ve built a small unit which demonstrates this with the Jcl in combination with our logging tool <a href="http://www.gurock.com/smartinspect/">SmartInspect</a> and I&#8217;ve heard Fabio of Eurekalog is working on a similar feature for his component:</p>
<pre class="brush: delphi;">
unit StackTrace;

interface

uses
  SysUtils, Classes, JclDebug;

implementation

function GetExceptionStackInfoProc(P: PExceptionRecord): Pointer;
var
  LLines: TStringList;
  LText: String;
  LResult: PChar;
begin
  LLines := TStringList.Create;
  try
    JclLastExceptStackListToStrings(LLines, True, True, True, True);
    LText := LLines.Text;
    LResult := StrAlloc(Length(LText));
    StrCopy(LResult, PChar(LText));
    Result := LResult;
  finally
    LLines.Free;
  end;
end;

function GetStackInfoStringProc(Info: Pointer): string;
begin
  Result := string(PChar(Info));
end;

procedure CleanUpStackInfoProc(Info: Pointer);
begin
  StrDispose(PChar(Info));
end;

initialization
  // Start the Jcl exception tracking and register our Exception
  // stack trace provider.
  if JclStartExceptionTracking then
  begin
    Exception.GetExceptionStackInfoProc := GetExceptionStackInfoProc;
    Exception.GetStackInfoStringProc := GetStackInfoStringProc;
    Exception.CleanUpStackInfoProc := CleanUpStackInfoProc;
  end;

finalization
  // Stop Jcl exception tracking and unregister our provider.
  if JclExceptionTrackingActive then
  begin
    Exception.GetExceptionStackInfoProc := nil;
    Exception.GetStackInfoStringProc := nil;
    Exception.CleanUpStackInfoProc := nil;
    JclStopExceptionTracking;
  end;
end.
</pre>
<p>The unit merely starts and stops the exception tracking of the Jcl, implements a minimal stack trace provider and registers for the Exception provider events. The GetExceptionStackInfoProc and CleanUpStackInfoProc functions are automatically called by the RTL to give the provider the opportunity to initialize and cleanup the stack trace after an exception occurred. GetStackInfoStringProc is called indirectly when you access the StackTrace property and is responsible for returning the actual stack trace. </p>
<p>So, how do you use this unit? Let&#8217;s have a look at the following example:</p>
<pre class="brush: delphi;">
...

uses
  ..., StackTrace;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure SomeMethod;
  end;

implementation

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    SomeMethod;
  except
    // Log the exception: We use SmartInspect here because it has
    // built-in support for Exception.StackTrace but you could also
    // access the StackTrace property here directly.
    SiMain.LogException;
  end;
end;

procedure TForm1.SomeMethod;
begin
  raise Exception.Create('A test exception');
end;

...
</pre>
<p>As you can see, using this unit is just a matter of adding it to our uses clause. It won&#8217;t get any simpler than that. The unit will take care of registering/unregistering itself as a stack trace provider and when you now access the StackTrace property of an Exception object, you will get a detailed stack trace. To include the method names and line numbers in the stack trace, make sure to let the linker include debug symbols into your application and to enable the &#8216;Use debug .dcus&#8217; option in case you also want line numbers from the VCL and RTL methods.</p>
<div style="text-align: center">
<a href="/wp-content/uploads/2009/10/delphi-stacktrace.png"><br />
<img src="/wp-content/uploads/2009/10/delphi-stacktrace-small.png" alt="delphi-stacktrace-small" title="delphi-stacktrace-small" width="550" height="441" class="aligncenter size-full wp-image-787" /></a><br />
<em>The <a href="http://www.gurock.com/smartinspect/">SmartInspect Console</a> showing the stack trace of an exception</em>
</div>
<p>Now, when you use SmartInspect for logging and have a stack trace provider registered, all your logged exceptions automatically include the exception&#8217;s call stack. Pretty useful, isn&#8217;t it?</p>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Fworking-with-delphis-new-exception-stacktrace%2F730%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Fworking-with-delphis-new-exception-stacktrace%2F730%2F" height="61" width="51" /></a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/gurock?a=XcYeNyeZYWc:A8llKxtZI_0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/gurock?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=XcYeNyeZYWc:A8llKxtZI_0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/gurock?i=XcYeNyeZYWc:A8llKxtZI_0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=XcYeNyeZYWc:A8llKxtZI_0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/gurock?i=XcYeNyeZYWc:A8llKxtZI_0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=XcYeNyeZYWc:A8llKxtZI_0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/gurock?i=XcYeNyeZYWc:A8llKxtZI_0:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.gurock.com/postings/working-with-delphis-new-exception-stacktrace/730/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Announcing TestRail Beta 1.0.2</title>
		<link>http://blog.gurock.com/postings/announcing-testrail-beta-1-0-2/745/</link>
		<comments>http://blog.gurock.com/postings/announcing-testrail-beta-1-0-2/745/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 15:46:27 +0000</pubDate>
		<dc:creator>Dennis Gurock</dc:creator>
				<category><![CDATA[Gurock Software]]></category>
		<category><![CDATA[TestRail]]></category>

		<guid isPermaLink="false">http://blog.gurock.com/?p=745</guid>
		<description><![CDATA[We are happy to announce the new beta version 1.0.2 of our upcoming test case management software TestRail. Besides adding dozens of bug fixes, improvements and smaller features, this new beta release includes the first version of the test plan and configuration support we recently discussed on this blog. You can view a list of [...]]]></description>
			<content:encoded><![CDATA[<p>We are happy to announce the new beta version 1.0.2 of our upcoming <a href="http://www.gurock.com/testrail/">test case management</a> software TestRail. Besides adding dozens of bug fixes, improvements and smaller features, this new beta release includes the first version of the test plan and configuration support we <a href="http://blog.gurock.com/postings/testrail-feature-feedback-needed/719/">recently discussed</a> on this blog. You can view a list of all changes in our <a href="http://www.gurock.com/support/forum/topic/292/testrail-beta-102-released/">announcement forum</a>.</p>
<h2>Test Plans and Configurations</h2>
<div style="float:right; margin-left: 1em"><a href="http://blog.gurock.com/wp-content/uploads/2009/10/testplan.png"><img src="http://blog.gurock.com/wp-content/uploads/2009/10/testplan-small.png" alt="TestRail Test Plan" title="TestRail Test Plan" width="242" height="250" class="alignnone size-full wp-image-771" /></a></div>
<p>The new support for test plans and configurations makes it a lot easier to run your test suites and cases against multiple configurations such as web browsers, operating systems or hardware platforms. Additionally, test plans allow you to start multiple test runs at once and makes it easy to organize related runs into groups.</p>
<p>We are still looking into making a few smaller changes to this feature, so please let us know what you think by providing feedback in the beta forum or by contacting us.</p>
<h2>Upgrading to the new version</h2>
<p>To update your TestRail beta installation, please download the new version from your private beta link and follow the <a href="http://www.gurock.com/support/docs/testrail/admin/installation-upgrading.html">upgrade instructions</a>. TestRail is updated by copying the new installation files over your existing TestRail installation. The database upgrade wizard is automatically started when you access TestRail with your web browser. If you haven&#8217;t <a href="https://secure.gurock.com/customers/testrail/beta/">applied for the TestRail beta</a> yet, feel free to do so as we are still looking for new beta participants.</p>
<h2>What&#8217;s Next?</h2>
<p>In the next phase of the TestRail beta we plan to improve the application structure where needed and make it easier to work with test suites and cases. We plan a range of improvements in this area so stay tuned! If you are looking for any particular change in handling test suites and cases (such as linking/copying/organizing) and haven&#8217;t provided feedback yet, please let us know.</p>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Fannouncing-testrail-beta-1-0-2%2F745%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Fannouncing-testrail-beta-1-0-2%2F745%2F" height="61" width="51" /></a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/gurock?a=1aXBNf-QmRg:lqmqGfYUru8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/gurock?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=1aXBNf-QmRg:lqmqGfYUru8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/gurock?i=1aXBNf-QmRg:lqmqGfYUru8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=1aXBNf-QmRg:lqmqGfYUru8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/gurock?i=1aXBNf-QmRg:lqmqGfYUru8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=1aXBNf-QmRg:lqmqGfYUru8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/gurock?i=1aXBNf-QmRg:lqmqGfYUru8:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.gurock.com/postings/announcing-testrail-beta-1-0-2/745/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TestRail feature feedback needed</title>
		<link>http://blog.gurock.com/postings/testrail-feature-feedback-needed/719/</link>
		<comments>http://blog.gurock.com/postings/testrail-feature-feedback-needed/719/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 18:38:03 +0000</pubDate>
		<dc:creator>Dennis Gurock</dc:creator>
				<category><![CDATA[Gurock Software]]></category>
		<category><![CDATA[TestRail]]></category>

		<guid isPermaLink="false">http://blog.gurock.com/?p=719</guid>
		<description><![CDATA[Now that the first TestRail beta is out (you can still apply to join), we are already thinking about new things to add to our upcoming test case management software. While it&#8217;s often said that one shouldn&#8217;t add major new features to a running beta test, we already knew that we wanted to add a [...]]]></description>
			<content:encoded><![CDATA[<p>Now that the first <a href="http://www.gurock.com/testrail/">TestRail</a> beta is out (you can still <a href="https://secure.gurock.com/customers/testrail/beta/">apply to join</a>), we are already thinking about new things to add to our upcoming <a href="http://www.gurock.com/testrail/">test case management</a> software. While it&#8217;s often said that one shouldn&#8217;t add major new features to a running beta test, we already knew that we wanted to add a few more things before releasing the final version. We wanted to get feedback as early as possible with the beta, while still providing a very usable and also very stable version.</p>
<p>We are thinking about introducing support for configurations and test plans (in addition to TestRail&#8217;s test suites and runs) in the TestRail beta and ask for your feedback and comments. Please see my <a href="http://www.gurock.com/support/forum/topic/281/feedback-requested-configuration-support/">forum posting</a> with details and mockups of the new feature. If you are participating in the TestRail beta, if you have used similar tools in the past or if you just want to share your comments and ideas, please <a href="http://www.gurock.com/support/forum/topic/281/feedback-requested-configuration-support/">post your feedback</a> to the TestRail forum. Thanks!</p>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Ftestrail-feature-feedback-needed%2F719%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Ftestrail-feature-feedback-needed%2F719%2F" height="61" width="51" /></a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/gurock?a=mjzxyAcr6wk:-xzB7tWxd9k:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/gurock?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=mjzxyAcr6wk:-xzB7tWxd9k:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/gurock?i=mjzxyAcr6wk:-xzB7tWxd9k:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=mjzxyAcr6wk:-xzB7tWxd9k:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/gurock?i=mjzxyAcr6wk:-xzB7tWxd9k:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=mjzxyAcr6wk:-xzB7tWxd9k:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/gurock?i=mjzxyAcr6wk:-xzB7tWxd9k:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.gurock.com/postings/testrail-feature-feedback-needed/719/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SmartInspect now supports Delphi 2010</title>
		<link>http://blog.gurock.com/postings/smartinspect-now-supports-delphi-2010/711/</link>
		<comments>http://blog.gurock.com/postings/smartinspect-now-supports-delphi-2010/711/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 10:27:47 +0000</pubDate>
		<dc:creator>Dennis Gurock</dc:creator>
				<category><![CDATA[DelphiFeeds.com]]></category>
		<category><![CDATA[Gurock Software]]></category>
		<category><![CDATA[SmartInspect]]></category>

		<guid isPermaLink="false">http://blog.gurock.com/?p=711</guid>
		<description><![CDATA[We have just released a new version of our .NET, Java and Delphi logging tool SmartInspect that supports the new Delphi 2010. Embarcadero&#8217;s latest Delphi version looks like a very solid release and we have seen other people report that there are good chances that Delphi 2010 will become the new reference version for many [...]]]></description>
			<content:encoded><![CDATA[<p>We have just released a new version of our .NET, Java and <a href="http://www.gurock.com/smartinspect/">Delphi logging</a> tool SmartInspect that supports the new Delphi 2010. Embarcadero&#8217;s latest Delphi version looks like a very solid release and we have seen other people report that there are good chances that Delphi 2010 will become the new reference version for many years to come.</p>
<p>As usual, existing SmartInspect customers can download the new release from our <a href="http://www.gurock.com/my/">customer portal</a>. If you are interested in giving SmartInspect a try, please download the updated trial version with Delphi 2010 support <a href="http://www.gurock.com/smartinspect/trial/">from our website</a>.</p>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Fsmartinspect-now-supports-delphi-2010%2F711%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Fsmartinspect-now-supports-delphi-2010%2F711%2F" height="61" width="51" /></a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/gurock?a=3eqrC_exA4I:t-OtUYiUOlU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/gurock?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=3eqrC_exA4I:t-OtUYiUOlU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/gurock?i=3eqrC_exA4I:t-OtUYiUOlU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=3eqrC_exA4I:t-OtUYiUOlU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/gurock?i=3eqrC_exA4I:t-OtUYiUOlU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=3eqrC_exA4I:t-OtUYiUOlU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/gurock?i=3eqrC_exA4I:t-OtUYiUOlU:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.gurock.com/postings/smartinspect-now-supports-delphi-2010/711/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>TestRail Beta now available</title>
		<link>http://blog.gurock.com/postings/testrail-beta-now-available/692/</link>
		<comments>http://blog.gurock.com/postings/testrail-beta-now-available/692/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 13:42:37 +0000</pubDate>
		<dc:creator>Dennis Gurock</dc:creator>
				<category><![CDATA[Gurock Software]]></category>
		<category><![CDATA[TestRail]]></category>

		<guid isPermaLink="false">http://blog.gurock.com/?p=692</guid>
		<description><![CDATA[The first beta version of our upcoming test management software TestRail is now available! You can apply to participate in the private beta test as of today, and we will approve applications in a timely fashion (i.e. if you apply today, we will make sure that you get your download link in a few hours). [...]]]></description>
			<content:encoded><![CDATA[<p>The first beta version of our upcoming <a href="http://www.gurock.com/testrail/">test management</a> software TestRail is now available! You can <a href="https://secure.gurock.com/customers/testrail/beta/">apply to participate</a> in the private beta test as of today, and we will approve applications in a timely fashion (i.e. if you apply today, we will make sure that you get your download link in a few hours). We believe that the first beta is already quite stable and usable, so you hopefully won&#8217;t have to deal with a lot of obvious issues, but the usual caveats regarding beta versions apply.</p>
<p><img src="http://blog.gurock.com/wp-content/uploads/2009/08/testrail_add_result.png" alt="TestRail: Add Result" title="TestRail: Add Result" width="580" height="456" class="alignnone size-full wp-image-708" /></p>
<p>So what do you need to install and run TestRail? As TestRail is a web application based on PHP, you will need a standard server system (most Unix/Linux systems will do, or Windows Server 2003 / 2008), a database (TestRail supports MySQL and MS SQL Server) and of course a web server (Apache or IIS). We recommend setting up a virtual machine with Windows Server or a Linux system such as Ubuntu if you don&#8217;t already have a spare server for testing (a desktop OS will also do for testing purposes). You can learn more about TestRail&#8217;s requirements and on how to install the product in the <a href="http://www.gurock.com/support/docs/testrail/admin/">TestRail Admin Manual</a>.</p>
<p>Releasing a new software product is always a bit scary and definitely exciting, even if it&#8217;s just a beta version for now. So we are really looking forward to your feedback and are curious to find out what you think. Feel free to drop us an email if you have any questions or directly apply to download and install TestRail here:</p>
<p><strong><a href="https://secure.gurock.com/customers/testrail/beta/">Apply for the TestRail beta</a></strong></p>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Ftestrail-beta-now-available%2F692%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Ftestrail-beta-now-available%2F692%2F" height="61" width="51" /></a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/gurock?a=Ih5aDCuxE3o:BYm984xIS-I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/gurock?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=Ih5aDCuxE3o:BYm984xIS-I:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/gurock?i=Ih5aDCuxE3o:BYm984xIS-I:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=Ih5aDCuxE3o:BYm984xIS-I:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/gurock?i=Ih5aDCuxE3o:BYm984xIS-I:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=Ih5aDCuxE3o:BYm984xIS-I:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/gurock?i=Ih5aDCuxE3o:BYm984xIS-I:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.gurock.com/postings/testrail-beta-now-available/692/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimizing Search Engine Rankings with Microsites</title>
		<link>http://blog.gurock.com/postings/optimizing-search-engine-rankings-with-microsites/679/</link>
		<comments>http://blog.gurock.com/postings/optimizing-search-engine-rankings-with-microsites/679/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 20:09:49 +0000</pubDate>
		<dc:creator>Dennis Gurock</dc:creator>
				<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://blog.gurock.com/?p=679</guid>
		<description><![CDATA[&#8220;So how did it work out? At the time of writing this posting, both microsites rank (far) better than our main SmartInspect website for many keywords, including important keywords such as .NET logging and Java logging. This is especially surprising considering how many more links the SmartInspect websites has compared to the new microsites (the [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;So how did it work out? At the time of writing this posting, both microsites rank (far) better than our main SmartInspect website for many keywords, including important keywords such as <a href="http://www.dotnetlogging.com/">.NET logging</a> and <a href="http://www.java-logging.com/">Java logging</a>. This is especially surprising considering how many more links the SmartInspect websites has compared to the new microsites (the quality of the links to the SmartInspect website is also a lot better, with links coming from domains such as microsoft.com and other relevant websites).&#8221;</p>
<p>&#8220;Overall the microsites are a great success for us and are an impressive testament to how important keywords in the domain name really are for Google. We already plan to launch additional microsites for <a href="http://www.gurock.com/smartinspect/">SmartInspect</a> and for our upcoming <a href="http://www.gurock.com/testrail/">test management</a> software TestRail.&#8221;</p>
<p><strong><a href="http://www.47hats.com/?p=1409">Read my full guest posting about microsites on 47 Hats.</a></strong></p>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Foptimizing-search-engine-rankings-with-microsites%2F679%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.gurock.com%2Fpostings%2Foptimizing-search-engine-rankings-with-microsites%2F679%2F" height="61" width="51" /></a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/gurock?a=v66rjVRep4g:mvkUO3gbnxQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/gurock?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=v66rjVRep4g:mvkUO3gbnxQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/gurock?i=v66rjVRep4g:mvkUO3gbnxQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=v66rjVRep4g:mvkUO3gbnxQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/gurock?i=v66rjVRep4g:mvkUO3gbnxQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/gurock?a=v66rjVRep4g:mvkUO3gbnxQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/gurock?i=v66rjVRep4g:mvkUO3gbnxQ:gIN9vFwOqvQ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.gurock.com/postings/optimizing-search-engine-rankings-with-microsites/679/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
