Monday, September 08, 2008    
Home My Books Blog ColdFusion About Me Back    

Calendar
<< Jun 2008 >>
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Search

Categories
 • Acrobat (2) [RSS]
 • Adobe (67) [RSS]
 • AdobeMAX06 (45) [RSS]
 • AdobeMAX07 (59) [RSS]
 • AdobeMAX08 (22) [RSS]
 • AIR (126) [RSS]
 • Appearances (119) [RSS]
 • Books (68) [RSS]
 • CFEclipse (14) [RSS]
 • ColdFusion (1143) [RSS]
 • Data Services (12) [RSS]
 • Fish Tank (2) [RSS]
 • Flash (103) [RSS]
 • Flex (365) [RSS]
 • Home Automation (3) [RSS]
 • Jobs (93) [RSS]
 • JRun (12) [RSS]
 • Labs (27) [RSS]
 • LiveCycle (21) [RSS]
 • MAX (157) [RSS]
 • Regular Expressions (12) [RSS]
 • RIA (4) [RSS]
 • SQL (37) [RSS]
 • Stuff (504) [RSS]
 • Tips (CF Studio) (80) [RSS]
 • Tips (CF) (795) [RSS]
 • Tips (Dreamweaver) (91) [RSS]
 • Tips (Flex Builder) (2) [RSS]
 • Using CF (136) [RSS]
 • Wireless (97) [RSS]

Other BLOGs
 • Charlie Arehart
 • Lee Brimelow
 • Ray Camden
 • Christophe Coenraets
 • Sean Corfield
 • Mihai Corlan
 • Cornel Creanga
 • John Dowdell
 • Danny Dura
 • Enrique Duvos
 • Steven Erat
 • Kevin Hoyt
 • Serge Jespers
 • Adam Lehman
 • Duane Nickull
 • Miti Pricope
 • Andrew Shorten
 • Ryan Stewart
 • James Ward
 • Greg Wilson
 • Full As A Goog

RSS Feeds
 • Feed
 • Subscribe

Join my mailing list and find out about new books and other topics of interest.

Thoughts, ideas, tips, musings, and pontifications (not necessarily in that order) by Ben Forta ...
NOTE: This is my personal blog, and the opinions and statements voiced here are my own.

Viewing By Month : June 2008 / Main
June 30, 2008

My New Pet Peeve - Required Toll Free Numbers

Toll free numbers are all about customer convenience, right? Maybe, but maybe not. Too many U.S. based companies neglect the fact that there is civilization outside of the U.S., locations from where U.S. toll free numbers cannot be called. When I was in Europe a few weeks ago I ran into this problem, and ended up having to call a co-worker in the U.S. and having him dial the toll free number and then conferencing me in. And today I ran in to the problem again! I am in London, and need to contact a financial institution but can't because they only provide a toll free number. And when I contacted them via a form on their web site, I received a message asking me to call - can you guess? - yep, their toll free number! And I've only run into this on occasion, and am guessing that those who actually live outside of the U.S. have to deal with this regularly. Toll free numbers are all about customer convenience, but they must be optional, and good old fashioned paid call numbers must always be provided, too! Grrrr!


Ray Camden To Lead MAX CF Unconference

What's an "unconference"? Imagine a technical conference without strict rules and timetables, a more free format, more interaction than sessions, lots of presenters discussing topics of their choosing, casual seating arrangements ... you get the idea. And MAX North America this year will host 4 Unconferences, including one on ColdFusion. And, Ray Camden has announced that he's leading the CF Unconference. ColdFusion has a major presence at MAX this year, which is a great reason for you to be there!

June 29, 2008

Hands On FlexCamp Scheduled In MI

The Michigan Flex User's Group will be hosting a FlexCamp in Lansing, Michigan, on the 30th and 31st of July. This FlexCamp is targeted at Flex and AIR beginners, and attendance is being limited to 150 people. And this is a hands-on conference - all sessions are designed to allow you to follow along on your laptop. Details posted online.


James Ward And James Governor To Present Enterprise Flex In London

RedMonk's James Governor has announced that he's tag-teaming with our own James Ward to present a "SAP Enterprisey Nanoconference" at Adobe's London office on July 11th.

June 28, 2008

ColdFusion Position In PA

Just the one this week:

June 26, 2008

ColdBox Training Now Being Offered

Luis Majano has announced that he has partnered with two other companies to offer ColdBox Platform Official Training Seminars - 16+ hours of intensive hands-on training.


LendingTree Selects ColdFusion Based Loan Pricing Technology

LendingTree is the number one online lending exchange, and LendingTree has just announced that they have selected LXE Software's LoanXEngine as a preferred technology solution for CRM and automated loan pricing for lenders participating in the LendingTree network. And LoanXEngine is all powered by ColdFusion 8. Thanks to Alan Johnson of LXE Software Inc. for bringing this one to my attention.

June 25, 2008

MAX 2008 Sessions Posted

The MAX USA 2008 site is now up, and the schedule is now online too complete with the session list. Register now!

Oh, and the site background is interactive, and apparently there are hidden puzzles in there. Have you figured any of it out yet?

June 23, 2008

2008 On The Road Pics Finally Posted

My On The Road pics page had not been updated since the end of 2007. Honestly, I don't know if anyone even noticed, aside from my daughter who has been bugging me to upload newer pics. And so, finally, pics for the first half of 2008 have been posted.

June 22, 2008

Flex Gigs Job Site Launched

Jeff Graham e-mailed me tell me about the launch of Flex Gigs, a site for Flex job listings. Just two listing there for now, but hopefully that number will grow significantly.

June 20, 2008

ColdFusion Positions In OH And Netherlands

Several positions this week:
  • Peoplexs (The Hague, Netherlands) is looking for a ColdFusion lead developer and multiple ColdFusion developers. Details posted online here and here.
  • Unnamed client (Cleveland, OH) is looking for a ColdFusion contractor for a multiple week engagement. Requirements include experience with ColdFusion 8, DHTML, JavaScript, IIS, and SQL 2000/2005. Contact recruiter Derek Carle at Oxford & Associates.

June 19, 2008

Is Firefox 3 A Resource Hog?

No, this is not a Firefox attack, really. I love Firefox, and it truly is my preferred browser. But ...

I installed Firefox 3 on Download day, and made sure that it was a clean install. The only plugins I have installed are Greasemonkey and YSlow. It's a pretty simple and clean install.

And all is good initially. And then gradually my CPU utilization reaches 100% and the system grinds to a halt, and when I look at Windows Vista Task Manager I see that Firefox is using over 60% of my resources! Heck, it's more than Outlook uses! Is anyone else running into this one?


Thoughts On The CFML Language Advisory Committee

CFML has come a long way in over a decade. Over the years the language has evolved, sometimes gradually and thoughtfully, other times less so, but evolved it has. And Allaire/Macromedia/Adobe have, understandably, been the primary stewards of the language, fueling that evolution based on customer feedback, industry trends, as well as our own innovation. We've not always been successful (I have my own long list of CFML inconsistencies, gotchas, and the like, and others do too), but in general we've always tried to do the right thing, an almost impossible task. What is right for language purity is often not right for the masses, and what is right for the top tier of CFers is often not right for beginners, and what is right for our engineering teams sometimes is at odds with what is right in the expectations of our developer base. Still, all in all, I believe we've been phenomenally successful in creating a language that is easily learned and readily usable by beginners, while being powerful and flexible enough to meet the needs of the most technical experts.

But times have changed. For starters, as ColdFusion has grown more all encompassing (starting in CFMX), so have the demands on the language - new features need new language elements, and thus language proliferation. In addition, there are other engines that execute CFML code, engines that perhaps do things that ColdFusion does not do or does differently, and vice-versa. And while every vendor and player in this space should have the luxury to innovate as they see fit, the more they do so, the greater the risk of further fragmentation and inconsistencies within the language.

Which is why there has been talk for several years now of transferring stewardship of the language from any single vendor to a committee or consortium. In fact, I remember being asked about just this while on a panel at CFUnited (or CFUN as it was known back then) quite a few years ago. But that never happened, for two reasons. One reason is purely one of economics. Simply put, could the ColdFusion team afford to spend precious engineering time on an effort that would take resources time away from core development, while essentially only helping competitors? And back then the answer was no, not at all. After all, which feature in CF7 or CF8 should we have sacrificed in order to do so? That's not an answer many want to hear, but it's the truth, and it's how I answered that question all those years ago.

But there is another answer too, and this is the answer I did not give because, well, frankly it would have opened up a Pandora's box that I just did not want to have to deal with at the time. For different organizations to work together on a project that less directly helps their own interests while at the same time requiring a degree of cooperation that could legitimately further the interests of the others parties, one important ingredient is required. It's called trust, and without it any collaboration between competitors is doomed, despite the best of intentions. And let's be honest, there has been little trust between the various players in this space. No, I am not going to get sucked into gossip or mudslinging or a he-says-she-says, that's beyond irrelevant. The only thing that is relevant is that if we are truly honest with ourselves we'll have no choice but to acknowledge that trust between the various players has been nonexistent. And no trust equals no cooperation, it's that simple.

So what's changed? Why is now the right time to truly start cooperating in the bests interests of the language and community that loves it and relies on it, putting those interests above those of individual organizations and products?

What's changed is that there are now players who truly do get along (as I noted in a previous post). Not that they did not get along previously, the relationships was always a very professional albeit neutral one. And that's a good thing. It's allowed for trust which has allowed for open communication which has allowed for the types of discussions that have not been possible previously.

And so at CFUnited this week we announced the creation of the "CFML Language Advisory Committee", a small group who hopefully will come up with the guidelines and standards and recommendations that will ensure the long term viability and integrity of CFML. The committee is a work in progress, and the details of its objectives and mandate and workings still need to be hammered out. But it's an important first step, and one that all involved are enthusiastically committed to.

In the interests of openness, and to ensure that no committee representation drowns out the voice of any other constituents, we were careful to not stack the deck in any way. The initial group of six is made up of two Adobe representatives, a Railo representative, and three community representatives.

And yes, there are stakeholders who are conspicuously absent from the initial committee. And as expected, that point was made by one of the first questioners after the announcement who wanted to know how the interests of other players would be represented. I answered the question bluntly and honestly, and tried to be as professional and measured as possible in doing so. And basically what I explained was what I already said above. Right now we've included those who respect the business requirements and necessities of the other players in the space, and those who have demonstrated a clear commitment to the community, looking out for its best interests. Of course, by inference I was saying that others are not meeting those prerequisite requirements, and understandably this has upset some.

But as I said before, the trust factor is critical. Here's an example. Yesterday, during the keynote, Adam Lehman demonstrated some of what we are planning around Hibernate-based ORM support in ColdFusion "Centaur". And as it so happens, Gert Franz of Railo has already stated that his team is working on Hibernate integration as well. Obviously, we need to work together. There is no requirement that we solve the same problems the same way, nor is there a requirement that the solutions be compatible. At the end of the day product teams should do what they believe is correct and in the best interests of their respective products and businesses. But we do need to work together as much as possible, doing so benefits the community and hopefully both of our eventual feature implementations. And that's just the one public example, there are many others.

And that's where the trust comes in. Not inviting some of the stakeholders initially is less about taking stands or punishing indiscretions or playing politics. It's about trust and the reality that where there is a history of distrust the frank and open discussion that this endeavor requires will be utterly impossible.

That's not to say that things can't change. They can, and hopefully will. For example, when one of the players in this space spins off a standalone community driven open source initiative, that represents an opportunity to start over, to divorce from prior ill-feelings and built up distrust. Has that opportunity been realized? That's debatable, and many have strong feelings on this one. And who's right and who's wrong is unimportant. What is important is that the fact that this is so hotly debated, the reality is that the trust is still not there. Not yet.

So, for now we have a new small and very focused "CFML Language Advisory Committee", one that will hopefully start to contribute in earnest immediately, one that will start to realize benefits for all involved, including the community. And as I explained yesterday, the committee is deliberately and intentionally not stacked or biased in any majority direction, and so the ability to invite and include other stakeholders in the future is a definite possibility.

Yesterday's announcement is an important first step, and one that I hope marks the beginning of a new era for CFML and for the community that has supported it for so long.


Charlie Griefer On Lesser Known CF8 Enhancements

Charlie Griefer has written an article for Packt Publishing entitled ColdFusion 8-Enhancements You May Have Missed. Lots of nice little goodies in this one.

June 18, 2008

ColdFusion To Be Free For Educational Use

This morning, during the CFUnited keynote, we announced that ColdFusion would be made freely available for educational use (including students and faculty). The program is modeled on the Adobe Flex Builder 3 Pro for Education program, and will use similar distribution and similar eligibility and verification requirements.

This is a really important program for ColdFusion. For starters, there is real interest in teaching ColdFusion, and we definitely need new to be training new developers. But additionally, there is significant interest in teaching RIA development in colleges and universities, and by making both ColdFusion and Flex Builder freely available for educational use, both ColdFusion and Flex benefit.

We had hoped to be able to announce the immediate availability of this program, but the process is taking longer than we had hoped, and is not available yet. So, bear with us a bit longer, and watch for an announcement within the next few weeks.

June 17, 2008

In D.C., Getting Ready For CFUnited

I am in hiding in my hotel room here in Washington, D.C., working on tomorrow's CFUnited opening keynote. If you're attending, don't be late. We have a couple of really important and exciting announcements to make, and some really cool demos too (assuming we can actually get them working by then). And shortly, with any luck, I'll head down to the bar to look for familiar faces.


Aptana Supports AIR 1.1

Yesterday we announced AIR 1.1. And Aptana has taken a lead in AIR development by announcing that Aptana Studio now fully supports AIR 1.1.

June 16, 2008

AIR 1.1 Now Available

AIR 1.1 has been released. The big enhancement is support for localized and internationalized applications, the AIR runtime itself now supports multiple languages (Brazilian Portuguese, Chinese, French, German, Italian, Japanese, Korean, Russian, and Spanish), as well as support for building internationalized applications (including keyboard input for double-byte languages). There are other API enhancements, too.

June 15, 2008

CFDevCon 2008 Agenda Looking Impressive

In recent years the U.K. has become home to an impressive array of ColdFusion related events and conferences, and among the list is CFDevCon 2008 in Brighton, England,on September 25th and 26th. I am not going to be able to attend this one myself, but seeing the agenda and speaker lineup I wish I could. Check out the CFDevCon 2008 website for yourself.

June 14, 2008

ColdFusion Positions In CO And NY

Two positions this week:
  • CenterStone Technologies (Denver, CO) is looking for a ColdFusion developer. Requirements include strong ColdFusion, JavaScript, and SQL skills. Pluses include experience with jQuery T-SQL, XML, XSL, Web Services, object oriented programming, AJAX, SourceSafe, and experience with SaaS company model. Contact cfjobs@centerstonetech.com.
  • Media Logic (Albany, NY) is looking for a ColdFusion developer. Requirements include a minimum of 3 years ColdFusion experience (ColdFusion 7 and/or 8 preferred), as well as experience with SQL Server 2000/2005, ActionScript 2/3 and Flash Remoting, JavaScript and XML. Details posted online.

June 12, 2008

Getting Started With Flex Based Yahoo! Maps

The Yahoo! Maps AS3 Component is nothing short of astounding, a clean and powerful Flex component that delivers sophisticated mapping quickly and easily. I needed to add mapping to an app recently and was pleased to see how well this component delivered. If you are interested in adding mapping to your apps, I highly recommend that you take a look at this component. And here are detailed steps to help you get started.

To use the Yahoo! Maps AS3 Component you'll need your own Yahoo! Developer Network Application ID. If you have one already, then you're all set. If not, click on the "Get an App ID" link on the component page to obtain one.

Once you have an App ID, you'll need to download the Flex component itself. There is a download link in the middle of the component page, download the ZIP file, and expand it in a local folder somewhere. There are lots of files in the ZIP file, but the really important file is the YahooMap.swc file. Make sure you know the path to this file, you'll need it when you create your Flex project.

Then create a new Project in Flex Builder. You can define a Server Technology if needed, although for tinkering the first time you may want to keep the Project as simple as possible. In the 3rd screen in the New Flex Project wizard you can specify Source Paths and Library Paths. Select the "Library path" tab as you'll need to add the YahooMap.swc. Click the "Add SWC" button, and then browse to the YahooMap.swc file and click "OK". You should see the YahooMap.swc listed in the "Build path libraries" list. You can then finish creating the Project.

Now let's create the basic UI. This example will display the map in a large box on the right, and the left will contain simple text boxes, one to enter the map location, and the other to specify map searches. Here's the MXML code:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">

   
   <mx:Panel layout="horizontal" title="Yahoo! Maps Example"
            height="100%" width="100%">

      <mx:VBox height="100%" width="200">
         <mx:Label text="Location:" fontWeight="bold"/>
         <mx:HBox width="100%">
            <mx:TextInput id="txtLocation" width="100%"/>
            <mx:Button label="Go!"/>
         </mx:HBox>
         <mx:Label text="Find:" fontWeight="bold"/>
         <mx:HBox width="100%">
            <mx:TextInput id="txtFind" width="100%"/>
            <mx:Button label="Go!"/>
         </mx:HBox>
      </mx:VBox>
      <mx:UIComponent id="mapUI" height="100%" width="100%" />
   </mx:Panel>

</mx:Application>

The code is pretty simple, and the only really interesting item is the <mx:UIComponent> which will be used to display the map. Paste this code into your app, and compile and run it, just to make sure all is working.

Next we'll add basic mapping. Here is the updated code:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
            creationComplete="initApp()">


   <mx:Script>
      <![CDATA[
         import mx.events.ResizeEvent;
         import com.yahoo.maps.api.core.location.LatLon;
         import com.yahoo.maps.api.YahooMapEvent;
         import com.yahoo.maps.api.YahooMap;

         public var appID:String = "YOUR APP ID";
         public var yahooMap:YahooMap;

         // Called on app creationComplete
         public function initApp():void
         {
            // Create YahooMap instance
            yahooMap=new YahooMap();
            // Set initialization handler
            yahooMap.addEventListener(YahooMapEvent.MAP_INITIALIZE, yahooMapInitialize);
            // Initialize map
            yahooMap.init(appID, mapUI.width, mapUI.height);
            // Turn on map panning
            yahooMap.addPanControl();
            // Display scale bar
            yahooMap.addScaleBar();
            // Turn on map type control
            yahooMap.addTypeWidget();
            // Turn on zoom control
            yahooMap.addZoomWidget();
            // And finally add the map to the UI
            mapUI.addChild(yahooMap);
         }

         // Initialize event handler
         public function yahooMapInitialize(event:YahooMapEvent):void
         {
            // Set a resize event handler
            mapUI.addEventListener(ResizeEvent.RESIZE, yahooMapResize);
            // Set initial zoom level
            yahooMap.zoomLevel = 14;
            // Set the map somwehere for starters
            yahooMap.centerLatLon = new LatLon(40.81,-96.7);
         }

         // Resize event handler
         public function yahooMapResize(event:ResizeEvent):void
         {
            // Reset map size
            yahooMap.setSize(mapUI.width, mapUI.height);
         }
      ]]>
   </mx:Script>
   
   <mx:Panel layout="horizontal" title="Yahoo! Maps Example"
            height="100%" width="100%">

      <mx:VBox height="100%" width="200">
         <mx:Label text="Location:" fontWeight="bold"/>
         <mx:HBox width="100%">
            <mx:TextInput id="txtLocation" width="100%"/>
            <mx:Button label="Go!"/>
         </mx:HBox>
         <mx:Label text="Find:" fontWeight="bold"/>
         <mx:HBox width="100%">
            <mx:TextInput id="txtFind" width="100%"/>
            <mx:Button label="Go!"/>
         </mx:HBox>
      </mx:VBox>
      <mx:UIComponent id="mapUI" height="100%" width="100%" />
   </mx:Panel>

</mx:Application>

Let's take a look at the above code. The big change is the <mx:Script> block. First come a series of import statements, and then two variables are defined. The first, appID, contains your Yahoo! Developer Network ID, replace the placeholder text in quotes with your own ID. The second defines the YahooMap itself.

The initApp() function (called on creationComplete) first creates a new YahooMap instance, and then defines the handler that will be called upon map initialization. It then initializes the map, passing the appID, along with the desired height and width (using the height and width of the mapUI UIComponent). Next a series of options are set, turning on panning, the scale bar, the map type widget, and the zoom control (you can omit these, or add other options if desired). And then finally, addChild() is used to add the yahooMap object to the mapUI UIComponent.

The code also contains two other functions. yahooMapInitialize() is called once the map is initialized (in response to a YahooMapEvent.MAP_INITIALIZE event). It sets the default zoom level and initial map location, and also specifies a resize handler. This is important, without a resize handler the displayed map would not resize if the app were resized. The resize handler function itself, yahooMapResize(), is called whenever the app is resized (in response to a ResizeEvent.RESIZE event), and it simply resets the map size (again using the height and width of the mapUI UIComponent).

You can paste this code into your app, and run it. You'll have a fully functioning map, allowing zooming and panning, and supporting multiple display types (Map, Satellite, and Hybrid).

Next we'll add code to allow users to enter a map location. Here's the updated code:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
            creationComplete="initApp()">


   <mx:Script>
      <![CDATA[
         import mx.events.ResizeEvent;
         import com.yahoo.maps.webservices.geocoder.GeocoderResult;
         import com.yahoo.maps.webservices.geocoder.GeocoderResultSet;
         import com.yahoo.maps.webservices.geocoder.events.GeocoderEvent;
         import com.yahoo.maps.api.core.location.Address;
         import com.yahoo.maps.api.core.location.LatLon;
         import com.yahoo.maps.api.YahooMapEvent;
         import com.yahoo.maps.api.YahooMap;

         public var appID:String = "YOUR APP ID";
         public var yahooMap:YahooMap;
         public var address:Address;


         // Called on app creationComplete
         public function initApp():void
         {
            // Create YahooMap instance
            yahooMap=new YahooMap();
            // Set initialization handler
            yahooMap.addEventListener(YahooMapEvent.MAP_INITIALIZE, yahooMapInitialize);
            // Initialize map
            yahooMap.init(appID, mapUI.width, mapUI.height);
            // Turn on map panning
            yahooMap.addPanControl();
            // Display scale bar
            yahooMap.addScaleBar();
            // Turn on map type control
            yahooMap.addTypeWidget();
            // Turn on zoom control
            yahooMap.addZoomWidget();
            // And finally add the map to the UI
            mapUI.addChild(yahooMap);
         }

         // Initialize event handler
         public function yahooMapInitialize(event:YahooMapEvent):void
         {
            // Set a resize event handler
            mapUI.addEventListener(ResizeEvent.RESIZE, yahooMapResize);
            // Set initial zoom level
            yahooMap.zoomLevel = 14;
            // Set the map somwehere for starters
            yahooMap.centerLatLon = new LatLon(40.81,-96.7);
         }

         // Resize event handler
         public function yahooMapResize(event:ResizeEvent):void
         {
            // Reset map size
            yahooMap.setSize(mapUI.width, mapUI.height);
         }

         // Set map to passed location
         public function setMapLocation(location:String):void
         {
            // Create address object for passed location
            address = new Address(location);
            // Add listener to process geocode event
            address.addEventListener(GeocoderEvent.GEOCODER_SUCCESS, yahooGeocodeSuccess);
            // Geocode it
            address.geocode();
         }

         //Geocode success event handler
         public function yahooGeocodeSuccess(event:GeocoderEvent):void
         {
            var geocoderResults:GeocoderResultSet = address.geocoderResultSet;
   
            // May return multiple result, just use 1st
            // Set zoom level
            yahooMap.zoomLevel = geocoderResults.firstResult.zoomLevel;
            // Set map location
            yahooMap.centerLatLon = geocoderResults.firstResult.latlon;
         }
      ]]>
   </mx:Script>
   
   <mx:Panel layout="horizontal" title="Yahoo! Maps Example"
            height="100%" width="100%">

      <mx:VBox height="100%" width="200">
         <mx:Label text="Location:" fontWeight="bold"/>
         <mx:HBox width="100%">
            <mx:TextInput id="txtLocation" width="100%"
                     enter="setMapLocation(txtLocation.text)"/>

            <mx:Button label="Go!"
                     click="setMapLocation(txtLocation.text)"/>

         </mx:HBox>
         <mx:Label text="Find:" fontWeight="bold"/>
         <mx:HBox width="100%">
            <mx:TextInput id="txtFind" width="100%"/>
            <mx:Button label="Go!"/>
         </mx:HBox>
      </mx:VBox>
      <mx:UIComponent id="mapUI" height="100%" width="100%" />
   </mx:Panel>

</mx:Application>

Not a lot of changes here. First, we've added some more needed import statements. We've also added a variable of type Address (to store the set map location). Two functions have been added to the code. setMapLocation() accepts a string (whatever the user typed in the txtLocation box) and then creates an Address object for the passed string. As you are probably noticing, the Yahoo! Maps component is used asynchronously and is thus highly event driven. setMapLocation() sets an event handler that will be called when the Address object has been successfully geocoded, and then it perform the geocode. The geocode operation does not do anything to the map, rather it locates matches and converts them into map locations. The event handler, yahooGeocodeSuccess(), first obtains any results generated by the geocode operation. It is possible for a geocode operation to return multiple results, but this code ignores all but the first match, and then uses that first match to set the map zoom level and location. And finally, setMapLocation() was added to the first <mx:TextInput> and <mx:Button> to the enter and click events respectively.

Save these changes, and then run the app. Now you can type in a country name, or a city and state, or a US zipcode, and the map will be repositioned to display the best match.

Now for the final change, this time allowing you to search for matches within the displayed map. Here's the code one last time:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
            creationComplete="initApp()">


   <mx:Script>
      <![CDATA[
         import mx.events.ResizeEvent;
         import com.yahoo.maps.webservices.geocoder.GeocoderResult;
         import com.yahoo.maps.webservices.geocoder.GeocoderResultSet;
         import com.yahoo.maps.webservices.geocoder.events.GeocoderEvent;
         import com.yahoo.maps.api.core.location.Address;
         import com.yahoo.maps.api.core.location.LatLon;
         import com.yahoo.maps.api.markers.SearchMarker;
         import com.yahoo.maps.webservices.local.LocalSearch;
         import com.yahoo.maps.webservices.local.LocalSearchItem;
         import com.yahoo.maps.webservices.local.LocalSearchResults;
         import com.yahoo.maps.webservices.local.events.LocalSearchEvent;
         import com.yahoo.maps.api.YahooMapEvent;
         import com.yahoo.maps.api.YahooMap;

         public var appID:String = "YOUR APP ID";
         public var yahooMap:YahooMap;
         public var address:Address;
         public var localSearch:LocalSearch;


         // Called on app creationComplete
         public function initApp():void
         {
            // Create YahooMap instance
            yahooMap=new YahooMap();
            // Set initialization handler
            yahooMap.addEventListener(YahooMapEvent.MAP_INITIALIZE, yahooMapInitialize);
            // Initialize map
            yahooMap.init(appID, mapUI.width, mapUI.height);
            // Turn on map panning
            yahooMap.addPanControl();
            // Display scale bar
            yahooMap.addScaleBar();
            // Turn on map type control
            yahooMap.addTypeWidget();
            // Turn on zoom control
            yahooMap.addZoomWidget();
            // And finally add the map to the UI
            mapUI.addChild(yahooMap);

            // Local search object
            localSearch = new LocalSearch();
            // Set search success listener
            localSearch.addEventListener(LocalSearchEvent.SEARCH_SUCCESS, yahooSearchSuccess);
         }

         // Initialize event handler
         public function yahooMapInitialize(event:YahooMapEvent):void
         {
            // Set a resize event handler
            mapUI.addEventListener(ResizeEvent.RESIZE, yahooMapResize);
            // Set initial zoom level
            yahooMap.zoomLevel = 14;
            // Set the map somwehere for starters
            yahooMap.centerLatLon = new LatLon(40.81,-96.7);
         }

         // Resize event handler
         public function yahooMapResize(event:ResizeEvent):void
         {
            // Reset map size
            yahooMap.setSize(mapUI.width, mapUI.height);
         }

         // Set map to passed location
         public function setMapLocation(location:String):void
         {
            // Create address object for passed location
            address = new Address(location);
            /