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.
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"
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
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.
All of my development tools and code are located on my real machine.
All of my services are located on a VM
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
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.
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.
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.
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!
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.
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.
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 formpublicfunctiontakeSnapshot():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);
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.
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!
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.
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
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?
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.
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.
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.
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).
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...
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.
Recent Comments