Author - Web Developer - Educator
Found 7 results for tag "linux"
RSS Feed

My Journey into Git

Git logo

My Journey

My journey to discovering git was not an easy one. Since git was not covered in my formal programming lessons, I had to learn "version control" the hard way - the very hard way.

When I started learning HTML back in 2001, I learned to save and modify local files only. In 2002, I learned PHP and MySQL by working on a team server, but version control was not introduced (git was introduced to the world in 2005, but options like CVS or SVK weren't taught). My first local server came in 2004, when I learned to FTP files, instead of testing local files only.

I quickly updated to SSH'ing into the server and editing the direct code, and backuped the files using a combination of file extensions (such as .bak, date stamps like.20150515, and "Backup 20140523" folders).

...and I used this method up to about a year ago, when I took a git intro course online. Unfortunatly, I didn't quite understand the purpose of git because the demos kept talking about files that either already existed, or branches that were made by someone else - never really diving into the underlying purpose of git, which was version control.

I also couldn't get used to the idea of uploading my database login information (along with other private code) to the public site GitHub, which is great for open-sourced projects (see mine here), but not great for a company version control backup. So I dabbled in git for a while, until it hit me about a month ago: I could use git on my own server(s) and not have to deal with private repositories on GitHub (or the prices).

So, I started using git on my server for backups of projects site-wide. Then, I wanted to deal with errors on a non-production server basis (I didn't want the world to see my error testing, because that would be unprofessional). After getting a local Apache server, and MySQL server, and installing PHP (on Windows), I thought that I could use the GitHub software to create backups - but that was only for the GitHub site; I needed something to work with my own existing servers. Therefore, I installed Cygwin and got the Linux-enabled commands with git to my production server.

Overall, this is what I learned, and I hope it helps others:
The Process
The "direct" process vs the git process


(If you don't already have git set up on your remote server, then please do so by installing it - I recommend sudo apt-get install -y git. Otherwise, this won't work, and it's just a bunch of lines of code)
The SetupRemote (seperate from production folder):
mkdir [dir].git && cd $_
git init --bare
cp ~/post-receive.sample hooks/post-receive

The hooks folder deals with webhooks to automatically catch incoming files and do something with them (or at least, that's what I've discovered). To make the hooks run properly, you need a post-receive file, and this is what it should look like:
GIT_WORK_TREE=[absolute path to production] git checkout -f

Once you have that set up, you can work on your local machine to create and modify files.
Local development machine
# If files do not exist
git clone [email protected]:[dir].git 
cd [dir]
# If files DO exist/update
cd [dir]
git pull

# Time for editing
vim [file]
[work on files, test on development machine]
(Ready to upload to production server)
git add [file(s) - * works as well]
git commit -m "Relevant message to update"
git push

One important note: As I have learned, your Git folder is not your production folder. I had my .git folder in my production folder of a project, and it was good for local editing, but not remote pulling. If your project folder (example: project.git) is somewhere else, like your home folder, then you can use the post-receive webhook to automatically pull committed files to the production area

Bonus: SSH Login w/o PW

Unless you want to type in your login information every time you git push, I recommend setting it up so your local machine/development server can automatically upload to the production server. If you are running a Linux system (and I recommend you do), then you can do the following:
SSH Password-less LoginOn your local machine (hopefully a Cygwin or Linux/Mac Terminal)
ssh keygen -t rsa
ssh [email protected] 'mkdir -p .ssh'
cat .ssh/ | ssh [email protected] 'cat >> .ssh/authorized_keys'
B = Remote server


There is still quite a lot I don't understand about git (like branches, merging, etc), but I am getting better. I've been using this guide as a resource, as many other guides are very technical for a non-git person.

My takeaway: Better integration into team development instead of just "solo development"

Tags:#git #development #php #mysql #html #linux

RSS Feed

VIM Search and Replace

VIMI thought I'd post this because I needed it, and quick access doesn't hurt. I had a recent experience where I needed to replace a lot of text in a text file in the command line.

While I like to use vim as my text editor of choice while in a Linux system, I hated the fact that I had to find each instance of a word and manually type out the replaced word.

So, I found a solution: (thank you VIM Wiki)

The %s command works just like wq, so you need to proceed it with a colon. But here's how it works:
I hope this seems straight forward, but here's the breakdown: %s - initiate the :substitute feature FIND - the word/phrase you want to find REPLACE - the word/phrase you want to replace it with OPTIONS - there are a series of options you can include, the most popular one being g Here is an example:
This replaces all instances of "cat" with the word "dog". Simple, right?


Here is the list of options I have come up with so far:
c - ask for confirmation (similiar to the -i flag)
i - case insensitive search/replace
I - case sensitive (the flag \C can also be tacked on to the word in case you want the word to be case sensitive only)
:%s/\<cat\>/dog/g - while not in the Options field, this searches for the whole words only (such as "cat", but not "categories")

There are plenty of other examples on the VIM Wiki page, but I thought I'd post this guide here for my benefit and anybody elses that needs it.

Tags:#vim #linux #texteditor #search #replace #guide

RSS Feed

Backup and Restore All MySQL Databases

I routinely make mass backups of all of my MySQL databases, but sometimes forget the syntax when doing so. Instead of creating a script to do it (which I will do in the future), I have to Google the syntax to find out what it is. Most of the time, I can only find one or the other, so I thought I'd gather these two commands here and hopefully provide a better reference for anyone else searching.

Making a Full Backup (All Databases)

Using a Linux Terminal:
$ mysqldump -u [username] -p[password] --all-databases > [filename].sql
notice that there is no space between -p and [password]

Restoring a Full Backup (All Databases)

Using a Linux Terminal:
$ mysql -u [username] -p[password] < [filename].sql
notice that there is no space between -p and [password] Hope this helps others that scour the internet looking for these two common commands.

Tags:#mysql #linux #backup #restore

RSS Feed

Early Bird get know the rest

Good morning world! Yes, it is 3:47am here on the east coast, and what am I doing? I am at work! Not because someone forced me to be here at this ungodly hour, but because I wanted to. Yes, I am that insane.

Don't believe me? Here's a photo I took about 30 minutes ago:

Actually, I'm not that insane. Most developers work best at night, and since Keat is out of town for 24 hours, I thought it would be a good chance to come in and get some work done without the distraction of home (and since Netflix doesn't (completely) work on Linux, I can't stream it from the office. Pandora on the other hand is a joyous pleasure).

Usually at this time, I have been up for 12+ hours and have been drugging away all day with the standard day-to-day activities. This time, I've turned the tables. I went home after work yesterday, got some dinner, finished "Rules of Engagement" (at least, Season 6 on Netflix), slept from 10:30 till 2:30, got dressed, had breakfast, fed the kitties, got all of my materials together, came to work, loaded up Pandora, got some tea ready, and I'm working! YAY!

I don't want to jinx the day so early, but I would like to estimate that today looks like it will be a good day.

Anyway, my expectation is to get a lot of development-specific work done during these wee hours. We'll see how things go.

On the brighter side (ha, get it? Because it's before sunrise.......), I thought I'd post a few comics here to free up my un-used collection. Enjoy, and Good Morning!

Tags:#goodmorning #shadowdevelopment #keat #dilbert #bug #kitty #linux #netflix #badjoke

RSS Feed

May June Catch Up

(get it?)

Before I go apologizing for not posting, let me say that the absence of posting is a good thing and a bad thing. But before I go blabbing on what happened, here's the first comic as promised:

So, in no chronological order (because I can't recall exactly what happened), here's a summary of what has happened since my last post:


  • Alright - where to begin? Well, I guess I can start with the obvious. Kat and I are working on an online tabletop emulator for role playing games. Long story short: Kat, Keat, and I just didn't have the time (or resources) to meet up and play our role playing game, Werewolf the Apocalypse. So Kat and I designed an online system that will allow for players to virtually role play. The system is still in the planning phases, but Kat hopes this will expand her PHP experience. More details as they come.

  • I'm still a newbie at Magic, and since I only have 1 deck (white and blue), I feel good about any games I win against veteran players. I've won a few games against Kat, and 1 or 2 against Keat (who is also a newbie). When Chip Green came over last weekend, we had a bunch of Magic rounds. Now, keep in mind that Chip has over 20 years of experience, and I have.....2 months? Out of the numerous games we played (against my 1 deck and his ??? decks), here was the final score: Chip: Infinity; Me: 3. Hey, I won 3 games against him! I call that a victory. A small one, but a victory nonetheless!

  • I traveled to Keat's parent's beach house in Nags Head during Memorial Day weekend. I won't go into details, but I will outline the "highlights": we brought the Wii to watch Netflix at night and during alone time. It was "taken" by one of her cousins who used it to play Lego Star Wars for 5 days. I'm surprised he didn't kill the remote batteries when we got it back. Aside from not being able to use our Wii, it was still fun. And I didn't turn into a lobster this time!

  • I finished Doctor Who on Netflix in just over a month. No, not the WHOLE series, just Doctor #9 (Christopher Eggleson) to Doctor #11 (Matt Smith) in the latest season (The Wedding of River Song and the Xmas special). I won't go on a rant about this, but David Tennant did it for me; he defined the "Doctor" and made a role that only a few could fill. Matt Smith has his own personality, which is okay, and I know the primary writer (Russell Davies) left the writing cast, but the Matt Smith series isn't a replacement for David Tennant. Overall, it was a good run. I would like to see what the latest series has to offer once they put it on Netflix (since I don't get BBC).

  • In addition, I wish they put the Tennant-Smith transition on Netflix in order of the seasons. For most people, they went from Tennant saying "Bye" to Donna, then Smith came in. There were some DW movies that filled the transition during the downtime, but you had to go searching for them on Netflix. I mean, at least have "End of Time" easily available so people can understand why Tennant left, Smith came in, and why the Tardis comes into the Matt Smith/Amy Pond season flaming.

  • Great news! (and I will admit it) My Little Pony: Friendship is Magic Season 1 and 2 are on Netflix! No more having to find torrents or 3rd party video services to watch MLP. I'm almost through Season 2 - still need to watch the Wedding epsode(s), but I hear that Season 3 is in the works (and John de Lancie will be in it again! Ponys vs Q - Take 2!) Yay! And to sum up the past 2 statements, here's something totally relevant:
    Doctor Who [Tennant] Pony Shirt!

    And for those Star Wars fans, here's DW/SW crossover which I found funny:
    Dw vs SW

  • After a year of being in our new house, we finally changed the dreaded iron lamp on our front porch! We changed it to an almost flush structure that gives off plenty of (almost too much) light. It soothes my head just knowing that we don't have to duck every time we come on/off the port. Now, for the dining room "death-by-chandelier"

  • I know I've been the advanced Developer on a lot of our clients' projects, but this past week has been especially stressful. To give a better idea about my "sleep schedule" (or lack thereof), here's a graph of my sleeping times (Thanks to @Sleepbot) :
    Sleeping schedule

    Yes, I have been going to bed between 4-7am for the past week or so.....?

  • Thanks to my wonder girlfriend, I now have a new bow to shoot with! I appreciate the 3rd-level hand-me-down bow that I used to shoot with (all 29lbs of it), but it was getting a little too.....used for my purpose. This new bow (which came in today) is a 45-pounder, which requires about 1/3 more power to pull back. After a few break-in rounds with it, I realized a few things: 1) I need a larger arrow rest; 2) I need to either build calluses or get a shooting glove; and 3) I need to do some muscle training (45 lbs of strength is a little too much for me right now, but I can do it).

  • A while back, we invited some of our SCA friends over to our house for a little get-together. Little did we know that the "little get-together" invitations spread like wildfire and we had 10 or so people in our house (we only have 1000 sq ft). Since we were not prepared for 10+ people, we were a little sparse on the meal (but that was okay since only a few were hungry). Most of us shot in the backyard with a "Marshal (In Training)", and did fairly well. I actually "Robin Hood"'ed an arrow. Regardless, all of us had a good time with music, signing, food, shooting, talking, and more. Defiantly something to repeat (with better planning) in the future. On a semi-related note, we didn't know that one of our good SCA friends, Dervila, lives about 20 minutes away from us! Small world, huh?

  • Our Sushi Chef friend, Janet, had to close her restaurant for a few weeks. Don't worry - nothing bad. She just needed the time off to help her husband recover from a surgery. However, before she closed, she called us over to get some leftover soup and some free sushi (to get rid of materials before the closing, since the fish wouldn't hold up for a month). In the process, we helped create a "Kaita" Roll, which is "The Best of Both Worlds Resembling an Everlasting Love". Janet said that the roll name should be "the marriage between you and Keat, so make it special". Trust me - it was much harder than it sounded. Photos to come later.

  • I also made 2 major Linux upgrades: I upgraded my home computer from CentOS to Debian (better supported), and finally got my work computer to dual-boot Win7 and Debian (Ubuntu wasn't working well with nVidia). So, long story short: I can now use Linux at home and work (and since my Windows-only programs run ok on WINE, I don't really have a reason to go back to Windows!)


  • Modified the "Request for Information" page for Shadow Dev to automatically save upon textarea blur. This was done for many reasons - the main one being because the form is so freakin' long! If Clients type in their information, and (for some reason) their computer loses the connection, the information will be automatically saved based on what was previously put in. Not a bad mashup of HTML, PHP, MySQL, and jQuery if I must say so.

  • I've been working on Fairview's website probably harder than any other client website. Let's just say that it has been one hurdle after another. Not to say that it is bad, but playing the middle man was not easy. I've pushed my limits on PHP/MySQL/jQuery and I've learned a lot, and by creating a PHP/MySQL/jQuery auto-save function on the Address portions of orders, the RFI-auto-save feature (above) was created. Fairview's site is almost complete and I expect it to launch in the next few days (if everything works as it is supposed to). The biggest challenges in this project were: creating the custom scraper to auto-download the information from their old templated website from the 3rd party, auto categorize/label/describe the information downloaded (and the different types); getting an answer back from their Credit processing company (finally received an answer, and they sent me somewhere else, which gave me the authorization codes, and I had to go somewhere else to get the documentation and PHP code in order to process the forms); and lastly, creating the custom checkout process (standard e-commerce systems just wouldn't cut this project).

  • I worked on adding a testimonial page to NSMT. Found a way to add a dropdown function via jQuery, and (through some confusion in technology) posted a testimonial video to their site along with restructuring a few pages

  • We have a new client! Frog Level Brewing Company - long story short: owner received a WordPress site from a competitor, he became tired of just "blogging" and needed a more functional and more responsive website. Since we already had a relationship with him hosting our "Drinks with Geeks" event, we got him signed on!

  • We've also hired on 3 new people on the Shadow Dev staff: Rachael Caldwell (Developer), Darren Mastrangelo (Designer), and Steven Rich (Intern). Our family is growing! We are now 10-strong! What an eventful 2012!

  • Had the Shadow Development Annual Shareholder Meeting on Tuesday. Lots of things discussed. Lockwood attended via phone, which was a little unexpected, but we have "Part II" on July 2. Hopefully some good things come out of that meeting.

  • I can't say much (because some competitors may be reading this), but we are expanding our Markets! Without giving out too much information, I can say the following: We are expanding to Tennessee, South Carolina, Georgia, and Central/East North Carolina. More to come in the next few months. The numbers are coming in, and things look good to expand!

  • One of our oldest clients, Smoky Mountain Development Corporation, asked us to perform a redesign for their site. I won't specifically say "they needed it", but it was time for their site to be refreshed. We completed the design early this morning (5am to be specific), and things look good.

  • I've reconfigured the main Shadow Dev site to reference images via "img#." subdomains. To put it in simple terms: it's like driving some moving trucks. By having 1 really big truck go from Point A to Point B, it will take a lot of gas and effort. By having 10 trucks drive from Point A, C, D, E.... to Point B, the loads each carry are smaller and they use less gas. This is in reference to loading images from the Shadow Dev site. By having the main site load all of the images through the www subdomain, the one request had to load EVERYTHING from the one source, and it took forever. By dividing the images onto dedicated image subdomains, and assigning random numbers to each, the load time decreased and the site loads a lot faster! Yay for me

  • I discovered a security issue with some of our sites that required password functions. Personally, I was encrypting the passwords with sha1 and md5 encryption. Bad news: they are easily decryptable. So, in order to respond with a more secure feature, I've switched the encryption to a crypt functionality, which automatically generates a $salt each time (a randomally generated key to encode the string), which makes each decryption that much harder.

  • Shadow Development has a Rewards Program in the works. The proposal phase is complete, it has passed the initial approval, and it is being formalized. Things should be ready to launch for the Rewards program by July 1

  • The Shadow Dev portal has kind of been left in the dust for now, since we have other urgent matters that require advanced developer attention (ie: mine). As soon as things calm down and I have a moment of free time, I will work on the portal again.

  • I've proven a proof-of-concept and +1 for automatic generators. By testing an "keyword density" tool on my own blog, I believe I have created an automatic keyword generator for pages. I know this won't replace in-depth SEO practices, but it helps automatically create keywords based on dynamic content (like blog entries). This tool is still in Phase 0.01, but it's a proof of concept none the less

  • We've started a public toolbox for anyone to use. In regards to the Game system and the Security hole above, we've created which will allow visitors (mainly developers) to use these tools for many things. So far, we have an automatic encryption form for SHA1, MD5, CRYPT, and BASE64 items as many times as needed. Other tools (like an auto web-font viewer) are in the works.

And for the end of the night:

If you are reading this far, I would like to congratulate you. This portion is reserved for a sneak preview. Not really, but since my comic repository is building up almost beyond belief.

Tags:#garfield #thesystem #robinhood #sca #gaming #werewolf #magic #doctorwho #mlp #sleepbot #sushi #fairview #rfi #froglevel #smdc #encryption #tools # #debian #linux

RSS Feed

Find text in files with GREP

I needed to reference this quite frequently, so I thought I'd post it here.

Ever had the frustration of needing to find a certain string inside files on a Linux OS via a terminal/command line? It'd be nice to have something like the Windows File Finder (when it works) to search for text inside of a file and report the file back.

You could cat each file and use grep [string] to spit back each line, then write down the filename. But there is an easier way.

Use grep first instead of piping it!

All you need to do is type in

grep -lir "[phrase]" [directory]
and that's all there is to it (the quotations are optional). By using the command grep instead of using it after a pipe "|", this can search through files in an instant instead of having to manually search through each file. The -l (that's a lowercase "L") puts out files that match (as opposed to -v which shows all files that don't match). The i makes the search query case insensitive. Lastly, the r makes grep recursive in folders. Simple as that. Of course, you can have the results spit back to you if you just press Enter, or you can output it to a file by using the > operator, like so:
grep -lir "cout" . > output.txt
(my VB and C++ friends should like this)

Tags:#linux #commandline #terminal #grep #search #tutorials

RSS Feed

A day full of TV - and Facebook URL's!

Amount of Comedy in Entry: 30% - xkcd

Although I'm not getting this in before midnight, I do believe that I should get this done before tomorrow starts. Bear with me...

Last night was a pain. It seemed like I couldn't get to sleep - tossing and turning, trying to get comfortable, staying warm, and....Chi meowing downstairs. Although I did have a few dreams, I believe Chi was meowing away last night as her "heat spell" was dying down. I sure hope it is over soon, because it is getting really annoying with the Siamese-volume meowing and constant "marking" all around the house and anything on the floor (I mean, even with a TOTALLY clean litter box AND being house trained, she still pees on random things while in heat).

The alarm went off at 8am and Keat got up. Yes, that is a first. She got up at 8 and stayed up. And the weirdest part: she got up before me. Although I love my sleep, it's very awkward that she gets up before me. She got some coffee and got ready for school. I tried to sleep for another 30 minutes. I thought I killed all of the alarms between 8 and 8:30, but apparently, my phone wanted to create some alarms to annoy me. 8. 8:10. 8:15. 8:20. 8:30. Okay, I got up.

I gotta say: This 2-day work week is really throwing me off. This morning, I was planning for what to do on Thursday and Friday. After I asked a few questions about using certain cars on Wednesday, Keat said "I don't have classes on Wednesday!" Then it hit me like a brick soccerball (because a "ton of bricks" would kill me). Thanksgiving break starts Wednesday and we're heading out, so (knowing how things will go down) work won't get done between Wednesday and Saturday. I hate putting work on hold for that long, especially when I'm on time-specific deadlines.

We left at 8:59am, and it usually takes us 22 minutes to get from the apartment to get to the office and/or school for Keat. Somehow, we arrived at her school at 9:16am. Don't quite know how that happened.

Anyway, my day was busy. Along with catching up on the weekend tasks and reading my RSS feeds (aka: my "daily digital newspaper" - should call it my "DDN"), I decided to go ahead and start the server upgrade process. Although it upgrades the main hosting server from a 30GB space to 50GB and Red Hat RHEL 3AS (which isn't supported anywhere, and it seems it hasn't been for about 2 years), to CentOS 5 (32 bit) which is something I can certainly relate to since the main operating box at the office, and the box in my home office both run off of CentOS 5 (32 bit). Can't complain about that.

I spent a lot of time talking to the hosting support staff on how to get the upgrade done. It seems pretty seamless from what I understood. I purchased the upgraded server space, but waited to initialize the domain and file transfer from the old VPS to the new VPS. Although I had both VPS's set, I wanted to proceed knowing that all bases were covered before I was slapped with some "unknown" fees. I was about to get things going until....normal business called.

After I sent out a mass message on FB asking people to "Like" Shadow Dev, I received a tip saying that a local competitor may need some help. Long story short: the business owner opened up a new business (while operating the current business), and things seemed to fall behind. The tip suggested that we offer our services to them in a non-competition agreement. I said that I'd think about it, and may attempt to contact the owner after Thanksgiving, allowing the holiday chaos to calm down a bit. Odd request, but what the hey?

I also received some updates from a client concerning some cosmetic items and photos. The photos they sent were to be used in the main slideshow on their site. All were good photos, but I could only properly use a few of them. There were also some issues with spacing and photo placement, but nothing unusual from normal day-to-day activities.

I went to Arby's for lunch, which was good for variety, but I swear: their "Value Roast Beef" looks like (Bread + Air) + 1 thin slice of Roast Beef + (Air + Bread). I've always been an Arby's fan and loved the Big Montana sandwich back around 2002 (which I believe is now a #4), but this was a little unacceptable. I wish I got a photo, but I was so hungry I didn't care what it looked like. I'll get a photo next time (I also dowsed it in Arby's sauce so it actually had some flavor). Their chicken is still good though; fresh, crisp, and thinly breaded. Pure flavor there. And love the curly fries. there an Arby's open this late?

After Keat and I got back to the office, I read an updated headline about "including your Facebook URL on your marketing materials" and thought "there's no way I can fit our super-long url on our marketing material. How can I fix that? Hmmm. Oh! Unique Facebook URL! Ok, how do I get it?" I recalled a re-tweeted tweet from a local competitor trying to perform a "social experiment" to gain 25 "Likes" to get a "Vanity Facebook URL". Not a bad idea. We had a few "Likes", and I knew it would take a while to get to 25. I thought "If they could do it within a few hours, so can we. Let's see what happens."

I posted the first "Like Us" post on my profile, Shadow Dev's page, my twitter, and Shadow Dev's twitter (turns out that auto-made shortened FB links don't always work) at around 3:30pm. I posted updates on how many followers we had and made sure to be at the top of the "updates" list about every 30 minutes or so. After multiple update posts (and probably the point that most of my friends were tired of me), we reached 25 followers at 8:30pm and I got Shadow Dev's own Vanity Facebook URL at (30 characters) - what a space saver (instead of, which is 77 characters).

After that happened, I offered a 10% discount to all new customers who are Facebook fans, in order to show my appreciation of their support. Honestly, I think it's a great deal. Like us = save 10%. No coupons, rebates, or special conditions. I recall Land's End had a similar deal for me when I was ordering the shirts. The lady on the phone said "Can you go to the Land's End website?" / Me: "Yea" / Her: "Do you see our main special on the front page?" / Me: "Yea, the one about logos?" / Her: "Yep. That special allowed you to save on your logo setup fees. Congrats." / Me: "Really? Wow" / Her: "Yeah, it's that easy." Why not give a little incentive to some fellow facebook fans?

Keat and I picked up some dinner and went home after that and caught up on some of our favorite TV shows. However, Keat made a good point while we were picking up dinner. She and I were talking about the Direct and Indirect competitors for Shadow Dev. Although I had a rudimentary understanding of direct and indirect competition in my 1 Marketing class while in college, I don't believe I got a lot out of it since I was preoccupied with ScrumIt and Nascent (when the idea of riding the Indy Speedway in a Limo is in your head, nothing else really fits). It has been determined that Keat knows a heck of a lot more than I do at marketing, and that is one of the many reasons she's studying Marketing and I'm studying Operations. I'm going to leave just about everything "Marketing" to her and do what I can with what I have.

Back to the shows: Futurama had a new special out yesterday, and we watched it online (comes out 1 day after air showing). That episode was.....a little weird. After that, we watched The Simpsons, Family Guy, American Dad, and The Cleveland Show. Although they had good stories, it certainly seems like Matt Groening, Seth MacFarlane, and their writers are stretching to find good quality stories.

I just realized a whole 1 1/2 episodes of Futurama have played while I'm writing this (we sleep to Futurama in the background). I'm gonna sign off before this becomes a term paper.

Tags:#xkcd #thanksgiving #chi #linux #vps #fb #arbys #shadowdev #discount #marketing #futurama #thesimpsons #familyguy #americandad #theclevelandshow