Developing on Staxmanade

Updating git branches.

(Comments)

How to update a git branch OTHER than the one you're currently on.

git branch -f {branch-to-change} {commit-to-change-to}

I recently setup a C.I. server to automatically generate builds of an iOS application and upload to TestFlight. I don't want each and every push to master to trigger a new TestFlight build, so I configured my C.I. server to watch the release branch.

I was starting to dislike the switch branch dance to trigger a new build.

What I used to do:

# When I was on the master branch
git checkout release
git merge master
git push

When things start to hurt, look for a better alternative. And with Git, there is almost always a more efficient way.

After digging a bit, I found the answer.

git branch -f {branch-to-change} {commit-to-change-to}

So to trigger a new build from master I can just:

git branch -f release master
git push origin release

Or wrap that in a Gulp task gulp tf. And with CommandAllThings I can now type rake tf, or grunt tf or gulp tf and they all trigger a new build to come out of TestFlight.

Or if you wanted to skip moving your local branch, you could just update the remote branch directly.

git push origin local_branch:remote_branch

So my workflow would look more like

git push origin master:release

Happy Automation!

Introducing CommandAllThings

(Comments)

I'd like to introduce a simple little tool/(set of scripts) I threw together last weekend called CommandAllThings.

Some background

Do you use any command line build tools like GulpJS, GruntJS, Rake, etc?

I leverage these tools in many projects, both at work and on my own projects. I recently noticed that the muscle memory I've developed was slowing me down as I switch between projects and inadvertently use the wrong tool in the wrong project.

When working on one project all day and typing rake test throughout the day, then switching to another project not using rake I found myself still typing rake test even though I needed to type gulp test, or grunt build. This really messes with my flow. All I wanted to do was test or build the current project.

So I created CommandAllThings.

What is it?

In short, it's a very simple abstraction on top of your usual task runners like GulpJS, GruntJS, rake, etc that allows you to accidentally type the wrong tool and still accomplish the desired task with the right tool.

By using aliases in either PowerShell or Bash we can route, rake, gulp, grunt, etc to CommandAllThings which will inspect the current directory, determine the correct tool and execute your task(s) with the correct tool.

This is great. Now when I type in the wrong command rake test in a gulp project, I don't get slapped in the face with an error saying "cannot find a rakefile." Instead I continue on my way like I knew what I was doing.

example screenshot of commandAllThings

Does it only work on Windows or on the Mac?

At the moment it works on both.

  • For Windows I have an implementation in Powershell.
  • For the Mac you can alias to a Bash script.

Download at GitHub!

Check it out!

What's next?

I'd like to look at adding other tools to the list. You can check out the project for other task runners I know about. And if you have any thoughts on how to detect the other types, drop me a note in the issues (or consider sending over a pull request).

I'd also love to get some feedback on how to best or more easily get this into peoples's development environment. For now it's pretty manual and since it's all about your profile, a bit personal, so probably a good thing that it's not automatically installed.

Happy Commanding!

How to compile plain *.js (JavaScript) files with the TypeScript Compiler

(Comments)

Challenge

Let's say you've been tasked with researching what porting your existing JavaScript solution to TypeScript may look like or maybe you're curious what this process would be like before you propose it to a lead or project manager.

The first hurdle you may stumble upon is - the tsc (TypeScript compiler) requires all of your files end with a .ts file extension. This can make quickly prototyping a port challenging. To get an idea of what a port to TypeScript will look like you don't want to deal with first renaming all of your files to .ts. Especially since there are probably files you want to not rename to TypeScript (like jQuery or AngularJS etc.

And since:

TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.

it seems reasonable that you could acquire the benefits of the TypeScript compiler for even your existing JavaScript codebase.

Challenge Accepted.

The TypeScript compiler is open source, so let's take a dive into the compiler to see if this is something we can work around...

What are the steps we need to accomplish to make the compiler accept plain .js files?

  1. Get It
  2. Copy it
  3. Hack it
  4. Use it

Get it

Before we can get too far, let's first install the compiler onto our system.

I'll use npm to install typescript

npm install -g typescript

Note the -g here tells npm to install typescript globally. This adds the TypeScript compiler to your PATH so you can get right at tsc'ing your TypeScript code.

Copy it

We probably don't want to modify the globally installed version of tsc so we'll create a copy on our system to play around with. But, before we can do that we need to find where it is.

If on Windows or Mac

where tsc

NOTE: if you're using the PowerShell console on windows be sure to type out where.exe tsc because where is aliased to Where-Object in PowerShell which won't help us out in this case.

Once you've found the path to your version of tsc

Mine was in

  • C:\Users\jason\AppData\Roaming\npm\tsc
  • C:\Users\jason\AppData\Roaming\npm\tsc.cmd

Look at the contents of the tsc.cmd for Windows and tsc for non Windows machines. You'll notice that they are essentially executing node.exe passing in an argument to another tsc file in the node_modules path.

Take the two tsc and tsc.cmd files, copy them into a working folder MyJSCompiler and rename them. I named mine jsc and he shall be my squishy. Then take the contents of the node_modules/typescript/* folder (and path structure) and copy them to your working directory.

When you're done you should have a directory that looks something like this


--MyJSCompiler
  |   jsc                 <-- notice the re-named file from tsc -> jsc
  |   jsc.cmd             <-- notice the re-named file from tsc.cmd -> jsc.cmd
  |   
  ----node_modules
      ----.bin
      |       tsc
      |       tsc.cmd
      |       
      ----typescript
          |   .npmignore
          |   CopyrightNotice.txt
          |   LICENSE.txt
          |   package.json
          |   README.txt
          |   ThirdPartyNoticeText.txt
          |   
          ----bin
              |   lib.d.ts
              |   tsc
              |   tsc.js
              |   typescript.js
              |   
              ----resources
                  |   diagnosticMessages.generated.json
                  |   
                  ----(*.json files excluded for brevity)

Now you should be able to call your local version of jsc at the command line.

Hack it

Since we have a local version we can hack on now, let's find out what needs to change. Thanks to Ryan for already giving us a clue here.

Open up the node_modules/typescript/bin/tsc.js file (in our working directory from the previous step) and apply the below diff/changes.

     function isTSFile(fname) {
-        return isFileOfExtension(fname, ".ts");
+        return isFileOfExtension(fname, ".ts") || isFileOfExtension(fname, ".js");
     }

We've now implemented a small tweak to the TypeScript compiler that allows us to compile plain JavaScript files.

Use it

I won't be going into how to use the tsc compiler in this post, but you can now call the compiler passing along your *.js files and begin learning what changes you will need to make to your existing codebase to satisfy the compiler.

Be sure to use the --out FILE or --outDir DIRECTORY options because if you don't the compiler will take the input javascript file and overwrite it with it's compiled version.

!!WARNING!! I'll say that again, to use it, be sure to use the --out FILE or --outDir DIRECTORY options because if you don't the compiler will take the input javascript file and overwrite the original with it's compiled version.

With source control, this can potentially be a fun experiment to see what TypeScript's version looks compared to your own, but I'll leave that up to you to play with.

Best of luck on your port to TypeScript.

Migrating from BlogSpot to Octopress - Part 9 - What's left?

(Comments)



This article is Part 9 of 9 in a series about Migrating from BlogSpot to Octopress.

Now that I've migrated to Octopress, I'm in the process of finding my new blogging flow.

I'm currently editing markdown post drafts in a DropBox folder. I have been leveraging some of the following tools to write MarkDown.

My worry is that some of these don't have the best spell-check support - so here's hoping I double-check my work along the way :P.

Migrating from BlogSpot to Octopress - Part 8 - Redirect Atom/RSS in FeedBurner

(Comments)



This article is Part 8 of 9 in a series about Migrating from BlogSpot to Octopress.

This one is quick and easy.

I noticed that my original RSS feed staxmanade.blogspot.com/feeds/posts/default was 302 redirecting to http://feeds.feedburner.com/DevelopingOnStaxmande.

So I went to feedburner.com where I was already logged in (due to being auth'd with google/blogger) and from their I selected my feed and chose Edit Feed Details where I could put in my new RSS feed to http://staxmanade.com/atom.xml.

After doing this, I noticed 3 of my previously posted blogs show-up-again, but I can live with that.

Now you've hopefully migrated your blog's RSS subscribers automatically without loosing any.

Migrating from BlogSpot to Octopress - Part 7 - Setup a Custom Domain

(Comments)



This article is Part 7 of 9 in a series about Migrating from BlogSpot to Octopress.

To host your blog for free by GitHub, you are not required to buy a custom domain so this is an optional step, but one I took.

The reason I have a complete post on this topic is primarily to say that I was able to accomplish this while not even at my desk.

While out waiting for my daughter to complete practice, I sat on my iPhone and was able to not only buy the domain name staxmanade.com but I also configured the CNAME on GitHub. By the time I got home from my daughters practice, I could hit my blog through the new domain staxmanade.com. Exciting!

You can use this post for a quick and simple walk through.

Migrating from BlogSpot to Octopress - Part 6 - 301 Redirect Old Posts to New Location

(Comments)



This article is Part 6 of 9 in a series about Migrating from BlogSpot to Octopress.

So far we have mostly delt with getting the old blog content into our new Octopress blog. In this post I'll talk about how I setup automatic redirection from the old blog to the new blog.

Sorry, this post gets a little long, mostly because there is lots evolved, and I took some time to explain it along the way.

So, I'm not an SEO expert or even novice, and I hope the steps I took below actually gave me my end goal. I think they did, but let's not get ahead of ourselves. If you have any feedback, please drop me a line in the comments or in a github issue for this blog.

Reasons for redirection:

  • I'd like people to arrive at my new site even if they followed a link to the old BlogSpot location and get all the benefits of the new site (new theme, broken links fixed, etc)
  • The whole reason I did this was to 'migrate' not, start fresh.

I probably won't ever delete my staxmanade.blogspot.com blog due to outside blogs, articles and sites that have linked to posts I've made in the past, but at least they will end up at my new blog.

Goals for the redirection.

  • Users who click on a link to the old blog should redirect successfully to the new site.
  • I would love it if Google and other search engines could follow a 301 Moved Permanently redirection with the hopes that my old blog's search rankings would carry over to my new blog.

    DISCLAIMER: Given the steps in the post, I'm not 100% confident that this goal was accomplished, but I think it may have worked (maybe, possibly, ???)

Now, while I'm not 100% confident my search rankings carried over, I'm fairly confident that Google found out about my new blog because after just 2 days of the below steps being implemented, Google had already indexed the new site.

What's involved for redirection?

  1. Tell BlogSpot to redirect each post at staxmanade.blogspot.com to the new location.
  2. Handle that redirection on the Octopress side.

There are a number of posts out there that describe how to accomplish this with WordPress or other blogs that can host a dynamic server side component. However with Octopress or other statically generated sites we don't have as easy a time. I belive this has more to do with the lack of programmability on the BlogSpot side (or my lack of knowledge of how far you can go with it on their side) than the static-ness of our Octopress blog.

Let's get into why this wasn't as straight forward.

If you look at how to redirect from a BlogSpot blog to say WordPress you'll see that they are basically passing the FULL original url EX:http://staxmanade.blogspot.com/2013/12/format-your-net-exceptions-to-see.html to a server-side component, where it can dynamically translate that into the correct 301 redirect response needed for each page.

The problem we have is the BlogSpot template tags are limited. They don't provide a relative blog url parameter which would have made it easy. Instead they provide only the full URL <$BlogItemURL$> which we can't use on our static site.

The direction I took was to use the <$BlogItemNumber$> which is like a really long id value, leverage the Jekyll alias generator and end up doing two redirects.

  1. from staxmanade.blogspot.com/SomeBlogUrl -> staxmanade.github.io/blog/<$BlogItemNumber$>
  2. then from staxmanade.github.io/blog/<$BlogItemNumber$> -> staxmanade.github.io/blog/finalBlogUrl

On the Octopress side we are going to leverage the alias plugin. Once that's installed, we need to update all of our blog posts to add in the 'alias' that will point to th e/blog/{really_long_id}. My scripting hammer isPowerShell*(sorry if you're reading this on a mac - hey, maybe [Pash](https://github.com/Pash-Project/Pash) can help you if you're not on Windows)* and I wrote the below script to help in the task. Even if you don't knowPowerShell`, take a moment to read the comments in the code to get an idea of what it is doing.

In summary, the above code is:

  1. Parsing the blogger xml
  2. Extracting the post url (slug) and BlogSpot blog id
  3. Matching each post with a post in our Octopress _posts that we recently exported
  4. And injecting an alias: /blog/{id} into the header YAML

Look in your blogger xml for a sample ID, it looks like

<id>tag:blogger.com,1999:blog-4726251688144615011.post-7515836382847059837</id>

What we care about is the BigNumber after the "...post-". This is the id used in the above script to generate our new /blog/<BitNumber> alias url.

If you completed the above and run rake generate and rake preview, test out that your redirections are correct.

After I completed this and on my blog, staxmanade.com/blog/7515836382847059837 should redirect me to an actual post.

Once you're happy with your Octopress's blogger redirections, SHIP IT. Publish them to your blog and test them out on gihub rake gen_deploy.

Now that we have our static site redirecting the special /blog/{id} url's, we can go back to BlogSpot and update our template to redirect to our static site.

I used the below template (note search/replace your domain etc) before dropping this into your site.

Update Blogger template to redirect.

  1. Go back to your BlogSpot admin page and select the Template tab.
  2. On the lower right you may have to select (forgetting the exact text - but something like) Revert to classic template
  3. Modify the below template for your own site.

This will change all pages/posts on your old BlogSpot site (even your home page). You can now go test it out - see that it hopefully transitions you from your blogger site -> to the new static redirect - and then to your final post location. It happens so fast I sometimes don't see the middle/transition page.

Note: I had to run through this a few times before I got it right so be careful doing this (especially if you have a popular blog as it may interrupt users at the current time). I'm not that cool, so my blog could handle some downtime :P

Migrating from BlogSpot to Octopress - Part 5 - Fix Links

(Comments)



This article is Part 5 of 9 in a series about Migrating from BlogSpot to Octopress.

Once you've ported your content into Octopress there were several steps I used to fixup links. The two types of links I cared about at this stage were:

  1. Cross-Post links (where I referenced one of my other posts)
  2. Broken links.

Cross post links

I used a text editor and some command line magic to search for http://staxmanade.blogspot.com/ and replace it with /blog/ so that my cross-referencing posts could link to a relative version of the blog instead of the full blogspot domain.

Depending on how you configure your permalinks you may need to do some more link manipulation. I had to search .html at the end of my cross-referencign posts and be sure to delete it since my old reference would look like

http://staxmanade.blogspot.com/2013/12/format-your-net-exceptions-to-see.html

but now should link to

/blog/2013/12/format-your-net-exceptions-to-see

If you're on Windows and not interested in figuring out a PowerShell or other command to quickly search and replace, a friend of mine Tim Greenfield has a great utility GUI tool for easy search and replace.

I don't recall exactly what I did, I think I either used sed or a python command on my Mac for the initial search/replace. I'll let you figure out the rest of how to get that task done.

Once you're done fixing up cross-post links, we want to make sure we didn't mess anything up, and while we're at it, fix any old or out-dated links.

One great feature of Octopress is that we can run the site locally and use a spider tool to search for broken links. Run rake generate and rake preview locally to browse your site.

I used the Integrity link checker on my Mac to search the http://localhost:4000 site locally. There are lots of these tools out there, so feel free to use what you feel happy with.

This was a great exercise. Not only debugging any oopsies from the above cross-post fixup step, but allowed me to find any external links to blogs/images/etc that were out of date. I wasn't able to fix up all of my external links, but that's the way of the web unfortunately. I haven't done it yet, but have consider going back and linking the out-dated links to a version out on the Way Back Machine.

Migrating from BlogSpot to Octopress - Part 4 - Import Content into Octopress

(Comments)



This article is Part 4 of 9 in a series about Migrating from BlogSpot to Octopress.

In the previous post I discussed how to export your blog content from BlogSpot. Now that you have all of your content into a single .xml file, we need to translate that into the files and format that Octopress blog expects.

Translate export xml to Octopress posts

Thanks to a ruby script found in a gist, it's fairly easy to get going provided you are able to leverage all the gem dependencies with your installation of ruby. On Windows this is tricky although fortunately there are tools like yari to help out.

  1. Download and save one of these gists somewhere and call it BloggerImporter.rb
    • Note: there are a number of forks of the script - if one doesn't work, browse other changes and see if something fits your needs.
  2. From the command line go to a temporary folder and execute

    ruby {pathToImporterFile}/BloggerImporter.rb '{PathToBloggerExport}/blog-03-19-2014.xml'

    When I tried it on my windows machine I received the following error. Sorry Windows folks, I don't have answers for every scenario here - I just jumped over to my Mac and tried again. I remember first trying this like a year ago and ran down a similar rat-hole trying to get this dependency to work which is probably why I didn't port it back then. I'm sure it's possible, but wasn't worth my time (since it works on my mac and was a one-time task).

     C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- nokogiri (LoadE
     rror)
             from C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
             from BloggerImporter.rb:2:in `<main>'
    

    (One possible issue noted by a colleague: the ruby script requires a gem, Nokigiri, which is not supported on Windows by Ruby 2 at the time of this writing. This can be circumvented by either reinstalling Ruby 1.9.3 or by leveraging a tool like yari which allows you to pick the version of Ruby you wish to leverage with a script - a helpful StackOverflow answer exists here.)

  3. You should now you have your content.

    After you've run the BloggerImporter.rb command you should have at least two folders in your temporary folder.

     ~/code/temp> ls
     _drafts     _posts    BloggerImporter.rb
    

    I didn't end up caring about anything in my _drafts folder, but the _posts folder is full of gold. This contains all of your exported content now broken out into a separate file per post in the form of {year}-{month}-{day}-{title}.html.

  4. Copy this content into the Octopress blog folder under source/_posts/

  5. At this point you've successfully ported your content into your Octopress blog. Make sure you take tiny steps and git commit... the changes you care about along the way...
  6. Use rake generate and rake preview to see if it worked.
  7. If your preview looks right use rake deploy to put your changes on github.

Hopefully it all worked out and you're looking at your new Octopress blog with your old content all there. If I recall when I went through this process, there was one HTML file that Jekyll had issues compiling. I probably just modified the post or deleted somethign that wasn't necessary (I can't recall anymore) but it was quick to work through.

side note: When I initially tried getting Disqus to work after this and had trouble. Turned out this was because in the YAML metadata in each post comments: false :)

Migrating from BlogSpot to Octopress - Part 3 - Export BlogSpot Content

(Comments)



This article is Part 3 of 9 in a series about Migrating from BlogSpot to Octopress.

Thanks to Google for allowing us to export our own content and providing an easy way to get it all in one download. If we had to go manually read each item in an atom feed or web scrape the content off of a web page, this small series would be more like a novel...

Steps to export content.

  1. Log in to your [BlogSpot.com(http://BlogSpot.com) admin portal
  2. Go to the Settings tab
  3. Select the Other option under Settings
  4. Under Blog tools select Export blog
  5. Save the file somewhere safe so we can refer to it later

Blogger Settings

What's in this export file?

This file contains the raw content and metadata around each of your blog posts. You won't get any of your images, but all of your original blog images are probably hosted on external sites. This is next on my list of things to add to the port-list (and will possibly extend this series even more). I would like to download each of my images locally, save them to my Octopress git repo and update my posts to link to the local versions of the images (but that's lower on the priority).

Here is a snippet of a single entry from the exported file. In later posts we'll delv deeper into this to extract metadata an setup redirection from BlogSpot to our new blog.

Sample Entry from Blogspot Export File

  <entry>
    <id>tag:blogger.com,1999:blog-4726251688144615011.post-7515836382847059837</id>
    <published>2013-12-18T19:50:00.001-08:00</published>
    <updated>2013-12-18T19:50:18.725-08:00</updated>
    <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/blogger/2008/kind#post'/>
    <title type='text'>Format your .Net exceptions to see the StackTrace.</title>
    <content type='html'>&lt;h4&gt;TL;DR&lt;/h4&gt;  &lt;p&gt;Check out a dinky little &lt;a href="http://staxmanade.github.io/ExceptionMessageBeautifier" target="_blank"&gt;Exception Message Beautifier&lt;/a&gt; site I threw together so you can quickly format .net exception messages and easily see the StackTrace.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Go to the site: &lt;a href="http://staxmanade.github.io/ExceptionMessageBeautifier" target="_blank"&gt;&lt;font size="4"&gt;CLICK HERE&lt;/font&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Background&lt;/h4&gt;  &lt;p&gt;Over the years, I’ve worked on projects where application exceptions were saved to a SQL database. When querying the logs in Visual Studio or in Sql Management Studio’s table view, I would get a result-set that would not let me copy/paste and review the StackTrace easily. The tool always seemed to leave out the new line characters just like below.&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;System.Exception: Hello Exception!   at TestExceptionGenerator.Spike.GetException() in c:\Code\personal\DotNetExceptionMessageFormatter\TestExceptionGenerator\Spike.cs:line 22   at TestExceptionGenerator.Spike.b__0() in c:\Code\personal\DotNetExceptionMessageFormatter\TestExceptionGenerator\Spike.cs:line 13   at TestExceptionGenerator.Extensions.GetExceptionString(Action action) in c:\Code\personal\DotNetExceptionMessageFormatter\TestExceptionGenerator\Spike.cs:line 34&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Now, I know there are ways to get around this, like exporting to CSV, or setting up the query results to return in text view instead of table view. However, when you’re in the heat of tracking down a bug and don’t feel like you have time to find the settings dialog or open up you’re a text editor like &lt;a href="http://notepad-plus-plus.org/" target="_blank"&gt;NotePad++&lt;/a&gt; and enter a search/replace as I show below over and over with each exception message you review.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/-FGWJCcb9iUo/UrJs8rxtvqI/AAAAAAAAAik/uWK5NHFfU18/s1600-h/image15.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="http://lh5.ggpht.com/-Eo5EyWOkIm0/UrJs9Dr20HI/AAAAAAAAAio/9-9wJIb1K1c/image_thumb9.png?imgmax=800" width="443" height="286" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Just so I could see an exception that looked more like:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  &lt;p&gt;System.Exception: Hello Exception! &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160; at TestExceptionGenerator.Spike.GetException() in …&amp;lt;cut off for brevity&amp;gt; &lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160; at TestExceptionGenerator.Spike.b__0() in …&amp;lt;cut off for brevity&amp;gt; &lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160; at TestExceptionGenerator.Extensions.GetExceptionString(Action action) in …&amp;#160;&amp;#160; &lt;/p&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I finally buckled down and threw together a tool for this. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;You can check go check out &lt;a href="http://staxmanade.github.io/ExceptionMessageBeautifier" target="_blank"&gt;Exception Message Beautifier&lt;/a&gt; where you can see the sample below.&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-Ts_VJAZqmu4/UrJs9i36LfI/AAAAAAAAAiw/j4jZDVL2Z-Y/s1600-h/image3.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="http://lh6.ggpht.com/-YwT0ZJIBFSA/UrJs93yI9aI/AAAAAAAAAi4/eg2rZr285QE/image_thumb1.png?imgmax=800" width="689" height="354" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;I’d like to thank.&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Below are a list of tools/resources I leveraged to put the site together relatively quickly over the weekend.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://codepen.io/" target="_blank"&gt;CodePen.io&lt;/a&gt; where I first prototyped/built my site before porting it into the GitHub pages. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="https://github.com" target="_blank"&gt;GitHub&lt;/a&gt; for providing us with &lt;a href="http://pages.github.com/" target="_blank"&gt;GitHub Pages&lt;/a&gt;. Made this site a piece of cake to setup. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://github.com/approvals/Approvals.NodeJS" target="_blank"&gt;Approvals.NodeJS&lt;/a&gt; – easily test/verify output. (&lt;em&gt;Disclaimer – I created this nodejs port of &lt;a href="http://approvaltests.sourceforge.net/" target="_blank"&gt;Approvals&lt;/a&gt; for fun a while back and didn’t get around to throwing some polish on the library till now, where I was able to &lt;a href="http://en.wikipedia.org/wiki/Eating_your_own_dog_food" target="_blank"&gt;dog-food&lt;/a&gt; it&lt;/em&gt;) &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="http://lh4.ggpht.com/-bZZmkqr5Fqc/UrJs-TZgV2I/AAAAAAAAAjA/22oydAVrbSM/wlEmoticon-smile2.png?imgmax=800" /&gt; &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://angularjs.org/" target="_blank"&gt;AngularJS&lt;/a&gt; (a bit overkill for this site, OK TOTAL OVERKILL, but was simple, easy, makes my JS very little, and will allow for easy growth down the road if it needs to.) &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="https://developers.google.com/speed/libraries/devguide" target="_blank"&gt;Google CDN&lt;/a&gt; for hosting AngularJS &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://google.com/analytics/" target="_blank"&gt;Google Analytics&lt;/a&gt; (so I can see if anyone cares) &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;If you take a look, find a bug. Submit a GitHub issue and/or a pull request. Or if you find it useful, feel free to let me know.&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;Enjoy!&lt;/ul&gt;  </content>
    <link rel='replies' type='application/atom+xml' href='http://staxmanade.blogspot.com/feeds/7515836382847059837/comments/default' title='Post Comments'/>
    <link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=4726251688144615011&amp;postID=7515836382847059837' title='0 Comments'/>
    <link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/4726251688144615011/posts/default/7515836382847059837'/>
    <link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/4726251688144615011/posts/default/7515836382847059837'/>
    <link rel='alternate' type='text/html' href='http://staxmanade.blogspot.com/2013/12/format-your-net-exceptions-to-see.html' title='Format your .Net exceptions to see the StackTrace.'/>
    <author>
      <name>Jason Jarrett</name>
      <uri>https://plus.google.com/112910204617314300568</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Lz16PAsLf5Q/AAAAAAAAAAI/AAAAAAAAAg8/FYSu9U-1tCw/s512-c/photo.jpg'/>
    </author>
    <media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-Eo5EyWOkIm0/UrJs9Dr20HI/AAAAAAAAAio/9-9wJIb1K1c/s72-c/image_thumb9.png?imgmax=800' height='72' width='72'/>
    <thr:total>0</thr:total>
  </entry>