personal weblog of a tech addict
General
Upgrading Flash Builder
Mar 1st
Whether you’re upgrading because you’re using BETA versions that change rather frequently or upgrading to the next major release, you don’t want to lose all your hard work invested in configuring your setup. Here’s how I handle it and hopefully it’s useful to you. If you have other cool ways to persist workflows between upgrades, please share them.
Workspaces
I’ve created a workspaces folder in a custom directory on my HD where I store all the workspaces I like to use with Eclipse-based IDEs. I separate them by IDE and then by purpose. So for Flash Builder, my workspace hierarchy is like this:
/workspaces
/_fb4
/air
/as
/flash
/flex
This is where all of my IDE preferences and workbench layout settings are stored. Centralizing them here allows me greater flexibility when upgrading since I never have to worry about any changes to installation procedures overwriting my custom settings. Nevertheless, I backup my workspaces prior to upgrading and since their small text files it only takes a second to archive.
Documents Directory
On OSX, the Flash Builder installer creates an Adobe Flash Builder 4 directory in your Documents directory. The installation instructions advise you to uninstall any previous versions of Flash Builder before installing the new version. Following this advice will delete this folder if it already exists. So, be sure to back this up prior to uninstalling your current version. That way you can cherry pick anything you need after installing the new version.
Applications Directory
You should also backup up your program installation in your Applications directory for the same reasons as with the folder in your Documents directory. If you’ve heavily modified your install with additional plugins, etc., this is vital!
Plugin Restoration
Where are all my cool plugins? They got wiped during the upgrade process but if you followed my advice and backed everything up, you’ll be back up and running in a minute or two. There are generally (2) locations where plugin info is stored for Flash Builder. If you pull the data from your backups and place them in the following locations, you should have full access to all your plugins post-upgrade (provided they still work with the latest release)
#1 – /Documents/Adobe Flash Builder 4/.metadata/.plugins
#2 – /Applications/Adobe Flash Builder 4/plugins
Although this post is slanted more towards upgrading on OSX, it should be similar for other operating systems. Any issues, let me know…
FITC Amsterdam 2010 Recap
Feb 24th
First, this will be a rather lengthy pictorial of the last few days here in Amsterdam. For those that have never been, I’ll also share my insights and tips on visiting the city since I’m a seasoned pro now, LOL (4th time).
The City
Amsterdam is a really cool city. It hasn’t changed that much since my last visit about a decade ago. It has a good mixture of rustic Old European charm and 20th century modernism. It’s almost as vibrant as New York City but tends to slow down during the week around 2am
The locals are generally friendly and often find amusement in the confused faces of the American tourists. This is also definitely a bike-friendly city with a lot of the population opting for beach cruisers and mopeds over cars.
The city is filled with quaint little coffee shops, bars and restaurants where one can enjoy an evening of good conversation and more with friends.
Having traveled abroad during an era when technology wasn’t as prevalent, it’s always amazing to see how it has become so deeply integrated into the fabric of life. On that note, if you have an iPhone, (2) useful apps to have are ATM Hunter and Amsterdam GPS Guide. Both are free and can save you a considerable amount of time. ATM Hunter helps you to locate the nearest Geldautomaat so you can gain access to some local currency. Amsterdam GPS Guide provides offline maps for you to use to scour the city. These free apps will have you motoring about like a local in no time.
Here’s a list of some places, in no particular order, worth checking out when in Amsterdam:
- Kadinsky’s (several locations)
- Abraxas
- Supper Club
- Chipsy King
- Renee’s Croissants
- The Greenhouse
- Coffee Shop Reefer
Amsterdam also has its dark side so enjoy but be wary of your surroundings always. While you’re busy watching the sites, someone is always watching you. Should you feel drawn to de Wallen (RLD), try visiting first during the day then return after 10p when it comes to life. DO NOT take pictures of the girls in the windows and if a local approaches you talking about a “party”, politely tell him no thanks and keep moving (either dealer or thief).
Now, these are just a few of the things I’ve come to learn about the city over the past 2 decades of visits. Hopefully they’ll be helpful to 1st timers or those who have visited previously but a lot of time has passed since their last visit. If you think I’ve got it twisted, let me know.
The Conference
FITC was filled with many amazing presentations and workshops. Everything from audio to video to 3d to converting images into sound and even workflows for building iPhone apps with the forthcoming Flash CS5. While the general consensus was that the entire conference was outstanding, the talks by Mario Klingermann, Jared Tarbell and Ralph Hauwert seemed to rank high as the crowd favorites. Additional talks that peeked my interest were Joa Ebart’s overview of his open source project and Sam Agesilas’ preview of the forthcoming Orchid open source framework.
The Fellowship
This alone is worth the price of admission + trip. Being able to hang out with industry geniuses after all the tension of putting on a successful conference has passed is priceless. The post-conference wind down is often just a continuation of the past days’ events but in a much more relaxed and social environment.
Here we’re at the Hotel Ambasade participating in a linkup w/Flash Brighton hosted by Seb Lee-Delisle (a/k/a “Awesome”). Pictured from left to right are Jim Corbett, Grant Skinner and Sam Agesilas discussing the mobile platform.
Later on, Ralph Hauwert chimes in on a response to a question from the Flash Brighton group.
Stacy Mulcahy and Masakazu (Mash) Ohtsuka patiently awaiting their turns to share in the discussion.
Influxis co-founder, Richard Blakely, and Seb discussing Rich Media.
Adobe’s Lee Brimelow and Mike Chambers arrive on the scene to share in the festivities.
The evening was definitely off to a good start. Later that night, in a dark, subterranean and smoke filled room, the leaders of the Flash community gathered to pontificate further on the future of the Flash platform. Sorry, can’t show those pictures as I’m under an NSTPA…;)
GitX Update: Remote Selector
Jan 17th
Previously, I implemented toolbar buttons where each button was tied to a specific remote repository. This was/is fine if you’ll only be working with one or two hosts but becomes cumbersome when dealing with multiple hosts.
Enter the NSPopUpButton. By switching to this UI element I’m able to allow a user to select a remote from a configurable list of remote repositories. I like this UX slightly better than having a button for each remote and the functionality behind the scenes still reaches the same result.
Now with that out of the way, I can move on to some other items on my TODO list…:)
Double-headed Arrows with GraphicsUtil
Dec 7th
I recently ran across this awesome utility class, GraphicsUtil, created by Noel Billig. It allows the ability to draw lines with an arrow on one end using the drawing API in AS3. This proved useful for a project I was working on. In addition to its default behavior however, I needed the utility class to provide the ability to draw lines with arrows on both ends. Well thanks to Noel’s clean code, I was able to easily modify the base class to do just that by adding the following static method:
/** * Draws a double-headed arrow. Pass in ArrowStyle * objects for both arrows to override the default settings. * @param graphics * @param start * @param end * @param startStyle * @param endStyle */ public static function drawArrows( graphics:Graphics, start:Point,end:Point, startStyle:Object=null, endStyle:Object=null ):void { // variables used for arrow 1 var startArrowStyle:ArrowStyle; var startHalfWidth:Number; var vect1:Point; var startNorm:Point; var start1:Point; var start2:Point; var end1:Point; var end2:Point; var startHeadPnt:Point; var startHeadPntNorm:Point; var startEdge1:Point; var startEdge2:Point; var startShaftCenter:Point; var startInter1:Point; var startInter2:Point; var startEdgeCenter:Point; var startEdgeNorm:Point; var startEdgeCntrl1:Point; var startEdgeCntrl2:Point; // variables used for arrow 2 var endArrowStyle:ArrowStyle; var endHalfWidth:Number; var vect2:Point; var endNorm:Point; var end3:Point; var end4:Point; var start3:Point; var start4:Point; var endHeadPnt:Point; var endHeadPntNorm:Point; var endEdge1:Point; var endEdge2:Point; var endShaftCenter:Point; var endInter1:Point; var endInter2:Point; var endEdgeCenter:Point; var endEdgeNorm:Point; var endEdgeCntrl1:Point; var endEdgeCntrl2:Point; if (start.equals(end)) return; ///////////////////////////////// start arrow config \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ if (startStyle == null) { startArrowStyle = new ArrowStyle(); } else if (startStyle is ArrowStyle) { startArrowStyle = startStyle as ArrowStyle; } else { startArrowStyle = new ArrowStyle( startStyle ); } vect1 = end.subtract( start ); startHalfWidth = (startArrowStyle.headWidth != -1) ? startArrowStyle.headWidth / 2 : startArrowStyle.headLength / 2; //Figure out the line start/end points startNorm = new Point( vect1.y, -vect1.x ); startNorm.normalize( startArrowStyle.shaftThickness/ 2 ); start1 = start.add( startNorm ); start2 = start.subtract( startNorm ); end1 = end.add( startNorm ); end2 = end.subtract( startNorm ); //figure out where the arrow head starts startHeadPnt = vect1.clone(); startHeadPnt.normalize( startHeadPnt.length - startArrowStyle.headLength ); startHeadPnt = startHeadPnt.add( start ); //calculate the arrowhead corners startHeadPntNorm = startNorm.clone(); startHeadPntNorm.normalize( startHalfWidth ); startEdge1 = startHeadPnt.add( startHeadPntNorm ); startEdge2 = startHeadPnt.subtract( startHeadPntNorm ); //Figure out where the arrow connects the the shaft, then calc the intersections startShaftCenter = Point.interpolate( end, startHeadPnt, startArrowStyle.shaftPosition ); startInter1 = GeomUtil.getLineIntersection( start1, end1, startShaftCenter, startEdge1 ); startInter2 = GeomUtil.getLineIntersection( start2, end2, startShaftCenter, startEdge2 ); //Figure out the control points startEdgeCenter = Point.interpolate( end, startHeadPnt, startArrowStyle.edgeControlPosition ); startEdgeNorm = startNorm.clone(); startEdgeNorm.normalize( startHalfWidth * startArrowStyle.edgeControlSize ); startEdgeCntrl1 = startEdgeCenter.add( startEdgeNorm ); startEdgeCntrl2 = startEdgeCenter.subtract( startEdgeNorm ); ///////////////////////////////// end arrow config \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ if (endStyle == null) { endArrowStyle = new ArrowStyle(); } else if (endStyle is ArrowStyle) { endArrowStyle = endStyle as ArrowStyle; } else { endArrowStyle = new ArrowStyle( endStyle ); } vect2 = start.subtract( end ); endHalfWidth = (endArrowStyle.headWidth != -1) ? endArrowStyle.headWidth / 2 : endArrowStyle.headLength / 2; //Figure out the line start/end points endNorm = new Point( vect2.y, -vect2.x ); endNorm.normalize( endArrowStyle.shaftThickness / 2 ); start3 = start.add( endNorm ); start4 = start.subtract( endNorm ); end3 = end.add( endNorm ); end4 = end.subtract( endNorm ); //figure out where the arrow head starts endHeadPnt = vect2.clone(); endHeadPnt.normalize( endHeadPnt.length - endArrowStyle.headLength ); endHeadPnt = endHeadPnt.add( end ); //calculate the arrowhead corners endHeadPntNorm = endNorm.clone(); endHeadPntNorm.normalize( endHalfWidth ); endEdge1 = endHeadPnt.add( endHeadPntNorm ); endEdge2 = endHeadPnt.subtract( endHeadPntNorm ); //Figure out where the arrow connects the the shaft, then calc the intersections endShaftCenter = Point.interpolate( start, endHeadPnt, endArrowStyle.shaftPosition ); endInter1 = GeomUtil.getLineIntersection( end3, start3, endShaftCenter, endEdge1 ); endInter2 = GeomUtil.getLineIntersection( end4, start4, endShaftCenter, endEdge2 ); //Figure out the control points endEdgeCenter = Point.interpolate( start, endHeadPnt, endArrowStyle.edgeControlPosition ); endEdgeNorm = endNorm.clone(); endEdgeNorm.normalize( endHalfWidth * endArrowStyle.edgeControlSize ); endEdgeCntrl1 = endEdgeCenter.add( endEdgeNorm ); endEdgeCntrl2 = endEdgeCenter.subtract( endEdgeNorm ); ///////////////////////////////// draw the graphics \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ // draw 1st arrow graphics.moveTo( start1.x, start2.y ); graphics.lineTo( startInter1.x, startInter1.y ); graphics.lineTo( startEdge1.x, startEdge1.y ); graphics.curveTo( startEdgeCntrl1.x, startEdgeCntrl1.y, end.x, end.y ); graphics.curveTo( startEdgeCntrl2.x, startEdgeCntrl2.y, startEdge2.x, startEdge2.y ); graphics.lineTo( startInter2.x, startInter2.y ); graphics.lineTo( start2.x, start2.y ); graphics.lineTo( start1.x, start1.y ); // draw 2nd arrow graphics.moveTo( end3.x, end4.y ); graphics.lineTo( endInter1.x, endInter1.y ); graphics.lineTo( endEdge1.x, endEdge1.y ); graphics.curveTo( endEdgeCntrl1.x, endEdgeCntrl1.y, start.x, start.y ); graphics.curveTo( endEdgeCntrl2.x, endEdgeCntrl2.y, endEdge2.x, endEdge2.y ); graphics.lineTo( endInter2.x, endInter2.y ); graphics.lineTo( end4.x, end4.y ); graphics.lineTo( end3.x, end3.y ); }
Those are the basics. It can be tweaked to taste, etc. Kudos to Noel for the such a useful class…
GitX: A git GUI for OSX
Dec 4th
GitX is a git GUI made for OSX. It was created by Pieter de Bie and is a really solid tool for working with git on OSX. I’ve been using it for about 9 months now. I liked it so much when I first began using it that I immediately added the ability to perform remote pushes to Unfuddle.
I was pushing some commits earlier this morning and realized that I never made the changes to GitX public. It was always my goal to share the updates with the community but I always kept getting sidetracked. Well, today I forked the master project and even added GitHub integration.
You’ll need the latest version of Xcode to compile from source. If you just want access to the customized application, you can download a ZIP of the forked project and you’ll find the application in /path/to/download/build/Debug/GitX.app. Hope others find this as useful as I have…

Transmit and Amazon S3
Jul 19th
Just discovered that Transmit 3.7 has S3 support. You can manage it using the Advanced Preferences tab which you access by holding down the Option key while clicking on the Transmit application menu. From there you will see an extra preference tab where you can manage server connections and S3 settings. Now if they only added a tab for managing public keys for SCP/SFTP. For this you have to make sure your key is available @ ~/.ssh
What’s In A Name?
Apr 4th
I recently overheard a conversation about IDE naming and its impact on an individual or company’s bottom line. There were numerous supporters of the notion that the name of the tool an individual or company chooses has direct correlation to the number and types of clients that individual or company can secure. In contrast, there was an equal amount of supporters of the notion that the IDE name makes little or no difference and that it instead rests with the underlying technology used, as well as, the competency of the individual and/or company.
This was a very heated debate that lasted several days. I was completely shocked that the debate ran that course. Which leads me to ask the question, what’s in a name? Do you think it really makes a difference to your clients whether you use Adobe Illustrator or Inkscape to create your vector graphics? Does it matter to them whether you use Photoshop or GIMP for bitmap image manipulations? Is it important to them whether you use Flex Builder or Flash CS4 to create cool transitions and animations or sites? If you have an opinion on the subject, I’d like to hear it…:)
P E A C E
TextMate and Regular Expressions
Feb 13th
A lot of Mac users have become familiar with a powerful text editor in the form of TextMate. It combines some of the power that is Unix with some of the cleaness that is OSX to give you an editor that could replace some IDEs. It has code snippets and macros made available via bundles that have been created by the community and cover over 30 different languages. You can use it for Flash development, even issuing “Test Movie” commands from TextMate. I’ve personally used it for managing Flex projects for external client projects thanks to its ANT and SVN integration.
Today though, I want to share a hidden little gem that most may be overlooking and that’s the Regular expression option on the Find/Replace interface. Just the other day, I was building a webservice based off of 1500+ records that were originally formatted in PHP but now needed to be converted to an ActionScript friendly format. Enter TextMate. With the records open in TextMate, I hit Cmd + F and entered the expressions shown in the following screenshot, selected the Regular expression option then clicked the Replace All button and presto, chango!! In a matter of seconds 1500+ records were man-handled with ease.

The first expression is the pattern that I’m searching for and the second expression says on each match found, take the first and second values and place them inside this pattern. TextMate is definitley very versatile and a joy to use!
Flash on the iPhone Hits Another Snag!!
Feb 4th
Adobe CEO, Shantanu Narayen, confirms to Bloomberg TV at the World Economic Forum in Davos, Switzerland recently that a Flash player for the iPhone won’t be coming anytime soon. We all know Steve Jobs doesn’t think highly of the player when it comes to its viability for the iPhone and Narayen has expressed that there are some serious technical hurdles to overcome before we can enjoy Flash goodness on one of the most popular mobile devices in the history of mankind.
Having owned an iPhone since day one, I’ve always been frustrated at the lack of the Flash player on the device since it’s the actual web that you’re surfing with Safari and not a dumbed down version. A lot of sites broke on the iPhone because they were either full-flash sites or utilized Flash splash pages. Of course, these sites should all have HTML alternatives as fail-safes but the reality is that the majority don’t for whatever reason.
One good thing that Narayen highlights though is that both Adobe and Apple are working together on a solution. Should they prove successful in their efforts, it won’t be a moment too soon…:)
Introducing Blogo
Dec 29th
Being a member of the Adobe user group management community has its perks. It’s a really diverse group of extremely intelligent and gifted individuals that don’t mind sharing their time, talent and wisdom and this helps keep the user group community thriving.
Via this community, I recently came into awareness of an excellent blogging application for the Mac which makes blogging effortless. Blogo is by far the best tool I’ve come across for the job. It features a user interface that doesn’t get in the way, supports multiple accounts and has built-in support for Wordpress, Blogger, Typepad, Typo, Drupal, Expression Engine, Twitter, Ping.fm and more!
My most recent posts here are courtesy of Blogo and I really can’t say enough nice things about the application. You really should try it out for yourself…:)













