Posts

Showing posts from 2007

2008 Resolutions

Making resolutions is tradition on New Year's Eve.... evaluate areas you'd like to improve (or new skills you'd like to acquire), and set goals to improve in those areas. Here are two work-related resolutions I'm going to focus on entering 2008. Make JCAPS Usable If you've been following my posts, you're aware that I've been frustrated with Sun's JCAPS product. The tool is simply not ready for prime time and it's hurting my productivity. In addition to the problems I've already outlined , developing in JCAPS' eDesigner makes me "feel dirty". You need to go outside to tool to create modules of shared code (jars). This limitation makes it hard to implement classes that follow even the simplest design patterns or integrate with third party frameworks, like Spring . I feel myself falling into bad coding habits. I'd like to find a compromise. What I'd like to do, is move my code out of the JCAPS JCD and into a sep...

Vista Woes

I recently purchased a new laptop preloaded with Vista (Home Premium). Given the choice I'd have preferred to stay with XP, but I had more than enough hardware to support it, so I thought "what the heck". Now I feel like I'm in one of those Mac commercials . Here are some of the issues I'm facing. When I first booted up Vista, I made the mistake of setting what I intended to be my personal user ("Vinnie") as the Administrator. I was told this is not a good idea for security reasons so I renamed the Administrator account to "Admin" and created a new "regular" user reusing the "Vinnie" account name. On the surface everything appeared OK until I wanted to find the files associated with my account. There are user folders for "Vinnie" and "Vinnie2". The "Vinnie" folder corresponds to my Administrator account. The "Vinnie2" folder corresponds to my "regular" account. When ...

More JCAPS Impressions

I haven't had much chance to post since starting my new position. Getting up to speed in my new role has kept me busy. I have been using JCAPS though and thought I'd post a quick update on my impressions. Basically the good is still the good, but my team and I are experiencing more pain points, mostly due to the poor repository integrated into the tool. Here's a quick list of things I'd like to see improved. I've gotten in the habit of diff'ing my changes against the repository version to ensure I'm only checking in changes I've intended. JCAPS does not allow you to do this. There's also no easy way to diff changes between different repository versions. You need to be creative, and go outside to tool for this functionality. There's no easy way to find all the files you have checked out of the repository. You need to manually keep track of the files you've touched. I've become accustomed to relying on my development tools to ke...

JCAPS Training

I've been in JCAPS training all week, and so far my exposure to the product has produced mixed feelings .... the good.... JCAPS is definitely meant for enterprise-class application development. The architecture makes connecting to files, messaging queues, and databases trivial. It's scary easy. Things like monitoring and deploying to multiple environments are baked in. Again, it's nice to not have to worry about developing or searching for tools to manage these tasks. The JCAPS tools also produce some nice pseudo-documentation (diagrams and high level descriptions depicting what the application is doing and how things are connected). Some may think this is a little cheesy, but I like the idea of getting a high level picture of what is going on without having to surf through multiple source and configuration files. Having some built in transparency is nice (especially in large systems). the bad.... Is also the UGLY ... The JCAPS is built on NetBeans 3, whic...

JCAPS

In the midst of a job change, I've been spending most of the last few weeks handing my work off to others and writing some final documentation. With that almost complete, I'm turning my attention to my new position where I'll be working to integrate systems together in a Service Oriented Architecture (SOA). While I have SOA experience (creating & integrating web services as well as CORBA modules) my new company has chosen the Java Composite Application Suite (JCAPS) as it's SOA platform. It's (by far) the most comprehensive SOA solution I've had opportunity to work with. I'm really excited to get started. Here are some things I really like about the architecture and questions I have. The system is built on an application server and includes things like messaging, as well as consolidated user management and role based access built in. This is a big change from my current situation where I've needed to integrate (and implement) a lot of this f...

Epcot

NOTE: I realize this post might be a little "out there" for a Tech Blog, but I've been fascinated with Disney since visiting there last Spring. How they provide such a quality experience to so many people is an inspiration. Please indulge me... On October 1st, Disney's Epcot celebrated it's 25th anniversary. From the beginning, Epcot's goal was to provide people a place to explore the future and the world around them. While learning a little history about Epcot and the various pavilions, I've noticed a few themes common with those I've been exploring. Mickey Mashup?? In it's original form, the Journey Into Imagination featured Dreamfinder, an interesting character whose goal is collecting the stuff dreams are made of.... sounds, colors, ideas... anything that sparks the imagination. And I store these sparks... and recombine them into new ideas and inspirations. 1 When I heard Dreamfinder describe his ambition, I immediately thought of...

Behavior Driven Development

If you haven't seen some of the Rails vs. _____ (Java, ColdFusion, .Net) links, I made available in the " Related Articles " section, you should check them out. They're really clever. The guys over at RailsEnvy do a great job with these. They've also released a presentation about testing , introducing me to Behavior Driven Development which is like Test Driven Development , but with purpose. Instead of testing individual functions, Behavior Driven Development tests specific user actions and the result of these actions. The result of creating these behavior driven tests is a specification for how your application will perform... with a final application behaving in this manner after all tests pass. For Ruby, there is a framework called RSpec which can help facilitate this process. For a while I've wanted to adopt a more test driven approach to my development. There are a lot of benefits: you only build what you need (don't overbuild), you know ...

Grails, Groovy, & some other stuff

As the name suggests WebDevRadio is a web development podcast. I'm a big fan of this show. It always delivers an interesting perspective, and the discussions often relate to a technology I'm also exploring. In a recent episode, the host Michael Kimsal interviewed Jason Rudolph about Jason's new book Getting Started with Grails . I've written before about Ruby and Rails and using something like JRuby to leverage Java's stability and scalability in a production environment. Grails (and Groovy ) is an interesting alternative to the Rails/Ruby/JRuby I'd been thinking about. Like Ruby, Groovy is an interpreted language but with some constructs that make it easier for Java developers to transition over. Also, since it's written for the JVM, it gets all the Java maturity "for free" and naturally integrates with existing Java modules (No need for something like JRuby). Grails brings the Rails goodness to the Groovy platform... including a lot of ...

Restlet

In my last post, I described I was implementing a SOAP web service controller between my Ruby chat bot and a CORBA component my company is developing. The WDSL for this service was straightforward, and with help from the Eclipse Web Service wizard, it was complete in no time. I had some downtime before the CORBA module I needed to connect with was complete, so I began to look into re-implementing my controller as a REST web service. A little digging led me to Restlet . Restlet is a lightweight framework for developing REST web services in Java. I've seldom had an easier time integrating a new Java package and getting something up and running. Restlet comes bundled with it's own HTTP server, but I opted to deploy a WAR file to our existing Tomcat installation. There are three basic steps needed to get this to work. Creating a Resource is the first step. The Resource is the brains of your service. It captures request parameters (from the URL or encoded in the body), the...

Ruby, XMPP, and Soap Web Services

I've spent a lot of time away from the office lately and haven't had much of a chance to post. Here's a quick update on what I've been thinking about. First off, the Ruby XMPP-bot I had started is complete. This was insanely easy to implement in Ruby. The only snag I ran into was in creating a new chat room with the bot. The 0.3.1 release of XMPP4R seems to hang when creating a new room. After some research , it was apparent that others experienced this problem and had already submitted a patch. Cool. My next job is to connect the bot to an application my company developed. Communication to this module has been done previously using CORBA. Unfortunately (or not), I have not been able to find an acceptable Ruby CORBA module ( Rinn looks like it's dead and R2CORBA does not appear mature enough). Recently many of our legacy CORBA API's have been replaced with Web Service API's and I'm going to take this approach with this module. While researchi...

QEDWiki

I've been hearing a lot of buzz about QEDWiki, which is being developed at IBM. QEDWiki is a basically a wiki that can host simple web components. At first glance, QEDWiki looks like a typical portal, displaying aggregated information from around the web in widgets. Think dashboards like PageFlakes or My Yahoo . I soon learned that QEDWiki is something completely different. My perception changed when I saw these widgets linked together, creating what IBM calls "situational applications". A "situational application" is a simple applications created on the fly using information provided through a web service. These applications can be created by business users, for business users - without the support of a development team - very much like the advanced Excel applications created and shared today by business teams. I see something like QEDWiki taking the place of these apps with Service Oriented Architectures (SOA) playing the role of the Excel "s...

Ruby Jabber

The Hibernate tweaks I made a few weeks ago made our application "fast enough" for now. So I'm back off of Rails and I've started work on a XMPP (Jabber) bot to monitor chat channels. For those unfamiliar, XMPP is an open protocol for instant messaging. I've just gotten started and, again with Ruby, my progress has been quick and easy. After installing the Openfire XMPP server and XMPP4R Ruby Gem, I was off and running. With help from someone who's done this before, I was able to communicate with the server very easily. I'll be sure to post progress and I get deeper into this. By the way, if anyone's been following my Rails progress, I'm sure I'll be back to finish this at some point. As I've written before , the database design is flawed and will not scale well. We've just bought a little more time before these issues bubble up again.

OLPC and Free Wireless

I was glad to hear mention of OLPC (One Laptop Per Child) in a podcast I listened to early this week. OLPC (a.k.a. the $100 laptop) is an organization whose goal is to provide inexpensive laptops to children for education. Integrated collaboration is one of the key features offered in these laptops. The belief that information and ideas are meant to be freely and openly shared is a core principal of open source software... and it's revolutionized the software industry. Allowing children to learn the value of this openness firsthand, will hopefully lead to a more open and collaborative environment in other fields (government for one) when these children enter the workforce as adults. To help foster these ideals away from school, children will need access to the Internet at home. Fast and cheap, widespread Internet penetration needs to improve. In the neighborhood I live there is one broadband provider and it's rather expensive - making it out of reach for many lower inco...

Back Riding Rails

Thankfully, I'm done working with Hibernate for a while and I'm back on Rails. Since I posted on FRail :include , it seems there has been a lot of plugin development to add this functionality. While all of these plugins help to address the problem, I'm having a hard time finding one to address my specific scenario. I think I've explained my situation before, but here it is again in a nutshell. The company I work for aggregates a lot of data. The goal of my application is to allow users to sift out the information they don't need, discovering nuggets of truly useful knowledge. The approach we're taking is to have users to start from something they're interested in, and use that object to find other objects with similar attributes and characteristics. What I really need from Rails is a robust way to join a lot of tables together and specify search criteria. I've decided to roll my own solution for now. What I'm developing in Rails will take in o...

TV Innovations

I love TV. Granted there's a lot of garbage content, but there's also a lot of great content. Since the VCR, it's been possible (although clumsy) to time-shift your TV programs - watching the programs you want, when you want. Things like TiVo and DVR provide a cleaner interface to this functionality while adding useful new features like "pause live TV". The problem with these technologies is that you need to know the programs you want to watch in advance . If you've just discovered a new series and want to watch previously aired shows, you''ll need to wait for the TV network to rebroadcast (or for the episode to be released on DVD or iTunes). Enter Move and Joost . These new products offer the promise of time-shifted, on-demand TV, offered over the Internet. Both these products allow the owners of the content (networks) to control distribution, so there's no YouTube-like copyright worries. Joost works more like a file sharing system (think...

Hibernating

Migrating my application from Hibernate to Rails has taken longer than I expected. An important client has expressed performance concerns with their release, so I spent the last week looking for ways to tweak the current Hibernate implementation. It has been very frustrating. I don't like to cast blame or plead ignorance, but prior to this exercise, my experience with Hibernate has been limited. The module containing our Hibernate calls was authored by someone else and I've been mostly a client of this module. It wasn't until I looked at our query log in detail did I notice how poorly this module was written and how confusing Hibernate is. When seeing the large amount of queries in the log (often for data not needed in the current view), my first thought was, "we must have a problem in our models... something is causing Hibernate to eagerly fetch related data we have no immediate need for." I went through our models and, indeed, I did find some simple changes ...

Times of Change

Last night, Nova featured the life and contributions of Alberto Santos-Dumont , an early inventor of airplanes and dirigibles. In addition to Santos and the Wrights, the early 1900s brought forth other great inventions from Edison and Tesla, and marked the rise of the automobile... things that are cornerstones of our lives today. I've always looked back at this time period in wonder and amazement. In a short period of time, the world was turned upside down. The way people travel, communicate, and got their news was forever changed. I'm happy to be, 100 years later, living in a period similar of similar innovation. The proliferation of Internet has revolutionized the way people meet, shop, and communicate. Innovations like social media and RSS allow individuals to take a more active role in media they consume (not only what, but when). And it seems we're finally making strides identifying clean, renewable energy sources. It's my hope that the contributions we'...

Technology Shakedown

David Berlind recently started a new podcast series entitled " Technology Shakedown ". In it, he exposes technology that isn't as good as it could be. He talks about products that work great 80% of the time, but provides major headaches the other 20% - when the average user can't figure out why the product is misbehaving and must spend time concocting convoluted workarounds. A much better description can be found here . Apple has rebuilt it's business capitalizing on the shortfalls of mediocre technology products. A superior experience is the reason people will shell out $150 for an iPod compared to $30 for a generic MP3 player. And it's the same reason Apple can charge a premium for a Mac compared to the average Windows computer. People love Apple because their products simply work the way they're supposed to - making their users lives more productive and enjoyable. Why more product managers don't comprehend this is beyond me. ***** The discove...

FRail :include

I really like developing with Rails, but I've been frustrated the last few days by some things Rails should do quite easily, yet doesn't. I've already written here and here about some of my struggles with Rails :include clause. Here's one more... Let's say you have a has-and-belongs-to-many relationship. If you :include this relationship in a find query, Rails will automatically create the join clause including the lookup table! That's cool. Unfortunately, it looks as if only the :include clause provides this piece of functionality. Why isn't the same functionality provided via the :join clause or through a general purpose module? This doesn't make any sense to me! I'm working on a database application where I don't need to display a lot of data, but the data displayed is heavily filtered by it's connections to other information in the database. I need to join a lot of tables to perform the filtering operation and using :include ...

Freebase

I wanted post a quick note about new technology I heard about today via podcast . The technology is freebase created by Metaweb . As you might guess from the name, freebase is a free database for the web containing all sorts of information contributed by users. In other words, it's a huge Wikipedia-style database that anyone can contribute or query to find interesting (and possibly little known) information and relationships between seemingly unrelated objects. For instance, assuming the information is in the database, I could query to find "all wooden roller coasters in the northeast longer than 5200 feet." That's pretty cool. Assuming I found some results, I could whittle down the set further, looking for which roller coasters have been ridden by Rock Stars or with lower height restrictions (so I could ride with my daughter). Because the data can be contributed by the average person, the breadth and depth of the information to search for will grow quickly (an...

wRESTling with REST

I'm still struggling with the decision to create a REST or traditional web service. Over the weekend I started reading RESTful Web Services and I'm now thinking that a RESTful approach is very doable. Here are my thoughts: REST resources are inherently stateless and shareable. All the information needed to reconstruct the view of a resource exists in the URI. Although I listed this a a "pro" before reading the book, I'm more convinced of the benefits now. I had a concern about long query criteria in the URI, but I'm thinking of adopting the Ruby-like approach of referring to ids. The RESTful authors prefer a more human readable URI (as it is self documenting), but many of my filter criteria cannot be accessed through unique strings. I believe I was trying to do too much at the beginning (not keeping it simple). My object relationships are complex, with most objects linked to several related (non-subordinate) lists of objects. I wanted to have a sin...

Should I REST?

Now that the models are complete, I want to expose access to them as a web service. I'm thinking REST is the way to go. A RESTful approach seems simple. It appears to solve pesky "back button" problems and session timeout issues, but I have one big question: How to fit all the information I need into the URL? The application I'm working on has A LOT of data. The main objective of the application is to allow filtering of this data down to a useful, manageable set. It wouldn't be uncommon for a user to ask for something like: Give me everything connected to Item1, Item2 and Item3, Hide anything that has to do with Item4 or Item5 In addition, give me anything that mentions Items 6, 7, or 8 and is new to the system in the past month. To put all this information in the URL is a scary proposition. In it's previous life as a Java web application, all this search criteria was built incrementally and stored in a user's session. Since the client ...

Rails Progress

All my models are implemented in Rails and I wanted to give a quick update on how things are going. For now, I'm been using the rails views and controllers to test my code (automated tests coming soon). This has worked out great for me. Since my application only allows users to view and filter database records, I don't have a lot of validation checks, but I wanted to get a feel for the performance of pages need to display a lot of data from various tables. One page I tested performs 35 queries (including all the counts and show field commands) and takes about 5 seconds using the Webrick server (from NetBeans so I believe JRuby is being used). The development log lists the time spent in the database as less than 1 second. I'm sure performance could be better, but this is a big improvement over what we had before and the database I'm using contains more records. I'm still noticing that when you ":include" more than one model in a "find" comman...

Good Migrations

I was out last week, but finally got my schema in a Rails friendly format and the scaffolding utility is working great! I thought I'd hit on some of the pain points I experienced during this process and how I worked through them. MySql stinks when you need to change the schema of a database containing data. To make things easy, I've been working with an empty database and using the MySQL administrator to capture the SQL. The plan was to run this SQL against existing databases to upgrade them. This process doesn't work like I'd hoped. For some columns, the SQL query fails when I try to change a column name (like changing the primary key name to the Rails default 'id'). There are no foreign key constraints on this field and it does not fail on every table where the column name must change. I can't figure out why MySQL bombs on these specific statements. Maybe it's because these table have large row counts (~1M rows)??? Luckily, I won't be creat...

More Rails Progress

I've been playing with Rails over the past few days and want to quickly express my experience so far. Creating joins, lookup tables, tuning, grouping, sorting, and setting limits are all easy. You can do something like: Actor.sum(:appearances, :joins => "INNER JOIN appearances_show_lookup asl ON asl.appearances_id = appearances.appearances_id", :group=>'asl.appearances_id', :order=>'sum(appearances) DESC', :limit=>10) which translates into SELECT m.appearances_id, sum(appearances) FROM appearances m INNER JOIN appearances_show_lookup md ON md.appearances_id=m.appearances_id GROUP BY m.appearances_id ORDER BY sum(appearances) DESC LIMIT 10; or... Actor.find(:all,include=>:appearances_type, :conditions=>"appearances_type.name='guest'", :limit=>10) to SELECT * FROM appearances LEFT OUTER JOIN appearances_type ON appearances_type.appearances_type_id = appearances.appearances_type_id WHERE...

Rails Progress

I picked up a copy of Rails for Java Developers by Stuart Halloway and Justin Gehtland and am playing around more with Rails. The book is really good, but I really need a migration guide from Hibernate to Rails (or an existing web application to Rails). I'm looking for more information on creating Rails models that can be accessed through a complex set of filters and associations. The things I need to know are: How to create something like a 8 table Rails join? How best to represent lookup tables? What options are available to tune the queries? Can I capture the Rails query before it's sent to the DB for debugging (outside the MySQL log)? How do I specify things like limit, paging, group by, sum, distinct, etc? I'm going to reread the ActiveRecord chapter of this book again. I also have a copy of Agile Web Development with Rails on the way. Many articles I'm finding on the Internet draw the same conclusions - if your schema and object dependencies ar...

JRuby

The database cleanup is finally complete! Now I need to rewrite our web app's data access code. When we first created the database layer, we used the Hibernate framework. Since then Hibernate3 has been released and an upgrade is scheduled as part of this work. We did have some pain points with Hibernate, however. For instance, when I started evaluating our DB code, I noticed some DB queries that we don't explicitly create. Whether these were the result of a poor object-relational model, lazy instantiation, or some other Hibernate functionality is unknown at this time. I've found Hibernate (or at least how we're using Hibernate) complicated to debug. I'm going to take some time and look at Ruby and Rails as an alternative. I've mentioned before that I've wanted to learn Ruby for a while and this seems like a good excuse. There is a Ruby library for Java called JRuby . The plan is to learn the JRuby Rails extensions and find out the effort to incor...

Standards

I just listened to an interview with Tim Berners-Lee , inventor of the World Wide Web. While most of the interview focused the Semantec Web , what I found most interesting, were his thoughts on Rich Internet Applications. Of course he thinks this is an exciting development, but with various technologies (Flash, JavaFX, Silverlight) competing in this space, he feels that standardization would help speed its adoption. He points to how standardizing HTML in an open and royalty-free way helped to speed the adoption of the Web. Standardizing this technology would be a great step. Right now, these technologies run as a plugin on the browser. Once standardized, browsers could build this functionality right in, making adoption seamless. Open-sourcing the technology is not enough. The biggest problem with standardization is that it takes so long. It's a good thought, hopefully it will gain some traction. ****** More news on the DB front. The more I delve into the database schema and...

It's All About Software (and Passion)

Just to touch on Apple and Microsoft again... I've watched the conversation between Steve Jobs and Bill Gates from this year's D5 conference a number of times. The thing that keeps amazing me is that these guys, earlier than almost anyone else, got that it's all about the software. They realized that we had this great, new technology... but it was way too hard for the average person to use. Gates referred to a speech that Jobs gave years ago where he said, "We build the products that we want to use ourselves." I always hear successful people say that the key to success is being passionate about what you're doing and what you're producing. Microsoft and Apple are two examples where this approach has obviously worked. I'm convinced these giants are more similar than different. It would be foolish not to apply these ideals into our own software projects. To have a successful project we need to become our target users. Think like they think. Le...

Masking the Problem

From my past posts, you may have guessed that I'm in the middle of optimizing a web application that accesses a database. Our studies have shown that a combination of missing indexes, unnormalized data, and inefficient queries are the root cause for this application's poor performance. The optimal solution involves reorganizing the database schema and rewriting our database access layer. Side Note: The books SQL Tuning by Dan Tow , Pro MySQL by Michael Kruckenberg and Jay Pipes , and Hibernate in Action by Christian Bauer and Gavin King have been instrumental in helping to identify solutions to these problems. During a meeting to discuss these changes, another suggestion was made to help performance. There are certain instances where we could save few trips to the database (per request) by reusing session information that is unlikely to change (whether this data should actually be in the session or not is a subject for another post). This enhancement requires ...

OLPC

One Laptop Per Child ( OLPC ) is a movement to create inexpensive, full featured laptops to be used by children for education. The design of this machine is geared at promoting creativity and collaboration. Each system features wireless capabilities for students to connect and communicate with teachers and other students. The user interface centers on activities that children participate in to learn. This differs from a traditional UI which focuses on tasks and applications. The laptop is enclosed in a durable case with a kid friendly handle. It also includes many power saving features, including the ability to charge the battery using human power (like turning a crank or pulling a string). This is an important consideration for areas with little or no access to power. The price of the hardware is very low (around $100). In addition, much of the software for this system is being developed in an cost friendly, open source model. I'm excited about the possibilities this ...

Gearing Up

I've previously written about Rich Internet Applications and how they bring desktop-like functionality to web applications. The knock on this technology has always been "how do I work if I don't have an Internet connection?" Last week, Google announced Google Gears , a framework designed to address this problem. Google Gears provides 3 modules developers can used to make their web applications available offline. LocalServer allows web applications the ability to store, then serve, web content locally when a user does not have an Internet connection. These resources can be updated when the user is reconnected to the Net. Database provides persistent storage to the application when working offline. WorkerPool allows long running operations to be "chunked", and run in the background without blocking the browser. It's likely Google developed this technology to widen the appeal and availability of it's Google Docs & Spreadsheats offeri...

Performance Testing

I just upgraded my Eclipse IDE and installed the latest Test and Performance Tools Platform (TPTP) release. The only tricky part of the installation was installing the Agent Controller (available from from the TPTP download site ). This is a separate install from the TPTP plugin and must be placed on your PATH. TPTP application profiling is easy. Simply start your application in profiling mode, then start the profiler before you access application functionality you want to benchmark. I'm currently using the tool to identify memory and execution time bottlenecks. The TPTP utility makes it easy to sort on key statistics (like the memory footprint for an object class, or the total time spent executing various methods). I find the method invocation information especially useful. Not only does the tool provide information on which calls are taking the longest, but it also provides details for who called the method and what supporting methods are called (along with the time sp...

New Age Appliances

I'm pretty excited about the latest consumer tech products I've seen from Apple and Microsoft. Although they seem to target slightly different segments, both have new offerings which push user interface and interaction to a new level. iPhone Early this year, I watched the Macworld video where Steve Jobs introduced the iPhone. I was blown away. It was easy to see the new possibilities offered by this device. I mean, the phone I have now offers many advanced features that are clumsy and frustrating to use (web access, email, text messaging, etc) . The iPhone makes these tasks intuitive (and it looks fun). As the average user gets a hold of this, I'm guessing we'll see a spike in web traffic as mobile computing goes mainstream (sort of like what the iPod did for digital music). It will forever change the way people interact with the Internet and our products. Microsoft Surface Computing Yesterday I watched a video demoing Microsoft Surface Computing. I don...

Not a DBA (Part 2) and Some Quick Hits

Since my last post, I picked up a copy of SQL Tuning by Dan Tow . This is exactly the resource I've been looking for. Dan Tow has developed a process of diagramming queries, and then using these diagrams to determine an optimized query plan. I'm only half finished with the book, and I'm amazed by the results I'm already seeing. This book has given me a new perspective (and confidence) to solve the problems I described. I'll post more on my progress in a future post. Ruby For a while now, I've wanted to learn Ruby (and Rails ). I'm impressed with how much you can do with this language in a few lines of code . If nothing else, it will provide a quick and easy way to mock up prototypes. Last week, I downloaded Hackety Hack , which is a lightweight Ruby IDE. I've completed the Hackety Hack tutorial and can't wait to create more complex examples. del.icio.us I've started to (finally) place my bookmarks into del.icio.us . I thought ...

Not a DBA

I don't consider myself an expert in database design or administration, but like many web programmers, my applications often rely on fast and efficient interaction with a database. I am fairly comfortable normalizing a schema and identifying fields to index, but I sometimes struggle creating efficient queries... especially when multiple table joins are needed. I'm looking for suggestions on how I can improve in this area. Dynamically Joining Tables Currently, I'm working with a database containing multiple sets of interconnected objects. Let's assume they are television shows, actors in the shows, and times the shows are on. The goal is to allow users to apply a set of filters to find the shows that interest them. Some simple use scenarios include: Find all shows where ActorA appears. Find all shows on between 10AM and 12 PM. Some harder scenarios include: Which show or actor appears most frequently. Which shows are on between 10AM and 12 PM, staring Ac...

Eclipse RCP

My work had focused on web application development for so long, I had to pause when I was asked to develop a desktop application. I had little idea where to begin. I started searching for application frameworks that met the following criteria: I could write the application in Java The resulting application would be cross platform with a native look and feel. The framework was mature, easy to use, and widely adopted. I quickly narrowed the field down to 2 choices Eclipse RCP and NetBeans . Both met the criteria I was looking for. Either would have been a reasonable choice, and I chose Eclipse. First of all, I was comfortable developing in the Eclipse IDE. Second, Eclipse had a larger installed base and an avid community following, with over 1200 commercial plugins available. I was happy with my choice. Since I had been coding with JSF for some time, the leap to an event based system was not that large. The Forms plugin allowed me to easily create an attractive interfac...

JavaServer Faces

I made the switch to JSF in late Spring, 2005. My team had just adopted the use of Spring and Hibernate - and loved using them. We had just started a new web development effort and knew we'd also need a flexible and easy to use UI framework. I was a big Struts fan, but often got frustrated with JSP and how much code seemed to be needed in my pages (foreach, if, etc). In addition to providing very modular web UI components, JSF provided many other features I liked and had gotten used to: a scoped managed bean facility and configurable page navigation were two biggies. I also liked how JSF abstracted the idea of a request into an Action, with a corresponding series of listeners that could be called to "set the stage". The one thing I really missed was the ability to dynamically arrange page fragments, like I had done using Tiles . There were some Tiles/JSF jars that others had written, but I could not get them to work correctly. Eventually I just wrote my own...

Props

It's Friday and I don't feel like writing anything I have to think about too much. I thought I'd start a list of some of the online resources I regularly use for news and inspiration. I hope to add to this list as I go. Props to these great innovators! Kayak Kayak is a travel search engine. Kayak makes excellent use of AJAX, adding results as they are discovered, and allowing users to tweak results (times, airlines, stops, etc) without a page refresh. I love how natural this application is to use. I also appreciate how willing they are to share the technology they're using and other cool stuff . CSS Zen Garden This site really cemented, for me, just how powerful and flexible CSS can be. I can spend hours browsing designs and learning new techniques. I do not have an extensive background in design and this site has really helped me refine my user interfaces. Amazon I'm always impressed with the great innovations Amazon has developed for users b...

Web Services

I'm a big fan of Web Services and Service Oriented Architectures (SOA). I've developed a handful of web services for my company to use internally and there are a few reasons I enjoy working with this technology. Ease What I think I like best, is how easy it is to create a web service. I use Eclipse and this IDE provides a web service wizard (I'm sure other tools have something similar). All you need to do is create the WSDL and most of the heavy lifting is done for you (opening and closing connections, serializing the object to the wire, etc). Hook the generated code into your business objects and it's ready to go. Since Web Services use HTTP, installing your WAR file on the web server is the final step. No other setup is needed. I did not find CORBA as easy to use. In CORBA, you need to communicate what ports you want to use, optionally set up a CORBA name service, etc. If there was a port conflict on one of the machines you were using, you needed to ...

Wiki for Development

I'm always excited to start a new development effort. There's always so much to learn about your new users, their domain, and the problems they're experiencing. At this stage, ideas to help solve these user problems are plentiful and the possibilities seem endless. The hard part is, what to do with all the ideas you can't fit into your first release? Often these get left on a white board, buried in an email, or forgotten in a Word document. My team had this exact problem a while back. We started using a wiki to track feature ideas. It was easy to update and enhance this list, eventually slotting these features into planned releases. The wiki became "The Place" to document design decisions, track progress, and even hold our user documentation (which we exported later and included with the release). It became a very valuable development resource. A Wiki is a great tool for teams to keep all your ideas and development artifacts in a central, easily a...

Rich Internet Applications (RIA)

On my last web application project, we realized the JSP/JSF presentation layer we implemented was not cutting it anymore. Transitions between pages were too slow, users wanted more dynamic feedback and drag and drop functionality. The project was put on indefinite hold shortly after that but I wanted to talk about some of the technologies I researched to address these problems. AJAX Ajax seems like the mainstream choice. While AJAX could help address the transition time and feedback issues, I don’t believe it could help add drag and drop. What worries me about AJAX stems from my experience with CSS. Even though CSS is a web standard, some browsers still implement CSS differently. I’ve had to place hacks into my CSS to account for these inconsistencies. It is a pain. Like CSS, web browsers could implement AJAX (XMLHttpRequest) functionality slightly differently. For me, I’d rather stay away from AJAX if at all possible. Adobe Flex I first noticed the power of Flash in ...

EC2

I’m really intrigued about the possibilities provided to small or new business by Amazon’s Elastic Compute Cloud (EC2). Basically, the EC2 allows developers to create a pool of virtual machine images, that can be scaled up or down in minutes. The EC2 integrates with other Amazon web service offerings, like S3. The package seems like the ultimate service oriented architecture. I’ve always been impressed by Amazon’s web site and infrastructure. When you think about all the information (products, reviews, users, wish lists, recommendations, orders, etc.) on this web site, it’s amazing it works and scales as well as it does. I look at the EC2 as Amazon allowing the rest of use to leverage the expertise they’ve gained developing and designing large, scalable systems. Thanks! For companies, this technology allows a very cost effective way to test new business ideas with the safety of scalability should the idea take off. I’m having a hard time finding a down side to using th...

Users, Usability, & Accessibility

In my last post , I asked how much more effective my prototype would have been if we had started with the “compelling story” and went from there? The problem from the start was failing to recognize who my user group consisted of. We assumed that since we were working on an application prototype, our users were a fictional (and generic) set of people who would eventually be our customers. The end result was a feature rich application that didn’t solve any single business problem. In reality, the people performing the demonstration were the real users. Developing features to help them tell their story (and win the company more business) should have been our only goal. Around the time I realized this, I also discovered two developments in user interface design - Usability and Accessibility. Usability I got turned on to Jared Spool through a presentation titled “Scent, Search, and the Pursuit of User Happiness”. I’ve been a big fan of his and the work being done at User Interf...

Accidentally Agile

A few years ago, I was asked to help develop a product prototype. The company had developed some new technology and the goal of the prototype was to demonstrate how this technology could be leveraged in a commercial application. The leaders had a vague vision of what it was they wanted, and we started there. After the initial prototype was complete we started to say, “Boy that’s really nice, but it would be great if it did this!” We began applying Agile principles without even realizing what we were doing. We started defining new features and scheduled short development cycles to implement these features – testing as we went (I should note that we had some JUnit tests, but hardly enough to qualify for what would pass as test driven development). We repeated these short feature based iterations until we had a fully functioning prototype. It was great, we got a lot accomplished and it was fun. Lessons Learned (what I would have done differently) Lately, some users have e...

Introduction

I’m a software developer in the Buffalo, NY area. I’m starting this blog to discuss various software development issues I find interesting. I have not been able to locate a Java or Agile user group in my area, so I’m hoping this space may help fill that void. Some areas I hope to hit upon are: Amazon's EC2 Agile development (& Test Driven development) Adobe Flex (and the new JavaFX) Occasionally, I may post on non-technical topics (family vacation, sports, television, etc). I have no idea where this will take me and I’ll rely on feedback to help drive some new topics.