Sending byteArray (image) and variables to server-side script as POST data in AS3
Posted by zedia.net in ActionScript 3 on July 21st, 2010
A couple things here, I first talked about how to send an image and variables to the server (at the same time) on this post, but it felt a bit weird, the file had no name to retrieve it and the variables were sent as GET. Now while working a with a new colleague, he showed me this code that for him was nothing but for me was amazing. It is a little library called UploadPostHelper made by Jonathan Marston back in 2007 (2007! why didn’t someone talk to me about this library before!!!).
Anyway here is a little code snippet showing how to use it:
var jpegEncoder:JPGEncoder = new JPGEncoder(85); //using the JPGEncoder from as3corelib var jpegBytes:ByteArray = jpegEncoder.encode(myPicture.bitmapData); //encoding a Bitmap into a ByteArray var urlRequest : URLRequest = new URLRequest(); urlRequest.url = "THE URL OF YOUR SERVER SIDE SCRIPT"; urlRequest.contentType = 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary(); urlRequest.method = URLRequestMethod.POST; //now create an object with the variables you want to send as POST var postVariables:Object = {variable1Name:variable1Data, variable21Name:variable2Data, variable3Name:variable3Data} urlRequest.data = UploadPostHelper.getPostData( 'image.jpg', jpegBytes,"filedata", postVariables); //here is where the magic happens, filedata will be the name to retrieve the file urlRequest.requestHeaders.push( new URLRequestHeader( 'Cache-Control', 'no-cache' ) ); //from here it is just a normal URLLoader _pictureUploader = new URLLoader(); _pictureUploader.dataFormat = URLLoaderDataFormat.BINARY; _pictureUploader.addEventListener( Event.COMPLETE, _onUploadComplete, false, 0, true ); _pictureUploader.load( urlRequest );
How easy and beautiful is that?
So can get the code for the UploadPostHelper at the bottom of this post or I have made a zip file with the .as file here.
Dude, 2007!
Facebook, the Open Graph and OAuth 2.0
So after playing with Twitter OAuth, I played with Yahoo!’s and now Facebook. So seems like OAuth is the new cool kid in town.
Using the OAuth AS3 library
When you are dealing with OAuth 1.0 (Twitter, Yahoo!), there is this pretty nifty library for ActionScript 3 simply called oauth-as3. There is not much documentation on how to use it but if found this pretty good example for using it in conjunction with AIR. The user flow is a bit different when you are integrating OAuth in a website so you have to tweak it a bit, but in the end it, does the heavy lifting for you. The things you have to consider for a website, is that the user has to go, in some way, to the website of the API you are going to be using to authenticate (input his user name and password) and to authorize(say that your application has the right to access the user’s data) your application. That is the part that always bugged me about OAuth, it kinda get the user out of your experience. I gave it a lot of thoughts and I really liked the Facebook Connect way (at some point in time) where it was using an iFrame pop-in. That was the neatest because you didn’t have to care about the Pop-Up blockers and it looked pretty good. The thing is, it kinda defeat the purpose of OAuth. Since in an iFrame pop-in you don’t see the url in a location bar (as opposed to a full fledged pop-up), you could basically reproduce graphically the interface of whatever service you are using and just steal the usernames and password. That is why you have to rely on Javascript and pop-ups. This part of the user flow is not covered in the oauth-as3 library because it is not ActionScript.
While playing with Yahoo!’s OAuth and Facebook’s, I kinda merged two ways of managing the Javascript part. Yahoo! provided code that was pretty good at creating the pop-up but it wasn’t that great at getting back the information from the service. So I edited it and I think I ended up with something that is pretty solid. Here is my Javascript file and my callback page.
Also, the oauth-as3 library is relying on the class mx.utils.UIDUtil to generate a unique identifier as a parameter for one of the request. As you can see from the mx prefix, this requires that you compile the Flex framework with your project. Which is kinda a bummer since it is the only dependency to Flex. I found this class on the RGBBlog that provide the same functionality but without requiring Flex. I had to tweak it a bit because it is not really made as a library (it doesn’t have a package and extends Sprite) and I have made it available for download here.
Facebook and OAuth 2.0
So during April 2010, Facebook announced the Open Graph and with it a whole new API but also a new way to authenticate and authorize. It was to use OAuth 2.0, which is a version of OAuth that is still a draft. Well all we learned before (OAuth 1.0) kinda doesn’t work here anymore. But OAuth 2.0 is a bit simpler, supposedly requires less exchanges. This is all cool and all, but Facebook sticks to its guns and provide shitty documentation about the process; well half shitty, they provide good documentation for half of the process but for the other part it is as if the guy was tired of writing documentation and wrapped it up very quickly, leaving us without enough clear information to implement it.
Anyway, it all good, this guy, Jozef Chúťka, figured it all up. His code is pretty good and the example gives you everything you need to get started. The only part that I don’t like is how he manages the pop-up (he writes the Javascript inside of the ActionScript, I don’t know it doesn’t feel right, plus it doesn’t manage placement of the pop-up (x and y)), so I used the same as before. But his callback html page was pretty good. So basically when you have your access token you can call any of the Open Graph API urls and it will work. You have to be careful, for some of the urls that returns images, Facebook does a redirect, so you might have to deal with some cross domain issues. Here is how I resolved mine.
//This makes sure that the crossdomain policy is read and you can access the profile picture Security.loadPolicyFile("http://profile.ak.fbcdn.net/crossdomain.xml");
Also know that if you add that line of code twice, you are going to crash the Flash Player. For this library to work your application in Facebook must absolutely be set as a desktop application.
So that pretty much sums up what I have been doing with OAuth.
Playing with OAuth and twitteroauth
As some of you might know, on August 16th 2010 (it was June 30th at first, but they moved it because of the World cup), Twitter will be shutting down its basic authorization in favor of OAuth. Well Facebook also announced that they would be soon using OAuth. Google and Yahoo! use it too. Looks like it is a good time to learn it.
OAuth, contrary to what some might say is not that easy of a process. It involves a couple more steps than basic authorization. But what it gains from that is trust. The user never has to enter its username and password on your site. My problem with it is that I find that it breaks the user experience because it usually redirects the user’s browser to the website of which you want to use the API, so that the user can input its credentials and that they can allow your application to use data from the API. If you are not familiar with OAuth, here is a great beginner’s guide.
Here is a picture of all the steps involved in the process:
Now what I wanted to write about was the twitteroauth library for PHP by @abraham. I tried to try the other OAuth PHP library that is listed in the Twitter documentation but I couldn’t figure out anything; they talk about Two-Legged OAuth and Three-Legged OAuth, but I have never seen that anywhere. twitteroauth on the other hand is pretty simple to understand. By reading the documentation and starting with the example provided in the source code, I was able to implement what I wanted.
Now I wasn’t the one who created the application on Twitter (which you have to do before you get started with code), so there was a couple of settings that weren’t right at first. You can set if you want your application to be Read-only or Read & Write. Obviously if you want to send Tweets using your application, you will need it to be set to Read & Write. Also in order to use this library you must set your application as a Browser application (as opposed to Client which will not work). I just thought it would be good to list those here so that others (and I) don’t spend the half hour I lost trying to figure this out.
Here is another really interesting tidbit: once you create an authorization token, Twitter will never destroy it. This is not the same for all APIs (I know Yahoo! will expire the token after some time). So once you lead the user through all of the OAuth steps, you can keep the token and use it forever so that the user don’t have to go through the steps again, which is very useful for mobile and desktop apps. It also opens up possibilities for other stuff too, which I will show you eventually, if my current project ever finishes.
Well that is is for now, there will be more on OAuth soon as my next project also connect to another API that uses OAuth.
Drawing Bezier tool using Robotlegs
Posted by zedia.net in ActionScript 3 on June 17th, 2010
I came back from FITC Toronto with a lot of ideas for new posts and this is the last one of them. But fear not this is a first article in what will probably be a serie of 3 because it would otherwise be too long (or I wouldn’t have the patience to write it). So while at FITC, I went to a presentation be the guys at Firstborn about how they were often making tools instead of doing things by brute force. Well the idea stuck with me.
In the current project that I am working on, there was a part where I needed the coordinates of points along a path. The brute force way was to estimate the next point myself and to compile to see if I was right, repeat until I had all the coordinates I needed. Very tedious and boring task and the path could change often so there was high chances that I would redo this process often. What better time to start making a tool! Well it turn out that my project changed so much that that part wasn’t in it anymore… But it still makes a great topic for this blog.
Let me start by showing you what will be the result of this first post. (Below is not juste whitespace, click in it to ad points. You can select a path to make a control point appear, drag the control point to make a curve).
As you can see this is pretty bare bone. But the good thing about that is that you can use this as the base of multiple tools.
I built this using Robotlegs. If I am going to build something for myself, might as well learn (or train) a few things on the way. Plus, I think Robotlegs is very well suited for application style projects. Now that being said, using that kind of framework (MVC) will require you to create a lot of extra classes but in the end you will understand what you gain by doing so. Out of all these, 4 of them are really important. The Model, where you will keep all information on paths and points at all time and three View classes; one for the clickable area layer, one for the paths layer and one for the point layer.
The easiest of all of them is the clickable are layer. It’s job is just to register clicks and tell the framework where something has been clicked. This could have been done otherwise, but since we will want to layer stuff (points are over paths) plus we will want to select points and path to move or curve them, it is just easier to create a view just to register clicks on the unused stage and put that view in the back off our application.
package com.zedia.drawingtool.view.components { import com.zedia.drawingtool.events.PointEvent; import com.zedia.drawingtool.model.objects.PointObject; import flash.display.Sprite; import flash.events.MouseEvent; /** * @author dominicg */ public class DrawingArea extends Sprite { public var pointArray:Array; private var _pathArray:Array; public function DrawingArea() { graphics.beginFill(0xffffff); graphics.drawRect(0, 0, 550, 400); graphics.endFill(); addEventListener(MouseEvent.MOUSE_DOWN, _onMouseClick, false, 0, true); } private function _onMouseClick(event : MouseEvent) : void { dispatchEvent(new PointEvent(PointEvent.ADD_POINT, new PointObject(event.stageX, event.stageY))); } } }
Our second view is the one that handles the points. Points are simple visual objects, they are just circles placed at a x and y coordinate. So when the user clicks on the clickable layer, the point view is notified and a circle is added where the click was registered. Another functionality that is added is that you can drag a point to move it around the stage. One thing to notice is that whenever a point is moved, it tells the framework about it so that the Model is always up to date and so that the path layer can display the paths correctly.
package com.zedia.drawingtool.view.components { import com.zedia.drawingtool.events.PointEvent; import com.zedia.drawingtool.model.objects.PointObject; import flash.display.Sprite; import flash.events.Event; /** * @author dominicg */ public class PointLayer extends Sprite { private var _pointVector:Vector.<PathPoint>; public function PointLayer() { _pointVector = new Vector.<PathPoint>(); } public function addPoint(point:PointObject):void{ var pathPoint:PathPoint = new PathPoint(); pathPoint.addEventListener(PointEvent.POINT_MOVED, _onPointMoved, false, 0, true); pathPoint.x = point.x; pathPoint.y = point.y; addChild(pathPoint); _pointVector.push(pathPoint); } private function _onPointMoved(event:Event) : void { dispatchEvent(new PointEvent(PointEvent.POINT_MOVED, new PointObject(PathPoint(event.target).x, PathPoint(event.target).y, _pointVector.indexOf(PathPoint(event.target))))); } } }
Now this is the last of the view class: the PathLayer. It is also the most complicated of the three view classes because a path is a complex object. It is comprised of a start point, an end point and a control point. With those you can draw a curve using the curveTo method from the AS3 drawing API. Here is the code:
package com.zedia.drawingtool.view.components { import com.zedia.drawingtool.events.PathEvent; import com.zedia.drawingtool.model.objects.PointObject; import com.zedia.drawingtool.model.objects.PathObject; import flash.display.Sprite; import flash.events.Event; /** * @author dominicg */ public class PathLayer extends Sprite { private var _pathVector:Vector.<Path>; private var _selected:int = -1; public function PathLayer() { _pathVector = new Vector.<Path>(); } public function addPath(pathObject:PathObject):void{ var path:Path = new Path(pathObject.firstPoint, pathObject.secondPoint, pathObject.controlPoint); path.addEventListener(PathEvent.PATH_CLICKED, _onPathClicked, false, 0, true); path.addEventListener(PathEvent.CONTROL_POINT_MOVED, _onControlPointMoved, false, 0, true); addChild(path); _pathVector.push(path); } private function _onControlPointMoved(event : Event) : void { dispatchEvent(new PathEvent(PathEvent.CONTROL_POINT_MOVED, new PathObject(new PointObject(0,0,0), new PointObject(0,0,0), _pathVector.indexOf(Path(event.target)), Path(event.target).controlPoint))); } private function _onPathClicked(event : Event) : void { if (_selected > -1){ _pathVector[_selected].deselect(); } _selected = _pathVector.indexOf(Path(event.target)); } public function updatePaths(updatedPathVector : Vector.<PathObject>) : void { for (var i : int = 0; i < updatedPathVector.length; i++) { _pathVector[updatedPathVector[i].id].update(updatedPathVector[i]); } } public function deselectAll():void{ if (_selected > -1){ _pathVector[_selected].deselect(); _selected = -1; } } } }
You will find more information about paths in the Path class inside the view folder.
Finally the last important class is the Model. This is where you keep information about the state of the application. With the information stored in the Model you can recreate exactly how the application is right now, which is really practical if you want to save the state to a file or export data. As you will see, it is mostly saving a data representation of visual objects in our views (points and paths).
package com.zedia.drawingtool.model { import com.zedia.drawingtool.events.PathEvent; import com.zedia.drawingtool.events.PointEvent; import com.zedia.drawingtool.events.PathVectorEvent; import com.zedia.drawingtool.model.objects.PathObject; import com.zedia.drawingtool.model.objects.PointObject; import org.robotlegs.mvcs.Actor; import flash.geom.Point; /** * @author dominicg */ public class DrawingModel extends Actor { private var _pointVector:Vector.<PointObject>; private var _pathVector:Vector.<PathObject>; public function DrawingModel() { _pointVector = new Vector.<PointObject>(); _pathVector = new Vector.<PathObject>(); } public function addPoint(point:PointObject):void{ point.id = _pointVector.length; _pointVector.push(point); dispatch(new PointEvent(PointEvent.ADD_POINT_APPROVED, point)); var pointLength : int = _pointVector.length; if (_pointVector.length > 1) { var controlPoint:Point = new Point((_pointVector[pointLength - 1].x - _pointVector[pointLength - 2].x)/2, (_pointVector[pointLength - 1].y- _pointVector[pointLength - 2].y)/2); _pathVector.push(new PathObject(_pointVector[pointLength - 2], _pointVector[pointLength - 1], _pathVector.length, controlPoint)); dispatch(new PathEvent(PathEvent.ADD_PATH_APPROVED, _pathVector[_pathVector.length -1])); } } public function updatePoint(point : PointObject) : void { trace (point.id); _pointVector[point.id].x = point.x; _pointVector[point.id].y = point.y; //Update paths now var resultingPathVector:Vector.<PathObject> = new Vector.<PathObject>(); if (point.id == 0) { _pathVector[point.id].firstPoint = point; resultingPathVector.push(_pathVector[point.id]); } else if (point.id == _pointVector.length - 1){ _pathVector[point.id - 1].secondPoint = point; resultingPathVector.push(_pathVector[point.id - 1]); } else { _pathVector[point.id].firstPoint = point; resultingPathVector.push(_pathVector[point.id]); _pathVector[point.id - 1].secondPoint = point; resultingPathVector.push(_pathVector[point.id - 1]); } dispatch(new PathVectorEvent(PathVectorEvent.UPDATE_PATHS, resultingPathVector)); } public function updateControlPoint(path : PathObject) : void { _pathVector[path.id].controlPoint = path.controlPoint; } } }
Well that is it for now. You can download the source code below and see the classes that I didn’t talk about. This is all good but this tool right now just draw paths but it doesn’t transform or export the data in any way. This will be the topic of a next post.
I am Flash Developer
This isn’t the next article I wanted to write but it was on my list since Flash In The Can Toronto (2010). It comes from all the talks surrounding the refusal from Apple to let Flash on the iPad ( i guess we can just say iOs now). During that period a lot off people (including me) where uncertain about their future. I mean when someone as powerful as Steve Jobs tells you that your job shouldn’t exist, you think about it twice. Out of the turmoil that ensued, some voices touched me more than others. What they were saying is that they, as developers, weren’t tied to a technology and that if Flash was to disappear tomorrow, they would still have a job. That got me to think. A lot. The next thing that affected me was something I heard at FITC concerning designers. How they don’t call themselves ’Photoshop Designers’ or ‘Corel Draw Designer’ (I tried to think of another product than Adobe but just could come up with Corel Draw (who uses that anyway), but you get the idea). I think this follows a bit the same vibe as the comments from the Flash dudes.
All of this feed my reflexions, I mean I have tried a lot of technologies (all things in perspective, I am still at the start of my career, so I humbly say so). I have tried Java, PHP, MySQL, C, Flash, ActionScript 2 and 3, HTML/JavaScript/Css, Ajax, Asp, C#, Python. And you know what? There is nothing I like better than doing ActionScript 3. I mean the tools help a lot; FDT (yes I said it, I now like FDT) or FlashDevelop for code and Flash CS5 for visual assets. I like the workflow, I like making PSDs alive, I really like using TweenLite to make stuff move, I like figuring out how to build my applications so that they minimize load time and CPU usage (I also like maximizing CPU but don’t tell HTML5 fanatics, they know jack shit about pushing limits, yet, but they will know what I mean when they taste it, which will happen for sure). All of that I can’t get from any other technology to the extent that Flash does it right now.
It’s been 2 months that I am at B-Reel right now. I really love it, but the project that I am doing right now mostly doesn’t involve Flash ( I managed to stick a bit of Robotlegs in there) and is mainly Javascript/Html/Css. I really look forward to doing a Flash project. I really don’t want to do html ever again. I don’t have fun doing it (well I am just speaking about the technology, the project itself is amazing). Also, I feel the world of Flash is so deep and there is so much you can do to get better that if you learn all of the other technologies you can never get truly as good on the Flash Platform as one could be. For all of these reasons, that is why I am Flash Developer, that is my title and I am not ashamed or feel diminished by it. It really defines me.
With that being said, it gives me security. I think I am not alone in this situation. I think Flash gives a mean to express themselves to a lot of people and because of that, you can be sure that these people will produce tons of cool shit with it. And other people will want to see that cool shit. That gives a reason for Flash to be. Someday there will be Flash on the iOs. You can be sure of that (I mean Steve Jobs has an expiration date, right?)
Realisation from Flash and the City
First, I want to say that Flash and the City was a very well organized conference. Sure it isn’t as perfect as FITC (I know it does no justice to compare a 10 years old conference to a new one, but it’s the only other conference I have been to) but it was nonetheless amazing for a first year and we have Elad Elrom and his team to thank for that.

Flash and the City
What I think they can improve on next year is the venue; the 3 legged dog was too small to hold this kind of event. I would suggest changing for a new place. What I really liked: that the speakers where different from the speakers on the other conferences roasters (seems like it’s all the same people speaking from conferences to conferences) so I got to see people I had not seen yet.
The realisation
I consider myself a developer and FATC was really more aimed towards developers, so I should have been very happy there. The thing is, I wasn’t; it didn’t have the same impact as FITC did on me, which is weird. I don’t know, maybe it is because I follow a lot what is happening in the Flash community and I am well informed on the new possibilities the platform has technically. Because of that, the presentations didn’t marvel me as much as a creative presentations where everything is mostly new. Maybe I am not so much a developer after all.
Best of show
Anyway there was still some presentations that I found really amazing. The best one that I saw really was Gaia Flash Framework by Jesse Warden. He spoke about using Gaia and Robotlegs together. I mostly knew what he was speaking about but it still was awesome. I wish I could see it again in slow motion because there are so many words that come out of Jesse’s mouth. What is the major point of interest is Jesse’s views on the industry and the way he express them. If you get the chance to see him speak don’t miss it. Well, he started doing some video capsules, so you should go watch those. I used to make the new guys watch them when they had nothing to do (when is the next one coming out Mr Warden? I want more!). Aside from this Jesse, it was also good to see that Jesse Freeman is a very well spoken, nice , intelligent and professional dude. It clashes from his Twitter personality where all he does is wine about Adobe (well he seems to like Adobe now that he is working with Flash on Android). I really enjoy his articles on InsideRIA but sometimes I want to unfollow him on Twitter because all his bitchin is impacting on my moral. It was nice to see him in person, it gives me a new (good) perspective on the guy. Also another interesting thing I learned was that searching for Flash Bum (Jesse’s username on Twitter is theflashbum) on Google images yields unexpected results.
All in all it was a great week-end, I wish good luck to the Flash and the City team for next year.
Starting out with Alchemy (on a Mac)
Posted by zedia.net in ActionScript 3 on May 13th, 2010
So I’m a PC that now works on a Mac. It’s not my choice, but I went along with it to experience the Mac side of things. I don’t hate it, but I don’t like it that much either. That being said, it means that I am a complete noob user. For the past 2 days, I have been trying to make Alchemy work (compiler that let’s you compile C and C++ libraries to a SWC that can be used in Flash) and it wasn’t all that easy.
First I’m going to point you to two articles on how to setup Alchemy. The first one can be found on Adobe Labs and has a detailed list of steps to complete in order to make Alchemy works. The second one is from zaalabs and it gives further information to get it done.
Now, even with those articles I had a lot of trouble to get it to work, mostly because I don’t know a lot about command line stuff. The first thing that confused me was the mention of a bash / shell / terminal interchangeably. Now, I know there is a difference between all of those, but in this case they all mean the terminal. You can access the terminal by going to Applications and inside the Utilities folder you’ll find the terminal.
The second thing that I didn’t understand was how to add something to the system path. This is also referred later on as adding to your paths. This means editing a file that will put a certain path to be handled like a system path so that you can access whatever is in that folder from any directory. To do so you have to edit a certain file named .profile. The problem that I had was that looking around the interweb for adding to the system path I found that I had to edit a file named .bash_profile. Well it turns out that both works but you just need one of those, if you put some info in one and some info in the other, just one of the file is going to be used so it won’t work. Just use .profile as mentioned in Adobe doc. Now that file is a hidden file (it starts with a “.”) and to see if it exist, in terminal, you must, right after you open it, write “ls -a”, the -a option will show you file that starts with a “.”. If the file .profile doesn’t exist you can create it using an editor like pico by writing “pico .profile”, writing what you need in it and saving the file. Just to help out, here is what my .profile file looks like after I have completed all the steps:
source /Users/dominicg/library/Alchemy/alchemy-setup PATH=$PATH:/Users/dominicg/Flex3/bin:/Users/dominicg/library/Alchemy/achacks export PATH
Last note to be sure everything works, you need to use the Flex SDK 3.2 and no other version. That particular SDK can be found here.
Well I hope this will help some of you. I pretty much shifted focus from Alchemy since I started writing this article, but I am sure I will get back to it at some point.
FITC Toronto 2010 Recap
Ya what happens when I drink coffee at 3 in the afternoon? Well yeah, I can’t sleep; so at least I will do something positive with my time. FITC Toronto 2010 ended last week and I was pretty busy there as I was covering the conference for Applied Arts. I wrote 3 summaries for them (1, 2, 3) but these were mostly just recaps. What I want to do here is to write what I got out of this year festival.
Storytelling and the attention to details
One thing that stood out was the importance of storytelling. From North Kingdom putting stories even in their preloaders to Alex McDowell that writes an entire biography for a house in Fight Club, storytelling should be at the hearth of everything we do. Which bring me to the other point: attention to details. No elements in a production should be there for nothing, everything should have a purpose, a story. At no point in a project should you start rounding corners, if you do, it will show up in the finished product. It is hard when you are working on it, but you should keep this in mind, stay focused.
Making your tools
There was supposed to be a presentation by the president of firstborn Dan LaCivita, but unfortunately he couldn’t make it to the conference. So instead we got Mathieu Badimon (creator of FIVe3D) and Eric Decker showing how, when they encountered repetitive tasks in projects, they would build tools to help them. That advantages for doing this are pretty obvious; if the client wants to change something, you just make the change in the tool and reexport the data, plus you learn a ton while building the tool. These tools ranged from handwriting animation font creators to character path tools. Those tools where amazing and we saw that they reused some parts from tool to tool (like path drawing). This was a common thing through out the conference. People were making tools that would export them usable assets for the Flash projects. So I thought this isn’t a bad idea, the next time I encounter a problem that has repetitive task to it, instead of solving it by brute force, I am going to build a tool for it.
Best of show
I couldn’t do a recap without speaking about the best presentations I have seen. Jason Theodor and is talk about Creativity and Chaos was really inspiring and was the best I have seen this year. He generously gives his slides on slideshare, so I suggest you see them, it won’t be as good as seeing him talk but it is still pretty good. Jared Ficklin also gave a great presentation; he is a great entertainer and his curiosity is contagious. Finally I really enjoyed the Brendan Dawes’ talk about the grammar of interaction design.
A little extra
Last year I stopped by the booth of the creative group and took a leaflet to be well surprised by the quality of it. The best part of it was that it was a salary guide and it covered most of the employes of a digital agency. So this year, I went to the booth wanting my updated salary guide for 2010 and it took the form of a calendar. While browsing through it, I saw that they went a step further this year by making an online tool (click salary calculator on the right) where you can enter your fonction and where you live and it will give you a salary range. I think this is pretty awesome and very useful. I just moved to New York from Montreal and had no idea a all what salary I should ask; I would have killed to have this tool like at that moment. So now you know, go check if you are paid enough.
It was the third year that I went to that conference and as the last years I came back from it fully motivated and with plenty of new ideas for blog post. Stay tuned for more
My article about FITC day one on Applied Arts
Hey, this is just to tell you that I will be doing recap of the Flash In The Can conference on Applied Arts. Here is my recap for day number one, there is going to be one for day 2 and 3 also; I’ll keep a general recap for my blog. Also, wish me luck for tomorrow for I am in nomination for Best Canadian Developer Website for this blog and I really want to win (well it would be awesome). Good night!






