<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Rob Tennyson</title>
    <description>Software Craftsman</description>
    <link>http://www.robtennyson.us/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 2.7.0.0</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://www.robtennyson.us/opml.axd</blogChannel:blogRoll>
    <dc:creator>Rob Tennyson</dc:creator>
    <dc:title>Rob Tennyson</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/robtennyson" /><feedburner:info uri="robtennyson" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>Minimal List Debut</title>
      <description>&lt;p&gt;Over the holidays I created and published a new web application - &lt;strong&gt;&lt;em&gt;Minimal List&lt;/em&gt;&lt;/strong&gt; (&lt;a title="Minimal List" href="http://www.mnmllist.com/" target="_blank"&gt;http://www.mnmllist.com&lt;/a&gt;). From the application's &lt;a title="About Minimal List" href="http://www.mnmllist.com/about" target="_blank"&gt;about page&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;Minimal List&lt;/em&gt;&lt;/strong&gt; was created to solve a need my daughter and I had - a simple way to have our weekly grocery list online.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;You can read the rest of the about page for more detail, but that pretty much sums it up. This post was indeed meant to introduce the app, but more than that, I wanted to talk about the geekier details of the project :).&lt;/p&gt;  &lt;p&gt;When my daughter and I decided we needed (yes, &lt;em&gt;needed&lt;/em&gt;!) this application, we knew that a mobile application was in order because one of the primary places we'd be using it is at the grocery store - to check off items as we put them in the cart of course. Well, anyone who knows me well knows I'm a web guy and tend to avoid rich clients if possible. However, I don't have anything against an application that &lt;em&gt;looks like&lt;/em&gt; it is a native mobile app. I just prefer HTML and javascript over any of the proprietary stuff for the UI. I'm obviously building on the MS stack (ASP.NET, MVC4, C#, IIS, SQL Server), but I like the UI to be a browser (usually Firefox or my phone's browser for me personally - iPhone for the daughter).&lt;/p&gt;  &lt;h2&gt;&lt;a title="jQuery Mobile" href="http://jquerymobile.com/" target="_blank"&gt;jQuery Mobile&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;&lt;a title="jQuery Mobile" href="http://jquerymobile.com/" target="_blank"&gt;jQuery Mobile&lt;/a&gt; (JQM) was created exactly for this purpose - a native mobile feeling, but served from the web. It's also something I've wanted to play with for a while now - again, if you know me you know I'm horrible at just &amp;quot;playing&amp;quot; with things in spikes and throw away code. I like putting things in production and seeing how things go in real scenarios. So finally, a legitimate reason to play :).&lt;/p&gt;  &lt;p&gt;I was quite pleased with the development experience using JQM. In the editor, the footprint is actually quite small. Mostly simple and regular HTML elements that are just tagged with some special JQM attributes. The existence of these attributes (after including JQM css and js of course) is what causes all the magic to happen. So once I got to know which attributes to use, things started moving along rather fast because the rest is just plain web application development like I've done for years.&lt;/p&gt;  &lt;p&gt;However, the first real test at the grocery store wasn't all that great. My daughter went to Oregon for the holidays, so I didn't get to see what it is like on an iPhone, but the performance on my Windows Phone 7 was completely crappy. I spent a lot of time standing there waiting on screens to load as I was updating my shopping list items with either price or isle information. Completely unacceptable user experience.&lt;/p&gt;  &lt;p&gt;Other than performance though, it worked as advertised! No bugs or issues and the grocery trip experience was exactly what I was looking for (not too surprising since I designed the app specifically for the experience &lt;strong&gt;&lt;em&gt;I&lt;/em&gt;&lt;/strong&gt; was looking for).&lt;/p&gt;  &lt;h2&gt;Next Step&lt;/h2&gt;  &lt;p&gt;The next step is obvious - improve the UX. Not sure how I'll do it yet, but there are a few paths I can take.&lt;/p&gt;  &lt;p&gt;First, part of JQM is AJAX navigation. It intercepts local links and queries for the resource AJAX-style instead of navigating away from the current page. It then takes the response and loads it into the existing DOM all fancy like so it feels more like the native experience. This also makes the UX faster because your browser doesn't have to re-run all the javascript and whatnot that happens on a full page load. However, when you navigate to a page where you've already been, it just shows the page it already has in the DOM instead of re-requesting the URI. This sounds great, but can be challenging with data-heavy pages because the data obviously isn't going to be fresh. To get by this &lt;em&gt;for now&lt;/em&gt;, I just turned off the AJAX functionality for most of my links and form posts. So this is something I can look into - there would obviously have to be javascript watching for those page transitions so it could dynamically update the data on the page if necessary.&lt;/p&gt;  &lt;p&gt;Second, I could take a more SPA approach - Single Page Application. I could still use JQM for the UI and page requests and whatnot. But the main feature sections would become small SPA islands and I wouldn't do any page transitions at all within the context of that feature. This might be a good time to start playing with &lt;a title="Knockout" href="http://knockoutjs.com/" target="_blank"&gt;knockout.js&lt;/a&gt; or something.&lt;/p&gt;  &lt;p&gt;And of course, I could always completely abandon JQM. I've created web apps before that were careful to be a good UX even in a phone browser, but didn't look at all like a native phone app. But where's the fun in that?!&lt;/p&gt;  &lt;h2&gt;The Code&lt;/h2&gt;  &lt;p&gt;I decided to leave the code in a public repository for all to see:&lt;/p&gt;  &lt;blockquote&gt;   &lt;h3&gt;&lt;a title="Momo" href="https://github.com/rtennys/Momo" target="_blank"&gt;Momo&lt;/a&gt;&lt;/h3&gt;    &lt;p&gt;Project codename named after &lt;a title="Momo" href="http://en.wikipedia.org/wiki/Momo_%28Avatar:_The_Last_Airbender%29" target="_blank"&gt;Momo&lt;/a&gt; from &lt;a title="Avatar: The Last Airbender" href="http://en.wikipedia.org/wiki/Avatar:_The_Last_Airbender" target="_blank"&gt;Avatar: The Last Airbender&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;You'll also notice a link to the commit that created the currently released version in the footer of every page on &lt;a title="Minimal List" href="http://www.mnmllist.com/" target="_blank"&gt;the site&lt;/a&gt;. However, when things move on and you want to see it exactly the way it was as of this post, that commit is &lt;a href="https://github.com/rtennys/Momo/commit/ceef281" target="_blank"&gt;ceef281&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;That's it for now. I hope you all have had an excellent holiday season.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/robtennyson/~4/o9_h0gUvD6c" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/robtennyson/~3/o9_h0gUvD6c/post.aspx</link>
      <author>rob@robtennyson.us</author>
      <comments>http://www.robtennyson.us/post/mnmllist-debut#comment</comments>
      <guid isPermaLink="false">http://www.robtennyson.us/post.aspx?id=92ccae3c-0986-4704-8f10-e188aa5a99fd</guid>
      <pubDate>Mon, 31 Dec 2012 10:52:21 -0500</pubDate>
      <dc:publisher>rtennys</dc:publisher>
      <pingback:server>http://www.robtennyson.us/pingback.axd</pingback:server>
      <pingback:target>http://www.robtennyson.us/post.aspx?id=92ccae3c-0986-4704-8f10-e188aa5a99fd</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.robtennyson.us/trackback.axd?id=92ccae3c-0986-4704-8f10-e188aa5a99fd</trackback:ping>
      <wfw:comment>http://www.robtennyson.us/post/mnmllist-debut#comment</wfw:comment>
      <wfw:commentRss>http://www.robtennyson.us/syndication.axd?post=92ccae3c-0986-4704-8f10-e188aa5a99fd</wfw:commentRss>
    <feedburner:origLink>http://www.robtennyson.us/post.aspx?id=92ccae3c-0986-4704-8f10-e188aa5a99fd</feedburner:origLink></item>
    <item>
      <title>Toph - Early Architecture Decisions</title>
      <description>&lt;p&gt;In &lt;a title="October 2012 - Another Gig Completes" href="http://www.robtennyson.us/post/2012-10-another-gig-completes" target="_blank"&gt;Another Gig Completes&lt;/a&gt;, I mentioned planning to start a new project to help track consulting gigs. Here I introduce you to:&lt;/p&gt;  &lt;blockquote&gt;   &lt;h2&gt;&lt;a title="Toph" href="https://github.com/rtennys/Toph" target="_blank"&gt;Toph&lt;/a&gt;&lt;/h2&gt;    &lt;p&gt;Project codename named after &lt;a title="Toph Beifong" href="http://en.wikipedia.org/wiki/Toph_Beifong" target="_blank"&gt;Toph&lt;/a&gt; from the &lt;a title="Avatar: The Last Airbender" href="http://en.wikipedia.org/wiki/Avatar:_The_Last_Airbender" target="_blank"&gt;Avatar: The Last Airbender&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As I mentioned before, this project is meant not only to help organize my consulting gigs, but also give me a public project and codebase I can point to. I also hope to use the project as blogging fodder. Speaking of which...&lt;/p&gt;  &lt;h3&gt;Early Architecture Decisions&lt;/h3&gt;  &lt;p&gt;I've spent the vast majority of my career joining existing projects. There is always that sense of &amp;quot;that's not the way I would have done it&amp;quot;. Well, I finally get to do it &lt;em&gt;my&lt;/em&gt; way! It was tempting to go crazy with it and implement everything cool I've been reading about recently - whether needed or not, I might add. In the end I decided to go with a pragmatic approach that is much more likely to be a useful example I can point to when talking to developers as I continue consulting.&lt;/p&gt;  &lt;h3&gt;Visual Studio Projects&lt;/h3&gt;  &lt;p&gt;I'm still a fan of and will continue to advocate &lt;a title="The Onion Architecture" href="http://www.robtennyson.us/post/project-architecture" target="_blank"&gt;onion architecture&lt;/a&gt; (some might say &lt;a title="Hexagonal Architecture" href="http://alistair.cockburn.us/Hexagonal+architecture" target="_blank"&gt;Hexagonal Architecture&lt;/a&gt;). One difference you'll find between Toph and what I normally do though, is the lack of an &lt;em&gt;Infrastructure&lt;/em&gt; project.&lt;/p&gt;  &lt;p&gt;There seems to be a theme going around the blogosphere that is advocating the removal of unnecessary abstractions and part of the theme has been the combining of projects. The idea is that it is perfectly possible to create an architecturally sound solution without using Visual Studio projects to enforce it. In case you're wondering how they &amp;quot;enforce&amp;quot; it, realize that Visual Studio projects won't allow circular references between two projects - whether by directly referencing each other, or indirectly (A - B - C - A would not compile). Therefore if you have a UI and a Core project with UI referencing Core, you couldn't reference UI from Core.&amp;#160; Thus, this &lt;em&gt;usually&lt;/em&gt; prevents you from directly doing UI type actions from within Core since you couldn't touch the controllers or view models.&lt;/p&gt;  &lt;p&gt;I'm almost always a fan of pragmatic programming. As it turns out, the &lt;em&gt;Infrastructure&lt;/em&gt; project never proved that exciting for me as a standalone project. So I just created a namespace within UI called &lt;em&gt;Infrastructure&lt;/em&gt; and dumped everything in there. You see, everything usually consider &lt;em&gt;Infrastructure&lt;/em&gt; is generally only used during application startup anyway as I'm building up the inversion of control container.&lt;/p&gt;  &lt;p&gt;However, I still very much like having my &lt;em&gt;Core&lt;/em&gt; separate. It just feels right. So, I decide three projects are all we'll need in this solution&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Toph (I decided there was no reason to call it Toph.&lt;em&gt;Core&lt;/em&gt;) &lt;/li&gt;    &lt;li&gt;Toph.UI &lt;/li&gt;    &lt;li&gt;Toph.Tests &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Even if I end up adding another project in the future for scheduled tasks (to be run on some application server somewhere), leaving &lt;em&gt;Infrastructure&lt;/em&gt; under UI should still be fine. That's because I generally just invoke endpoints in the UI from those background tasks rather than directly dealing with the domain or application's database.&lt;/p&gt;  &lt;h3&gt;UI&lt;/h3&gt;  &lt;p&gt;New projects should always be started with the latest and greatest, right? I went with ASP.NET MVC 4 of course. Specifically, I started with the Internet Application project template.&lt;/p&gt;  &lt;h3&gt;Data Access&lt;/h3&gt;  &lt;p&gt;That template starts with using a local database and using Entity Framework as its ORM of choice. As expected if you know me, I changed that use SQL Server 2012 Express and &lt;a title="NHibernate" href="http://nhforge.org/" target="_blank"&gt;NHibernate&lt;/a&gt;. To do that...&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Delete &lt;a title="Toph.UI.Filters.InitializeSimpleMembershipAttribute" href="https://github.com/rtennys/Toph/commit/d52a51d024e1fdb9840b1c4d4c26f2d4074197d3#diff-3" target="_blank"&gt;InitializeSimpleMembershipAttribute&lt;/a&gt;. This is the attribute added to AccountController that ensures the database exists and is initialized. There is only one line in there that is needed: WebSecurity.InitializeDatabaseConnection.&amp;#160; I moved that into &lt;a title="Toph.UI.MvcApplication.Application_Start" href="https://github.com/rtennys/Toph/commit/d52a51d024e1fdb9840b1c4d4c26f2d4074197d3#diff-4" target="_blank"&gt;Application_Start&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Delete &lt;a title="Toph.UI.Models.UsersContext" href="https://github.com/rtennys/Toph/commit/d52a51d024e1fdb9840b1c4d4c26f2d4074197d3#diff-9" target="_blank"&gt;UsersContext&lt;/a&gt;. This is the EF DbContext&lt;/li&gt;    &lt;li&gt;Move &lt;a title="Toph.Domain.Entities.UserProfile" href="https://github.com/rtennys/Toph/commit/d52a51d024e1fdb9840b1c4d4c26f2d4074197d3#diff-29" target="_blank"&gt;UserProfile&lt;/a&gt; from the Models directory into the domain and kill the EF attributes&lt;/li&gt;    &lt;li&gt;Add &lt;a title="Fluent NHibernate on NuGet" href="http://nuget.org/packages/FluentNHibernate" target="_blank"&gt;Fluent NHibernate&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Do all the normal NHibernate config and mapping stuff&lt;/li&gt;    &lt;li&gt;Change your connection string&lt;/li&gt;    &lt;li&gt;Create the database with the single UserProfile table&lt;/li&gt;    &lt;li&gt;Run the application&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;That should do the trick.&lt;/p&gt;  &lt;h3&gt;Other notables&lt;/h3&gt;  &lt;p&gt;The only other things I added to the project were &lt;a title="Structuremap" href="http://nuget.org/packages/structuremap" target="_blank"&gt;Structuremap&lt;/a&gt; and my personal code library &lt;a title="RobTennyson.Common" href="http://nuget.org/packages/RobTennyson.Common" target="_blank"&gt;RobTennyson.Common&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I also stuck with restricting domain access to a &lt;a title="Service Layer on P of EAA" href="http://martinfowler.com/eaaCatalog/serviceLayer.html" target="_blank"&gt;Service Layer&lt;/a&gt; like I usually do. One difference I thought I'd toss into the mix this time is a bit of &lt;a title="Command-query separation" href="http://en.wikipedia.org/wiki/Command-query_separation" target="_blank"&gt;CQS&lt;/a&gt; goodness (not full blown CQRS, mind you). We'll see how this turns out as the project grows.&lt;/p&gt;  &lt;h3&gt;Grabbing a copy and playing&lt;/h3&gt;  &lt;p&gt;If you're interested in playing around with this, but sure you get the code specifically from this commit: &lt;a title="Commit 91a19e9f8b" href="https://github.com/rtennys/Toph/tree/91a19e9f8b5b8f23402b9b87b315158f1bf7af9e" target="_blank"&gt;91a19e9f8b&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I'll be moving on with the project of course, but at that exact point, the project is still basically just the default template - well, juiced up a bit, but basically still has nothing to do with the real project in it yet.&lt;/p&gt;  &lt;p&gt;Happy coding&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/robtennyson/~4/6ua1Bkw_Sgc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/robtennyson/~3/6ua1Bkw_Sgc/post.aspx</link>
      <author>rob@robtennyson.us</author>
      <comments>http://www.robtennyson.us/post/toph-early-architecture-decisions#comment</comments>
      <guid isPermaLink="false">http://www.robtennyson.us/post.aspx?id=ce3e7072-6774-4b3f-ae8e-4bee5086d13a</guid>
      <pubDate>Fri, 09 Nov 2012 12:29:27 -0500</pubDate>
      <dc:publisher>rtennys</dc:publisher>
      <pingback:server>http://www.robtennyson.us/pingback.axd</pingback:server>
      <pingback:target>http://www.robtennyson.us/post.aspx?id=ce3e7072-6774-4b3f-ae8e-4bee5086d13a</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.robtennyson.us/trackback.axd?id=ce3e7072-6774-4b3f-ae8e-4bee5086d13a</trackback:ping>
      <wfw:comment>http://www.robtennyson.us/post/toph-early-architecture-decisions#comment</wfw:comment>
      <wfw:commentRss>http://www.robtennyson.us/syndication.axd?post=ce3e7072-6774-4b3f-ae8e-4bee5086d13a</wfw:commentRss>
    <feedburner:origLink>http://www.robtennyson.us/post.aspx?id=ce3e7072-6774-4b3f-ae8e-4bee5086d13a</feedburner:origLink></item>
    <item>
      <title>October 2012 - Another Gig Completes</title>
      <description>&lt;p&gt;A couple weeks ago I wrapped up my last contract. I mentioned it in &lt;a title="Drowning in New Technologies" href="http://www.robtennyson.us/post/july-2012-new-tech"&gt;Drowning in New Technologies&lt;/a&gt;. Again, awesome, awesome contract – I learned a ton and got to work with some really cool people.&lt;/p&gt;  &lt;h3&gt;What’s Next&lt;/h3&gt;  &lt;p&gt;The last time I had a break between contracts I started playing with electronics (see &lt;a title="ZigBee Garage Door Opener" href="http://www.robtennyson.us/post/zigbee-xbee-garage-door-opener"&gt;ZigBee Garage Door Opener&lt;/a&gt; – yes, it's still working like a champ). I've thought about picking that adventure back up, but am hesitant because of a couple roadblocks I had started to run into before. First was cost – tinkering with electronics isn't crazy expensive or anything, but if you wanted to replace every plug in your house with a smart plug for example, it adds up quick. The true low cost solutions are really only present in bulk – massive bulk. The other road block was simply my hesitation to truly devote to something so big. You see, I tend to over-do everything I get into. If I was going to get serious about it, that meant starting a journey of mastering all aspects of electronics – everything from the basic electronics knowledge needed to get a circuit working to learning all I could about physics. Knowing how to do something doesn't cut it for me. I have to know exactly why every piece of the puzzle works. People spend years and sometimes entire careers mastering this. I'm not sure I'm excited enough to devote myself that completely to it. Maybe being a hobbyist is the key here; not working out how to profit from it.&lt;/p&gt;  &lt;p&gt;I think I'll stick to software and stick to the aspect of it I know best - enterprise web development. For a while yet, that means continuing to consult. I still hope to create a product of my own though and consulting might be the key to that as well. You see, I've worked out a cobbled together way of managing my gigs, billable hours, invoices, and whatnot. It's a mixture of folder structure, documents, an Outlook calendar for keeping time, Excel templates for the invoices, and a lot of copying/pasting followed by printing to PDF.&lt;/p&gt;  &lt;p&gt;I'm pretty sure there are solutions out there for this, but creating my own will do two important things for me. First it will potentially turn some profit if it turns into something others find useful as well. Second it will give me the codebase of a real world application that I can use for both pointing potential consulting clients to and as an example when trying to explain a concept to another developer. It is sometimes rough when someone wants to see some of what I've done or they want to see an example of whatever pattern I'm prattling on about, but everything I've done is internal and proprietary. I'm good at coding on the fly and coming up with sample applications, but nothing speaks truer than code running in production.&lt;/p&gt;  &lt;p&gt;So that is my immediate plan. I've upgraded to Windows 8, Visual Studio 2012, and ReSharper 7.0. I've also purchased &lt;a title="ASP.NET MVC 4 in Action" href="http://amzn.com/1617290416" target="_blank"&gt;ASP.NET MVC 4 in Action&lt;/a&gt; to make sure I haven't missed anything over the last year. Once I've gone through that, I'll get started on my first product. My intention is code it publicly (&lt;a title="Rob Tennyson on Github" href="https://github.com/rtennys" target="_blank"&gt;GitHub&lt;/a&gt; of course) and blog along the way about why I've done this or that in the codebase.&lt;/p&gt;  &lt;p&gt;That is, unless I change my mind 12 seconds after clicking publish on this post, or unless another gig comes along much sooner than I expect it to. Wouldn't be so bad if I could manage to write some code in the evenings and weekends. Stupid &lt;a title="World of Warcraft" href="http://us.battle.net/wow" target="_blank"&gt;Warcraft&lt;/a&gt;! Yes, I still play - have long since given up raiding, but I do indeed have a level 90 Druid already and have a young panda monk decked out in heirloom gear anxiously awaiting my attention.&lt;/p&gt;  &lt;p&gt;Wish me luck!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/robtennyson/~4/hjCWvqKyv4s" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/robtennyson/~3/hjCWvqKyv4s/post.aspx</link>
      <author>rob@robtennyson.us</author>
      <comments>http://www.robtennyson.us/post/2012-10-another-gig-completes#comment</comments>
      <guid isPermaLink="false">http://www.robtennyson.us/post.aspx?id=2aa07d65-e0cb-42ff-a935-87541fe83172</guid>
      <pubDate>Tue, 30 Oct 2012 12:39:52 -0500</pubDate>
      <dc:publisher>rtennys</dc:publisher>
      <pingback:server>http://www.robtennyson.us/pingback.axd</pingback:server>
      <pingback:target>http://www.robtennyson.us/post.aspx?id=2aa07d65-e0cb-42ff-a935-87541fe83172</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.robtennyson.us/trackback.axd?id=2aa07d65-e0cb-42ff-a935-87541fe83172</trackback:ping>
      <wfw:comment>http://www.robtennyson.us/post/2012-10-another-gig-completes#comment</wfw:comment>
      <wfw:commentRss>http://www.robtennyson.us/syndication.axd?post=2aa07d65-e0cb-42ff-a935-87541fe83172</wfw:commentRss>
    <feedburner:origLink>http://www.robtennyson.us/post.aspx?id=2aa07d65-e0cb-42ff-a935-87541fe83172</feedburner:origLink></item>
    <item>
      <title>July 2012 - Drowning in New Technologies</title>
      <description>&lt;p&gt;Since April (around the time of my last blog post!), I've been on a gig with a company out of Indianapolis. It's your classic big corp, &lt;a title="Big Ball of Mud" href="http://en.wikipedia.org/wiki/Big_ball_of_mud" target="_blank"&gt;big ball of mud&lt;/a&gt;, type of application. Nothing new to me since I've spent my entire career in corporate America and I'm pretty sure I've created a few balls of mud myself.&lt;/p&gt;  &lt;p&gt;The cool thing about this gig, however, is the team. After some turn-over and apparently a breaking point that caused them to get much more picky about hiring decisions, the team I joined seems to be a team of rock stars. Most have figured out they can come to me with questions on just about anything code related and here's the cool thing - answering their questions is always easy. I mean, they just get things insanely fast - &lt;em&gt;every single one of them&lt;/em&gt;! Now, I've worked with some freaky smart developers before (last team I worked with at Tyson for example), but rarely do you see a team of dozens where all of them are freaky smart. There is always a handful of laggards (no, I don't think &lt;em&gt;you&lt;/em&gt; are one of them).&lt;/p&gt;  &lt;p&gt;Additionally, I've gotten to learn a few new things on this gig.&lt;/p&gt;  &lt;h3&gt;SOLR&lt;/h3&gt;  &lt;p&gt;I haven't become a SOLR or Lucene expert or anything, but I've had to do a couple things with &lt;a title="SolrNet" href="http://code.google.com/p/solrnet/" target="_blank"&gt;SolrNet&lt;/a&gt;. Seems to be all that I've read about over the years. Can't say I'm enjoying this from a developer's perspective though. You see, they have all the environments setup for it, but when developing locally, the internal SOLR abstractions hit DEV instead of local. This means if you're working on UI that uses the search indexes, it sucks because your local changes obviously aren't going to show up in the indexes from the DEV database. It also means I must be connected to VPN to touch UI using SOLR.&lt;/p&gt;  &lt;p&gt;An implementation of the &lt;a title="Gateway Pattern" href="http://martinfowler.com/eaaCatalog/gateway.html" target="_blank"&gt;gateway&lt;/a&gt; and/or &lt;a title="Facade Pattern" href="http://martinfowler.com/eaaCatalog/remoteFacade.html" target="_blank"&gt;facade&lt;/a&gt; patterns would take care of this nicely I think.&lt;/p&gt;  &lt;h3&gt;Automapper&lt;/h3&gt;  &lt;p&gt;I'm not entirely sure how I feel about &lt;a title="AutoMapper" href="https://github.com/AutoMapper/AutoMapper" target="_blank"&gt;AutoMapper&lt;/a&gt; yet. I've heard nothing but praise about it for years now, but this is the first time I've been on a project where it is actually being used. Maybe it's the way they're using it, or maybe I just haven't seen the light yet, but at this point I'm not digging it.&lt;/p&gt;  &lt;p&gt;Sure, it does make your controller actions much smaller. It also takes care of DRY if you're mapping between two objects in many places. But mostly I find myself constantly having to hunt down the mapping logic to figure out exactly what is being copied between the objects, or, more frequently, to find out why something is not mapping correctly. I'm sure I'll come around, but right now it seems like a mix of voodoo and magic. Most importantly, there is no &amp;quot;go to definition&amp;quot;, search results is the only way to find the mapping.&lt;/p&gt;  &lt;h3&gt;Topshelf&lt;/h3&gt;  &lt;p&gt;This one was fun. I played briefly with &lt;a title="Topshelf" href="https://gist.github.com/Topshelf/Topshelf" target="_blank"&gt;Topshelf&lt;/a&gt; in the past as a spike - never made it to production if memory serves. This time though, we're using it to take care of the Windows service that handles all of the project's scheduled background work. The API is crazy easy and lightweight. Can't think of anything negative to say about this at all.&lt;/p&gt;  &lt;h3&gt;NServiceBus&lt;/h3&gt;  &lt;p&gt;Holy crap this thing is cool. &lt;a title="NSerivceBus" href="http://nservicebus.com/" target="_blank"&gt;NSerivceBus&lt;/a&gt; has been on my radar for a long time - as well as &lt;a title="Mass Transit" href="https://github.com/MassTransit/MassTransit" target="_blank"&gt;Mass Transit&lt;/a&gt;. We had a bit of trouble with MS DTC and permissions and whatnot, but it has otherwise been nothing but goodness. I love the feeling of isolation and extremely small units of work you get when dealing with service bus architecture - each message is its own unit of work and tends to be a small one.&lt;/p&gt;  &lt;hr /&gt;I think that pretty much covers it. Well, there are a couple of others (like their internal email handler/service/thingy), but I'm afraid a recruiter might see and start offering me gigs utilizing them. Kind of like the fact that you won't find assembly, C, C++, or BASIC on my resume. I don't want people knowing I know that stuff!&lt;img src="http://feeds.feedburner.com/~r/robtennyson/~4/ZecNQML3Sss" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/robtennyson/~3/ZecNQML3Sss/post.aspx</link>
      <author>rob@robtennyson.us</author>
      <comments>http://www.robtennyson.us/post/july-2012-new-tech#comment</comments>
      <guid isPermaLink="false">http://www.robtennyson.us/post.aspx?id=f4ef48de-c8d4-4af5-a57c-37fec9d8b110</guid>
      <pubDate>Sun, 22 Jul 2012 09:14:07 -0500</pubDate>
      <dc:publisher>rtennys</dc:publisher>
      <pingback:server>http://www.robtennyson.us/pingback.axd</pingback:server>
      <pingback:target>http://www.robtennyson.us/post.aspx?id=f4ef48de-c8d4-4af5-a57c-37fec9d8b110</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.robtennyson.us/trackback.axd?id=f4ef48de-c8d4-4af5-a57c-37fec9d8b110</trackback:ping>
      <wfw:comment>http://www.robtennyson.us/post/july-2012-new-tech#comment</wfw:comment>
      <wfw:commentRss>http://www.robtennyson.us/syndication.axd?post=f4ef48de-c8d4-4af5-a57c-37fec9d8b110</wfw:commentRss>
    <feedburner:origLink>http://www.robtennyson.us/post.aspx?id=f4ef48de-c8d4-4af5-a57c-37fec9d8b110</feedburner:origLink></item>
    <item>
      <title>fit-PC2 FTW!</title>
      <description>&lt;p&gt;&lt;a href="http://files.robtennyson.us/2012/3e0f70f75d65_D383/2012-04-02-fit-pc2-box-front.jpg" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 10px 10px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="fit-PC2 Box Front" border="0" alt="fit-PC2 Box Front" align="left" src="http://files.robtennyson.us/2012/3e0f70f75d65_D383/2012-04-02-fit-pc2-box-front_thumb.jpg" width="244" height="202" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This is a picture of the box top for my new toy. Thanks to a &lt;a href="http://www.robtennyson.us/post/zigbee-simple-sensor-network#id_00945cf0-3faa-4c38-ad91-6e06313779f2" target="_blank"&gt;comment from a friend&lt;/a&gt; on one of my past posts, I've been looking for a reason to justify buying one. Exactly as his comment suggests, I've grown tired of having to leave my beast of a desktop running to serve as a home server and to host the radio I use to interface with my remote sensor network.&lt;/p&gt;  &lt;p&gt;I love this little thing! It's small, quiet, and uses practically no power. I got the fit-PC2 Value model, which comes with everything I need: 1.1 GHz CPU, 1 GB RAM, Ethernet, DVI display port, 6 USB ports, and an empty internal bay for a 2.5&amp;quot; SATA HDD. I already had a 100 GB 7500 RPM drive I could use (left over from a past upgrade on the wife's mac).&lt;/p&gt;  &lt;p style="clear: both"&gt;&lt;a href="http://files.robtennyson.us/2012/3e0f70f75d65_D383/2012-04-02-fit-pc2-time-capsule.jpg" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="fit-PC2 Next to our Time Capsule" border="0" alt="fit-PC2 Next to our Time Capsule" align="right" src="http://files.robtennyson.us/2012/3e0f70f75d65_D383/2012-04-02-fit-pc2-time-capsule_thumb.jpg" width="244" height="139" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here you can see the fit-PC sitting next to our &lt;a title="Time Capsule" href="http://www.apple.com/timecapsule" target="_blank"&gt;Time Capsule&lt;/a&gt; for a good size reference. I used the Time Capsule as the router for the fit-PC's ethernet. The little thing in the middle is the XBee radio I use to communicate with my &lt;a title="ZigBee/XBee Garage Door Opener" href="http://www.robtennyson.us/post/zigbee-xbee-garage-door-opener" target="_blank"&gt;garage door opener&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;It sits there next to the router drawing very little power, making no noise, and hardly even warms up. I would even go as far as saying it looks pretty cool too - it lives in our living room on a small table next to the TV.&lt;/p&gt;  &lt;h3 style="clear: both"&gt;Communicating with the XBee&lt;/h3&gt;  &lt;p&gt;The OS I decided to put on it is &lt;a title="Ubuntu" href="http://www.ubuntu.com/" target="_blank"&gt;Ubuntu&lt;/a&gt;. This means the .NET console application and the ASP.NET application I used on my development box wasn't going to cut it (without getting &lt;a title="Mono, the open source development platform based on the .NET framework" href="http://www.mono-project.com/" target="_blank"&gt;Mono&lt;/a&gt; involved of course). Instead I went with the classic &lt;a title="LAMP" href="http://en.wikipedia.org/wiki/LAMP_(software_bundle)" target="_blank"&gt;LAMP&lt;/a&gt; stack (the 'P' being PHP in this case).&lt;/p&gt;  &lt;p&gt;For the time being, I'm not listening with the radio which means I'm no longer getting temperature readings. Instead I'm just using it to open and close my garage door. I did this because I'm hoping to move from using XBee/ZigBee to &lt;a title="6LoWPAN" href="http://en.wikipedia.org/wiki/6LoWPAN" target="_blank"&gt;6LoWPAN&lt;/a&gt; in the future (more on that another time). For that reason I didn't see the need to much time into this. I just wanted to be able to continue operating my garage door opener with my phone!&lt;/p&gt;  &lt;p&gt;For anyone interested, this is the PHP code I'm using to open the serial port and send the XBee messages to the remote XBee controlling the garage door opener. The php_serial.class.php that I'm including was pulled from &lt;a title="php_serial.class.php" href="http://www.phpclasses.org/browse/file/17926.html" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;pre class="brush: js;"&gt;&amp;lt;?php

  if ( isset( $_POST[&amp;quot;btnSubmit&amp;quot;] ) ) {
    ini_set( &amp;quot;display_errors&amp;quot;,&amp;quot;On&amp;quot; );

    include &amp;quot;php_serial.class.php&amp;quot;;
    $serial = new phpSerial;
    $serial-&amp;gt;deviceSet(&amp;quot;/dev/ttyUSB0&amp;quot;);
    $serial-&amp;gt;confBaudRate(9600);
    $serial-&amp;gt;confParity(&amp;quot;none&amp;quot;);
    $serial-&amp;gt;confCharacterLength(8);
    $serial-&amp;gt;confStopBits(1);
    $serial-&amp;gt;confFlowControl(&amp;quot;none&amp;quot;);
    $serial-&amp;gt;deviceOpen();

    $serial-&amp;gt;sendMessage(&amp;quot;\x7E&amp;quot;); // Frame start
    $serial-&amp;gt;sendMessage(&amp;quot;\x00\x10&amp;quot;); // Frame length
    $serial-&amp;gt;sendMessage(&amp;quot;\x17\x00&amp;quot;); // Frame type (AT command)
    $serial-&amp;gt;sendMessage(&amp;quot;\x00\x13\xA2\x00\x40\x86\x97\xCB&amp;quot;); // Destination address
    $serial-&amp;gt;sendMessage(&amp;quot;\xFF\xFE&amp;quot;); // 16 bit dest addr (unknown)
    $serial-&amp;gt;sendMessage(&amp;quot;\x02&amp;quot;); // apply AT command immediately
    $serial-&amp;gt;sendMessage(&amp;quot;\x44\x31&amp;quot;); // &amp;quot;D1&amp;quot;
    $serial-&amp;gt;sendMessage(&amp;quot;\x05&amp;quot;); // HIGH
    $serial-&amp;gt;sendMessage(&amp;quot;\x92&amp;quot;); // checksum

    sleep(1);

    $serial-&amp;gt;sendMessage(&amp;quot;\x7E&amp;quot;); // Frame start
    $serial-&amp;gt;sendMessage(&amp;quot;\x00\x10&amp;quot;); // Frame length
    $serial-&amp;gt;sendMessage(&amp;quot;\x17\x00&amp;quot;); // Frame type (AT command)
    $serial-&amp;gt;sendMessage(&amp;quot;\x00\x13\xA2\x00\x40\x86\x97\xCB&amp;quot;); // Destination address
    $serial-&amp;gt;sendMessage(&amp;quot;\xFF\xFE&amp;quot;); // 16 bit dest addr (unknown)
    $serial-&amp;gt;sendMessage(&amp;quot;\x02&amp;quot;); // apply AT command immediately
    $serial-&amp;gt;sendMessage(&amp;quot;\x44\x31&amp;quot;); // &amp;quot;D1&amp;quot;
    $serial-&amp;gt;sendMessage(&amp;quot;\x00&amp;quot;); // OFF
    $serial-&amp;gt;sendMessage(&amp;quot;\x97&amp;quot;); // checksum

    $serial-&amp;gt;deviceClose();
  }

?&amp;gt;&lt;/pre&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/robtennyson/~4/UPUsCY-XEeo" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/robtennyson/~3/UPUsCY-XEeo/post.aspx</link>
      <author>rob@robtennyson.us</author>
      <comments>http://www.robtennyson.us/post/fit-pc2-ftw#comment</comments>
      <guid isPermaLink="false">http://www.robtennyson.us/post.aspx?id=1dcb9104-b1c7-4161-9534-f211b8ada63c</guid>
      <pubDate>Tue, 03 Apr 2012 12:09:00 -0500</pubDate>
      <dc:publisher>rtennys</dc:publisher>
      <pingback:server>http://www.robtennyson.us/pingback.axd</pingback:server>
      <pingback:target>http://www.robtennyson.us/post.aspx?id=1dcb9104-b1c7-4161-9534-f211b8ada63c</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.robtennyson.us/trackback.axd?id=1dcb9104-b1c7-4161-9534-f211b8ada63c</trackback:ping>
      <wfw:comment>http://www.robtennyson.us/post/fit-pc2-ftw#comment</wfw:comment>
      <wfw:commentRss>http://www.robtennyson.us/syndication.axd?post=1dcb9104-b1c7-4161-9534-f211b8ada63c</wfw:commentRss>
    <feedburner:origLink>http://www.robtennyson.us/post.aspx?id=1dcb9104-b1c7-4161-9534-f211b8ada63c</feedburner:origLink></item>
    <item>
      <title>Visual Studio + Resharper Intellisense</title>
      <description>&lt;p&gt;I've always turned off the auto-appearance of intellisense in Visual Studio. I feel that it's faster to just finish typing the word than it is to pause slightly and pick the right one from the intellisense dropdown that appears. Whenever I'm typing something really long or when I'm not entirely sure what the method or class name is, then I just hit Ctrl+Space to make the intellisense appear on-demand.&lt;/p&gt;  &lt;h2&gt;Visual Studio 2010 + Resharper 5.1&lt;/h2&gt;  &lt;p&gt;In ReSharper's options:&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Completion Behavior" border="0" alt="Completion Behavior" src="http://files.robtennyson.us/2012/eb7bcd67d113_692E/completion_behavior.png" width="604" height="214" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Parameter Info" border="0" alt="Parameter Info" src="http://files.robtennyson.us/2012/eb7bcd67d113_692E/parameter_info.png" width="604" height="214" /&gt;&lt;/p&gt;  &lt;p&gt;And in Visual Studio's options:&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Visual Studio Options" border="0" alt="Visual Studio Options" src="http://files.robtennyson.us/2012/eb7bcd67d113_692E/VS_Options.png" width="604" height="214" /&gt;&lt;/p&gt;  &lt;p&gt;That should do the trick. Enjoy!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/robtennyson/~4/McOSa0iKeTQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/robtennyson/~3/McOSa0iKeTQ/post.aspx</link>
      <author>rob@robtennyson.us</author>
      <comments>http://www.robtennyson.us/post/visual-studio-resharper-intellisense#comment</comments>
      <guid isPermaLink="false">http://www.robtennyson.us/post.aspx?id=da490e6f-3261-4618-9bc7-bd50783d9b76</guid>
      <pubDate>Wed, 21 Mar 2012 07:57:36 -0500</pubDate>
      <dc:publisher>rtennys</dc:publisher>
      <pingback:server>http://www.robtennyson.us/pingback.axd</pingback:server>
      <pingback:target>http://www.robtennyson.us/post.aspx?id=da490e6f-3261-4618-9bc7-bd50783d9b76</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.robtennyson.us/trackback.axd?id=da490e6f-3261-4618-9bc7-bd50783d9b76</trackback:ping>
      <wfw:comment>http://www.robtennyson.us/post/visual-studio-resharper-intellisense#comment</wfw:comment>
      <wfw:commentRss>http://www.robtennyson.us/syndication.axd?post=da490e6f-3261-4618-9bc7-bd50783d9b76</wfw:commentRss>
    <feedburner:origLink>http://www.robtennyson.us/post.aspx?id=da490e6f-3261-4618-9bc7-bd50783d9b76</feedburner:origLink></item>
    <item>
      <title>Resistor Decoder</title>
      <description>&lt;p&gt;A friend shared &lt;a title="Matt Grimmett" href="http://www.mscottgrimmett.com/?p=298" target="_blank"&gt;a link&lt;/a&gt; to his post about an extremely cool video of &lt;a title="Bret Victor" href="http://worrydream.com/" target="_blank"&gt;Bret Victor's&lt;/a&gt; talk at &lt;a title="CUSEC 2012" href="http://2012.cusec.net/" target="_blank"&gt;CUSEC 2012&lt;/a&gt; titled &lt;a title="Inventing on Principle" href="http://vimeo.com/36579366" target="_blank"&gt;Inventing on Principle&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;After watching the very inspiring video, I started snooping around Bret's site. Talk about a treasure trove of goodies! When I stumbled across the below, I had to share (as well as put it in a place I would always remember). I thought it was the coolest way to decode resistors I've seen to date.&lt;/p&gt;  &lt;p&gt;&lt;a title="Resistor Decoder" href="http://worrydream.com/ResistorDecoder" target="_blank"&gt;&lt;img style="background-image: none; padding-bottom: 0px; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="resistors" border="0" alt="resistors" src="http://files.robtennyson.us/2012/84b60017ff31_8E49/resistors.png" width="100%" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/robtennyson/~4/Aya5mCF9XP4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/robtennyson/~3/Aya5mCF9XP4/post.aspx</link>
      <author>rob@robtennyson.us</author>
      <comments>http://www.robtennyson.us/post/resistor-decoder#comment</comments>
      <guid isPermaLink="false">http://www.robtennyson.us/post.aspx?id=9925ae64-55aa-44a7-ad9b-40d53583fb88</guid>
      <pubDate>Tue, 13 Mar 2012 10:37:45 -0500</pubDate>
      <dc:publisher>rtennys</dc:publisher>
      <pingback:server>http://www.robtennyson.us/pingback.axd</pingback:server>
      <pingback:target>http://www.robtennyson.us/post.aspx?id=9925ae64-55aa-44a7-ad9b-40d53583fb88</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.robtennyson.us/trackback.axd?id=9925ae64-55aa-44a7-ad9b-40d53583fb88</trackback:ping>
      <wfw:comment>http://www.robtennyson.us/post/resistor-decoder#comment</wfw:comment>
      <wfw:commentRss>http://www.robtennyson.us/syndication.axd?post=9925ae64-55aa-44a7-ad9b-40d53583fb88</wfw:commentRss>
    <feedburner:origLink>http://www.robtennyson.us/post.aspx?id=9925ae64-55aa-44a7-ad9b-40d53583fb88</feedburner:origLink></item>
    <item>
      <title>ZigBee/XBee Garage Door Opener</title>
      <description>&lt;p&gt;I mentioned in my last post that I have three xbee radios that need to be used (played with!) and that we only have one garage door opener between the two of us - I am not the keeper of said opener. Here I present version one of our new networked garage door opener!&lt;/p&gt;  &lt;h3&gt;The Old Garage Door Switch&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://files.robtennyson.us/2012/ZigBeeXBee-Garage-Door-Opener_C206/2012-02-18_Opener.jpg" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Garage Door Opener" border="0" alt="Garage Door Opener" align="right" src="http://files.robtennyson.us/2012/ZigBeeXBee-Garage-Door-Opener_C206/2012-02-18_Opener_thumb.jpg" width="244" height="164" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The black box you see with the duck tape is a keyless entry system that was here when we bought the house. I'm the only one who used it (being the one without a remote) so I decided to unplug it and steal the wires that run from the garage door opener. The wires are already run and it's conveniently near a wall outlet so it seemed the right thing to do.&lt;/p&gt;  &lt;p&gt;In case you don't know (I didn't at first), the wires that run from your garage door opener (the real one attached to the door) to your standard wall switch works by merely closing the circuit between the two wires temporarily. So your wall switch is just a mechanical switch with two electrical contacts that, when the button is pushed, close the circuit. Releasing the button re-opens the circuit, or breaks the connection between the two wires.&lt;/p&gt;  &lt;p&gt;With the knowledge of just how simple it is to activate a garage door opener, all I needed was a way to electronically close the circuit between the two wires. That is exactly what a &lt;a title="Relay" href="http://en.wikipedia.org/wiki/Relay"&gt;relay&lt;/a&gt; is for.&lt;/p&gt;  &lt;h3 style="clear: both"&gt;The XBee Garage Door Switch&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://files.robtennyson.us/2012/ZigBeeXBee-Garage-Door-Opener_C206/2012-02-18_Opener_close-up.jpg" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 10px 10px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="2012-02-18_Opener_close-up" border="0" alt="2012-02-18_Opener_close-up" align="left" src="http://files.robtennyson.us/2012/ZigBeeXBee-Garage-Door-Opener_C206/2012-02-18_Opener_close-up_thumb.jpg" width="206" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;What this is, is the remote temperature sensor I had &lt;a title="ZigBee Simple Sensor Network" href="http://www.robtennyson.us/post/zigbee-simple-sensor-network"&gt;already created&lt;/a&gt; plus one additional component (and a few wires).&lt;/p&gt;  &lt;p&gt;So the stuff at the bottom of the breadboard is still the power management componentry. It takes the 9 volts coming in from the power supply and regulates it down to exactly 3.3 volts for the xbee. Plus a couple of capacitors to smooth out the current.&lt;/p&gt;  &lt;p&gt;Above that is the temperature sensor (tiny black thing) and a few resistors used to get the sensor's reading down to a level the xbee can read. And then there's the xbee itself with the temperature sensor still connected to AD0 (pin 20).&lt;/p&gt;  &lt;p&gt;The new piece is the light blue component at the very top. That is a &lt;a title="Compact 5VDC/1A SPST Reed Relay" href="http://www.radioshack.com/product/index.jsp?productId=2062478"&gt;Compact 5VDC/1A SPST Reed Relay&lt;/a&gt;. I just connected the two wires from the garage door opener to each side of the relay and then ran a wire from AD1 (pin 19) on the xbee through the relay to ground. To trigger the relay, I just have to turn on AD1. So recalling what I said about the garage door switch, I just turn on the pin, closing the circuit with the relay, and then turn it right back off to re-open the circuit. Just like pushing a button switch :)&lt;/p&gt;  &lt;h3 style="clear: both"&gt;Tying Everything Together&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://files.robtennyson.us/2012/ZigBeeXBee-Garage-Door-Opener_C206/2012-02-18_App.png" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="2012-02-18_App" border="0" alt="2012-02-18_App" align="right" src="http://files.robtennyson.us/2012/ZigBeeXBee-Garage-Door-Opener_C206/2012-02-18_App_thumb.png" width="170" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I left the temperature sensor on the circuit and I left the xbee configured exactly as-is. This means the console app that I used before still works like a champ. I connected the coordinator xbee to my PC, plugged in the above breadboard, ran the application, and I immediately started getting temperature readings from my garage. All I needed then was to be able to send a command to the remote xbee telling it turn on AD1 and then again to turn it back off.&lt;/p&gt;  &lt;p&gt;&lt;a title="Digi" href="http://www.digi.com/"&gt;Digi&lt;/a&gt; made this really easy with the xbee API. All I need to do is send it a remote AT command configuring AD1. Specifically, I send a &lt;em&gt;Remote AT Command Request&lt;/em&gt; to the address of the remote xbee passing the AT command D1 (configure analog/digital pin 1) with the parameter of 5 to turn on high digital output (3.3 volts). I sleep for half a second and then send the same command again with a parameter of 0 turning the pin back off.&lt;/p&gt;  &lt;p&gt;Of course, I needed a way to tell my console application to send those commands. For now I just listen for incoming connections on a named pipe. I created a single ASPX page sitting on my local IIS that, on button click, would open a connection to that named pipe and send it the message &amp;quot;Garage Door&amp;quot;. The console app triggers the garage door every time it gets this message.&amp;#160; Sweet!&lt;/p&gt;  &lt;p&gt;To get to that from my phone, I opened up HTTP traffic in my firewall to private network traffic and gave my PC a static IP address. So as soon as my phone connects to my wireless router, I can open and close the door with my phone. In fact, anyone who knows the password to my router and knows the IP address of my PC can now open and close the door. Unlimited remotes!!&lt;/p&gt;  &lt;h3&gt;Awesome, But Not Finished Yet&lt;/h3&gt;  &lt;p&gt;So now everyone who has access to my router can open and close the garage door. That's cool and all, but I'm not done yet. There are several things I don't like about the situation...&lt;/p&gt;  &lt;p&gt;First, I want to be able to tell whether or not the door is currently open. No brainer! Not cool if the opening and closing is automated, but I still have to leave my lazy boy to see whether or not I need to close it at the end of the day.&lt;/p&gt;  &lt;p&gt;Next, having a breadboard and exposed components dangling on the wall of my garage isn't cool. It's also not good for the circuit being exposed to dust and whatnot. Mostly it isn't cool though.&lt;/p&gt;  &lt;p&gt;More importantly are the implementation details. Currently everything is had coded in a very brittle way. First I assume that any message received at the coordinator is going to be a temperature reading on AD0. Second is the garage door opener. Its address is hard coded to that exact xbee module. The pin is hard coded to AD1. And finally, I'm using named pipes to communicate with a console application from a .net application.&lt;/p&gt;  &lt;p&gt;Oh, and I'm not logging the temperature readings, so no cool graphs. Not that there would be many readings coming in yet. Still have to solve the cost problem of creating dozens or remote sensors.&lt;/p&gt;  &lt;p&gt;I'm definitely excited about what I have so far. And excited about the fact that I can open and close the door from my truck of course. But I have a lot of work (can I even call it that?) ahead of me.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/robtennyson/~4/M4AOQso1Ays" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/robtennyson/~3/M4AOQso1Ays/post.aspx</link>
      <author>rob@robtennyson.us</author>
      <comments>http://www.robtennyson.us/post/zigbee-xbee-garage-door-opener#comment</comments>
      <guid isPermaLink="false">http://www.robtennyson.us/post.aspx?id=1e41bd5b-b055-409a-af10-a8db5857a4a8</guid>
      <pubDate>Thu, 23 Feb 2012 16:47:54 -0500</pubDate>
      <dc:publisher>rtennys</dc:publisher>
      <pingback:server>http://www.robtennyson.us/pingback.axd</pingback:server>
      <pingback:target>http://www.robtennyson.us/post.aspx?id=1e41bd5b-b055-409a-af10-a8db5857a4a8</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.robtennyson.us/trackback.axd?id=1e41bd5b-b055-409a-af10-a8db5857a4a8</trackback:ping>
      <wfw:comment>http://www.robtennyson.us/post/zigbee-xbee-garage-door-opener#comment</wfw:comment>
      <wfw:commentRss>http://www.robtennyson.us/syndication.axd?post=1e41bd5b-b055-409a-af10-a8db5857a4a8</wfw:commentRss>
    <feedburner:origLink>http://www.robtennyson.us/post.aspx?id=1e41bd5b-b055-409a-af10-a8db5857a4a8</feedburner:origLink></item>
    <item>
      <title>ZigBee Simple Sensor Network Part 2 - Never Mind</title>
      <description>&lt;p&gt;In my &lt;a title="ZigBee Simple Sensor Network" href="http://www.robtennyson.us/post/zigbee-simple-sensor-network"&gt;last post&lt;/a&gt; I left off with saying that I planned to continue in &lt;a title="Building Wireless Sensor Networks" href="http://www.robtennyson.us/post/building-wireless-sensor-networks"&gt;the book&lt;/a&gt; with the second piece of the &lt;em&gt;Simple Sensor Network&lt;/em&gt; project - switching the remote sensors to end devices and using batteries instead of the 9v plugs. I also thought I'd create my own PCB instead of using the breadboards. Didn't happen...&lt;/p&gt;  &lt;p&gt;I really dig the idea of having one of these temperature sensors in literally every room in the house. Maybe one out front and one out back as well. I can picture having rich graphs showing me the temperature rise and fall from all around my house. Ideally all of the internal sensors would rise and fall in sync as the central air kicks on and off. If one of the rooms fell lower in the winter or rose higher in the summer in between heating/cooling cycles, that would tell me that particular room isn't insulated as well as the rest. Or it would tell me someone left a window cracked, or a varmint decided to make their own entry. All good information to have and at the very least I'd have those cool graphs to show off to oldsters who visit :)&lt;/p&gt;  &lt;p&gt;The problem with the XBee-based sensor though, is the cost. The radio itself is roughly $20 and then there are the rest of the components. So we're talking close to 30 bucks &lt;em&gt;per sensor&lt;/em&gt;. Not cool if I want to buy more than a dozen (every room - not just bedrooms, outside, attic, etc.). If I plan to implement this idea of a zigbee network of temperature sensors, I need to find a much cheaper solution for end devices.&lt;/p&gt;  &lt;p&gt;So I'm done with the book &lt;a title="Building Wireless Sensor Networks" href="http://www.robtennyson.us/post/building-wireless-sensor-networks"&gt;Building Wireless Sensor Networks&lt;/a&gt;. Even though I don't think I'll continue using xbee radios everywhere, I am so glad I got the book. It has introduced me to all sorts of fun and coolness that I've never played with before. And I can see using those radios in spots (like the controller or more extravagant devices that use more of the module's functionality), so I'm sure it will be a great reference in the future. It's an excellent addition to my library.&lt;/p&gt;  &lt;h3&gt;What's Next&lt;/h3&gt;  &lt;p&gt;I am left with the three xbee radios I've already purchased. I was thinking about what I might do with them as I was leaving to take the kids to school the other morning. As I pulled out of the garage and lamented once again that I still haven't gotten a second remote for the door (the wife has our &lt;em&gt;one&lt;/em&gt; remote in her car of course), the idea of creating my own formed. I've read of others doing it with &lt;a title="MyDoorOpener.com" href="http://mydooropener.com/" target="_blank"&gt;arduinos&lt;/a&gt; and netduinos so there's plenty out there on the subject. My next post will show how I accomplished it with a couple of my left over xbee radios. Good times!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/robtennyson/~4/vHP6VUHgCQs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/robtennyson/~3/vHP6VUHgCQs/post.aspx</link>
      <author>rob@robtennyson.us</author>
      <comments>http://www.robtennyson.us/post/zigbee-simple-sensor-network-part-2#comment</comments>
      <guid isPermaLink="false">http://www.robtennyson.us/post.aspx?id=ffc6dfd3-b878-4311-9ef4-faa901c4f528</guid>
      <pubDate>Sat, 18 Feb 2012 10:06:13 -0500</pubDate>
      <dc:publisher>rtennys</dc:publisher>
      <pingback:server>http://www.robtennyson.us/pingback.axd</pingback:server>
      <pingback:target>http://www.robtennyson.us/post.aspx?id=ffc6dfd3-b878-4311-9ef4-faa901c4f528</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.robtennyson.us/trackback.axd?id=ffc6dfd3-b878-4311-9ef4-faa901c4f528</trackback:ping>
      <wfw:comment>http://www.robtennyson.us/post/zigbee-simple-sensor-network-part-2#comment</wfw:comment>
      <wfw:commentRss>http://www.robtennyson.us/syndication.axd?post=ffc6dfd3-b878-4311-9ef4-faa901c4f528</wfw:commentRss>
    <feedburner:origLink>http://www.robtennyson.us/post.aspx?id=ffc6dfd3-b878-4311-9ef4-faa901c4f528</feedburner:origLink></item>
    <item>
      <title>ZigBee Simple Sensor Network</title>
      <description>&lt;p&gt;This is the project I mentioned in &lt;a href="http://www.robtennyson.us/post/configuring-my-first-xbee-radios"&gt;Configuring My First XBee Radios&lt;/a&gt; where I'm going to setup the sensor network from chapter 5 in &lt;a href="http://www.robtennyson.us/post/building-wireless-sensor-networks"&gt;Building Wireless Sensor Networks&lt;/a&gt;. I'm going to end up with two remote temperature sensors that are mesh-networked together to stream their data to a base station radio connected to my PC.&lt;/p&gt;  &lt;h3&gt;Preparing the radios&lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;Coordinator&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is a simple matter of connecting to the xbee with X-CTU and switching its mode from AT to API (along with ATAP = 2). I also went ahead and zeroed out ATDH and ATDL since the coordinator will be receiving data only.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Routers&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;These stay in AT mode, but need the following settings:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;ATID - set to the same PAN ID as the coordinator &lt;/li&gt;    &lt;li&gt;ATDH - 0 (forces the radio to use 16-bit addressing) &lt;/li&gt;    &lt;li&gt;ATDL - 0 (destination is the coordinator for both routers) &lt;/li&gt;    &lt;li&gt;ATJV - 1 (rejoin network on restart) &lt;/li&gt;    &lt;li&gt;ATD0 - 2 (puts pin 0 in analog mode) &lt;/li&gt;    &lt;li&gt;ATIR - 3E8 (sample rate of 1,000 milliseconds - polls for the temperature once a second) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Something that might be worth noting here. When I first unplugged the coordinator and plugged in the first router, my computer's USB completely stopped working. Yep, I lost both my mouse and keyboard and no amount of unplugging and plugging them in helped. I tried every USB port on my computer. I eventually had to do a hard restart (and luckily only lost a little progress on this post - I save often). I did notice I had left X-CTU running when I did the switch. This time I closed X-CTU in between configuring the two routers and everything worked fine. Don't know for sure if that was the problem since I don't care to reproduce it, but wanted to put it out there just in case you run into the same thing.&lt;/p&gt;  &lt;h3&gt;Preparing the sensor boards&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://files.robtennyson.us/2012/ZigBee-Simple-Sensor-Network_BD0D/2012-01-27_sensor_board.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Sensor Board" border="0" alt="Sensor Board" align="right" src="http://files.robtennyson.us/2012/ZigBee-Simple-Sensor-Network_BD0D/2012-01-27_sensor_board_thumb.jpg" width="154" height="145" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This was an experience for me. It seems like I have a vague memory of having soldered before, but we might as well say I've never done it. I'm proud to say I finished with only one burn (right index finger). The solder jobs themselves look horrible.&lt;/p&gt;  &lt;p&gt;Working with all the parts was interesting as well (transistors, resistors, etc.). Very neat and I'd say rather satisfying when the end product is a physical thing instead of software. Good times!&lt;/p&gt;  &lt;p&gt;This is a picture of the first one I put together (the second looks identical). The little black thing poking up right below (in the picture) the XBee is the actual temperature sensor. The mess of stuff near the bottom is the voltage regulator (from 9-volt to 3.3-volt) and the capacitors (to get rid of noise in the power supply). Prototyping on those breadboards is super easy.&lt;/p&gt;  &lt;h3 style="clear: both"&gt;Capturing the sensor data&lt;/h3&gt;  &lt;p&gt;The book actually supplies a program ready to use that will allow you to visually see on your computer all the data being sent from your remote sensors. It's a &lt;a title="Processing" href="http://processing.org/" target="_blank"&gt;Processing&lt;/a&gt; program that uses some Java libraries to communicate with the XBee radio over the COM port. I could have used that I suppose...&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Sensor Network App" border="0" alt="Sensor Network App" align="right" src="http://files.robtennyson.us/2012/ZigBee-Simple-Sensor-Network_BD0D/2012-01-30_sensor_network_app.png" width="229" height="79" /&gt;&lt;/p&gt;  &lt;p&gt;Being the developer that I am though, I wrote my own in .net. I put the code out on github in a project called XBee (real stretch for a project name, I know). You can see the library I wrote along with the project specific to this example at &lt;a href="https://github.com/rtennys/XBee"&gt;https://github.com/rtennys/XBee&lt;/a&gt;. The format of the messages sent from the XBee radios in API mode are very easy to work with. It was a fun little exercise for sure.&lt;/p&gt;  &lt;h3 style="clear: both"&gt;What's Next&lt;/h3&gt;  &lt;p&gt;I think I'm going to do two things next. I'm going to kind of stick with the book moving on to creating temperature sensors that are configured as end devices instead of routers. This allows them to be much more conservative on the energy they consume thus allowing me to use a battery power supply instead of having to plug them in. In addition to what the book shows though, I'm going to create my own &lt;a title="Printed Circuit Board" href="http://en.wikipedia.org/wiki/Printed_circuit_board"&gt;PCB&lt;/a&gt; instead of using the &lt;a title="Breadboard" href="http://en.wikipedia.org/wiki/Breadboard"&gt;breadboard&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/robtennyson/~4/AjBdsLbfE2E" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/robtennyson/~3/AjBdsLbfE2E/post.aspx</link>
      <author>rob@robtennyson.us</author>
      <comments>http://www.robtennyson.us/post/zigbee-simple-sensor-network#comment</comments>
      <guid isPermaLink="false">http://www.robtennyson.us/post.aspx?id=95e48bbe-2169-4022-9cb1-871560f3ac4c</guid>
      <pubDate>Mon, 30 Jan 2012 10:40:26 -0500</pubDate>
      <dc:publisher>rtennys</dc:publisher>
      <pingback:server>http://www.robtennyson.us/pingback.axd</pingback:server>
      <pingback:target>http://www.robtennyson.us/post.aspx?id=95e48bbe-2169-4022-9cb1-871560f3ac4c</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.robtennyson.us/trackback.axd?id=95e48bbe-2169-4022-9cb1-871560f3ac4c</trackback:ping>
      <wfw:comment>http://www.robtennyson.us/post/zigbee-simple-sensor-network#comment</wfw:comment>
      <wfw:commentRss>http://www.robtennyson.us/syndication.axd?post=95e48bbe-2169-4022-9cb1-871560f3ac4c</wfw:commentRss>
    <feedburner:origLink>http://www.robtennyson.us/post.aspx?id=95e48bbe-2169-4022-9cb1-871560f3ac4c</feedburner:origLink></item>
  </channel>
</rss>
