\n Last week a product manager asked me a simple question at 6 pm. Which product page sends the most people to checkout when they arrive from our own site search. I opened Google Analytics, clicked through three reports, and still had that look that says I am guessing. We…
JasperReports for Operations Dashboards
Creation date: 2011 01 11T01:53:25 Late last night the pager did its song and dance while Twitterrific kept buzzing about Verizon and the iPhone. Our ops channel was trying to calm a spike on a checkout flow and I was staring at a wallboard that looked like a Christmas tree….
Graceful Degradation for Legacy Browsers
Graceful degradation is back on my mind tonight. Everyone is shipping shiny AJAX features, yet support tickets still come from people stuck on legacy browsers. If you build for the top of the market only, you will pay for it with every deploy. So let us talk about building cool…
Versioning and Dependencies in OSGi
New year. Quiet office. The build light was green for days and I thought we were ready to ship our OSGi based app on Monday. I pulled a last minute update for a library that fixed one tiny bug in our billing module. Dropped the new bundle in the Equinox…
Switching Between Embedded and External Databases Seamlessly
Switching between embedded and external databases without drama sounds like a wish. Tonight it was a need. I was helping a team push a small Java app to a staging box while we still had late night coffee and a buzz from new toys like Tomcat 7 and Maven 3….
What to Do When Coverage Drops
The build light turned red at 1 in the morning. Hudson blinked like a small lighthouse in a foggy kitchen while I reheated pizza and hit refresh. Our latest merge went in clean, tests passed on my machine, life was fine. Then the email landed. Code coverage dropped by four…
Scaling Search with Sharding and Caching
Search is eating more of our apps every week. Index sizes grow, queries pile up, and the moment you add faceting, snippets, and sorting by freshness, your single Lucene box starts to sweat. Solr makes a lot of this smoother, and Lucene 3 is a beast in the best sense,…
Filters and Listeners: Cross-Cutting the Right Way
Filters and Listeners: Cross Cutting the Right Way. Servlets from a practitioner view with lessons you can reuse. The Problem We Keep Repeating Every Java web app I see starts clean and ends with controllers doing everything. Authentication checks. Log noise. Timing. A bit of compression. Some cookie dance. It…
Exporting to PDF and XLS: Tuning for Speed
\n \n\n\n\nI was on pager duty and a user hit Export to Excel right before a big meeting. The spinner felt like a staring contest. Tomcat was fine, CPU was bored, yet the report took ages. I cracked open the logs, watched JasperReports fill pages like a careful scribe, and…
JSP in Moderation: Keeping Views Thin
Are your JSPs carrying more weight than they should? Do you feel that every small tweak needs a hunt across five files and a guess about what the controller is secretly doing? Are you copy pasting error handling and formatting logic in every view, hoping it will not bite you…