<?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>MarkPReynolds.com &#187; Projects</title>
	<atom:link href="http://markpreynolds.com/category/projects/feed" rel="self" type="application/rss+xml" />
	<link>http://markpreynolds.com</link>
	<description>... an Archive of My Miscellaneum</description>
	<lastBuildDate>Fri, 11 May 2012 13:48:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Excel VBA</title>
		<link>http://markpreynolds.com/technology/excel-vba</link>
		<comments>http://markpreynolds.com/technology/excel-vba#comments</comments>
		<pubDate>Tue, 04 Oct 2011 09:43:09 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://markpreynolds.com/?p=1875</guid>
		<description><![CDATA[I recently used MS Excel 2010&#8242;s Visual Basic for Applications to normalize and automate the reporting of test cases by severity. The purpose of this view is to answer the question, &#8220;Of the failed tests reported, how many of the defects are high severity vs. how many are low?&#8221; So instead of just seeing just [...]]]></description>
			<content:encoded><![CDATA[<p>I recently used MS Excel 2010&#8242;s Visual Basic for Applications to normalize and automate the reporting of test cases by severity. The purpose of this view is to answer the question, &#8220;Of the failed tests reported, how many of the defects are high severity vs. how many are low?&#8221; So instead of just seeing just a pass/fail percentage like this:<br />
<a href="http://markpreynolds.com/wp-content/uploads/2011/10/pass-fail.png"><img class="alignnone size-full wp-image-1876" title="pass-fail" src="http://markpreynolds.com/wp-content/uploads/2011/10/pass-fail.png" alt="" width="219" height="231" /></a></p>
<p>You could publish the customer impact of the associated defects like this:</p>
<p><a href="http://markpreynolds.com/wp-content/uploads/2011/10/pie-chart.png"><img class="alignnone size-medium wp-image-1877" title="pie-chart" src="http://markpreynolds.com/wp-content/uploads/2011/10/pie-chart-300x180.png" alt="" width="300" height="180" /></a></p>
<p>HP ALM 11 natively reports test case results and defect results, but not both in one view. If you&#8217;d like to see failed tests with their associated, you need a custom SQL query and you&#8217;ll end up with very generic tabular data like this:</p>
<p><a href="http://markpreynolds.com/wp-content/uploads/2011/10/defect-table.png"><img class="alignnone size-full wp-image-1878" title="defect-table" src="http://markpreynolds.com/wp-content/uploads/2011/10/defect-table.png" alt="" width="224" height="163" /></a></p>
<p>Sorting and formatting the data was painful.  The following scripts provide automation for most of the steps involved using Excel&#8217;s built in VBA macro system.</p>
<p>All we care about is the highest severity level defect linked to each test case.  The others (like the second row above) can be discarded.  (If a test/feature fails on a Show Stopper, we don&#8217;t care if there are also typos on it, at least not yet.)  This is the VBA to de-dupe by sev:</p>
<pre>'
' Normalize duplicate failed tests
'

' Skip the header row, process non blank rows
' Need to constrain this by an end-of-data function, not an # of rows integer
For i = 2 To 200
    ' Don't process blanks
    If Cells(i, 1).Value &lt;&gt; "" Then
        ' If there is &gt;1 defect logged against the same test
        If Cells(i, 1).Value = Cells(i + 1, 1).Value Then
            ' If the current row has lesser or equal severity defect than the following row, delete the current row
            If Cells(i, 6).Value &gt;= Cells(i + 1, 6).Value Then
                Cells(i, 1).EntireRow.Delete
            ' Otherwise delete the following row
            Else
            Cells(i + 1, 1).EntireRow.Delete
            End If
        ' Reset i to account for the row deleted
        i = i - 1
        End If
    End If
Next i

' Sort by sev
    Columns("F:F").Select
    ActiveWorkbook.Worksheets("Failed Tests with Severities").sort.SortFields. _
        Clear
    ActiveWorkbook.Worksheets("Failed Tests with Severities").sort.SortFields. _
        Add Key:=Range("F1"), SortOn:=xlSortOnValues, Order:=xlAscending, _
        DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Failed Tests with Severities").sort
        .SetRange Range("A2:J96")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With</pre>
<p>This summarizes the results:</p>
<pre>'
' SummaryTable Macro
'
    Range("L2") = "Show Stopper"
    Range("L3") = "High"
    Range("L4") = "Medium"
    Range("L5") = "Low"
    Range("L6") = "Passed"
    Range("L7") = "Blocked"
    Range("M2") = WorksheetFunction.CountIf(Columns(6), "1-Show Stopper")
    Range("M3") = WorksheetFunction.CountIf(Columns(6), "3-High")
    Range("M4") = WorksheetFunction.CountIf(Columns(6), "4-Medium")
    Range("M5") = WorksheetFunction.CountIf(Columns(6), "5-Low")
    Range("M6") = 1
    Range("M7") = 1</pre>
<p>And this graphs them:<br />
&#8216;<br />
&#8216; Graph Macro<br />
&#8216;</p>
<p>Range(&#8220;L2:M7&#8243;).Select<br />
ActiveSheet.Shapes.AddChart.Select<br />
ActiveChart.ChartType = xlPieExploded<br />
ActiveChart.SetSourceData Source:=Range( _<br />
&#8220;&#8216;Failed Tests with Severities&#8217;!$L$2:$M$7&#8243;)<br />
ActiveChart.SeriesCollection(1).Select<br />
ActiveChart.SeriesCollection(1).ApplyDataLabels<br />
ActiveChart.SeriesCollection(1).DataLabels.Select<br />
ActiveChart.SeriesCollection(1).HasLeaderLines = False<br />
Selection.Position = xlLabelPositionOutsideEnd</p>
<p>ActiveChart.SeriesCollection(1).Select<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
ActiveChart.SeriesCollection(1).Explosion = 0<br />
ActiveChart.SeriesCollection(1).Explosion = 1<br />
ActiveChart.SeriesCollection(1).Points(1).Select<br />
Selection.Explosion = 15<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
With Selection.Format.Fill<br />
.Visible = msoTrue<br />
.ForeColor.ObjectThemeColor = msoThemeColorText1<br />
.ForeColor.TintAndShade = 0<br />
.ForeColor.Brightness = 0<br />
.Solid<br />
End With<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
With Selection.Format.Fill<br />
.Visible = msoTrue<br />
.ForeColor.RGB = RGB(192, 0, 0)<br />
.Transparency = 0<br />
.Solid<br />
End With<br />
ActiveChart.SeriesCollection(1).Points(2).Select<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
With Selection.Format.Fill<br />
.Visible = msoTrue<br />
.ForeColor.RGB = RGB(192, 0, 0)<br />
.Solid<br />
End With<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
With Selection.Format.Fill<br />
.Visible = msoTrue<br />
.ForeColor.RGB = RGB(255, 0, 0)<br />
.Transparency = 0<br />
.Solid<br />
End With<br />
ActiveChart.SeriesCollection(1).Points(3).Select<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
With Selection.Format.Fill<br />
.Visible = msoTrue<br />
.ForeColor.RGB = RGB(255, 0, 0)<br />
.Solid<br />
End With<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
With Selection.Format.Fill<br />
.Visible = msoTrue<br />
.ForeColor.RGB = RGB(255, 117, 117)<br />
.Transparency = 0<br />
.Solid<br />
End With<br />
ActiveChart.SeriesCollection(1).Points(4).Select<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
With Selection.Format.Fill<br />
.Visible = msoTrue<br />
.ForeColor.RGB = RGB(255, 117, 117)<br />
.Solid<br />
End With<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
With Selection.Format.Fill<br />
.Visible = msoTrue<br />
.ForeColor.RGB = RGB(255, 167, 167)<br />
.Transparency = 0<br />
.Solid<br />
End With<br />
ActiveChart.SeriesCollection(1).Points(5).Select<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
With Selection.Format.Fill<br />
.Visible = msoTrue<br />
.ForeColor.RGB = RGB(255, 167, 167)<br />
.Solid<br />
End With<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
With Selection.Format.Fill<br />
.Visible = msoTrue<br />
.ForeColor.RGB = RGB(0, 176, 80)<br />
.Transparency = 0<br />
.Solid<br />
End With<br />
ActiveChart.SeriesCollection(1).Points(6).Select<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
With Selection.Format.Fill<br />
.Visible = msoTrue<br />
.ForeColor.RGB = RGB(0, 176, 80)<br />
.Solid<br />
End With<br />
ActiveChart.ChartGroups(1).FirstSliceAngle = 322<br />
With Selection.Format.Fill<br />
.Visible = msoTrue<br />
.ForeColor.ObjectThemeColor = msoThemeColorText1<br />
.ForeColor.TintAndShade = 0<br />
.ForeColor.Brightness = 0<br />
.Transparency = 0<br />
.Solid<br />
End With<br />
ActiveChart.Legend.Select<br />
Selection.Format.TextFrame2.TextRange.Font.Size = 12<br />
ActiveChart.ChartArea.Select<br />
ActiveChart.SeriesCollection(1).DataLabels.Select<br />
Selection.Format.TextFrame2.TextRange.Font.Size = 12</p>
<pre></pre>
]]></content:encoded>
			<wfw:commentRss>http://markpreynolds.com/technology/excel-vba/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A $1 Planter</title>
		<link>http://markpreynolds.com/projects/1-dollar-planter</link>
		<comments>http://markpreynolds.com/projects/1-dollar-planter#comments</comments>
		<pubDate>Tue, 09 Jun 2009 03:26:21 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://markpreynolds.com/?p=828</guid>
		<description><![CDATA[How do you build a planter for one buck? First, forget to throw away that old fence you tore down earlier in the year. Second, think rustic. A bent nail or split piece of wood just makes it more stylish. Then invest about thirty cents in nails and about the same in a plastic painting [...]]]></description>
			<content:encoded><![CDATA[<p>How do you build a planter for one buck?  First, forget to throw away that old fence you tore down earlier in the year.  Second, think rustic.  A bent nail or split piece of wood just makes it more stylish.  Then invest about thirty cents in nails and about the same in a plastic painting liner.</p>
<p style="text-align: center;">And wallah!</p>
<p><img class="aligncenter size-full wp-image-825" title="planter" src="http://markpreynolds.com/wp-content/uploads/2009/06/planter.jpg" alt="" /></p>
<p>I need about four of these, so the price is right.  Put a little TLC into the project and you are sure to create a planter of your own that looks like it cost at least three or four bucks.</p>
]]></content:encoded>
			<wfw:commentRss>http://markpreynolds.com/projects/1-dollar-planter/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>WordPress UnGallery</title>
		<link>http://markpreynolds.com/technology/wordpress-ungallery</link>
		<comments>http://markpreynolds.com/technology/wordpress-ungallery#comments</comments>
		<pubDate>Wed, 27 May 2009 09:34:47 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://markpreynolds.com/?p=707</guid>
		<description><![CDATA[UnGallery dynamically publishes directories of images and embeds them into your WordPress blog.  The name describes the goal of the plugin to stay out of your way and allow you to manage your images with no administration in WordPress. This approach allows your powerful administration tools like FTP, SCP, automation scripts, and image editors to [...]]]></description>
			<content:encoded><![CDATA[<p>UnGallery dynamically publishes directories of images and embeds them into your WordPress blog.  The name describes the goal of the plugin to stay out of your way and allow you to manage your images with no administration in WordPress.</p>
<p>This approach allows your powerful administration tools like FTP, SCP, automation scripts, and image editors to directly manage your image library.  Changes are automatically reflected in WordPress.  There are no web forms to select files for upload.  There is no importing or modifications to the database.  The gallery files are accessed remotely by WordPress and remain accessible and manageable, outside the WordPress environment.</p>
<p>If you&#8217;ve ever had to reorganize where your photos are stored, remove a few from a large set, or edit the red-eye of a dozen pictures after uploading, you know how inconvenient it is to return to the website management UI to update everything.  With UnGallery, all these add/remove/edit changes you make to your library are automatically rolled into WordPress.</p>
<p><a href="http://markpreynolds.com/wp-content/uploads/2009/05/ungallery1.png"><img class="aligncenter size-full wp-image-2009" title="ungallery" src="http://markpreynolds.com/wp-content/uploads/2009/05/ungallery1.png" alt="" width="713" height="188" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>Features:</strong></p>
<ul>
<li>Unlimited depth, breadth, and number of photos. <a href="http://markpreynolds.com/gallery">The gallery here</a> has approximately 25,000.</li>
<li>Photo library is managed outside of WordPress.  Simply update via FTP, SCP, etc.  UnGallery displays changes automatically.</li>
<li>Multiple gallery views:  Top level marquee (optional), thumbnails, browsing previous and next pictures.</li>
<li>Gallery hierarchy breadcrumbs with links to parent, present, and sub-galleries</li>
<li>Optional and default banner captions</li>
<li>Unbrowsable, hidden galleries</li>
<li>Caching for faster page reloads</li>
<li>Support for MP4 movies embedded within WordPress</li>
<li>Automatic image rotation of jpegs with exif orientation, if available</li>
</ul>
<p><strong>Notes:</strong></p>
<ul>
<li>The layout is configured for the default WordPress installation.  I use the excellent <a href="http://wordpress.org/extend/themes/atahualpa">Atahualpa</a> theme and increase the page width to a modern browser standard.  The sizes of all thumbnails, images, and columns are configurable.</li>
<li>Feel free to use it, extend it, or contact me with questions.</li>
</ul>
<p><strong>Download:</strong></p>
<ul>
<li>Grab the <a title="Link to UnGallery on WordPress.org" href="http://wordpress.org/extend/plugins/ungallery/">current version at WordPress.org</a>.</li>
<li>The installation steps are mostly standard, though there are couple simple, extra steps, noted in the instructions.</li>
</ul>
<p><strong>Screencast:</strong></p>
<p><a href="http://markpreynolds.com/UnGallery2.mp4"><img class="size-full wp-image-1771 aligncenter" title="UnGalleryScreencast" src="http://markpreynolds.com/wp-content/plugins/ungallery/phpthumb/phpThumb.php?ar=x&#038;src=/home/mmond/pics/2012/March/screencast.png" alt="UnGalleryScreencast" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://markpreynolds.com/technology/wordpress-ungallery/feed</wfw:commentRss>
		<slash:comments>149</slash:comments>
<enclosure url="http://markpreynolds.com/UnGallery2.mp4" length="20836012" type="video/mp4" />
		</item>
		<item>
		<title>A Hybrid Fence</title>
		<link>http://markpreynolds.com/projects/a-hybrid-fence</link>
		<comments>http://markpreynolds.com/projects/a-hybrid-fence#comments</comments>
		<pubDate>Mon, 09 Mar 2009 18:32:23 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://work.markpreynolds.com/?p=370</guid>
		<description><![CDATA[We wanted to see down into the greenbelt valley behind our home. So I took down the decrepit fence at the rear of our propery. Great! We can see the deer, rock squirrels, falcons, etc. But it’s also somewhat of a security hole, since the home is now more accessible from that side and with [...]]]></description>
			<content:encoded><![CDATA[<div class="entrybody">
<p>We wanted to see down into the greenbelt valley behind our home. So I took down the decrepit fence at the rear of our propery. Great! We can see the deer, rock squirrels, falcons, etc. But it’s also somewhat of a security hole, since the home is now more accessible from that side and with less visibility than from the front.</p>
<p>So, how about putting up a property line fence that does not block the view? The standard solutions for this either chain link which looks cheap or wrought iron which for 100+ feet came in at about $5,000. This is about $5,000 more than I was looking to spend considering our back yard is classified as zero maintenance, rarely entered and not much to look at.</p>
<p style="text-align: center;"><img src="http://markpreynolds.com/wp-content/plugins/ungallery/phpthumb/phpThumb.php?ar=x&amp;src=/home/mmond/pics/2000-2009/2009/March/Fence/IMG_6347.JPG&amp;w=300" alt="" /> <img src="http://markpreynolds.com/wp-content/plugins/ungallery/phpthumb/phpThumb.php?ar=x&amp;src=/home/mmond/pics/2000-2009/2009/March/Fence/IMG_6350.JPG&amp;w=300" alt="" /></p>
<p>I decided on treated 2×2s attached to the existing 4×4s already mounted in concrete for the current fence. These will act as crossbeams and when cut in half at a 45 degree angle, the pickets. The architecture is structurally sound but not as completely sturdy as if I’d used 2×4s for the crossbeams. A strong person could tear at the fence and break sections apart, but then again, I can pull off pieces of the old fence and the neighbor’s fence with one hand. And the other neighbor has no fence. So this option, complete with sharp, upward facing spires will provide an obstacle that is not scalable and would force a probably loud demolition to break through.</p>
<p style="text-align: center;"><img src="http://markpreynolds.com/wp-content/plugins/ungallery/phpthumb/phpThumb.php?ar=x&amp;src=/home/mmond/pics/2000-2009/2009/March/Fence/IMG_6353.JPG&amp;w=300" alt="" /> <img src="http://markpreynolds.com/wp-content/plugins/ungallery/phpthumb/phpThumb.php?ar=x&amp;src=/home/mmond/pics/2000-2009/2009/March/Fence/IMG_6366.JPG&amp;w=300" alt="" /></p>
<p>Maybe I’ll stain it, maybe reinforce the crossbeams with 2×4s, maybe not. But the yard is fenced again and now we can see down into the valley!</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://markpreynolds.com/projects/a-hybrid-fence/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Configuration Automation</title>
		<link>http://markpreynolds.com/technology/configuration-automation</link>
		<comments>http://markpreynolds.com/technology/configuration-automation#comments</comments>
		<pubDate>Sun, 01 Mar 2009 18:35:42 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://work.markpreynolds.com/?p=373</guid>
		<description><![CDATA[This project scripts the remote setup of Ubuntu 8.x servers as a Ruby on Rails application servers. It installs all necessary libraries, packages, and optionally, deploys Ruby on Rails applications. I’ve published a few of these automation scripts on the FiveRuns Blog. The most recent version of configuration-automation includes a menu of Rails application choices [...]]]></description>
			<content:encoded><![CDATA[<div class="entrybody">
<p>This project scripts the remote setup of Ubuntu 8.x servers as a Ruby on Rails application servers. It installs all necessary libraries, packages, and optionally, deploys Ruby on Rails applications. I’ve published a few of these automation scripts on the <a href="http://blog.fiveruns.com/">FiveRuns Blog.</a> The most recent version of configuration-automation includes a menu of Rails application choices to install after the Linux bootstrap completes and was published in February on the <a href="http://blog.fiveruns.com/2009/2/23/automatic-rails-applications">FiveRuns blog</a>.  I’ve archived those posts here with additional comments.</p>
<p>The current post: <a href="http://markpreynolds.com/2009/2/23/automatic-rails-applications">Automatic Rails Applications</a></p>
<p>The previous post: <a href="http://markpreynolds.com/2008/10/19/automatic-production-rails">Automatic Production Rails</a></p>
<p>The original post: <a href="http://markpreynolds.com/2008/9/24/automatic-rails-at-slicehost">Automatic Rails at Slicehost</a></div>
]]></content:encoded>
			<wfw:commentRss>http://markpreynolds.com/technology/configuration-automation/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

