You wanna piece of me?

Aral Moo Mosaic

I love trying new things with Moo cards whenever I run out of a batch.

This time around, I thought it would be fun to take one large image and break it up into a hundred small cards to create a Moo card mosaic.

I started with a lovely photo of myself as The Phantom of the Opera that Jane Dallaway took last year at my fancy dress Friday 13th housewarming party and sliced it into a hundred pieces with Photoshop. (I also applied a little Smart Blur to it to so that you would not be subjected to too much detail of my overly-magnified facial pores!)

If you want to create your own Moo card mosaics, grab this Photoshop file (.zip; 0.5MB) that's set to the correct dimensions and comes pre-sliced for your convenience. (Just do a Save for Web after adding your own picture to it and you'll get a hundred images that you can zip up and upload to Moo.)

So if you see me around, feel free to ask for a piece of me -- you might just get one! :)

Relly has a much nicer close-up of the cards than my pic (using my camera, no less, which is now her camera) :)

Google App Engine hackathon at XTech?

I'm heading over to Dublin in a few hours to present at XTech and I'm wondering if anyone wants to meet up informally to meet/talk/hack Google App Engine.

I've set up an event on Upcoming. Please add your thoughts + tell me if the time is good. I think we should hold it at the hotel where the event's taking place for convenience.

Let me know your thoughts here, express your interest on the Upcoming page and/or contribute to this thread on the Google App Engine forums.

Pistach.io entering beta testing

Pistach.io is entering beta testing.

You've probably noticed the Pistach.io ad on my site for a little while now. Peter Elst was helping us alpha test the ad rotation. Seb's got his badge up as well and the other beta testers from the Pistach.io Flash Pack will be adding theirs shortly.

So what's Pistach.io and the Pistach.io Flash Pack? We're a group of highly regarded and influential Flashers who are banding together to monetize our web sites in an elegant way: With a single ad, prominently displayed across all of our web sites. (Read more about Pistach.io here.)

Dave and I have been working for the past few months to build a system that is massively scalable and can handle any number of packs. We're kicking things off with the Flash Pack and we're open to suggestions about new packs. Dave will no doubt be blogging about the technical side of things in the future and it should make for an interesting read as we've built Pistach.io on Amazon's EC2, S3, and SimpleDB systems. We are also going to be using Amazon's Persistent Storage for EC2.

We're starting to sell ads during the beta period. If you are interested in advertising on the Flash Pack, contact me at aral {at} pistach(.)io.

I will be posting more information, including rates and the list of Flash Pack sites that are taking part in the beta test, in the coming days.

We also still have room in the Flash Pack. If you're a top Flash designer or developer and want to join an cool group of your peers and monetize your site in a way that respects your users and actually reinforces your reputation instead of tarnishing it, get in touch with me at aral {at} pistach(.)io.

Enabling incompatible extensions with FireFox 3 Beta 5

I just upgraded to FireFox 3 Beta 5 and immediately felt the loss of FireBug. Although FireFox can't automatically locate an update for it, FireBug 1.1 works in Beta 5 so grab it now!

Also feeling the loss of my del.icio.us bookmarks, HTML Validator extension, and Alexa rating graph, I googled for a possible solution and came across this useful tip:

Enter about:config into your address bar, right-click in the window and select New -> Boolean and enter extensions.checkCompatibility for the preference name and false for the value.

Now, go into Tools -> Add-ons and manually disable your non-essential plugins (no need to tempt fate) and restart. You can enable your existing plugins one by one and see which ones work. All of my essential plugins work well under Beta 5.

Update: I've gone back to using the release versions of FireFox 2 and Firebug after running into issues with the JS console.

Accessibility and Flex: we can do better.

By default, Flex Builder creates inaccessible SWF files.

Bad decision. This needs to change.

Enabling accessibility features for The GAE SWF Project resulted in an 8KB file size increase in the SWF file. I can live with that. Creating inaccessible SWF files to save a couple of KB is no savings at all.

The Flex accessibility overview page feels woefully outdated and mention Adobe Flash Player 7. We're on 9 now. Let's update these, guys!

It also reads more like marketing talk then factual information for developers with phrases like "designers and developers can create powerful, exciting, and engaging experiences on the web that are accessible to all" and "it's never been easier to design accessible Rich Internet Applications." Let's cut out the marketing talk and concentrate on the facts. If we feel that we need to dilute or detract from the facts with marketing talk, maybe we need to concentrate on changing the facts.

The Accessibility Best Practices for Flex document, on the other hand, does an admirable job of disseminating important information that is useful for developers.

It is also important to note that the accessibility features of the Flex components have been optimized for use with JAWS on Windows and that users will need to install additional JAWS scripts to enable these features. Why aren't these scripts included by default in JAWS?

The best practices document is very useful but I feel that we would benefit for a short, succinct and no bullshit summary to quickly inform developers on the state of accessibility in Flex. Something along the lines of:

The State of Accessibility in Flex

  • Accessibility is not enabled by default for Flex applications (ideally with a note stating: "We will be changing this in the next release.")
  • Accessibility in Flex is optimized for JAWS on Windows. (This is not necessarily a bad thing; better to have great support for one accessibility aid than shoddy support for several.)
  • JAWS users will need to install additional scripts to take advantage of advanced accessibility features.
  • Accessibility is more than adherence to standards and screen-reader support. For a full discussion, read Accessibility Best Practices for Flex.

Finally, bookmark the Accessibility Resource Center on Adobe.com and keep checking back for new articles (and bug Adobe if you don't see any!) :)

Picture this!

In version 1.53, you can now add a photo to your profile at The GAE SWF Project Flex sample (and see other user's profiles).

It was a bitch to get FileReference working as I wanted it to (look ma, no sessions!), but it was well worth the effort. The sample uses an authentication-token based system instead of the less secure hack of tacking the session ID on to the request URL method (yuck!)

The example demostrates File Upload via File Reference, outputting an image via Python/webapp and both sending and returning images as ByteArrays from webapp.

The PhotoCropper component lets you upload photos, crop them, and rotate them. I started building it by expanding on Arpit Mathur's ScrollImage component (thanks, Arpit!) :) It's not complete yet but it is functional. Specifically, I don't like how it zooms and a future update will handle that. If you notice any issues, please do let me know in the comments so I can tackle them.

The updated ScrollImage class includes the following features:

  • Correctly scrolls both zoomed in (<1) and zoomed out (>1) content.
  • Correctly frames scrolled content so that no whitespace shows.
  • Supports the loading of images via the load() method.
  • Applies smoothening to the bitmap when zoomed in/out (not when at 100%).
  • Implements "natural" click and drag scrolling (reversed).
  • Image does not get stuck to the sides when user keeps scrolling after an edge has been reached.
  • Component displays the hand cursor when over the image.
  • Allows rotation of the image.
  • Provides a ByteArray snapshot of the image.

I also made use of Joel Connect's FlexMatrixTransformer class (thanks, Joel!) :)

Remember that The GAE SWF Project is completely open source so you can grab the source code and use it to build your own applications (have fun!)

Getting started is as easy as 1,2,3:

  1. Download Google App Engine and install it.
  2. Download The GAE SWF Project and unzip it.
  3. Navigate to the folder you unzipped it to in Step 2, and start the Development Web Server by typing ./start in Terminal. Go to http://localhost:8080 to see your local version of The GAE SWF Project and start hacking!

(The above instructions are for OS X, please adapt as necessary for your platform.)

The features I'm spiking out and sharing with you in The GAE SWF Project are the ones I'm using to build the web application for the Singularity Web Conference. Expect some updates on that front in the coming days. I am going to release the Singularity app and open ticket sales as soon as the core features are in place.

Also expect some more cool Singularity-related speaker and sponsor updates this week :)

Big news: Flash goes completely open!

The SWF format is now totally open. Rejoice!

This is big: Adobe is removing restrictions on the use of the SWF and FLV/F4V specifications as part of their new Open Screen Project 2008.

When Mark Doherty emailed me to tell me about his post on Adobe's Open Screen Project 2008, I wasn't expecting such an important announcement.

Along with the opening of the SWF format, Adobe has also removed the licensing fees it used to charge for the Flash Player.

What does that mean for us? It means Flash _everywhere_. It means you picked the right platform to develop your skills on. It means Flash will be around for a long, long time! :)

Additionally, Adobe will be publishing the device porting layer APIs for Adobe Flash Player, the Adobe Flash® Cast™ protocol, and the AMF protocol.

This is something that myself and others in the Flash community have been pushing for for a long time and I'm very happy to see that Adobe is finally confident enough in the strength of the Flash Platform to take this step. Bravo!

Update: A random thought: I wonder how much Apple's stance against Flash on iPhone contributed to this. Looking at the members of the Open Screen Project, you see that the major handset manufacturers are all on board. (Or was it Microsoft's mobile Silverlight initiative?)

Further reading:

Adobe has released a video and further information for developers and Ryan Stewart shares his thoughts also.

ASCII Art Doodle

Oh my, I just realized that while I was on the phone to my friend Gilles, I ASCII art doodled in TextMate!

\/\/\/\/\/\/\/\/\/\/\/\/
/                      /
\ .................... \
/ .      ______      . /
\ .        ||        . \
/ .        []        . /
\ .       [[]]       . \
/ .[:|--[[    ]]--|:]. /
\ .       [[]]       . \
/ .        []        . /
\ .        ||        . \
/ .      ------      . /
\ .................... \
/                      /
/\/\/\/\/\/\/\/\/\/\/\/

I normally doodle on paper when on the phone but, AFAIK, this is the first time I did it while using my laptop. Should I be worried? Or have I just reached a new level of geekiness? :)

Shell scripting for fun and profit

Shell scripts are very useful little things. Google App Engine makes deploying apps a single-line affair, but I was still finding myself going through a series of steps when deploying updates to The GAE SWF Project, mostly because I wanted to release the source code as a zip file for download. So, I hacked together a script in bash and now it's a painless process (I could probably have done the same thing using Ant, but I've also been wanting to play with bash scripts for a while now!)

Here it is, in case bits of it help you too:

#!/bin/bash
args=("$@")
if [ -z ${args[0]} -o -z ${args[1]} ]
then
	echo "Usage: update <version_from> <version_to>"
	exit
fi
 
releaseFolder="../releases/The_GAE_SWF_Project_$2"
zipFile="../releases/The_GAE_SWF_Project_$2.zip"
ftpFolder="/public_html/downloads/"
 
echo "THE GAE SWF Project. Updating and deploying from version $1 to $2."
 
if [ $1 != $2 ]
then
	echo "Updating the base template with new version number..."
 
	sed s/$1/$2/ < templates/base.html > templates/temp_base.html
	mv templates/temp_base.html templates/base.html
 
	read -p "Commit version $2 in SVN? [y/(n)] " tag
	if [ $tag == "y" ]
	then
		echo "Commiting the new base template to Subversion..."
		svn commit -m "Updated version numbers in base.html template to $2"
	else
		echo "Skipped commit."
	fi
fi
 
echo "Exporting a clean version of the trunk..."
rm -rf $releaseFolder > /dev/null
svn export -q http://svn1.cvsdude.com/osflash/gaeswf/trunk $releaseFolder
 
# Start the server and bring it up in the browser for testing.
echo "[[[ Please test this version in the browser. Hit Ctrl-C to stop server when ready. ]]]"
$releaseFolder/start
 
read -p "Tag version $2 in SVN? [y/(n)] " tag
if [ $tag == "y" ]
then
	echo "Tagging version $2..."
	svn cp http://svn1.cvsdude.com/osflash/gaeswf/trunk http://svn1.cvsdude.com/osflash/gaeswf/tags/$2 -m "Version $2"
else
	echo "Skipped tagging."
fi 
 
read -p "Ready to deploy? [y, (n)] " deploy
if [ $deploy == "y" ]
then
	echo "Zipping the source code..."
	rm $zipFile > /dev/null
	zip -rq $zipFile $releaseFolder
 
	# SFTP the source file to my blog.
	# Uses an expect script to achieve this.
	./ftpsource $2
 
	# Deploy the app to Google App Engine
	appcfg.py update .
else
	echo "Skipped deployment."
fi
 
# Open the remote site in Firefox.
open -a firefox http://gaeswf.appspot.com
 
echo "Version $2 successfully deployed."

I use a separate expect script to FTP the source zip file to aralbalkan.com:

#!/usr/bin/expect
 
set version [lrange $argv 0 0]
 
spawn sftp me@mydomain
expect "password:"
send "******\n";
expect "sftp>"
send "put ../releases/The_GAE_SWF_Project_$version.zip path/to/downloads/ \r"
expect "sftp>"
send "quit \r"

Expect is a very cool way to script interactive instances (and yeah, I didn't want to mess with SSH!)

Down and dirty scripting can be a liberating and useful experience sometimes :)

Alternativa3D

Wow!






Bad Behavior has blocked 0 access attempts in the last 7 days.