<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss version="2.0"><channel><title>TL on PL</title><link>http://tom-lee.blogspot.com/</link><language>en</language><managingEditor>noreply@blogger.com (tom)</managingEditor><lastBuildDate>Thu, 24 Jul 2008 00:57:30 -0500</lastBuildDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">82</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><description></description><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/TLonPL" type="application/rss+xml" /><item><title>Awesome - Flash IDE video</title><link>http://tom-lee.blogspot.com/2008/07/awesome-flash-ide-video.html</link><author>noreply@blogger.com (tom)</author><pubDate>Thu, 17 Jul 2008 08:14:36 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-8979895310383710082</guid><description>Don't know how I missed this, but here it is:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=vqMI480D668"&gt;http://www.youtube.com/watch?v=vqMI480D668&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Demoing live video, inverse kinematics, and a new tweening model in the upcoming version of the Flash IDE. Enjoy.</description></item><item><title>AJAX in ASP .Net - Missing Sys.WebForms.*</title><link>http://tom-lee.blogspot.com/2008/06/ajax-in-asp-net-missing-syswebforms.html</link><author>noreply@blogger.com (tom)</author><pubDate>Mon, 16 Jun 2008 14:18:22 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-5408439663100558895</guid><description>So - don't ask me why, but I've been dabbling with AJAX &amp; .Net 2.0.  Oh, the shame of it.  I just spent two days trying to figure out why my UpdatePanel controls were doing a full refresh of the page instead of only updating the area they encapsulate.  It turns out that the required script libraries (.axd files) were not all being rendered into the page.  In particular, I was missing Sys.WebForms.PageRequestManager.  It took a further two hours to find the following (seemingly irrelevant) blog post:&lt;br /&gt;&lt;br /&gt;http://blogs.technet.com/stefan_gossner/archive/2006/01/24/418005.aspx&lt;br /&gt;&lt;br /&gt;In a fit of desperation, I tried his suggestion for fixing a completely unrelated problem, and lo, it worketh.  Just comment the following out of your web.config:&lt;br /&gt;&lt;br /&gt;&amp;lt;xhtmlConformance mode="Legacy" /&amp;gt;&lt;br /&gt;&lt;br /&gt;Enjoy.</description></item><item><title>Everything that's new in the Flash Player 10 beta docs</title><link>http://tom-lee.blogspot.com/2008/05/everything-thats-new-in-flash-player-10.html</link><author>noreply@blogger.com (tom)</author><pubDate>Wed, 21 May 2008 16:45:46 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-4265309123225514133</guid><description>Adobe has &lt;a href="http://theflashblog.com/?p=387"&gt;released the docs for the Player 10 beta&lt;/a&gt;.  I went through and made a list that shows you the classes, properties, methods, events, and constants that are new to Flash Player 10.&lt;br /&gt;&lt;br /&gt;Enjoy.&lt;br /&gt;&lt;br /&gt;adobe.utils.package: MMEndCommand()&lt;br /&gt;&lt;br /&gt;Top-Level:&lt;br /&gt;Vector&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;flash.utils.ByteArray: inflate(), deflate()&lt;br /&gt;flash.ui.MouseCursor&lt;br /&gt;flash.ui.ContextMenuClipboardItems&lt;br /&gt;flash.ui.ContextMenu: clipboardItems, clipboardMenu, link&lt;br /&gt;flash.text.engine.*&lt;br /&gt;flash.system.Capabilities: hasColorCorrection&lt;br /&gt;flash.system.Capabilities: domainMemory, MIN_DOMAIN_MEMORY_LENGTH&lt;br /&gt;flash.net.NetStreamPlayTransitions&lt;br /&gt;flash.net.NetStreamPlayOptions&lt;br /&gt;flash.net.NetStreamInfo&lt;br /&gt;flash.net.NetConnection: farID, farNonce, maxPeerConnections, nearID, nearNonce, protocol, unconnectedPeerStreams&lt;br /&gt;flash.net.FileReference: data, load(), save()&lt;br /&gt;flash.media.SoundCodec&lt;br /&gt;flash.media.Sound: extract(), sampleData&lt;br /&gt;flash.media.Microphone: codec, encodeQuality, framesPerPacket&lt;br /&gt;flash.geom.Vector3D&lt;br /&gt;flash.geom.Utils3D&lt;br /&gt;flash.geom.Transform: matrix3D, perspectiveProjection, getRelativeMatrix3D()&lt;br /&gt;flash.geom.PerspectiveProjection&lt;br /&gt;flash.geom.Orientation3D&lt;br /&gt;flash.geom.Matrix3D&lt;br /&gt;flash.filters.ShaderFilter&lt;br /&gt;flash.events.ShaderEvent&lt;br /&gt;flash.events.Event: CLEAR, COPY, CUT, PASTE, SAMPLE_DATA, SELECT_ALL&lt;br /&gt;flash.display.Stage: enableColorCorrection&lt;br /&gt;flash.display.ShaderPrecision&lt;br /&gt;flash.display.ShaderParameterType&lt;br /&gt;flash.display.ShaderParameter&lt;br /&gt;flash.display.ShaderJob&lt;br /&gt;flash.display.ShaderInput&lt;br /&gt;flash.display.ShaderData&lt;br /&gt;flash.display.Shader&lt;br /&gt;flash.display.MovieClip: currentFrameLabel&lt;br /&gt;flash.display.InteractiveObject: clear (event), copy (event), cut (event), paste (event), selectAll (event)&lt;br /&gt;flash.display.Graphics: beginShaderFill()&lt;br /&gt;flash.display.DisplayObject: blendShader, rotationX, rotationY, rotationZ, z, globalToLocal3D(), local3DToGlobal()&lt;br /&gt;flash.display.BlendMode: SHADER&lt;br /&gt;flash.display.BitmapData: histogram&lt;br /&gt;flash.desktop.ClipboardTransferMode&lt;br /&gt;flash.desktop.ClipboardFormats&lt;br /&gt;flash.desktop.Clipboard</description></item><item><title>Here's a New One</title><link>http://tom-lee.blogspot.com/2008/04/heres-new-one.html</link><author>noreply@blogger.com (tom)</author><pubDate>Thu, 17 Apr 2008 18:26:50 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-4303680331139585996</guid><description>This was emitted from a Flex swf I was working on today:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Error: The SystemManager constructor was called when the currentFrame was at 2 Please add this SWF to bug 129782.&lt;br /&gt; at mx.managers::SystemManager()&lt;br /&gt; at _EmbeddingImagesScale9_mx_managers_SystemManager()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Never seen that before. Good times.</description></item><item><title>Adobe's Coding Conventions Leave Me Asking "Why??"</title><link>http://tom-lee.blogspot.com/2008/04/adobes-coding-conventions-leave-me.html</link><author>noreply@blogger.com (tom)</author><pubDate>Wed, 16 Apr 2008 09:54:52 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-4763286106950265882</guid><description>I just took a quick first pass through Adobe's newly-published &lt;a href="http://opensource.adobe.com/wiki/display/flexsdk/Coding+Conventions"&gt;Flex Coding Conventions&lt;/a&gt;, and while I agree with much of what is in there, a few items leave me scratching my head.  I think it would have been useful for them to offer some sort of rationale behind the recommendations, not just "do this, not that" mandates.  By way of a few examples:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Use Array literals rather than new Array().&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Isn't "new Array()" more consistent with the way every other kind of object is instantiated?  "[]" is a shorthand syntax - I have found shorthand generally to be something to be avoided, because it requires a deeper familiarity with a language than a generalist programmer would possess.  I raise the same objection to the recommendations for using Object literals, RegExp literals, and so forth.  Consistency is key.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Don't use unnecessary parentheses with common operators such as +, -, *, /, &amp;amp;&amp;amp;, ||, &amp;lt;, &amp;lt;=, &amp;gt;, &amp;gt;=, ==, and !=.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I favor explicit groups, not implicit ones.  In my opinion, this: &lt;span style="font-style:italic;"&gt;var e:Number = (a * b) / (c + d);&lt;/span&gt; is better than this: &lt;span style="font-style:italic;"&gt;var e:Number = a * b / (c + d);&lt;/span&gt; because it removes ambiguity over whether &lt;span style="font-style:italic;"&gt;b&lt;/span&gt; is divided by &lt;span style="font-style:italic;"&gt;(c + d)&lt;/span&gt; or &lt;span style="font-style:italic;"&gt;a * b&lt;/span&gt; is divided by &lt;span style="font-style:italic;"&gt;(c + d)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;If the various branches of an if/else statement involve single statements, don't make them into blocks.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This just makes your code less readable, and introduces an inconsistency in the way the syntax is written.  Why have a special case for branches that contain a single statement?  This feels more like the personal preference of an experienced developer than a bona fide "best practice" for teams.  Indeed, the recommendation for "while" statements is exactly the opposite.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Use int for integers, even if they can't be negative. Use uint only for RGB colors, bit masks, and other non-numeric values.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Why???? What's the point in having a uint if you're only going to use it for things other than unsigned integers?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;These are just a few that jumped out at me, because they seemed arbitrary exceptions to the norm.  "Best practices" should promote a coding standard that favors minimal variation in syntax over quick coding time, easy understanding over minor performance gains, etc.  Overall, I think they're on the right track - but if they're going to create all kinds of exceptions to their own rules, they should provide more explanation.&lt;br /&gt;&lt;br /&gt;One more - this is just whack:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;var a:Array /* of String */ = [];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The language does not support typed arrays.  If you need a typed array, extend ArrayCollection and add your own type-checking.  Cluttering up your code with comments like this doesn't offer any compile-time type-checking, and is much less readable than &lt;span style="font-style:italic;"&gt;var a:MovieClipArray = new MovieClipArray();&lt;/span&gt;</description></item><item><title>wmode="opaque" + Firefox + position:fixed = AAAAGGGHH!!!!</title><link>http://tom-lee.blogspot.com/2008/03/wmodeopaque-firefox-positionfixed.html</link><category>Flex</category><category>Firefox</category><author>noreply@blogger.com (tom)</author><pubDate>Thu, 03 Apr 2008 12:17:25 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-5619123585299994463</guid><description>I just spent the last 4 hours or so tracking down this bug.  I needed to use wmode="opaque" on my Flex app, due to a dynamic menu overlay issue.  However, in Firefox this seemed to mean that none of the buttons in the Flex app would be clickable.  Ok, Tom, break the problem down...&lt;br /&gt;&lt;br /&gt;I embed the swf in a plain-jane web page, and it works fine (wmode="opaque").  I add in my style sheets, and it stops working.  Turns out that setting position:fixed on the body tag was the cause - changing to position:static was the cure.&lt;br /&gt;&lt;br /&gt;May you waste less time than I did.</description></item><item><title>A Regular Expression for Stripping HTML Tags</title><link>http://tom-lee.blogspot.com/2008/01/regular-expression-for-stripping-html.html</link><author>noreply@blogger.com (tom)</author><pubDate>Fri, 18 Jan 2008 11:45:49 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-1272361604732587882</guid><description>Here's a regex I wrote yesterday for stripping specific html tags from a string:&lt;br /&gt;&lt;br /&gt;&lt;[^&gt;]*(table|tr|td|th)[^&lt;]*&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here's an example in AS3 that removes &amp;lt;p&amp;gt; and &amp;lt;b&amp;gt; tags:&lt;br /&gt;&lt;br /&gt;var testString:String = "&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;Hello&amp;lt;/b&amp;gt; world!&amp;lt;/p&amp;gt;";&lt;br /&gt;var regEx:RegExp = new RegExp("&lt;[^&gt;]*(p|b)[^&lt;]*&gt;","gi")&lt;br /&gt;trace(testString.replace(regEx,""));&lt;br /&gt;&lt;br /&gt;Enjoy.</description></item><item><title>Switched from Google Checkout to PayPal for donations</title><link>http://tom-lee.blogspot.com/2008/01/switched-from-google-checkout-to-paypal.html</link><author>noreply@blogger.com (tom)</author><pubDate>Fri, 18 Jan 2008 11:38:13 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-1607747455085357166</guid><description>I've switched to PayPal from Google Checkout for donations, in order to allow people to donate a custom amount.  The fees are higher, but it allows for more flexible configuration - in the end, I think that's better.  What do you think?</description></item><item><title>What's the right approach for blog monetization?</title><link>http://tom-lee.blogspot.com/2008/01/whats-right-approach-for-blog.html</link><author>noreply@blogger.com (tom)</author><pubDate>Fri, 18 Jan 2008 10:24:36 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-5298900300957628446</guid><description>Lately I've been experimenting with this blog a little bit to learn more about how AdSense works, so you've no doubt noticed the ads.  I personally dislike ads, but they do have the potential to be a money-maker under the right circumstances.  The nice thing about them is that the money doesn't come from the pocket of the viewer, it comes from the people who advertise.  For this blog, however, I don't think they're a good fit.  Here are a few reasons why:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The content of this blog doesn't lend itself to pulling quality ads.&lt;/span&gt;  I've been seeing ads for "Fix Flash Player Errors" - I sincerely hope no one clicked on that thing.  It takes you to a registry scanner of some sort, and strikes me as being a bit nefarious.  Also, the ads are only pulling in (at most) a few cents per click.  For over 2700 visits, I made a whopping total of 73 cents.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The people who view this blog are not given to clicking on ads.&lt;/span&gt;  Clearly, whatever my blog is advertising, you're not interested in.  For over 2700 visits, my ads were clicked around 10 times.&lt;br /&gt;&lt;br /&gt;In terms of a money-making proposition, I think it's safe to say ads are not a good fit.  I have removed most of the ads on the site.  I still want to watch how Google AdSense analyzes my content though, so I'm leaving one small ad in the footer.  Instead of the ads, I'm going to try a donation model.  I'm going with 3 donation levels:  $1.23, $5.33, and $10.63.  I started with $1, $5, and $10, and then added a few cents to offset Google Checkout fees.  These donations will help me write more useful content, and will allow me to devote more time to finishing up some of those lingering projects that people have expressed interest in.&lt;br /&gt;&lt;br /&gt;I really want your feedback on this.  Do you think the donations are appropriate?  Is the Buy button unobtrusive enough?  Are the amounts right?  I'm looking forward to your input.</description></item><item><title>What browsers do you test against?</title><link>http://tom-lee.blogspot.com/2008/01/what-browsers-do-you-test-against.html</link><author>noreply@blogger.com (tom)</author><pubDate>Thu, 17 Jan 2008 10:18:21 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-1065264662256776882</guid><description>I'm in the final testing phase of a new website, and I'm wondering what browsers folks commonly test against these days.  Since it's new, I have no user agent data to go by.  I'm presently testing against the following:&lt;br /&gt;&lt;br /&gt;Windows&lt;br /&gt;&lt;ul&gt;&lt;li&gt;IE: 6, 7&lt;/li&gt;&lt;li&gt;Firefox: Newest&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Mac&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Safari:Newest&lt;/li&gt;&lt;li&gt;Firefox:Newest&lt;/li&gt;&lt;/ul&gt;This is a pretty small matrix, but has been pretty successful in the past.  I give priority to fixes on the Windows platform, and Safari on the Mac.  I'll probably test in IE 5.5 as well, even though IE 5.x users make up only about 1% overall (according to some stats I'm seeing).  Are there any particular browsers &amp;amp; versions that you pay special attention to?</description></item><item><title>IE Standalone Installations</title><link>http://tom-lee.blogspot.com/2008/01/ie-standalone-installations.html</link><author>noreply@blogger.com (tom)</author><pubDate>Thu, 17 Jan 2008 10:10:45 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-6178222462151759128</guid><description>I always have to look this up when I need it, so I'm posting here for my own reference and yours.&lt;br /&gt;&lt;br /&gt;Get standalone IE installations (for testing purposes) here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://browsers.evolt.org/?ie/32bit/standalone"&gt;http://browsers.evolt.org/?ie/32bit/standalone&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Some things will cause these browsers to crash - I vaguely recall a problem with the address bar, and cookies were also problematic.&lt;br /&gt;&lt;br /&gt;See the following article for solutions to some issues:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.positioniseverything.net/articles/multiIE.html"&gt;http://www.positioniseverything.net/articles/multiIE.html&lt;/a&gt;</description></item><item><title>The best web page development tool there is.</title><link>http://tom-lee.blogspot.com/2008/01/best-web-page-development-tool-there-is.html</link><author>noreply@blogger.com (tom)</author><pubDate>Wed, 16 Jan 2008 13:30:02 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-744781862889837620</guid><description>If you create web pages and you haven't heard about this tool yet, you need to get it ASAP.  It will make your life so much easier.  How I went this long without hearing about this is a mystery to me, but I guess you can't know everything.  The tool is called Firebug (&lt;a href="http://www.getfirebug.com/"&gt;http://www.getfirebug.com&lt;/a&gt;), and it's a toolbar for Firefox that allows you to make live modifications to CSS and see the changes instantly in the browser.  Also, the JavaScript debugging is spectacular (by JavaScript standards).  Inspect mode has been a life-saver for me - it lets you click on an element in the web page, and takes you to the relevant HTML.  Other tools, like the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=E59C3964-672D-4511-BB3E-2D5E1DB91038&amp;amp;displaylang=en"&gt;IE Developer Toolbar&lt;/a&gt;, have some of the features - but nothing else has them all.&lt;br /&gt;&lt;br /&gt;Sorry if this is old news to you, but if you haven't tried it yet, you should.  I wouldn't want to be without it.</description></item><item><title>Macworld 2008 - What am I buying?</title><link>http://tom-lee.blogspot.com/2008/01/macworld-2008-what-am-i-buying.html</link><author>noreply@blogger.com (tom)</author><pubDate>Wed, 16 Jan 2008 09:12:42 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-7805934082788737295</guid><description>No doubt this has already been covered to death elsewhere on the interwebs, but I thought I'd chime in with my takeaways on Macworld '08.&lt;br /&gt;&lt;br /&gt;You can't announce an industry-changer like the iPhone every year.  So it's no surprise that this year's Macworld left many with an empty place inside where their anticipation once lived.  But if the new Apple product lineup didn't live up to the hype, it's not Apple's fault.  Although the blogosphere was abuzz with conjecture months in advance, I didn't hear Apple saying they were going to change the world.  And they didn't.  What they did was announce solid upgrades to their product line&lt;br /&gt;&lt;br /&gt;The much-needed refresh for the Apple TV set-top box with the major overhaul of movies on iTunes is a powerful combination, and may prove formidable competition for the existing players in the online movie rental space.  Those who don't wish to shell out $230 for the set-top box will still end up renting a few movies for mobile viewing on their iPods.  For those who do buy the Apple TV, keeping a Netflix subscription around looks less appealing (although in many cases, it's still cheaper) and ordering pay-per-view on cable and satellite would just make no sense at all.&lt;br /&gt;&lt;br /&gt;The iPhone 1.1.3 software update was the single thing that I looked forward to the most, and so it was also the most disappointing.  It could have been so much more, particularly given my low expectations.  I want a few basic things from my iPhone that it doesn't do now:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;A way to edit my notes on my Mac&lt;/li&gt;&lt;li&gt;Select, copy and paste text&lt;/li&gt;&lt;li&gt;A few simple games.  I'll even pay for them.&lt;/li&gt;&lt;li&gt;Flash.  Preferably Flash Player 9.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Ok, so the last one isn't so basic.  But the first 3 are no-brainers.&lt;br /&gt;&lt;br /&gt;The 1.1.3 iPhone update does have some cool stuff though.  The location finder in Google Maps is pretty cool, at least in theory.  It triangulates your position based on the location of nearby cell towers and wifi hotspots.  A really clever idea - but accuracy varies wildly.  In Alexandria, VA it found my location to within a mile - in my office in DC, it found my exact building.&lt;br /&gt;&lt;br /&gt;Since I'm a UI designer (among other things) and this blog is supposed to be focused on the presentation layer (although it often deviates), I'd be remiss not to talk about the new interaction the iPhone has for re-arranging icons.  This is one area where I think they nailed it.  Here's how it works: just press and hold an icon until it starts to wiggle.  When the icons are wiggling, you can drag them around the screen.  How great is that?  The 'wiggle' effect is a perfect gut-level visual cue that the icons are in a fluid state.  It's the kind of simple, intuitive design that people who create UIs should strive for.  I think when it's all said and done, Apple is going to get the credit for defining how multi-touch interfaces behave (even if Jeff Han and others did the homework).&lt;br /&gt;&lt;br /&gt;Apple also announce the Time Capsule, an Airport Extreme with a 1 terabyte hard drive inside, meant for performing wireless backups with Time Machine in Leopard.  This is a real kick in the crotch for anyone who recently (6 months ago) purchased an Airport Extreme with the intent of using it with a USB drive.  It turns out, you actually can't use a USB drive attached to last year's Airport Extreme for your Time Machine backups.  Until Apple releases firmware to resolve that issue, I'm going to assume that this was their plan all along.  Jerks.&lt;br /&gt;&lt;br /&gt;Finally, there was the MacBook Air.  I think this will be very popular for the airborne businessperson.  It will fit nicely into that little pouch on the back of the seat that holds the Skymall catalog.  Also, for the fashion-minded student.  But, not for me.  I have thick, manly arms that can withstand the weight of &lt;a href="http://store.apple.com/1-800-MY-APPLE/WebObjects/AppleStore.woa/91274001/wo/Xa61UIqtdg9p3sEdFz91zhVf7el/2.?p=0"&gt;5.4 lbs of computing power&lt;/a&gt;.  I'll bet I could even handle &lt;a href="http://store.apple.com/1-800-MY-APPLE/WebObjects/AppleStore.woa/91274001/wo/Xa61UIqtdg9p3sEdFz91zhVf7el/4.?p=0"&gt;6.8 lbs&lt;/a&gt;.</description></item><item><title>Flexlib updates, Bi-Di in Flash Player, and a Love-Fest</title><link>http://tom-lee.blogspot.com/2007/05/flexlib-updates-bi-di-in-flash-player.html</link><author>noreply@blogger.com (tom)</author><pubDate>Fri, 25 May 2007 10:56:16 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-5732750775680787857</guid><description>Long time, no post.  Really, I haven't had much to write about, since I've been knee-deep in some CSS, HTML, &amp; .Net work.  Finally, I'm getting to spend some time in Flex again, so I'll probably turn up the volume again, so to speak.&lt;br /&gt;&lt;br /&gt;I got some good news last night - my text highlighter component has been added to Flexlib!!  Here's the &lt;a href="http://code.google.com/p/flexlib/wiki/ComponentList"&gt;full component list&lt;/a&gt;, and here's a link to &lt;a href="http://flexlib.googlecode.com/svn/trunk/examples/Highlighter/Highlighter_Sample.swf"&gt;the example itself&lt;/a&gt;.  If you find any bugs, feel free to post them in the comments here.  No matter how many times something I create goes out into the world, it's still exciting.  Big thanks to &lt;a href="http://www.dougmccune.com/blog/"&gt;Doug&lt;/a&gt; and &lt;a href="http://www.darronschall.com/weblog/"&gt;Darron&lt;/a&gt; for making this happen!&lt;br /&gt;&lt;br /&gt;Then, when I came in to work this morning, I saw &lt;a href="http://weblogs.macromedia.com/emmy/archives/2007/05/tiny_clarificat.cfm"&gt;Emmy's post&lt;/a&gt; about bi-directional text support in Flash Player 10.  Awesome - sounds like they're planning to not only add bi-directional text support, but generally just beef up text in general.  This is great news.  Although it improved substantially in FP8, text handling is still not perfect.  Things like styling HTML text can still be a little dicey.  And I would love for things like my text highlighter component to be completely unnecessary!!  Maybe they could add in some highlight-and-find functionality in there.&lt;br /&gt;&lt;br /&gt;As a side note, I wonder how long they'll stick with numeric versioning for the Flash Player.  Most software doesn't make it much beyond 10 before a change in naming convention, like Photoshop CS3, etc.  I could imagine a Flash Player 11, but Flash Player 17?  13?  Maybe Adobe Acropollash?  Flappollobat?  Blinding Ray of Transcending Glory? (I think M$ considered that one, at least momentarily).  I personally would go with Flappollobat - it has a certain ring to it, don't you think?&lt;br /&gt;&lt;br /&gt;Finally, I sometimes use this blog as a place to vent my frustrations with poor customer service and other things gone awry in the Adobe world.  However, I feel that if you chose to voice your opinions in public, you should take care to present the totality of your views.  In other words, if you have a concern or complaint, voice it - but if you have positive things to say, say those too.  It occurs to me that I have let many of those positive things go unsaid, while I have given more energy to my irritations - this seems to me to be a special form of hypocrisy. &lt;br /&gt;&lt;br /&gt;That said, I have worked with CS3 and Flex Builder on the Mac for some time now, and I think they're amazing.  Very solid, very enabling technologies.  Flash Player 9 continues to astonish me from a performance perspective, and I can develop applications using Flex so quickly that I can spend more time on the design of them, and even have time to actually implement the "nice-to-have" features that normally get pushed off to version 2 of a project.  And I also happen to love the new icons.  Don't change them, please?  So elegant, so well thought out. &lt;br /&gt;&lt;br /&gt;It would be ridiculous for me to itemize everything I love about CS3 and Flex - it would be a long list, and probably take up most of my available blogging time.  So maybe the solution is to simply give less time to my gripes, and try to focus more on the mission of this blog, which is to publicize information useful to RIA developers.  Wish me luck. :)</description></item><item><title>Happy Mac</title><link>http://tom-lee.blogspot.com/2007/03/happy-mac.html</link><author>noreply@blogger.com (tom)</author><pubDate>Fri, 09 Mar 2007 21:45:50 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-8576669254684098042</guid><description>I just completed a RAM upgrade in my Mac Mini, per the instructions at &lt;a href="http://www.methodshop.com/gadgets/tutorials/macmini-ram"&gt;http://www.methodshop.com/gadgets/tutorials/macmini-ram&lt;/a&gt; and am happily multi-tasking away... Listening to Frank Black &amp; the Catholics on iTunes, blogging in Camino, NeoOffice and Flash both open in the background.  Life is good with 2GB. &lt;br /&gt;&lt;br /&gt;It took about 45 minutes to install at a careful pace, saved me over $150... and I didn't even scratch my case.  Whoops... Here comes the new Pete Yorn... Gotta go rock out.</description></item><item><title>Adobe: Bad Customer Service</title><link>http://tom-lee.blogspot.com/2007/02/adobe-bad-customer-service.html</link><author>noreply@blogger.com (tom)</author><pubDate>Tue, 13 Feb 2007 11:50:13 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-1488071265475058424</guid><description>I just held for 2 hours with Adobe tech support to get an unlock code for CS2 upgrade.  (For background, that's what you need to do to validate an upgrade installation that won't recognize the original media you're upgrading from.)  I was incorrectly transferred at least twice, waiting for 20-30 minutes at each transfer.  When I finally got the unlock code, it didn't work and there wasn't a thing that they could do about it.  When I offered that I was using Windows Vista (they never asked) customer service literally said "Ah-HAH! That must be the problem", blamed the whole thing on Vista compatibility, and helpfully suggested that I wait for CS3 or roll back to Windows XP.&lt;br /&gt;&lt;br /&gt;I asked to be transferred to a supervisor, who told me that Microsoft wouldn't give Adobe the necessary components to test their software until just recently.  I explained that I have personally tested software on the beta versions of Vista for two years, and that the final bits have been available for months.&lt;br /&gt;&lt;br /&gt;What was worse than waiting for two hours or listening to made-up excuses is just that no remedy, not even a symbolic gesture, was ever offered.  I suggested that it would be helpful if Adobe could contact me when an update is released, rather than expecting me to visit the website every day.  She said "That's not possible, we have a lot of customers."  Not possible?  Hardly.  Not practical?  Maybe.  Not willing?  Bingo.&lt;br /&gt;&lt;br /&gt;The thing that makes this all even crazier is that I was able to install CS1 without issue, and upgrade on top of that (on *gasp* Vista!) - solving my own problem.  It's a shame that the people who I talked to today lacked the imagination (or, seemingly, the energy) to suggest it.&lt;br /&gt;&lt;br /&gt;There are a couple of takeaways from all this that I intend to relay to my customer service people:&lt;br /&gt;&lt;br /&gt;1) Don't make your customers wait interminably.&lt;br /&gt;2) If your customer paid you and can't use your software, "tough noogies" doesn't cut it.&lt;br /&gt;3) If you can't answer your customer's question, have someone get back to them who can answer it.&lt;br /&gt;4) Throw me a frickin' bone, here.  If there is no solution to be had, give the customer something - anything - to show that they're not just another $1000 to you.  Maybe a reduced-price upgrade when it finally does arrive, maybe just a follow-up email to say "sorry we couldn't help you".&lt;br /&gt;5) Don't try to throw something technical-sounding at your customer in the hopes that they won't understand it and just go away.&lt;br /&gt;&lt;br /&gt;I know what it's like to not have an answer for someone who deserves one.  I understand that everybody has a somewhat different capacity for problem-solving.  I understand that customer service people are usually the people in an organization who are the least empowered to offer resolution.  But PLEASE give the impression that you're trying.</description></item><item><title>I'm a Mac... and HEY!!! LOOK AT ME!!!</title><link>http://tom-lee.blogspot.com/2007/02/im-mac-and-hey-look-at-me.html</link><author>noreply@blogger.com (tom)</author><pubDate>Thu, 08 Feb 2007 00:20:37 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-6610921414219856666</guid><description>I just got a new Vista box at work and I'm getting it all set up, trying to get used to the new locations of everything.  My particular pain point is that the VPN client my company uses hasn't yet been updated for Vista.  But I digress...&lt;br /&gt;&lt;br /&gt;The thing I really want to talk about is just how much bling they added with Aero.  It's like they had a big meeting and someone said "Look, we all know that people love Macs because they're purty.  We have to make Windows cool-looking too.  How can we do that?"  "I know!!" someone else pipes up.  "We can make the windows semi-transparent!!"  "Yeah, that'd be awesome!" says someone else.  "We should also put some gleam on them, like a glassy reflection."   "And dropshadows!!", chimes in another.  "Yaaay!! Isn't designing things fun??  No longer will Windows be known as 'the ugly OS'."&lt;br /&gt;&lt;br /&gt;Seriously, Vista is way over the top in terms of aesthetics.  Pick two of the added design touches and it would have been enough.  But dropshadows, transparency, glows, white strokes, bevels, reflections and blur all at once?  That's called "trying too hard".&lt;br /&gt;&lt;br /&gt;I don't consider myself a fan-boy, but I couldn't help but to be inspired to propose a new Mac vs PC commercial.&lt;br /&gt;&lt;br /&gt;Mac:  Hello, I'm a Mac.&lt;br /&gt;PC: Wassup dawg, I'm a PC.  (he's wearing MC Hammer pants)&lt;br /&gt;Mac:  Hey, PC, nice pants.  What's that around your neck, a huge analog clock?&lt;br /&gt;PC: Yeah, isn't it cool?  They gave me a bunch of new fashion accessories this time.  Yup... I finally got my wardrobe up to date.&lt;br /&gt;Mac: Umm.. Yeah.  Isn't that thing a little slow?&lt;br /&gt;&lt;br /&gt;With apologies to my boss, who came up with the Flava Flav clock gag.</description></item><item><title>WPF/E = JavaScript + Windows Media Player?</title><link>http://tom-lee.blogspot.com/2007/02/wpfe-javascript-windows-media-player.html</link><author>noreply@blogger.com (tom)</author><pubDate>Mon, 05 Feb 2007 09:51:40 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-3488223825331333358</guid><description>So, I just checked out the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=8B6B1524-ECD9-4FF2-BB0F-D9156F570C5B&amp;displaylang=en"&gt;Microsoft Community Technology preview of Windows Presentation Framework Everywhere&lt;/a&gt;, the supposed "Flash Killer".  After seeing this, I'm under the impression that WPF/E and the Flash Player are not really in the same conceptual sphere.&lt;br /&gt;&lt;br /&gt;WPF/E seems to boil down to some JavaScript libraries and Windows Media Player (and maybe a little SVG) so far.  It's unclear to me how much of the animation is controlled by JavaScript and how much is handled by the WPF/E ActiveX control: some of the examples have more animation-oriented JavaScript than others.  All of the interactivity appears to be handled by JavaScript.  In the network-aware examples, there is an Ajax library that looks to be responsible for communication.&lt;br /&gt;&lt;br /&gt;So, in concept, WPF/E seems to leverage existing web technologies and tries to handle their varying implementations.  Flash Player, on the other hand, provides its own implementation for those technologies.&lt;br /&gt;&lt;br /&gt;I have a lot of questions about how WPF/E works.  Does it leave the JavaScript interpretation up to the browser, or have they implemented another JS interpreter in the ActiveX control?  Does WPF/E handle image display, or is that left to the browser as well? Basically, all of my questions boil down to this: is WPF/E merely coordinate the various technologies it uses, or does it actually provide its own implementations of those technologies? &lt;br /&gt;&lt;br /&gt;If WPF/E is just coordinating a variety of implementations, it will always be limited by the browser, and Flash will always be a jump ahead.</description></item><item><title>Flex Data Model Architecture</title><link>http://tom-lee.blogspot.com/2007/01/flex-data-model-architecture.html</link><author>noreply@blogger.com (tom)</author><pubDate>Wed, 31 Jan 2007 14:45:46 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-3515891934958900050</guid><description>So, I'm chin-deep in Joe Berkovitz's &lt;a href="http://www.adobe.com/devnet/flex/articles/blueprint.html"&gt;Architectural Blueprint for Flex Applications&lt;/a&gt;... That is to say, this is about the 5th time I've read it. I think it's a great article, as architectural blueprints go... It really helps to make the abstract principles of MVCS more concrete for me.&lt;br /&gt;&lt;br /&gt;I think I'm a little slow on the uptake when it comes to architecture. Old habits die hard, and years of working on small, underfunded projects have molded my thought patterns accordingly - I always seek the most direct approach that works. Even though this is not my first exposure to MVCS by a long shot, I still find myself getting a bit lost in the translation between the idea of MVCS and the details of how you implement it in a real world project.&lt;br /&gt;&lt;br /&gt;The code examples that are shown in Joe's article are only moderately helpful to me - it wasn't until I opened the source code itself and could see the import statements that some of it became clear.&lt;br /&gt;&lt;br /&gt;For example, the Model portion of the app. After reading the article several times (and also referencing Aral Balkan's article "&lt;a href="http://www.adobe.com/devnet/flex/quickstart/defining_data_models/"&gt;Defining Data Models&lt;/a&gt;"), I was still unsure of the appropriate place to instantiate the model classes, and I also thought that there should be a single Model class that encapsulated the other model classes. I was visualizing the model as a single respository for all the data needed by the application, which would have bindable properties (sort of like a model defined by mxml Model tags). After reviewing the source code, I see that the model is really implemented as a set of Value objects that are instantiated in both the Controller and the Services, and are passed around the application.&lt;br /&gt;&lt;br /&gt;I'm not used to thinking in this way. When someone says "this architecture is made up of 4 parts" I am thinking of 4 discreet parts. When someone refers to "the Model" I naively think "there's a single model object somewhere". So I'm trying to adjust my brain to the concept of a nebulous model that consists of several Value Objects being tossed around the app.&lt;br /&gt;&lt;br /&gt;But I'm also (maybe naively) wondering if it wouldn't be better to have a single Model that encapsulates all the data. That would have a couple main benefits, in my estimation:&lt;br /&gt;&lt;br /&gt;1) It would be easier to serialize the model and save it in a local shared object for later restoration (the purpose of the model is to handle state, correct?)&lt;br /&gt;2) It would be easier to store revisions of the model for undo/redo purposes&lt;br /&gt;3) It would be easier for the view to bind to it&lt;br /&gt;&lt;br /&gt;This is what the mx:Model tag has going for it, but the problem there is you can't have strongly typed data.&lt;br /&gt;&lt;br /&gt;I'm pretty sure there are architectures that work this way - it sounds kind of like what Aral describes in the "Using Class-Based Models" section of &lt;a href="http://www.adobe.com/devnet/flex/quickstart/defining_data_models/"&gt;his article&lt;/a&gt;.  But maybe I'm reading Joe Berkovitz's code wrong... Pretty sure I'm missing quite a lot here - hopefully I haven't said anything that is obscenely stupid.&lt;br /&gt;&lt;br /&gt;Hopefully some of my readers can help me fill in the blanks!</description></item><item><title>Update - Flex Text Highlighter Class</title><link>http://tom-lee.blogspot.com/2007/01/update-flex-text-highlighter-class.html</link><author>noreply@blogger.com (tom)</author><pubDate>Mon, 22 Jan 2007 10:16:08 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-2323553610837415360</guid><description>Last night I updated my demo of tl.text.Highlighter, my TextField highlighting class for Flex.  You point it at a TextField object, and then use one of its methods to highlight the word or words of your choosing.  &lt;a href="http://labs.tom-lee.com/Flex/HighlighterDemo/HighlighterDemo.html"&gt;Here's the demo&lt;/a&gt; (right-click it to view source).&lt;br /&gt;&lt;br /&gt;In this revision, I added some performance optimizations to reduce the number of calls to TextField.getCharBoundaries, which it turns out was the most expensive call I was making.  In the last version, I highlighted each character individually, regardless of whether it was part of a word or not, because it was easier to handle word wrapping that way.  This meant making a separate call to TextField.getCharBoundaries for each letter in a word.  The performance was pretty good, but could get a little slow when highlighting a whole paragraph.  Now, I make two calls per word: one for the first character, and one for the last character and combine them into a single Rectangle object that spans the whole word (a la &lt;a href="http://www.bit-101.com/blog/?p=852"&gt;Keith Peters&lt;/a&gt;).  It's a bit trickier to manage when words or phrases wrap into multiple lines, but I was able to write some logic to handle those scenarios.  &lt;br /&gt;&lt;br /&gt;Anyway, this results in much better performance when highlighting many sequential characters in a TextField.  To pull this off, I created a StringBoundaries class which returns an array of Rectangles that define the boundaries of the character range.  The array has a length of 1 if the character range fits on one line.&lt;br /&gt;&lt;br /&gt;Also, I moved the search logic into a separate class called Finder, where it will be easier to work with.  I intend to add some features such as Match Whole Words Only and Case Sensitive/Insensitive options.&lt;br /&gt;&lt;br /&gt;Keep those suggestions coming!</description></item><item><title>A TextField Highlighter Class for Flex</title><link>http://tom-lee.blogspot.com/2007/01/textfield-highlighter-class-for-flex.html</link><author>noreply@blogger.com (tom)</author><pubDate>Sat, 20 Jan 2007 21:46:57 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-43883329784837429</guid><description>One of the features I've always felt was missing from Flash TextFields is the ability to highlight a range of characters with a color.  What I did in the past was highlight words by changing their color, which is not nearly as satisifying.   So, I was really happy to learn that TextFields in Flash 9 have a new method, getCharBoundaries, which returns the bounding rectangle of the specified character.  With this method, we can create a rectangle of color to place behind the TextField, highlighting the specified character or characters.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.bit-101.com/blog/?p=852"&gt;Keith Peters&lt;/a&gt; of BIT-101 and &lt;a href="http://www.betaruce.com/blog/?p=118"&gt;Betaruce&lt;/a&gt; both have released demos of this exact functionality.  However, their demos lack support for word wrapping, or resizing and scrolling of the TextField.  Since text highlighting is on the wishlist for an app I'm developing, I figured I'd Flex it up a bit.&lt;br /&gt;&lt;br /&gt;My Highlighter class supports word wrapping, resizing, scrolling, and more.  You can highlight all instances of a string, or highlight the next and previous instances of the string.  You can also use multiple Highlighters on the same TextField for combinations of colors and functionality.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://labs.tom-lee.com/Flex/HighlighterDemo/HighlighterDemo.html"&gt;Try out the demo.&lt;/a&gt;  You may have to wait a few seconds for the sample text and fonts to load.  I'm using embedded fonts and a StyleSheet here just to test that it will handle them, but TextFields in general seem to perform better without them.  Oh, and you can right-click and view source too (love that about Flex!).&lt;br /&gt;&lt;br /&gt;Here's how it works:  when you pass the Highlighter a string to highlight, it finds the instances of that string in the TextField and stores the indexes of each character separately in an array.  When the TextField is scrolled or resized, the Highlighter determines which of those characters are visible on the screen and draws a Bitmap rectangle behind them.  On every SCROLL or RESIZE event, the Bitmap is cleared and highlights are calculated and redrawn.&lt;br /&gt;&lt;br /&gt;This could get to be a pretty processor-intensive system, especially when you have a lot of characters being highlighted.  This is where I was really pleasantly surprised by Flash Player 9.  When I first started the project, I thought "this will never work - it'll be too slow".  But Player 9 handles it like a champ.  Unbelievably fast.&lt;br /&gt;&lt;br /&gt;There are some things that can screw up TextField.getCharBoundaries, such as newline, carriage return, and other whitespace characters (&lt;a href="http://tom-lee.blogspot.com/2007/01/flashflex-textfield-bug-dancing.html"&gt;see my last post&lt;/a&gt;).  Using condenseWhite on your TextField will take care of that.  In my case, I have to preserve whitespace, so some pre-processing of the text is necessary to strip out the offending characters.&lt;br /&gt;&lt;br /&gt;Also, in my demo I have padding on my TextArea.  This throws off getCharBoundaries, and I compensate by passing an xOffset and yOffset value into the Highlighter class.&lt;br /&gt;&lt;br /&gt;Speaking of TextAreas... In the Flex components that use a TextField, there is a property called textField, which would be ideal for my Highlighter class to make use of.  But, no.  It is protected.  Am I really going to extend every component in the Flex framework that I want to use my Highlighter class with?  Please.  For now, I iterate through the children of the TextArea until I find a TextField.  It seems to work fine, but I'd prefer to not resort to such hackery.  Anyone else got an alternative?&lt;br /&gt;&lt;br /&gt;I'm really happy with the Highlighter class so far, but I'm no architect.  I could really use some feedback on what should be public, private, protected, etc... and just architectural advice in general, I guess.  How can I make this thing fit in better with the Flex framework?  Are there changes I could make that would simplify things, or improve performance?  Looking forward to your comments.</description></item><item><title>Flash/Flex TextField Bug - Dancing FlashType Characters</title><link>http://tom-lee.blogspot.com/2007/01/flashflex-textfield-bug-dancing.html</link><author>noreply@blogger.com (tom)</author><pubDate>Tue, 16 Jan 2007 22:17:26 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-5798976999232204050</guid><description>I just discovered this TextField bug today and wanted to get a demo of it out there.  Basically, there are certain whitespace characters which are not properly handled by Flash TextFields.  If you're not aware of them, they can really leave you scratching your head.  One thing they can do is throw off the text metrics returned by methods such as getCharBoundaries, making them wildly unpredictable.  A more visible symptom of these characters is text that expands, wiggles and reflows every time you make a selection or click within the TextField.&lt;br /&gt;&lt;br /&gt;Check out the &lt;a href="http://labs.tom-lee.com/Flex/TextFieldBugs.html"&gt;demo&lt;/a&gt;, and the &lt;a href="http://labs.tom-lee.com/Flex/TextFieldBugs.mxml"&gt;mxml&lt;/a&gt; used to make it.  To replicate the issue in the top TextArea, click in the white space to the left of a line of text, and then drag right to select.  You should see the text wriggle and jump around like me after a six pack.  Notice the bottom TextArea doesn't have the problem, because it doesn't use FlashType.&lt;br /&gt;&lt;br /&gt;The character codes that can cause the anomolous behavior are:&lt;br /&gt;11,12,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,30,31, &amp; 160.&lt;br /&gt;&lt;br /&gt;Most of these characters will never be a problem, because they're seldom encountered in the wild.  However, 160 is frequently seen in its other form:   - the non-breaking space.&lt;br /&gt;&lt;br /&gt;To work around this issue, I'll be pre-processing all HTML that comes into Flash by stripping out all those characters and replacing them with regular old spaces, which don't have the problem.</description></item><item><title>SIFR 3 Beta Announced - Should I Finish Mine?</title><link>http://tom-lee.blogspot.com/2007/01/sifr-3-beta-announced-should-i-finish.html</link><author>noreply@blogger.com (tom)</author><pubDate>Thu, 04 Jan 2007 15:05:45 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-116794419075565485</guid><description>Mark Wubben of novemberborn.net has recently &lt;a href="http://novemberborn.net/sifr3/beta1"&gt;announced&lt;/a&gt; SIFR 3 Beta 1, which he has been diligently working on for quite some time. It's looking very good, and I'm really glad to see that he is still on the case - it's a pretty complicated task, especially for one guy, and if anyone's up to the challenge, he is.&lt;br /&gt;&lt;br /&gt;I &lt;a href="http://tom-lee.blogspot.com/2006/06/sifr-alternative-update_05.html"&gt;attempted my own Flash heading replacement solution&lt;/a&gt; (TL.FlashHeaders) some months ago, and ran out of steam at the alpha stage when I suddenly got really busy with other work. Now, I'm slowly beginning to get some more free time, but since SIFR 3 is so close to being done, I'm debating whether it's worth finishing TL.FlashHeaders.&lt;br /&gt;&lt;br /&gt;There are a couple of areas where TL.FlashHeaders differs from SIFR in concept. For one, TL.FlashHeaders requires almost no JavaScript configuration. Fonts are specified in CSS, rather than in JavaScript. I really wanted deployment to be as easy including the JS library in the head of your document, and specifying the fonts in CSS as you normally would. There are no special style sheets to include. Everything should just take care of itself.&lt;br /&gt;&lt;br /&gt;The second main difference is in the way that TL.FlashHeaders handles fonts. It uses a standard Flash shared font library, so it can be reused in other Flash applications. This approach allows support for multiple fonts within the same heading.&lt;br /&gt;&lt;br /&gt;Third, I wanted to provide support for inline headings. This may be the most problematic feature to implement cross-platform, due to box model differences, and may be the least useful.&lt;br /&gt;&lt;br /&gt;One of the compromises I had to make in order to achieve those goals was dropping support for Opera. I did, however, keep support for IE 5.x and Netscape 7.2.&lt;br /&gt;&lt;br /&gt;Here's the current &lt;a href="http://labs.tom-lee.com/HeadingReplacement/Alpha/"&gt;test page&lt;/a&gt;. I haven't touched the code in months, and I know it's got some issues at the moment. Try resizing the page to see how things scale. Even the floats at the top of the page should scale as they normally would. To compare, &lt;a href="http://labs.tom-lee.com/HeadingReplacement/Alpha/hr-off.html"&gt;here's the same page without TL.FlashHeaders&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Even if I don't finish it, it was totally worth starting. One thing that was really awesome about developing my own solution in parallel to SIFR 3 was that I was able to contribute to Mark's efforts a little bit, and it always feels good when someone else finds your work helpful. Also, I learned a ton of stuff that has already been useful in other projects.&lt;br /&gt;&lt;br /&gt;Early on, there were a few people who expressed interest in the project.  So, what do you think? Should I finish what I started, or move on to other things?  It's sooo close....</description></item><item><title>Photoshop CS3 Beta - First impressions</title><link>http://tom-lee.blogspot.com/2006/12/photoshop-cs3-beta-first-impressions.html</link><author>noreply@blogger.com (tom)</author><pubDate>Fri, 15 Dec 2006 12:09:02 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-116620614287777052</guid><description>Got my hands on the Photoshop CS3 beta, and I gotta say I'm impressed.  Smart Filters are going to revolutionize the way I work in Photoshop.  Non-destructive editing has been a long time coming in Photoshop (it's been the standard paradigm for ages in some less-popular apps), but I'm happy to see that we're getting there by stages.  This brings us one step closer to the day that "Undo" is just an unnecessary extra.  But even without the new features, I'd still love it for the native MacTel support!&lt;br /&gt;&lt;br /&gt;Rather than do a full writeup, I'll simply point you to &lt;a href="http://www.photoshopuser.com/cs3/sk_features.html"&gt;somebody else that has already done a pretty good job&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Also, the beta doesn't seem to be posted on Adobe Labs yet, so if you wanna get the bits yourself, just poke around on &lt;a href="http://www.digg.com"&gt;Digg&lt;/a&gt;.</description></item><item><title>IE CSS Rollovers - Revisited</title><link>http://tom-lee.blogspot.com/2006/09/ie-css-rollovers-revisited.html</link><author>noreply@blogger.com (tom)</author><pubDate>Tue, 12 Sep 2006 17:07:07 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-24210730.post-115809872439604548</guid><description>Haven't had much to say lately, as I have been busy trying to wrap a project. However, I felt like this was worth taking some time to share it.&lt;br /&gt;&lt;br /&gt;Basically, the &lt;a href="http://tom-lee.blogspot.com/2006/07/ie-css-rollover-cache-bug.html"&gt;IE Rollover Cache Bug&lt;/a&gt; came back to bite me today. Now, there are many documented solutions to avoiding that annoying flicker in IE when you change the background image of a hyperlink. My personal favorite is &lt;a href="http://wellstyled.com/css-nopreload-rollovers.html"&gt;this one&lt;/a&gt;. But what about the browser activity indicators that are stopped and reset when you mouse out of the button? I see far less discussion of that issue, and know of no solution expect for the one I'm about to document.&lt;br /&gt;&lt;br /&gt;Let me describe this in a little more detail. If you click a hyperlink that has a background image, all of Internet Explorer's browser activity indicators will be stopped and reset when you move your mouse off of that hyperlink. By 'browser activity indicators' I mean the 'spinner' (wavy window animation) in the upper right corner of the browser, as well as the status bar at the bottom of the browser (in WinXP, this is green &amp; segmented). This gives the impression that the page load is complete when in fact it is not - the requested page will be displayed eventually. This happens regardless of whether you are changing the background-image property. If you change ANYTHING about that hyperlink (border-colors, sizes, text-decoration) the activity indicators will be interrupted. I can readily confirm this on IE 6, and I'm pretty sure it happens in IE 5.5. IE 5 seems to be immune. I hope to god it's fixed in IE 7.&lt;br /&gt;&lt;br /&gt;Typically, this is not a problem because page loads happen pretty quickly these days. But if your link is submitting a form and the server takes some time responding, this can get to be quite a problem. Thinking the form submission has quietly failed, the user will click the button repeatedly, badgering your server with extra requests. Bad for the user, bad for you.&lt;br /&gt;&lt;br /&gt;Onward to the solution. I was almost ready to give up and ban image rollovers entirely, when it occured to me that there was one last trick I hadn't tried yet. All you have to do is display the image using Microsoft's proprietary DirectX filters instead of the normal browser pipeline. Here's what you do:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;p&gt;/* Set up your rollover as normal */&lt;br /&gt;a.MyButton{&lt;br /&gt;&lt;br /&gt;background:url('Images/MyButton.gif');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;a.MyButton:hover{&lt;br /&gt;background:url('Images/MyButtonOver.gif');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* Now hack for IE (using star hack for brevity here)*/&lt;br /&gt;&lt;br /&gt;* html a.MyButton{&lt;br /&gt;background:none;&lt;br /&gt;&lt;br /&gt;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='Images/MyButton.gif',&lt;br /&gt;sizingMethod='image');&lt;br /&gt;position:relative;&lt;br /&gt;cursor:hand;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;* html a.MyButton:hover{&lt;br /&gt;background:none;&lt;br /&gt;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='Images/MyButtonOver.gif', sizingMethod='image');&lt;br /&gt;}&lt;br /&gt;&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;That's basically it. Since the problem only occurs in IE, I'm fine with using a Microsoft proprietary solution. Now, AlphaImageLoader comes with its own set of caveats and gotchas, not the least of which is that you can't position the image at all. Sometimes I need to. As a workaround for that, I put an empty div in my hyperlink to which I apply the image instead, and then position the div with absolute positioning. Another point to be aware of is that &lt;a href="http://www.daltonlp.com/daltonlp.cgi?item_type=1&amp;amp;item_id=217"&gt;sometimes hyperlinks will not function&lt;/a&gt; if they have an image applied in this way. However, position:relative should cure that.&lt;br /&gt;&lt;br /&gt;I hope this helps some poor frustrated soul. As always, please post any questions or comments, and I'll do my best to find the answers.</description></item></channel></rss>
