<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-7100397</id><updated>2010-02-16T09:02:32.948-07:00</updated><title type='text'>Mark Watson's opinions on Java, Ruby, Lisp, AI, and the Semantic Web</title><subtitle type='html'>I am a consultant living in the Mountains of Central Arizona. I am an author of 15 published books covering Artificial Intelligence (AI), Java,  C++, Lisp, Linux, and Windows.

I specialize in Java and Ruby server side development and Artificial Intelligence programming.

Other content: &lt;a href="http://twitter.com/mark_l_watson"&gt;Twitter&lt;/a&gt; &lt;a href="http://www.facebook.com/home.php#/profile.php?id=525308857&amp;amp;ref=name"&gt;Facebook&lt;/a&gt;</subtitle><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default?start-index=26&amp;max-results=25'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://markwatson.com/blog/atom.xml'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>845</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7100397.post-5305282005333432425</id><published>2010-02-15T16:25:00.003-07:00</published><updated>2010-02-15T16:45:09.452-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='semantic web'/><title type='text'>Semantic Web: an alternative for RDFa</title><content type='html'>A few years ago I thought that XHTML would eventually be widely used but when the W3C decided to standardize on HTML5 (which I love for non Semantic Web reasons), that may have been the beginning of the end for &lt;a href="http://www.w3.org/TR/xhtml-rdfa-primer/" target="new"&gt;RDFa&lt;/a&gt; because RDFa is an XML application.&lt;br /&gt;&lt;br /&gt;I believe that a better alternative in a HTML5 world is to keep RDF separate from web pages but have a clear set of rules for finding RDF data files that correspond to web pages (either static or generated). One rule might be to look for a file named &lt;strong&gt;index.rdf&lt;/strong&gt; for top level domain URLs; for example, see if http://markwatson.com/index.rdf exists for http://markwatson.com. For a URL like http://markwatson.com/hobbies look for http://markwatson.com/hobbies.rdf or http://markwatson.com/hobbies/index.rdf.&lt;br /&gt;&lt;br /&gt;Although CMS support (e.g., Drupal) for RDFa and helper libraries like the RDFa Rails plugin might make it fairly easy for some web sites to provide RDFa, I think that we need something simpler that might be adopted by more web sites.&lt;br /&gt;&lt;br /&gt;I am writing an open source tool (that will be an example program in the Semantic Web book I am writing) that will generate RDF data from web pages. I'll post a link when the code is ready.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-5305282005333432425?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/5305282005333432425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=5305282005333432425&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/5305282005333432425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/5305282005333432425'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2010/02/semantic-web-alternative-for-rdfa.html' title='Semantic Web: an alternative for RDFa'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-5017237242061809137</id><published>2010-02-12T15:56:00.003-07:00</published><updated>2010-02-12T16:09:18.974-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='web applications'/><title type='text'>Click is now a top level Apache project</title><content type='html'>Congrats to the &lt;a href="http://click.apache.org/" target="new"&gt;Click&lt;/a&gt; team. My interest in doing Java web apps is low since I have mostly been using Rails for the last three years.&lt;br /&gt;&lt;br /&gt;That said, Click hits a sweet spot with a good templating system and model super classes for pages, forms, tables, etc. Because I might be using Google AppEngine for more projects, I may need to use Java so I have just read through the documentation and code samples for the latest version that is compatible with AppEngine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-5017237242061809137?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/5017237242061809137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=5017237242061809137&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/5017237242061809137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/5017237242061809137'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2010/02/click-is-now-top-level-apache-project.html' title='Click is now a top level Apache project'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-9007654444571096834</id><published>2010-02-12T15:14:00.003-07:00</published><updated>2010-02-12T15:21:43.626-07:00</updated><title type='text'>Saving money: using a 64bit Ubuntu VPS instead of a 64bit Large EC2 instance</title><content type='html'>I need to frequently run a 64bit Linux web service (commercial app, not available as a 32bit app). Unfortunately, small EC2 instances are only available as 32bit. I ended up using a 64bit VPS instance (I use RimuHosting, but I think Slicehost also has low cost 64bit VPSs). Saving a lot of money over the long term :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-9007654444571096834?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/9007654444571096834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=9007654444571096834&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/9007654444571096834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/9007654444571096834'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2010/02/saving-money-using-64bit-ubuntu-vps.html' title='Saving money: using a 64bit Ubuntu VPS instead of a 64bit Large EC2 instance'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-8477002107957320577</id><published>2010-01-24T12:00:00.004-07:00</published><updated>2010-01-26T09:37:55.343-07:00</updated><title type='text'>A followup on  using Windows 7 for Ruby and Java development</title><content type='html'>I wrote 2 weeks ago about adapting to using my new Windows 7 laptop (inexpensive, well constructed, and 4 cores). This is a followup with some miscellaneous advice.&lt;br /&gt;&lt;br /&gt;I was having some problems writing with Latex so I re-installed MikTex doing a &lt;u&gt;complete&lt;/u&gt; installation (well over 1 gig). My Latex problems are solved with some brute force. Still, when I know that I will be mostly writing, I still boot my MacBook to use TexShop, etc.&lt;br /&gt;&lt;br /&gt;With a much faster laptop (4 cores!), I am very much enjoying using the new IntelliJ 9 for Java, Scala, and Clojure development. I am currently writing code that wraps the Sesame RDF data store, my own geolocation code, and Lucene. (I am writing a book on the AllegroGraph product and I want all of the examples to also run using my wrapper for Sesame, my geolocation stuff, and Lucene.) I am also writing idiomatic wrappers (to my wrapper) in Clojure and Scala and it is great to have everything in one large IntelliJ project.&lt;br /&gt;&lt;br /&gt;I continue to rely on E TextEditor (a Windows TextMate clone) for most Ruby development and miscellaneous text editing - highly recommended.&lt;br /&gt;&lt;br /&gt;I find that once I get things set up on my Windows 7 laptop, then I have an enjoyable developers experience. However, setting it up has been a terrific pain in some cases, for example: installing PostgreSQL and PostGIS was a real nuisance.&lt;br /&gt;&lt;br /&gt;I found the text in the Command Prompt windows where I run bash shells to be a little difficult to read so I increased the default window size, switched to a larger font size, switched the default font to Lucinda Console, and reduced the contrast by making the background a very light blue (almost white) and the text a medium blue.&lt;br /&gt;&lt;br /&gt;I also find it useful to remap the CAPS LOC key to act as a third control key - this reduces strain on my left hand when hitting control characters on the left side of the keyboard while using Emacs and other software that makes good use of the control key. This saves wear and tear on the tendons because I don't have to twist my left hand or to use the control key on the right side of the keyboard.&lt;br /&gt;&lt;br /&gt;On dual booting Ubuntu: as I mentioned a few weeks ago, I have both a bootable Ubuntu installation and a separate one that runs inside of Windows using VirtuaBox. I am just about ready to figure out how to remove grub and reclaim the separate partition. It is very convenient using VirtualBox so I think I am going to just use it when Linux is best for a work task.&lt;br /&gt;&lt;br /&gt;One big advantage of using Windows is the utilities TortoiseSvn and TortoiseGit. Highly recommended to integrate svn and git support into the file explorer.&lt;br /&gt;&lt;br /&gt;One huge disadvantage of Windows is that most new computers do not come with Windows install disks. This is awful - shameful behavior, really, on both Microsoft's and computer manufacturers' parts. This is simply lack of trust in their customers. I have burned a few "bootable repair/recover" disks and I am using the built in system backup software (backs up to an external disk), but I won't know if this works until I need it.&lt;br /&gt;&lt;br /&gt;The bottom line is: when I am working in a bash shell, SSH'ing to remote servers, or using a heavy weight IDE like IntelliJ then I find Windows 7 to be equally pleasurable for development use as OS X or Linux. For some things, I still like my MacBook. I paid $800 for my new Toshiba laptop and a comparable MacBook Pro for my work flow would have been about $2000. I am not yet sure if the price savings has been worth it because of the time required to set up my new laptop. One advantage though is the flexibility of also having a Windows &lt;i&gt;box&lt;/i&gt; handy for testing, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-8477002107957320577?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/8477002107957320577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=8477002107957320577&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/8477002107957320577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/8477002107957320577'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2010/01/followup-on-using-windows-7-for-ruby.html' title='A followup on  using Windows 7 for Ruby and Java development'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-8659843705415257926</id><published>2010-01-22T10:15:00.008-07:00</published><updated>2010-01-22T21:51:36.394-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><category scheme='http://www.blogger.com/atom/ns#' term='economy'/><title type='text'>Very bad decision by conservatives on the supreme court</title><content type='html'>Horrible supreme court decision! A great deal for international corporations to get to powerfully affect our internal elections in the USA. I don't want to overstate my opinion, but I think that this is the beginning of the end for fair representative democracy in our country. I hate to say it, but I am so fed up with the greed and avarice of the "elites" that I find myself not caring much about politics anymore. It would be a good first step for all members of the supreme court to publicly state any family members' business affiliations that might affect their rulings on cases. The justices have a long road to regain our trust.&lt;br /&gt;&lt;br /&gt;On a more positive note, I do feel more like a 'citizen of the world' and I believe that stronger business and personal relationships with people around the world help offset the terribly high level of corruption in the USA and other countries that don't give good service to tax payers.&lt;br /&gt;&lt;br /&gt;This is a simple prediction to make: corrupt governments will over time become less competitive for promoting and encouraging productive business activities in their tax jurisdictions. I am all for strong corporations and strong businesses both large and small. What I am against is what I consider to be illegal activities (or activities that should be illegal). We need a small government that enforces a small number of fair laws and then stays out of the way of doing business. Sadly, that is far from what we have now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-8659843705415257926?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/8659843705415257926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=8659843705415257926&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/8659843705415257926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/8659843705415257926'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2010/01/i-think-that-small-costs-of-cushy-jobs.html' title='Very bad decision by conservatives on the supreme court'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-6393890205708333223</id><published>2010-01-21T10:49:00.009-07:00</published><updated>2010-01-21T12:52:56.576-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='JRuby'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='semantic web'/><category scheme='http://www.blogger.com/atom/ns#' term='Latex'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='RDF'/><category scheme='http://www.blogger.com/atom/ns#' term='Clojure'/><title type='text'>The beauty of Latex: my AllegroGraph book becomes two books, one for JVM languages and one for Lisp</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://markwatson.com/blog/uploaded_images/BookSoftwareRoadmap-782676.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 241px;" src="http://markwatson.com/blog/uploaded_images/BookSoftwareRoadmap-782673.png" border="0" alt="" /&gt;&lt;/a&gt;I have been working on and off for 16 months on a book about Semantic Web (or Linked Data) application programming using the &lt;a href="http://www.franz.com/agraph/allegrograph/" target="new"&gt;&lt;b&gt;AllegroGraph&lt;/b&gt;&lt;/a&gt; product. I have decided to substantially increase the scope of this applications/tutorial style book to also include support for &lt;a href="http://www.openrdf.org/" target="new"&gt;&lt;b&gt;Sesame&lt;/b&gt;&lt;/a&gt;. The figure on the left shows the software architecture road map for the book using JVM languages.&lt;br /&gt;&lt;br /&gt;I am splitting the book into two volumes, and using Latex makes this really easy to share small amounts of common material so both books stand on their own. Latex also makes it easy to combine both books into one all-inclusive book, eliminating the duplicated parts. The two volumes are:&lt;ul&gt;&lt;li&gt;Volume I: will cover the use of both AllegroGraph and Sesame using JVM languages: Java, Scala, JRuby, and Clojure. I am working on a common wrapper written in Java that supplies my own (rather simple) API to both AllegroGraph and Sesame. My wrapper implements Sesame support for geolocation and free text indexing and search so the wrapper is adequate to run all of the book examples using either AllegroGraph or Sesame "back ends."&lt;/li&gt;&lt;li&gt;Volume II: will cover only AllegroGraph using both the embedded and client Lisp APIs.&lt;/li&gt;&lt;/ul&gt;Both AllegroGraph and Sesame are great development tools, but fill different needs. On projects that can support a several thousand dollar a year per server license fee, I would choose Common Lisp + AllegroGraph for development. AllegroGraph is very scalable and the Lisp APIs are really nice to work with. For Java (or other JVM languages) applications, I would still choose AllegroGraph for the scalability and support if a project can support the license costs. The good thing is that for most small to medium size projects, the free version of AllegroGraph or the open source Sesame project both are good choices, so as a developer you have some real flexibility. There are also other good RDF data store platforms like Jena, Joseki, Kowari, Redland, 4store, Swi-Prolog Semantic Web library, Talis, Virtuoso, etc. but I have relatively little (or in some cases no) experience with these. I use AllegroGraph and Sesame so that is what I write about.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-6393890205708333223?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/6393890205708333223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=6393890205708333223&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/6393890205708333223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/6393890205708333223'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2010/01/beauty-of-latex-my-allegrograph-book.html' title='The beauty of Latex: my AllegroGraph book becomes two books, one for JVM languages and one for Lisp'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-5557350960548605780</id><published>2010-01-13T08:42:00.004-07:00</published><updated>2010-01-13T09:22:27.054-07:00</updated><title type='text'>Looking towards a universal wrapper/proxy for knowlege and data stores</title><content type='html'>I often start out by writing code specific for a single project and then refactor it to make working code more generally useful. I am working on an applications book for the AllegroGraph RDF data store services. Since most people (probably) use Java clients with AllegroGraph, the first step is to wrap Franz's APIs with my own interfaces so for my own work (that is, beyond the scope of writing this book), I can write implementations for other back end RDF data stores as I need them.&lt;br /&gt;&lt;br /&gt;I also plan on writing "thin" Scala, JRuby, and Clojure friendly interfaces to my Java library. For the purposes of the book, I'll use this library to support example client applications written in Java, JRuby, Scala, and Clojure. I have a lot of material already written with Lisp examples but I think that I am going to set that all aside for a future writing project (that I may, quite honestly, never get back to). I also decided to not support Python in my book: Franz has a good Python interface library and examples and in any case, I am not a Python developer.&lt;br /&gt;&lt;br /&gt;So far, I have a fairly clear road map of what I need for this specific book  project. Long term, after this book is done, I am aiming to also wrap other knowledge sources like OpenCyc, Freebase, etc. While it is tempting to view most knowledge sources as graph data (RDF), it seems like a poor idea to give up the inferencing available in OpenCyc, all the features of the Freebase MQL query language, etc.&lt;br /&gt;&lt;br /&gt;Since I often find myself reusing my own small code examples to access multiple knowledge sources, it may be time soon to step back and decide what can be placed behind common interfaces.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-5557350960548605780?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/5557350960548605780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=5557350960548605780&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/5557350960548605780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/5557350960548605780'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2010/01/looking-towards-universal-wrapperproxy.html' title='Looking towards a universal wrapper/proxy for knowlege and data stores'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-5111890899134795664</id><published>2010-01-10T13:53:00.004-07:00</published><updated>2010-01-13T09:16:40.645-07:00</updated><title type='text'>Using Windows 7 for Ruby and Java development</title><content type='html'>As I mentioned in my last blog, I surprised my friends and family by buying a Windows 7 laptop. The combination of Windows 7 and Ubuntu is not quite as good as OS X and Ubuntu dual boot, but try buying a Mac laptop with 4 CPU cores.&lt;br /&gt;&lt;br /&gt;Of course, the first thing to do to a Windows 7 system is to install cygwin. I installed just about everything available. To avoid confusion, I always run bash in command windows and I set up my .bashrc file for cygwin to mimic my .profile file for OS X and my .bashrc file for Ubuntu. With cygwin installed, life is good.&lt;br /&gt;&lt;br /&gt;For basic Ruby and Java development, Rubymine and IntelliJ work identically under OS X, Windows 7, and Ubuntu Linux. I needed a plain text editor: I use TextMate on OS X and GEdit on Ubuntu. I tried, then bought a copy of &lt;a href="http://e-texteditor.com/index.html" target="new"&gt;E TextEditor&lt;/a&gt; that works with TextMate plugins. Recommended! I also installed XEmacs.&lt;br /&gt;&lt;br /&gt;For writing I installed OpenOffice.org and Latex (I used the MikTex distribution). Both E TextEditor and XEmacs are fine for editing Latex "source code."&lt;br /&gt;&lt;br /&gt;This was some trouble to set up, but my Toshiba laptop is very well constructed, has 4 CPU cores, 4GB of memory, and 500GB of disk. And, it was very inexpensive.&lt;br /&gt;&lt;br /&gt;I have not totally made up my mind how I will use Ubuntu on my new laptop. Windows 7 has a nice utility to split the c: disk partition so I did this when I first started the laptop. I have Ubuntu installed twice: on a new partition and also on the Windows 7 file system using Sun's very good VirtualBox. Ubuntu is a little more responsive when I use grub to boot it directly, but it is very convenient running it under VirtualBox because of file system sharing, not having to install everything - just what Linux is best for. Since I use a remote git repository for virtually &lt;b&gt;everything&lt;/b&gt; that I work on, it is easy dealing with two Ubuntu installations - I think that I will continue to use both for a few months, then decide which to keep and which to delete. Also: VirtualBox supports all 4 cores with 64 bit Ubuntu running as a guest operating system so the performance hit for using VirtualBox is small.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-5111890899134795664?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/5111890899134795664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=5111890899134795664&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/5111890899134795664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/5111890899134795664'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2010/01/using-wndows-7-for-ruby-and-java.html' title='Using Windows 7 for Ruby and Java development'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-6020534356530785645</id><published>2010-01-05T11:07:00.002-07:00</published><updated>2010-01-05T11:51:00.239-07:00</updated><title type='text'>New laptop: Toshiba Satellite U505</title><content type='html'>I very much like the MacBook that I bought almost three years ago, but it has it limitations (mainly not enough disk space).&lt;br /&gt;&lt;br /&gt;I decided to buy a "Windows" laptop because for $800 I could get a laptop with 4 CPU cores (Intel CORE i3), 1/2 terabyte disk, and 4 gigs RAM. Ubuntu Linux uses all the cores :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-6020534356530785645?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/6020534356530785645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=6020534356530785645&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/6020534356530785645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/6020534356530785645'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2010/01/new-laptop-toshiba-satellite-u505.html' title='New laptop: Toshiba Satellite U505'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-4923767109890608217</id><published>2010-01-02T10:43:00.004-07:00</published><updated>2010-01-02T11:39:41.291-07:00</updated><title type='text'>Running OpenCyc 2.0 on OS X</title><content type='html'>The latest release of &lt;a href="http://opencyc.org/" target="new"&gt;OpenCyc&lt;/a&gt; uses a Java runtime so it is portable. I often keep OpenCyc running on one of my servers, but for convenience I also wanted to be able to run it on my MacBook. My MacBook only has 2GB of RAM but this seems to be adequate, especially because I don't run the JVM in server mode on my laptop. Start by downloading the Linux OpenCyc 2.0 distribution.&lt;br /&gt;&lt;br /&gt;Make a copy of the file &lt;strong&gt;opencyc-2.0/server/cyc/run/bin/run-cyc.sh&lt;/strong&gt; and replace the original file contents with:&lt;pre&gt;#!/bin/bash                                                                                         &lt;br /&gt;&lt;br /&gt;MIN_HEAP=1300m&lt;br /&gt;MAX_HEAP=1300m&lt;br /&gt;PERM_SIZE=98m&lt;br /&gt;&lt;br /&gt;java  -Xms$MIN_HEAP -Xmx$MAX_HEAP -XX:MaxPermSize=$PERM_SIZE  -cp lib/cyc.jar:lib/subl.jar:lib/juni\&lt;br /&gt;t.jar:resource:lib/ext:plugins com.cyc.tool.subl.jrtl.nativeCode.subLisp.SubLMain  -f "(progn (load\&lt;br /&gt; \"init/jrtl-release-init.lisp\")))" "$@"&lt;/pre&gt;With these settings, OpenCyc 2.0 starts up quickly and has fairly good runtime performance on my MacBook: fine for experimenting with OpenCyc. Run the system using the top level run script (which you do not need to modify):&lt;pre&gt;cd opencyc-2.0&lt;br /&gt;scripts/run-cyc.sh&lt;/pre&gt;OpenCyc 2.0 consists of a AI reasoning runtime, a "real world" ontology, hundreds of thousands of terms and millions of relationships.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-4923767109890608217?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/4923767109890608217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=4923767109890608217&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/4923767109890608217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/4923767109890608217'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2010/01/running-opencyc-20-on-os-x.html' title='Running OpenCyc 2.0 on OS X'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-5503807383128885329</id><published>2009-12-31T11:50:00.008-07:00</published><updated>2009-12-31T13:18:23.558-07:00</updated><title type='text'>My tech industry predictions for 2010</title><content type='html'>As both an author and as a technical consultant, I am fairly opinionated in terms of what I expect for next year (tomorrow!). Here are my predictions:&lt;ul&gt;&lt;li&gt;There will be pressure to reduce IT expenditures. Increasing trend to favor outsourcing deployment platform (e.g., Google AppEngine and Heroku), infrastructure (e.g., Amazon AWS, RackSpace, both relational and NoSLQ data stores), and software as a service (e.g., CRM, etc.). Cloud computing gets more real.&lt;/li&gt;&lt;li&gt;Research will be concentrated on shorter term profits rather than long strategy. China might be an exception to this: a friend reports that he has seen willingness in China to fund very long term Artificial Intelligence research.&lt;/li&gt;&lt;li&gt;More people will spend more time using web based information and recreational resources using portable devices. There will be a shortage of wireless bandwidth in some areas.&lt;/li&gt;&lt;li&gt;Use of the Java platform will stay strong, but with more emphasis on alternative languages like JRuby, Scala, and Clojure.&lt;/li&gt;&lt;li&gt;Skills and education in data analysis, all types of modeling, text mining, and analytics will continue to be in increasing demand.&lt;/li&gt;&lt;li&gt;There will be well publicized sporadic failures by cloud service providers but customers will be tolerant because of cost savings.&lt;/li&gt;&lt;li&gt;The importance of the hugely increasing availability of all types of data will encourage development of new business areas like knowledge processing as a service.&lt;/li&gt;&lt;li&gt;Although the Semantic Web has seen slow adoption in the last decade, Linked Data, a new and more popular subset of the Semantic Web, will see wide adoption in the next few years.&lt;/li&gt;&lt;li&gt;The wide support for Linked Data will help make computer to computer interactions easier and more profitable.&lt;/li&gt;&lt;li&gt;Geo location will become increasing important. We are likely to see many interesting smaller scale systems using technology like PostGIS and Spatial Lucene that will be able to compete in local markets with Google, Microsoft, and Yahoo.&lt;/li&gt;&lt;li&gt;I think that the next decade will be a time of micro web businesses: a huge number of small scale web portals that offer very specific services to a relatively small number of customers who are willing to pay a use fee. Most of these will be deployed on very low cost cloud hosting. Many of these will be tightly integrated with the Facebook platform, the Wave platform, etc.&lt;/li&gt;&lt;li&gt;In the next 10 years: the USA and Europe will become much less important in technical inovation because their large debt liabilities will create business and research unfriendly environments.&lt;/li&gt;&lt;li&gt;In the next 20 years: educated, creative, and/or generally productive people will identify more with similar people around the world than with people in their own countries who may get bogged down in what looks to be a crushing world wide economic collapse (but not quite as bad in developing countries). There will be more of a feeling of world wide citizenship, the world will evolve first into a safer place (a trend over the the last 20 years has seen more safety, less civilian deaths - something that most people don't realize) and then eventually into greater prosperity.&lt;/li&gt;&lt;/ul&gt;Next year looks like an exciting time in our industry!&lt;br /&gt;&lt;br /&gt;Best Wishes for a Happy New Year&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-5503807383128885329?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/5503807383128885329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=5503807383128885329&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/5503807383128885329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/5503807383128885329'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2009/12/my-tech-industry-predictions-for-2010.html' title='My tech industry predictions for 2010'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-5241968960614728954</id><published>2009-12-24T12:25:00.004-07:00</published><updated>2009-12-24T14:03:40.068-07:00</updated><title type='text'>$1.5 trillion a year for "defense" spending, little money left for local governments; living locally; Happy Holidays</title><content type='html'>If you factor in the cost of the debt to pay for our military spending then I think that a reasonable estimate of our yearly defense spending is about $1.5 trillion.&lt;br /&gt;&lt;br /&gt;The amount we spend on defense swamps other US government spending, including social programs. This is just my opinion, but I believe that we could keep our country relatively safe (compared to other countries) and spend far less money. The problem is basically banana republic style corruption: too much money is made by special interests for there to be any meaningful reform of military spending. The same comment is also true of other corporate interests like Wall Street, industrialized food production, pharmaceutical companies, insurance, etc. This is all enabled by total corporate control of the news media and shameful corruption in the lobbying industry and our federal government.&lt;br /&gt;&lt;br /&gt;Fortunately, for most of us, life is still very good despite corruption of the world's "elite." Again, this is just my personal opinion: it is best to act in ways that help yourself, your family, and local community. Avoid doing business with large banks, preferring credit unions. Prefer buying food from local producers. Form or join local organizations for food distribution, computer clubs (promote open source solutions to help people use old PCs), and help with local school fund raising activities. Prefer to buy goods that are manufactured as close to where you live as possible.&lt;br /&gt;&lt;br /&gt;Joy in life comes from our family and social interactions and in acting in service to others. A materialistic lifestyle is something that you have been conditioned to accept by lifetime exposure to media - try to resist the temptation to acquire material goods that you really don't need.&lt;br /&gt;&lt;br /&gt;And, most of all:&lt;br /&gt;&lt;br /&gt;Have a Merry Christmas and a Happy Hanukkah!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-5241968960614728954?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/5241968960614728954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=5241968960614728954&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/5241968960614728954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/5241968960614728954'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2009/12/15-trillion-year-for-defense-spending.html' title='$1.5 trillion a year for &quot;defense&quot; spending, little money left for local governments; living locally; Happy Holidays'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-3402252425501824408</id><published>2009-12-18T09:05:00.004-07:00</published><updated>2009-12-18T09:22:51.310-07:00</updated><title type='text'>Building the EtherPad system and perusing the source code</title><content type='html'>The EtherPad collaboration-enabled online system is now &lt;a href="http://code.google.com/p/etherpad/" target="new"&gt;open source&lt;/a&gt;. Cool. Google bought the company, the developers are joining the Wave team, and their product is now released under the Apache 2 license.&lt;br /&gt;&lt;br /&gt;Be sure to follow the instructions (failing to set the environment variable for the path to a MySQL client JAR file produces a strange "cp -f" error that has hung up a few people trying to build the system, as reported on Hacker News). It only took about 15 minutes to download the source and build the system - simple enough.&lt;br /&gt;&lt;br /&gt;After running the system and trying it, I used IntelliJ 9 to set up a project (choose project from existing source, main directory etherpad/trunk) and I am spending some time perusing the Scala and JavaScript code. Really nice looking code base, and reading through the Scala code will be an education. My JavaScript skills are a little weak, but I might still take a careful look at the JavaScript code to understand how they used Comet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-3402252425501824408?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/3402252425501824408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=3402252425501824408&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/3402252425501824408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/3402252425501824408'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2009/12/building-etherpad-system-and-perusing.html' title='Building the EtherPad system and perusing the source code'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-1355239404352124079</id><published>2009-12-14T17:08:00.005-07:00</published><updated>2009-12-14T17:35:43.901-07:00</updated><title type='text'>Amazon Elastic Load Balancing (ELB) is pretty cool</title><content type='html'>Using this service costs $0.025/hour so it may make sense to just run HAProxy yourself on a EC2 instance, but then you have to worry about fault tolerance/recovery if that instance fails. The ELB cost is small in comparison to running a cluster of EC2 instances and "outsourcing" as much of your system as possible to AWS (e.b., SimpleDB, Elastic Load Balancing, Relational Database Server, EBS, etc.) can certainly reduce both the complexity of your application architecture and also your implementation costs.&lt;br /&gt;&lt;br /&gt;Here are my notes for a simple ELB setup for an AMI that contains a Rails web application:&lt;pre&gt;export EC2_PRIVATE_KEY=pk-....pem  # different on your system&lt;br /&gt;export EC2_CERT=/Users/markw/.ec2/cert-...pem  # different on your system&lt;br /&gt;&lt;br /&gt;ec2run -k gsg-keypair  ami-e767ds71&lt;br /&gt;ec2run -k gsg-keypair  ami-e767ds71&lt;br /&gt;&lt;br /&gt;Note: specifying "gsg-keypair" matches later doing ssh -i ~/.ssh/id_rsa-gsg-keypair ...&lt;br /&gt;&lt;br /&gt;elb-create-lb  MarkTest123 --headers --listener "lb-port=80,instance-port=4242,protocol=HTTP" --availability-zones us-east-1b&lt;br /&gt;&lt;br /&gt;elb-configure-healthcheck  MarkTest123 --headers --target "HTTP:4242/ping" --interval 30 --timeout 3 --unhealthy-threshold 2 --healthy-threshold 2&lt;br /&gt;&lt;br /&gt;elb-register-instances-with-lb  MarkTest123  --headers --instances i-X,i-Y&lt;br /&gt;&lt;br /&gt;* substitute real EC2 IDs for i-X and i-Y, and this works great!&lt;br /&gt;&lt;br /&gt;ssh -i ~/.ssh/id_rsa-gsg-keypair ubuntu@ec2-63-212-55-241.compute-1.amazonaws.com&lt;br /&gt;create a file public/ping    - put a line of text in it&lt;br /&gt;start Rails on port 4242&lt;br /&gt;&lt;br /&gt;* note: repeat for other EC2 instance. In production, obviously you would want to start your Rails apps using /etc/init.d/...&lt;br /&gt;&lt;br /&gt;Then, hitting this URL works: http://marktest123-1645979628.us-east-1.elb.amazonaws.com&lt;br /&gt;&lt;br /&gt;Teardown:&lt;br /&gt;&lt;br /&gt;elb-delete-lb MarkTest123&lt;br /&gt;and delete EC2 instances&lt;/pre&gt;It took me a little while to get ELB working, so I hope that my notes save you some time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-1355239404352124079?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/1355239404352124079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=1355239404352124079&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/1355239404352124079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/1355239404352124079'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2009/12/amazon-elastic-load-balancing-elb-is.html' title='Amazon Elastic Load Balancing (ELB) is pretty cool'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-2994908756086823919</id><published>2009-12-14T10:03:00.006-07:00</published><updated>2009-12-14T11:16:48.030-07:00</updated><title type='text'>The cost of commoditization of computing: infrastructure and software</title><content type='html'>Discipline, a new view of system architecture, and rigorous automation procedures are required to take advantage of Amazon EC2, Google AppEngine, and other infrastructure as a service providers. Last week a customer commented on the rapid pace of Amazon's innovation. Yesterday they announced a &lt;a href="http://aws.typepad.com/aws/2009/12/ec2-spot-instances-and-now-how-much-would-you-pay.html" target="new"&gt;new way to generate revenue from unused server instances&lt;/a&gt; by letting users bid on a spot market for unused EC2 instances.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Discipline&lt;/b&gt; When you own your own server farm, even if it is just a few back room servers, you can spread out applications over your servers in a haphazard way and usually get away with some sloppiness in your process architecture. When you are dealing with someone else's infrastructure a more disciplined approach is just about mandatory.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;New view of system architecture&lt;/b&gt; Both Google and Amazon have published papers on dealing with very large scale geographically disperse systems comprised of many components, some of which are guaranteed to fail. These companies have also shared how for some applications they trade off immediate data consistency (between distributed data writers and readers) for scalability.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Rigorous automation procedures&lt;/b&gt; Large distributed fault tolerant systems involve two types of software development: core application development and writing automation code to manage managing servers (starting/stopping, DNS management) and partitioning an application over available servers.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Software&lt;/b&gt; The open source and free software movements have hugely contributed to the commoditization of computing. Even not counting operating system and networking infrastructure, almost all of the code in the systems that we create is written by other people and it is usually open source software. I would argue that in addition to classical skills like algorithms and raw coding skill, a modern developer must be well versed in available frameworks and libraries, their strengths and weaknesses, and knowledge of modifying and using them.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Commoditization comes with cost&lt;/b&gt; This is something that I am in the process of learning about. For most of my career I have had either dedicated hardware for development and deployment (starting in the 1980s, developing world wide distributed systems, I had expensive dedicated servers), or in the last 10 years, my "world" consisted of spending a lot of effort building systems on top of open source frameworks (J2EE, Rails, etc.) and deploying to a leased server, or a VPS for projects with few users. In this old scenario, deployment and admin would be a very small part of the effort of creating a new system. Now, designing, implementing, and deploying to Amazon AWS, Google AppEngine, etc. has changed that because of the effort it takes to properly "live" in a commodity computing world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-2994908756086823919?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/2994908756086823919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=2994908756086823919&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/2994908756086823919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/2994908756086823919'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2009/12/commoditization-of-computing.html' title='The cost of commoditization of computing: infrastructure and software'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-9194743381314622416</id><published>2009-12-13T11:48:00.009-07:00</published><updated>2009-12-13T14:11:21.885-07:00</updated><title type='text'>IntelliJ version 9.0</title><content type='html'>This week JetBrains gave me an upgrade license for version 9 of IntelliJ. I don't do too much Java development anymore - mostly maintenance on some of my old projects and new AppEngine and Google Wave development.&lt;br /&gt;&lt;br /&gt;Overall, version 9 is a nice upgrade: nicer source code repository integration, built in task management, the IDE seems faster, etc.&lt;br /&gt;&lt;br /&gt;I use the JetBrains RubyMine product almost every day. Long term, my use of IntelliJ 9 will depend on how good the AppEngine support is. As a test, I generated a new AppEngine project, added some home page material, edited the appengine-web.xml file to specify a registered app name, set the version, then deployed to Google's servers with no problems. I did have a problem importing an AppEngine project from Eclipse but eventally realized that I needed to go to Module Settings -&gt; Artifacts, and drag "Available elements" from the right window pane to the &amp;lt;output root&amp;gt; tree display in the left pane.&lt;br /&gt;&lt;br /&gt;I tried writing a simple GWT 2.0 (new version) web app. When I created a new project, no template GWT client and server code was generated - a small disappointment. I deleted that project and used a command line tool to generate a project:&lt;pre&gt;/Users/markw/Documents/WORK/gwt-2.0.0/webAppCreator -out mytest com.mytest&lt;/pre&gt;I then created a new IntelliJ project "from existing source", and had no problems using the generated template project, running the local development server, and using the web app in Firefox (after installing the GWT FireFox plugin).&lt;br /&gt;&lt;br /&gt;I am really busy with client work right now but I hope to get some time next year to do an AppEngine based project of my own, and I am almost sure that I will use IntelliJ 9 for that because general Java development is a bit better, I think, than using Eclipse, and it looks like the AppEngine support is OK.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-9194743381314622416?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/9194743381314622416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=9194743381314622416&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/9194743381314622416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/9194743381314622416'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2009/12/intellij-version-90.html' title='IntelliJ version 9.0'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-8716605437729519081</id><published>2009-12-07T13:13:00.003-07:00</published><updated>2009-12-07T13:22:51.084-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Balkanisation of Ruby?</title><content type='html'>When I first started using Ruby, Matz's C-Ruby was mostly the only game in town.&lt;br /&gt;&lt;br /&gt;I am also an enthusiastic user Ruby 1.9.x, JRuby, and MacRuby. Seeing the &lt;a href="http://ruby-std.netlab.jp/" target="new"&gt;Ruby spec&lt;/a&gt; being developed in Japan under government funding, and that it is for Ruby 1.8.7, I get a feeling of déjà vu as a long time Lisp user.&lt;br /&gt;&lt;br /&gt;The balkanisation of Lisp has been more than a small nuisance for me in the last 25 years. I would prefer that all Ruby implementations eventually implement a common specification, but I would rather it be for something that looks like 1.9.x.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-8716605437729519081?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/8716605437729519081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=8716605437729519081&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/8716605437729519081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/8716605437729519081'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2009/12/balkanisation-of-ruby.html' title='Balkanisation of Ruby?'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-7788229153318011486</id><published>2009-12-06T18:24:00.002-07:00</published><updated>2009-12-06T18:37:29.153-07:00</updated><title type='text'>Privacy and Security in the Internet Age</title><content type='html'>Just some advice that I give friends and family:&lt;ul&gt;&lt;li&gt;Delete all cookies in your browser every week - it is easy enough to sign in again to web sites that require authentication. People who do not delete their cookies never see what sites are tracking them. It is easiest to do a 'delete all cookies' operation and not to try to save the 5 or 10 cookies out of thousands that are stored in your local browser data.&lt;/li&gt;&lt;li&gt;Keep a text file with all passwords in encrypted form - and, do not use the same password for different purposes.&lt;/li&gt;&lt;li&gt;Every time you use your super market's discount card (or possibly pay with a credit card), your purchases are permanently associated with you - do you care? maybe or maybe not.&lt;/li&gt;&lt;/ul&gt;I do use a lot of web services that track what I do (GMail, for example) but I make the decision to give up privacy vs. benefits on a service by service basis.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-7788229153318011486?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/7788229153318011486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=7788229153318011486&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/7788229153318011486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/7788229153318011486'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2009/12/privacy-and-security-in-internet-age.html' title='Privacy and Security in the Internet Age'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-7626155064610228347</id><published>2009-12-06T16:27:00.004-07:00</published><updated>2009-12-06T16:37:50.653-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby Rails'/><title type='text'>Coolness! good instructions for trying Rails 3.0pre</title><content type='html'>This is worth sharing: &lt;a href="http://oscardelben.com/articles/2009/12/06/how-to-test-rails-3.html" target="new"&gt;easy to follow instructions for installing Rails 3.0pre&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Thanks to Oscar Del Ben!&lt;br /&gt;&lt;br /&gt;Yesterday I spent 90 minutes trying a fresh install of Ruby 1.9.1 and Rails 3.0pre with no luck, so thanks to Oscar for his writeup.  BTW, I Used Ruby 1.8.7 when following Oscar's directions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-7626155064610228347?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/7626155064610228347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=7626155064610228347&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/7626155064610228347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/7626155064610228347'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2009/12/coolness-good-instructions-for-trying.html' title='Coolness! good instructions for trying Rails 3.0pre'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-4646585864646617719</id><published>2009-12-03T11:32:00.004-07:00</published><updated>2009-12-04T08:10:02.528-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='EC2'/><title type='text'>New Amazon Web Services feature: boot from EBS</title><content type='html'>Awesome - in the past I have had to write my own code/scripts to manage attaching and EBS file volume to a new EC2 instance. &lt;a href="http://aws.typepad.com/aws/2009/12/new-amazon-ec2-feature-boot-from-elastic-block-store.html" target="new"&gt;This new feature&lt;/a&gt; will make it a lot easier to manage your own EC2 based services. If you would prefer a PDF with the complete documentation, then &lt;a href="http://ec2-downloads.s3.amazonaws.com/BootFromEBSGSGGuide.pdf" target="new"&gt;use this link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This new feature will make using EC2 even easier for some applications - a welcome change.&lt;br /&gt;&lt;br /&gt;That said, I have my own scheme for automatically mounting EBS volumes, assigning ElasticIP addresses, etc. and for some deployments I will continue to use temporary boot volumes and pull AMIs from S3.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-4646585864646617719?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/4646585864646617719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=4646585864646617719&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/4646585864646617719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/4646585864646617719'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2009/12/new-amazon-web-services-feature-boot.html' title='New Amazon Web Services feature: boot from EBS'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-1031598238865267968</id><published>2009-11-25T07:57:00.002-07:00</published><updated>2009-11-25T08:02:55.399-07:00</updated><title type='text'>Playing with Chrome OS</title><content type='html'>I have to say that even in its alpha (or beta?) version, Chrome OS looks good. I like the home "apps page" and except for not having an application that is a terminal emulator, it is fairly complete: my calendar, google docs, etc., are all available, and web browsing is fast.&lt;br /&gt;&lt;br /&gt;Again, given a good terminal program for use cases where I need to quickly SSH to a server, I can see a light weight and low power netbook nicely augmenting my laptop + external monitor setup.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-1031598238865267968?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/1031598238865267968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=1031598238865267968&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/1031598238865267968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/1031598238865267968'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2009/11/playing-with-chrome-os.html' title='Playing with Chrome OS'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-1666583045850535540</id><published>2009-11-19T11:37:00.003-07:00</published><updated>2009-11-19T11:46:21.620-07:00</updated><title type='text'>I am watching the live Chrome OS Webcast</title><content type='html'>For end users, Chrome OS is a great idea - I would argue that most of my friends and relatives would be better off not running Windows, OS X, or (full) Linux.&lt;br /&gt;&lt;br /&gt;What about software developers: still useful, but not a replacement for a laptop. In a pinch, assuming a terminal window to run remote bash shells, Emacs, etc., I could still get work done while travelling. Still, for me, a MacBook with Ubuntu and OS X with RubyMine, IntelliJ, Eclipse, OmniGraffle, etc. is just about perfect for my workflow.&lt;br /&gt;&lt;br /&gt;That said, I will buy a Chrome OS netbook when they are available.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-1666583045850535540?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/1666583045850535540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=1666583045850535540&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/1666583045850535540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/1666583045850535540'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2009/11/i-am-watching-live-chrome-os-webcast.html' title='I am watching the live Chrome OS Webcast'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-1466377812219378661</id><published>2009-11-17T10:49:00.002-07:00</published><updated>2009-11-17T11:23:05.457-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='CouchDB'/><title type='text'>Hosted MongoDB and CouchDB</title><content type='html'>After I finish up some client work this morning, I am planning on finishing a DevX article on using Heroku as a deployment platform. Since deploying to Heroku is so simple and so well documented, you might think that I would have a difficult time writing new material :-)&lt;br /&gt;&lt;br /&gt;After a short tutorial on getting started, I am writing mostly about using both CouchDB and MongoDB as data store, either hosted yourself on EC2 (or another server external to Heroku, which is itself hosted on EC2) or commercial managed solutions like &lt;a href="http://cloudant.com/" target="new"&gt;Cloudant&lt;/a&gt; for CouchDB and &lt;a href="http://MongoHQ.com" target="new"&gt;MongoHQ&lt;/a&gt; for a managed MongoDB service.&lt;br /&gt;&lt;br /&gt;I like to manage my own and customer deployments on EC2 - frankly, it is fun :-)&lt;br /&gt;&lt;br /&gt;That said, I think that there are sometimes business reasons for using hosted solutions like Heroku, Cloudant, and MongoHQ. It is a balance between development and admin costs and paying for managed platform as a service offerings.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-1466377812219378661?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/1466377812219378661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=1466377812219378661&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/1466377812219378661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/1466377812219378661'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2009/11/hosted-mongodb-and-couchdb.html' title='Hosted MongoDB and CouchDB'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-2667357818982309579</id><published>2009-11-17T10:24:00.003-07:00</published><updated>2009-11-17T10:42:23.722-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDEs'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>nice: Rubymine 2.0 released</title><content type='html'>I use Rubymine for most of my Ruby/Rails/Sinatra development on Ubuntu, and use it in conjunction with TextMate on OS X. I find it convenient enough to alternate between TextMate when I don't need IDE features, and Rubymine when I do.&lt;br /&gt;&lt;br /&gt;One of the biggest improvements is that indexing now occurs in the background and auto-complete and other features become available that depend on knowledge of an application and the gems that it uses.&lt;br /&gt;&lt;br /&gt;This is subjective, but once Rubymine 2.0 loads up and is done with any background indexing then the CPU use is minimal, and I think improved from earlier versions (nice to not have the fan kick in on my laptop when the CPU cores heat up). For the Rails application that I am coding on right now, Rubymine is using about 360MB of resident memory - this is OK with me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-2667357818982309579?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/2667357818982309579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=2667357818982309579&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/2667357818982309579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/2667357818982309579'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2009/11/nice-rubymine-20-released.html' title='nice: Rubymine 2.0 released'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7100397.post-1679052229366789964</id><published>2009-11-11T10:58:00.003-07:00</published><updated>2009-11-11T11:12:28.988-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='search'/><title type='text'>MongoDB has good support for indexing and search, including prefix matching for AJAX completion lists</title><content type='html'>I have been spoiled by great support for indexing and search in relational databases (e.g., Sphinx, native search in PostgreSQL and MySQL, etc.)&lt;br /&gt;&lt;br /&gt;I was pleased to discover, after a little bit of hacking this morning, how easy it is to do indexing and search using the MongoDB document-centered database. I have two common use cases for search, and MongoDB seems to handle both of them fairly well:&lt;ul&gt;&lt;li&gt;Search for words inside of text fields&lt;/li&gt;&lt;li&gt;Efficient word prefix search to support AJAX "suggest" style lists&lt;/li&gt;&lt;/ul&gt;My approach does require combining search results for multiple search terms in application code, but that is OK. Assuming the use of MongoRecord, here is a code snippet:&lt;pre&gt;class Recipe &lt; MongoRecord::Base&lt;br /&gt;  collection_name :recipes&lt;br /&gt;  fields :name, :directions, :words&lt;br /&gt;  def to_s&lt;br /&gt;    "recipe: #{name} directions: #{directions[0..20]}..."&lt;br /&gt;  end&lt;br /&gt;  def Recipe.make collection, name, directions&lt;br /&gt;    collection.insert({:_id =&gt; Mongo::ObjectID.new, :name =&gt; name,&lt;br /&gt;                       :directions =&gt; directions,&lt;br /&gt;                       :words =&gt; (name + ' ' + directions).split.uniq})&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt; &lt;br /&gt;host = 'localhost'&lt;br /&gt;port = Mongo::Connection::DEFAULT_PORT&lt;br /&gt;MongoRecord::Base.connection = Mongo::Connection.new(host,port).db('mongorecord-test')&lt;br /&gt;&lt;br /&gt;db = MongoRecord::Base.connection&lt;br /&gt;&lt;br /&gt;coll = db.collection('recipes')&lt;br /&gt;coll.remove({})&lt;br /&gt;&lt;br /&gt;coll.create_index(:words, Mongo::ASCENDING)&lt;br /&gt;&lt;br /&gt;Recipe.make coll, 'Rice Soup', 'Cook the rice, then add extra water to thin it out.'&lt;br /&gt;Recipe.make coll, 'Cheese and Rice Crackers', 'Slice the cheese and layer on top of crackers.'&lt;br /&gt;&lt;br /&gt;puts "\nSimple find"&lt;br /&gt;puts Recipe.find_by_name(:name =&gt; 'Rice Soup').to_s&lt;br /&gt;&lt;br /&gt;puts "\nFind recipe by regular expression (ignoring case) in array of words /water/i"&lt;br /&gt;Recipe.find(:all, :conditions =&gt; {:words =&gt; /^water/i}).each { |row| puts row.to_s }&lt;/pre&gt;According to the MongoDB documentation, a regular expression match like &lt;i&gt;/^water/i&lt;/i&gt; will use an index just as a relational database match in the form &lt;i&gt;like 'water%'&lt;/i&gt; does.&lt;br /&gt;&lt;br /&gt;I am still in a learning mode with MongoDB, so I would appreciate any comments on improving this aproach.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7100397-1679052229366789964?l=markwatson.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/1679052229366789964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7100397&amp;postID=1679052229366789964&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/1679052229366789964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7100397/posts/default/1679052229366789964'/><link rel='alternate' type='text/html' href='http://markwatson.com/blog/2009/11/mongodb-has-good-support-for-indexing.html' title='MongoDB has good support for indexing and search, including prefix matching for AJAX completion lists'/><author><name>Mark Watson,  author and consultant</name><uri>http://www.blogger.com/profile/05514730816583918651</uri><email>mark.watson@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05971346534663845481'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry></feed>
