<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Running as Root</title>
	
	<link>http://www.runningasroot.com/blog</link>
	<description>My own observations, reviews, and stuff I'm working on.</description>
	<lastBuildDate>Sun, 13 May 2012 00:00:00 PDT</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/RunningAsRoot" /><feedburner:info uri="runningasroot" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><image><link>http://creativecommons.org/licenses/by-nc-sa/2.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><item><title>Links for 2012-05-12 [del.icio.us]</title><link>http://feedproxy.google.com/~r/RunningAsRoot/~3/wIuJ4hOJ5go/wyscan</link><pubDate>Sun, 13 May 2012 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/wyscan#2012-05-12</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://square.github.com/crossfilter/"&gt;Crossfilter&lt;/a&gt;&lt;br/&gt;
Pretty damn sweet looking library for exploring large multivariate datasets in the browser.  Very reminiscent of Google Flight UI.&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/wyscan#2012-05-12</feedburner:origLink></item><item><title>Links for 2012-05-11 [del.icio.us]</title><link>http://feedproxy.google.com/~r/RunningAsRoot/~3/5LgTkPqL630/wyscan</link><pubDate>Sat, 12 May 2012 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/wyscan#2012-05-11</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/purplefox/vert.x"&gt;purplefox/vert.x&lt;/a&gt;&lt;br/&gt;
Is this a JVM answer to node.js?&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/wyscan#2012-05-11</feedburner:origLink></item><item><title>Links for 2012-05-10 [del.icio.us]</title><link>http://feedproxy.google.com/~r/RunningAsRoot/~3/37UWKQ2E0dI/wyscan</link><pubDate>Fri, 11 May 2012 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/wyscan#2012-05-10</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.infoq.com/presentations/Breaking-the-Monolith"&gt;InfoQ: Breaking the Monolith&lt;/a&gt;&lt;br/&gt;
Stefan Tilkov suggests breaking a system into several subsystems, separating the micro and macro architecture, and addressing various integration issues in order to get a suppler architecture. 

Pretty good overall architecture presentation.&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/wyscan#2012-05-10</feedburner:origLink></item><item>
		<title>He's Got This Ultimate Set of Tools</title>
		<link>http://feedproxy.google.com/~r/RunningAsRoot/~3/MApkc3elYZY/</link>
		<comments>http://www.runningasroot.com/blog/2012/05/06/hes-got-this-ultimate-set-of-tools/#comments</comments>
		<pubDate>Sun, 06 May 2012 08:12:24 +0000</pubDate>
		<dc:creator>Robert Simmons</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.runningasroot.com/blog/?p=531</guid>
		<description><![CDATA["Relax, all right? My old man is a television repairman, he's got this ultimate set of tools. I can fix it." If you don't remember your Fast Times at Ridgemont High quotes you're probably not alone. The scene is worth remembering because the context is ridiculous. So it is sometimes with software development. The cost [...]]]></description>
			<content:encoded><![CDATA[<p>"Relax, all right? My old man is a television repairman, he's got this ultimate set of tools. I can fix it."  If you don't remember your <a href="http://www.imdb.com/title/tt0083929/">Fast Times at Ridgemont High</a> quotes you're probably not alone.  The scene is worth remembering because the context is ridiculous.  So it is sometimes with software development.  The cost and effort of fixing the existing implementation is sometimes just too great.  The changes cut too deep.  You're better off throwing out the current stuff and starting from scratch.</p>
<p>In software development you rarely understand your problem domain perfectly, if ever.  You learn what your customers want through trial and error.  Sometimes your organization has made such poor attempts at delivering the product people want that you can't help but throw away what you've currently got and try again with what you learned from your previous attempt.</p>
<p>Managers usually hate to hear such talk from developers.  Developers always want to rewrite things.  But in some rare cases they're absolutely right.  Refactoring is great if you're even remotely close to what you want to do.  But what if your product is built on bad assumptions of epic proportions?</p>
<p>Could CVS have been refactored incrementally to arrive at git?  Could Windows have been refactored to create Linux?  Could MacOS have been refactored to create OSX?  Could Internet Explorer be refactored to create Chrome?  When do you come to the realization that what you want, what you need, is so far away from what you have that you can't get there from here?  When is the cost of making changes to your current product artificially inflated by the technical debt and faulty abstractions to the extent that it's better to throw it all away?</p>
<p>That's the advantage your competition has.  You've shown them your near miss at a great product.  If the people in your organization advocating a rewrite were magically transported into a competing startup that was creating a competing product from scratch would you be at all worried?  If the answer is "yes" then you should use the advantages you have (those very same people plus a more intimate knowledge of the problem domain and where you went wrong) and do something about it.  Plus if something in your product actually proves useful you can copy and refactor it into the new product.</p>
<p>There are certainly risks but the rewards are incredible.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.runningasroot.com%2Fblog%2F2012%2F05%2F06%2Fhes-got-this-ultimate-set-of-tools%2F&amp;title=He%27s%20Got%20This%20Ultimate%20Set%20of%20Tools" id="wpa2a_2"><img src="http://www.runningasroot.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=MApkc3elYZY:G9y8YDMqY6E:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=MApkc3elYZY:G9y8YDMqY6E:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=MApkc3elYZY:G9y8YDMqY6E:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=YwkR-u9nhCs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.runningasroot.com/blog/2012/05/06/hes-got-this-ultimate-set-of-tools/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/</creativeCommons:license><feedburner:origLink>http://www.runningasroot.com/blog/2012/05/06/hes-got-this-ultimate-set-of-tools/</feedburner:origLink></item>
		<item><title>Links for 2012-05-05 [del.icio.us]</title><link>http://feedproxy.google.com/~r/RunningAsRoot/~3/BVVrIK05a0c/wyscan</link><pubDate>Sun, 06 May 2012 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/wyscan#2012-05-05</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://bitfieldconsulting.com/scaling-puppet-with-distributed-version-control"&gt;Scaling Puppet with Git&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/wyscan#2012-05-05</feedburner:origLink></item><item><title>Links for 2012-05-01 [del.icio.us]</title><link>http://feedproxy.google.com/~r/RunningAsRoot/~3/6scVLsTaY-k/wyscan</link><pubDate>Wed, 02 May 2012 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/wyscan#2012-05-01</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.springsource.com/2009/01/02/spring-security-customization-part-2-adjusting-secured-session-in-real-time/"&gt;Spring Security customization (Part 2 &amp;ndash; Adjusting secured session in real time) | SpringSource Team Blog&lt;/a&gt;&lt;br/&gt;
Pretty good starting point of forcing a suspended user to logout using Spring security&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/wyscan#2012-05-01</feedburner:origLink></item><item>
		<title>Autowiring Jackson Deserializers in Spring</title>
		<link>http://feedproxy.google.com/~r/RunningAsRoot/~3/ELbg38pwdFU/</link>
		<comments>http://www.runningasroot.com/blog/2012/05/02/autowiring-jackson-deserializers-in-spring/#comments</comments>
		<pubDate>Wed, 02 May 2012 06:09:25 +0000</pubDate>
		<dc:creator>Robert Simmons</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[autowire]]></category>
		<category><![CDATA[collection]]></category>
		<category><![CDATA[dao]]></category>
		<category><![CDATA[dependency]]></category>
		<category><![CDATA[deserialize]]></category>
		<category><![CDATA[deserializer]]></category>
		<category><![CDATA[domain object]]></category>
		<category><![CDATA[id]]></category>
		<category><![CDATA[injection]]></category>
		<category><![CDATA[ioc]]></category>
		<category><![CDATA[jackson]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[list]]></category>
		<category><![CDATA[serialize]]></category>
		<category><![CDATA[serializer]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[set]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[spring mvc]]></category>
		<category><![CDATA[yogi berra]]></category>

		<guid isPermaLink="false">http://www.runningasroot.com/blog/?p=516</guid>
		<description><![CDATA[Recently I was working in a Spring 3.1 controller for a page with a multi-select of some other entity in the system. Let's say an edit user page that has a User object for which you're selecting Role objects (with Role being a persistent entity with an ID). And let's further say that I'm doing [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I was working in a Spring 3.1 controller for a page with a multi-select of some other entity in the system.  Let's say an edit user page that has a User object for which you're selecting Role objects (with Role being a persistent entity with an ID).  And let's further say that I'm doing some fancy in place editing of a user within a user list so I want to use AJAX and JSON to submit the user to the server, for whatever reason (probably because it's rad \oo/).</p>
<p>Okay now that we have our contrived scenario I want to serialize the collection of roles on a user so that they're a JSON array of IDs of said roles.  That part is pretty easy.  Let's just make all of our persistent entities either extend some BaseDomainObject or implement some interface with getId and then write a generic JSON serializer for Jackson:</p>
<pre class="brush: java; title: ; notranslate">
package com.runningasroot.webapp.spring.jackson;

import java.io.IOException;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;
import org.springframework.stereotype.Component;
import com.runningasroot.persistence.BaseDomainObject;

@Component
public class RunningAsRootDomainObjectSerializer extends JsonSerializer&lt;BaseDomainObject&gt; {

    @Override
    public void serialize(BaseDomainObject value, JsonGenerator jgen, SerializerProvider provider)
            throws IOException, JsonProcessingException {
        jgen.writeNumber(value.getId());
    }
}
</pre>
<p>Awesome if that's what I want.  We'll assume it is.  Now if I submit this JSON back to the server I want to convert those IDs into real live boys, er, domain objects.  To do this I need a deserializer that has access to some service that can find a domain object by ID.  I'll leave figuring out ways to genericize this for multiple domain objects as an exercise for the reader because frankly that's not the part I'm interested in.</p>
<p>So how do I control how Jackson instantiates deserializers and make sure that I can inject Spring beans into them?  You would think it would be very easy and it is.  Figuring it out turned out to be unnecessarily hard.  The latest version of Jackson has a class for this and even says that's what it's for.  So let's make us an implementation of a HandlerInstantiator that is aware of Spring's ApplicationContext.  Note that you could do this entirely differently with an interface from Spring but who cares?  Here's what I did:</p>
<pre class="brush: java; title: ; notranslate">
package com.runningasroot.webapp.spring;

import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.HandlerInstantiator;
import org.codehaus.jackson.map.JsonDeserializer;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.KeyDeserializer;
import org.codehaus.jackson.map.MapperConfig;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.introspect.Annotated;
import org.codehaus.jackson.map.jsontype.TypeIdResolver;
import org.codehaus.jackson.map.jsontype.TypeResolverBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class SpringBeanHandlerInstantiator extends HandlerInstantiator {

    private ApplicationContext applicationContext;

    @Autowired
    public SpringBeanHandlerInstantiator(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @Override
    public JsonDeserializer&lt;?&gt; deserializerInstance(DeserializationConfig config,
            Annotated annotated,
            Class&lt;? extends JsonDeserializer&lt;?&gt;&gt; deserClass) {
        try {
            return (JsonDeserializer&lt;?&gt;) applicationContext.getBean(deserClass);
        } catch (Exception e) {
            // Return null and let the default behavior happen
        }
        return null;
    }

    @Override
    public KeyDeserializer keyDeserializerInstance(DeserializationConfig config,
            Annotated annotated,
            Class&lt;? extends KeyDeserializer&gt; keyDeserClass) {
        try {
            return (KeyDeserializer) applicationContext.getBean(keyDeserClass);
        } catch (Exception e) {
            // Return null and let the default behavior happen
        }
        return null;
    }

    // Two other methods omitted because if you don't get the idea yet then you don't
    // deserve to see them.  phbbbbt.
}
</pre>
<p>Great now we just need to hook up a custom ObjectMapper to use this thing and we're home free (extra shit that would probably trip you up as well included at no extra charge):</p>
<pre class="brush: java; title: ; notranslate">
package com.runningasroot.webapp.spring;

import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.HandlerInstantiator;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig.Feature;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.module.hibernate.HibernateModule;

@Component
public class RunningAsRootObjectMapper extends ObjectMapper {

    @Autowired
    ApplicationContext applicationContext;

    public RunningAsRootObjectMapper() {
        // Problems serializing Hibernate lazily initialized collections?  Fix here.
        HibernateModule hm = new HibernateModule();
        hm.configure(com.fasterxml.jackson.module.hibernate.HibernateModule.Feature.FORCE_LAZY_LOADING, true);
        this.registerModule(hm);

        // Jackson confused by what to set or by extra properties?  Fix it.
        this.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
        this.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        this.configure(Feature.FAIL_ON_EMPTY_BEANS, false);
    }

    @Override
    @Autowired
    public void setHandlerInstantiator(HandlerInstantiator hi) {
        super.setHandlerInstantiator(hi);
    }
}
</pre>
<p>Now you just have to tell everything to use your custom object mapper.  This can be found <a href="http://magicmonster.com/kb/prg/java/spring/webmvc/jackson_custom.html">elsewhere on the web</a> but I'll include it here in case of link rot:</p>
<pre class="brush: java; title: ; notranslate">
package com.runningasroot.webapp.spring;

import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter;

@Component
public class JacksonConfigurer {
    private AnnotationMethodHandlerAdapter annotationMethodHandlerAdapter;
    private RunningAsRootObjectMapper objectMapper;

    @PostConstruct
    public void init() {
        HttpMessageConverter&lt;?&gt;[] messageConverters = annotationMethodHandlerAdapter.getMessageConverters();
        for (HttpMessageConverter&lt;?&gt; messageConverter : messageConverters) {
            if (messageConverter instanceof MappingJacksonHttpMessageConverter) {
                MappingJacksonHttpMessageConverter m = (MappingJacksonHttpMessageConverter) messageConverter;
                m.setObjectMapper(objectMapper);
            }
        }
    }

    @Autowired
    public void setAnnotationMethodHandlerAdapter(AnnotationMethodHandlerAdapter annotationMethodHandlerAdapter) {
        this.annotationMethodHandlerAdapter  = annotationMethodHandlerAdapter;
    }

    @Autowired
    public void setObjectMapper(RunningAsRootObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }
}
</pre>
<p>I think you can also perform this bit of trickery inside of an application-context.xml.  But whatever works for you works.  I think Yogi Berra said that.</p>
<p>Of course you still need to annotate your getters and setters with special Jackson annotations:</p>
<pre class="brush: java; title: ; notranslate">
@JsonSerialize(contentUsing=RunningAsRootDomainObjectSerializer.class)
public Collection&lt;Role&gt; getRoles() {
    ...
}

// Some deserializer with some hot Spring injection going on in the back end (if you know what I mean)
@JsonDeserialize(contentUsing=RoleListDeserializer.class)
public void setRoles(Collection&lt;Role&gt; roles) {
    ...
}
</pre>
<p>So there you have it: an example of a Spring Jackson JSON serializer that serializes the contents of collections of domain objects as an array of IDs and then deserializes JSON arrays of IDs into domain objects to be put into a collection.  Say that three times fast.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.runningasroot.com%2Fblog%2F2012%2F05%2F02%2Fautowiring-jackson-deserializers-in-spring%2F&amp;title=Autowiring%20Jackson%20Deserializers%20in%20Spring" id="wpa2a_4"><img src="http://www.runningasroot.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=ELbg38pwdFU:aHNvMaYLHR0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=ELbg38pwdFU:aHNvMaYLHR0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=ELbg38pwdFU:aHNvMaYLHR0:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=YwkR-u9nhCs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.runningasroot.com/blog/2012/05/02/autowiring-jackson-deserializers-in-spring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/</creativeCommons:license><feedburner:origLink>http://www.runningasroot.com/blog/2012/05/02/autowiring-jackson-deserializers-in-spring/</feedburner:origLink></item>
		<item><title>Links for 2012-04-29 [del.icio.us]</title><link>http://feedproxy.google.com/~r/RunningAsRoot/~3/z58_LvtxzUY/wyscan</link><pubDate>Mon, 30 Apr 2012 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/wyscan#2012-04-29</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.hongkiat.com/blog/free-ebooks-whitepapers-for-web-designers/"&gt;30 Free eBooks and Whitepapers For Web Designers&lt;/a&gt;&lt;br/&gt;
More stuff to read.&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/wyscan#2012-04-29</feedburner:origLink></item><item>
		<title>I Think We're Going to Need a Bigger Box</title>
		<link>http://feedproxy.google.com/~r/RunningAsRoot/~3/Niy4xVCm2_w/</link>
		<comments>http://www.runningasroot.com/blog/2012/04/10/i-think-were-going-to-need-a-bigger-box/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 23:21:28 +0000</pubDate>
		<dc:creator>Robert Simmons</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.runningasroot.com/blog/?p=512</guid>
		<description><![CDATA[I was reading this post on the Instagram buyout by Facebook today and it got me to thinking about the benefits of the cloud, DevOps, horizontal scalability (one of my favorites), and well thought out architectures and monitoring. One of the more interesting things about the $1 billion purchase price is that Instagram has 13 [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading <a href="http://www.wired.com/epicenter/2012/04/opinion-baio-instagram-trend/">this post</a> on the Instagram buyout by Facebook today and it got me to thinking about the benefits of the cloud, DevOps, horizontal scalability (one of my favorites), and well thought out architectures and monitoring.</p>
<p>One of the more interesting things about the $1 billion purchase price is that Instagram has 13 employees and 35 million users.  That's just so crazy to me.  It also ends up being yet another argument against the "bigger box" method of solving scalability issues.  Eventually you cannot simply add more RAM to fix things.  Trying to solve your problems that way is like trying to solve world hunger by breeding a single, giant cow.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.runningasroot.com%2Fblog%2F2012%2F04%2F10%2Fi-think-were-going-to-need-a-bigger-box%2F&amp;title=I%20Think%20We%27re%20Going%20to%20Need%20a%20Bigger%20Box" id="wpa2a_6"><img src="http://www.runningasroot.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=Niy4xVCm2_w:BZqSKVSqziU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=Niy4xVCm2_w:BZqSKVSqziU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=Niy4xVCm2_w:BZqSKVSqziU:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=YwkR-u9nhCs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.runningasroot.com/blog/2012/04/10/i-think-were-going-to-need-a-bigger-box/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/</creativeCommons:license><feedburner:origLink>http://www.runningasroot.com/blog/2012/04/10/i-think-were-going-to-need-a-bigger-box/</feedburner:origLink></item>
		<item>
		<title>Let's Just Burn It All Down and Start Again</title>
		<link>http://feedproxy.google.com/~r/RunningAsRoot/~3/pgVXDH6KTXc/</link>
		<comments>http://www.runningasroot.com/blog/2012/04/07/lets-just-burn-it-all-down-and-start-again/#comments</comments>
		<pubDate>Sun, 08 Apr 2012 05:12:37 +0000</pubDate>
		<dc:creator>Robert Simmons</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.runningasroot.com/blog/?p=509</guid>
		<description><![CDATA[All software sucks to some extent including everything you are working on right now. If you reexamine your code six months from now and don't think it sucks then it probably means you didn't learn anything in those six months. That's the downside of being a software developer. You feel like the code you're working [...]]]></description>
			<content:encoded><![CDATA[<p>All software sucks to some extent including everything you are working on right now.  If you reexamine your code six months from now and don't think it sucks then it probably means you didn't learn anything in those six months.  That's the downside of being a software developer.  You feel like the code you're working around is some degree of horrible.  For the most part you just accept it and try to make incremental improvements to things.  If you're lucky you'll work on something that you think is magnificent (and then think it's shit in six months).</p>
<p>But what happens when the code is truly horrific?  For example: you wrote your own FTP client, your own templating engine, you have mutating getters, there's database access in your pages and data objects, you cut and paste DDL statements into SQL clients and call it "upgrading the schema", etc.  We can argue about whether some of those things are truly bad but from my perspective they're pretty rotten.  Throw that into a 100k+ line code base with many active customers and too few developers and then you've got some real fun.</p>
<p>In these situations I can envision a more ideal code base pretty easily.  Update the libraries and start using them, fix the schema that no longer matches the problem domain (if it ever did), start pushing things into neat little tiers, get rid of that shitty build, run a continuous integration build server, use Chef or Puppet to manage configuration, scale your shit horizontally and get all elasticy with the cloud, etc.  Pretty soon I've built a shining city on the hill in my mind.  The only problem is I'm still calf deep in shit and I need to go back to standing on my head just as soon as my lunch break is over.</p>
<p>My solution has always been to burn everything to the ground and start over.  It's not a popular position even among software developers.  "Let's just slowly fix everything that is wrong," they say.  It sounds good but progress on paying down your massive technical debt always seems to take a backseat to a shiny new feature (with its own share of technical debt).  Pretty soon you're not even paying the interest on that debt.  Nope.  Burn it all down.  Or at least build a new bridge next to the old bridge and then blow the old bridge up.  Maybe you can even be nice enough to divert traffic first.</p>
<p>The "fix in place" crowd always sounds like this to me: "I bought a new motorcycle.  It's a Honda.  I kind of want a Harley instead.  Can you turn it into a Harley while I ride it around?  Thanks.  xxxooo"  </p>
<p>At least I'll always have these rants before the void.  Thanks for listening.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.runningasroot.com%2Fblog%2F2012%2F04%2F07%2Flets-just-burn-it-all-down-and-start-again%2F&amp;title=Let%27s%20Just%20Burn%20It%20All%20Down%20and%20Start%20Again" id="wpa2a_8"><img src="http://www.runningasroot.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=pgVXDH6KTXc:0_mgQdGdyZo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=pgVXDH6KTXc:0_mgQdGdyZo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=pgVXDH6KTXc:0_mgQdGdyZo:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=YwkR-u9nhCs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.runningasroot.com/blog/2012/04/07/lets-just-burn-it-all-down-and-start-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/</creativeCommons:license><feedburner:origLink>http://www.runningasroot.com/blog/2012/04/07/lets-just-burn-it-all-down-and-start-again/</feedburner:origLink></item>
		<item><title>Links for 2012-03-20 [del.icio.us]</title><link>http://feedproxy.google.com/~r/RunningAsRoot/~3/ltz8JCybDnA/wyscan</link><pubDate>Wed, 21 Mar 2012 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/wyscan#2012-03-20</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://wiki.eclipse.org/M2E_compatible_maven_plugins#BuildContext"&gt;M2E compatible maven plugins - Eclipsepedia&lt;/a&gt;&lt;br/&gt;
Info on making a mojo more Eclipse friendly.&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/wyscan#2012-03-20</feedburner:origLink></item><item>
		<title>Geek TGI Friday's Flair</title>
		<link>http://feedproxy.google.com/~r/RunningAsRoot/~3/PtbOKm6kzLk/</link>
		<comments>http://www.runningasroot.com/blog/2011/09/19/geek-tgi-fridays-flair/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 04:49:12 +0000</pubDate>
		<dc:creator>Robert Simmons</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.runningasroot.com/blog/?p=504</guid>
		<description><![CDATA[TGI Friday's walls are littered with "vintage" wall decor. Red Lobster has old lobster traps and fish photos all over their walls. Then it hit me: geek hangouts need their own brand of wall flair. Why not outdated tech books? I've got a ton of books on technologies that aren't in widespread use any more. [...]]]></description>
			<content:encoded><![CDATA[<p>TGI Friday's walls are littered with "vintage" wall decor.  Red Lobster has old lobster traps and fish photos all over their walls.  Then it hit me: geek hangouts need their own brand of wall flair.  Why not outdated tech books?</p>
<p>I've got a ton of books on technologies that aren't in widespread use any more.  I'd donate them but even Goodwill doesn't want stuff like that.  When you think about it it makes sense.  So where do they go?  The landfill?  I like to pretend I'm much more environmentally friendly than that.</p>
<p>Some hangout for geeks needs to step up and offer a free appetizer or something for anyone that brings in a tech book that was published before, say, 2000?  That seems like a reasonable cutoff.  Then all the geeky people can laugh at the titles lining the shelves above their tables.  "PowerBuilder?  Oh, shit!  I wrote something in that once!" (Apologies to Sybase, but you really need to give up on that shit.)</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.runningasroot.com%2Fblog%2F2011%2F09%2F19%2Fgeek-tgi-fridays-flair%2F&amp;title=Geek%20TGI%20Friday%27s%20Flair" id="wpa2a_10"><img src="http://www.runningasroot.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=PtbOKm6kzLk:xi56gyA8YWU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=PtbOKm6kzLk:xi56gyA8YWU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=PtbOKm6kzLk:xi56gyA8YWU:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=YwkR-u9nhCs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.runningasroot.com/blog/2011/09/19/geek-tgi-fridays-flair/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/</creativeCommons:license><feedburner:origLink>http://www.runningasroot.com/blog/2011/09/19/geek-tgi-fridays-flair/</feedburner:origLink></item>
		<item>
		<title>Thoughts on Call of Duty Elite</title>
		<link>http://feedproxy.google.com/~r/RunningAsRoot/~3/jITzFoxv_-Y/</link>
		<comments>http://www.runningasroot.com/blog/2011/07/20/thoughts-on-call-of-duty-elite/#comments</comments>
		<pubDate>Wed, 20 Jul 2011 19:49:50 +0000</pubDate>
		<dc:creator>Robert Simmons</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Community Management]]></category>
		<category><![CDATA[Entertainment]]></category>
		<category><![CDATA[Random Thoughts]]></category>

		<guid isPermaLink="false">http://www.runningasroot.com/blog/?p=496</guid>
		<description><![CDATA[For those of you that may not know Activision recently announced an online service called "Call of Duty Elite". This is directly related to their Call of Duty game series and works on kind of a freemium model. Ultimately I think it'll be a cool idea. However, the way they announced it to their customers [...]]]></description>
			<content:encoded><![CDATA[<p>For those of you that may not know Activision recently announced an online service called "<a href="http://www.callofduty.com/elite">Call of Duty Elite</a>".  This is directly related to their Call of Duty game series and works on kind of a freemium model.  Ultimately I think it'll be a cool idea.  However, the way they announced it to their customers lead to a pretty big negative reaction.  Recently I recorded my thoughts (over a Call of Duty: Black Ops game play) on how they could have handled the announcement better, not abused their community managers in the process, and even whether or not they should build some of this stuff themselves (in particular in the social networking area of things).</p>
<p>If you're interested you can see the video on <a href="http://www.youtube.com/watch?v=6FbWx8dBHy8">my YouTube channel</a> or via the embedded player below:</p>
<p><iframe width="560" height="349" src="http://www.youtube.com/embed/6FbWx8dBHy8" frameborder="0" allowfullscreen></iframe></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.runningasroot.com%2Fblog%2F2011%2F07%2F20%2Fthoughts-on-call-of-duty-elite%2F&amp;title=Thoughts%20on%20Call%20of%20Duty%20Elite" id="wpa2a_12"><img src="http://www.runningasroot.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=jITzFoxv_-Y:lyzBye3ZgGk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=jITzFoxv_-Y:lyzBye3ZgGk:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=jITzFoxv_-Y:lyzBye3ZgGk:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=YwkR-u9nhCs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.runningasroot.com/blog/2011/07/20/thoughts-on-call-of-duty-elite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/</creativeCommons:license><feedburner:origLink>http://www.runningasroot.com/blog/2011/07/20/thoughts-on-call-of-duty-elite/</feedburner:origLink></item>
		<item>
		<title>Better Programmer Interviews</title>
		<link>http://feedproxy.google.com/~r/RunningAsRoot/~3/k4LyV2_4Zm0/</link>
		<comments>http://www.runningasroot.com/blog/2011/04/14/better-programmer-interviews/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 18:50:54 +0000</pubDate>
		<dc:creator>Robert Simmons</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Project Management]]></category>

		<guid isPermaLink="false">http://www.runningasroot.com/blog/?p=491</guid>
		<description><![CDATA[One of my former co-workers wrote some of his thoughts on crappy interview questions as well as some advice on improving the situation. My latest job was the first time I had to write code during the interview. It was interesting although I think the problem was a bit trivial. The thing I liked about [...]]]></description>
			<content:encoded><![CDATA[<p>One of my former co-workers wrote some of <a href="http://ericjturley.blogspot.com/2011/04/crappy-interview-questions.html">his thoughts</a> on crappy interview questions as well as some advice on improving the situation.  My latest job was the first time I had to write code during the interview.  It was interesting although I think the problem was a bit trivial.  The thing I liked about it was that it started with an OOAD design question about a specific problem and then segued into you coding your solution.  It was kind of a nice "eat your own design dog food while I watch" moment.</p>
<p>However, when I read the post I mentioned above it occurred to me that you might be able to use open source projects to improve on this a bit.  The idea I had was to use an open source library on which you depend and have the interviewee either address a bug or add a feature that you've wanted.  This can easily be a take home type of question as well.  The plus is you get to do a code review on their submission <strong>and</strong> get a feature you want.  The open source software community benefits as well.  It's just wins all around, baby!</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.runningasroot.com%2Fblog%2F2011%2F04%2F14%2Fbetter-programmer-interviews%2F&amp;title=Better%20Programmer%20Interviews" id="wpa2a_14"><img src="http://www.runningasroot.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=k4LyV2_4Zm0:JpisOifoIPE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=k4LyV2_4Zm0:JpisOifoIPE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=k4LyV2_4Zm0:JpisOifoIPE:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=YwkR-u9nhCs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.runningasroot.com/blog/2011/04/14/better-programmer-interviews/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/</creativeCommons:license><feedburner:origLink>http://www.runningasroot.com/blog/2011/04/14/better-programmer-interviews/</feedburner:origLink></item>
		<item>
		<title>Austin Java Developer Job Market</title>
		<link>http://feedproxy.google.com/~r/RunningAsRoot/~3/o56wYe8dChs/</link>
		<comments>http://www.runningasroot.com/blog/2010/08/23/austin-java-developer-job-market/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 20:50:31 +0000</pubDate>
		<dc:creator>Robert Simmons</dc:creator>
				<category><![CDATA[Humor]]></category>

		<guid isPermaLink="false">http://www.runningasroot.com/blog/?p=461</guid>
		<description><![CDATA[I stopped getting paid some time in late January of 2010. My "former" company still paid for my health care while they hoped to bring me back on "very soon." Between then and roughly the beginning of July I kind of just hung out and piddled around. I wrote an Android game for the hell [...]]]></description>
			<content:encoded><![CDATA[<p>I stopped getting paid some time in late January of 2010.  My "former" company still paid for my health care while they hoped to bring me back on "very soon."  Between then and roughly the beginning of July I kind of just hung out and piddled around.  I wrote an Android game for the hell of it (still haven't bothered publishing it), read a few books, and played a ton of Call of Duty.</p>
<p>Around the beginning of July my company decided it "wasn't fair" to me to pay for my health care any longer.  I think it took them that long to realize that I have an amazing ability to sit on my ass and do nothing as long as I have health care.  </p>
<p>Since the beginning of July I've been looking for a Java developer position in the Austin area.  That is, I put my resume (sans funny accented characters) up on a couple of job sites and have been mostly waiting for recruiters to come to me.  Okay, so I was only half looking.  Through an ex-coworker I landed a 100% telecommute contracting job for the time being.  Meanwhile, I thought I'd write up a brief summary of what it's like to deal with the recruiters that find you on both <a href="http://dice.com">Dice</a> and <a href="http://monster.com">Monster</a> (soon to be referred to as "D&#038;M").<br />
<h3>One Job List to Find Them&#8230;</h3>
<p>Apparently 95% of the recruiters on D&#038;M get their jobs from the same source.  They just spam emails and calls to any candidates that even come close.  That means for any one position you will receive calls from about a dozen recruiters trying to fill the very same position.  Given the recruiters' often complete absence of any kind of technical understanding they can't even screen me properly.  I'm not sure what value they're adding or if they ever even successfully place a candidate.<br />
<h3>Hi! My name is.. (what?) My name is.. (who?)</h3>
<p>The next thing that gets me is that about 75% of the recruiters using D&#038;M are located in New Jersey and are originally from another country guessing from their accents.  I'd guess from their names (Adwait, Aneesh, Kaushal, Kavitha, Prashant, Raghu, Raj, Rajiv, Susheel, Tervinder) that it may be India.  This means they apparently 1) don't know how big Texas is, 2) don't know how big the United States is, and 3) can't read the words "I am not willing to relocate" on my resume.  As such I get a lot of inquiries about jobs that would require anywhere from a 3 hour commute all the way up to a whopping 27 hour commute.  That's a hell of a drive.  They seem honestly surprised each of the 12 times a day that I explain to each of them that Austin is 3 hours away from Dallas.  It's an honest mistake.</p>
<p>The other thing is that I typically get an email followed immediately by a call from the same person.  They're really hot and heavy to talk to me.  Once I explain that I'm not interested I get a call back from the exact same person about 10% of the time.  I guess he lost his place on his call sheet.<br />
<h3>The Crown Prince of AT&#038;T Needs My Help</h3>
<p>And finally there are those impossible to fill jobs.  AT&#038;T and Bank of America are hiring in the area.  Due to their complicated, highly corporate rehire screening policy all recruiters with thick foreign accents are required to get social security numbers from all prospects as soon as humanly possible.  For some reason this feels weird to me so I've never gotten to see what happens if I actually give my SSN to them.  But since these jobs must pay a premium to the recruiter and are all but unfillable due to the SSN requirement they account for about 10% of all calls by themselves.<br />
<h3>But You Seem So Normal</h3>
<p>On the plus side I get about one call per week from someone that honestly seems to know what they're talking about regardless of where they're located or from.  They can ask all the right questions, seem to understand my answers, and actually ask what it is I'm looking for.  Unfortunately they just don't have any opportunities in which I'm interested.  If you are good and are willing to work (yet again) for a dysfunctional organization you can get a job in about 4 weeks.  If you're willing to work a little cheaper than what you're worth then you can probably trim that down to 2 weeks.</p>
<p>So in case any of you were wondering, it seems to be a pretty okay time to be looking for software development work in Austin.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.runningasroot.com%2Fblog%2F2010%2F08%2F23%2Faustin-java-developer-job-market%2F&amp;title=Austin%20Java%20Developer%20Job%20Market" id="wpa2a_16"><img src="http://www.runningasroot.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=o56wYe8dChs:zEbo2lzmSig:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=o56wYe8dChs:zEbo2lzmSig:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=o56wYe8dChs:zEbo2lzmSig:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=YwkR-u9nhCs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.runningasroot.com/blog/2010/08/23/austin-java-developer-job-market/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/</creativeCommons:license><feedburner:origLink>http://www.runningasroot.com/blog/2010/08/23/austin-java-developer-job-market/</feedburner:origLink></item>
		<item>
		<title>An Embarrassment of Fixes</title>
		<link>http://feedproxy.google.com/~r/RunningAsRoot/~3/ZDGGSbKTDP4/</link>
		<comments>http://www.runningasroot.com/blog/2010/08/14/an-embarrassment-of-fixes/#comments</comments>
		<pubDate>Sun, 15 Aug 2010 00:18:51 +0000</pubDate>
		<dc:creator>Robert Simmons</dc:creator>
				<category><![CDATA[Humor]]></category>

		<guid isPermaLink="false">http://www.runningasroot.com/blog/?p=476</guid>
		<description><![CDATA[I finally broke down and picked up a copy of Battlefield: Bad Company 2 for the XBox. I do love me some multi-player first person shooters. When you try to play online multi-player the game attempts to connect to EA's servers. Unfortunately I could not for the life of me connect. I tried multiple times, [...]]]></description>
			<content:encoded><![CDATA[<p>I finally broke down and picked up a copy of <a href="http://www.amazon.com/Battlefield-Bad-Company-2-Xbox-360/dp/B001QXNBJM/ref=sr_1_1?ie=UTF8&#038;s=videogames&#038;qid=1281830859&#038;sr=8-1">Battlefield: Bad Company 2</a> for the XBox.  I do love me some multi-player first person shooters.  When you try to play online multi-player the game attempts to connect to <a href="http://www.ea.com/">EA</a>'s servers.  Unfortunately I could not for the life of me connect.  I tried multiple times, reset my XBox, reset my router, etc.  A couple of minutes of Google searches led me to this <a href="http://adultgamingenthusiasts.com/forums/p/37893/480879.aspx">little gem</a>.  It says that the EA proposed fix for this problem is to disconnect from XBox Live, reset your system clock to 2005, log back into XBox Live, and then try the multi-player mode again.  It sounds stupid but I tried it and it actually worked.  </p>
<p>As a programmer I feel embarrassed for EA.  That's a stupid fix.  That's the best they can do?  As someone interested in user experience I feel even more embarrassed for them.  Any hope of using your product right out of the box requires someone to either Google around for this idiotic fix or to contact your support group and have them suggest this idiotic fix.  That blows.  I would think a company of that size could do better.  The best case scenario for any hope of a defense is to somehow claim that Microsoft is to blame.  That'd be a stretch since every other online multi-player game I have works right out of the box.  Oh well.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.runningasroot.com%2Fblog%2F2010%2F08%2F14%2Fan-embarrassment-of-fixes%2F&amp;title=An%20Embarrassment%20of%20Fixes" id="wpa2a_18"><img src="http://www.runningasroot.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=ZDGGSbKTDP4:OhG808JsYsc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=ZDGGSbKTDP4:OhG808JsYsc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=ZDGGSbKTDP4:OhG808JsYsc:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=YwkR-u9nhCs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.runningasroot.com/blog/2010/08/14/an-embarrassment-of-fixes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/</creativeCommons:license><feedburner:origLink>http://www.runningasroot.com/blog/2010/08/14/an-embarrassment-of-fixes/</feedburner:origLink></item>
		<item>
		<title>MP3s and Ratings</title>
		<link>http://feedproxy.google.com/~r/RunningAsRoot/~3/eP5RtDmqlgw/</link>
		<comments>http://www.runningasroot.com/blog/2010/08/13/mp3s-and-ratings/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 15:14:20 +0000</pubDate>
		<dc:creator>Robert Simmons</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Community Management]]></category>
		<category><![CDATA[Entertainment]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.runningasroot.com/blog/?p=470</guid>
		<description><![CDATA[Don't you hate when you put ratings on most of the songs in your massive music library only to find that you need to do it again when you switch players? On Ubuntu I use Banshee which allows you to save ratings to the ID3 tag right in the MP3 file. That means those ratings [...]]]></description>
			<content:encoded><![CDATA[<p>Don't you hate when you put ratings on most of the songs in your massive music library only to find that you need to do it again when you switch players?  On Ubuntu I use <a href="http://banshee.fm/">Banshee</a> which allows you to save ratings to the ID3 tag right in the MP3 file.  That means those ratings are available from any Banshee player.  Nice.</p>
<p>The problem is that I'm working a contract gig that sort of requires Windows (well, they think they do at least) and I don't fully trust the port in progress of Banshee to Windows.  So, I'm using iTunes (which I hate).  I think it'd be nice if other players could use that same custom ID3 tag to use the ratings but I realize that many people have an issue with subjective information (the ratings) being stored in a repository meant to store common supposedly objective information about the song itself.  Then there's the whole issue of standardizing on the custom tag.  In a perfect world more stuff would use a plugin based design and you could simply write an extension to get the ratings from wherever you wanted.</p>
<p>A simple import / export to an agreed upon format could also sort of solve the problem but you can't get people to agree on things and you would then have some annoying synchronization issues.  I think it'd be swell if something like <a href="http://last.fm">last.fm</a> acted as that song and ratings repository since they're a bit of a de facto standard supported by most MP3 players.  It seems simple to stick the rating in there when you <a href="http://en.wiktionary.org/wiki/scrobble">scrobble</a> whatever you're listening to.  Then it's just a hop, skip, and a jump to an import / export to get up and running.  It also feels like it'd add some value to their existing service.  Somebody get on that&#8230;</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.runningasroot.com%2Fblog%2F2010%2F08%2F13%2Fmp3s-and-ratings%2F&amp;title=MP3s%20and%20Ratings" id="wpa2a_20"><img src="http://www.runningasroot.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=eP5RtDmqlgw:8fjP21kED0U:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=eP5RtDmqlgw:8fjP21kED0U:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RunningAsRoot?a=eP5RtDmqlgw:8fjP21kED0U:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/RunningAsRoot?d=YwkR-u9nhCs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.runningasroot.com/blog/2010/08/13/mp3s-and-ratings/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/</creativeCommons:license><feedburner:origLink>http://www.runningasroot.com/blog/2010/08/13/mp3s-and-ratings/</feedburner:origLink></item>
	</channel>
</rss>

