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

<channel>
	<title>Meandering thoughts &#187; development infrastructure</title>
	<atom:link href="http://magpie.sytes.net/jesperhogstrom/category/development-infrastructure/feed/" rel="self" type="application/rss+xml" />
	<link>http://magpie.sytes.net/jesperhogstrom</link>
	<description>Words are flying out like endless rain into a paper cup.</description>
	<lastBuildDate>Fri, 16 Oct 2009 23:06:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>How to write a CCNet publisher in C#</title>
		<link>http://magpie.sytes.net/jesperhogstrom/2009/01/how-to-write-a-ccnet-publisher-in-c/</link>
		<comments>http://magpie.sytes.net/jesperhogstrom/2009/01/how-to-write-a-ccnet-publisher-in-c/#comments</comments>
		<pubDate>Sun, 25 Jan 2009 20:58:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[development infrastructure]]></category>

		<guid isPermaLink="false">http://magpie.sytes.net/jesperhogstrom/?p=176</guid>
		<description><![CDATA[Anyone doing development and want to be serious about need a build machine. If you&#8217;re not only into being serious but also want some fun, why not try enhance the infrastructure by for instance writing your own CCNet plugins?
After some experimenting it turns out to be really simple. All you need to do is implement [...]]]></description>
			<content:encoded><![CDATA[<p>Anyone doing development and want to be serious about need a build machine. If you&#8217;re not only into being serious but also want some fun, why not try enhance the infrastructure by for instance writing your own CCNet plugins?</p>
<p>After some experimenting it turns out to be really simple. All you need to do is implement the interface ITask. There are however a few more things to keep in mind.</p>
<p>Before I start, let me say that everything I learned about this comes from looking at the source of CruiseControl.Net and also peeking at the <a href="http://thomasfreudenberg.com/blog/archive/2007/06/17/twitter-publisher-for-cruisecontrol-net.aspx" target="_blank">Twitter Publisher by Thomas Freudenberg</a>.</p>
<p>Your assembly must have a name on the pattern ccnet.*.plugin.dll. The location of the dll must be the same as the ccnet server directory (typically c:\Program Files\CruiseControl.NET\server). During development, feel free to name that as your output directory.</p>
<p>The namespace and class name are not important. However, you need to add an attribute, ReflectorType, to the class. The constructor takes a string. That string is the node you specify in ccnet.config.</p>
<p>I think it is time for an example.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">using ThoughtWorks.<span class="me1">CruiseControl</span>.<span class="me1">Core</span>;</div>
</li>
<li class="li1">
<div class="de1">using System.<span class="me1">Windows</span>.<span class="me1">Forms</span>;</div>
</li>
<li class="li1">
<div class="de1">using Exortech.<span class="me1">NetReflector</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">namespace any.<span class="me1">name</span>.<span class="me1">isvalid</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#91;</span>ReflectorType<span class="br0">&#40;</span><span class="st0">&quot;mynewpublisher&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; public class ClassNameNotImportant : ITask</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; public <span class="kw4">void</span> Run<span class="br0">&#40;</span>IIntegrationResult result<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; MessageBox.<span class="me1">Show</span><span class="br0">&#40;</span><span class="kw4">string</span>.<span class="me1">Format</span><span class="br0">&#40;</span><span class="st0">&quot;yehaa {0} &#8211; {1}&quot;</span>, result.<span class="me1">ProjectName</span>, result.<span class="me1">Status</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>This can be tested by the following configuration file:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;cruisecontrol</span> <span class="re0">xmlns:cb</span>=<span class="st0">&quot;urn:ccnet.config.builder&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;project</span> <span class="re0">name</span>=<span class="st0">&quot;MyFirstProject&quot;</span> <span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;publishers<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;mynewpublisher</span><span class="re2">/&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/publishers<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;/project<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/cruisecontrol<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>When you connect your cctray to the project and force it you&#8217;ll get a happy message box. Please refrain from using actual message boxes on your server! This is something you should try at home, not at work <img src='http://magpie.sytes.net/jesperhogstrom/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>There are times when your publisher needs some configuration. This is easily accomplished by more attributes;</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>ReflectorProperty<span class="br0">&#40;</span><span class="st0">&quot;user&quot;</span>, Required = <span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">public <span class="kw4">string</span> User <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The config file now looks like</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;publishers<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;mynewpublisher<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;user<span class="re2">&gt;</span></span></span>jesper<span class="sc3"><span class="re1">&lt;/user<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;/mynewpublisher<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li2">
<div class="de2"><span class="sc3"><span class="re1">&lt;/publishers<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>If you specify Required=True you will get a startup failure if the xmlnode is not specified!</p>
<p>Some properties are numbers (he said numbly). Fear not, just adorn the adornment some:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>ReflectorProperty<span class="br0">&#40;</span><span class="st0">&quot;intvalue&quot;</span>, Required = <span class="kw2">true</span>, InstanceType=typeof<span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">public <span class="kw4">int</span> intvalue <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>There is also the odd chance you need a list of items as a property to your publisher. That&#8217;s a tad bit more involved, but here goes. First, the config file we want to specify looks like:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;mynewpublisher<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;user<span class="re2">&gt;</span></span></span>jesper<span class="sc3"><span class="re1">&lt;/user<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;intvalue<span class="re2">&gt;</span></span></span>33<span class="sc3"><span class="re1">&lt;/intvalue<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;recipients<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;recipient</span> <span class="re0">name</span>=<span class="st0">&quot;jesper&quot;</span><span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;recipient</span> <span class="re0">name</span>=<span class="st0">&quot;jonas&quot;</span><span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;/recipients<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/mynewpublisher<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>In other words, a list of recipients that each have a name. First, the property on the publisher-class:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>ReflectorHash<span class="br0">&#40;</span><span class="st0">&quot;recipients&quot;</span>, <span class="st0">&quot;name&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">public Hashtable Recipients <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>To make sure we don&#8217;t inadvertently hand out nulls we need to add a constructor as well</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">public ClassNameNotImportant<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; Recipients = new Hashtable<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>We also need to define the class to hold each item. Luckily it is simple.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>ReflectorType<span class="br0">&#40;</span><span class="st0">&quot;recipient&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">public class Recipient</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#91;</span>ReflectorProperty<span class="br0">&#40;</span><span class="st0">&quot;name&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; public <span class="kw4">string</span> Name <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Test it in your Run-method.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">public <span class="kw4">void</span> Run<span class="br0">&#40;</span>IIntegrationResult result<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; MessageBox.<span class="me1">Show</span><span class="br0">&#40;</span><span class="kw4">string</span>.<span class="me1">Format</span><span class="br0">&#40;</span><span class="st0">&quot;Recipients: {0}&quot;</span>, Recipients.<span class="me1">Count</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; foreach <span class="br0">&#40;</span>Recipient r in Recipients.<span class="me1">Values</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; MessageBox.<span class="me1">Show</span><span class="br0">&#40;</span>r.<span class="me1">Name</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>There are a few more attributes that can be used, but I must admit I haven&#8217;t investigated them thoroughly. The NetReflector package is available on sourceforge <a href="http://sourceforge.net/projects/netreflector/">here</a>.</p>
<p>At any rate, this article should be enough to get you started. I&#8217;ll definitely start implementing some of my publisher ideas &#8211; the Twitter Publisher is admittedly already done, but it was only number three on my list.</p>
<p>&#8211;Jesper Hogstrom</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fmagpie.sytes.net%2Fjesperhogstrom%2F2009%2F01%2Fhow-to-write-a-ccnet-publisher-in-c%2F&amp;linkname=How%20to%20write%20a%20CCNet%20publisher%20in%20C%23"><img src="http://magpie.sytes.net/jesperhogstrom/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://magpie.sytes.net/jesperhogstrom/2009/01/how-to-write-a-ccnet-publisher-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upgrade failed, black screen of grub, MBR busted</title>
		<link>http://magpie.sytes.net/jesperhogstrom/2008/11/upgrade-failed-black-screen-of-grub-mbr-busted/</link>
		<comments>http://magpie.sytes.net/jesperhogstrom/2008/11/upgrade-failed-black-screen-of-grub-mbr-busted/#comments</comments>
		<pubDate>Sun, 30 Nov 2008 18:08:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Computer tricks]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[development infrastructure]]></category>

		<guid isPermaLink="false">http://magpie.sytes.net/jesperhogstrom/?p=113</guid>
		<description><![CDATA[There I was, having a pretty good time. To me, that means having spent most of the weekend playing table tennis with my son, and finalizing the movement of all my VMs to the shiny new ESXi server.
To make things perfect, I wanted all the machines to run VMWare tools. On some machines that was [...]]]></description>
			<content:encoded><![CDATA[<p>There I was, having a pretty good time. To me, that means having spent most of the weekend playing table tennis with my son, and finalizing the movement of all my VMs to the shiny new ESXi server.</p>
<p>To make things perfect, I wanted all the machines to run VMWare tools. On some machines that was as simple as selecting the appropriate menu item.</p>
<p><a href="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/install_vmwaretools.png"><img class="alignnone size-full wp-image-114" title="install_vmwaretools" src="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/install_vmwaretools.png" alt="" width="282" height="292" /></a></p>
<p>However, in some other cases it was simply not that simple. I needed to do the whole thing manually. For now, I&#8217;ll skip over the details of that and cut to the chase.</p>
<p>I tried to upgrade my kernel so I could recompile some vmware tools drivers when something went terribly wrong.</p>
<p>When I rebooted, all I had was a black screen saying &#8220;GRUB _&#8221; and it didn&#8217;t accept a single key stroke.</p>
<p>Luckily, it wasn&#8217;t the most important machine, but still &#8211; things didn&#8217;t look too good.</p>
<p>After spending some time on google, I found that others had had the same problem, and it seemed to having to do with the MBR (Master Boot Record) being messed up. It made kind of sense, but what then?</p>
<p>A <a href="http://ubuntuforums.org/showthread.php?t=790886">thread I found on an Ubuntu site</a> mentioned something called the Super Grub Disk. I downloaded it from <a href="http://www.supergrubdisk.org/">http://www.supergrubdisk.org/</a> and uploaded it to the ESXi data storage.</p>
<p>Add a CD to the VM and point it to the ISO image.</p>
<p>Next &#8211; how to get the VM to change boot sequence?</p>
<p>Shut down the VM, edit settings and check the little box.</p>
<p><a href="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/bios_next_boot.png"><img class="alignnone size-full wp-image-115" title="bios_next_boot" src="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/bios_next_boot.png" alt="" width="500" height="201" /></a></p>
<p>Save and reboot.</p>
<p>The interface is somewhat different &#8211; but plain menu driven! For me, it worked to simply select the menu options with help, select language, opt for Gnu/Linux and then &#8220;Fix boot of Gnu/Linux (GRUB)&#8221;. 0.1 seconds later I got an OK message, shut down the machine and switched back the boot order.</p>
<p>It just worked, The machine is back online. Now it&#8217;s time to beat the next generation in table tennis one more time before I install the VMWare tools.</p>
<p>A piece of advice: Take snapshots before you upgrade the kernel!</p>
<p>&#8211;Jesper Hogstrom</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fmagpie.sytes.net%2Fjesperhogstrom%2F2008%2F11%2Fupgrade-failed-black-screen-of-grub-mbr-busted%2F&amp;linkname=Upgrade%20failed%2C%20black%20screen%20of%20grub%2C%20MBR%20busted"><img src="http://magpie.sytes.net/jesperhogstrom/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://magpie.sytes.net/jesperhogstrom/2008/11/upgrade-failed-black-screen-of-grub-mbr-busted/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Converting vmware disks from IDE to SCSI</title>
		<link>http://magpie.sytes.net/jesperhogstrom/2008/11/converting-vmware-disks-from-ide-to-scsi/</link>
		<comments>http://magpie.sytes.net/jesperhogstrom/2008/11/converting-vmware-disks-from-ide-to-scsi/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 22:23:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Computer tricks]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[development infrastructure]]></category>

		<guid isPermaLink="false">http://magpie.sytes.net/jesperhogstrom/?p=101</guid>
		<description><![CDATA[In the process of moving from VMWare Server to VMWare ESXi I realized I must change the layout of my disks. ESXi doesn&#8217;t like growing disks, nor does it like IDE disks.
I alluded to my initial conversion issues in this post. While I learned more than I asked for, it seems it wasn&#8217;t quite necessary [...]]]></description>
			<content:encoded><![CDATA[<p>In the process of moving from <a href="http://www.vmware.com/download/server/">VMWare Server</a> to <a href="https://www.vmware.com/tryvmware/?p=esxi">VMWare ESXi</a> I realized I must change the layout of my disks. ESXi doesn&#8217;t like growing disks, nor does it like IDE disks.</p>
<p>I alluded to my initial conversion issues in <a href="http://magpie.sytes.net/jesperhogstrom/2008/11/creating-floppy-boot-disks-under-vmware/">this post</a>. While I learned more than I asked for, it seems it wasn&#8217;t quite necessary to use the lsilogic adapter. Buslogic worked just as fine&#8230;</p>
<p>First, credit where credit is due. I gathered all my information from <a href="http://hamed.dk/home/53-vm-ide2scsi">http://hamed.dk/home/53-vm-ide2scsi </a>and <a href="http://blog.creonfx.com/linux/howto-convert-vmware-windows-xp-ide-disk-to-lsilogic-scsi">http://blog.creonfx.com/linux/howto-convert-vmware-windows-xp-ide-disk-to-lsilogic-scsi</a>.</p>
<p>Having converted a couple of disks, I felt obliged to add the minor details I managed to add to the process.</p>
<p>Not that I&#8217;m a sissy, but one never knows. Close the virtual machine and backup!</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">cd /VMs
</div>
</li>
<li class="li1">
<div class="de1">$ mkdir backup
</div>
</li>
<li class="li1">
<div class="de1">$ cp -v virtualmach1/* backup</div>
</li>
</ol>
</div>
<p>My disks hadn&#8217;t been defragmented in a while &#8211; as I didn&#8217;t even know that was possible, so lets start doing that:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">$ cd /VMs/virtualmach1
</div>
</li>
<li class="li1">
<div class="de1">$ vmware-vdiskmanager -d Windows\ XP\ Professional-cl1-000001-cl1.vmdk
</div>
</li>
<li class="li1">
<div class="de1">Using log file /tmp/vmware-root/vdiskmanager.log
</div>
</li>
<li class="li1">
<div class="de1">Defragment: 100% done.
</div>
</li>
<li class="li2">
<div class="de2">Defragmentation completed successfully.</div>
</li>
</ol>
</div>
<p>When I read the other posts, I was quite worried about not having a &#8220;small vmdk-file&#8221; that contained the disk description. Fear not! It will magically appear after the next step: Disk conversion. While we&#8217;re at it, give the disk a better name. Delete the old disk. We have a backup, remember?</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">$ vmware-vdiskmanager -r Windows\ XP\ Professional-cl1-000001-cl1.vmdk -t 2 virtualmachine1.vmdk
</div>
</li>
<li class="li1">
<div class="de1">Using log file /tmp/vmware-root/vdiskmanager.log
</div>
</li>
<li class="li1">
<div class="de1">Creating monolithic preallocated disk &#8216;virtualmachine1.vmdk&#8217;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; Convert: 100% done.
</div>
</li>
<li class="li2">
<div class="de2">Virtual disk conversion successful.
</div>
</li>
<li class="li1">
<div class="de1">$ ls *.vmdk
</div>
</li>
<li class="li1">
<div class="de1">virtualmachine1-flat.vmdk &nbsp;virtualmachine1.vmdk Windows XP Professional-cl1-000001-cl1.vmdk
</div>
</li>
<li class="li1">
<div class="de1">$ rm &quot;Windows XP Professional-cl1-000001-cl1.vmdk&quot;</div>
</li>
</ol>
</div>
<p>The virtual physical layout of the disks will change when we convert it to a SCSI disk, but the number of sectors remain the same. Check the number of sectors you have now:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">$ &nbsp;cat virtualmachine1.vmdk|grep RW| awk &nbsp;&#8217;{print $2}&#8217;
</div>
</li>
<li class="li1">
<div class="de1">25165824</div>
</li>
</ol>
</div>
<p>The number 25165824 will be used to create a dummy SCSI disk. YOUR NUMBER WILL NOT BE THE SAME!</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">$ vmware-vdiskmanager -c -s 25165824 -a buslogic -t 1 scsi.vmdk</div>
</li>
</ol>
</div>
<p>If you&#8217;re like me and prefer to copy entire lines and avoid remembering numbers between screens, here goes:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">$ vmware-vdiskmanager -c -s `cat virtualmachine1.vmdk|grep RW| awk &nbsp;&#8217;{print $2}&#8217;` -a buslogic -t 1 scsi.vmdk</div>
</li>
</ol>
</div>
<p>Either way, look at the scsi.vmdk file and copy the lines the look similar to</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">ddb.geometry.<span class="re1">cylinders </span>= <span class="st0">&quot;1566&quot;</span></div>
</li>
<li class="li1">
<div class="de1">ddb.geometry.<span class="re1">heads </span>= <span class="st0">&quot;255&quot;</span></div>
</li>
<li class="li1">
<div class="de1">ddb.geometry.<span class="re1">sectors </span>= <span class="st0">&quot;63&quot;</span></div>
</li>
<li class="li1">
<div class="de1">ddb.<span class="re1">adapterType </span>= <span class="st0">&quot;buslogic&quot;</span></div>
</li>
</ol>
</div>
<p>Open virtualmachine1.vmdk and replace the lines that have the same keys.</p>
<p>Now we need to make some changes to the vmx-file. The vmx-files don&#8217;t seem to care about the order of values. My file was hard to navigate in, as keys were not collated. To the rescue:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">$ cat winxppro.vmx | grep &nbsp;&quot;\#\!&quot; &nbsp;&gt; w.vmx
</div>
</li>
<li class="li1">
<div class="de1">$ cat winxppro.vmx | grep &nbsp;-v &quot;\#\!&quot; | grep -v &quot;^$&quot; | sort &gt;&gt; w.vmx
</div>
</li>
<li class="li1">
<div class="de1">$ chmod w.vmx &#8211;reference=winxppro.vmx
</div>
</li>
<li class="li1">
<div class="de1">$ rm winxppro.vmx
</div>
</li>
<li class="li2">
<div class="de2">$ mv w.vmx winxppro.vmx</div>
</li>
</ol>
</div>
<p>Edit the vmx-file and remove/comment out  the ide0:0* keys.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">#ide0:<span class="nu0">0</span>.<span class="re1">fileName </span>= <span class="st0">&quot;Windows XP Professional-cl1-000001-cl1.vmdk&quot;</span></div>
</li>
<li class="li1">
<div class="de1">#ide0:<span class="nu0">0</span>.<span class="re1">present </span>= <span class="st0">&quot;TRUE&quot;</span></div>
</li>
<li class="li1">
<div class="de1">#ide0:<span class="nu0">0</span>.<span class="re1">redo </span>= <span class="st0">&quot;&quot;</span></div>
</li>
</ol>
</div>
<p>Find the section mentioning scsi, or place it in the correct alphabetical place:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">scsi0.<span class="re1">present </span>= <span class="st0">&quot;TRUE&quot;</span></div>
</li>
<li class="li1">
<div class="de1">scsi0.<span class="re1">virtualDev </span>= <span class="st0">&quot;buslogic&quot;</span></div>
</li>
<li class="li1">
<div class="de1">scsi0:<span class="nu0">0</span>.<span class="re1">present </span>= <span class="st0">&quot;TRUE&quot;</span></div>
</li>
<li class="li1">
<div class="de1">scsi0:<span class="nu0">0</span>.<span class="re1">fileName </span>= <span class="st0">&quot;virtualmachine1.vmdk&quot;</span></div>
</li>
<li class="li2">
<div class="de2">scsi0:<span class="nu0">0</span>.<span class="re1">mode </span>= <span class="st0">&quot;independent-persistent&quot;</span></div>
</li>
</ol>
</div>
<p>I already had the key &#8217;scsi0.present = &#8220;TRUE&#8221;&#8216; present. Having the key twice prevents the machine from starting!</p>
<p>If you changed names on the vmx-file, remove the old machine from the inventory in VMWare server console. Open the new vmx-file. Start it.</p>
<p>Important: If you did rename the files, you will get a question if you want to keep or replace the identifier. Most likely you want to KEEP the identifier. After all it is the same machine.</p>
<p>If everything worked as expected, delete the backup directory. You can also delete scsi.* from your VM directory. If it didn&#8217;t work out &#8211; restore the directory, start from top of page and read more carefully.</p>
<p>&#8211;Jesper Hogstrom</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fmagpie.sytes.net%2Fjesperhogstrom%2F2008%2F11%2Fconverting-vmware-disks-from-ide-to-scsi%2F&amp;linkname=Converting%20vmware%20disks%20from%20IDE%20to%20SCSI"><img src="http://magpie.sytes.net/jesperhogstrom/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://magpie.sytes.net/jesperhogstrom/2008/11/converting-vmware-disks-from-ide-to-scsi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating floppy boot disks under VMWare</title>
		<link>http://magpie.sytes.net/jesperhogstrom/2008/11/creating-floppy-boot-disks-under-vmware/</link>
		<comments>http://magpie.sytes.net/jesperhogstrom/2008/11/creating-floppy-boot-disks-under-vmware/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 21:43:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Computer tricks]]></category>
		<category><![CDATA[development infrastructure]]></category>

		<guid isPermaLink="false">http://magpie.sytes.net/jesperhogstrom/?p=85</guid>
		<description><![CDATA[I am in the process of shifting my server from running Fedora Core + VMWare server into VMWare ESXi.
I&#8217;ll cover the gory details of that in another post. At this point, all you need to know is that ESXi doesn&#8217;t support IDE disks, only SCSI disks. Most of my VMs have IDE disks. Sigh.
After crawling [...]]]></description>
			<content:encoded><![CDATA[<p>I am in the process of shifting my server from running <a href="http://fedoraproject.org/">Fedora Core</a> + <a href="http://www.vmware.com/download/server/">VMWare server</a> into <a href="https://www.vmware.com/tryvmware/?p=esxi">VMWare ESXi</a>.</p>
<p>I&#8217;ll cover the gory details of that in another post. At this point, all you need to know is that ESXi doesn&#8217;t support IDE disks, only SCSI disks. Most of my VMs have IDE disks. Sigh.</p>
<p>After crawling the net for a while I found some extremely useful posts covering what needs to be done:</p>
<p><a href="http://hamed.dk/home/53-vm-ide2scsi">http://hamed.dk/home/53-vm-ide2scsi</a> and <a href="http://blog.creonfx.com/linux/howto-convert-vmware-windows-xp-ide-disk-to-lsilogic-scsi.">http://blog.creonfx.com/linux/howto-convert-vmware-windows-xp-ide-disk-to-lsilogic-scsi</a>.</p>
<p>One of the first things that must be done is to install the <a href="http://www.lsi.com/storage_home/products_home/host_bus_adapters/scsi_hbas/lsi20320r/index.html">LsiLogic driver</a>. I opted for the <a href="http://www.lsi.com/DistributionSystem/AssetDocument/files/support/ssp/whql/LSI20320-R_xp_50700_01034132IT_1201800_1005239.zip">WHQL 1.20.18.00</a>.</p>
<p>The problem then is to upgrade the BIOS. I must admit I am not exactly sure if that is a required step, but I did it anyway. Why is it a problem? Well, a set of files need to be placed on a bootable floppy drive. And my lappy doesn&#8217;t have a floppy slot.</p>
<p>Luckily there is a way. Open the settings for the machine.<br />
<a href="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/vm_settings1.png"><img class="alignnone size-full wp-image-88" title="vm_settings1" src="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/vm_settings1.png" alt="" width="264" height="445" /></a><a href="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/vm_settings.png"><br />
</a></p>
<p>Add a Floppy. Make sure you select to create a blank floppy image.</p>
<p><a href="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/add_floppy.png"><img class="alignnone size-full wp-image-87" title="add_floppy" src="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/add_floppy.png" alt="" width="350" height="388" /></a></p>
<p>Specify a filename and do NOT connect at power on.</p>
<p><a href="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/floppy_filename.png"><img class="alignnone size-full wp-image-89" title="floppy_filename" src="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/floppy_filename.png" alt="" width="276" height="262" /></a></p>
<p>Start the VM. Once booted, connect the disk.</p>
<p><a href="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/connect_floppy.png"><img class="alignnone size-full wp-image-91" title="connect_floppy" src="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/connect_floppy.png" alt="" width="414" height="135" /></a></p>
<p>Open windows explorer, right-click the A: disk and select Format</p>
<p><a href="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/select_format.png"><img class="alignnone size-full wp-image-90" title="select_format" src="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/select_format.png" alt="" width="195" height="211" /></a></p>
<p>Make sure to create a startup disk.</p>
<p><a href="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/format_bootable.png"><img class="alignnone size-full wp-image-92" title="format_bootable" src="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/format_bootable.png" alt="" width="261" height="404" /></a></p>
<p>Click start and the process is over in a few seconds.</p>
<p>Now you can put the files from the LsiLogic BIOS package on the disk. If you are running VMWare Workstation you can simply drag them from the host machine into the VM. Note that you should NOT copy LSI&#8217;s command.com. It simply didn&#8217;t work well for me; something about a corrupt image. Just take all the other files.</p>
<p>Shut down the VM, open settings, select the floppy and have it connect on power on.</p>
<p><a href="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/connect_floppy_at_boot.png"><img class="alignnone size-full wp-image-93" title="connect_floppy_at_boot" src="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/connect_floppy_at_boot.png" alt="" width="498" height="203" /></a></p>
<p>Start the VM again. It will now boot from the floppy assuming your VM BIOS is set like mine. Press F2 during booting and make sure:</p>
<p><a href="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/bios_boot_order.png"><img class="alignnone size-full wp-image-94" title="bios_boot_order" src="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/bios_boot_order.png" alt="" width="440" height="256" /></a></p>
<p>If you made any changes, exit and save changes.</p>
<p>A familiar screen&#8230;</p>
<p><a href="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/dos_screen.png"><img class="alignnone size-full wp-image-95" title="dos_screen" src="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/dos_screen.png" alt="" width="254" height="174" /></a></p>
<p>Run the install-command and ponder which option suits you. I chose (a).</p>
<p><a href="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/lsi_install.png"><img class="alignnone size-full wp-image-96" title="lsi_install" src="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/lsi_install.png" alt="" width="500" height="201" /></a></p>
<p>On the next screen, I chose (t)</p>
<p><a href="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/lsi_options.png"><img class="alignnone size-full wp-image-97" title="lsi_options" src="http://magpie.sytes.net/jesperhogstrom/wp-content/uploads/2008/11/lsi_options.png" alt="" width="500" height="176" /></a></p>
<p>Then quit your way out.</p>
<p>To be quite honest I don&#8217;t think this worked as well as I hoped. At least when I do it again and again I manage to see something about &#8220;base address not found&#8221;. Maybe it works only once? Or maybe this step isn&#8217;t required.</p>
<p>At any rate, I thought it was a nifty way to solve the problem with creating a boot disk under vmware when I needed one. Or at least thought I did.</p>
<p>&#8211;Jesper Högström</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fmagpie.sytes.net%2Fjesperhogstrom%2F2008%2F11%2Fcreating-floppy-boot-disks-under-vmware%2F&amp;linkname=Creating%20floppy%20boot%20disks%20under%20VMWare"><img src="http://magpie.sytes.net/jesperhogstrom/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://magpie.sytes.net/jesperhogstrom/2008/11/creating-floppy-boot-disks-under-vmware/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Improving your bug tracking process</title>
		<link>http://magpie.sytes.net/jesperhogstrom/2008/10/improving-your-bug-tracking-process/</link>
		<comments>http://magpie.sytes.net/jesperhogstrom/2008/10/improving-your-bug-tracking-process/#comments</comments>
		<pubDate>Tue, 14 Oct 2008 20:49:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[development infrastructure]]></category>

		<guid isPermaLink="false">http://magpie.sytes.net/jesperhogstrom/?p=73</guid>
		<description><![CDATA[We&#8217;re running mantis at work. Each customer project gets a private project, developers are assigned to categories, customers are invited. Everything flows just fine.
Then one day it struck me &#8211; what if the developer is away for a week and the customer files an urgent bug report&#8230; Who gets notified? The answer is: The developer [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re running <a href="http://www.mantisbt.org/">mantis</a> at work. Each customer project gets a private project, developers are assigned to categories, customers are invited. Everything flows just fine.</p>
<p>Then one day it struck me &#8211; what if the developer is away for a week and the customer files an urgent bug report&#8230; Who gets notified? The answer is: The developer who isn&#8217;t there.</p>
<p>A simple solution is to force all project managers to check on their projects every day to make sure reports don&#8217;t fall between chairs. There are two things wrong with that solution imho:</p>
<p>* It&#8217;s error prone as it assumes people will always do what they are told and never forget.<br />
* It doesn&#8217;t entail a single piece of new technology&#8230;</p>
<p>As I already had some scripts doing data extraction from the mantis database I figured something along the following would work:</p>
<p>* For each project; list all managers with an internal email address.<br />
* For each project, select new bugs and list them with some info about the bug.<br />
* Send the bug reports to the managers for the project.</p>
<p>Sounds easy enough, doesn&#8217;t it. </p>
<p>Here&#8217;s the script to get all the project managers</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">SELECT</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; project.id, project.name, user.email, userlist.<span class="st0">`access_level`</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">FROM</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">`mantis_project_user_list_table`</span> <span class="kw1">AS</span> userlist,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; mantis_user_table <span class="kw1">AS</span> user,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; mantis_project_table <span class="kw1">AS</span> project</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">WHERE</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; user.id = userlist.user_id <span class="kw1">AND</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; project.id = userlist.project_id <span class="kw1">AND</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; userlist.<span class="st0">`access_level`</span> &gt; <span class="nu0">55</span> <span class="kw1">AND</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>user.email <span class="kw1">LIKE</span> <span class="st0">&quot;%mydomain.tld&quot;</span> <span class="kw1">OR</span> user.email <span class="kw1">LIKE</span> <span class="st0">&quot;%.myotherdomain.tld&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">ORDER</span> <span class="kw1">BY</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; project.name</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p><i>Save it as projectmanagers.sql</i></p>
<p>Worth noting is the filtering on email addresses. In some cases we assign manager rights to the project champion on the customer side. Yu may or may not want them to get the bug report email. Your call.</p>
<p>Here&#8217;s a shell script to get the list and then call an awk script to do the rest.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re3">#!/bin/sh</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re3">#</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re3">#Written by Jesper Hogstrom <span class="nu0">2008</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re3">#</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re3">#This will change depending on where your installation of mantis resides</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">mantisconfig=</span>/var/www/mantis<span class="nu0">-1.1</span><span class="nu0">.2</span>/config_inc.php</div>
</li>
<li class="li2">
<div class="de2"><span class="re2">rootdir=</span>`<span class="kw2">dirname</span> $<span class="nu0">0</span>`</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">function</span> getconfig <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">configoption=</span>$<span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">cat</span> <span class="re0">$<span class="br0">&#123;</span>mantisconfig<span class="br0">&#125;</span></span>| \</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">grep</span> -v <span class="st0">&#8216;^#&#8217;</span>|\</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">grep</span> <span class="re0">$<span class="br0">&#123;</span>configoption<span class="br0">&#125;</span></span>| \</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">awk</span> -F = <span class="st0">&#8216;{print $2}&#8217;</span>| \</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">awk</span> <span class="st0">&#8216;{print substr($1,2,length($1)-3)}&#8217;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re3">#Note that all these options MUST be <span class="kw1">set</span> <span class="kw1">in</span> config_inc.php!!</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">db_user=</span>`getconfig g_db_username`</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">db_password=</span>`getconfig db_password`</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">db_database=</span>`getconfig g_database_name`</div>
</li>
<li class="li2">
<div class="de2"><span class="re3">#<span class="re2">db_host=</span>`getconfig g_hostname` &#8211; currently not used, default is localhost</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">mantisbaseurl=</span>`getconfig g_path`</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">function</span> executesql <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">sql=</span>$<span class="nu0">1</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">cat</span> <span class="re1">$sql</span>|mysql -u<span class="re1">$db_user</span> -p<span class="re1">$db_password</span> -D<span class="re1">$db_database</span> &nbsp;&#8211;skip-column-names</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">executesql <span class="re0">$<span class="br0">&#123;</span>rootdir<span class="br0">&#125;</span></span>/projectmanagers.sql &gt; /tmp/projman</div>
</li>
<li class="li1">
<div class="de1"><span class="re3">#cat /tmp/projman</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">awk</span> -f <span class="re0">$<span class="br0">&#123;</span>rootdir<span class="br0">&#125;</span></span>/bugreports.<span class="kw2">awk</span> \</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &#8211;<span class="re2">assign=</span><span class="re2">db_user=</span><span class="re0">$<span class="br0">&#123;</span>db_user<span class="br0">&#125;</span></span> \</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &#8211;<span class="re2">assign=</span><span class="re2">db_password=</span><span class="re0">$<span class="br0">&#123;</span>db_password<span class="br0">&#125;</span></span> \</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &#8211;<span class="re2">assign=</span><span class="re2">db_database=</span><span class="re0">$<span class="br0">&#123;</span>db_database<span class="br0">&#125;</span></span> \</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &#8211;<span class="re2">assign=</span><span class="re2">rootdir=</span><span class="re0">$<span class="br0">&#123;</span>rootdir<span class="br0">&#125;</span></span> \</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &#8211;<span class="re2">assign=</span><span class="re2">mantisbaseurl=</span>$<span class="br0">&#123;</span>mantisbaseurl////\\\\/<span class="br0">&#125;</span> \</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; /tmp/projman</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p><i>Save it as bugreports and make it executable with chmod +x bugreports</i><br />
There are some things worth noting:<br />
* I specify the path to the mantis configuration file. This is to avoid having to specify the db credentials twice. I guess I could have extracted the php-variables using php, but I don&#8217;t know much php. This works, assuming you formatted your config_inc.php file in a reasonable way.<br />
* The bulk of the work is obviously done elsewhere. You do know about <a href="http://www.gnu.org/software/gawk/manual/">awk</a>, don&#8217;t you?<br />
* Getting the slashes right in mantisbaseurl took a few minutes <img src='http://magpie.sytes.net/jesperhogstrom/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Here comes the awk script.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">#Written by Jesper Hogstrom 2008
</div>
</li>
<li class="li1">
<div class="de1">BEGIN {
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;FS=&quot;\t&quot;;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp;mailfile=&quot;/tmp/mantismail&quot;;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;sqltemp=&quot;/tmp/mantissql&quot;;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;sqlscript=rootdir &quot;/bugreports.rsql&quot;
</div>
</li>
<li class="li1">
<div class="de1">}
</div>
</li>
<li class="li1">
<div class="de1">{
</div>
</li>
<li class="li2">
<div class="de2">#For debugging purposes, name each file differently.
</div>
</li>
<li class="li1">
<div class="de1">mailfile=&quot;/tmp/mantismail_&quot; $1 &quot;_&quot; NR;
</div>
</li>
<li class="li1">
<div class="de1">print &quot;Investigating &quot; $2 &quot; (&quot; $1 &quot;) for &quot; $3
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"># Refresh the script file to pick out only the current project
</div>
</li>
<li class="li2">
<div class="de2">print mantisbaseurl
</div>
</li>
<li class="li1">
<div class="de1">system(&quot;sed -e &#8217;s/PROJNUM/&quot; $1 &quot;/g&#8217; &nbsp;-e &#8217;s/BASEURL/&quot; mantisbaseurl &quot;/g&#8217; &quot; sqlscript &quot; &gt; &quot; sqltemp);
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"># Preparing mail
</div>
</li>
<li class="li1">
<div class="de1">print &quot;To: &quot; $3 &gt; mailfile
</div>
</li>
<li class="li2">
<div class="de2">print &quot;Subject: New bug reports for &quot; $2 &gt;&gt; mailfile
</div>
</li>
<li class="li1">
<div class="de1">system(&quot;cat &quot; sqltemp &quot;|mysql -u&quot; db_user &quot; -p&quot; db_password &quot; -D&quot; db_database &quot; &#8211;skip-column-names &gt;&gt; &quot; mailfile);
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">#Don&#8217;t send empty emails
</div>
</li>
<li class="li2">
<div class="de2">linecount=0
</div>
</li>
<li class="li1">
<div class="de1">while ((getline line &lt; mailfile) &gt; 0)
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;linecount+=1
</div>
</li>
<li class="li1">
<div class="de1">close(mailfile)
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"># Send mail
</div>
</li>
<li class="li1">
<div class="de1">if (linecount &gt; 2)
</div>
</li>
<li class="li1">
<div class="de1">{
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; print &quot; &#8211; Found &quot; linecount &#8211; 2 &quot; bugs to send.&quot;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;system(&quot;cat &quot; mailfile &quot; | sendmail -t &quot; $3);
</div>
</li>
<li class="li2">
<div class="de2">}
</div>
</li>
<li class="li1">
<div class="de1">}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p><i>Save it as bugreports.awk</i></p>
<p>This script will operate on all lines in the /tmp/projman file (with all the project managers in it) and do the following:<br />
* Replace some stuff in a file named bugreports.rsql using <a href="http://www.gnu.org/software/sed/manual/">sed</a>.<br />
* Put mail headers in a text file<br />
* Execute the expanded sql-file and put the result in the text file that makes up the mail<br />
* Could the number of lines in the mail<br />
* If there are any lines above and beyond the headers, send the mail to the manager.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">SELECT</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; concat<span class="br0">&#40;</span>bug.id, <span class="st0">&quot; (BASEURL/view.php?id=&quot;</span>, bug.id, <span class="st0">&quot;)&quot;</span><span class="br0">&#41;</span> <span class="kw1">AS</span> <span class="st0">&quot;bug#&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; project.name,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; username <span class="kw1">AS</span> owner,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; severity,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; date<span class="br0">&#40;</span>date_submitted<span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; datediff<span class="br0">&#40;</span>now<span class="br0">&#40;</span><span class="br0">&#41;</span>, date_submitted<span class="br0">&#41;</span> <span class="kw1">AS</span> <span class="st0">&quot;age (days)&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; summary</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">FROM</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; mantis_bug_table <span class="kw1">AS</span> bug,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; mantis_user_table <span class="kw1">AS</span> user,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; mantis_project_table <span class="kw1">AS</span> project</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">WHERE</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; project_id <span class="kw1">IN</span> <span class="br0">&#40;</span>PROJNUM<span class="br0">&#41;</span> <span class="kw1">AND</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; resolution = <span class="nu0">10</span> <span class="kw1">AND</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; datediff<span class="br0">&#40;</span>now<span class="br0">&#40;</span><span class="br0">&#41;</span>, date_submitted<span class="br0">&#41;</span> &lt; <span class="nu0">5</span> <span class="kw1">AND</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; user.id = handler_id <span class="kw1">AND</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; project.id = project_id</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">ORDER</span> <span class="kw1">BY</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;datediff<span class="br0">&#40;</span>now<span class="br0">&#40;</span><span class="br0">&#41;</span>, date_submitted<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p><i>Save it as bugreports.rsql</i></p>
<p>This will select all bugs in status new (i.e. resolution = 10) that are younger than 5 days and come from a project with the number PROJNUM. We actually use sed to replace PROJNUM with the actual project id and also BASEURL with the g_path variable in config_inc.php.</p>
<p>The mail you send will look something like</p>
<pre>
123 (http://mydomain.tld/mantis/view.php?id=123)      Project_1       \
developer1 70      2008-10-09      1       \
System stops when power cord is removed.
148 (http://http://mydomain.tld/mantis/view.php?id=148)      Project_1       \
developer2  50      2008-10-08      2       \
Saving big images consumes a lot of disk.
</pre>
<p><i>I put line breaks in there manually</i></p>
<p>I admit it could be done somewhat more glitzy with fireworks and images and what have you. However, it&#8217;s merely a status report and there is no need to add more &#8211; possibly the column headers.</p>
<p>The scripts make very few assumptions about how you have configured things. Feel free to change what doesn&#8217;t suit you (like age of bugs, status, who gets mail).</p>
<p>I run my script nightly by symlinking it to /etc/cron.daily.</p>
<p>&#8211;Jesper Högström</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fmagpie.sytes.net%2Fjesperhogstrom%2F2008%2F10%2Fimproving-your-bug-tracking-process%2F&amp;linkname=Improving%20your%20bug%20tracking%20process"><img src="http://magpie.sytes.net/jesperhogstrom/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://magpie.sytes.net/jesperhogstrom/2008/10/improving-your-bug-tracking-process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Backing up your VMs</title>
		<link>http://magpie.sytes.net/jesperhogstrom/2008/10/backing-up-your-vms/</link>
		<comments>http://magpie.sytes.net/jesperhogstrom/2008/10/backing-up-your-vms/#comments</comments>
		<pubDate>Mon, 13 Oct 2008 20:00:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[development infrastructure]]></category>

		<guid isPermaLink="false">http://magpie.sytes.net/jesperhogstrom/?p=71</guid>
		<description><![CDATA[Here&#8217;s the problem; you have several virtual machines running on your VMWare server. Each one is configured to back up some of its important state, but what about the machine itself?
Here&#8217;s a shell script I wrote to handle the situation.



&#160;


#!/bin/sh



&#160;


BACKUPDIR=/mnt/bignasdrive/vms



&#160;


function backupvm



{



&#160; vm_config=$1



&#160; vm_path=`dirname &#34;$vm_config&#34;`



&#160; targetdir=$BACKUPDIR$vm_path



&#160;


&#160; echo &#34;Copying $vm_path to $targetdir&#34;



&#160; mkdir &#8211;parents $targetdir



&#160; cp &#8211;update [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s the problem; you have several virtual machines running on your <a href="http://www.vmware.com/products/server/">VMWare server</a>. Each one is configured to back up some of its important state, but what about the machine itself?</p>
<p>Here&#8217;s a shell script I wrote to handle the situation.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">#!/bin/sh
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">BACKUPDIR=/mnt/bignasdrive/vms
</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">function backupvm
</div>
</li>
<li class="li1">
<div class="de1">{
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; vm_config=$1
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; vm_path=`dirname &quot;$vm_config&quot;`
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; targetdir=$BACKUPDIR$vm_path
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; echo &quot;Copying $vm_path to $targetdir&quot;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; mkdir &#8211;parents $targetdir
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; cp &#8211;update &#8211;verbose $vm_path/* $targetdir/
</div>
</li>
<li class="li2">
<div class="de2">}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">function suspendvm
</div>
</li>
<li class="li1">
<div class="de1">{
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; vm_config=$1
</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; echo Suspending &nbsp;$vm_config&#8230;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; vmware-cmd &quot;$vm_config&quot; suspend trysoft
</div>
</li>
<li class="li1">
<div class="de1">}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">function resumevm
</div>
</li>
<li class="li1">
<div class="de1">{
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; vm_config=$1
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; echo Resuming $vm_config&#8230;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; vmware-cmd &quot;$vm_config&quot; start trysoft
</div>
</li>
<li class="li1">
<div class="de1">}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">function checkbackupvm
</div>
</li>
<li class="li1">
<div class="de1">{
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; vmpath=$1
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; vmstate=$2
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; state=`echo $vmstate|awk &#8216;{print $NF}&#8217;`
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; if [ &quot;$state&quot; == &quot;on&quot; ]; then
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; suspendvm &quot;$vmpath&quot;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; backupvm &quot;$vmpath&quot;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; resumevm &quot;$vmpath&quot;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; else
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; backupvm &quot;$vmpath&quot;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; fi
</div>
</li>
<li class="li2">
<div class="de2">}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">function getvmlist
</div>
</li>
<li class="li1">
<div class="de1">{
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; for b in ${VMs// /___} ;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; do
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; vmstate=`vmware-cmd &quot;${b//___/ }&quot; getstate`
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; checkbackupvm &quot;${b//___/ }&quot; &quot;$vmstate&quot;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; done
</div>
</li>
<li class="li1">
<div class="de1">}
</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">VMs=`vmware-cmd -l`
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">getvmlist
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>What the script does is<br />
* Get the list of registered machines<br />
* For each machine,<br />
* if it&#8217;s running &#8211; suspend, backup, restore<br />
* else backup</p>
<p>Much ofthe time was spent handling the completely silly idea of putting spaces in file names.</p>
<p>Note that you must probably change the backup target directory high up in the script. I mounted my ReadNAS+ with 1.5TB space for backups&#8230;</p>
<p>Put the script somewhere, make it runnable and symlink it into /etc/cron.daily or cron.weekly</p>
<pre>
chmod +x backupvms
ln -s backupvms /etc/cron.daily
</pre>
<p>It is worth noting that I ran into problems as not all services on all machines handled the suspend/restore cycle well. The backing up worked just fine, though <img src='http://magpie.sytes.net/jesperhogstrom/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>&#8211;Jesper Högström</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fmagpie.sytes.net%2Fjesperhogstrom%2F2008%2F10%2Fbacking-up-your-vms%2F&amp;linkname=Backing%20up%20your%20VMs"><img src="http://magpie.sytes.net/jesperhogstrom/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://magpie.sytes.net/jesperhogstrom/2008/10/backing-up-your-vms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Development infrastructure</title>
		<link>http://magpie.sytes.net/jesperhogstrom/2008/10/development-infrastructure/</link>
		<comments>http://magpie.sytes.net/jesperhogstrom/2008/10/development-infrastructure/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 18:07:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[development infrastructure]]></category>

		<guid isPermaLink="false">http://magpie.sytes.net/jesperhogstrom/?p=55</guid>
		<description><![CDATA[There are a number of things you need to make software in addition to a good idea and skilled programmers. And I am not only thinking about money and patience.
The following is of essence:

Version Control System
Build Machine
Bug Tracking System
Install Builder
Test Harness
Project Planning Application
Project Portal/meeting space
Documentation Platform

In addition to the above, you may want to investigate [...]]]></description>
			<content:encoded><![CDATA[<p>There are a number of things you need to make software in addition to a good idea and skilled programmers. And I am not only thinking about money and patience.</p>
<p>The following is of essence:</p>
<ul>
<li>Version Control System</li>
<li>Build Machine</li>
<li>Bug Tracking System</li>
<li>Install Builder</li>
<li>Test Harness</li>
<li>Project Planning Application</li>
<li>Project Portal/meeting space</li>
<li>Documentation Platform</li>
</ul>
<p>In addition to the above, you may want to investigate stuff like</p>
<ul>
<li>Code coverage analyzer</li>
<li>Change/churn analyzer</li>
<li>Data repository for all the data points</li>
</ul>
<p>It is worth noting that you still need to have an administrative infrastructure that suits your and your customers&#8217; needs, like</p>
<ul>
<li>Time reporting</li>
<li>Project plans</li>
<li>Test plans</li>
<li>Staged testing environments (quote a technical need)</li>
<li>Budget and follow up</li>
<li>Reporting structure to customer</li>
</ul>
<p>I&#8217;m off to watch TV with my son (it is Friday evening after all <img src='http://magpie.sytes.net/jesperhogstrom/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ), but next time around I&#8217;ll start a walk-through of the tools I have found and used for the various pieces you really do not want to live without when developing software.</p>
<p>&#8211;Jesper Högström</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fmagpie.sytes.net%2Fjesperhogstrom%2F2008%2F10%2Fdevelopment-infrastructure%2F&amp;linkname=Development%20infrastructure"><img src="http://magpie.sytes.net/jesperhogstrom/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://magpie.sytes.net/jesperhogstrom/2008/10/development-infrastructure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lighting up your build process</title>
		<link>http://magpie.sytes.net/jesperhogstrom/2008/10/lighting-up-your-build-process/</link>
		<comments>http://magpie.sytes.net/jesperhogstrom/2008/10/lighting-up-your-build-process/#comments</comments>
		<pubDate>Wed, 08 Oct 2008 21:45:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[development infrastructure]]></category>

		<guid isPermaLink="false">http://magpie.sytes.net/jesperhogstrom/?p=48</guid>
		<description><![CDATA[What we all want is a nice automated build process that runs on checkin and gives an indication when thingsgo awry. Well, it should indicate everything is fine too, obviously.
The system you want to look into is CruiseControl.Net. I hope to get into some of the nice things it can do. For now, suffice it [...]]]></description>
			<content:encoded><![CDATA[<p>What we all want is a nice automated build process that runs on checkin and gives an indication when thingsgo awry. Well, it should indicate everything is fine too, obviously.</p>
<p>The system you want to look into is <a href="http://confluence.public.thoughtworks.org/display/CCNET">CruiseControl.Net</a>. I hope to get into some of the nice things it can do. For now, suffice it to say it connects to a source control system, pulls changes, spawns a build and informs interested parties about what just happened.</p>
<p>One of the interested parties will very likely be CCTray, a tray icon application that shows a green or &#8211; as it sometimes happens &#8211; red light in your tray area of the desktop.</p>
<p>Sometimes that is enough, sometimes not. What I want is a clearly visible light, like a lavalamp or something that bubbles away in the corresponding color. If I&#8217;m crazy, I am not alone &#8211; <a href="http://mark.michaelis.net/Blog/BuildStatusUsingLavaLampsByKenNichols.aspx">Ken Nichols</a><a href="http://mark.michaelis.net/Blog/BuildStatusUsingLavaLampsByKenNichols.aspx"></a> and <a href="http://www.nigelthorne.com/blog/2007/11/get-your-build-fixed-faster-broadcast.html">Nigel Thorne</a> offer two excellent examples of seemingly sane people that had the same idea.</p>
<p>Using the publisher pattern of Nigel&#8217;s is a really elegant idea. Unfortunately my build server sits in a server room with no windows, and way too far for an extension cord to my lava lamp. Thus, I resorted to Ken&#8217;s approach of hacking CCTray with the idea of connecting everything to my development box. Due to a variety of reasons that didn&#8217;t work out so well, so I employed an old lap top to listen to build events and control the lava lamp.</p>
<p>Controlling the lava lamp by software and hardware is explained in <a href="http://magpie.sytes.net/jesperhogstrom/2008/10/c-interface-to-velleman-k8056/">this post</a>.</p>
<p><strong>Hacking cctray</strong></p>
<p>Thanks to Ken&#8217;s post I found a nice entry point to cctray.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">public MainFormController<span class="br0">&#40;</span>ICCTrayMultiConfiguration configuration, ISynchronizeInvoke owner<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; new BuildTransitionSoundPlayer<span class="br0">&#40;</span>aggregatedProjectMonitor, new AudioPlayer<span class="br0">&#40;</span><span class="br0">&#41;</span>, configuration.<span class="me1">Audio</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; new BuildTransitionLavaLamp<span class="br0">&#40;</span>aggregatedProjectMonitor<span class="br0">&#41;</span>; <span class="co1">// Add this line</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>configuration.<span class="me1">X10</span> != <span class="kw2">null</span> &amp;amp;&amp;amp; configuration.<span class="me1">X10</span>.<span class="me1">Enabled</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The BuildTransitionLavaLamp class is defined as</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">using System;</div>
</li>
<li class="li1">
<div class="de1">using System.<span class="me1">Collections</span>.<span class="me1">Generic</span>;</div>
</li>
<li class="li1">
<div class="de1">using System.<span class="me1">Text</span>;</div>
</li>
<li class="li1">
<div class="de1">using System.<span class="me1">Windows</span>.<span class="me1">Forms</span>;</div>
</li>
<li class="li2">
<div class="de2">using ThoughtWorks.<span class="me1">CruiseControl</span>.<span class="me1">CCTrayLib</span>.<span class="me1">Configuration</span>;</div>
</li>
<li class="li1">
<div class="de1">using ThoughtWorks.<span class="me1">CruiseControl</span>.<span class="me1">CCTrayLib</span>.<span class="me1">Monitoring</span>;</div>
</li>
<li class="li1">
<div class="de1">using CardAPI;</div>
</li>
<li class="li1">
<div class="de1">using System.<span class="me1">IO</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">namespace ThoughtWorks.<span class="me1">CruiseControl</span>.<span class="me1">CCTrayLib</span>.<span class="me1">Presentation</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; class BuildTransitionLavaLamp</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private <span class="kw2">enum</span> ShowResult</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; MessageBox,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; Nothing</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private List monitoredProjects = new List<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; public BuildTransitionLavaLamp<span class="br0">&#40;</span>IProjectMonitor monitor<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; GetMonitoredProjects<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="coMULTI">/*</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp; monitoredProjects.Add(&quot;lava_fail&quot;);</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; monitoredProjects.Add(&quot;lava_pass&quot;);</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; monitor.<span class="me1">BuildOccurred</span> += new MonitorBuildOccurredEventHandler<span class="br0">&#40;</span>Monitor_BuildOccurred<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; CreateCard<span class="br0">&#40;</span>ShowResult.<span class="me1">MessageBox</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private <span class="kw4">void</span> GetMonitoredProjects<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw4">string</span> fileName = Application.<span class="me1">ExecutablePath</span> + <span class="st0">&quot;.ini&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!File.<span class="me1">Exists</span><span class="br0">&#40;</span>fileName<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; StreamReader configFile = new StreamReader<span class="br0">&#40;</span>fileName<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw4">string</span> line;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>line = configFile.<span class="me1">ReadLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> != <span class="kw2">null</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!<span class="kw4">string</span>.<span class="me1">IsNullOrEmpty</span><span class="br0">&#40;</span>line<span class="br0">&#41;</span> &amp;amp;&amp;amp; !line.<span class="me1">StartsWith</span><span class="br0">&#40;</span><span class="st0">&quot;#&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; line = line.<span class="me1">Trim</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; monitoredProjects.<span class="me1">Add</span><span class="br0">&#40;</span>line<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//MessageBox.Show(&quot;&gt;&gt;&quot; + line + &quot;&lt;&lt;&quot;);</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; private Card card;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private <span class="kw4">static</span> <span class="kw4">int</span> greenLamp = <span class="nu0">8</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private <span class="kw4">static</span> <span class="kw4">int</span> redLamp = <span class="nu0">7</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private byte buildPassRelays = <span class="br0">&#40;</span>byte<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="nu0">1</span> &lt;&lt; <span class="br0">&#40;</span>greenLamp &#8211; <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; private byte buildFailRelays = <span class="br0">&#40;</span>byte<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="nu0">1</span> &lt;&lt; <span class="br0">&#40;</span>redLamp &#8211; <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private <span class="kw4">void</span> Monitor_BuildOccurred<span class="br0">&#40;</span>object sender, MonitorBuildOccurredEventArgs e<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw4">string</span> projectname = e.<span class="me1">ProjectMonitor</span>.<span class="me1">Detail</span>.<span class="me1">ProjectName</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="co1">//MessageBox.Show(&quot;&gt;&gt;&quot; + projectname + &quot;&lt;&lt;&quot;);</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>monitoredProjects.<span class="me1">Contains</span><span class="br0">&#40;</span>projectname<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//MessageBox.Show(&quot;Acting&quot;);</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; bool status = e.<span class="me1">BuildTransition</span> == BuildTransition.<span class="me1">Fixed</span> || e.<span class="me1">BuildTransition</span> == BuildTransition.<span class="me1">StillSuccessful</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>card == <span class="kw2">null</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CreateCard<span class="br0">&#40;</span>ShowResult.<span class="me1">Nothing</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>card == <span class="kw2">null</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>status<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; card.<span class="me1">SetRelays</span><span class="br0">&#40;</span>buildPassRelays<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; card.<span class="me1">SetRelays</span><span class="br0">&#40;</span>buildFailRelays<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; private <span class="kw4">void</span> CreateCard<span class="br0">&#40;</span>ShowResult showResult<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; try <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; card = new Card<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; catch <span class="br0">&#40;</span>Exception e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>showResult == ShowResult.<span class="me1">MessageBox</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MessageBox.<span class="me1">Show</span><span class="br0">&#40;</span><span class="st0">&quot;Failed to create Card.<span class="es0">\n</span>&quot;</span> + e.<span class="me1">Message</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>What this code does is simply to</p>
<ul>
<li>Load some config from an ini-file</li>
<li>plug into the listening event of project transitions</li>
<li>Send commands to the card.</li>
</ul>
<p>The config file is simply an ini-file with project names.</p>
<p>The sample projects lava_pass and lava_fail are defined as</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cmd</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /c exit 1</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cmd</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /c exit 0</div>
</li>
</ol>
</div>
<p>Compile everything and move onto the machine hosting the relay card and you&#8217;re done.</p>
<p>&#8211;Jesper Högström</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fmagpie.sytes.net%2Fjesperhogstrom%2F2008%2F10%2Flighting-up-your-build-process%2F&amp;linkname=Lighting%20up%20your%20build%20process"><img src="http://magpie.sytes.net/jesperhogstrom/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://magpie.sytes.net/jesperhogstrom/2008/10/lighting-up-your-build-process/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>C# interface to Velleman k8056</title>
		<link>http://magpie.sytes.net/jesperhogstrom/2008/10/c-interface-to-velleman-k8056/</link>
		<comments>http://magpie.sytes.net/jesperhogstrom/2008/10/c-interface-to-velleman-k8056/#comments</comments>
		<pubDate>Wed, 08 Oct 2008 20:58:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Computer tricks]]></category>
		<category><![CDATA[development infrastructure]]></category>

		<guid isPermaLink="false">http://magpie.sytes.net/jesperhogstrom/?p=46</guid>
		<description><![CDATA[For reasons I will explain later I once bought a Velleman k8056 8-channel relay card. It took me the better part of an afternoon to solder all the thingies to the board but eventually I had it looking more or less as it does in the glossy ads.
I tested it with a test application I [...]]]></description>
			<content:encoded><![CDATA[<p>For reasons I will explain later I once bought a <a href="http://www.velleman.be/fr/en/product/view/?id=351282">Velleman k8056 8-channel relay card</a>. It took me the better part of an afternoon to solder all the thingies to the board but eventually I had it looking more or less as it does in the glossy ads.</p>
<p>I tested it with a test application I found somewhere, and it worked! I write software on my day job, but I am still childishly impressed by controlling real world objects by means of a computer (and no &#8211; the caps lock diod doesn&#8217;t count <img src='http://magpie.sytes.net/jesperhogstrom/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ).</p>
<p>The main purpose of the board was to integrate it into another process, and that required accessing it from a .Net application. I searched the net but couldn&#8217;t find anything that did the trick, so I decided to write my own API to it. I normally do <strong>not</strong> write com-port stuff so there was a bit of a learning curve, but eventually I got it where I fund it usable. Figured you may too, so here goes&#8230;</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">//Written by Jesper Högström</span></div>
</li>
<li class="li1">
<div class="de1">using System;</div>
</li>
<li class="li1">
<div class="de1">using System.<span class="me1">Collections</span>.<span class="me1">Generic</span>;</div>
</li>
<li class="li1">
<div class="de1">using System.<span class="me1">Text</span>;</div>
</li>
<li class="li2">
<div class="de2">using System.<span class="me1">IO</span>.<span class="me1">Ports</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">namespace CardAPI</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; internal <span class="kw2">enum</span> Command</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ChangeAddress = <span class="nu0">64</span> + <span class="nu0">1</span>, <span class="co1">// &#8216;A&#8217;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SendByte = <span class="nu0">64</span> + <span class="nu0">2</span>, <span class="co1">// &#8216;B&#8217;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ClearRelay = <span class="nu0">64</span> + <span class="nu0">3</span>, <span class="co1">// &#8216;C&#8217;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; DisplayAddress = <span class="nu0">64</span> + <span class="nu0">4</span>, <span class="co1">// &#8216;D&#8217;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; StopAll = <span class="nu0">64</span> + <span class="nu0">5</span>, <span class="co1">// &#8216;E&#8217;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ForceAddress1 = <span class="nu0">64</span> + <span class="nu0">6</span>, <span class="co1">// &#8216;F&#8217;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SetRelay = <span class="nu0">64</span> + <span class="nu0">19</span>, <span class="co1">// &#8216;S&#8217;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ToggleRelay = <span class="nu0">64</span> + <span class="nu0">20</span> <span class="co1">// &#8216;T&#8217;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; public class Card</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private List m_Relays = new List<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private SerialPort com;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private <span class="kw4">int</span> baudRate = <span class="nu0">2400</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; public Card<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; : this<span class="br0">&#40;</span><span class="st0">&quot;COM1&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; public Card<span class="br0">&#40;</span><span class="kw4">string</span> portName<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; com = new SerialPort<span class="br0">&#40;</span>portName, baudRate<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; PortName = portName;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> relayId = <span class="nu0">9</span>; relayId &gt;= <span class="nu0">1</span>; relayId&#8211;<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; m_Relays.<span class="me1">Add</span><span class="br0">&#40;</span>new Relay<span class="br0">&#40;</span>this, <span class="br0">&#40;</span>byte<span class="br0">&#41;</span>relayId<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private <span class="kw4">string</span> m_PortName;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; public <span class="kw4">string</span> PortName</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; get <span class="br0">&#123;</span> <span class="kw1">return</span> m_PortName; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; set</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>com != <span class="kw2">null</span> &amp;amp;&amp;amp; com.<span class="me1">IsOpen</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; com.<span class="me1">Close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; m_PortName = value;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; com = new SerialPort<span class="br0">&#40;</span>m_PortName, baudRate<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* these settings seem to be default anyway.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; com.DataBits = 8;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; com.Parity = Parity.None;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; com.StopBits = StopBits.One;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; com.<span class="me1">ReadTimeout</span> = <span class="nu0">3000</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; com.<span class="me1">WriteTimeout</span> = <span class="nu0">3000</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; com.<span class="me1">Open</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; com.<span class="me1">Close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private byte m_CardAddress = <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ~Card<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>com.<span class="me1">IsOpen</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; com.<span class="me1">Close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private byte CheckSum<span class="br0">&#40;</span>byte<span class="br0">&#91;</span><span class="br0">&#93;</span> buf<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw4">int</span> res = <span class="nu0">256</span> &#8211; buf<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> &#8211; buf<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> &#8211; buf<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span> &#8211; buf<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>res &lt; <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; res += <span class="nu0">256</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>byte<span class="br0">&#41;</span>res;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private byte<span class="br0">&#91;</span><span class="br0">&#93;</span> buf = new byte<span class="br0">&#91;</span><span class="nu0">5</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private <span class="kw4">int</span> repeatCount = <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private <span class="kw4">int</span> msDelay = <span class="nu0">400</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; internal <span class="kw4">void</span> SendCommand<span class="br0">&#40;</span>Command command, byte data<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; buf<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> = <span class="nu0">13</span>; <span class="co1">// start command</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; buf<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> = m_CardAddress; <span class="co1">// address</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; buf<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span> = <span class="br0">&#40;</span>byte<span class="br0">&#41;</span>command; <span class="co1">// command</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; buf<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span> = data; <span class="co1">// data</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; buf<span class="br0">&#91;</span><span class="nu0">4</span><span class="br0">&#93;</span> = CheckSum<span class="br0">&#40;</span>buf<span class="br0">&#41;</span>; <span class="co1">// checksum</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!com.<span class="me1">IsOpen</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; com.<span class="me1">Open</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i = <span class="nu0">0</span>; i &lt; repeatCount; i++<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; com.<span class="me1">Write</span><span class="br0">&#40;</span>buf, <span class="nu0">0</span>, <span class="nu0">5</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; com.<span class="me1">Close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; System.<span class="me1">Threading</span>.<span class="me1">Thread</span>.<span class="me1">Sleep</span><span class="br0">&#40;</span>msDelay<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; public Relay this<span class="br0">&#91;</span><span class="kw4">int</span> index<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; get <span class="br0">&#123;</span> <span class="kw1">return</span> m_Relays<span class="br0">&#91;</span>index<span class="br0">&#93;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; public <span class="kw4">void</span> ShowAddresses<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; SendCommand<span class="br0">&#40;</span>Command.<span class="me1">DisplayAddress</span>, m_CardAddress<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; public <span class="kw4">void</span> SetRelays<span class="br0">&#40;</span>byte state<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; SendCommand<span class="br0">&#40;</span>Command.<span class="me1">SendByte</span>, state<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; public <span class="kw4">void</span> EmergencyStopAll<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; SendCommand<span class="br0">&#40;</span>Command.<span class="me1">StopAll</span>, <span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; public <span class="kw4">void</span> StopAll<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; SendCommand<span class="br0">&#40;</span>Command.<span class="me1">ClearRelay</span>, <span class="nu0">48</span> + <span class="nu0">9</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; public <span class="kw4">void</span> StartAll<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; SendCommand<span class="br0">&#40;</span>Command.<span class="me1">SetRelay</span>, <span class="nu0">48</span> + <span class="nu0">9</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; public class Relay</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private byte RelayId</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; get <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="br0">&#40;</span>byte<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="nu0">48</span> + m_Id<span class="br0">&#41;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; public <span class="kw4">void</span> On<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; m_Owner.<span class="me1">SendCommand</span><span class="br0">&#40;</span>Command.<span class="me1">SetRelay</span>, RelayId<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; public <span class="kw4">void</span> Off<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; m_Owner.<span class="me1">SendCommand</span><span class="br0">&#40;</span>Command.<span class="me1">ClearRelay</span>, RelayId<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; public <span class="kw4">void</span> Toggle<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; m_Owner.<span class="me1">SendCommand</span><span class="br0">&#40;</span>Command.<span class="me1">ToggleRelay</span>, RelayId<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; private Card m_Owner;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; private byte m_Id;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; internal Relay<span class="br0">&#40;</span>Card owner, byte id<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; m_Owner = owner;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; m_Id = id;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Feel free to use it as you see fit.</p>
<p>&#8211;Jesper Högström</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fmagpie.sytes.net%2Fjesperhogstrom%2F2008%2F10%2Fc-interface-to-velleman-k8056%2F&amp;linkname=C%23%20interface%20to%20Velleman%20k8056"><img src="http://magpie.sytes.net/jesperhogstrom/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://magpie.sytes.net/jesperhogstrom/2008/10/c-interface-to-velleman-k8056/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting up an rsync client on windows</title>
		<link>http://magpie.sytes.net/jesperhogstrom/2008/09/setting-up-an-rsync-client-on-windows/</link>
		<comments>http://magpie.sytes.net/jesperhogstrom/2008/09/setting-up-an-rsync-client-on-windows/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 19:32:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[development infrastructure]]></category>

		<guid isPermaLink="false">http://magpie.sytes.net/jesperhogstrom/?p=35</guid>
		<description><![CDATA[We&#8217;ve just learned how to set up an rsync server on a linux box. Now it&#8217;s time to set up things so we can pull and push information from and to that server.
First, download the free rsync package from itefix.no. The installation instructions are as easy as can be, simply unzip the installer exe and [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve just learned how to <a href="http://magpie.sytes.net/jesperhogstrom/2008/09/setting-up-an-rsync-server/" target="_blank">set up an rsync server on a linux box</a>. Now it&#8217;s time to set up things so we can pull and push information from and to that server.</p>
<p>First, download the free rsync package from <a href="http://www.itefix.no/i2/node/10650" target="_blank">itefix.no</a>. The installation instructions are as easy as can be, simply unzip the installer exe and run it.</p>
<p>The rsync package you&#8217;ve just downloade is based on <a href="http://cygwin.com/" target="_blank">cygwin</a>. Cygwin is a really cool package that allows compiling and running linux apps under windows. If you ever wanted a proper shell instead of cmd and you were too cheap to buy 4DOS/<a href="ftp://jpsoft.com/oldver/" target="_blank">4NT</a> (which apparently is discontinued <img src='http://magpie.sytes.net/jesperhogstrom/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  ) cygwin just might save your day.</p>
<p>rsync is an inherently command line based tool. No fancy graphics or point-and-shoot style UIs. To synchronize the server exposed directory images onto your windows box, simply open a command shell and type</p>
<pre>[c:\]cd \remotedata
[c:\remotedata] rsync --recursive rsync://mylinuxbox.local.domain/images images</pre>
<p>There are loads of switches, and you may want to familiarize yourself with some of them. Type</p>
<pre>rsync --help</pre>
<p>to get a glimpse.</p>
<p>&#8211;Jesper Hogstrom</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fmagpie.sytes.net%2Fjesperhogstrom%2F2008%2F09%2Fsetting-up-an-rsync-client-on-windows%2F&amp;linkname=Setting%20up%20an%20rsync%20client%20on%20windows"><img src="http://magpie.sytes.net/jesperhogstrom/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://magpie.sytes.net/jesperhogstrom/2008/09/setting-up-an-rsync-client-on-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
