Geeks With Blogs

Rob Reynolds

Subscribe to Fervent Coder RSS
Subscribe to Fervent Coder by Email

About Me

I manage several open source projects. Need...
   ...package management for Windows?
   ...automated builds?
   ...database change management (migrations)?
   ...your application to check email?
   ...a monitoring utility?

I also write for

Like what you are reading? Want to buy me a cup of coffee?
PayPal - The safer, easier way to pay online!

Fervent Coder Coding Towards Rob Reynolds UppercuT UppercuT is the insanely easy to use Automated Build Framework.
Iowa Code Camp Presentations
Last weekend I went up to Iowa Code Camp in Cedar Rapids and had the opportunity to do two presentations, one on NuGet and one known as the Automation Tools Roundup. ICC is one of my favorite conferences every year. It is twice a year and I try to make it to at least one of them. The people that attend this conference really make it worth the money you spend in travel expenses. Definitely recommended. Automation Tools Roundup This is my favorite session to give because it requires crowd participation ......

Posted On Friday, May 6, 2011 12:03 AM

Chicago Alt.NET Presentation Aftermath
Right now I’m on the train on my way back from Chicago. It’s interesting to be drinking a Corona and hanging out in the lounge while I’m watching the miles go by. Chicago was a nice time. I had never been so we decided to vacation in Chicago and see the sites – posts coming at the other blog. My presentation was on UppercuT. It was a small group that came to the presentation which makes for an more engaging audience. Overall it was a pretty good presentation and I enjoyed it. We got a little comfortable ......

Posted On Saturday, May 15, 2010 4:29 PM

UppercuT and Mercurial (hg)
I mentioned this awhile back on twitter, but UppercuT (UC) has support for Mercurial for versioning your assemblies. In the settings file, all you need to do it tell UC to use hg. When you build your assemblies, they will use the changeset number in the version, and in the informational version, you get the hash, just like you do when using Git. Pretty sweet. By the way, UC also supports .NET 4.0 as of last week. With this knowledge you shall build ......

Posted On Wednesday, April 21, 2010 11:32 PM

Published Applications AKA _PublishedApplications
Less maintenance. Less work to package during your automated builds. Too easy. Remember Our Old Friend _PublishedWebsites? You’ve probably seen the _PublishedWebsites folder when building websites in automated builds. If not you can stop paying attention now. Still with me? Great! So you know how it packages up everything nicely with content files going where they should with nearly ZERO cost to your build scripts. All you need to do is override the output directory (OutDir) and you get this feature. ......

Posted On Monday, March 21, 2011 12:22 AM

UppercuT v1.0 and 1.1–Linux (Mono), Multi-targeting, SemVer, Nitriq and Obfuscation, oh my!
Recently UppercuT (UC) quietly released version 1 (in August). I’m pretty happy with where we are, although I think it’s a few months later than I originally planned. I’m glad I held it back, it gave me some more time to think about some things a little more and also the opportunity to receive a patch for running builds with UC on Linux. We also released v1.1 very recently (December). UppercuT v1 Builds On Linux Perhaps the most significant changes to UC going v1 is that it now supports builds on ......

Posted On Friday, January 14, 2011 5:26 PM

UppercuT – Mark an Application Executable to Use More Than 2GB of Memory (Large Address Aware)
If you’ve ever built a .NET application that runs out of memory constantly, it’s because you are hitting a 2GB limit. You may have known about marking an assembly “/largeaddressaware”. You may have not. The process of doing this is actually somewhat easy once you learn about it. You normally just start a Visual Studio Command Prompt (found in Start Menu under Microsoft Visual Studio version/Visual Studio Tools). Then you find the compiled application and run the following command: editbin /largeaddressaware ......

Posted On Thursday, August 20, 2009 1:42 AM

UppercuT - Automated Builds - Getting Started Part 3 (Configure UppercuT.config)
In Part 1 we downloaded or built from source control. In Part 2 we added UppercuT to our project. Now we need to edit the UppercuT configuration. Let’s UppercuT our code! UppercuT.config 1. Navigate to the Settings folder and open the UppercuT.config file in your favorite editor. 2. Take a moment to familiarize yourself with all of the options available in the configuration file. 3. Copy the name of the solution file (minus .sln). 4. Select the current value of the property. Currently ......

Posted On Friday, May 29, 2009 7:36 AM

UppercuT - Automated Builds - Getting Started Part 2 (Add UppercuT to Your Project)
In Part 1 we downloaded or built from source control. We are now ready to add UppercuT to our project. Let’s UppercuT our code! Add UppercuT to Your Project 1. We open the folder at the top level of the project (usually just under trunk or a branch). Below you can see we have a project called MoneyQIFGenerator and it has no automated build love yet. 2. We already have a references folder (lib) so we are going to do something differently when bringing in UppercuT. For any existing project this could ......

Posted On Friday, May 29, 2009 7:27 AM

UppercuT - Automated Builds - VersionBuilder
UppercuT comes with VersionBuilder. A common problem many of us have is versioning our DLL assemblies and keeping track of what’s in production versus what’s in source control. If you rock with Subversion, UppercuT has this problem solved. So how do you take advantage of VersionBuilder? UppercuT automatically generates an assembly version file for you during build. All you need to do is hook every project up to it. Notice in the same directory the solution is in, after you run build.bat, there is ......

Posted On Thursday, May 21, 2009 3:10 PM

From Zero To Deployed Contest–Winner Announced PLUS Extension To Most Creative
Recently we had a contest to see who could beat my time to get from no code to deployed. Thanks to everyone that participated and everyone that thought about participating in the contest. Most Creative From Zero To Deployed Contest Extended! Unfortunately there were not enough entries to award the most creative video for ZtD. So what we are doing is extending the most creative until May 15, 2011 @ 11:59 PM CST. This gives you almost two months to get your videos in! If you entered before, you are ......

Posted On Monday, March 21, 2011 12:09 AM

Herding Code Talks About Nu
Dru and I were recently featured on Herding Code Podcast. In the podcast we talk about everything from package management in general to Nubular (Nu) to other package management systems (OpenWrap, Bricks, and Horn, although horn was/is slightly different) to the possibility of Microsoft releasing a package management system. It was a good time and I enjoyed doing the podcast, but the herding code guys start recording at an insane 10:30 PM! I have no idea how I made it through the whole thing and was ......

Posted On Friday, August 27, 2010 1:29 AM

UppercuT - Automated Builds - CruiseControl.NET Integration
So now you are rolling with UppercuT, but you don’t yet have Continuous Integration (CI). You can make that happen with CruiseControl.NET (or any other CI server like TeamCity or Hudson). This article is geared to CruiseControl.NET (CC.NET), although there will be future articles on other CI servers. This is specifically geared towards CC.NET 1.4 and above, because it takes advantage of preprocessors. First a few sideline notifications and then we'll get right into it. UppercuT Compatibility with ......

Posted On Thursday, May 21, 2009 6:46 AM

UppercuT - Automated Builds - User Group

If you have questions, you want to know about new features, or you want to get more involved, feel free to join the group.

Posted On Wednesday, May 20, 2009 5:43 PM

Uppercut - Automated Builds - DeploymentBuilder
UppercuT comes with DeploymentBuilder. What is DeploymentBuilder? Perhaps you maintain a bunch of deployment scripts that point to all your different environments. We now you can define a template batch file and let UppercuT create all of those deployments scripts for you. It's less for you to maintain, and you no longer have to update a bunch of different scripts. Just one or a couple depending on the types of deployment. To help people better understand what it can do, we've included a starting ......

Posted On Tuesday, May 19, 2009 4:24 PM

AppHarbor - Azure Done Right AKA Heroku for .NET
Easy and Instant deployments and instant scale for .NET? Awhile back a few of us were looking at Ruby Gems as the answer to package management for .NET. The gems platform supported the concept of DLLs as packages although some changes would have needed to happen to have long term use for the entire community. From that we formed a partnership with some folks at Microsoft to make v2 into something that would meet wider adoption across the community, which people now call NuGet. So now we have the ......

Posted On Friday, February 18, 2011 6:12 AM

UppercuT v1.2–NuGet Support
For those that have not yet heard, NuGet went v1 recently along with a whole slew of tools from the Microsoft folks. I’ve been lucky to be a part of the NuGet project and see it take shape over the past few months with community input and contributions. Even though v1.0 was released, we are already moving forward with getting ideas and prioritizing features for the next version. To follow the announcement, UppercuT (UC) v1.2 now includes support for NuGet out of the box. Plus, it will handle versioning ......

Posted On Sunday, January 23, 2011 8:48 PM

The Future of .NET Open Source Software Delivery
Imagine we are awhile into the future. How do you get open source releases down to your project so that you can use them? How do you get the products down to your computer so that you can use them? Is it easier or harder than the way we’ve always done it before? The Past and Present Before we can go there, let’s look at what we do now (the past is really the same for us here). Let’s say I want to use NHibernate. What do I do? There are basically three paths we all follow in this process. 1. Never ......

Posted On Monday, July 26, 2010 11:30 PM

How To – UppercuT and Gems
In a previous post I mentioned how I was going to show you how UppercuT (UC) has the ability to make gems stupid simple to create and publish. You ask if gems can get any easier and to that I answer, “Why YES, they can!” How about just filling out the information for the gemspec, running a build and having a nice, shiny new gem ready for publishing? Rock The Gems Basically you want to get the latest release of UppercuT. You can download it or grab the source and compile. There are already instructions ......

Posted On Wednesday, July 21, 2010 1:34 AM

How To – Gems And .NET – Dependencies (References)
In my last post I didn’t mention dependencies. Dependencies are their own animal. They require a couple more things to be in place. Let’s talk about those things. In the .NET world, the dependency for compiled bits is usually an exact version of a reference. Let me explain. So for example, you have a reference to log4net, and you don’t ILMerge it into your assembly. You now have a dependency that the DLL needs to be there and a particular version (outside of redirecting the bindings). So what I’m ......

Posted On Saturday, July 17, 2010 7:57 AM

How To - Gems And .NET
In my last post I showed gems being used for .NET. Now let’s talk about How. Most of this stuff I’ve learned over the past two days, so if I have a mistake here or you have a better idea, please don’t hesitate to offer a better solution. The GemSpec The Gem::Specification reference is your friend. In order to create a gem, you need to define a gem specification, commonly called a “gemspec”. A gemspec consists of several attributes. Some of these are required; most of them are optional. From here ......

Posted On Friday, July 16, 2010 2:27 AM

Gems - Package Management For .NET
The Ruby community has enjoyed a great user experience with a package management system they use called Gems. A gem is a package (or a library), compressed with some additional metadata, and can be either source files or binaries. Let’s focus on binary gems. We have the same concept in .NET (DLLs/EXEs). You may have references to other DLLs. When you want to update a reference you are using on a project, you may also need to update its dependencies as well. And so on and so forth. A package management ......

Posted On Thursday, July 15, 2010 11:37 PM

UppercuT - Automated Builds - ConfigBuilder
UppercuT comes with ConfigBuilder. What is ConfigBuilder? ConfigBuilder will build a configuration file per environment so you no longer have to maintain a bunch of configuration files. In any project you have app.config (or web.config) files. You just create a .template file next to it. The web.config has a file next to it named web.config.template. What do you name the app.config template files? You have to name the file based on what app.config becomes when visual studio builds the application. ......

Posted On Sunday, May 17, 2009 10:15 PM

UppercuT - Automated Builds - UppercuT.config
Recently I posted about UppercuT, the insanely easy to use build framework. There are so many things you can do with UppercuT, that it may make your life easier. We decided to make it even easier to use UppercuT by using a convention most people in the .NET world understand, the .config file. This replaces the build.settings.bat file for those of you who were using it. All you need to do now is navigate to the Settings folder and open the UppercuT.config file in your favorite editor. Get Building ......

Posted On Sunday, May 17, 2009 5:29 PM

UppercuT - The Insanely Easy to Use Automated Build Framework
UppercuT is the insanely easy to use Automated Build Framework! Automated Builds as easy as (1) solution name, (2) source control path, (3) company name for most projects!!! Uppercut was recently called NAnt for the masses! UppercuT is for developers who want a powerful build framework without a lot of set up work. UppercuT is for anyone who needs a standard way of building applications across an entire organization. UppercuT is for anyone who wants to concentrate on just writing code. What can UppercuT ......

Posted On Friday, May 8, 2009 4:53 PM

Deciding On Features For Open Source
Open source feature selection is subjective. An interesting question was posed to me recently at a presentation - “How do you decide what features to include in the [open source] projects you manage?” Is It Objective? I’d like to say that it’s really objective and that we vote on features and look at what carries the most interest of the populace. Actually no I wouldn’t. I don’t think I would enjoy working on open source (OSS) as much if it someone else decided on what features I should include. ......

Posted On Saturday, May 15, 2010 6:14 PM

Chuck Norris Be Thy Name
Chuck Norris doesn’t program with a keyboard. He stares the computer down until it does what he wants. All things need a name. We’ve tossed around a bunch of names for the framework of tools we’ve been working on, but one we kept coming back to was Chuck Norris. Why did we choose Chuck Norris? Well Chuck Norris sort of chose us. Everything we talked about, the name kept drawing us closer to it. We couldn’t escape Chuck Norris, no matter how hard we tried. So we gave in. Chuck Norris can divide by ......

Posted On Saturday, April 17, 2010 9:52 AM

UppercuT – Custom Extensions Now With PowerShell and Ruby
Arguably, one of the most powerful features of UppercuT (UC) is the ability to extend any step of the build process with a pre, post, or replace hook. This customization is done in a separate location from the build so you can upgrade without wondering if you broke the build. There is a hook before each step of the build has run. There is a hook after. And back to power again, there is a replacement hook. If you don’t like what the step is doing and/or you want to replace it’s entire functionality, ......

Posted On Saturday, March 13, 2010 8:09 PM

Virtual Alt.NET – UppercuT Automated Builds
Tomorrow on February 24th, 2010, I’m going to be giving a presentation on UppercuT (UC) at Virtual Alt.NET (VAN). If you are interested in learning about an automated build tool that will save you time and get you to a professional build in moments, not days, you can log into the VAN around 8PM CST on Wednesday (tomorrow). You don’t even have to go to a physical place to see the presentation! You can hang out from the comfort of your own home and watch me walk through how easy it is to use UC. Here ......

Posted On Tuesday, February 23, 2010 10:09 PM

Two Major Milestones for RoundhousE and UppercuT
This last year I had a focus to get more involved in Open Source (OSS). The year before I had been involved a little by submitting a patch here and there, but 2009 was a big year for me in OSS. I now manage 4 open source projects that have solved a need for me and others. Coming up on the end of the year it was important for me to get some final touches into at least two projects to finish out the year. UppercuT UppercuT (UC), for those of you who have never heard of it, is an automated build tool ......

Posted On Friday, January 1, 2010 2:55 PM

UppercuT – Added Pre-Task Hooks for Custom Tasks
Tonight I committed pre-task hooks for custom tasks in UppercuT. What has been available up to this point is only the post-task custom hooks. Now you can hook in before a task runs and run your own custom tasks! This is done the same way as the post run custom tasks. The naming convention here is * in the name. For example would be the pre-task custom tasks for The post task custom tasks are now moving to a * naming standard. For now using the ......

Posted On Thursday, July 2, 2009 12:28 AM

2010 and Forevah
Today marks the beginning of a new year. For many of us that means new resolutions like losing weight or quitting smoking. I tend not to focus on resolutions because I am horrible about keeping them. I usually set goals instead of making resolutions. And when I do set goals I intend for them to be SMART (Specific, Measurable, Achievable, Realistic, Timed). I’ve found that having goals that are measurable and realistic within a given time frame help me focus on how I want to get there from where I ......

Posted On Friday, January 1, 2010 1:19 PM

Afterthoughts From Iowa Code Camp and UppercuT Talk
Iowa Code Camp was a great time! I really enjoyed the conference itself. It was probably one of the best conferences I have ever been to. There are a lot of talented people surrounding Iowa and I had the pleasure of hanging out with some very intelligent people that are doing some really awesome things. The talk went well as well. Hopefully there were a few more people that got out there and tried UppercuT. Here are the slides from my talk ......

Posted On Tuesday, November 10, 2009 3:17 PM

Speaking At IowaCodeCamp
If you are in Des Moines, IA, tomorrow for Iowa Code Camp, I’m speaking on “Automated Builds: How to UppercuT your Code” at 3:45. If you are going to be there and we’ve only met on Twitter before, I’m looking forward to meeting you ......

Posted On Friday, November 6, 2009 11:25 AM

UppercuT and Mono Migration Analyzer
If you are using UppercuT, you will be pleased to know that it now supports Mono Migration Analyzer (MoMA for short). All you have to do is upgrade. And with the design of UppercuT, we’ve made it super simple to upgrade. How hard is it to upgrade UppercuT? Just drop in the files in your build folder, check for changes to the lib folder (especially in the NAnt directory) and new folders, and then check for any changes to the .bat files and UppercuT.config and you’re done. Mono Migration Analyzer Here ......

Posted On Sunday, October 25, 2009 2:05 AM

UppercuT – Elegant Solution to Strong Naming
Here’s how you can sign a set of assemblies in a project with a key using UppercuT: 1. Open the UppercuT.config file. 2. Change the following to “true”: 3. Done. Did I mention that creates a private key if it is not there as well?! This was from a patch sent in by Dru Sellers. Thanks Dru! With this knowledge you shall build ......

Posted On Saturday, September 26, 2009 12:09 AM

UppercuT Presentation Afterthoughts
The presentation for TopDNUG went pretty well. There were some good questions and back and forth. The room really seemed to come alive when in a matter of less than ten minutes I added UppercuT to two different Open Source projects (Reflexil and Quartz.NET) and had them off of the ground and building. Full builds, too. With versioning, compiling, unit testing, packaging, etc. I also unveiled the new logo for UppercuT: Here is the slide deck: UppercuT Presentation (may need to be renamed to .pptx) ......

Posted On Friday, September 25, 2009 11:57 PM

UppercuT – Automated Builds - Change is Good
Recently I reported that there were going to be some changes to UppercuT. And there have been. These are a summary of some of the most significant changes: Uppercut now reports it's version. This is helpful to know where you are versus the current version. It also reports the time when it finishes a build. Custom Replacement Tasks are now implemented. This is to add a task to the custom folder that completely replaces the normal workings of the build step it is replacing. A pre or post custom step ......

Posted On Wednesday, September 23, 2009 12:31 AM

Universal NAnt Script for Gallio
So Gallio has been out for a little while and I admit that I am a little slow when it comes to looking at new frameworks. I mean there is so much to look at and only so much time in the day allocated to programming. Anyway, there really isn’t much documentation out there yet for using Gallio with NAnt. I am of the thought that is due to all of the people who are really smart with builds are using Rake and/or PSake now. So I set off to create another universal script. This basically follows the conventions ......

Posted On Sunday, September 20, 2009 10:37 AM

UppercuT Undergoing Some Major Changes

I’m slimming it down and rethinking some of the idioms it is currently using. Stay tuned…

Posted On Monday, September 14, 2009 10:51 PM

Topeka Dot Net User Group (DNUG) Meeting – September 24, 2009
Topeka DNUG is free for anyone to attend! Mark your calendars now! SPEAKER: Rob Reynolds has been programming in .NET since the early days of 1.0. He is a .NET Developer at FHLBank Topeka, a bank where the doors are always locked and there’s no money inside. He holds a bachelor’s degree in MIS from Kansas State University (don’t hate!) and enjoys spending time with his wife and kid when his wife hasn’t locked him in the basement to work on any of the OSS projects he manages. TOPIC: Automated Builds: ......

Posted On Monday, August 31, 2009 11:34 PM

UppercuT - TeamCity Integration - Part 4 (Code Drop / Artifacts of the Build)
In Part 1 we create a project. In Part 2 we set up the Build Configuration. In Part 3 we ran the build. Now we are just going to note how we get to our code. Code Drop / Artifacts TeamCity stores all artifacts in a database. So for every build, the drop location is not a physical disk location, it’s actually in a database. This is why we called zip.bat instead of build.bat. We have to download the items from TeamCity and want to just download the one file. If we download that file and unzip it, we ......

Posted On Monday, June 8, 2009 7:05 AM

UppercuT - TeamCity Integration - Part 3 (Run the Build)
In Part 1 we create a project. In Part 2 we set up the Build Configuration. This time we will Run the build. Run the Build Project 1. Click on Projects. 2. You can see that the new project has not run before due to the question mark. 3. Let’s kick it off. Click {Run |…}. 4. The page refreshes automatically to show that we are running. 5. NOTE: The first build may fail due to folder cleaning that is happening at the same time. You will see a note in the build log that it is deleting items at the same ......

Posted On Monday, June 8, 2009 6:58 AM

UppercuT - TeamCity Integration - Part 2 (Create a Build Configuration)
Last time we created a project. This time we will set up the build configuration with it. Create a Build Configuration 1. Click {add a build configuration} for this project. 2. In the [Name:] field, we need to add something descriptive. We are building the trunk on every change. Let’s call it Bombali Trunk CI. 3. In [Artifact paths:] enter code_drop/*.zip. 4. In the Fail build if: section, ensure that these settings are checked: a. build process exit code is not zero b. at least one test failed c. ......

Posted On Monday, June 8, 2009 6:52 AM

UppercuT - TeamCity Integration - Part 1 (Create a TeamCity Project)
Integrating UppercuT with TeamCity is actually very easy. We will go through the steps to set up and run a build. Let's start with Creating a project. Create A Project 1. Log into TeamCity. 2. Go to Administration. 3. Click on create project. 4. Type a name for your project. Try to use an identifying name. In our example, we are using Bombali. We also add a nice description about the project. Choose what is most appropriate for you. 5. Click {Create}. Next we will create a Build Configuration. UppercuT ......

Posted On Monday, June 8, 2009 6:39 AM

UppercuT - Automated Builds - Test Category Filters
I'm happy to announce that UppercuT now has test category filters. The NUnit Task had them by default. To get categories added to MbUnit Task, I had to go back to the source code and add them. I followed the same format that NAnt-Extensions used: <mbunit report-types="Html;Xml;Text" report-filename-format="${f... report-output-directory="${... halt-on-failure="true" failonerror="true" > <assemblies> <exclude name="${}\*Databa... /> <exclude ......

Posted On Saturday, June 6, 2009 12:20 PM

UppercuT - Automated Builds - Getting Started Part 0 (Prerequisites)
In all discussion about how to get started, I didn't mention that there are prerequisites to using UppercuT. Well, really there is only one prerequisite. Prerequisites Source control command line tool on the path If you are unsure, open a command line and type svn to find out if you already have it installed. Download In our case Subversion Command line client. You can get that from Collabnet (you will have to register) at Note: If you have installed VisualSVN, ......

Posted On Wednesday, June 3, 2009 6:50 AM

UppercuT - Automated Builds - TeamCity Integration Coming
This is a quick update to note that TeamCity is on it's way to being supported. I was given a patch for this and I am about verify that it works (it came from a trusted source through, so I am pretty sure it will). You know what the greatest part of the patch was? It was one line of code. <property name="" value="${environment::get-v... if="${environment::variable... /> We don't even need a setting to determine if the build server is ......

Posted On Monday, June 1, 2009 8:59 PM

UppercuT - Automated Builds - Getting Started Part 8 (Next Steps)
In Part 1 we downloaded or built from source control. In Part 2 we added UppercuT to our project. In Part 3 we set up the UppercuT configuration. In Part 4 we updated our reference folders if we needed to. In Part 5 we built our code successfully. In Part 6, we checked into source control. In Part 7, we automatically ignored folders for SVN. What are the next steps to take advantage of the power of UppercuT? The Power of UppercuT UppercuT comes with many great features! You now have automated build ......

Posted On Saturday, May 30, 2009 12:52 PM

UppercuT - Automated Builds - Getting Started Part 7 (TortoiseSVN Global Ignore List)
In Part 1 we downloaded or built from source control. In Part 2 we added UppercuT to our project. In Part 3 we set up the UppercuT configuration. In Part 4 we updated our reference folders if we needed to. In Part 5 we built our code successfully. In Part 6, we checked into source control. This is a recommendation on automatically ignoring folders for SVN. TortoiseSVN Global Ignore List Because TortoiseSVN is the most commonly used client, it’s worth mentioning the Global Ignore list. You benefit ......

Posted On Saturday, May 30, 2009 7:43 AM

UppercuT - Automated Builds - Getting Started Part 6 (Source Control & What NOT to Check In)
In Part 1 we downloaded or built from source control. In Part 2 we added UppercuT to our project. In Part 3 we set up the UppercuT configuration. In Part 4 we updated our reference folders if we needed to. In Part 5 we built our code successfully. Now we are ready get this into source control. Let's UppercuT our code! Artifacts of the Build UppercuT outputs some files and folders that should never be checked into source control. These are basically the same as what is in your bin directories with ......

Posted On Saturday, May 30, 2009 7:35 AM

Copyright © Robz / Fervent Coder | Powered by: | Join free