Category Archives: Programming

Introducing hmmworldview



I’ve been watching a ton of photography videos.

One that I saw the other day was a two hour forum on contemporary photography at the MoMA from February 2016.

It was just ok. I don’t recommend watching it. It’s long and I’m not sure if there are any takeaways for you. But it’s here if you must.

One of the things that was brought up was the role of photography in the current day.

What is photography.

How should photography be shown in museums.


There was some mention of how technology is ruining or changing photography.

How photography is ephemeral.

How do you display images that might only physically exist in the world for a few seconds, like Snapchat.

How do you make sense of billions and billions of images that get glanced over within seconds and are forgotten about.

I guess I was thinking about the role of photography in the current day.

I’m not really sure what photography will look like.

Or what art will be.

But I do know that at the forefront of all art is technology.

The great artists have always used the best technologies available to them.

I’ve been messing around with my new camera.

And yet, sometimes the best images that you can make are not the ones that you take, but ones that others have taken.

There are a lot of photos out there.

And some really good ones.

By some really good photographers.

Who use really good gear.

After thinking about all of this I think there is a huge role for technology in photography and art.

Specifically I think software and the internet will continue to redefine all aspects of the world.

So what does all of this mean?

It just means my mind was wondering and I decided to take my ideas and bring them to life in the form of a quick project.

I wanted to do something related to images that are available.

I wanted to do something to show the rapid pace of photograph production and viewing.

How photographs are absorbed in gross amounts.

And maybe tie it all together in something relevant.

And possible provide an example of what photography or art can be in the future.

The internet in many ways is the new museum.

You must bring the internet to the museum.

But regardless, the internet provides tons of options for photographs.

I decided to write some software to go through the most popular news articles and parse out their photographs.

From there I overlaid the most popular news images from the most popular news sources on top of each other to create some pretty cool images.

I also parsed out the most popular words from these news articles and associated them with the image.

I created both a website to view the image and words, as well as a twitter bot that automatically creates and posts an image every hour.

So I’m the artist, even though I’m not the photographer. I’m the curator. And I’m also not any of those things. I’m not the artist. I’m not the curator.

And the craziest part is I’m the viewer. I have no idea what these images will look like since I have no idea what the news will be.

I’m excited to see what this thing produces.

And should I comment on these works then I think I will have been involved in all aspects of the art cycle. From creation, to viewing, to critiquing.

So here are some pics.

Introducing hmmworldview
Introducing hmmworldview

They are terrifying.

A dreamlike (or I guess nightmarish) creation.

All of the most popular news that gets shoved down your throat nonstop through the day.

Diversity of these is great
Diversity of these is great

It’s all here in one image.

Like a game of where’s Waldo.

Look deep into the images.

There’s a lot going on.


You’ll see the famous characters and topics of the moment.

I’m actually really happy with the execution of this.

The images came out as gross and disturbing as I was hoping for.

Anotha one
Anotha one

I’m excited to see what these look like going forward.

If you want to check out the website you can do that at the hmmworldview website.

If you want to see a list of previous images check out the twitter with the hmmworldview twitterbot.

And if you want to mess around with the code feel free to grab it from me at the hmmworldview github. It’s free to use for any purpose.

So I definitely don’t know what photography is.

And I never will know what art is.

But maybe this can provide some insight into what those two things can or can’t be going forward.

At the core of everything will always be technology and innovation. And most likely software.

It’s been fun but I need to sleep now.

Hopefully everyone else’s New Year has been as interesting as mine. We’re now a week into it.

Digital Zaza LLC

My first business: Digital Zaza LLC

So I started my first company. Yay! It’s honestly nothing too crazy, more formality than anything else. My buddy who is working for an ecommerce startup got in touch with me and he wants me to do some Magento web development work. I’m pretty pumped for the opportunity to work with him and his awesome sounding team, and hopefully there is nothing but boatloads of money in our future.

This is the first time I’m working for a legitimate customer so I needed to make sure my business was legitimate. Although I could have just accepted check written out to my name, I decided to start an LLC for several reasons. One of the major reasons is that I have to pay taxes, and that means that I have to keep my personal finances separate from my business finances. I don’t want to be paying for business items with personal credit cards, etc. Having my own business account makes the whole tax process much simpler.

Another major reason for the LLC is that you get an Employer Identification Number (EIN). EIN’s are essentially the social security number of your business. When you have an EIN you are much more real to both other prospective customers and the IRS. What I mean by that is if a company wants to hire me, they will want to hire me as a company. They want me to write them a professional invoice. They want to see I am a registered business. Companies have to pay their own taxes. My ability to invoice, and their ability to write a check out to my LLC, allows for a paper trail that makes taxes easier for the company, the IRS, and myself. No one wants to write a check to some random dude and then explain to the IRS that they paid thousands of dollars to some guy Joey from New Jersey.

Another reason for the LLC is one that you hear about often. I’m limiting my personal liability. Generally an LLC separates my personal finances from my business finances. If I mess up in some disastrous way I will lose the capital of my company, but I generally will be covered from people trying to come after my personal finances.

Finally I wanted an LLC because it puts me in a potential position for future growth. While I don’t plan on this business getting too big, there always is possibility for growth. If my friend decides to dump more work on me than I can physically do or if I happen to be given work from another company, I’ll probably want to consider hiring employees or bringing someone on as a subcontractor. Having an LLC in place makes that process fast and much less painful.

You may actually be interested in some other form of business such as a sole proprietorship, S-Corp, etc. There are a lot of options for starting a business depending on what you’re trying to get into. But if you want a similar setup to what I have then I would probably recommend two links. The first is a step-by-step guide of what you need to start an LLC in the state of NJ. It’s good for general reading and getting a feel for if an LLC is right for you.

Staring an LLC in NJ

The best link is the actual state page where you can sign up for the LLC. Generally government websites are garbage. Information is all over the place and you have to spend hours or days trying to figure out where things are and what they mean. Once you figure it out you often have to go to some random building during some very specific time and then wait for days or weeks in the mail to get whatever it is that you need. This website and this process were the complete opposite. It couldn’t be any easier to setup an LLC then to just follow along the step by step process on this state website. So a huge shoutout to the New Jersey government for getting something right. It’s important to make something as beneficial as new business generation so painless and simple. Thank you.

NJ State Website for LLC

The site lets you search for and choose your business name, nominate your Registered Agents, sign up for an EIN, send in all the information that you have to, sign all documents online, and make payment via credit card right there all on the same site. At the end of the 15-minute process you have the certificate of formation, business registration, and EIN. Congratulations. You have an LLC.

With that information you can go right to the bank and open up a business account with whatever bank you prefer.

At this point in the post I should probably mention that you definitely might want to consult an accountant or lawyer to make sure you are doing this all correctly. Or you can go with a site like LegalZoom to get you up and running. I had some knowledge of these topics from going for my MBA and I also want to get a better understanding for law since it is such an important part of business. That’s why I went through the research to figure out what was appropriate for my situation. Often times it will be cheaper to have someone else do this work for you or prevent you from making costly legal or accounting mistakes.

For me this whole LLC process happened quickly. The time between my friend reaching out and me starting work was really fast. I didn’t have much time to think of a name. The name in this case isn’t too important as it mostly will be only used on the check that my customer writes. I don’t plan on actively marketing for work, but I want the LLC in case I ever get the opportunity to work or grow. I wanted a name that was pretty broad that I could use for a variety of work. While I’m doing web development for an ecommerce website today, I could definitely see myself doing engineering or business work and would want a name that could cover some general fields. I didn’t want Joseph Butewicz LLC because that’s boring and kind of implies a one-man shop even if I did have a lot of employees. I also didn’t want anything stupid like Innovative Technology Solutions LLC or Expert Engineering Consulting LLC. I hate corporate talk. I also wanted to make sure the domain name was available so I could easily add a nice website in the future. Since I had only a couple of minutes to think of something, I had two ideas. The first was Pro Peach LLC. The word peach is dear to me these days. The second was Digital Zaza LLC. Joey Zaza, or Zaza, or Za is a nickname of mine that goes way back. I kind of liked how Digital Zaza sounded. I like the word Digital, as technology is probably the area I most want to be involved with. Pro Peach LLC kind of really sucks so I went with the only option I had left lol.

I made sure the domain name was available and I picked that up as well. I decided to build a simple website for the business which I’ll talk about in detail here.

Sometimes when people have a business, especially a new one, they clutter their website with all sorts of corporate talk. Useless pages of text. Terrible stock images, etc. You’ve seen a million of these sites and they are disgusting. Just because you have a website, that doesn’t mean you need to fill it to the brim with pages and pages of worthless content. If anything I would argue that you always want to be evaluating your website (and your business, and probably your life as well) and be trying to remove unnecessary clutter that is there. Unclutter your page. Make your message clear. Since I don’t have much content, I wanted my site to be very simple. I don’t have lots of clients. I haven’t done any work for this company. Everything of interest deals with my personal programming life. I’m not sure if this company will continue with ecommerce development work or if it will morph into something else. I don’t know what my company will be. All I know is I wanted an LLC for the reasons previously stated. I just want to build awesome things with other people. Maybe a way to contact the business would be good.

So with all of those thoughts and ideas, I created exactly what I wanted to. I used Digital Ocean’s $5/month hosting plan, which is overkill for this site, but the cheapest you can really buy. I installed a LAMP stack as I have done many times before and got to work building the site.

There were eight things I wanted in the site.

  1. Name of the company
  2. A single sentence, almost like a slogan, giving you the slightest idea of what this is all about
  3. A link to my blog, specifically to this post. Remember, my company isn’t anything yet. It’s two days old, and while it has a customer, I have no idea what it’s future is. Everything that is of interest is related to my personal life.
  4. A way to contact me
  5. I want these four things in the center of the website, both vertically and horizontally.
  6. A font that plays off of the digital theme.
  7. This orangish, pinkish, salmonish colored background. I wanted to make a site with this color background for some time now and this was finally the opportunity lol.
  8. A favicon, that little icon at the top of your browser tab

The concept was very simple. As always the execution ends up taking way longer than expected. It’s remarkably difficult to center something both vertically and horizontally using CSS. Sure, I’m being a little dramatic, but it’s such a common thing to want to do and it always is so difficult. Instead of running through all of the different solutions for this problem, I’ll just say that I used flexbox. I’m happy enough with this rendering properly on the majority of devices. I doubt many people will visit this page in the near future, and I expect those people that do will have a reasonably up to date browser. This is a pretty bad assumption for a web developer lol.

Finding a font to use was pretty easy. I’ve used several font sites in the past and can recommend Font Squirrel, Da Font, and 1001 Free Fonts. There are other sites that you may use. I found a couple good fonts but my favorite was Silkscreen. Shout out to Jason Kottke for the Silkscreen font, specifically Silkscreen Expanded Normal. It’s exactly the right blend of digital and modern. Get Silkscreen here

For some reason I was having issues rendering this font on all of the different browsers I was testing. I must have been making some sort of syntactical mistake. The best way to get fonts to render on all of the devices is just to use Font Squirrel’s webfont generator. You upload your font and the generator will produce all of the different types of fonts you need along with the CSS that you can copy and paste over to your style sheet. Why waste your time writing it from scratch, and then wasting a bunch of time figuring out where your syntactical error is, when you can just copy and paste?

As for a way to contact, I really didn’t want to get away from the simplicity of the site. A contact page may have been alright but it’s kind of impersonal and definitely doesn’t fit with the idea of the site. I decided to find a free email-hosting site that would use my domain name and just link that email in a contact link on the site. Surprisingly Zoho is one of the few that has free accounts. It’s ad free too, which is great. You get up to 10 users with 5 GB storage per user for email. It’s exactly what I wanted for this site. If the site works well then I can see myself paying for their services will several other small sites. I signed up for the service and quickly had myself an email address that can send and receive to the domain.

Selecting the background color was easy enough. I had a really good idea of the color that I wanted. I googled around a bit to pick out some nice supporting colors. I usually use Google Image search for general ideas. If there’s a specific color I like then I’ll grab it via a color picker in something like GIMP. I often play around with the different color tools that show up when you search “color calculator,” etc. in google. Eventually after a little trial and error I had all of the colors that I wanted.

As for the favicon I just wanted the letters ZA in the Silkscreen font on the salmon background color. Favicons can be a pain in the ass to make all of the different sizes needed to support all of the different devices and browsers that use them. It’s best to just use one of the many great tools out there. Shout out to Philippe Bernard for the Real Favicon Generator. It takes your one image and makes all of the icons you need and generates all of the CSS that you need. Tools like this help accelerate the speed at which great things are built.

So that’s mostly it for the idea behind the business and the site. Putting it all together you get something that looks like this.

Digital Zaza LLC
Digital Zaza LLC

You can check out Digital Zaza by clicking this link. If it looks absurdly simple, that’s pretty much the intention. Over time this website may evolve into something more substantial, and that will be dictated by the growth of the business. But for right now I’m just a guy with an LLC who wants to build beautiful things.


Words from the future

A message from the future you

I’ve always been interested in listening to people talk about their past. There are lots of good lessons in listening to the advice people might have given to a younger version of themselves.

Someone asked the question “If you could send an anonymous text to yourself 5 years ago, what would you write?” on reddit. Naturally I was interested in the replies. You can see this thread in the following link. Text from the future thread – reddit

The few short words from the responses stuck out as a mixture of real, sad, funny, and crazy. Think about the question for yourself. What would you text the younger you from five years ago. Maybe nothing important. Maybe the only thing that has ever mattered. These few, brief words provide a portal backwards into time. Each word crtitical. A half decade’s worth of knowledge and advice tailored specifically for you. How powerful. How truthful. Maybe painful. Maybe funny. Maybe some other emotion. Or none at all.

I went through about 2,000 of these comments to find which specific individual words had the most meaning for the people who cared to respond to the question. I’ll go over the process for anyone who is interested in doing this with similar data. It’s a pretty inefficient process as it uses Excel and the whole process can be automated but it’s listed here regardless.

  1. Copy and paste the data to Excel.
  2. Manually delete rows of data that are not appropriate. Many of the rows were blanks or included only the username and did not contain the responses so I deleted these.
  3. Parse out the individual words from the responses using a word frequency macro. Excel word frequency macro
  4. Use a stopword list to remove the most commonly used words (a, about, above, … , your, yours, z) that likely do not have any impact on the words we are interested in. Stop word list
  5. Manually go through the list of words and remove words that seemed unimportant (Ago, Didn’t, Doesn’t, Doing, Five, He’s, I’d, I’m, Isn’t, It’ll, Lot, Message, Oh, Send, She’s, Tell, Text, Wouldn’t, You’ll, You’re, Yourself, You’ve)
  6. Use an online word cloud tool Word cloud tool

If you are working with larger data then I would advise you to look into some tools specific for the job. There are plenty of online word cloud generators, such as the one linked above, that you can paste an entire text into. This removes the Excel work and makes generating word clouds pretty much instantaneous. For me it was only a couple minutes of extra work and I had complete control over the end result so the trade off seemed worth it.

The end result is the following:

Words from the future
Words from the future

The top 100 words and the number of their occurrences are included here:

  • Don’t: 724
  • Time: 162
  • Life: 147
  • Stop: 145
  • Buy: 116
  • Love: 111
  • School: 96
  • Fucking: 93
  • Stay: 81
  • Fuck: 79
  • Shit: 78
  • Won’t: 77
  • Job: 75
  • Start: 74
  • Girl: 71
  • Million: 70
  • Money: 70
  • College: 68
  • Leave: 64
  • Trust: 57
  • Roll: 56
  • Worth: 56
  • Friends: 55
  • Move: 53
  • Try: 52
  • People: 51
  • Date: 50
  • Save: 50
  • Lottery: 47
  • Break: 46
  • Gonna: 45
  • Quit: 45
  • Meet: 44
  • Bitch: 43
  • Actually: 42
  • Future: 42
  • Regret: 41
  • Bitcoin: 40
  • Guy: 39
  • Spend: 39
  • Help: 38
  • Look: 38
  • Bitcoins: 36
  • Probably: 36
  • Sell: 36
  • Day: 35
  • Change: 34
  • Friend: 34
  • Hard: 34
  • Dad: 33
  • Listen: 33
  • Invest: 32
  • Dump: 31
  • Home: 31
  • Winning: 30
  • Happy: 29
  • Little: 29
  • Lose: 29
  • Girlfriend: 28
  • House: 28
  • Late: 28
  • Waste: 28
  • Believe: 27
  • Care: 27
  • Crazy: 27
  • Feel: 27
  • Marry: 27
  • Worry: 27
  • Yes: 27
  • Family: 26
  • Please: 26
  • Relationship: 26
  • Study: 26
  • Talk: 26
  • Worse: 26
  • Idiot: 25
  • Live: 25
  • Mom: 25
  • Months: 25
  • That’s: 25
  • Bad: 24
  • Drinking: 24
  • Instead: 24
  • Play: 24
  • Stock: 24
  • Ass: 23
  • Past: 23
  • Ruin: 23
  • Trying: 23
  • Car: 22
  • Class: 22
  • Forget: 22
  • Seriously: 22
  • Matter: 21
  • Okay: 21
  • Own: 21
  • Can’t: 20
  • Dick: 20
  • Die: 20
  • Enjoy: 20

A mix of regret, get rich quick schemes, love, financial advice, school, work, feelings, hope, important people, relationships, mixed in with some internet language. Seems about right.

So you may not be on reddit, and you may not feel like answering, but if you could send an anonymous text to yourself 5 years ago, what would you write? Or maybe the better question is, if you received a text message today from the future you, how would you respond?


Pimp My Excel

Pimp My Excel

Wow your boss or your friends with this beautiful Excel macro.

It takes a boring Excel worksheet and pimps it out. A lot of people use color senselessly when using data, so I wanted to automate that process.

Here are a couple examples so that you can see this macro in action. Here are statistics for the New York Red Bulls. They are so boring. You won’t be able to make any convincing arguments using these stats.

NY Red Bulls Stats... Lame Sauce
NY Red Bulls Stats… Lame Sauce

Wow! Look at the following pimped out chart. Everyone will believe your arguments now.

NY Red Bulls Stats Pimperish!
NY Red Bulls Stats Pimperish!

Ugg. This income statement for Google is so boring. You can’t use this data to successfully invest in the market.

Google Income Statement... Boring
Google Income Statement… Boring

Pimperish! Now you are ready to make some bucks.

Google Income Statement Pimped Out!
Google Income Statement Pimped Out!

How to Use

Download the .bas Excel macro file of Pimp My Excel

Make sure your Excel is able to run macros. You may have to change your Excel settings to do this.

Open the Visual Editor in Excel. Do this with Alt+F11.

Right click on the project area and select Import File. Select the PimpMyExcel.bas file.

Make sure you have the sheet open in Excel that you want to pimp out.

Run the macro called PimpMyExcel.

Programming Notes

This was a pretty straightforward macro to create. The big issue I ran into was the limitations that Excel imposes on the number of font types and cell formats. Excel has a maximum limit of 512 different fonts. In Excel 2000 and later the maximum number of cell formats is approximately 4,000 different combinations and in Excel 2007 and higher the maximum number of cell formats is 64,000. In order to prevent going over these numbers I hardcoded the font colors and cell background colors in the code.

I also chose to On Error Resume Next to handle the errors as Excel continued to throw errors in regards to the cell format issues. This seems to work for most large worksheets.

Raspberry Pi 2 Model B

Raspberry Pi – Old School Video Games

The Raspberry Pi is an incredibly cool and fun little piece of hardware. I love it. I’ve wanted one for a while, and with the introduction of the new Raspberry Pi 2 Model B, I absolutely had to buy one.

How do I explain it’s coolness? Hmm. Like all good pieces of hardware let’s talk some specs. 900MHz quad-core ARM Cortex-A7. 1 GB RAM. 4 USB ports. HDMI. MicroSD. Ethernet. AUX. 40 pins providing 17x GPIO. Power. All of that comes on a board the size of a credit card. Some people might think these specs are terrible. Some might think they are amazing. The new Raspberry Pi 2 Model 2 has about as much power as a moderate smartphone. And you get it all for the wildly low price of $35.

For those who don’t deal with specs, here are just a few of the many cool projects that have been built with the Raspberry Pi.

Pi in the Sky – taking a Raspberry Pi, strapping it to a weather balloon, and launching it to the edge of space.
Make coffee – send a text message to make a cup of espresso
Time lapse video – shoot some dope time lapse that looks like this
Make a supercomputer – buy 64 of these and string them together to create a pretty powerful little supercomputer
Automated pet feeder – automatically dispense food for your pets from the internet
BeetBox – an instrument that allows users to play drum beats by touching actual beets
Car Touch Screen – install a touchscreen display in your car that stores your music, movies, pictures, etc.
Weather Station – collect data on wind speed and direction, rain, humidity, pressure, temperature, soil temperature, etc.
Blackstripes – convert a picture into a beautiful pencil drawing
Surveillance System – set up a surveillance system, record pictures, stream video, motion detection, etc.
Sync lights to music – sync your outside Christmas lights to music, sync lights in to club, etc.
Computer – this should probably be clear by now, but yes you can use it as a computer to browse the web, do photo editing in GIMP, etc.
Home Media Center YouTube, Spotify, Hulu, Netflix, Amazon VOD, HBO Go, your own movies, music, etc.

The Pi can be used in an infinite number of projects and it has some use in commercial application. Five million units have been sold. Although the Raspberry Pi Foundation created the little device to promote the teaching of basic computer science in schools, it has blown up in popularity. The community behind the Pi is immense. So even if you have no experience in programming you can probably find a step by step tutorial or the solution to your problem somewhere on the internet.

With all of these cool projects out there, I had to figure out what I first wanted to build. I figured I would start off with some old school video game emulation. It would be pretty cool to be able to play some of the old school games from my childhood on the Raspberry Pi. The process to get this up and running is pretty simple, and I’ll walk you through it here step by step.

Some hardware you will need:

  1. Raspberry Pi 2 Model B
  2. Raspberry Pi Power cord
  3. MicroSD card (I’m using SanDisk 32GB Extreme)
  4. Ethernet cable or USB WiFi dongle (I’m using the WiPi dongle)
  5. TV or monitor
  6. TV power cable
  7. HDMI cable
  8. USB Keyboard
  9. USB Mouse (not used but may be good for future products)
  10. Gaming controller (I’m using PS3 with USB wire)

A lot of these you likely have lying around the house. Once you set your Raspberry Pi up you don’t really need Ethernet, keyboard, or mouse. They are only used in the beginning to set the Pi up.

And a quick rambling before I continue. I went to Best Buy to try to get a cheap monitor. The cheapest I could find was about $90 but it didn’t have an HDMI input. The cheapest monitor with HDMI was $130. I looked for an HDMI to VGA adapter and found one for $30 dollars. I then realized something amazing. Instead of buying a computer monitor, you can just buy a cheap flatscreen tv. For $85 I picked up a 19 inch flatscreen (it was a floor model) and it came with 2x HDMI ports, VGA, Component, Antennae, Digital Output, USB, Audio Out, screws for wall mounting, speakers, and a remote control. That’s a ton of value that turns my cheap monitor into something much more versatile. Just something to consider if you are looking for a monitor and might be able to use any of the additional functionality of a tv.

There are really a million different ways to set game emulation up but this is one of the easier approaches.

We are going to use the RetroPie Project, which gives us emulators for a ton of old school gaming consoles. Emulators are a software version of a hardware gaming console. For example a Nintendo 64 emulator like Mupen64Plus let’s us play software versions of our N64 games. Just like the emulator is a piece of software that emulates the hardware console, we also need ROMs which are software versions of the physical video games. In the old days you took a cartridge or a CD and put it into a physical gaming device and played the game that way. In the modern day you install an emulator and you copy over some ROM files and you can now have multiple systems and multiple games available all on a small piece of hardware such as the Raspberry Pi. The RetroPie project includes emulators for many systems including:

  • Amiga (UAE4ALL)
  • Apple II (LinApple)
  • Atari 800 (Atari800)
  • Atari 2600 (RetroArch/Stella)
  • Atari ST/STE/TT/Falcon (Hatari)
  • Apple Macintosh (Basilisk II)
  • C64 (VICE)
  • Amstrad CPC (#CPC4Rpi)
  • Final Burn Alpha (RetroArch/PiFBA, RetroArch/FBA)
  • Game Boy (RetroArch/Gambatte)
  • Game Boy Advance (GpSP)
  • Game Boy Color (RetroArch/Gambatte)
  • Sega Game Gear (Osmose)
  • Intellivision (jzIntv)
  • MAME (RetroArch/mame4all-pi, RetroArch/mame4all)
  • MSX (openMSX)
  • PC – x86 (rpix86)
  • NeoGeo (PiFBA, GnGeo)
  • Nintendo Entertainment System (RetroArch/FCEUmm)
  • Nintendo 64 (Mupen64Plus-RPi)
  • TurboGrafx 16 – PC Engine (RetroArch/Mednafen/pce_fast)
  • Ports
  • CaveStory (RetroArch/NXEngine)
  • Doom (RetroArch/PrBoom)
  • Duke Nukem 3D (eDuke)
  • ScummVM
  • Sega Master System / Mark III (RetroArch/Picodrive, Osmose, DGen)
  • Sega Mega Drive / Genesis (RetroArch/Picodrive, DGen)
  • Sega Mega-CD / CD (RetroArch/Picodrive, DGen)
  • Sega 32X (RetroArch/Picodrive, DGen)
  • Playstation 1 (RetroArch/PCSX ReARMed)
  • Super Nintendo Entertainment System (RetroArch/Pocket SNES, snes9x-rpi)
  • Sinclair ZX Spectrum (Fuse, FBZX)

Wow. RetroPie sounds like a sweet project. Let’s go grab that. It is possible that this link will change from time to time (it already has in the last few days). We want to download the newest version of the RetroPie SD Image available for our Raspberry Pi 2 device. Download the newest version of RetroPie. If this link is out of date then you should be able to find an updated link in the RetroPie Image Download at this link.

Once the download is complete you will have a file called something like retropie-v2.6.0-rpi2.img.gz. We have to unzip this file so that we only have the .img file. On most computers you can do this by simply double clicking the file. If that does not work then you should use a program like 7-Zip or WinRAR.

At this point we have to format the MicroSD card. We can do this by using SD Card Formatter. Download this program. Insert you MicroSD card into your computer. Run the program. You should see the following screen. Click quick format, give the card a name if you want and click Format.

SD Card Formatter
SD Card Formatter

The next step is to extract the downloaded RetroPie image file to the formatted MicroSD card. For Windows use Win32 Disk Imager or for Mac use RPi-SD Card Builder. If you love your linux use the dd command.

Here is what the process looks like for Mac using RPi-SD Card Builder. You will likely have to input admin password for your Mac while installing this software.

RPi-SD Card Builder
RPi-SD Card Builder

Select your RetroPie image file that you just unzipped. Click OK on the next pop up.

Click continue
Click continue

Select your card to write the image to.

Select your SD card
Select your SD card

Click OK and wait a little while.

Time to wait
Time to wait

Oh yea. RetroPie image is installed on our MicroSD card!

Time to add the SD to our Pi
Time to add the SD to our Pi

It is now time to remove the MicroSD and insert it into the Raspberry Pi. We also want to connect the mouse, keyboard, gaming controller, and WiPi dongle to the four USB ports. If we are using Ethernet instead of the WiPi then connect the Ethernet cable from your router to your Raspberry Pi’s Ethernet port. Connect the HDMI cable from the Raspberry Pi to the TV or monitor. Connect the TV’s power cable to your power source. Select the HDMI input on the TV for your Raspberry Pi. Finally, only after everything else is connected, connect your Raspberry Pi’s power cable from the Raspberry Pi to the power source.

RetroPie connection setup
RetroPie connection setup

If you did everything correctly you should see a screen that asks you to set your controller settings. If you do not see this screen then you can try removing the power cable from the Raspberry Pi and reinserting it. Enter the appropriate buttons when the screen asks you, ie. Up, Down, Left, Right, A, B, etc. This will sync your gaming controller with the RetroPie.

RetroPie controller setup
RetroPie controller setup

Once this is complete, press F4 on your USB keyboard that is connected to your Raspberry Pi. Pressing this button will get us out of the RetroPie’s main GUI which is called the Emulation Station and into the command line so that we can change some settings.

The first command we want to run is

sudo raspi-config

Enter that command into the command line prompt as shown in this image.

Command line Linux
Command line Linux

Then press enter. You should see the following screen.

Raspberry Pi configuration tool
Raspberry Pi configuration tool

This allows us to change some settings on the Raspberry Pi. We first want to highlight Expand Filesystem and click Enter. This will ensure that all of the SD card storage is available for the operating system. Currently even though we have a 32 GB card, not all of that space is available. After clicking Enter we see a message telling us the filesystem will be enlarged at the next reboot, which we will do later.

Pressing enter returns us to the list of options. I personally don’t want to keep the stock password so click Enter on the second option. Enter a new password and press enter. Re-enter the new password and press enter. The password should change successfully.

Next we can go down to Overclock and press Enter. After the warning screen we see a screen where we can increase the performance of our Raspberry Pi. This may lead to the SD card becoming corrupted or to the Raspberry Pi unexpectedly crashing or possible failure of the Pi. I will choose to not overclock but if you want to do that then this would be the place to do it. You may find that you can get smoother gameplay and you will be able to have more processing power available to you by overclocking. Personally if I wanted a lot of power I would not by the Pi, but this is a nice option to know about.

Overclock settings
Overclock settings

Select your choice and hit enter or select cancel to get out of here. This is the last setting I would change so let’s select Finish and hit Enter. This will bring us back into the Emulation Station.

Once the Emulation Station loads, let’s hit F4 again on our USB keyboard connecting to the Raspberry Pi. If you notice towards the bottom we see a filesystem rootfs that now has 27GB available space. This has been increased over the initial amount.

We have to setup my WiPi to give the Raspberry Pi wireless internet access. Let’s enter:

sudo nano /etc/network/interfaces

and press Enter.

We should see the following in this file:

auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

If you do not see exactly this in this file then make the changes to the file until it is the same as what you see. Once the file looks exactly like this press Ctrl+X. We are asked if we want to save changes. Press Y and then press Enter to save the file.

Next let’s enter into the command line:

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

and press Enter.

We likely will see the following in this file:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev

Below that we will want to enter:


Make sure to enter the double quotes. The SSID and PSK is the name and password that come from your router. These are the same you would enter to connect your phone or computer to your wireless router. Also make sure your settings are correct based on your router. Depending on your network settings you may want to change Protocol type to RSN (for WPA2) instead of WPA (for WPA1), key to WPA-EAP instead of WPA-PSK, pairwise to CCMP (for WPA2) instead of TKIP (for WPA1), and authorization option to SHARED or LEAP instead of OPEN (used for WPA1 and WPA2). Once these settings are added correctly to the file, press Ctrl+X. You will be asked if you want to save. Press Y and then press Enter.

Back in the console type:

sudo reboot

and press Enter. This will again boot us back into the Emulation Station. Let’s press F4 again to get back into the command line. Hopefully our Raspberry Pi is now online. Let’s check that by entering:

ping -c 1

and pressing Enter.

If we did everything right then we should see something that says:

1 packets transmitted, 1 received, 0% packet loss.

If so, yay, our little Pi is on the internet. He sure is growing up fast.

At this point we need to find out the IP address of our Pi. You can do this by entering:


and pressing Enter.

Under wlan0 we should see an IP address under inet addr. This will be something like

We will need this IP for later to add ROMs to the Raspberry Pi.

So, now it’s time for us to get our ROMs. About that. So we know emulators are software versions of the hardware console. An Nintendo emulator emulates the Nintendo console and allows you to play Nintendo ROMs. ROMs are software versions of the hardware catridge game that you used to have to blow air into to get to work. Emulators are all fine and dandy, but the use of ROMs is pretty much illegal. It is illegal to download and play a Nintendo ROM from the internet. This has to do with the U.S. copyright laws that state that copyrights owned by corporations are valid for 75 years from the date of first publication. So until the copyrights expire, it is illegal to download and play ROMs.

There is one semi-exception that you often hear quoted by people supporting emulation and ROMs but it doesn’t help us much. I’ll quote Nintendo’s legal response here. “There is a good deal of misinformation on the Internet regarding the backup/archival copy exception. It is not a “second copy” rule and is often mistakenly cited for the proposition that if you have one lawful copy of a copyrighted work, you are entitled to have a second copy of the copyrighted work even if that second copy is an infringing copy. The backup/archival copy exception is a very narrow limitation relating to a copy being made by the rightful owner of an authentic game to ensure he or she has one in the event of damage or destruction of the authentic. Therefore, whether you have an authentic game or not, or whether you have possession of a Nintendo ROM for a limited amount of time, i.e. 24 hours, it is illegal to download and play a Nintendo ROM from the Internet.” Read more about the topic at Nintendo’s Legal.

So yea, legally we can’t really proceed to add ROMs that aren’t part of the public domain. There are no Nintendo, SuperNES, N64, etc. games that are part of the public domain, so to legally continue with this tutorial you have to wait 50 years or so. If you do decide to wait that long and to continue, then you will need a copy of your ROMs. You can find ROMs today all over the internet by searching on your normal laptop or desktop computer. Note that this step is done not on your Pi, but on your computer that is connected to the same network that the Raspberry Pi is on. Searching your favorite torrent site like The Pirate Bay for terms like “nes,” “snes,” “n64,” etc. will allow you to download almost all of the ROMs for a system in a single shot. Often these ROMs are saved as .zip files. You will need to unzip all of these files and then add them to a new folder containing only these unzipped files. For example you want your filenames to be .nes for NES games, .smc for SNES games, .z64 or .v64 for N64 games, etc. and not .zip. These should be saved to folders named /nes, /snes, and /n64-mupen64plus. These folder names must be named this way. The full list of folders for this version of RetroPie are:

  • amiga
  • amstradcpc
  • apple2
  • atari2600-libretro
  • atari2600-stella
  • atarilynx
  • atariststefalcon
  • c64
  • fba
  • fba-libretro
  • gamegear
  • gamegear-osmose
  • gb
  • gba
  • gbc
  • intellivision
  • macintosh
  • mame
  • mame-advmame
  • mame-artwork
  • mame-libretro
  • mame-samples
  • mastersystem
  • mastersystem-genesis
  • mastersystem-osmose
  • megadrive
  • megadrive-dgen
  • msx
  • n64
  • n64-mupen64plus
  • neogeo
  • nes
  • pc
  • pcengine
  • pcengine-libretro
  • ports
  • psx
  • scummvm
  • sega32x
  • sega32x-dgen
  • segacd
  • segacd-dgen
  • snes
  • snes-pisnes
  • snes-snes9xrpi
  • vectrex
  • zmachine
  • zxspectrum
  • zxspectrum-fbzx

To get the full list of these folders in future releases of RetroPie you can run the following command on the Raspberry Pi:

ls /home/pi/RetroPie/roms/

and pressing Enter.

If you notice, there are sometimes more than one folder for the same system. Sometimes adding a ROM to a different folder will allow it to run better. For example I had better luck running some of the N64 games in the /n64-mupen64plus folder but I also had some titles run better in the /n64 folder. You may have to move these ROMs around to get the newer systems to run.

As you can see there are many gaming systems and many games available that you would have to download and unzip if you want to move them to the Raspberry Pi.

Once the ROMs are downloaded to laptop or desktop, unzipped, and added to folders based on their console, it is time to move them over to the Raspberry Pi. On Mac this can easily be done using the scp command in Terminal. Let’s open terminal (Command+Space and then typing terminal and pressing enter) and enter the following three commands. Note that you have to replace /Users/yourname/Desktop/ with the file path of where the files are saved on your computer.

scp -v -r /Users/yourname/Desktop/nes/ pi@
scp -v -r /Users/yourname/Desktop/snes/ pi@
scp -v -r /Users/yourname/Desktop/n64-mupen64plus/ pi@

After entering the command you will be asked to enter yes or no based on your Mac not knowing the Raspberry Pi device. You can enter Yes and press Enter. You will then be prompted for the password of the Raspberry Pi that we set earlier for every folder of ROMs that you upload. If you never changed your password in the earlier step then your password is “raspberry” (do not enter the quotes) which is not the most secure of passwords.

This may take some time based on your internet speeds, especially for larger folders, so you might want to find something to pass the time.

If you don’t have a Mac or you don’t want to use the scp command, you can use a GUI based file transferring program such as FileZilla. I will show a quick example of using FileZilla because a lot of people like to avoid the command line and use visual tools like this one. Start the program. Enter your host, username, password, and port and click Quickconnect. Your host is the IP address of the Raspberry Pi that we found earlier. The username is “pi”. The password is what we changed it to, or “raspberry” if you didn’t change it (do not enter the quotes). The port number is 22. After Quickconnect is clicked you will get a message saying Unknown host key and whether you want to trust the host. Check always trust this host and click OK.

FileZilla login credentials
FileZilla login credentials

To move the files from one place to another you simply drag and drop them. Before we drag and drop let’s make it easy by opening our folder with ROMs and our emulation folder on the Raspberry Pi. This should look like this.

Select the files and drag them to the folder
Select the files and drag them to the folder

Select all of the ROM files and drag them to the empty emulator folder. Depending upon your upload speed you should see files get added to your previously blank folder like so.

Files get added after upload
Files get added after upload

When the files are finally copied from your computer you are almost ready to play.
I had to make one final change to get sound to work with an HDMI monitor. You may or may not have to do this. This is caused by some computer monitors which select DVI mode even if an HDMI cable is connected. We have to alter the Raspberry-Pi Configuration File. Let’s enter:

sudo nano /boot/config.txt

and press Enter.

We need to take the line that says:


and change it to:


by removing the # sign. Once this is done press Ctrl+X. You will be asked if you want to save. Press Y and then press Enter.

Then enter:

sudo reboot

and press Enter.

Again you may not have to do this step to get your sound to work, but it seems like you will need to do it if you are playing on an HDMI monitor with internal speakers.

Ok. Let’s try out some games. When you normally start your Raspberry Pi you will be in the Emulation Station. If you are at the command line and want to launch the Emulation Station then type:


and press Enter.

Time for some games
Time for some games

In the Emulation Station you select which console that you want to play. Note that consoles will only appear when you have ROMs installed for those consoles. Pick a game and get to playing. Here are some videos of some games running for various systems. I apologize for their terrible quality.

NES running Super Mario Brothers.

SNES running NBA Jam.

N64 running Mario Kart 64.

You may find that you have various problems with your RetroPie setup. Sometimes unplugging things and restarting can fix the problem. But if you have a serious problem that needs fixing I am sure there is a solution on the internet. If you made it through any part of this tutorial then have a little Linux command line skills. You likely can implement the fix to your problem. Google is your friend. In the worst case you can always wipe the card clean and start over from scratch.

Now that the RetroPie is up and running, I’ll hopefully be working on a more challenging Raspberry Pi project in the near future. The great thing about the Pi is you only have to take out the MicroSD card and replace it with another to have a totally different application. Feel free to drop a line if you need help.


Gatsby the Greatest

The Best Books of All Time. Classics, Tech, Business and Travel

New Year’s has come and gone. I am always trying to better my life in a variety of ways and New Year’s has always provided a good time to evaluate and adjust my actions. One of the resolutions for this year is to read more books. I don’t read many books because normally I am taking programming classes or watching tech speeches, etc. So I have decided to read a book a month in the New Year to further my learning.

In deciding what to read I initially asked some friends for recommendations. I also decided to search through various best book lists and come up with a list of my own. I came up with the following list using the following methodologies. First I searched Google for “best books of all time” and took all of the results from the first three pages and combined them into one massive list. I assigned a ranking so that books that appeared higher on the list were ranked higher, books that appeared on smaller lists were given a higher weighting, and books that appeared on unranked lists were given an average ranking. Doing something as trivial as this sure makes you appreciate Tim Berners-Lee’s push for the Semantic Web. A bunch of Excel formatting and some basic find and replaces got me the results without too much trouble, although I was tempted to crack out some regex’s to handle this. Overall the rankings for the 100 best books of all time are as follows.

  1. The Great Gatsby by F Scott Fitzgerald
  2. Lolita by Vladimir Nabokov
  3. 1984 by George Orwell
  4. The Catcher in the Rye by J D Salinger
  5. Ulysses by James Joyce
  6. The Sound and the Fury by William Faulkner
  7. The Grapes of Wrath by John Steinbeck
  8. To Kill A Mockingbird by Harper Lee
  9. Catch-22 by Joseph Heller
  10. One Hundred Years of Solitude by Gabriel Garcia Marquez
  11. Moby-Dick by Herman Melville
  12. The Lord of the Rings by J R R Tolkien
  13. The Adventures of Huckleberry Finn by Mark Twain
  14. Pride and Prejudice by Jane Austen
  15. Anna Karenina by Leo Tolstoy
  16. Invisible Man by Ralph Ellison
  17. Beloved by Toni Morrison
  18. Crime and Punishment by Fyodor Dostoevsky
  19. Don Quixote by Miguel de Cervantes
  20. War and Peace by Leo Tolstoy
  21. To the Lighthouse by Virginia Woolf
  22. Brave New World by Aldous Huxley
  23. Wuthering Heights by Emily Bronte
  24. Heart of Darkness by Joseph Conrad
  25. Jane Eyre by Charlotte Bronte
  26. Great Expectations by Charles Dickens
  27. The Hobbit by J R R Tolkien
  28. Slaughterhouse-Five by Kurt Vonnegut
  29. Animal Farm by George Orwell
  30. In Search of Lost Time by Marcel Proust
  31. Lord of the Flies by William Golding
  32. The Sun Also Rises by Ernest Hemingway
  33. Gone with the Wind by Margaret Mitchell
  34. A Portrait of the Artist as a Young Man by James Joyce
  35. Madame Bovary by Gustave Flaubert
  36. The Name of the Rose by Umberto Eco
  37. Mrs Dalloway by Virginia Woolf
  38. The Lion the Witch and the Wardrobe by C S Lewis
  39. On the Road by Jack Kerouac
  40. Middlemarch by George Eliot
  41. And Then There Were None by Agatha Christie
  42. The Little Prince by Antoine de Saint-Exupery
  43. Charlotte’s Web by E B White
  44. Alice’s Adventures in Wonderland by Lewis Carroll
  45. The Big Sleep by Raymond Chandler
  46. A Passage to India by E M Forster
  47. The Trial by Franz Kafka
  48. The Diary of a Young Girl by Anne Frank
  49. Absalom Absalom! by William Faulkner
  50. The Stranger by Albert Camus
  51. Tom Jones by Henry Fielding
  52. Pale Fire by Vladimir Nabokov
  53. The Portrait of a Lady by Henry James
  54. David Copperfield by Charles Dickens
  55. Frankenstein by Mary Shelley
  56. The Murder of Roger Ackroyd by Agatha Christie
  57. Tristram Shandy by Laurence Sterne
  58. Native Son by Richard Wright
  59. Things Fall Apart by Chinua Achebe
  60. The Long Goodbye by Raymond Chandler
  61. A Tale of Two Cities by Charles Dickens
  62. Robinson Crusoe by Daniel Defoe
  63. A Clockwork Orange by Anthony Burgess
  64. The Brothers Karamazov by Fyodor Dostoevsky
  65. Rebecca by Daphne du Maurier
  66. Emma by Jane Austen
  67. The Maltese Falcon by Dashiell Hammett
  68. Midnight’s Children by Salman Rushdie
  69. Of Mice and Men by John Steinbeck
  70. The Scarlet Letter by Nathaniel Hawthorne
  71. Under the Volcano by Malcolm Lowry
  72. The Moonstone by Wilkie Collins
  73. The Ambassadors by Henry James
  74. As I Lay Dying by William Faulkner
  75. Silent Spring by Rachel Carson
  76. One Flew Over the Cuckoo’s Nest by Ken Kesey
  77. A Room of One’s Own by Virginia Woolf
  78. The Hound of the Baskervilles by Arthur Conan Doyle
  79. A Wrinkle in Time by Madeleine L’Engle
  80. The Hitchhiker’s Guide to the Galaxy by Douglas Adams
  81. Hamlet by William Shakespeare
  82. The Odyssey by Homer
  83. Les Miserables by Victor Hugo
  84. Portnoy’s Complaint by Philip Roth
  85. The Spy Who Came In From the Cold by John le Carre
  86. For Whom the Bell Tolls by Ernest Hemingway
  87. The Wind in the Willows by Kenneth Grahame
  88. Their Eyes Were Watching God by Zora Neale Hurston
  89. The Daughter of Time by Josephine Tey
  90. Gulliver’s Travels by Jonathan Swift
  91. In Cold Blood by Truman Capote
  92. Tales of Edgar Allan Poe by Edgar Allan Poe
  93. The Divine Comedy by Dante Alighieri
  94. The Magic Mountain by Thomas Mann
  95. Dune by Frank Herbert
  96. Journey to the End of the Night by Louis-Ferdinand Celine
  97. The Iliad by Homer
  98. The Idiot by Fyodor Dostoevsky
  99. The stories of Anton Chekhov by Anton Chekhov
  100. Go Tell It on the Mountain by James Baldwin

This list really represents an average of the top “Best Books of All Time” lists that show up in Google. You will notice there is no prejudice to separating fiction and non-fiction or restriction to books based on appropriate reading age. This is appropriate to me as fiction and non-fiction often have very blurred lines and differentiation between child and adult is sometimes as often blurred. The list has a lot of interesting results and it will be useful in helping me select which books to read. This is a great example of the power of the concept of averages.

Authors that appeared the most in my results are as follows.

  1. William Faulkner
  2. Ernest Hemingway
  3. George Orwell
  4. Charles Dickens
  5. Vladimir Nabokov
  6. James Joyce
  7. Virginia Woolf
  8. Fyodor Dostoevsky
  9. Leo Tolstoy
  10. F Scott Fitzgerald
  11. Joseph Conrad
  12. J K Rowling
  13. Henry James
  14. J R R Tolkien
  15. J D Salinger
  16. Raymond Chandler
  17. John Steinbeck
  18. Agatha Christie
  19. Jane Austen
  20. Toni Morrison
  21. Mark Twain
  22. Joseph Heller
  23. Franz Kafka

I decided to also calculate the top books based on some genres that I am interested in by searching “best programming book of all time,” “best travel book of all time,” etc. in Google and taking the first page of results and summarizing. This led to the following lists.

For travel:

  1. The Great Railway Bazaar by Paul Theroux
  2. In Patagonia by Bruce Chatwin
  3. Travels with Charley: In Search of America by John Steinbeck
  4. Great Plains by Ian Frazier
  5. On the Road by Jack Kerouac
  6. The Beach by Alex Garland
  7. In a Sunburned Country by Bill Bryson
  8. The Sun Also Rises by Ernest Hemingway
  9. A Short Walk in the Hindu Kush by Eric Newby
  10. Arabian Sands by Wilfred Thesiger
  11. Fear and Loathing in Las Vegas by Hunter S Thompson
  12. Desert Solitaire by Edward Abbey
  13. Into the Wild by Jon Krakauer
  14. As I Walked Out One Midsummer Morning by Laurie Lee
  15. Coasting by Jonathan Raban
  16. Notes From a Small Island by Bill Bryson
  17. Homage to Catalonia by George Orwell
  18. Daughter of Fortune by Isabel Allende
  19. The Talented Mr Ripley by Patricia Highsmith
  20. The Worst Journey in the World by Apsley Cherry-Garrard

For computers and programming:

  1. The Art of Computer Programming by Donald E Knuth
  2. The Pragmatic Programmer: From Journeyman to Master by Andrew Hunt and David Thomas
  3. Introduction to Algorithms by Thomas H Cormen, Charles E Leiserson, Ronald L Rivest and Clifford Stein
  4. Code Complete by Steve McConnell
  5. The Mythical Man-Month: Essays on Software Engineering by Frederick P Brooks
  6. The C Programming Language by Brian Kernighan and Dennis Ritchie
  7. Refactoring: Improving the Design of Existing Code by Martin Fowler, Kent Beck, John Brant, William Opdyke and Don Roberts
  8. Structure and Interpretation of Computer Programs by Harold Abelson, Gerald J Sussman and Julie Sussman
  9. Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides (The Gang of Four)
  10. Patterns of Enterprise Application Architecture by Martin Fowler
  11. Peopleware: Productive Projects and Teams by Tom DeMarco and Timothy Lister
  12. Programming Pearls by Jon Bentley
  13. The Soul of a New Machine by Tracy Kidder
  14. Hackers: Heroes of the Computer Revolution by Steven Levy
  15. CODE: The Hidden Language of Computer Hardware and Software by Charles Petzold
  16. Head First Design Patterns by Elisabeth Freeman, Eric Freeman, Bert Bates and Kathy Sierra
  17. Rapid Development by Steve McConnell
  18. Working Effectively with Legacy Code by Michael C Feathers
  19. Modern Operating Systems by Andrew S Tanenbaum
  20. Clean Code: A Handbook of Agile Software Craftsmanship by Robert C Martin
  21. Gödel, Escher, Bach: An Eternal Golden Braid by Douglas Hofstadter
  22. Test Driven Development: By Example by Kent Beck
  23. Coders at Work: Reflections on the Craft of Programming by Peter Seibel
  24. The Inmates Are Running The Asylum: Why High Tech Products Drive Us Crazy and How to Restore the Sanity by Alan Cooper
  25. Clean Code by Robert Martin
  26. Don’t Make Me Think: A Common Sense Approach to Web Usability by Steve Krug
  27. Apprenticeship Patterns by Dave Hoover
  28. DOS for Dummies by Dan Gookin
  29. The Road Ahead by Bill Gates
  30. The Unified Modeling Language Reference Manual by Grady Booch, James Rumbaugh and Ivar Jacobson

For business and entrepreneur:

  1. How to Win Friends and Influence People by Dale Carnegie
  2. The 4-Hour Workweek by Timothy Ferriss
  3. The Lean Startup by Eric Ries
  4. Rework by Jason Fried
  5. The Innovator’s Dilemma by Clayton M Christensen
  6. The E-Myth Revisited: Why Most Small Businesses Don’t Work and What to Do About It by Michael E Gerber
  7. Good to Great by Jim Collins
  8. Influence: The Psychology of Persuasion by Robert B Cialdini
  9. Purple Cow by Seth Godin
  10. Think and Grow Rich by Napoleon Hill
  11. The Four Steps to the Epiphany by Steve Blank
  12. Choose Yourself! by James Altucher
  13. Outliers by Malcolm Gladwell
  14. Mastery by Robert Greene
  15. Crush It! by Gary Vaynerchuck
  16. Delivering Happiness by Tony Hseih
  17. The 7 Habits of Highly Effective People by Stephen Covey
  18. First Break all the Rules by Marcus Buckingham
  19. The Effective Executive by Peter Drucker
  20. Out of the Crisis by W Edwards Deming
  21. The Goal: A Process of Ongoing Improvement by Eliyahu M Goldratt
  22. My Years with General Motors by Alfred P Sloan Jr
  23. The Hard Thing About Hard Things by Ben Horowitz
  24. The Fountainhead by Ayn Rand
  25. The Alchemist by Paulo Coelho
  26. The War of Art: Break Through the Blocks and Win Your Inner Creative Battles by Steven Pressfield
  27. Founders at Work by Jessica Livingston
  28. The $100 Startup by Chris Guillebeau
  29. Business Model Generation by Alexander Osterwalder
  30. The Millionaire Fastlane by MJ DeMarco

For technology and engineering:

  1. To Engineer Is Human: The Role of Failure in Successful Design by Henry Petroski
  2. The Soul of a New Machine by Tracey Kidder
  3. Steve Jobs by Walter Isaacson
  4. The Innovator’s Dilemma by Clayton Christensen
  5. Hackers: Heroes of the Computer Revolution by Steven Levy
  6. The Facebook Effect: The Inside Story of the Company That is Connecting the World by David Kirkpatrick
  7. The Existential Pleasures of Engineering by Samuel C Florman
  8. Accidental Empires by Robert X Cringely
  9. The New New Thing: A Silicon Valley Story by Michael Lewis
  10. The Chip: How Two Americans Invented the Microchip and Launched a Revolution by T R Reid
  11. The Second Machine Age: Work Progress and Prosperity in a Time of Brilliant Technologies by Erik Brynjolfsson
  12. The Path Between the Seas: The Creation of the Panama Canal 1870-1914 by David McCullough
  13. Inviting Disaster: Lessons From the Edge of Technology by James R Chiles
  14. The Essential Engineer: Why Science Alone Will Not Solve Our Global Problems by Henry Petroski
  15. Why Buildings Stand Up: The Strength of Architecture from the Pyramids to the Skyscraper by Mario Salvadori
  16. The World is Flat: A Brief History of the 21st Century by Thomas Friedman
  17. The Long Tail: Why the Future of Business is Selling Less of More by Chris Anderson
  18. Outliers: the Story of Success by Malcolm Gladwell
  19. Brunelleschi’s Dome: How a Renaissance Genius Reinvented Architecture by Ross King
  20. The Mythical Man-Month: Essays on Software Engineering by Frederick P Brooks Jr

Overall I am pretty happy to have some good reading lists that are fairly unbiased and reflect the popular opinion of the average. Of course I won’t read each book directly in order and I likely will read books outside of these lists, but I will use these lists as tools and pick and choose books that are of interest or of potential benefit to me to read throughout the year.

Once I tackle enough of these books I’ll likely look into poetry, plays, and the best books from many of the world’s cultures that are severely unrepresented in these lists.

I hope everyone has a great new year.

Why I needed a macro lens

Joe’s Postcards, a WooCommerce Site

After building a big time website on the Magento eCommerce platform, I wanted to build a smaller eCommerce site using a platform suited more for an individual or small business. After researching the platforms that were available, I determined that WooCommerce had the best combination of costs and features. WooCommerce is a plugin for WordPress, a content management system that I have worked on in the past. My intention for this project wasn’t to build another WordPress website. I was hoping to get some experience with a new technology, but with such a large percentage of websites running WordPress I was willing to go through the development process again.

Since this website would not be getting massive amounts of traffic, a small hosting plan such as Digital Ocean’s $5 per month for 512MB RAM and 20GB SSD is a reasonable option. I added it to my hosting account and got to installing the LAMP stack of Linux, the Apache HTTP Server, the MySQL relational database management system, and the PHP programming language. Once that was setup I installed WordPress. WordPress is a free and open source content management system that many people use to create blogs, although it is capable of making some great websites. After WordPress was installed I installed the WooCommerce plugin. At this point I pretty much had an eCommerce store minus all of the content and styling.

The website I would be building was a website for my dad to sell postcards on. The site would be very simple. There would be a home page to welcome the user, a store, cart, checkout, account login, and a contact page. The simplicity was great but it left me with a single opportunity to translate the postcard onto the digital screen in a way that was personal. I tried to accomplish this in several different ways, the first being to open up the website with a lot of whitespace.

Although the stock WooCommerce theme is usable, there are many changes that I wanted to make to the design. I debated whether to completely develop my own theme or use one of the many themes that were already available, several of which were free. I thought the Klasik framework theme and the Mystile theme were both a good starting point. I liked the Mystile theme, which can be seen below. I was looking for a theme that was open and had a lot of whitespace and had a responsive design that would adapt to tablets and cell phones.

Stock Mystile WooCommerce theme
Stock Mystile WooCommerce theme

I ended up choosing the Klasik framework because I thought it would allow me to make the fewest changes while accomplishing the look that I was going for. I installed the theme and got to work customizing the theme. This is what the Klasik framework looks like out of the box.

Stock Klasik WooCommerce framework
Stock Klasik WooCommerce framework

I created a logo. It’s a postcard that has “Joe’s postcards” in a script font called PlumBAL. The green stamp in the upper right corner is a nod to the one-cent Benjamin Franklin stamp from the Series of 1902 (Second Bureau Issue) stamps. While I was looking through the postcards for inspiration for the design of the website, I noticed this green Ben Franklin stamp appear many times. The date of this stamp also coincides with the golden age of postcards, the time during the early 1900’s that many post card collectors agree is the age when the best and most desirable post cards were created. It’s definitely a stretch that anyone unfamiliar with postcards will ever be able to notice the meaning of this color green for the stamp, but hopefully some experienced post card collectors may get the reference.

Series of 1902, Second Bureau Issue stamps
Series of 1902, Second Bureau Issue stamps

While I was going through the post cards I realized that I wanted to represent them on the screen in a way that captured depth and texture and evoked emotion from people who might not be familiar with post cards. To me post cards are very personal. They are pieces of paper that contain lovely little messages between loved ones, often those traveling to new places and having some of the greatest times of their lives. When picking out post cards to photograph for the site I was equally drawn to the handwritten sides as I was the sides with pictures. Postcards are intimate pieces of paper and ink and I wanted to convey that on the screen. I realized I would need an appropriate camera lens to capture this and I purchased a Tamron 90mm f/2.8 macro lens for a sweet deal.

Why I needed a macro lens
Why I needed a macro lens

The images on post cards can evoke certain emotions based on the location they are from or the moment they celebrate. There are many good post cards for the holidays so I wanted to have a slider on the main page that had appropriate holiday images for the holidays. I set up a slider and used some PHP to automatically change the images based on what season it was. Pumpkins for Thanksgiving, soldiers for Veteran’s Day, turkeys for Thanksgiving, and neutral images for when neither holiday was close.

Holiday themed home page
Holiday themed home page

The storefront that wanted for the post cards had to include some detail about the image and the image of the card itself. I thought about several ways to display this. Postcards are very visual so I considered making the store to be dominantly visual and only include text details after hovering over the images. I decided against this because I wanted to give the store a more standard look. I didn’t want anyone to get frustrated with an unfamiliar layout and abandon the shopping page. The right side of the shop has a product category list and a search box that the shopper can use to find specific cards. There is also a sorter at the top so that the shopper can sort by newest card or price.

Familiar store front
Familiar store front

Once a user clicks on an item, a larger image is visible along with a longer description.

Cool cat postcard
Cool cat postcard

The image can be clicked on again for a full screen view to show high detail, which is something that is necessary for a lot of buyers of post cards. The product categories and search bar are still available from this page. A related products section displays below the item.


The rest of the site is basic and simple. The cart and checkout are easy to use and standard as to what you might see on many other sites.

Checkout page
Checkout page

The shopper has an option of creating an account with the site. If the shopper does sign up for an account then they will be able to login to check order status and set addresses for faster payment in future transactions. A contact page is very simple. There is a form that the shopper can fill out to send an email to the owner of the site.

Contact page
Contact page

Emails are automatically sent to buyers throughout the order process via a simple email server and settings in WooCommerce. Payment is accepted via credit card or PayPal via the PayPal payment gateway.

There were large differences between building an eCommerce site on Magento and WordPress WooCommerce. Magento takes a lot longer, is more programming intensive, a lot more money to develop and maintain, but it provides much more flexibility and power for selling online. Still the WooCommerce plug in has enough power to create a beautiful site that is more than capable for an individual to small business to sell product through. Companies such as Harley Davidson, New Balance, Cosmopolitan, and Entrepreneur all use WooCommerce to sell their products online. There are stories of businesses running tens or hundreds of thousands of products on WooCommerce, of course on the right hardware to manage that storage and bandwidth. WooCommerce might be fast, cheap, and “only a WordPress plug-in” but it is plenty capable and often suitable for many businesses that decide to use a much more expensive and complex platform such as Magento.

You can check out the final website at Joe’s Postcards.