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

<channel>
	<title>Andrew's Blog</title>
	<atom:link href="http://www.blackhillsoftware.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.blackhillsoftware.com/blog</link>
	<description>Bits and Pieces</description>
	<pubDate>Sun, 25 May 2008 10:58:42 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>TimeSprite integration with FogBugz time tracking</title>
		<link>http://www.blackhillsoftware.com/blog/2007/10/10/timesprite-fogbugz-integration/</link>
		<comments>http://www.blackhillsoftware.com/blog/2007/10/10/timesprite-fogbugz-integration/#comments</comments>
		<pubDate>Wed, 10 Oct 2007 13:14:12 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
		
		<category><![CDATA[TimeSprite]]></category>

		<guid isPermaLink="false">http://www.blackhillsoftware.com/blog/2007/10/10/timesprite-integration-with-fogbugz-time-tracking-beta/</guid>
		<description><![CDATA[TimeSprite can now exchange time tracking data with FogBugz Version 6  from Fog Creek Software. It uses the FogBugz API to send and receive information about cases and recorded time.
The TimeSprite FogBugz integration allows you to:

Download time data from FogBugz and view it using the TimeSprite timesheet, journal and percentage time views
Automatically track your [...]]]></description>
			<content:encoded><![CDATA[<p>TimeSprite can now exchange time tracking data with <a href="http://www.fogcreek.com/FogBugz/index.html">FogBugz Version 6</a>  from <a href="http://www.fogcreek.com">Fog Creek Software</a>. It uses the FogBugz API to send and receive information about cases and recorded time.</p>
<p>The TimeSprite FogBugz integration allows you to:</p>
<ul>
<li>Download time data from FogBugz and view it using the TimeSprite timesheet, journal and percentage time views</li>
<li>Automatically track your <em>actual</em> working time, instead of scheduled working time</li>
<li>Pick your current task using a system tray application instead of a web browser</li>
<li>Work offline, and upload your time tracking data to FogBugz later</li>
</ul>
<p>TimeSprite makes the FogBugz time tracking significantly easier to use.</p>
<p>There are several ways you can use TimeSprite with FogBugz:</p>
<ul>
<li>Track time in FogBugz and view the data with TimeSprite</li>
<li>Track time with TimeSprite, and upload the data to FogBugz</li>
<li>Track time in both, and combine the FogBugz data with TimeSprite&#8217;s automatic tracking to see details of what you were working on.</li>
</ul>
<h3>Tracking time with FogBugz</h3>
<p>If you use FogBugz for your time tracking, TimeSprite can download the information for easier viewing. Once you have entered the connection information, simply click the arrow to download times for the current interval.</p>
<p><img src='http://www.blackhillsoftware.com/blog/wp-content/uploads/2007/10/timesheet.gif' alt='timesheet' /></p>
<h3>Tracking time with TimeSprite</h3>
<p>TimeSprite can send its time tracking information to FogBugz. You can either select your current case in the TimeSprite monitor using the system tray icon, or assign time to cases later in the TimeSprite Journal.</p>
<p><img src='http://www.blackhillsoftware.com/blog/wp-content/uploads/2007/10/systemtray.gif' alt='systemtray' /><br />
<em>Selecting the current case from the system tray</em></p>
<p><img src='http://www.blackhillsoftware.com/blog/wp-content/uploads/2007/10/assigntime.gif' alt='assigntime' /><br />
<em>Assigning a case number to time in the journal</em></p>
<p>TimeSprite tracks when you are actually using your computer, so you can get more accurate time records.</p>
<p>When you want to send the data to FogBugz, click the arrow to upload the data. Intervals which have not yet been sent will be uploaded.</p>
<h3>Tracking time in both</h3>
<p>You can track your time in FogBugz, and combine the records with TimeSprite&#8217;s automatic tracking. Let TimeSprite automatically track what you are working on, and periodically download the data from FogBugz. You can then see the FogBugz case information alongside TimeSprite&#8217;s record of which applications and documents you were using.</p>
<h3>Conflicts</h3>
<p>Time tracking information from FogBugz will override the FogBugz case information in TimeSprite. TimeSprite will not upload changes if there are already time records for the same interval. However, it will keep trying. To get rid of the error message when you upload the data either:</p>
<ul>
<li>Download the FogBugz data for that interval, which will override TimeSprite&#8217;s information, or</li>
<li>Log into FogBugz and delete the existing intervals for that time, so TimeSprite can upload its information.</li>
</ul>
<h3>Setting up the connection</h3>
<p>To enable TimeSprite&#8217;s FogBugz integration, go to the TimeSprite settings page (Edit->Settings).</p>
<p><img src='http://www.blackhillsoftware.com/blog/wp-content/uploads/2007/10/timespritesettings.gif' alt='timespritesettings.gif' /></p>
<p>Enter the URL of your FogBugz system, typically something like https://your.fogbugz.com or http://server.example.com/fogbugz, your user name, and password.</p>
<h3>TimeSprite Website</h3>
<p><a href="http://www.timesprite.com">http://www.timesprite.com</a></p>
<h3>Download</h3>
<p>Download TimeSprite from:<br />
<a href="http://www.timesprite.com/TimeSpriteSetup.exe">http://www.timesprite.com/TimeSpriteSetup.exe</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.blackhillsoftware.com/blog/2007/10/10/timesprite-fogbugz-integration/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How to create timesheets automatically with TimeSprite</title>
		<link>http://www.blackhillsoftware.com/blog/2007/06/13/how-to-create-timesheets-automatically-with-timesprite/</link>
		<comments>http://www.blackhillsoftware.com/blog/2007/06/13/how-to-create-timesheets-automatically-with-timesprite/#comments</comments>
		<pubDate>Tue, 12 Jun 2007 23:33:00 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
		
		<category><![CDATA[TimeSprite]]></category>

		<guid isPermaLink="false">http://www.blackhillsoftware.com/blog/2007/06/13/how-to-create-timesheets-automatically-with-timesprite/</guid>
		<description><![CDATA[This is a mini-tutorial about creating time sheets from the information automatically recorded by TimeSprite.
Once per minute TimeSprite records the title of the active window on your computer. When you view the reports, it creates groups of similar titles to make the data more manageable.
To create a timesheet, you need to create your own groups [...]]]></description>
			<content:encoded><![CDATA[<p>This is a mini-tutorial about creating time sheets from the information automatically recorded by TimeSprite.</p>
<p>Once per minute TimeSprite records the title of the active window on your computer. When you view the reports, it creates groups of similar titles to make the data more manageable.</p>
<p>To create a timesheet, you need to create your own groups and assign the automatic groups or individual window titles to them. This is because the automatic groups are unlikely to correspond with what you actually want in your time sheet. The automatic groups are created from the recorded window titles, so they will be things like &#8220;Microsoft Word - Specifications.doc&#8221;. To create a timesheet, you need to assign these to timesheet entries.</p>
<p><img src='http://www.blackhillsoftware.com/blog/wp-content/uploads/2007/06/weektimesheet.gif' alt='Weekly time sheet in TimeSprite' /><br />
<span id="more-19"></span><br />
Until you assign these entries to your own groups, all time in the timesheet will be listed as &#8220;Unclassified&#8221;. This line is shown in the timesheet reports so you know how much time has not been assigned to an entry. If the amount of time in the Unclassified line is significant, you should go to the Time or Journal pages and classify the unclassified time.</p>
<h3>Assigning recorded time to timesheet entries</h3>
<p>To assign the entries to a group, right click on them in the Time screen and click &#8220;Group&#8221;. If you enter a new group name it will be created automatically. You can assign the automatically created groups or the individual window titles.</p>
<p><img src='http://www.blackhillsoftware.com/blog/wp-content/uploads/2007/06/groupdata.gif' alt='Grouping data in TimeSprite' /></p>
<p>This is all that is required for entries that are consistently applied to the same time sheet item. The grouping is remembered for future entries. You should only need to repeat this step when you get new entries that haven&#8217;t been classified before.</p>
<h3>Assigning by time</h3>
<p>You can also assign blocks of time to timesheet entries. If you want to assign all off Tuesday morning to an entry, simply select the time in the Journal, right click and and assign it as above. You can do this for blocks of time as small or large as required.</p>
<p><img src='http://www.blackhillsoftware.com/blog/wp-content/uploads/2007/06/grouptime.gif' alt='Grouping time in TimeSprite' /></p>
<p>Assigning blocks of time overrides the grouping performed in the previous step, because it is more specific. This is useful for making adjustments to time sheets.</p>
<h3>Entries that vary</h3>
<p>Sometimes the same item might be assigned to different timesheet entries. For example, email and other administrative time might be assigned to the &#8220;project du jour.&#8221;</p>
<p>To make processing these entries easier, assign them to a single group from the Time page. You can then assign this group to the correct entry from the Journal.</p>
<p>You can change the settings for this group from the Edit->Groups menu to exclude it from the timesheet. It will then be counted in the &#8220;Unclassified&#8221; time until you assign it. Or, you might choose to leave it in the timesheet to remind you to assign the time to the correct group.</p>
<h3>Exporting time sheets to Excel and other programs</h3>
<p>Once you have created the timesheet, you can use copy and paste to get the data into Excel or other programs. You can also save the timesheet as a CSV file which can be read by Excel and many other applications. Simply choose File->Export to CSV from the menu when viewing the timesheet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blackhillsoftware.com/blog/2007/06/13/how-to-create-timesheets-automatically-with-timesprite/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Google Adwords isn&#8217;t Really Pay per Click</title>
		<link>http://www.blackhillsoftware.com/blog/2007/06/12/google-adwords-isnt-really-pay-per-click/</link>
		<comments>http://www.blackhillsoftware.com/blog/2007/06/12/google-adwords-isnt-really-pay-per-click/#comments</comments>
		<pubDate>Tue, 12 Jun 2007 00:57:52 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
		
		<category><![CDATA[Adwords]]></category>

		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://www.blackhillsoftware.com/blog/2007/06/12/google-adwords-isnt-really-pay-per-click/</guid>
		<description><![CDATA[One of the things that attracts people to Google Adwords is that it is pay-per-click. This means that advertisers only pay when somebody actually clicks on their ad. That seems straightforward enough. However, the way that the bids and cost per click are calculated mean that it is really more like pay-per-impression than pay-per-click. All [...]]]></description>
			<content:encoded><![CDATA[<p>One of the things that attracts people to Google Adwords is that it is pay-per-click. This means that advertisers only pay when somebody actually clicks on their ad. That seems straightforward enough. However, the way that the bids and cost per click are calculated mean that it is really more like pay-per-impression than pay-per-click. All those occasions when people don&#8217;t click the ad still cost you, in the form of higher bid prices for your clicks.<br />
<span id="more-4"></span></p>
<h3>Bid Price Calculation</h3>
<p>There are a number of factors that determine what you need to pay for a click. You are bidding against other advertisers, but it isn&#8217;t simply the highest bid wins. Google takes into account other factors, in particular the relevance of the ad, the landing page quality and the <strong>Click Through Rate</strong> (CTR) of the ad.</p>
<p>Including the CTR in the calculation is what makes it more like pay per impression. Everything else being equal, if your click through rate is only half your competitor&#8217;s, you have to bid double for the same ad position. If they bid 50c, you have to bid $1 - or $1.01 to beat their bid.</p>
<p>If you work the numbers, you see that the winning bidder is the bidder who gives the best return per ad shown. This maximizes the return for Google - which shouldn&#8217;t surprise anyone. Assume your CTR is 1% and your competitor&#8217;s is 2%, using a simplified calculation:</p>
<p>Ad revenue = CTR * bid price * 1000 impressions</p>
<p>1% * $1 * 1000 = $10 per thousand impressions<br />
2% * $0.51 * 1000 = $10.20 per thousand impressions</p>
<p>The 51c bid will beat a $1 bid, because it has double the click through rate.</p>
<p><em>Incorporating the click through rate into the calculation turns it into pay per impression.<br />
</em> People who don&#8217;t click on your ad reduce your click through rate and cost you money indirectly.</p>
<h3>This is actually good news</h3>
<p>This presents a big opportunity to <strong>reduce your cost per click</strong>.<br />
The technique of targeting the ad to as many people as possible in the hope that they will be interested is expensive. To reduce your cost per click you want to laser target the ad at the people who are actually looking for a product like yours. You want to stop the people who don&#8217;t click on the ad from seeing it at all.  If you can significantly cut the number of people who see the ad, without reducing the number of clicks, your clicks will be correspondingly cheaper.</p>
<p>Google Adwords provides many ways to control exactly who sees your ad. The most important are negative keywords, careful selection of search terms and targeting languages and locations.</p>
<h3>Clicking a competitors ad</h3>
<p>This has interesting implications for people who click on their competitors ads to try to use up their ad budget. The clicks will increase their competitor&#8217;s CTR, reduce their cost per click, and boost the ad position. Probably not the desired effect. Whether these effects outweigh the cost of the clicks I don&#8217;t know, but it certainly mitigates the effect of the invalid clicks.</p>
<h3>For some people, it&#8217;s really bad news&#8230;</h3>
<p>While it is good news for people with well known products or solutions which customers actively look for, it is bad news if you are trying to introduce a completely new product. Adwords is designed to advertise to people who are already looking. If people aren&#8217;t actively looking for your solution, it is very difficult to effectively target them with Adwords. You will always be at a disadvantage to the people who are producing exactly what they are looking for. In this case, other forms of advertising might work better.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blackhillsoftware.com/blog/2007/06/12/google-adwords-isnt-really-pay-per-click/feed/</wfw:commentRss>
		</item>
		<item>
		<title>TimeSprite Version 2 Release</title>
		<link>http://www.blackhillsoftware.com/blog/2007/05/23/timesprite-version-2-release/</link>
		<comments>http://www.blackhillsoftware.com/blog/2007/05/23/timesprite-version-2-release/#comments</comments>
		<pubDate>Wed, 23 May 2007 01:05:10 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
		
		<category><![CDATA[TimeSprite]]></category>

		<guid isPermaLink="false">http://www.blackhillsoftware.com/blog/2007/05/23/timesprite-version-2-release/</guid>
		<description><![CDATA[Very few problems have been reported during the beta testing, so it is time to officially release TimeSprite version 2.
TimeSprite Version 2 is a free upgrade for those who purchased version 1.
Changes and new functions:

Use the process name to group windows that don&#8217;t have enough information to group by title. This avoids having many short [...]]]></description>
			<content:encoded><![CDATA[<p>Very few problems have been reported during the beta testing, so it is time to officially release TimeSprite version 2.</p>
<p>TimeSprite Version 2 is a free upgrade for those who purchased version 1.</p>
<p>Changes and new functions:</p>
<ul>
<li>Use the process name to group windows that don&#8217;t have enough information to group by title. This avoids having many short entries for &#8220;Save File&#8221; dialogs etc.</li>
<li>Add journal and weekly and monthly timesheet views of data.</li>
<li>Add wildcard support when grouping by title.</li>
<li>Records can be grouped by time, overriding other grouping for that specific time.</li>
<li>Add export and import functions so data from 2 PCs can be merged.</li>
<li>Add support for adding notes in journal.</li>
<li>Add copy to clipboard so you can copy and paste to applications like Excel.</li>
<li>Add reminder function to notify you after you have spent a certain amount of time on an activity.</li>
<li>Automatically minimize the monitor after startup if it was minimized when shut down.</li>
<li>The database has been modified for improved performance and smaller size.</li>
<li>The default data retention period has been extended from 45 to 9999 days.</li>
<li>Improve the search for common parts of window titles for grouping.</li>
<li>Add a reminder when the monitor is paused.</li>
<li>Evaluation period extended to 30 days.</li>
<li>Use the same list for grouping and the TimeSprite Monitor activity selection. Most people thought these were the same list anyway, and were confused when they were different.</li>
<li>Fix occasional database errors, and improve the diagnostic information gathered when an error occurs.</li>
<li>Improve and fix bugs in the date and time selection.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.blackhillsoftware.com/blog/2007/05/23/timesprite-version-2-release/feed/</wfw:commentRss>
		</item>
		<item>
		<title>TimeSprite 2.0 Beta</title>
		<link>http://www.blackhillsoftware.com/blog/2007/05/02/timesprite-20-beta/</link>
		<comments>http://www.blackhillsoftware.com/blog/2007/05/02/timesprite-20-beta/#comments</comments>
		<pubDate>Wed, 02 May 2007 12:05:59 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
		
		<category><![CDATA[TimeSprite]]></category>

		<guid isPermaLink="false">http://www.blackhillsoftware.com/blog/?p=9</guid>
		<description><![CDATA[I am very relieved to finally have the TimeSprite 2.0 beta available. A number of people have been asking when TimeSprite was going to be updated, and I really didn&#8217;t think it was going to be this long.

My original plan was to release version 1.1 before working on version 2, but when I looked at [...]]]></description>
			<content:encoded><![CDATA[<p>I am very relieved to finally have the TimeSprite 2.0 beta available. A number of people have been asking when TimeSprite was going to be updated, and I really didn&#8217;t think it was going to be this long.<br />
<span id="more-9"></span><br />
My original plan was to release version 1.1 before working on version 2, but when I looked at the features I was planning for each I decided it made more sense to combine them all into 2.0. In hindsight, that was probably a mistake - the version 2 features (the journal, timesheets etc.) ended up being much more work than I thought. It wasn&#8217;t all bad though - late in the testing for 2.0 I did find a big problem with the way I implemented grouping by process, which had been one of the key updates planned for 1.1. I&#8217;m kind of glad that didn&#8217;t make it out into the world.</p>
<p>My main aim with version 2 was to make the program more <em>useful</em>. The information collected by version 1 was <em>interesting</em>, but using it for something like a timesheet was a manual process. Version 2 now allows you to create timesheets directly, and copy and paste to applications like Excel or save them to CSV files. You can also add notes to the time records.</p>
<p>To see more about the changes in version 2, see: <a href="http://www.timesprite.com/News/V2Beta.html">http://www.timesprite.com/News/V2Beta.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.blackhillsoftware.com/blog/2007/05/02/timesprite-20-beta/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Using Inno Setup with the .NET Framework</title>
		<link>http://www.blackhillsoftware.com/blog/2006/06/26/using-innosetup-with-the-dotnet-framework/</link>
		<comments>http://www.blackhillsoftware.com/blog/2006/06/26/using-innosetup-with-the-dotnet-framework/#comments</comments>
		<pubDate>Mon, 26 Jun 2006 06:07:17 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.blackhillsoftware.com/blog/2006/06/26/using-inno-setup-with-the-net-framework/</guid>
		<description><![CDATA[This article describes the script used to automatically download and install the Microsoft .NET Framework during the TimeSprite installation. Developers of .NET applications may find this information useful for their own applications.

The script is based heavily on the script Ted Ehrich posted to the Inno Setup newsgroup in this post: http://news.jrsoftware.org/news/innosetup.isx/msg06108.html
The script uses some of [...]]]></description>
			<content:encoded><![CDATA[<p>This article describes the script used to automatically download and install the Microsoft .NET Framework during the TimeSprite installation. Developers of .NET applications may find this information useful for their own applications.<br />
<span id="more-17"></span><br />
The script is based heavily on the script Ted Ehrich posted to the Inno Setup newsgroup in this post: <a href="http://news.jrsoftware.org/news/innosetup.isx/msg06108.html">http://news.jrsoftware.org/news/innosetup.isx/msg06108.html</a></p>
<p>The script uses some of the third party add-ons to Innosetup, I think the <a href="http://www.jrsoftware.org/isdl.php">QuickStart Pack</a> includes what you need.</p>
<p><strong>Requirements</strong><br />
Having the .NET Framework as a dependency makes the installation requirements somewhat complex.</p>
<ul>
<li>You need to detect whether the framework is already installed. </li>
<li>The Framework needs to be installed by an administrator, but applications normally do not. </li>
<li>You don&#8217;t want to distribute the framework with your application. </li>
<li>You don&#8217;t want to force people to download the Framework if they don&#8217;t need to, ie. they have a local copy.</li>
<li>The installation of the product should not go ahead if the .NET Framework installation fails or is cancelled.</li>
</ul>
<p><strong>The Script</strong></p>
<p>The script that I ended up with performs the following processing:</p>
<ol>
<li>Requires Windows 98 or Windows NT4 or later. For simplicity it does not check for the required NT4 service pack or Internet Explorer 5.01 - I don&#8217;t think many systems that back level will be installing new software. However in testing I did verify that if the version of IE is too low, the .NET Framework installation asks for it to be upgraded.</li>
<li>If the .NET Framework is not installed and the user is not logged on as an administrator, it tells the user they need an administrator to install the .NET Framework. </li>
<li>If the .NET Framework is not installed, it looks for the dotnetfx.exe file in the same location as the setup file. If it is not found, it downloads it from Microsoft.</li>
<li>Installs the .NET Framework if required. </li>
<li>
If the .NET Framework installation was successful or it was already installed, installs the application. </li>
</ol>
<p>I haven&#8217;t programmed in Pascal, and this was my first shot at an Inno Setup script, so there are probably plenty of opportunities for tidying things up. A lot of what I did was just copying and modifying stuff. However the end result does seem to handle the .NET installation nicely.</p>
<p>Here is the script: <a href="http://www.timesprite.com/BlogEntries/dotnet.iss">dotnet.iss</a></p>
<p>Notes:</p>
<ul>
<li>The script is based on .NET Framework 1.1 but changes for other versions should be simple. </li>
<li>The best way to check whether the .NET Framework is installed seems to be registry key &#8216;HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\policy\v1.1&#8242;. This key is accessible to regular users.</li>
<li>If the .NET Framework download or installation fails or is cancelled, the installation goes back to the Ready to Install page. The user can restart the install, or cancel it.</li>
<li>The URL for the .NET Framework download is hard coded. If it changes a new setup will be required. However it seems to be referenced in many places around the Internet, so hopefully Microsoft will think twice before changing it (famous last words&#8230;).</li>
<li>
If the user cancels the .NET Framework download partway through, then restarts the installation, the download resumes from where it was canceled. If they cancel the .NET Framework installation then restart the installation, it does not need to be downloaded again. (Both cases assume they did not exit the whole install).</li>
<li>I have not tried to make the .NET install silent - I felt it was better to let the user see what is going on. The process can take a while.</li>
</ul>
<p><strong>Unrelated but perhaps useful information</strong></p>
<p>I also have a digital photo program, <a href="http://www.picnam.com">Picnam</a>, which I converted to the same process. Picnam adds entries to the &#8220;Open With&#8221; menu in Explorer, so that people can easily open images using Picnam but existing file associations are not affected.</p>
<p>These are the registry entries I used:</p>
<p><code>[Registry]<br />
Root: HKCR; Subkey: &#8220;.jpg\OpenWithList\MyApp.exe&#8221;; Flags: uninsdeletekey noerror<br />
Root: HKCR; Subkey: &#8220;.jpeg\OpenWithList\MyApp.exe&#8221;; Flags: uninsdeletekey noerror<br />
Root: HKCR; Subkey: &#8220;applications\MyApp.exe\shell\open\command&#8221;; ValueType: string; ValueData: &#8220;&#8221;"{app}\MyApp.exe&#8221;" &#8220;&#8221;%1&#8243;&#8221;"; Flags: uninsdeletekey noerror<br />
</code><br />
<code>Root: HKCU; Subkey: "Software\Classes\.jpg\OpenWithList\MyApp.exe"; Flags: uninsdeletekey<br />
Root: HKCU; Subkey: "Software\Classes\.jpeg\OpenWithList\MyApp.exe"; Flags: uninsdeletekey<br />
Root: HKCU; Subkey: "Software\Classes\applications\MyApp.exe\shell\open\command"; ValueType: string; ValueData: """{app}\MyApp.exe"" ""%1"""; Flags: uninsdeletekey</code></p>
<p>The HKCR values install the &#8220;Open With&#8221; option for all users, but fail if the user is not an administrator. The HKCU values install it for the current user, and work even if the user is not an administrator.</p>
<p><strong>VMWare</strong></p>
<p>I used VMWare Workstation for the first time in testing the setup process, and I have to say it is a huge productivity booster for this type of thing. Using snapshots I was able to run the installation process with minor changes in various configurations over and over again - probably about 20 times in a couple of hours. It was a huge productivity gain, and I join those who say that VMWare or an equivalent product is an essential tool for software development.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blackhillsoftware.com/blog/2006/06/26/using-innosetup-with-the-dotnet-framework/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Idea Behind TimeSprite</title>
		<link>http://www.blackhillsoftware.com/blog/2006/06/23/the-idea-behind-timesprite/</link>
		<comments>http://www.blackhillsoftware.com/blog/2006/06/23/the-idea-behind-timesprite/#comments</comments>
		<pubDate>Fri, 23 Jun 2006 00:03:23 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
		
		<category><![CDATA[TimeSprite]]></category>

		<guid isPermaLink="false">http://www.blackhillsoftware.com/blog/2006/06/23/the-idea-behind-timesprite/</guid>
		<description><![CDATA[Like many people, I do a lot of reading on the Internet - blogs, newspapers, discussion groups etc. I learn a lot from these online sources, but there needs to be a balance between learning and actual constructive work. I started wondering how much time I actually spend on different activities, and thinking about an [...]]]></description>
			<content:encoded><![CDATA[<p>Like many people, I do a lot of reading on the Internet - blogs, newspapers, discussion groups etc. I learn a lot from these online sources, but there needs to be a balance between learning and actual constructive work. I started wondering how much time I actually spend on different activities, and thinking about an application to track my time on the computer.<br />
<span id="more-16"></span><br />
Recording the title of the active window turned out to be relatively easy. The difficult part was to organize the information in a useful way. Surfing the Internet in particular produces a huge number of different window titles - typically a different one for every page. Simply listing a time for each page is not very useful - you end up with a huge list of titles with very short times. Likewise, grouping everything together under &#8220;Mozilla Firefox&#8221; or &#8220;Internet Explorer&#8221; is not very useful - you need some grouping by different web sites, so you can see work related versus non work related times.</p>
<p>The solution was a moderately complex process which searches for common information in the window titles, and uses the information to create groups of titles. The process can&#8217;t be perfect - the title you see in the web browser window comes from the web site itself, so the process relies on web site creators to have a common component in their page titles. However it does work quite well in practice.</p>
<p>You still end up with a lot of groups, and sometimes windows aren&#8217;t grouped the way you want, so I added a manual grouping feature. This allows you to combine multiple groups into one, and to assign particular titles to a manual group - effectively overriding the automatic grouping for those titles.</p>
<p>Finally, the ability to specify an activity instead of tracking the active window seemed useful. It allows you to track meetings and other time away from your computer, and some people simply prefer to manually pick an activity rather than track the active window.</p>
<p><strong>Results</strong></p>
<p>Having used the program myself for a while I have been quite pleased with the results. I can see how much time I have spent on the computer, and how much time I spend on productive versus unproductive activities. It still requires discipline to resist distractions, but seeing actual records of the time at the end of the day is a powerful motivator. I am actually a little surprised how often I do refer to it to see how long I have spent working on something. I am also often surprised at the answers - when you are immersed in a problem, time passes very quickly.</p>
<p><strong>Unexpected Benefits<br />
</strong><br />
Keeping an accurate record of my time has produced a benefit that I didn&#8217;t foresee.</p>
<p>Working from home allows you to have a lot of flexibility in the hours you work. You can take a break during the day, and make up the time in the evenings or weekends. The problem is, if you work irregular hours you may not keep track of how many hours you actually work. If you take a long break during the day, you feel obligated to work a few hours in the evening to make up time. However in reality, if you worked 8am - 1pm, then 4pm - 6pm, you have already done 7 hours. Despite the long break in the middle of the day, you don&#8217;t need to do another 3 hours in the evening to make a full day. Likewise, if you are up to 30 hours for the week by midday Wednesday, you can probably afford to take the afternoon off.</p>
<p>Keeping a record of your time can help control the amount of time you spend working at home, and allow you to reclaim some time for other activities.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blackhillsoftware.com/blog/2006/06/23/the-idea-behind-timesprite/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
