If you don’t have it, you’re in trouble…

I bumped into a friend of mine on the way into work this morning. I’d heard that she’d recently started a new job (really, I’m a Facebook stalker…much easier to keep up with friends like that - no need to actually have a conversation…), and I was curious how it was going. Her reply (paraphrased):

“It’s been a switch moving to an [Advertising] agency. They don’t even have source control! And I only have one monitor - it’s killing my productivity!”
Name withheld to protect the innocent…

Let that be a lesson to you.

Really, if you aren’t using some form of source control, you’re in trouble. And do not make the mistake of confusing source control with backup: the intent of backup is to ensure that you always have a certain entity, be it a file, a set of files, perhaps an (il)legally downloaded music collection. Source control isn’t concerned with the whole, final product; its intent is to capture change. Hopefully, as a developer or designer or hybrid, you see the value in that. If not, if you haven’t been bitten by this particular dog, I’d recommend you start using source control and avoid it entirely.

You see, developing a product, be it a website, mashup, game, desktop app, what-evah, is an iterative process. You go from A to B to C to D. You’re always in flux, always moving, incorporating new ideas, recalibrating, learning and relearning. And one day you’re going to break something that worked fine yesterday. Or have a client tell you they liked it the old way. Hell, you might like it the old way yourself! And then, boom - your ever-overwriting backup strategy goes to hell. You’re stuck going back to figure out what the hell you did to have it work the way it did before. With source control, you can simply roll back or merge the old with the new (well, hopefully simply…).

Now stop being selfish and thinking only about yourself. Most of us don’t live or work in a vacuum, after all. You’ve got multiple people working on the same set of files. To quote the Big Bang Theory, “I believe the appropriate metaphor here involves a river of excrement and a Native American water vessel with out any means of propulsion.” Overwriting other team member’s changes, losing your own changes, it’s a nightmare.

Really. I’ve been there.

So do yourself a favour: set yourself up with source control. First day at the new job, and they don’t have it? Set it up. Quit if they don’t let you. What to use? Lucky for you, you’ve got lots of choices. Microsoft shop? Use VSS. (Ok, that’s a joke…if you can afford it, and really have the need, pick up Team System.) Set your team up with SVN (and, if you’re on Windows, grab Tortoise - you’ll thank me). Find a plugin for your IDE of choice (you do use an IDE, right? sadly, there’s no SVN plugin for FlashDevelop that I know of - yet - but working with Tortoise makes it relatively easy). Go to town. Don’t have your own server or infrastructure to install on? Use unfuddled.com - an excellent project management and collaboration tool that includes both SVN and GIT, along with a suite of other tools for you and your team.

So there you have it. Many have said it more eloquently before me, and many more will say it better (Jeff Atwood of StackOverflow.com fame, for one). But if you’re reading this, forget about how horrific my prose is this evening and get yourself some source control.

(Don’t even get me started about how bad email is for communication…set yourself up on a collaboration platform and get the important crap out of your inbox…)

(Ok, I really think I’ve put off doing my timesheets long enough…bags…)

Share me: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Reddit
  • StumbleUpon
  • Technorati

Ensemble Tofino: Flex/Actionscript in Visual Studio

For as long as I can remember (please, no snide comments from the peanut gallery - yes, mom, I mean you), I’ve wished for Actionscript support in Visual Studio. Fed up with the Flash IDE’s inability to keep up with the capabilities of other modern IDEs, over the years I’ve turned to various external editors for AS coding joy; I used to swear by SE|PY, and more recently have been known to shout the pleasure that is using FlashDevelop from the proverbial (and virtual) rooftops. So you can imagine my excitement on seeing Jon Dowdell’s tweet about Tofino, a Visual Studio plugin adding support for Flex and Actionscript development directly in Visual Studio.

This is, I have to say, cool as hell. I love working in FlashDevelop, but as good as it is (and it is freakin’ good), Visual Studio (imnsho) takes the cake as far as IDE’s go. It’s powerful, fast, makes a developer’s life easier, etc (yes, FD does all that as well, just not quite to the same extent). It’s particularly cool in that people are seeing the benefits of working inside of Visual Studio, particularly for projects that have a .NET based back-end layer. So of course I had to download and install the beta.

Off I go, and, with beta’ed breath (ewww), fire up VS and create a new project. Lovely options - Flex App, Flex Library, or Actionscript Application. I can feel the love. Being more of an AS junkie than Flex-able, I create a new Actionscript project. I like the default project layout (though it would be nice if it asked for a default namespace); it includes a src directory, bin directory, and an html template directory (which, though I haven’t tried yet, appears to be editable and allows one to customize the html generated on publish/compile). Quickly open up the default .as file, which contains a class that lovingly extends Sprite. I hop into the constructor to add a call to super() and…

Type s and press CTRL+Space. Bam. The nothingness I am greeted with rattles my teeth. What’s this, I think to myself. No code hints/intellisense? Hrm. Maybe they’ve only got that for MXML at this point. Ok, I’ll try a Flex project. Open the default MXML, try adding an opening chevron and hitting CTRL+Space; again, nahda. Add an mx: and try again? Still no love.

Ok, it’s a beta. I try simply compiling the app (Flex now as the default project), which works beautifully, opening up Firefox and showing the “Hello, World” label. Well, that was fun.

I’m not trying to detract from what they’ve done - this is a huge step forward for the Flash (and .NET/Visual Studio) community. It will be even nicer as it continues to evolve and adds things like Intellisense support, unit testing (to be fair, it might have that now, haven’t tried it, though), a visual mxml editor, integration with the Flex ISAPI filter for IIS, etc. But to me it’s more of an alpha than a beta (ok, it purports to support debugging, which alone makes it a beta, but from a pure “writing code” perspective, there’s a lot to come.

My wishlist, in no particular or practical order:

  • Integrated ASDoc or XML Documentation (eg: it reads the documentation and includes it in a tooltip when relevant, for example when showing Intellisense or hovering over a method/class/property)
  • Actionscript Intellisense (for both intrinsic/flash and custom classes)
  • MXML Intellisense
  • Support for non .swc references (eg: reference a folder structure containing .as without bringing it into the folder structure of the project)
  • Visual MXML editor
  • Use SwfObject as the default embed methodology (or allow a choice, either global or on a project-by-project basis)

There’s probably more, but that’s my ask for today. And though my initial review may seem a bit lukewarm, I’m really, really, really excited about this. I’ll be following proress on Tofino’s development very closely.

Get it for yourself @ ensemble.com.

Share me: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Reddit
  • StumbleUpon
  • Technorati

When Copywriters Try To Program

Axe Geeky AdNot that I'm against a bit of cross-pollination, and I certainly enjoy the occasional ad that speaks to my inner (and outer) geek, but if you're going to do it, do it right. Case in point, the Axe ad to the left. On first look to most people it probably seems funny, if perhaps a bit cutesy. Upon closer inspection, though, I suspect most people will recognize the code's flaws, but semantic and logical.

For starters, the call to "understand.this" makes no sense. At best, this would likely return a reference to "understand", which makes it redundant. At worst, it's a compiler error. (Both these comments are, of course, somewhat language dependent.) Next, we all know that using the equals operator (==) can be problematic. Further, it seems odd to compare "you" to "understand.this", which are likely different data types and therefore defy comparison. A more logical and semantically valid statement would be:

  1. if( you.understand( this ) ) {

As well, the call to "get.a.girlfriend" is problematic. For starters, the object/property/call chain makes little sense. While it might be work well as a URL, it is clearly an action and therefore (again) should be a method call, not a property/field call. Notice as well that the call operator (()) is missing, which, while valid in a few languages, is generally not acceptable. Again, the perhaps correct way of writing this would be:

  1. you.get( girlfriend );

Or, perhaps:

  1. you.getGirlfriend();

Or we could go all the way, abstract it out a bit more, and go with:

  1. you.getFriend( Gender.Female, Interest.Romantic );

Rolling that up into a complete block, you wind up with:

  1. if( you.understand( this ) )
  2. {
  3.      you.getFriend( Gender.Female, Interest.Romantic );
  4. }

'Nuff said...

(Thanks to Kelly for the original link to the ad - http://cerium50.niloo.fr/18-10-2008/creatives-ads-volume-3/)

Share me: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Reddit
  • StumbleUpon
  • Technorati

flash.media.SoundMixer: All your sound belong to us

Seems the SoundMixer class is a singleton. And a big one - it exists across multiple swfs and domains. Which leads to a bit of a problem.

For example, open the following urls in separate tabs in Firefox (allow the first to fully load before opening the second):

AFC Components: Reflection
Joe Satriani

That's what I did, and (assuming you've got the Flash 9.0.115 player installed) you should see the same thing I did: a big security error stating that:

SoundMixer.computeSpectrum: http://www.satriani.com/2004/SatrianiPlayer4.swf cannot access http://www.afcomponents.com/flv/vid/sample.flv.

Seems to be a bit of a problem. Really, you would expect that SoundMixer would isolate itself to sound playing in the current .swf, or at least on the domain. Or, if it is going to grab the sound data from all swfs playing, it should do it without worrying about security and domain boundaries...

Incidentally, this security error doesn't occur only when it's cross-domain. I had the same problem when putting two swfs on a page that both attempted to grab computeSpectrum data.

Share me: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Reddit
  • StumbleUpon
  • Technorati

Why Constants Just Do Not Replace Enums

(Or, one of the many things that ticks me off about Actionscript 3...)

Seems like every time I talk about Actionscript, I'm ranting about something or other that's just ticking me off. I have to start posting about the things I love about it. [ed. I started this post a long time ago and haven't gotten around to finishing it until now. sue me.]

Well, not tonight [ed. today]. Soon, though, I promise.

One of the cool additions to AS 3 is the const keyword. Compile time constants are a beautiful thing. And right off the bat, Adobe started using constants all over the place. In many places, as simulated enums. This is cool, this is good, very excellent.

The big problem is that it misses the point. Enums aren't simply a way of ensuring that you don't make a type-o, letting the compiler throw an error at you because you once again incorrectly spelled "eneterFrema" (yes, I know you spell "spelled" s-p-e-l-l-e-d, I'm employing some sort of literary device, can't remember which, deal with it). Enums are there to make you code a) easier to read and b) easier to write.

I'll illustrate with an example:

GradientGlowFilter (well, actually, you can go with pretty much any bitmap filter on this one, but I'm going to use GGF for a few reasons: firstly, it doesn't include BitmapFilter in it's name, secondly, it's the one I ran into this particular issue with, so there).

The gradient glow filter constructor has the following prototype:

  1. GradientGlowFilter(distance:Number = 4.0, angle:Number = 45,
  2.      colors:Array = null, alphas:Array = null, ratios:Array = null,
  3.      blurX:Number = 4.0, blurY:Number = 4.0, strength:Number = 1,
  4.      quality:int = 1, type:String = "inner", knockout:Boolean = false)

Specifically, I'm looking at the "type" parameter. It's typed as a string, but it only has three possible values, namely, BitmapFilterType.FULL, BitmapFilterType.INNER, or BitmapFilterType.OUTER. You'll notice the default value for the parameter in the constructor above is the string literal "inner". That should have been, at the least, BitmapFilterType.INNER. That would get across (in applications like FlashDevelop and, yes, even in the Flash IDE [ed. you don't actually use the Flash IDE to write code, do you? Seriously...]) that, even though it's using constants and not enums, the value must be one of the constants on the BitmapFilterType class. Same holds true for the quality parameter. It's typed as number, default value is 1, and it needs to be a member of the BitmapFilterQuality class.

Moving to enums would solve this in two ways. For starters, it would be type-safe (eg: if you tried to pass a string, it would break at compile time). And it would be self-documenting, in that by looking at the method prototype you would immediately know what your possible values are and where to find the enum. (Never mind that naming the parameter "type" is ridiculously unhelpful...at least naming it bitmapFilterType would have cleared up what the parameter is there for.)

The truth is, these aren't huge issues, and one could argue that the additional overhead of using an enum-type of class (a la my examples posted previously) adds overhead that isn't absolutely necessary, in the form of properties, etc), but for my money the developer ease of use and clarity far outweighs that (I can't imagine there would be a huge performance bottleneck by having constants that are instances of a class instead of raw strings).

To me, the constructor prototype for this should have been:

  1. GradientGlowFilter(distance:Number = 4.0, angle:Number = 45,
  2.      colors:Array = null, alphas:Array = null, ratios:Array = null,
  3.      blurX:Number = 4.0, blurY:Number = 4.0, strength:Number = 1,
  4.      quality:int = BitmapFilterQuality.LOW, bitmapFilterType:String = BitmapFilterType.INNER,
  5.      knockout:Boolean = false)

Sure, I can look at the documentation and get the answer in seconds, but that's still seconds where I'm second guessing myself.

The other example I was going to bring up was event types (eg: new Event( Event.ENTER_FRAME ) - I finally saw an example last week of using string names for events where it actually made sense to use strings, as opposed to a fully-typed event model, but never mind that). My biggest problem with the implementation, truth be told, is the lack of consistency with where the event type constants are housed (eg. where are the packages for event types? why is ACTIVATED a constant on the Event class, but ACTIVITY is a constant on the ActivityEvent class? Why aren't ADDED and ADDED_TO_STAGE on the DisplayEvent class (which doesn't exist, ttbomk)? why are they all over the place? the list goes on...).

My point with all this is that time and time again, the Actionscript BCL does developers gross injustice by not implementing API's that are consistent and usable. Adobe should make it mandatory that every developer on the team have a copy of Framework Design Guidelines sitting on their desks.

I should probably say, again, that I really do love Flash and where it's going (and where it's been), but as it matures, these are the issues that are going to differentiate it from the other offerings (Silverlight? maybe, I don't know...they do really come at it from different angles, but hey...). And that's not me saying the Silverlight API's are perfect (truth be told, I haven't done much with them, so I can't really offer an opinion there).

Allright. Enough of a rant. Next time, I'm going to scream about the Sound API. Argh. Lovely capabilities. Scary API. Seriously. Scary.

Seeya next time, on J's Bitchings About Things Not Many Other People Care About (But, In His Opinion, They Should).

Share me: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Reddit
  • StumbleUpon
  • Technorati

More Visualization (Papervision 3d + 2d lines)

The lovely thing about the way I've built these is that it's very easy to "stack" visualizations, using either the same spectrum data or unique spectrum data instances (eg: one using the EQ data and one using the standard Spectrum data). You can hook up individual visualizations to these and have them render independently. In lieu of actually taking the PV3d version further (different shapes, cooler viz, textures, etc), I opted to very simply combine it with one of the 2d line implementations I have done previously. The results, I think you will agree, are more than the sum of their parts.

Hopefully once I've got some time where I'm not writing more of these (eg: tomorrow), I'll do a quick write-up of how I modified the original files to get where I am with the structure.

Share me: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Reddit
  • StumbleUpon
  • Technorati