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.
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.
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.
Name of the company
A single sentence, almost like a slogan, giving you the slightest idea of what this is all about
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.
A way to contact me
I want these four things in the center of the website, both vertically and horizontally.
A font that plays off of the digital theme.
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.
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 digitalzaza.com 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.
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.
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.
Copy and paste the data to Excel.
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.
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
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)
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:
The top 100 words and the number of their occurrences are included here:
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?
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.
Wow! Look at the following pimped out chart. Everyone will believe your arguments now.
Ugg. This income statement for Google is so boring. You can’t use this data to successfully invest in the market.
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.
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.
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:
Raspberry Pi 2 Model B
Raspberry Pi Power cord
MicroSD card (I’m using SanDisk 32GB Extreme)
Ethernet cable or USB WiFi dongle (I’m using the WiPi dongle)
TV or monitor
TV power cable
USB Mouse (not used but may be good for future products)
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:
Apple II (LinApple)
Atari 800 (Atari800)
Atari 2600 (RetroArch/Stella)
Atari ST/STE/TT/Falcon (Hatari)
Apple Macintosh (Basilisk II)
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)
MAME (RetroArch/mame4all-pi, RetroArch/mame4all)
PC – x86 (rpix86)
NeoGeo (PiFBA, GnGeo)
Nintendo Entertainment System (RetroArch/FCEUmm)
Nintendo 64 (Mupen64Plus-RPi)
TurboGrafx 16 – PC Engine (RetroArch/Mednafen/pce_fast)
Duke Nukem 3D (eDuke)
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.
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.
Select your RetroPie image file that you just unzipped. Click OK on the next pop up.
Select your card to write the image to.
Click OK and wait a little while.
Oh yea. RetroPie image is installed on our MicroSD card!
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.
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.
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
Enter that command into the command line prompt as shown in this image.
Then press enter. You should see the following screen.
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.
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:
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.
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:
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 google.com
and pressing Enter.
If we did everything right then we should see something that says:
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 192.168.1.4.
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:
To get the full list of these folders in future releases of RetroPie you can run the following command on the Raspberry Pi:
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.
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.
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 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.
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.
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.
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.
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.
The Great Gatsby by F Scott Fitzgerald
Lolita by Vladimir Nabokov
1984 by George Orwell
The Catcher in the Rye by J D Salinger
Ulysses by James Joyce
The Sound and the Fury by William Faulkner
The Grapes of Wrath by John Steinbeck
To Kill A Mockingbird by Harper Lee
Catch-22 by Joseph Heller
One Hundred Years of Solitude by Gabriel Garcia Marquez
Moby-Dick by Herman Melville
The Lord of the Rings by J R R Tolkien
The Adventures of Huckleberry Finn by Mark Twain
Pride and Prejudice by Jane Austen
Anna Karenina by Leo Tolstoy
Invisible Man by Ralph Ellison
Beloved by Toni Morrison
Crime and Punishment by Fyodor Dostoevsky
Don Quixote by Miguel de Cervantes
War and Peace by Leo Tolstoy
To the Lighthouse by Virginia Woolf
Brave New World by Aldous Huxley
Wuthering Heights by Emily Bronte
Heart of Darkness by Joseph Conrad
Jane Eyre by Charlotte Bronte
Great Expectations by Charles Dickens
The Hobbit by J R R Tolkien
Slaughterhouse-Five by Kurt Vonnegut
Animal Farm by George Orwell
In Search of Lost Time by Marcel Proust
Lord of the Flies by William Golding
The Sun Also Rises by Ernest Hemingway
Gone with the Wind by Margaret Mitchell
A Portrait of the Artist as a Young Man by James Joyce
Madame Bovary by Gustave Flaubert
The Name of the Rose by Umberto Eco
Mrs Dalloway by Virginia Woolf
The Lion the Witch and the Wardrobe by C S Lewis
On the Road by Jack Kerouac
Middlemarch by George Eliot
And Then There Were None by Agatha Christie
The Little Prince by Antoine de Saint-Exupery
Charlotte’s Web by E B White
Alice’s Adventures in Wonderland by Lewis Carroll
The Big Sleep by Raymond Chandler
A Passage to India by E M Forster
The Trial by Franz Kafka
The Diary of a Young Girl by Anne Frank
Absalom Absalom! by William Faulkner
The Stranger by Albert Camus
Tom Jones by Henry Fielding
Pale Fire by Vladimir Nabokov
The Portrait of a Lady by Henry James
David Copperfield by Charles Dickens
Frankenstein by Mary Shelley
The Murder of Roger Ackroyd by Agatha Christie
Tristram Shandy by Laurence Sterne
Native Son by Richard Wright
Things Fall Apart by Chinua Achebe
The Long Goodbye by Raymond Chandler
A Tale of Two Cities by Charles Dickens
Robinson Crusoe by Daniel Defoe
A Clockwork Orange by Anthony Burgess
The Brothers Karamazov by Fyodor Dostoevsky
Rebecca by Daphne du Maurier
Emma by Jane Austen
The Maltese Falcon by Dashiell Hammett
Midnight’s Children by Salman Rushdie
Of Mice and Men by John Steinbeck
The Scarlet Letter by Nathaniel Hawthorne
Under the Volcano by Malcolm Lowry
The Moonstone by Wilkie Collins
The Ambassadors by Henry James
As I Lay Dying by William Faulkner
Silent Spring by Rachel Carson
One Flew Over the Cuckoo’s Nest by Ken Kesey
A Room of One’s Own by Virginia Woolf
The Hound of the Baskervilles by Arthur Conan Doyle
A Wrinkle in Time by Madeleine L’Engle
The Hitchhiker’s Guide to the Galaxy by Douglas Adams
Hamlet by William Shakespeare
The Odyssey by Homer
Les Miserables by Victor Hugo
Portnoy’s Complaint by Philip Roth
The Spy Who Came In From the Cold by John le Carre
For Whom the Bell Tolls by Ernest Hemingway
The Wind in the Willows by Kenneth Grahame
Their Eyes Were Watching God by Zora Neale Hurston
The Daughter of Time by Josephine Tey
Gulliver’s Travels by Jonathan Swift
In Cold Blood by Truman Capote
Tales of Edgar Allan Poe by Edgar Allan Poe
The Divine Comedy by Dante Alighieri
The Magic Mountain by Thomas Mann
Dune by Frank Herbert
Journey to the End of the Night by Louis-Ferdinand Celine
The Iliad by Homer
The Idiot by Fyodor Dostoevsky
The stories of Anton Chekhov by Anton Chekhov
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.
F Scott Fitzgerald
J K Rowling
J R R Tolkien
J D Salinger
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.
The Great Railway Bazaar by Paul Theroux
In Patagonia by Bruce Chatwin
Travels with Charley: In Search of America by John Steinbeck
Great Plains by Ian Frazier
On the Road by Jack Kerouac
The Beach by Alex Garland
In a Sunburned Country by Bill Bryson
The Sun Also Rises by Ernest Hemingway
A Short Walk in the Hindu Kush by Eric Newby
Arabian Sands by Wilfred Thesiger
Fear and Loathing in Las Vegas by Hunter S Thompson
Desert Solitaire by Edward Abbey
Into the Wild by Jon Krakauer
As I Walked Out One Midsummer Morning by Laurie Lee
Coasting by Jonathan Raban
Notes From a Small Island by Bill Bryson
Homage to Catalonia by George Orwell
Daughter of Fortune by Isabel Allende
The Talented Mr Ripley by Patricia Highsmith
The Worst Journey in the World by Apsley Cherry-Garrard
For computers and programming:
The Art of Computer Programming by Donald E Knuth
The Pragmatic Programmer: From Journeyman to Master by Andrew Hunt and David Thomas
Introduction to Algorithms by Thomas H Cormen, Charles E Leiserson, Ronald L Rivest and Clifford Stein
Code Complete by Steve McConnell
The Mythical Man-Month: Essays on Software Engineering by Frederick P Brooks
The C Programming Language by Brian Kernighan and Dennis Ritchie
Refactoring: Improving the Design of Existing Code by Martin Fowler, Kent Beck, John Brant, William Opdyke and Don Roberts
Structure and Interpretation of Computer Programs by Harold Abelson, Gerald J Sussman and Julie Sussman
Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides (The Gang of Four)
Patterns of Enterprise Application Architecture by Martin Fowler
Peopleware: Productive Projects and Teams by Tom DeMarco and Timothy Lister
Programming Pearls by Jon Bentley
The Soul of a New Machine by Tracy Kidder
Hackers: Heroes of the Computer Revolution by Steven Levy
CODE: The Hidden Language of Computer Hardware and Software by Charles Petzold
Head First Design Patterns by Elisabeth Freeman, Eric Freeman, Bert Bates and Kathy Sierra
Rapid Development by Steve McConnell
Working Effectively with Legacy Code by Michael C Feathers
Modern Operating Systems by Andrew S Tanenbaum
Clean Code: A Handbook of Agile Software Craftsmanship by Robert C Martin
Gödel, Escher, Bach: An Eternal Golden Braid by Douglas Hofstadter
Test Driven Development: By Example by Kent Beck
Coders at Work: Reflections on the Craft of Programming by Peter Seibel
The Inmates Are Running The Asylum: Why High Tech Products Drive Us Crazy and How to Restore the Sanity by Alan Cooper
Clean Code by Robert Martin
Don’t Make Me Think: A Common Sense Approach to Web Usability by Steve Krug
Apprenticeship Patterns by Dave Hoover
DOS for Dummies by Dan Gookin
The Road Ahead by Bill Gates
The Unified Modeling Language Reference Manual by Grady Booch, James Rumbaugh and Ivar Jacobson
For business and entrepreneur:
How to Win Friends and Influence People by Dale Carnegie
The 4-Hour Workweek by Timothy Ferriss
The Lean Startup by Eric Ries
Rework by Jason Fried
The Innovator’s Dilemma by Clayton M Christensen
The E-Myth Revisited: Why Most Small Businesses Don’t Work and What to Do About It by Michael E Gerber
Good to Great by Jim Collins
Influence: The Psychology of Persuasion by Robert B Cialdini
Purple Cow by Seth Godin
Think and Grow Rich by Napoleon Hill
The Four Steps to the Epiphany by Steve Blank
Choose Yourself! by James Altucher
Outliers by Malcolm Gladwell
Mastery by Robert Greene
Crush It! by Gary Vaynerchuck
Delivering Happiness by Tony Hseih
The 7 Habits of Highly Effective People by Stephen Covey
First Break all the Rules by Marcus Buckingham
The Effective Executive by Peter Drucker
Out of the Crisis by W Edwards Deming
The Goal: A Process of Ongoing Improvement by Eliyahu M Goldratt
My Years with General Motors by Alfred P Sloan Jr
The Hard Thing About Hard Things by Ben Horowitz
The Fountainhead by Ayn Rand
The Alchemist by Paulo Coelho
The War of Art: Break Through the Blocks and Win Your Inner Creative Battles by Steven Pressfield
Founders at Work by Jessica Livingston
The $100 Startup by Chris Guillebeau
Business Model Generation by Alexander Osterwalder
The Millionaire Fastlane by MJ DeMarco
For technology and engineering:
To Engineer Is Human: The Role of Failure in Successful Design by Henry Petroski
The Soul of a New Machine by Tracey Kidder
Steve Jobs by Walter Isaacson
The Innovator’s Dilemma by Clayton Christensen
Hackers: Heroes of the Computer Revolution by Steven Levy
The Facebook Effect: The Inside Story of the Company That is Connecting the World by David Kirkpatrick
The Existential Pleasures of Engineering by Samuel C Florman
Accidental Empires by Robert X Cringely
The New New Thing: A Silicon Valley Story by Michael Lewis
The Chip: How Two Americans Invented the Microchip and Launched a Revolution by T R Reid
The Second Machine Age: Work Progress and Prosperity in a Time of Brilliant Technologies by Erik Brynjolfsson
The Path Between the Seas: The Creation of the Panama Canal 1870-1914 by David McCullough
Inviting Disaster: Lessons From the Edge of Technology by James R Chiles
The Essential Engineer: Why Science Alone Will Not Solve Our Global Problems by Henry Petroski
Why Buildings Stand Up: The Strength of Architecture from the Pyramids to the Skyscraper by Mario Salvadori
The World is Flat: A Brief History of the 21st Century by Thomas Friedman
The Long Tail: Why the Future of Business is Selling Less of More by Chris Anderson
Outliers: the Story of Success by Malcolm Gladwell
Brunelleschi’s Dome: How a Renaissance Genius Reinvented Architecture by Ross King
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.
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.
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.
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.
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.
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.
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.
Once a user clicks on an item, a larger image is visible along with a longer description.
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.
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.
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.