<?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-31129136</id><updated>2011-12-14T03:44:17.819-08:00</updated><category term='logging'/><category term='jackrabbit'/><category term='jcr'/><category term='scalability'/><category term='java'/><category term='pentaho'/><category term='pharmacy'/><category term='webdav'/><category term='document management'/><category term='unit'/><category term='data scrubbing'/><category term='etl'/><category term='pst'/><category term='eclipse pde maven tycho'/><category term='business intelligence'/><category term='api method maintain engineer'/><category term='usps'/><category term='bi'/><category term='openejb unit ejb jboss'/><category term='edi'/><category term='outlook'/><category term='IEEE-754'/><category term='freemarker hibernate camelcase underscore ftl'/><category term='hipaa'/><category term='report'/><category term='address'/><category term='jpa'/><category term='ejb3'/><category term='scanning'/><category term='e-mail'/><category term='forms processing'/><category term='email'/><category term='performance'/><category term='ocr'/><category term='slide'/><category term='testing'/><category term='hocr'/><category term='exchange'/><category term='web plugin adobe tiff'/><category term='profiling'/><category term='835'/><category term='cdia'/><title type='text'>Darren Hartford's Developer Blog</title><subtitle type='html'>Software Engineering, Development, Open Source, Java, and solutions to every day problems.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-31129136.post-4795447952759411613</id><published>2011-12-08T06:07:00.000-08:00</published><updated>2011-12-08T06:59:29.748-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hocr'/><category scheme='http://www.blogger.com/atom/ns#' term='scanning'/><category scheme='http://www.blogger.com/atom/ns#' term='ocr'/><category scheme='http://www.blogger.com/atom/ns#' term='forms processing'/><title type='text'>Document Capture and Tables/Tabular/Invoices (ocr)</title><content type='html'>One of the roles I fulfill is working heavily in Data, or Document, Capture.  &lt;br /&gt;&lt;br /&gt;This covers a wide range:&lt;br /&gt;&lt;br /&gt;Document Capture (or Document Content Management/Records Management as the modern term) - Index a couple of fields to be able to search/retrieve the image/document later. The second part is where you store, search, retrieve after the indexes have been captured, but that's for another time and not the focus here.&lt;br /&gt;&lt;br /&gt;Data Capture - Collect information from paperwork for use by systems.  The original image/document is not relevant after capture except as a reference.  Usually unstructured documents or low volume documents.&lt;br /&gt;&lt;br /&gt;Forms Processing - Collect information from paperwork in a fast, repeatable process.  The original image/document is not relevant after capture except as a reference.   Forms processing is an advanced form of Data Capture where if you have consistent forms (structured documents) where the data elements are always in the same location on the form and there is (practically) no variance in the forms/data locations.&lt;br /&gt;&lt;br /&gt;Back to the topic at hand - Tabular Capture, or being able to OCR and Key information that is in table format from images that may have come from output systems, scanning, faxing, or other means and trying to turn it BACK into data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;How do we obtain information from tables on paper?&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Forms Processing - one answer, zones.  Form Processing is designed to collect information from data points on the image/document where the data element is always in the same position.   If the first column/first row of a table is always 5" from the top, 1.35" from the left side, has a width of 2" and a height of 1", you &lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;zone&lt;/span&gt;&lt;/span&gt; that area.  By zoning, OCR knows where to go exactly for the information, and can be tuned in how it reads the elements (I only expect numeric values here, so there will be no lowercase-L or Oh's or upper case I's or Z's).  Also, by zoning, manual entry becomes easy as well as they can look directly at the location.  And then exporting, hey, you already know the context of the data element because it was in a specific location, so you already know it is row 1/column 1 to put it in the right location for your export.  &lt;br /&gt;&lt;br /&gt;Phew.....lots of good stuff with Zones, or sometimes called 'Zonal OCR'.   And you don't even need OCR to use zones. Downside?  Lot of time in setup and tuning. Lots of time.  And you need the right tools in your capture suite to support it.  And again, it doesn't even have to use OCR, just setting up zones for manual capture and your export is a gain.&lt;br /&gt;&lt;br /&gt;So...what happens when the paperwork has tables but the paperwork is sporadic, non-consistent, unstructured, and may have a high rate of change you not only have no control over, but no upfront notification of the changes?  Examples you ask -- Invoices are the biggest culprit, but there are many others out there.&lt;br /&gt;&lt;br /&gt;Answer?  Well....this is where some companies have innovative approaches to the problem, but from my point of view nothing has been great yet.  The column locations are likely different between tables (i.e. first column on one invoice is the product ID, another it is the description, yet another invoice it is the quantity).   Some approaches to using regular expressions (regex in shorthand) to detect the context of the data have been tried, but a unit price, calculated price, discount price, and total price all look the same and again could be shuffled around column-wise depending on the invoice. Others have some basic attempts at image analysis to do table detection, and try to OCR the headers for context of the columns (but, running into the problem that invoices have different column header names for the same semantic meaning, while in others the headers have inverse-coloring (white text on black background)))...of all, this is probably the best automation approach but is very immature at the moment. &lt;br /&gt;&lt;br /&gt;All good attempts to automate the unstructured tabular capture problem, and maybe in controlled scenarios they work great.  But in the real world, lets face it - a human being will need to help figure out how the table is structured and the context of the data elements so it can be captured appropriately (whether OCR or manual again doesn't matter), but done in such a way to be efficient and productive.&lt;br /&gt;&lt;br /&gt;Posting here if anyone has found anything, if not, if you stumbled on this blog in a hope to solve this specific problem -- at least you are not alone!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-4795447952759411613?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/4795447952759411613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=4795447952759411613' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/4795447952759411613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/4795447952759411613'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2011/12/document-capture-and.html' title='Document Capture and Tables/Tabular/Invoices (ocr)'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-5285606905435964796</id><published>2011-12-04T09:51:00.001-08:00</published><updated>2011-12-04T09:53:56.901-08:00</updated><title type='text'>JavaEE 6 app servers compared</title><content type='html'>Thank you Antonio!&lt;br /&gt;&lt;br /&gt;Baseline/platform sizing of different JavaEE containers (disk, ram, startup).  &lt;br /&gt;&lt;br /&gt;http://agoncal.wordpress.com/2011/10/20/o-java-ee-6-application-servers-where-art-thou/&lt;br /&gt;&lt;br /&gt;The more complex metrics of scalability (cpu/mem increase as add more load), performance (first-call as well as high concurrency), and cluster/ha require constants on the OS/hardware/VM/JVM that takes quite a bit more setup and time.  At least the above are relatively constant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-5285606905435964796?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/5285606905435964796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=5285606905435964796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/5285606905435964796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/5285606905435964796'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2011/12/javaee-6-app-servers-compared.html' title='JavaEE 6 app servers compared'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-2150092037548420096</id><published>2011-06-03T05:53:00.000-07:00</published><updated>2011-06-03T06:24:15.776-07:00</updated><title type='text'>hypervisor (vm) and jvm (java) and SLA and costs</title><content type='html'>I've been testing several approaches to optimize the platform that the applications run on.  This blog post is just a brain dump without any clear direction other than current thoughts.&lt;br /&gt;&lt;br /&gt;Most of the applications I work it would fall under the equivalent of the JavaEE6 web-profile (jpa/web or jpa/ejb/web) with a couple that have messaging that, in reality, could be modified to work with other async-style approaches (while messaging also supports distributed work efforts, most of the applications aren't reaching a critical mass where then need to distribute that work).&lt;br /&gt;&lt;br /&gt;So, what are we talking about platform wise?&lt;br /&gt;&lt;br /&gt;*jboss or tomcat (or, more appropriately, the new TomEE as an option)&lt;br /&gt;&lt;br /&gt;*jvm&lt;br /&gt;&lt;br /&gt;*OS to run it on (preferably with iSCSI and similar large-disk-space mounting support).&lt;br /&gt;&lt;br /&gt;*hypervisor to run multiple guest OS/vm/appcontainers.&lt;br /&gt;&lt;br /&gt;Some of the general goals are reduce diskspace/memory, maximize the number of applications that can run on a piece of hardware, while still protecting or segregating applications from each-other so if in our haste to 'time to market' an application will only hurt itself and not any others.  Failover/disaster-recovery is also a consideration, with a minor emphasis on time-to-increase-capacity-and-associated-downtime but that is not as critical.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;App Container&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Jboss has been doing some wonderful things with the new jboss7 AS stack. I haven't finished my memory review, but I hope they got the 'memory bloat' under control.  Jboss 4.0.x series with one application can run in under 128MB in most cases, while Jboss 5.x and 6.x series for the SAME app need to double-to-triple to 256MB/364MB.&lt;br /&gt;&lt;br /&gt;-jboss deployment bonus: The ability to deploy an application's 'configuration' beside it as a SAR in the same deployment directory as the application WITHOUT needing to modify the server itself is HUGE.  I do not understand why people do not take more advantage of the SAR benefits.  You create your application binary once, then vet/test with one SAR configuration, take the SAME binary to your staging/pre-deploy/uat/stress-testing/etc environments with different SAR configurations, then again move the SAME binary to production with a different SAR configuration. What you tested is what went live.&lt;br /&gt;&lt;br /&gt;-And, once you setup the SAR configuration for the environment...leave it there and update the application binary with changes (assuming no additional configurations). The least variables to mess around with the better!&lt;br /&gt;&lt;br /&gt;TomEE is a new player and haven't reviewed it yet. &lt;br /&gt;&lt;br /&gt;Jonas unfortunately has never gave reason to peak my interest.&lt;br /&gt;&lt;br /&gt;Geronimo &amp; Glassfish are additional options, but also do not provide any significant reason to change from Jboss (which I have the most experience/skill in).&lt;br /&gt;&lt;br /&gt;Tomcat/Jetty are decent web-only platforms, but would not be considered as part of the strategy related to inability to support the full necessary stacks.&lt;br /&gt;&lt;br /&gt;Conclusion: Jboss still in the win, but if Memory is a constraint be wary of jboss5/6 versus the older jboss 4.0.x series.  The new Jboss7AS is a significant rewrite and will hopefully address this, as well as additional scenarios.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;jvm/os&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is where it gets interesting....&lt;br /&gt;&lt;br /&gt;*jboss again comes out with the Boxgrinder project so that you can have predictable/repeatable platforms.  This is kind of an outsider as it doesn't directly relate to any of the above areas, but is a way towards combining and using them in a cool (or more predictable...less variables) fashion.&lt;br /&gt;&lt;br /&gt;*Azul has their new Zing JVM/OS combo-solution that will run on hypervisors (and is optimized).  But, at a price of $5k-$6k per 'server', but I haven't touched/tested/or discussed if a server represents a single JVM that can run multiple appcontainers or not.&lt;br /&gt;&lt;br /&gt;*Oracle has a not-very-discussed JVM/OS combo-solution that will also run on hypervisors called Maxine Virtual Edition: http://labs.oracle.com/projects/guestvm/ &lt;br /&gt;-GPL licensed/forever open sourced.&lt;br /&gt;-takes queues from openJDK, so will continue to keep updated with recent JDK updates.&lt;br /&gt;-not 'production' ready...if this can get some more steam, this is definately a good place to go.&lt;br /&gt;&lt;br /&gt;Away from the cool stuff, and back to reality --&lt;br /&gt;&lt;br /&gt;Just Enough Operating System (JEOS) continues to be a buzzword but with no real meat or applied solutions.  The Boxgrinder project above does try to help with some pre-defined approaches to a JEOS for the different linux OS distributions. CentOS is still a popular choice for low-cost options, and the guys there are trying there best to get CentOS 6 out the door even while RHEL 6.1 gets released -- if you want the faster turn around, pay for it and get the benefit of testing and security announcements, otherwise free CentOS is free but help them out.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;hypervisor (virtualization)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hypervisor battle is pretty hot right now, with no real clear winner yet.  &lt;br /&gt;&lt;br /&gt;With Xen and KVM as the current front-runners on the open-source server hypervisor segment (with others close behind), it's not really black and white which one to pick although Xen has a little bit of an edge with Citrix backing and Paravirtualization support.&lt;br /&gt;&lt;br /&gt;VMWare, hyper-v (which announced CentOS support?!), and other commercials also offering some competitive advantages over the open source alternatives (for a price).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-2150092037548420096?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/2150092037548420096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=2150092037548420096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/2150092037548420096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/2150092037548420096'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2011/06/hypervisor-vm-and-jvm-java-and-sla-and.html' title='hypervisor (vm) and jvm (java) and SLA and costs'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-4343974832473023059</id><published>2011-05-04T06:30:00.001-07:00</published><updated>2011-05-04T06:42:12.729-07:00</updated><title type='text'>Alfresco as an Image Archive Server (TIFF/fax/scan images)</title><content type='html'>Currently evaluating Alfresco CE 3.4.d for use as an Image Archive/Record Content Management Server.  Definition is to store multi-page TIFF images that have 2-6 custom attributes that must be searchable to retrieve the associated images.&lt;br /&gt;&lt;br /&gt;The most common usecase that doesn't involve company-specific attributes as an example is storing incoming Fax images where you want to store attributes such as the number dialed to come in (enterprise w/ DID or similar fax setup), date it came in, number it came from (if available).    For the number dialed in, you could instead say 'Department'.&lt;br /&gt;&lt;br /&gt;Anyway, this post isn't about the custom attributes piece, this is for the image piece.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Req 1, allow to store and view multipage TIFF images (preferably without requiring a TIFF plugin that will likely change on Office upgrades).&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Alfresco by default does not handle multipage TIFF.  In fact, 3.4.d the supplied ImageMagick doesn't even support TIFF (see /alfresco/common/bin 'convert -list configure', DELEGATES line, should see TIF and it isn't there).  3.4.e DOES support TIF, but only for windows and 64-bit linux, and only the *first* page of the TIF.&lt;br /&gt;&lt;br /&gt;Luckily, this wonderful community member of the open source product Alfresco already had a solution: &lt;a href="http://fabiostrozzi.eu/2010/10/27/improving-tiff-preview-in-alfresco-share/"&gt;http://fabiostrozzi.eu/2010/10/27/improving-tiff-preview-in-alfresco-share/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;With additional modifications to remove ImageMagick, OpenOffice, and other ancillary services that were not needed for something soley to be a TIFF-based Image Server, a rather slim solution that with the default 'SHARE' interface is a good solution.  I do have 3.4.d working with this solution, and will be doing a more enterprise-oriented tomcat deploy opposed to the installer approach and feel quite confident in how Alfresco team architected the product to support each companies' unique needs.&lt;br /&gt;&lt;br /&gt;Current problem: The FLASH previewer is good, but the challenge with multi-page TIFF is that the tiff2pdf conversion isn't that bad....it's the pdf2swf that is taking 1/4 to 1/2 a second per page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-4343974832473023059?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/4343974832473023059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=4343974832473023059' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/4343974832473023059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/4343974832473023059'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2011/05/alfresco-as-image-archive-server.html' title='Alfresco as an Image Archive Server (TIFF/fax/scan images)'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31129136.post-854299530137853644</id><published>2011-02-15T10:52:00.000-08:00</published><updated>2011-02-15T10:55:55.752-08:00</updated><title type='text'>Javamelody performance &amp; usage statistics</title><content type='html'>One of the hidden gems in the open source world is a project called Javamelody.&lt;br /&gt;&lt;br /&gt;I've been using this since late 2009 to help refactor/modify design and code based on usage-based findings. It is not a profiler, not a click-n-fix, not a quickly-fix-your-problems tool.  It is a tool to get you the information, over time, that you need to make Strategic decisions about design/code.&lt;br /&gt;&lt;br /&gt;http://code.google.com/p/javamelody/&lt;br /&gt;&lt;br /&gt;It gets all tiers of statistics within a single application -&gt; the application's UI calls, business (ejb/facade/spring) calls, and sql calls.&lt;br /&gt;&lt;br /&gt;Recently I finally submitted a patch for GWT-RPC detailed statistics I've been using for a while to help, again from a strategic point of view, refine some products.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-854299530137853644?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/854299530137853644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=854299530137853644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/854299530137853644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/854299530137853644'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2011/02/javamelody-performance-usage-statistics.html' title='Javamelody performance &amp; usage statistics'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-606407533102521410</id><published>2011-01-24T16:40:00.000-08:00</published><updated>2011-01-24T16:44:41.788-08:00</updated><title type='text'>Web UI upgradability</title><content type='html'>One of the areas that has been an issue over time is taking an application, say deployed to jboss 3.0 or 3.2.3, and try to upgrade it to jboss 4.0.5.  Or tomcat 4 to tomcat 5.  Or any upgrades at all.&lt;br /&gt;&lt;br /&gt;Real-world experience with struts (1.0/1.1)/JSP sites have several challenges in upgrading.  Whether they are container based or implementation base, I have never had success with 'easy' upgrades.&lt;br /&gt;&lt;br /&gt;JSF appears to have similar issues. I myself kept running into performance issues everytime I've attempted a JSF implementation, so relying on this post to confirm similar issues: http://jsfunit.blogspot.com/2010/12/jsf-on-jboss-as6-final.html&lt;br /&gt;&lt;br /&gt;Now, onto one known savior - GWT is upgrade compatible.  I have successfully upgraded 1.3 to 1.5, 1.5 to 2.0, 2.0 to 2.1, and 1.3 to 2.0 (I haven't tried direct to 2.1).  The only upgrade issues were 1.3 to higher versions dealing with RPC changes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-606407533102521410?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/606407533102521410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=606407533102521410' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/606407533102521410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/606407533102521410'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2011/01/web-ui-upgradability.html' title='Web UI upgradability'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-5345923169157945749</id><published>2011-01-17T06:52:00.000-08:00</published><updated>2011-01-17T06:53:06.503-08:00</updated><title type='text'>Testing GWT-RPC, and why to be careful about jumping to RequestFactory</title><content type='html'>Just a copy of what I posted on StackOverflow: http://stackoverflow.com/questions/4119867/when-should-i-use-requestfactory-vs-gwt-rpc/4714437#4714437&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The only caveat I would put in is that RequestFactory uses the binary data transport (deRPC maybe?) and not the normal GWT-RPC.&lt;br /&gt;&lt;br /&gt;This only matters if you are doing heavy testing with SyncProxy, Jmeter, Fiddler, or any similar tool that can read/evaluate the contents of the HTTP request/response (like GWT-RPC), but would be more challenging with deRPC or RequestFactory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-5345923169157945749?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/5345923169157945749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=5345923169157945749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/5345923169157945749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/5345923169157945749'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2011/01/testing-gwt-rpc-and-why-to-be-careful.html' title='Testing GWT-RPC, and why to be careful about jumping to RequestFactory'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-5010942603239368820</id><published>2010-08-23T13:14:00.000-07:00</published><updated>2010-08-23T13:22:07.765-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openejb unit ejb jboss'/><title type='text'>openEJB unit testing for jboss deploys</title><content type='html'>Some notes using mavenized /src/main/resources/META-INF/openejb-jar.xml:&lt;br /&gt;&lt;br /&gt;&amp;lt;openejb-jar&amp;gt;&lt;br /&gt;&amp;lt;!-- make backward compatible with jboss style deployments. For EAR deploys prefix the .format = EARname/{deploymentId} --&amp;gt;&lt;br /&gt;&amp;lt;properties&amp;gt;&lt;br /&gt;   openejb.deploymentId.format = {ejbName}&lt;br /&gt;   openejb.jndiname.format = {deploymentId}/{interfaceType.annotationNameLC}&lt;br /&gt;&amp;lt;/properties&amp;gt;&lt;br /&gt;&amp;lt;/openejb-jar&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-5010942603239368820?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/5010942603239368820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=5010942603239368820' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/5010942603239368820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/5010942603239368820'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2010/08/openejb-unit-testing-for-jboss-deploys.html' title='openEJB unit testing for jboss deploys'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-3738545717292901262</id><published>2010-08-09T06:07:00.000-07:00</published><updated>2010-08-09T06:16:15.650-07:00</updated><title type='text'>Eclipse JPA tooling, Hibernate (jboss) tooling</title><content type='html'>Working on ways to improve the tooling/work environment when in a JPA project.&lt;br /&gt;&lt;br /&gt;In the past, pretty much hand-code everything and rely on maven/unit-tests to catch errors.&lt;br /&gt;&lt;br /&gt;Quicknote experiences:&lt;br /&gt;&lt;br /&gt; * To get JPA Tooling working, need to map the jdbc driver manually/directly to the filesystem jar location through the Eclipse-&gt;DataManagement features.&lt;br /&gt;&lt;br /&gt; * More on JPA tooling, particularly with maven layout, here: &lt;a href="http://www.eclipse.org/forums/index.php?t=msg&amp;goto=508143"&gt;http://www.eclipse.org/forums/index.php?t=msg&amp;goto=508143&lt;/a&gt;&lt;br /&gt;&lt;br /&gt; * To get Hibernate Tooling working, need to add the jdbc driver to the classpath, EVEN IF you are using Database Connection:JPA project configured option (i.e. see above direct jar filesystem mapping does not carry over to Hibernate Tooling).&lt;br /&gt;&lt;br /&gt; * In the persistence.xml, to avoid dealing with a lot of issues, remove JTA requirements.  This works for me as the Entity class/domain are in a project seperate from the Session Bean (the Entity Managers), so the Entity class/domain has a non-JTA persistence.xml, while the Session Bean (entity manager) project has a JTA persistence.xml. I hate inconsistencies, but only way this seems to work.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Gains:&lt;br /&gt;&lt;br /&gt; * In JPA tooling, immediately checked the model to the database structure, and identified a couple of case-sensitivity issues between the field name and the column name that were easy to fix.&lt;br /&gt; * In Hibernate tooling, can test-run jpa-ql queries to see if they work as expected, timing, and review results.  Can also look at the Dynamic SQL Preview to see the actual sql used for future index optimizations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-3738545717292901262?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/3738545717292901262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=3738545717292901262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/3738545717292901262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/3738545717292901262'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2010/08/eclipse-jpa-tooling-hibernate-jboss.html' title='Eclipse JPA tooling, Hibernate (jboss) tooling'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-4535453016591727443</id><published>2010-07-26T10:23:00.000-07:00</published><updated>2010-07-26T13:10:29.766-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse pde maven tycho'/><title type='text'>(CI) Building Eclipse PDE plugins from Maven</title><content type='html'>...is a pain in the arse.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After evaluating maven-pde-plugin, which one would think would make it easy, turns out not so much.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've swapped over to using Tycho (because it appears to better support multiple build options, like update sites and RCP apps directly instead of just plugins and features), but that isn't proving trivial even in the most basic sense still.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But, using Tycho 0.9.0 from the ibiblio org.sonatype.tycho groupid (not to be confused with org.codehaus.tycho...or several other groupId's I've run into) you still have issues:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Errors like: "Cannot find lifecycle mapping for packing: 'eclipse-plugin' come up a lot.  Looking at the off-chance there is a dependency issue, you are required to use an unstable release version of Maven 3 (as of 7/26/2010 at any rate).  Using maven 3.0-beta-1 you now get "Unknown packaging: eclipse-plugin"...so not much help there either.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px; border-collapse: collapse; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px; border-collapse: collapse; "&gt;Searching for help on either of these issues get posts like 'fixed in Tycho 0.5.0', or 'you need to modify how you build from source'...which if you get the binary from a public maven repository one would hope would work as expected (per why most people want to use maven so you DONT run into these issues).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px; border-collapse: collapse; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px; border-collapse: collapse; "&gt;Other people mention 'update m2eclipse'...except I'm running this from the command line for the purpose of eventually moving to Hudson/Continuous Integration.  Maybe I mis-understand the purpose of this maven plugin and it must be used in eclipse with m2e?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px; border-collapse: collapse; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px; border-collapse: collapse; "&gt;Please help if you read this!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px; border-collapse: collapse; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px; border-collapse: collapse; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;EDIT: reason for chasing down why I want to automate Eclipse PDE builds is&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;1) I have an RCP app I would like to migrate over (from Eclipse 3.0 unfortunately)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;2) primary reason was to pre-load company JDBC drivers for use in Eclipse (&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.eclipse.org/forums/index.php?t=msg&amp;amp;goto=549384"&gt;http://www.eclipse.org/forums/index.php?t=msg&amp;amp;goto=549384&lt;/a&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;ANSWER: do not assume the 'convention':&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;WRONG plugin artifactId: maven-tycho-plugin&lt;br /&gt;&lt;br /&gt;CORRECT plugin artifactId: tycho-maven-plugin&lt;br /&gt;&lt;/code&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/31129136-4535453016591727443?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/4535453016591727443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=4535453016591727443' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/4535453016591727443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/4535453016591727443'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2010/07/ci-building-pde-plugins-from-maven.html' title='(CI) Building Eclipse PDE plugins from Maven'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-288332790560412013</id><published>2010-07-21T09:07:00.000-07:00</published><updated>2010-07-21T09:18:03.172-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web plugin adobe tiff'/><title type='text'>Web Browser plugins, how I loathe thee, let me count the ways.....</title><content type='html'>I have had a passionate dislike for web browser plugins.  Yes, they add new exciting features...that you may or may not be able to control, or have a predictable behavior across the world-wide-web.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Take for example two very common plugins that I usually have to deal with for reporting, document management/archive, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PDF plugins (Adobe)&lt;/div&gt;&lt;div&gt;TIFF plugins (variety)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Adobe PDF plugins - &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Versions/upgrades regularly, users have to regular update 'the site', even though it's not the site, it is the plugin asking for upgrades.&lt;/li&gt;&lt;li&gt;To embed, not embed, dealing with pop-ups allowed.&lt;/li&gt;&lt;li&gt;And...here is a good one....the web-embed adobe plugin making *multiple* http requests for the same content, and if your logging didn't account for that - multiple logs (see http 206, byte serving/byte range requests).&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;TIFF plugins -&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Variety of plugins with different options/features/control (and even something 'simple' like if the plugin allows multiple page viewing....apparently not standard?!)&lt;/li&gt;&lt;li&gt;You, your client/customer, or someone, has Outlook/Office installed and it has an update, a critical update, a security update, whatever -- and reverts to using the MS Tiff viewer by default despite your best effort to use a different TIFF plugin.&lt;/li&gt;&lt;li&gt;TIFF encoding/compression formats (i.e. g3/fax compression that has an X-Y ratio difference, that some plugins understand and show 'correctly', and others that show without the appropriate ratio and have 'crunched' images).&lt;/li&gt;&lt;li&gt;And the occasional TIFF that has a byte that isn't understood by Plugin XYZ, or other plugin, but yes on this plugin....search for it, they happen.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Then you add in other plugins like flash/shockwave, java applets, activex/silverlight, codec/encoding video players (whether to use quicktime, realplayer, windows media player, divx, ......), and developers just can not wait until HTML 5 becomes a real-world/real-usage deal.&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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-288332790560412013?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/288332790560412013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=288332790560412013' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/288332790560412013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/288332790560412013'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2010/07/web-browser-plugins-how-i-loathe-thee.html' title='Web Browser plugins, how I loathe thee, let me count the ways.....'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-9201835937623638467</id><published>2010-04-23T13:35:00.000-07:00</published><updated>2010-04-23T13:57:23.434-07:00</updated><title type='text'>BigDecimal v Float/float or Double/double for java transport</title><content type='html'>As I have posted previously, quite often I get involved in some type of financial portion of a solution, or the entirety of the solution is financial.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In java, BigDecimal is where you go for computational accuracy -- but what about if you just need to transport the data?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, I reviewed information in the Sun/Oracle JDK site, and if you go search and read it, it isn't overly definitive (from a 'do I want to or not use') on float/doubles.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After going through many other posts, mailing list searches, and reviews, I broke down and posted a question here:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://forums.sun.com/thread.jspa?messageID=10977271&amp;amp;#10977271"&gt;http://forums.sun.com/thread.jspa?messageID=10977271&amp;amp;#10977271&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also started doing some manual tests myself, and finally got the 'answer' I was looking for:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;float: 9 'locations'&lt;/div&gt;&lt;div&gt;double: 15 'locations'&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What are locations?  My testing, I found that float can accurately store and retrieve 6 numbers before the decimal, and 3 after....or 3 before/6 after, or any variation of that theme. Similar for double - 9 before/6 after, and other variations.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Needless to say, that's why it is vague as it matters what scale you are storing after the decimal as to how much you can store before the decimal.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, unless you can get a definitive max value and precision rule for a financial application, you might want to stick with the heavyweight of BigDecimal just to be sure.&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;Edit: I forgot to post *why* I was even looking at this!!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We were having some memory issues with an outsourced application (that lacked pagination), that had a DTO with 12 monetary value field...12 BigDecimals per DTO.  The List sizes ranged from 300-&gt;2000-&gt;40k.  The 40k (most extreme) was taking up 45MB of memory!  Changing the BigDecimal to float primitive for the 12 fields dropped the same List size down to 15MB (1/3!!!!!).  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, the accuracy needed for this application was not satisfied by float, so although I'm evaluating Double I may opt to play it safe and keep accuracy as more important than saving memory (and, instead, actually paginate the results!).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-9201835937623638467?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/9201835937623638467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=9201835937623638467' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/9201835937623638467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/9201835937623638467'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2010/04/bigdecimal-v-floatfloat-or-doubledouble.html' title='BigDecimal v Float/float or Double/double for java transport'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-6381735779033037404</id><published>2010-01-14T07:43:00.000-08:00</published><updated>2010-01-14T07:52:19.478-08:00</updated><title type='text'>Embedded DB - Sort Stability, Pagination</title><content type='html'>We use &lt;span style="font-weight: bold;"&gt;application-level pagination&lt;/span&gt;.  I wont go into the reasons, but several of them are business reasons.&lt;br /&gt;&lt;br /&gt;What is application-level pagination?  Someone wants to view 50000 records through a web screen (just stay with me...business reasons). &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Make the query, default/starting sorting order.&lt;/li&gt;&lt;li&gt;Cache results locally on the application layer the current set (in our case, cache into a hypersonic, h2, derby database that writes to file as too much to fit in memory).&lt;/li&gt;&lt;li&gt;Return first &lt;page&gt; results back to the web screen (say 50 records per page).&lt;/li&gt;&lt;/ul&gt;--person goes to 'next page', get next 50 records from local db result set.&lt;br /&gt;&lt;br /&gt;--person re-sorts the existing resultset, re-sort from local db result set (instead of re-querying the origin db), return first &lt;page&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Problems we ran into:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Certain embedded databases we found to not work out well for this challenge.  Hypersonic and H2 both didn't see to handle (at least with default settings) the multi-user/asychronous(web/ajax) request nature of the sorts and were causing the result sets to not be accurate when 'pushed too hard' (a user requests a sort, then changes their mind in the middle of a sort and changes the sort again).&lt;br /&gt;&lt;br /&gt;Derby however did seem to resolve this issue for us.  Yes, there are different ways to handle pagination, however need to solve the business request of how the behaviour was expected to act.&lt;br /&gt;&lt;br /&gt;If someone has some similar experiences with application-level caching of large result sets, re-orders, pagination, please share!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-6381735779033037404?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/6381735779033037404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=6381735779033037404' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/6381735779033037404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/6381735779033037404'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2010/01/embedded-db-sort-stability-pagination.html' title='Embedded DB - Sort Stability, Pagination'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-3778328615254487858</id><published>2009-08-06T06:20:00.001-07:00</published><updated>2009-08-27T08:19:27.854-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='logging'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='scalability'/><category scheme='http://www.blogger.com/atom/ns#' term='profiling'/><category scheme='http://www.blogger.com/atom/ns#' term='unit'/><title type='text'>least-invasive development improvement</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;LIDI - Least Invasive Development Improvement&lt;/span&gt;&lt;/span&gt; (team-oriented)&lt;br /&gt;&lt;br /&gt;Attempting to coin a term for what I have been attempting to do for the last 8 years in maturing a very small development team that supports many projects.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Definitions&lt;/span&gt;&lt;br /&gt;Small development team defined as under 10 people, including UI, Server, DB, and internal dev QA.&lt;br /&gt;&lt;br /&gt;Many projects defined as 10-25 active, supported solutions, with &gt;50% of them being unique solutions, while the rest may be re-tooled/variations of existing solutions.&lt;br /&gt;&lt;br /&gt;Small to medium projects defined (from a LOC standpoint) of between 10k and 500k.  Most are web-based, but some are thick client.  Most are 3-tier/n-tier, some are 2-tier thickclient-DB type solutions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Key Words&lt;/span&gt;&lt;br /&gt;*logging&lt;br /&gt;*unit testing&lt;br /&gt;*performance testing and review&lt;br /&gt;*scalability testing and review&lt;br /&gt;*security testing and review&lt;br /&gt;*configuration management&lt;br /&gt;*runtime management&lt;br /&gt;*runtime dependency checking/management (i.e. notification of issues)&lt;br /&gt;****Business problem solved&lt;br /&gt;****Expectations met&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Prefix&lt;/span&gt;&lt;br /&gt;I put the last two, &lt;span style="font-weight: bold; font-style: italic;"&gt;business problem solved&lt;/span&gt; and &lt;span style="font-style: italic; font-weight: bold;"&gt;expectations met&lt;/span&gt; with many asterisks because, like many developers have experienced, doing all the performance/scalability/security testing in the world won't help you if you have to recode/redesign it again and then have to re-do all the performance/scalability/security testing and review again.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Discussion&lt;/span&gt;&lt;br /&gt;When working with a small development team that is already fighting with project priority conflicts, short deadlines, short requirements, and constant support and change-requests, the last thing on your or their mind is ADDING more work.&lt;br /&gt;&lt;br /&gt;The above term, least-invasive, is on purpose -- there is no free lunch, there is no silver bullet.  There will be compromises, but if you maintain a goal of trying to make it as least invasive as possible, and able to show and provide reasons and results that are touchable/matter, you will mature and progress!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Experiences&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-style: italic;"&gt;Step 1: Baseline&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I know your first thought - I don't have time to come up with baseline metrics, we are already going nuts!  Guess what, I'm *not* talking about baseline metrics!  I am talking about getting the development **process* repeatable and stable -- that is your base for everything you do.&lt;br /&gt;&lt;br /&gt;*Baseline: Convention&lt;br /&gt;&lt;br /&gt;Yes, I borrowed this term from the Maven team.  Make sure all your projects follow a similar folder layout, for example all java code is in /src/main/java, all html/jsp is in /src/main/webapp, etc.  Get the team to the point where someone can checkout a project they never touched before and be able to know where to go/what to do.&lt;br /&gt;&lt;br /&gt;*Baseline: Independent builder&lt;br /&gt;&lt;br /&gt;Either find a person who will always be an independent builder, or setup some type of continuous integration system.  Having someone/something ELSE do builds than the developers will greatly stabalize the process and document/flush out any outstanding issues you have in the build process. This is a deadly experience I learned from my VB6, and now that I'm in java I've choosen http://hudson.net as an independent build tool, while continuum/cruisecontrol are other alternatives.&lt;br /&gt;&lt;br /&gt;*Baseline: Build system/dependency management/versioning&lt;br /&gt;&lt;br /&gt;I'm sure you just ran into a snag -- with an independent builder, you are learning there are different ways people are building, or worse, they are relying entirely on an IDE for the builds.  Moving to ANT or Maven2 build system in java, in my case Maven2, helped to ensure that the builds are *consistent* and any gotcha's can actually get caught EARLIER than later.  Let me say that again with an example - "This maven2 project is not building on my desktop, what a piece of crap." actually translates to "the project doesn't build on JDK1.4/JDK5/Windows/Linux/needs a library I forgot to add, lets fix it now while we're actively on the project instead of when we check it out 6 months later to fix a different issue.".&lt;br /&gt;&lt;br /&gt;Maven2 also helps with the dependency management problem, and the versioning problem. If you are always renaming your jars to be mylibrary.jar to include in your application, and you aren't sure which version that library is after-the-fact and trying to identify an issue, you know the problem.&lt;br /&gt;&lt;br /&gt;*Baseline: Promotion process&lt;br /&gt;&lt;br /&gt;This will be the most difficult baseline to adjust - a promotion process.  What I mean by this is, based on my experience that seems to be working, you develop and deploy to a DEV environment.  Work out the kinks as you know it.  If you are lucky enough to have an internal QA, have them review it on DEV.  Then, when things look o.k., *promote* to a STAGING environment (including different DB, server, everything).  NEVER make custom tweaks on Staging, instead always modify your promotion, or migration, scripts/process as those migration scripts/process is exactly what you are also testing that will be used when you promote to Live.   On Staging, you do UAT/Customer Acceptance, have them push it back if needed, make fixes on DEV, them promote back up to Staging for another review.  THEN promote to live.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-style: italic;"&gt;Step 2: Improve ability to identify and fix basic stuff&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;What I mean by this, is let the developers use the tools they are already comfortable with.  Unit Testing.  Diagnostic Logging (or normal logging if you aren't familiar with the different logging types).&lt;br /&gt;&lt;br /&gt;Unit Tests: Junit is a great.  Nunit exists for the other side.  Having a way to test the code is doing what you want to, AND BE ABLE TO REPEATABLY AND AUTOMATICALLY run those tests is the goal.  This is not integration testing, just basic module/unit testing that the code is behaving as expected to whatever business expectations can be resolved in the code.&lt;br /&gt;&lt;br /&gt;Diagnostic Logging: Making sure your code can log somewhere, that you can retrieve, and provide useful information to make a correction, is this goal.  "It broke!"  well, you need to know what caused it to break, and the *quicker* you can do that, the more time you'll have for other things.  Rather than re-testing manually with system outs, get your logging taken care of.  This will not fix all your issues, but if you can get the easy 80% out of the way, that's huge.  My experience we are still having some challenges, as there are some custom ways that are already in place, and people have a hard time breaking out of the sysout approach.  I think I'm satisfied with using SLF4J, then just letting the Log4j implementation for logging and controlling the log verbosity (and the formatting of the logs....nothing worse than custom logging that has many different outputs, get it consistent!).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-style: italic;"&gt;Step 3: Your walking, your walking, lets try jogging.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;By this point, you should be o.k. now, and taking care of business.  Now should be able to look at some more technical things to improve the development process.&lt;br /&gt;&lt;br /&gt;Codability: This is where the static code analysis tools come in, that are, again, not that invasive to use.  Whether you do it from a report generation standpoint, or integrated into the IDE, tools like PMD, Checkstyle, FindBugs have the potential to ferret out potentially poor code.  This is no replacement for peer review in any fashion at all, this is just a convenient way to identify common issues (note: these tools are not stone-cold rules, there are times things have to be coded a certain way).&lt;br /&gt;&lt;br /&gt;Testability: Coverage tools like Clover, Emma, Jcoverage can help on your unit testing side to see if you can increase the amount of testing, and catch certain flow-changes (if/else/case/etc) in the code that aren't tested as well right now.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-style: italic;"&gt;Step 4: The in-deep stuff&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Once you reached step 4, you can look at the items I listed back at the top of this page.  Notice that I really didn't hit certain items --&lt;br /&gt;&lt;br /&gt;Profiling is actually an invasive process most of the time, I haven't found a tool that can easily identify memory issues or performance bottlenecks *for* you, instead they, rightfully, require you to review the information and come to your own conclusions.  Tools like TPTP, Jprobe, jprofiler, etc aren't quick-fix tools, you need to learn them and understand them, and are useful in different scenarios.&lt;br /&gt;&lt;br /&gt;Multi-tier profiling/review: Tracking from the Web tier, through the server tier (rules/workflow/business logic), to the database tier (sql/db, or sproc) to help identify where in the tiers a particular slowdown or issue is occuring from.  Not something easy to do - some tools, like deprecated InfraRED and Glassbox, attempted to make this easier for us, but they don't seem to be active.&lt;br /&gt;&lt;br /&gt;Integration testing: Actually being able to do business testing across an entire integrated system programatically, performance testing SOA or the full cycle of pressing a button in the UI are all desireable goals, but not easy to setup and do.&lt;br /&gt;&lt;br /&gt;Automated UAT/User Interface testing:  Some neat tools, like Selenium, can help step through testing a website and ensure things continue to work as expected.  It's a great tool, but if you are constantly making changes, keeping those Selenium tests up to date can get time consuming.  Also, need to know they do NOT identify blemishes/non-intuitive interface, only that the interface is continuing to work as expected.&lt;br /&gt;&lt;br /&gt;Scalability testing:  testing 10-years later equivalent worth of data, testing 5,10,50, 1000 concurrent users, evaluating estimate load ability per setup (proxy/multi-app servers/single db, db clustering, etc).  You can also throw in disaster/recovery as part of the scalability testing as well.  These are all very manual, very concious development purposes and is definitely invasive and time consuming.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-style: italic;"&gt;Conclusion&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Well, this looks more like a brain-dump than an organized blog, but sometimes just dropping information can be helpful to other people, and could solicit useful feedback!&lt;br /&gt;&lt;br /&gt;Post-Edits:&lt;br /&gt;A good article on related subject: http://www.ddj.com/architect/184415470&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-3778328615254487858?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/3778328615254487858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=3778328615254487858' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/3778328615254487858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/3778328615254487858'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2009/08/least-invasive-development-improvement.html' title='least-invasive development improvement'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-267578863243189502</id><published>2009-07-23T11:51:00.000-07:00</published><updated>2009-07-23T11:55:53.952-07:00</updated><title type='text'>GWT 1.6 jvm crashes (ParameterizedMethodBinding)</title><content type='html'>Very quick blog.  GWT 1.6 causing JVM crashes.&lt;br /&gt;&lt;br /&gt;Sources:&lt;br /&gt;http://grack.com/blog/2009/04/14/gwt-16-crashes-and-a-fix/&lt;br /&gt;&lt;br /&gt;http://www.mail-archive.com/google-web-toolkit-contributors@googlegroups.com/msg04852.html&lt;br /&gt;&lt;br /&gt;http://osdir.com/ml/GoogleWebToolkitContributors/2009-04/msg00044.html&lt;br /&gt;&lt;br /&gt;We were experiencing similar issues, but the issues were difficult to sort out.  It appeared Sun 1.5 JVM's did not have this issue, most of the Sun 1.6 JVM's did (but a newer one did not), and the OpenJDK 1.6.0-b09 also had the issue (issues spanning Windows and Linux boxes).&lt;br /&gt;&lt;br /&gt;In the end, for our shop, I found the true resolution to the problem to be:&lt;br /&gt;&lt;br /&gt;Remove the '-server' option when running the GWT compiler.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-267578863243189502?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/267578863243189502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=267578863243189502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/267578863243189502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/267578863243189502'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2009/07/gwt-16-jvm-crashes.html' title='GWT 1.6 jvm crashes (ParameterizedMethodBinding)'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-4403388898939153929</id><published>2009-07-01T06:27:00.000-07:00</published><updated>2009-07-01T07:02:28.955-07:00</updated><title type='text'>Microsoft, Open Source, Barriers to Entry/Barriers to Deploy</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Microsoft, Open Source&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I had to make a concious decision to have the above title have a comma between Microsoft and Open Source.  Putting something like 'and' or 'versus' or 'with' may set the wrong stage for the intent of this blog.&lt;br /&gt;&lt;br /&gt;links:&lt;br /&gt;http://www.microsoft.com/opensource/&lt;br /&gt;http://www.codeplex.com/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Focus:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Barriers to Entry for a development environment&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Barriers to Deploy a solution&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Traditionally, 'open source' is associated directly with programming languages, with the two more prominent (not only, just prominent) ones being Perl and Java. &lt;br /&gt;&lt;br /&gt;So what makes them successful? A number of things do, but I wanted to mention two, from a business and adoption standpoint, key drivers -- Barriers to Entry and Barriers to Deploy.&lt;br /&gt;&lt;br /&gt;Rather than have a lengthy paragraph, just going to bullet/summerize (BE = Barrier to Entry removed, BD = Barrier to Deploy removed):&lt;br /&gt;&lt;br /&gt;Perl&lt;br /&gt;&lt;ul&gt;&lt;li&gt;BE: You can get perl language for free.&lt;/li&gt;&lt;li&gt; BE: You can get various IDE's to use perl for free...or use notepad/vi.&lt;/li&gt;&lt;li&gt;BE: Large number of commercial books out there for Perl.&lt;/li&gt;&lt;li&gt;BE: Large number of free articles out there for Perl.&lt;/li&gt;&lt;li&gt;BE, BD: CPAN, a large centralized repository of code you can use, learn from, and deploy at will for free.  A lot of problems, but obvious and obscure, have already been solved and are free for you to use and/or modify.&lt;/li&gt;&lt;li&gt;BE, BD: Interpreted, can make changes on-the-fly and immediately see the results (good for learning and prototyping and fast support, questionable for enterprise apps).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;BD: Multi-OS environment support (with availability of free OS as deployment environment).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; Java&lt;br /&gt;&lt;ul&gt;&lt;li&gt;BE: You can get a java compiler and java VM without cost.  Also, several options of compilers and VM's.&lt;/li&gt;&lt;li&gt;BE: Eclipse/Netbeans IDE are free.&lt;/li&gt;&lt;li&gt;BE: Large number of commercial books out there for Java.&lt;/li&gt;&lt;li&gt;BE: Large number of college courses and training classes for Java (varying level of quality however).&lt;/li&gt;&lt;li&gt;BE: Large number of free articles out there for Java, with code examples.&lt;/li&gt;&lt;li&gt;BE, BD: Several tested/documented solution paths and design patterns for more complex solutions (OSGi, Spring, JavaEE).&lt;/li&gt;&lt;li&gt;BE, BD: Many repositories of code and binaries available, free to use and modify -- sourceforge, codehaus, java.net, as well as Maven library repositories.&lt;/li&gt;&lt;li&gt;BE, BD: Free to use and deploy build systems (ant, Maven) that are not tied to an IDE, and allows anyone to 'check out or download' code and just start working with it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;BD: Multi-OS environment support (with availability of free OS as deployment environment).&lt;/li&gt;&lt;li&gt;BD: Java has several servers (JavaEE container servers - Tomcat, Jetty, Jboss, Jonas, Glassfish, Geronimo, etc) that are also free to develop and deploy on.&lt;/li&gt;&lt;li&gt;BE,BD: The JCP and/or common solutions usually have competition that continues innovation, and gives developers choices depending on the scenarios presented to them.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Microsoft&lt;br /&gt;&lt;ul&gt;&lt;li&gt;BE: Large number of commerical books on Microsoft .NET programming language platforms.&lt;/li&gt;&lt;li&gt;BE: Large number of college and training courses (relatively stable quality).&lt;/li&gt;&lt;li&gt;BE: Various programming language options for the .NET platform.&lt;/li&gt;&lt;li&gt;BE: Commerical MSDN access as a repository of solutions, code examples, etc.&lt;/li&gt;&lt;li&gt;BE,BD: Graphical/UI builds through the singular, commericial (which is both good and bad, as it's a constant) IDE - Visual Studio.&lt;/li&gt;&lt;li&gt;BD: You know exactly where it is going to deploy - commerical MS Server OS on MS IIS/Biztalk/etc licensed servers.&lt;/li&gt;&lt;li&gt;BE: Lot of packaged solutions, some integration solutions, all commercial, are available. However, require licensing for deployments.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;If Microsoft is going to try to adopt an open source community, they need to take a look at the Barriers to Entry and the Barriers to Deploy, particuarly from the commercial standpoint -- the companies that can spend the money aren't going to give their code back for free, while companies/developers that have low costs for the development and deployment environment are less in a pinch and like having their source code out there to help improve it's quality, particularly when the Barrier to Entry for someone else to look at published code is low.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-4403388898939153929?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/4403388898939153929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=4403388898939153929' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/4403388898939153929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/4403388898939153929'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2009/07/microsoft-open-source-barriers-to.html' title='Microsoft, Open Source, Barriers to Entry/Barriers to Deploy'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-2767943758367015833</id><published>2009-06-11T08:11:00.001-07:00</published><updated>2009-06-18T05:49:25.000-07:00</updated><title type='text'>Database Change Management</title><content type='html'>Preface: I am not a DBA.  I'm a software developer, document imaging architect, build system  and continuous integration implementer.  I use databases to store, query, and retrieve information, and I'm a bigot against stored procedures (unless used as a performance enhancement tool with a non-sproc version already implemented, or it really is too complicated to do outside a sproc).&lt;br /&gt;&lt;br /&gt;For those curious, I promised several people I would write up an open-source Data Profiler comparison blog, but I do not feel confident I have put in enough time for this yet.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Open Source Database Change Management&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;There isn't a lot out there.&lt;br /&gt;&lt;br /&gt;http://code.google.com/p/dbdeploy/ - LGPL&lt;br /&gt;http://www.liquibase.org/ - LGPL&lt;br /&gt;http://opendbcopy.sourceforge.net/ - INACTIVE&lt;br /&gt;&lt;br /&gt;edit: http://www.sql-workbench.net/ - WbSchemaDiff, WbDataDiff commandline&lt;br /&gt;&lt;br /&gt;One of the wishlist items here: http://dhartford.blogspot.com/2008/11/all-i-want-for-christmas-2008-full.html&lt;br /&gt;&lt;br /&gt;*  Both the active are full featured.&lt;br /&gt;*  Both will handle change management well.&lt;br /&gt;*  Liquibase seems to have a larger integration-point base (maven, eclipse, etc)&lt;br /&gt;*  Neither have an adequate/sufficient UI that would be considered 'quality and usable by a DBA/non-programmer'.  Yes, I'm a programmer, but I don't want to program EVERYTHING unless there is a reason for flexibility/customizability.&lt;br /&gt;&lt;br /&gt;That's about all I have to say about this subject.  The commercial tools still have a strong presence here (i.e. RedGate), as there aren't many alternatives.&lt;br /&gt;&lt;br /&gt;For now, I still use old school database viewer/sql tools to extract the DDL and data value changes.  The tool I use a lot is http://www.sql-workbench.net/ for this functionality, but I do hope for the above to mature and improve.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-2767943758367015833?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/2767943758367015833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=2767943758367015833' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/2767943758367015833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/2767943758367015833'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2009/06/database-change-management.html' title='Database Change Management'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-7035113902340693522</id><published>2008-11-12T13:44:00.000-08:00</published><updated>2009-02-03T14:00:29.900-08:00</updated><title type='text'>All I want for Christmas 2008 - Full Featured Eclipse Database plugin</title><content type='html'>Full Featured Database Plugin for Eclipse.&lt;br /&gt;&lt;br /&gt;Definition is vague, and of course dependent on whom you talk to.  I, personally, am more of a developer than a DBA, so you could instead call what I'm asking for as a 'Developer Database Plugin' versus a 'DBA Database Plugin'.&lt;br /&gt;&lt;br /&gt;So why not use SQLexplorer, DTP, Clay, or the several other Eclipse plugins that, yes, I have tested/used?&lt;br /&gt;&lt;br /&gt;Because, they are missing:&lt;br /&gt;&lt;br /&gt;*Good Source Control Support&lt;br /&gt;*Stored Procedure Support&lt;br /&gt;*Simplified View Support&lt;br /&gt;*Easy multi database support&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Good Source Control Support&lt;/span&gt; (specifically Subversion)&lt;br /&gt;&lt;br /&gt;For me, I immediately think of us spoiled Eclipse programmers that can:&lt;br /&gt;&lt;br /&gt;1) &lt;span style="font-weight: bold;"&gt;See quickly on the navigation tree what items are different than what is in SCM&lt;/span&gt; (3 POVs, only worried about what is deployed to the DB server you are pointing to, and what is in SCM.  Active Desktop changes should be deployed to the DB server you are pointing to first, then team-shared to SCM if all goes well).&lt;br /&gt;&lt;br /&gt;2) &lt;span style="font-weight: bold;"&gt;Compare/Diff easily/visually between what is in SCM versus what I'm looking at now.&lt;/span&gt; I understand the tricky part is there is 3 POVs -- SCM, active desktop, and what is deployed to the server you are pointing to.  From my standpoint, you always pull from the 'deployed db server' environment, compare to SCM, then make changes and deploy back to the 'deployed db server'.&lt;br /&gt;&lt;br /&gt;3) &lt;span style="font-weight: bold;"&gt;Everything in SCM&lt;/span&gt;.  Everything.  Entire schema -- tables, stored procedures, functions, indexes, triggers, etc -- everything.   Database specific security will be a bit trickier from an 'abstract' database standpoint, so that's ok, but no excuse on anything else.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Stored Procedure Support&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is so blatantly obvious it scares the heck out of me how many plugins don't support this.  If it can be read from JDBC, or, more precisely, can be read via 'EXEC &lt;db-specific-system-sproc-that-is-always-the-same-for-this-db-type&gt;' that could be a simple project to abstract out regardless of underlying database, it should be available from a plugin.&lt;br /&gt;&lt;br /&gt;some caveats though --&lt;br /&gt;1) Whatever mechanism is used to &lt;span style="font-weight: bold;"&gt;retrieve the deployed stored procedures&lt;/span&gt;, the -content- should be the same as what is stored to the SCM for easy compare/diff.&lt;br /&gt;&lt;br /&gt;2) &lt;span style="font-weight: bold;"&gt;Keep the editors simple first&lt;/span&gt;.  This means don't worry about it being t-sql, pl-sql, java, pgsql, etc -- just use simple text editors first, then work on developing more robust editors depending on the native stored procedure language of the underlying database.  Work on it later....get this working for now first.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Simplified View Support&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm not even going to bullet/number this.  How many people raise your hands when you had to use DTP to drill down from the Database-&gt;Catalog-&gt;Schema-&gt; when you thought you had pre-defined those values already in the connection.  I'm all for flexibility, but tools like IDE and IDE Plugins are supposed to be &lt;span style="font-weight: bold;"&gt;designed for you to work effectively&lt;span style="font-weight: bold;"&gt;,&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; so give us the ability to just look at what we want to look at (even if we have to configure it first).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Easy multi database support&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yes, we all know you can support any database that has a JDBC driver (one case).  Yes we know there are specific features (Execution Plans, etc) that require custom code/integration/libraries for specific databases (second use case).  But could you make it a little easier to get setup?&lt;br /&gt;&lt;br /&gt;1) &lt;span style="font-weight: bold;"&gt;http://mirrors.ibiblio.org/pub/mirrors/maven2/&lt;/span&gt; --- If you don't want to include the JDBC driver in your distribution, directly point your app to here under the right group id (directory structure) and let the person through your UI just pick a version and automatically download it to the right location for your app.  Manually downloading and adding to the /lib, or classpath, is so old-school.&lt;br /&gt;&lt;br /&gt;2) see #1.  Dont be old school.&lt;br /&gt;&lt;br /&gt;3) I really do like seeing more&lt;span style="font-weight: bold;"&gt; advanced tools like Execution plans&lt;/span&gt;, but don't let that be your primary focus unless you are running out of bugs/features.  80% of developers working with databases need all this &lt;span style="font-weight: bold;"&gt;other 80% functionality first&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Data Modelling&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;-1)&lt;/span&gt;&lt;/span&gt; This is not my list above.&lt;br /&gt;-2) I actually enjoy Data Modelling, but unfortunately when it comes to hitting the ground running, sometimes it gets in the way and you need as direct access to the actual database you are working with (the specific MS SQL, specific Oracle, specific MySQL, etc...) to get work done.&lt;br /&gt;-3) Triggers/sprocs with modelling...yeah...&lt;br /&gt;-4) There are some pretty decent Data Modelling out there, so no need to solve a problem that already has several implementations -- but my above list really haven't found a solution yet!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Update:  I'm looking at liquibase.org for SCM support, but not sure if I can squeeze in enough time to give them a good test run.&lt;br /&gt;&lt;/db-specific-system-sproc-that-is-always-the-same-for-this-db-type&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-7035113902340693522?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/7035113902340693522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=7035113902340693522' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/7035113902340693522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/7035113902340693522'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2008/11/all-i-want-for-christmas-2008-full.html' title='All I want for Christmas 2008 - Full Featured Eclipse Database plugin'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-7012222778085552090</id><published>2008-11-03T13:55:00.000-08:00</published><updated>2008-11-03T14:08:26.744-08:00</updated><title type='text'>Eclipse on Fedora 9</title><content type='html'>If you are reading this post, more than likely you already know what I'm talking about.&lt;br /&gt;&lt;br /&gt;Fedora 9 comes with their GCJ compiled version of 'Fedora Eclipse'.  Nice idea, not well implemented.  Trying to use Eclipse update sites do not work correctly, and/or want to use different eclipse distributions.&lt;br /&gt;&lt;br /&gt;So, using the normal Eclipse.org distribution, or a custom distribution from various vendors, one would just download, untar/unzip, and run, right?&lt;br /&gt;&lt;br /&gt;Wrong...you get the splash screen, loading modules, then a small grey box.  Going to &lt;workspace&gt;/.metadata/.log shows errors like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;!ENTRY org.eclipse.ui.workbench 4 0 2008-10-14 15:35:07.364&lt;br /&gt;!MESSAGE Widget disposed too early!&lt;br /&gt;!STACK 0&lt;br /&gt;java.lang.RuntimeException: Widget disposed too early!&lt;br /&gt;        at org.eclipse.ui.internal.WorkbenchPartReference$1.widgetDisposed(WorkbenchPartReference.java:171)&lt;br /&gt;        at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:117)&lt;br /&gt;        at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)&lt;br /&gt;&lt;br /&gt;.....&lt;br /&gt;org.eclipse.swt.SWTError: XPCOM error -2147467262&lt;br /&gt;        at org.eclipse.swt.browser.Mozilla.error(Mozilla.java:1638)&lt;br /&gt;        at org.eclipse.swt.browser.Mozilla.setText(Mozilla.java:1861)&lt;br /&gt;        at org.eclipse.swt.browser.Browser.setText(Browser.java:737)&lt;br /&gt;        at org.eclipse.ui.internal.intro.impl.presentations.BrowserIntroPartImplementation.generateContentForPage(BrowserIntroPartImplementation.java:252)&lt;br /&gt;        at org.eclipse.ui.internal.intro.impl.presentations.BrowserIntroPartImplementation.dynamicStandbyStateChanged(BrowserIntroPartImplementation.java:451)&lt;br /&gt;        at org.eclipse.ui.internal.intro.impl.presentations.BrowserIntroPartImplementation.doStandbyStateChanged(BrowserIntroPartImplementation.java:658)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The fix is simple...once you know what to fix.  The last part, the Mozilla error, was the key.  Not intuitive, but this is what you do to get an external Eclipse distribution to work on Fedora 9 with Sun or OpenJDK (not GCJ):&lt;br /&gt;&lt;br /&gt;yum upgrade firefox&lt;br /&gt;&lt;br /&gt;Yup, that's it.  Just upgrade your Firefox install.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-7012222778085552090?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/7012222778085552090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=7012222778085552090' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/7012222778085552090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/7012222778085552090'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2008/11/eclipse-on-fedora-9.html' title='Eclipse on Fedora 9'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-363542715373843459</id><published>2008-07-07T14:13:00.000-07:00</published><updated>2008-07-07T14:24:56.031-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='freemarker hibernate camelcase underscore ftl'/><title type='text'>Freemarker CamelCase to underscore</title><content type='html'>Quick blog -- as always, the last 20% usually takes up 80% of the time.&lt;br /&gt;&lt;br /&gt;This time, it was trying to simply convert Camel Case into equivalent underscore Enum values.&lt;br /&gt;&lt;br /&gt;Ok, not that 'simply', but still -- I'm using Hibernate Tools to reverse engineer from JDBC some JPA entities, and that part is working fine.  Now, UI and some processes prefer to use a Model that is on top of the entity/dto.  So, I thought I would be nice and auto-generate the Model's that some other programmers swear by to make their job easier.&lt;br /&gt;&lt;br /&gt;Hibernate Tools just went to FreeMarker, which I was excited for, and I wrote most of the .ftl up for my Model.  Until I hit Camel Case.&lt;br /&gt;&lt;br /&gt;You see, what they are trying to do is create an ENUM version of each field; I'm not going into detail why, but simply that code-generation wise --&lt;br /&gt;&lt;br /&gt;fieldOne -&gt; FIELD_ONE&lt;br /&gt;myReallyLongComboField -&gt; MY_REALLY_LONG_COMBO_FIELD&lt;br /&gt;&lt;br /&gt;After a lot of messing around in Freemarker and regular expressions, finally got the solution in two lines in the .ftl file (very important the &lt; /#macro&gt;  &lt;!--#macro--&gt; is where it is now):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;#macro toUnderScore camelCase&gt;&lt;br /&gt;${camelCase?replace("[A-Z]", "_$0", 'r')?upper_case}&lt; /#macro&gt;  &lt;!--#macro--&gt;  &lt;!--#macro--&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then, make calls like:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;@toUnderScore camelCase=property.name/&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Perfect!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I've had quite a bit of experience in the past with Velocity, and put in some work in code-gen tools like Middlegen (now defunct).  Once you have a process/template for commonly used code pieces, code generation really helps enforce consistency and good practice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-363542715373843459?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/363542715373843459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=363542715373843459' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/363542715373843459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/363542715373843459'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2008/07/freemarker-camelcase-to-underscore.html' title='Freemarker CamelCase to underscore'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-908852480510182705</id><published>2008-05-01T11:33:00.000-07:00</published><updated>2008-05-01T11:47:02.195-07:00</updated><title type='text'>EJB3 Seam GWT - part II, GWT 1.5m2</title><content type='html'>Short blog --&lt;br /&gt;Working with Seam 2.1-SNAPSHOT and GWT 1.5M2 (with EJb3/jboss 4.2 backend).&lt;br /&gt;&lt;br /&gt;To start off with a bang - JPA (hibernate) annotated beans are working!!!  Yes, you can now use annotated entity beans as regular POJO's with Seam and GWT. &lt;br /&gt;&lt;br /&gt;p.s. I really do *not* like the annotation approach and preferred the orm.xml deployment descriptor approach to keep the POJO truly clean and free from decoration with annotation behaviours -- but there are some problems with the hibernate orm.xml implementation that they 'lack resources' to correct, so whatever; use the actually supported annotation approach.&lt;br /&gt;&lt;br /&gt;I unfortunately still not sure how to post code to blogger (need a full project, just sharing snippets is insufficient), but before you start jumping in too far here are the caveats:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  Long and Date fields &lt;span style="font-style: italic;"&gt;do not work&lt;/span&gt; as of 5/1/2008. GWT changed the behaviour of Longs in Milestone 2 of GWT 1.5, and the Seam guys haven't modified to support this yet -- it is, afterall, still a milestone release of GWT. &lt;a href="http://jira.jboss.org/jira/browse/JBSEAM-2933"&gt; http://jira.jboss.org/jira/browse/JBSEAM-2935&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Arrays &lt;span style="font-style: italic;"&gt;do not work&lt;/span&gt; as of 5/1/2008.  This confuses me - Seam 2.0.0.GA and GWT 1.4.60 arrays worked fine, not sure why this is now broken. &lt;a href="http://jira.jboss.org/jira/browse/JBSEAM-2933"&gt;http://jira.jboss.org/jira/browse/JBSEAM-2933&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Lists (genericized) now do work, and can be used as an alternative to the broken array implementation.&lt;/li&gt;&lt;li&gt;You can implement entitybean/pojo/DTO's that use the Long and Date fields, but when you RPC those fields you will get errors.  You can test with your DTO and List&lt;dto&gt; as long as you do not actually use Long and Date fields (leave them blank/null).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Someone reminded me about something I've taken for granted - no, I am not using JNDI lookups.  This is direct, session bean with Seam annotation exposed directly with the Seam-GWT remoting implementation to the GWT client.  No middle JSF layer or JNDI layer or tomcat/servlet layer -- GWT web talking to EJB3/Seam server.&lt;br /&gt;&lt;br /&gt;Still working on a more full example, have fun till then!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-908852480510182705?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/908852480510182705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=908852480510182705' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/908852480510182705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/908852480510182705'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2008/05/ejb3-seam-gwt-part-ii-gwt-15m2.html' title='EJB3 Seam GWT - part II, GWT 1.5m2'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-1632406712960895006</id><published>2007-11-28T07:50:00.001-08:00</published><updated>2007-11-28T08:22:36.857-08:00</updated><title type='text'>EJB3 Seam GWT</title><content type='html'>I just finished a prototype to test EJB3, Seam 2.0.0.GA with GWT-Remoting, and GWT 1.4.60.&lt;br /&gt;&lt;br /&gt;It was, for the most part, a success!&lt;br /&gt;&lt;br /&gt;First, before people get excited, what does NOT work:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;DTO's still can not be annotated, so no entity beans.&lt;/li&gt;&lt;li&gt;Seam/GWT remoting integration requires the DTO's to implement google's 'IsSerializable'.&lt;a href="http://jira.jboss.com/jira/browse/JBSEAM-2305"&gt; http://jira.jboss.com/jira/browse/JBSEAM-2305&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;What has been proven to work:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Stateless Session Bean simply exposed for GWT Web Application consumption for regular types (String, Integer, Long, Float) both as returns and parameters.&lt;/li&gt;&lt;li&gt;SLSB with DTO's exposed for GWT Web Application consumption.&lt;/li&gt;&lt;li&gt;GWT Sample Web Application successfully presenting the results of the Service calls to associated SLSB's exposed for Seam-GWT remoting.&lt;/li&gt;&lt;/ul&gt;Caveat - I am no GWT expert by any means.  This project is simply a prototype to proof the integration points between existing EJB3 applications and changing the UI presentation layer to GWT in the least-difficult manner.&lt;br /&gt;&lt;br /&gt;HELP:  How do I share my project through blogger.com? For now, you can click on the JIRA link and get the uploaded file there - read the readme.txt and modify the Model for IsSerializable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-1632406712960895006?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/1632406712960895006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=1632406712960895006' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/1632406712960895006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/1632406712960895006'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2007/11/ejb3-seam-gwt.html' title='EJB3 Seam GWT'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-1664122226736642799</id><published>2007-08-23T11:08:00.000-07:00</published><updated>2007-11-13T13:40:08.285-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outlook'/><category scheme='http://www.blogger.com/atom/ns#' term='pst'/><category scheme='http://www.blogger.com/atom/ns#' term='exchange'/><category scheme='http://www.blogger.com/atom/ns#' term='email'/><category scheme='http://www.blogger.com/atom/ns#' term='e-mail'/><title type='text'>Digital Preservation - PST outlook files</title><content type='html'>I will probably have a big rant about Digital Preservation some day, but today just about personal files - the Outlook PST files.&lt;br /&gt;&lt;br /&gt;First - why Outlook PST files, why not KMail/Thunderbird/Netscape/Sun/Whatever mail files? Well, quite frankly you will be hard pressed to find a business in the United States that does not use Outlook.  One of those necessary evils as there still is no good open source PIM (i.e. email, contact, AND calendar) desktop tools that are DEPLOYABLE in a corporate environment.&lt;br /&gt;&lt;br /&gt;Second - This is more a memo to myself when I have time, have not fully gone down this.&lt;br /&gt;&lt;br /&gt;The primary concern I had with PST files was, well, they are proprietary.  I want to fix that, and would prefer to be able to re-organize the many, many PST files and related e-mail entries I have (including, I'm sure, many duplicate email entries in different PST files).&lt;br /&gt;&lt;br /&gt;-- Change from PST to something not PST.&lt;br /&gt;* http://alioth.debian.org/projects/libpst/ - GPL, in C&lt;br /&gt;* http://xena.sourceforge.net/index.html - GPL, in Java (still active, ODF conversions)&lt;br /&gt;&lt;br /&gt;[XML output] As you can see by the sidenote, I'm leaning towards the ill-named Xena project as it is 1) still active, 2) in java, and 3) *may* be able to export in ODF.  I say may, because it doesn't say it specifically regarding e-mail.&lt;br /&gt;&lt;br /&gt;[mbox] The other, libpst, will convert the PST into a unix-style mbox format.&lt;br /&gt;&lt;br /&gt;[maildir]  Maildir would have been my preference, but with the ODF being a very close second. However, the only maildir open source export I could find was http://www.howtoforge.com/converting_outlook_pst_to_maildir,  and this required PUTTING THE MAIL BACK ON THE SERVER TO RE-READ IT BACK THROUGH IMAP.  Very cool for going-forward projects, not so much as a library to do a simple convert.  And, any sysAdmin would have a fit if I put 5gig of PST files back onto an Exchange server.&lt;br /&gt;&lt;br /&gt;Managing -&lt;br /&gt;Absolutely nothing yet.  Order, remove duplicates, partition to put into CD/DVD media, a simple stand-alone client that can be put on a CD/DVD to read the archived e-mails, etc.&lt;br /&gt;&lt;br /&gt;Please comment if you have found an open-source approach to solving PST archival and management.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-1664122226736642799?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/1664122226736642799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=1664122226736642799' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/1664122226736642799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/1664122226736642799'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2007/08/digital-preservation-pst-outlook-files.html' title='Digital Preservation - PST outlook files'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-8807390725580016169</id><published>2007-08-13T11:26:00.001-07:00</published><updated>2007-08-13T11:36:01.440-07:00</updated><title type='text'>Humans and Content - Information</title><content type='html'>This post is based on reading an article on the increase in time people spend reading content.  The article link is here: http://news.yahoo.com/s/nm/20070813/tc_nm/internet_study_dc_1&lt;br /&gt;&lt;br /&gt;Now, my own personal opinion is that video content is very time consuming.  Although it may be the easiest to digest, it is the most inefficient and getting information.  Most of this blog is about getting information, not about entertainment purposes.&lt;br /&gt;&lt;br /&gt;If you are reading this blog -- you probably speed-reading and just skipping most of the fluff to get some key pieces of information.  That is good -- that is how it is suppose to be.&lt;br /&gt;&lt;br /&gt;Video/audio content, however, you do not have that option.  Written works have no time component, only an 'order of content' component that you can filter through quickly.  However,&lt;br /&gt;Video/audio content DOES have a time component meaning you are limited in efficiently digesting/absorbing information based on the time component established by whoever created the  Video/audio.&lt;br /&gt;&lt;br /&gt;I personally think podcasts/webcasts are one of the worse ways to send out information (good for advertising/entertainment, but poor for sharing information).  I pretty much never watch a podcast/webcast for information -- instead I'll Google for a text version and read through that instead.&lt;br /&gt;&lt;br /&gt;Now, that is just me - there are people/audience that do prefer video/audio content for getting information.  And, I might be one of those people...if I didn't have to worry about time ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-8807390725580016169?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/8807390725580016169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=8807390725580016169' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/8807390725580016169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/8807390725580016169'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2007/08/humans-and-content-information.html' title='Humans and Content - Information'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-1381048605180526204</id><published>2007-06-20T06:33:00.000-07:00</published><updated>2009-09-15T11:32:47.612-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='api method maintain engineer'/><title type='text'>Carnal Knowledge API</title><content type='html'>Quite the title, eh?&lt;br /&gt;&lt;br /&gt;This post is about API, services, or interfaces that are obscure and require 'internal' knowledge to use successfully. What do I mean?&lt;br /&gt;&lt;br /&gt;Object result = doIt(object1);&lt;br /&gt;&lt;br /&gt;There are two specific scenarios that I think about for obscure AI/services:&lt;br /&gt;*Carnal Modification&lt;br /&gt;*Carnal Returns&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Carnal Modification&lt;/span&gt;&lt;br /&gt;This happens only in API's where the language allows passing of references and the objects passed are non-immutable.&lt;br /&gt;&lt;br /&gt;System.out.println(bean1.getValue()); //prints "default"&lt;br /&gt;void modifyJavabeanValue(bean1);&lt;br /&gt;System.out.println(bean1.getValue()); //prints "modified"&lt;br /&gt;&lt;br /&gt;By simply calling a method, the objects you passed to it have changed.  This may not be an expected result and you have to know that is the intent of the API...i.e., you have to have carnal knowledge about it.  And, do not be fooled if it has a return-type, it can still modify the reference!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Carnal Returns&lt;/span&gt;&lt;br /&gt;Carnal returns requires significant pre-knowledge on how to handle the return.&lt;br /&gt;&lt;br /&gt;Object o = getMyStuff();&lt;br /&gt;&lt;br /&gt;In the above example, you have no idea what is supposed to be returned, and even worse, it may return one of, say, five different types of objects that do not have common interfaces. Although you can check/reflect (pending language) what the actual object-type is supposed to be.  Horrible!!!&lt;br /&gt;&lt;br /&gt;String result = changeThis(String rawdata);&lt;br /&gt;&lt;br /&gt;This example is almost as bad - the returned String content may be something unexpected:  i.e., could be &lt;span style="font-weight: bold;"&gt;XML&lt;/span&gt;, could be &lt;span style="font-weight: bold;"&gt;comma-delimited&lt;/span&gt; string,  could be &lt;span style="font-weight: bold;"&gt;raw java/perl/php &lt;/span&gt;code that you are expected to run.   This can be allieviated easily with documentation AND specifying in the method signature the expected result:&lt;br /&gt;&lt;br /&gt;String result = changeThisToXML(String rawdata); //returns XML&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Awareness&lt;/span&gt;&lt;br /&gt;Just trying to share some awareness that just because you found a neat/cool way to pull something off, other people (or you using someone elses) may run into obscure or unexpected results related to Carnal Knowledge requirements.   There are indeed times when you can only do it a certain way, just rememer to document and modify your method signatures to make it as clear as possible -- you never know, 5 years later you might have to use your own API/Service!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;NEW:  I recently learned that, surprisingly, there is functionality when writing Stored Procedures to *change* the fields in the resultset based on parameters passed in...and that people do this!!  Exact same problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-1381048605180526204?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/1381048605180526204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=1381048605180526204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/1381048605180526204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/1381048605180526204'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2007/06/carnal-knowledge-api.html' title='Carnal Knowledge API'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-2840180692531604882</id><published>2007-06-18T07:20:00.000-07:00</published><updated>2007-11-13T13:39:28.210-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='usps'/><category scheme='http://www.blogger.com/atom/ns#' term='etl'/><category scheme='http://www.blogger.com/atom/ns#' term='address'/><category scheme='http://www.blogger.com/atom/ns#' term='data scrubbing'/><title type='text'>Data Improvement - Addresses</title><content type='html'>I titled this blog specifically as 'Data Improvement' instead of 'Data Assurance' or 'Data Quality'. The reason is quite simply because unless you have deterministic data coming in, you can not be assured what may be passed as data.  Deterministic = there is a fixed number of values that will be accepted.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Addresses data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;deterministic&lt;/span&gt;&lt;br /&gt;A deterministic field from an address is the US State 2-digit code field.  There are only 50 deterministic values acceptable, all others are rejected.  These values can be cross-checked with the 5-digit zipcode (do not need a full 9-digit for State crosschecks) to ensure both the zipcode and the State code are in-sync.  I like deterministic, easy to work with.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;non-deterministic&lt;/span&gt;&lt;br /&gt;A non-deterministic field is the actual address line.  Attempts to improve the data on the address line include seperating the STREET physical address line and the postal MAILING address line.  But, just because there are two seperate fields doesn't mean the data will be in the right place...usually when you are asking for address information, it is from a human being and human nature will kick in.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;improve non-deterministic data - standards/specifications&lt;/span&gt;&lt;br /&gt;So what can you do about these address lines?  For the most part, nothing - what you get passed as data is what you have to work with.  However, if you have a specific intent where you need address information to be relatively accurate, you can do something. First, determine your intent:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Accurate Mailing Address&lt;/li&gt;&lt;li&gt;Bulk Mailing discounts with POSTNET/barcode/zipcode sorts.&lt;/li&gt;&lt;li&gt;Seperation between Street address for carrier shipment vs passing a mailing address.&lt;/li&gt;&lt;li&gt;individual person identification from different data sources (i.e. john smith at 1 west rd vs 34 baltic ave).  &lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic;"&gt;USPS Publication 28/CASS software&lt;/span&gt;&lt;br /&gt;If you are 99% working with United States addresses and are concerned with address accuracy for actual mailings/shipments, look at some type of official CASS software.   http://www.usps.com/ncsc/addressservices/certprograms/cass.htm&lt;br /&gt;&lt;br /&gt;However, if you are trying to improve the data for the last option - individuality - and can not afford utilizing CASS software for this feature (which, btw, I highly recommend you do get CASS anyway because you can also enhance it with Address Change information), you can follow what is called 'USPS Publication 28' to standardize how the addresses look.  This will not make your data foolproof by any means, but should greatly assist.  Example is better:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;1 West Road vs 1 WEST RD; 1 West River Road vs 1 W RIVER RD&lt;/li&gt;&lt;li&gt;P.O. Box vs PO BOX vs POBOX vs P.O.BOX&lt;/li&gt;&lt;li&gt;APARTMENT # 4, APT #4, APT 4, APARTMENT 4&lt;/li&gt;&lt;/ul&gt;My first attempt at following USPS Publication 28 in java has met with some success.  I happen to code this originally as its own class, but adapted it to process the specificaiton rules through the Pentaho Data Integration (Kettle) product as a static method call in their javascript step; pushed over 3000 records/sec on my desktop which is sufficient for my intial needs.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;400k distinct raw address lines.&lt;/li&gt;&lt;li&gt;Java-based convertor for USPS Pub 28 specification.&lt;/li&gt;&lt;li&gt;345k processed distinct address lines.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-style: italic;"&gt;&gt; 13% data improvement&lt;/span&gt;&lt;br /&gt;By simply modifying the data to follow the specification, essentially 'corrected' more than 50k entries in the sample (13.75%).  Now that is savings!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-2840180692531604882?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/2840180692531604882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=2840180692531604882' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/2840180692531604882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/2840180692531604882'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2007/06/data-improvement-addresses.html' title='Data Improvement - Addresses'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-441010742246665248</id><published>2007-02-22T11:39:00.000-08:00</published><updated>2007-02-22T11:47:13.876-08:00</updated><title type='text'>Useless reports and GIGO</title><content type='html'>I got pulled into a couple of meetings today.  Both meetings involved doing some analysis of data submitted to me.  Both results/reports had problems, per the reason for the meetings.  I will talk about one of them as it is more specific to the point.&lt;br /&gt;&lt;br /&gt;GIGO&lt;br /&gt;&lt;br /&gt;A person (the manager) entered information through Excel.  I sorted and categorized the information based on unique identifiers in one of the columns.  The meeting started off with why does this report have 4 different numbers and identifiers for 'XYZ'?  I should have merged together the 'X YZ', the 'XZY' (typo), and the 'X Y Z' identifiers together to get one correct number, this report is of no use, and where did I get this information?&lt;br /&gt;&lt;br /&gt;GIGO&lt;br /&gt;&lt;br /&gt;I tried to explain that this was the information that person entered in Excel.  I then went forward to offer a couple of options on enumerated/listed identifiers so that they would be consistent.  "But I do it this way because I can [enter uber entry technique process] it very fast".  That is good...but why are we having this meeting?  "Because the report is useless".&lt;br /&gt;&lt;br /&gt;GIGO&lt;br /&gt;&lt;br /&gt;The sooner you can control the input process of data, the better for everyone.  I am looking for comments and suggestions to help control scenarios like this that do not involve nerf bats that have a big 'GIGO' label on it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-441010742246665248?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/441010742246665248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=441010742246665248' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/441010742246665248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/441010742246665248'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2007/02/useless-reports-and-gigo.html' title='Useless reports and GIGO'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-5434094368264369977</id><published>2007-02-12T10:47:00.000-08:00</published><updated>2007-11-13T13:38:58.401-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='etl'/><category scheme='http://www.blogger.com/atom/ns#' term='pentaho'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='business intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><title type='text'>Pentaho BI</title><content type='html'>It has been several months since my last blog, and I feel like I should be struck with rosemary beads and dunked in holy water for waiting so long.  But, without further ado -&lt;br /&gt;&lt;br /&gt;Pentaho - http://www.pentaho.org - is a 'conglomerate' open source project that has put together several related projects under one Umbrella.  BI, or Business Intelligence, is the entire process of obtaining, scrubbing, analyzing, reporting, and then re-analyzing/re-reporting on business data.&lt;br /&gt;&lt;br /&gt;Pentaho has combined many of the elements to handle most of the BI stack under a friendly LGPL/no-cost license allowing you start using Business Intelligence in even the smallest of projects.  That is huge...usually a project had to push over 1/4 of a million (pending your resources/randomly selected amount) before you really could engage Business Intelligence. Now, that is no longer the case. :-)&lt;br /&gt;&lt;br /&gt;I had the wonderful opportunity to go to the Advanced Implementation Workshop in Orlando, FL from Jan 29-Feb1, 2007.  Having previous projects using a portion of Pentaho, I had sufficient knowledge to get the most of the Workshop.&lt;br /&gt;&lt;br /&gt;In addition, was able to meet with Matt Casters of the Kettle (Pentaho Data Integration) project, Julian Hyde of the Mondrian (Pentaho Data Analysis Services) project, and Thomas Morgner of the JfreeReport (Pentaho Reporting) project.  This added confidence as talking with them I got a good impression they thoroughly understood their individual domains.&lt;br /&gt;&lt;br /&gt;Pentaho is still 'in the rough' as there are occasional user-facing design and presentation items to clear up, as well as enterprise-functionality from a developer standpoint that needs to be resolved or added.  Most of these are related to the full BI Suite and are usually minor (which itself is only a couple years old), while the individual projects have been around for quite some time.&lt;br /&gt;&lt;br /&gt;Overall, I am very impressed and will start working more heavily with Pentaho, regardless if it is (initially) just reporting or more full-fledged BI solution. Now, if only they could replace jpivot...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-5434094368264369977?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/5434094368264369977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=5434094368264369977' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/5434094368264369977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/5434094368264369977'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2007/02/pentaho-bi.html' title='Pentaho BI'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-116300590591312285</id><published>2006-11-08T08:58:00.000-08:00</published><updated>2006-11-08T09:11:45.926-08:00</updated><title type='text'>Solve Business Problems Now, Technical Later</title><content type='html'>In working with a combination of C-level management, open source projects and developers, commercial projects and their support staff, and my own team, came to a pretty good resolution that clearly defines where I stand on certain topics:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Solve the Business Problem now, if there are technical issues that will take a while to resolve, solve them later.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Obviously, there is certain conditions that should be met, such as solving the business problem with some architecture/engineering to help with maintaince issues, changes, etc - but the point is to not over-engineer, and not to wait for a technical 'fix' unless it is clearly within the timeframe to solve a business problem or would impact the quality of the business solution to solve said business problem.&lt;br /&gt;&lt;br /&gt;Cost: It *will cost more* to solve the business problem now and take care of technical issues later.  This is where most management and customers do not really want to hear and, frankly, usually do not care as long as the business problem gets solved. &lt;br /&gt;&lt;br /&gt;Revenue Stream: However, as a technical representative to an organization, and more importantly as an employee or consultant, the sooner you can bring in and/or maintain the revenue stream, the better overall for the organization. This may or may not cover the additional cost associated with the above statement, but quicker time-to-market is usually a good thing as long as the quality *of solving the business problem* is not compromised.&lt;br /&gt;&lt;br /&gt;Why this rant? It's not a rant, it's been a thorn for a lot of individuals and teams.  Some people are very good at the so-called 'quick and dirty' solutions that get something up and running, then spend *enourmous resources* maintaining that solution.  Other over-engineered solutions may miss deadlines/over-budget but once deployed *may* cost much less over time (TCO) compared to an equivalent quick-and-dirty solution. &lt;br /&gt;&lt;br /&gt;There is no perfect answer, other than no matter what a technical project will have costs during development and costs for maintanence -- but it has no value unless it solves a business problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-116300590591312285?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/116300590591312285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=116300590591312285' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/116300590591312285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/116300590591312285'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2006/11/solve-business-problems-now-technical.html' title='Solve Business Problems Now, Technical Later'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-116014846464049523</id><published>2006-10-06T07:55:00.000-07:00</published><updated>2011-06-10T06:26:24.339-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='ejb3'/><category scheme='http://www.blogger.com/atom/ns#' term='IEEE-754'/><title type='text'>Accounting with EJB3, JPA-QL, and Databases</title><content type='html'>Just an update post on what I have been working on.  I have been working on EJB3.&lt;br /&gt;&lt;br /&gt;I started learning/using EJB3 back in Oct '05 and deployed an application based on jboss EJB3-embedded (actually, it was just the hibernate/JPA persistence side of it).&lt;br /&gt;&lt;br /&gt;New project has allowed me to jump back into EJB3 and glad to see there is still some momentum.  The persistence side (JPA) is working very well for me.  The concept of using java objects through O/R mapping to deal with database structures is wonderful (and significantly improved since my days of working with EJB1.1).  The new JPA-QL query enchancements over the old EJB-QL are great.&lt;br /&gt;&lt;br /&gt;However, one problem still isn't solved completely - working with Monetary figures.  I'm working on an application that needs to do financial calculations.  Naturally, I'm trying to use java-side types of BigDecimal so I can set the precision/scale to only have two numbers after the decimal.  On the application side, this works great. Store the data as database fieldtypes of Decimal with the same precision/scale also works great.&lt;br /&gt;&lt;br /&gt;That's when I ran into big problems.  Doing calculations on those values through a query was not working correctly.  When asking the java object its value was returning values of not the correct scale.&lt;br /&gt;&lt;br /&gt;JPA-QL statement:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"select node from Balances node where (node.totalPaid - node.tax - node.price != 0)"  &lt;/li&gt;&lt;/ul&gt;would give incorrect results.  Why incorrect results? Floating point optimizations.&lt;br /&gt;&lt;br /&gt;Floating point optimizations - computer hardware and underlying operating systems will take shortcuts to improve the Floating Point calculation performance.  These are also called single-precision Floating Point calculations.  The results of using these kinds of calculations can turn something simple like '58.11' to actually be '58.10997856788934...'.  Big Problem.&lt;br /&gt;&lt;br /&gt;Solutions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=""&gt;Hardware/OS enable of double-precision floating point calculation (usually requiring Xeon-type processors). Specifically, on the database server that is running these queries (and on the application server would not hurt).&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=""&gt;Application-level IEEE-754 Floating Point calculations - i.e., get all the record results from the database and have the application itself do controlled calculations (in Java, strictfp keyword or use BigDecimal java.math functions).&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=""&gt;Carefully choose/configure your database server on how it handles Decimal-field calculations.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style=""&gt;&lt;br /&gt;I went with the 3rd option once I understood where my problem was coming from.  I was developing on Mysql 4.1 which, even though it is storing the Decimal field with the correct precision, running queries with those fields ran with the Floating Point problem.  Mysql &gt; 5.0.3 corrected this problem, as well as testing on Postgresql 8.1.1 also corrected this problem.&lt;br /&gt;&lt;br /&gt;As for asking for a specific field value, I was still having problems.  In EJB3, you can set a BigDecimal with this annoation for persistence:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt; @javax.persistence.Column(precision=8, scale=2)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;As of Jboss EJB3 RC9, this only helps when saving the data to the database (i.e. the value stored in the database is correct), but not when displaying a retrieved value.  This goes into how the underlying JDBC driver works with the persistence engine and how JDBC does things like 'getObject' that may return something different than expected.&lt;br /&gt;&lt;br /&gt;Solutions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Carefully choose JDBC driver/persistence engine for BigDecimal support (i.e. getObject returns double or BigDecimal, instead of float).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Handle the returned data on your getter (re-set the BigDecimal scale and have any UI display the BigDecimal as a formatted string).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;As you can see, financial applications you need to be very careful about the Floating  Point Optimization problem, and requires careful diligence across the entire stack - hardware, OS, database, and application.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6/20/2011 update: http://www.codeproject.com/Tips/50340/MSSQL-doesn-t-completely-support-IEEE754-floating-.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-116014846464049523?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/116014846464049523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=116014846464049523' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/116014846464049523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/116014846464049523'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2006/10/accounting-with-ejb3-jpa-ql-and.html' title='Accounting with EJB3, JPA-QL, and Databases'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-115712044269520046</id><published>2006-09-01T07:07:00.000-07:00</published><updated>2007-11-13T13:37:43.389-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hipaa'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='835'/><category scheme='http://www.blogger.com/atom/ns#' term='pharmacy'/><category scheme='http://www.blogger.com/atom/ns#' term='edi'/><title type='text'>Parsing X12 EDI HIPAA 835 files</title><content type='html'>At work, I have been tasked to work on parsing and creating 835 files.  I already have a previous system that parses 835 files for use in a sales/payment reconciliation program, but that uses an external commercial program to convert to XML and I process the XML results.&lt;br /&gt;&lt;br /&gt;First, there are a number of solutions already out there. As for open-source, python-based  pyx12 was one of the first I started playing with because there was a lack of non-GPL java based ones.  The java-based ones include EDIReader and OBOE.&lt;br /&gt;&lt;br /&gt;Now, one of the challenges I was running into was this whole conversion to XML.  I will need to store the 835 EDI files, and if you use a different tool later for XML conversion it may convert it differently, which may lead to different results on the same 835 EDI file (or using the same original datasources when creating an 835 file).&lt;br /&gt;&lt;br /&gt;So, I have written my own, specific parser/renderer based on a simplified, java-based domain model (domain objects that could be extended to be EJB3 Entities to be precise). No XML.  And, to be more specific, it only works with Pharmacy-based 835 making it smaller and more efficient for my particular purpose.  How efficient?  I can parse a 2000 transaction 835 EDI file from local disk into java classes in about 200ms -- and that is prototype,  non-optimized code with no external library dependencies ;-)&lt;br /&gt;&lt;br /&gt;What have we learned?  I left some out, but you have to already know and understand 835 EDI files to accomplish this.  If you do not have domain knowledge related to 835's, there are plenty of software packages to help you and then you will have to integrate it into your solution.  I took the latter approach first and it did work, but proved inefficient and dependent on a commercial solution. With more knowledge, you are able to take control of your destiny (with software at any rate)!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-115712044269520046?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/115712044269520046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=115712044269520046' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/115712044269520046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/115712044269520046'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2006/09/parsing-x12-edi-hipaa-835-files.html' title='Parsing X12 EDI HIPAA 835 files'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-115289179247554598</id><published>2006-07-14T08:25:00.000-07:00</published><updated>2007-11-13T13:38:21.491-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slide'/><category scheme='http://www.blogger.com/atom/ns#' term='jcr'/><category scheme='http://www.blogger.com/atom/ns#' term='jackrabbit'/><category scheme='http://www.blogger.com/atom/ns#' term='cdia'/><category scheme='http://www.blogger.com/atom/ns#' term='document management'/><category scheme='http://www.blogger.com/atom/ns#' term='webdav'/><title type='text'>File Cabinets and Solutions (JCR/WEBDAV)</title><content type='html'>I'm back with my first 'official' blog in the development realm.  I'm a java developer, an open-source follower, and am a big fan of consistency and standards.&lt;br /&gt;&lt;br /&gt;My off-coding time is actually spent as a CDIA+, certified document imaging architect.  One of the problems that usually fall under this role is in the arena of Document Management.&lt;br /&gt;&lt;br /&gt;Document Management: Very simply, look at file cabinets.  There are documents (a document is a collection of pages usually either single or collected together by a staple or a paper clip).  Documents are stored in Folders.  The folders usually have tabs that 'index' the type of documents it contains.  Drawers are labeled usually with a portion of the index (i.e. if by last name, maybe the first two letters) for faster manual lookup.  Everyone understands filing cabinets.&lt;br /&gt;&lt;br /&gt;So, how come transforming the manual filing cabinet is &lt;span style="font-style: italic;"&gt;so difficult&lt;/span&gt; electronically? The information and idealogy is right there in front of us!&lt;br /&gt;&lt;br /&gt;The answer, in my opinion, is that not one solution does it the same as another - they are all proprietary and, as such, &lt;span style="font-style: italic;"&gt;not &lt;/span&gt;everyone understands how to use between different proprietary document management solutions.&lt;br /&gt;&lt;br /&gt;Solution: I have been tracking a protocol that allows you to store documents, archive documents, index documents, and then search for those documents later in a consistent fashion.  This protocol is HTTP-based and is not tied to Java/.NET/Ruby/Perl, but can be used and understood by all of them.  It is documented and RFC'd a number of times.  What is this magical protocol?  An old one called WebDAV.&lt;br /&gt;&lt;br /&gt;I have been anxious for a solid, working solution of a java-based open-sourced WebDAV server from &lt;a href="http://jakarta.apache.org/slide/"&gt;http://jakarta.apache.org/slide/&lt;/a&gt;.  Don't hold your breath - after two years, I still haven't been impressed enough to actually deploy it, but am using it as a learning tool for WebDAV. Last binary was from 2004, and I have had sporadic success with building from CVS (i.e. something that used to work would break - not fun).&lt;br /&gt;&lt;br /&gt;There is a newly active content repository from &lt;a href="http://jackrabbit.apache.org/"&gt;http://jackrabbit.apache.org/&lt;/a&gt; is in development based on the Java Content Repository API (JCR), also known as JSR-170.  I'm not overly excited about JCR/JSR-170 as it is language specific, but they are working on a WebDAV interface which I am very excited for.  Come on apache, don't let me down a second time!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-115289179247554598?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/115289179247554598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=115289179247554598' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/115289179247554598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/115289179247554598'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2006/07/file-cabinets-and-solutions-jcrwebdav.html' title='File Cabinets and Solutions (JCR/WEBDAV)'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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-31129136.post-115289045054774287</id><published>2006-07-14T08:17:00.000-07:00</published><updated>2006-07-14T08:20:50.556-07:00</updated><title type='text'>First blog post</title><content type='html'>Welcome everyone!&lt;br /&gt;&lt;br /&gt;I already had my first blog planned out.  Unfortunately, I will be posting that blog second.&lt;br /&gt;&lt;br /&gt;Two influential developers that I follow are Matt Raible and Rick Hightower.  They use jroller.com for their blogs.  I waited two months and jroller &lt;span style="font-style: italic;"&gt;still &lt;/span&gt;hasn't fixed their new user registration. &lt;br /&gt;&lt;br /&gt;Blogger.com/blogspot.com was my second choice and everytime I've come here they have been reliable and always up. Guess what, blogger.com/blogspot.com got my business :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31129136-115289045054774287?l=dhartford.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dhartford.blogspot.com/feeds/115289045054774287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31129136&amp;postID=115289045054774287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/115289045054774287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31129136/posts/default/115289045054774287'/><link rel='alternate' type='text/html' href='http://dhartford.blogspot.com/2006/07/first-blog-post.html' title='First blog post'/><author><name>dhartford</name><uri>http://www.blogger.com/profile/17083942553852687561</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></feed>
