I hereby decree

by David LeMieux

 

I think I finally figured it out. Based on the way I manage my friends/followers I have this weird dichotomy going on with Twitter and Facebook. Twitter is all the people I like to keep tabs on but we never say anything useful. Facebook is all the people I feel obligated to connect with but am mostly uninterested in.

Now, if I could get all my Twitter friends to be my Facebook friends and then have real, meaningful social conversations we would be on to something.

 

Comments (View)

 

I hereby decree that the following rules shall be in effect immediately.


  • If you want to be a tough guy with a questionable past you have to carry a worn picture of your family or offspring.

  • "Hot" girls will no longer carry their lunches in Victoria Secret bags. (inspired by Penston)

  • Or get your degree shall be the last item on every bulleted list.

 

Comments (View)

 

E.ggTimer in the Palm Pre Browser
The WebOS Browser is surprisingly compliant.

Over the weekend I made a port of the basic functionality of E.ggTimer from Flash to HTML5. By basic I mean that things like titles and sequences are still missing, though I intend to add those soon, for full parity. And when I say HTML5 I really mean that I used the HTML5 doctype and new, proposed tags. Specifically, I used the canvas tag and the audio tag. I also used some new CSS and JavaScript features.

The End Result
In the end, it works pretty well on desktop browsers as well as on the iPhone, iPad, Android, and WebOS browsers with some interesting differences. As far as I can tell, the beep sound at the end only really works on the Pre, so props to Palm for supporting audio. You can try it out here: http://e.ggtimer.com/m/3min.

Next, while Safari supports Workers, you can currently only post messages as Strings. When I first implemented the Worker to do the date calculation I was passing objects. Since I got lazy and didn't want to refactor my code I just disabled the Workers for Safari.

As I tried the new code out on various devices I came to realize that the ability to leave the timer running in the background (WebOS, Android) really made it a nice feature. It works on the "i" devices, but you have to leave it open. A native app would take care of that, but I am hoping that in some future update the browser will be able to run in the background (and have sound).

For now, if you hit E.ggTimer (or the new domain, C.ountDown.com, and start a timer you will be redirected to the HTML5 code if you are using a mobile device. If for some reason you just hate Flash you can use the "/m" site and be Flash Free(tm). On the desktop it works best in Google Chrome.

Conclusion
The transition from Flash to HTML5 was pretty straight forward and I believe that those Flash developers that can stop worrying and actually play around with the new stuff will quickly find it suites them well. It isn't an end-all, be-all solution and it has a long way to go before we have full cross-browser interoperability, but it is pretty slick. I come away less stressed about the whole ordeal.

I also removed the affiliate banner stuff since it was performing poorly. I replaced it with a nice update section and a small donate button. Cheers.

 

Comments (View)

 

Exectute Section 3.3.1
The Emperor is not pleased.

Inspired by @gpenston's tweet.

 

Comments (View)

 

This is a re-post of a guest blog entry I did for Widgetbox

When Apple, Inc. announced that the iPad would not support Adobe's Flash Player, the developer community began to talk. The debate about Flash as a web technology is not new, but the decreasing amount of support for Flash-enabled websites on mobile devices has made the issue more prominent.

When talking about the lack of Flash support on devices like the iPhone, iPod Touch, and the iPad, people are generally talking about Flash Player, the runtime piece of the Flash Platform. As more people start using internet-capable mobile devices, fewer people are able to consume Flash content on the web. At its peak, Flash enjoyed a 98% market penetration. Now some websites are reporting that the number of Flash-enabled browsers visiting has dropped to as low as 88%. Websites that are built entirely in Flash are now at a disadvantage when it comes to the mobile web.

There are other technologies that are also called by the name "Flash." The Flash authoring environment (e.g. Flash CS4) is the tool created and sold by Adobe that enables development for Flash Player. Flash Video (flv) is a file format used to deliver video through Flash Player. High profile video websites like YouTube and Hulu depend on Flash Video. Its ubiquitous nature means that it is simple to deploy video to a wide range of users using different Internet browsers and computer operating systems. Flash also comes with a built in protection system, making it harder for people to pirate the video they are watching. Web video is possible today because of Flash. That said, there are some drawbacks. Flash Video is a proprietary format made by Adobe. You can only use Flash Video in Flash Player. That means that nearly all the video on the Internet is controlled by one company.

Flash also has performance issues. While it claims to be interoperable between different systems, there are some noted differences. Flash Player on OS X based machines performs slower and takes more processing power than its Windows counterpart. New technologies, like HTML5 are helping to combat this issue and remove our dependency on Flash for video. HTML5 video will be less processor intensive. It will also make video a native part of the web instead of an optional, separately-installed plug-in. For now though, the major browser vendors haven't decided on what the default video format should be. This indecision essentially removes any interoperability that would otherwise be inherent. Format wars notwithstanding, look for HTML5 and the new "video" tag to soon start replacing Flash as the go-to video solution.

But Flash Player can do more than play video. Video is at the heart of the discussion, but other features like animation, hardware acceleration, and device access have made Flash what it is today. HTML5, even when combined with the web programming language JavaScript, does not currently have such an advanced feature set. JavaScript and ActionScript (the Flash programming language) share a common ancestor, ECMAScript. Unlike ActionScript, however, JavaScript has not been seriously updated in a long time. JavaScript is periodically updated, but those updates are not all supported in every browser, again taking away the interoperability.

In conclusion—Flash is not dead. It may be past its prime, but until browser makers and the web developer community can form a more-solid set of features and standards and get nearly ubiquitous market penetration, Flash will still be around. Flash Video will be the first to go, unless media companies don't see HTML5 video as a safe (i.e. pirate proof) solution. Flash as a development platform may never die. Adobe is already broadening the platform's reach with products like AIR which will make it possible to use the Flash authoring tool to create application for the iPhone and Nexus devices. Flash Player 10.1 will be available on a large set of mobile devices. As long as developers use the right tools for the job (i.e. don't make a 100% Flash website) and follow best practices it won't matter what technologies are around. That said, if you are Flash developer and you've never heard of HTML5 you may want to start looking in to it, right now.

 

Comments (View)

 

The current HTML5 working spec gives the script tag some interesting new attributes. The first is "defer" which tells the browser to wait until the page is ready to run the script. The second is "async" which tells the browser to, when possible, run the script without blocking, or asynchronously. While the benefits of using "defer" may be more-readily perceived, asynchronous JavaScript is a little harder to grasp.

To implement the async attribute, you must add is as an empty string or with the value "async". Even though it is a boolean attribute, the value "true" is not accepted, though different browsers may be kind in that regard. The async attribute can only be used when the "src" attribute is also being used. Inline JavaScript cannot be asynchronous. A script tag with async turned on would look like this:

<script src="code.js" async></script>
or
<script src="code.js" async="async"></script>

The same implementation is used for "defer".

You should not use document.write in your asynchronous JavaScript. Because the browser does not block, and because you cannot be sure the DOM is complete, doing so may break or completely remove the DOM.

To see async in action you need a modern browser. Firefox 3.6 will do the trick.

I have put together a couple of examples on using the async attribute and decided it would be best to demonstrate them in video. The following video shows the script running in regular, blocking mode, and then with async turned on. I am using Firebug to dramatize the difference.


Sorry for the bad audio quality.

So, what if you still need to do document.write? Well, you can use a regular JavaScript call to insert whatever you need on to the page, then add a script tag to the head with the async attribute to act upon the items you have inserted. In this way you can have a lightweight script that ads a few small things to the DOM, then the browser can load the async script and run it as it will.

Some things to note:
1) If loading JavaScript asynchronously, you may need to be sure that you don't have code elsewhere that depends on that script being loaded. It may not always load before you need it.

2) Currently it seems as though it will load multiple JavaScript files asynchronously, but in order. Some have reported that as currently implemented that is not the case. It may depend on the browser, so again beware if you have multiple files that rely on a shared library.

This change will most likely be beneficial for things like ads or widgets that have self-contained scripts that run on the page. That way the ad and widget code won't block the rest of the site if it is slow to load.

Here is the code used in my video demo:
http://www.lemieuxster.com/dev/js/asyncTest.html
http://www.lemieuxster.com/dev/js/asyncTest2.html
http://www.lemieuxster.com/dev/js/asyncTest.js
http://www.lemieuxster.com/dev/js/contentInsert.js

On a semi-related note, I recently finished JavaScript: The Good Parts and I recommend it to anyone that does any amount of JavaScript coding. Especially if you are like me and have learned JavaScript through mostly trial and error. It lays down a solid foundation upon which to build JavaScript expertise. It is not a book for beginners, but it does cover the fundamentals.

 

Comments (View)

 

Widgetbox, my current employer (full disclosure), recently introduced a slick mobile site builder. It works much like our popular Blidget product. You take Internet feeds and other content sources and include them in to a mobile-compatible web site. It literally takes minutes to get a basic site up and running and it works really well. My hats off to the team at Widgetbox that put it all together. I got to help a little, but I have been working on another project.

One really nice feature of the mobile site is that Widgetbox gives you a JavaScript snippet to put on your normal site that will redirect mobile users to your new mobile site. I put a mobile site together for myself and now whenever you visit this site or my portfolio from a mobile phone (iPhone, Android 2.0, or webOS) you will see my mobile site. For those of you on a non-mobile computer, it looks a lot like this:

David LeMieux Mobile Site
This Is Huge!

You can also go take a look at http://m.wbx.me/lemieux if you use Safari or Chrome.

As I stated before, in a parenthetical, the mobile sites currently work best on the iPhone and Android 2.0+ phones. The sites work decently on webOS phones, but the webOS browser isn't as feature rich. webOS 1.4 did improve things quite a bit, however.

For those interested in the technology we are using, it is mostly based on JQTouch though I know the team made some enhancements and other changes.

I encourage anyone interested to give it a try. Especially since having a mobile presence is becoming increasingly important.

 

Comments (View)

 

Let X equal the amount of time since an event, E, has occurred. Let Op equal the predicted occurrences of E over the lifespan of the event's perpetrator measured in time, L, and let Ok equal the known occurrences of E.

The probability of E increases as X increases according to:

P(E) = (X(Op - Ok))/L

*thanks to Steve Astle for the inspiration.
**this is also known as the Gambler's Fallacy
***I love The Onion

 

Comments (View)

 

I added a not-so-subtle Amazon affiliate link to E.ggTimer. Why? Ever since closing up shop at WidgetNest my web projects have been a drain on resources instead of self sustaining. Also, I really want a new bicycle (my old bike was stolen).

The last time I tried something like this I got about $20 over a two year span. We'll see how well it works out this time.

I had intended to use Google AdSense but they didn't think my site was cool enough. Actually, at first my account was stuck in some never-ending black hole of not being able to sign up because I already had an account, but not being able to use my account because I hadn't actually signed up. When that was finally resolved I applied and got denied. The official reason is because E.ggTimer "looks like it is under construction." I took that as meaning they couldn't find any content that would be relevant to advertise against. I don't blame them. It really is just a utility site, so there isn't much there in the way of content.

As far as making my sites self-sustaining goes, I at least have the luxury of being able to afford decent web hosting. That said, why not strive to have a product that can keep itself afloat? If I can break even I'll consider it a success.

 

Comments (View)

 

If you have any interest at all in the current "Is Flash Dead?" debate (http://isflashdead.com) then you might want to read the following:


That is all, for now. While I wrap my whole head around this one thing definitely sticks out: there is a lot of pent up animosity toward Flash for some reason. I continue to love Flash, but I've never intentionally pigeon-holed myself to it. I will continue to build cool things with whatever technology I see as the best fit.

 

Comments (View)

 

Me as Santa with the Fam
My own kids were afraid of me!

Or How I used candy to get children to sit on my lap and tell me their deepest desires.

Due to a last-minute schedule conflict, the designated Santa was unable to make it to the Christmas party. I was asked to fill in. I resisted at first, but then I had fun. The beard made me gag.

Huzzah!

 

Comments (View)

 

Merge Conflict Popup
Oops, you are so two thousand and late.

J.otDown got a small update this weekend. As I work to improve J.otDown and enable multi-user collaboration and editing (which is going to take while, I am busy!) I have been trying to take small steps. The first finished step is alerting the user that changes have been made. Now when you try and save the Jot, if it is out of date you will be alerted. You can then get the latest (and lose your changes) or save the file and overwrite whatever was there. It isn't perfect. In fact it may even be confusing, but it is a step in the right direction, I feel.

 

Comments (View)

 

Or How I lured children to my car with candy then took their pictures.

Every year my church congregation holds a Halloween activity called "Trunk or Treat." The premise is simple, it is like Trick-or-Treating except it is done in a parking lot from car trunk to car trunk. It is a fun activity with games, candy, and some friendly competition.

Last year I totally spaced the event and with less than half an hour before starting I whipped up an "award winning" design. We won the "Cutest Car" prize. This was satisfying, but part of me wondered if I could win "Most Awesome Car" or "Super Deluxe Ninja Car of Extreme Skill and Coolness" (I don't even know if that is a real category, but it should be). Anyway, I more or less forgot about it until this last September, 2009. That is when I came up with a plan.

A Photobooth in a car trunk.
Look at all that technology!

I was working on PictureNest at the time as a fun side project when it struck me that it would be super awesome to make a real photo booth. Around that same time people at church began to talk about the upcoming Trunk or Treat activity. Genius struck. I would make a real photo booth in the back of my car and crush the competition. No more "Cutest Car" for me. I was going to make a trunk so awesome that the Super Ninja category would be invented for my sake.


The Parts:

The Photo Application: This came easily. Mostly because I took what I had already made for PictureNest and turned it in to an AIR application. I added a few new features and tested it thoroughly for memory leaks and performance.

The Print Service: I wanted the user experience to be that when someone got their photos taken at the end the photos would print immediately and without having to confirm printing. AIR, unfortunately (and for good reason) does not allow this. My solution was to save the photos in a known directory then asynchronously read that folder and print whatever was inside of it. Not 100% fool-proof, but since I would be running it myself I could be sure that things were set up properly. I turned to Java for my printing needs. I wrote a handy Java print service (which only worked on Windows, more on that later) that would scan a given directory for images then print them to a chosen printer. It worked wonderfully. Again, I tested this service for memory leaks and performance over time and with high capacity.

The Computer: I had originally planned on using my work laptop to run everything. It is small, and would travel well. It would not, however, print. Apparently, and obviously I suppose, the print services aren't the same on Windows and OS X. I was developing on Windows but I figured that because I was using AIR and Java that moving to a new operating system would be cinch. I was mistaken. The AIR app worked perfectly, so props to Adobe. I didn't take the time to try and figure things out, and so I suppose the Java printing issues could have been worked out.

The Printer: My trusty nine-year-old Ink Jet worked like a charm. I used HP Photo Paper, cut to 3 by 8 inch strips.

The Booth aka Car: The back of my car, a hatchback, was big and roomy and perfect for a photo booth. I used a Gorilla Torch to light the backdrop. The backdrop itself was made of some bargain fabric from the local fabric store and a hat rack I rigged to hold the fabric like a projector screen. I used a folding camping chair for people to sit upon.


The Set Up

With all the parts planned out I had one major obstacle to overcome. If I was going to run a computer, monitor, web cam, and printer in the back of my car with lighting I was going to need power. I researched every conceivable battery/generator/car-adapter method I could think of. When it came down to it, though, unless I wanted to spend a ton of money on a probably noisy power generator I was going to have to plug my car in. But where? I searched the entire perimeter of the parking lot we were going to be in and eventually found one outlet. Just one power outlet! Luckily it was fairly close to a parking spot but it meant two things. First, I had to get to the spot early to make sure I could get it. Second, since I didn't have anything to test it with, I was going to put a whole lot of work in to something that might not even be able to turn on.

Our home made sign
Claire helped me do the signage.

The day of the Trunk or Treat went so smoothly that I thought nothing could go wrong. I got home in time, I took the car to the church and got the perfect parking spot and I double and triple checked my supplies. I was ready. When it was party time, we walked over to the church building and had a generally fun time. Our kids were pretty cute (Tinker Bell and Peter Pan, in case you were wondering). Then I went out to the car to set things up.

I got to the car, opened up the trunk and got out the extension cord. I plugged it in to the equipment in the back and then rolled it out to the wall. I was three feet short. I almost started to cry. I had estimated that a 50 foot cord would do but apparently I needed 53 feet. Did I let three feet stop me? No. I was prepared to drive my car up on the curb if need be. That said, I had a bit of serendipity as I saw some other people taking down the haunted house portion of the party and I got to borrow another extension cord. I ended up with 47 feet too much.

Disaster averted, at least until I started to set up the backdrop and a crucial piece of hardware went missing. I wasn't going to be able to put up the backdrop but then I spotted the hardware underneath a neighboring car. After that I got everything set up and turned on the computer and started the program. Then I unplugged the keyboard and mouse and plugged in an external keypad I had bought to use as the starting mechanism. All you had to do was hit "ENTER" and away it went!


The Crowds

My proximity to the outlet was important for functionality, but one thing I hadn't counted on was that everyone with cool trunks would conspire against me and park on the opposite side of the parking lot. In theory, anywhere in the parking lot was game, but by some weird coincidence (or unspoken rule) everyone parked in one area. So no-one came by for a while until a group of more adventurous older kids came over. They were impressed. The first group left and then soon returned with even more of their friends. Then, as time went on and the word got out there was a line. Lots of people, and groups, wanted to get their pictures taken. Unfortunately my printer, stalwart as it is, was not very fast. So towards the end people were waiting as long as 10 minutes for their prints. This fact drove people away, I think. I ended up having 50 people use the booth though more might have done pictures if not for the long wait time. I tried to be upfront with people as best I could. I even encouraged leaving and coming back later to pick up your photo, but not very many people listened. A good crowd of people surrounded my car the rest of the night.

Printer Test.
What the pictures looked like, mostly.


The Award

So, as I had hoped I was given an award. "Cutest Trunk" - can you believe it? The judges said they loved my trunk but didn't know what category to put it under and "most awesome" wasn't a category. (I don't know what the categories were, but I am imagining something like "spookiest" and "best candy")

Cutest Trunk Award
Cutest Car? Again? COME ON!


The Code

I want to make the code for this available, but I am currently in the process of moving from Windows Vista to Windows 7 and have not yet reinstalled my development tools. Once I do that I will make the code available, but as you can see it has taken over a month to write this blog post about it, so lets see how long it will take me to get the code up.


What's Missing

I didn't get many pictures of the actual event, ironically. Nor of the final setup.

PictureNest: http://www.picturenest.net

 

Comments (View)

 

I hereby decree that with every new update to webOS on my Palm Pre the more happy I am with the phone.

 

Comments (View)

 

First off...

PictureNest Photo Strip
Awesome!

So I made an online photo booth and put it up at PictureNest.net. I already owned the domain so I decided to go ahead and use it. It isn't as complete as I want it to be, and there are still some other "phases" but this is the end of phase 1 and so I am letting people know about it.

That is the last of my "new" ideas I plan to work on for a while. My more immediate plans include finishing the aforementioned phases of PictureNest and then some sweet updates to e.ggtimer and j.otdown that I hope to have done by the end of the year.

You don't know it yet, but it is all coming together. Believe me. It is going to be awesome.

 

Comments (View)

 

I hereby decree that it is weird that people make "boy" and "girl" robots. Do we want them to be able to reproduce? I am pretty sure we are creating our own robotic uprising, they won't even have to become self aware.

Seriously though, why do we try and make humanoid robots that have male or female characteristics? First of all, aren't robots supposed to be more efficient than us? Then why give them the same range of motion and physical obstacles that we ourselves face? Adding some kind of gender makes even less sense. What would differentiate a male robot from a female one? Would they have different skills? Why should they? I will come out right now and say that I think that it is in our nature to have different roles as men and women in society (roles NOT being defined as rights). But robots? Come one.

I suppose robots are designed and build for different tasks, but if we are making humanoid robots why not just build one that can do the whole range of tasks. Why would we ever need to build different "gender" types? (I put gender in quotes because robots wouldn't have a biological sex).

/random thought.

 

Comments (View)

 

I turned off WidgetNest this morning. Now it is time to turn my attention to other things.

 

Comments (View)

 

Goodbye WidgetNest
WidgetNest, 2007 - 2009

I hereby decree that WidgetNest will always hold a soft spot in my heart. WidgetNest was formed by my friends Jared, Interaction Designer Chris Hall, and me in early 2007 with basically one idea in mind. We would make we widgets and see if we could get people to pay us for them.

I am a little sad to say that for all intents and purposes WidgetNest is now dead, but I take comfort in knowing that while it may not be what it once was it was definitely a success. The experience, knowledge, and inspiration that came from that project got me where I am today. Within a month of inception we had people calling us from Google, Netscape, Brides.com, and other high-traffic websites wanting to talk to us about widgets. We were able to do lots of fun work and learn a lot about business and software development along the way.

WidgetNest widgets are still viewed millions of times a week (if not per day!). We aren't doing any more client work so we don't have the inflow of money we need to keep the servers alive for too much longer, so the end is coming soon. I will try and keep things running for as long as I can. Our most popular widgets have already been transferred to more reliable hosting, so no worries there, but as it is we have already had to cut back on what is available.

I would like to thank Jared, Chris, my wife Val, and all the people we talked with and worked with along the way. WidgetNest was one of the best decisions I ever made.

 

Comments (View)

 

Invisible Tease

A few weekends ago my brother needed some help with a homework assignment. He was supposed to have made a magazine of sorts with articles and advertisements focused on a certain topic for an English class. He hadn't finished it and needed some help. I volunteered to help make the ads.

The topic of his magazine was Mixed Martial Arts. He decided that he wanted at least one of the ads to promote a made up MMA supply company called "Endure." Here are the ads I came up with.


Sorry I don't include the actual images here. They would be pretty big in this post and also I am lazy.

 

Comments (View)

 

I try to be a time-conscience, eco-friendly, on-time kind of a guy, but I can't seem to avoid taking longer-than-needed showers. I realize that no-one but me needs to know this, but I don't care. It is time for another segment of things you didn't need to know.

This is a conversation I have with myself almost every morning:

Me: I am going to just take a quick shower.
(turns on shower, feels how nice it is, takes too long)
Me: Oh no! I took too long again!

Somewhere between having that thought and turning the water handle (about 0.5 seconds) I get so distracted that I forget my goal. Maybe I should write it on the shower wall with a dry erase marker.

-And this concludes another segment of things you didn't need to know.

 

Comments (View)

 

I would suggest starting here: The Problem With Local Connection

At the end of the above-linked post I said "In the mean time we are working on a solution using SharedObject and timed polling [to replace LocalConnection]." So it should be no surprise to announce that we have successfully done so.

We replaced LocalConnection with SharedObject

How is it done?
The premise is a simple one, instead of directly calling a method on another swf file as you would with LocalConnection, we have created a polling system that uses SharedObject to relay messages from one swf to another. SharedObject is like a cookie that Flash Player can use on a users machine. Taking that in to consideration we built a controller that uses SharedObject to save and retrieve data at timed intervals and in that way shares commands between different swf files.

Here is a basic rundown of what happens:
SWF One - writes an instruction to the SharedObject using the controller.

SWF Two - is set up to listen for changes of the SharedObject and then parse new values for instructions.

There are some "gotchas"
First, if you have lots of SWFs on the page you don't want them to accidentally overwrite any previously set but unread value. Because the sending isn't instantaneous it is very possible that multiple instructions could be send before the receiver had a chance to poll for more of them. To overcome this we implemented a basic multi-thread like system of mutexes and semaphores. Essentially, different actions (reading and writing, depending on the circumstance) block others and the controller knows how to queue up commands. The controller also knows how to interpret queued commands.

Second, there are people who don't allow memory for SharedObject on their machines. In this case we had to build in a LocalConnection backup. This is ironic because we build the SharedObject controller to replace LocalConnection, but it is more of a Plan B than a surefire backup.

Third, related to the first, there can be some lag between when a command is sent and when it is received. Fractions of a second (in our case) but still lag nonetheless.

Fourth, because of the way we implemented queuing sometimes there can be a high increase in CPU usage. We are working on tweaking this.

How can you do it yourself?
That is a very excellent question. We are currently stress testing our solution and are about to launch it on an even larger scale. We now have a very scalable solution for sending messages to multiple swfs on a page. We have tested hundreds of swfs on a page communicating with one another with a 100% success rate. Comparing that to the small range (5-12 or so) of LocalConnection successes and I feel like we have a real winner on our hands.

I cannot say if we will ever release the code and we wouldn't currently because of how new and untested it is (and undocumented and still needing refinement and a million other reasons). I do wish to say we have found a solution, however, and that If you familiarize yourself with SharedObject and think about it for a while you will be able to come up with your own solution. Our controller is literally around 50-100 lines of code; not very big.

If you come up with something you would like to share please do. I am also willing to answer questions if they arise.

Best of luck.

 

Comments (View)

 

I hereby decree that you should all stayed tuned for the next exciting installment of "The Problem With Local Connection." Will David ever find a way to fix the shortcomings of LocalConnection? Can Flash Player meet the challenge? Is Deborah dead? Find out all this and more, soon!

... and I am back from an unintentional blog/link hiatus. Huzzah!

 

Comments (View)

 

Here is a blog post and video from Widgetbox that outlines what I have been working on lately: A simple Flash image cropper for use with our Blidget Pro product.

 

Comments (View)

 

Isaac's Baby Announcement

A month ago our second child, Isaac, was born. We are now in the middle of creating and sending out baby announcements. My wife wants to do this for some reason. Anyway, just as I offered my excellent and unmatched skill to my brother (check out all 10 parts), I will be helping out my wife by designing the baby announcement. Here is a first pass.

Welcome, Isaac, to this planet we call home!

 

Comments (View)

 

To make a long story short I flipped out a while ago and decided to make my internet life a lot more private. I closed up some errant, unused accounts on different services. I increased my profile security settings on others. One account that was in the later category was my twitter account. I decided to switch to protected updates. Now, about maybe a month later, I have turned them back to public.


This is what I learned along the way:

Pros
With protected updates I didn't have to worry about divulging someone more personal information. I could talk more about my location, current goings-on, and personal life without feeling like some anonymous stalker could be reading my public feed. I also received a lot less twitter spam and bot followers. Even when I did, I was quickly and easily able to shut off those accounts that seemed suspect. That kind of extra control was nice. A pleasant side effect of more control turned out to be that as I people requested to follow me I actually found some pretty interesting people to follow back.

Cons
Protecting my updates meant they would no longer appear on the public timeline. That also shuts you off from being found in twitter search results. Suddenly I was shut off from any public conversation whatsoever. I could not participate in any fun memes or discourse based on a tag or key word. Perhaps the most powerful feature on twitter is the search. It is a real-time glimpse in to what people are talking about. Not being able to contribute was frustrating. Protecting updates also brings on more awkward situations. At one point my own mother started following me and I was given the option to allow or deny her access to my status updates. It was an odd moment.

Feature Request
I want to have my cake and eat it to. I think that a nice feature would be to allow those with protected updates to make certain ones public. Twitter already uses the "d username message" convention for sending direct messages. Why not allow something like "p mesage" to create explicitly public messages. That way people who are privacy aware such as myself can have protected updates but then consciously choose to make certain updates public.

Protecting your updates certainly does make things a lot smoother on Twitter. Unfortunately it also completely removes you from the public conversation.

... and that fulfills my Twitter blog post quota for the year. Next subject, please!

UPDATE: I've turned private mode back on. I have decided that not having weird random followers and spam is more important to me that being part of the public conversation. I'm a flip-flopper I know.

 

Comments (View)

 

Recently, I came upon an interesting problem regarding Flash components. It wasn't the first time something like this had happened. In brief, I was moving a design created in a Flash 10 environment in to a Flash 9 coding environment. Perhaps my situation was unique (or I had some kind of bad setting) but I thought that the Flash IDE would be smart enough to know what I was trying to accomplish.

Here is what I saw:

I had a design done with Flash 10 selected as the publish type. I began copying assets from the stage and library in to another movie clip that I had set up to publish with Flash 9. I was moving all those things because the designer had comped the design with timeline animations and the like in order to illustrate how it should work. This is how we roll at work. Our process usually works well. The business team gets a good feel for how things will look and feel, then I take the animated prototype and start putting in all the wiring. This usually means retooling some of the layout (nesting clips differently, movie things in to the Library for later export, etc.).

Part of the design had a component button. Not a SimpleButton, but a button component from the component library. Everything copied just fine. In the preview it all looked great. The trouble came when I compiled. I was given no errors, but the button lost its label. In fact, when I traced the value of the label instead of "Browse," the value set in the component inspector, it came back as "Label." Somehow it was being reset and then taking on some kind of default behavior.


Here is what I tried:

I tried myriad things to solve this problem. I removed the button and all the assets from the library and tried importing a new one. I tried taking it off the stage and adding it dynamically (addChild) in the code. I even tried leaving it on the state, duplicating it with the code, removing the original and adding the duplicate. Each time the same thing.

Then, in a kind of "ah ha!" moment, I turned the publish setting to Flash 10 and all my troubles went away. Why? I have no idea. I can only assume that something in the setting or some part of the component library knew it had been originally set in Flash 10 and was therefor using resources not available to Flash 9. Eventually we made a new SimpleButton and used that instead.


Here is what I conclude:

This button issue is just one in a long list of complaints I have against Flash Components. Don't get me wrong, components are great. When they work they work well. They are very customizable. They are robust. They do the job and make development time faster... unless they don't work which is, for me, often the case.

Another downside to components is the massive amount of file size they add to your Flash files. At work we have one particular file that is served a large number of times each day. It used to have a Loader component as well as a in-house-developed component. The file size was around (when all is said in done) about 120Kb. We removed all the components and replaced them with classes (MovieClipLoader, XML, and a component-to-class conversion of the in-house one) and now the same product can do much, much more and weighs in at about 60Kb, half the original size because we removed components.

Actually, we did implement a bunch of new features, so really removing the components got the size down to about 25Kb, or about one fifth the size. We just removed two components. Over millions of downloads that saves use quite a bit of bandwidth. (example: If the file had been accessed 1,000,000 times in a day, with components that is 14GB of data transfer. Without components that is 3GB of data transfer)

I wish I could have some kind of solution for this problem. Some clever hack to make components work. I do not. I welcome any suggestions, though. I want to contribute to the Flash community, no just whine all the time.

Components should be easy to work with but aren't. When they work they are great and really help speed up development time. Unfortunately they are bulky as far as file size is concerned, and if you are dealing with any high amount of traffic their benefit is quickly outweighed by the extra expense they will bring to your bandwidth bill. Bandwidth aside, the built in Flash components are often buggy or don't seem to work they way they should. Maybe I am "doing it wrong," but with nearly ten years of Flash experience under my belt I would hope that by now I would know what I was doing.

If you are having trouble with a Flash component stop blaming yourself, it probably isn't you. It's them.

 

Comments (View)

 

If you know me or frequent this blog often you know that from time to time I get a silly idea in my head and then bring it to life. In fact, if you are my friend you can't escape knowing this because following a project completion I do nothing but talk about the recently completed project for the next two weeks. I apologize. Anyway, it is time again for me to introduce another silly side project and talk about it like a jabbering fool. Like a child on Christmas morning I am only excited about a new toy for a brief period of time, then I start to unwrap the next. E.gg Timer is sooo two weeks ago.

Without further ado, I would like to introduce J.ot Down - a cousin of sorts to e.ggtimer. In a word, J.ot Down is a notepad. There is, as always, more to the story.

J.ot Down's idea came from an observation I made that people are spending more time in their Internet browsers. Many modern browsers allow the user to have multiple tabs of web pages open at once. People use browsers (or web pages loaded in the browser) to communicate, to research, to read, to write, edit photos, watch video; for just about everything.

It has long been my thought that the Internet is creating a shift in how we think about computing. In many ways a traditional operating system (Windows, OS X, Linux) is just the backing behind the web browser. This isn't true always, nor is it true in niche situations, but the things I did outside the browser eight years ago, write text documents, edit photos, send email, watch video, etc., were all done in the OS in different applications. Now I do all of those things in Firefox.

With a few understandable exceptions the browser is where I spend my time; however, I did notice one thing that I was not yet doing in-browser. Jotting down notes. I often use the OS default text editor (Notepad, Text Edit, Nano, Emacs, whatever) to write down quick lists of things to do or to help keep my thoughts straight as I work throughout the day. These text documents I create I hardly ever save or return to. They are disposable. Like a pad of notebook paper. Though occasionally I keep them because they contain valuable information. I realized the other day that there did not seem to be a way to do the same on the web.

Sure, I could have used something Google docs, but then my documents would be cluttered with files I no longer needed.

That is why I made J.ot Down - so there would be a simple way to write down throw-away thoughts in the browser but optionally save them and share them when needed.

J.ot Down is pretty simple. You open j.otdown.com and start typing. When you pause or hit save you are forwarded to a secret URL which serves as a permalink to your recently created note. The note then continues to auto-save as you edit. You can then keep it open in your browers as a tab and return to it as needed. Because it creates an unique URL for you, if the browser crashes or you close it accidentally you can always restore it or go back to it through your browser history. (more info here)

Simple? Yes!

Pointless? Maybe. But so are many of my other projects so this is totally on par with my other work.

Now, I will point out that there are some missing features.

1) You can't currently add a title. You just get a date-based URL.

2) No way to secure a note. While it would be hard to guess at the unique URLS, it is not impossible. Securing them is a high-priority iteration task.

3) Since "releasing" it in to the wild, I have caught my self wishing that it had some kind of collaborative editing feature. I am trying to figure out the best way to solve that issue. Do I even need to add that as a feature?

4) There isn't a way to keep track of past notes other than your browser history (or emailing yourself the links all the time). This one is hard. Not technically, mind you, but I don't want to bother users with creating an account. I really want this service to be as simple as: show up, type, and you're done! Also, the idea behind this site was to enable users to create disposable, one-time notes that would auto-save just in case something extreme happened. Any suggestions would be great.

I plan to iterate and make improvements. I do this with all my projects. The E.gg Timer of today is not the same from three months ago. I am excited to see where J.ot Down goes. It may go nowhere. I think it has some potential, but doesn't everyone that creates anything think their creating has potential? Most the time, I think.

I welcome J.ot Down to my side project family.

 

Comments (View)

 

E.ggTimer.com Home Page
E.ggTimer.com Home Page - Refreshed!

I would like to tell the tale of E.ggTimer.com and how a simple (and silly) side project of mine took on a life of its own thanks to Twitter.

I made e.ggtimer.com back in December of 2008. I made it, as I make many things, because it was something that I wanted and couldn't find anywhere else. I have made many silly things for no other reason than I found myself saying "I should make that" on more than one occasion. Sometimes there are pre-existing solutions to my problems, but there is something about making things that is satisfying and fills a void. I suppose you could call it my hobby.

Anyway, up until a few days ago maybe five people had ever used, or even knew about, E.gg Timer. Then something amazing happened. Tim Ferriss, author of The 4-hour Workweek asked this question via Twitter.

Tim Ferris asks a question on Twitter
Tim Ferriss asks a question.

"Can anyone suggest a good countdown timer for Mac or both Mac/PC like Compact Timer? http://ping.fm/z0f0S" 2:22 PM Feb 24th

Ben Lew, a friend of mine and web designer extraordinaire, happens to follow Mr. Ferriss on twitter. He saw the question, thought of my simple site, and responded.

Ben Lew answers the question
Tim Ferriss gets some answers.

"@tferriss correction: http://e.ggtimer.com/ via @lemieuxster" 2:36 PM Feb 24th

Apparently Mr. Ferriss clicked the link and liked what he saw.

E.ggTimer is the winner!
E.ggTimer, I choose you!

"Per 19.5K ppl, best Mac timers, descending order: 3-2-1 Timer, Minuteur, and Apimac Timer. My fave: http://e.ggtimer.com/ (via @n0s0ap)" 2:49 PM Feb 24th

After than, and surely due to the popularity of Mr. Ferriss and his position as opinion/thought leader mentions of e.ggtimer started to surge on twitter. People from all over discovered the site and decided they liked it. For whatever reason, a simple Flash countdown timer was really appealing.

The next day, no doubt due to the activity on twitter and the referral from Tim Ferriss, Lifehacker.com put up a story about E.ggTimer and the flood gates opened wide. Lifehacker suffers from the plight of most major blogs, that is copycats and page scraping. Anyway, E.ggTimer got noticed.

I am a bit of an egoist when it comes to things I make online. I like to keep track of who is using and talking about my stuff. I think all Internet developers do this. Maybe I shouldn't admit to it, but I just did. Looking at the comments reveals a fairly normal cross section of Internet users. The overall consensus seemed to be that it was a neat utility. That is more or less what I would expect to hear about a project that took my two hours to complete some random weekend. Unfortunately, some people were taking E.ggTimer was way to seriously. The Internet did not disappoint when it came to people finding ways to put down or defend the existence of the site. There were mentions of how useless the site was, how useful the site was, and one person even went so far as to create their own version and then try to get equal blog coverage.

The Tiny Timer screen shot
thetinytimer.com

thetinytimer.com seems very well put together though their page design does seem somewhat familiar...

TinyAsk.com screen shot
tinyask.com

I will give the benefit of the doubt on this one. The developer has probably never heard of tinyask.com. But maybe something about "tiny" being in the name makes us want to use that kind of gradient.

The flattery of imitation aside, the response was still more than expected. I received a whole lot of email about my site: People requesting features, telling me "good job", and other advice and communication. Since my contact information isn't really readily available on E.ggTimer itself that means that people were willing to search it out. That is pretty cool.

Perhaps I am reading in to this a bit much. I most likely am. But because of one question on Twitter a site that got 0-2 visitors a day is now getting 4,000+ visitors a day. When Lifehacker posted their story 12,000 people came to the site. I do not expect the traffic to stay up that high for very long. That said, I have been on the front page of Digg a handful of times, even back in the "just tech news" days, and while the traffic from Digg was large, it wasn't nearly as large or as high in quality as the traffic from a well-known blog or from those people coming from Twitter.

(For the record, I have never really actively sought any of this traffic though I can't suppose I would be telling the truth if I didn't think it was the coolest thing ever!)

E.ggTimer is just a simple web-based countdown timer with a fairly hackable URL structure. It isn't part of the next wave in Internet development or anything spectacular. What is spectacular is that Twitter has real-time capacity to drive eyeballs and traffic. People talking, asking questions, and getting answers almost instantly is powerful indeed.

 

Comments (View)

 

Isaac James LeMieux
6lbs. 10oz.

Welcome home, Isaac. I love you!

 

Comments (View)