<?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' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5839700538451430522</id><updated>2012-01-27T04:06:45.924-06:00</updated><category term='Python'/><category term='felix'/><category term='Erlang iterate low to high'/><category term='support'/><category term='MVC'/><category term='Python read sysin'/><category term='bug'/><category term='books'/><category term='development'/><category term='office life'/><category term='.Net'/><category term='Python modulus'/><category term='Hibernate'/><category term='Location Transparency'/><category term='glassfish'/><category term='cxf'/><category term='Schema'/><category term='open source'/><category term='Integration'/><category term='time management'/><category term='SOA'/><category term='Erlang convert string to integer'/><category term='Hadoop Java'/><category term='BRE'/><category term='Plone'/><category term='Drools'/><category term='ejb3'/><category term='DSL'/><category term='enterprise'/><category term='Scripts'/><category term='web service'/><category term='Python for loop'/><category term='List Comprehensions'/><category term='packt jboss'/><category term='Camel'/><category term='Spring'/><category term='jee'/><category term='Ops'/><category term='Hadoop help scripts'/><category term='learning'/><category term='humor'/><category term='contest'/><category term='JBoss Tools'/><category term='Kettle'/><category term='ad server'/><category term='Packt'/><category term='Book Review'/><category term='Funambol'/><category term='JBoss'/><category term='OSGi'/><category term='C modulus'/><category term='security'/><category term='programming'/><category term='Netezza'/><category term='Python read flat file'/><category term='jbpm'/><category term='XML'/><category term='statistical programming'/><category term='Spring Integration'/><category term='R Graphing'/><category term='AS 7'/><category term='Erlang recursive'/><category term='Groovy'/><category term='Hadoop simple example'/><category term='netbeans'/><category term='PHP'/><category term='software architecture'/><category term='android'/><category term='JBoss AS 5'/><category term='R LogReading'/><category term='C read flat file'/><category term='Python console input'/><category term='jboss esb'/><category term='IT Business'/><category term='performance testing'/><category term='Tools'/><category term='soapui'/><category term='career'/><category term='project management'/><category term='osgi felix packt'/><category term='OpenX'/><category term='Erlang read flat file'/><category term='self improvement'/><category term='Erlang convert integer to string'/><category term='C for loop'/><category term='nhibernate'/><category term='desgin'/><category term='R'/><category term='Erlang'/><title type='text'>Rick Wagner's Blog</title><subtitle type='html'>Let's talk programming!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default?start-index=101&amp;max-results=100'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>103</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-1102452116892133714</id><published>2012-01-10T18:54:00.004-06:00</published><updated>2012-01-11T06:36:10.074-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='packt jboss'/><title type='text'>Win the JBoss AS 7 Book!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-CoF5oFo1560/TwzgZX8wmVI/AAAAAAAAALI/mjIMc1jVo4w/s1600/AS7_Admin.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 125px; height: 151px;" src="http://4.bp.blogspot.com/-CoF5oFo1560/TwzgZX8wmVI/AAAAAAAAALI/mjIMc1jVo4w/s200/AS7_Admin.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5696174355247044946" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Now revised!  No email necessary, we'll contact you after winners are selected!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Win Free Copies of &lt;a href="http://www.packtpub.com/jboss-as-7-configuration-deployment-administration/book"&gt;JBoss AS 7 Configuration, Deployment and Administration&lt;/a&gt; book&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hello, Blog Readers! To celebrate the release of their new book- &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.packtpub.com/jboss-as-7-configuration-deployment-administration/book"&gt;JBoss AS 7 Configuration, Deployment and Administration&lt;/a&gt;&lt;/span&gt;, Packt Publishing is organizing a Giveaway especially for you and three lucky winners stand a chance to win a copy of this book. Keep reading to find out how you can be one of the Lucky Winners.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Overview of JBoss AS 7 Configuration, Deployment and Administration book&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Covers all JBoss AS 7 administration topics in a concise, practical, and understandable manner, along with detailed explanations and lots of screenshots &lt;br /&gt;* Uncover the advanced features of JBoss AS, including High Availability and clustering, integration with other frameworks, and creating complex AS domain configurations&lt;br /&gt;&lt;br /&gt;Read more about this book and download free Sample Chapter: &lt;a href="http://www.packtpub.com/sites/default/files/6785OS-Chapter-01-Installing-%20JBoss%20-AS-%207.pdf?utm_source=packtpub&amp;utm_medium=free&amp;utm_campaign=pdf"&gt;Sample Chapter&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;How to Enter?&lt;br /&gt;All you need to do is head on over to the &lt;a href="http://www.packtpub.com/jboss-as-7-configuration-deployment-administration/book"&gt;book page&lt;/a&gt; and look through the product description of this book and drop a line via the comments below over here to let us know what interests you the most about this book. It’s that simple&lt;br /&gt;&lt;br /&gt;Product description for JBoss book: http://link.packtpub.com/caa3AV#in_detail&lt;br /&gt;&lt;br /&gt;Winners from the U.S. and Europe can either choose a physical copy of the book or the eBook. Users from other locales are limited to the eBook only.&lt;br /&gt;&lt;br /&gt;Deadline&lt;br /&gt;&lt;br /&gt;The contest will close on January 31, 2012  &lt;br /&gt;&lt;br /&gt;If you'd like to include your email in the post, we'll use that to inform you if you win a copy.  If you'd rather not leave an email, we'll try to contact you through your post identity or another blog post seeking you out. &lt;br /&gt;&lt;br /&gt;Good luck!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-1102452116892133714?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/1102452116892133714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=1102452116892133714' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1102452116892133714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1102452116892133714'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2012/01/win-jboss-as-7-book.html' title='Win the JBoss AS 7 Book!'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-CoF5oFo1560/TwzgZX8wmVI/AAAAAAAAALI/mjIMc1jVo4w/s72-c/AS7_Admin.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-5119334903438509602</id><published>2011-12-26T20:25:00.003-06:00</published><updated>2011-12-26T20:51:30.404-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Packt'/><category scheme='http://www.blogger.com/atom/ns#' term='jee'/><category scheme='http://www.blogger.com/atom/ns#' term='glassfish'/><title type='text'>Book Review for "Java EE 6 with GlassFish Application Server"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-miUVHYGb9dQ/Tvks9lAYZSI/AAAAAAAAAK8/_SSV5lXNcLI/s1600/0363_Java%2BEE%2B6%2Bwith%2BGlassFish%2B3%2BApplication%2BServer_cov.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 125px; height: 151px;" src="http://2.bp.blogspot.com/-miUVHYGb9dQ/Tvks9lAYZSI/AAAAAAAAAK8/_SSV5lXNcLI/s200/0363_Java%2BEE%2B6%2Bwith%2BGlassFish%2B3%2BApplication%2BServer_cov.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5690629040576685346" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I work with Enterprise Java a lot.  I'm a support engineer working in the SOA workspace.  This means I get regular exposure to web services, JMS, and other parts of the JEE stack.  But here's the thing--&lt;span style="font-weight:bold;"&gt; I almost always work with the same parts&lt;/span&gt;.  For every part I usually work with (JMS, SOAP web services), there's at least one other part I don't work much with (JSF, RESTful web services, web-tier stuff.)  So what's happened is I have become well versed in parts of the JEE stack, but have failed to keep up with the rest.&lt;br /&gt;&lt;br /&gt;I chased the Enterprise Java rabbit all the way down the hole back in the J2EE 4 days.  Quite a bit of what I learned then-- early EJBs, enterprise patterns, and so on-- is now thankfully useless.  &lt;span style="font-weight:bold;"&gt;I knew there were lots of programming productivity-enhancers put in since JEE 6, but I just didn't want to take the time to read the internet again &lt;/span&gt;to once again become whole-stack proficient.  So I picked up a copy of "&lt;span style="font-weight:bold;"&gt;Java EE 6 with GlassFish 3 Application Server&lt;/span&gt;" by David Heffelfinger.    &lt;br /&gt;&lt;br /&gt;I'd read David's work before, so I was expecting an easy to read book that contained plenty of minimal examples I could run and experiment with.  I wasn't disappointed, this was exactly what I found.&lt;br /&gt;&lt;br /&gt;The book divides the JEE stack into slices and explains each in turn.  Each chapter contains several Maven-driven examples that can be easily compiled and quickly deployed.  In this regard, the book does exceptionally well.  &lt;br /&gt;&lt;br /&gt;The &lt;span style="font-weight:bold;"&gt;first chapter&lt;/span&gt; is really basic-- downloading the tools you need, and a quick overview of GlassFish.&lt;br /&gt;&lt;br /&gt;The&lt;span style="font-weight:bold;"&gt; second chapter&lt;/span&gt; covers &lt;span style="font-weight:bold;"&gt;Servlets&lt;/span&gt;.  There are several basic examples that show web tier basics like extracting HTML form parameters, saving data in scope, and forwarding requests.  There are also newer features like web-xml fragment processing, asynchronous processing (good for AJAX), filters and annotations instead of configuration.  This chapter reminds me of an old book I learned a lot from, "Core Servlets and JavaServer Pages".  Did you use that one?  This chapter has the same ease of reading and practical applicability.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 3&lt;/span&gt; was again a lot of&lt;span style="font-weight:bold;"&gt; basic web-tier stuff&lt;/span&gt;.   JSP fragment includes, Custom Tag Libraries, Unified Expression Language, XML syntax and JSP syntax are covered.  Reading this taught me a few new things, validated some of what I remembered.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 4&lt;/span&gt; was about &lt;span style="font-weight:bold;"&gt;JSP's Standard Tag Library&lt;/span&gt;, including core features (i.e. iterator, looping, etc.), formatting (I18N with bundles), SQL, using XML JSTL (instead of JSP), and JSTL functions like split(), length(), toUpperCase(), etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 5&lt;/span&gt; was the &lt;span style="font-weight:bold;"&gt;JPA&lt;/span&gt; chapter.  I've done a little JPA work, so I'm not totally stuck in the Entity Bean era, but it was nice to have this chapter to outline modern Java persistence.  In particular, the explanations of entity cardinality and the way to use annotations on your entity classes was well done.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 6&lt;/span&gt; covered &lt;span style="font-weight:bold;"&gt;JSF&lt;/span&gt;, which was something I needed.  I remembered the old Servlets and JSP way of doing things, but I haven't been in the web tier a lot since JSF came around.  This chapter Explained tags, validation (including custom validation) and error messages.  The explanations were easy to follow and very well done.  I was especially happy to read the section on combining JPA and JSF, as it shows how sensible defaults connect the JSF page to a controller bean.  Hurray, JEE can do a lot of wiring for you, using sensible defaults!  (Once you understand what they are, it's easy to see how a few lines of code can accomplish a lot.  But if you don't know what the conventions are, you'd have a hard time guessing what can be done for you by JEE!)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 7&lt;/span&gt; was a &lt;span style="font-weight:bold;"&gt;JMS&lt;/span&gt; chapter.  I work here a lot, so there weren't a lot of surprises for me.  For those that don't work with JMS a lot, it'll be good.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 8&lt;/span&gt; was about &lt;span style="font-weight:bold;"&gt;JEE security&lt;/span&gt;.  As usual, well explained.  (There seemed to be quite a bit of Glassfish specific stuff here, I wish that could have been reduced.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 9&lt;/span&gt; was the&lt;span style="font-weight:bold;"&gt; EJB&lt;/span&gt; chapter.  Stateful, Stateless, MDBs, Singletons, Timers.  Transactions (and how to have more than one transaction with UserTransaction). Easily understandable, modern EJBs make business logic fun.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 10&lt;/span&gt; covered &lt;span style="font-weight:bold;"&gt;Contexts and Dependency Injection&lt;/span&gt;.  Modern JEE servers are moving into the space traditionally inhabited by Spring, and this chapter explains how to use DI in a JEE container.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 11&lt;/span&gt; covers &lt;span style="font-weight:bold;"&gt;Jax-WS web services&lt;/span&gt;.  I spend plenty of time in this workspace, so I found most of it familiar.  You can certainly find aspects of JEE that are not covered in this book (Jax-WS leaves quite a few nooks and crannies to explore), but this chapter covers the basics well.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 12&lt;/span&gt; was about &lt;span style="font-weight:bold;"&gt;Jax-RS &lt;/span&gt;(REST web services).  This is another chapter that illuminated an area I had experimented with in the past, enjoying mixed success.  The 'convention over configuration' aspects are explained, which makes example Jax-RS snippets much easier to understand.  This is one of the chapters I'm sure I'll refer to in the future.&lt;br /&gt;&lt;br /&gt;There are also a couple of appendices, one on email in JEE and one on IDE usage.&lt;br /&gt;&lt;br /&gt;The book's about a year old, but JEE 6 is still the current spec and will be on the upswing for quite a while.  The book is very much relevant.&lt;br /&gt;&lt;br /&gt;So, what's the final verdict?  It's a doozy:  &lt;span style="font-weight:bold;"&gt;This book will have a spot on my nearest bookshelf&lt;/span&gt;, because it is an excellent and easy to read reference for the whole JEE stack.  What makes this remarkable is that &lt;span style="font-style:italic;"&gt;I don't even use GlassFish&lt;/span&gt;!  Ok, for this book I downloaded a copy and kept it right next to JBoss AS 7, my preferred JEE 6 container.  It's a tribute to the JEE spec writers that I was able to run the majority of the sample applications with virtually no changes for the app server-- just compile via Maven, then plop the deployable artifact onto whichever server you want.  (By the way, if you haven't used one of these new JEE servers yet, you're in for a small, fast surprise!  Please try JBoss AS 7, you'll see what I mean.)  &lt;br /&gt;&lt;br /&gt;For coders like me-- those who don't spend a lot of time across the whole JEE stack-- I'd recommend this book as a quick way to be comfortable wherever you find yourself in the JEE stack.&lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href="http://www.packtpub.com/java-ee-6-applications-with-glassfish-3-application-server/book"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy Productively Programming!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-5119334903438509602?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/5119334903438509602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=5119334903438509602' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5119334903438509602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5119334903438509602'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/12/book-review-for-java-ee-6-wtih.html' title='Book Review for &quot;Java EE 6 with GlassFish Application Server&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-miUVHYGb9dQ/Tvks9lAYZSI/AAAAAAAAAK8/_SSV5lXNcLI/s72-c/0363_Java%2BEE%2B6%2Bwith%2BGlassFish%2B3%2BApplication%2BServer_cov.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-2350001332262476148</id><published>2011-11-12T19:31:00.003-06:00</published><updated>2011-11-12T19:37:21.420-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AS 7'/><category scheme='http://www.blogger.com/atom/ns#' term='JBoss'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Book Review for "JBoss AS 7 Configuration Deployment and Administration"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-3BolikOhmyo/Tr8eUnF1o4I/AAAAAAAAAKs/dzWHKLQtEKg/s1600/AS7Book.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 125px; height: 151px;" src="http://1.bp.blogspot.com/-3BolikOhmyo/Tr8eUnF1o4I/AAAAAAAAAKs/dzWHKLQtEKg/s200/AS7Book.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5674287394949800834" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Book Review for "JBoss AS 7 Configuration and Administration"&lt;br /&gt;&lt;br /&gt;Have you heard the buzz about JBoss AS 7?  Happy days for the developer community-- the productivity gains of JEE 6 are combined with lightning fast speed and minimal footprint for AS 7.  The downside to all this is there is much to learn (again).  Packt can help.&lt;br /&gt;&lt;br /&gt;The book's author is Francesco Marchioni.  If that name sounds familiar, it should.  This is the guy behind "MasterTheBoss", a very popular JBoss oriented developer website.  Francesco has also authored well-written books on JBoss AS 5 development and JBoss AS 5 performance tuning, so he knows a thing or two about JBoss as well as how to churn the words out.&lt;br /&gt;&lt;br /&gt;This is a "RAW" book, which means it's not yet finished.  Some of this is reflected in the book's existing text, but mostly what's here is good.  There are a few chapters yet to be written.&lt;br /&gt;&lt;br /&gt;So what's in this book?  Here's a quick chapter-by-chapter breakdown.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 1&lt;/span&gt; - A nice overview of the new, improved JBoss.  AS 7 is a major re-hang, with the old MicroContainer going by the wayside and being replaced by JBoss Modules and a Modular Service Container.  (The most dramatic external changes are very fast startup speed and completely different configuration mechanisms.)  JBoss Modules is a big change, and really is explained throughout the book, but your first exposure is here.  You're also given a very newbie-friendly explanation of how to download, setup, start and stop JBoss.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 2&lt;/span&gt; - We start the daunting task of learning to configure the new and improved JBoss.  JBoss has always given administrators a lot of options to consider when it comes to configuration, and AS 7 is no exception.  Suffice it to say the model is all new, but this book goes about explaining it in a clear way.  (Pictures are used where appropriate.)  Here we are given an explanation of how configuration now works-- there is a 'standalone' mode and a 'domain' mode, these are covered.  A few bread-and-butter items like port configuration, datasources, and installation of JDBC drivers is here.  The author's performance orientation shines through in a section that describes the various types of thread pools and how they can be used.  The chapter ends with section on the latest messaging system (HornetQ) and Transactions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 3&lt;/span&gt; - Chapter 3 covers 'Enterprise' topics, which include the various flavors of EJBs.  The book explains their lifecycles and how they are configured (down to details like cache pool sizing).  If you're getting the impression this book covers some low-level topics, you would be right.  The JBoss Web Container (very similar to Tomcat) is explained.  Configuration of the default JBoss logger is covered, as is installation of Log4j should the reader decide to use it instead.  Even though this is an administrative book rather than a development book, the author chose to throw in a simple example web application so the reader can have something to deploy.  I tend to lag on web technologies (because I work with back-end technologies), so I really appreciated that part.  Woohoo, I've used Facelets!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 4&lt;/span&gt; - This chapter covers the all-new 'domain' mode.  Domains are all about centralized configuration of groups of servers, a feature that will be very welcome in large shops and cloud environments.  You may think this sounds a lot like the traditional JBoss simple clustering, and you would be wrong.  This is something completely orthogonal to clustering!  But it's given a good coverage, and by the time you're done with this chapter you'll be itching to go try to define your own domain and work it over.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 5&lt;/span&gt; - Chapter 5 is about application deployment.  The mechanisms you use will differ depending on whether you are 'standalone' mode or 'domain' mode.  You also have several ways to deploy JEE artifacts-- these are all explained nicely.  This makes for light reading, but the chapter is balanced out by a good section on Classloading in AS 7.  If you've done much JEE development (on any platform) you are aware that classloading can be a tricky area.  With AS 7, JBoss sought to straighten this out and this chapter explains how it all works.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 6&lt;/span&gt; - is about the administrative interfaces AS 7 brings you.  First, there's a web UI.  In my opinion, the web interface is clean and adequate as far as usability, but it lacks depth.  The alternative is a command line interface (CLI) that you can use to reach all kinds of nooks and crannies in AS 7's configuration.  The CLI demands that you understand a somewhat arcane dialect, but it rewards you with useful functionality.  If you know the current JBoss 'twiddle' utility, you should find the CLI very similar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 7&lt;/span&gt; - is the clustering chapter.  Cluster configuration is explained, including the Infinispan and JGroups components you'll need to understand.  Clustering has always been one of JBoss's strong suits, it should only get better with AS 7.  &lt;br /&gt;&lt;br /&gt;Still yet to be provided (this is a RAW book, remember):&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 8&lt;/span&gt; - on load balancing web applications.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 9&lt;/span&gt; - Integration with other frameworks (I'd watch for Spring content here)&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 10&lt;/span&gt; - Tuning and slimming.  (With the modular emphasis, we should have some very effective slimming available)&lt;br /&gt;&lt;br /&gt;So who's this book good for?  I'd say anybody using AS 7.  (AS 7 will be the basis for the next 'supported' JBoss, EAP 6, by the way.)  AS 7 is a major re-hang, so you're going to want a decent guide to learning your way around.  I liked this book, and imagine I'll be using it as a reference on a regular basis.&lt;br /&gt;&lt;br /&gt;Oh, that last paragraph begs the question:  Who should be using AS 7?  I think everybody should give it a try.  JEE 6 has an associated learning curve, but it's the most productive version of Enterprise Java yet.  With the speed and reduced memory footprint, I found that AS 7 is great to run in an IDE like Eclipse or JBDS, allowing me to deploy and start in a flash.  I'd encourage every Java developer to give AS 7 a look, and while you're at it use this book as a reference.&lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href="http://www.packtpub.com/jboss-as-7-configuration-deployment-administration/book"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy (productive) reading and coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-2350001332262476148?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/2350001332262476148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=2350001332262476148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2350001332262476148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2350001332262476148'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/11/book-review-for-jboss-as-7.html' title='Book Review for &quot;JBoss AS 7 Configuration Deployment and Administration&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-3BolikOhmyo/Tr8eUnF1o4I/AAAAAAAAAKs/dzWHKLQtEKg/s72-c/AS7Book.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-1271255097320909712</id><published>2011-10-29T19:37:00.003-05:00</published><updated>2011-10-29T19:42:13.037-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Packt'/><category scheme='http://www.blogger.com/atom/ns#' term='Drools'/><title type='text'>Book Review for "Drools Developers Cookbook RAW"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-HjJwX2ahKAc/Tqycb1KTQ1I/AAAAAAAAAKg/Cu-WQKZwYZ0/s1600/Drools_Developers_Cookbook.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 131px; height: 160px;" src="http://1.bp.blogspot.com/-HjJwX2ahKAc/Tqycb1KTQ1I/AAAAAAAAAKg/Cu-WQKZwYZ0/s200/Drools_Developers_Cookbook.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5669078032893297490" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A Developer's Survey of the fast-moving Drools project&lt;br /&gt;&lt;br /&gt;This review is for "Drools Developers Cookbook" from Packt.  This book is currently available in 'RAW' format, which means it's not quite finished.  The text is a little rough around the edges, and there are two chapters yet to be provided.&lt;br /&gt;&lt;br /&gt;Do you work with Drools, the popular open source rule engine?  If not, this is not the right book to get you started.  There is no introductory material to get you started.  But if you know Drools, this is your ticket straight to the current cutting edge!  This book gives pointers and best practices for working with the latest and greatest features.&lt;br /&gt;&lt;br /&gt;The&lt;span style="font-weight:bold;"&gt; first chapter&lt;/span&gt; gives you tips on working with rules.  You'll see how to write rules in ways outside the usual, how to enable some diagnostic logging, and how to work with rules on timers and Calendars.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapter 2&lt;/span&gt; deals with more 'bread and butter' Drools material, but this time not dealing with rules.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapters 3 and 4&lt;/span&gt; cover Guvnor, the open source Business Rules Management System.  Guvnor, a web app, allows you to author, categorize, and test your rules.  This is how you can have business-analyst types write business logic instead of using programmers.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-weight:bold;"&gt;fifth chapter&lt;/span&gt; is probably the most newbie-friendly chapter in the book, it deals with Complex Event Processing.  CEP is a way of applying rules over windows of time, so you can express something like "Tell me if there are 100 online purchases in any half-hour period".  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Chapters 6 and 7&lt;/span&gt; deal with executing Drools remotely (mostly through 'Drools Server') and integrating Drools with other applications through Spring and Apache Camel.  This is very handy-- after mastering Drools, developers sometimes wonder how to apply their newfound knowledge in a practical way.  Here are some good ideas for solving that problem!&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-weight:bold;"&gt;two chapters that are not yet provided&lt;/span&gt; deal with Drools Planner (a tool for finding optimal solutions to problems like capacity balancing challenges) and jBPM5 (a re-hang of the popular jBPM Business Processing framework).  These two will be very important, especially jBPM.  I hope the author is putting a special emphasis on these.&lt;br /&gt;&lt;br /&gt;All things considered, I find this book to be a good resource for Drools developers.  As I've hinted, if you're new to Drools you probably need to start with something a little more basic.  But if you're already into Drools, this is a quick way to get get a handle on state-of-the-art features.&lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href="http://www.packtpub.com/drools-developers-using-jboss-cookbook/book"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy Drooling!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-1271255097320909712?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/1271255097320909712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=1271255097320909712' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1271255097320909712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1271255097320909712'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/10/book-review-for-drools-developers.html' title='Book Review for &quot;Drools Developers Cookbook RAW&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-HjJwX2ahKAc/Tqycb1KTQ1I/AAAAAAAAAKg/Cu-WQKZwYZ0/s72-c/Drools_Developers_Cookbook.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-385230038732101053</id><published>2011-10-14T18:21:00.003-05:00</published><updated>2011-10-14T18:25:15.836-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jboss esb'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Book Review for "JBoss ESB Beginners Guide" in RAW Format</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-qv5fd5HYBVc/TpjEoTXMZhI/AAAAAAAAAKU/kwTGK24t0ao/s1600/JbossESBBook.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 122px; height: 152px;" src="http://4.bp.blogspot.com/-qv5fd5HYBVc/TpjEoTXMZhI/AAAAAAAAAKU/kwTGK24t0ao/s200/JbossESBBook.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5663492728089765394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;An easy introduction to the popular JBoss ESB.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;*Disclaimer* I work for Red Hat as a JBoss support engineer and work with JBoss ESB every day.  This will allow me to make an informed review of this book, but you should be aware that I work often with the book's authors.  Still, you can expect an honest review here.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Primer: What's an ESB?  An ESB (Enterprise Service Bus) is a runtime environment that lets the user define services, consume services and route and transform messages.  The user can wire together modular services to define desired functionality.  ESBs are often used to mediate web service calls-- they stand in between the caller of a service and the provider of the service.  From this man-in-the-middle position they are able to transform messages, manage security concerns, enrich messages, and audit activities.  ESBs are also often used with JMS.  In this context they are transactional, so they can string together a series of actions (including database inserts) that are transactional and can be initiated by a fire-and-forget client.  ESBs offer great utility, but usually at a significant technological cost.&lt;br /&gt;&lt;br /&gt;This book is the &lt;span style="font-weight:bold;"&gt;first book&lt;/span&gt; offered for JBoss ESB, and is currently offered in "RAW" format, which means it is incomplete and subject to editing as the authors continue to enhance it.  The authors are all key contributors to the project, so the knowledge is first-rate.  Presentation is also surprisingly good, probably because at least one of the authors is a prolific blogger and thus in good practice.  The overall quality of the book is high.&lt;br /&gt;&lt;br /&gt;So what's covered in this book?  Here's what I would consider the highlights:&lt;br /&gt;&lt;br /&gt;- Download and installation of JBossESB.&lt;br /&gt;- Configuration of JBDS (an Eclipse-based IDE for use with JBoss products)&lt;br /&gt;- Introduction to the JBoss ESB quickstarts.  This is very important!  This is an introduction to literally dozens of minimal, functional examples for JBoss ESB.  (Think of them like "Hello World" examples for using different parts of the ESB.)&lt;br /&gt;- Services, including the necessary configuration parts.&lt;br /&gt;- Writing your own functionality for the ESB (Custom Actions).  These can be implemented in Java, Groovy, etc.&lt;br /&gt;- Messages.  What they are made of, how to validate them, how they are carried on the ESB.&lt;br /&gt;- Message Exchange Patterns (MEP).  This is an important concept in ESBs, it determines if your client gets a response or not.&lt;br /&gt;- Passing messages in memory for performance.&lt;br /&gt;- The packaged Services that come with JBoss ESB.  Like the quickstarts, this is a huge gateway to lots of functionality just waiting to be picked up and used.&lt;br /&gt;&lt;br /&gt;The book's title includes "Beginner's Guide", which is partly truthful.  It is a gentle enough introduction that a newbie will be able to make use of the book.  But it also includes plenty of coverage of what I'd consider "Advanced Topics".  (Remember, I answer support questions on this software every working day, so I think I have a fair idea of what's easy to do and what's not.)  &lt;br /&gt;&lt;br /&gt;Since this is a RAW book, it's not complete yet.  At least one other chapter is promised, on Gateways.  A Gateway is a component that accepts messages from sources other than the ESB itself, i.e. external JMS providers, HTTP, SQL, and so on.  This should be another good chapter.&lt;br /&gt;&lt;br /&gt;Who is this book good for?  I'd say any user of JBoss ESB.  If you're not yet a user of JBoss ESB, but think you might like an ESB, then I'd recommend this book for you, too.&lt;br /&gt;&lt;br /&gt;If you think you'd like this book, I'd suggest you move fast.  For the month of October, Packt is offering any Open Source eBook for only $10.99.  That's hard to beat.&lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href=" http://www.packtpub.com/jboss-esb-beginners-guide/book"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy JB-ESBing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-385230038732101053?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/385230038732101053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=385230038732101053' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/385230038732101053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/385230038732101053'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/10/book-review-for-jboss-esb-beginners.html' title='Book Review for &quot;JBoss ESB Beginners Guide&quot; in RAW Format'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-qv5fd5HYBVc/TpjEoTXMZhI/AAAAAAAAAKU/kwTGK24t0ao/s72-c/JbossESBBook.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-3803934356241555292</id><published>2011-09-08T20:51:00.003-05:00</published><updated>2011-09-14T06:13:51.053-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Book Review "Android 3.0 Application Development Cookbook"</title><content type='html'>Book Review for "Android 3.0 Application Development Cookbook"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;The Android Novice's guide to doing just about anything.  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.packtpub.com/android-3-0-application-for-mobiles-and-tablets-development-cookbook/book"&gt;Android 3.0 Application Development Cookbook&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This book is presented in Packt's "CookBook" format, which means it is a &lt;span style="font-weight:bold;"&gt;series of how-to steps&lt;/span&gt; that show the reader how to accomplish some task.  In this case, the book shows how to program Android devices using the Eclipse ADT plug-in.  &lt;br /&gt;&lt;br /&gt;Establishing the development environment was a bit troublesome in my case.  I've done a little Android development in the past, but the machine I used was underpowered for the emulator, so I decided to set up Eclipse and my Android environment on my Fedora 13 quad-core.  The book is of little value here-- pretty much you are told what you need, and are left on your own to get it set up.  Luckily, I'm familiar with this sort of task, so things were running smoothly after the initial install and about a half an hour of Google'd help from other ADT users.&lt;br /&gt;&lt;br /&gt;In the early chapters, the book is &lt;span style="font-weight:bold;"&gt;very explicit about how to set up your Eclipse project and which files to edit&lt;/span&gt;.  The author takes no chances that the reader is unfamiliar with the environment, and spells everything out in perfect detail.  Normally, I prefer printed books to electronic, but this is one case where an e-book would've been handy-- for code copying purposes.  I spent my learning time dutifully typing in the author's suggestions, though, and was rewarded with properly running examples each time.&lt;br /&gt;&lt;br /&gt;The first chapter is about 'Activities', which results in a window being presented on the device.  (In my case, the emulator.)  You are shown how to make an Activity, how to store state, how to send an 'Intent' (which is like a message that can be sent to another Activity or other receiver).  This chapter spells out the steps in complete detail, so the reader should be assured of success if he has his development environment set up correctly.  Later chapters omit some of the detail, but you are never given so little that you can't accomplish what you want.  It's just the first chapter that sets the basics for the reader.&lt;br /&gt;&lt;br /&gt;All the chapters are set up the same way.  There is&lt;span style="font-weight:bold;"&gt; little or no 'academic background'&lt;/span&gt;, each chapter is a series of step-by-step descriptions of how to accomplish some goal.  I think this book will be a very effective reference for development, I imagine many copies will be kept close at hand.&lt;br /&gt;&lt;br /&gt;There is surprising depth in the list of tasks this book teaches.  Here's an incomplete list, to show you some of the things that are presented:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Drawing your UI&lt;br /&gt;- Making menus, context sensitive menus, shortcut keys and submenus&lt;br /&gt;- Storing data on internal storage, external storage, the included SQLite database&lt;br /&gt;- Detecting device orientation, using the accelerometer, detecting user gestures and the available sensors&lt;br /&gt;- Communicating with the user through Alerts, progress bars, status bars and dialogues&lt;br /&gt;- Adding graphics, rotating images, and using animation&lt;br /&gt;- Playing audio files and recording video, audio and taking pictures&lt;br /&gt;- Sending and receiving phone calls and SMS messages, using internet content&lt;br /&gt;- Detecting the device location, using Google maps and other mapping skills&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sounds like a pretty cool list, huh?  Each of these tasks is shown in a manner that isolates it from other problems, so you are basically shown the way to write a tiny application that showcases just the feature you are interested in.&lt;br /&gt;&lt;br /&gt;Readers looking for lots of explanatory text about the big picture are going to be disappointed-- this book is all about getting the task done.  In that regard, it is quite effective.&lt;br /&gt;&lt;br /&gt;All things considered, I liked this book and would recommend it to anyone who is doing Android development.  &lt;span style="font-weight:bold;"&gt;Beginners will get a decent introduction&lt;/span&gt; to some small projects (they'd better be ready to augment their knowledge with the online APIs and other sources, though.)  More experienced developers will probably know some of the material, but can surely &lt;span style="font-weight:bold;"&gt;learn from the wide variety of capabilities explored&lt;/span&gt;.  Basic skills necessary are fundamental Java, a little knowledge of XML, and a willingness to follow instructions and look for details elsewhere.  If you've got those, you can develop for Android with this book.&lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href="http://www.packtpub.com/android-3-0-application-for-mobiles-and-tablets-development-cookbook/book"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy Droid Development!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-3803934356241555292?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/3803934356241555292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=3803934356241555292' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3803934356241555292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3803934356241555292'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/09/book-review-android-30-application.html' title='Book Review &quot;Android 3.0 Application Development Cookbook&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-2357919308564171527</id><published>2011-09-06T19:25:00.003-05:00</published><updated>2011-09-06T19:30:45.861-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>MEAP Review:  Spring Integration in Action</title><content type='html'>A hands-on guide for using Spring's Integration framework.&lt;br /&gt;&lt;br /&gt;Disclaimer:  I work for JBoss and support JBoss ESB, which can be viewed as a competitor to Spring Integration.  This review will cover only the book "Spring Integration in Action" and only the features of Spring Integration it describes.&lt;br /&gt;&lt;br /&gt;Spring Integration is a toolkit that fits the needs of Enterprise users who need to facilitate communication between disparate applications.  If you're not familiar with the workspace, these toolkits allow the user to perform tasks like the following:  &lt;span style="font-weight:bold;"&gt;read text files in and invoke backend web services for each record in the file&lt;/span&gt;; &lt;span style="font-weight:bold;"&gt;proxy a web service and allow you to alter either the data going to the targeted backend service or alter the response received from it&lt;/span&gt;; &lt;span style="font-weight:bold;"&gt;log http requests to a database&lt;/span&gt;; many others.&lt;br /&gt;&lt;br /&gt;The book is well-written and describes Spring Integration usage often in terms of the famous '&lt;span style="font-weight:bold;"&gt;Enterprise Integration Patterns&lt;/span&gt;'.  The Patterns are well-known and time-tested methods of successfully achieving tasks, and the book's author does a good job of demonstrating how Spring Integration can be used to implement them.&lt;br /&gt;&lt;br /&gt;"Spring Integration in Action" is broken up into 4 areas:&lt;br /&gt;- Background&lt;br /&gt;- Messaging&lt;br /&gt;- Integrating Systems&lt;br /&gt;- Advanced Topics&lt;br /&gt;&lt;br /&gt;The '&lt;span style="font-weight:bold;"&gt;Background&lt;/span&gt;' section has 2 chapters.  There's a short introductory section that covers Spring, for those unfamiliar with this famous Dependency Injection framework.  I expect most users will breeze by this, but it probably will be necessary for others.  The second chapter deals with the "Enterprise Integration Patterns", which are time tested best practices in the Integration workspace.  The book does justice to the topic in this chapter, but really spreads a lot of the 'Pattern' information around the rest of the book as well.&lt;br /&gt;&lt;br /&gt;'&lt;span style="font-weight:bold;"&gt;Messaging&lt;/span&gt;', as the section title suggests, deals with the fundamental parts and pieces that help Spring Integration shuffle data from component to component.  Integration toolkits require ways to pass messages along (Integration is mostly about messaging), in Spring Integration these are called "Channels".  Channels are very important in Spring Integration, as they determine the runtime characteristics (i.e. number of threads) that will be part of your pipeline.  This can be a topic of confusion, so it's good the author discusses it early.&lt;br /&gt;&lt;br /&gt;Components deal with messages, messages travel along channels.  In between these two is an 'Endpoint', another important topic.  Endpoints can be outward-facing (gateways), and can be event-driven or polling in nature.  Endpoints are covered in the same plain-spoken manner as the rest of the basic components.&lt;br /&gt;&lt;br /&gt;The next few chapters deal with more 'generic' Integration best practices.  These include the way messages are transformed (so different systems can 'talk'), the way messages can have information added to them, and how you can route and filter the messages that travel between components.  If you've been in the workspace, this all probably sounds familiar.  If you haven't-- the book provides a good explanation of how things work.&lt;br /&gt;&lt;br /&gt;'&lt;span style="font-weight:bold;"&gt;Integrating Systems&lt;/span&gt;' deals with the construction of your message pipeline and some of the components you'll likely need.  You'll be wanting to split and recombine messages, convert Java objects to XML (and vice-versa), and how to hook JMS into your pipeline.  You'll also want to deal with the file system, web services and maybe email-- these are all explained here.  &lt;br /&gt;&lt;br /&gt;'&lt;span style="font-weight:bold;"&gt;Advanced Topics&lt;/span&gt;' is a potpourri of topics that you may or may not find a need for.  It seems most every book today has to cover publishing to social media outlets, this one does as well.  Batch application integration (using Spring Batch, naturally) is explained.  There are also some chapters I found of very high value:  managing and monitoring, scheduling and concurrency, and Test Driven Development best practices.&lt;br /&gt;&lt;br /&gt;This book is in Manning's "MEAP" program, which means it is available for early purchase, &lt;span style="font-weight:bold;"&gt;but is still being worked on&lt;/span&gt;.  In this reader's opinion, the current MEAP version is of sufficient value to warrant a purchase.  There's a lot of good material here, it's probably very close to a completed state.&lt;br /&gt;&lt;br /&gt;So, what's the final verdict? &lt;span style="font-weight:bold;"&gt; I like the book for the clear explanations of how Spring Integration works&lt;/span&gt;.  For users of other integration toolkits, there's also a &lt;span style="font-weight:bold;"&gt;lot of generic 'Systems Integration' knowledge&lt;/span&gt; that would be of value.  If you're a Spring Integration user, buying this book should be a no-brainer-- it will quickly pay for itself many times over.  If you're not a Spring Integration user, but are a user of another system integration toolkit-- you still might consider it, for the overall Integration value.  All things considered, this book will be a good reference for the Integration user.&lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href="http://www.manning.com/fisher/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-2357919308564171527?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/2357919308564171527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=2357919308564171527' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2357919308564171527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2357919308564171527'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/09/meap-review-spring-integration-in.html' title='MEAP Review:  Spring Integration in Action'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-9191907463850772544</id><published>2011-07-17T14:37:00.004-05:00</published><updated>2011-07-17T14:48:28.483-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kettle'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>ETL-- what is it, how it can be useful to you</title><content type='html'>&lt;span style="font-weight:bold;"&gt;What's ETL, and what can it do for me?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ETL is short for "Extract, Transform, Load", and it's a well established discipline of IT.  ETL tools are usually fronted with graphical front-ends that facilitate putting together processes that work on streams of data.  The data can be filtered, augmented, sliced into pieces, and put into new repositories.  (That's E,T,E and L if you're a discriminating reader.)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-xifR7jQbMMM/TiM7rJ_CI-I/AAAAAAAAAJw/N1dpW52xUHs/s1600/Spoon1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 114px;" src="http://4.bp.blogspot.com/-xifR7jQbMMM/TiM7rJ_CI-I/AAAAAAAAAJw/N1dpW52xUHs/s200/Spoon1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5630409571743966178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So what can this do for you?  In my day-to-day job, I used to work for a company that worked with gobs of demographic data, so we used ETL all the time.  Mostly handling large files, splitting them into fields, validating values, adding values where none was there, and loading databases.  But now that I'm doing something else, I still see plenty of uses for it.  Got a log file you need to parse to look for trends?  ETL can help.  Do you have a list of Garbage Collection stats you'd like to work over?  Another good use case.  How about writing out some XML or JSON from a source in another form?  Check, check and check.  Would you like to automatically validate the format of some data, and send an email out if it needs some work?  Another good case.  Almost any time you have a reasonable amount of data and want to add to it, subtract it, split it into streams, validate it or place it somewhere else or in a different format, ETL should be one of the tools you consider.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ETL vs. ESB vs. Integration Framework&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Is ETL better than an ESB (like Mule or JBoss ESB)?  How about a lightweight integration framework (like Camel or SwitchYard)?  ETL is often accompanied by a nifty user interface that lets you quickly drag-n-drop components onto a canvas, making for a very productive user model.  ETL is almost always used to process large volumes of data, not single transactions.  So while an ESB or an Integration Framework's usual use case might be onesy transactions, the ESB is going to go after a lot more than one record.  (The records can come from a database, a flat file, an XML document, or other stores.  The idea is that there is probably more than one of them.)  This is not a concrete rule-- ESB and Integration Frameworks can process files, for instance, or an ETL tool can be made to operate on single records-- but it's almost always true.  ETL is more about files (or groups of records) than it is about a single message.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Where can I get one of those?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ETL tools have been around a long time.  Commercial versions exist that contain many nice features, but I really like an Open Source version called 'Kettle'.  Like many successful Open Source products, Kettle is available in a commercial version and in the 'project' version that's freely available.  I'd urge you to download Kettle and give it a shot if you haven't done so already.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;OK, I got the free one.  Now how do I get started?&lt;/span&gt;&lt;br /&gt;The Kettle download comes with a 'Getting Started' guide that should have you running a sample flow in less than an hour.  Better yet, you'll see all the cool drag-n-drop operations you can use and will soon be hacking together flows to munge data faster than you ever thought possible.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;We interrupt this blog posting for a brief Book Review...&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-sIvwg4hxpeg/TiM7b3r9lKI/AAAAAAAAAJo/rGP1oDUKs2c/s1600/Kettle1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 163px; height: 200px;" src="http://2.bp.blogspot.com/-sIvwg4hxpeg/TiM7b3r9lKI/AAAAAAAAAJo/rGP1oDUKs2c/s200/Kettle1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5630409309134099618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've been inspired to write this blog post after reading a new book from Packt Publishing, "&lt;span style="font-weight:bold;"&gt;Pentaho Data Integration 4 Cookbook&lt;/span&gt;".  Now that we have a baseline understanding of what kind of ETL we're talking about, let's talk a bit about this book.&lt;br /&gt;&lt;br /&gt;The book does not teach Kettle basics.  If you don't know how to start Kettle, you're going to have to read the user doc, because you won't find it here.  What you will find is a sizable collection of best practices for accomplishing things with Kettle.  (Many of the patterns will apply to other ETL products as well, though the implementation steps will be different.)  Here are some of the things you might expect, and will find in this book:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;- How to insert, update, and delete from a database&lt;br /&gt;- How to alter a database at runtime&lt;br /&gt;- How to read and write fixed flat files, CSV files, and Excel documents&lt;br /&gt;- Reading and writing XML documents&lt;br /&gt;- Shuffling files in the usual ways (copying, moving, remotely copying and moving), deleting&lt;br /&gt;- Writing reports &lt;br /&gt;- Sending emails&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'd expect any decent book on ETL to cover all those topics.  These things are all basic uses of Kettle and would quickly be needed by many users.  But wait!  The book goes deeper, providing advanced use cases that will leave many advanced users puzzled.  These include:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;- Changing a database connection at runtime&lt;br /&gt;- Parsing unstructured files (like a log4j log file)&lt;br /&gt;- Validating XML against a schema or DTD&lt;br /&gt;- Matching data based on 'fuzzy' matching algorithms&lt;br /&gt;- Augmenting data with web services&lt;br /&gt;- Splitting a flow into 'sub-Transformations' to facilitate management and re-use&lt;br /&gt;- Effectively dealing with your data stream-- forking it into different streams for 'good' rows and 'bad' rows, and treating each differently&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's this second list of topics that really makes this book valuable.  Honestly, Kettle is fairly intuitive to use, so a competent developer will probably figure out the basics without much assistance.  The difference between a basic user and an expert will be the ability to figure out the more advanced use cases, and that's where this book provides a nice value-add.&lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href="http://www.packtpub.com/pentaho-data-integration-4-cookbook/book"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm pretty excited about using a few of the tricks I've picked out of the book to help me with some recurring tasks.  One of these tasks involves preparing data for &lt;span style="font-weight:bold;"&gt;R&lt;/span&gt;, the statistical package.  (If you're not an 'R' user, please look back in this blog or elsewhere on the internet to see what all the hoopla is about.  It really is nice!)  Prior to this, I'd usually use Python and Bash scripts to massage and extract data from the sources I want to examine, but this actually can get to be a bit tedious.  Using the drag-n-drop Kettle interface, though, I hope to apply my newfound knowledge to help me quickly stage data for advanced analysis.  Wish me luck in this endeavor as I wish you good luck in finding uses for your problems as well.  We're lucky--  never before have we had such a wealth of freely available tools to help us solve problems!&lt;br /&gt;&lt;br /&gt;Happy Kettling!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-9191907463850772544?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/9191907463850772544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=9191907463850772544' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/9191907463850772544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/9191907463850772544'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/07/etl-what-is-it-how-it-can-be-useful-to.html' title='ETL-- what is it, how it can be useful to you'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-xifR7jQbMMM/TiM7rJ_CI-I/AAAAAAAAAJw/N1dpW52xUHs/s72-c/Spoon1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-6082006005386119766</id><published>2011-07-02T09:35:00.003-05:00</published><updated>2011-07-02T09:38:38.887-05:00</updated><title type='text'>Book Review for "Oracle JRockit The Definitive Guide"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-o5daLtUPhcE/Tg8s1ulnI7I/AAAAAAAAAJY/OPHv94dxdlc/s1600/JRockit.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 116px; height: 145px;" src="http://3.bp.blogspot.com/-o5daLtUPhcE/Tg8s1ulnI7I/AAAAAAAAAJY/OPHv94dxdlc/s200/JRockit.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5624763761159513010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Have you ever worked with someone who knew a lot about the JVM?  I did once, and it was an eye opening experience.  Not only was this guy the right person to go to for performance and GC questions, he also was confident he'd written his programs for optimal performance.  I was so impressed I decided this must be one of the characteristics of a superior programmer, and decided I'd try to improve myself in this regard.&lt;br /&gt;&lt;br /&gt;I've just finished "Oracle JRocket The Definitive Guide" and I think this book has helped me on my journey to Java mastery.  The early chapters are a little deep for an application programmer, but they still make for interesting reading.  (Just how deep?  How about discussions of the assembly code generated for your Java source?  The very lowest levels of the JVM are discussed.)  &lt;br /&gt;&lt;br /&gt;After the lowest level workings of the JVM are covered, we encounter some material that's more likely to be of use to the average Java coder.  We start learning about memory management, including in-depth coverage of garbage collection.  (This is sure to be of use to any serious Java developer.)  Java constructs of interest like Soft References, Phantom References, etc. are discussed.  IMHO, these are topics that are beyond basic Java-- another tool in your Java toolkit!&lt;br /&gt;&lt;br /&gt;There's a whole chapter on threading and synchronization.  Once again, treading ground beyond that occupied by Java programmers at the basic level.  Here you'll encounter topics like thin and fat locks, spin locks, and the innards of how threading is implemented on a JVM.  If you're starting to get the feel this book is partly about computer science, not just programming, I'd think you may be right.&lt;br /&gt;&lt;br /&gt;There's a lot of material related to understanding how the JVM is working.  (This includes benchmarking, profiling, and understanding the running JVM.)  It goes without saying this is all of high value to any Java programmer.&lt;br /&gt;&lt;br /&gt;The final chapters of the book are devoted to the tools associated with JRockit.  JRockit comes with a bunch of handy tools to help you monitor and control your JVM.  These chapters show you all the slick GUI features and low-level switches you can use now that you understand what the JVM is up to.&lt;br /&gt;&lt;br /&gt;Final impressions?  This is an interesting book, because it's written hardest-materials-first.  If you can hang with the early chapters you stand a lot to gain.&lt;br /&gt;&lt;br /&gt;Who is this book good for?  Any Java programmer will benefit from the early chapters.  (They aren't specific to JRockit.)  The latter chapters will be of use only to JRockit users, but since it's now freely available under a user friendly license, these tools are available to everyone.&lt;br /&gt;&lt;br /&gt;It's a big book-- well over 500 pages, and none of it is fluff.  I liked this book, it can be found &lt;a href="http://www.packtpub.com/oracle-jrockit-definitive-guide/book"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy 'Rockiting!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-6082006005386119766?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/6082006005386119766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=6082006005386119766' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/6082006005386119766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/6082006005386119766'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/07/book-review-for-oracle-jrockit.html' title='Book Review for &quot;Oracle JRockit The Definitive Guide&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-o5daLtUPhcE/Tg8s1ulnI7I/AAAAAAAAAJY/OPHv94dxdlc/s72-c/JRockit.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-7365239384401732144</id><published>2011-06-11T19:35:00.002-05:00</published><updated>2011-06-11T19:39:53.504-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><category scheme='http://www.blogger.com/atom/ns#' term='cxf'/><title type='text'>Book Review for "Apache CXF Web Service Development"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-2JRywIh5Pns/TfQKW68mHEI/AAAAAAAAAJI/qjZVnSfSBGc/s1600/CXF.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 116px; height: 148px;" src="http://4.bp.blogspot.com/-2JRywIh5Pns/TfQKW68mHEI/AAAAAAAAAJI/qjZVnSfSBGc/s200/CXF.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5617126024134663234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Book Review for "Apache CXF Web Service Development"&lt;/span&gt;   (When bottom-up "Hello World" is not enough)&lt;br /&gt;&lt;br /&gt;Do you use Apache CXF?  If so, you might take an interest in "Apache CXF Web Service Development".  Here's my impression.&lt;br /&gt;&lt;br /&gt;The book does a good job of covering CXF use cases, going beyond the usual trivial Jax-WS examples.  It also covers Jax-RS (RESTful) web services, and covers each in enough detail that you're likely to find what you need when working with CXF.&lt;br /&gt;&lt;br /&gt;Jax-WS has largely demystified basic web service development, so there's a great amount of content on the web that will show you how to quickly annotate a POJO to get a web service up and running.  But what if you need to do contract-first (top down) development?  Lightweight resources often conveniently bypass this more difficult trail, but this book does a good job of handling it.  (This is no great accomplishment for a book on web service development, but it does set the tone for the types of things this book will show.)&lt;br /&gt;&lt;br /&gt;Let's say you have a need to work with the raw XML, rather than getting the message in the form of a POJO?  That's the use case for using a Jax-WS 'Provider' web service, and the book covers this and the client-side equivalent component (Dispatcher.)&lt;br /&gt;&lt;br /&gt;How about if you want to change the message in some way, maybe altering security information?  Interceptors are useful in that case, these are explained.&lt;br /&gt;&lt;br /&gt;RESTful web services are pretty popular, they're in the book as well.  Not only REST, but also how to implement then with XML payloads or JSON.  You're given knowledge of the tools to test all these things, as well.&lt;br /&gt;&lt;br /&gt;So who would I recommend this book to?  I'd say a Java developer either currently using or wanting to use Apache CXF.  The book isn't a complete reference for CXF, but it does introduce all the important topics.  Once introduced, there's enough content to either solve your problem or at least educate you enough to effectively research what remains.&lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href="https://www.packtpub.com/apache-cxf-web-service-development/book"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy Jax-*'ing!&lt;br /&gt;&lt;br /&gt;Rick&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-7365239384401732144?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/7365239384401732144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=7365239384401732144' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/7365239384401732144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/7365239384401732144'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/06/book-review-for-apache-cxf-web-service.html' title='Book Review for &quot;Apache CXF Web Service Development&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-2JRywIh5Pns/TfQKW68mHEI/AAAAAAAAAJI/qjZVnSfSBGc/s72-c/CXF.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-3541226131418051971</id><published>2011-05-27T21:51:00.002-05:00</published><updated>2011-05-27T21:54:48.869-05:00</updated><title type='text'>Book Review for "Apache Wicket Cookbook"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-w_B-pERBEPs/TeBjXxYqFtI/AAAAAAAAAIs/fu59IwUtSeo/s1600/WicketBook.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 90px; height: 113px;" src="http://4.bp.blogspot.com/-w_B-pERBEPs/TeBjXxYqFtI/AAAAAAAAAIs/fu59IwUtSeo/s200/WicketBook.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5611594395748538066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Have you heard of Apache Wicket?  It's a web framework that tries hard to eliminate all the XML configuration you see in most modern application frameworks.  The developer produces two primary flavors of artifacts-- Java classes and HTML pages, and with these two your application is built.  If this sounds interesting, you probably &lt;span style="font-weight:bold;"&gt;don't&lt;/span&gt; need to see this new book from Packt.&lt;br /&gt;&lt;br /&gt;You may be wondering why I wrote that you don't need to see the "Apache Wicket Cookbook" if you found the description of Wicket interesting.  The reason I wrote that is because this book is going to be of very little value to someone who's just found out about Wicket.  But if the reader already knows the basics-- then this book is a powerful resource.&lt;br /&gt;&lt;br /&gt;There's very little introductory material.  The book is honest about this in stating the target audience-- it says if you've already written a couple of Wicket applications, then you're a good candidate to pick this one up.  I agree.  If you don't know the basics of Wicket, a lot of this will be over your head.&lt;br /&gt;&lt;br /&gt;Still reading?  Then you might be familiar with writing Wicket applications already, and might wonder what you'll find in this book.  I'd summarize it by saying there's plenty of material for someone charged with writing real-world applications in Wicket.  A few examples:  Securing your application, editing pairs of fields based on values in each, displaying data in the form of charts and tables that are sorted when you click a header.  Still want more?  How about integration with Spring, Seam, and JPA?  The book reads like a bunch of answers to support questions, provided by someone who really knows Wicket but doesn't have time to explain all the theory behind the answers.  There's just a flat out explanation of what to do, backed by code examples that quickly import into Eclipse and run flawlessly.  If you want to understand *why* what you're doing works, it's going to be up to you to follow up with Wicket reference material to see why.  High level overviews are not in the very direct path this book takes.&lt;br /&gt;&lt;br /&gt;The book is written by Igor Vaynberg, who is probably the most prolific contributor to Wicket, so you know the author knows his stuff.  The use cases are supposed to be issues that real-world users will need to conquer, and again Igor is a good source for these.  (He is well regarded in the Wicket community.  I encourage you to consult your friend Google to check this out.)  Igor knows what people are wanting to do, and he knows how to do it.  This book is a collection of that kind of information.&lt;br /&gt;&lt;br /&gt;The book is written in Packt's "Cookbook" format, which is exactly what this book needed.  It presents a problem, tells you the steps to find the answer, then briefly (very briefly) explains how it works.  In-depth research is up to you. &lt;br /&gt;&lt;br /&gt;Final verdict:  If you're an active Wicket user, you should buy a copy of this book.  It'll pay for itself the first time you need to solve one of the roughly 50 scenarios it covers.  You'll have the right answer, the first time, and a running example to help you understand it.  If your sense of curiosity demands that you understand all the details of how those parts work-- that's extra credit research for you, dear reader.  But your site will have the functionality you seek in short order.&lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href="https://www.packtpub.com/apache-wicket-cookbook/book"&gt;here&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;Happy Wicketing!&lt;br /&gt;&lt;br /&gt;Rick&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-3541226131418051971?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/3541226131418051971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=3541226131418051971' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3541226131418051971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3541226131418051971'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/05/book-review-for-apache-wicket-cookbook.html' title='Book Review for &quot;Apache Wicket Cookbook&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-w_B-pERBEPs/TeBjXxYqFtI/AAAAAAAAAIs/fu59IwUtSeo/s72-c/WicketBook.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-3454246456848302525</id><published>2011-05-15T14:17:00.003-05:00</published><updated>2011-05-15T14:24:53.257-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Camel'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Book Review for "Camel in Action"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-LMW2NSEsS4A/TdAnPuOyIII/AAAAAAAAAIk/TdoMz6KGVGo/s1600/Camel_In_Action.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 149px; height: 193px;" src="http://3.bp.blogspot.com/-LMW2NSEsS4A/TdAnPuOyIII/AAAAAAAAAIk/TdoMz6KGVGo/s200/Camel_In_Action.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5607024687137824898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Book review for 'Camel in Action'&lt;br /&gt;&lt;br /&gt;The Manning 'In Action' books are usually good ones-- readable, thorough, and suitable for use as both an introduction and a reference.  This book is no exception.&lt;br /&gt;&lt;br /&gt;The topic is Camel, Apache's open source framework for implementing Enterprise Integration Patterns.  If you're wondering what that means, you might consider Camel an 'ESB Lite'.  It's not a true ESB, I think mostly because it doesn't have it's own hosting runtime, but beyond that it does many of the things an ESB does.&lt;br /&gt;&lt;br /&gt;Camel can be used to route messages.  So let's say you want to listen on a JMS queue and use the results to call a web service.  No problem for Camel, the book tells you how.  Likewise, if you want to do some message transformation-- maybe read in a file, split it into lines, enhance each line with some stuff you get from a database-- no problem.  The book does a great job of demonstration through simple examples, which I found to run well and easily.  Warning:  if you're not a Maven user yet (I think Maven is beginning to definitively prevail in the Ant/Maven battle), you'll want to brush up a little as it's used exclusively throughout the example suite.&lt;br /&gt;&lt;br /&gt;The book is exhaustive in it's coverage of Camel-related topics.  Sometimes tech books are written in such a way that development-centric topics are given great coverage, while operational issues are not.  This is not the case here-- it's obvious the authors of this book have spent some time deploying, running, and monitoring applications as well as writing them.  &lt;br /&gt;&lt;br /&gt;The source code that comes with the book is well organized, clean, and relevant for the chapter material it augments.  Most important, it runs out of the box.&lt;br /&gt;&lt;br /&gt;Camel basics (routes, Java and Spring configuration, the Enterprise Integration patterns) are all covered in more-than-adequate fashion.  These are basic but necessary topics any good Camel source should provide.  Where this book excels is in the ancillary material:  management, monitoring, threading, transactions, testing, deployment in popular containers, etc.  Very thorough, it's why this book is 550 text-packed pages long.&lt;br /&gt;&lt;br /&gt;If I had one complaint about the book, it would be that the chapter ordering wasn't quite to my liking.  The reader is given plenty of example material (including some advanced topics like transactions and concurrency) long before the basics of setting up a user-concocted "Hello World" project are presented.  This is a minor nit, though, and it does not detract from the overall excellence of the book.&lt;br /&gt;&lt;br /&gt;Bottom line:  this is a must-have resource for any user of Apache Camel.  It can take you from ground-level to production use, and will no doubt serve as a valuable resource for as long as you use Camel.&lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href="http://www.manning.com/ibsen/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy Camel'ing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-3454246456848302525?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/3454246456848302525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=3454246456848302525' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3454246456848302525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3454246456848302525'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/05/book-review-for-camel-in-action.html' title='Book Review for &quot;Camel in Action&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-LMW2NSEsS4A/TdAnPuOyIII/AAAAAAAAAIk/TdoMz6KGVGo/s72-c/Camel_In_Action.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-2786066034765741737</id><published>2011-05-05T21:47:00.004-05:00</published><updated>2011-05-06T06:52:46.235-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Book Review for 'BackTrack 4:  Assuring Security by Penetration Testing".</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-DOH9r_K1S6o/TcNh9A4TuYI/AAAAAAAAAIc/aUhY0MJ_aJw/s1600/3944OS_BackTrack%2B4%2BAssuring%2BSecurity%2Bby%2BPenetration%2BTesting.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 125px; height: 152px;" src="http://1.bp.blogspot.com/-DOH9r_K1S6o/TcNh9A4TuYI/AAAAAAAAAIc/aUhY0MJ_aJw/s200/3944OS_BackTrack%2B4%2BAssuring%2BSecurity%2Bby%2BPenetration%2BTesting.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5603430062215117186" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Book Review for 'BackTrack 4:  Assuring Security by Penetration Testing".  White hats, get a copy now before the bad guys snap them all up.&lt;br /&gt;&lt;br /&gt;I've just finished reading Packt Publishing's new book "&lt;a href="http://www.packtpub.com/backtrack-4-assuring-security-penetration-testing/book"&gt;BackTrack 4: Assuring Security by Penetration Testing&lt;/a&gt;".  The book is meant to be a how-to guide for using BackTrack 4, a freely available Linux distribution whose sole purpose is to provide a platform for a hacker's arsenal.  I'd never looked at Backtrack before, but believe me, it's a site to behold.&lt;br /&gt;&lt;br /&gt;The distribution, once downloaded, can be installed on a machine or run as a 'live' DVD.  (The book covers all this, naturally.)  Once booted, the user has a *whole operating system* loaded to the gills with tools meant for breaking into computer networks and vulnerable hosts.  It is frightening in it's scope.&lt;br /&gt;&lt;br /&gt;The book is written for good guys, of course, so it includes a good amount of text that's of use to security professionals.  It covers how you should make your agreements with the system owners you are assessing, the kinds of reports you should prepare, and a very useful framework for disciplined testing.  The framework breaks penetration testing into discrete phases.&lt;br /&gt;&lt;br /&gt;The first 'hacking' phase is &lt;span style="font-weight:bold;"&gt;Information Gathering&lt;/span&gt;.  Here the user is introduced to about a dozen tools that can be used to find domain names, IP addresses, host names, and other information about the target environment.&lt;br /&gt;&lt;br /&gt;The next phase is &lt;span style="font-weight:bold;"&gt;Target Discovery&lt;/span&gt;.  Here the user finds hosts and identifies operating systems.  Again, about a dozen different tools are presented.&lt;br /&gt;&lt;br /&gt;The next phase is &lt;span style="font-weight:bold;"&gt;Target Enumeration&lt;/span&gt;.  This phase allows the user to discover which ports are available, which services are offered, and what kinds of VPN are in use.  &lt;br /&gt;&lt;br /&gt;Once all this information is gathered, the user can proceed to &lt;span style="font-weight:bold;"&gt;Vulnerability Mapping&lt;/span&gt;.  Here, another good sized set of applications are available to help the user determine what kinds of vulnerabilities exist in the target machines.  This logically leads into the chapters on &lt;span style="font-weight:bold;"&gt;Target Exploitation, Privilege Escalation, and Maintaining Access&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Of course, no good book on penetration technique would be complete without a chapter on &lt;span style="font-weight:bold;"&gt;Social Engineering&lt;/span&gt;, and so we have one here.&lt;br /&gt;&lt;br /&gt;So what did I think of the book?  At first glance, honestly, I was unimpressed.  Just picking up the book and thumbing through it revealed a great number of very brief introductions to tools.  You'd see many pages where a tool is introduced, then given just a page or two of instructions on how to invoke it and what output to expect from it.  It was only after I started actually reading the book that I realized the tools were neatly categorized (as explained above) and that the brevity of the introduction was soley because the authors already filled 350 pages and probably simply couldn't practically include more detail.&lt;br /&gt;&lt;br /&gt;I've never intentionally hacked another system, but I have at times used tools like WireShark to observe network traffic as I sought to untangle some security problem or communications glitch.  This book has provided me with several ideas for similarly useful tools, and introduced me to several I have no intention of ever using.  (Unless I should decide to one day become a security consultant, and offer to hack into systems for profit.  In that case, I'll make myself familiar with all the tools in the BackTrack toolkit.)&lt;br /&gt;&lt;br /&gt;If your livelihood depends on a secure site, you probably ought to get a copy of this book for your in-house penetration tester.  It's an eye-opener.&lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href="http://www.packtpub.com/backtrack-4-assuring-security-penetration-testing/book"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy (ethical) Hacking!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-2786066034765741737?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/2786066034765741737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=2786066034765741737' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2786066034765741737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2786066034765741737'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/05/book-review-for-backtrack-4-assuring.html' title='Book Review for &apos;BackTrack 4:  Assuring Security by Penetration Testing&quot;.'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-DOH9r_K1S6o/TcNh9A4TuYI/AAAAAAAAAIc/aUhY0MJ_aJw/s72-c/3944OS_BackTrack%2B4%2BAssuring%2BSecurity%2Bby%2BPenetration%2BTesting.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-5461391684609229502</id><published>2011-04-23T12:20:00.004-05:00</published><updated>2011-04-23T12:30:25.874-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Scripts'/><title type='text'>Tools to learn somebody else's codebase</title><content type='html'>Writing code can be a difficult task, but reading it is usually even more challenging.  Here's a quick tip to help you the next time you want to make sense of a bunch of code you don't yet know.&lt;br /&gt;&lt;br /&gt;My day job is working support for JBoss.  If you haven't noticed, JBoss doesn't let much moss collect-- projects are constantly moving, improving and springing up from the ground.  If you want to keep up in this environment, you'd better learn to read code and digest it quickly-- and that's the need that produced this solution.&lt;br /&gt;&lt;br /&gt;One of the things I like to do is add a quick function to my .profile (we'll see how to use this in a bit):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# Use this with 'tree'.  Works with wildcards&lt;br /&gt;getF() { THF=`find . -name $1`;export THF; /usr/bin/gedit $THF &amp; }&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;I'd use this in conjunction with Linux's excellent '&lt;span style="font-style:italic;"&gt;tree&lt;/span&gt;' command.  Use '&lt;span style="font-style:italic;"&gt;tree&lt;/span&gt;' to quickly see what the source base looks like, then use &lt;span style="font-style:italic;"&gt;getF&lt;/span&gt;() to easily zero in on files that are of interest.&lt;br /&gt;&lt;br /&gt;Let's go with an example.  Today I'm looking at the just-released droolsjbpm-integration package (which looks good, and runs some neat examples out of the box, by the way.)  So I might start like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;rick:~/Tools/droolsjbpm-integration-distribution-5.2.0.M2/examples$ tree&lt;/span&gt;&lt;br /&gt;.&lt;br /&gt;|-- binaries&lt;br /&gt;|   `-- droolsjbpm-integration-examples-5.2.0.M2.jar&lt;br /&gt;|-- runExamples.bat&lt;br /&gt;|-- runExamples.sh&lt;br /&gt;`-- sources&lt;br /&gt;    |-- pom.xml&lt;br /&gt;    `-- src&lt;br /&gt;        |-- main&lt;br /&gt;        |   |-- java&lt;br /&gt;        |   |   `-- org&lt;br /&gt;        |   |       `-- drools&lt;br /&gt;        |   |           `-- examples&lt;br /&gt;        |   |               |-- broker&lt;br /&gt;        |   |               |   |-- BrokerExample.java&lt;br /&gt;        |   |               |   |-- Broker.java&lt;br /&gt;        |   |               |   |-- BrokerServices.java&lt;br /&gt;        |   |               |   |-- events&lt;br /&gt;        |   |               |   |   |-- EventFeeder.java&lt;br /&gt;        |   |               |   |   |-- EventGenerator.java&lt;br /&gt;        |   |               |   |   |-- EventImpl.java&lt;br /&gt;        |   |               |   |   |-- Event.java&lt;br /&gt;        |   |               |   |   |-- EventReceiver.java&lt;br /&gt;        |   |               |   |   |-- EventSource.java&lt;br /&gt;        |   |               |   |   `-- StockTickPersister.java&lt;br /&gt;        |   |               |   |-- misc&lt;br /&gt;        |   |               |   |   `-- Utils.java&lt;br /&gt;        |   |               |   |-- model&lt;br /&gt;        |   |               |   |   |-- Action.java&lt;br /&gt;        |   |               |   |   |-- Company.java&lt;br /&gt;        |   |               |   |   |-- CompanyRegistry.java&lt;br /&gt;&lt;br /&gt;(More deleted.  You get the picture, though.  Get the picture.... get it?  Hee hee.)&lt;br /&gt;&lt;br /&gt;So we immediately get a view of what's in the codebase.  You might see how much code is out there.....&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;rick:~/Tools/droolsjbpm-integration-distribution-5.2.0.M2/examples$ find sources -name *.java | wc -l&lt;/span&gt;&lt;br /&gt;46&lt;br /&gt;&lt;br /&gt;So only 46 java artifacts.  Pretty reasonable.&lt;br /&gt;&lt;br /&gt;If a codebase has a lot of interfaces and inheritence, it can be a little tougher to read.  So we might have a look at how much of that is out there....&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;rick:~/Tools/droolsjbpm-integration-distribution-5.2.0.M2/examples$ find sources -name *.java |xargs egrep 'implements|extends' |wc -l&lt;/span&gt;&lt;br /&gt;24&lt;br /&gt;&lt;br /&gt;Hmmm, that seems a little rich, for only 46 java files.  It could be that you're working with a framework built to allow lots of things like plug-ins and alternative implementation (in a good case) or it could be that you're reviewing code written by someone who reads too many academic textbooks and doesn't really grasp the proper use of such abstractions.  In this case, I'm confident it's the first case. &lt;br /&gt;&lt;br /&gt;OK, so now let's see how that function we put in .profile can be put to use:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;rick:~/Tools/droolsjbpm-integration-distribution-5.2.0.M2/examples$ getF Cell*&lt;/span&gt;&lt;br /&gt;[3] 2514&lt;br /&gt;&lt;br /&gt;Immediately, my text editor pops up showing me Cell.java, CellState.java, CellGridCanvas.java, CellGridImpl.java, and CellGrid.java.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-qGZDz6Rbhh4/TbMLsWgpXsI/AAAAAAAAAIU/Nmw93UvTRRk/s1600/GEdit.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 128px;" src="http://4.bp.blogspot.com/-qGZDz6Rbhh4/TbMLsWgpXsI/AAAAAAAAAIU/Nmw93UvTRRk/s200/GEdit.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5598831618336317122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I grant you, much of this is also available via a nice IDE like JBDS or Eclipse, but sometimes (well, frequently, really) it's hard to wrangle the projects into an IDE without doing a bunch of classpath setup, dependency downloads, etc.&lt;br /&gt;&lt;br /&gt;Happy Code Reading!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-5461391684609229502?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/5461391684609229502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=5461391684609229502' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5461391684609229502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5461391684609229502'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/04/tools-to-learn-somebody-elses-codebase.html' title='Tools to learn somebody else&apos;s codebase'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-qGZDz6Rbhh4/TbMLsWgpXsI/AAAAAAAAAIU/Nmw93UvTRRk/s72-c/GEdit.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-5091791740647794223</id><published>2011-04-16T21:03:00.004-05:00</published><updated>2011-04-16T21:09:36.655-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R Graphing'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Book Review for "R Graphs Cookbook"</title><content type='html'>Quick!  What do James Gosling, Bill Gates, Linus, Bjarne, Larry Ellison, Uncle Bob, Martin Fowler, and Gavin King all have in common?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-K3LivdDVNmk/TapLPW1dpxI/AAAAAAAAAII/MD2y5iyXcG0/s1600/Graphs3.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 187px;" src="http://3.bp.blogspot.com/-K3LivdDVNmk/TapLPW1dpxI/AAAAAAAAAII/MD2y5iyXcG0/s200/Graphs3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5596368214161205010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;These are all graphs I produced with the book's samples.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-Y1fXVvXbxtk/TapLAudTCnI/AAAAAAAAAIA/Dwj6IiOezTI/s1600/Graphs2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://2.bp.blogspot.com/-Y1fXVvXbxtk/TapLAudTCnI/AAAAAAAAAIA/Dwj6IiOezTI/s200/Graphs2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5596367962804259442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-fGYJqHda6t4/TapK3xWMf3I/AAAAAAAAAH4/sg2ria8WPL4/s1600/Graphs1.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 196px; height: 200px;" src="http://4.bp.blogspot.com/-fGYJqHda6t4/TapK3xWMf3I/AAAAAAAAAH4/sg2ria8WPL4/s200/Graphs1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5596367808960954226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;They all know how to produce compelling presentations.  While some of the above are good programmers (even excellent ones), we don't know of them because of that.  We know of them because they influence our thinking.  Every programmer who advances through the ranks eventually gets to the point where they need to influence people as well as sling code.  (It's all about scalability.  One person can only do so much-- but if that one person can effectively influence a group of others-- then the reach of that coder is greatly expanded.)  So too it should be with you-- you need to learn how to produce artifacts that will influence people and bolster your arguments.&lt;br /&gt;&lt;br /&gt;To that end, I am really pleased with "R Graphs Cookbook" by Packt.  If you haven't used R yet-- regardless of whether you read this book or not-- you need to download this excellent open source statistical package and get yourself acquainted.  Search this blog for examples, I've posted a few.  R makes statistics easy, and statistics can lend assistance to everything from log analysis to garbage collection optimization.  This book is about R's excellent graphical capabilities, though.&lt;br /&gt;&lt;br /&gt;This book doesn't teach R, and it's target audience is an experienced R programmer.  I really think even an R novice could use this book to produce impressive graphs, though-- each recipe is very short and shows what's needed to produce the graph you're after.  By the way, I think one of the best parts of this book is the available source code-- you don't even have to type in the examples, and the sample data is invaluable.  By the way, studying the way the data is structured is highly educational. I'd strongly recommend examining the data with each recipe to maximize your learning.&lt;br /&gt;&lt;br /&gt;The book teaches you how to draw all kinds of graphs: scatter plots, line plots, pie graphs, bar charts, histograms, box and whisker plots, heat maps, contour maps and regular maps.  The 'regular maps' covers maps of the world, a country, a state, etc.  &lt;br /&gt;&lt;br /&gt;If I had a wish to improve this book, I'd wish for a comprehensive index that covers every page where a specific function or argument was used.  Sometimes functions are demonstrated in one graph recipe that could be useful in making a different kind of graph-- but if you don't know where to look for the example, it could be difficult to find.  It's an omission I can live with, though.&lt;br /&gt;&lt;br /&gt;This book will get a spot on my reference shelf.  For those occasions where I need to produce the proverbial picture worth a thousand words, I know where I'll reach.&lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href="https://www.packtpub.com/r-graph-cookbook/book"&gt;here&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;Happy Graphing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-5091791740647794223?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/5091791740647794223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=5091791740647794223' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5091791740647794223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5091791740647794223'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/04/book-review-for-r-graphs-cookbook.html' title='Book Review for &quot;R Graphs Cookbook&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-K3LivdDVNmk/TapLPW1dpxI/AAAAAAAAAII/MD2y5iyXcG0/s72-c/Graphs3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-8087927765270126168</id><published>2011-04-07T21:14:00.005-05:00</published><updated>2011-04-07T21:40:34.608-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R LogReading'/><title type='text'>Visualizing a Log's Timeline (without going blind reading text)</title><content type='html'>&lt;div&gt;&lt;b&gt;How to Visualize a Log Timeline&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Have you ever tried to read a massive log file?  It can be difficult.  Logs from multithreaded servers (or worse, clusters) can be miserable to work with.  Sometimes a little visualization can help.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Log reading in small single threaded applications is easy.  You just read through the log until you see the ERROR, then back up from there to see what went wrong.  But what if your server is multithreaded?  Then it gets a little more difficult.  Or if you're dealing with distributed components like messaging servers and users of those servers.  Things can also be ugly there.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sometimes it's just fun to visualize data, looking for patterns.  So how can you do this easily?  I like to use R.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's take an example.  Say you're working with JBoss AS 7, and your log looks something like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2011-03-20 21:22:38,854 DEBUG [org.jboss.logging.Log4jService] Installed System.out adapter&lt;/div&gt;&lt;div&gt;2011-03-20 21:22:38,855 DEBUG [org.jboss.logging.Log4jService] Installed System.err adapter&lt;/div&gt;&lt;div&gt;2011-03-20 21:22:38,859 DEBUG [org.jboss.logging.Log4jService] Added ThrowableListener: org.jboss.logging.Log4jService$ThrowableListenerLoggingAdapter@1815338&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pretty dry, right?  Working with this log, I'd probably go about visualizing it by computing 2 fields and extracting one for convenience:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;A timestamp field, formatted so it's easily sortable.  You probably could do this in R, or even with shell script utilities, but I took the easy road for this one and used python to work my log for me.  &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;A numeric value that maps to the log severity.  0 for 'TRACE', 1 for 'DEBUG', and so on for INFO, WARN and ERROR.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;For readability, I also extracted the text value of the log level.  Shame on me for carrying duplicate data, but it makes the extract file more convient to read.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So the first 4 lines of my extract file look like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;TimeStamp LogCode LogLevel&lt;/div&gt;&lt;div&gt;76958854 2 DEBUG&lt;/div&gt;&lt;div&gt;76958855 2 DEBUG&lt;/div&gt;&lt;div&gt;76958859 2 DEBUG&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The header line is necessary for the R script.  I'm sure you would've figured this out, but the first field was calculated by taking the 'hours' value (21 in the first line above) and multiplying it by 60 * 60 * 1000.  That was added to the 'minutes' value (22 above) by 60 * 1000.  That was added to 38 * 1000, and that was added to 854.  As I said above, python works great for that.  If you're able to do that quickly in a bash script, my hat's off to you.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But I digress.  So we've got our extract file, now to visualize it.  Just run it past an R script that reads something like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;logData &amp;lt;- read.table("my3FiledExtractFile.txt", header=TRUE)&lt;/div&gt;&lt;div&gt;summary (logData)&lt;/div&gt;&lt;div&gt;png("Graph.png", res=200, height=1200, width=1200)&lt;/div&gt;&lt;div&gt;plot (jitter(logData$TimeStamp), logData$LogLevel,&lt;/div&gt;&lt;div&gt;col="blue",&lt;/div&gt;&lt;div&gt;xlab="Time",&lt;/div&gt;&lt;div&gt;ylab="Log Level", yaxt='n')&lt;/div&gt;&lt;div&gt;axis(2, c(1, 2, 3, 4, 5))&lt;/div&gt;&lt;div&gt;rug(logData$TimeStamp)&lt;/div&gt;&lt;div&gt;dev.off()&lt;/div&gt;&lt;div&gt;q()&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, the summary() output will provide you with some interesting statistics:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;summary (logData)&lt;br /&gt;   TimeStamp           LogCode       LogLevel    &lt;br /&gt; Min.   :76958854   Min.   :2.000   DEBUG:31126  &lt;br /&gt; 1st Qu.:76997498   1st Qu.:2.000   ERROR:   61  &lt;br /&gt; Median :77043075   Median :2.000   INFO :  647  &lt;br /&gt; Mean   :77096907   Mean   :2.027   WARN :    7  &lt;br /&gt; 3rd Qu.:77236122   3rd Qu.:2.000                &lt;br /&gt; Max.   :77320903   Max.   :5.000 &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;    &lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So in an instant we can see what's in this log we're dealing with.   But that's not the visualization we're looking for, that's what we see below.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-lrDc5zQl-vI/TZ5xUlsTHcI/AAAAAAAAAHw/7X8XuZCgr4g/s1600/Graph.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://2.bp.blogspot.com/-lrDc5zQl-vI/TZ5xUlsTHcI/AAAAAAAAAHw/7X8XuZCgr4g/s320/Graph.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5593032385769971138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Isn't that cool?  We can see we start out with a bunch of DEBUG messages (the heavy line at the bottom), then get our first WARN (the lonely first dot on level 3) , a bunch of more DEBUGs, a bunch of WARNs and then our first ERROR.  The timeline reads from left to right, the error levels progress upward for the various levels.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think data visualization is cool, and I intend to learn more about it to help me draw information from raw data sources.  To that end, I've been working with Packt's "&lt;a href="https://www.packtpub.com/r-graph-cookbook/book"&gt;R Graphs Cookbook&lt;/a&gt;", and will provide a book review here soon.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy Visualizing!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-8087927765270126168?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/8087927765270126168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=8087927765270126168' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/8087927765270126168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/8087927765270126168'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/04/visualizing-logs-timeline-without-going.html' title='Visualizing a Log&apos;s Timeline (without going blind reading text)'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-lrDc5zQl-vI/TZ5xUlsTHcI/AAAAAAAAAHw/7X8XuZCgr4g/s72-c/Graph.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-4723906512579439196</id><published>2011-03-18T21:04:00.002-05:00</published><updated>2011-03-18T21:08:48.404-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Book Review for Android User Interface Development:  Beginner's Guide</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Book review for "Android User Interface Development:  Beginner's Guide"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This book teaches Android UI development in Packt's 'Cookbook' style.  The book is written in a very understandable way, yet still teaches good UI design in reasonable depth.  It covers technical aspects of UI development (use of widgets, themes, animation, styling) as well as development practices (how to validate input).&lt;br /&gt;&lt;br /&gt;If you haven't seen a Packt Cookbook yet, it's a book primarily broken into recurring sections with titles "Time for Action", "What Just Happened" and "Have a Go, Hero".  "Time for Action" is a series of instructions that spell out exactly what to do for a sample scenario.  "What Just Happened" follows up with an explanation of why the reader was asked to execute the instructions.  "Have a Go, Hero" is a section challenging the reader to extend the spoon-fed instructions by implementing a next-step challenge.  This style of writing emphasizes hands-on knowledge transfer without a lot of verbose theory, so it'll be good for readers who like to learn as they code.&lt;br /&gt;&lt;br /&gt;Be aware this is not a book on Android development in the general sense.  There is some introductory material here: installation and configuration of the SDK, a first rudimentary project, a little other ground-level material.  But largely this book concentrates on UI aspects.  To put that in context, if this were a book in the Enterprise Java workspace, it'd be entirely about JSF and have not much on EJBs or JMS.  (I'm not sure if that's a good parallel, but I'm sure you get the idea.)&lt;br /&gt;&lt;br /&gt;The sample code is well laid out and is structured in the same way the SDK examples are structured.  (So if you're learning the basics of Android development by following the SDK doc, you'll be good with the book samples.)  The topics chosen for inclusion in the book are a good representation of the kinds of UI issues an Android developer is likely to encounter.  So what exactly can you expect to learn from this book?  Here's an incomplete list, but one that shows the kinds of things that are covered:&lt;br /&gt;&lt;br /&gt;- How to present a question to the user&lt;br /&gt;- How to receive an answer&lt;br /&gt;- How to handle list choices (multi-select?  single?)&lt;br /&gt;- Headers and Footers&lt;br /&gt;- Making a photo gallery&lt;br /&gt;- Handling Date/Time&lt;br /&gt;- Layouts (Swing users will find this familiar)&lt;br /&gt;- Validating inputs&lt;br /&gt;- Animation&lt;br /&gt;- Styling (i.e. changing a button's appearance)&lt;br /&gt;- Application themes&lt;br /&gt;&lt;br /&gt;If this list makes you think the book teaches a mix of programming skills and graphic design, I wouldn't say that you're wrong.  (I've always been a programmer type, and never much of a polished UI presenter, so I learned some new things in the styling and theme categories.)&lt;br /&gt;&lt;br /&gt;Who would benefit from reading this book?  Android developers who want to write a professional looking application.  If you're like me, your first instinct is probably going to be to just run out and read the SDK doc to hack together some sort of functional application.   But if we want people other than ourselves to like it, then we'd better be sure it looks, feels, and acts like the user expects.  That's the place where the book brings value-- teaching us how to make our Android apps pretty.&lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href="https://www.packtpub.com/android-user-interface-development-beginners-guide/book"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy (mobile) coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-4723906512579439196?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/4723906512579439196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=4723906512579439196' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4723906512579439196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4723906512579439196'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/03/book-review-for-android-user.html' title='Book Review for Android User Interface Development:  Beginner&apos;s Guide'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-6715451410907881859</id><published>2011-02-16T20:05:00.002-06:00</published><updated>2011-02-16T20:15:18.208-06:00</updated><title type='text'>Win a year's worth of Packt e-Library</title><content type='html'>Just a quick note tonight to pass along some news from my friends at Packt.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This month is IBM month at Packt-- books are offered at a discount, and every Tuesday they offer a chance to win a year of PacktLib.  Wouldn't that be great!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you're using IBM products, give it a look!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;IBM Tuesday can be found &lt;a href="http://www.packtpub.com/article/ibm-tuesday"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Tuesday competition can be found &lt;a href="http://www.packtpub.com/article/ibm-tuesday-competition"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy Reading, and Good Luck!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-6715451410907881859?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/6715451410907881859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=6715451410907881859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/6715451410907881859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/6715451410907881859'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/02/win-years-worth-of-packt-e-library.html' title='Win a year&apos;s worth of Packt e-Library'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-9031446146249208405</id><published>2011-02-12T15:34:00.002-06:00</published><updated>2011-02-12T15:40:00.484-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jbpm'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Book Review for 'jBPM Developer Guide'</title><content type='html'>&lt;div&gt;&lt;i&gt;&lt;b&gt;jBPM is a mature and popular process management framework.  This book can help you get beyond the basics so you can write useful real-world applications.&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;jBPM is a well established process management framework.  BPM (Business Process Management) is a software discipline that allows a developer to build applications as a series of steps.  Under ideal circumstances, designers drag and drop pictures onto a graph that later become a business process definition.  The process centers around some business activity.  For instance, an 'Expense Report' process might involve the steps:  Gather expense information, Management Review, Approval/Denial branch and Produce check.  Here's a sample picture to let you know what such a graph might look like:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-sxQByL9TbtI/TVb9dXhnIBI/AAAAAAAAAHM/ArFIwZD-jfE/s1600/jBPM_1.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 215px;" src="http://1.bp.blogspot.com/-sxQByL9TbtI/TVb9dXhnIBI/AAAAAAAAAHM/ArFIwZD-jfE/s320/jBPM_1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5572920269890592786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;jBPM is referenced in quite a few SOA books, and with good reason.  It's a really good framework, and it's been in use for a lot of years, so it's feature rich and stable.  jBPM can be used in a lightweight manner if your situation allows it (that is, just by including the right .jars, you can skip the designer part and in-line some XML in your application code.  That's probably the lightest configuration, and the one many SOA books describe.)  But what if you need to do some stuff not covered, like involve humans in the process?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Human interaction is a little trickier.  With only automated activities, your BPM process can be handled something like b-flat BPEL.  You can just describe the series of tasks (java classes and methods) you want to be invoked, and the framework executes them, bang, bang, bang.  But what if you want someone to look at a web page and provide you some feedback?  Now you're in the territory this book is covering.  It goes beyond the basic usages, and tells you what you're really going to have to know.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You'd better be ready to download and read the book's source code, because without it you really won't get as much out of the book.  The author includes and explains the relevant text in-line in the book, but you really need to view and understand all the pieces of the project to learn to piece together workable applications.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book is true to it's title in that it is definately a developer's guide.  The reader is coached through building their own Java-powered state machine in the early chapters, sort of a mini-jBPM.  This is a good exercise, as it gives insight into how jBPM functions.  Shortly after, the author introduces the development environment, which includes Maven and Eclipse.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The middle chapters deal with jPDL, which is the XML language that powers jBPM.  The language is not complicated and the book does a good job of explaining it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The final chapters work through case studies and explain persistence and enterprise features.  Persistence is important because you'll want your business processes to maintain integrity through server recycles.  Naturally, jBPM makes use of other parts of the JBoss stack like Hibernate, data sources, etc.  so these are covered in sufficient detail for jBPM use.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, what's my overall opinion of this book?  I'd say it's a good resource, and would recommend it to anyone who's going to write a jBPM application beyond an example "Hello World".  The book isn't perfect-- it's not written in an easy to read manner.  (I suppose that's acceptable, given this is a book for developers.)  This book was written near the end of life for jBPM, which will be JBoss's final supported version for a while yet as the next supported version will be based on the brand-new jBPM 5.  (Which is quite a change from jBPM 3, by the way.)  If you are going to use jBPM 3 (and there are a lot of good reasons why you should), this book is worth the price.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book can be found &lt;a href="https://www.packtpub.com/jboss-business-process-management-jbpm-developer-guide/book"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy Reading!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-9031446146249208405?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/9031446146249208405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=9031446146249208405' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/9031446146249208405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/9031446146249208405'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/02/book-review-for-jbpm-developer-guide.html' title='Book Review for &apos;jBPM Developer Guide&apos;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-sxQByL9TbtI/TVb9dXhnIBI/AAAAAAAAAHM/ArFIwZD-jfE/s72-c/jBPM_1.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-7164378066325849643</id><published>2011-01-15T19:24:00.001-06:00</published><updated>2011-01-15T19:25:16.923-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='osgi felix packt'/><title type='text'>Book Review for "OSGi and Apache Felix 3.0 Beginners Guide"</title><content type='html'>&lt;div&gt;Book review for "OSGi and Apache Felix 3.0: Beginner's Guide"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This book promises to bring a developer from level zero through advanced usage of Apache Felix, a pretty ambitious goal.  Before we get into how well it delivers, let's talk a little about what OSGi and Felix are.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;OSGi is a specification meant to save Java developers deployment and classpath headaches.  If you've ever used Eclipse, you have used OSGi, albeit as a user.  OSGi is bigger than just Eclipse, though-- it's the basis for a whole new class of frameworks, and it's got buy-in from the guys at JBoss, Spring, Apache and others.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;OSGi is meant to alleviate classloader headaches.  It helps keep your deployments clean, allowing you to run application that have dependencies on libraries that might differ in version from what other deployments need.  In other words, you can specify exactly which libs you need, and which versions, and OSGi will manage keeping all the applications happy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This book teaches Apache Felix, which is a pretty mature OSGi implementation.  The cruxt of the book is building, then improving a simple bookshelf application.  Maven2 is used for the build duties, and the author is very generous with providing instruction about how to build your .pom files each step along the way.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Felix (and OSGi are much more than just a runtime container, though.  Felix contains lifecycle startup mechanisms, so these are taught.  You're also given a whole chapter on the shell language Felix provides for control functions.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Beyond that, it's mostly application development done the Felix way.  Even tasks as mundane as logging are different under OSGi, and this book gives insights into all the nooks and crannies you'll need to implement the bookshelf application.  (Note:  I'm sure EVERY nook and cranny isn't explored, but if you follow the clear instructions this book provides you'll end up with a running application.)  The book leads you through an incremental buildup of the app, so you'll add functionality bit by bit as you improve the application.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book ends with a nice-to-have chapter on troubleshooting and a few quick write-ups on the dev environment (Maven and Eclipse) and other topics that should be within reach for the reader.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, what's the verdict?  OSGi coding is not trivial, and isn't something to be taken up lightly.  (It's yet another Java framework to be embraced, complete with it's own set of twists and turns.)  If you're going to learn it, though, this book is a very good from-the-ground-up resource to guide you completely through the learning process.  So if you're going the OSGi path, this is a good place to start.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book can be found &lt;a href="https://www.packtpub.com/osgi-and-apache-felix-3-0-beginners-guide/book"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy Reading!&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-7164378066325849643?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/7164378066325849643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=7164378066325849643' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/7164378066325849643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/7164378066325849643'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/01/book-review-for-osgi-and-apache-felix.html' title='Book Review for &quot;OSGi and Apache Felix 3.0 Beginners Guide&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-4267170889231737663</id><published>2011-01-07T19:01:00.003-06:00</published><updated>2011-01-07T19:15:15.768-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Packt'/><title type='text'>Packt begins publishing Microsoft books</title><content type='html'>Hi all,&lt;br /&gt;&lt;br /&gt;I like to review technical books, and I have reviewed plenty of them from Packt Publishing.  Packt has always been a good provider of material on Open Source topics, but has recently branched out and is now offering Microsoft titles as well.  Enclosed is a brief press release from the folks at Packt, for the benefit of MSFT readers.&lt;br /&gt;&lt;br /&gt;Happy reading, and good luck in the Monday drawings!&lt;br /&gt;&lt;br /&gt;Rick&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;        &lt;style type="text/css"&gt;p { margin-bottom: 0.08in; }a:link { color: rgb(0, 0, 255); }&lt;/style&gt;  &lt;p style="margin-bottom: 0in;"&gt;On Monday the 24&lt;sup&gt;th&lt;/sup&gt; January, 2011 Packt Publishing is issuing five brand new Microsoft Books on a range of different subject matters:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-size:85%;"&gt;Microsoft SQL Server  2008 High Availability&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-size:85%;"&gt;Microsoft Application  Virtualization 4.5&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-size:85%;"&gt;Microsoft Forefront  UAG 2010 Administrator's Handbook&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-size:85%;"&gt;Dynamics AX 2009  Administration&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-size:85%;"&gt;Microsoft Dynamics  Sure Step 2010&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-size:85%;"&gt;(Microsoft SharePoint  2010 Administration Cookbook)&lt;/span&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0in;"&gt;With five Microsoft books published at the end of 2010, the publication of a further five new books all on one day reiterates Packt’s commitment to producing specialist Microsoft book titles, and signifies their position as a top Microsoft publisher.  James Lumsden, the Packt Enterprise Publisher states that “serving the needs of Microsoft professionals is one of our top priorities at Packt, and 2011 promises to be a bumper year. What better way to kick off the New Year than with five exciting new titles on Microsoft Monday!  As always we want to do our utmost to serve you, the reader, so please email us if you have book ideas, general suggestions, or if you just want to offer some feedback.  Have a great 2011”.&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;To mark this milestone Packt is also offering a 25% discount when you purchase two or more Microsoft books throughout January.  And will be running a competition throughout January offering customers the opportunity to win a free 1 year’s subscription to PacktLib every Monday throughout January.&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;For further information on this, and other books published by Packt Publishing, please visit &lt;a href="https://www.packtpub.com/article/exclusive-offer-on-microsoft-books"&gt;this link&lt;/a&gt;.&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang="zxx"&gt;&lt;u&gt;&lt;a href="http://www.packtpub.com/"&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-4267170889231737663?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/4267170889231737663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=4267170889231737663' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4267170889231737663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4267170889231737663'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2011/01/packt-begins-publishing-microsoft-books.html' title='Packt begins publishing Microsoft books'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-1539592250050203276</id><published>2010-12-31T09:34:00.002-06:00</published><updated>2010-12-31T09:40:09.496-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='felix'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>OSGi book preview and press release</title><content type='html'>&lt;span style="font-weight: bold;"&gt;I'm currently reading (and will soon provide a review for) the new OSGi / Apache Felix book from Packt. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;If you've never heard of OSGi, the following press release about the book might help provide some idea what it's all about.  Here's the release:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Build your OSGi applications using Packt's new Apache Felix book&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Packt is pleased to announce OSGi and Apache Felix 3.0 Beginner's Guide, a new book that will help readers to build their very own OSGi applications using the flexible and powerful Felix Framework. Written by Walid&lt;br /&gt;Joseph Gedeon, this book will assist readers to get acquainted with the OSGi concepts in an easy-to-follow manner and build a completely operational real-life application using Felix.&lt;br /&gt;&lt;br /&gt;Apache Felix is an open source implementation of the OSGi Release 4 core framework specification.  Furthermore, the OSGi specifications originally targeted embedded devices and home services gateways, but they are ideally suited for any project interested in the principles of modularity, component-orientation, and/or service-orientation.&lt;br /&gt;&lt;br /&gt;OSGi and Apache Felix 3.0 Beginner's Guide starts off with an introduction to the OSGi Service Platform, its parts and its bundle structure. It then walks users through setting up the Felix framework and their development environment. Additionally, this book explains the operation of the Felix Framework by means&lt;br /&gt;of Gogo and teaches users practical implementation of OSGi, OBR repositories, dependency management, and bundle version management.&lt;br /&gt;&lt;br /&gt;Using this book, developers will be able to discover the practical implementation of important OSGi concepts, understand the use of Maven to build and deploy OSGi bundles, create an OSGi-compliant application, learn the implementation of JSP Web Application Bundles, dive deep into Felix iPOJO, get an overview of the Felix Web Management Console and learn to troubleshoot an OSGi application with ease.&lt;br /&gt;&lt;br /&gt;A relentlessly practical beginner's guide with step-by-step instructions, this book is ideal for Java developers, who wish to learn about writing reusable and network distributable software following the OSGi standards using the famous Felix framework. The book is out now and available from Packt. To read more about it, please visit: &lt;a href="http://www.packtpub.com/osgi-and-apache-felix-3-0-beginners-guide/book"&gt;www.packtpub.com/osgi-and-apache-felix-3-0-beginners-guide/book&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Well, there's the preview.  Watch for a review in the near future!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Happy Holidays!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-1539592250050203276?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/1539592250050203276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=1539592250050203276' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1539592250050203276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1539592250050203276'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/12/osgi-book-preview-and-press-release.html' title='OSGi book preview and press release'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-5683542213050929682</id><published>2010-12-22T20:02:00.002-06:00</published><updated>2010-12-22T20:06:17.546-06:00</updated><title type='text'>Pythonistas -- Packt books discounted this month!</title><content type='html'>Hi all,&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just a quick note for the Python fans-- I've just been informed by my friends at Packt Publishing that they're holding a special on Python books.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Through the month of December, all books and e-books are offered at discounts of up to 30% off.  &lt;/div&gt;&lt;div&gt;More details are available &lt;a href="https://www.packtpub.com/article/exclusive-offer-on-python-books"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Python is a great language, so go buy yourself a Christmas book if you need one!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy e-shopping!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-5683542213050929682?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/5683542213050929682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=5683542213050929682' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5683542213050929682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5683542213050929682'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/12/pythonistas-packt-books-discounted-this.html' title='Pythonistas -- Packt books discounted this month!'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-1179123637354894894</id><published>2010-12-21T21:00:00.008-06:00</published><updated>2010-12-22T20:13:43.372-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='jbpm'/><category scheme='http://www.blogger.com/atom/ns#' term='felix'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Coming Soon:  Apache Felix &amp; jBPM</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jK_3qAYFh-o/TRFq08i2DXI/AAAAAAAAAG0/Z1Abn9_MP-8/s1600/Apache_Felix_OSGi.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 261px; height: 320px;" src="http://1.bp.blogspot.com/_jK_3qAYFh-o/TRFq08i2DXI/AAAAAAAAAG0/Z1Abn9_MP-8/s320/Apache_Felix_OSGi.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5553337273362550130" /&gt;&lt;/a&gt;&lt;br /&gt;OSGi is an interesting topic.  Application server vendors and near-application servers like Spring are making provisions for it in their future offerings.  Apache is helping lead the charge with Felix, an open source OSGi implementation.  I hope to soon review a new book on the basics of OSGi, "OSGi and Apache Felix 3.0 Beginner's Guide" from Packt.  Watch this space for a review in the near future.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another interesting topic is Business Process Management.  I've worked around this one for many years, and have at times used JBoss's JBPM product for my tasks.   I look forward to reading another Packt title, 'jBPM Developer Guide', which promises to hold some good tips for optimal jBPM development.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica neue', Helvetica, Arial, Verdana, sans-serif; color: rgb(255, 255, 255); font-size: 15px; line-height: 18px; "&gt;&lt;h1 class="title" style="margin-bottom: 0px; font-size: 15px; margin-top: 0px; margin-right: 0px; margin-left: 10px; font-weight: normal; padding-top: 5px; padding-right: 0px; padding-bottom: 9px; padding-left: 0px; "&gt;&lt;br /&gt;&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://2.bp.blogspot.com/_jK_3qAYFh-o/TRFrKW5Z2TI/AAAAAAAAAG8/qkFGySwyFag/s320/jBPM.png" style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 259px; height: 320px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5553337641213745458" /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;BTW, how about that crazy upper/lower-case letter treatment for these two books?  Totally coincidental!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The OSGi book can be found &lt;a href="https://www.packtpub.com/osgi-and-apache-felix-3-0-beginners-guide/book"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The jBPM book can be found &lt;a href="https://www.packtpub.com/jboss-business-process-management-jbpm-developer-guide/book"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-1179123637354894894?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/1179123637354894894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=1179123637354894894' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1179123637354894894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1179123637354894894'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/12/coming-soon-apache-felix-jbpm.html' title='Coming Soon:  Apache Felix &amp; jBPM'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_jK_3qAYFh-o/TRFq08i2DXI/AAAAAAAAAG0/Z1Abn9_MP-8/s72-c/Apache_Felix_OSGi.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-2599691192333101685</id><published>2010-12-18T13:14:00.003-06:00</published><updated>2010-12-18T13:24:12.948-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBoss'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Book Review for "Jboss AS 5 Performance Tuning"</title><content type='html'>&lt;div&gt;Let me make one recommendation, right off the bat.  Do not pick this book up in the book store and page through the first chapter and a half before putting it back on the shelf.  If you do that, you'd miss out on what is perhaps the best contemporary JEE tuning book in existence.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first 50 pages are a little slow.  Mostly they cover the author's recommendation for a performance tuning lifecycle, and a handful of open source tools that can be used to assist with performance tuning.  The tools section in particular might lead you to believe the book is light on content-- there are plenty of big screenshots that show you things you could have picked up from the tool's website.  But once you're past the tools section, the fluff ends there.  What lies ahead is pure good stuff, and it will lead you from the O/S clear through the application server and into the application code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The author has a clear bias towards Linux in the writing, but does include some Windows-centric advice in places.  One constant throughout the book is the use of before/after metrics (captured with JMeter, as you are likewise taught to do) to demonstrate the effect some tuning tweak has had.  This is consistent with the stated philosophy of basing things on hard data, not seat-of-the-pants observations.  There are plenty of graphs pulled straight from JMeter, which is consistent with how the author recommends we go about measuring progress.  Clearly, this guy believes in the methdology he suggests we use.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As the title suggests, the book deals mostly with &lt;b&gt;JBoss AS 5 specific tuning&lt;/b&gt; recommendations.  That doesn't mean that's all you get, though.  Nearly everyone should benefit from the O/S advice, and Java users will benefit from a whole chapter on &lt;b&gt;JVM tuning&lt;/b&gt;. &lt;b&gt; Tomcat&lt;/b&gt; and&lt;b&gt; Apache&lt;/b&gt; users will find many good tips in the latter chapters.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book is sliced into layers, as code hosted on an application server would be.  There are sections on the &lt;b&gt;web layer&lt;/b&gt;, &lt;b&gt;EJBs&lt;/b&gt;, &lt;b&gt;JMS&lt;/b&gt;, &lt;b&gt;ORM&lt;/b&gt; (including some good parts about &lt;b&gt;Hibernate&lt;/b&gt;, with cache tuning) and &lt;b&gt;cluster&lt;/b&gt; tuning.  There are separate sections for &lt;b&gt;web frameworks&lt;/b&gt; and &lt;b&gt;web service&lt;/b&gt; based applications, too.  Each of these sections tells you enough about that particular domain to let you know what you want to optimize and how to optimize it.  Don't get me wrong-- there's not enough here to make you a clustering expert, for instance-- but there is enough here to let you know how to tune clustering once you've referred to other doc (i.e. the app server doc) and have something ready to run.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Basically, the book addresses nearly every aspect of what can be tuned and optimized, including in-line recommendations about how the application code should be written.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, who would I recommend this book for?  Here's my list:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Anyone running JBoss AS 5 (Strongly recommend.)&lt;/div&gt;&lt;div&gt;- Developers writing JEE applications (Recommend.  The JVM and O/S sections alone will be good, and other sections lend insites into how JEE application servers work.  Tomcat users would benefit, too.)&lt;/div&gt;&lt;div&gt;- Java developers (Weakly recommend.  The O/S and JVM sections are worthwhile, though.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As for me, I work with JBoss every day, so I'm going to give this one a second read immediately.  That's some of the strongest praise I've got to give.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book can be found &lt;a href="http://www.packtpub.com/jboss-as-5-performance-tuning/book"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy reading, and happy tuning!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Rick&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-2599691192333101685?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/2599691192333101685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=2599691192333101685' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2599691192333101685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2599691192333101685'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/12/book-review-for-jboss-as-5-performance.html' title='Book Review for &quot;Jboss AS 5 Performance Tuning&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-5671007483255053560</id><published>2010-12-09T20:35:00.004-06:00</published><updated>2010-12-09T20:48:03.031-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>JBoss Performance Tuning Book is out!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_jK_3qAYFh-o/TQGSTRKR5VI/AAAAAAAAAGs/Oxwr7qDyNi8/s1600/JBossTuningBook.png"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 258px; height: 320px;" src="http://2.bp.blogspot.com/_jK_3qAYFh-o/TQGSTRKR5VI/AAAAAAAAAGs/Oxwr7qDyNi8/s320/JBossTuningBook.png" alt="" id="BLOGGER_PHOTO_ID_5548877075618850130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The much-anticipated JBoss Tuning book is available now, and my copy is in the mail.&lt;br /&gt;&lt;br /&gt;The book is authored by the same guy who brought us the JBoss 5 Development book, which I liked, so I look forward to reading this one.&lt;br /&gt;&lt;br /&gt;Watch here for a review soon, else buy your copy today &lt;a href="https://www.packtpub.com/jboss-as-5-performance-tuning/book"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy Reading!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-5671007483255053560?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/5671007483255053560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=5671007483255053560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5671007483255053560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5671007483255053560'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/12/jboss-performance-tuning-book-is-out.html' title='JBoss Performance Tuning Book is out!'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_jK_3qAYFh-o/TQGSTRKR5VI/AAAAAAAAAGs/Oxwr7qDyNi8/s72-c/JBossTuningBook.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-6781690698997557192</id><published>2010-12-09T20:16:00.004-06:00</published><updated>2010-12-09T20:44:26.037-06:00</updated><title type='text'>Training Review:  JB325, JBoss for Advanced Developers</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Disclaimer:  &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;I work for JBoss, but I do not work for the training department, nor am I trying to sell you training.  I'm just trying to let you know about a worthwhile class you can attend.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've just finished JB325, a four day live-instructor class.  It was an intense 4 days.  Roughly, here's what was presented:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JBoss architecture&lt;/span&gt;&lt;br /&gt;The inside scoop on how the JMX microkernel and POJO microcontainer act as the framework upon which all the running parts of JBoss are placed.  (Hint:  you can change it all, through configuration files!)    We learned the startup procedure and main abstractions involved, as well as important stuff like classpath isolation techniques.  (Experienced JEE developers will probably recognize the need for these.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;AOP, Invokers, Interceptor stacks&lt;/span&gt;&lt;br /&gt;Several times we discussed AOP in JBoss and the way chain-of-command is used to build stacks of interceptors used throughout the architecture.  The 'Invoker' concept was also thoroughly explained.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JCA, DataSources, and Transactions&lt;/span&gt;&lt;br /&gt;Valuable especially in preparing databases and JMS providers for use.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JBoss Cache, Clustering, and JGroups&lt;/span&gt;&lt;br /&gt;Clustering is easy with JBoss, right out of the box.  This section of the class showed us how it all works and how you can exploit the individual parts if you'd like.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Performance Tuning&lt;/span&gt;&lt;br /&gt;This part alone made the class worth attending.  Java performance tuning knowledge is always useful, we got some great tips here.  (By the way, have a look at the &lt;a href="http://rickwagner.blogspot.com/2010/12/jboss-performance-tuning-book-is-out.html"&gt;blog post&lt;/a&gt; about the new JBoss tuning book.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Security&lt;/span&gt;&lt;br /&gt;As it applies across all the tiers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Messaging&lt;/span&gt;&lt;br /&gt;JBoss Messaging, how it's configured, and how it's used.&lt;br /&gt;&lt;br /&gt;Student workstations were provided.  Students were given the software (including the IDE) and were required to configure their own environments.  Labs were challenging-- sometimes there were some easy parts, sometimes there were significant challenges.&lt;br /&gt;&lt;br /&gt;Lunch was provided and was delicious every day.  (Not relevant, I know.  But if I were shopping around for a class, I'd want to know!)&lt;br /&gt;&lt;br /&gt;The bottom line:  I recommend this class to anyone using JBoss that's got a handle on application basics already.  If you're not sure what goes into a .ear, you're probably not ready yet.  But if you've done your share of development on the 'Boss already, you'd probably like this one.&lt;br /&gt;&lt;br /&gt;Happy learning!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-6781690698997557192?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/6781690698997557192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=6781690698997557192' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/6781690698997557192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/6781690698997557192'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/12/training-review-jb325-jboss-for.html' title='Training Review:  JB325, JBoss for Advanced Developers'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-7107659028164949786</id><published>2010-12-04T08:54:00.002-06:00</published><updated>2010-12-06T11:59:35.458-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>The 'Other' Erlang book</title><content type='html'>&lt;div&gt;Manning has just released a new Erlang title, called '&lt;b&gt;Erlang and OTP in Action&lt;/b&gt;' (available &lt;a href="http://www.manning.com/logan/"&gt;here&lt;/a&gt;).  For quite some time now, there's been a definitive guide to Erlang-- Joe Armstrong's excellent book 'Programming Erlang'.  Well, guess what-- it's time to make a little extra room on the bookshelf, because the Erlang book-o-sphere has just shifted.  There are now two must-have resources for an Erlang programmer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book is divided into three sections.  The first one deals with the basics of Erlang and details about the OTP application framework.  Part two shows how to build a production-worthy application in Erlang.  The third part of the book is about integration and tuning.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Section 1&lt;/b&gt; has chapters that covers the following: basics of Erlang and OTP, Erlang language fundamentals, writing a TCP-based RPC server, OTP and the supervisor model, and graphical tools to help your development efforts.  In my opinion, chapter 1 had some slow spots, but not unbearably slow.  The language chapter is good, in some places better than Joe's book.  The rest of the section is informative and well written.  Section 1 alone would make a decent book on Erlang, but there is much more here.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Section 2&lt;/b&gt; covers building a production application.  The example given is a caching application, designed to increase throughput of a web application.  Topics like logging and event handling are given a chapter, as is the topic of distributed computing in Erlang.  The final chapters of the section cover Mnesia (the Erlang distributed database) and packaging considerations.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Chapters in section 2 generally introduce some high level concepts at the start of the chapter, then weave use of these mechanisms into the application-building storyline, finally providing code that brings the desired functionality into the ever growing demonstration application.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The&lt;b&gt; third section&lt;/b&gt; of the book shows how to integrate with external users via HTTP, how to allow programs written in other languages to communicate with your Erlang code, and how to tune your environment.  It's notable that Java gets a whole chapter on integration, through JInterface (in comparison, Joe's book offers about 4 lines on this topic.  In fairness, that's a much older book, though.)  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Throughout the book, simple illustrations are used to demonstrate key concepts.  I found these to be extremely helpful, as Erlang in general is considerably different than most programming languages.  The delta between Erlang application development and other-language development is an order of magnitude different than something like the difference between Java and Ruby or Python and .Net.  It's got different characteristics and different concepts.  Given these large differences, I really appreciated the illustrations.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book is written with easy-to-understand anecdotes that help the reader grasp the finer points of Erlang craftsmanship.  You definitely get the impression the authors have written 'real' code, and they offer strong direction to guide the reader through constructing application code.  There is a big difference between understanding language syntax and understanding best practices in application construction.  Section 2 in particular is loaded with best practices, and this alone makes this book a worthwhile read for Erlang coders writing production applications.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Probably the best thing I can say about this book is that the authors seem to put the advancement of Erlang above all else.  To bolster that statement, I'd point out that they refer the reader to other Erlang books they may wish to read, and include several mentions of Joe Armstrong, author of what has been the most popular Erlang book.  In my opinion, the authors can afford this indulgence, as this book is strong enough to merit inclusion on the Erlang programmer's bookshelf.  I would recommend this book to any Erlang programmer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Erlang and OTP in Action" can be found &lt;a href="http://manning.com/logan/"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy Reading!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-7107659028164949786?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/7107659028164949786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=7107659028164949786' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/7107659028164949786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/7107659028164949786'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/12/other-erlang-book.html' title='The &apos;Other&apos; Erlang book'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-789290873279121318</id><published>2010-11-16T12:40:00.002-06:00</published><updated>2010-11-16T12:41:00.700-06:00</updated><title type='text'>Prestashop wins Open Source Award</title><content type='html'>Another open source award-- congratulations to the winners!&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Packt Publishing is pleased to announce that &lt;a href="https://www.packtpub.com/article-opensource-award-2010-prestashop"&gt;PrestaShop&lt;/a&gt;  has won the inaugural Open Source E-Commerce Applications Award  category in the 2010 Open Source Awards. Open Source E-Commerce  Applications Award is a new category introduced to the Award this year,  featuring various different types of type of web applications that  simplify buying and selling of products on the Internet.&lt;/p&gt; &lt;p&gt;“This award is a great recognition for PrestaShop's hardworking team  and, of course, the contributors who help us enrich our software every  day,” said Bruno Lévêque, PrestaShop Co-Founder.&lt;/p&gt; &lt;p&gt;“We are glad to have received this award from both a panel of expert  judges and our growing Community -whose members increased threefold in  the past year! They have really mobilized to support our project,” adds  Sabrina Maréchal, Head of Marketing &amp;amp; Communications for PrestaShop.&lt;/p&gt; &lt;p&gt;“PrestaShop have achieved a lot in a short period of time considering  that it is a community driven project, with the product maturing  steadily and in a way that will stand the test of time.” Added &lt;a href="http://www.packtpub.com/open-source-awards-home/open-source-ecommerce-applications-judges"&gt;Paul Anthony&lt;/a&gt;,  bespoke e-commerce solutions developer and one of the judges for the  2010 Open Source E-Commerce Applications category. “The structure of the  product has also given rise to numerous creative implementations, and  the community is large enough and responsive enough to cope with these  requests for improvement.”&lt;/p&gt; &lt;p&gt;“Every day more than 40,000 merchants use PrestaShop to manage their  online activity and we want to continually improve our software for  them, as well as our future users and developers,” concludes Bruno  Lévêque.&lt;/p&gt; &lt;p&gt;While PrestaShop occupied the top spot in the 2010 Open Source  E-Commerce Applications category, popular shopping cart system OpenCart  came in at the first runners up position, while the second runners up  position was secured by TomatoCart.&lt;/p&gt; &lt;p&gt;With this announcement, the 2010 Open Source Awards has four more  categories left, including the Open Source CMS category, for which  results will be announced from November 17th through to November 19th.&lt;br /&gt;For detailed results on each category and more information about the Award, please visit: &lt;a href="https://www.packtpub.com/open-source-awards-home" title="https://www.packtpub.com/open-source-awards-home"&gt;https://www.packtpub.com/open-source-awards-home&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Happy Open Sourcing!&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-789290873279121318?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/789290873279121318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=789290873279121318' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/789290873279121318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/789290873279121318'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/11/prestashop-wins-open-source-award.html' title='Prestashop wins Open Source Award'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-8148265456293587655</id><published>2010-11-15T07:00:00.001-06:00</published><updated>2010-11-15T07:03:28.022-06:00</updated><title type='text'>Pimcore Wins the 2010 Most Promising Open Source Project Award</title><content type='html'>&lt;img src="file:///tmp/moz-screenshot-1.png" alt="" /&gt;As a service to the open source community, I'll post awards from the 2010 Open Source Awards this week.  Here's the first winner, as seen in Packt's Press Release:&lt;br /&gt;&lt;br /&gt;         &lt;style type="text/css"&gt;p { margin-bottom: 0.08in; }a:link { color: rgb(0, 0, 255); }&lt;/style&gt;  &lt;p style="margin-bottom: 0in; line-height: 150%;"&gt;&lt;span&gt;Packt Publishing is pleased to announce that Pimcore has won the Most Promising Open Source Project Award category in the 2010 Open Source Awards. The Most Promising Open Source Project Award, sponsored by &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;&lt;a href="http://www.opencandy.com/"&gt;&lt;span&gt;OpenCandy&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;span&gt;, is a revamped category for the Award this year, featuring Open Source projects, whose first release date is less than two years from 9 August, 2010.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-top: 0.08in; line-height: 150%;"&gt;“&lt;span&gt;Winning this Award is a huge boost”, said Dietmar Rietsch, the founding member of Pimcore. “It’s not simply about the money either, it’s the recognition of a year of hard work and dedication from the team and Pimcore’s community.”&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-top: 0.08in; line-height: 150%;"&gt;“&lt;span&gt;Pimcore is an exciting content management system framework which has great long-term prospects. The project is growing at a fast rate and has good support from its community.” Added Marc Delisle, system administrator and one of the judges for the 2010 Most Promising Open Source Project category. “Pimcore is an easy to use new solution and a high sense of professionalism can be found in everything from the project website to the documentation.”&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; line-height: 150%;"&gt;&lt;span&gt;While Pimcore occupied the top spot in the 2010 Most Promising Open Source Project category, TomatoCMS came in at the first runners up position, while the second runners up position was secured by social networking software package BuddyPress.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; line-height: 150%;"&gt;&lt;span&gt;With this announcement, the 2010 Open Source Awards has five more categories left, including the Open Source Graphics Software category, for which results will be announced from November 16&lt;/span&gt;&lt;sup&gt;&lt;span&gt;th&lt;/span&gt;&lt;/sup&gt;&lt;span&gt; through to November 19&lt;/span&gt;&lt;sup&gt;&lt;span&gt;th&lt;/span&gt;&lt;/sup&gt;&lt;span&gt;. &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in; line-height: 150%;"&gt;&lt;span&gt;For detailed results on each category and more information about the Award, please visit: &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;&lt;a href="https://www.packtpub.com/open-source-awards-home"&gt;&lt;span&gt;https://www.packtpub.com/open-source-awards-home&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-8148265456293587655?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/8148265456293587655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=8148265456293587655' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/8148265456293587655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/8148265456293587655'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/11/pimcore-wins-2010-most-promising-open.html' title='Pimcore Wins the 2010 Most Promising Open Source Project Award'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-8738688429870953327</id><published>2010-11-13T23:07:00.003-06:00</published><updated>2010-11-13T23:28:38.512-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nhibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Book Review: "NHibernate 3.0 Cookbook"</title><content type='html'>&lt;div&gt;Are you a .Net developer looking for a way to persist complicated object graphs in your applications?  If so, I've got a book you might want to take a look at:  Packt's "NHibernate 3.0 Cookbook".  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book is written in Packt's 'Cookbook' style, which means it's really a series of short sections that guide you through achieving some goal you want to accomplish with NHibernate.  Each section follows a template, with sub-sections "&lt;b&gt;Getting Ready&lt;/b&gt;", "&lt;b&gt;How to do it&lt;/b&gt;", "&lt;b&gt;How it works&lt;/b&gt;", "&lt;b&gt;There's More&lt;/b&gt;".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's take an example, say "Configuring the Cache".  You may not yet know why you would want to configure cache for NHibernate, but you have a look at that section in the book.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- 'Getting Ready' tells you which artifacts you have to download and how to set up your machine&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- 'How to do it' tells you which files to open and what to edit, which buttons in your IDE to click, and which scripts need to be run.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- 'How it Works' at last tells you why the actions you have been taking will be effective.  This is the 'theory' that tells you how NHibernate works and why you might want to undertake the task you're currently engaged in.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- 'There's More' is yet more material related to the task in some way.  In the cache example, this might be some text about how the cache fits in NHibernate, how you can read it or externally affect it, and other material that's a tangent to your task.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So what exactly is covered, in this decidedly hands-on style?  Plenty.  You get:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Models and Mapping (sort of basic Hibernate theory)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- How to manage your schema and the parts that reference it&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Sessions and Transactions-- very important for enterprise applications!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Queries using NHibernate&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Testing with NHibernate&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Data Access Layer concerns&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Extending NHibernate&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Other NHibernate related projects&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Embedded in each of those topics (mostly within the 'How it Works' sections) is a lot of valuable advice about transactional applications in general.  Any reader can gain some insights from those.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All things considered, I'd recommend this book to any .Net developer who's interested in using NHibernate.  There is much good advice here that can be applied in a variety of situations.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book can be viewed &lt;a href="https://www.packtpub.com/nhibernate-3-0-cookbook/book"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By the way, the folks at Packt have passed along a couple of other items that might be of interest:  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;1)  The results of the 2010 Open Source Awards are nearly in, they will be announced daily by category starting next Monday.  As a professional open source advocate, I'll be happy to pass those results along as they are announced.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;2)  As a SOA practitioner, I have a respect for the IBM suite of products.  (Though I do have to admit I'm partial to JBoss' offerings, as they pay my salary!)  But if you're an IBM fan, Packt has a special deal this month on their products.  See the details &lt;a href="http://www.packtpub.com/article/new-packt-ibm-lotus-cognos-book-books-releases"&gt;here&lt;/a&gt;.&lt;/b&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy Reading!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-8738688429870953327?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/8738688429870953327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=8738688429870953327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/8738688429870953327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/8738688429870953327'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/11/book-review-nhibernate-30-cookbook.html' title='Book Review: &quot;NHibernate 3.0 Cookbook&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-9167716001249910474</id><published>2010-11-13T22:43:00.002-06:00</published><updated>2010-11-13T22:46:01.068-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Book Review:  "Spring Dynamic Modules in Action"</title><content type='html'>&lt;div&gt;Book Review:  "Spring Dynamic Modules in Action"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, let me start with a strong statement:  This book is going to be &lt;b&gt;the definitive book on Spring DM&lt;/b&gt;, period. Users of Spring DM need to rush out and buy a copy, for this book is a reference that will save countless hours and loads of headaches.  The authors (there are 3) have clearly travelled many miles with Spring DM, and their experience is laid out plainly for you to purchase for the measly price of a book.  My only caveat:  &lt;b&gt;be sure Spring DM is the right tool for the problem you want to solve, for there is some work ahead of you&lt;/b&gt;.  If you are certain it's the right technology, then this is &lt;b&gt;without question the book you need&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quick explanation for those unfamiliar with Spring DM and OSGi:&lt;/div&gt;&lt;div&gt;OSGi is a specification meant to help Java be more 'modular' and to help solve classpath issues.  OSGi lets you specify, via properties in a manifest file, exactly which versions of which library you want your library to use.  (You can even have two versions of the same library in use at the same time in your container!)  Spring DM is a framework for integrating OSGi with Spring and a selection of it's sub-projects.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Roughly, here's what you can expect from the book:&lt;/div&gt;&lt;div&gt;- An introduction to OSGi and an explanation of its purpose&lt;/div&gt;&lt;div&gt;- Explanation of how Spring can be used within an OSGi container, review of the currently available containers&lt;/div&gt;&lt;div&gt;- Details about how Spring DM works, and the parts you need to understand&lt;/div&gt;&lt;div&gt;- Details about OSGi services, and how they relate to Spring DM&lt;/div&gt;&lt;div&gt;- In depth best practices for data access, enterprise Java projects, and web applications (includes specific advice for popular web application frameworks)&lt;/div&gt;&lt;div&gt;- Testing practices&lt;/div&gt;&lt;div&gt;- Extended uses of OSGi, including likely future direction&lt;/div&gt;&lt;div&gt;- 500+ pages of advice that will keep your journey with Spring DM clear of potential pitfalls&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A big part of what makes this book valuable are the many pieces of advice from the authors as they explain best practices for using various tools.  So you want to use Eclipse, Ant or Maven?  No problem, these are all covered. About to use MyFaces, Wicket, or DWR?  All covered.  Are you a Tomcat user or Jetty?  Check and check.  I'm sure you get the picture--  if you use these tools, the path ahead of you is already blazed and you can avoid some headaches by leveraging the author's experience.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, a final wrap-up:  Spring DM users need to buy this book.  It will be worth the cost many times over!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book can be found &lt;a href="http://www.manning.com/cogoluegnes/"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy OSGi-enabled development!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-9167716001249910474?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/9167716001249910474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=9167716001249910474' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/9167716001249910474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/9167716001249910474'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/11/book-review-spring-dynamic-modules-in.html' title='Book Review:  &quot;Spring Dynamic Modules in Action&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-5547093057098445665</id><published>2010-10-30T08:12:00.003-05:00</published><updated>2010-10-30T08:24:04.210-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='support'/><title type='text'>4 tips to get your support ticket worked pronto!</title><content type='html'>&lt;div&gt;Isn't software support great?  It's one of the few ways possible to make your problem someone else's!  But when you've got one of those problems, you usually want it to be worked ASAP.  Here are 4 tips to help your ticket go through as quickly as possible.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;1)  Have your artifacts handy&lt;/b&gt;&lt;/div&gt;&lt;div&gt;By 'artifacts', I mean logs, core dumps, mangled transaction prints, etc.  If these things are not attached with your original ticket, there's a pretty good chance your first contact from the support engineer will be a request for you to go get them.  Meanwhile, while you're off gathering those things your engineer isn't idly standing by-- he's off working another ticket!  When your artifacts finally come in, the engineer may or may not be ready to put down that second ticket, you may have to wait.  Avoid the asynchronous wait time associated with this first exchange-- provide them in the first place.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;2)  Open the ticket at the appropriate level of severity&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Most ticketing processes involve a user-defined 'level' that indicates how important the ticket is to the holder.  (Usually severity 1, or 'sev one', is the highest.)  It's tempting to mark every ticket you enter as a sev one, but guess what happens if your development-environment problem isn't really the production-crash that sev one defines?  (Check your support agreement to see what the definitions are.)  Your ticket will be examined, re-prioritised, and put in a lesser queue.  So you lose time 'till that first evaluation, your ticket is delayed going into the proper queue, and you may establish a reputation as a less-than-honorable ticket opener.  (That last one is a bad one.  Read on....)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;3)  Playing nice pays off&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Often times there are more tickets than support engineers available, which means sometimes the engineer gets to decide which ticket to work first (all other things, like severity, being equal).  In situations like these, the 'tone' of the ticket can make a difference.  A polite and professional ticket tells the reader that the sender is a savvy user that's ready to collaborate and address the issue.  On the other hand a defensive or accusatory note might signal an uncooperative sender.  Which would you rather work first?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;4)  If at all possible, replicate the problem in a minimal environment&lt;/b&gt;&lt;/div&gt;&lt;div&gt;This is a big one-- if at all possible, encapsulate the problem in a minimal environment and attach it to the ticket.  If your problem lies in a Spring application, isolate the offending components and attach them with an application context to run them.  If it's a problem with JSF, build the smallest .war possible that shows the problem and attach the artifacts necessary to build it.  It's not always possible, but when it is possible this really helps the engineer!  Your ticket will be promptly picked up, and the problem will be put under the best microscopes the engineer has available.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's it-- follow those 4 steps and your ticket will proceed at max speed.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy ticketing!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-5547093057098445665?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/5547093057098445665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=5547093057098445665' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5547093057098445665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5547093057098445665'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/10/4-tips-to-get-your-support-ticket.html' title='4 tips to get your support ticket worked pronto!'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-2402946009174078378</id><published>2010-10-28T21:00:00.004-05:00</published><updated>2010-10-28T21:21:05.683-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>ORM the Hibernate way -- on .Net!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jK_3qAYFh-o/TMovB4dQ87I/AAAAAAAAAGk/6vUcZw4iW4s/s1600/3043OS_MockupCover_Cookbook.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 259px; height: 320px;" src="http://4.bp.blogspot.com/_jK_3qAYFh-o/TMovB4dQ87I/AAAAAAAAAGk/6vUcZw4iW4s/s320/3043OS_MockupCover_Cookbook.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5533286801559581618" /&gt;&lt;/a&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jK_3qAYFh-o/TMovB4dQ87I/AAAAAAAAAGk/6vUcZw4iW4s/s1600/3043OS_MockupCover_Cookbook.jpg"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); -webkit-text-decorations-in-effect: none; "&gt;I've been a casual user of Hibernate in my Java applications for a long time, but have never gotten around to using it's .Net cousin, NHibernate.  Now I've got a reason to finally give NHibernate a look!&lt;/span&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Packt has just released a new book, "NHibernate 3.0 Cookbook", described &lt;a href="https://www.packtpub.com/nhibernate-3-0-cookbook/book"&gt;here&lt;/a&gt;.  The book promises to teach the full range of features available and looks to be an easy read.  It's a Packt "Cookbook", which means the book will be presented in a series of 'How To' episodes written in a consistent format.  These books emphasize practical application over deep theory, so I have high hopes I'll be rapidly developing database-backed applications in .Net not long after cracking the cover.  (Time will tell.  I'm waiting for my copy to arrive in the mail.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Watch these pages for a review sometime soon.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Meanwhile,&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy Coding!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-2402946009174078378?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/2402946009174078378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=2402946009174078378' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2402946009174078378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2402946009174078378'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/10/orm-hibernate-way-on-net.html' title='ORM the Hibernate way -- on .Net!'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_jK_3qAYFh-o/TMovB4dQ87I/AAAAAAAAAGk/6vUcZw4iW4s/s72-c/3043OS_MockupCover_Cookbook.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-4933875614775582867</id><published>2010-10-23T08:36:00.005-05:00</published><updated>2010-10-23T08:48:50.552-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBoss Tools'/><title type='text'>How to find which .jar a class is in (easily)</title><content type='html'>Along with the many blessings a high level language brings you are a few curses.  In Java's case, one of the biggest downfalls is the dependency graph your code becomes part of as you develop applications.  This is especially noticeable when you're using frameworks like JEE or Spring.&lt;br /&gt;&lt;br /&gt;A Java developer feels this pain in a couple of ways:&lt;br /&gt;&lt;br /&gt;- Compile time, manifested with errors such as "(ClassName) cannot be resolved to a Type" or "The import some.class.SoughtFor cannot be resolved".&lt;br /&gt;&lt;br /&gt;- Runtime, where the errors will show themselves with messages like the all-time favorite "java.lang.ClassNotFoundException".&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_jK_3qAYFh-o/TMLmSX_afII/AAAAAAAAAGc/LVSoVOpZtM0/s1600/TattlerClassRpt.png"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px; height: 224px;" src="http://4.bp.blogspot.com/_jK_3qAYFh-o/TMLmSX_afII/AAAAAAAAAGc/LVSoVOpZtM0/s320/TattlerClassRpt.png" alt="" id="BLOGGER_PHOTO_ID_5531236495716416642" border="0" /&gt;&lt;/a&gt;But what if you had a report like this?  Wouldn't that be nice?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So what do you do then?  Many coders start by trying to guess which .jars hold the missing classes, then add them to the classpath one by one.  This can be an exercise in frustration, as often times .jar names give you little clue as to which classes are inside.&lt;br /&gt;&lt;br /&gt;A second methodology developers sometimes use is the 'throw everything but the kitchen sink at it' approach, where they build huge classpaths loaded with every .jar they can find.  This inexact coping mechanism obviously leads to bloat.&lt;br /&gt;&lt;br /&gt;But wait!  There is an exact way to cure the problem, and it's easy and open sourced!  Here's how to do it:&lt;br /&gt;&lt;br /&gt;1)  Download and unzip JBoss Tattletale. It can be found &lt;a href="http://jboss.org/tattletale"&gt;here&lt;/a&gt;.&lt;br /&gt;2)  Make a run script for Tattletale.&lt;br /&gt;3)  Run the run script.&lt;br /&gt;4)  Read the report Tattletale makes for you.  It's that easy!&lt;br /&gt;&lt;br /&gt;The script is easy to write.  It takes the form 'java -jar tattletale.jar DIRECTORY_TO_RECURSIVELY_SEARCH      DIRECTORY_FOR_REPORTS.&lt;br /&gt;&lt;br /&gt;Here's an example:&lt;br /&gt;java -jar tattletale.jar /home/rick/Tools/JBoss/jboss-5.1.0.GA /home/rick/rpts&lt;br /&gt;&lt;br /&gt;Then you just go to the reports directory and view the index.  To find your classes in .jars, have a look at the 'Class Location' report.  It'll tell you which jar holds the missing classes!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_jK_3qAYFh-o/TMLmR3FqR6I/AAAAAAAAAGU/2VvsHMqCPnA/s1600/TattlerRpt.png"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_jK_3qAYFh-o/TMLmR3FqR6I/AAAAAAAAAGU/2VvsHMqCPnA/s320/TattlerRpt.png" alt="" id="BLOGGER_PHOTO_ID_5531236486884247458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tattletale has many more capabilities, which are well documented in the packaged docs.  I hope you'll find this tool useful in your day-to-day development work.&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-4933875614775582867?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/4933875614775582867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=4933875614775582867' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4933875614775582867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4933875614775582867'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/10/how-to-find-which-jar-class-is-in.html' title='How to find which .jar a class is in (easily)'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_jK_3qAYFh-o/TMLmSX_afII/AAAAAAAAAGc/LVSoVOpZtM0/s72-c/TattlerClassRpt.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-9130738437618293685</id><published>2010-10-09T09:02:00.006-05:00</published><updated>2010-10-09T11:11:15.836-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBoss'/><category scheme='http://www.blogger.com/atom/ns#' term='JBoss Tools'/><title type='text'>Solve your Java runtime mysteries easily with Byteman</title><content type='html'>Have you heard of Byteman?  It's sort of like AOP-lite.  With a small script and a lightly doctored startup command, you can have x-ray vision into your Java applications.  You don't even have to alter your source code, and it's easy to use.&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Here's a quick example.  Let's say we have a Java application where some method is called at some point, and you want to know when that method is called and what's being passed to it. &lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;So let's say we have an application that provides this output.  (I'll show you the source code in a bit.)&lt;/div&gt;&lt;div&gt;-----------------------------------------------------------------&lt;/div&gt;&lt;div&gt;&lt;div&gt;Suspects about to do stuff!&lt;/div&gt;&lt;div&gt;Thump!  A murder happens!&lt;/div&gt;&lt;div&gt;Suspects done moving around!&lt;/div&gt;&lt;/div&gt;&lt;div&gt;-----------------------------------------------------------------&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, we don't know much about who committed the crime, do we?  (In fairness, we don't even know who the suspects are yet.)  But how about if you had the source code?  Then could you tell?  I doubt it.  Here's the source:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;import java.util.ArrayList;&lt;/div&gt;&lt;div&gt;import java.util.List;&lt;/div&gt;&lt;div&gt;import java.util.Random;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;public class Clue {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;private void makeMystery(){&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;List&lt;string&gt; suspects = new ArrayList&lt;string&gt;();&lt;/string&gt;&lt;/string&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;suspects.add("Colonel Mustard");&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;suspects.add("Mr. Green");&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;suspects.add("Miss Scarlet");&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;Random gen = new Random();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;// determine the killer!&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;int theKiller = gen.nextInt(3);&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;System.out.println("Suspects about to do stuff!");&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;for (String suspect : suspects){&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;walkThroughKitchen(suspect);&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;// maybe commit the crime!&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;if (suspect.equals(suspects.get(theKiller))){&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;commitCrime(suspect);&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;walkThroughLibrary(suspect);&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;System.out.println("Suspects done moving around!");&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;private void walkThroughLibrary(String suspect) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;// walks through...&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;private void commitCrime(String suspect) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;System.out.println("Thump!  A murder happens!");&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;private void walkThroughKitchen(String suspect) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;// walks through&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;public static void main(String[] args) {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;Clue clue = new Clue();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;clue.makeMystery();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I defy you to tell me who committed the crime!  But with Byteman you can tell! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So let's set things up.  Aside from downloading Byteman (found &lt;a href="http://www.jboss.org/byteman"&gt;here&lt;/a&gt;), you need to do a few things.&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Make your application into a jar (using jar -cvf someJar.jar *.class, perhaps).  This is done as a convenience to make it easier to put on a classpath.&lt;/li&gt;&lt;li&gt;Make a Byteman script, telling it what you want to see.&lt;/li&gt;&lt;li&gt;Make a command-line script to invoke your application.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;Step 1&lt;/b&gt; should be familiar to most Java coders.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Step 2&lt;/b&gt;.  For the above class, let's make a script like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt; #&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;code&gt;&lt;div&gt; # clue_script.txt  -  A simple script to intercept calls to a method&lt;/div&gt;&lt;div&gt; #&lt;/div&gt;&lt;div&gt; RULE Simple byteman example - watch a method&lt;/div&gt;&lt;div&gt; CLASS Clue&lt;/div&gt;&lt;div&gt; METHOD commitCrime(String)&lt;/div&gt;&lt;div&gt; AT EXIT&lt;/div&gt;&lt;div&gt; BIND THE_MURDERER = $1&lt;/div&gt;&lt;div&gt; IF TRUE&lt;/div&gt;&lt;div&gt;    DO traceln("Caught the murderer!  It was " + $1)&lt;/div&gt;&lt;div&gt;ENDRULE&lt;/div&gt;&lt;/code&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Step 3&lt;/b&gt;.  Add the necessary agent to your startup shell script.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;java -javaagent:/home/rick/Tools/Examples/Byteman/byteman-1.3.0/lib/byteman.jar=script:clue_script.txt -classpath clue.jar Clue&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;code&gt;&lt;/code&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now when we run the script, we see this:&lt;/div&gt;&lt;div&gt;---------------------------------------------------------------&lt;/div&gt;&lt;div&gt;&lt;div&gt;Suspects about to do stuff!&lt;/div&gt;&lt;div&gt;Thump!  A murder happens!&lt;/div&gt;&lt;div&gt;&lt;b&gt;Caught the murderer!  It was Colonel Mustard&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Suspects done moving around!&lt;/div&gt;&lt;/div&gt;&lt;div&gt;---------------------------------------------------------------&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There we have it!  Byteman has let us find out which arguments were being passed to that method, and we did it without altering the source for the application, without attaching a remote debugger, and without much trouble.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Byteman can do much more, though.  It can provide stack traces on demand, it can inject faults for testing and other neat tricks.  Best of all, it doesn't cost anything.  Check it out today, &lt;a href="http://www.jboss.org/byteman"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy Inspecting!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-9130738437618293685?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/9130738437618293685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=9130738437618293685' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/9130738437618293685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/9130738437618293685'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/10/solve-your-java-runtime-mysteries.html' title='Solve your Java runtime mysteries easily with Byteman'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-7663196146488625299</id><published>2010-10-02T05:50:00.003-05:00</published><updated>2010-10-02T05:57:04.530-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='Packt'/><title type='text'>Voting now open for 2010 Open Source Awards</title><content type='html'>The nomination stage is now closed and voting has begun in the 2010 Open Source Awards.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Your vote could reward an open source project with cash awards (I know the developers will appreciate that!)  Registering to vote will require your name and email, and it's a single button click to cast your vote.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here are the finalists, in categories:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  line-height: 18px; font-family:'Helvetica neue', Helvetica, Arial, Verdana, sans-serif;font-size:12px;"&gt;&lt;h2 size="1.2em" style="margin-bottom: 0.3em;  "&gt;&lt;strong&gt;&lt;a href="https://www.packtpub.com/open-source-awards-home/vote-open-source-cms" style="text-decoration: none; font-weight: bold; color: rgb(246, 140, 35); "&gt;Open Source CMS Award&lt;/a&gt;&lt;/strong&gt;&lt;/h2&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt;Every Content Management System (CMS) that is based on one of the Open Source licenses is eligible to participate for this category. Vote for your favorite Open Source CMS &lt;a href="https://www.packtpub.com/open-source-awards-home/vote-open-source-cms" style="text-decoration: none; font-weight: bold; color: rgb(246, 140, 35); "&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt;&lt;strong&gt;Finalists:&lt;/strong&gt;&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;CMS Made Simple&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;MODx&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;mojoPortal&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;SilverStripe&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;XOOPS&lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt; &lt;/p&gt;&lt;h2 style="margin-bottom: 0.3em; font-size: 1.2em; "&gt;&lt;strong&gt;&lt;span style="color: rgb(255, 153, 0); "&gt;&lt;a href="https://www.packtpub.com/open-source-awards-home/vote-hall-of-fame-cms-finalists" style="text-decoration: none; font-weight: bold; color: rgb(246, 140, 35); "&gt;Hall of Fame CMS&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt;This category is reserved for those CMSes that have won the Overall Open Source CMS Award at least once in the past. Since the launch of the award in 2006, only Joomla!, Drupal and WordPress have won the Overall Open Source CMS Award, therefore, this category will feature only those three participants in 2010. Vote for your favorite Hall of Fame CMS &lt;a href="https://www.packtpub.com/open-source-awards-home/vote-hall-of-fame-cms-finalists" style="text-decoration: none; font-weight: bold; color: rgb(246, 140, 35); "&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt;&lt;strong&gt;Finalists&lt;/strong&gt;&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;Drupal&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;Joomla!&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;WordPress &lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt; &lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;/ul&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;/ul&gt;&lt;h2 style="margin-bottom: 0.3em; font-size: 1.2em; "&gt;&lt;strong&gt;&lt;a href="https://www.packtpub.com/open-source-awards-home/vote-most-promising-open-source-project" style="text-decoration: none; font-weight: bold; color: rgb(246, 140, 35); "&gt;Most Promising Open Source Project&lt;/a&gt;&lt;/strong&gt;&lt;/h2&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt;&lt;/p&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt; &lt;/p&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt;This category is for all Open Source projects, whose first release date is less than two years from 9 August, 2010. Vote for your favorite Most Promising Open Source Project &lt;a href="https://www.packtpub.com/open-source-awards-home/vote-most-promising-open-source-project" style="text-decoration: none; font-weight: bold; color: rgb(246, 140, 35); "&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt; &lt;/p&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt;&lt;strong&gt;Finalists&lt;/strong&gt;&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;BuddyPress&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;LiveStreet CMS&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;Pimcore&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;Tomato CMS&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;WolfCMS&lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt; &lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;/ul&gt;&lt;h2 style="margin-bottom: 0.3em; font-size: 1.2em; "&gt;&lt;strong&gt;&lt;a href="https://www.packtpub.com/open-source-awards-home/vote-open-source-e-commerce-application" style="text-decoration: none; font-weight: bold; color: rgb(246, 140, 35); "&gt;Open Source E-Commerce Applications&lt;/a&gt;&lt;/strong&gt;&lt;/h2&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt;This category is reserved for the type of web applications that simplify buying and selling of products on the Internet. This will include complete e-commerce applications or frameworks designed for e-commerce. E-commerce modules or extensions to other systems can also be nominated. If a system is general purpose (like a CMS such as Drupal or Joomla!) the specific e-commerce functionality should be nominated, not the base system.Vote for your favorite Open Source E-Commerce Applications &lt;a href="https://www.packtpub.com/open-source-awards-home/vote-open-source-e-commerce-application" style="text-decoration: none; font-weight: bold; color: rgb(246, 140, 35); "&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt;&lt;strong&gt;Finalists&lt;/strong&gt;&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;Magento&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;nopCommerce&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;OpenCart&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;PrestaShop&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;Tomatocart&lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt; &lt;/p&gt;&lt;h2 style="margin-bottom: 0.3em; font-size: 1.2em; "&gt;&lt;strong&gt;&lt;a href="https://www.packtpub.com/open-source-awards-home/vote-open-source-javascript-libraries" style="text-decoration: none; font-weight: bold; color: rgb(246, 140, 35); "&gt;Open Source JavaScript Libraries&lt;/a&gt;&lt;/strong&gt;&lt;/h2&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt;This category is reserved for JavaScript libraries, libraries of pre-written JavaScript controls which allow for easier development of RIAs (Rich Internet Applications), visually enhanced applications or smoother server-side JavaScript functionalities.Vote for your favorite Open Source JavaScript Libraries &lt;a href="https://www.packtpub.com/open-source-awards-home/vote-open-source-javascript-libraries" style="text-decoration: none; font-weight: bold; color: rgb(246, 140, 35); "&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt;&lt;strong&gt;Finalists&lt;/strong&gt;&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;Dojo ToolKit&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;Ext JS&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;jQuery&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;Mootools&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;Raphaël&lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt; &lt;/p&gt;&lt;h2 style="margin-bottom: 0.3em; font-size: 1.2em; "&gt;&lt;strong&gt;&lt;a href="https://www.packtpub.com/open-source-awards-home/vote-open-source-graphics-software" style="text-decoration: none; font-weight: bold; color: rgb(246, 140, 35); "&gt;Open Source Graphics Software&lt;/a&gt;&lt;/strong&gt;&lt;/h2&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt;This category, as the name suggests, is for all Graphic Application Software that is used for graphic design, multimedia development, specialized image development, general image editing, or simply to access graphic files. It can also include graphics libraries, which use command line references or programming language inputs to design or edit graphics.Vote for your favorite Open Source Graphics Software &lt;a href="https://www.packtpub.com/open-source-awards-home/vote-open-source-graphics-software" style="text-decoration: none; font-weight: bold; color: rgb(246, 140, 35); "&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p style="margin-top: 0.4em; margin-bottom: 0.8em; "&gt;&lt;strong&gt;Finalists&lt;/strong&gt;&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;Blender&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;Gimp&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;InkScape&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;jMonkeyEngine&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; line-height: 1.6em; "&gt;Scribus&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;Happy Voting!&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-7663196146488625299?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/7663196146488625299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=7663196146488625299' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/7663196146488625299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/7663196146488625299'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/10/voting-now-open-for-2010-open-source.html' title='Voting now open for 2010 Open Source Awards'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-6500915090543329227</id><published>2010-09-13T17:06:00.006-05:00</published><updated>2010-09-13T18:27:40.901-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BRE'/><category scheme='http://www.blogger.com/atom/ns#' term='Drools'/><title type='text'>Book Review: "Drools JBoss Rules 5.0: Developer's Guide"</title><content type='html'>&lt;div&gt;Business Rules Engines are a curious thing.  For years they've been promising to ease the burden of writing and maintaining business logic, yet they never quite seem to live up to the promise.  Want to give one a try?  Let's have a look at a prominent Open Source BRE (Drools) as guided by this book from Packt.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book starts out simply enough, with the first chapter introducing the idea of a BRE and the second covering rule authoring basics.  From there, the author launches into building a banking application.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Chapter 3 is the 'Validation' chapter.  This is a natural strong suit for a BRE, as they favor 'if/then' (or, as this author writes, 'when/then' logic).  The author does a good job of introducing necessary parts of the Drools infrastructure, i.e. the 'rule context' which is useful in taking action when some condition exists.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Chapter 4 is about data transformation, it's not a far leap from Chapter 3.  I think this was somewhat imaginitive on the author's part, as XSLT or a tool like Smooks tends is probably a better choice for transformation than a BRE would be.  This book is all about Drools, though, so it makes more sense to do it this way.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Chapter 5 is the 'DSL' chapter.  Rules tend to look a little awkward to coders unaccustomed to seeing them.  A good example might look like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;when&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;    &lt;/span&gt;$customer : Customer (balance &lt;&gt;&lt;div&gt;then&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;    &lt;/span&gt;$customer.setMinBalanceWarning();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;    &lt;/span&gt;warning (kcontext)&lt;/div&gt;&lt;div&gt;end&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Instead of dealing with that kind of stuff, it's possible for some rules (if they fit a pattern) to be written something like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;when&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;    &lt;/span&gt;There is a Customer with a balance less than $200.00&lt;/div&gt;&lt;div&gt;then&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;    &lt;/span&gt;Set the Minimum Balance Warning&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;    &lt;/span&gt;Report this&lt;/div&gt;&lt;div&gt;end&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Isn't that cool?  It's really not all that mysterious, chapter 5 shows you how to do it.  Warning:  When managers see BRE marketing presentations, they sometimes watch something like this demonstrated and get all kinds of ideas about firing all the programmers and replacing them with business analysts.  Rest assured, there is a programmer behind it all.  (And a very skilled programmer at that.  But this is for the rule practitioner to see....)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Chapter 6 covers stateful sessions, something that can be handy when your application doesn't experience big swings in the data it's crunching on.  The author does his usual good job of providing an implementation, then some tests to prove the code.  Once again, technical tidbits are introduced to the reader as they are needed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Chapter 7 is about Complex Event Processing, somewhat a hot topic in today's Developer landscape.  It's an interesting use case for Drools, so I was glad to see it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Chapter 8 covers 'Drools Flow', which is one of the ways you can influence the order in which your rules are executed.  To a garden-variety Java coder, this might seem like a strange statement-- how can you NOT influence the order in which your rules are executed?  But that's the BRE way, and the author shows you one way to productively manage this 'feature' of the BRE.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Chapter 9 builds the Sample Application, which is the app that houses all the work done previously.  It suffers a little scope creep, as the reader is expected to enclose their Drools work in Spring, Tomcat, etc. but I expect this won't be too much to ask of the type of reader who picks up this book.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The next chapter is about testing, always something nice to understand in whatever language or framework you're dealing with.  Chapter 11 follows, that one covers integration issues.  (Roughly, how do you take all your useful Drools code and apply it somewhere?)  It's another nice thing to have spelled out.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The final chapter is on performance.  It's a little funny because this final chapter enlightens the reader on the inner workings of the rule engine, something you might expect to see in the front of the book rather than the back.  But it's good stuff, so I'm glad it was included.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are 3 appendices, focused on helping with preparations for running the code the book provides.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, what's the verdict?  Here are the things I like:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Gives some expert insights into how to write an application with a BRE&lt;/div&gt;&lt;div&gt;- Covers lots of the different facets offered by Drools&lt;/div&gt;&lt;div&gt;- Provides good explanations for technical tid-bits&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now for some dis-likes:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Not enough guidance on best practices.  Some are here, buried in the text, but you have to realize what you're looking at.  The market really cries out for a book that explicitly provides these.&lt;/div&gt;&lt;div&gt;- Probably not enough to get a BRE newbie off the ground.  Combined with the Drools user doc ('Cheese Shop'!) it may be enough.&lt;/div&gt;&lt;div&gt;- The author does a good job of using Drools for several purposes, but does not give the reader much guidance on when it really is smart to use a BRE and when it isn't.  (There are plenty of places where it isn't-- I guess it's up to you to decide!)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All things considered, I liked the book.  Next time I'm into Drools, I'm certain it'll be by my side!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book can be found &lt;a href="https://www.packtpub.com/drools-jboss-rules-5-0-developers-guide/book"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;..........&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;if&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;    &lt;/span&gt;you liked this article&lt;/div&gt;&lt;div&gt;then &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;    &lt;/span&gt;come back again another time!&lt;/div&gt;&lt;div&gt;end&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Rick&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-6500915090543329227?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/6500915090543329227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=6500915090543329227' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/6500915090543329227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/6500915090543329227'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/09/book-review-drools-jboss-rules-50.html' title='Book Review: &quot;Drools JBoss Rules 5.0: Developer&apos;s Guide&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-2926581538879074944</id><published>2010-09-11T08:04:00.004-05:00</published><updated>2010-09-11T08:29:57.866-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>New, less expensive Online Book Library available</title><content type='html'>Are you familiar with online library services like Safari or Books 24 x 7?  These are places where you can access large libraries of technical books online on a subscription basis.  Now there's a new entry in the workspace for you to consider.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The newcomer is Packt's online library, found &lt;a href="http://packtlib.packtpub.com/"&gt;here&lt;/a&gt;.  I've signed up for the free trial and can offer the following assessment:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt; I like the cost, compared to Safari or Books 24 x 7.  Packt is a little less than $200 a year, where the others are right at $500.&lt;/li&gt;&lt;li&gt;The catalog size is less than what the competitors offer.  Both Safari and Books 24 x 7 host titles from a list of publishers, where Packt is offering books from their catalog only.&lt;/li&gt;&lt;li&gt;With the trial account, you get access to 9 free titles.  I don't have an interest in most, but there is a &lt;b&gt;Plone development&lt;/b&gt; title there and one on &lt;b&gt;Microsoft Live Small Office&lt;/b&gt;, though.  I think those would be interesting.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Packt currently has over 400 titles available in the section you have to pay to see, and they do seem to include what I would consider the best books in Packt's arsenal.  For those unfamiliar with Packt's publishing model, they are no longer focused entirely on up-to-the-minute open source topics.  They've split their catalog into two sides, open source and 'Enterprise'.  Enterprise includes things like Oracle's SOA suite, so you can see the distinction between the two.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I always think it's better for consumers to have more choices in almost any arena.  Viva la competencia!  (Long live the competition!)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;'Till next time,&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy Online Reading!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-2926581538879074944?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/2926581538879074944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=2926581538879074944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2926581538879074944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2926581538879074944'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/09/new-less-expensive-online-book-library.html' title='New, less expensive Online Book Library available'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-2568734716074741207</id><published>2010-08-16T21:44:00.001-05:00</published><updated>2010-08-16T21:46:50.577-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Plone'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Book Review for "Plone 3.3 Site Administration: Manage your site like a Plone professional" by Alex Clark</title><content type='html'>&lt;div&gt;&lt;div&gt;Book Review for "Plone 3.3 Site Administration: Manage your site like a Plone professional" by Alex Clark.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Are you a Plone administrator or content editor?  If so, there's a new book from Packt that's worth your attention.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Plone 3.3 Site Administration: Manage your site like a Plone professional" guides the reader through site installation and configuration of many useful add-ons.  The tool of choice for a modern Plone site is 'zc.Buildout', and this book makes extensive use of buildout in each chapter as the author guides the reader from a basic Plone site to one well adorned with add-ons to enhance the appearance, functionality, and scalability of the site.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One thing I'd like to emphasize is that this book is all about configuration of these add-ons.  As an example, the book will introduce the reader to some desirable non-standard bit-- let's say the Varnish HTTP accelerator-- and give step-by-step instructions on how to get Varnish downloaded and configured for your Plone site.  What's missing is an overview of exactly what Varnish is.  There are no diagrams and not much text explaining how it works.  This pattern is repeated nearly everywhere-- you get the buildout configuration (and the response to expect when running buildout), but it's up to you to get your head wrapped around exactly what it is that you're adding to your site.  I find this ok, given that the book is targeted to readers who are already site administrators and should recognize most of the products we're dealing with.  (For the products that I didn't recognize, Google was able to round out my education, so I didn't feel slighted.)  I did think this was an important thing to point out so a first-time reader of the book will recognize what's in store in this book.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's a lot of good advice that's not Plone specific.  Best practices regarding version control of configurations, database maintenance, database packing, and more are covered.  These are the sort of thing that an experienced administrator will see value in, and a new administrator will appreciate having spelled out for them.  (One way or another, new administrators will adapt policies like these.  Maybe after reading some text and realizing the value, maybe after getting burned once or twice and learning it the hard way.)  In that regard, even one of these tips is probably worth the price of the book.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I continue to be impressed by the Plone community and the effort they have put forth to build the impressive ecosystem around this impressive CMS.  This one's for the admins, an audience that probably doesn't get as many books as they should.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book can be found &lt;a href="https://www.packtpub.com/plone-3-3-site-administration/book"&gt;here&lt;/a&gt;.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy Administering!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Rick&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-2568734716074741207?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/2568734716074741207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=2568734716074741207' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2568734716074741207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2568734716074741207'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/08/book-review-for-plone-33-site.html' title='Book Review for &quot;Plone 3.3 Site Administration: Manage your site like a Plone professional&quot; by Alex Clark'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-7590420690383979051</id><published>2010-08-09T21:15:00.003-05:00</published><updated>2010-08-09T21:28:00.376-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='contest'/><title type='text'>2010 Open Source Awards now open</title><content type='html'>&lt;h1 class="western"&gt;&lt;span class="Apple-style-span"  style="font-family:Arial, serif;"&gt;&lt;span class="Apple-style-span" style=" font-weight: normal; line-height: 24px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Do you have a favorite open source project?  Would you like to thank an open source provider in a tangible way?  How about nominating them for the 2010 Open Source Awards, a contest put on by Packt Publishing that offers US $24K in cash awards?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Arial, serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Nominations are accepted this year for the following categories:  Content Management Systems, E-Commerce Applications, Graphics Software, and JavaScript Libraries.  On a side note, nominators are entered into a drawing for a free Kindle, so maybe your kindness will be rewarded as well.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Arial, serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Arial, serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Happy Voting, and to ALL the open source coders-- Thanks!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Arial, serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Arial, serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Rick&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Arial, serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Arial, serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;P.S.  For those interested, I'll include the Packt Press Release in it's entirety:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h1 class="western"&gt;&lt;span class="Apple-style-span"  style=" color: rgb(0, 0, 10); font-family:Arial, serif;"&gt;Packt launch fifth annual Open Source Awards&lt;/span&gt;&lt;/h1&gt; &lt;p style="margin-bottom: 0in; line-height: 150%"&gt;&lt;span style="font-family:Arial, serif;"&gt;Birmingham, UK. 9&lt;/span&gt;&lt;sup&gt;&lt;span style="font-family:Arial, serif;"&gt;th&lt;/span&gt;&lt;/sup&gt;&lt;span style="font-family:Arial, serif;"&gt; August 2010&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-top: 0.08in; line-height: 150%"&gt;&lt;span style="font-family:Arial, serif;"&gt;The 2010 Open Source Awards was launched today by Packt, inviting people to visit &lt;a href="http://www.packtpub.com/"&gt;www.&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family:Arial, serif;"&gt;&lt;b&gt;&lt;a href="http://www.packtpub.com/"&gt;Packt&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family:Arial, serif;"&gt;&lt;a href="http://www.packtpub.com/"&gt;Pub.com&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family:Arial, serif;"&gt; and submit nominations for their favorite Open Source project. Now in its fifth year, the Award has been adapted from the established Open Source CMS Award with the wider aim of encouraging, supporting, recognizing and rewarding all Open Source projects. &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-top: 0.08in; line-height: 150%"&gt;&lt;span style="font-family:Arial, serif;"&gt;WordPress won the 2009 Open Source Content Management System (CMS) Award in what was a very close contest with MODx and SilverStripe. While MODx was the first runner up, SilverStripe, a Most Promising CMS Award winner in 2008, made its way to the second runner up position in its first year in the Open Source CMS Award final.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-top: 0.08in; line-height: 150%"&gt;&lt;span style="font-family:Arial, serif;"&gt;The 2010 Award will feature a prize fund of $24,000 with several new categories introduced. While the Open Source CMS Award category will continue to recognize the best content management system, Packt is introducing categories for the Most Promising Open Source Project, Open Source E-Commerce Applications, Open Source JavaScript Libraries and Open Source Graphics Software.&lt;/span&gt;  &lt;span style="font-family:Arial, serif;"&gt;CMSes that won the Overall CMS Award in previous years will continue to compete against one another in the Hall of Fame CMS category. &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-top: 0.08in; line-height: 150%"&gt;&lt;a name="_GoBack"&gt;&lt;/a&gt; &lt;span style="font-family:Arial, serif;"&gt;These new categories will ensure that the Open Source Awards is the ultimate platform to recognise excellence within the community while supporting projects both new and old. “We believe that the adaption of the Award and the new categories will provide a new level of accessibility, with the Award recognizing a wider range of Open Source projects; both previous winners while at the same time, encouraging new projects” said Julian Copes, organizer of this year’s Awards.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-top: 0.08in; line-height: 150%"&gt;&lt;span style="font-family:Arial, serif;"&gt;Packt has opened up nominations for people to submit their favorite Open Source projects for each category at &lt;a href="http://www.packtpub.com/open-source-awards-home"&gt;www.PacktPub.com/open-source-awards-home&lt;/a&gt; . The top five in each category will go through to the final, which begins in the last week of September. For more information on the categories, please visit Packt’s website &lt;a href="http://www.packtpub.com/blog/packt%E2%80%99s-2010-open-source-awards-announcement"&gt;www.PacktPub.com/blog/packt’s-2010-open-source-awards-announcement&lt;/a&gt;  &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-top: 0.08in; line-height: 150%"&gt;&lt;span style="font-family:Arial, serif;"&gt;&lt;b&gt;Contacts&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-top: 0.08in; line-height: 150%"&gt;&lt;span style="font-family:Arial, serif;"&gt;Julian Copes&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-top: 0.08in; line-height: 150%"&gt;&lt;span style="font-family:Arial, serif;"&gt;PR Executive, Packt Publishing&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-top: 0.08in; line-height: 150%"&gt;&lt;a href="mailto:julianc@packtpub.com"&gt;&lt;span style="font-family:Arial, serif;"&gt;julianc@packtpub.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Arial, serif;"&gt; | &lt;/span&gt;&lt;a href="http://www.packtpub.com/"&gt;&lt;span style="font-family:Arial, serif;"&gt;www.PacktPub.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Arial, serif;"&gt; &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-top: 0.08in; line-height: 150%"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-top: 0.08in; line-height: 150%"&gt;&lt;span style="font-family:Arial, serif;"&gt;&lt;b&gt;About Packt&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-top: 0.08in; line-height: 150%"&gt;&lt;span style="font-family:Arial, serif;"&gt;Packt is a modern, unique publishing company with a focus on producing cutting-edge books for communities of developers, administrators, and newbies alike.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-top: 0.08in; line-height: 150%"&gt;&lt;span style="font-family:Arial, serif;"&gt;Packt’s books and publications share the experiences of fellow IT professionals in adapting and customizing today's systems, applications, and frameworks. Their solutions-based books give readers the knowledge and power to customize the software and technologies they’re using to get the job done.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-top: 0.08in; line-height: 150%"&gt;&lt;span style="font-family:Arial, serif;"&gt;For more information, please visit &lt;/span&gt;&lt;span style="font-family:Arial, serif;"&gt;&lt;a href="http://www.packtpub.com/"&gt;www.PacktPub.com&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-7590420690383979051?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/7590420690383979051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=7590420690383979051' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/7590420690383979051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/7590420690383979051'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/08/2010-open-source-awards-now-open.html' title='2010 Open Source Awards now open'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-5114947414016859655</id><published>2010-08-09T20:30:00.007-05:00</published><updated>2010-08-09T21:07:10.874-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>3 Great (and Free!) Tools for Knowledge Workers</title><content type='html'>Once in a while I happen across a tool that helps me in my work.  Here are three.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Spreeder&lt;/span&gt;&lt;br /&gt;This website helps me to read material at a much faster rate than I normally would.  You can dial up the rate (in words per minute) so you can control how fast you read.  You provide the text, via cut-n-paste.  Sometimes I miss having the diagrams, and the structure of the words is lost, but all things considered this is a great tool.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jK_3qAYFh-o/TGCyH5kK2nI/AAAAAAAAAFM/pgIzn-_-Zk8/s1600/Spreeder"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 224px;" src="http://4.bp.blogspot.com/_jK_3qAYFh-o/TGCyH5kK2nI/AAAAAAAAAFM/pgIzn-_-Zk8/s320/Spreeder" border="0" alt="" id="BLOGGER_PHOTO_ID_5503594593428101746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;a href="http://www.spreeder.com/"&gt;www.spreeder.com&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Freemind&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This desktop app is great for helping you round out your ideas.  I'm not sure why it helps so much, but for me it does.  You quickly get used to adding new ideas, prioritizing them, shuffling them around, etc.  It's really very easy to get started.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jK_3qAYFh-o/TGCyv5_vw3I/AAAAAAAAAFU/i9hxkyvRzoU/s1600/FreeMind.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 224px;" src="http://1.bp.blogspot.com/_jK_3qAYFh-o/TGCyv5_vw3I/AAAAAAAAAFU/i9hxkyvRzoU/s320/FreeMind.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5503595280738534258" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;a href="http://http//freemind.sourceforge.net/wiki/index.php/Main_Page"&gt;http://freemind.sourceforge.net/wiki/index.php/Main_Page&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;jMemorize&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here's another desktop application, this time one that helps me to remember things.  As an example, I am just terrible at remembering people's names-- but jMemorize helps with that!  By making electronic flashcards (yes, images can be put on one side!) you can use the provided 'Learn' mode to review all the cards in a group, removing the ones you get right.  It's easy to use, you just run the java jar and away you go.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jK_3qAYFh-o/TGCzktiHGAI/AAAAAAAAAFc/seEQXb8x74k/s1600/jMemorize.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 224px;" src="http://4.bp.blogspot.com/_jK_3qAYFh-o/TGCzktiHGAI/AAAAAAAAAFc/seEQXb8x74k/s320/jMemorize.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5503596187926075394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;a href="http://http//sourceforge.net/projects/jmemorize/"&gt;http://sourceforge.net/projects/jmemorize/&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I hope these are as useful to you as they are to me.&lt;br /&gt;&lt;br /&gt;Happy Thinking!&lt;br /&gt;&lt;br /&gt;Rick&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-5114947414016859655?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/5114947414016859655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=5114947414016859655' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5114947414016859655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5114947414016859655'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/08/3-great-and-free-tools-for-knowledge.html' title='3 Great (and Free!) Tools for Knowledge Workers'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_jK_3qAYFh-o/TGCyH5kK2nI/AAAAAAAAAFM/pgIzn-_-Zk8/s72-c/Spreeder' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-1772785308691960311</id><published>2010-07-28T21:39:00.002-05:00</published><updated>2010-07-28T21:54:43.235-05:00</updated><title type='text'>Book Review for "Plone 3 Multimedia"</title><content type='html'>I've just finished "Plone 3 Multimedia", another Packt Plone title.  &lt;br /&gt;&lt;br /&gt;If you're not experienced with Plone, you probably need not pick this one up for a while.  But if you are running Plone and want to use video, audio, photos, etc. to snazz it up-- there's a lot here for you.  Here's the full review:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Plone 3 Multimedia&lt;br /&gt;&lt;br /&gt;This is a book for Plone power users and administrators.  The focus of the book is on multimedia capabilities, the content type is a wide-ranging survey with details for each of the many mini-subtopics.  For anyone with a need to add multimedia content to a Plone site, I would recommend this book.&lt;br /&gt;&lt;br /&gt;Chapter 1 is a brief chapter that defines Plone, ZCA (Zope Component Architecture), the excellent zc.buildout, and multimedia itself.  The author gives us a brief introduction to Plone4Artists, which is an initiative that addresses many multimedia concerns.  &lt;br /&gt;&lt;br /&gt;Chapter 2 is all about images.  The author tells us how to organize, resize, and group images in ways that make the site more appealing to the user.  You are taught how to produce thumbnail images (which can be clicked into larger images) and how to use gallery/slideshow products.  This is the first chapter to use a recurring theme:  The author first explains the capabilities of a basic Plone installation, then later explains what sort of add-ons you might use to gain further capabilities.  This is a meaty chapter with lots of technical content.  If you're a serious Plone admin, this chapter alone might make the book worth your while.&lt;br /&gt;&lt;br /&gt;Chapter 3 is the audio chapter.  Audio formats are explained along with the advantages and disadvantages of the various types.  A good explanation of audio metadata is included-- I found that part especially interesting.  The author explains how to include audio players on your Plone site, and demonstrates writing a player view in HTML5.  Like chapter 2, this chapter is a deeply technical one with plenty of specific advice to guide the reader.&lt;br /&gt;&lt;br /&gt;It seems only natural that video content should follow audio and images, and so it is.  Chapter 4 tells us how to stream and embed videos in your Plone site, also how to leverage videos hosted on external sites like YouTube.  By now you'll recognize the familiar chapter format:  First the basic capabilities of Plone are covered, then fancier alternatives are introduced including the Plone4Artists parts that address this chapter's needs.  Once you recognize the chapter layout pattern, it really makes the material easier to divide into logical sections.&lt;br /&gt;&lt;br /&gt;Chapter 5 concerns Flash in Plone.  Several Flash helpers are covered, as well as some problem spots that can be avoided.  As a special bonus, Silverlight is given coverage, too.&lt;br /&gt;&lt;br /&gt;The next chapter was really interesting to me-- it was all about content organization and control.  The first part dealt with categorization, and ways to optimize flexibility in Plone's folder-centric way of doing things.  This was followed by a good discussion on content metadata, and an explanation of the Dublin Core standard for metadata.  Tagging and rating of content followed this, and geo-location and the use of maps was the ending of chapter 6.  There was enough information here that I am going to read it again!&lt;br /&gt;&lt;br /&gt;Chapter 7 was all about Syndication, including RSS and Atom.  As usual, the author outlined what a basic Plone installation can do, then suggests some add-ons that can further enhance your Plone site.  Another common theme throughout the book is the suggestion of add-ons that will be helpful for the current problem set, then advice on how to configure the add-on for best usage.&lt;br /&gt;&lt;br /&gt;Chapter 8 covers advanced uploading techniques.  Say you have a whole photo album you'd like to move onto Plone, but you'd really rather not do it one file at a time.  This chapter is for you, then!  The author discusses FTP, WebDAV, and a few external tools that can be of use in this case.&lt;br /&gt;&lt;br /&gt;The next chapter is all about persisting data.  The author first covers the vanilla Plone default (ZODB, the object data base) then offers alternatives.  The main concern is large binary files, which is natural since this book is all about multimedia data types.  For these, Plone can be configured to use external sources (like YouTube) or file system mechanisms to hold the data outside of ZODB.  &lt;br /&gt;&lt;br /&gt;Chapter 10 is the final chapter of the book, and it covers the important topic of performance optimization.  Varnish, the reverse proxy cache server is explained as is the Red5 video server.  CachFu, a commonly used content caching mechanism, is also explained.  &lt;br /&gt;&lt;br /&gt;You might think 10 good technical chapters would be enough, but as they say on infomercials, that's not all!  You also get not 1, not 2, but 3 appendices.  Appendix A covers multimedia formats and licenses, including a nice explanation of various codecs you're likely to encounter.  Appendix B is about Syndication formats, including RSS1, RSS2, and Atom.  Appendix C covers links and places to find more information about Plone, it's build-out system, and more.&lt;br /&gt;&lt;br /&gt;All things considered, this book is just what it purports to be-- an excellent resource for anyone using Plone to host multimedia content.  There is enough diversity and depth in this book that I'm sure nearly everyone will learn something new (and many of us will learn many new things!)  I would not recommend this book for a Plone newbie, as there is no gentle introduction preceding the technical content-- the author assumes the reader is already a reasonably competent Plone integrator.  (This is all spelled out on the book's back cover and in the introductory text, though.  If you miss that and come away disappointed, shame on you.)  I'm sure this book will soon become a go-to reference for Plone lovers everywhere.&lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href="https://www.packtpub.com/plone-3-3-multimedia-website/book"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy Reading!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-1772785308691960311?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/1772785308691960311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=1772785308691960311' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1772785308691960311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1772785308691960311'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/07/book-review-for-plone-3-multimedia.html' title='Book Review for &quot;Plone 3 Multimedia&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-8561929825582164943</id><published>2010-07-28T20:42:00.002-05:00</published><updated>2010-07-28T20:54:23.917-05:00</updated><title type='text'>Free eBooks!</title><content type='html'>Hi all,&lt;br /&gt;&lt;br /&gt;Once in a while, something really good comes along and you feel you just have to share it with people.  That's what's going on today, I have some free eBooks to share.&lt;br /&gt;&lt;br /&gt;Packt Publishing has recently decided to give away some of it's eBooks, free of charge.  Here are at least 5 titles:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.packtpub.com/phpBB/book"&gt;Building Online Communities with phpBB 2&lt;/a&gt;&lt;br /&gt;&lt;a href="https://www.packtpub.com/upgrading-lotus/book"&gt;Upgrading to Lotus Notes and Domino 7&lt;/a&gt;&lt;br /&gt;&lt;a href="https://www.packtpub.com/invision-power-board/book"&gt;Invision Power Board: A User Guide&lt;/a&gt;&lt;br /&gt;&lt;a href="https://www.packtpub.com/e107-content-management-websites/book"&gt;Building Websites with e107&lt;/a&gt;&lt;br /&gt;&lt;a href="https://www.packtpub.com/PEAR-Installer/book"&gt;The PEAR Installer Manifesto&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The link that told me about these give-aways is &lt;a href="http://www.packtpub.com/article/celebrate-with-us-as-packt-turns-5?banner"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Besides free eBooks, Packt is also converting their electronic books to the 'ePub' format, which promises superior display capabilities, flexibility in formatting, and a host of other benefits.  There's a nice press release about it &lt;a href="https://www.packtpub.com/article/packt-make-epub-downloads-available-its-website"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I hope you find something good there.&lt;br /&gt;&lt;br /&gt;Happy Reading!&lt;br /&gt;&lt;br /&gt;P.S.  If you don't want to follow the above link to the ePub announcement, I'll include the announcement as it reads on their site.  Here it is:&lt;br /&gt;&lt;br /&gt;by Julian Copes | July 2010 | Enterprise Articles Open Source&lt;br /&gt;Packt Publishing announced today that its eBooks will be available to download from www.PacktPub.com in ePub format with immediate effect. Following feedback from customers, the fast-growing publisher made the move to provide this popular format and expects it to be well received.&lt;br /&gt;&lt;br /&gt;ePub (short for electronic publication) is a free and open eBook standard by the International Digital Publishing Forum (IDPF). ePub allows greater flexibility with content. With an ePub-formatted book, the display of text can be optimized for the reader's device.  Other ePub features include improved design and layout, Inline raster and vector images, better search functionality, while enabling DRM protection and embedded metadata.&lt;br /&gt;&lt;br /&gt;The company’s marketing manager Damian Carvill said “Packt listens to all feedback from customers and attempts to act on it accordingly. After receiving a number of requests, we made it a priority to convert all of our existing eBooks into the ePub format. All of our future books, and we hope to publish over 20 in July, will also be available in this popular eBook format.”&lt;br /&gt;&lt;br /&gt;Packt is inviting all customers, who have purchased an eBook, to download the ePub version of the book and enjoy its features and great flexibility. Alternatively, customers can sample the ePub format by accessing one of Packt’s free eBooks. All purchases of new eBooks from today will be made available to download as an ePub file, as well as the standard PDF.&lt;br /&gt;&lt;br /&gt;Packt ePub formatted eBooks are available from Tuesday 20th July 2010. To access your first Packt ePub eBook, either previously purchased or one of Packt’s free eBooks, please log into www.PacktPub.com and go to My account.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-8561929825582164943?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/8561929825582164943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=8561929825582164943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/8561929825582164943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/8561929825582164943'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/07/free-ebooks.html' title='Free eBooks!'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-436180630459299085</id><published>2010-07-27T20:42:00.005-05:00</published><updated>2010-07-27T20:50:38.214-05:00</updated><title type='text'>New Plone Admin book available</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_jK_3qAYFh-o/TE-MZaHUErI/AAAAAAAAAFE/Y1SmYvgnqYM/s1600/978-1-847197-04-7.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 259px; height: 320px;" src="http://3.bp.blogspot.com/_jK_3qAYFh-o/TE-MZaHUErI/AAAAAAAAAFE/Y1SmYvgnqYM/s320/978-1-847197-04-7.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5498768038177280690" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I've been learning Plone lately, thanks mostly to &lt;a href="http://learnplone.org/"&gt;LearnPlone.org&lt;/a&gt; and Packt's excellent library of new Plone titles.&lt;br /&gt;&lt;br /&gt;A site admin can always use a book of new tips, and sure enough, Packt has that one covered too.  There's a brand new title available, "Plone 3.3 Site Administration".  The book can be viewed &lt;a href="https://www.packtpub.com/plone-3-3-site-administration/book"&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;There's a copy coming via mail, I promise to provide a review ASAP.&lt;br /&gt;&lt;br /&gt;Meanwhile, please try to stay cool in the summer heat.&lt;br /&gt;&lt;br /&gt;Happy coding!&lt;br /&gt;&lt;br /&gt;P.S.  Check that chain on the book cover-- I guess they're plugging Plone's top-notch security.  I read today on Slashdot that the CIA uses Plone-- it must be pretty secure!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-436180630459299085?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/436180630459299085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=436180630459299085' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/436180630459299085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/436180630459299085'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/07/new-plone-admin-book-available.html' title='New Plone Admin book available'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_jK_3qAYFh-o/TE-MZaHUErI/AAAAAAAAAFE/Y1SmYvgnqYM/s72-c/978-1-847197-04-7.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-5302175680550201092</id><published>2010-07-05T17:34:00.003-05:00</published><updated>2010-07-05T17:38:26.757-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Book Review for "Groovy for Domain-Specific Languages"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_jK_3qAYFh-o/TDJeftEsxMI/AAAAAAAAAE8/Ag7_dWAY7QI/s1600/6903_MockupCover.jpg.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 125px; height: 152px;" src="http://3.bp.blogspot.com/_jK_3qAYFh-o/TDJeftEsxMI/AAAAAAAAAE8/Ag7_dWAY7QI/s320/6903_MockupCover.jpg.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5490554794486318274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Book Review of "Groovy for Domain-Specific Languages", or how to teach a Java guy Closures and Meta-Programming&lt;br /&gt;&lt;br /&gt;Are you an accomplished Java Coder, but not very experienced with the 'dynamic' languages like Python, Ruby or Groovy?  I am.  &lt;br /&gt;&lt;br /&gt;Sure, I know a little about all those languages, especially Python.  For quite a while now, I've used Python for scripting and even for quick Hadoop jobs.  But the way I used Python wasn't much different than how I'd use Java-- mostly plain Object Oriented technique at the fanciest, more likely just plain old procedural scripting for quick-n-dirty text manipulation jobs.  I'd read the occasional article about dynamic language features (like closures, metaprogramming, and built-in builders) but I didn't really have a good idea what those meant.  &lt;br /&gt;&lt;br /&gt;That all changed after I read "Groovy for Domain-Specific Languages" from Packt. &lt;br /&gt;&lt;br /&gt;Groovy, it turns out, is a language built on top of the JVM and it offers really easy integration with Java.  (So much so that your Groovy code compiles to JVM bytecode, so &lt;span style="font-weight:bold;"&gt;all the current Java code you have available to you is also available to your Groovy code&lt;/span&gt;.)  The book goes about introducing Groovy in terms a Java coder will easily understand, and I think the author did a good job in this respect.&lt;br /&gt;&lt;br /&gt;Groovy can be an easier Java.  Language verbosity is relaxed, so coders can drop parenthesis, semi-colons, and variable types where it makes sense.  This saves a few keystrokes at code-writing time, but more importantly it produces code that's a lot leaner so it can be much more readable.  But that's not what helps in DSL construction.&lt;br /&gt;&lt;br /&gt;DSLs, for those of you impervious to the growing dev-space din, are "Domain Specific Languages", or little languages meant to serve a single purpose.  Never heard of that, you say?  How about 'Regular Expressions', 'Make', and 'Ant'?  I'm sure you've heard of those!  They're all examples of little language that are designed to perform some very specific task, and make the user's life easier than if they had to use a general purpose language like C or Java to accomplish something like compiling a .jar.&lt;br /&gt;&lt;br /&gt;This book goes about explaining some of the features a dynamic language like Groovy has that make DSL authoring an easier task.  One such feature is the '&lt;span style="font-weight:bold;"&gt;Closure&lt;/span&gt;' something Java doesn't have at this time.  So what's a closure?  I'd call it a method, except it's packed up in such a way that you can send it to other methods as a parameter.  Confused?  Check this example:&lt;br /&gt;&lt;br /&gt;def islanders = ["Skipper", "Gilligan"]  // This is a List in Groovy&lt;br /&gt;def aClosure = { println "Hello,  ${it}" }&lt;br /&gt;islanders.each (aClosure)    // This will print "Hello, Skipper" "Hello, Gilligan"&lt;br /&gt;&lt;br /&gt;Another DSL-friendly feature of Groovy is &lt;span style="font-weight:bold;"&gt;Meta-Programming&lt;/span&gt;.  Meta-Programming is writing code that can change it's behavior at runtime.  One flavor of this is Reflection, which I knew from Java-- given the String name of a class, I could conjure up an instance of that class.  I'd also seen in Python how you can add properties to an object 'on the fly'-- if that property wasn't there, the class just somehow put it there as soon as you accessed it, and the code went chugging along.  But that's just the tip of the iceberg!  In Groovy you can have your class respond to method calls that you didn't write at the time the class was authored.  Weird!  Yet very handy if you're writing a DSL, as the book explains.&lt;br /&gt;&lt;br /&gt;The book is really a double-whammy, covering both Groovy-for-the-Java-Coder and Best-Practices-in-Writing-a-DSL.  IMHO, it covers the first topic in more detail than the second, but I liked what I got from both.  &lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href="https://www.packtpub.com/groovy-for-domain-specific-languages-dsl/book"&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;There have been several times in my career where I've written a little language, probably with mixed levels of effectiveness.  The next time this topic arises, I have a new weapon to bring out, so I'm waiting on it now!&lt;br /&gt;&lt;br /&gt;'Till then,&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-5302175680550201092?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/5302175680550201092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=5302175680550201092' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5302175680550201092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5302175680550201092'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/07/book-review-for-groovy-for-domain.html' title='Book Review for &quot;Groovy for Domain-Specific Languages&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_jK_3qAYFh-o/TDJeftEsxMI/AAAAAAAAAE8/Ag7_dWAY7QI/s72-c/6903_MockupCover.jpg.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-5739852917099788228</id><published>2010-06-23T15:10:00.004-05:00</published><updated>2010-06-23T15:16:23.556-05:00</updated><title type='text'>More Top 3 Take-Aways from Enzee Universe</title><content type='html'>Top 3 take-aways from Netezza Conference, day 2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Once again, here are the top 3 take-aways I got from sessions at "Enzee Universe" this year.  If you're not sure what a "Netezza" is, please see &lt;a href="http://rickwagner.blogspot.com/2010/06/top-3-take-aways-from-enzee-universe.html"&gt;yesterday's notes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_jK_3qAYFh-o/TCJq-FllsTI/AAAAAAAAAE0/B2pDpkbsKIs/s1600/untitled.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 180px;" src="http://2.bp.blogspot.com/_jK_3qAYFh-o/TCJq-FllsTI/AAAAAAAAAE0/B2pDpkbsKIs/s320/untitled.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5486064910974955826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"Expanded Capacity, Improved Performance &amp; More: Netezza Performance Software Release 6.0 Under the Hood"&lt;br /&gt;&lt;/span&gt;1)  The Netezza has a part called the "Field Programmable Gate Array".  This is sort of like a chip that you can program, so you can sort of write functions to augment SQL.  Data is automatically compressed as it travels between the disks and the FPGAs-- at a minimum 2x, but it can be up to 32x compression!&lt;br /&gt;2)  For users of ordered data (like dates), you can use "Zone Maps".  This means you give Netezza a clue about your data and it will order it and make metadata about the high and low values contained in each block on the disk.  Then when a read operation comes along, Netezza can just look to the metadata to see if that value is going to be between the high and low values-- if it isn't, Netezza just skips that block.  &lt;br /&gt;3)  In 6.0, Netezza now allows "Alter Table" without actually re-creating the whole table behind the scenes. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"Practical Applications and Challenges of Advanced Analytics" by Usama Fayyad&lt;/span&gt;&lt;br /&gt;1)  Think of segmentation as a way to reduce data.  By grouping like items into segments, you can disregard (or discard) the mounds of source data that go into the segmentation algorithms.&lt;br /&gt;2)  Mr. Fayyad used to be the 'Director of Data' at Yahoo, where they added 25 TB to the corporate stack each day.  He offered the opinion that dedicated grids for handling this data (he even singled out Yahoo's Hadoop grid, something I like the idea of) are very expensive.  Wherever possible, he suggested using rented grids (like Amazons) if conditions allow it.&lt;br /&gt;3)  He had an interesting example of a retailer who once asked what kinds of queries users were making that did NOT result in hits on the retailer's web site.  It turned out that people were viewing print ads and selecting accessories (belly-button rings, to be exact) the models were wearing but were not part of the clothing being advertised.  Once given this knowledge, the retailer was able to make inventory stocking decisions that allowed sales of the belly button rings, too.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"TwinFin Advanced Analytics Tutorial &amp; Technical Underpinnings" by Brian Hess&lt;/span&gt;&lt;br /&gt;(This was a really good session.  There were many great points in this one, but here are the top 3)&lt;br /&gt;1)  Netezza now offers Hadoop Map/Reduce style programming right on the machine.  With only minor modifications to your existing Hadoop classes, you can forklift the jobs right onto Netezza.  Unfortunately, the larger Hadoop eco-system (Zookeeper, for example) is not available so you have to sequence your jobs yourself.&lt;br /&gt;2)  The R statistical language is now available right on the box, too.  They tried to follow R's data constructs as closely as possible (i.e. an R 'dataframe' is a Netezza 'table') so it should be a snap for R users to work on the Netezza.  For my uses, I imagined using R to handle data profiling duties.&lt;br /&gt;3)  On Netezza, the user can provide their own extensions to SQL (my terminology there) in the form of "User defined functions" that are used on the Field Programmable Gate Arrays (FPGA).  Formerly you could only do this in C, but now you can use C, C++, Java, Python, or Fortran.  We saw some example Java, it looked very straightforward.  I think this is a great feature.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"Netezza Data Compliance" &lt;/span&gt;&lt;br /&gt;1)  Netezza now comes with 'Mantra', a data compliance tool meant to help with SOX, CISP, and other data regulatory needs.&lt;br /&gt;2)  Mantra will help you monitor who is accessing which data, and at which times they are accessing it.  It will alert you to off-hours data access or other unusual access patterns.&lt;br /&gt;3)  Mantra isn't tied just to the Netezza-- it can help monitor other databases, flat files, mainframe resources, etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"A View into the Future -- Netezza's Technology RoadMap" by Phil Francisco&lt;/span&gt;&lt;br /&gt;1)  Netezza is adding 2 new classes of machines.  'Cruiser' is a much bigger data storage device that can hold up to 10 Petabytes in one machine.  'Skimmer' is sort of an edge device, maybe meant to help take load off the primary Netezza machine similar to how mainframe controllers sometimes reduce load on the primary box.  (That's my guess on Skimmer, though. I might be wrong on that one.)&lt;br /&gt;2)  Netezza's Twin Fin has had improvements in concurrency, where it now handles 40-50 queries per second.  In the future they'd like to get up to around 200 per second.&lt;br /&gt;3)  In the future, they'd like to support loads in the 10 TB/hour range.&lt;br /&gt;&lt;br /&gt;That's it for day 2!  If you're new to massive data warehousing, some of these notes may have been a little odd.  But I hope you've found at least something of interest.&lt;br /&gt;&lt;br /&gt;'Till next time,&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-5739852917099788228?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/5739852917099788228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=5739852917099788228' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5739852917099788228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5739852917099788228'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/06/more-top-3-take-aways-from-enzee.html' title='More Top 3 Take-Aways from Enzee Universe'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_jK_3qAYFh-o/TCJq-FllsTI/AAAAAAAAAE0/B2pDpkbsKIs/s72-c/untitled.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-4765496857114880816</id><published>2010-06-23T15:01:00.002-05:00</published><updated>2010-06-23T15:03:29.045-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Netezza'/><title type='text'>Top 3 take-aways from Enzee Universe</title><content type='html'>I've been at "Enzee Universe", the world-wide Netezza conference and offer these top 3 take-aways from the sessions I've seen at day 1.&lt;br /&gt;&lt;br /&gt;What's a Netezza?&lt;br /&gt;A Netezza is a database appliance.  That means it's a refridgerator-sized box that has about 100 disk drives in it, with many cpus, and a high-speed network inside.  It's optimized for data warehousing, so when you add data to a table the data automatically gets divided over the 100 disk drives.  This dramatically lowers database operations, as each table is 1/100th the size it otherwise would have been, so scans happen 100 times faster.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"Best Practices With Netezza" by David Birmingham (author of "Netezza Underground")&lt;/span&gt;&lt;br /&gt;1)  Make floats into ints.  Ints compress on the Netezza and thus are more efficient.&lt;br /&gt;2)  When making performance changes, consider all 3 components of the ETL/Data Warehouse/BI stack.  Don't optimize one at the expense of another.&lt;br /&gt;3)  Use CTAS (Create Table As Select) often.  Intermediate steps (making 'work tables') is good practice.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"Netezza 101" by Ed Patterson&lt;/span&gt;&lt;br /&gt;1)  The Netezza has a 10GB internal network, and can currently hold up to 7 Petabytes of storage.&lt;br /&gt;2)  The SCSI drivers allow up to 110 MB/second of data transfer, but since data compression is transparent and automatic (right next to the disk), effective rates are really more like 440 MB/second per disk.&lt;br /&gt;3)  The Netezza can currently load data at a rate of about 1 TB an hour.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Featured keynote by Donald Feinberg, Distinguished Analyst at Gartner&lt;/span&gt;&lt;br /&gt;1)  Memory is getting much bigger, now over 1 TB on a server.  The future of data warehousing may be in-memory, not on SSD or Flash as some expect.&lt;br /&gt;2)  Memory is more expensive to buy than disk, but it requires only 1% of the electricity.  This will become an important economic consideration.&lt;br /&gt;3)  There is a bright future in Predictive Analytics.&lt;br /&gt;&lt;br /&gt;That's it!  I hope you found something of interest in all that.  If so, tune in again for another list from Day 2.&lt;br /&gt;&lt;br /&gt;'Till then,&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-4765496857114880816?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/4765496857114880816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=4765496857114880816' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4765496857114880816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4765496857114880816'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/06/top-3-take-aways-from-enzee-universe.html' title='Top 3 take-aways from Enzee Universe'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-46001818829598104</id><published>2010-06-13T21:00:00.003-05:00</published><updated>2010-06-13T21:05:23.827-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Plone'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Book Review for "Plone 3 Products Development Cookbook"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_jK_3qAYFh-o/TBWNpiL9FEI/AAAAAAAAAEs/qI_5o7uIGkk/s1600/6729_MockupCover.jpg.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 125px; height: 152px;" src="http://3.bp.blogspot.com/_jK_3qAYFh-o/TBWNpiL9FEI/AAAAAAAAAEs/qI_5o7uIGkk/s320/6729_MockupCover.jpg.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5482443866084545602" /&gt;&lt;/a&gt;&lt;br /&gt;Let me make one thing clear to start:  This is a book by developers, for developers.  The authors clearly state in the Preface that the readers should have some knowledge of Python, Plone and Zope and I believe this is very true.  There's little material here to get the newbie up to speed on basic concepts.  But if you're already at that point, then this book reads like working notes from an expert Plone 3 consultant, and there is much worthwhile content here for you.&lt;br /&gt;&lt;br /&gt;The first chapter is the only one that offers a newbie-level entry level.  It covers Plone 3 installation, and gives some advice on establishing your initial Plone site.  Once that chapters done, hang on tight-- the coddling is over!  The text then jumps straight to recommendations for tools used for development.  The authors clearly have a good amount of experience in adding functionality to Plone, and they offer great advice on which tools will be useful.  Given the base of those two chapters, the book then launches right into the proper way to develop products for Plone 3.  &lt;br /&gt;&lt;br /&gt;The goals of the book are really outlined back in the preface.  The authors have selected 10 pieces of functionality that are not found in a base Plone 3 installation.  I found all 10 to be requests you might easily find in the 'real world'.  (Examples:  Prepare the website for internationalization, allow multimedia content that should be both playable on the site and downloadable.  The rest are just as reasonable.)&lt;br /&gt;&lt;br /&gt;Once you know what the authors are setting out to accomplish, you are presented with answers to all these challenges.  The answers are formatted in a pattern repeated for each action that adds functionality:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Getting Ready&lt;/span&gt; - outlines installation prerequisites, the things you'll need to gather.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to Do It&lt;/span&gt; - step by step instructions on how to implement your changes.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How It Works&lt;/span&gt; - after you've configured things in the previous step, this step explains why things work.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;There's More&lt;/span&gt; - an optional section where further reading can be found, or maybe extras like test procedures.&lt;br /&gt;&lt;br /&gt;Along the way the authors provide tips and techniques for expert Plone development.  These include debugging, documentation, testing, and packaging.  I was especially pleased that the authors took time to provide text on performance considerations, something not always present in books of this type.&lt;br /&gt;&lt;br /&gt;If I had one wish for this book, it would be for more illustrations and a little more remedial material for developers not already knee-deep in Plone development.  Outside that, I'd recommend that anyone doing Plone 3 development should look at this book.  There are so many expert level tips and tricks contained here, I imagine nearly everyone is going to learn something-- many will learn many things.&lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href="https://www.packtpub.com/plone-3-3-products-development-cookbook/book"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy Reading!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-46001818829598104?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/46001818829598104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=46001818829598104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/46001818829598104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/46001818829598104'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/06/book-review-for-plone-3-products.html' title='Book Review for &quot;Plone 3 Products Development Cookbook&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_jK_3qAYFh-o/TBWNpiL9FEI/AAAAAAAAAEs/qI_5o7uIGkk/s72-c/6729_MockupCover.jpg.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-742072610135626297</id><published>2010-06-12T09:00:00.002-05:00</published><updated>2010-06-12T09:06:21.850-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IT Business'/><title type='text'>Profession in Crisis -- The Moving Ladder problem</title><content type='html'>Let me be clear about this:  I love my work.  Programming has been very good to me, and I've loved the challenges it presents.  But I wonder if industry is making short-sighted decisions that will eventually bring crisis to our profession.&lt;br /&gt;&lt;br /&gt;I work for a fairly large company (6,000 employees, a little over $1B in revenue).  For the past few years we've been following what I think is typical industry practice:  currently employed programmers are largely domestic, while new hires are sourced almost entirely from offshore data centers.  At first, we had new-hire data centers in India, then we started in Poland and most recently in China.&lt;br /&gt;&lt;br /&gt;By the way, this is not a rant against the offshore programmers.  Who can fault anyone for seeking employment and providing for their families?   Today's column is about a business problem, not the offshore debate.&lt;br /&gt;&lt;br /&gt;Anyone who's ever worked with consultants will recognize that effective programming is comprised of two primary pieces:  &lt;span style="font-weight:bold;"&gt;knowledge of the toolset&lt;/span&gt; (language, frameworks, configurations, etc.) and &lt;span style="font-weight:bold;"&gt;knowledge of the business domain&lt;/span&gt;.  High-end consultants typically start an assignment with a lengthy debriefing in which business knowledge is described to them.  This is necessary because it's impossible to make informed strategic decisions without a good understanding of the business context you're working in.  The same is true of stay-in-place programmers:  only entry-level coders bring value solely through toolkit knowledge.  Mid-to-upper level coders have to understand the business, so they can make informed architectural level decisions.  The higher up the ladder you go, the stronger the business/technical see-saw tilts towards business knowledge.&lt;br /&gt;&lt;br /&gt;OK, here's the problem:  With our moving-low-dollar-hiring model, we've effectively cut off the business domain accumulation pipeline.  Today's entry level coders are tomorrow's application subject matter experts.  What we have done is constantly moved the bottom rungs of the ladder, so nobody is being given the time to thoroughly understand how the complicated applications work.  We've still got domestic experts on the top end of the ladder who learned the ropes while bottom-level jobs led directly to the top-level jobs.  But noone is going to be able to climb to the top of the ladder in the future-- the bottom rungs keep moving.&lt;br /&gt;&lt;br /&gt;What will happen when today's set of application architects retires or moves on?  There won't be any mid-level experts in India-- those experts took other jobs when the coding work went to Poland.  And there won't be any domain experts in Poland, either-- that feeder pipeline was shut down when the low-end work went to China.  I'm sure China's surging economy will eventually price the Chinese coders out of the business too, and we will again move the bottom rungs of the ladder somewhere else.&lt;br /&gt;&lt;br /&gt;I guess a pure capatilist would say that this is forcing efficiency somehow, that the business will adjust to this problem as it seeks to become more efficient.  I just don't see that working out-- the people who know how to make effective strategic decisions are invariably those people who have had years, maybe decades to understand how a company's applications power the enterprise.  I think it's a short-sighted business anti-pattern, and short-term greed is driving it.&lt;br /&gt;&lt;br /&gt;Maybe the end result will just be sub-optimal business performance in the long run.  Like all engineers, I just hate to see inefficiency, especially if it's something that's shaping up to manifest itself years down the line.&lt;br /&gt;&lt;br /&gt;But for today, I've got a couple of new books to read.  One's on Plone, the other on DSLs in Groovy.  So I'm going to go study a little just-for-fun low level coding, just for the joy of learning new things.  That's something all programmers across the globe can enjoy!&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-742072610135626297?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/742072610135626297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=742072610135626297' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/742072610135626297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/742072610135626297'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/06/profession-in-crisis-moving-ladder.html' title='Profession in Crisis -- The Moving Ladder problem'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-5902786110808835269</id><published>2010-06-06T16:34:00.021-05:00</published><updated>2010-06-06T17:23:39.553-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ops'/><title type='text'>Your allies in IT:  The Ops crew</title><content type='html'>I've always worked in shops where the 'Development' side of the house produced applications and the 'Ops' side of the house ran those applications.  &lt;br /&gt;&lt;br /&gt;If you've never heard the term 'Ops', that means the folks that manage data storage, migrate programs from environment to environment (dev to test to cert to prod, etc), and FTP files back and forth to clients.  If your company deals with printed materials (statements, bills, etc.) it's the ops folks that produce these. They might also manage tape libraries, migrate applications from old servers to new ones, or manage your virtualized environment.  In short, they &lt;span style="font-weight:bold;"&gt;take all the stuff developers produce and put it to use&lt;/span&gt; so the company can make money.  They're the ones that &lt;span style="font-style:italic;"&gt;RUN&lt;/span&gt; your application.&lt;br /&gt;&lt;br /&gt;Today, I'd like to present five things every developer should know about Ops.&lt;br /&gt;  &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ops is NOT boring and repetitive work&lt;/span&gt;&lt;br /&gt;Ops is about efficiency and proper execution.  To be good in ops, you have to understand the resources the applications use (disk, processor consumption, printers, etc.)  and know how to continually improve usage of these finite resources.  This means lots of analytical thinking, and lots of adrenaline on days (nights, probably) when changes are made to the all important production eco-system.  Ops work is most definately NOT boring unless your shop has had very good leadership for so long everything's already smoothed out and nothing ever changes.  &lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ops thinks Dev is a bunch of Prima Donnas&lt;/span&gt;&lt;br /&gt;Somewhat true - Depending on the quality of your Dev shop, you may have a few unenlightened souls running around thinking they're superior to Ops in some way.  Not true, Kemo Sabe-- and thinking that way is a good way to leave valuable bridges unbuilt.  Many times I've had my skin saved by Ops personnel willing to work a little harder to restore a dataset or run some special fix-it job that will cover a mistake I'd made.  (Sometimes they even concoct the scheme necessary to fix things.)  It's easy for the Dev-Ops relationship to be somewhat adversarial, though, if there's not mutual respect.  In that case the Ops guys can be like the fabled Chinese philosopher who just waited by the river for the body of his adversary to come floating by.  In this case, a friendly Ops ally can fish you out and resuscitate you-- if you've invested in building the relationship.  If you haven't they just have to wait and sooner or later laugh at you when your application goes belly up and you need a special favor.&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ops is a dead-end job - NOT!&lt;/span&gt;&lt;br /&gt;Definately false.  Ops gives you the perspective needed to understand your shop's core business.  You have to know the way things work and the deadlines associated with application run times.  Ops also has to have a handle on online (transactional) operations and the SLAs associated with them.    Ops jobs can definitely lead to strong management positions (i.e. the CIO-type career path), if that's your desired career progression.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ops knows who you are&lt;/span&gt;&lt;br /&gt;They quickly pick up on who's who in the Dev side of the shop-- sharp Devs can be granted extra priveledges at crunch-time while Dev Bozos will almost certainly be  subjected to every stringent by-the-book mandate they have available. Ops will ultimately be given this power, because they feel a lot of the pain when things go wrong.  So if a particular Dev/Architect type has caused them problems in the past, that Dev is going to have a rougher time getting things done. (Getting things done is what ultimately leads to Dev promotions and pay raises, so this is an important consideration.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Smart Ops shops pay a little more&lt;/span&gt;&lt;br /&gt;It is true that some Ops jobs don't require a CS degree or any particular certifications.  Your company can hire people with a limited skill set-- but only if your work is largely one-dimensional and so simplistic it really doesn't require much thought.  But if your work is heterogeneous and you have many time-sensitive deadlines and resources to balance, your shop will be money ahead to pay for good analytical thinkers.  The very best shops I've seen have hired entry-level people to start, then paid them well enough to keep them around for many years.  If they've hired smart (though inexperienced) people, those people will accumulate valuable knowledge as time goes by and will yield an incredible ROI over time as they keep your IT machine smoothly running.  A single salvaged SLA can pay for a lot of marginally bigger paychecks!&lt;br /&gt;&lt;br /&gt;So if your shop runs production applications, I'd urge every Developer and Architect to adapt the right mindset towards our friends on the Ops side.  It'll pay off, big time!&lt;br /&gt;&lt;br /&gt;'Till next time,&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-5902786110808835269?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/5902786110808835269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=5902786110808835269' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5902786110808835269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5902786110808835269'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/06/your-allies-in-it-ops-crew.html' title='Your allies in IT:  The Ops crew'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-1566630815870504254</id><published>2010-05-29T08:28:00.013-05:00</published><updated>2010-05-29T08:48:54.243-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>Can you program without coding?</title><content type='html'>Do you think you can program without coding?  I never would have thought so, but now I do.  It's possible to make user-defined types and interfaces, call services, create a service, make a deployment artifact, deploy and test-- all without writing a single semi-colon, angle bracket, or curly brace.&lt;br /&gt;&lt;br /&gt;You don't believe it?  It's true!  I've been working with SOA toolkits from several vendors over the past several months, and have been deeply impressed by how much behind-the-scenes coding can be abstracted away from the coder.  Check these out:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_jK_3qAYFh-o/TAEas5DYTSI/AAAAAAAAAEk/9M_MGxby314/s1600/Intalio_Make_Type.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_jK_3qAYFh-o/TAEas5DYTSI/AAAAAAAAAEk/9M_MGxby314/s320/Intalio_Make_Type.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5476687980390796578" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Defining a user-defined type  (This picture shows Intalio, one of the less expensive UIs)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Define a user-defined type (similar to a class)&lt;/span&gt;&lt;br /&gt;Using the UI, you click an icon to 'add a field'.  You type in a name for the field, then choose a type for the field.  The available types are XML types-- string, int, long, etc.  (Or user-defined types you've earlier declared.)  Behind the scenes the UI will build you an XML schema (XSD).  The nice part?  The XML is well-formed every single time, without any hand-coding of the XML!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Define an interface&lt;/span&gt;&lt;br /&gt;A few clicks of a button lets you declare a new interface.  You choose the input and output types from XML primitives and the user-defined types you have made.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jK_3qAYFh-o/TAEX6X34peI/AAAAAAAAAEc/-MnhlYDpiEg/s1600/Intalio_WSDL.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 198px;" src="http://1.bp.blogspot.com/_jK_3qAYFh-o/TAEX6X34peI/AAAAAAAAAEc/-MnhlYDpiEg/s320/Intalio_WSDL.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5476684913467500002" /&gt;&lt;/a&gt;&lt;br /&gt;WSDL, used graphically to call partner web services&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Call Web Services&lt;/span&gt;&lt;br /&gt;You import references to external services from a registry or directly from the wsdl offered by that service.  This will give you a UI widget you can then drag onto your canvas to call the service.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Declare a service&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Once you have your interface defined and the business logic (declaring variables, calling services, etc.) defined, you can generate an implementation for that service.  This makes your logic available (usually as HTTP/SOAP, JMS, etc.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Branches&lt;/span&gt;&lt;br /&gt;Again, using UI figures you place a branch in your logic and indicate through XML XSDs how to decide which path your code should follow.  (Of course you don't actually see XML, you see grid boxes of field names, you click on the one you want.)  You can make loops in a similar fashion.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Make a deployment artifact&lt;/span&gt;&lt;br /&gt;You can choose to 'export' your business logic as a .JAR or .EAR.  Without any scripting, your IDE will produce an artifact ready to deploy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Test your logic&lt;/span&gt;&lt;br /&gt;Some of the high-end tools come with embedded application servers.  This allows you to seamlessly deploy your component and test it right from the IDE.  &lt;br /&gt;&lt;br /&gt;You can do all this, and more.  So what does this mean to us?&lt;br /&gt;&lt;br /&gt;I have no doubt these toolkits will continue to get better and more refined as time goes on.  It is already possible to be a productive programmer without writing any traditional code or actually seeing any XML.&lt;br /&gt;&lt;br /&gt;But the main point is this-- the person doing this programming still has to &lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;think&lt;/span&gt;&lt;/span&gt; like a coder.  You still have to know when you need a variable, have to understand primitive types (long, int, etc.), still have to understand how a loop works, etc.  Perhaps most important, you still have to think in a logical and methodical way.  For this reason, I am actually optimistic about these developments-- I think it's just making a programmer more productive.&lt;br /&gt;&lt;br /&gt;So how do you get started?  For no money, I'd suggest you have a look at &lt;a href="http://community.intalio.com/downloads.html"&gt;Intalio BPM&lt;/a&gt;.  This freely available toolkit will let you validate what I've said here and get some idea what these toolkits can do.&lt;br /&gt;&lt;br /&gt;Happy (Codeless, this time) Programming!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-1566630815870504254?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/1566630815870504254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=1566630815870504254' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1566630815870504254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1566630815870504254'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/05/can-you-program-without-coding.html' title='Can you program without coding?'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_jK_3qAYFh-o/TAEas5DYTSI/AAAAAAAAAEk/9M_MGxby314/s72-c/Intalio_Make_Type.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-2200698560331224258</id><published>2010-05-25T20:53:00.003-05:00</published><updated>2010-05-25T21:04:04.442-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Plone'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Packt Plone double-whammy</title><content type='html'>Packt Plone double-whammy&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jK_3qAYFh-o/S_yARRclV8I/AAAAAAAAAEM/0Vibwl8Gfuc/s1600/6729_MockupCover.jpg.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 125px; height: 152px;" src="http://1.bp.blogspot.com/_jK_3qAYFh-o/S_yARRclV8I/AAAAAAAAAEM/0Vibwl8Gfuc/s320/6729_MockupCover.jpg.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5475392281205102530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_jK_3qAYFh-o/S_yAQ9JM4vI/AAAAAAAAAEE/1Ogkf2gPk54/s1600/Plone3Multimedia.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 122px; height: 144px;" src="http://2.bp.blogspot.com/_jK_3qAYFh-o/S_yAQ9JM4vI/AAAAAAAAAEE/1Ogkf2gPk54/s320/Plone3Multimedia.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5475392275755098866" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Have you tried Plone?  It's an open source content management system that can be used as the basis for many kinds of websites.  Plone strong points are its flexible and adaptable workflow, very good security, extensibility, high usability and flexibility.  Sound interesting?  If so, you're in luck.  I'll be reviewing 2 new Plone books in the near future and you have the opportunity to purchase Plone books at a discount.&lt;br /&gt;&lt;br /&gt;The first new book is "Plone 3 Products Development Cookbook", which promises 70 Plone recipes, and can be found &lt;a href="https://www.packtpub.com/plone-3-3-products-development-cookbook/book"&gt;here&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The book offers a &lt;a href="https://www.packtpub.com/sites/default/files/6729-chapter-5-creating-a-custom-content%20%20.pdf"&gt;sample chapter&lt;/a&gt;, it reads cleanly and clearly.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The second book is "Plone 3 Multimedia", which tells how to build a media-rich website with images, audio, video, and Flash.&lt;br /&gt;The book is found &lt;a href="https://www.packtpub.com/plone-3-3-multimedia-website/book?utm_source=plone_campaign&amp;utm_medium=packtpub.com&amp;utm_term=may&amp;utm_campaign=Plone%2B3%20Multimedia"&gt;here&lt;/a&gt; and a sample chapter is &lt;a href="https://www.packtpub.com/sites/default/files/7665-chapter-3-managing-audio-content.pdf"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In addition to the special pricing (discounts of 20% on print books and 30% on e-books) my friends at Packt tell me they'll be offering a chance at a 'lucky draw' iTunes or Amazon gift card to early purchasers of these books.  I'm not privvy to exact details of that part of the promotion, so watch the web site for that one.&lt;br /&gt;&lt;br /&gt;The special offer is detailed &lt;a href="http://www.packtpub.com/article/plone-campaign-may-2010"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I look forward to providing reviews on this blog in the near future.  'Till then,&lt;br /&gt;&lt;br /&gt;Happy Reading!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-2200698560331224258?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/2200698560331224258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=2200698560331224258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2200698560331224258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2200698560331224258'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/05/packt-plone-double-whammy.html' title='Packt Plone double-whammy'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_jK_3qAYFh-o/S_yARRclV8I/AAAAAAAAAEM/0Vibwl8Gfuc/s72-c/6729_MockupCover.jpg.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-4920523206983369294</id><published>2010-05-23T13:06:00.007-05:00</published><updated>2010-05-23T13:21:33.960-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='Location Transparency'/><title type='text'>'Enterprise' 101 - Location Transparency</title><content type='html'>Let's say you wrote a nice service, something like getHello(), and put it on a server. Now you want to write your client and use it to invoke your service.  If you're following most development cookbooks, you're writing some code like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jK_3qAYFh-o/S_lvFEr971I/AAAAAAAAAD0/61Qy0FgYi7Y/s1600/DirectCall.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 297px; height: 89px;" src="http://1.bp.blogspot.com/_jK_3qAYFh-o/S_lvFEr971I/AAAAAAAAAD0/61Qy0FgYi7Y/s320/DirectCall.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5474528954993733458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt; public class TestClient {&lt;br /&gt;     public static void main(String [] args) {&lt;br /&gt;       try {&lt;br /&gt;         String endpoint =&lt;br /&gt;             "&lt;span style="font-weight:bold;"&gt;http://ws.apache.org:5049/axis/services/echo&lt;/span&gt;";&lt;br /&gt;  &lt;br /&gt;        Service  service = new Service();&lt;br /&gt;        Call     call    = (Call) service.createCall();&lt;br /&gt;  &lt;br /&gt;        call.setTargetEndpointAddress( new java.net.URL(endpoint) );&lt;br /&gt;        call.setOperationName(new QName("http://soapinterop.org/", echoString"));&lt;br /&gt;  &lt;br /&gt;        String ret = (String) call.invoke( new Object[] { "Hello!" } );&lt;br /&gt;&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;So what's wrong with that, you ask?  Your code is going to work-- your client will be able to call the server.  But you're missing an important ingredient-- &lt;span style="font-weight:bold;"&gt;Location Transparency&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The client code you see above is less than Enterprise-worthy because the service endpoint is embedded directly in the client source code.  What happens when the &lt;span style="font-weight:bold;"&gt;server has a hardware failure&lt;/span&gt; and needs to be replaced?  Your client code will be irreversably broken and will need to be recompiled.  Also, you are confined to hitting one service from your client-- if the server becomes a bottleneck, you don't have a good way to scale out.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Location Transparency-- the Registry solution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One solution to the Location Transparency problem is to use a registry to find your server.  The registry is &lt;span style="font-weight:bold;"&gt;a well-known place where servers are registered and clients go to ask locations of servers&lt;/span&gt;.  UDDI is the 'spec' answer for web services, though it hasn't worked out as well as the spec writers probably would have liked.  Today there are other web service-centric registries that serve the same purpose as UDDI, but offer 'value adds' from the implementors.  In the &lt;span style="font-weight:bold;"&gt;CORBA&lt;/span&gt; world, you might use a '&lt;span style="font-weight:bold;"&gt;Name Service&lt;/span&gt;' to act as your registry.  Still others might &lt;span style="font-weight:bold;"&gt;code their own registry&lt;/span&gt; using a database or some other CRUD data store.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jK_3qAYFh-o/S_lwj9HOoUI/AAAAAAAAAD8/jVI0utNVV30/s1600/Registry2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 304px; height: 233px;" src="http://1.bp.blogspot.com/_jK_3qAYFh-o/S_lwj9HOoUI/AAAAAAAAAD8/jVI0utNVV30/s320/Registry2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5474530585048162626" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here are some pros and cons of a registry solution:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Registry Pros&lt;/span&gt;&lt;br /&gt;- Allows loose coupling between client and server&lt;br /&gt;- Can be implemented in a way that lets the client 'discover' services based on attributes like method arguments&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Registry Cons&lt;/span&gt;&lt;br /&gt;- Does not take into account servers that crash.  If a server is registered then crashes, the registry will still steer clients toward the dead machine.&lt;br /&gt;- Does not make a provision for load balancing.  A registry isn't usually charged with telling a client which like-typed server to run against-- it just provides a list of the servers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Niceties&lt;/span&gt;&lt;br /&gt;- If you can code your services to self-register with the registry when they start, that's a good thing.  Your operational admins probably have better things to do then key new services into the registry.&lt;br /&gt;- You'll also want the services to self-unregister when they come down gracefully.  Note that this doesn't help a crashed server, though.&lt;br /&gt;&lt;br /&gt;There are other ways to address the Location Transparency problem, though-- through &lt;span style="font-weight:bold;"&gt;Messaging&lt;/span&gt; and through a &lt;span style="font-weight:bold;"&gt;Load Balancer&lt;/span&gt; are a couple of good ones.  But those are posts for another day.&lt;br /&gt;&lt;br /&gt;'Till then, &lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-4920523206983369294?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/4920523206983369294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=4920523206983369294' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4920523206983369294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4920523206983369294'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/05/enterprise-101-location-transparency.html' title='&apos;Enterprise&apos; 101 - Location Transparency'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_jK_3qAYFh-o/S_lvFEr971I/AAAAAAAAAD0/61Qy0FgYi7Y/s72-c/DirectCall.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-3145081521465411911</id><published>2010-05-19T21:10:00.003-05:00</published><updated>2010-05-19T21:12:22.418-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Book Review "CodeIgniter 1.7 Professional Development"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jK_3qAYFh-o/S_SaRSN9msI/AAAAAAAAADs/dHcdnUprx-I/s1600/1849510903.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 123px;" src="http://1.bp.blogspot.com/_jK_3qAYFh-o/S_SaRSN9msI/AAAAAAAAADs/dHcdnUprx-I/s320/1849510903.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5473169068900850370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This book is a good introduction to the CodeIgniter library.  CodeIgniter is a multi-purpose PHP library that contains a lot of good functionality and is easy to use.  This book is a survey-level guide to the library, accompanied by a great many easy to read code snippets that help the reader understand CodeIgniter usage.&lt;br /&gt;&lt;br /&gt;Here are some of the topics I found most useful:&lt;br /&gt;&lt;br /&gt;- MVC programming&lt;br /&gt;- PHP Style&lt;br /&gt;- Benchmarking (timing ticks) &lt;br /&gt;- Input and security&lt;br /&gt;- Email&lt;br /&gt;- File Upload&lt;br /&gt;- Pagination&lt;br /&gt;- Session management&lt;br /&gt;- Database interaction (to include 'Active Record' implementation)&lt;br /&gt;- User Authentication &amp; Security&lt;br /&gt;- Tips on building a large-scale application&lt;br /&gt;- RESTful Web Services&lt;br /&gt;- Extending CodeIgniter and sharing back with the community&lt;br /&gt;&lt;br /&gt;I found this book to be an easy read.  I've done a little PHP coding, but not a great deal, so I really appreciated the easy to read code snippets that accompanied nearly every topic.  The book covers a lot of territory, so there's not a great amount of detail on any of the covered topics, but there is enough material to give you a taste of what the library holds.  If that's not enough to help you implement what you need, at least you're aware of what CodeIgniter can do for you.&lt;br /&gt;&lt;br /&gt;The book's back cover says this is a book for advanced PHP developers, but I'm not sure that's the right target audience-- I'd expect a true expert might feel they're getting too little advanced material here.  For newbies to mid-level PHP coders, though (like myself) I think this book does a great job of introducing the types of things you can do in PHP and some really easy code examples to leverage.&lt;br /&gt;&lt;br /&gt;If you've got an interest in PHP and are looking for a good library to let you write advanced web site functionality easily, I'd encourage you to check out "CodeIgniter 1.7 Professional Development".  You can find it &lt;a href="https://www.packtpub.com/codeigniter-1-7-professional-development/book"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-3145081521465411911?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/3145081521465411911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=3145081521465411911' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3145081521465411911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3145081521465411911'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/05/book-review-codeigniter-17-professional.html' title='Book Review &quot;CodeIgniter 1.7 Professional Development&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_jK_3qAYFh-o/S_SaRSN9msI/AAAAAAAAADs/dHcdnUprx-I/s72-c/1849510903.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-2293730320661766025</id><published>2010-05-15T07:51:00.007-05:00</published><updated>2010-05-15T08:05:45.728-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Simplicity Drives the Net's Most Popular Framework</title><content type='html'>Do you know which framework is dominant on the web?  Have a look at this chart to see which frameworks are hot, and which are not.  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jK_3qAYFh-o/S-6cDlL6fSI/AAAAAAAAADk/adgXqYxzsjE/s1600/PHP_Popularity.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_jK_3qAYFh-o/S-6cDlL6fSI/AAAAAAAAADk/adgXqYxzsjE/s320/PHP_Popularity.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5471482182637354274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can check the current stats whenever you want &lt;a href="http://trends.builtwith.com/framework"&gt;here&lt;/a&gt;: &lt;br /&gt;&lt;br /&gt;I was somewhat surprised to read those statistics.  I would've thought some of the less popular frameworks would've done better, and I would've thought some of the most popular wouldn't be doing so well.  I started thinking about why PHP is doing so well, and I've drawn the conclusion that it's the amazing simplicity.  (To be sure, the made-for-the-web functionality has a large part to do with it, but other frameworks offer that, too.)  Here are a few of the things I think make PHP easy to use:&lt;br /&gt;&lt;br /&gt;- No compiles or compiled artifacts to shuffle around&lt;br /&gt;- No complicated configurations to master, no lengthy XML files to edit&lt;br /&gt;- As simple and procedural as you want it to be&lt;br /&gt;- Plenty of power, if you need it.  If you don't, only blissful simplicity&lt;br /&gt;- Easy language syntax.  To me, it reads something like plain old C.&lt;br /&gt;- Everything's in one place -- You can just mix Server-side scripting right there with your HTML pages (Wow, that flies right in the face of the justification for JSPs and ASPs, doesn't it?)&lt;br /&gt;- Fantastic iterative cycle-- you make a directory and edit scripts with GEdit/Notepad/Vim/etc, then check it in the browser.  Nothing could be simpler!&lt;br /&gt;&lt;br /&gt;Here's an example:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;My First PHP Page&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;      echo &amp;quot;Hello World!&amp;quot;;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;What could be more simple than that?&lt;br /&gt;&lt;br /&gt;If you haven't tried PHP, I'd urge you to do it.  It really can be fun. &lt;br /&gt;&lt;br /&gt;How do you get started?&lt;br /&gt;&lt;br /&gt;1)  Get a web server that's PHP enabled.  (You can search the web for any of the pre-packaged stacks.  I use the excellent EnterpriseDB PostGres/Apache/PHP stack found &lt;a href="http://www.enterprisedb.com/products/download.do"&gt;here&lt;/a&gt;) &lt;br /&gt;&lt;br /&gt;2)  Find the web root for your web server.  For my Apache installation, it's called 'www'.  Put a new directory under that one, and add a simple PHP script to that directory.  (Maybe the hello world above.  Put it in a file called 'Hello.php' or something like that.)&lt;br /&gt;&lt;br /&gt;3)  Point your browser to http://localhost:&lt;your Port&gt;/&lt;YourFolder&gt;/Hello.php  Maybe something like http://localhost:8080/HelloExperiment/Hello.php&lt;br /&gt;&lt;br /&gt;4)  Edit the file to add more PHP and watch the results change in your browser as you refresh.  That's it!&lt;br /&gt;&lt;br /&gt;The web is full of great sites on PHP, including the excellent &lt;a href="http://www.php.net"&gt;www.php.net&lt;/a&gt;.  Read/Edit/Watch the change!&lt;br /&gt;&lt;br /&gt;I love this simplicity, don't you?  That's something we could all use more of.&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-2293730320661766025?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/2293730320661766025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=2293730320661766025' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2293730320661766025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2293730320661766025'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/05/simplicity-drives-nets-most-popular.html' title='Simplicity Drives the Net&apos;s Most Popular Framework'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_jK_3qAYFh-o/S-6cDlL6fSI/AAAAAAAAADk/adgXqYxzsjE/s72-c/PHP_Popularity.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-4775261287640904827</id><published>2010-05-08T08:19:00.004-05:00</published><updated>2010-05-08T08:29:23.496-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Every programming language should have a tool like Acire!</title><content type='html'>I updated my laptop to Ubuntu Lucid Lynx last week, and along the way I picked up a few new tools.  One of these is 'Acire', a learning utility for Python.&lt;br /&gt;&lt;br /&gt;Acire is a great idea-- you can browse code snippets for topics you're interested in, view some simple source code, and observe the execution all in one 3-pane window.  Simply put, it makes for a very easy reference library for Python and a great way to learn more about the language.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_jK_3qAYFh-o/S-VmpGGr5NI/AAAAAAAAADU/PO0k4s8AT4M/s1600/Acire.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_jK_3qAYFh-o/S-VmpGGr5NI/AAAAAAAAADU/PO0k4s8AT4M/s320/Acire.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5468890178710660306" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Acire is packaged for Debian, and I'm not sure if it runs off Ubuntu.  (I print this to save you time if you're not an Ubuntu user.)  I wish it would run everywhere, and I wish even more for this to be available in multiple languages.  It's a great learning tool!&lt;br /&gt;&lt;br /&gt;Acire can be found here:&lt;br /&gt;http://www.jonobacon.org/2010/01/12/acire-0-2-released/&lt;br /&gt;&lt;br /&gt;For those of us who can use it, enjoy!&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-4775261287640904827?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/4775261287640904827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=4775261287640904827' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4775261287640904827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4775261287640904827'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/05/every-programming-language-should-have.html' title='Every programming language should have a tool like Acire!'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_jK_3qAYFh-o/S-VmpGGr5NI/AAAAAAAAADU/PO0k4s8AT4M/s72-c/Acire.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-6811419164769081755</id><published>2010-05-01T07:41:00.010-05:00</published><updated>2010-05-01T08:12:40.835-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='time management'/><category scheme='http://www.blogger.com/atom/ns#' term='self improvement'/><title type='text'>4 Ways To Become a Better Developer, in No Time</title><content type='html'>If you're like me, you're working hard to find the right work/life balance.  In that game, I think any little edge can be of value.  Here are 4 tips I use to self-improve without sacrificing any time from the 'personal' side of the ledger.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Multi-purpose your MP3 player&lt;/span&gt;&lt;br /&gt;If you have an MP3 player, put some tech-talks on it as well as music.  Then when you're out doing something that allows effective multi-tasking, listen to them.  I like to go running, on some days I'll listen to a podcast on software engineering.  Google will help you find lots of good podcasts, one of the best sources is "Software Engineering Radio", found &lt;a href=" http://www.se-radio.net/"&gt;here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Put a tech book (or at least tech tutorial printout) in your car&lt;/span&gt;&lt;br /&gt;There are going to be times when you end up waiting somewhere-- these are ideal times to read material you just might not have time for otherwise.  Probably my favorite example is a shopping trip.  My wife loves to shop, I hate it.  But now I just leave a tech book in the car, which I take out only after we get to the store we're driving to.  Once we're there, I let her go through the store while I catch up on my reading.  Then when she's done at that store, I put the book down as we talk and drive to the next place.  Everybody's happy!  (Warning:  We programmers can be overly focused sometimes, which can lead to spousal displeasure.  Be cognizant of the fact that you shouldn't keep reading once your spouse returns to the car!)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Take a book to the Oil Change&lt;/span&gt;&lt;br /&gt;If you're like me, you've got two cars in the family.  That means every 3 months somebody's going to be going to the shop for at least an hour-- twice!  To make these waits more bearable, I've started taking a book in with me.  The same technique works well at the doctor's office-- sitting in the waiting area for my checkup can be time well spent!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Leave a 'Boot-Up' Task for Tomorrow&lt;/span&gt;&lt;br /&gt;My work laptop takes a long time (several minutes, at least) to boot up.  This isn't because the machine is overloaded or needs a cleanup-- it's because this is when corporate IT pushes scripts and patches onto the box.  I like to leave myself something to work on while this is going on-- a small diagram reminding myself what I was working on, a tech document, a to-do list to think about, etc.  Then when my machine is busy waking up, I can start getting myself back into the right mindset.&lt;br /&gt;&lt;br /&gt;I'm sure there are a lot of other ways to effectively use time that would otherwise be spent unproductively.  If you've got a favorite, please leave it as a comment.&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-6811419164769081755?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/6811419164769081755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=6811419164769081755' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/6811419164769081755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/6811419164769081755'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/05/4-ways-to-become-better-developer-in-no.html' title='4 Ways To Become a Better Developer, in No Time'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-5004904046874184699</id><published>2010-04-24T10:26:00.002-05:00</published><updated>2010-04-24T10:29:42.973-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project management'/><title type='text'>4 Things That are Almost like Programming, but not quite</title><content type='html'>Do you sometimes struggle in explaining your work to others?  Especially at project planning time, I sometimes reach for metaphors to explain why estimating can be hard.  Here are a few of the metaphors I've used in the past, and a few reasons they aren't adequate.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Building a house or bridge&lt;/span&gt;&lt;br /&gt;This is a common analogy, and one often used by those that believe programming is 'engineering'.  It's true that you can break the problem down into smaller pieces, then plan constructing the pieces.  Repeat this cycle, going into ever greater detail, until you have your 'plan'.  In this way, construction is similar to traditional 'waterfall' methodologies.  There are similarities to 'agile' practices, too.  A house is built iteratively-- you pour the foundation, then put up the framing, then the roof, etc.  At any point along the way you can evaluate and make small changes as you go. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;But....&lt;/span&gt; a building is a lot more like other buildings than one computer program is like another computer program.  We've been building houses and bridges for centuries, and there are only so many variations among them.  Programs, on the other hand, have only been built for about 50 years and they have a lot more variables that can change.  Programs also have temporal issues to deal with-- the order of things happening must be considered.  (A bridge, on the other hand, mostly just stands there and lets things go over it.)  For these reasons, I don't usually like this analogy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Writing a book&lt;/span&gt;&lt;br /&gt;In both cases, you're using text to build your deliverable.  You have to break things into smaller pieces (classes, layers, etc. in software, chapters in books).  You follow style guides, and have an ordering of things.  All the little details you conjure up have to be consistent.  In books, your characters should have past experiences that 'fit' in the context of the story.  In programming, you need to make sure the data you need is available to all facets of the application that require it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;But.... &lt;/span&gt;I think writing a book is probably a lot less restrictive than programming.  You have more freedom in the way you express things, for instance. (I don't think most editors are as picky as compilers.)  In some ways, this makes programming easier-- once you have your goals defined, the ways you can go about achieving them are narrowed down.  The degree of creativity is high in both cases.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Painting a picture&lt;/span&gt;&lt;br /&gt;Painting a picture can be like programming because you're making something creatively, and you're building it in a sort of iterative manner.  This is somewhat like the book argument, except the painting seems a little less constrained in places.  You can choose your medium-- oil paint, water color, chalk, etc.  much as you can choose your implementation language in programming.  Programmers can also bootstrap projects by copying the work of others.  ('Hello World', anyone?  It can be seen sort of like paint-by-numbers.)  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;But....&lt;/span&gt; paintings don't have to be exact.  Their 'goodness' is found in the eye of the beholder.  Oh, if only programs were that way!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Assembling a child's toy&lt;/span&gt;&lt;br /&gt;Have you put together a bigger toy lately?  They usually come in a cardboard box with about a hundred different parts in it, with an instruction sheet written in half a dozen languages.  The assembler (you) reads the instructions and attaches part A to part B.  The instructions (like documentation in software) are sometimes good, sometimes not.  Sometimes you have to refer to a picture of the toy to see how to do it.  This is like studying design patterns or reference implementations.  In today's programming world, (especially Java) we have a lot of frameworks that make programming seem like this.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;But...&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;/span&gt; You never really fabricate anything by yourself in the toy scenario.  You're using parts somebody else made.  So I don't think this one is exactly right, either.&lt;br /&gt;&lt;br /&gt;Those are some of the metaphors I've used.  If you have any better ones, please share!&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-5004904046874184699?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/5004904046874184699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=5004904046874184699' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5004904046874184699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/5004904046874184699'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/04/4-things-that-are-almost-like.html' title='4 Things That are Almost like Programming, but not quite'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-7473107274478425446</id><published>2010-04-21T20:43:00.006-05:00</published><updated>2010-04-21T21:06:53.116-05:00</updated><title type='text'>Book Reviews on the Way: CodeIgnitor, Groovy DSLs</title><content type='html'>The good folks at Packt Publishing are about to release 2 new books with interesting subjects.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jK_3qAYFh-o/S8-sPhtYmmI/AAAAAAAAADE/iRBU_tP5gCI/s1600/1849510903.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 123px;" src="http://4.bp.blogspot.com/_jK_3qAYFh-o/S8-sPhtYmmI/AAAAAAAAADE/iRBU_tP5gCI/s320/1849510903.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5462774255770442338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;CodeIgnitor 1.7 Professional Development&lt;/span&gt;&lt;br /&gt;The book's available &lt;a href="https://www.packtpub.com/codeigniter-1-7-professional-development/book"&gt;here&lt;/a&gt;.&lt;br /&gt;Have you noticed that PHP development is red-hot?  Check the web statistics-- the majority of web development is done with PHP.  (Based on today's data, found &lt;a href="http://trends.builtwith.com/framework/"&gt;here&lt;/a&gt;.) This title promises to teach sound PHP practices, including REST style web services.  I look forward to reading it! &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jK_3qAYFh-o/S8-sZdH2qqI/AAAAAAAAADM/lrOTwqOvc94/s1600/6903_MockupCover.jpg.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 125px; height: 152px;" src="http://1.bp.blogspot.com/_jK_3qAYFh-o/S8-sZdH2qqI/AAAAAAAAADM/lrOTwqOvc94/s320/6903_MockupCover.jpg.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5462774426337979042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Groovy for Domain-Specific Languages&lt;/span&gt;&lt;br /&gt;This book can be found &lt;a href="https://www.packtpub.com/groovy-for-domain-specific-languages-dsl/book"&gt;here&lt;/a&gt;.&lt;br /&gt;DSLs are little languages written in the business terms your users are familiar with.  I've often written DSLs (even before they were commonly called DSLs) but never stopped to think about best practices in doing so.  Coupled with the easy-to-use Groovy language, this book has the potential to increase my productivity, so it's another one I look forward to reading.  Another great topic!&lt;br /&gt;&lt;br /&gt;Watch this blog for reviews as soon as the books are out.  'Till then, Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-7473107274478425446?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/7473107274478425446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=7473107274478425446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/7473107274478425446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/7473107274478425446'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/04/book-reviews-on-way-codeignitor-groovy.html' title='Book Reviews on the Way: CodeIgnitor, Groovy DSLs'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_jK_3qAYFh-o/S8-sPhtYmmI/AAAAAAAAADE/iRBU_tP5gCI/s72-c/1849510903.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-362714226984494719</id><published>2010-04-17T09:08:00.005-05:00</published><updated>2010-04-17T09:17:35.448-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><category scheme='http://www.blogger.com/atom/ns#' term='office life'/><title type='text'>9 reasons I like cubicles better than offices</title><content type='html'>Sometimes developers get offices, sometimes we get cubicles.  I'm not convinced in office is always a better choice, though.  Here are 9 reasons why I think cubicles are better, and 2 reasons they are not:&lt;br /&gt;&lt;br /&gt;1)  &lt;span style="font-weight:bold;"&gt;You're part of the Dev Network&lt;/span&gt;.  Hopefully, your cubicle is in a row with other developers and architects.  If that's the case, you get to listen in on and take part in all kinds of conversations about a wide range of work topics.  In turn, this lets you benefit from other's opinions and experiences.&lt;br /&gt;&lt;br /&gt;2)  &lt;span style="font-weight:bold;"&gt;You have a face&lt;/span&gt;.  Unfortunately, I've worked at places that have had layoffs.  In fact, I've seen some good technicians let go before less effective counterparts-- because the guys who were kept were more familiar to everyone.  Once you're in an office, you become a little less known to your local work group.  (Along the same lines, I've known top-notch technicians who were given less 'street cred' by the senior techs in the shop because the guy worked remote.  Had that guy been a local cube-dweller, I'm sure his opinions would have carried great weight.)&lt;br /&gt;&lt;br /&gt;3)  You're the first to know about &lt;span style="font-weight:bold;"&gt;food carry-ins&lt;/span&gt;, where cube-dwellers gather and share treats.  'Nuff said.&lt;br /&gt;&lt;br /&gt;4)  If you're single, &lt;span style="font-weight:bold;"&gt;you have an excuse to mingle&lt;/span&gt;.  It worked for me-- I've been married for 12 years to the hot chick from across the wall.&lt;br /&gt;&lt;br /&gt;5)  &lt;span style="font-weight:bold;"&gt;It helps keep the amount of clutter in check&lt;/span&gt; for us pack rats.  I for one would have TONS of old developer magazines, books, printed tutorials, etc. if I had an office.  As it is, I probably only have half a ton in my cube.&lt;br /&gt;&lt;br /&gt;6)  You can easily ask a co-worker for &lt;span style="font-weight:bold;"&gt;a second set of eyes&lt;/span&gt; on a problem.  Two heads are better than one-- it would be much more difficult to leave the office, pull someone from the cubes, etc.&lt;br /&gt;&lt;br /&gt;7) You can &lt;span style="font-weight:bold;"&gt;build on your all-important social/work network&lt;/span&gt;. So maybe it's not the best use of your time to talk about World of Warcraft or sports once in a while.  It does help you form bonds with your co-workers, though, and that can later pay off when you need to leverage the network (i.e. referal for a new job).&lt;br /&gt;&lt;br /&gt;8)  You &lt;span style="font-weight:bold;"&gt;won't lose face&lt;/span&gt; if your work area gets moved.  If you work in a big building and your work team gets moved, it's no big deal if you go from a cube to another cube.  But if you had an office and got moved to a cubicle, it might seem like you 'lost something'.&lt;br /&gt;  &lt;br /&gt;9)  You're on the &lt;span style="font-weight:bold;"&gt;right side of the Dilbert labor/management spectrum&lt;/span&gt; when you're in a cube.  Once you get an office, you're more like the pointy-haired type than the engineering type.&lt;br /&gt;&lt;br /&gt;And &lt;span style="font-weight:bold;"&gt;a few reasons you'd really rather have an office&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1)  It gets you &lt;span style="font-weight:bold;"&gt;out of the noise &lt;/span&gt;when you need to concentrate.  On those occasions, it's nice to be able to close the door and get lost in your code.  If you're in a cubicle, headphones might be the next best thing.&lt;br /&gt;&lt;br /&gt;2)  You can &lt;span style="font-weight:bold;"&gt;make phone calls without the whole world listening in&lt;/span&gt;.  Business or not, sometimes there are calls you'd rather not have overheard.  Luckily for cube-dwellers, vacant conference rooms can help fill this need.&lt;br /&gt;&lt;br /&gt;3)  Good old &lt;span style="font-weight:bold;"&gt;hubris&lt;/span&gt;.  Let's face it, an office just carries a little more prestige, doesn't it?  But that's not a good motivation, IMHO.&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-362714226984494719?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/362714226984494719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=362714226984494719' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/362714226984494719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/362714226984494719'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/04/9-reasons-i-like-cubicles-better-than.html' title='9 reasons I like cubicles better than offices'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-6523952016282176126</id><published>2010-04-11T20:52:00.004-05:00</published><updated>2010-04-11T21:00:37.925-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenX'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Book Review - "OpenX Ad Server: Beginner's Guide"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_jK_3qAYFh-o/S8J9FK8NwaI/AAAAAAAAAC8/V3pYp8U6xwE/s1600/1849510202.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 123px;" src="http://2.bp.blogspot.com/_jK_3qAYFh-o/S8J9FK8NwaI/AAAAAAAAAC8/V3pYp8U6xwE/s320/1849510202.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5459063226116194722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Do you have an interest in online advertising?  Are you a blogger or website administrator that would like to monetize your workspace?  If so, I know of a book that might be of interest to you.&lt;br /&gt;&lt;br /&gt;Packt Publishing has just released "OpenX Ad Server: Beginner's Guide".  True to the title, I found this book can guide the reader from zero knowledge of online advertising to capable user of the popular OpenX Ad Server.  (An open source platform for configuring and running online advertising campaigns.)&lt;br /&gt;&lt;br /&gt;The author assumes the reader has no previous knowledge of online advertising, so the basic concepts are clearly explained in the opening chapters.  Advertisers, Campaigns, Banners, and Zones are all given high level introductions, then later deep-dives as you are exposed to all the configuration and minute details associated with each.  The book is set up in a very logical manner, with a nice template used for the detail chapters:  Explain the component in a high level, then walk the reader through Open X's implementation of the abstraction in step-by-step detail.  (The steps are accompanied by many useful screenshots, by the way.  The high level theory is accompanied by understandable diagrams.)  &lt;br /&gt;&lt;br /&gt;All things considered, I believe this book delivered on it's promise.  OpenX is made clearly understandable to the reader, no matter how much experience the reader had before cracking the book open.  I wish every technical book were this straightforward!&lt;br /&gt;&lt;br /&gt;The book can be found &lt;a href="https://www.packtpub.com/openx-ad-server-beginners-guide/book"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-6523952016282176126?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/6523952016282176126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=6523952016282176126' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/6523952016282176126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/6523952016282176126'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/04/book-review-openx-ad-server-beginners.html' title='Book Review - &quot;OpenX Ad Server: Beginner&apos;s Guide&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_jK_3qAYFh-o/S8J9FK8NwaI/AAAAAAAAAC8/V3pYp8U6xwE/s72-c/1849510202.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-2103635722137186462</id><published>2010-04-10T07:23:00.002-05:00</published><updated>2010-04-10T07:25:39.414-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><title type='text'>Comfort Words after a Bug</title><content type='html'>Last week a good friend of mine stopped by my cubicle*.  He was upset because a bug had been found in his code and the code was now delayed in going to production.  Here are the things I said to him then, and I will hope to hear back in the future when I have a newly found bug:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"It's your turn in the hot seat."&lt;/span&gt;&lt;br /&gt;I told him "I was to blame when we found that bug I wrote in the Locator service, so now the heat's off me.  Don't worry, I'm sure I'll claim it back again after a while."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"Even the very best developers write bugs."&lt;/span&gt;&lt;br /&gt;It's true.  This is because software development is just plain hard.  Look at 'Quick Sort', for instance-- it's been around for decades, yet new and subtle bugs still crop up once in a while.  No matter how smart the author, no matter how well understood the task, there will be bugs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"If you're not breaking something, you're not doing anything."&lt;/span&gt;&lt;br /&gt;I first heard this one when I worked a summer on a golf course.  A tractor had just been driven over a sprinkler head, causing the sprinkler head to break off it's pipe and causing a big water leak.  The boss told the disheartened tractor driver that these things just happen and the only way to avoid breaking things was to sit frozen and not do anything.  Likewise, the only way to completely avoid writing bugs is to stop writing code. (Which nobody wants, of course.)&lt;br /&gt;&lt;br /&gt;That's what I said then-- he'll probably be echoing it back to me next week.  What do you say to your friends in this situation?&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;br /&gt;&lt;br /&gt;* I'll write a future post about why I think senior developers should work in cubicles, not offices.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-2103635722137186462?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/2103635722137186462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=2103635722137186462' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2103635722137186462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2103635722137186462'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/04/comfort-words-after-bug.html' title='Comfort Words after a Bug'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-2398584561477780081</id><published>2010-04-03T08:34:00.007-05:00</published><updated>2010-04-03T08:46:29.298-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance testing'/><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Performance testing tip -- Visualize your data to help reveal patterns!</title><content type='html'>When you're doing performance testing, take a little extra time and examine your data for patterns.  Sometimes the patterns aren't easy to see, but with the help of some tools they'll jump right out at you.  Let's look at an example.&lt;br /&gt;&lt;br /&gt;Here's some sample data that represents the amount of time it takes for a test driver to invoke the server.  Do you see the pattern?&lt;br /&gt;&lt;br /&gt;latency&lt;br /&gt;0.7630&lt;br /&gt;0.0626&lt;br /&gt;0.0662&lt;br /&gt;0.0705&lt;br /&gt;0.0833&lt;br /&gt;0.0631&lt;br /&gt;0.0656&lt;br /&gt;0.0712&lt;br /&gt;0.0841&lt;br /&gt;0.0623&lt;br /&gt;0.0671&lt;br /&gt;0.0699&lt;br /&gt;0.0840&lt;br /&gt;0.0619&lt;br /&gt;0.0659&lt;br /&gt;0.0720&lt;br /&gt;0.0835&lt;br /&gt;0.0630&lt;br /&gt;0.0659&lt;br /&gt;0.0706&lt;br /&gt;0.0835&lt;br /&gt;0.0619&lt;br /&gt;0.0671&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I can't see the pattern immediately.  So let's have a look using 'R', the excellent open source statistical language.  (If you're not using R yet, you might consider looking at it.  It really is easy to use, and it gives you excellent statistical capabilities.  There are lots of nice web tutorials on how to use it, as well as the excellent Manning title "R in Action")  Here's the R script:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;timingticks &lt;- read.table("/home/rick/Blog_Temp/My.dat", header=TRUE)&lt;br /&gt;attach(timingticks)&lt;br /&gt;'Count'&lt;br /&gt;length(latency)&lt;br /&gt;summary(timingticks)&lt;br /&gt;plot(latency, col='blue')&lt;br /&gt;axis(2, tck=1)&lt;br /&gt;q()&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The script is pretty self-explanatory, but what we're saying is roughly this:&lt;br /&gt;- Use my data file.&lt;br /&gt;- Get me the number of records (length) of that file, call it 'Count'&lt;br /&gt;- Give me a statistical summary of the file&lt;br /&gt;- Make a plot of the file, using units of '1' on the left axis. &lt;span style="font-weight:bold;"&gt; THIS IS THE PART THAT SOMETIMES MAKES THE PATTERNS JUMP OUT!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So let's run the script then have a look at the results.  First, the statistical output:&lt;br /&gt;&lt;br /&gt;[1] "Count"&lt;br /&gt;[1] 23&lt;br /&gt;    latency       &lt;br /&gt; Min.   :0.06190  &lt;br /&gt; 1st Qu.:0.06435  &lt;br /&gt; Median :0.06710  &lt;br /&gt; Mean   :0.10036  &lt;br /&gt; 3rd Qu.:0.07765  &lt;br /&gt; Max.   :0.76300  &lt;br /&gt;&gt; proc.time()&lt;br /&gt;   user  system elapsed &lt;br /&gt;  0.732   0.028   0.747 &lt;br /&gt;&lt;br /&gt;This alone makes using R worthwhile.  With almost no effort, I got some good information about my application timing performance.  But that's not the real pay-dirt in this case! Let's have a look at the plot:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_jK_3qAYFh-o/S7dEpzYp5_I/AAAAAAAAAC0/ObqhieqBugY/s1600/Screenshot-R+Graphics+Output.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 217px;" src="http://2.bp.blogspot.com/_jK_3qAYFh-o/S7dEpzYp5_I/AAAAAAAAAC0/ObqhieqBugY/s320/Screenshot-R+Graphics+Output.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5455904958541588466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now that's more interesting!  Let's ignore the top dot, which represents a 'first transaction'.  These are often much longer than the following entries due to 'warm up' issues. But look at the little repeating saw-tooth at the bottom! This is indicative of some sort of repeated behaviour.  &lt;br /&gt;&lt;br /&gt;In a real-world scenario, this was exactly what I saw when we found some server-side code that was trying to improve performance with a cache.  The code was caching a value in a list, then when the list got to a certain size it tossed the cache and started over again.  (In this case, the list size would be 4.  See how the data goes in patterns, the timing gets a little longer each time for 4 cycles, then it 'busts' and starts over again?)  It turned out our "performance-enhancing" cache was actually costing us performance!  We removed the cache.&lt;br /&gt;&lt;br /&gt;This is just one sample of how data visualisation can be used to help you find patterns in performance data.  It doesn't take much time, and it can lead you to valuable insites.  It's also fun!&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-2398584561477780081?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/2398584561477780081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=2398584561477780081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2398584561477780081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2398584561477780081'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/04/performance-testing-tip-visualize-your.html' title='Performance testing tip -- Visualize your data to help reveal patterns!'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_jK_3qAYFh-o/S7dEpzYp5_I/AAAAAAAAAC0/ObqhieqBugY/s72-c/Screenshot-R+Graphics+Output.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-6037871391977504917</id><published>2010-03-28T14:05:00.020-05:00</published><updated>2010-03-28T14:43:12.555-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='netbeans'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><category scheme='http://www.blogger.com/atom/ns#' term='soapui'/><title type='text'>Easy Web Service And Test in 5 Minutes</title><content type='html'>This post will show how to quickly make a web service and test it in less than 5 minutes.&lt;br /&gt;&lt;br /&gt;Tools you will need:&lt;br /&gt;&lt;br /&gt;NetBeans 6.8  (choose to install GlassFish with the IDE)&lt;br /&gt;SOAPUI 3.5&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;First, make your NetBeans project.  Make it a Web App.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jK_3qAYFh-o/S6-pHATGe_I/AAAAAAAAAA8/5y0UPcoh3Dc/s1600/NewWebApplication.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_jK_3qAYFh-o/S6-pHATGe_I/AAAAAAAAAA8/5y0UPcoh3Dc/s400/NewWebApplication.png" alt="" id="BLOGGER_PHOTO_ID_5453763611573255154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Choose defaults for the deployment options:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jK_3qAYFh-o/S6-ppCOmyxI/AAAAAAAAABE/V3ERMfiKlMc/s1600/WebApp2.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: cursor: pointer; width: 320px; height: 185px;" src="http://4.bp.blogspot.com/_jK_3qAYFh-o/S6-ppCOmyxI/AAAAAAAAABE/V3ERMfiKlMc/s320/WebApp2.png" alt="" id="BLOGGER_PHOTO_ID_5453764196206824210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jK_3qAYFh-o/S6-qCiV1p3I/AAAAAAAAABM/29t-BmYR_Pc/s1600/WebApp3.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: cursor: pointer; width: 320px; height: 185px;" src="http://1.bp.blogspot.com/_jK_3qAYFh-o/S6-qCiV1p3I/AAAAAAAAABM/29t-BmYR_Pc/s320/WebApp3.png" alt="" id="BLOGGER_PHOTO_ID_5453764634323822450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Right-click the source package and choose to add a new Web Service:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_jK_3qAYFh-o/S6-qfRAnV1I/AAAAAAAAABU/wyQyWyCVLdc/s1600/WebApp4.png"&gt;&lt;img style="float: margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_jK_3qAYFh-o/S6-qfRAnV1I/AAAAAAAAABU/wyQyWyCVLdc/s320/WebApp4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5453765127887607634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Give the Web Service a name.  My examples often deal with the game of bowling.....&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_jK_3qAYFh-o/S6-qxqUu44I/AAAAAAAAABc/09GGkctdQ1U/s1600/WebApp5.png"&gt;&lt;img style="float:margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 242px;" src="http://2.bp.blogspot.com/_jK_3qAYFh-o/S6-qxqUu44I/AAAAAAAAABc/09GGkctdQ1U/s320/WebApp5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5453765443920520066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Put the cursor in the body of the Web Service class and right click.  Choose to 'Insert new code', make it a Web Service, and add the method signature you want.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jK_3qAYFh-o/S6-rjbpprtI/AAAAAAAAABk/3kaZxUnU9GA/s1600/WebApp6.png"&gt;&lt;img style="float: margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_jK_3qAYFh-o/S6-rjbpprtI/AAAAAAAAABk/3kaZxUnU9GA/s320/WebApp6.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5453766298975186642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_jK_3qAYFh-o/S6-rj_7RAQI/AAAAAAAAABs/a1mwSmaB05E/s1600/WebApp7.png"&gt;&lt;img style="float: margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_jK_3qAYFh-o/S6-rj_7RAQI/AAAAAAAAABs/a1mwSmaB05E/s320/WebApp7.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5453766308712743170" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jK_3qAYFh-o/S6-rkGC3b7I/AAAAAAAAAB0/kvUDVBNMfTs/s1600/WebApp8.png"&gt;&lt;img style="float: margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 247px;" src="http://1.bp.blogspot.com/_jK_3qAYFh-o/S6-rkGC3b7I/AAAAAAAAAB0/kvUDVBNMfTs/s320/WebApp8.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5453766310355234738" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Add some logic for your method.  When you're done, right-click the Application in the Applications tab and choose 'Clean and Build', then 'Deploy' (after you've cleaned up any compile errors, if there are any.)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jK_3qAYFh-o/S6-srpJl8pI/AAAAAAAAAB8/cKQGknO8GYU/s1600/WebApp11.png"&gt;&lt;img style="float: margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_jK_3qAYFh-o/S6-srpJl8pI/AAAAAAAAAB8/cKQGknO8GYU/s320/WebApp11.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5453767539549401746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now choose the 'Services' tab.  You need to go get the WSDL for your Web Service so you can test it....&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_jK_3qAYFh-o/S6-tpRZoNbI/AAAAAAAAACE/9X71fE1Pe8s/s1600/WebApp10.png"&gt;&lt;img style="float: margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_jK_3qAYFh-o/S6-tpRZoNbI/AAAAAAAAACE/9X71fE1Pe8s/s320/WebApp10.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5453768598326097330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Choose 'View Endpoint'....&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_jK_3qAYFh-o/S6-t5M-dacI/AAAAAAAAACM/pjDZDf27KmM/s1600/WebApp12.png"&gt;&lt;img style="float: margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 217px;" src="http://3.bp.blogspot.com/_jK_3qAYFh-o/S6-t5M-dacI/AAAAAAAAACM/pjDZDf27KmM/s320/WebApp12.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5453768872016308674" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Click the link for your WSDL, and copy it into your clipboard.  You'll be using it in a few seconds....&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jK_3qAYFh-o/S6-uGOn2QJI/AAAAAAAAACU/tb9ZI_sDgTo/s1600/WebApp13.png"&gt;&lt;img style="float: margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 217px;" src="http://4.bp.blogspot.com/_jK_3qAYFh-o/S6-uGOn2QJI/AAAAAAAAACU/tb9ZI_sDgTo/s320/WebApp13.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5453769095796637842" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now to test the Web Service!  Fire up SOAPUI, and start a new Project. Paste your WSDL URL (from the address you got after clicking the 'view WSDL' link a bit above).&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jK_3qAYFh-o/S6-u0BEHg3I/AAAAAAAAACc/sdjOITFfpZg/s1600/WebApp14.png"&gt;&lt;img style="float: margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_jK_3qAYFh-o/S6-u0BEHg3I/AAAAAAAAACc/sdjOITFfpZg/s320/WebApp14.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5453769882431095666" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now alter the sample SOAP message SOAPUI has kindly provided you.  In my screenshots, I'll check to see if a nine count makes a strike.  (It does not, of course.)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jK_3qAYFh-o/S6-vK6KX9TI/AAAAAAAAACk/RtsMuvHssEE/s1600/WebApp15.png"&gt;&lt;img style="float: margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_jK_3qAYFh-o/S6-vK6KX9TI/AAAAAAAAACk/RtsMuvHssEE/s320/WebApp15.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5453770275715282226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jK_3qAYFh-o/S6-vLGguRfI/AAAAAAAAACs/yesoO6IEhT4/s1600/WebApp16.png"&gt;&lt;img style="float: margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_jK_3qAYFh-o/S6-vLGguRfI/AAAAAAAAACs/yesoO6IEhT4/s320/WebApp16.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5453770279030244850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That's it!  A couple of very important points:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;This is a 'Bottom-up' Web Service.  (One where you start with code, not start from WSDL).  These are easy to develop, but may not fit well in your 'Production' environment.&lt;br /&gt;&lt;br /&gt;There are other ways to test your Web Service, including facilities within NetBeans itself.  I wanted to use SOAPUI, though, because it's a great tool that's very versatile.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-6037871391977504917?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/6037871391977504917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=6037871391977504917' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/6037871391977504917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/6037871391977504917'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/03/easy-web-service-and-test-in-5-minutes.html' title='Easy Web Service And Test in 5 Minutes'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_jK_3qAYFh-o/S6-pHATGe_I/AAAAAAAAAA8/5y0UPcoh3Dc/s72-c/NewWebApplication.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-171954636320579466</id><published>2010-03-20T09:38:00.003-05:00</published><updated>2010-03-20T10:00:58.298-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Schema'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>SOA Best Practice:  Start with the schemas</title><content type='html'>We've been doing some deep-dive evaluations on SOA tool suites at work, so I've had some recent exposure to a variety of toolsets.  We've been investigating both proprietary and open source suites and components, so I've been able to work with a variety of SOA IDEs. &lt;br /&gt;&lt;br /&gt;One thing I've noticed:  In many cases, your life is much easier if you start with your schemas that represent the messages being shuffled from component to component.&lt;br /&gt;&lt;br /&gt;A short while back, this would've caused me a little distress.  I've had bad feelings about XML, based on memories of pain filled hours spent hand-editing XML files.  Namespaces, the order things have to appear in XML files (Mule 1.4 config, anyone?), and others tripped me up time and again.  I imagine this is common, else bottom-up web service development wouldn't be so popular.&lt;br /&gt;&lt;br /&gt;Well, I'm pleased to announce that XML tooling has matured to the point where I found myself not dreading working in a top-down (XML schema first) manner.  I've recently worked with both proprietary and open source tools that effectively hid the underlying complexity of the XML from me. &lt;br /&gt;&lt;br /&gt;Most of the tools have nifty 'Design View' panels that let you visualize (drag and drop) the XML document you want to write.  They'll have property tabs that allow you to add the syntactic elements, and a way to change views to see the underlying XML document if you want to.  After a short while, I started really liking this way of working with XML.&lt;br /&gt;&lt;br /&gt;So back to the SOA storyline-- because of these nifty visual editors, I found it totally natural to work in a top-down (contract first) manner.  The SOA toolkits liked this much better, as they are able to provide meaningful dialogues that let me choose which data bits should be marshalled, transformed, whatever.  I got to see the other side of the coin, too.  Most of the tools let you design in a schema-less way (dragging components onto a BPEL canvas without specifying the schema, for example), but these efforts turned out to be much more difficult than starting with the schemas.  (Or so it seems to me.)&lt;br /&gt;&lt;br /&gt;So I'd have to call this one a triumph for technology.  What used to be hard is now easier, and it leads to one of my personal best practices for SOA:  Start with the schemas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-171954636320579466?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/171954636320579466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=171954636320579466' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/171954636320579466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/171954636320579466'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/03/soa-best-practice-start-with-schemas.html' title='SOA Best Practice:  Start with the schemas'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-628153493022630414</id><published>2010-03-19T17:25:00.007-05:00</published><updated>2010-03-19T17:46:45.814-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenX'/><category scheme='http://www.blogger.com/atom/ns#' term='ad server'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Coming Soon: Review of 'OpenX' Ad Server book</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jK_3qAYFh-o/S6P8_37Y_OI/AAAAAAAAAA0/B2kPFaMiQ34/s1600-h/1849510202.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 123px;" src="http://1.bp.blogspot.com/_jK_3qAYFh-o/S6P8_37Y_OI/AAAAAAAAAA0/B2kPFaMiQ34/s400/1849510202.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5450478148323441890" /&gt;&lt;/a&gt;&lt;br /&gt;I'm anticipating reviewing Packt Publishing's soon to be published "OpenX Ad Server: Beginner's Guide".&lt;br /&gt;&lt;br /&gt;The book's description (found &lt;a href="http://www.packtpub.com/openx-ad-server-beginners-guide/book"&gt;here&lt;/a&gt;) promises to instruct any reader with an understanding of IT basics on how to use OpenX.  OpenX is an "Ad Server", or a platform to help you run advertising campaigns. It's supposed to help you display ads, find which ads are most effective, utilize GeoTargeting, provide metrics to help you judge your effectiveness, and more.  &lt;br /&gt;&lt;br /&gt;I have to be honest, this appeals to me.  I use Google Analytics to track readership of this blog and I've become addicted to the statistics it provides.  If I had a similar package that would help me serve a few relevant ads, track reader interest in these ads and maybe even make a few bucks in the process somehow, that would be really cool!  &lt;br /&gt;&lt;br /&gt;The book is slated for print soon, watch these pages for a review.&lt;br /&gt;&lt;br /&gt;'Till then,&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-628153493022630414?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/628153493022630414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=628153493022630414' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/628153493022630414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/628153493022630414'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/03/book-review-beginners-guide-to-openx-ad.html' title='Coming Soon: Review of &apos;OpenX&apos; Ad Server book'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_jK_3qAYFh-o/S6P8_37Y_OI/AAAAAAAAAA0/B2kPFaMiQ34/s72-c/1849510202.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-3262472685106228378</id><published>2010-03-16T20:57:00.006-05:00</published><updated>2010-03-17T07:15:59.622-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='career'/><title type='text'>A shortcut from Junior Programmer -&gt; Journeyman</title><content type='html'>Programmers generally have 2 transitions they can go through in their career lifespan:&lt;br /&gt;-From Junior Programmer to Journeyman&lt;br /&gt;-From Journeyman to Heavy Hitter&lt;br /&gt;&lt;br /&gt;Some programmers don't make the transition to Journeyman.  Mostly these are folks that just aren't suited to the profession for one reason or another and quit within the first 3 years or so.  Very rarely, you'll find a 10 year Junior Programmer, but these are a rare breed.&lt;br /&gt;&lt;br /&gt;Most programmers stay at the Journeyman level for the duration of their career.  There's nothing bad about this-- these folks make up the bulk of the workforce and get most of the work done.  These are people who prioritize their life in such a way that they spend a 'fair' amount of time on their career, but don't go out of their way to constantly study IT in the off-time.  These are the people everybody depends on to carry out their orders and keep things moving.&lt;br /&gt;&lt;br /&gt;A small percentage of programmers make it to the 'Heavy Hitter' level.  Every organization has them-- the folks who set new directions and establish development processes.  These guys can't afford to stagnate (because they are relied upon to bring new ideas) so they're always studying.&lt;br /&gt;&lt;br /&gt;This column deals with that first transition.  If you're a Junior programmer today and are looking for a way to make it to the next level, read on.&lt;br /&gt;&lt;br /&gt;I know of a technique that can be used to accelerate the first phase and move you to the second one as quickly as possible.  This is important for two reasons:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- It brings more responsible assignments (and with them more pay and geeky prestige)&lt;br /&gt;- It starts your 'time in grade' in the Journeyman level, which is a necessary prerequisite towards advancing to the 'Heavy Hitter' level, if that's your ambition&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;To use this shortcut, you'll require 3 things:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- A solid, working plan of self-improvement&lt;br /&gt;- A reliable pipeline of work assignments, at least 4 or 5 months worth&lt;br /&gt;- A viable alternative place of work that is hiring&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1)  A solid working plan of self-improvement&lt;/span&gt;&lt;br /&gt;You need to conduct yourself in such a way that your boss realises you are on the way to more responsible work assignments.  Back when I was a junior programmer (in the stone ages), this meant reading IBM manuals and workshop binders, and taking home thick mainframe greenbar compile listings.  Today, this means studying things on the web and on your home computer, and studying your company's business artefacts in your off time.  If you aren't willing to part with the time to devote to these activities, stop reading now because this shortcut won't work for you.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2)  A reliable pipeline of work assignments&lt;/span&gt;&lt;br /&gt;You need to have a steady stream of assignments in your near future, tasks you know your boss is going to assign to you.  Some of these will be things that you are best suited for based on your skill sets.  Some can be tasks you volunteer for because nobody else wants to do them.  Either way, you want to position things so that your boss considers you the go-to person for a bunch of work that's slated to happen in the near future.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3)  A viable alternative place of work that's hiring&lt;/span&gt;&lt;br /&gt;Of the 3 requirements, this is the only one that requires something other than disciplined hard work.  What it does require is a little research and a healthy dose of 'guts'.  You need to look inside your company and out for a job posting that's for a programming job at the Journeyman level.  They aren't hard to find-- if it's not paying at the guru pay scale and if it doesn't say 'Junior Programmer', then that's your target.  Make sure it's someplace you actually would consider working for and make sure you're reasonably qualified for the posting (albeit at the low end).&lt;br /&gt;&lt;br /&gt;The Plan:&lt;br /&gt;After making absolutely certain you have your 3 requirements met, &lt;span style="font-weight:bold;"&gt;make an appointment to talk to your boss&lt;/span&gt;.  In your conversation, say something like this:&lt;br /&gt;"I've been working hard on advancing my career, and I think I'm ready for more responsible tasks.  I really like what I'm doing here, and think I'm making a difference, but I'm tempted to look into this position I see at (name your third Requirement).  Can you help me get promoted here so I can advance my career, but still stay here?&lt;br /&gt;&lt;br /&gt;If your boss acts like mine did, he will immediately adapt a defensive position in which he hurriedly explains why you can't just ask for a promotion and it's not your time yet.  This is fine-- his job is to keep expenses low and to maintain stability in personnel matters.  What he really needs is a little time to think things over, because you really are bringing him a good business proposal. Your response should be something like "Well, I'll keep working and learning, but please give it a little thought.  How about if we follow up in a week?"&lt;br /&gt;&lt;br /&gt;That should give your boss plenty of time to really consider things.  If you've done a good job with your prerequisites, your boss should be thinking thoughts like these:&lt;br /&gt;- If I don't keep (insert your name here), I have to train somebody else to do all this stuff.  It'll take forever to get a Junior programmer to that level again.&lt;br /&gt;- (Your name) has already been taking on some mid-level assignments.  It's a little early, but that promotion will come soon anyway.&lt;br /&gt;- Crap!  Where am I going to get someone to handle that stream of work I've got lined up for the next 4 months?&lt;br /&gt;- (Your name) is being a little ambitious here, but I respect that he wants to advance his career.  &lt;br /&gt;&lt;br /&gt;Then in your follow-up, there are a few things that might result:&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;You get the promotion&lt;/span&gt;.  In that case, congratulate yourself and send me a nice thank you note.&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;You are told you're still a little green, but you can work on your development plan and perhaps get your promotion soon&lt;/span&gt;.  If this happens, BE SURE TO ASK ABOUT TIMELINES.  It's up to you to decide how much emphasis to put on the 'viable alternative place to work' at this point.  (Do NOT over-emphasize this, as your position really isn't that strong.  The purpose of that requirement was to lend a matter of urgency for your request-- the "Why now?" factor). NO MATTER WHAT, YOUR CAREER IS YOUR RESPONSIBILITY, SO SECURE SOME COMMITMENT TO A TIMEFRAME FOR YOUR ADVANCEMENT.  Think of it as a project deliverable-- you need to establish a timeline.&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;You are flatly denied&lt;/span&gt;.  In this case, you will have been given some valuable feedback in some form or other-- &lt;span style="font-style:italic;"&gt;think about what it means&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Remember, your boss is a business manager, and as such is going to respect the business aspects of your proposal.  If you've been diplomatic (and not a ham-handed extortionist) you should not have angered your boss.  If anything, your boss will have a newfound respect for your professionalism.  (And if not, again-- you have some valuable feedback.)  To get to be your boss, this person has had to have gone through a few promotions, too.  They know what it's like to want to move ahead.&lt;br /&gt;&lt;br /&gt;This plan worked for me 18 years ago.  If you choose to try it, I hope it works for you, too.  Good luck, and Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-3262472685106228378?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/3262472685106228378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=3262472685106228378' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3262472685106228378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3262472685106228378'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/03/shortcut-from-junior-programmer.html' title='A shortcut from Junior Programmer -&gt; Journeyman'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-8337212472480104796</id><published>2010-03-13T09:47:00.004-06:00</published><updated>2010-03-13T10:17:09.792-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>"PHP 5 e-commerce" by Packt</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_jK_3qAYFh-o/S5u6frFHxWI/AAAAAAAAAAs/MypWk7C4lhY/s1600-h/184719964X.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 123px;" src="http://3.bp.blogspot.com/_jK_3qAYFh-o/S5u6frFHxWI/AAAAAAAAAAs/MypWk7C4lhY/s320/184719964X.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5448153227537663330" /&gt;&lt;/a&gt;&lt;br /&gt;I've just finished reading "PHP 5 e-commerce" published by Packt Publishing and wanted to provide a review.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Make no mistake about it, this book is all about writing an e-commerce web site and little about teaching the reader PHP 5.  That's ok for us hard-core developers, though, as the included PHP is so clean and so simple it won't be a problem for PHP novices.  &lt;br /&gt;&lt;br /&gt;The core of the book is about writing a web site to sell things.  Early on the author introduces the handful of patterns that will be used (MVC, Registry, Singleton) then immediately provides a runnable skeleton MVC framework that handles only Products and Categories.  After that, it's an incremental build chapter by chapter as the author adds features to the web site.&lt;br /&gt;&lt;br /&gt;Without question, one of the book's strong suits is the author's knowledge of e-commerce features.  The book covers all the features you're going to want (Search, Payment, Discounts and Vouchers, Recommendations, User Reviews, etc. etc.).  Each of these is given adequate coverage and a clear implementation, chapter by chapter.  The book ends with some tiny chapters on odds and ends like password recovery, calling out to other commerce sites, etc.&lt;br /&gt;&lt;br /&gt;If you're looking for a PHP book, this isn't the title you want.  There's simply nothing here (besides plenty of good, well commented source code) to teach you the language.  But if you're looking to learn how to write an MVC application, there is value here.&lt;br /&gt;&lt;br /&gt;I'd recommend this book to anyone that's building an e-commerce site.  The author's care in enumerating the many features you'll want is valuable advice you can leverage.&lt;br /&gt;&lt;br /&gt;PHP 5 e-commerce can be found &lt;a href="http://www.packtpub.com/php-5-e-commerce-development/book?utm_source=rickwagner.blogspot.com&amp;utm_medium=bookrev&amp;utm_content=blog&amp;utm_campaign=mdb_002596"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-8337212472480104796?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/8337212472480104796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=8337212472480104796' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/8337212472480104796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/8337212472480104796'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/03/php-5-e-commerce-by-packt.html' title='&quot;PHP 5 e-commerce&quot; by Packt'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_jK_3qAYFh-o/S5u6frFHxWI/AAAAAAAAAAs/MypWk7C4lhY/s72-c/184719964X.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-6378920321261523994</id><published>2010-03-13T06:29:00.008-06:00</published><updated>2010-03-13T07:49:30.834-06:00</updated><title type='text'>SOA's beginning to feel a lot like CORBA</title><content type='html'>If you ever visit my garage, you'll find a couple of book shelves out there.  On the shelves are an array of computer books, on all sorts of topics.  I'll sometimes buy books at garage sales, at the GoodWill store, or especially off Amazon from the 'used' section.  Most of the books I buy are cheap-- I'll buy 2 or 3 books off Amazon for a few bucks each plus shipping.  I like books better than online reading because I can mark them up and take them with me wherever I go.  (Sorry, a Kindle just doesn't seem the same.  I ease my conscience by telling myself I'm buying used, so I'm not really causing any new trees to be felled.)  A few of the books I've bought this way are terrible, but most have at least a few good chapters and a couple have been really good.  I'm able to get more perspectives on a topic by buying in quantity rather than spending more money for quality.  (By the way, I keep a few books inside the house-- any 'high dollar' new books, or any books that have my name inside them for some reason.  By keeping only a subset of my books inside the house, I've found my married life is much happier!)  Among my 'outside' books you'll find a couple of volumes on CORBA.&lt;br /&gt;&lt;br /&gt;We still use CORBA in places where I work.  Mostly we make use of the '&lt;span style="font-weight:bold;"&gt;Naming Service&lt;/span&gt;' and the data-marshalling capabilities (which we find to be very performant, BTW).  The 'Naming Service' is a sort of registry for CORBA services.  When my service comes up, it uses a well-known (that is, hard-coded and shared by other services) address to reach out to the Naming Service.  My service then registers itself with the Naming Service by supplying a name for itself and the address of the machine it's running on.  (So my service might pick the name &lt;span style="font-weight:bold;"&gt;/Persistence/Sharding/ShardLocator&lt;/span&gt;.)  Then whenever a client wants to use my &lt;span style="font-weight:bold;"&gt;ShardLocator&lt;/span&gt; service, it uses the same well-known address to get to the Naming Service, and it asks it where it can find /Persistence/Sharding/ShardLocator.  The Naming Service will pick either my service or another machine that hosts this service and tells the client that's where the service can be found.  When my service shuts down, it is obligated to un-register with the Naming Service so the registry in theory contains only 'live' service instances.  (Note to newbies:  This is done so clients don't have to hard-code the location of servers they need to talk to.  Then when a machine fails or you add a new server instance, it's easier.)&lt;br /&gt;&lt;br /&gt;If I look through one of my ancient CORBA books, I see great tales of what CORBA should be used for.   There are distributed transactions, mechanisms for dynamically finding and invoking methods, a query mechanism, etc. etc.  But as I said, &lt;span style="font-weight:bold;"&gt;we make use of only a few simple services&lt;/span&gt;.  I think this is common-- I bet most people that still use CORBA only use a few parts of the whole spec.&lt;br /&gt;&lt;br /&gt;Lately, I've been working on a team charged with architecting a sizeable new greenfield application.  We're considering different SOA components to use-- an ESB, an orchestration engine, maybe some other parts.  If you look at SOA suites offered by big vendors, you'll see quite a laundry list of components-- Governance helpers, Business Rules Engines, Complex event processing, etc.  (By the way, the open source guys offer these too.)  But I'm not sure we'll be using all that stuff, probably just the parts we really need.  The whole thing is beginning to feel vaguely like CORBA.&lt;br /&gt;&lt;br /&gt;CORBA and SOA are also similar in that they were largely spec-driven efforts that tried to answer all the problems the industry was trying to solve.  I think it's widely accepted that the reason they didn't realise full potential was that the &lt;span style="font-weight:bold;"&gt;specs grew too complicated&lt;/span&gt; (WS-* anyone?) and the vendor implementations &lt;span style="font-weight:bold;"&gt;didn't really interoperate&lt;/span&gt;.  &lt;br /&gt;&lt;br /&gt;It's been over a year now since a prominent industry analyst proclaimed "SOA is Dead".  (Google that one, you'll find plenty.)  So it looks to me like SOA has roughly followed the same lifecycle CORBA did:&lt;br /&gt;&lt;br /&gt;CORBA was lively from roughly 1990 - 2000&lt;br /&gt;SOA was lively from roughly 2000 - 2010&lt;br /&gt;&lt;br /&gt;Cloud, to me, is a lot like SOA re-packaged with some machine requisition thrown in.&lt;br /&gt;&lt;br /&gt;I'm left pondering a few questions:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- How will we look back at SOA a few years from now?&lt;br /&gt;- Will we have another tech stack arise for the next decade?  What will it be?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Thanks for reading, and Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-6378920321261523994?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/6378920321261523994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=6378920321261523994' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/6378920321261523994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/6378920321261523994'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/03/soas-beginning-to-feel-lot-like-corba.html' title='SOA&apos;s beginning to feel a lot like CORBA'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-3999644761712313457</id><published>2010-02-26T19:37:00.008-06:00</published><updated>2010-02-27T07:41:54.798-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='career'/><title type='text'>A secret key to 'Senior' level programming</title><content type='html'>When I first started in DP ('data processing', we called it then) 20 years ago, I was working for a company that acted as an outsourcer for banks.  I started with the company as a trainee, then graduated to the first programmer 'rank' of Junior programmer.  Internally, this title carried the cryptic title 'E07'. &lt;br /&gt;&lt;br /&gt;I soon found out my company ranked programmers in this way:  &lt;br /&gt;Junior programmer = E07&lt;br /&gt;Programmer = E08 &lt;br /&gt;Senior Programmer = E09 &lt;br /&gt;Superhero = E10  (a very rare breed)&lt;br /&gt;&lt;br /&gt;Payscales, of course, were tightly coupled to these ranks, much the same way they are today.&lt;br /&gt;&lt;br /&gt;Like all junior programmers, I hoped to spend my required year or two in the E07 ranks, then move up.  One thing I was lacking, though, was an understanding of what made the difference between the programmers that went to the very highest ranks and those who stayed in the lower levels.&lt;br /&gt;&lt;br /&gt;One day I was working on a project with a kind-hearted E10 named James.  We were having a friendly conversation about the kinds of tasks we had ahead of us when James made a profound statement.  He said &lt;span style="font-weight:bold;"&gt;"The work is all the same, whether you're an E07 or an E10".&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;I was dumbfounded.  Not until that moment had I realized that the work I was doing was just as important to the success of the project as the task James was working on.  I was doing analysis and coding, James was doing analysis and coding.  Even though he worked at the stratospheric E10 level, he used the exact same compiler I used, he worked on the exact same data I worked on, and he used the exact same development environment I used.  A failure on his part would embarrass the shop, and a failure on my part would embarrass the shop.  &lt;span style="font-weight:bold;"&gt;In the context of this project, we were peers!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, don't get me wrong.  Junior programmers are most certainly NOT worth the same money senior programmers are.  Today, I depend heavily on widespread recognition of this fact.  But at that time, I gave this matter a little thought and came up with an observation that has benefited me immeasurably, to this day.&lt;br /&gt;&lt;br /&gt;I looked to my friend the E10 and asked myself what the difference was between his skill set and mine.  I drew the conclusion there were at least 2 areas in which he was superior:  &lt;span style="font-weight:bold;"&gt;breadth&lt;/span&gt; and &lt;span style="font-weight:bold;"&gt;depth&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Breadth&lt;/span&gt; meant that he had a much wider array of tools at his disposal.  At that time, I possessed a moderate amount of knowledge about batch COBOL programming.  My friend was knowledgeable about batch COBOL, online COBOL, assembler, JCL, system skills, and more.  In today's world, this would equate to something like a Java guy standing next to a Java guy that also knows C++, C#, Ruby, Python, Erlang and a good number of frameworks for each.  If the project du jour is just plain Java, those two are on equal footing.  But when the next project comes along things could most certainly be different.&lt;br /&gt; &lt;br /&gt;The other dimension is &lt;span style="font-weight:bold;"&gt;depth&lt;/span&gt;, which refers to the amount of knowledge held in the workplace domain.  In my yesteryear story, I knew how to write and compile my COBOL program, maybe even as well as my friend.  But if my program had a bug, I had one trick up my sleeve-- diagnostic debug statements.  My friend had that &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; the ability to read core dumps, knew how to make the compile listing show assembly language (which he could look over for performance heuristics) and more.  In other words, beyond the surface of the program source code we produced, he had a much better understanding of the platform we were operating on and how to exploit it.  Again, my source code might have been a match for his, but if we needed to go to the next level..... there was an indisputable difference.&lt;br /&gt;&lt;br /&gt;In today's world, this might mean the senior guy understands how to tune a JVM, or how to extract meaningful data from profiling tools.   The senior level guy knows how to install, configure, debug and profile the platform.  The senior guy will know how to establish the build environment, the junior programmer will likely only be productive once it's established.&lt;br /&gt;&lt;br /&gt;So I guess I figured out that I had a lot to learn, and set about trying to increase my own depth and breadth.  (An effort that continues to this very day!)  James' words from two decades ago have helped me &lt;span style="font-weight:bold;"&gt;measure myself against my peers to see where I need to improve&lt;/span&gt;, and this has furthered my career in more ways than I can imagine.  If you're on the young side of your career, I hope they can help you, too.&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;br /&gt;&lt;br /&gt;Rick&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-3999644761712313457?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/3999644761712313457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=3999644761712313457' title='36 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3999644761712313457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3999644761712313457'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/02/secret-key-to-senior-level-programming.html' title='A secret key to &apos;Senior&apos; level programming'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>36</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-813431432146076133</id><published>2010-02-24T18:12:00.006-06:00</published><updated>2010-02-24T18:48:38.655-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><title type='text'>E-commerce in PHP</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jK_3qAYFh-o/S4XIhjyfOQI/AAAAAAAAAAk/ohczUCByQbM/s1600-h/184719964X.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 100px; height: 123px;" src="http://1.bp.blogspot.com/_jK_3qAYFh-o/S4XIhjyfOQI/AAAAAAAAAAk/ohczUCByQbM/s320/184719964X.png" alt="" id="BLOGGER_PHOTO_ID_5441976203615353090" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I recently had a chance to sit down with a workplace friend of mine who specialises in writing UI applications.  I really don't spend a lot of time in that workspace, so I was happy to listen to what my friend had to say about current trends in UI authoring.  The discussion was mostly about the right parts to use in building a corporate portal, but I was shocked when my informed friend told me a great amount of the high-volume online work is actually backed by PHP and C.&lt;br /&gt;&lt;br /&gt;Everybody likes PHP, right?  Mostly I thought of it as a hobbyist's language, though.  Clearly, I have some learning to do about the things making today's cash registers ring.&lt;br /&gt;&lt;br /&gt;Luckily, Packt Publishing has just the title to help enlighten me.  It's called "PHP 5 e-Commerce Development".  I started with the free sample chapter, which can be found &lt;a href="http://www.packtpub.com/files/9645-php-5-e-commerce-development-sample-chapter-enhancing-the-user-experience.pdf"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The table of contents looks promising, so I hope to get some good insites from this book.  Watch this space for a review soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-813431432146076133?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/813431432146076133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=813431432146076133' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/813431432146076133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/813431432146076133'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/02/e-commerce-in-php.html' title='E-commerce in PHP'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_jK_3qAYFh-o/S4XIhjyfOQI/AAAAAAAAAAk/ohczUCByQbM/s72-c/184719964X.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-1866904810541968324</id><published>2010-02-20T08:24:00.004-06:00</published><updated>2010-02-20T08:50:40.832-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='List Comprehensions'/><title type='text'>What in the world is a "List Comprehension"?</title><content type='html'>Sometimes I'll read something about a programming language I don't know and I'll be a little curious about some term I'm not familiar with.  The writer will rave on and on about how great this language is because it supports this thing, yet I don't understand what it can do for me.  Until recently, this is how it had been for me with "List Comprehensions".&lt;br /&gt;&lt;br /&gt;Well, I found an excellent explanation of List Comprehensions in Erlang.  Here's my thumbnail explanation:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"A List Comprehension is a way to apply some function to every member of a list."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, for an example.  Here's an example, straight from the Erlang shell:&lt;br /&gt;&lt;br /&gt;1&gt; AList = [1,2,3,4].&lt;br /&gt;[1,2,3,4]&lt;br /&gt;2&gt; ListDoubled = [ X * 2 || X &lt;- AList ].&lt;br /&gt;[2,4,6,8]&lt;br /&gt;&lt;br /&gt;Let's look at this, line by line.&lt;br /&gt;&lt;br /&gt;1&gt; AList = [1,2,3,4].&lt;br /&gt;&lt;span style="font-style:italic;"&gt;This is me typing in the List I want to start with.  Obviously, it contains 1,2,3, and 4.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;[1,2,3,4]&lt;br /&gt;&lt;span style="font-style:italic;"&gt;This is the Erlang shell, responding with the right hand side after binding the list to the variable AList.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;2&gt; ListDoubled = [ X * 2 || X &lt;- AList ].&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;This is the List Comprehension.  It reads something like this:  "A variable named ListDoubled should be bound to a new list made from applying the function "some variable times 2" to every item in an existing list, which is called "AList".&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;[2,4,6,8]&lt;br /&gt;&lt;span style="font-style:italic;"&gt;This is the result of my List Comprehension.  As it should be, every member of the first list was doubled.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So that's it!  A List Comprehension is just a very compact way to apply some function (and some filters, it turns out) to a list.  The result is another list.  &lt;br /&gt;&lt;br /&gt;For more on List Comprehensions, I'd refer you to the excellent book "Programming Erlang" by Joe Armstrong.  It's very readable, and makes learning new concepts easy.&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;br /&gt;&lt;br /&gt;Rick&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-1866904810541968324?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/1866904810541968324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=1866904810541968324' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1866904810541968324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1866904810541968324'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/02/what-in-world-is-list-comprehension.html' title='What in the world is a &quot;List Comprehension&quot;?'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-3580003239576613541</id><published>2010-02-15T18:04:00.001-06:00</published><updated>2010-02-15T18:05:52.363-06:00</updated><title type='text'>Book Review - "Funambol Mobile Open Source"</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Book Review for "Funambol Mobile Open Source"&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;If this book sounds interesting to you, it can be found &lt;a href="http://www.packtpub.com/funambol-mobile-open-source/book"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've just had the chance to read a copy of "Funambol Mobile Open Source" by Packt Publishing.  Here's a quick review of what you'll find in this book.&lt;br /&gt;&lt;br /&gt;First, for those of us who haven't heard of Funambol before-- it's an open source platform for synchronizing data on mobile devices.  Funambol will let you keep your email, personal contacts, and other data kept current on multiple devices.  The server is available for Windows or Linux and is easy to operate.  &lt;br /&gt;&lt;br /&gt;The book is really two books in one-- the first part is a well-detailed user's guide, the second part is a developer's guide for those who want to develop software rather than just use it.&lt;br /&gt;&lt;br /&gt;Part one covers product installation, an explanation of the application architecture, user administration, e-mail, PIM (address book and calendar), and the Funambol community.&lt;br /&gt;&lt;br /&gt;Part two brings starts the heavy technical content.  It contains SyncML (the protocol used to pass data back and forth between the Funambol server and the various devices it connects to) and a detailed chapter on how the reader can extend the server's Data Synchronization Service.  &lt;br /&gt;&lt;br /&gt;Being technical by nature, I enjoyed the content of the last two chapters-- there were some really good ideas there about how to extend Funambol if it doesn't do exactly what you need it to.&lt;br /&gt;&lt;br /&gt;All things considered, I'd think this book would be great for anyone who has a need to syncrhonize data across mobile devices.  The first part of the book really is user-friendly-- it starts from ground zero and presents all the steps necessary to use Funambol in a clear and logical manner.  There are many screen shots, and everything is spelled out in sufficient detail.  This part of the book reminds me of really well written professional-grade documentation.  (Except it's written in sort of a use-case manner, leading the reader alongside a mythical user of the application as she sets up her system.)  &lt;br /&gt;&lt;br /&gt;If you're in the market for a data synchronizer for your mobile devices, give this one a read!&lt;br /&gt;&lt;br /&gt;Happy Coding,&lt;br /&gt;&lt;br /&gt;Rick&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-3580003239576613541?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/3580003239576613541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=3580003239576613541' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3580003239576613541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3580003239576613541'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/02/book-review-funambol-mobile-open-source.html' title='Book Review - &quot;Funambol Mobile Open Source&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-4780452233502116192</id><published>2010-02-02T20:09:00.006-06:00</published><updated>2010-02-02T20:34:30.968-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Funambol'/><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><title type='text'>Let's go Funamboling!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jK_3qAYFh-o/S2jb0tM3CbI/AAAAAAAAAAc/QppNkztIMSw/s1600-h/Funambol.jpeg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 49px; height: 62px;" src="http://4.bp.blogspot.com/_jK_3qAYFh-o/S2jb0tM3CbI/AAAAAAAAAAc/QppNkztIMSw/s320/Funambol.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5433834648955718066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Funambol Mobile Open Source&lt;/span&gt;  &lt;a href="http://www.packtpub.com/funambol-mobile-open-source/book"&gt;available here&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What's that, you say?  You've never been Funamboling?  Well, that's good, because neither have I. In fact, I believe I've just made that word up, so we may very well be the first people ever to "go Funamboling"!  So what does that mean?&lt;br /&gt;&lt;br /&gt;As a programmer, I'm always interested in learning new things, especially if I can put them to some practical use.  In the recent past, I've studied R, Drupal, and Erlang, to name a few.  Sometimes I learn something I can immediately add to my programmer's toolkit, and sometimes I just learn something different to keep my brain elasticity up.  In that spirit, I will soon offer a review of a Funambol book, something I have never touched before.&lt;br /&gt;&lt;br /&gt;Funambol, which I have just become aware of today, is an open source technology used to synchronize smart phones and other devices with PCs.  Using Funambol, you can keep your calendars aligned, sync your email, and keep your notes in order on multiple devices.  It has Java and C++ APIs, so I'm hopeful I'll be ready for the code portion if not a master of the problem domain immediately.  It sounds interesting, so it should be a good learning journey.&lt;br /&gt;&lt;br /&gt;If this sounds like something you might try, I'd encourage you to check out some of the videos on YouTube.  (There are a bunch!  How did this thing get so big without me hearing of it?)  One such example is &lt;a href="http://www.youtube.com/watch?v=VlC3v60yAg4"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The book's in the mail, so watch this space for tales of my ventures into Funamboling soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-4780452233502116192?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/4780452233502116192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=4780452233502116192' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4780452233502116192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4780452233502116192'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/02/lets-go-funamboling.html' title='Let&apos;s go Funamboling!'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_jK_3qAYFh-o/S2jb0tM3CbI/AAAAAAAAAAc/QppNkztIMSw/s72-c/Funambol.jpeg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-3209581454297421341</id><published>2010-01-31T20:10:00.003-06:00</published><updated>2010-01-31T20:24:22.630-06:00</updated><title type='text'>Book Review - JBoss AS 5 Development</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jK_3qAYFh-o/S0VUU2mNHJI/AAAAAAAAAAU/YwHLZIuBRnI/s1600-h/1847196829.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 100px; height: 123px;" src="http://4.bp.blogspot.com/_jK_3qAYFh-o/S0VUU2mNHJI/AAAAAAAAAAU/YwHLZIuBRnI/s320/1847196829.png" alt="" id="BLOGGER_PHOTO_ID_5423834043467504786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.packtpub.com/jboss-as-5-development/book"&gt;This book found here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Book Review for "JBoss AS 5 Development" by Packt Publishing&lt;br /&gt;&lt;br /&gt;This review is for "JBoss AS 5 Development", which has the subtitle "Develop, deploy, and secure Java applications on this robust open source application server".  Having gone through the book with IDE in hand, I would have to say I find the subtitle more indicative of the content than the first part of the title.  Later I'll try to explain why I feel so.&lt;br /&gt;&lt;br /&gt;The book promises to cover a great amount of territory.  Roughly, the 14 chapters cover these topics:&lt;br /&gt;- Installation of the application server and Eclipse-based IDE toolkit&lt;br /&gt;- Major differences between JBoss AS 5 and previous versions&lt;br /&gt;- Customizing your JBoss installation&lt;br /&gt;- Developing EJB 3 Session beans&lt;br /&gt;- Working with JPA&lt;br /&gt;- Writing a web application (JSF)&lt;br /&gt;- The new JBoss messaging subsystem (JMS)&lt;br /&gt;- Writing Hibernate applications on JBoss&lt;br /&gt;- JMX and MBeans&lt;br /&gt;- JBoss Web Services&lt;br /&gt;- Clustering JBoss servers&lt;br /&gt;- Writing Clustered Applications&lt;br /&gt;- JBoss AS Security&lt;br /&gt;- Securing applications under JBoss&lt;br /&gt;&lt;br /&gt;If that seems like quite a list to digest, I would agree.  The last 4 chapters give a hint to the depth of content the reader will encounter. In those cases, the author first presents an overview chapter about how the application server handles the topic (clustering, security), then follows it up with a whole chapter about applying the implementation details.  I thought this struck the right balance between being too high-level (as many books might be) versus being overly detailed (as the old JBoss 4 AS doc book could be in places.) &lt;br /&gt;&lt;br /&gt;I think this book will be an excellent acquisition for anyone who is certain they will be working with JBoss AS 5.  The author has a deep understanding of the application server and writes in an easy to understand style.  The book covers a great amount of 'real world' territory that is sure to be of interest for anyone tasked with moving an application to production under JBoss AS 5.  Subjects like security and clustering (must-haves in a production environment) are given enough coverage that they can be of immediate practical use.  (Note:  these topics are not of vital importance in a pure development effort.  A great amount of development can be done without paying attention to either security or clustering.)  This is one reason I consider this book to be an interesting blend of development material and administrative material-- it is clearly not a pure development book.&lt;br /&gt;&lt;br /&gt;For those that are interested in learning JEE but are not certain they'll be using JBoss, I'd suggest they should consider this book but also compare it to other titles, perhaps one of Packt's excellent NetBeans/GlassFish titles.  This is not the fault of the book-- the author does a good job of walking the reader through various exercises in building EJBs, a JSF front-end application, a web service application, etc.  The reason I don't suggest this book for new students of JEE is that the raw toolkit is just not at the same level some other open source development stacks are at.  (Notably, NetBeans 6.8 and GlassFish).  Putting it plainly, there are more than a few things that can go wrong in putting together a JEE application with JBoss Tools-- if the user isn't seasoned in problem analysis and debugging, it could easily lead to frustrations and an unsatisfactory experience.    &lt;br /&gt;&lt;br /&gt;If you're already confident in your ability to write and deploy JEE apps, you should find this book to your liking.  Intermediate to advanced JEE developers ought to find plenty of material to keep them interested. Performance tips, JBoss specific extensions, and expert usage tips for enterprise Java development all get good coverage.  The author knows the ins and outs of using JBoss AS 5, and is generous in providing tips in effective usage of facets the reader is likely to encounter.  The author also provides good high-level overview material (which usually precedes the detail), which helps keep the reader grounded in the larger context of what's being conveyed.&lt;br /&gt;&lt;br /&gt;The book provides a reasonable number of illustrations, including screen shots of JBoss Tools wizard screens.  I found these of reasonable value, but have to admit I'm of mixed emotions on the toolset itself.  It does a great job of some things (I love the packaging wizard that let's you declaratively roll up .jars, .ears, etc.).  On the negative side, it makes some actions much more difficult than they have to be.  I thought the author did a good job of providing meaningful illustrations where an abstract idea was being presented, especially in the security and clustering chapters.  I once made a presentation at JBoss World about studying for the Sun Certified Enterprise Architect exam using JBoss-- I wish I'd had those illustrations then!  I guess my SCEA is now a depreciated asset-- maybe we'll have to study for 'Oracle' architectural credentials in the future.&lt;br /&gt;&lt;br /&gt;All things considered, this book will be an excellent source of information and reference for anyone using JBoss AS 5.  I'm sure it will prove value time and again as the reader delves into the various corners of enterprise Java. This book offers expert insites on many topics and does it in an easy to read manner.  &lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-3209581454297421341?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/3209581454297421341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=3209581454297421341' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3209581454297421341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3209581454297421341'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/01/book-review-jboss-5-as-development.html' title='Book Review - JBoss AS 5 Development'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_jK_3qAYFh-o/S0VUU2mNHJI/AAAAAAAAAAU/YwHLZIuBRnI/s72-c/1847196829.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-2846632816303446421</id><published>2010-01-27T20:24:00.003-06:00</published><updated>2010-01-27T20:39:32.901-06:00</updated><title type='text'>Birth of a NetBeans fan-boy</title><content type='html'>As I mentioned at &lt;a href="http://rickwagner.blogspot.com/2010/01/few-things-i-like-and-dont-like-about.html"&gt;last post,&lt;/a&gt; I've been reviewing the Enterprise Java development stack.  I've just finished writing some basic JPA applications using two different Application Servers (JBoss, GlassFish) and toolsets (JBoss Tools, NetBeans).  I really like Eclipse and JBoss, but I really have to hand it to the NetBeans folks on this one.  Here's what I found to like:&lt;br /&gt;&lt;br /&gt;- NetBeans will generate your Entity Beans for you, based on your schema (JBoss Tools does this, too)&lt;br /&gt;- NetBeans will generate Session Beans based on those Entity Beans&lt;br /&gt;- NetBeans will even generate a JSF CRUD application for you, exposing those Entity Beans!&lt;br /&gt;- NetBeans will generate your Persistence Unit for you&lt;br /&gt;- NetBeans will generate your DataSource for you (I think JBoss makes you copy a template file by hand for that one)&lt;br /&gt;&lt;br /&gt;All these things alone aren't so stunning, but what's really cool is the cohesive feeling the IDE gives you.  All that, plus integrated App Server control, Database control, etc.  (In fairness, JBoss Tools offers a lot of these, too.)&lt;br /&gt;&lt;br /&gt;Now, for the grand whammy:  I am ecstatic about the NetBeans Hadoop plugin from Karmasphere, which I first saw &lt;a href="http://arifn.web.id/blog/2010/01/23/hadoop-in-netbeans.html"&gt;here&lt;/a&gt;.  That plug-in just flat out rocks!  Using that plug-in, I ran my first Windows Hadoop job this afternoon about 20 minutes after I first saw the article.  Tonight, I ran a second job on my Ubuntu laptop (which runs an honest Hadoop installation as well) in about 2 minutes, without looking back at the instructions.  Everybody needs to look at this plug-in, it's flat out cool and makes Hadoop development an &lt;span style="font-weight: bold;"&gt;easy, desktop proposition&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;So here I sit, a several-year Eclipse user absolutely stunned by NetBeans 6.8.  I can only hope Oracle lets this IDE continue, it is definately raising the bar.&lt;br /&gt;&lt;br /&gt;So go get yourself a download of NetBeans 6.8, and Happy Coding!&lt;br /&gt;&lt;br /&gt;Rick&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-2846632816303446421?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/2846632816303446421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=2846632816303446421' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2846632816303446421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2846632816303446421'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/01/birth-of-netbeans-fan-boy.html' title='Birth of a NetBeans fan-boy'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-4203986872586813622</id><published>2010-01-21T19:12:00.002-06:00</published><updated>2010-01-21T19:16:16.906-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ejb3'/><category scheme='http://www.blogger.com/atom/ns#' term='netbeans'/><category scheme='http://www.blogger.com/atom/ns#' term='JBoss'/><title type='text'>A few things I like (and don't like) about EJB3</title><content type='html'>What I like (and don't like) about EJB3 and recent IDEs&lt;br /&gt;&lt;br /&gt;It's been a long time since I worked with JEE, so I've recently been working with late-model application servers from Sun and Jboss.  (I wanted to work with both at the same time to see which toolset I really liked best, and to help me better understand things.)  This week I've been working with EJBs and I'm delighted to report EJB3 really does fulfill the promise of greatly simplified development.  After a few hour's practice, I am now confident I could crank out a Session bean from scratch in less then 5 minutes on either JBoss or NetBeans.  (In the old days, this never would have been possible.)  &lt;br /&gt;&lt;br /&gt;Here are a few of the things I liked and disliked about my re-acquittance with EJBs.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What I like:&lt;br /&gt;1.  Plain annotated POJOs in a .jar -- no XML, and it really does work.&lt;br /&gt;2.  NetBean's 'Insert Code'/'Call Enterprise Bean' wizard.  Client code made simple!&lt;br /&gt;3.  The excellent online tutorial &lt;a href="http://netbeans.org/kb/docs/javaee/entappclient.html"&gt;here&lt;/a&gt;&lt;br /&gt;4.  Using JBoss Tools, I really like the 'Archive Manager' view.  It gives you a great UI to make a .jar, .war, .ear, whatever you need.  With no scripting!&lt;br /&gt;5.  The JBoss Tools 'Server' view.  Easy, in-Eclipse way to start/stop the Application Server&lt;br /&gt;6.  Ditto for NetBeans and the GlassFish controls.  (Extra credit to NetBeans for Database control in the IDE, too.)&lt;br /&gt;&lt;br /&gt;What I didn't like:&lt;br /&gt;1.  NetBeans generating a bunch of stuff behind my back.  (Of course you can use jar -tvf to see what it is, but I'd rather see it up front where I can easily understand it.)&lt;br /&gt;2.  JBoss and the never-ending story of how you really write EJB3 beans.  They now have a bi-monthly plug-in you have to apply to keep your app server up to date!  If you Google for a JBoss EJB3 tutorial, guess what you'll find?  17,000 blogs that tell you the way that guy did it, most of which won't work for you.  (At least that was my experience.)&lt;br /&gt;3.  Writing a JBoss client that needs a properties file or in-line setting of necessary properties.  In the old days that was fine, but NetBeans has raised the bar on that one.  (Counterpoint:  I guess I have to use the default ports, etc. for the NetBeans auto-magic client to work.  Fine with me, for today at least.  BTW, I recognize this is inconsistent with Gripe #1.)&lt;br /&gt;&lt;br /&gt;If you've never written an EJB, or haven't written one lately, I'd really encourage you to have a look.  (If you're really new to it, I'd suggest the NetBeans/GlassFish route, I think it's a little easier.)  If this is the future direction of Enterprise Java, I am encouraged.&lt;br /&gt;&lt;br /&gt;Next up:  JPA persistence.  Let's see how that one goes!&lt;br /&gt;&lt;br /&gt;'Till then, Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-4203986872586813622?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/4203986872586813622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=4203986872586813622' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4203986872586813622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4203986872586813622'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/01/few-things-i-like-and-dont-like-about.html' title='A few things I like (and don&apos;t like) about EJB3'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-7384640262911930725</id><published>2010-01-16T14:20:00.005-06:00</published><updated>2010-01-16T14:38:54.396-06:00</updated><title type='text'>Keeping Current with JEE-- the App Dev showdown, round 1</title><content type='html'>JEE Development -- contemporary toolkits, Round 1&lt;br /&gt;&lt;br /&gt;As &lt;a href="http://rickwagner.blogspot.com/2010/01/glassfish-vs-jboss-current-best-dev-kit.html"&gt;mentioned earlier&lt;/a&gt;, I'm on a quest to refresh my Java EE skills.  I've decided to explore two popular toolkits-- Netbeans/GlassFish and JBoss Tools/JBoss AS 5.1.  This entry is the first of a short series documenting my findings.&lt;br /&gt;&lt;br /&gt;Resource guides&lt;br /&gt;To help me navigate the JEE waters, I'm using 3 titles from Packt publishing:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://java-ee-5-glassfish.packtpub.com/"&gt;Java EE 5 Development using GlassFish Application Server&lt;/a&gt;&lt;br /&gt;&lt;a href="http://http//www.packtpub.com/glassfish-v2-application-server-administration/book"&gt;GlassFish Administration&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.packtpub.com/jboss-as-5-development/book"&gt;JBoss AS5 Development&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;By the way, if you follow the above links you'll find free chapters and other resources.&lt;br /&gt;&lt;br /&gt;Initial impressions:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Setup&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;GlassFish&lt;/span&gt; comes optionally packaged with NetBeans, in a very convenient single download.  Everything was easy to use and worked out of the box.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JBoss&lt;/span&gt; Tools and JBoss are not integrated.  JBoss Tools is a set of Eclipse plug-ins which you have to download into your Eclipse instance.  On my Ubuntu laptop, both the app server and the Tools plug-ins downloaded and configured as advertised.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Advantage:  Netbeans/GlassFish&lt;/span&gt; (hereafter '&lt;span style="font-weight:bold;"&gt;Sun&lt;/span&gt;') for the tight integration.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;App Server Configuration&lt;/span&gt;&lt;br /&gt;I started out with some knowledge of old-school app server configuration, but it's been at least 2 years since I worked in this space.  For that reason, I relied pretty heavily on my books for this section.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;GlassFish&lt;/span&gt; offers both a well-put together UI and a command-line interface for most every configuration task.  The UI is top-notch and intuitive to use.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;JBoss&lt;/span&gt; offers 3 different UI consoles (Administrative Console, JMX Console, JBoss Web Console) and a wide array of XML-based files that can be used to perform most common administrative tasks.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Advantage:  Sun&lt;/span&gt;, for ease of use.  In the long pull, JBoss may offer a little more granularity in configuration, but unless you spend a lot of time learning the nooks and crannies, you're going to be up to speed much faster with the Sun toolkit.&lt;br /&gt;&lt;br /&gt;So we end today's blog with the score 2-0, favoring the Sun JEE stack.  Let's see if this holds true as we enter the application development arena in a near-future blog.  &lt;br /&gt;&lt;br /&gt;'Till then, Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-7384640262911930725?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/7384640262911930725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=7384640262911930725' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/7384640262911930725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/7384640262911930725'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/01/keeping-current-with-jee-app-dev.html' title='Keeping Current with JEE-- the App Dev showdown, round 1'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-4687350675432234139</id><published>2010-01-06T21:08:00.005-06:00</published><updated>2010-01-06T21:45:07.302-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Packt'/><category scheme='http://www.blogger.com/atom/ns#' term='JBoss AS 5'/><category scheme='http://www.blogger.com/atom/ns#' term='JBoss'/><category scheme='http://www.blogger.com/atom/ns#' term='JBoss Tools'/><title type='text'>GlassFish vs. JBoss -- current best dev kit?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jK_3qAYFh-o/S0VUU2mNHJI/AAAAAAAAAAU/YwHLZIuBRnI/s1600-h/1847196829.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 100px; height: 123px;" src="http://4.bp.blogspot.com/_jK_3qAYFh-o/S0VUU2mNHJI/AAAAAAAAAAU/YwHLZIuBRnI/s320/1847196829.png" alt="" id="BLOGGER_PHOTO_ID_5423834043467504786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;As I &lt;a href="http://rickwagner.blogspot.com/2009/12/advnetures-in-orm.html"&gt;previously posted&lt;/a&gt;, lately I've been working with the Netbeans/GlassFish combination in an effort to keep my Enterprise Java skills current.  I've been very pleased with the ease of application development and have to say that JEE has never been easier.&lt;br /&gt;&lt;br /&gt;I have a concern, though.  The shop I work at is a JBoss shop, which makes me wonder about the current state of the development world for JBoss developers.&lt;br /&gt;&lt;br /&gt;I've worked with JBoss for a number of years, but never did find it especially easy to keep current on toolkit usage, especially compared to the aforementioned Sun toolkit.  I really like the latest NetBeans all-in-0ne toolkit that runs the databases, App server, dev tools, etc. all within the IDE.  To counter that, the last time I checked JBoss had a free offering that was comprised of a set of Eclipse plug-ins that offered similar functionality.  It's been a while since I used that kit, but I don't remember it being nearly as slick as this latest NetBeans offering.  Maybe it's time I have a fresh look at what the JBoss folks have in store for us.&lt;br /&gt;&lt;br /&gt;I know I'm going to get results fastest if I seek expert counsel, so I'm going to  refer to "&lt;a href="http://www.packtpub.com/jboss-as-5-development/book"&gt;JBoss AS 5 Development&lt;/a&gt;" from Packt Publishing.    The book promises to cover plenty of ground, going from app server install, through the development process, security, and deployment all the way through app server clustering.&lt;br /&gt;&lt;br /&gt;I've already had a read through the FREE sample chapter, which can be found &lt;a href="http://www.packtpub.com/files/6828-jboss-as-5-development-sample-chapter-8-developing-applications-with-jboss-and-hibernate.pdf"&gt;here&lt;/a&gt;.  The sample chapter covers use of Hibernate and Hibernate tools under JBoss, written in a very easy to understand step-by-step manner.  In my next code practice session I'll get JBoss installed and try to establish my own basic Hibernate web app, based on the contents of this chapter.&lt;br /&gt;&lt;br /&gt;I'll blog more about my luck with the JBoss kit after I've had a chance to read the book and write a few sample applications.  Here's hoping we find good things there!&lt;br /&gt;&lt;br /&gt;'Till then, Happy Coding!&lt;br /&gt;&lt;br /&gt;Rick&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-4687350675432234139?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/4687350675432234139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=4687350675432234139' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4687350675432234139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/4687350675432234139'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2010/01/glassfish-vs-jboss-current-best-dev-kit.html' title='GlassFish vs. JBoss -- current best dev kit?'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_jK_3qAYFh-o/S0VUU2mNHJI/AAAAAAAAAAU/YwHLZIuBRnI/s72-c/1847196829.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-3890279571967888247</id><published>2009-12-29T21:45:00.003-06:00</published><updated>2009-12-29T21:50:24.566-06:00</updated><title type='text'>Book Review - "GlassFish Administration"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jK_3qAYFh-o/SzrNHSgOysI/AAAAAAAAAAM/8PxSnfEvXbk/s1600-h/1847196500.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 123px;" src="http://4.bp.blogspot.com/_jK_3qAYFh-o/SzrNHSgOysI/AAAAAAAAAAM/8PxSnfEvXbk/s320/1847196500.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5420870626603616962" /&gt;&lt;/a&gt;&lt;br /&gt;Book Review of "GlassFish Administration", Packt Publishing&lt;br /&gt;&lt;br /&gt;Available &lt;a href="http://www.packtpub.com/glassfish-v2-application-server-administration"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This book is meant to be a resource for users of the GlassFish application server.  It covers many aspects of GlassFish usage, including installation, configuration, application deployment, clustering, performance monitoring, and more.  I would believe this book is appropriate for Enterprise Java administrators of all experience levels.&lt;br /&gt;&lt;br /&gt;The book is generously illustrated, often times making use of screen shots to help users navigate the excellent GlassFish administrative UI.  Better yet, the book also provides the Command Line equivalents wherever the UI is shown.  These handy tips will allow experienced administrators to script installations, significantly cutting down both time and errors.&lt;br /&gt;&lt;br /&gt;The CLI tips are just one example of the author's mastery of advanced server control issues.  The author, Xuekun Koum, clearly understands the needs of enterprise server administrators and clearly spells out many best practices.  For this reason, I would recommend this book for anyone planning to use GlassFish in a production environment.  The chapters on performance tuning, monitoring, and security alone will make this book worthwhile for that audience.&lt;br /&gt;&lt;br /&gt;In addition to that audience, I would also recommend this book to Enterprise Java developers who wish to keep abreast of best coding practices for the Java EE platform.  Have you ever seen a coding demo given by Sun engineers?  Using Netbeans and GlassFish, they are usually able to quickly generate flawless Java EE applications using mostly plain intuitive Java.  (No hand-configuration of deployment descriptors!)  This book, paired with a recent release of Netbeans and "Java EE 5 Development using GlassFish Application Server" (another Packt title) will allow you to knowledgeably generate Enterprise Java applications as easily as the Sun folks do.  I'll be honest-- I'm usually not a NetBeans/GlassFish user, but this combination makes it drop-dead simple to generate entire applications in no time.  Best of all, the generated source and configuration files are so clean that it's a snap to understand what each component does so you can brush up on how the whole things works.  GlassFish does it's part by nicely bundling all the required resources (databases, application server instances, JMS providers, etc.), making them all very easy to administer.  I've long thought Microsoft developers had a leg up on productivity given their excellent IDE and matching runtime environment, but after working with this toolset for a while I now believe the gap is closing.&lt;br /&gt;&lt;br /&gt;I own some other titles on application server administration as well as this one.  Frankly, I find this the most readable of these books.  The instructions it provides are straightforward and very easy to follow.  The author provides expert insights that probably came from many hours of working with GlassFish in different production settings.  (Some of these ideas extend beyond current use of GlassFish, as well.  In this regard, the book provides some best practices that should give the reader some wisdom without having to pay for it the hard way.)  This book also touches on topics that really aren't specific to GlassFish, but rather are of interest to anyone working with an application server.  Of particular interest in this area are sections on application monitoring and load balancing.&lt;br /&gt;&lt;br /&gt;As for complaints, I have few.  The primary thrust of the book is GlassFish 2, which is the current production mainstay.  There is a chapter on GlassFish 3, but I wish the book were weighted a little more heavily towards version 3 so the book would maintain relevance longer.  (In fairness to the author, I guess it's not possible to offer real-world experienced opinions on products that haven't been in use for much time.  So I guess the version 2 / version 3 ratio is about right, realistically.)  I wish this title contained a little of the content from some of Packt's other developer-centric titles (i.e. Netbeans tips).  Other than those, I can't think of any other wants.&lt;br /&gt;&lt;br /&gt;All things considered, this is a solid addition to any Java architect/developer's library.  I'd urge you to check it out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-3890279571967888247?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/3890279571967888247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=3890279571967888247' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3890279571967888247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/3890279571967888247'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2009/12/book-review-glassfish-administration.html' title='Book Review - &quot;GlassFish Administration&quot;'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_jK_3qAYFh-o/SzrNHSgOysI/AAAAAAAAAAM/8PxSnfEvXbk/s72-c/1847196500.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-7109388893157766864</id><published>2009-12-24T14:43:00.004-06:00</published><updated>2009-12-24T16:29:53.610-06:00</updated><title type='text'>Adventures in ORM</title><content type='html'>I've been spending a little time over the Christmas break working with toolsets I don't usually use.  (I think this helps me better appreciate the tools I use, no matter what they are.)  For the past couple of days I've been having a look at Java ORM solutions.  &lt;br /&gt;&lt;br /&gt;I had a quick look at Spring 3 / Hibernate 3, but hit some resistance in the form of strange errors I couldn't easily resolve.  Sometimes in this case I'll just dig in and spend as much time as I have to, but in this case I decided to put down this toolkit and pick up another.  &lt;br /&gt;&lt;br /&gt;I've been doing a little work with the GlassFish application server, so I thought this would be a good chance to pick up NetBeans and make use of some of it's neat features.  Every time I see the Sun folks talk, they really make NB look attractive, so I was hoping to find something good there.&lt;br /&gt;&lt;br /&gt;Well.... I initially liked what I saw.  I already had a PostGres database (also not my usual choice), so I made use of a cool code-gen feature to instantly make some Entity objects.  Really easy!&lt;br /&gt;&lt;br /&gt;The Entity beans weren't much use without a wrapper class to use them, so I also auto-generated (all this through right-click!) some Controller classes off the Entity beans.  Also very easy!&lt;br /&gt;&lt;br /&gt;Now just to hand-code a 'Main' and invoke the Controller classes.  Much to my chagrin, all my nicely generated code didn't work.  What was up?&lt;br /&gt;&lt;br /&gt;A quick look at the log showed the query that was generated.  Something like this:&lt;br /&gt;select Name, Id from BC_Schema.BowlingCenters&lt;br /&gt;&lt;br /&gt;That was a good clue.  I knew from running hand-built queries that PostGres preferred something like this:&lt;br /&gt;select "Name", "Id" from "BC_First_Schema"."BowlingCenters"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The difference was only the quotation marks.&lt;/span&gt;  (Maybe this seems natural to PostGres users.  I don't often use it, so it seemed odd to me.)&lt;br /&gt;&lt;br /&gt;After quickly searching the web (thanks Google!) I found the quick cure was to doctor up the generated Entity class.  Wherever an annotation referenced a keyword in the query, I added a backslash-double-quote to make it print the quotes when it gen'ed the query.  Example:&lt;br /&gt;&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;@Column(name = "Id")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    Was fixed to be:&lt;br /&gt;&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;@Column(name = "\"Id\"")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After that, I was able to quickly generate Entities and Controllers, building out a db-based application in no time.  Very productive!&lt;br /&gt;&lt;br /&gt;Probably the most valuable idea I got from the whole adventure was this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;When working with a new ORM setup, start out by coding a plain JDBC snippet to view a few rows.  This will convince you you've got your credentials right, allowing you to work with fewer factors as you run down your initial bugs.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Happy Coding, and Merry Christmas!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-7109388893157766864?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/7109388893157766864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=7109388893157766864' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/7109388893157766864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/7109388893157766864'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2009/12/advnetures-in-orm.html' title='Adventures in ORM'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-688532471565957896</id><published>2009-12-18T18:04:00.002-06:00</published><updated>2009-12-18T18:24:18.710-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hadoop simple example'/><category scheme='http://www.blogger.com/atom/ns#' term='Hadoop help scripts'/><category scheme='http://www.blogger.com/atom/ns#' term='Hadoop Java'/><title type='text'>Hadoop Solution for the Hoppity problem</title><content type='html'>The latest in &lt;a href="http://rickwagner.blogspot.com/2009/12/code-snippets-series.html"&gt;the Code Snippet series&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A highly contrived solution to the &lt;a href="http://rickwagner.blogspot.com/2009/12/hoppity-problem.html"&gt;Hoppity problem&lt;/a&gt;, using Hadoop.  &lt;br /&gt;&lt;br /&gt;Why in the world did I do this?  After all, Hadoop is a batch framework for working with large amounts of data in parallel, hardly the right tool to solve a trivial small-data problem on a single laptop.  &lt;br /&gt;&lt;br /&gt;I did it primarily to exercise my Hadoop skills, though even here it's a light workout.  But I think Hadoop is well worth learning and practicing, so here goes!&lt;br /&gt;&lt;br /&gt;The Setup&lt;br /&gt;- You have to have Hadoop installed.  For that task, I used &lt;a href="http://www.michael-noll.com/wiki/Running_Hadoop_On_Ubuntu_Linux_%28Single-Node_Cluster%29"&gt;Michael Noll's excellent Hadoop-on-Ubuntu&lt;/a&gt; blog entry. &lt;br /&gt;- If you have a problem running after Michael's instructions, if it's a host naming problem, be sure your hosts file has 127.0.0.1 as 'localhost'.&lt;br /&gt;&lt;br /&gt;Run scripts&lt;br /&gt;You'll probably want to use utility scripts for the following tasks:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# Compile&lt;/span&gt;&lt;br /&gt;javac -cp /usr/local/hadoop/hadoop-0.20.1/hadoop-0.20.1-core.jar:/usr/local/hadoop/hadoop-0.20.1/lib/commons-cli-1.2.jar Hoppity.java&lt;br /&gt;jar -cfv hoppity.jar *.class&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# Make a directory&lt;/span&gt;&lt;br /&gt;bin/hadoop dfs -mkdir /user/hadoop/HoppityInput&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;# Copy the file containing Hoppity input into the directory&lt;/span&gt;&lt;br /&gt;bin/hadoop dfs -copyFromLocal numHops.txt /user/hadoop/HoppityInput&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# Run&lt;/span&gt;&lt;br /&gt;bin/hadoop jar hoppity.jar Hoppity /user/hadoop/HoppityInput /user/hadoop/HoppityOutput&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;# View your output&lt;/span&gt;&lt;br /&gt;bin/hadoop dfs -ls /user/hadoop/HoppityOutput&lt;br /&gt;bin/hadoop dfs -cat /user/hadoop/HoppityOutput/part-r-00000&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# Destroy the output directory for the inevitable re-runs as you learn&lt;/span&gt;&lt;br /&gt;bin/hadoop dfs -rmr /user/hadoop/HoppityOutput&lt;br /&gt;&lt;br /&gt;Finally, the code&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;import java.io.IOException;&lt;br /&gt;&lt;br /&gt;import org.apache.hadoop.conf.Configuration;&lt;br /&gt;import org.apache.hadoop.fs.Path;&lt;br /&gt;import org.apache.hadoop.io.Text;&lt;br /&gt;import org.apache.hadoop.mapreduce.Job;&lt;br /&gt;import org.apache.hadoop.mapreduce.Mapper;&lt;br /&gt;import org.apache.hadoop.mapreduce.Reducer;&lt;br /&gt;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;&lt;br /&gt;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;&lt;br /&gt;import org.apache.hadoop.util.GenericOptionsParser;&lt;br /&gt;&lt;br /&gt;public class Hoppity {&lt;br /&gt;&lt;br /&gt;  public static class HoppityMapper &lt;br /&gt;       extends Mapper&amp;lt;Object, Text, Text, Text&amp;gt;{&lt;br /&gt;    &lt;br /&gt;      &lt;br /&gt;    public void map(Object key, Text value, Context context&lt;br /&gt;                    ) throws IOException, InterruptedException {&lt;br /&gt;        int theValue = Integer.parseInt(value.toString().trim());&lt;br /&gt;        StringBuilder result = new StringBuilder();&lt;br /&gt;        for (int idx = 1; idx &amp;lt; (theValue + 1); idx++){&lt;br /&gt;            if (isModN(idx, 3) &amp;amp;&amp;amp; isModN(idx, 5)){&lt;br /&gt;                result.append(&amp;quot;Hop~&amp;quot;);&lt;br /&gt;                continue;&lt;br /&gt;            }&lt;br /&gt;            if (isModN(idx, 3)){&lt;br /&gt;                result.append(&amp;quot;Hoppity~&amp;quot;);&lt;br /&gt;                continue;&lt;br /&gt;            }&lt;br /&gt;            if (isModN(idx, 5)){&lt;br /&gt;                result.append(&amp;quot;Hophop~&amp;quot;);&lt;br /&gt;                continue;&lt;br /&gt;            }           &lt;br /&gt;        }&lt;br /&gt;        Text resultKey = new Text(&amp;quot;ResultKey&amp;quot;);&lt;br /&gt;        Text resultValue = new Text(result.toString());&lt;br /&gt;        context.write(resultKey, resultValue);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private boolean isModN(int num, int mod){&lt;br /&gt;        if ((num % mod) == 0){&lt;br /&gt;            return true;&lt;br /&gt;        }&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public static class HoppityReducer &lt;br /&gt;       extends Reducer&amp;lt;Text,Text,Text,Text&amp;gt; {&lt;br /&gt;&lt;br /&gt;    public void reduce(Text key, Iterable&amp;lt;Text&amp;gt; values, &lt;br /&gt;                       Context context&lt;br /&gt;                       ) throws IOException, InterruptedException {&lt;br /&gt;      for (Text val : values) {&lt;br /&gt;          String[] hops = val.toString().split(&amp;quot;~&amp;quot;);&lt;br /&gt;          for (String hop : hops){&lt;br /&gt;                  Text blankText = new Text();&lt;br /&gt;              context.write(blankText, new Text(hop));  &lt;br /&gt;          }&lt;br /&gt;      }      &lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public static void main(String[] args) throws Exception {&lt;br /&gt;    Configuration conf = new Configuration();&lt;br /&gt;    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();&lt;br /&gt;    if (otherArgs.length != 2) {&lt;br /&gt;      System.err.println(&amp;quot;Usage: Hoppity &amp;lt;in&amp;gt; &amp;lt;out&amp;gt;&amp;quot;);&lt;br /&gt;      System.exit(2);&lt;br /&gt;    }&lt;br /&gt;    Job job = new Job(conf, &amp;quot;hoppity&amp;quot;);&lt;br /&gt;    job.setJarByClass(Hoppity.class);&lt;br /&gt;    job.setMapperClass(HoppityMapper.class);&lt;br /&gt;    job.setCombinerClass(HoppityReducer.class);&lt;br /&gt;    job.setReducerClass(HoppityReducer.class);&lt;br /&gt;    job.setOutputKeyClass(Text.class);&lt;br /&gt;    job.setOutputValueClass(Text.class);&lt;br /&gt;    FileInputFormat.addInputPath(job, new Path(otherArgs[0]));&lt;br /&gt;    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));&lt;br /&gt;    System.exit(job.waitForCompletion(true) ? 0 : 1);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-688532471565957896?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/688532471565957896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=688532471565957896' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/688532471565957896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/688532471565957896'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2009/12/hadoop-solution-for-hoppity-problem.html' title='Hadoop Solution for the Hoppity problem'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-2393077546008432954</id><published>2009-12-14T18:40:00.004-06:00</published><updated>2009-12-14T19:01:37.948-06:00</updated><title type='text'>A fish of a different color....</title><content type='html'>It seems there are many books available tell you how to develop software for various JEE application servers.  These books are invaluable when you are writing your software components, especially when the technology is new or you are venturing into territory you haven't visited before.&lt;br /&gt;&lt;br /&gt;But there comes a time when your development work is done, and you need to go to the next level.  You need to integrate your work with external entities like JMS providers.  You need to harden the environment and secure it.  You need to monitor the application server, watching for resource usage trends and guarding against future failures.  You need a book that emphasizes Application Server administration, not component development.&lt;br /&gt;&lt;br /&gt;I've just been informed of a new book from Packt Publishing that emphasizes administration of the excellent GlassFish AS.  The book, titled "GlassFish Administration", is scheduled for publishing later this month.  I read the&lt;a href="http://www.packtpub.com/files/6507-glassfish-administration-chapter-no-6-configuring-jms-resources.pdf"&gt; sample chapter&lt;/a&gt; and found it well written, illustrated generously with easy to read diagrams and friendly screenshots.  &lt;br /&gt;&lt;br /&gt;I hope the rest of the book is as good as the sample chapter.  Watch this blog for a full review as soon as the book is available!&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-2393077546008432954?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/2393077546008432954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=2393077546008432954' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2393077546008432954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2393077546008432954'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2009/12/fish-of-different-color.html' title='A fish of a different color....'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-8395446919827802994</id><published>2009-12-12T15:01:00.007-06:00</published><updated>2009-12-12T15:12:50.152-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Erlang convert string to integer'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang read flat file'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang recursive'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang convert integer to string'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang iterate low to high'/><title type='text'>Erlang solution for the Hoppity problem</title><content type='html'>The latest in &lt;a href="http://rickwagner.blogspot.com/2009/12/code-snippets-series.html"&gt;the Code Snippets series&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;An Erlang solution to &lt;a href="http://rickwagner.blogspot.com/2009/12/hoppity-problem.html"&gt;the Hoppity problem&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For those who have never tried functional programming, here's a taste of what you might encounter.  For those who know how to program in this way, I salute you!  I did much learning on the way, there is much more road to travel.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;To run the code:&lt;/span&gt;&lt;br /&gt;Put the code in a file called hoppity.erl.&lt;br /&gt;In the Erlang shell ('erl'), compile the file by typing:&lt;br /&gt;c("hoppity").&lt;br /&gt;&lt;br /&gt;Run the code in the Erlang shell:&lt;br /&gt;hoppity:start().&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;-module(hoppity).&lt;br /&gt;-export([start/0]).&lt;br /&gt;&lt;br /&gt;start() -&amp;gt;&lt;br /&gt;    {ok, Device} = file:open(&amp;quot;/home/rick/Programming/Hoppity_Hop/data.txt&amp;quot;,[read]),&lt;br /&gt;    ALine = string:strip(getALine(Device)),&lt;br /&gt;    {AsInt, Junk} = string:to_integer(ALine),&lt;br /&gt;    printHoppity(AsInt),&lt;br /&gt;    io:fwrite(&amp;quot;~n~s&amp;quot;, [&amp;quot; &amp;quot;]).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;getALine(Device) -&amp;gt;&lt;br /&gt;    case io:get_line(Device, &amp;quot;&amp;quot;) of&lt;br /&gt;        eof  -&amp;gt; file:close(Device), &amp;quot;None&amp;quot;;&lt;br /&gt;        Line -&amp;gt; file:close(Device), Line&lt;br /&gt;    end.&lt;br /&gt;&lt;br /&gt;printHoppity(Num) -&amp;gt;&lt;br /&gt;    printHoppityNTimes(1, Num).&lt;br /&gt;&lt;br /&gt;printHoppityNTimes(Current, Max) -&amp;gt;&lt;br /&gt;    if Current &amp;gt; Max -&amp;gt;&lt;br /&gt;        pass;&lt;br /&gt;    true -&amp;gt;                % 'else'&lt;br /&gt;        ByThree = Current rem 3,&lt;br /&gt;        ByFive = Current rem 5,&lt;br /&gt;        %io:fwrite(&amp;quot;~n~s&amp;quot;, [integer_to_list(ByThree)]),&lt;br /&gt;        %io:fwrite(&amp;quot;~n~s&amp;quot;, [integer_to_list(ByFive)]),&lt;br /&gt;        printHoppityValue(ByThree, ByFive),&lt;br /&gt;        printHoppityNTimes(Current + 1, Max)&lt;br /&gt;    end.&lt;br /&gt;&lt;br /&gt;printHoppityValue(0, 0) -&amp;gt;&lt;br /&gt;    io:fwrite(&amp;quot;~n~s&amp;quot;, [&amp;quot;Hop&amp;quot;]);&lt;br /&gt;printHoppityValue(0, _) -&amp;gt;&lt;br /&gt;    io:fwrite(&amp;quot;~n~s&amp;quot;, [&amp;quot;Hoppity&amp;quot;]);&lt;br /&gt;printHoppityValue(_, 0) -&amp;gt;&lt;br /&gt;    io:fwrite(&amp;quot;~n~s&amp;quot;, [&amp;quot;Hophop&amp;quot;]);&lt;br /&gt;printHoppityValue(_,_) -&amp;gt;&lt;br /&gt;    pass.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-8395446919827802994?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/8395446919827802994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=8395446919827802994' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/8395446919827802994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/8395446919827802994'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2009/12/erlang-solution-for-hoppity-problem.html' title='Erlang solution for the Hoppity problem'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-2467999482026651460</id><published>2009-12-12T14:12:00.005-06:00</published><updated>2009-12-12T14:27:41.512-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C modulus'/><category scheme='http://www.blogger.com/atom/ns#' term='C for loop'/><category scheme='http://www.blogger.com/atom/ns#' term='C read flat file'/><title type='text'>C++ Solution for Hoppity problem</title><content type='html'>Here's a C++ language solution for &lt;a href="http://rickwagner.blogspot.com/2009/12/hoppity-problem.html"&gt;the Hoppity problem&lt;/a&gt;.  This is part of &lt;a href="http://rickwagner.blogspot.com/2009/12/code-snippets-series.html"&gt;the Code Snippet series&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To run this:&lt;br /&gt;Make a simple Make file and a script to run the resulting executable, or else run it in your favorite C IDE.  I used Netbeans to build this one.  The only argument to the exe is the path to the file that contains the number as described by &lt;a href="http://rickwagner.blogspot.com/2009/12/hoppity-problem.html"&gt;Hoppity&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The code:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;fstream&amp;gt;&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;bool isModN(int num, int mod){&lt;br /&gt;    if ((num % mod) == 0){&lt;br /&gt;        return true;&lt;br /&gt;    }&lt;br /&gt;    return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char** argv) {&lt;br /&gt;&lt;br /&gt;    if (argc &amp;lt; 2){&lt;br /&gt;        cout &amp;lt;&amp;lt; &amp;quot;Must have 1 argument, the file name&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    ifstream inFile;&lt;br /&gt;&lt;br /&gt;    inFile.open(argv[1]);&lt;br /&gt;    if (!inFile) {&lt;br /&gt;        cout &amp;lt;&amp;lt; &amp;quot;Unable to open file&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;        exit(1); // terminate with error&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    int theNum;&lt;br /&gt;    while (inFile &amp;gt;&amp;gt; theNum) {&lt;br /&gt;        //  assume it's good -- don't do this when coding for 'real'!&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    inFile.close();&lt;br /&gt;&lt;br /&gt;    for (int kount = 1; kount &amp;lt; (theNum + 1); kount++){&lt;br /&gt;        if (isModN(kount, 3) &amp;amp;&amp;amp; isModN(kount, 5)){&lt;br /&gt;            cout &amp;lt;&amp;lt; &amp;quot;hop&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;        if (isModN(kount, 3)){&lt;br /&gt;            cout &amp;lt;&amp;lt; &amp;quot;Hoppity&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;        if (isModN(kount, 5)){&lt;br /&gt;            cout &amp;lt;&amp;lt; &amp;quot;Hophop&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return (EXIT_SUCCESS);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-2467999482026651460?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/2467999482026651460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=2467999482026651460' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2467999482026651460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/2467999482026651460'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2009/12/c-solution-for-hoppity-problem.html' title='C++ Solution for Hoppity problem'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-1914397297595146182</id><published>2009-12-11T09:10:00.004-06:00</published><updated>2009-12-11T09:17:11.185-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python console input'/><category scheme='http://www.blogger.com/atom/ns#' term='Python modulus'/><category scheme='http://www.blogger.com/atom/ns#' term='Python read flat file'/><category scheme='http://www.blogger.com/atom/ns#' term='Python for loop'/><category scheme='http://www.blogger.com/atom/ns#' term='Python read sysin'/><title type='text'>Python solution for the Hoppity problem</title><content type='html'>An entry in the &lt;a href="http://rickwagner.blogspot.com/2009/12/code-snippets-series.html"&gt;Code Snippet series.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's a Python solution to &lt;a href="http://rickwagner.blogspot.com/2009/12/hoppity-problem.html"&gt;the Hoppity problem&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;How to set it up:&lt;br /&gt;Copy the script below into a shell script.&lt;br /&gt;Copy the code below into a file, Hoppity.py&lt;br /&gt;Make a data file that contains the number, as required in &lt;a href="http://rickwagner.blogspot.com/2009/12/hoppity-problem.html"&gt;the Hoppity problem.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;How to run it:&lt;br /&gt;Run the script, give it the path and name to your data file.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The script&lt;/span&gt;:&lt;br /&gt;echo "Tell it the path to your data file, i.e. /home/rick/FaceBook_Puzzles/data.txt"&lt;br /&gt;python3 Hoppity.py&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The code:&lt;/span&gt;&lt;br /&gt;import sys&lt;br /&gt;&lt;br /&gt;#input_file = open("/home/rick/FaceBook_Puzzles/data.txt",'r')&lt;br /&gt;line = sys.stdin.readline()&lt;br /&gt;input_file = open(line.strip(),'r')&lt;br /&gt;   &lt;br /&gt;as_string = input_file.read()&lt;br /&gt;the_val = eval(as_string)&lt;br /&gt;for idx in range(1, (the_val + 1)):&lt;br /&gt;    if ( ((idx % 3) == 0) and ((idx % 5) == 0)):&lt;br /&gt;        print ("Hop")&lt;br /&gt;    elif ((idx % 3) == 0):&lt;br /&gt;        print ("Hoppity")&lt;br /&gt;    elif ((idx % 5) == 0):&lt;br /&gt;        print ("Hophop")&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-1914397297595146182?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/1914397297595146182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=1914397297595146182' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1914397297595146182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1914397297595146182'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2009/12/python-solution-for-hoppity-problem.html' title='Python solution for the Hoppity problem'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-8250991715452562549</id><published>2009-12-11T08:55:00.002-06:00</published><updated>2009-12-11T08:59:41.588-06:00</updated><title type='text'>The Hoppity Problem</title><content type='html'>Here's the first problem I'd like to post in the new &lt;a href="http://rickwagner.blogspot.com/2009/12/code-snippets-series.html"&gt;Code Snippet series&lt;/a&gt;.  Thanks goes to Facebook for providing this one!&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Hoppity Hop!&lt;br /&gt;Write a program that takes as input a single argument on the command line. This argument must be a file name, which contains a single positive integer. The program should read this file and obtain the integer within, and then output a sequence of strings based upon the number (details below).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Input specifications&lt;br /&gt;The input file will contain a single positive integer (in base 10) expressed as a string using standard ASCII text (e.g. for example, the number "15" but without the double quotes). This number may or may not be padded on either side with white space. There will be no commas, periods, or any other non-numeric characters present within the number. The file may or may not terminate in a single new line character ("\n"). An example input file is below:&lt;br /&gt;&lt;br /&gt;15&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Output specifications&lt;br /&gt;The program should iterate over all integers (inclusive) from 1 to the number expressed by the input file. For example, if the file contained the number 10, the submission should iterate over 1 through 10. At each integer value in this range, the program may possibly (based upon the following rules) output a single string terminating with a newline.&lt;br /&gt;&lt;br /&gt;   * For integers that are evenly divisible by three, output the exact string Hoppity, followed by a newline.&lt;br /&gt;   * For integers that are evenly divisible by five, output the exact string Hophop, followed by a newline.&lt;br /&gt;   * For integers that are evenly divisble by both three and five, do not do any of the above, but instead output the exact string Hop, followed by a newline.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Example output (newline at end of every line):&lt;br /&gt;&lt;br /&gt;Hoppity&lt;br /&gt;Hophop&lt;br /&gt;Hoppity&lt;br /&gt;Hoppity&lt;br /&gt;Hophop&lt;br /&gt;Hoppity&lt;br /&gt;Hop&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-8250991715452562549?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/8250991715452562549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=8250991715452562549' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/8250991715452562549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/8250991715452562549'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2009/12/hoppity-problem.html' title='The Hoppity Problem'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5839700538451430522.post-1298265046982980160</id><published>2009-12-11T08:51:00.003-06:00</published><updated>2009-12-11T09:09:30.998-06:00</updated><title type='text'>The Code Snippets series</title><content type='html'>I've decided to launch a series of blogs detailing my journey through programming tasks.  I'll post a problem to be solved, then some solutions coded in different languages.  My hope is that the code snippets will be small and clear enough that the blogs can be used as a reference, sort of a cut-n-paste repository to help coders quickly get program shells running.&lt;br /&gt;&lt;br /&gt;The code snippets will &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; be industrial-strength implementations.  They'll probably lack error handling, flexibility, optimized performance, and other attributes you'd like your real-world code to have.&lt;br /&gt;&lt;br /&gt;The code snippets &lt;span style="font-weight: bold;"&gt;will&lt;/span&gt; offer quick'n'dirty implementations of common programming problems, formatted for maximum re-use. &lt;br /&gt;&lt;br /&gt;Critiques and alternative implementations are welcome.  Iron sharpens iron, they say, so feel free to suggest a better way.  Watch for the first post soon.&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5839700538451430522-1298265046982980160?l=rickwagner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rickwagner.blogspot.com/feeds/1298265046982980160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5839700538451430522&amp;postID=1298265046982980160' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1298265046982980160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5839700538451430522/posts/default/1298265046982980160'/><link rel='alternate' type='text/html' href='http://rickwagner.blogspot.com/2009/12/code-snippets-series.html' title='The Code Snippets series'/><author><name>Rick</name><uri>http://www.blogger.com/profile/13428944430725185873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-58397005384
