SolidusConf 2017

I am very proud to say that I was a chosen speaker at this year’s SolidusConf.  Solidus is an open-source eCommerce platform written in Rails. We use it at and contribute actively to the project. Below is a transcript of the talk as well as my slides. They say the video will be released soon and when it does I’ll post it here. I think the transcript will read better than I presented it so start there. Before we get to all of that I would like to thank my wife for all of her love and support, Greg Price for the topic idea, and Ashton Herrmann for editing and proof reading. They really made this thing come together and without them it wouldn’t have been nearly this good.

Link to Talk

Link to Slides

Keep your store fresh with an API-based CMS


Hello. I’m incredibly happy to be here and excited to tell you about API-based CMSes for your stores. We’ve seen incredible improvements to our sales, advertising potential, and quality of life from these changes.

My name is Eric Saupe. I work for Deseret Book, a book publisher focused on selling Christian and Latter-day Saint products and founded in 1866. We have over 20,000 salable variants including digital products like ebooks and audiobooks. Those products are sold in our 45 retails stores and authorized reseller locations as well as online. We have an e-reader app called Deseret Bookshelf for iOS and Android, and we just launched a subscription service for unlimited access to our audiobooks and over a thousand ebooks. All purchases for Deseret Bookshelf happen through our Solidus-based, and our online orders for physical products are fulfilled through our own warehouse, which runs on Oracle and Logpro.  Our physical products include books, art and home, jewelry, and clothing. Hopefully that gives you a small glimpse into the breadth of products we sell and services we have to communicate with through our Solidus store.


Let’s talk about our road to API-based CMSes. In the beginning was a totally custom Rails app without any sort of open-source e-commerce gem installed. Our marketing team has a really long tail of products to choose from, but unfortunately, the home page was really the only place we had marketing options available. Every time they had new product to advertise, they would send us, the developers, the requested changes: new images, new copy, etc., and we would plan that into our sprint and spend developer time to update the homepage and release for QA before finally deploying to production.

The other trick was scheduling deploys. Since they would often be advertising sales on the homepage, we would need to make sure a developer was ready to deploy at midnight to ensure the sale turned on and off properly.

I’m sure a lot of you have experiences that are probably pretty similar to that. Back then, whenever there were storewide sales, we would create a Category of productsa category is what we would now refer to as a Taxonand place all of their Sale Products in there so they could link to that in their emails. I actually like that approach, but you can see how time consuming all of this would be.

On our homepage there was a Top Ten list that was somewhat automated albeit misleading to the consumer. It took all products sold in the last two weeks and figured out which ones gave us the most revenue. So it really wasn’t the most “popular” since we could have sold a single $2,000 painting and 600 $3 bookmarks and the single painting would be more “popular” to the end user.

It wasn’t all static though; we did use Adobe Target to selectively inject some neat things to users but only in a couple of places. At the top of the page under the navigation we could add messages to the user about sales or site updates. That was more or less all we had as far as tools go for the marketing team. Everything else was done by hand by either the marketing team with their Category pages or with the help of the developers manually updating the homepage.


As grew it became apparent that our custom Rails app was just way too hard to maintain with the number of requests for features and bugs that were coming in. That’s when we started looking at open-source solutions and found Spree. It sounded like a great deal: we take advantage of open source software to help us maintain the e-commerce platform of the site while we figure out how to make it communicate with our warehouse and e-reader API. Simple enough. As part of this upgrade, we were going to give more tools to the marketers to control more of the site. We wanted them to be successful in their jobs, selling all of the different products we offer.

With that we let Adobe Target control all sections of the homepage. Images, text, and links were all given to Adobe Target to allow marketers to update whatever they like. This was pretty good in theory, but it had a lot of negatives in practice. For one, if Adobe Target was down, the homepage was empty. Also, many ad-blocking plugins blocked Adobe Target data entirely because it was requested from the client rather than the server. Our client base is not really likely to use ad-blockers, but as developers and for our more tech-savvy users, the homepage was basically blank. There was no default content served from the site itself; it all relied on Adobe Target.

This gave us a few ideas to improve and iterate on, though. It allowed for A/B testing, which led us to find that a curated Top Ten list outperformed the existing automated one. The marketing team also loved having more control over when homepage updates were released rather than relying on our busy schedules to squeeze in development and deploy times. But the flaws of Adobe Target were too much, and it was clear we needed to phase it out at the end of our contract.

What Then?

With Adobe Target on its way out the door we had a chance to reflect on what it was the marketing team really needed. Obviously, they wanted to update the homepage regularly and add content to other parts of the site like during checkout and just under the navigation, and they wanted scheduled releases.

So what were our options at the time? We could build custom tools for them right on top of Spree, but then we would need to maintain the new database tables, bug fixes, and still have deploys for those changes. As developers we wanted something with minimal maintenance that the marketers couldn’t mess up. That may sound harsh, but with Adobe Target they were given the power to drop in entire blocks of Javascript, and if there were errors in that Javascript, the pages would break. That’s when we found headless CMSes like Contentful and

Headless CMS

Let me just quickly define what a headless CMS is so we can all be on the same page. A headless CMS is a content management system (CMS) that isn’t directly tied to your application. You can think of it like the WordPress admin interface except it isn’t directly attached to your site.

A headless CMS gave us the low maintenance backend that we wanted. It maintains the database and the service for you. It provides the GUI for users to update data, and it will integrate with all of your applications because the data is returned as a JSON object. Many of them also have gems to get up and running quickly. Their GUIs are great for non-technical people, giving them WYSIWYG-type editing that they can save and collaborate on before publishing.

Marketers are in charge of publishing, leaving the developers to focus on developing new features and fixing bugs. We didn’t want to store marketing data in our database because that would add unnecessary complexity and maintenance onto our small team. Outsourcing our marketing data management and publishing to an API-based CMS allowed us to focus on growing the business and let the marketers move more quickly without having to wait for developers to start selling product. vs Contentful

There are a number of headless CMS options out there, but we narrowed our options down to and Contentful. Contentful is definitely the larger organization, but Prismic was less expensive and offered scheduled deploys and previewing, which our marketing team really wanted. Ultimately we chose Prismic. The rest of the talk will be focused on how we integrated Prismic into our site, but the same principles can be applied to any headless CMS.

The Approach

During this time we were actually rewriting our site again after switching to Spree. In our zeal to keep our new Spree site functioning like our legacy site, we customized Spree too heavily and ended up running on our own fork of Spree, effectively eliminating the benefit of an open source community. Our team decided the best course of action was to start fresh with a Solidus-based site and pull over only features and code that were absolutely necessary.

This was also a great time to implement a new Prismic marketing change, and so we began talking with the marketing team about exactly what would be useful to them. We came up with a few components they wanted to use around the site like sliders, hero banners, mini banners, carousels, multi-item carousels, and headings. Knowing what kinds of content they wanted to place around the site, we simply needed to constrain those elements in a way that was both predictable for the site and simple to create and update for the Marketers.

To accomplish that, we created Content Schemas in Prismic. These house all of the data about your component, things like name, product ID, display type, etc. I’ll go over an example of one of these components here.

This is the Content Schema for a multi item carousel. First we see that the Component is a Carousel with the tag  “Multi item,” which helps distinguish between two or more types of the same component. Then each item in the Carousel is displayed with data about it: product name, description, custom link, button text, product SKU, and a custom image. Marketers can quickly update information that is specific to this Carousel without changing any data in our storefront. To identify where to place these components, we use Prismic’s tagging system with defined tags to be pulled into specific locations in our store. For example, anything that needs to appear on a specific taxon page is tagged with the taxon slug like “art-and-home/framed”.

Once the schema is set up and a component created, the site needs to pull in that data from Prismic and display it. We do this by making a call to their API and fetching documents related to a tag based on the page we are currently on. For taxon pages, we pull documents tagged with the current taxon’s slug. Now we have a JSON object with documents that should be rendered. Since this is just JSON and not HTML, we create partials to translate the Prismic data into something more meaningful.

This is our partial for carousels on our site. It handles both single-item and multi-item carousels and renders differently based on the type returned from Prismic. Here is where we are ensuring that the way things are rendered is consistent and within our predefined guidelines. However, in order to encourage a pattern of controlled content entry for flexible content presentation, Prismic does not allow for raw HTML. In our case we are going to handle all the HTML rendering based on the fields entered in Prismic.

Custom names, descriptions, and images are rendered from what was input in Prismic, but we also give the option to simply put in a SKU and handle the rendering from within the store. At Deseret Book we rely more heavily on Variant SKUs than anything else, but you could just as easily use the Product or Variant IDs to specify an individual product you wish to market. This makes life easier because custom data is not required, and it allows the site to consistently render the proper link and image.

Now that you have an idea of what an individual component looks like, let’s take a look at our big project of allowing Marketers to update the entire homepage from Prismic. Each section of the homepage is a different document housing many components. We have our top section, which has a hero banner and mini banners; our left section with carousels, single item spotlights, and headers; and our right section with our curated Top Ten list and some single-image components.

The home page looks exactly the same as it did before we implemented Prismic. Because everything is just a partial in Rails, we were able to match our current site without problem, and we also maintain consistency throughout the site since every Prismic component will render the same way on every page. Hero banners on taxon pages look the same as the Hero banner on the home page.


After converting our entire site to Prismic, we actually saw faster load times because Prismic compresses files for us that previously weren’t being compressed properly. Ad blockers no longer stopped portions of our site from rendering because the server was the one making the request for marking data rather than the client. And we can now cache those pages to make rendering even faster, although the one caveat to that is each page still needs to make a call to Prismic to ensure it has the latest version of the site. If their API is down or stalls, it can add loading time. We wrapped our calls to Prismic in a rescue and cached the old Prismic ref. If there is a problem with the call to Prismic, we just load the currently cached version of each page.

We also integrated Prismic into our mobile apps, and it is now the central location for marketing across all of our sites and allows marketers to quickly make updates and changes to our web and mobile apps. This saved a lot of money in possibly getting another solution that focused on just mobile in-app marketing.


To finish up I wanted to do a really quick demo where we will actually edit our site, do a preview of that edit, and publish it so you can all see how that flow looks.

Here in Prismic I’m editing the home page section to change an image. I can save it up here, then we can preview it on the site, live. Once I’m happy with it, we can either schedule a time for it to be published or just publish it right now. In addition to scheduling a time, Prismic allows you to create releases, which lets marketers work on an entire series of changes and lump them into a single event that will all be published together. Last year they used it with great success for the 12 Days of Christmas sales we do. As you change and make edits to documents in Prismic, it will keep track of the differences. You can even fork different items to make changes just like Git.

I’ll publish it now. We’ll go back to and you can see my change is now live.

To help you get started with all of this, I am announcing two gems, one for Prismic and one for Contentful that will plug into Solidus. Included in those gems are starter templates for basic marketing components. We have loved everything about what Prismic has given us, and I really hope you’ll consider using an API-based CMS to enhance your store too. Thank you.

Teamwork Doesn’t Have to Suck

Note: This is a repost from my Medium account,

Let’s face it, teamwork can suck. A new project comes up, the team gets together and inevitably a small portion of the team does the majority of the work. Deadlines come, tensions run high, and suddenly you dread waking up in the morning to head back into the hell that has been created. We’ve all been there. Let’s talk about how to make all of our teams better not only for our own sanity but for every member of our teams.

Teams can be great!

Move together

Hard working team members can quickly lose their drive without a destination in sight. A common and achievable goal should be the first step to improving any team. Each member should know their role and how they contribute to moving towards that end.

“Teamwork is the ability to work together toward a common vision. The ability to direct individual accomplishments toward organizational objectives. It is the fuel that allows common people to attain uncommon results.”

— Andrew Carnegie

Recently I was responsible with leading a complete rewrite of our company’s eCommerce site. The goal was simple, get us on a new open-source-based platform and clean out the crap. Over the years we had made customizations to our old open-source-based eCommerce platform to the point of forking it; effectively destroying the benefit of open-source technology. This project was our attempt at getting back into the community and “going vanilla”.

Bringing us together were the baby steps that we each made to move our large project toward the finish line. Those baby steps came from small tasks rather than large epics. Developers had clear features to implement, QA had specific guidelines to follow, and project managers had direct questions that needed to be answered. Everyone had something to contribute and because the tasks were small and clearly defined it was simple to feel like we were moving as each one was completed. After months of hard work we successfully finished the project and grew closer through our achievement.

That sense of movement, even if small, drives momentum and encourages teams. Set a goal, define a path, and let everyone run.

Cut the weight

Over the years I’ve worked on good teams and bad. The biggest team killer is a bad team member. One person can easily drag an entire team down due to their attitude, lack of communication skills, or the work they produce. The hard truth is that person has to go.

That can be hard to hear and even harder to execute. Do we just fire them? Move them to another team? Yes! Whatever it takes to get the toxic person out of your group is the answer. I once worked on a team where everyone was very communicative until this one person came around. Then everyone tensed up and were afraid to share their opinions for fear of being confronted about their ideas. This kills the team.

No organization or project is worth holding hostage over one team member. Shake it up and lose them. If it’s not working out then make that change sooner than later. The team will benefit greatly.

Build each other up

Praise never seems to come often enough. We should share in our defeats but build up individual accomplishments. When something goes wrong the team together holds the responsibility. When something goes right the individual people should be praised for their great work. This does two things to the morale of a team. First, a single person is not criticized for damaging your project. We are moving this thing together so we should share the load when things get heavy. Someone falters and we all get behind them to get everyone back on track. Second, individuals can see that their contributions are noted and matter. Even the person who may not be at the forefront of day-to-day additions should be thanked for every bit of effort given to the team.

Whatever good things we build end up building us.

— Jim Rohn

I’ve worked on projects where one or two team members contributed to a very high-profile feature that was talked about immensely while others did the less glamorous features and bug fixes. Were the latter’s contributions any less to the overall movement of the project? No, and they should be praised openly for doing their part as well as the others for the high-profile feature.

One way that we keep the praise going is using a Slack extension I created called Sticker Chart Party!. It gives your Slack team a digital emoji sticker chart similar to grade school days where we can quickly give a sticker every time someone does something noteworthy. Messages can be attached to the emoji to see why people got them and it’s a fun way to thank people for their contributions and help.

Sticker Chart Party! makes praise easy

My current team has grown closer together thanks to constantly high-fiving each other over all of our victories and banding together during the struggles. A good team should make every member feel comfortable and supported without alienation.

Small changes again and again

Iteration is key to life. Teams should always be evolving. As new people come and go the dynamic will always be changing. Open discussion should be encouraged on what is working and what isn’t and how to improve it. Tools, processes, and work styles should all be on the table for debate. If an idea is presented on making work life better by allowing for a remote work policy it should be discussed and tried. My current company just decided to go remote-first opting to allow employees to work wherever they feel comfortable that day whether it be at home, the office, or somewhere else.

Don’t be afraid to change how the team is working. I’ve seen people come in to a job and just settle into the routine saying, “That’s just the way it is here”. In all the companies I’ve worked for there is always room for change and improvement. Maybe as small as putting up art on the walls or shifting schedules around. Whatever makes the team happier will make them more dedicated and productive.

Be the change

It’s better to ask for forgiveness than beg for permission. Make your teams better right now. Be the positive change by publicly thanking those that are doing good work. Start the dialog in team meetings by bringing up possible issues that can be resolved as a group. It all needs to start somewhere and, in my experience, everyone wants to make things better and will rally around the idea of at least trying new things.

Shake things up and be happier in your teams.

Getting Started with Programming


A friend of mine called me up recently to ask me how to get started with programming. I’ve gotten these requests more and more as the demand for programmers rises. I’m going to compile a list of resources to help anyone get started with what I feel are the basis for what anyone who wants to program will need. This list is by no means comprehensive and while this will get you started you should not feel like you can go from knowing nothing to building the next Facebook simply by following this guide. It will, however, give you a solid foundation with which you can build and grow to the point where you could potentially build something like Facebook or Instagram on your own or working with a small team.

Which Language Should I Learn?

This depends entirely on what you are trying to do. Some people want to make their work life more efficient by writing small programs to automate their daily tasks while others may want to create websites and web applications. For the first I suggest Python. It is easy to pick up for beginners, it forces good code formatting, and it can be extended to do a large amount of things including creating large websites and applications (Instagram runs on Django which is a web framework built on Python). If you really want to write web applications or create interactive websites I would recommend learning Ruby on Rails. I have written web applications in both languages and I am far more effective in Rails thanks to their mantra of “Convention over Configuration”. I’ll be writing a post about why I feel Rails is better than Django later. Pick your language based on your goals and read the online books I have linked below. They will help you set up your computer and teach you how to create very simple programs for you to have a good base of understanding for programming.

Great Starters Guides

Code Editor

You’ll need a program to actually write the code. I personally suggest Sublime Text 3. It is free, light-weight, and can edit any type of programming file. It has a lot of neat extensions and themes so you can customize it to fit your needs.

Learn Git

Once you have picked your language of choice, no matter what it is, you’ll want to learn Git. Git is a tool to help you version your project and files. Versioning is similar to saving but gives you specific moments to return to. Let’s say you are working on a Word document. You start writing a lot, hit save, then you write a bunch more but decide you hate all that and want to return to where it was when you hit save initially. You could hit CTRL+Z a bunch but it would be nicer if you could point to a specific version of the file and say “I want to start from there again.” With Git you can do that. You make commits, marking moments in time, with messages about the changes made. If you ever want to go back you can simply rollback to any previous commit undoing your current changes. This is useful when you have a working program and then start to do some complicated work only to find you have totally screwed up the project. Just roll back to when it was working and start again.


While you can use versioning locally for your small projects you really start to see its true power when you make your software available for others to review and help; this is known as open-source software. Create an account on Github and they will guide you in pushing your local git versioned projects into projects that anyone can see and help you with. Don’t be afraid of others seeing what you might consider “bad code”. The point of doing this is so others can help you learn and progress. When you have a larger project others can write features and submit bug fixes for your code as well. Once you have a firm grasp of whatever language you have chosen you can even write code for other open source projects to help them with their features and bugs.


Everyone should learn a little bit of programming just like everyone learns a little bit of math. Obviously we can go very deep into mathematics and we can do the same with programming but everyone should have a grasp of the basics and have a foundation even if you don’t do it professionally. I hope this guide was useful and let me know if you have any questions or concerns in the comments below.


Rails 5

As has become tradition, a new full version release of Rails is coming just two years after the release of Rails 4. This new version progresses the platform by bumping the underlying minimum Ruby version and adds a slew of neat features to keep Rails feeling fresh and new.

Ruby 2.2.2

Ruby 2.2.2 is required in Rails 5 because Rails 5 will take advantage of the new Symbol Garbage Collection found in Ruby 2.2. There is also rumor of Rails 5 using the Incremental Garbage Collection found in Ruby 2.2. They have decided to use Ruby 2.2.2 since Ruby 2.2 had a major security vulnerability that is patched in 2.2.2. Ruby 2.2.1 PR Ruby 2.2.2 Commit

Rails API

Many Rails developers these days are finding themselves using Javascript Frameworks more and more. Whether DHH likes that or not it’s a fact of life. Before Rails 5 developers turned to the ruby-api gem which helps create a minimalist Rails application specifically for use as an API. This functionality is now going to be wrapped up and packaged with Rails 5 so no need for another gem. Just use the command rails new <application name> --api and Rails will create your new API app all on its own!

Here are a couple of tutorials for you Backbone and Ember users.

Turbolinks 3

Turbolinks has been a part of Rails since Rails 4 but is getting a major update to hopefully make developers happier about using it. Turbolinks has been criticized for having major usability problems but the concept of only loading portions of the DOM that change is a sound idea. Many Javascript Frameworks take advantage of this idea specifically React.js. Turbolinks will fetch the body content of your page without worrying about rerendering the CSS and Javascript. You can opt-in to specify which parts of the page should be changed if you’d like as well. They also added a progress bar by default to help the user see things are happening behind the scenes, but with the increased speed you hopefully won’t need that.

Action Cable

Action Cable is the feature I am most excited about. Simpler web sockets for Rails. Anytime anyone says web sockets to me I cringe a little just because of how complicated they can be to set up. Many have tried to make the problem easier and Action Cable is Rails’ way of giving it a try.

Rake or Rails

The beginner’s dillema, do I use rake db:migrate or rails db:migrate, is it rake test or rails test? Doesn’t matter anymore, it’s all rails. From Rails 5 on the rails command can be used to run rake commands. Simple change but a nice one.

Integration Tests

Rails 5 is beginning a push to deprecate Controller tests all together in favor of Integration tests. As part of that they are deprecating assigns() and assert_template in controller tests. Aaron Patterson has a great keynote from Railsconf where he outlines the speed improvements made to the Rails testing environment and why Integration tests will be the way to go.


I gave this presentation to the SLC.rb user group July 28th, 2015 and here are the slides from that presentation in case anyone is interested.

Rails 5

A lot of other under the hood improvements are expected to be made but I think I covered a lot of the major upcoming features. Let me know if you have any questions or which Rails feature you are most excited about by leaving a comment below.

How to Watch Streams in VLC Player


VLC Player has a neat feature that allows you to watch high quality streams. Here is a small list of how to watch them.

  1. Download VLC Player (if you don’t already have it)
  2. Open Network Stream (Ctrl + N on Windows)
  3. Copy and paste the link address
  4. Hit Go

If you are having lag issues:

  1. Go to VLC Preferences -> Select Show All
  2. Then go to Preferences -> Input/Codecs -> set Network Caching to 5000ms or more

If that doesn’t help try a lower bitrate or quality by switching the 4500 in the link address to 3000, ipad, 1600, iphone, or 800.

Link to Reddit Post


With the latest LTS release of Ubuntu many people, including myself, will take this time to do a fresh install of the OS on their development machines.  Here are a few tips for getting up and running after your OS is installed.  This guide will be for Python and Django development using Ubuntu 64-bit, alter the commands to work with your flavor of Ubuntu.


  1. sudo apt-get install git-core


  1. Download the latest version of JDK from Oracle.
  2. cd /usr/local
  3. sudo tar xvzf ~/PATH/TO/DOWNLAD/xvzf jdk-8u5-linux-x64.tar.gz
  4. sudo nano /etc/profile
  5. At the bottom of this file paste the following lines:

In the terminal type java to make sure it is working.


If you want to use settings from your previous install of PyCharm click File->Export Settings and back up this file to be used on your new installation.

  1. Download the latest version from PyCharm.
  3. tar xvzf pycharm-professional-3.1.2.tar.gz
  4. cd pycharm-3.1.2/bin/
  5. ./
  6. If PyCharm asks if you want to use old settings say that you don’t right now, we will do this after it is installed.
  7. Follow PyCharm instructions to finish installation
  8. Now you can import the settings by clicking File->Import Settings and locating the files.


  1. sudo apt-get install python-pip


  1. sudo pip install virtualenv
  2. Create your virtualenvs.


  1. sudo apt-get install python-dev
  2. sudo apt-get install mysql-server
  3. sudo apt-get install libmysqlclient-dev
  4. In your related virtualenv run pip install MySQL-python


  1. In your related virtualenv run pip install Django

At this point you should be ready to install all of the other packages you need.  If I’ve missed anything critical for getting an Ubuntu installation at least up to a working state let me know below in the comments.

Things My Wife Doesn’t Understand – 2013 Review


The year is over and WordPress has kindly sent me a summary of that stats for my blog.  The growth has been more than I ever expected.  I still consider this a personal blog for my own edification and learning but I’m glad I could share my knowledge and problems with so many.  In the coming year I would like to focus a bit more on Django and Python but understand that a lot of people really want front end help and so I will continue to post about JavaScript and CSS.

Eric Saupe: Things My Wife Doesn’t Understand – 2013 Review

Thanks again for visiting my blog.  I hope it helps you as much as it helps me.


A couple of weeks ago it came out that there is a flaw in Django’s ImageField which could potentially allow for phising programs to be uploaded and grab cookies or do other malicious things.  While there will be no fix in Django directly you still need to take precautions on how you serve and receive files uploaded by your users.

Django has a page dedicated to fixing this exact issue.  Head over to their security guide and read up on the fixes.  They shouldn’t be too hard and shouldn’t affect any user experience.

Just wanted to post and let everyone know of the vulnerability.

Growing up I was always interested in computers.  I helped put parts in computers and install programs as young as five or six.  As I went to school I always knew I wanted to do something with computers.  Sadly, I wasn’t able to take any computer related classes in middle school or high school because they simply were not offered.  I would have loved to take a computer science course before going to college to better prepare myself for the challenges that it brings.

Luckily, there is a group trying to change that.  Between December 9-15, 2013 is Computer Science Education Week organized by  Their goal is to promote computer science education.  They’ve done a great job getting celbrities to back the cause and made a great YouTube video that you can see on this page and their site.

Computer science is not just for those who want to program.  Computer science is all about solving complex problems and critical thinking.  The solutions computer scientists come up with are manifest through a computer program but anyone can benefit from being a better problem solver.  Taking time to learn to program just a little bit will help you better see solutions to complex problems and understand how many of your favorite programs work and function.

Take time to program today or teach someone else.  The Computer Science Education Week website has a lot of great tutorials for anyone new to computer science.  If you already have experience but want to practice a bit more, head on over to GitHub and find an open-source project that interests you and contribute.


With the World Cup draw just getting over, and the United States bracing for a tough group, I am pleased to announce a small project I have been working on in my spare time, a World Cup Prediction App (if you have a better name for it please email me)!  My wife wanted a way to get her family more into the World Cup.  Since they are big American football and basketball fans they are familiar with brackets and tournaments.  I decided to make a simple website that allows people to create World Cup predictions to compete with others.  This app is still in very early days.  Most of the images are placeholders and the scoring system and group creation is still in the works.

You can sign up now to get updates on the app as it develops as well as create your predictions right now.  Just create an account and login.  Then click Brackets at the top and New Bracket.  Enter a name for your bracket and submit.  Now you can select the winners of the groups and the winners of each match by simply clicking their name.

This is also all open source so if you want to keep up on updates or leave feedback/bugs head on over the the project’s GitHub page or send an email to

I will post more about the app as it gets updated but in the mean time please feel free to create an account and click around.  The address is currently at but once a name is chosen I will change that.