I'm an RIA Developer who owns a motorcycle custom paint shop, who loves to race anything with wheels. I also enjoy woodworking, cooking, fine wines, liqueurs and dark beers. So if nothing else my blog should be eclectic.  

Adobe Air: A Custom Uninstaller for Distributed Apps (windows)

Development , Adobe Air No Comments »

If you have had the fun of deploying the Adobe AIR runtime and applications to hundreds of computers in an organization you will have no doubt stumbled upon at least one or two the annoyances that pop-up. The runner up for most annoying issue in my experience is the uninstaller.

In my development of "sometimes-connected" applications I have always had to write/store data on the local machine. The lacking feature of the built in uninstaller is the complete inability to remove this data. In my environment I needed to be able to have a solid roll-back plan of a piece of software; this unsuprisingly includes any downloaded content.

To solve my delema I wrote a VBScript file to perform the uninstallation. Similar to my installation process I wrote an install wrapper with Install Jammer. I did it this way to allow for easier "distribution" via SMS. I will highlight a few steps here and provide the full script at the end of the post. This script is obviously meant for Windows only and should work on windows XP, Vista and Windows 7. I have yet to have to distribute an app to anything other than a windows box.

First I grab the installer ID from the install path.Set wmiObj = CreateObject("Scripting.FileSystemObject")
Set oTS = wmiObj.OpenTextFile("{ ** AIR APP INSTALL PATH ** }\META-INF\AIR\publisherid")
publisherid = oTS.ReadAll

Then I get the uninstall executable path/arguments.Set wmiObj = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
 
strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{ ** AIR APP ID NAME ** }." & publisherid
strValueName = "UninstallString"

wmiObj.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

I then run the uninstaller: Set wmiObj = WScript.CreateObject ("WScript.Shell")
wmiObj.run strValue & " /quiet /qn"

Lastly I remove all leftover files:Set wmiObj = CreateObject("Scripting.FileSystemObject")
Set subFolders = wmiObj.GetFolder("C:\Documents and Settings").SubFolders

For Each folder in subFolders
    If wmiObj.FolderExists("C:\Documents and Settings\" & folder.name & "\Application Data{ ** AIR APP ID NAME ** }." + publisherid) Then
        'StdOut.WriteLine "Delete: " & "C:\Documents and Settings\" & folder.name & "\Application Data\{ ** AIR APP ID NAME ** }." + publisherid
        wmiObj.DeleteFolder("C:\Documents and Settings\" & folder.name & "\Application Data\{ ** AIR APP ID NAME ** }." + publisherid)
    End If
Next

 

Download My Full Example Script

My Move To VMWare for Development on My Laptop

Server Config , ColdFusion , Development , Adobe Flex , VMWare , Microsoft 2 Comments »

For months I've thought about the power of virtual machines. I use them all the time now for production and staging servers and in the past I've used them for QA purposes in a lab. However I have never run a VM instance on my own box.

Recently I purchased a VMWare Workstation 6.5 license on the cheap and on a re-wipe of my laptop decided to put it into use. I now have multiple XP VMs, a Win Server and an OpenSUSE distro. I am now able to have multiple server setup options at my fingertips with ease.

Setup
After several setup attempts I think I have found a great mix.

  1. All of my development tools and code are located on my real machine.
  2. All of my services are located on a VM
  3. All of my services via UNC paths call on files from the HOST machine.
    • This allows me to have multiple servers from multiple VMs reference [easily] the same code set.


Things To Pay Attention To

  1. Setting up the networking can be difficult the first time, but it really is easy. I choose to run everything in NAT mode; just make sure your firewall settings are all correct. I've also made all of my Windows machines part of the same workgroup to make some file browsing easier.
  2. Permissions: In my case I created a VMUser in my VMs that was an admin/root and on my main box created that same user. I made sure VMUser had read/write too all of the relevant files. I then made sure all of my services were running as that user.
  3. Flex / Flash Development and Debugging: Because you will be launching your debugging on an IP such as 192.168.248.x instead of 127.0.0.1 your Flex Builder will be unable to attache to the debug tool from the browser. When you launch your flash/flex app right click on the flash app area. When you click you will see a menu item "Debugger"; click it. You will get the following pop-up. When you do change the selected option from localhost to other machine and enter 127.0.0.1. Viola, your debugger will now attache!


So far my experience is extremly positive. I recomend a minimum of 4 gigs; this is what I currently have and I would want no less. My next laptop will definetly have either 6 or 8 gigs to allow me to run multiples at the same time, or maybe even make a VM my full time editing area. VMs can do multi-monitor BTW! I would love to have my base OS be basically naked and be able to more easily do snapshots and go backwards in time. For me, setting up all the servers takes the most time. Now I can just backup my VMs and on a future wipe of my box, literally be up and running in say an hour instead of 5 or 6.

Flex Builder on Windows 7 Throws Alert Window

Windows 7 , Development , Adobe Flex , Eclipse 2 Comments »

I Updated yesterday from an early release of Windows 7 to the retail release doing a complete wipe of my computer. After installing Flex Builder 3 I tried to do some work, yet every time I launched the program Windows 7 alerted me that I was running a program with an unknown publisher. After hitting my self in the head I released that unlike my regular Eclipse environment, Flex Builder was not using my VM but the one that is packaged. This packaged version is NOT signed.

For some reason this worked fine before; but now, not so much. Setting the [-vm c:\pathto\javaw.exe] in the eclipse.ini did not work, but changing the shortcut did work. Any insite into this is welcome!

So in short, on windows 7, force your VM to a legit installed JRE to get this pop-up message to go away if your getting it! The packaged one is not in favor with Windows 7 security!

Flex Component: Confirmation Window with Count-down to Enabled OK

Development , Adobe Flex , Adobe Air , ActionScript 2 Comments »

After years of abuse of pop-ups and confirmation boxes users have become so honed at the skill of simply clicking the OK button on any kind of confirmation box that pops up that it has become almost nothing more than a reflex. This can cause some serious issues when it really matters.

In my flex application I needed to increase the chances of a user actually reading the notice in the pop-up box as much as reasonably possible within the user experience. The solution I decided to use is I believe fairly common to anyone with windows experience; it's also one I would use sparingly!

When the confirmation dialogue is presented the OK button is disabled at first. Instead a countdown timer is displayed on the button. After that timeout the user can then click "OK"; The cancel button is available at all times.


The code isn't rocket science and making use of the pop-up is so simple I won't even bore you with an example, but it is a nice quick fix if you need it.

Source view is enabled on the Flex demo

Flex: Capturing a Screen Shot and Download It (Example)

ColdFusion , Development , Adobe Flex , ActionScript 2 Comments »

A little while ago I started using a screenshot of our flex app login to use as the background for a few of our web apps. As usage grew I ran into multiple color and title needs. So instead of doing things the simple way and just using Photoshop, I decided to make this an example of taking and using "screen shots" (not using mx.graphics.ImageSnapshot).

First I built a plain-jane panel component that I wanted to use as my background in my HTML based application

Then in my main MXML file I wrapped the login component and 3 empty canvases in one larger canvas. I did this in order to more easily control position inside the greater app while easily being able to build my Rectangles.

<mx:Canvas id="loginForm" backgroundColor="{this.backgroundColor.selectedColor}" width="400" height="296">   
    <local:LoginForm title="{this.windowTitle.text}" borderColor="{this.panelColor.selectedColor}" width="360" y="15" horizontalCenter="0"/>
    <mx:Canvas id="loginHeader" width="368" height="48" y="11" horizontalCenter="0"/>
    <mx:Canvas id="loginBody" width="368" height="59" y="78" horizontalCenter="0"/>
    <mx:Canvas id="loginFooter" width="368" height="67" y="219" horizontalCenter="0"/>
</mx:Canvas>


I positioned the 3 boxes to be in the size and position of my 3 desired screen shots: A header, a repeating body and a footer. In my code I use these to create a very easy way to visualize what I'm capturing. In the real world outside of my very specific goal these might be controllable by the end-user.

To create my screen caps first I take a snap of the entire formpublic function takeSnapshot():void {
    var imageSnap:ImageSnapshot = ImageSnapshot.captureImage(this.loginForm);
    var imageByteArray:ByteArray = imageSnap.data as ByteArray;

    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, getBitmapData)
    loader.loadBytes(imageByteArray);
}


Then I loop over my 3 targets to create the specific sub-images that I need:
var bd:BitmapData = Bitmap(e.target.content).bitmapData

for each (var target:Canvas in [this.loginHeader, this.loginBody, this.loginFooter]) {
    rect = new Rectangle(target.x, target.y, target.width, target.height);

 bd2 = new BitmapData(target.width, target.height);
    bd2.copyPixels(bd, rect, pt);

    var m : Matrix = new Matrix();
    bd2.draw( bd2, m );

    encoder = new JPEGEncoder(100);
    ba = encoder.encode(bd2);

    rawImages[target.id] = ba;
}

this.amfService.save(this.downloadUUID, rawImages);



The flex app has view source enabled and the ColdFusion code for the backend is included as well...

 

Flex's FileReference.download Fails

Debugging , Development , Adobe Flex , ActionScript 6 Comments »

Are you using flash.net.FileReference's download function and having your download fail? I was too and it took stumbling on a flash kb article to get me on the right path.

My issue:private function downloadFile():void {
    var f:FileReference = new FileReference();
    f.addEventListener(Event.COMPLETE, myFnc);
    f.download(myURLRequest, strDefaultFileName);
}

This should work in my mind... However it does not. It will most likely fail with absolute silence.

Instead, init a globabl FileReference.private var fileRef:FileReference;

private function init():void {
    this.fileRef = new FileReference();
    this.fileRef.addEventListener(Event.COMPLETE, myFnc);
}

private function downloadFile():void {
    this.fileRef = new FileReference();
    this.fileRef.addEventListener(myURLRequest, strDefaultFileName);
}

This my friends will now work. It shouldn't require this code layout IMO, but it does...

I got caught up in a little gotcha last night that took me a few minutes to fully fix.

My Love for Adobe AIR Fades

Reviews , Development , Adobe Flex , Adobe Air , ActionScript 16 Comments »

Like a High School romance I believe my love for Adobe Air has fallen by the way-side. Like many of you I saw the huge potential of Flex Apps on the desktop, all the cool amazing things I could do and all of the amazing new capabilities. I was drooling to write my first AIR apps after MAX Vegas...

Then reality hit me after recently being charged with creating several Adobe AIR applications; 1 large and 2 small ones. I love flex, I love ActionScript, I even still really like the Air Runtime. AIR truly allows you to do some things with the client side computer that will never be possible via a web browser. The local database, file extension capabilities and encrypted file store are a few. Also you can run larger applications faster and you can easily write agile “sometimes-connected” applications.

What is the reason for my waning love affair? It's really very simply: capabilities!

Adobe has tried so hard to lock down AIR to avoid the possibilities of someone writing a malicious program that they have turned it into a small shadow of what it COULD be.

 

  • ZERO ability to make system API calls
  • Inability to load DLLs and other Libraries
  • No registry functionality 
  • Can't launch outside/non-air applications 
  • Horribly locked down and inflexible install process/package 
  • Piss-poor uninstall capabilities

 

These are just a few of the things that have come to erk me over the last few months with AIR. The more I look at what I can't do with Adobe AIR, the more I realize that there just is absolutely no need for me write an AIR App unless it HAS to support “sometimes-connected” and I can't take the time to write it in anything else!

I understand that every technology has it's place and application; however I think AIR is missing a massive massive market by willingly or even striving at making it's self so ham-fisted just to play it safe. People write malicious VB, C++, C# and so on applications all the time. You don't see any calls out there from the masses: “Oh my god don't download that application, it was written in Visual C++ and might do bad things”!

My few months of working with Adobe AIR has left me feeling the same way about it as I do about Apple and their asinine rules surrounding the iPhone. Adobe can still fix this though, they can still add in the capabilities that I think should have been there from the start. Until then, I will continue to simply use Flex where it kicks-ass the most: the web!

 

Confluence Error: MethodInvocationException: Invocation of method 'isModuleEnabled'

Confluence No Comments »

Are you experiencing the following error in Confluence while trying to install a plugin?

org.apache.velocity.exception.MethodInvocationException: Invocation of method 'isModuleEnabled' in class com.atlassian.confluence.admin.actions.plugins.ManagePluginsAction threw exception java.lang.IllegalArgumentException: Invalid complete key specified: null @ /admin/plugins.vm[109,42]

Everything else is working just fine though right? After you hit your head once or twice verify that you are using the correct JDK and that you've compiled your plugin (if it's a custom plugin) using also the correct JDK. My conlfuence instance (2.8.0) was running just find, but was throwing this error until I moved to 1.5.0_14.

2005 ZX-10 For Sale - Pristine

Motorcycles 1 Comment »

Please forgive the personal post, but I'm hoping to quickly sell this bike. I've been road racing for the last 4ish years and just have zero interest in riding on the street anymore. I also have a baby on the way in 6 weeks now; so hey, the cash would be nice. I bought this ZX10 a couple years ago from the owner of a motorcycle shop in florida that I know from racing. It had around 2,300 original miles on it when I bought it for bombing around with my wife as a pillion or riding to work occasionally.

Located in Albany NY
2005 Kawasaki ZX-10
3737 Miles
Never Seen The Race Track
Never been down/dropped and is pristine
No Mods except for stainless steel break lines and stomp-pads

Priced to move quick at a firm $6400.

russ at empiregp dot com

Is Your Flex App Breaking Under IE8?

Server Config , ColdFusion , Development , Adobe Flex 1 Comment »

Are you getting the error "Channel.Connect.Failed error NetConnection.Call.Failed: HTTP: Status 200"? I thought I bloged about this last month but apparently not. Upon upgrading to IE8 on my Windows XP Pro dev box I could not get any of my flex apps with AMF services to work. It appears as though not everyone hits this wall, even in my own test, it works from Windows 7 but not from XP.

The Adobe Bug entry for this has picked back up speed thanks to some votes and new supporting comments. I'm really suprised this has not gotten more attention, but maybe for some reason this isn't as wide spread as it could be. Or it's just that IE8 addoption is that low?

http://bugs.adobe.com/jira/browse/SDK-21005

Flash Camp Atlanta 2009 Next Week

Development , Adobe Flex , Adobe Air No Comments »

If your available to go to Flash Camp Atlanta next week [8/28/09] there are still some tickets available. Not only should the line up result in a great one day conference but I'm sure some of the attendees will make for some good networking.

I usualy don't do this, but if someone is looking for a room-mate for Atlanta at the Omni CNN I would be interested. I'm not wasting an astounding 60,000 Marriott points for 2 nights at a low end Marriott Residence Inn... I'll be there Thu & Fri night since I'm flying in. Send me an email if interested: russ at EmpireGP dot com.

ill-fated press releases, something to learn from

General News No Comments »

Maybe not all of us are in positions to learn from these "The Press Releases of the Damned" but Technologizer has a great list of 7 top blunders that are all fairly recent. They cover the gamet from how Vista will change our world to the Time Warner/AOL debocle.

The Press Releases of the Damned!

Annoying Adobe Connect Bug

Adobe Connect , Server Config 1 Comment »

I've recently been bumping into an annoying Connect bug/interface issue that has been causing me headaches. If you are administering a Connect server with a large audience this might be of interest.

My growing issue has been recordings with no sound. At first the easy blame was on the users. However after some review, it turns out that there is a flow issue with the Adobe Connect interface that I can easily reproduce in 2 ways.

 

  1. If the meeting you are entering is locked you will be presented with a notification in the top right. If you attempt to press the hands-free button while this notification is present the hands free will appear locked. However you will not be presented with the “Camera and Microphone Access” dialogue and audio capture will not work (despite indication). 
  2. If you select the hands-free button before the Share window has been completely rendered and resized you will get the same results as #1.

 

I'm guessing that this is not a major work flow issue for many. However as Connect becomes more familiar to our users, they are executing setup at a faster rate.

We have adjusted documentation to reflect this issue and warn our Hosts to make sure that they are asked for permission to use the microphone; if they are not, they are directed to unselect and reclick the hands-free lock button. I'll also be contacting Adobe with this little tid-bit through support while we try to work out a playback stability issue as well...

 

Join Us At Flash Camp Atlanta

Adobe Flex , Adobe Air , Conferences , ActionScript No Comments »

Flash Camp Atlanta is coming up next month.  Not only are the tickets to the all day event (9am-5pm) only 39.95 but flights and hotels are relativly cheap right now.

I think the gut reaction is that Atlanta is a long ways for a 1 day event, but the pricing overall is pretty reasonable for a wide audience.  I will be flying down from NY on Thursday night and leaving Saturday morning, my flight total was only a $175.

The theme for this go-around is "Enabling The Convergence of Art & Design With The Flash Platform". I know I for one am looking forward to being in the room with some great minds and learning a few things about "the science and art of the user experience". I know Andrew Powell / Universal Mind and others are working hard to put on another great event that won't dissapoint.

BUY TICKETS

The Speakers Lineup right now includes:

  • Greg Wilson, Adobe - Keynote
  • David Tucker, Universal Mind
  • Jesse Warden - Custom Components in Flex 3 & 4
  • Carl Smith, nGenWorks
  • Leif Wells, Roundbox Global
  • Doug Knudsen, Universal Mind
  • Ben Stucki
  • Christian Saylor, Universal Mind

 

Hopefully I'll get to see a few of you there so don't be shy!

Programatically Select Multiple [Flex] List/Data Grid Items From ActionScript

Development , Adobe Flex , ActionScript 5 Comments »

I needed to display to the users a List component with checkboxes;

  • I needed to do this to remove the need for CTRL & CTRL+Shift commands that might have been 'above' the technical level of my users.
  • I needed the visual effect they provided.
  • I wanted the items to be highlighted and apear mostly as they do in a standard list.
  • And lastly I wanted to be able to access what was choosen by the [myList.selectedItems] and not a custom holder.

I'm sure there are a few ways to make this happen, so I welcome any alternative advice. "View Source" is enabled on this flex app.

Source Code /Info After the Jump

Read more...

Powered by Mango Blog. Design and Icons by N.Design Studio & EmpireGP Services
RSS Feed / Atom Feed