<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Planet Ruby</title>
	<link rel="self" href="http://planetruby.0x42.net/atom.xml"/>
	<link href="http://planetruby.0x42.net/"/>
	<id>http://planetruby.0x42.net/atom.xml</id>
	<updated>2010-09-08T05:00:11+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en-US">
		<title type="html">Matz Ruby World Keynote</title>
		<link href="http://www.chadfowler.com/2010/9/6/matz-ruby-world-keynote"/>
		<id>tag:www.chadfowler.com,2010-09-06:21661</id>
		<updated>2010-09-06T05:41:00+00:00</updated>
		<content type="html">&lt;p&gt;The following is my real time transcription of the translation of &lt;a href=&quot;http://www.rubyist.net/~matz/&quot;&gt;Matz’s&lt;/a&gt; speech at &lt;a href=&quot;http://www.rubyworld-conf.org&quot;&gt;Ruby World 2010&lt;/a&gt;.  I was typing as fast as I could while he spoke, and I probably made some mistakes. I might have left out some words or sentences. If anything doesn’t make sense, assume it’s my fault and not Matsumoto-san’s. Anyway, I enjoyed Matz’s keynote and thought other English speakers might like a chance to see what he said.&lt;/p&gt;


	&lt;h2&gt;I’m Matsumoto&lt;/h2&gt;


	&lt;p&gt;I Started Ruby in 1993 at NaCL:http://www.netlab.jp/. When I joined the company after graduating from college, I didn’t have much to do at the time. I was not fired fortunately. But I had plenty of time so I started to work on Ruby as a side project.&lt;/p&gt;


	&lt;p&gt;So at the time, there was &lt;span class=&quot;caps&quot;&gt;ONE&lt;/span&gt; user of Ruby. Then I started to develop Ruby with some other friends.&lt;/p&gt;


	&lt;p&gt;In 1995, Ruby was released and distributed over the internet for general use. At the time, people on usenet got interested in Ruby and gave me some feedback. Also we used a mailing list to distribute information on Ruby.&lt;/p&gt;


	&lt;p&gt;So within days, about 200 people got involved. So in 1995, the number of people who knew something about Ruby was about 200.&lt;/p&gt;


	&lt;p&gt;Even after that, Ruby was known to a relatively limited number of people.&lt;/p&gt;


	&lt;p&gt;Then in 1999, I published a book called Object Oriented Scripting with Ruby. This was the first book on Ruby. It’s only natural. Who else is going to write a book on Ruby, right??&lt;/p&gt;


	&lt;p&gt;At the time, this sold pretty well. Cumulatively, we sold almost 20,000 copies. I’m sure I’m allowed to discuss this number. Probably it’s only 17,000 in real numbers. This was in Japanese, so Ruby was known to the whole nation. So in 1999, Ruby was known to a lot more people. More engineers and programmers knew about the language.&lt;/p&gt;


	&lt;p&gt;I started to hear from many people that they knew about Ruby.&lt;/p&gt;


	&lt;p&gt;In year 2000, &lt;a href=&quot;http://www.pragprog.com/titles/ruby/programming-ruby&quot;&gt;a book in English&lt;/a&gt; was published.  Many people in the world came to know about Ruby.&lt;/p&gt;


	&lt;p&gt;Then in 2004, &lt;a href=&quot;http://rubyonrails.org&quot;&gt;Ruby on Rails&lt;/a&gt; was released. Of course, most people know about this Web application framework. Ruby on Rails is very productive compared to competing frameworks in other languages.  There was an active discussion on the comparison of performance. It was welcomed by many people. We estimate that the number of users grew to 100,000 people in 2004.&lt;/p&gt;


	&lt;p&gt;In 2008, US-based Gartner released a survey. In the report, Gartner estimated that the total number of Ruby users reached 1,000,000. This was a huge number as you can see.&lt;/p&gt;


	&lt;p&gt;In the same report, the reporter predicted that in five years (2013)  the total number of users would be 4,000,000.  Ruby is open source. You don’t have to pay anything to use it. You just download it. It is therefore very difficult to know how many people are using it. I created Ruby myself and I don’t know how many people are using it, so I’m not sure how Gartner reached their conclusion.  But anyway, 4,000,000 people are predicted to be using Ruby in 2013.&lt;/p&gt;


	&lt;p&gt;So in 20 years, this project which started with one person may have increased from 1 to 4,000,000 users. This is beyond the normal growth rate of a technology.&lt;/p&gt;


	&lt;p&gt;This period of Ruby’s popularity was due to the popularity of Ruby on Rails.&lt;/p&gt;


	&lt;p&gt;There is a ccompany called &lt;a href=&quot;http://www.tiobe.com/&quot;&gt;Tiobe Software&lt;/a&gt; which is a software company in the US. Their &lt;a href=&quot;http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&quot;&gt;Tiobe Index&lt;/a&gt; rates the popularity of programming languages using Google, Yahoo, Microsoft, and other search engines to rate the popularity of languages on the internet. Back in 2009, according to Tiobe index, Ruby was ranked #10. And in 2008, it was ranked #9.&lt;/p&gt;


	&lt;p&gt;In this year, 2010, it was demoted to #12.&lt;/p&gt;


	&lt;p&gt;You may have a concern about the future of Ruby, but if you drill down deeper, you will see: objective-c is getting more popular, driven by iPad, iPod, etc. development. Objective-C is required.  So it jumped form 42 to 11.  And Go by Google was released in April of last year. So where it didn’t exist previously it jumped up to #15.&lt;/p&gt;


	&lt;p&gt;As you can see, Ruby represents 2.221% of programming language references according to Tiobe.  That’s good.&lt;/p&gt;


	&lt;p&gt;So don’t have a concern about this.&lt;/p&gt;


	&lt;p&gt;But this marks a very interesting symptom. The end of the ruby “bubble”. When I joined the company, the bubble economy was still there. Then it collapsed and caused a lot of trouble. A “bubble” is not sustainable. Bubbles are therefore undesirable.&lt;/p&gt;


	&lt;p&gt;There are many comedians and musicians named as “one-hit wonders”. I don’t want Ruby to become that.&lt;/p&gt;


	&lt;p&gt;The life expectancy of a programming language is pretty long. Fortran was created in the 1950s. I want Ruby to be like this. That’s why this presentation is called “Sustainable Ruby”.  The question is how to maintain Ruby’s high level of quality and the high level of quality of the people.&lt;/p&gt;


	&lt;p&gt;So in order to implement “sustainable ruby”, we must first discuss the benefit of Ruby.  Benefit is very important for Ruby to be sustainable.&lt;/p&gt;


	&lt;p&gt;Benefit #1: Productivity. One of the reasons that Ruby is quite popular is that its productivity is quite high. An embodiment of this is Ruby on Rails. When Rails was released, it was often cited that people would say that Rails had 10x productivity over java.  Ruby developers didn’t really believe this, but a specific developer in the US wrote an article saying that he felt that &lt;span class=&quot;caps&quot;&gt;HIS&lt;/span&gt; productivity over Java when switching to Rails was 10x.  In 2005 and 2006, this one sentence caused a lot of arguments and discussion.&lt;/p&gt;


	&lt;p&gt;After several years of discussion and usage of Ruby on Rails, it may not be 10x but there are many cases where you can enjoy the productivity of Ruby on Rails over Java.&lt;/p&gt;


	&lt;p&gt;Also, another example of how Rails is productive is that it can take only 15 minutes to develop a web application. In 2004 at a Brazilian conference, David Heinemeier Hansson demonstrated web application development using Ruby on Rails. Without any preparation, no design, no database, he started to create a blog application. You could create articles, list them, etc. He created this application in 15 minutes. In 2004, creating an application in 15 minutes it was astonishing.  It was great marketing to do that.&lt;/p&gt;


	&lt;p&gt;I’m a software engineer and I’m not very interested in marketing. But that video was a huge contributor to making Ruby on Rails popular. Ruby itself didn’t have any marketing, but Ruby on Rails promoted Ruby as well.&lt;/p&gt;


	&lt;p&gt;Was the Rails framework the sole reason behind the productivity boost when using it? I don’t think so. Ruby itself also makes the productivity possible.&lt;/p&gt;


	&lt;p&gt;Post-Rails frameworks.
  Merb
  Sinatra
  Ramaze
  Rails 3&lt;/p&gt;


	&lt;p&gt;Merb was emerging as a post-Rails framework, but it was quite unique in open software. Merb and Rails jointly created a new framework in the form of Rails 3. Also, Rails 3 is inheriting some of the Merb characteristics. Totally new framework by combining/merging different frameworks.&lt;/p&gt;


	&lt;p&gt;So far I’ve been talking about the benefits that Ruby can provide in order to make Ruby sustainable.&lt;/p&gt;


	&lt;p&gt;The second element is the Potential the language can demonstrate. Now we have the technology and the technology is convenient and we can create some benefits. But we need to have potential in the Language for people to make investment.&lt;/p&gt;


	&lt;p&gt;Around Ruby we have much new technology. Ruby on Rails, for example, introduced innovations in Web development. It wasn’t the first web framework. Not even the first Web framework in Ruby. There were already a lot of web application frameworks in Ruby when Rails was released. But under the circumstances, Ruby on Rails implemented new ideas that triggered productivity enhancements in Ruby &lt;span class=&quot;caps&quot;&gt;AND&lt;/span&gt; other languages (python, etc.). So Ruby on Rails had a huge impact on the web application development arena.&lt;/p&gt;


	&lt;p&gt;Whenever a new technology is created, the surrounding areas also enjoy the benefits of this technology. Not all new technologies will be successful, but some of them will really boost the entire IT industry.&lt;/p&gt;


	&lt;p&gt;We do see some of that trend in the industry. To support the new technology we need to have smart engineers (hackers). The smart engineers usually come to the interesting technology. Whenever there’s new technology that’s created, it invites the smart engineers who then create new technology. This is a positive cycle. Ruby is one of these positive cycle enforcers.&lt;/p&gt;


	&lt;p&gt;Benefit, Potential, and….&lt;/p&gt;


	&lt;p&gt;Passion&lt;/p&gt;


	&lt;p&gt;The author of The Passionate Programmer, Chad Fowler, is here. I feel embarrassed to say something about him before his keynote. But I have to say this. He is right to emphasize passion. Many people are passionate about ruby. Engineer passion is very important.  Passion is key.&lt;/p&gt;


	&lt;p&gt;In the US there is a conference called RubyConf:http://rubyconf.org. The first one was held in Tampa Florida. There were only 34 attendees at the first conference. Right now we have more than 500 people attending. If the venue could handle it we could probably fit 700 or 1000. They actually limit the number of attendees. They sell out every year. This year RubyConf will be held in &lt;a href=&quot;http://www.city.matsue.shimane.jp/kankou/en/&quot;&gt;Matsue’s&lt;/a&gt; sister city, New Orleans. It will be the 10th. It is the longest running Ruby conference on the globe.&lt;/p&gt;


	&lt;p&gt;Euruko. Poland, Barcelona, Berlin, Prague.  On the last day, Euruko always invites speakers to bid on where Euruko should be. Speakers make their case and the location of the next Euruko is voted on.&lt;/p&gt;


	&lt;p&gt;Two weeks ago we had RubyKaigi.  It was held in Tsukuba City. Not in Tokyo. I graduated from Tsukuba univeristy. It made me feel like i was going home. We had about 700 people at RubyKaigi this year. RubyConf will have 500 (ed: actually 600 to 650). The biggest conference is held in Japan.&lt;/p&gt;


	&lt;p&gt;As you can see here in this venue as well Ruby World has so many people from so many countries. I would say that the IT industry is japan is becoming truly internationalized. We have a disadvantage in Matsue because it’s so remote, but the passion of the Rubyists makes it possible.&lt;/p&gt;


	&lt;p&gt;We also have regional Ruby conferences in India, China, Brazil, all over the US, etc. They also have another conference called RailsConf:http://railsconf.org, which is operated by a professional event management company (ed: and &lt;a href=&quot;http://rubycentral.org&quot;&gt;Ruby Central&lt;/a&gt;). They had 1800 people. So that really boosts Ruby.&lt;/p&gt;


	&lt;p&gt;Startup passion.  I’m going to talk about US companies, but there are many venture companies in Silicon valley who are very interested in Ruby. More than 60% of VCs use Ruby to provide the system.  Among the famous ones known to Japan includes Twitter. As a startup, they implemented everything using Ruby from bottom to top. Currently they have 100s of millions of users. Much of the RUby has been replaced but if you access twitter you can still see twitter driving the system.&lt;/p&gt;


	&lt;p&gt;As of last year another acronym was introduced “ARC”. Agile, Ruby/Rails, Cloud.  I’ve heard that VCs ask startups who aren’t using Ruby, “Why not?” Investors are pressuring startups to use Ruby. “It’s faster, so if you can shorten your release by one month why not use Ruby?”, they say.&lt;/p&gt;


	&lt;p&gt;A few years ago when startups were getting started, they wanted to attract smart engineers, so they used Ruby to attract them.&lt;/p&gt;


	&lt;p&gt;Executives’ passion: Productivity is the key.  It’s not just the engineers who are passionate about Ruby. Productivity is one of the biggest factors for businesses. Executives started to realize the importance of using a productive language. Productive languages drive profit.  Some executives are finding hope in Ruby.&lt;/p&gt;


	&lt;p&gt;Differentiation can be found by using Ruby. The japanese IT industry is characterized by conservatism, so many may be reluctant to use Ruby. But by making the decision to use Ruby, they may differentiate themselves. There is also the possibility to change the entire industrial structure by switching to Ruby and other open source technologies, driving more SMBs.&lt;/p&gt;


	&lt;p&gt;In Japan, major IT companies receive contracts and subcontract to others. But with Ruby and smart engineers, these can be driven to small businesses which can innovate. This drives hope.&lt;/p&gt;


	&lt;p&gt;Motivation drives Hope&lt;/p&gt;


	&lt;p&gt;for Food
for Money
  These are very pragmatic&lt;/p&gt;


	&lt;p&gt;for Good Cause
  But some people might make a bigger attempt to change the world.&lt;/p&gt;


	&lt;p&gt;Many people are finding hope in Ruby. Many found potential in Ruby.&lt;/p&gt;


	&lt;p&gt;Not all have succeeded.  Some are extremely successful. Some are not.  What made the difference?&lt;/p&gt;


	&lt;p&gt;In some cases, the benefit was not enough. Or people couldn’t see the potential. But the biggest factor was &lt;span class=&quot;caps&quot;&gt;PASSION&lt;/span&gt;!  How passionate or decisive they were made the difference.&lt;/p&gt;


	&lt;p&gt;Lots of people love Ruby. Pictured here (ed: he shows a picture in his slide) are the smiling faces of the staff of the RubyKaigi. This is not organized by professionals. 700 turnout is already beyond its technical limits. But when we ran the survey, most people were satisfied by the conference. It’s miraculous considering the tough circumstances. But these people are passionate.&lt;/p&gt;


	&lt;p&gt;Many people are surrounding ruby. Hacker,s engineers, executives.  They &lt;span class=&quot;caps&quot;&gt;LOVE&lt;/span&gt; Ruby.&lt;/p&gt;


	&lt;p&gt;Of course I love Ruby myself. It’s my child. Every day I am expanding my affection for Ruby. There are so many people out there that love Ruby. As a Japanese, I’m reluctant to say “love”. Actually one guy said “I love you”. I am poor at English. I was very embarrassed :) For Japanese, it’s difficult to express love in a direct fashion. Of course that guy didn’t mean “love”. He just loved Ruby. Like a strong kinship.&lt;/p&gt;


	&lt;p&gt;Many people love Ruby. Let me give you some examples:&lt;/p&gt;


	&lt;p&gt;NaCl. When i started at NaCl, Inoue-san he actually picked me up and allowed me to work on this. Back in 1995, there was no way to know if Ruby would be used by anyone. But the president, Mr. Inoue-san had the faith and the vision to hire me and let me work on Ruby. He gave me plenty of time to work on Ruby. It’s all possible because of him.&lt;/p&gt;


	&lt;p&gt;In 2006, the Matsue mayor actually visited our lab. We would like to use Ruby to revive the city. I had to reply, “Are you out of your mind?” Can you believe this person would try to revive our city using Ruby? Many people living in many places outside of Matsue, so I said maybe it’s difficult but someone from the city told me the Mayor was very serious about this. The mayor himself actually expressed his desire to use Ruby. So as a local government, Matsue city is committed to promote Ruby, which is very very exceptional on examination.  How much contribution we’re making to the city really is unknown.&lt;/p&gt;


	&lt;p&gt;This is Mr. Mizoguchi the Shimane governor. I don’t know how to show my appreciation to him. I’d like to take this opportunity to thank him again. There are many other local governments who are interested in using Ruby to revive their city. But the question is how passionate are the top management or the governor or mayor? Even if the promoters work hard, unless top management is passionate about the promotion it’s not going to work.&lt;/p&gt;


	&lt;p&gt;One exceptional case is the governor of &lt;a href=&quot;http://en.wikipedia.org/wiki/Fukuoka&quot;&gt;Fukuoka&lt;/a&gt;.  A rival of Shimane :). For some reason he really loves Ruby. I’m living her and he’s in Fukuoka. There’s no relation. But Fukuoka is committed to using Ruby and they have organized the Fukuoka award and they have the &lt;a href=&quot;http://rubybizcommons.jp/en/&quot;&gt;Ruby Business Commons&lt;/a&gt; headquarters.&lt;/p&gt;


	&lt;p&gt;Here is a noodle called Ruby on Matsue Ramen. The maker of this Ramen sent me an email. The maker of this has no connection to Ruby, but he has a local businesses and wants to promote Ruby. He offered to include the Ruby logo on this noodle to contribute to sales. It’s remarkable. This person volunteered to make Ruby Ramen for us without us asking.&lt;/p&gt;


	&lt;p&gt;And thanks to all the efforts of all these people, Ruby is exciting right now.&lt;/p&gt;


	&lt;p&gt;I have been engaged in Ruby for 17 years and i think it’s making sense for me to be passionate about Ruby. But many others are passionate about Ruby. I don’t understand why, but Ruby is loved. Love is driving Ruby.&lt;/p&gt;


	&lt;p&gt;With the support of so many people, we are able to hold this Ruby World conference for the next two days. And I hope that for these days we can fully discuss the benefits of Ruby so that it will be helpful to what you do. 17 years ago I was the only one person who used Ruby. But over 17 years, people who are using Ruby  (more than 1,000,000 people) in university Research, implemented in IT industry, etc.&lt;/p&gt;


	&lt;p&gt;Some of the things Ruby users are discussing are quite inspiring. Without this conference we can’t attract all of these great people to Matsue people. We should take advantage of this opportunity.&lt;/p&gt;


	&lt;p&gt;Ruby is supported by passion. And by love.&lt;/p&gt;


	&lt;p&gt;One more thing: The Ruby Association which I chair provides Ruby programmer certification. We have this announcement today that we have created a new “Gold” certification for Ruby programmers. This requires a higher level of skill. If you go to the &lt;a href=&quot;http://www.ruby-assn.org/en/&quot;&gt;Ruby Association home page&lt;/a&gt;, there is a press announcement which explains what you need to do to be qualified as Ruby “Gold” certified.&lt;/p&gt;


	&lt;p&gt;Thank you.&lt;/p&gt;</content>
		<author>
			<name>chad</name>
			<uri>http://www.chadfowler.com/</uri>
		</author>
		<source>
			<title type="html">ChadFowler.com - Home</title>
			<subtitle type="html">&amp;lt;&amp;lt;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;</subtitle>
			<link rel="self" href="http://www.chadfowler.com/index.cgi?rss"/>
			<id>tag:www.chadfowler.com,2010:mephisto/</id>
			<updated>2010-09-06T06:00:10+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Ruby on Rails 2.3.9 Released</title>
		<link href="http://feedproxy.google.com/~r/RidingRails/~3/Gw07WrgH8fk/ruby-on-rails-2-3-9-released"/>
		<id>tag:weblog.rubyonrails.org,2010-09-04:27403</id>
		<updated>2010-09-04T21:56:07+00:00</updated>
		<content type="html">&lt;p&gt;We’ve released Ruby on Rails 2.3.9 (&lt;a href=&quot;http://rubygems.org/gems/rails/versions/2.3.9&quot;&gt;gem&lt;/a&gt; and &lt;a href=&quot;http://github.com/rails/rails/tree/v2.3.9&quot;&gt;git tag&lt;/a&gt;) to extend the 2.3.8 bridge a few steps closer to Rails 3 and Ruby 1.9. If your app runs on Rails 2.3.9 without deprecation warnings, you’re looking good for an upgrade to Rails 3.&lt;/p&gt;


	&lt;h4&gt;Deprecations&lt;/h4&gt;


	&lt;ul&gt;
	&lt;li&gt;Changes i18n named-interpolation syntax from the deprecated &lt;code&gt;Hello {{name}}&lt;/code&gt; to the 1.9-native &lt;code&gt;Hello %{name}&lt;/code&gt;.&lt;/li&gt;
		&lt;li&gt;Replaces &lt;code&gt;Kernel#returning&lt;/code&gt; with &lt;code&gt;Object#tap&lt;/code&gt; which is native to Ruby 1.8.7.&lt;/li&gt;
		&lt;li&gt;Renames &lt;code&gt;Array#random_element&lt;/code&gt; to &lt;code&gt;Array#sample&lt;/code&gt; which is native to Ruby 1.9.&lt;/li&gt;
		&lt;li&gt;Renames &lt;code&gt;config.load_paths&lt;/code&gt; and &lt;code&gt;.load_once_paths&lt;/code&gt; to the more accurate &lt;code&gt;config.autoload_paths&lt;/code&gt; and &lt;code&gt;.autoload_once_paths&lt;/code&gt;.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Along with these deprecations come a broad array of bugfixes and minor tweaks. Read the &lt;a href=&quot;http://github.com/rails/rails/compare/v2.3.8...v2.3.9&quot;&gt;commit log&lt;/a&gt; for the full story.&lt;/p&gt;


	&lt;p&gt;Onward to 3.1!&lt;/p&gt;</content>
		<author>
			<name>Jeremy Kemper</name>
			<uri>http://weblog.rubyonrails.org/</uri>
		</author>
		<source>
			<title type="html">Riding Rails - home</title>
			<link rel="self" href="http://feeds.feedburner.com/RidingRails"/>
			<id>tag:weblog.rubyonrails.org,2010:mephisto/</id>
			<updated>2010-09-04T23:00:01+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Appreciate Rails 3 with charity</title>
		<link href="http://feedproxy.google.com/~r/RidingRails/~3/yg_wgfBH4JU/appreciate-rails-3-with-charity"/>
		<id>tag:weblog.rubyonrails.org,2010-08-30:27604</id>
		<updated>2010-08-31T15:39:38+00:00</updated>
		<content type="html">&lt;p&gt;Rails 3.0 is a gift from all of us who’ve worked on it to anyone who wants to build something. If you like our gift, please show it by donating to the Rails 3.0 release charity: Charity:Water. We’ve started a campaign to raise $100,000 in the name of Rails 3.0, which will give 5,000 people access to clean water if we make it.&lt;/p&gt;


	&lt;p&gt;Charity:Water is a fantastic charity (and not just because they run on Rails!). You’d make everyone working on Rails proud by helping us reach our lofty goal.&lt;/p&gt;


	&lt;p&gt;Donations can be made at &lt;a href=&quot;http://mycharitywater.org/rails3&quot;&gt;http://mycharitywater.org/rails3&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>David</name>
			<uri>http://weblog.rubyonrails.org/</uri>
		</author>
		<source>
			<title type="html">Riding Rails - home</title>
			<link rel="self" href="http://feeds.feedburner.com/RidingRails"/>
			<id>tag:weblog.rubyonrails.org,2010:mephisto/</id>
			<updated>2010-09-04T23:00:01+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">My Reading List on 8/31/2010</title>
		<link href="http://feedproxy.google.com/~r/on-ruby/~3/RVU6Nva9WJs/my-reading-list-on-8312010.html"/>
		<id>tag:blogger.com,1999:blog-24599054.post-307686712340732262</id>
		<updated>2010-08-31T10:24:16+00:00</updated>
		<content type="html">Thanks to Prentice Hall and Addison-Weseley giving me three new books, my reading list has bulked back up.  Here's what I'm working through at the moment:

The Freebies
UNIX and Linux System Administration Handbook (4th Edition) — I'm really excited about this one, I've loved the first three editions, and this looks like a really solid revamping of a classic in the Sys Admin field.
The D &lt;img src=&quot;http://feeds.feedburner.com/~r/on-ruby/~4/RVU6Nva9WJs&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>pate</name>
			<email>noreply@blogger.com</email>
			<uri>http://on-ruby.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">On Ruby</title>
			<subtitle type="html">The (mostly) tech related musings of Pat Eyler.  Ruby, Erlang, Haskell, Scala, Ocaml, Publishing, and more ...</subtitle>
			<link rel="self" href="http://on-ruby.blogspot.com/atom.xml"/>
			<id>tag:blogger.com,1999:blog-24599054</id>
			<updated>2010-09-06T15:00:09+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">in which the lessons of ZZ Top are applied to the marketplace</title>
		<link href="http://technomancy.us/140"/>
		<id>tag:technomancy.us,2007:in%20which%20the%20lessons%20of%20ZZ%20Top%20are%20applied%20to%20the%20marketplace</id>
		<updated>2010-08-30T18:23:38+00:00</updated>
		<content type="html">&lt;p&gt;I've been thinking a lot about ZZ Top recently. This isn't
  something I generally do as a rule, but it was prompted by
  re-reading &lt;a href=&quot;http://gilesbowkett.blogspot.com/2007/10/im-bad-im-nationwide-job-security-vs.html&quot;&gt;a
  blog post&lt;/a&gt; by the inimitable Giles Bowkett ostensibly about the
  song &lt;a href=&quot;http://www.youtube.com/watch?v=SxHyHk3h2IU&quot;&gt;I'm Bad;
  I'm Nationwide&lt;/a&gt;. Go ahead and cue that up in the background
  while you read this post; it's vaguely relevant.&lt;/p&gt;

&lt;img src=&quot;http://technomancy.us/i/zz-top.jpg&quot; alt=&quot;zz top&quot; /&gt;

&lt;p&gt;&quot;Bad&quot; in this sense of course is the good kind of bad, like the
  Michael Jackson song. It seems to be mostly about attitude. Giles
  makes the point that generally being bad is not correlated with
  being nationwide.&lt;/p&gt;

&lt;blockquote&gt;&quot;I'm Bad, I'm Nationwide&quot; is a ZZ Top song. Hopefully
  you can figure out what it's about, but just in case, the singer's
  point is that he is bad, and he is nationwide. [...]&lt;/blockquote&gt;

&lt;blockquote&gt;It's good to be bad. It's good to be nationwide. It's
  even better to be worldwide. How can we apply the lessons of ZZ
  Top in the workplace?&lt;/blockquote&gt;

&lt;blockquote&gt;Obviously if you walk into your boss' office, jump on
  his or her desk, pull down your pants, and perform toilet
  functions all over the place, that would be bad. But it would not
  be nationwide, and it would not encourage becoming nationwide. In
  fact, it would not really be bad, it would just be stupid. But
  this silly example highlights a deeper paradox: that which is bad
  is usually local, and that which is nationwide is usually
  good.&lt;/blockquote&gt;

&lt;p&gt;Giles goes on to talk about how the bad/nationwide balancing act
  applies to a career in software development, which is interesting,
  but I've been thinking about it in terms of projects instead. Take
  the familiar realm of editors. There are a few of them that are
  nationwide just by virtue of having survived and built up a
  following over the course of several decades. And they're also
  often bad when flame wars erupt over them, as is fairly
  common.&lt;/p&gt;

&lt;p&gt;So Emacs and vi have somehow achieved the intersection of bad and
  nationwide, which as Giles posits is tricky to pull off. Simply
  being bad doesn't work in the long-term, and while quiet
  competence sometimes does, it's worth noting that in many cases
  attention helps a project improve in concrete
  ways&amp;mdash;especially projects whose users are developers. This
  is pretty key for things like languages, libraries, and build tools.&lt;/p&gt;

&lt;p&gt;The problem I'm faced with here is that being bad is also often
  correlated with being inflammatory. The easiest way to get attention in
  the software world is to pick a fight. You see this &lt;i&gt;all the
  time&lt;/i&gt; on sites like Reddit; when people smell blood they
  upvote, which is why stuff like
  &lt;a href=&quot;http://dosync.posterous.com/clojure-nodejs-and-why-messaging-can-be-lame&quot;&gt;Aleph
  vs Node.js: the smackdown&lt;/a&gt; makes it to the front page despite
  being a superficial comparison.&lt;/p&gt;

&lt;p&gt;The thing you have to remember about picking fights with another
  project or language just for the sake of it is that often the
  attention fallout is more evenly distributed than is
  intended. When someone goes out of their way to pick a fight, they
  &lt;a href=&quot;http://www.jroller.com/obie/entry/top_10_reasons_why_java&quot;&gt;usually
  aren't much good at hiding the fact that they've got an investment
  in one side&lt;/a&gt;. Impartial readers can usually pick up on this
  pretty easily, and they're likely to spot holes in the argument
  or write it off it as a piece of cheerleading. In cases of
  particularly unfair partisanship, they may even begin to
  sympathize with the target under attack.&lt;/p&gt;

&lt;p&gt;The closest I've come to this sort of bad/nationwide
  is &lt;a href=&quot;http://twitter.com/technomancy/status/10994115673&quot;&gt;this
  post I made on Twitter a few months back&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;Q: What's the difference between Ant and Maven? A: The
  creator of Ant has apologized.&lt;/blockquote&gt;

&lt;p&gt;This turned out to be just the right mix of nasty and clever
  to really take off; hundreds and hundreds of people passed it on, and
  over the next few days searches for my name came up with just
  pages and pages of this over and over again. At the time of this
  writing it's still on the second page of results in a search for
  my name.&lt;/p&gt;

&lt;p&gt;I've got to admit, as the author
  of &lt;a href=&quot;http://github.com/technomancy/leiningen&quot;&gt;a build
  system that competes with Maven&lt;/a&gt;, this felt kind of good. The
  problem is it's totally a cheap shot&amp;mdash;everyone involved with
  build tools ends up in a position of needing to apologize to their
  users given enough time. James Duncan Davidson has expressed his
  regrets over the use of XML in ant, Dave Thomas is less than proud
  of how RDoc has turned out, and I'm pretty sure the only reason
  the guy responsible for the tabs/spaces distinction in Makefiles
  hasn't apologized is that he fled to Tijuana for facial
  reconstructive surgery. Anyway, Leiningen will eventually be in
  the same position if it's not already.&lt;/p&gt;

&lt;img src=&quot;http://technomancy.us/i/why-range.gif&quot; alt=&quot;why sample&quot; align=&quot;right&quot; /&gt;

&lt;p&gt;So we're still left with this question of whether you can be bad
  and nationwide without also being a jerk. I think it's doable, but
  you just don't see it much because picking fights is so much
  easier. One example that comes readily to mind
  is &lt;a href=&quot;http://en.wikipedia.org/wiki/Why_the_lucky_stiff&quot;&gt;_why
  the lucky stiff&lt;/a&gt;. He qualified not just by his off-kilter visual style
  but by his aversion to what he scoffed at as &quot;best practices&quot;.&lt;/p&gt;

&lt;blockquote&gt;Perhaps this is why I have trouble swallowing unit
  testing or extreme programming or other best practices as the
  law. I guess there’s a place for these tricks (the work place,)
  but they do not speak to the pure form of hacking for hacking’s
  sake, which I so ardently defend! Unit testing, in particular, is
  designed to reel in spontaneous hacking. It is like framing a
  picture before it has been painted. Hacking, at heart, will
  continue to be something of spontaneous order, something of
  anarchy, and the landscape of hacking is something which comes
  from human action but is not of human design.&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://web.archive.org/web/20080512050317/hackety.org/2007/12/24/thisHackWasNotProperlyPlanned.html&quot;&gt;&amp;#8213;
    This Hack was not Properly Planned&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This may not sound particularly controversial, but in the context
  of the test-driven-fanatic Ruby community it was a pretty weighty
  heresy. But he was all about exploring the fringe, and some
  excellent ideas came of it. It caught peoples' eyes and drew them
  in, so much so that when he disappeared, the communities
  surrounding his projects picked up the orphaned bits and carried
  them forward.&lt;/p&gt;

&lt;img src=&quot;http://technomancy.us/i/zz-top2.jpg&quot; alt=&quot;gibbons&quot; align=&quot;left&quot; /&gt;

&lt;p&gt;Bad... and &lt;i&gt;nationwide&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;This is way more productive than us-vs-them fights that normally
  accompany attempts to be bad and nationwide. So what does this
  mean for you and me? Most people can't draw like _why, but
  injecting your own particular brand of crazy into your projects
  may be a slick hack you can pull to sidestep the negativity.&lt;/p&gt;

&lt;p&gt;Here's an example: the &lt;tt&gt;new&lt;/tt&gt; task in Leiningen spits out a
  blank Clojure project skeleton. At the time I saw a few too many
  &quot;foojure&quot;-type names popping up for new projects, and when I saw
  one called &quot;Couverjure&quot; I said enough is enough. Now
  the &lt;tt&gt;new&lt;/tt&gt; task will refuse to generate projects named after
  *jure puns. Arbitrary? You bet. Ridiculous? Perhaps. But harmless
  and easy to work around. And don't forget controversial:&lt;/p&gt;

&lt;a href=&quot;http://github.com/technomancy/leiningen/commit/39732d5b649dedb70b14e88fe561dfc9ddb31611&quot;&gt;&lt;img src=&quot;http://technomancy.us/i/enough.png&quot; alt=&quot;no more jure names&quot; /&gt;&lt;/a&gt;

&lt;p&gt;The point is: don't take yourself too seriously. Hack the good
  hack and leave an easter egg or two around for the
  adventurous. Then you too can be bad... and &lt;i&gt;nationwide&lt;/i&gt;.&lt;/p&gt;</content>
		<author>
			<name>Phil Hagelberg</name>
			<uri>http://technomancy.us/</uri>
		</author>
		<source>
			<title type="html">Technomancy</title>
			<link rel="self" href="http://technomancy.us/feed/atom"/>
			<id>tag:technomancy.us,2007:blog/</id>
			<updated>2010-09-07T18:00:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Rails 3.0: It's ready!</title>
		<link href="http://feedproxy.google.com/~r/RidingRails/~3/INzzvMYtnJ4/rails-3-0-it-s-done"/>
		<id>tag:weblog.rubyonrails.org,2010-08-29:27276</id>
		<updated>2010-08-30T18:13:51+00:00</updated>
		<content type="html">&lt;p&gt;Rails 3.0 has been underway for a good two years, so it’s with immense pleasure that we can declare it’s finally here. We’ve brought the work of more than 1,600 contributors together to make everything better, faster, cleaner, and more beautiful.&lt;/p&gt;


	&lt;p&gt;This third generation of Rails has seen thousands of commits, so picking what to highlight was always going to be tough and incomplete. But here’s a choice selection of major changes for Rails 3:&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;New Active Record query engine&lt;/strong&gt;&lt;br /&gt;
Active Record has adopted &lt;a href=&quot;http://github.com/brynary/arel&quot;&gt;the ARel query engine&lt;/a&gt; to make scopes and queries more consistent and composable. This makes it much easier to build complex queries over several iterations. We also delay the actual execution of the query until it’s needed. Here’s a simple example:&lt;/p&gt;


&lt;code&gt;&lt;pre&gt;users = User.where(:name =&amp;gt; &quot;david&quot;).limit(20)
users = users.where(&quot;age &amp;gt; 29&quot;)

# SELECT * FROM users 
# WHERE name = &quot;david&quot; AND age &amp;gt; 29 
# ORDER BY name
# LIMIT 20
users.order(:name).each { |user| puts user.name }&lt;/pre&gt;&lt;/code&gt;

	&lt;p&gt;Read more in &lt;a href=&quot;http://guides.rubyonrails.org/active_record_querying.html&quot;&gt;new Active Record guide&lt;/a&gt; and watch the &lt;a href=&quot;http://rubyonrails.org/screencasts/rails3/active-relation-active-model&quot;&gt;Dive into Rails 3: ARel video&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;New router for Action Controller&lt;/strong&gt;&lt;br /&gt;
When we switched to a &lt;span class=&quot;caps&quot;&gt;REST&lt;/span&gt;-based approach for controllers in Rails 2, we patched on the syntax to the existing router while we were waiting to see if the experiment panned out.&lt;/p&gt;


	&lt;p&gt;It did and for Rails 3 we’ve gone back and revamped the syntax completely to favor the &lt;span class=&quot;caps&quot;&gt;REST&lt;/span&gt; style with less noise and more flexibility:&lt;/p&gt;


&lt;code&gt;&lt;pre&gt;resources :people do
  resource :avatar

  collection do
    get :winners, :losers
  end
end

# /sd34fgh/rooms
scope ':token', :token =&amp;gt; /\w{5,5}/ do
  resources :rooms
end

# /descriptions
# /pl/descriptions
# /en/descriptions
scope '(:locale)', :locale =&amp;gt; /en|pl/ do
  resources :descriptions
  root :to =&amp;gt; 'projects#index'
end&lt;/pre&gt;&lt;/code&gt;

	&lt;p&gt;Read more in the &lt;a href=&quot;http://edgeguides.rubyonrails.org/routing.html&quot;&gt;new routing guide&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;New Action Mailer&lt;/strong&gt;&lt;br /&gt;
Action Mailer was born with a split-personality of half model, half controller. In Rails 3, we’ve made the choice to make it all controller. This means that the feel and functionality will be much closer to Action Controller and in fact they now share a bunch of underlying code. Here’s a taste of what it looks like now:&lt;/p&gt;


&lt;code&gt;&lt;pre&gt;class Notifier &amp;lt; ActionMailer::Base
  default :from =&amp;gt;
    &quot;Highrise &amp;lt;system@#{APPLICATION_DOMAIN}&amp;gt;&quot; 

  def new_project(digest, project, person)
    @digest, @project, @person = digest, project, person

    attachments['digest.pdf'] = digest.to_pdf
    attachments['logo.jpg']   = File.read(project.logo_path)

    mail(
      :subject =&amp;gt; &quot;Your digest for #{project.name}&quot;,
      :to =&amp;gt; person.email_address_with_name
    ) do |format|
      format.text { render :text =&amp;gt; &quot;Something texty&quot; }
      format.html { render :text =&amp;gt; &quot;Something &amp;lt;i&amp;gt;texty&amp;lt;/i&amp;gt;&quot; }
    end
  end
end&lt;/pre&gt;&lt;/code&gt;

	&lt;p&gt;The new Action Mailer is built on top of &lt;a href=&quot;http://github.com/mikel/mail&quot;&gt;the new Mail gem&lt;/a&gt; as well. Say goodbye to TMail headaches.&lt;/p&gt;


	&lt;p&gt;Read more in &lt;a href=&quot;http://edgeguides.rubyonrails.org/action_mailer_basics.html&quot;&gt;new Action Mailer guide&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Manage dependencies with Bundler&lt;/strong&gt;&lt;br /&gt;
Managing all the dependencies of a Rails application has long been a hassle of patchworks. We had config.gem, Capistrano externals, custom rake setup tasks, and other incomplete solutions.&lt;/p&gt;


	&lt;p&gt;Bundler cleans all that up and allows you to specify the libraries, frameworks, and plugins that your application depends on. All Rails 3 applications are born with a Gemfile to control it all. See more on &lt;a href=&quot;http://gembundler.com/&quot;&gt;the Bundler site&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;XSS&lt;/span&gt; protection by default&lt;/strong&gt;&lt;br /&gt;
The internet is a scary place and Rails 3 is watching out for you by default. We’ve had &lt;a href=&quot;http://en.wikipedia.org/wiki/Cross-site_request_forgery&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CRSF&lt;/span&gt;&lt;/a&gt; protection with form signing for a while and &lt;a href=&quot;http://en.wikipedia.org/wiki/SQL_injection&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt;-injection&lt;/a&gt; protection since the beginning, but Rails 3 ups the anté with &lt;span class=&quot;caps&quot;&gt;XSS&lt;/span&gt; protection as well (hat tip to Django for convincing us).&lt;/p&gt;


	&lt;p&gt;See the &lt;a href=&quot;http://railscasts.com/episodes/204-xss-protection-in-rails-3&quot;&gt;Railscast on &lt;span class=&quot;caps&quot;&gt;XSS&lt;/span&gt; video&lt;/a&gt; and &lt;a href=&quot;http://rubyonrails.org/screencasts/rails3/xss-ujs&quot;&gt;the Dive into Rails 3: Cross-site scripting video&lt;/a&gt; for more.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Say goodbye to encoding issues&lt;/strong&gt;&lt;br /&gt;
If you browse the Internet with any frequency, you will likely encounter the &amp;#xFFFD; character. This problem is &lt;a href=&quot;http://imysql.cn/docs/MySQL_51_en/ch10s10.html&quot;&gt;extremely pervasive&lt;/a&gt;, and is caused by mixing and matching content with different encodings.&lt;/p&gt;


	&lt;p&gt;In a system like Rails, content comes from the database, your templates, your source files, and from the user. Ruby 1.9 gives us the raw tools to eliminate these problems, and in combination with Rails 3, &amp;#xFFFD; should be a thing of the past in Rails applications. Never struggle with corrupted data pasted by a user from Microsoft Word again!&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Active Model: Validations, callbacks, etc for all models&lt;/strong&gt;&lt;br /&gt;
We’ve extracted quite a bit of commonly requested Active Record components into the new Active Model framework. This allows an &lt;span class=&quot;caps&quot;&gt;ORM&lt;/span&gt; like &lt;a href=&quot;http://github.com/mongoid/mongoid/blob/master/lib/mongoid/validations.rb#L11&quot;&gt;Mongoid&lt;/a&gt; to use Active Record’s validations, callbacks, serialization, and i18n support.&lt;/p&gt;


	&lt;p&gt;Additionally, in the rewrite of Action Controller, we removed any direct references to Active Record, defining a clean, simple &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; that ORMs can implement. If you use an &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;-compliant &lt;span class=&quot;caps&quot;&gt;ORM&lt;/span&gt; (like DataMapper, Sequel, or Mongoid), you will be able to use features like form_for, link_to and redirect_to with objects from those ORMs without any additional work.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Official plugin APIs&lt;/strong&gt;&lt;br /&gt;
We also rewrote Railties with the express goal of using the new plugin &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; for all Rails frameworks like &lt;a href=&quot;http://github.com/rails/rails/blob/master/activerecord/lib/active_record/railtie.rb#L13&quot;&gt;Active Record&lt;/a&gt; and &lt;a href=&quot;http://github.com/rails/rails/blob/master/actionmailer/lib/action_mailer/railtie.rb#L5&quot;&gt;Action Mailer&lt;/a&gt;. This means that Rails plugins like the ones for &lt;a href=&quot;http://github.com/datamapper/dm-rails/blob/master/lib/dm-rails/railtie.rb#L23&quot;&gt;DataMapper&lt;/a&gt; and &lt;a href=&quot;http://github.com/rspec/rspec-rails/blob/master/lib/rspec-rails.rb#L3&quot;&gt;RSpec&lt;/a&gt; have access to all of the integration as the built-in support for Active Record and Test::Unit.&lt;/p&gt;


	&lt;p&gt;The new Railtie &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; makes it possible to modify the built-in generators, add rake tasks, configure default Rails options, and specify code to run as early, or as late as you need. Rails plugins like &lt;a href=&quot;http://github.com/plataformatec/devise&quot;&gt;Devise&lt;/a&gt; were able to add much better integration in the Rails 3 version of their plugin. Expect to see a lot more of that in the months ahead.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Rewritten internals&lt;/strong&gt;&lt;br /&gt;
We rewrote the internals of Action Pack and Railties, making them much more flexible and easier to extend. Instead of a single monolithic ActionController::Base, Rails 3 exposes a number of modules, each with defined APIs, that you can mix and match to create special-purpose controllers for your own use. Both &lt;a href=&quot;http://github.com/rails/rails/blob/master/actionmailer/lib/action_mailer/base.rb#L333&quot;&gt;Action Mailer in Rails&lt;/a&gt; and &lt;a href=&quot;http://github.com/apotonick/cells/blob/master/lib/cell/rails.rb#L5&quot;&gt;the Cells project&lt;/a&gt; make heavy use of this new functionality.&lt;/p&gt;


	&lt;p&gt;You can also take a look a &lt;a href=&quot;http://yehudakatz.com/2009/12/26/the-rails-3-router-rack-it-up/&quot;&gt;this blog post by Yehuda&lt;/a&gt; (from last year) to see how the new architecture makes it easy to implement Django-style generic actions in Rails by leveraging Rack and ActionController::Metal.&lt;/p&gt;


	&lt;p&gt;The Rails generator system is got a revamp as well. Instead of monolithic generators that know about all of the Rails frameworks, each generator calls a series of hooks, such as :test_framework and :orm, that plugins can register handlers for. This means that generating a scaffold when using rSpec, DataMapper and Haml will generate a scaffold customized for those plugins.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Agnosticism with jQuery, rSpec, and Data Mapper&lt;/strong&gt;&lt;br /&gt;
The rewritten internals and the new plugin APIs have brought true agnosticism to Rails 3 for all components of the framework. Prefer DataMapper to Active Record? &lt;a href=&quot;http://github.com/datamapper/dm-rails&quot;&gt;No problem&lt;/a&gt;. Want to use jQuery instead of Prototype? &lt;a href=&quot;http://github.com/rails/jquery-ujs&quot;&gt;Go ahead&lt;/a&gt;. Eager to test with rSpec instead of test/unit? &lt;a href=&quot;http://github.com/rspec/rspec-rails&quot;&gt;You got it&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;It’s never been easier to Have It Your Way™ with Rails 3. And at the same time, we’ve made that happen without making using the excellent default stack any more complicated.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;&lt;br /&gt;
Rails 3 has had a long development cycle and while that might have lead to some impatience, it has also given book and tutorial authors a chance to catch up and be ready. There’s a wealth of great Rails 3 documentation available already and more is coming shortly.&lt;/p&gt;


	&lt;p&gt;The &lt;a href=&quot;http://pragprog.com/titles/rails4/agile-web-development-with-rails&quot;&gt;Agile Web Development with Rails 4th Ed&lt;/a&gt; book is almost ready and there are &lt;a href=&quot;http://www.amazon.com/s/ref=nb_sb_ss_c_1_7?url=search-alias%3Dstripbooks&amp;field-keywords=rails+3&amp;x=0&amp;y=0&amp;sprefix=rails+3&amp;ih=5_1_1_0_0_0_0_0_0_1.38_159&amp;fsc=5&quot;&gt;plenty more books coming&lt;/a&gt;. Check out all the &lt;a href=&quot;http://guides.rubyonrails.org/&quot;&gt;new guides&lt;/a&gt;, the &lt;a href=&quot;http://rubyonrails.org/screencasts/rails3&quot;&gt;new official videos&lt;/a&gt;, &lt;a href=&quot;http://railscasts.com/&quot;&gt;new Railscasts&lt;/a&gt;, and a &lt;a href=&quot;http://railstutorial.org/book&quot;&gt;new tutorial&lt;/a&gt;. See the recent &lt;a href=&quot;http://weblog.rubyonrails.org/2010/8/28/rails-has-great-documentation&quot;&gt;recap of documentation sources&lt;/a&gt; for more.&lt;/p&gt;


&lt;strong&gt;Installation&lt;/strong&gt;&lt;br /&gt;
&lt;code&gt;gem install rails --version 3.0.0&lt;/code&gt;.

	&lt;p&gt;We also have a Rails &lt;a href=&quot;http://github.com/rails/rails/tree/v3.0.0&quot;&gt;v3.0.0 tag&lt;/a&gt; and a &lt;a href=&quot;http://github.com/rails/rails/tree/3-0-stable&quot;&gt;3-0-stable branch&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Rails 3.0 has been designed to work with Ruby 1.8.7, Ruby 1.9.2, and JRuby 1.5.2+.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Gratitude and next steps&lt;/strong&gt;&lt;br /&gt;
I’m personally incredibly proud of this release. I’ve been working on Rails for more than 7 years and the quality of the framework we have today is just astounding. This is only possible as a community effort and Rails 3 has seen so many incredible developers step up and help make this &lt;i&gt;our best release ever&lt;/i&gt; (wink). Many thanks to all of you.&lt;/p&gt;


	&lt;p&gt;We’ll continue to develop Rails 3.0 with fixes and tweaks via the stable branch and Rails 3.1 is already cooking on master.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;UPDATE&lt;/span&gt;:&lt;/strong&gt; We’re raising money for Charity:Water in the name of Rails 3.0. Please donate and help us &lt;a href=&quot;http://weblog.rubyonrails.org/2010/8/30/appreciate-rails-3-with-charity&quot;&gt;bring clean water to 5,000 people in the name of the Rails community&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>David</name>
			<uri>http://weblog.rubyonrails.org/</uri>
		</author>
		<source>
			<title type="html">Riding Rails - home</title>
			<link rel="self" href="http://feeds.feedburner.com/RidingRails"/>
			<id>tag:weblog.rubyonrails.org,2010:mephisto/</id>
			<updated>2010-09-04T23:00:01+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">JRuby at JavaZone 2010</title>
		<link href="http://blog.nicksieger.com/articles/2010/08/30/jruby-at-javazone-2010"/>
		<id>urn:uuid:4c6d6645-1832-4ed6-b947-51f55231f41f</id>
		<updated>2010-08-30T17:12:07+00:00</updated>
		<content type="html">&lt;p&gt;I&amp;#8217;m pleased to be able to return to Oslo for JavaZone 2010&amp;#46; Whether you&amp;#8217;re checking out JRuby for the first time or a veteran JRuby user, I&amp;#8217;ll have something for you! And if I don&amp;#8217;t, I encourage you to come badger me after the talk is finished&amp;#46;&lt;/p&gt;

&lt;h3&gt;&lt;a href=&quot;http://javazone.no/incogito10/events/JavaZone%202010/sessions/JRuby:%20Now%20With%20More%20J!&quot;&gt;JRuby: Now With More J!&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Additionally, if you&amp;#8217;re interested in meeting up for some JRuby discussion next week in Oslo, do drop me a note at the address in the upper right&amp;#46;&lt;/p&gt;</content>
		<author>
			<name>Nick Sieger</name>
			<uri>http://blog.nicksieger.com/</uri>
		</author>
		<source>
			<title type="html">Nick Sieger</title>
			<subtitle type="html">do what you love</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/nicksieger"/>
			<id>tag:blog.nicksieger.com,2005:Typo</id>
			<updated>2010-08-30T18:00:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Deploying, Monitoring and Troubleshooting Rails on JRuby</title>
		<link href="http://blog.nicksieger.com/articles/2010/08/30/deploying-monitoring-and-troubleshooting-rails-on-jruby"/>
		<id>urn:uuid:055dd055-5fd2-4b4b-ab36-41f806396627</id>
		<updated>2010-08-30T17:06:52+00:00</updated>
		<content type="html">&lt;p&gt;I am pleased that my Engine Yard webinar on JRuby and deployment is available for general viewing&amp;#46; While the JRuby deployment story is still evolving and maturing, and the 60 minute time frame is too short to cover the issues in depth, I hope you&amp;#8217;ll find the content at least gives you some ideas or directions to look&amp;#46;&lt;/p&gt;

&lt;p&gt;As always, feel free to contact me with any questions!&lt;/p&gt;

&lt;p&gt;&lt;p&gt;&lt;a href=&quot;http://vimeo.com/14435288&quot;&gt;Deploying, Monitoring and Troubleshooting Rails on the JVM with JRuby&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/engineyard&quot;&gt;Engine Yard&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com&quot;&gt;Vimeo&lt;/a&gt;&amp;#46;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Nick Sieger</name>
			<uri>http://blog.nicksieger.com/</uri>
		</author>
		<source>
			<title type="html">Nick Sieger</title>
			<subtitle type="html">do what you love</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/nicksieger"/>
			<id>tag:blog.nicksieger.com,2005:Typo</id>
			<updated>2010-08-30T18:00:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Rails Has Great Documentation</title>
		<link href="http://feedproxy.google.com/~r/RidingRails/~3/vGfh8XdyIpg/rails-has-great-documentation"/>
		<id>tag:weblog.rubyonrails.org,2010-08-28:27256</id>
		<updated>2010-08-30T13:20:00+00:00</updated>
		<content type="html">&lt;p&gt;To this day I still hear people complain that Rails has poor documentation.  From where I’m sitting this seems far from the truth.  Let me lay out the evidence piece by piece:&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://railstutorial.org/book&quot;&gt;&lt;img src=&quot;http://weblog.rubyonrails.org/assets/2010/8/28/railstutorial.gif&quot; /&gt;&lt;/a&gt;
&lt;strong&gt;RailsTutorial.org&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;To learn Rails from scratch Michael Hartl recently finished his book &lt;a href=&quot;http://railstutorial.org/&quot;&gt;Ruby on Rails Tutorial: Learn Rails by Example&lt;/a&gt;.  The book teaches Rails 3 from the ground up and it’s &lt;a href=&quot;http://railstutorial.org/book&quot;&gt;available for &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;FREE&lt;/span&gt;&lt;/strong&gt; online&lt;/a&gt;.  If you’d rather have a &lt;a href=&quot;http://railstutorial.org/#buy&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PDF&lt;/span&gt;&lt;/a&gt; or a &lt;a href=&quot;http://www.amazon.com/Ruby-Rails-Tutorial-Addison-Wesley-Professional/dp/0321743121&quot;&gt;book&lt;/a&gt; you can grab that as well (and he’s even working on some &lt;a href=&quot;http://railstutorial.org/screencasts&quot;&gt;screencasts&lt;/a&gt;).&lt;/p&gt;


	&lt;p&gt;The source for the finalized book will be pushed to GitHub and released under a Creative Commons License shortly after Rails 3 is done.  If you’d like to help translate the book to your language of choice, feel free to &lt;a href=&quot;http://www.michaelhartl.com/&quot; title=&quot;Michael Hartl&quot;&gt;contact Michael&lt;/a&gt; and he’ll get in touch when it’s time to make it happen.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Rails Guides&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;If you’re not a Rails newbie don’t forget about the &lt;a href=&quot;http://edgeguides.rubyonrails.org/&quot;&gt;Rails Guides&lt;/a&gt;, which have been updated for Rails 3.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Rails &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; Docs&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;There are two main websites I use to do &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; lookups.  The first is &lt;a href=&quot;http://railsapi.com&quot;&gt;Rails Searchable &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; Doc&lt;/a&gt;, which has online and offline searchable documentation. The second is &lt;a href=&quot;http://apidock.com/rails&quot;&gt;APIdock&lt;/a&gt; which is online only, but has the ability to comment and easily compare different versions of documentation.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Rails 3 Free Screencasts&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;If you’re more of a visual learner (like me) then there are plenty of free screencasts to teach you about Rails 3.  About 2 months ago I produced the &lt;a href=&quot;http://www.rubyonrails.org/screencasts/rails3&quot;&gt;Rails 3 Screencasts&lt;/a&gt;, which will get you started.&lt;/p&gt;


	&lt;p&gt;Ryan Bates has also produced an incredible amount of Rails 3 screencasts over on &lt;a href=&quot;http://railscasts.com/tags/27&quot;&gt;Railscasts.com&lt;/a&gt;.  Ryan has been producing Railscasts for over 3 1/2 years, isn’t that crazy?&lt;/p&gt;


	&lt;p&gt;There’s also a few good free screencasts over on &lt;a href=&quot;http://teachmetocode.com/screencasts/tag/rails-3/&quot;&gt;Teach me to Code&lt;/a&gt; by Charles Max Wood.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Keeping on the Edge&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;If you find yourself wondering how to keep up with all of the newest features / libraries for Rails 3, both the &lt;a href=&quot;http://ruby5.envylabs.com&quot;&gt;Ruby5 Podcast&lt;/a&gt; and the &lt;a href=&quot;http://rubyshow.com&quot;&gt;Ruby Show&lt;/a&gt; are going strong.  Don’t listen to audio? It doesn’t matter, just subscribe to the &lt;a href=&quot;http://feeds.feedburner.com/Ruby5&quot;&gt;Ruby5 &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feed&lt;/a&gt; and get links with descriptions to all the newest libraries, tutorials, and more.  You might also want to checkout Peter Cooper’s new &lt;a href=&quot;http://rubyweekly.com/&quot;&gt;Ruby Weekly&lt;/a&gt;, a Ruby email newsletter&lt;/p&gt;.


	&lt;p&gt;&lt;strong&gt;Need to upgrade a big app to Rails 3?&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;Jeremy McAnally’s &lt;a href=&quot;http://www.railsupgradehandbook.com/&quot;&gt;Rails 3 Upgrade Handbook &lt;span class=&quot;caps&quot;&gt;PDF&lt;/span&gt;&lt;/a&gt; is just $12.  There’s also a few paid screencasts for the upgrade over on &lt;a href=&quot;http://thinkcode.tv/catalog/upgrading-rails-3/&quot;&gt;Thinkcode.tv&lt;/a&gt; and &lt;a href=&quot;http://bddcasts.com/&quot;&gt;BDDCasts&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Need a Book?&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;There’s a bunch of books that will be coming out after the release, most of which you can start reading now. &lt;a href=&quot;http://my.safaribooksonline.com/9780132480345&quot;&gt;The Rails 3 Way&lt;/a&gt; by Obie Fernandez, &lt;a href=&quot;http://www.manning.com/katz/&quot;&gt;Rails 3 In Action&lt;/a&gt; by Ryan Bigg and Yehuda Katz, &lt;a href=&quot;http://beginningrails.com/&quot;&gt;Beginning Rails&lt;/a&gt; by Cloves Carneiro Jr and Rida Al Barazi, and of course the &lt;a href=&quot;http://pragprog.com/titles/rails4/agile-web-development-with-rails&quot;&gt;Agile Web Development with Rails&lt;/a&gt;:fourth edition by Sam Ruby, Dave Thomas, and David Heinemeier Hansson.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;In conclusion&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;No more complaining about lack of good documentation!  Seriously. If you want even more Rails 3 content, check out the blog post by Kevin Faustino on &lt;a href=&quot;http://adventuresincoding.com/2010/08/34-ruby-on-rails-3-resources-to-get-you-started/&quot;&gt;34 Ruby on Rails 3 resources to get you started&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Gregg Pollack</name>
			<uri>http://weblog.rubyonrails.org/</uri>
		</author>
		<source>
			<title type="html">Riding Rails - home</title>
			<link rel="self" href="http://feeds.feedburner.com/RidingRails"/>
			<id>tag:weblog.rubyonrails.org,2010:mephisto/</id>
			<updated>2010-09-04T23:00:01+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Ruby|Web Interview with Pat Maddox</title>
		<link href="http://feedproxy.google.com/~r/on-ruby/~3/RLxJi0C8Hw4/rubyweb-interview-with-pat-maddox.html"/>
		<id>tag:blogger.com,1999:blog-24599054.post-6741446476539187608</id>
		<updated>2010-08-25T13:12:50+00:00</updated>
		<content type="html">Ok, if I'm going to post about GoGaRuCo today, I should also spend some time on Ruby|Web, the latest regional conference from Mike Moore (@blowmage) and friends — truth in advertising, I'm a volunteer on the board for Ruby|Web, so I might be a bit biased.
Just so my biases don't show too much, I asked Pat Maddox(@patmaddox) to answer a few questions for me.  Of course, he's a speaker at Ruby|Web&lt;img src=&quot;http://feeds.feedburner.com/~r/on-ruby/~4/RLxJi0C8Hw4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>pate</name>
			<email>noreply@blogger.com</email>
			<uri>http://on-ruby.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">On Ruby</title>
			<subtitle type="html">The (mostly) tech related musings of Pat Eyler.  Ruby, Erlang, Haskell, Scala, Ocaml, Publishing, and more ...</subtitle>
			<link rel="self" href="http://on-ruby.blogspot.com/atom.xml"/>
			<id>tag:blogger.com,1999:blog-24599054</id>
			<updated>2010-09-06T15:00:09+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">GoGaRuCo 2010: mini-interview with Ilya Grigorik</title>
		<link href="http://feedproxy.google.com/~r/on-ruby/~3/lHWPd9a_Xpc/gogaruco-2010-mini-interview-with-ilya.html"/>
		<id>tag:blogger.com,1999:blog-24599054.post-8411993391951473681</id>
		<updated>2010-08-25T09:31:08+00:00</updated>
		<content type="html">Ilya Grigorik (@igrigorik) is another GoGaRuCo speaker who's kindly agreed to sit down and work through a short interview with me.  Hopefully this gives you taste of what you'll be missing if you're not going to the Bay Area's regional Ruby conference.

Machine Learning and Ruby don't leap to mind as a common pairing.  Why is machine learning important to Rubyists?
Ilya I don't think the topic of&lt;img src=&quot;http://feeds.feedburner.com/~r/on-ruby/~4/lHWPd9a_Xpc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>pate</name>
			<email>noreply@blogger.com</email>
			<uri>http://on-ruby.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">On Ruby</title>
			<subtitle type="html">The (mostly) tech related musings of Pat Eyler.  Ruby, Erlang, Haskell, Scala, Ocaml, Publishing, and more ...</subtitle>
			<link rel="self" href="http://on-ruby.blogspot.com/atom.xml"/>
			<id>tag:blogger.com,1999:blog-24599054</id>
			<updated>2010-09-06T15:00:09+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Rails 3.0: Release candidate 2</title>
		<link href="http://feedproxy.google.com/~r/RidingRails/~3/YV94SZmLPQ0/rails-3-0-release-candidate-2"/>
		<id>tag:weblog.rubyonrails.org,2010-08-24:27159</id>
		<updated>2010-08-24T03:07:34+00:00</updated>
		<content type="html">&lt;p&gt;The release candidate process is progressing as planned. This second candidate has very few changes over the first, which means that unless any blockers are discovered with this release, we’re targeting the final release of Rails 3.0 for this week(!!!).&lt;/p&gt;


	&lt;p&gt;So please do help us weed out any blockers. Especially in our two new main dependencies: &lt;a href=&quot;http://gembundler.com/v1.0/index.html&quot;&gt;Bundler&lt;/a&gt; and &lt;a href=&quot;http://github.com/rails/arel&quot;&gt;ARel&lt;/a&gt;. They’ve both progressed into release candidacy for their 1.0 releases and will be sharing the same 1.0-final release date as Rails 3.0.&lt;/p&gt;


	&lt;p&gt;You can see a complete list of all the dotted t’s and crossed i’s on the new fabulous Github &lt;a href=&quot;http://github.com/rails/rails/compare/v3.0.0_RC...v3.0.0_RC2&quot;&gt;comparo view of &lt;span class=&quot;caps&quot;&gt;RC1&lt;/span&gt; and &lt;span class=&quot;caps&quot;&gt;RC2&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;As always, you install this latest version with: &lt;code&gt;gem install rails --pre&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;Also note that Rails 3.0 now has it’s own &lt;a href=&quot;http://github.com/rails/rails/tree/3-0-stable&quot;&gt;stable branch&lt;/a&gt;. The &lt;a href=&quot;http://github.com/rails/rails&quot;&gt;master branch&lt;/a&gt; is now reserved for Rails 3.1 development. (That’s right, we’re already going there and it’s going to be M-A-G-I-C-A-L!).&lt;/p&gt;</content>
		<author>
			<name>David</name>
			<uri>http://weblog.rubyonrails.org/</uri>
		</author>
		<source>
			<title type="html">Riding Rails - home</title>
			<link rel="self" href="http://feeds.feedburner.com/RidingRails"/>
			<id>tag:weblog.rubyonrails.org,2010:mephisto/</id>
			<updated>2010-09-04T23:00:01+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">GoGaRuCo 2010: mini-interview with Josh Susser</title>
		<link href="http://feedproxy.google.com/~r/on-ruby/~3/UbobXij4-YA/gogaruco-2010-mini-interview-with-josh.html"/>
		<id>tag:blogger.com,1999:blog-24599054.post-2424197592092097575</id>
		<updated>2010-08-19T08:33:57+00:00</updated>
		<content type="html">GoGaRuCo is just around the corner (Sep 17-18), and it looks like it's going to be a great conference again this year.  I wanted to touch base with Josh Susser (@joshsusser) again to see what was going to set this year apart.  He was kind enough to answer a few questions.  If you live in the Bay Area and haven't already decided to hit GoGaRuCo, what are you waiting for?

This is your second time&lt;img src=&quot;http://feeds.feedburner.com/~r/on-ruby/~4/UbobXij4-YA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>pate</name>
			<email>noreply@blogger.com</email>
			<uri>http://on-ruby.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">On Ruby</title>
			<subtitle type="html">The (mostly) tech related musings of Pat Eyler.  Ruby, Erlang, Haskell, Scala, Ocaml, Publishing, and more ...</subtitle>
			<link rel="self" href="http://on-ruby.blogspot.com/atom.xml"/>
			<id>tag:blogger.com,1999:blog-24599054</id>
			<updated>2010-09-06T15:00:09+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">My Thoughts on Oracle v Google</title>
		<link href="http://blog.headius.com/2010/08/my-thoughts-on-oracle-v-google.html"/>
		<id>tag:blogger.com,1999:blog-20975090.post-5342643660224394169</id>
		<updated>2010-08-18T16:52:58+00:00</updated>
		<content type="html">As you've probably heard by now, Oracle has decided to file suit against Google, claiming multiple counts of infringement against Java or JVM patents and copyrights they acquired when they assimilated Sun Microsystems this past year. Since I'm unlikely to keep my mouth shut about even trivial matters, something this big obviously requires at least a couple thousand words.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Who Am I?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Any post of this nature really requires an author to identify where they stand, so their unavoidable biases can be taken with the appropriate dosage of salt. Rather than having you dig through my past and learn who and what I am, I'll just lay it out here.&lt;br /&gt;&lt;br /&gt;I am a Java developer. I've been a Java developer since 1996 or so, when I got my first University job writing stupid little applets in this new-fangled web language. That job expanded into a web development position, also using Java, and culminated with me joining a few senior developers for a 6-month shared development gig with IBM's then-nascent Pacific Development Center in Vancouver, BC. Since then I've had a string of Java-related jobs...some as a trenches developer, some as a lead, some as &quot;architect&quot;, but all of them heavily wrapped up in this thing called Java. And I can't say that I've ever been particularly annoyed with Java as a language or a platform. Perhaps I haven't spent enough time on other runtimes, or perhaps I've got tunnel-vision after being a Java developer for so many years. But I'd like to think that I've become &quot;seasoned&quot; enough as a developer to realize no platform is perfect, and the manifold benefits of the JVM and the Java platform vastly outweigh the troublesome aspects.&lt;br /&gt;&lt;br /&gt;I am an open-source developer. In the late 90s, I worked in earnest on my first open-source project: the LiteStep desktop replacement for Windows. At the time, the LiteStep project was a loosely-confederated glob of C code and amateur C hackers. Being a Windows user at the time, I was looking to improve my situation...specifically, I had worked for years on a small application called Hack-It that exposed aspects of the win32 API normally unavailable through standard Windows UI elements, and I was interested in taking that further. LiteStep was not my creation. It had many developers before me and many after, but my small contribution to the project was an almost complete rewrite in amateur-friendly C++ and a decoupling of the core LiteStep &quot;kernel&quot; from the various plugin mechanisms. I was also interviewed for a Wired article on the then-new domain of &quot;skinning&quot; computers, desktops, applications, and so on, though none of my quotes made it into the article. After LiteStep, I fell back into mostly anonymous corporate software development, all still using Java and many open-source technologies, but not much of a visible presence in the OSS world. Then, in 2004 while working as the lead &quot;Java EE Architect&quot; for a multi-million-dollar US government contract, I found JRuby.&lt;br /&gt;&lt;br /&gt;I am a JRuby developer. Since 2004 (or really since late 2005, when I started helping out in earnest) I've been partially responsible for turning JRuby from an interesting novelty project into one of the top Ruby implementations. We've become well known as one of the best-performing – if not the best-performing – Ruby implementations, even faced with increasing competition from the young upstarts. We're also increasingly popular (and perhaps the easiest path) for bringing Ruby and its many paradigm-shifting libraries and frameworks (like Rails) to Java and JVM users around the world – without them having to change platforms or leave any of their legacy code behind. Part of my interest in JRuby has been to bring Ruby to the JVM, plain and simple. I like Ruby, I like the Ruby community, and on most days I like the cockiness and enthusiasm of those community members toward trying crazy new things. But another large part of my interest in JRuby is more sinister: I want to prove to naysayers what a great platform the JVM actually is, and perhaps make them think twice about knee-jerk biases they've carried and cultivated for so many years.&lt;br /&gt;&lt;br /&gt;You'll notice I refer to JRuby not as &quot;it&quot; or &quot;she&quot; or &quot;he&quot;, but as &quot;we&quot;. &quot;We've become well known...We're also increasingly popular...&quot; That's not an accident. There's now over five years of my efforts in JRuby, and I consider it to be as much a part of me as I am a part of it. And so because of that, I have a much deeper, emotional investment in the platform upon which JRuby rests.&lt;br /&gt;&lt;br /&gt;I am a Java developer. I am an open-source developer. I am a JRuby developer and a Ruby fan.&lt;br /&gt;&lt;br /&gt;I am not a lawyer.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;The Facts, According to Me&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;These are the facts as I see them. You're free to disagree with my interpretation of the world, and I encourage you to do so in the comments, on other forums, over email, or to my face (but buy me a beer first).&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;On Java&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Java platform is big. Really big. You just won't believe how vastly hugely mindbogglingly big it is. And by big, I mean it's everywhere.&lt;br /&gt;&lt;br /&gt;There are three mainstream JVMs people know about: JRockit (WebLogic's first and then Oracle's after it acquired them), Hotspot (Which came to Sun through an acquisition and eventually became OpenJDK), and J9 (IBM's own JVM, fully-licensed and with all its shots). Upon those three JVMs lives a gigantic world. If you want the details, there's numerous studies and reports about the use of Java in all manner of business, from the hippest new startups (Twitter recently switched much of their stack to the JVM) to the oldest of the old financial concerns. It's the favored choice for government server applications, the strongest not-quite-completely-Free managed runtime for open-source libraries and applications, and now with Android it's rapidly becoming one of the strongest (if not the strongest) mobile OS platform (even though Android isn't *really* Java, as I'll get into later). You may love or hate Java, but I guarantee it's part of your life in some way or another.&lt;br /&gt;&lt;br /&gt;There are a few open-source implementations of Java. The most well-known is OpenJDK, the Hotspot JVM that Sun relicensed under the GPL and set Free into the world. There's also Apache Harmony, whose class libraries form part of Dalvik's (Android's VM) Java-compatibility layer. There's GNU Classpath, a GPL-based implementation of the Java class libraries used for the ahead-of-time Java compiler GCJ. There's JamVM, which leverages Classpath to provide a very light, very minimal, (and very simple) JVM implementation. And there's others of varying qualities and relevance like IKVM (Java for .NET), VMKit (a Java compiler atop LLVM), and so on. OpenJDK is certainly the big daddy, though, and its release as GPL guarantees we'll at least have a solid Java 6 implementation forever.&lt;br /&gt;&lt;br /&gt;Java is not an entirely open platform, what with the now-obvious encumbrances of patents and copyrights (not to mention draconian policies toward Java's various specifications, which are often very slow to evolve due to the JCP quagmire). That's not a great state of affairs, and if nothing else you have to recognize that folks at Sun at least tried to release the platform from its shackles by chasing OpenJDK. But the process of &quot;freeing&quot; Java has been pretty rocky; OpenJDK itself took years to gain acceptance from OSS purists, and the choice of the GPL has meant that folks afeared of the GPL's &quot;viral&quot; side still had to look for other options (which is a large part of why Apache Harmony was used as part of the basis for Android).  Perhaps the biggest nail in the coffin is that Sun's Java test kit, the gold standard of whether an implementation is &quot;compliant&quot; or not, has never been released in open-source form, ultimately binding the hands of developers who wished to build a fully-compatible open-source Java.&lt;br /&gt;&lt;br /&gt;Java is not an entirely closed platform, either. OpenJDK was a huge step in the direction of Freeing Java, and the Java community in general has a very strong OSS ethos. There's no piece of Java software that isn't at least partially based on open-source componenents, and most Java library, framework, or application developers either initially or eventually open-source some or all of their works. Open-source development and the Java platform go hand-in-hand, and without that relationship the platform would not be where it is today. Contrast that to other popular environments like Microsoft's .NET – which has been admirably Freed through open standards, but which has not yet become synonymous with or popular for OSS development – or Apple's various platforms – which aren't based on open-standards *or* open-source, but which have managed to become many OSS developers' environment of choice...for writing or consuming non-Apple open-source software. Among the corporation-controlled runtimes, the Java platform has more OSS in its blood than all others combined...many times more.&lt;br /&gt;&lt;br /&gt;Java is not perfect, but it's pretty darn good. Every platform has its warts. The Java platform represents a decade and a half of tradeoffs, and it's impossible in that amount of time to make everyone happy all the time. One of the big contentious items is the addition in Java 5 of parametric polymorphism as a compile-time trick without also adding VM-level support for reifying per-type specializations as .NET can do. But ask most Java developers if they'd rather have nothing at all, and you'll get mixed responses. The sad, crippled version of generics in Java 5 doesn't do everything static-typing purists want, nor does it really extend to runtime at all (making reflective introspection almost impossible), but they do provide some nice surface-level sugar for Java developers. The same can be said of many Java &quot;features&quot; and tradeoffs. JavaEE became an abortively complicated jumble of mistakes (tradeoffs that went bad), but even upstarts that arguably made better decisions initially have themselves graduated into chaos (I believe the Spring framework has now grown even larger than the largest Java EE conglomerate, and Microsoft's periodically reboots their blessed-framework-of-the-week, resulting in an even more disruptive environment than a slow-moving, bulky standard like JavaEE). Designing good software is hard. Designing good *big* software is exponentially harder. Designing good *big* software that pleases everyone is impossible.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Why People Hate Java&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Java is second only to Microsoft's platforms for being both wildly successful and almost universally hated by the self-sure software elite. The reasons for this are manifold and complex.&lt;br /&gt;&lt;br /&gt;First of all, back in the 90s Java started getting shoved down everyone's throat. Developers were increasingly told to investigate this new platform, since their managers and long-disconnected tech leads kept hearing how great it was from Sun Microsystems, then a big deal in server applications and hardware. So developers that were happily using other environments (many of which exist to this day) often found themselves forced to suck it up and become Java developers. Making matters worse, Java itself was designed to be a fairly limited language...or at least limited in how easily a developer could paint themselves into a corner. Many features those reluctant developers had become used to in other environments were explicitly rejected for Java on the grounds that they added too much complexity, too much confusion, and too little value to trenches developers. So people that were happily doing Perl or C++ or Smalltalk or what have you were suddenly forced into a little J-shaped box and forced to write all those same applications upon Java and the JVM at a time when both were still poorly-suited to those domains. Those folks have had a white-hot hate for anything relating to Java ever since, and many will stop at nothing to see the entire platform ejected into space.&lt;br /&gt;&lt;br /&gt;Second, as mentioned quickly above, Java in the 90s was simply not that great a platform. It had most of the current warts (classpath issues, VM limitations, poor system-level integration, a very limited language) on top of the fact that it was slow (optimizing JVMs didn't come around until the 2000s), marketed for highly-visible, highly-fickle application domains like desktop and browser-based applications (everyone's cursed a Java app or applet at some point in their life), and still largely driven and controlled by a single company (at a time when many developers were trying to get out from under Microsoft's thumb). It wasn't until Java 1.2 that we started to get a large and diverse update to Java's core libraries. Java 1.3 was the first release to ship Hotspot, which started to get the performance monkey off our backs. Java 1.5 brought the first major changes to the Java language, all designed to aid developers in expressing what they meant in standard ways (like using type-safe enums instead of static final ints, or generics for compiler-level assurances of collection homogeneity). And Java 6, the last major version, made great strides in improving startup time, overall performance, and manageability of JVM processes. Java 7, should it ever ship, will bring new changes to the Java language like support for closures and other syntactic sugar, better system-level integration features as found in NIO.2, and the feather in the cap: VM-level support for function objects and non-standard invocation sequences via Method Handles and InvokeDynamic. But unless you've been a Java developer for the past decade, all you remember is the roaring 90s and the pain Java caused you as a developer or a user.&lt;br /&gt;&lt;br /&gt;Third, the Java language and environment has stagnated. Given years of declining fortunes at Sun Microsystems, disagreement among JCP members about the direction the platform should go, and a year of uncertainty triggered by Sun's collapse and rescue at the hands of Oracle, it's surprising anything's managed to get done at all. Java 7 is now many years overdue; they were talking about it when I joined Sun in 2006, and hoped to have preview releases within a year. For both technical and political reasons, it's taken a long time to bring the platform to the next level, and as a result many of the truly excellent improvements have remained on the shelf (much to my dismay...we really could use them in JRuby). For fast-moving technology hipsters, that's as good as dying on the vine; you need to shift paradigms on a regular schedule or you're yesterday's news.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;Update:&lt;/span&gt;&lt;/span&gt; At least one commenter also pointed out that it took a long time for Java to be &quot;everywhere&quot;, and even today most users still need to download and install it at least once on any newly-installed OS. Notable exceptions include Mac OS X, which ships a cracker-jack Java 6 based on Hotspot, and some flavors of Linux that come with some sort of Java installed out of the box. But this was definitely a very real problem; developers were being pushed to write apps and applets in Java, and users were forced to download a multi-megabyte installer just to run them...at a time when downloading multi-megabyte software was often a very painful ordeal. That would put a bad taste in anyone's mouth.&lt;br /&gt;&lt;br /&gt;It's because of these and similar reasons that folks like Google finally said &quot;enough is enough,&quot; and opted to start doing their own things. On the JRuby project, we've routinely hacked around the limitations of the JVM, be they related to its piss-poor process management APIs, its cumbersome support for binding native libraries, or its stubborn reluctance to become the world's greatest dynamic language VM. I've thought on numerous occasions how awesome it would be to spin off a company that took OpenJDK and made it &quot;right&quot; for the kinds of development people want to do today (and I'd love to be a part of that company), but such ventures are both expensive and light on profitability. Nobody pays for platforms or runtimes...they pay for services around those platforms or runtimes, services which are often anathema to the developers of those platforms and runtimes. So it required someone &quot;bigger&quot; to make that happen...someone who could write off the costs of the platform by funding it in creative new ways. Someone with a massive existing investment in Java. Someone with deep pockets and an army of the best developers in the business who love nothing more than a challenge. Someone like Google.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Why Android?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Note that a lot of this is based on what information I've managed to glean from various conversations. Clarifications or corrections are welcome.)&lt;br /&gt;&lt;br /&gt;There's an incredibly successful mobile Java platform out there. One that boasts millions of devices from almost all the major manufacturers, in form factors ranging from crappy mid-00s clamshells to high-end smartphones. A platform with hundreds or thousands of games and applications and freely-available development tools. That platform is Java ME.&lt;br /&gt;&lt;br /&gt;Java ME started out as an effort to bring Java back to its original roots: as a language and environment for writing embedded applications. The baseline ME profiles are pretty bare; I did some CLDC development years ago and had to implement my own buffered streams and various data structures just to get by. Even the biggest profiles are still fairly restricted, and I don't believe any of them have ever graduated beyond Java 1.3-level featuresets. So Sun did a great job of getting Java ME on devices, back when people cared about Sun...and then they let mobile Java stagnate to a terrible degree while they spent all resources trying to get people to use Java EE and trying to get Java EE to suck less. So while resources were getting poured into EE, people started to form the same opinions of mobile Java they had formed about desktop and server Java years earlier.&lt;br /&gt;&lt;br /&gt;At the same time, Java ME was one of the few Java-related technologies that brought in money. You see, in order for handset manufacturers to ship (and boast about) Java ME support, they had to license the technology from Sun. It wasn't a huge cash cow, but it was a cow nonetheless. Java ME actually made money for Sun. So in true Sun form, they loused it up terribly.&lt;br /&gt;&lt;br /&gt;Fast forward to a few years ago. Google, recognizing that mobile devices finally were becoming the next great technology market, decided that leaving the mobile world in the hands of proprietary platforms was a bad idea. Java ME seemed like it could be an answer, but Sun was starting to get desperate for both revenue and relevance...and they'd started to back a completely new horse-that-would-be-cow called JavaFX, which they hoped to pimp as the next great development environment for in-browser and on-device apps alike. They weren't interested in making Java ME be what Google wanted it to be.&lt;br /&gt;&lt;br /&gt;Google decided to take the hard route: they'd fund development of a new platform, building it entirely from open-source components, and leveraging two of the best platform technologies available: Linux, for the kernel, and Java, for the runtime environment. However there was a problem with Java: it was encumbered by all sorts of patents and copyrights and specifications and restrictions. Hell, even OpenJDK itself, the most complete and competitive OSS implementation of Java, could not be customized and shipped in binary-only form by hardware manufacturers and service providers due to it being GPL. So the answer was to build a new VM, use unencumbered versions of the core Java class libraries, and basically remake the world in a new, copyright and patent-free image. Android was born.&lt;br /&gt;&lt;br /&gt;There's many parts to Android, several of which I'm not really qualified to talk about. But the application environment that runs atop the Dalvik VM needs some explanation.&lt;br /&gt;&lt;br /&gt;First, there's the VM. Dalvik is *not* a JVM. It doesn't run JVM bytecode, and you can't ship JVM bytecode expecting it to work on Dalvik. You must recompile it to Dalvik's own bytecode using one of the provided translation tools. This is similar to how IKVM gets Java code to run on .NET: you're not actually running a JVM, you're transforming your code into a different form so it will run on someone else's VM. So it bears repeating, lest anyone get confused: Dalvik is not a JVM...it just plays one on TV.&lt;br /&gt;&lt;br /&gt;Second, there's the core Java class libraries. Android supports a rough (but large) subset of the Java 1.5 class libraries. That subset is large enough that projects as complicated as JRuby can basically run unmodified on Android, with very few restrictions (a notable one is the fact that since we can't generate JVM bytecode, we can't reoptimize Ruby code at runtime right now). In order to do this without licensing Sun's class libraries (as most other mainstream Java runtimes like JRockit and J9 do), Google opted to go with the not-quite-complete-but-pretty-close Apache Harmony class libraries, which had for years been developed independent of Sun or OpenJDK but never really tested against the Java compatibility kits (and there's a long and storied history behind this situation).&lt;br /&gt;&lt;br /&gt;So by building their own non-JVM VM and using translated versions of non-Sun, non-encumbered class libraries, Google hoped to avoid (or at least blunt) the possibility that their &quot;unofficial&quot;, &quot;unlicensed&quot; mobile Java platform might face a legal test. In short, they hoped to build the open mobile Java platform developers wanted without the legal and financial encumbrances of Java ME.&lt;br /&gt;&lt;br /&gt;At first, they seemed to be on a gravy train with biscuit wheels.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Splitting Up the Pie&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sun Microsystems was not amused. A little over a year ago, when several Sun developers started to take an eager interest in Android, we were all told to back off. It wasn't yet clear whether Android stood on solid legal ground, and Sun execs didn't want egg on their face if a bunch of their own employees turned out to be supporting a platform they'd eventually have to attack. Furthermore, it was an embarrassment to see Android drawing in the same developers Sun really, really wanted to look at JavaFX or PersonalJava or whatever the latest attempt to bring developers back might be. Android actually *was* a great platform that supported existing Java developers and libraries incredibly well (without actually being a Java environment), and for the first time there was a serious contender to &quot;standard&quot; Java that Sun had absolutely no control over.&lt;br /&gt;&lt;br /&gt;To make matters worse, handset manufacturers started to sign on in droves to this new non-Java ME platform, which meant all that technology licensing revenue was reaching a dead end. Nobody (including me) wanted to do Java ME development anymore. Everyone wanted to do Android development.&lt;br /&gt;&lt;br /&gt;Now we must say one thing to Sun's credit: they didn't do what Oracle is now attempting to do. As James Gosling blogged recently, patent litigation just wasn't in Sun's blood...even if there might have been legal ground to file suit. So while we Sun employees were still quietly discouraged from looking at or talking about Android, the rest of the world took Sun's silence as carte blanche to stuff Android into everything from phones to TVs, and mobile app developers started to think there might be hope for a real competitor to Apple's iPhone. Things might have proceeded in this way indefinitely, with Android continuing to grab market share (it recently passed iPhone in raw numbers with no slowing in sight) and mindshare (Android is far more approachable than almost any other mobile development environment, especially if you're one of the millions of developers who know Java.)&lt;br /&gt;&lt;br /&gt;And then it all started to go wrong.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;The Mantle of Java Passes to Oracle&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If for nothing else, Jonathan Schwartz will be remembered as the man who broke open the Sun piñata, simultaneously releasing more open-source software than any company in history and killing Sun in the process. Either Jonathan had no &quot;step 2&quot; or the inertia of a company built on closed-source products was too great to overcome. In either case, by spring of 2009 Sun was hemorrhaging. Many reports claim that Jonathan had started shopping Sun around to possible buyers as early as 2008, but it wasn't until 2009 that the first candidates started lining up. Initially, it was IBM, hoping to gobble up its former competitor along with the IP, patents, and copyrights they carried. That deal ultimately went south when Sun refused to consider any deal that IBM wouldn't promise to carry to completion, even in the face of regulatory roadblocks sure to come up. Many of us breathed a sigh of relief; if there's any Java company even more firmly stuck in the old world than Sun, it's IBM...and we weren't looking forward to dealing with that.&lt;br /&gt;&lt;br /&gt;Once that deal fell through, folks like me became resigned to the fact that Sun was nearing the end of its independent life. Years of platform negligence, management incompetence, and resting on laurels had dug a hole far too deep for anyone to climb out of. Would it be Cisco, who had recently started building up an interesting new portfolio of application server hardware and virtualization software? What about VMWare, who had recently gobbled up Springsource and seemed to be making all the right moves toward a large-scale virtualized &quot;everything cloud.&quot; Or perhaps Oracle, a long-time partner to Sun, whose software was either Java-based or widely deployed on Sun hardware and operating systems. Dear god, please don't let it be Oracle.&lt;br /&gt;&lt;br /&gt;Don't get me wrong...Oracle's a highly successful company. They've managed to turn almost every acquisition into gold while coaxing profitability out of just about every one of their divisions. But Oracle's not a developer-oriented company (like Sun)...it's a profit-oriented company (unlike Sun, sadly), and you need to either feed the bottom line or feed others in the company that do. So when it turned out that Oracle would gobble up Sun, many of us OSS folks started to get a little nervous.&lt;br /&gt;&lt;br /&gt;You see, many of us at Sun had been actively trying to change the perception of the platform from that of a corporate, enterprisey, closed world to that of a great VM with a great OSS ecosystem and an open-source reference implementation. Folks like Jonathan believed that by freeing Java we'd free the platform, and both the platform and the developer community would be better for it. We were half right...the OpenJDK genie is out of the bottle, and there's basically no way to put it back now (and for that, the world owes Sun a great debt). But only part of the platform was Freed...the patents and copyrights surrounding Hotspot and Java itself remained in place, carefully tucked away in the vault of a company that just didn't mount patent or copyright-driven legal attacks.&lt;br /&gt;&lt;br /&gt;Oracle, now in control of those patents and copyrights, obviously has different plans.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;The Suit&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So now, after spending 4000 words of your time, we come to the meat of the article: the actual Oracle v Google suit. The full text is provided various places online, though the &lt;a href=&quot;http://en.swpat.org/wiki/Oracle_v._Google_(2010,_USA)&quot;&gt;Software Patents Wiki&lt;/a&gt; has probably the best collection of related facts (though the wiki-driven discussions of the actual patents are woefully inaccurate).&lt;br /&gt;&lt;br /&gt;The suit largely comes down to a patent-infringement battle. Oracle claims that by developing and distributing Android, Google is in violation of seven patents. There's also an amorphous copyright claim without much backing information (&quot;Google probably stole something copyrighted so we'll list a bunch of stuff commonly stolen in that way&quot;), so we'll skip that one today.&lt;br /&gt;&lt;br /&gt;Before looking at the actual patents involved, I want to make one thing absolutely clear: Oracle has not already won this suit. Even after a couple days of analysis, nobody has any idea whether they *can* win such a suit, given that Google seems to have taken great pains to avoid legal entanglements when designing Android. So everybody needs to take a deep breath and let things progress as they should, and either trust that things will go the right direction or start doing your damndest to make sure they go the right direction.&lt;br /&gt;&lt;br /&gt;With that said, let's take a peek at the patents, one by one. And as always, the &quot;facts&quot; here are based on my reading of the patents and my understanding of the related systems.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;a href=&quot;http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO2&amp;Sect2=HITOFF&amp;p=1&amp;u=/netahtml/PTO/search-bool.html&amp;r=1&amp;f=G&amp;l=50&amp;co1=AND&amp;d=PTXT&amp;s1=6,125,447.PN.&amp;OS=PN/6,125,447&amp;RS=PN/6,125,447&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Protection Domains To Provide Security In A Computer System (6,125,447)&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;&gt; and &lt;/span&gt;&lt;a href=&quot;http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO2&amp;Sect2=HITOFF&amp;p=1&amp;u=/netahtml/PTO/search-bool.html&amp;r=1&amp;f=G&amp;l=50&amp;co1=AND&amp;d=PTXT&amp;s1=6,192,476.PN.&amp;OS=PN/6,192,476&amp;RS=PN/6,192,476&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Controlling Access To A Resource (6,192,476)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The first two patents describe the Java Security Policy system, for controlling access to resources. One of the least-interesting but most-important aspects of the Java platform is its approach to security. Code under a specific classloader or thread can be forced to comply with a specific security policy by installing a security manager. These permissions control just about every aspect of the code's interaction with the JVM and with the host operating system: loading new code, reflectively accessing existing classes, accessing system-level resources like devices and filesystems, and so on. It's even easy for you to build up security policies of your own by checking for custom-named permissions and only granting them when appropriate. It's a pretty good system, and one of the reasons Java has a much stronger security track record than other runtimes that don't have pervasive security in mind from the beginning.&lt;br /&gt;&lt;br /&gt;In order to host applications written for the Java platform, and to sandbox them in a compatible way, Android necessarily had to support the same security mechanisms. The problem here is the same problem that plagues many patents: what boils down to a fairly simple and obvious way to solve a problem (associate pieces of code with sets of permissions, don't let that code do anything outside those permissions) becomes so far-reaching that almost any reasonable *implementation* of that idea would violate these patents. In this case the '447 and '476 patents do describe mechanisms for implementing Java security policies, but even that simple implementation is very vague and would be hard to avoid with even a clean-room implementation.&lt;br /&gt;&lt;br /&gt;Now I do not know exactly how Android implements security policies, but it's probably pretty close to what's described in these patents...since just about every implementation of security policies would be pretty close to what's described.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;a href=&quot;http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO2&amp;Sect2=HITOFF&amp;p=1&amp;u=/netahtml/PTO/search-bool.html&amp;r=1&amp;f=G&amp;l=50&amp;co1=AND&amp;d=PTXT&amp;s1=5,966,702.PN.&amp;OS=PN/5,966,702&amp;RS=PN/5,966,702&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Method And Apparatus For Preprocessing And Packaging Class Files (5,966,702)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is basically the patent governing the &quot;Pack200&quot; compression format provided as part of the JDK and used to better-compress class file archives.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;Update:&lt;/span&gt;&lt;/span&gt; Alex Blewitt has posted a &lt;a href=&quot;http://alblue.bandlem.com/2010/08/more-details-on-5966702-and-pack200.html&quot;&gt;discussion of the Pack200 specification&lt;/a&gt;. He says this patent isn't nearly as comprehensive, but that it may touch upon how Pack200 works. His post is a more complete treatment of the details of the class file format and how Pack200 improves compression ratios for class archives. It also occurs to me now that this patent could be related to mobile/embedded Java too, where better compression would obviously have an enormous savings.&lt;br /&gt;&lt;br /&gt;Java class files are filled with redundant data. For example, every class that contains code that calls PrintStream.println (as in System.out.println) contains the same &quot;constant pool&quot; entry identifying that method by name, a la &quot;java/io/PrintStream.println:(Ljava/lang/String;)V&quot;. Every field lookup, class reference, literal string, or method invocation will have some sort of entry in the constant pool. Pack200 takes advantage of this fact by compressing all class files as a single unit, batching duplicate data into one place so that the actual unique class data boils down to just the unique class, method, and code structure.&lt;br /&gt;&lt;br /&gt;The reason for having a separate compression format is because &quot;zip&quot; files, which includes Java's &quot;jar&quot; files, are notoriously bad at compressing many small files with redundant data. Because one of the features of the &quot;zip&quot; format is that you can easily pull a single file out, compressing all files together as a single unit prevents introducing any interdependencies between those files or a global table. This is a large part of why compression formats like &quot;tar.gz&quot; do a better job of compressing many small files: tar turns many files into one file, and gzip or bzip2 compress that one large file as a single unit (conversely, this is why you can't easily get a single file out of a tarball).&lt;br /&gt;&lt;br /&gt;On Android, this is accomplished in a similar way by the &quot;dex&quot; tool, which in the process of translating JVM bytecode into Dalvik bytecode also localizes all duplicate class data in a single place. The general technique is standard data compression theory, so presumably the novelty lies in applying decades-old compression theory specifically to Java classfile structure.&lt;br /&gt;&lt;br /&gt;If I've lost you at this point, we can summarize it this way: part of Oracle's suit lies in a patent for a better compression mechanism for archives containing many class files that takes advantage of redundant data in those files.&lt;br /&gt;&lt;br /&gt;Are you laughing yet?&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;a href=&quot;http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO2&amp;Sect2=HITOFF&amp;p=1&amp;u=/netahtml/PTO/search-bool.html&amp;r=1&amp;f=G&amp;l=50&amp;co1=AND&amp;d=PTXT&amp;s1=7,426,720.PN.&amp;OS=PN/7,426,720&amp;RS=PN/7,426,720&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;System And Method For Dynamic Preloading Of Classes Through Memory Space Cloning Of A Master Runtime System Process (7,426,720)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm not sure this patent ever saw the light of day in a mainstream JVM implementation. It describes a mechanism by which a master parent process could pre-load and pre-initialize code for a managed system, and then new processes that need to boot quickly would basically be memory-copied (plus copy-on-write friendly) &quot;forks&quot; of that master process, with the master maintaining overall control of those child processes through some sort of IPC.&lt;br /&gt;&lt;br /&gt;Ignore for the moment the obvious prior art of &quot;fork&quot; itself as applied to pre-initializing application state for many children. Anyone who's ever used fork to initialize a heavy process or runtime to avoid the cost of reinitializing children has either violated this patent (if done since 2003) or has a compelling case for prior art (if done before 2003).&lt;br /&gt;&lt;br /&gt;It's likely that this patent was formulated as an answer to the poor semantics of running many applications under the same JVM. Java servlets and later Java EE made it possible to consider deploying all of your company's applications in a single process, isolated by classloaders and security policies. What they never really addressed was the fact that code isn't the only thing you're sharing in this model; you're also sharing memory space, CPU time, and process resources like file descriptors. No amount of Java classloader or security trickery could make this a seamless multiapp environment, and so work like this patent hoped to find a lightweight way for all those child applications to actually live as their own processes.&lt;br /&gt;&lt;br /&gt;On Android, this manifests in the fact that each application runs independently, and they (like most operating systems) fork off from either the kernel process or some master process.&lt;br /&gt;&lt;br /&gt;In this case, Oracle's banking on being able to litigate with a patent for a very common application of &quot;fork&quot;.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;a href=&quot;http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO2&amp;Sect2=HITOFF&amp;p=1&amp;u=/netahtml/PTO/search-bool.html&amp;r=1&amp;f=G&amp;l=50&amp;co1=AND&amp;d=PTXT&amp;s1=RE38,104.PN.&amp;OS=PN/RE38,104&amp;RS=PN/RE38,104&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Method And Apparatus For Resolving Data References In Generated Code (RE38,104)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This patent, invented by James Gosling himself, basically describes a mechanism by which symbolic data references in code (e.g. Java field references) can be resolved dynamically at runtime into actual direct memory accesses, eliminating the symbolic lookup overhead. It's part of standard JIT optimization techniques, and there's a lot of references in this patent many great JIT patents and papers of the past.&lt;br /&gt;&lt;br /&gt;Here there may actually be merit, or as much merit as can be found in a software patent to begin with. The patent itself is tiny, as most of these patents are. The techniques seem obvious to me, but perhaps they're obvious because this patent helped make them standard. I'm not qualified to judge. What I can say is that I can't imagine a VM in existence that doesn't violate the spirit – if not the letter – of this patent as well. All systems with symbolic references will seek to eliminate the symbolic references in favor of direct access. The novelty of this patent may be in doing that translation on the fly...not even at a decidedly coarse-grained per-method level, but by rewriting code while the method is actually executing.&lt;br /&gt;&lt;br /&gt;I would guess that this is a patent filed during the development of Java's earlier JIT technologies, before systems like Hotspot came along to do a much better large-scale, cross-method job of optimization. It doesn't seem like it would be hard to debunk the novelty of the patent, or at least show prior art that makes it irrelevant.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;Update:&lt;/span&gt;&lt;/span&gt; I actually found a reference in the article &lt;a href=&quot;http://www.netmite.com/android/mydroid/dalvik/docs/dexopt.html&quot;&gt;Dalvik Optimization and Verification with dexopt&lt;/a&gt; to the technique described here (about 3/4 down the page, under &quot;Optimization&quot;):&lt;br /&gt;&lt;br /&gt;&quot;The Dalvik optimizer does the following: ... &lt;span&gt;For instance field get/put, replace the field index with a byte offset.&lt;/span&gt; ...&quot;&lt;br /&gt;&lt;br /&gt;But Dalvik still does this only once, before running the code (actually, at install time); not *while* running the code as described in the patent.&lt;br /&gt;&lt;span&gt;&lt;a href=&quot;http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO2&amp;Sect2=HITOFF&amp;p=1&amp;u=/netahtml/PTO/search-bool.html&amp;r=1&amp;f=G&amp;l=50&amp;co1=AND&amp;d=PTXT&amp;s1=6,910,205.PN.&amp;OS=PN/6,910,205&amp;RS=PN/6,910,205&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Interpreting Functions Utilizing A Hybrid Of Virtual And Native Machine Instructions (6,910,205)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This patent, invented by Lars Bak of V8 fame, describes a mechanism for building a &quot;mixed mode&quot; VM that can execute interpreted code and compiled (presumably optimized) code in the same VM process, and flip between the two over time to produce better-optimized compiled code. This describes the basic underpinnings of VMs like Hotspot, which alternate between interpreting virtual machine code and executing real machine code even within the same thread of execution (and sometimes, even branching from virtual code to real code and back within the same method body). Any other VMs that are mixed mode would probably violate this patent, so its impact could reach much farther than Android. (In a sense, even JRuby might violate this patent, though our two mixed modes are both virtual instruction sets.)&lt;br /&gt;&lt;br /&gt;Now you might think the other mainstream JVMs would violate this patent, but they don't. Neither JRockit nor J9 have interpreters; they both go immediately to native code with various tiers of instrumentation to do the runtime profile data gathering. They iterative regenerate native code with successively more and better optimizations. Lars most recent VM, the V8 Javascript VM at the heart of Chrome, also goes straight to native code.&lt;br /&gt;&lt;br /&gt;Now here's where it gets weird: Up until Froyo (Android 2.2) Dalvik did a once-only compilation to native code before anything started executing, which means by definition that it was not mixed-mode. And even in Froyo, I believe it still does its initial execution in native code form with instrumentation to allow subsequent compiles to do a better job. Dalvik does not have an interpreter, Dalvik does not interpret Dalvik bytecode.&lt;br /&gt;&lt;br /&gt;Perhaps someone can explain how this patent even applies to Dalvik or Android?&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;Update:&lt;/span&gt;&lt;/span&gt; A couple commenters correct me here: Dalvik actually was 100% interpreted before Froyo, and is now a standard mixed-mode environment post-Froyo. So if this suit had been filed a year ago this patent might not have been applicable, but it probably is now.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;a href=&quot;http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO2&amp;Sect2=HITOFF&amp;p=1&amp;u=/netahtml/PTO/search-bool.html&amp;r=1&amp;f=G&amp;l=50&amp;co1=AND&amp;d=PTXT&amp;s1=6,061,520.PN.&amp;OS=PN/6,061,520&amp;RS=PN/6,061,520&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Method And System for Performing Static Initialization (6,061,520)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sigh. This patent appears to revolve completely around a mechanism by which the static initialization of arrays could be &quot;play executed&quot; in a preloader and then rewritten to do static initialization in one shot, or at least more efficiently than running dozens of class initializers that just construct arrays and populate them. Of all the patents, this is probably the narrowest, and the mechanism described are again not very unusual, but there's probably a good chance that the &quot;dex&quot; tool does something along these lines to tidy up static initializers in Android applications.&lt;br /&gt;&lt;br /&gt;Given the &quot;preloader&quot; aspect of this patent, I'd surmise that it was formulated in part to simplify static initialization of code on embedded devices or in applet environments (because on servers...the boot time of static initialization is probably of little concern). Because of the much more limited nature of embedded environments (especially in 1998, when this patent was filed) it would be very beneficial to turn programmatic data initialization into a simple copy operation or a specialized virtual machine instruction. And this may be why it could apply to Android; it's another sort of embedded Java, with a preloader (either dex or the dexopt tool that jit-compiles your app on the device) and resource limitations that would warrant optimizing static initialization.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;So, Does the Suit Have Merit?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'll again reiterate that I'm not a lawyer. I'm just a Java developer with a logical mind and a penchant for debunking myths about the Java platform.&lt;br /&gt;&lt;br /&gt;The collection of patents specified by the suit seems pretty laughable to me. If I were Google, I wouldn't be particularly worried about showing prior art for the patents in question or demonstrating how Android/Dalvik don't actually violate them. Some, like the &quot;mixed mode&quot; patent, don't actually seem to apply at all. It feels very much like a bunch of Sun engineers got together in a room with a bunch of lawyers and started digging for patents that Google might have violated without actually knowing much about Android or Dalvik to begin with.&lt;br /&gt;&lt;br /&gt;But does the suit have merit? It depends if you consider baseless or over-general patents to have merit. The most substantial patent listed here is the &quot;mixed mode&quot; patent, and unless I'm wrong that one doesn't  apply. The others are all variations on prior art, usually specialized for a Java runtime environment (and therefore with some question as to whether they can apply to a non-Java runtime environment that happens to have a translator from Java code). Having read through the suit and scanned the patents, I have to say I'm not particularly worried. But then again, I don't know what sort of magic David Boies and company might be able to pull off.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;What Might Happen?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the unlikely event of a total victory by Oracle, there's probably a lot of possible outcomes. I don't see the &quot;death of Java&quot; among them. There's also the possibility that Google could win a convincing victory. What might happen in each case?&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;The Nuclear Option&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The worst case scenario would be that Android is completely destroyed, all Android handsets are confiscated by the Oracle mafia and burned in the city square, and all hope for a Free and Open Java are forever laid to rest. Long live Mono.&lt;br /&gt;&lt;br /&gt;To understand why this won't happen we need to explore Oracle's possible motives.&lt;br /&gt;&lt;br /&gt;As I mentioned above, Java ME actually did bring licensing revenue to Sun. There's a lot of handset manufacturers, millions of handsets, and every one put a couple cents (or a couple bucks?) in Sun's pocket. In the heady high times of Java ME, it was the only managed mobile runtime in town, with sound and graphics and standard UI elements. It wasn't always pretty, but it worked well and it was really easy to write for.&lt;br /&gt;&lt;br /&gt;Now with Android rapidly becoming the preferred mobile and embedded Java, it's become apparent that there's no future for Java ME - or at least no future in the expanding &quot;smart&quot; consumer electronics business. Java ME lives on in Blackberries, some other low-end phones, in most Blu-Ray devices (BD-J is a standard for writing Java apps that run on Blu-Ray systems, utilizing one of the richer class libraries available for Java ME), and in some sub-micro devices like Ajile's AJ-200 Java-based multimedia CPU. If you want Java on a phone or in your TV, Android is taking that world by storm. That means Java ME licensing revenue is rapidly drying up.&lt;br /&gt;&lt;br /&gt;So why wouldn't Oracle want to take a bite of the rapidly-growing Android pie? Would they turn down a portion of that revenue and instead completely destroy a very popular and successful mobile Java, or would they just strongarm a few bucks out of Google and Android handset manufacturers? Remember we're talking about a profit-driven company here. Java ME is never going to come back to smartphones, that much is certain and I don't think even Oracle could argue it. There's no profit in filing this suit just to kill Android, since it would just mean competing mobile platforms like Windows Phone, RIM, Symbian, or iOS would just canibalize their younger brother. Instead of getting a slice of the fastest-growing segment of Java developers, you'd kill off the entire segment and force those developers to non-Java, non-Oracle-friendly platforms.&lt;br /&gt;&lt;br /&gt;Oracle may be big and evil, but they're not stupid.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Google Licensing Deal&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A more likely outcome might be that Google would be forced to license the patents or pay royalties on Android revenue. I honestly believe this is the goal of this lawsuit; Oracle wants to get their foot into the door of the smartphone world, and they know they can't innovate enough to make up for the collapse of Java ME. So they're hoping that by sabre-rattling a few patents, Google will be forced (or scared) into sharing the harvest.&lt;br /&gt;&lt;br /&gt;Given the contents of the suit and the patents, I think this one is pretty unlikely too. Much of Android and Dalvik's designs are specifically crafted to avoid Java entanglements, and I think it's unlikely if this suit goes to trial that Oracle's lawyers would be able to make a convincing argument that the patents were both novel and that they were violated by Google. But let's not put anything past either the lawyers or the US federal court system, eh?&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Nothing At All&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There's a good chance that either Oracle or the court will realize quickly that the case has no merit, and drop all charges. I'm obviously hoping for this one, but it's likely to take the longest of all. First, the court would need to gather all facts in the case, which could take months (especially given the highly technical nature of some of the compaints). Then there's the rebuttals of those facts, sorting out the wheat from the chaff, deciding there's not enough there to proceed, and either Oracle backs out or the court tosses the case. In the latter case, there's the possibility of appeals, and things could start to get very expensive.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Total Collapse of Software Patents&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is probably the one of the highest-profile cases involving software patents in recent years. The other would be Apple's recent suit against HTC for design elements of the iPhone. Several other bloggers and analysts have called out the possibility that this could lead to the death of software patents in general. I think that's a bit optimistic, but both Google *and* Oracle have come down officially against patents in the past (though perhaps Oracle's had a change of heart since acquiring Sun's portfolio).&lt;br /&gt;&lt;br /&gt;As much as I'd like to see it happen, software patents probably won't be dead in the next year or two. But this might be a nail in the coffin.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;What Does This Mean for Java?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now we come to the biggest question of all: how does this suit affect the Java world, regardless of outcome?&lt;br /&gt;&lt;br /&gt;Well it's obviously not great to have two Java heavyweights bickering like schoolchildren, and it would be positively devastating if Android were obliterated because of this. But I think the real damage will be in how the developer community perceives Java, rather than in any lasting impact on the platform itself.&lt;br /&gt;&lt;br /&gt;Let's return to some of our facts. First off, nothing in this suit would apply to any of the three mainstream JVMs that 99% of the world's Java runs on. Hotspot and JRockit are both owned by Oracle, and J9 is subject to the Java specification's patent grant for compliant implementations. The lesson here is that Android is the first Java-like environment since Microsoft's J++ to attempt to unilaterally subset or superset the platform (with the difference in Android's case being that it doesn't claim to be a Java environment, and it may not actually need the patent grant). Other Java implementations that &quot;follow the Rules&quot; are in the clear, and so 99% of the world's use of Java is in the clear. Sorry, Java haters...this isn't your moment.&lt;br /&gt;&lt;br /&gt;This certainly does some damage to the notion of open-source Java implementations, but only those that are not (or can not be) compliant with the specification. As the Apache Harmony folks know all too well, it's really hard to build a clean-room implementation of Java and expect to get the &quot;spec compliance patent grant&quot; if you don't actually have the tools necessary to show spec compliance. Tossing the code over to Sun to run compliance testing is a nonstarter; the actual test kit is enormous and requires a huge time investment to set up and run (and Sun/Oracle have better things to do with their time than help out a competing OSS Java implementation). If the test kit had been open-sourced before Sun foundered, there would be no problem; everyone that wanted to make an open-source java would just aim for 100% compliance with the spec and all would be well. As it stands, independently implemented (i.e. non-OpenJDK) open-source Java is a really hard thing to create, especially if you have to clean-room implement all the class libraries yourself. Android has neatly dodged this issue by letting Android just be what it is: a subset of a Java-like platform that doesn't actually run Java bytecode and doesn't use any code from OpenJDK.&lt;br /&gt;&lt;br /&gt;How will it affect Android if this case drags on? It could certainly hurt Android's adoption by hardware manufacturers, but they're already getting such an oustanding deal on the platform that they might not even care. Android is the first platform that has the potential to unify all hardware profiles, freeing manufacturers from the drudgery of building their own OSes or licensing OSes from someone else. Hell, HTC rose from zero to Hero largely because of their backing of Android and shipping of Android devices. Are they going to back off from that platform now just because Oracle's throwing lawyerbombs at Google? Probably not.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;What Does This Mean For You?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you're a non-Android Java developer...don't lose sleep over this. The details are going to take months to play out, and regardless of the outcome you're probably not going to be affected. Be happy, do great things, and keep making the Java platform a better place.&lt;br /&gt;&lt;br /&gt;If you're an Android developer...don't lose sleep over this. Even if things go the way of the &quot;Nuclear Option&quot;, you've still got a lot of time to build and sell apps and improve yourself as a developer. For a bit of novelty, start considering what a migration path might look like and turn that into a nice Android-agnostic application layer, something that's largely lacking in the current Android APIs. Or explore Android development in languages like JRuby, which are based on off-platform ecosystems that will survive regardless of Android's fate. Whatever you do, don't panic and run for the hills, and don't tell your friends to panic.&lt;br /&gt;&lt;br /&gt;If you're mad as hell about this...I sympathize. I'm personally going to do whatever I can to keep people informed and keep pushing Android, including but not limited to writing 8000-word essays with my moderately-educated analysis of the &quot;facts&quot;. I welcome your help in that fight, and I think it's a damn good time for people that want an open Java and an open mobile platform to show their quality by standing up and letting the world know we're here.&lt;br /&gt;&lt;br /&gt;&quot;All that is necessary for the triumph of evil is for good men to do nothing.&quot;&lt;br /&gt;&lt;br /&gt;Do something, and we'll get through this together.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Footnote: Java Copyrights&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'd love for someone versed in copyright law to provide a brief analysis of how the Java copyrights described (vaguely) in the lawsuit might play out in Android. Java is certainly not ignored as a concept in Android docs, tools, and libraries, but it's unclear to me whether those copyrights amount to something enforceable when it comes to Android or Dalvik.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;Update:&lt;/span&gt;&lt;/span&gt; &quot;Crazy&quot; Bob Lee emailed me to clear up a few facts. First off, Android and OpenJDK first came out around roughly the same time, so there was never really time to consider using OpenJDK's GPL'ed class libraries in Android. Bob also claims that Dalvik's design decisions were all technical and not made to circumvent IP, but it seems impossible to me that IP, patent, and licensing issues didn't have *some* influence on those decisions. He goes on to say that Android relies on process separation to sandbox applications, rather than leveraging Java security policies (or similar mechanisms (which Bob insists are badly designed anyway, and I might agree). Finally, he believes that in the worst case scenario, Dalvik would probably only require minor modifications to address the complaints in this suit. The &quot;nuclear option&quot; is, according to Bob, out of the realm of possibility.&lt;br /&gt;&lt;br /&gt;Thanks for the clarifications, Bob!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/20975090-5342643660224394169?l=blog.headius.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Charles Oliver Nutter</name>
			<email>headius@headius.com</email>
			<uri>http://blog.headius.com/</uri>
		</author>
		<source>
			<title type="html">Headius</title>
			<subtitle type="html">Helping Ruby and Java Evolve Together</subtitle>
			<link rel="self" href="http://blog.headius.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-20975090</id>
			<updated>2010-09-07T14:00:05+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Book review - Web Operations</title>
		<link href="http://tomcopeland.blogs.com/juniordeveloper/2010/08/book-review-web-operations.html"/>
		<id>http://tomcopeland.blogs.com/juniordeveloper/2010/08/book-review-web-operations.html</id>
		<updated>2010-08-17T13:55:01+00:00</updated>
		<content type="html">&lt;p&gt;I just finished reading a great book - &lt;a href=&quot;http://www.amazon.com/gp/product/1449377440?ie=UTF8&amp;tag=militproferea-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1449377440&quot;&gt;Web Operations&lt;/a&gt; by John Allspaw and Jesse Robbins.  This isn't a book of code samples; it's a book to make you think more about system administration in the large, infrastructure as code, and other big picture items for the web systems that we deal with today.  Some notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chapters 6 and 11 talk about the difference between monitoring and metrics and the need for both.  I've always done the monitoring part - mostly on the system level, though, gathering load average and disk usage and such.  What I haven't done enough of is monitoring on the app level - e.g., if 100 users have signed up in the last day, alert me.  These sorts of things are very doable, but they require effort.  For metrics, doing those on the application level is very informative - how many users signed up today?  How many tickets were opened in the past week?  These chapters talk about using Ganglia for that... sounds like a great tool, and would be an improvement over the low-ceremony daily summary emails.  At least those are a start, though; better than nothing.  Gathering those metrics can lead to interesting discussions around trends and forecasting - if we did get 100 users in a day, what would that mean for our system?  How would that change our hardware breakdown?  And there are business-level questions too - are those users coming back, or are they creating accounts and never logging in again?&lt;/li&gt;

&lt;li&gt;Chapter 7 is a reprint of the excellent &quot;How Complex Systems Fail&quot; essay by Dr Richard Cook.  Well worth reading and re-reading.&lt;/li&gt;

&lt;li&gt;Chapter 10 is a good discussion of dev/ops collaboration - or, sadly and more often, the conflict between the two.  It's a tragedy and a waste when dev folks and ops folks don't get along.  The ops guys have so much to teach the devs - they spend all day dealing with and are experts in stuff that devs usually touch once every 3 months (network configs, DNS, SMTP, backup/restore).  And vice versa, of course - my impression is that there are a lot of ops shops that aren't using SCM for their scripts and don't have server builds automated.  Tools like &lt;a href=&quot;http://www.puppetlabs.com/&quot;&gt;Puppet&lt;/a&gt; can help to bridge this gap... generally, both dev and ops need to be considerate of each other's responsibilities and needs.  Lots to learn here.&lt;/li&gt;

&lt;li&gt;Chapter 12 had a fun discussion of the lure of DB clustering.  I won't spoil it for you, but it really rang true for me.&lt;/li&gt;

&lt;li&gt;One thing I liked about the whole book was the general assumption that you do want failover and redundancy and are willing to work for that.  That is to say, that you actually care about the app you are working on, the people you are working with, and the customers you are serving!  I don't quite know how to put my finger on it... but there's sort of an underlying thoughtfulness about it all.  There's a feeling that I don't want to blame others for the system going down, rather, I want to build in sufficient checks and balances so that when a server goes down the system continues to tick along without anyone having to make the 2 AM drive to the colo.  It reminds me of the &lt;a href=&quot;http://cassandra.apache.org/&quot;&gt;Cassandra&lt;/a&gt; project fellows saying that if a DB node goes offline in the middle of the night they can say &quot;meh&quot; and let it go until the next day.  Good stuff.&lt;/li&gt;

&lt;/ul&gt;


&lt;p&gt;Obviously, I heartily recommend this book.  If you've done much devops at all you'll find yourself enjoying (and sympathizing with the folks suffering through) the anecdotes, and you'll come away from this book a list of things to do to lower the stress level around running your web app.  Enjoy!&lt;/p&gt;</content>
		<author>
			<name>Tom Copeland</name>
			<uri>http://tomcopeland.blogs.com/juniordeveloper/</uri>
		</author>
		<source>
			<title type="html">Junior developer: Ruby</title>
			<subtitle type="html">puts &quot;Hello world!&quot;</subtitle>
			<link rel="self" href="http://tomcopeland.blogs.com/juniordeveloper/index-ruby.rdf"/>
			<id>http://tomcopeland.blogs.com/juniordeveloper/index-ruby.rdf</id>
			<updated>2010-09-08T05:00:06+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Why Whyday</title>
		<link href="http://onestepback.org/index.cgi/General/WhyWhyDay.red"/>
		<id>http://onestepback.org/index.cgi/General/WhyWhyDay.red</id>
		<updated>2010-08-16T17:00:15+00:00</updated>
		<content type="html">&lt;p&gt;&lt;em&gt;This next Thursday is Whyday.  Celebrate with some outragous coding.&lt;/em&gt;&lt;/p&gt;


	&lt;h2&gt;What are you doing for Whyday?&lt;/h2&gt;


	&lt;p&gt;This next Thursday is designated as &lt;a href=&quot;http://whyday.org/&quot;&gt;Whyday&lt;/a&gt;, a
day set aside to commemorate all the many wacky contributions of Why
the Lucky Stiff to the Ruby community.  How do you celebrate WhyDay?
The WhyDay web page suggests:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;See how far you can push some weird corner of Ruby (or some other language).&lt;/li&gt;
		&lt;li&gt;Choose a tight constraint (for example, 4 kilobytes of source code) and see what you can do with it.&lt;/li&gt;
		&lt;li&gt;Try that wild idea you&amp;#8217;ve been sitting on because it&amp;#8217;s too crazy.&lt;/li&gt;
		&lt;li&gt;You can work to maintain some of the software Why left us (although Why is more about creating beautiful new things than polishing old things).&lt;/li&gt;
		&lt;li&gt;On the other hand, Why is passionate about teaching programming to children. So improvements to Hackety Hack would be welcome.&lt;/li&gt;
		&lt;li&gt;Or take direct action along those lines, and teach Ruby to a child.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;As for me, I have several ideas:&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;Play with the &lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt; canvas, maybe writing a Ruby &lt;span class=&quot;caps&quot;&gt;DSL&lt;/span&gt; for easily generating diagrams in Ruby.&lt;/li&gt;
		&lt;li&gt;Play with some Grit (a Ruby/Git library) and see if I can categorize git commits into a swimlane structure.&lt;/li&gt;
		&lt;li&gt;Combine the two ideas into program that generates a graphical swimlane representation (using an &lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt; canvas) of a git project history (similar to the hand drawn swimlanes in &lt;a href=&quot;http://nvie.com/git-model&quot;&gt;Vincent Driessen&amp;#8217;s Article&lt;/a&gt;).&lt;/li&gt;
	&lt;/ol&gt;


	&lt;p&gt;Those are just my ideas.  And I reserve the right to change my mind at a moments notice.&lt;/p&gt;


	&lt;p&gt;So, what are you doing for whyday?&lt;/p&gt;</content>
		<author>
			<name>Jim Weirich</name>
			<uri>http://onestepback.org/index.cgi</uri>
		</author>
		<source>
			<title type="html">{ |one, step, back| }</title>
			<subtitle type="html">Jim Weirich's Blog</subtitle>
			<link rel="self" href="http://onestepback.org/index.cgi/index.rss"/>
			<id>http://onestepback.org/index.cgi/index.rss</id>
			<updated>2010-08-16T17:00:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Rails and PostgreSQL job at Paperless Post</title>
		<link href="http://railsonpostgresql.com/2010/08/10/rails-and-postgresql-job-at-paperless-post"/>
		<id>urn:uuid:7ab37c59-16d6-4fe4-b181-bcaaeec5bda5</id>
		<updated>2010-08-10T17:17:00+00:00</updated>
		<content type="html">&lt;p&gt;Another Rails and PostgreSQL job, this time at &lt;a href=&quot;http://jobs.github.com/positions/3fb1b2e6-a36e-11df-9f2e-819013ea526f&quot;&gt;Paperless Post&lt;/a&gt; (via the Github jobs board).  Looks like they have a &lt;a href=&quot;http://www.paperlesspost.com/info/about/open_positions&quot;&gt;few more open positions&lt;/a&gt;.  And you'd work with &lt;a href=&quot;http://www.quirkey.com/blog/&quot;&gt;Aaron Quint&lt;/a&gt;, who's their CTO.  Good times!&lt;/p&gt;</content>
		<author>
			<name>Rails on PostgreSQL</name>
			<uri>http://railsonpostgresql.com/articles.rss</uri>
		</author>
		<source>
			<title type="html">Rails on PostgreSQL :</title>
			<subtitle type="html">&lt;h3&gt;If you like Ruby on Rails, you'll love Rails on PostgreSQL!&lt;/h3&gt;</subtitle>
			<link rel="self" href="http://railsonpostgresql.com/articles.rss"/>
			<id>http://railsonpostgresql.com/articles.rss</id>
			<updated>2010-08-18T17:00:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Rails and PostgreSQL job at elevenlearning.com</title>
		<link href="http://railsonpostgresql.com/2010/08/06/rails-and-postgresql-job-at-elevenlearning-com"/>
		<id>urn:uuid:2250efb4-892f-4d97-ac49-a4f61ae1adbf</id>
		<updated>2010-08-06T13:33:00+00:00</updated>
		<content type="html">Saw this ad for a &lt;a href=&quot;http://railswork.com/jobs/1332-rails-developer-for-educational-publishing-startup-pt-ft-early-stage&quot;&gt;Rails and PostgreSQL job&lt;/a&gt; at &lt;a href=&quot;http://www.elevenlearning.com/&quot;&gt;Eleven Learning&lt;/a&gt;.  The &lt;a href=&quot;http://blog.elevenlearning.com/2010/07/30/we-were-going-to-call-it-compuglobalhypermeganet-learning/&quot;&gt;company name is a &quot;Spinal Tap&quot; reference&lt;/a&gt;... well played.</content>
		<author>
			<name>Rails on PostgreSQL</name>
			<uri>http://railsonpostgresql.com/articles.rss</uri>
		</author>
		<source>
			<title type="html">Rails on PostgreSQL :</title>
			<subtitle type="html">&lt;h3&gt;If you like Ruby on Rails, you'll love Rails on PostgreSQL!&lt;/h3&gt;</subtitle>
			<link rel="self" href="http://railsonpostgresql.com/articles.rss"/>
			<id>http://railsonpostgresql.com/articles.rss</id>
			<updated>2010-08-18T17:00:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">PGCon 2010 talk on Rails and PostgreSQL</title>
		<link href="http://railsonpostgresql.com/2010/08/03/pgcon-2010-talk-on-rails-and-postgresql"/>
		<id>urn:uuid:eb9664aa-77a4-4b7c-8fbb-19160687a728</id>
		<updated>2010-08-03T21:04:00+00:00</updated>
		<content type="html">&lt;p&gt;A while back I posted a link to &lt;a href=&quot;http://railsonpostgresql.com/2009/08/28/sf-pug-video-postgresql-for-high-performance-rails-apps&quot;&gt;a talk by Gleb Arshinov&lt;/a&gt; that he gave at the SF PUG.  This talk was on &quot;PostgreSQL for high performance Rails apps&quot;, and was full of fine suggestions from their experiences with their Rails apps.&lt;/p&gt;

&lt;p&gt;Gleb is back again, this time on May 21 2010 at PGCon where he and Alexander Dymo talked about &lt;a href=&quot;http://fosslc.org/drupal/content/postgresql-secret-weapon-high-performance-ruby-rails-applications&quot;&gt;PostgreSQL as a secret weapon for Rails apps&lt;/a&gt;.  Some of the same ground is covered (use SQL DDL vs ActiveRecord &lt;code&gt;create_table&lt;/code&gt;, etc), but there's lots of new information too.  Here are some notes:&lt;/p&gt;

&lt;ul&gt;
&lt;br /&gt;&lt;li&gt;1:10 They're using PostgreSQL 8.4, nginx, and mongrel&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;4:00-6:00 Talks about dropping down into SQL via ActiveRecord&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;6:30 Use &lt;code&gt;include&lt;/code&gt; to eliminate N+1 queries.&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;7:30 Watch for things like &lt;code&gt;acts_as_tree&lt;/code&gt; that reintroduce lots of queries in exchange for the improvement in abstraction.&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;9:00 One query, 12 joins - complicated, but query time goes from 8 seconds to 60 ms.&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;14:00-17:00 A technique for recording SQL queries; this helps ensure you're not running unexpected queries&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;19:00 Suggests use straight SQL for DDL rather than the ActiveRecord DSL&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;20:00 Use constraints, FKs, etc to preserve data integrity - &quot;anything you don't have a constraint on will get corrupted&quot;&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;23:00 Don't use &lt;code&gt;CASCADE&lt;/code&gt; since app won't know about the deletions&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;28:00 Keep a log of times for the most frequent user requests.  Alex suggests using integration tests for this; code is at 29:10 and 29:30.&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;32:30 A technique for loading data with ActiveRecord's &lt;code&gt;select&lt;/code&gt; option with PostgreSQL arrays to save on object creation.  Questions from the audience about normalization vs efficiency.&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;38:50 Role/user/privilege checking can be slow; shows a technique for using PostgreSQL's &lt;code&gt;bool_or&lt;/code&gt; and &lt;code&gt;GROUP BY&lt;/code&gt; to get the data in one fell swoop.  Query time went from 2+ seconds to 64 ms.&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;42:00 Do analytics in the database.  Saw speed improve from 90s to 5s and saved tons of RAM.&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;44:40 Some excellent new PostgreSQL features that are either here now or are on the way (replication, windowing functions)&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;46:30 Demonstrates a problem with PostgreSQL's &lt;code&gt;LIMIT&lt;/code&gt; and &lt;code&gt;OFFSET&lt;/code&gt; when used with subselects.  Some discussion of pagination with the audience.  Here's an excellent discussion of &lt;a href=&quot;http://justinfrench.com/notebook/pagination-alternatives&quot;&gt;pagination alternatives&lt;/a&gt; written by Justin French.&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;50:30 How to force PostgreSQL to use a subselect vs a join; the example goes from 605ms to 325 ms.&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;52:20 Be careful with &lt;code&gt;generate_series&lt;/code&gt;.  Apparently these functions cannot generate hints for the planner.&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;55:30 General props to PostgreSQL community.&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;59:40 Need to test queries both in cold state and hot state; they saw 14x speed difference.&lt;/li&gt;
&lt;br /&gt;&lt;li&gt;1:01:40 Tune PostgreSQL - shared_buffers, work_mem, autovacuum, etc.  Rely on community knowledge for initial configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lots of good stuff there, enjoy!&lt;/p&gt;</content>
		<author>
			<name>Rails on PostgreSQL</name>
			<uri>http://railsonpostgresql.com/articles.rss</uri>
		</author>
		<source>
			<title type="html">Rails on PostgreSQL :</title>
			<subtitle type="html">&lt;h3&gt;If you like Ruby on Rails, you'll love Rails on PostgreSQL!&lt;/h3&gt;</subtitle>
			<link rel="self" href="http://railsonpostgresql.com/articles.rss"/>
			<id>http://railsonpostgresql.com/articles.rss</id>
			<updated>2010-08-18T17:00:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Rails 3.0: Release candidate!</title>
		<link href="http://feedproxy.google.com/~r/RidingRails/~3/QYw5KygX09A/rails-3-0-release-candidate"/>
		<id>tag:weblog.rubyonrails.org,2010-07-26:27019</id>
		<updated>2010-07-26T21:46:07+00:00</updated>
		<content type="html">&lt;p&gt;High off Baltimore Pandemic and Yellow Tops, I believe we promised a release candidate shortly after RailsConf. As things usually go in open source, we gorged ourselves on fixes and improvements instead. But all to your benefit. We’ve had &lt;a href=&quot;http://github.com/rails/rails/compare/v3.0.0.beta4...master&quot;&gt;842 commits by 125 authors&lt;/a&gt; since the release of the last beta!&lt;/p&gt;


	&lt;p&gt;Now it’s time to just say good is good enough, otherwise we could keep on with this forever. So please welcome the Rails 3 release candidate! You install, as always, with &lt;code&gt;gem install rails --pre&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;Most of the fixes have been of minor significance, but we did manage to dramatically speed up Rails 3 development and startup speed for larger applications (Basecamp went from insufferable to about 2.3 levels of enjoyment).&lt;/p&gt;


	&lt;p&gt;Speed is now pretty good across the board except for part of Arel that Active Record now depends on. We’ll be making sure we get performance of Active Record back to at least 2.3 levels before release.&lt;/p&gt;


	&lt;p&gt;A few more highlights:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Support for &lt;a href=&quot;http://github.com/brianmario/mysql2&quot;&gt;the MySQL2 gem&lt;/a&gt;, which will take care of MySQL encoding issues on Ruby 1.9.2. &lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://github.com/rails/rails/commit/6db9558416cf2133adacbe1634f28c25bfe618d6&quot;&gt;Shallow routes are back&lt;/a&gt;.&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://github.com/rails/rails/commit/1b97701e51667e6040b4c576cce9234edef1019e&quot;&gt;Fixed the autoload issues&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;Made the rails command work even when you’re in a subdirectory&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://github.com/rails/rails/commit/25215d7285db10e2c04d903f251b791342e4dd6a&quot;&gt;Dealt with a variety of web encoding issues&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Indulge yourself in the delights of all the glorious details from the &lt;a href=&quot;http://github.com/rails/rails/commits/&quot;&gt;commit logs&lt;/a&gt; or checkout the slightly less pedantic summaries in the CHANGELOGs.&lt;/p&gt;


	&lt;p&gt;This release candidate of Rails 3 also concides with the release candidate of Bundler 1.0. Huge strides were made with Bundler and it should both be much faster and have most of the edge cases sawed off.&lt;/p&gt;


	&lt;p&gt;I’ve said “we’re almost there” so many times that I’m almost exhausted. But really, guys, WE’RE &lt;span class=&quot;caps&quot;&gt;ALMOST THERE&lt;/span&gt;!!!&lt;sup&gt;1&lt;/sup&gt;&lt;/p&gt;


	&lt;p&gt;&lt;small&gt;&lt;sup&gt;1&lt;/sup&gt; Just a few weeks before final is out?&lt;/small&gt;&lt;/p&gt;</content>
		<author>
			<name>David</name>
			<uri>http://weblog.rubyonrails.org/</uri>
		</author>
		<source>
			<title type="html">Riding Rails - home</title>
			<link rel="self" href="http://feeds.feedburner.com/RidingRails"/>
			<id>tag:weblog.rubyonrails.org,2010:mephisto/</id>
			<updated>2010-09-04T23:00:01+00:00</updated>
		</source>
	</entry>

</feed>
