<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/atom10full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xml:lang="en" xml:base="http://danielroop.com/blog/wp-atom.php">
	<title type="text">Roop says</title>
	<subtitle type="text">I created gravity?</subtitle>

	<updated>2008-07-14T02:13:11Z</updated>
	<generator uri="http://wordpress.org/" version="2.3.3">WordPress</generator>

	<link rel="alternate" type="text/html" href="http://danielroop.com/blog" />
	<id>http://danielroop.com/blog/feed/atom/</id>
	

			<link rel="self" href="http://feeds.feedburner.com/RoopSays" type="application/atom+xml" /><entry>
		<author>
			<name>Daniel Roop</name>
						<uri>http://danielroop.com</uri>
					</author>
		<title type="html"><![CDATA[Program to an interface not an Interface]]></title>
		<link rel="alternate" type="text/html" href="http://danielroop.com/blog/2008/06/28/program-to-an-interface-not-an-interface/" />
		<id>http://danielroop.com/blog/2008/06/28/program-to-an-interface-not-an-interface/</id>
		<updated>2008-06-29T03:37:27Z</updated>
		<published>2008-06-29T03:30:47Z</published>
		<category scheme="http://danielroop.com/blog" term="programming" /><category scheme="http://danielroop.com/blog" term="rant" /><category scheme="http://danielroop.com/blog" term="social" /><category scheme="http://danielroop.com/blog" term="theory" /><category scheme="http://danielroop.com/blog" term="class" /><category scheme="http://danielroop.com/blog" term="code" /><category scheme="http://danielroop.com/blog" term="gof" /><category scheme="http://danielroop.com/blog" term="interface" /><category scheme="http://danielroop.com/blog" term="java" /><category scheme="http://danielroop.com/blog" term="java interface" /><category scheme="http://danielroop.com/blog" term="static" />		<summary type="html"><![CDATA[For the longest time I have thought I was crazy, because I just didn&#8217;t see the benefit of programming to an Interface. I agreed it was good from a design perspective, but as an implementation I saw no need to add the extra code for what amounted to zero benefit. I have finally come to [...]]]></summary>
		<content type="html" xml:base="http://danielroop.com/blog/2008/06/28/program-to-an-interface-not-an-interface/"><![CDATA[<p>For the longest time I have thought I was crazy, because I just didn&#8217;t see the benefit of programming to an Interface. I agreed it was good from a design perspective, but as an implementation I saw no need to add the extra code for what amounted to zero benefit. I have finally come to the conclusion that a good chunk of people have absolutely lost their mind.  I base that conclusion on the fact that I have found <a href="http://jroller.com/rolsen/">smart people</a> that agree with me, to counter the <a href="http://mockobjects.com">smart people </a>that lost their mind.</p>
<p>What am I talking about?  I will cut straight to the point, when the <a href="http://en.wikipedia.org/wiki/Gang_of_Four_(software)" title="Gang of Four">GoF</a> suggested programming to an interface not an implementation in their <a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&#038;location=http%3A%2F%2Fwww.amazon.com%2FDesign-Patterns-Object-Oriented-Addison-Wesley-Professional%2Fdp%2F0201633612%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1214271753%26sr%3D1-1&#038;tag=danroo-20&#038;linkCode=ur2&#038;camp=1789&#038;creative=9325">classic book</a><img src="http://www.assoc-amazon.com/e/ir?t=danroo-20&amp;l=ur2&amp;o=1" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />, I don&#8217;t think they meant a Java Interface.  Mostly because the book was based on C++ and Java Interfaces weren&#8217;t around, but also because I think they are smarter than that.</p>
<p>Like so many things in the Java community, I think <abbr title="the java community">they</abbr> took a really great idea and twisted it until it no longer made sense.  I don&#8217;t think they do this on purpose, I believe they are just gluttons for theories.  But, before I get to far into this rant, let me substantiate this claim with a few points of interest.</p>
<ul>
<li>Almost all languages at the time of the GoF publication did not have the notion of an interface as a first class citizen.</li>
<li>The examples in the book were written in C++ which did not have the notion of an interface, although you can <a href="http://www.codeguru.com/cpp/cpp/cpp_mfc/oop/article.php/c9989/">fake it</a>.</li>
<li>Patterns are supposed to be reusable bits of object oriented goodness, and since all object oriented languages don&#8217;t include interfaces as first class citizens it might not be essential to use these ideas.</li>
</ul>
<p>Now let me switch into argument mode, I agree with the notion of programming to an interface.  I admit that doesn&#8217;t sound like a very good argument, but hear me out.  I will address each of the popular arguments individually, so what are they?</p>
<h3>If you don&#8217;t use an Interface you are programming to the implementation not the interface.</h3>
<p>So the point here is that you should be loosely coupling your classes in your application.  When designing your systems you should always think about the interface (coupling) between your components and make sure they make sense. I firmly believe the best way to make a maintainable system is to create loose coupling and high cohesion as a <a href="http://brianlegros.com">wise man</a> once taught me.  But this can and is done in many languages, and at many shops without the need for the Java Interface.</p>
<p>So what am I saying?  I am saying if I showed you the following code:</p>
<pre><code>
public class BankDelegate {
   public void debit(Account account, Amount amount) {
      account.debit(amount);
   }
}
</code></pre>
<p>you would have no idea if account was an Interface, Abstract Class, or Concrete Class.  And furthermore, I would suggest that it doesn&#8217;t matter.  Let&#8217;s say my bank only has a single account type.  This would work great.  Now what happens when I need to add a second account type?  I can either create a base class, that both my accounts extend from, or I can create an Interface.  Either solution will work, and I don&#8217;t need to change the code in my delegate.  Which means my interface has remained the same.</p>
<p>That is what it means to program to an interface.  Because if I had originally wrote the BankDelegate class like this:</p>
<pre><code>
public class BankDelegate {
   public void debit(CheckingAccount account, Amount amount) {
      account.debit(amount);
   }
}
</code></pre>
<p>Then my interface is only good for classes that are of type CheckingAccount.  So let&#8217;s apply the same logic as before.  I could write this as an Interface, Abstract Class, or Concrete Class and you would have no idea based on the above code.  But of course, had I written it as an Interface it would be loosely coupled, and therefore I would be able to change it extremely easy at a later time&#8230;Oh wait, errrrr&#8230;It doesn&#8217;t make sense for a SavingsAccount to extend Checking account.  I need to add a new base class or interface of Account and extend that.  It will take the same amount of work to change this to accept a SavingsAccount regardless of what notation I used to create the CheckingAccount type.</p>
<p>Because of that I would argue that programming to an interface is more about thinking about the names of your classes and methods than using a special notation to declare them.</p>
<h3>Why would you tie down your domain with unnecessary dependencies?</h3>
<p>This is the argument that if I don&#8217;t create an interface, I will be importing unnecessary third party dependencies into my domain.  The example I have seen suggests if you are creating a store, and you need to keep track of sales, you should create a SalesLedger interface.  That way you can create a HibernateLedger that implements the SalesLedger, so as to not couple the Hibernate libraries to your domain.  I agree with the idea of not coupling your domain with hibernate, but I don&#8217;t see how adding an Interface solves this.  Even if I make the Interface I could make it rely on hibernate functionality, especially if it is the first and only implementation I do.  Futhermore, the argument seems to suggest that I would have created the class HibernateLedger in place of SalesLedger if I had not created the Interface.  That is probably true from the implementation standpoint, but form the interface standpoint, the methods would be identical to SalesLedger, the Interface. Am I missing something?</p>
<p>More importantly however, it is not unnecessary from a runtime perspective, which is essentially the only time you are &#8216;importing the dependency&#8217; because without the Hibernate classes your code won&#8217;t work, no matter how many Interfaces you placed in between.</p>
<h3>How else can you change the implementation in the future?</h3>
<p>I am sorry, but this is ridiculous?  Let&#8217;s break this down into what that really means.<br />
1. If you mean changing it at runtime&#8230;that has more to do with the strategy pattern and your runtime environment, that a Java Interface.  If you needed to change an implementation at runtime, you simply extend the original class, change the behavior you need, and inject your new object.<br />
2. If you mean changing it for a future build&#8230;just re-write the code.  Will you need the old code?  Do you like keeping an archive of all your classes?  If you need to change your SalesLedger to use a web service, instead of hibernate, go for it.  You wouldn&#8217;t be using both at the same time.</p>
<p>So you ask, what if I need the old code in the future?  I would say, isn&#8217;t that what version control is for.</p>
<h3>What if we need to change the parameters in the future?</h3>
<p>This is the one that I find most disheartening.  The idea here is doing something like this</p>
<pre><code>
public void myMethod(IMyParameterInterface request) {
    ...
}
</code></pre>
<p>instead of this</p>
<pre><code>
public void myMethod(String param1, Integer param2) {
    ...
}
</code></pre>
<p>Talk about working around language features.  What if you need to change the parameters in the future you ask?  I don&#8217;t know change the parameters.  I know, the response is, well then your interface has changed, and you need to go update everyone consuming that interface.  Yeah, well guess what you just added a new parameter, that they probably need to send, and if they don&#8217;t, you can just overload the method and pass a null, which you would have to check for in your Interface based system as well.</p>
<p>So there you have it&#8230;</p>
<p>I recognize that Java Interfaces are essential to the language, because Java is a static typed language, and doesn&#8217;t allow multiple inheritance, Interfaces are the only way to create libraries like the collections API.  I think it is unfortunate that the word &#8216;interface&#8217; has been overloaded so much, that in this case it was taken literally becase and Interface type existed, instead of just treating it in the more generic term, of interface between two components or systems.</p>
<p>In conclusion, I hope I have enlightened, and annoyed a few people with this article.  And maybe I don&#8217;t know what I am talking about, but just incase I haven&#8217;t been able to convince you, read <a href="http://www.artima.com/lejava/articles/designprinciples.html">this interview</a> with Eric Gamma, I think you will find it enlightening.</p>
]]></content>
	</entry>
		<entry>
		<author>
			<name>Daniel Roop</name>
						<uri>http://danielroop.com</uri>
					</author>
		<title type="html"><![CDATA[EasyMock Exception when calling createMock]]></title>
		<link rel="alternate" type="text/html" href="http://danielroop.com/blog/2008/05/22/easymock-exception-when-calling-createmock/" />
		<id>http://danielroop.com/blog/2008/05/22/easymock-exception-when-calling-createmock/</id>
		<updated>2008-05-23T01:21:17Z</updated>
		<published>2008-05-23T01:21:17Z</published>
		<category scheme="http://danielroop.com/blog" term="programming" /><category scheme="http://danielroop.com/blog" term="troubleshoot" /><category scheme="http://danielroop.com/blog" term="bug" /><category scheme="http://danielroop.com/blog" term="exception" /><category scheme="http://danielroop.com/blog" term="mock" /><category scheme="http://danielroop.com/blog" term="test" />		<summary type="html"><![CDATA[I admit this is probably an obscure error, but I didn&#8217;t find anyone else talking about it.  So, in an effort to help some other poor sap like me out&#8230;
If you receive this error in EasyMock 2.3

java.lang.NoSuchMethodError: org.easymock.internal.RecordState.(Lorg/easymock/internal/IMocksBehavior;)V
	at org.easymock.internal.MocksControl.reset(MocksControl.java:62)
	at org.easymock.internal.MocksControl.(MocksControl.java:26)
	at org.easymock.classextension.internal.MocksClassControl.(MocksClassControl.java:19)
	at org.easymock.classextension.EasyMock.createControl(EasyMock.java:108)
	at org.easymock.classextension.EasyMock.createMock(EasyMock.java:46)

It is most likely because you have an older version of EasyMock [...]]]></summary>
		<content type="html" xml:base="http://danielroop.com/blog/2008/05/22/easymock-exception-when-calling-createmock/"><![CDATA[<p>I admit this is probably an obscure error, but I didn&#8217;t find anyone else talking about it.  So, in an effort to help some other poor sap like me out&#8230;</p>
<p>If you receive this error in <a href="http://easymock.org/">EasyMock</a> 2.3</p>
<pre>
java.lang.NoSuchMethodError: org.easymock.internal.RecordState.<init>(Lorg/easymock/internal/IMocksBehavior;)V
	at org.easymock.internal.MocksControl.reset(MocksControl.java:62)
	at org.easymock.internal.MocksControl.<init>(MocksControl.java:26)
	at org.easymock.classextension.internal.MocksClassControl.<init>(MocksClassControl.java:19)
	at org.easymock.classextension.EasyMock.createControl(EasyMock.java:108)
	at org.easymock.classextension.EasyMock.createMock(EasyMock.java:46)
</pre>
<p>It is most likely because you have an older version of EasyMock in your classpath.  In my case a referencing eclipse project had it, and in my project &#8220;order and export&#8221; tab I had the Project Higher on the Export list than the new version of EasyMock.  the easy way to fix this is just bump the newer EasyMock jars ahead of the older ones, or remove the older jars.</p>
]]></content>
	</entry>
		<entry>
		<author>
			<name>Daniel Roop</name>
						<uri>http://danielroop.com</uri>
					</author>
		<title type="html"><![CDATA[What makes a great developer?]]></title>
		<link rel="alternate" type="text/html" href="http://danielroop.com/blog/2008/05/09/what-makes-a-great-developer/" />
		<id>http://danielroop.com/blog/2008/05/09/what-makes-a-great-developer/</id>
		<updated>2008-05-09T12:05:34Z</updated>
		<published>2008-05-09T12:05:34Z</published>
		<category scheme="http://danielroop.com/blog" term="development" /><category scheme="http://danielroop.com/blog" term="programming" /><category scheme="http://danielroop.com/blog" term="rant" /><category scheme="http://danielroop.com/blog" term="software" /><category scheme="http://danielroop.com/blog" term="career" /><category scheme="http://danielroop.com/blog" term="passion" /><category scheme="http://danielroop.com/blog" term="work" />		<summary type="html"><![CDATA[Passion.  I have come to the conclusion that, that simple word is what separates an average developer from a great developer.  IQ, education, degree, books, none of that matters, these are all symptoms of passion.  A passionate developer will use these tools to find answers and refine his/her craft, so they are [...]]]></summary>
		<content type="html" xml:base="http://danielroop.com/blog/2008/05/09/what-makes-a-great-developer/"><![CDATA[<p>Passion.  I have come to the conclusion that, that simple word is what separates an average developer from a great developer.  IQ, education, degree, books, none of that matters, these are all symptoms of passion.  A passionate developer will use these tools to find answers and refine his/her craft, so they are good indicators of a great developer, but not quantifiers.  </p>
<p>A great developer takes ownership of his product, even if he doesn&#8217;t believe in the product.  That person will most likely pour their life and soul into their current assignment.  Typically you will find this person spending hours of their own researching and visiting user groups to enhance their skills. Some might even stop shaving facial hair in order to show their dedication to a particular assignment.</p>
<p>Should this be expected of all developers?  No!  Not everyone needs to have that level of passion for a project, but the chef needs it.  I love the show Hell&#8217;s Kitchen and you can tell Gordon Ramsey takes a passion in what he does.  Because of that passion he drives his potential employees to become better Chefs.  This effect is exactly why the team leader needs to have this passion.  </p>
<p>Time does not give you this passion, so in my opinion it doesn&#8217;t make sense to have the longest running employee be given top developer ranking.  Sometimes age can push you in the opposite direction, and you no longer care about the right things anymore.  Instead you care about trivial things like your dog, or your kids soccer game, or your birthday, or the big kicker sleep! I jest.</p>
<p>Why is passion so important?  Is it because with time you care less?  Not really.  I believe this industry is extremely exhausting.  Every time you turn around there is a new hot trend, and unless you are on it, you are so last minute!  That is easy enough to remedy, just don&#8217;t get on the new train, then you don&#8217;t need the passion.  The problem with that is that the industry is so young, if you don&#8217;t stay on the train you will probably be creating more work for yourself by following old practices that are more time consuming.  This isn&#8217;t a problem in more established fields like Architecture (of the wood/cement type), or Dentistry (of the teeth type), because&#8230;they are established.  These professions have been refined over hundreds if not thousands of years of the human experience.  What?  I don&#8217;t believe that statement myself, but think about it. Architecture has been around for literally thousands of years.  Humans have had an extremely long amount of time to find out what works and what doesn&#8217;t.  Programming has been around for 20+?  There is a big difference there.</p>
<p>There is another aspect to the passion.  Even after we have refined our craft to the point where it isn&#8217;t changing every 5 seconds, we will still need passionate developers.  That is because programming is only about 20% of what we actually do for the organization we are apart of.  We, developers, are responsible for building systems that satisfy business needs.  There is no one size fits all here, we have to understand what the business needs in order to build it.  That is what I love about what I do, because with every new job I can completely switch my entire industry, but be doing the same thing.  So if I get bored with the travel industry, I can switch back to the financial industry, or I can switch to the military industry.  But the flip side of that is I have to be passionate enough to invest the time and energy into understanding the business as my users understand the business.  Otherwise you won&#8217;t be able to produce the highest quality product.</p>
<p>I imagine this is why 37Signals is so successful.  They always talk about building applications for themselves.  This is an easy way out, this allows them to bypass the second part of the passion, because they are the users, so they already understand what they want.  This is not a bad approach, but everyone can&#8217;t do this.  Could you imagine if doctors or lawyers had to write their own software, they would have to spend an additional 4+ years in school on top of their already 8+ years.  They wouldn&#8217;t ever get anything done.  I am not knocking 37Signals, I am just suggesting everyone can&#8217;t build software for themselves.  Especially since it takes a certain mind to wrap around software engineering and it is rare to find a master of two trades that would be able to do this for every industry (not impossible, just improbable).</p>
<p>So what does it all mean?  I believe it means that it doesn&#8217;t matter how fast you code, or how many patterns you know, but it is about the fact that you care about what you are doing.  That probably seems obvious, but I personally find it extremely enlightening.  Whenever I write a piece of code I think about why I did it, and ask if there is a better way.  I don&#8217;t become attached to code, so when I learn a new technique I am not afraid to rewrite old code. I don&#8217;t see writing code as my job, I see building solutions to business problems as my job.  The work is in figuring out what to build and how to build it, not the code that is making it happen.  </p>
<p>This may be a bit presumptuous but I believe that is the difference between a great developer and an average developer.  A great developer helps build solutions to business problems and needs, and an average developer just takes orders and writes code. All the work is in working with the business to figure out what they want and how to do it, to a great developer writing code is like polishing the hardwood floors, it is the cherry on top of the perfect ice cream sundae.</p>
]]></content>
	</entry>
		<entry>
		<author>
			<name>Daniel Roop</name>
						<uri>http://danielroop.com</uri>
					</author>
		<title type="html"><![CDATA[JRuby, Ruby gem command conflict]]></title>
		<link rel="alternate" type="text/html" href="http://danielroop.com/blog/2008/04/18/jruby-ruby-gem-command-conflict/" />
		<id>http://danielroop.com/blog/2008/04/18/jruby-ruby-gem-command-conflict/</id>
		<updated>2008-04-18T19:38:58Z</updated>
		<published>2008-04-18T19:38:58Z</published>
		<category scheme="http://danielroop.com/blog" term="development" /><category scheme="http://danielroop.com/blog" term="languages" /><category scheme="http://danielroop.com/blog" term="programming" /><category scheme="http://danielroop.com/blog" term="bash" /><category scheme="http://danielroop.com/blog" term="bsh" /><category scheme="http://danielroop.com/blog" term="gem" /><category scheme="http://danielroop.com/blog" term="ide" /><category scheme="http://danielroop.com/blog" term="jruby" /><category scheme="http://danielroop.com/blog" term="mac" /><category scheme="http://danielroop.com/blog" term="path" /><category scheme="http://danielroop.com/blog" term="ruby" /><category scheme="http://danielroop.com/blog" term="script" /><category scheme="http://danielroop.com/blog" term="Scripts" /><category scheme="http://danielroop.com/blog" term="shell" /><category scheme="http://danielroop.com/blog" term="symlink" />		<summary type="html"><![CDATA[I would have to assume that there are plenty of developers out there that want to install JRuby and Ruby on the same machine.  There is a tragic flaw with this, the gem command is the same for both. If you add both to the path there is no way to distinguish between the [...]]]></summary>
		<content type="html" xml:base="http://danielroop.com/blog/2008/04/18/jruby-ruby-gem-command-conflict/"><![CDATA[<p>I would have to assume that there are plenty of developers out there that want to install JRuby and Ruby on the same machine.  There is a tragic flaw with this, the gem command is the same for both. If you add both to the path there is no way to distinguish between the two version, so by default the most recent gem command included on the path will be used.  I have come up with a solution that I am happy with to solve this problem so I thought I would share it with the world.</p>
<p>First I am on a Mac, but this should work on any *nix based system.  Also I am using bsh, so if you use a different shell make sure to adjust the setting for that shell.</p>
<p>The process is quite simple, download/install Ruby and JRuby.  There are numerous tutorials for getting Ruby installed I would recommend the <a href="http://hivelogic.com/articles/2005/12/ruby_rails_lighttpd_mysql_tiger">install guide </a>put out by Dan Benjamin at Hive logic.  I typically tweak Dan&#8217;s tutorials and put my binaries in their own directory.  So instead of </p>
<pre>
/usr/local
</pre>
<p>I would install the binaries to </p>
<pre>
/usr/local/ruby/ruby-1.8.4
</pre>
<p>Then I would make a symlink from /usr/local/ruby/current to the most recent binary.  </p>
<pre>
cd /usr/local/ruby
ln -s /usr/local/ruby/ruby-1.8.4 current
</pre>
<p>And add /usr/local/ruby/current to my path.</p>
<pre>
RUBY_PATH="/usr/local/ruby/current"
export RUBY_PATH
PATH="${RUBY_PATH}/bin:${PATH}"
export PATH
</pre>
<p>I would typically add these lines to my ~/.bash_profile script to be executed whenever my shell starts.</p>
<p>All is fine and dandy until I install JRuby.  To install JRuby simply <a href="http://dist.codehaus.org/jruby/">download</a> the latest flavor. JRuby 1.1 was just released so I will use that as my example. Unpack the tar into /usr/local/jruby/jruby-1.1.  Now repeat the step above for creating a symlink to /usr/local/jruby/current.</p>
<pre>
cd /usr/local/jruby
ln -s /usr/local/jruby/jruby-1.1 current
</pre>
<p>Now here is the first tricky part.  Because I want ruby to be my default command line ruby executable I don&#8217;t want to add JRuby to the path. I do however, add the JRUBY_HOME environment variable.  To do this simply add the following lines to your <em>~/.bash_profile</em> script.</p>
<pre>
JRUBY_HOME="/usr/local/jruby/current"
export JRUBY_HOME
</pre>
<p>Now I need to create a way to add JRuby to the path as I need it. To do this I created a script and placed it in a folder located in my User folder </p>
<pre>~/Scripts</pre>
<p>I named the script <em>load_jruby</em> but you could name the file whatever you like. In the file I placed the following contents</p>
<pre>
PATH="${JRUBY_HOME}/bin:${PATH}"
export PATH
</pre>
<p>The final piece to the equation is called <em>sourcing the script</em>.  This basically means you want to run the script in the current process.  You need to do this because by default when you execute a script from the command line it spawns a new thread and any environment variables you change would only be affected inside of that script.  To source the script you simply prefix the command with a &#8220;.&#8221;.  So instead of</p>
<pre>
~/Scripts/load_jruby
</pre>
<p>you would type</p>
<pre>
. ~/Scripts/load_jruby
</pre>
<p>Now if you type </p>
<pre>
jruby --version
</pre>
<p>You should get output describing the version of JRuby you are running.</p>
<p>Obviously if you would prefer to have JRuby be your default Ruby installation just reverse the instructions.  Also this will not affect any defaults inside of IDEs like Aptana, so make sure you set those up for their respective environments.</p>
<p>There you have it, you can now have Ruby and JRuby installed on the same machine and work with them independently from the command line.  Whenever you want to work with Ruby open a new terminal and start typing.  If you want to work with JRuby open a new terminal and run your script to start rocking the JRuby.</p>
]]></content>
	</entry>
		<entry>
		<author>
			<name>Daniel Roop</name>
						<uri>http://danielroop.com</uri>
					</author>
		<title type="html"><![CDATA[Aptana RadRails 1.0]]></title>
		<link rel="alternate" type="text/html" href="http://danielroop.com/blog/2008/03/12/aptana-radrails-10/" />
		<id>http://danielroop.com/blog/2008/03/12/aptana-radrails-10/</id>
		<updated>2008-03-12T23:41:13Z</updated>
		<published>2008-03-12T23:41:13Z</published>
		<category scheme="http://danielroop.com/blog" term="development" /><category scheme="http://danielroop.com/blog" term="software" /><category scheme="http://danielroop.com/blog" term="ide" /><category scheme="http://danielroop.com/blog" term="java" /><category scheme="http://danielroop.com/blog" term="radrails" /><category scheme="http://danielroop.com/blog" term="rails" /><category scheme="http://danielroop.com/blog" term="ruby" /><category scheme="http://danielroop.com/blog" term="textmate" />		<summary type="html"><![CDATA[I have recently become frustrated with the Eclipse IDE.  I use 3.2 to do my java development, Flex Builder to do Flex development and Aptana RadRails for Ruby and Rails stuff.  This last week I almost cracked and purchased  TextMate , to see what all the fuss was, but since Aptana just [...]]]></summary>
		<content type="html" xml:base="http://danielroop.com/blog/2008/03/12/aptana-radrails-10/"><![CDATA[<p>I have recently become frustrated with the Eclipse IDE.  I use 3.2 to do my java development, Flex Builder to do Flex development and Aptana RadRails for Ruby and Rails stuff.  This last week I almost cracked and purchased <a href="http://macromates.com/"> TextMate </a>, to see what all the fuss was, but since <a href="http://www.aptana.com/view/blog_front_page#/node/320">Aptana just released 1.0</a> of their RadRails plugin I figured I would give them a little more time.</p>
<p>I don&#8217;t tend to use most of the IDE features, highlighting and formatting are the big things for me, but code insight is always a plus.  I will give RadRails a few weeks, or until another great bundle that makes TextMate super cheap and make my decision then.</p>
]]></content>
	</entry>
		<entry>
		<author>
			<name>Daniel Roop</name>
						<uri>http://danielroop.com</uri>
					</author>
		<title type="html"><![CDATA[2nd Player Revived]]></title>
		<link rel="alternate" type="text/html" href="http://danielroop.com/blog/2008/03/05/2nd-player-revived/" />
		<id>http://danielroop.com/blog/2008/03/05/2nd-player-revived/</id>
		<updated>2008-03-06T01:03:40Z</updated>
		<published>2008-03-06T01:03:40Z</published>
		<category scheme="http://danielroop.com/blog" term="gaming" /><category scheme="http://danielroop.com/blog" term="project" /><category scheme="http://danielroop.com/blog" term="2ndPlayer" /><category scheme="http://danielroop.com/blog" term="podcast" />		<summary type="html"><![CDATA[Michael, Bucky and I have cranked out another 2nd Player Episode.  We cover where we have been, and plans we have for the site and podcast.  We are not sure if we are going to stick with the bi-weekly schedule we had before, but we are going to attempt to be more regular [...]]]></summary>
		<content type="html" xml:base="http://danielroop.com/blog/2008/03/05/2nd-player-revived/"><![CDATA[<p>Michael, Bucky and I have cranked out another <a href="http://2ndplayer.net/2008/03/05/episode-7-stop-and-pop/">2nd Player Episode</a>.  We cover where we have been, and plans we have for the site and podcast.  We are not sure if we are going to stick with the bi-weekly schedule we had before, but we are going to attempt to be more regular than we have been recent.  Any comments are welcome as always, thanks for listening.</p>
]]></content>
	</entry>
		<entry>
		<author>
			<name>Daniel Roop</name>
						<uri>http://danielroop.com</uri>
					</author>
		<title type="html"><![CDATA[New Layout and Great T-Shirt]]></title>
		<link rel="alternate" type="text/html" href="http://danielroop.com/blog/2008/02/20/new-layout-and-great-t-shirt/" />
		<id>http://danielroop.com/blog/2008/02/20/new-layout-and-great-t-shirt/</id>
		<updated>2008-02-21T03:11:40Z</updated>
		<published>2008-02-21T03:11:40Z</published>
		<category scheme="http://danielroop.com/blog" term="software" /><category scheme="http://danielroop.com/blog" term="layout" /><category scheme="http://danielroop.com/blog" term="rss" /><category scheme="http://danielroop.com/blog" term="tallyhoh" /><category scheme="http://danielroop.com/blog" term="wordpress" />		<summary type="html"><![CDATA[For some reason, I decided to upgrade WordPress to 2.3.3 tonight.  In the process I decided my layout was a little dated, so I updated that too.  As an added bonus, the RSS Widget began working, I guess it didn&#8217;t work on the old WordPress engine for some reason.
I even took the time [...]]]></summary>
		<content type="html" xml:base="http://danielroop.com/blog/2008/02/20/new-layout-and-great-t-shirt/"><![CDATA[<p>For some reason, I decided to upgrade WordPress to 2.3.3 tonight.  In the process I decided my layout was a little dated, so I updated that too.  As an added bonus, the RSS Widget began working, I guess it didn&#8217;t work on the old WordPress engine for some reason.</p>
<p>I even took the time to tweak the layout a little to include tags and categories, as well as updated the header image to be one of my own.  You are looking (if you are on my site and not reading this in your rss reader) at Lake Eola at Downtown Orlando.</p>
<p>In completely unrelated news, I put together an <a href="http://www.cafepress.com/danielroop.230662363">Infant T-Shirt</a> for my son at <a href="http://www.cafepress.com/danielroop">CafePress</a> in honor of TallyHoh launching.</p>
]]></content>
	</entry>
		<entry>
		<author>
			<name>Daniel Roop</name>
						<uri>http://danielroop.com</uri>
					</author>
		<title type="html"><![CDATA[My First Bookmarklet for TallyHoh]]></title>
		<link rel="alternate" type="text/html" href="http://danielroop.com/blog/2008/02/20/my-first-bookmarklet-for-tallyhoh/" />
		<id>http://danielroop.com/blog/2008/02/20/my-first-bookmarklet-for-tallyhoh/</id>
		<updated>2008-02-21T01:23:15Z</updated>
		<published>2008-02-20T14:00:50Z</published>
		<category scheme="http://danielroop.com/blog" term="project" /><category scheme="http://danielroop.com/blog" term="bookmarklet" /><category scheme="http://danielroop.com/blog" term="javascript" /><category scheme="http://danielroop.com/blog" term="tallyhoh" />		<summary type="html"><![CDATA[One of the things Tyler and I discussed doing to make the user experience with TallyHoh a little better, was to create a bookmarklet.  I had never done this before so I did a little research to see what was currently out there.  I knew del.icio.us had an active bookmarklet community so I [...]]]></summary>
		<content type="html" xml:base="http://danielroop.com/blog/2008/02/20/my-first-bookmarklet-for-tallyhoh/"><![CDATA[<p>One of the things Tyler and I discussed doing to make the user experience with <a href="http://tallyhoh.com" title="Social RSS Reader">TallyHoh</a> a little better, was to create a bookmarklet.  I had never done this before so I did a little research to see what was currently out there.  I knew <a href="http://del.icio.us/">del.icio.us</a> had an active bookmarklet community so I started there.</p>
<p>What I found was pretty amazing, everything from <a href="http://del.icio.us/help/buttons">bookmarklets</a> that simply redirected you to delicious, to full blown<a href="http://www.cs.ucf.edu/~cmillward/delish.php"> javascript rendered forms</a> that allow you to tag your feeds as they are submitted.  After taking all that in I decided to start with a simple redirect.</p>
<p>At first everything went great, unfortunately I needed to do a post, and the examples I saw didn&#8217;t suffice.  So putting on my javascript hat, I came up with the idea to create a form via javascript and submit the form.  I realize I am not the first to come to this conclusion, I was just excited that I thought of it.  This ended up working like a charm, and what I ended up with was this.</p>
<p><a href="javascript:var%20f%20=%20document.createElement('form');%20f.style.display='none';f.method='POST';f.action='http://tallyhoh.com/feeds';var%20m=document.createElement('input');m.setAttribute('type','hidden');m.setAttribute('name','subscribe');m.setAttribute('value','1');f.appendChild(m);var%20m2=document.createElement('input');m2.setAttribute('type','hidden');m2.setAttribute('name','feed[url]');m2.setAttribute('value',location.href);f.appendChild(m2);f.submit();">Add Feed To TallyHoh</a></p>
<p>If you drag that link into your toolbar you will have all the power of TallyHoh at your fingertips.  Well at least the ability to add feeds and subscribe to them.  Basically what happens is this crafts a request to add a feed to TallyHoh, if you are logged in (via remember me) it will automatically subscribe you to the feed.  If you are not logged in, it will explain that you are a chump and should log in, and allow you to subscribe at that point.</p>
<p>Overall I was pleased with how it turned out.  My first bookmarklet went off without a hitch.  Feel free to try it out and let me know what you think.  Eventually this will live somewhere on TallyHoh but Tyler and I are still figuring out where.</p>
]]></content>
	</entry>
		<entry>
		<author>
			<name>Daniel Roop</name>
						<uri>http://danielroop.com</uri>
					</author>
		<title type="html"><![CDATA[Tally, Tally, TallyHoh HOH!!!! &#8230;The Social RSS Reader]]></title>
		<link rel="alternate" type="text/html" href="http://danielroop.com/blog/2008/02/18/tally-tally-tallyhoh-hoh-the-social-rss-reader/" />
		<id>http://danielroop.com/blog/2008/02/18/tally-tally-tallyhoh-hoh-the-social-rss-reader/</id>
		<updated>2008-02-18T23:06:37Z</updated>
		<published>2008-02-18T22:41:53Z</published>
		<category scheme="http://danielroop.com/blog" term="social" /><category scheme="http://danielroop.com/blog" term="software" /><category scheme="http://danielroop.com/blog" term="daniel" /><category scheme="http://danielroop.com/blog" term="openid" /><category scheme="http://danielroop.com/blog" term="protoh" /><category scheme="http://danielroop.com/blog" term="tallyhoh" />		<summary type="html"><![CDATA[You have to read the title as if your are Lion-O from ThunderCats.  You remember&#8230;&#8221;Thunder, Thunder, ThunderCats&#8230;HO!!!!!&#8221;. The new product that Tyler and I are pushing out has nothing to do with ThunderCats, that is unless you subscribe to a ThunderCat News Feed like Thundercats The Movie.
Without further ado&#8230; 
You have heard me talk [...]]]></summary>
		<content type="html" xml:base="http://danielroop.com/blog/2008/02/18/tally-tally-tallyhoh-hoh-the-social-rss-reader/"><![CDATA[<p>You have to read the title as if your are <a href="http://en.wikipedia.org/wiki/Lion-O">Lion-O</a> from ThunderCats.  You remember&#8230;&#8221;Thunder, Thunder, ThunderCats&#8230;HO!!!!!&#8221;. The new product that Tyler and I are pushing out has nothing to do with ThunderCats, that is unless you subscribe to a ThunderCat News Feed like <a href="http://thundercats-the-movie.net/feed/atom/">Thundercats The Movie</a>.</p>
<p>Without further ado&#8230; </p>
<p>You have heard me talk about it, and now the wait is over!  Tyler and I (mostly Tyler) have been working to prepare our <del>beta</del> initial release of <a href="http://tallyhoh.com" title="Social RSS Reader">TallyHoh</a>.  We officially launched it <abbr title="2008-02-18T19:00:50+00:00">today</abbr> and are taking the Better, Not Beta.  We have some updates we plan to do with the UI, but we want to see if people actually like the product.  I have been using our builds for the last 9 months now, and I couldn&#8217;t live without it.  The end goal is to provide a place for you to aggregate all your feeds (RSS Reader) with the functionality to share and express your opinion about the content you are reading (Social) to other users (tally = positive, folly = negative, nully = don&#8217;t care).  We are attempting to implement as many web standards as we think makes= sense, hReview tags for our review sections, OpenID for our authentication, OPML for importing and exporting (boo) your subscription list and RSS and ATOM for our syndication methods.  You may notice a friends feature missing when you sign up.  This is mainly because we are hoping a project like <a href="http://code.google.com/p/diso/">DiSo</a> will gain enough momentum or at least get to a point where we can use the standards they produce as an open friend network so we don&#8217;t have to recreate the wheel for the 1 Billionth time.</p>
<p>Thanks to everyone who takes the time to try out our first creation.  And to all those who don&#8217;t&#8230;well thanks for reading my blog ;-).  If you have any issues or comments at all please don&#8217;t hesitate to email me (daniel [at] protoh dot com).</p>
]]></content>
	</entry>
		<entry>
		<author>
			<name>Daniel Roop</name>
						<uri>http://danielroop.com</uri>
					</author>
		<title type="html"><![CDATA[Basic Buildr Tutorial]]></title>
		<link rel="alternate" type="text/html" href="http://danielroop.com/blog/2008/02/15/basic-buildr-tutorial/" />
		<id>http://danielroop.com/blog/2008/02/15/basic-buildr-tutorial/</id>
		<updated>2008-02-15T15:23:13Z</updated>
		<published>2008-02-15T15:23:13Z</published>
		<category scheme="http://danielroop.com/blog" term="build" /><category scheme="http://danielroop.com/blog" term="ant" /><category scheme="http://danielroop.com/blog" term="buildr" /><category scheme="http://danielroop.com/blog" term="java" /><category scheme="http://danielroop.com/blog" term="maven" /><category scheme="http://danielroop.com/blog" term="ruby" />		<summary type="html"><![CDATA[About a week ago now someone commented on my Buildr review post about a possible tutorial on how to use Buildr.  I thought about writing something up, but then I remember that I had purchased the MacHeist Bundle a few weeks back and that came with Snapz Pro x.  So I decided to [...]]]></summary>
		<content type="html" xml:base="http://danielroop.com/blog/2008/02/15/basic-buildr-tutorial/"><![CDATA[<p>About a week ago now someone commented on my <a href="http://incubator.apache.org/buildr/">Buildr</a> review post about a possible tutorial on how to use Buildr.  I thought about writing something up, but then I remember that I had purchased the <a href="http://www.macheist.com/">MacHeist</a> Bundle a few weeks back and that came with <a href="http://www.ambrosiasw.com/utilities/snapzprox/">Snapz Pro x</a>.  So I decided to take a stab at screen casting.  It turned out to be harder than I anticipated to get a solid pass through.  The final video I published was still not of the quality that I would have liked but maybe if I decide to try it again I will get better at it.  The hardest thing was getting the recording to look good on the flash video sharing sites.  I ended up going with <a href="http://revver.com/">Revver</a>.  Not because of the monetary aspects, although that is nice, but because it seems to produce the highest quality output.  Unfortunately that wasn&#8217;t automatic.  I originally recorded the screencast at my full resolution, capturing pretty much everything on my screen.  That was a huge mistake, that scaled down to 640&#215;480 for the flash version did not scale very well.  Apparently video is not like picture, where the big images squash well to small images.  Ultimately I ended up recording a 640&#215;480 window of my desktop and I think the quality is acceptable for a tutorial.</p>
<p>Enough rambling about how hard it was to produce this, here is the final product.  Please let me know what you think.</p>
<p><script src="http://flash.revver.com/player/1.0/player.js?mediaId:682708;affiliateId:159101" type="text/javascript"></script></p>
]]></content>
	</entry>
	</feed><!-- Dynamic Page Served (once) in 0.565 seconds --><!-- Cached page served by WP-Cache -->
