<?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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Damir's Corner</title>
    <link>http://www.damirscorner.com/</link>
    <description>Notes from Daily Encounters with Technology</description>
    <language>en-us</language>
    <copyright>Damir Arh, M. Sc.</copyright>
    <lastBuildDate>Wed, 01 Sep 2010 14:56:09 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>damir.arh@gmail.com</managingEditor>
    <webMaster>damir.arh@gmail.com</webMaster>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/damircorner" /><feedburner:info uri="damircorner" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <trackback:ping>http://www.damirscorner.com/Trackback.aspx?guid=3661e8d8-796b-4950-a734-3232952baff7</trackback:ping>
      <pingback:server>http://www.damirscorner.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.damirscorner.com/PermaLink,guid,3661e8d8-796b-4950-a734-3232952baff7.aspx</pingback:target>
      <dc:creator>Damir Arh</dc:creator>
      <wfw:comment>http://www.damirscorner.com/CommentView,guid,3661e8d8-796b-4950-a734-3232952baff7.aspx</wfw:comment>
      <wfw:commentRss>http://www.damirscorner.com/SyndicationService.asmx/GetEntryCommentsRss?guid=3661e8d8-796b-4950-a734-3232952baff7</wfw:commentRss>
      
      <title>EventLogTraceListener Can Cause an Application to Crash</title>
      <guid isPermaLink="false">http://www.damirscorner.com/PermaLink,guid,3661e8d8-796b-4950-a734-3232952baff7.aspx</guid>
      <link>http://feedproxy.google.com/~r/damircorner/~3/rvBXVU7Xyd8/EventLogTraceListenerCanCauseAnApplicationToCrash.aspx</link>
      <pubDate>Wed, 01 Sep 2010 14:56:09 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://msdn.microsoft.com/en-us/library/aa983739%28VS.71%29.aspx"&gt;Trace listeners&lt;/a&gt; are&#xD;
a great mechanism for troubleshooting and monitoring applications in production environment.&#xD;
After you have decorated your code with the necessary &lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.trace.aspx"&gt;Trace&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.debug.aspx"&gt;Debug&lt;/a&gt; calls,&#xD;
you only have to add the desired listeners either &lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.tracelistenercollection.add.aspx"&gt;in&#xD;
code&lt;/a&gt; or &lt;a href="http://msdn.microsoft.com/en-us/library/zh3a61fw.aspx"&gt;in the&#xD;
configuration file&lt;/a&gt; and voila: the application starts emitting information to the&#xD;
configured destinations. Usually there is no need to have trace listeners attached&#xD;
all the time, you can only add them to the configuration file when you need to troubleshoot&#xD;
a problem.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
What I didn’t know until recently, is that by adding a trace listener to your application&#xD;
you can cause it to crash. That’s definitely not something I wanted or expected to&#xD;
happen! After investigating the issue further the offender turned out to be &lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlogtracelistener.aspx"&gt;EventLogTraceListener&lt;/a&gt; which&#xD;
(obviously) logs information to the event log. To do that the event log source is&#xD;
required and therefore it needs to be specified when adding (initializing) the EventLogTraceListener.&#xD;
And here lies the root of the problem.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To register a new event log source, administrative privileges are required. If the&#xD;
event log source is not yet registered and the user running the application is not&#xD;
an administrator, the call to Trace will raise a security exception. If this exception&#xD;
is not handled properly, the application will crash. To be on the safe side all Trace&#xD;
and Debug calls in your application should be in a try/catch block. And I have often&#xD;
seen this not being the case, in particular when the calls are already placed in a&#xD;
catch block. The other option is of course to ensure that the account has administrative&#xD;
privileges or that the event log source is already registered. But is it really possible&#xD;
to be 100% sure of that in production environment?&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
What I find surprising is that there doesn’t seem to be any consistency between different&#xD;
trace listeners provided in the framework. &lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.textwritertracelistener.aspx"&gt;TextWriterTraceListener&lt;/a&gt; has&#xD;
a similar security related problem when the user doesn’t have write permissions for&#xD;
the specified log file location. But this situation is handled in the trace listener&#xD;
itself which simply doesn’t write the information to the log file if it can’t. It&#xD;
doesn’t raise any exceptions which (at least for me) is the expected behavior. Why&#xD;
is this not the case with EventLogTraceListener?&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.damirscorner.com/aggbug.ashx?id=3661e8d8-796b-4950-a734-3232952baff7"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dVBVrxfm6cQU1gXTF6c87tL5a_A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dVBVrxfm6cQU1gXTF6c87tL5a_A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dVBVrxfm6cQU1gXTF6c87tL5a_A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dVBVrxfm6cQU1gXTF6c87tL5a_A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/damircorner/~4/rvBXVU7Xyd8" height="1" width="1"/&gt;</description>
      <comments>http://www.damirscorner.com/CommentView,guid,3661e8d8-796b-4950-a734-3232952baff7.aspx</comments>
      <category>Development</category>
      <category>Development/.NET</category>
    <feedburner:origLink>http://www.damirscorner.com/EventLogTraceListenerCanCauseAnApplicationToCrash.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.damirscorner.com/Trackback.aspx?guid=d71190ab-f7ab-42cc-a3a0-9f3aa53d6014</trackback:ping>
      <pingback:server>http://www.damirscorner.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.damirscorner.com/PermaLink,guid,d71190ab-f7ab-42cc-a3a0-9f3aa53d6014.aspx</pingback:target>
      <dc:creator>Damir Arh</dc:creator>
      <wfw:comment>http://www.damirscorner.com/CommentView,guid,d71190ab-f7ab-42cc-a3a0-9f3aa53d6014.aspx</wfw:comment>
      <wfw:commentRss>http://www.damirscorner.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d71190ab-f7ab-42cc-a3a0-9f3aa53d6014</wfw:commentRss>
      
      <title>Using FTP Task in CruiseControl.NET for Publishing Websites</title>
      <guid isPermaLink="false">http://www.damirscorner.com/PermaLink,guid,d71190ab-f7ab-42cc-a3a0-9f3aa53d6014.aspx</guid>
      <link>http://feedproxy.google.com/~r/damircorner/~3/hSpzhte0ZIU/UsingFTPTaskInCruiseControlNETForPublishingWebsites.aspx</link>
      <pubDate>Sat, 07 Aug 2010 19:19:23 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Since version 1.5 CruiseControl.NET includes an &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Ftp+task+-+Publisher"&gt;FTP&#xD;
Task&lt;/a&gt; which can be used for uploading build results to a remote FTP server. Its&#xD;
most typical use case is for publishing websites to a remote server. Configuring this&#xD;
correctly requires some thought and at the moment there are very few helpful resources&#xD;
available. Below are some suggestions for the most simple case when the files to be&#xD;
uploaded only have to be retrieved from the source control and there is no additional&#xD;
build process involved.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The core of the configuration is of course the FTP task. Its configuration is pretty&#xD;
straightforward. You only need to supply it with login details and the path to the&#xD;
local and the remote folder. This also means that there are almost no configuration&#xD;
options available – you can only choose between uploading the files recursively or&#xD;
not.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The problem with the lack of options is that most source control systems put additional&#xD;
files in the local folder which you don’t want to upload. In the case of Subversion&#xD;
this is a .svn folder in every local folder. Because the FTP task can’t be configured&#xD;
to skip or ignore certain files, these files have to be deleted before the FTP task&#xD;
is executed. The best way to do that is by executing a batch file:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="brush: batch;"&gt;FOR /F "tokens=*" %%G IN ('DIR /B /AD /S *.svn*') DO RMDIR /S /Q "%%G"&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
If you do this directly in the working directory where the files are retrieved from&#xD;
Subversion, then the next retrieval from source control will fail unless you set the &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Subversion+Source+Control+Block"&gt;cleanCopy&lt;/a&gt; configuration&#xD;
element to true and retrieve all of the files from Subversion every time. Doing this&#xD;
has two downsides:&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
If the project is large, this will significantly decrease performance. Downloading&#xD;
lots of files from Subversion takes time. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
The file timestamps will be reset every time. This information could potentially be&#xD;
useful for the FTP task (but isn’t yet as I explain at the end of the post).&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
To avoid this you should first copy the retrieved files to a different folder. The&#xD;
best way to do this is by using the &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Build+Publisher"&gt;build&#xD;
publisher&lt;/a&gt;. Just don’t forget to set the alwaysPublish configuration element to&#xD;
true. Otherwise it won’t copy anything because you are using it in the tasks section&#xD;
where the build is not yet successful.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To sum it all up, your tasks section should something look like this (I’ve used &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Configuration+Preprocessor"&gt;preprocessor&#xD;
constants&lt;/a&gt; for most of the values to increase readability):&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="brush: xml;"&gt;&amp;lt;tasks&amp;gt;&#xD;
    &amp;lt;buildpublisher&amp;gt;&#xD;
        &amp;lt;sourceDir&amp;gt;$(WorkingDir)&amp;lt;/sourceDir&amp;gt;&#xD;
        &amp;lt;publishDir&amp;gt;$(PublishDir)&amp;lt;/publishDir&amp;gt;&#xD;
        &amp;lt;cleanPublishDirPriorToCopy&amp;gt;true&amp;lt;/cleanPublishDirPriorToCopy&amp;gt;&#xD;
        &amp;lt;useLabelSubDirectory&amp;gt;false&amp;lt;/useLabelSubDirectory&amp;gt;&#xD;
        &amp;lt;alwaysPublish&amp;gt;true&amp;lt;/alwaysPublish&amp;gt;&#xD;
    &amp;lt;/buildpublisher&amp;gt;&#xD;
    &amp;lt;exec&amp;gt;&#xD;
        &amp;lt;executable&amp;gt;$(ClearSvnFilesBatch)&amp;lt;/executable&amp;gt;&#xD;
        &amp;lt;baseDirectory&amp;gt;$(PublishDir)&amp;lt;/baseDirectory&amp;gt;&#xD;
    &amp;lt;/exec&amp;gt;&#xD;
    &amp;lt;ftp&amp;gt;&#xD;
        &amp;lt;serverName&amp;gt;$(FtpServerName)&amp;lt;/serverName&amp;gt;&#xD;
        &amp;lt;userName&amp;gt;$(FtpUserName)&amp;lt;/userName&amp;gt;&#xD;
        &amp;lt;password&amp;gt;$(FtpPassword)&amp;lt;/password&amp;gt;&#xD;
        &amp;lt;action&amp;gt;UploadFolder&amp;lt;/action&amp;gt;&#xD;
        &amp;lt;ftpFolderName&amp;gt;$(FtpRemoteFolder)&amp;lt;/ftpFolderName&amp;gt;&#xD;
        &amp;lt;localFolderName&amp;gt;$(PublishDir)&amp;lt;/localFolderName&amp;gt;&#xD;
        &amp;lt;recursiveCopy&amp;gt;true&amp;lt;/recursiveCopy&amp;gt;&#xD;
    &amp;lt;/ftp&amp;gt;&#xD;
&amp;lt;/tasks&amp;gt;&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
I’ll conclude this post with a bad news. Unfortunately there is no support in the&#xD;
FTP task to only upload the files that have changed since the previous build. For&#xD;
a small website this might not be an issue but for larger ones this is quite a problem.&#xD;
You really don’t want to upload tens or even hundreds of megabytes every time. Let’s&#xD;
just hope that the &lt;a href="http://jira.public.thoughtworks.org/browse/CCNET-1938"&gt;issue&lt;/a&gt; will&#xD;
be fixed soon. &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.damirscorner.com/aggbug.ashx?id=d71190ab-f7ab-42cc-a3a0-9f3aa53d6014"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_IbKJlnjpnU4RTow2O7SGUtaIyw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_IbKJlnjpnU4RTow2O7SGUtaIyw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_IbKJlnjpnU4RTow2O7SGUtaIyw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_IbKJlnjpnU4RTow2O7SGUtaIyw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/damircorner/~4/hSpzhte0ZIU" height="1" width="1"/&gt;</description>
      <comments>http://www.damirscorner.com/CommentView,guid,d71190ab-f7ab-42cc-a3a0-9f3aa53d6014.aspx</comments>
      <category>Software</category>
      <category>Software/CruiseControl</category>
    <feedburner:origLink>http://www.damirscorner.com/UsingFTPTaskInCruiseControlNETForPublishingWebsites.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.damirscorner.com/Trackback.aspx?guid=6a11ed69-42b3-4380-89db-b0dac78d6447</trackback:ping>
      <pingback:server>http://www.damirscorner.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.damirscorner.com/PermaLink,guid,6a11ed69-42b3-4380-89db-b0dac78d6447.aspx</pingback:target>
      <dc:creator>Damir Arh</dc:creator>
      <wfw:comment>http://www.damirscorner.com/CommentView,guid,6a11ed69-42b3-4380-89db-b0dac78d6447.aspx</wfw:comment>
      <wfw:commentRss>http://www.damirscorner.com/SyndicationService.asmx/GetEntryCommentsRss?guid=6a11ed69-42b3-4380-89db-b0dac78d6447</wfw:commentRss>
      
      <title>Avoiding Queue Starvation in CruiseControl.NET</title>
      <guid isPermaLink="false">http://www.damirscorner.com/PermaLink,guid,6a11ed69-42b3-4380-89db-b0dac78d6447.aspx</guid>
      <link>http://feedproxy.google.com/~r/damircorner/~3/YkPXzGC-8EI/AvoidingQueueStarvationInCruiseControlNET.aspx</link>
      <pubDate>Wed, 28 Jul 2010 20:05:47 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Recently I’ve been solving some issues with queue starvation in CruiseControl.NET.&#xD;
Since I haven’t found much information about this problem I’ve decided to round up&#xD;
my findings in this blog post.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So, what is queue starvation? It’s a problem that can occur when scheduling tasks&#xD;
in priority queues if there are too many high priority tasks so that lower priority&#xD;
tasks never get scheduled and are just waiting indefinitely. For example, let’s say&#xD;
we have three queues: high, medium and low priority. Tasks in the high priority one&#xD;
always get processed first. Once this queue is empty the tasks from the medium priority&#xD;
queue get processed. Of course the tasks in the low priority queue get processed only&#xD;
if the other two queues are empty. If there are too many high and medium priority&#xD;
tasks incoming all the time so that the queues never get empty, then the low priority&#xD;
tasks are not processed at all.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
And how is this related to CruiseControl.NET? As you might be aware, projects can&#xD;
be assigned to different &lt;a href="http://ccnetlive.thoughtworks.com/ccnet/doc/CCNET/Queue%20Configuration.html"&gt;queues&lt;/a&gt;.&#xD;
Only projects in the same queue (as the name implies) are built sequentially while&#xD;
projects in different queues are built in parallel to one another. Queues themselves&#xD;
therefore cannot cause starvation because different queues don’t depend on one another&#xD;
and projects are always put at the end of its queue. This means that sooner or later&#xD;
each project will be built.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Now, queue &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Integration+Queues"&gt;priorities&lt;/a&gt; enter&#xD;
the stage. Each project can be given a priority defining where the project will be&#xD;
put into the queue: before all of the lower priority projects already in the queue&#xD;
instead of at the end. Effectively this partitions a single sequential queue into&#xD;
multiple queues with different priorities as described at the beginning of the post.&#xD;
We have all the necessary prerequisites for queue starvation. If too many projects&#xD;
with higher priorities have to be built (typically caused by checking in code or triggering&#xD;
a forced build), the projects with lower priorities will never get processed.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
What I have observed is that this can happen even if higher priority projects don’t&#xD;
have to be built at all. The reason for that is in the way CruiseControl.NET is processing&#xD;
the projects to determine whether there were any source code changes. This is taken&#xD;
care of with an &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Interval+Trigger"&gt;interval&#xD;
trigger&lt;/a&gt; which puts a project in the queue, but it only gets built if a modification&#xD;
exists. Nevertheless, even checking if such a modification does exists, takes some&#xD;
time. In extreme cases this can be enough to cause queue starvation and this is also&#xD;
what happened in my case. Lower priority projects never got built, not even during&#xD;
the night and no matter how often a build was forced for them.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Fortunately there is a solution for this problem: the seconds attribute which specifies&#xD;
how often the project is put into the queue for checking if a modification exists.&#xD;
By default it is set to 60 seconds. Increasing the value can solve the queue starvation&#xD;
issue. Instead of simply defining the trigger:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="brush: xml;"&gt;&amp;lt;intervalTrigger /&amp;gt;&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
A longer period can be specified:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="brush: xml;"&gt;&amp;lt;intervalTrigger seconds="300" /&amp;gt;&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Of course this has its downside: the latency before the project gets built after a&#xD;
modification increases. Therefore you should use this solution with caution. Only&#xD;
increase the value as much as you have to. And don’t do it at all if you can apply&#xD;
any of the other solutions:&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
Increase the performance of the build server to speed up the processing and building&#xD;
of the projects.&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Parallelize the build process by using more queues. Put the projects in the same queue&#xD;
only if you have to.&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Don’t use queue priorities if it’s not necessary. In most cases you can get by without&#xD;
them.&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.damirscorner.com/aggbug.ashx?id=6a11ed69-42b3-4380-89db-b0dac78d6447"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hMr0bXWf7BLvXnhmD2nnlxwqDgk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hMr0bXWf7BLvXnhmD2nnlxwqDgk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hMr0bXWf7BLvXnhmD2nnlxwqDgk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hMr0bXWf7BLvXnhmD2nnlxwqDgk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/damircorner/~4/YkPXzGC-8EI" height="1" width="1"/&gt;</description>
      <comments>http://www.damirscorner.com/CommentView,guid,6a11ed69-42b3-4380-89db-b0dac78d6447.aspx</comments>
      <category>Software</category>
      <category>Software/CruiseControl</category>
    <feedburner:origLink>http://www.damirscorner.com/AvoidingQueueStarvationInCruiseControlNET.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.damirscorner.com/Trackback.aspx?guid=79ac29a8-2be0-4c04-9e54-19794e92eda5</trackback:ping>
      <pingback:server>http://www.damirscorner.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.damirscorner.com/PermaLink,guid,79ac29a8-2be0-4c04-9e54-19794e92eda5.aspx</pingback:target>
      <dc:creator>Damir Arh</dc:creator>
      <wfw:comment>http://www.damirscorner.com/CommentView,guid,79ac29a8-2be0-4c04-9e54-19794e92eda5.aspx</wfw:comment>
      <wfw:commentRss>http://www.damirscorner.com/SyndicationService.asmx/GetEntryCommentsRss?guid=79ac29a8-2be0-4c04-9e54-19794e92eda5</wfw:commentRss>
      
      <title>Programmatic Manipulation of Binary Excel (.xls) Files</title>
      <guid isPermaLink="false">http://www.damirscorner.com/PermaLink,guid,79ac29a8-2be0-4c04-9e54-19794e92eda5.aspx</guid>
      <link>http://feedproxy.google.com/~r/damircorner/~3/Rpaim6yjjOY/ProgrammaticManipulationOfBinaryExcelXlsFiles.aspx</link>
      <pubDate>Sun, 13 Jun 2010 11:47:10 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
A few months ago I worked on a small spare time project which included some manipulation&#xD;
of binary Excel (.xls) files. This seemingly simple task soon turned out to be quite&#xD;
a challenge if you want to handle it right. The post you are reading is a short summary&#xD;
of my experiences. They should make your choices easier if you are about to tackle&#xD;
a similar problem.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The most obvious choice for handling .xls files is Excel automation using the &lt;a href="http://msdn.microsoft.com/en-us/library/wss56bz7%28VS.80%29.aspx"&gt;Excel&#xD;
object model&lt;/a&gt;. As long as your application is always going to be used interactively,&#xD;
you should be fine. It’s probably the best method to use in spite of a few downsides:&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
The object model is COM based which means you’ll have to do interop if you are developing&#xD;
a .NET application. Fortunately there are some &lt;a href="http://msmvps.com/blogs/paulomorgado/archive/2010/04/19/c-4-0-com-interop-improvements.aspx"&gt;nice&#xD;
improvements&lt;/a&gt; in .NET Framework which make coping with COM in C# much easier.&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Your application will have to be compiled in 32-bit in order for it to work on 64-bit&#xD;
Windows. This usually isn’t a real limitation just don’t forget to switch the target&#xD;
platform from Any CPU to x86 if you’re doing development on a 32-bit OS to avoid the&#xD;
problem. (You’re going to notice it yourself when developing on a 64-bit OS.)&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Don’t try unit testing the Excel automation code outside your IDE (e.g. on your continuous&#xD;
integration server). As described below this scenario is not supported.&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
As soon as you want your code to be run non-interactively, you’re out of luck with&#xD;
Excel automation. Since all Office applications assume to be running on the interactive&#xD;
desktop, there are &lt;a href="http://support.microsoft.com/kb/257757"&gt;several reasons&lt;/a&gt; why&#xD;
such usage is not supported and is even strongly discouraged by Microsoft. If you&#xD;
want to run your code on a web server, as a Windows service, a scheduled task or just&#xD;
automatically test it on your build server, you’ll have to find a different approach.&#xD;
And in this case there are no obvious choices.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Your best bet is to use Open XML file format (.xlsx, .xlsm) instead of the binary&#xD;
one (.xls) if this is an option for you. Since this is a well documented XML based&#xD;
format you can manipulate it directly without running Excel at all. You can even use &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c6e744e5-36e9-45f5-8d8c-331df206e0d0&amp;amp;displaylang=en"&gt;Open&#xD;
XML SDK for Microsoft Office&lt;/a&gt; which includes strongly typed classes that simplify&#xD;
many common tasks.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
This is not the case with the binary format. Microsoft doesn’t provide or support&#xD;
any SDK or API for manipulating the files directly. You are only provided with &lt;a href="http://msdn.microsoft.com/en-us/library/cc313154%28v=office.12%29.aspx"&gt;detailed&#xD;
documentation&lt;/a&gt; of the format. Based on it some third party solutions have been&#xD;
developed. &lt;a href="http://www.aspose.com/categories/.net-components/aspose.cells-for-.net/default.aspx"&gt;Aspose&lt;/a&gt; and &lt;a href="http://officewriter.softartisans.com/default.aspx?pageid=257"&gt;SoftArtisans&lt;/a&gt; have&#xD;
their own commercial offerings which I haven’t evaluated because as such they weren’t&#xD;
suitable for me.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
On the other hand the only free library that I have found is &lt;a href="http://sourceforge.net/projects/myxls/"&gt;MyXLS&lt;/a&gt; and&#xD;
this one leaves much to be desired. It also seems to be pretty much abandoned with&#xD;
the latest release almost a year ago and only a single commit to the repository in&#xD;
this year so far. That being said, it still might prove useful if you only want to&#xD;
create the files, mostly focusing on the appearance with only minimal requirements&#xD;
regarding formulas. According to the samples this seems to work fine. Reading existing&#xD;
files is another story. You are more or less on your own as soon as you need to read&#xD;
cells with formulas. This made the library useless for me therefore I used another&#xD;
approach based on the fact that the OLE DB Provider for Jet can be used to read and&#xD;
write data in Excel worksheets. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
At first I haven’t even considered this possibility because I was convinced that this&#xD;
method can only be used on worksheets designed as database tables (having columns&#xD;
of data with or without header columns). &lt;a href="http://www.codeproject.com/KB/office/excel_using_oledb.aspx"&gt;This&#xD;
article&lt;/a&gt; proved me wrong and in spite of many issues in the demo project it showed&#xD;
off techniques which turned out really useful for me. The most important one was the&#xD;
possibility to address regions, not only complete worksheets – this can be used to&#xD;
retrieve and set individual cell values as well as for accessing database table-like&#xD;
blocks of data in a part of the worksheet. Let’s take a look at a sample:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="brush: sql;"&gt;SELECT F1 FROM [Sheet1$C2:C2];&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
This query retrieves a value of a single cell. The same syntax can be used to access&#xD;
any region: after the worksheet name with a trailing $ character the region is defined&#xD;
just like in Excel formulas. If the region doesn’t include column headers (specified&#xD;
by including HDR=No in the Extended Properties of the connection string) the columns&#xD;
are named F# where # is the sequential number of the column in the defined region.&#xD;
Similarly the following query can be used to set a value of an individual cell:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="brush: sql;"&gt;UPDATE [Sheet1$C2:C2] SET F1 = 'Value';&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
A few more things worth mentioning:&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
Be aware of the IMEX option in the connection string. It doesn’t seem to be documented&#xD;
very well, probably its best description is &lt;a href="http://sqlblog.de/blog/2009/04/ssis-excel-import-column-data-types/"&gt;here&lt;/a&gt;.&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Make sure you keep the connection to the file open if you plan to do more data access&#xD;
later. Opening the connection takes quite some time therefore the performance will&#xD;
be terrible if you keep closing and reopening it.&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
The technique doesn’t seem to work if the worksheet name begins with a space. At least&#xD;
I couldn’t make it work, no matter how I set the quotes.&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
I encountered a file which couldn’t be opened in this way but the problem was resolved&#xD;
after I opened the file in Excel and saved it again.&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.damirscorner.com/aggbug.ashx?id=79ac29a8-2be0-4c04-9e54-19794e92eda5"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nfU76oe5fWLAbkeInnOZ_SI8g80/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nfU76oe5fWLAbkeInnOZ_SI8g80/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nfU76oe5fWLAbkeInnOZ_SI8g80/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nfU76oe5fWLAbkeInnOZ_SI8g80/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/damircorner/~4/Rpaim6yjjOY" height="1" width="1"/&gt;</description>
      <comments>http://www.damirscorner.com/CommentView,guid,79ac29a8-2be0-4c04-9e54-19794e92eda5.aspx</comments>
      <category>Development</category>
      <category>Development/.NET</category>
      <category>Software</category>
      <category>Software/Office</category>
    <feedburner:origLink>http://www.damirscorner.com/ProgrammaticManipulationOfBinaryExcelXlsFiles.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.damirscorner.com/Trackback.aspx?guid=e4f8f3a6-b787-4ce2-b7c6-31fdbc67580c</trackback:ping>
      <pingback:server>http://www.damirscorner.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.damirscorner.com/PermaLink,guid,e4f8f3a6-b787-4ce2-b7c6-31fdbc67580c.aspx</pingback:target>
      <dc:creator>Damir Arh</dc:creator>
      <wfw:comment>http://www.damirscorner.com/CommentView,guid,e4f8f3a6-b787-4ce2-b7c6-31fdbc67580c.aspx</wfw:comment>
      <wfw:commentRss>http://www.damirscorner.com/SyndicationService.asmx/GetEntryCommentsRss?guid=e4f8f3a6-b787-4ce2-b7c6-31fdbc67580c</wfw:commentRss>
      
      <title>Setting Up SVN and CC.NET for .NET Development</title>
      <guid isPermaLink="false">http://www.damirscorner.com/PermaLink,guid,e4f8f3a6-b787-4ce2-b7c6-31fdbc67580c.aspx</guid>
      <link>http://feedproxy.google.com/~r/damircorner/~3/pLAGZAp4iN4/SettingUpSVNAndCCNETForNETDevelopment.aspx</link>
      <pubDate>Sun, 30 May 2010 10:45:16 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://subversion.apache.org/"&gt;Subversion&lt;/a&gt; and &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET"&gt;CruiseControl.NET&lt;/a&gt; can&#xD;
be invaluable tools in your .NET development process. There are many resources available&#xD;
to help you get started which I’ll try to gather in this post along with some of my&#xD;
personal experiences.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Let me start with the list of recommended software:&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://www.visualsvn.com/server/"&gt;VisualSVN Server&lt;/a&gt; is the ultimate Windows&#xD;
version of Subversion including a simple setup and powerful management tools. If you&#xD;
are planning to install a Subversion server on Windows it should be your first choice. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://ankhsvn.open.collab.net/"&gt;AnkhSVN&lt;/a&gt; is a Subversion Source Control&#xD;
Provider (SCC) for Visual Studio. As long as you’re not using &lt;a href="http://www.microsoft.com/express/"&gt;Express&#xD;
editions of Visual Studio&lt;/a&gt;, this is the suggested way of working with SVN directly&#xD;
from Visual Studio IDE. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://tortoisesvn.net/downloads"&gt;TortoiseSVN&lt;/a&gt; is a Windows shell extension&#xD;
for working with Subversion from within Windows Explorer. When you're not working&#xD;
with Visual Studio solutions this is the best choice for using SVN. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://sourceforge.net/projects/ccnet/files/CruiseControl.NET%20Releases/"&gt;CruiseControl.NET&lt;/a&gt; is&#xD;
a continuous integration server including a web dashboard and &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/CCTray"&gt;CCTray&lt;/a&gt; -&#xD;
a system tray client application for monitoring and controlling builds.&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
If you’re not already familiar with the above mentioned products, you should consult&#xD;
their documentation or search for tutorials. I will rather focus on setting up your&#xD;
development and release process. If you haven’t done so already I suggest you first&#xD;
read the following articles by &lt;a href="http://ariejan.net/"&gt;Ariejan de Vroom&lt;/a&gt;:&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://ariejan.net/2006/11/24/svn-how-to-structure-your-repository/"&gt;How&#xD;
to structure your repository&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://ariejan.net/2006/11/21/svn-how-to-release-software-properly/"&gt;How&#xD;
to release software properly&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://ariejan.net/2006/11/22/svn-how-to-fix-bugs-properly/"&gt;How to fix bugs&#xD;
properly&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
I mostly based my configuration on the ideas in these articles. I have projects configured&#xD;
in CC.NET to build all copies of the project: trunk (ProjectName-Trunk), all branches&#xD;
(ProjectName-REL-#.#) and all tags (ProjectName-v#.#.#). To identify individual builds&#xD;
I am using CC.NET’s &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Assembly+Version+Labeller"&gt;Assembly&#xD;
Version Labeller&lt;/a&gt; together with &lt;a href="http://msbuildtasks.tigris.org/"&gt;AssemblyInfo&#xD;
MsBuild Community Task&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Assembly Version Labeller is really simple to configure. You only need to add a short&#xD;
snippet to each project:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="brush: xml;"&gt;&amp;lt;labeller type="assemblyVersionLabeller"&amp;gt;&#xD;
    &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&#xD;
    &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&#xD;
    &amp;lt;build&amp;gt;0&amp;lt;/build&amp;gt;&#xD;
&amp;lt;/labeller&amp;gt;&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
I’m using the following versioning policy:&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
I start each project with version 1.0.0.&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Once it’s ready for release I make a copy of the trunk in the branches directory,&#xD;
named REL-#.# containing the major and the minor version number. Immediately afterwards&#xD;
I bump the version of the trunk (only minor or major and minor, depending on the nature&#xD;
of the new features planned).&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
In the release branch I make the necessary changes before release (e.g. I change the&#xD;
AssemblyProduct name to distinguish between development and release quality builds)&#xD;
and make another copy in the tags directory, named v#.#.# containing the major, minor&#xD;
and build version numbers. Immediately afterwards I increase the build version number&#xD;
in the release branch.&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
I make no changes to the copies in the tags directory. All bug fixes go to the release&#xD;
branch. Once I’m ready for a new release I repeat the previous step.&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
Since I don’t specify the revision number directly, the SVN Revision number gets used&#xD;
automatically. This makes it possible to match each build to the revision of the code&#xD;
in SVN.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To put the generated assembly version in the build I am using the AssemblyInfo MsBuild&#xD;
task. There are two steps involved in doing this.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
First you need to move the AssemblyProduct, AssemblyInfo and AssemblyFileVersion attributes&#xD;
from the auto generated AssemblyInfo.cs file into a new file. In my case the AssemblyVersion.cs&#xD;
has the following contents:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="brush: csharp;"&gt;using System.Reflection;&#xD;
&#xD;
[assembly: AssemblyProduct("ProjectName DEV")]&#xD;
[assembly: AssemblyVersion("1.0.0.0")]&#xD;
[assembly: AssemblyFileVersion("1.0.0.0")]&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Next you have to modify your project file (*.csproj) by importing the community tasks&#xD;
and adding a call to the AssemblyInfo MsBuild task:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="brush: xml;"&gt;&amp;lt;Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" /&amp;gt;&#xD;
&amp;lt;Target Name="BeforeBuild"&amp;gt;&#xD;
    &amp;lt;AssemblyInfo Condition="'$(CCNetLabel)' != ''"&#xD;
        CodeLanguage="CS" &#xD;
        OutputFile="Properties\AssemblyVersion.cs" &#xD;
        AssemblyProduct="ProjectName TRUNK" &#xD;
        AssemblyVersion="$(CCNetLabel)" &#xD;
        AssemblyFileVersion="$(CCNetLabel)" /&amp;gt;&#xD;
&amp;lt;/Target&amp;gt;&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
If you have never edited a project file before, you might want to read these first:&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://msdn.microsoft.com/en-us/library/ms171487%28VS.80%29.aspx"&gt;How to:&#xD;
Edit Project Files&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://msdn.microsoft.com/en-us/library/ms366724%28VS.80%29.aspx"&gt;How to:&#xD;
Extend the Visual Studio Build Process&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
One more thing to note which might not be all that obvious. The Condition in the AssemblyInfo&#xD;
task is met only when building from CC.NET. For builds in Visual Studio the task doesn’t&#xD;
regenerate the AssemblyVersion.cs file therefore the revision number is always 0 and&#xD;
the AssemblyProduct has a DEV suffix as defined in the original file. Also I remove&#xD;
the TRUNK suffix from the AssemblyProduct attribute of the AssemblyInfo task when&#xD;
moving code from trunk to release branches to separate between the two.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.damirscorner.com/aggbug.ashx?id=e4f8f3a6-b787-4ce2-b7c6-31fdbc67580c"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ni2fmCIlYOWuqy3q1qYsSNqJClQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ni2fmCIlYOWuqy3q1qYsSNqJClQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ni2fmCIlYOWuqy3q1qYsSNqJClQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ni2fmCIlYOWuqy3q1qYsSNqJClQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/damircorner/~4/pLAGZAp4iN4" height="1" width="1"/&gt;</description>
      <comments>http://www.damirscorner.com/CommentView,guid,e4f8f3a6-b787-4ce2-b7c6-31fdbc67580c.aspx</comments>
      <category>Development</category>
      <category>Development/.NET</category>
      <category>Software</category>
      <category>Software/CruiseControl</category>
      <category>Software/VisualStudio</category>
    <feedburner:origLink>http://www.damirscorner.com/SettingUpSVNAndCCNETForNETDevelopment.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.damirscorner.com/Trackback.aspx?guid=c2921994-0b38-4e21-84c7-a957f35d162a</trackback:ping>
      <pingback:server>http://www.damirscorner.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.damirscorner.com/PermaLink,guid,c2921994-0b38-4e21-84c7-a957f35d162a.aspx</pingback:target>
      <dc:creator>Damir Arh</dc:creator>
      <wfw:comment>http://www.damirscorner.com/CommentView,guid,c2921994-0b38-4e21-84c7-a957f35d162a.aspx</wfw:comment>
      <wfw:commentRss>http://www.damirscorner.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c2921994-0b38-4e21-84c7-a957f35d162a</wfw:commentRss>
      
      <title>Excel 2007 Query Parameters</title>
      <guid isPermaLink="false">http://www.damirscorner.com/PermaLink,guid,c2921994-0b38-4e21-84c7-a957f35d162a.aspx</guid>
      <link>http://feedproxy.google.com/~r/damircorner/~3/oxGwao20l5o/Excel2007QueryParameters.aspx</link>
      <pubDate>Wed, 28 Apr 2010 18:01:23 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Query parameters are a very useful &lt;a href="http://office.microsoft.com/en-us/excel/HP051995481033.aspx"&gt;Excel&#xD;
feature&lt;/a&gt; allowing parameterization of database queries used to import data in Excel.&#xD;
They are really simple to use as well. On the Definition tab of the Connection Properties&#xD;
dialog there is a Parameters… button at the bottom. It gets enabled as soon as there&#xD;
is a parameter defined in the Command text – you define it by typing in a question&#xD;
mark (?) instead of a value in the WHERE clause of the query, as seen in the image&#xD;
below.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Connection Propertie dialog" border="0" alt="Connection Propertie dialog" src="http://www.damirscorner.com/content/binary/WindowsLiveWriter/Excel2007QueryParameters_77B4/image_17.png" width="407" height="462"&gt;&lt;/img&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Unfortunately there is a limitation for using this functionality which turns out pretty&#xD;
unintuitive in Excel 2007. It is only supported for Microsoft Query based queries.&#xD;
For all other types of queries available in Excel you get the error “No value given&#xD;
for one or more parameters.” when you add a parameter to the Command text. Since the&#xD;
error doesn’t even hint at the real cause of the problem it took me some time before&#xD;
I figured it out. The thing to remember is: If you want to use query parameters, you&#xD;
must select Microsoft Query as the external data source when importing the data for&#xD;
the first time. This can’t be changed at a later time.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Get External Data From Microsof Query" border="0" alt="Get External Data From Microsof Query" src="http://www.damirscorner.com/content/binary/WindowsLiveWriter/Excel2007QueryParameters_77B4/image_20.png" width="320" height="282"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.damirscorner.com/aggbug.ashx?id=c2921994-0b38-4e21-84c7-a957f35d162a"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TQJmibfIPwh3rFhGCZSmjOPN7hI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TQJmibfIPwh3rFhGCZSmjOPN7hI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/TQJmibfIPwh3rFhGCZSmjOPN7hI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TQJmibfIPwh3rFhGCZSmjOPN7hI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/damircorner/~4/oxGwao20l5o" height="1" width="1"/&gt;</description>
      <comments>http://www.damirscorner.com/CommentView,guid,c2921994-0b38-4e21-84c7-a957f35d162a.aspx</comments>
      <category>Software</category>
      <category>Software/Office</category>
    <feedburner:origLink>http://www.damirscorner.com/Excel2007QueryParameters.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.damirscorner.com/Trackback.aspx?guid=21209566-9f7f-4939-ace5-d224080bb8b1</trackback:ping>
      <pingback:server>http://www.damirscorner.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.damirscorner.com/PermaLink,guid,21209566-9f7f-4939-ace5-d224080bb8b1.aspx</pingback:target>
      <dc:creator>Damir Arh</dc:creator>
      <wfw:comment>http://www.damirscorner.com/CommentView,guid,21209566-9f7f-4939-ace5-d224080bb8b1.aspx</wfw:comment>
      <wfw:commentRss>http://www.damirscorner.com/SyndicationService.asmx/GetEntryCommentsRss?guid=21209566-9f7f-4939-ace5-d224080bb8b1</wfw:commentRss>
      
      <title>Send E-Mail As and On Behalf Of</title>
      <guid isPermaLink="false">http://www.damirscorner.com/PermaLink,guid,21209566-9f7f-4939-ace5-d224080bb8b1.aspx</guid>
      <link>http://feedproxy.google.com/~r/damircorner/~3/fsG_8gDyQq8/SendEMailAsAndOnBehalfOf.aspx</link>
      <pubDate>Sun, 09 Aug 2009 17:39:38 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Microsoft Exchange supports Send As and Send On Behalf Of permissions to be granted&#xD;
to users for individual e-mail addresses. Sending e-mail from Outlook for these users&#xD;
is very simple – they just enter the desired address in the From field of a new message&#xD;
(toggled with the Show From command on the Options ribbon) and if they have the required&#xD;
permission it will be sent accordingly – either as if it was actually sent from that&#xD;
address or as sent by the user on behalf of the address in the From field.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If you want to achieve this from code there is a little more work involved. First&#xD;
of all the user must be authenticated on the server using one of the methods below:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font face="Courier New"&gt;SmtpClient smtp = new SmtpClient("smtp.domain.com");&lt;/font&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font face="Courier New"&gt;// use user’s existing credentials&lt;br&gt;&#xD;
smtp.UseDefaultCredentials = true;&lt;/font&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font face="Courier New"&gt;// pass username and password&lt;br&gt;&#xD;
smtp.Credentials = new NetworkCredentials("username", "password");&lt;/font&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The next step is to set up the correct headers in the message otherwise the server&#xD;
will return error code 5.7.1 describing the permission the user does not have.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To send the e-mail as only the From property has to contain the desired address:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font face="Courier New"&gt;MailMessage mail = new MailMessage();&lt;br&gt;&#xD;
mail.From = new MailAddress("send.as@domain.com");&lt;/font&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To send the e-mail on behalf of another user the Sender property must additionally&#xD;
contain the user’s e-mail address:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font face="Courier New"&gt;MailMessage mail = new MailMessage();&lt;br&gt;&#xD;
mail.From = new MailAddress("send.as@domain.com");&lt;br&gt;&#xD;
mail.Sender = new MailAddress("user.address@domain.com");&lt;/font&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
On a related note, the required permissions can be granted using PowerShell.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To grant the Send As permission:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font face="Courier New"&gt;Add-ADPermission –Identity "user1" –User "user2" –ExtendedRights&#xD;
Send-As&lt;/font&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To grant the Send On Behalf Of permission:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font face="Courier New"&gt;Set-Mailbox "user1" -GrantSendOnBehalfTo "user2"&lt;/font&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
In both cases the user1 specifies the mailbox to grant the permission for and the&#xD;
user2 specifies the user to grant the permission to.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.damirscorner.com/aggbug.ashx?id=21209566-9f7f-4939-ace5-d224080bb8b1"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/G79mPTD843_ldFQLmLt6yWmSHlE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G79mPTD843_ldFQLmLt6yWmSHlE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/G79mPTD843_ldFQLmLt6yWmSHlE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G79mPTD843_ldFQLmLt6yWmSHlE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/damircorner/~4/fsG_8gDyQq8" height="1" width="1"/&gt;</description>
      <comments>http://www.damirscorner.com/CommentView,guid,21209566-9f7f-4939-ace5-d224080bb8b1.aspx</comments>
      <category>Development</category>
      <category>Development/.NET</category>
      <category>Software</category>
      <category>Software/Exchange</category>
    <feedburner:origLink>http://www.damirscorner.com/SendEMailAsAndOnBehalfOf.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.damirscorner.com/Trackback.aspx?guid=0db675f9-82f2-4907-933d-9dccc5f07115</trackback:ping>
      <pingback:server>http://www.damirscorner.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.damirscorner.com/PermaLink,guid,0db675f9-82f2-4907-933d-9dccc5f07115.aspx</pingback:target>
      <dc:creator>Damir Arh</dc:creator>
      <wfw:comment>http://www.damirscorner.com/CommentView,guid,0db675f9-82f2-4907-933d-9dccc5f07115.aspx</wfw:comment>
      <wfw:commentRss>http://www.damirscorner.com/SyndicationService.asmx/GetEntryCommentsRss?guid=0db675f9-82f2-4907-933d-9dccc5f07115</wfw:commentRss>
      <slash:comments>2</slash:comments>
      
      <title>Identifying unrecognized devices in Device Manager</title>
      <guid isPermaLink="false">http://www.damirscorner.com/PermaLink,guid,0db675f9-82f2-4907-933d-9dccc5f07115.aspx</guid>
      <link>http://feedproxy.google.com/~r/damircorner/~3/F5LRagEVhSc/IdentifyingUnrecognizedDevicesInDeviceManager.aspx</link>
      <pubDate>Sat, 01 Aug 2009 17:09:49 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Today I decided to get to the bottom of the missing driver issue on my computer running&#xD;
Windows 7 RC. It shows up as PCI Simple Communications controller and it really bugged&#xD;
me since I don't have a modem or a similar device on the motherboard.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img style="border: 0px none; display: block; float: none; margin-left: auto; margin-right: auto;" title="PCI Simple Communications Controller" alt="PCI Simple Communications Controller" src="http://www.damirscorner.com/content/binary/IdentifyingunrecognizeddevicesinDeviceMa_F2FE/PCISimpleCommunicationsController.png" border="0" height="36" width="268"&gt;&lt;/img&gt;It&#xD;
turned out that there is a away to identify such a device from the information available&#xD;
in Device Manager. The first step is to open the Properties window for this device&#xD;
and move to the Details tab. After selecting the Hardware Ids in the Property dropdown&#xD;
the device identifiers are displayed.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img style="border: 0px none; display: block; float: none; margin-left: auto; margin-right: auto;" title="HardwareIds" alt="HardwareIds" src="http://www.damirscorner.com/content/binary/IdentifyingunrecognizeddevicesinDeviceMa_F2FE/HardwareIds.png" border="0" height="461" width="414"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The important ones are the numbers written after the VEN and DEV keywords. The first&#xD;
one is the Vendor ID and the second one is the Device ID. So in my case the Vendor&#xD;
ID is 8086 (from VEN_8086) and the Device ID is 29A4 (from DEV_29A4).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
All that's left to do know is to go to &lt;a href="http://www.pcidatabase.com" target="_blank"&gt;PCIDatabase.com&lt;/a&gt; and&#xD;
enter the ids into the corresponding search boxes. In my case it turned out that it&#xD;
was a device from Intel - Intel Management Engine Interface (HECI). Unfortunately&#xD;
it doesn't have &lt;a href="http://downloadcenter.intel.com/filter_results.aspx?strTypes=all&amp;amp;ProductID=2374&amp;amp;OSFullName=Windows+7%2C+64-bit*&amp;amp;lang=eng&amp;amp;strOSs=190&amp;amp;submit=Go%21" target="_blank"&gt;a&#xD;
driver for Windows 7&lt;/a&gt; yet and &lt;a href="http://downloadcenter.intel.com/filter_results.aspx?strTypes=all&amp;amp;ProductID=2374&amp;amp;OSFullName=Windows+Vista+64*&amp;amp;lang=eng&amp;amp;strOSs=150&amp;amp;submit=Go%21" target="_blank"&gt;the&#xD;
Vista one&lt;/a&gt; doesn't install. But hey, at least I know which driver is missing.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.damirscorner.com/aggbug.ashx?id=0db675f9-82f2-4907-933d-9dccc5f07115"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pdRsERk-MDGYZC0cXMmTgEkkrVk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pdRsERk-MDGYZC0cXMmTgEkkrVk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pdRsERk-MDGYZC0cXMmTgEkkrVk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pdRsERk-MDGYZC0cXMmTgEkkrVk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/damircorner/~4/F5LRagEVhSc" height="1" width="1"/&gt;</description>
      <comments>http://www.damirscorner.com/CommentView,guid,0db675f9-82f2-4907-933d-9dccc5f07115.aspx</comments>
      <category>Software</category>
      <category>Software/Windows</category>
    <feedburner:origLink>http://www.damirscorner.com/IdentifyingUnrecognizedDevicesInDeviceManager.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.damirscorner.com/Trackback.aspx?guid=4e0955bd-674c-4a1f-b657-91a361e2c0eb</trackback:ping>
      <pingback:server>http://www.damirscorner.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.damirscorner.com/PermaLink,guid,4e0955bd-674c-4a1f-b657-91a361e2c0eb.aspx</pingback:target>
      <dc:creator>Damir Arh</dc:creator>
      <wfw:comment>http://www.damirscorner.com/CommentView,guid,4e0955bd-674c-4a1f-b657-91a361e2c0eb.aspx</wfw:comment>
      <wfw:commentRss>http://www.damirscorner.com/SyndicationService.asmx/GetEntryCommentsRss?guid=4e0955bd-674c-4a1f-b657-91a361e2c0eb</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>Gama System eArchive accredited</title>
      <guid isPermaLink="false">http://www.damirscorner.com/PermaLink,guid,4e0955bd-674c-4a1f-b657-91a361e2c0eb.aspx</guid>
      <link>http://feedproxy.google.com/~r/damircorner/~3/wsrQUTzBtdw/GamaSystemEArchiveAccredited.aspx</link>
      <pubDate>Sat, 05 Jul 2008 20:37:14 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://gama-system.com/Content.aspx?id=20050200"&gt;Gama System eArchive&lt;/a&gt;,&#xD;
one of the two products in our &lt;a href="http://gama-system.com/Content.aspx?id=20050050"&gt;document&#xD;
product line&lt;/a&gt;, received accreditation from the &lt;a href="http://www.arhiv.gov.si/en/"&gt;Archives&#xD;
of the Republic of Slovenia&lt;/a&gt; last week. This acknowledgement by our national body&#xD;
means that any document stored in Gama System eArchive is automatically legally valid.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
This is important for both &lt;a href="http://gama-system.com/NewsItems.aspx"&gt;our company&lt;/a&gt; and&#xD;
other companies looking for a long term electronic document storage solution. Our&#xD;
product is the first service oriented solution to receive the accreditation.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Congratulations to everyone involved in the product. Well done!&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.damirscorner.com/aggbug.ashx?id=4e0955bd-674c-4a1f-b657-91a361e2c0eb"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZhB0dKQNhnKWrIXNkCheLFc7Lhw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZhB0dKQNhnKWrIXNkCheLFc7Lhw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZhB0dKQNhnKWrIXNkCheLFc7Lhw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZhB0dKQNhnKWrIXNkCheLFc7Lhw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/damircorner/~4/wsrQUTzBtdw" height="1" width="1"/&gt;</description>
      <comments>http://www.damirscorner.com/CommentView,guid,4e0955bd-674c-4a1f-b657-91a361e2c0eb.aspx</comments>
      <category>Development</category>
      <category>Development/.NET</category>
      <category>Personal</category>
      <category>Personal/Work</category>
    <feedburner:origLink>http://www.damirscorner.com/GamaSystemEArchiveAccredited.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.damirscorner.com/Trackback.aspx?guid=de988151-8abf-4eef-bdc2-1126b05812b1</trackback:ping>
      <pingback:server>http://www.damirscorner.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.damirscorner.com/PermaLink,guid,de988151-8abf-4eef-bdc2-1126b05812b1.aspx</pingback:target>
      <dc:creator>Damir Arh</dc:creator>
      <wfw:comment>http://www.damirscorner.com/CommentView,guid,de988151-8abf-4eef-bdc2-1126b05812b1.aspx</wfw:comment>
      <wfw:commentRss>http://www.damirscorner.com/SyndicationService.asmx/GetEntryCommentsRss?guid=de988151-8abf-4eef-bdc2-1126b05812b1</wfw:commentRss>
      
      <title>Microsoft Pro Photo Tools decimal separator problem</title>
      <guid isPermaLink="false">http://www.damirscorner.com/PermaLink,guid,de988151-8abf-4eef-bdc2-1126b05812b1.aspx</guid>
      <link>http://feedproxy.google.com/~r/damircorner/~3/5zDGDN792a4/MicrosoftProPhotoToolsDecimalSeparatorProblem.aspx</link>
      <pubDate>Sun, 15 Jun 2008 20:03:01 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Today I've taken my new &lt;a href="http://buy.garmin.com/shop/shop.do?pID=8703"&gt;handeld&#xD;
GPS device&lt;/a&gt; for a test run. It did its job pretty well but the real challenge started&#xD;
afterwards when I tried geotagging the photos I've taken. I decided to use &lt;a href="http://www.microsoft.com/prophoto/downloads/tools.aspx"&gt;Microsoft&#xD;
Pro Photo Tools&lt;/a&gt; which have just been released with geotagging as its main feature.&#xD;
Downloading the track data from the GPS device with Garmin MapSource software was&#xD;
quick and simple. But the problems started soon afterwards. MapSource can only export&#xD;
track data in its proprietary format GDB which can't be used in Microsoft Pro Photo&#xD;
Tools.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.gpsbabel.org/"&gt;GPSBabel&lt;/a&gt; came to the rescue. This free tool&#xD;
can probably convert files between any two existing GPS formats, at least judging&#xD;
from its &lt;a href="http://www.gpsbabel.org/capabilities.html"&gt;list of supported formats&lt;/a&gt;.&#xD;
I used it to convert my data to the GPX XML format only to find out that Microsoft&#xD;
Pro Photo Tools have problems with it. Converting to NMEA or KML instead didn't help&#xD;
either. Fortunately the latter returned a strange error (Degrees must be between 0&#xD;
and 90, found degree 46298501) which put me on the right track. Of course there was&#xD;
no such value in the KML file so I correctly deduced that the decimal separator was&#xD;
to blame.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The value in the file was 46.298501 but the Slovenian regional settings have comma&#xD;
as the decimal separator therefore the value was misinterpreted. Temporarily changing&#xD;
the decimal separator to dot solved the problem - the track was successfully imported&#xD;
immediately afterwards. This issue won't keep me from using this otherwise very useful&#xD;
tool with a really nice feature set. It could even fix the mismatching time settings&#xD;
between my GPS unit and the camera with a single setting. I just hope they address&#xD;
this bug soon so that I won't have to change my regional settings every time I use&#xD;
the program.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The only thing I still have to figure out is why the geotags somehow lost resolution&#xD;
when I uploaded the photos from &lt;a href="http://picasa.google.com/"&gt;Picasa&lt;/a&gt; to &lt;a href="http://picasaweb.google.com/"&gt;Picasa&#xD;
Web Albums&lt;/a&gt;. I just fixed them manually and decided to address the issue next time.&#xD;
Any tips are welcome.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.damirscorner.com/aggbug.ashx?id=de988151-8abf-4eef-bdc2-1126b05812b1"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CMzWU4a6aedgiYt7VfmNLP4PJYA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CMzWU4a6aedgiYt7VfmNLP4PJYA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CMzWU4a6aedgiYt7VfmNLP4PJYA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CMzWU4a6aedgiYt7VfmNLP4PJYA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/damircorner/~4/5zDGDN792a4" height="1" width="1"/&gt;</description>
      <comments>http://www.damirscorner.com/CommentView,guid,de988151-8abf-4eef-bdc2-1126b05812b1.aspx</comments>
      <category>Software</category>
      <category>Software/Imaging</category>
    <feedburner:origLink>http://www.damirscorner.com/MicrosoftProPhotoToolsDecimalSeparatorProblem.aspx</feedburner:origLink></item>
  </channel>
</rss>
