<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Web 3.0, 6 Bladed Razors, 7 Minute Abs &#187; Reviews</title>
	<atom:link href="http://www.zachleat.com/web/category/reviews/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zachleat.com/web</link>
	<description></description>
	<pubDate>Thu, 21 Aug 2008 06:02:08 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>20000 Leagues Under the API: YouTube JavaScript</title>
		<link>http://www.zachleat.com/web/2008/04/05/20000-leagues-under-the-api-youtube-javascript/</link>
		<comments>http://www.zachleat.com/web/2008/04/05/20000-leagues-under-the-api-youtube-javascript/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 03:47:33 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
		
		<category><![CDATA[CSS]]></category>

		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Youtube]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/?p=120</guid>
		<description><![CDATA[Today, children, we&#8217;ll be exploring the wonderful world of the official JavaScript API published by YouTube a few weeks ago.  I read a few interesting posts on the subject when it first came out, and it&#8217;s been on my list of things to explore for the next (and hopefully last) version of Alarmd. This [...]]]></description>
			<content:encoded><![CDATA[<p>Today, children, we&#8217;ll be exploring the wonderful world of the official JavaScript API published by YouTube a few weeks ago.  I read a <a href="http://apiblog.youtube.com/2008/03/something-to-write-home-about.html">few</a> <a href="http://blogoscoped.com/archive/2008-03-14-n11.html">interesting</a> <a href="http://www.wait-till-i.com/2008/03/12/video-captioning-made-easy-with-the-youtube-javascript-api/">posts</a> on the subject when it first came out, and it&#8217;s been on my list of things to explore for the next (and hopefully last) version of <a href="http://www.alarmd.com/">Alarmd</a>. This isn&#8217;t going to be a long post so much as a laundry list of points worth mentioning and limitations there-of regarding the API itself.</p>
<ol>
<li>If you want to change videos dynamically by loading a new video into an existing player, you must use the Chromeless player (which requires an API key).  The loadVideoById() method is only available in the Chromeless player.  Whatever you do, don&#8217;t try to dynamically destroy and create a new player, this will cause JavaScript errors in Internet Explorer (although not Firefox).</li>
<li>CSS properties: When the player has the css <code>display: none</code> applied, it will not play.  When the css <code>visibility: hidden</code> is applied, the video will still play, but will not be shown on the screen.  If you wanted a headless player, like what the music search engine <a href="http://humanized.com/weblog/2007/11/13/songza-launch/">Songza</a> does, you&#8217;d want to take this approach.  Word of warning, there&#8217;s some tricky shit going on when you try to dynamically change these properties on a player and run commands on the player at the same time (or close to the same).  For instance, I got into a sticky situation where I&#8217;d try to show the player and load a new video into the player in the same method.  I had to separate these with a timeout to get both to run without error.</li>
<li>To load, you must play.  Unfortunately, I wanted to pre-load the video without actually playing the video.  This is unsupported.  To handle this, I had to play, then pause after a timeout (using window.setTimeout).  Not the prettiest, but it seems to work.  Obviously the API in this case has very low cohesion, as the loadVideoById method ALSO plays the video, not simply doing ONLY what the method name suggests.</li>
<li>Forcing a global? When the player first loads after you&#8217;ve used the SWFObject embedSWF() command, it will call the function onYouTubePlayerReady(), which you can&#8217;t customize.  It must be that function name, and it must be in the global namespace.  Keep in mind that onYouTubePlayerReady() is called every time the player is shown (when it was otherwise hidden using the css <code>display: none</code>)</li>
</ol>
<p>Unfortunately, there is some voodoo going on here that I don&#8217;t fully understand.  I&#8217;m not a flash guru, nor have I ever claimed to be.  But there have been a few bugs in my experience with the API that have led me to believe that it&#8217;s not quite there yet.  Maybe my use cases were a bit unique, but they weren&#8217;t that extreme.  I should be able to hide and show the player without error.  I should be able to destroy the player without error.  I should be able to load a video without playing it.</p>
<p>But hey, it works.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/2008/04/05/20000-leagues-under-the-api-youtube-javascript/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Code Like the Big Boys: Flickr</title>
		<link>http://www.zachleat.com/web/2008/03/30/code-like-the-big-boys-flickr/</link>
		<comments>http://www.zachleat.com/web/2008/03/30/code-like-the-big-boys-flickr/#comments</comments>
		<pubDate>Mon, 31 Mar 2008 04:04:29 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
		
		<category><![CDATA[CSS]]></category>

		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Flickr]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/?p=119</guid>
		<description><![CDATA[Code like the Big Boys is a series of posts about code solutions used by major websites.  What can we learn from these professional websites to use in our own code?
JavaScript
Looking at the source code of the Flickr home page is actually pretty strange.  For one, there is only one JavaScript source code [...]]]></description>
			<content:encoded><![CDATA[<p><em>Code like the Big Boys is a series of posts about code solutions used by major websites.  What can we learn from these professional websites to use in our own code?</em></p>
<p><strong>JavaScript</strong></p>
<p>Looking at the source code of the Flickr home page is actually pretty strange.  For one, there is only one JavaScript source code file (other than the advertising scripts), a solution for <a href="http://webfx.eae.net/dhtml/pngbehavior/pngbehavior.html">PNG Alpha Transparency in Internet Explorer</a>, included as an <a href="http://msdn2.microsoft.com/en-us/library/ms531018(VS.85).aspx">HTML Component</a>.  The source for the PNG Behavior script (credit to Erik Arvidsson) is unchanged, with the exception of the removal of some extraneous comments, but curiously enough no whitespace removed (a suggestion to save them a few bucks in bandwidth).  Looking at their HTML source, they seem to emphasize whitespace and readability over bandwidth savings, which seems fine to me.  At least their visitors (you and I) can more easily learn something from their code.</p>
<p><strong>CSS</strong><br />
They've taken the same route as one of the tips from <a href="http://snook.ca/archives/html_and_css/top_css_tips/">Jonathan Snook</a>, and declared all styles for an element on a single line.  They use your standard css to reset to a base starting point, much like YUI's Reset CSS we're all familiar with.  One interesting declaration I noticed prominently inside of their CSS was the .Butt css class, declared on their primary Search form button.  I'm curious to know the semantic meaning behind that one.</p>
<p>They use the <a href="http://www.info.com.ph/~etan/w3pantheon/style/starhtmlbug.html">tan hack</a> as well to isolate a CSS declaration for IE browsers:</p>
<div class="syntax_hilite">
<div id="css-4">
<div class="css">* html #featured-image cite <span style="color: #66cc66;">&#123;</span><span style="color: #000000; font-weight: bold;">bottom</span>: -1px;<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p>This is to workaround for an IE limitation to absolutely positioning content at the bottom of a relatively positioned div, in this case the black box containing the credits (or citation, hence the cite tag) inside of the feature image.</p>
<p><img src="http://www.zachleat.com/web/wp-content/uploads/2008/03/flickr_cite.jpg" alt="Flickr Citation Tag" title="flickr_cite" width="500" height="230" class="alignnone size-full wp-image-118" /></p>
<p>Another interesting CSS Hack they've employed involves the line-height for &lt;a&gt; tags containing Unicode characters to select different languages.  It starts out like <a href="http://www.dustindiaz.com/min-height-fast-hack/">Dustin Diaz's min-height hack</a>, but throws a loop.</p>
<div class="syntax_hilite">
<div id="css-5">
<div class="css"><span style="color: #000000; font-weight: bold;">height</span>: 0px !important;<br />
<span style="color: #000000; font-weight: bold;">height</span> <span style="color: #808080; font-style: italic;">/**/</span>:13px;</div>
</div>
</div>
<p></p>
<p>I'm not familiar with the <code>/**/</code> syntax, and would really appreciate any information someone has on what platform this is targeting.  A comment would be nice!</p>
<p><strong>HTML</strong></p>
<p>Standard here, and they have some nice meta tags for the I-phone:</p>
<div class="syntax_hilite">
<div id="html-6">
<div class="html"><span style="color: #009900;"><a href="http://december.com/html/4/element/meta.html"><span style="color: #000000; font-weight: bold;">&lt;meta</span></a> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"viewport"</span> <span style="color: #000066;">content</span>=<span style="color: #ff0000;">"width=950"</span> /<span style="color: #000000; font-weight: bold;">&gt;</span></a></span></div>
</div>
</div>
<p></p>
<p>All in all, it's short and sweet code for a home page.  It's nice to see such clean code with an eye towards standards on a commercially successful site, many props to their programmers.  I'm scared to do my next in the series, because I'm 100% sure it won't be as nice of a read as Flickr was.</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/Flickr" rel="tag">Flickr</a>, <a href="http://technorati.com/tag/CSS" rel="tag"> CSS</a>, <a href="http://technorati.com/tag/JavaScript" rel="tag"> JavaScript</a>, <a href="http://technorati.com/tag/HTML" rel="tag"> HTML</a>, <a href="http://technorati.com/tag/PNG" rel="tag"> PNG</a>, <a href="http://technorati.com/tag/Iphone" rel="tag"> Iphone</a>, <a href="http://technorati.com/tag/Meta" rel="tag"> Meta</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/2008/03/30/code-like-the-big-boys-flickr/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Online Movie Rental Review - Amazon Unbox</title>
		<link>http://www.zachleat.com/web/2008/01/25/online-movie-rental-review-amazon-unbox/</link>
		<comments>http://www.zachleat.com/web/2008/01/25/online-movie-rental-review-amazon-unbox/#comments</comments>
		<pubDate>Sat, 26 Jan 2008 04:47:28 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
		
		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Amazon]]></category>

		<category><![CDATA[CinemaNow]]></category>

		<category><![CDATA[iTunes]]></category>

		<category><![CDATA[MovieLink]]></category>

		<category><![CDATA[Netflix]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2008/01/25/online-movie-rental-review-amazon-unbox/</guid>
		<description><![CDATA[Renting movies online.  Steve Jobs was hilariously excited about his new Apple TV product and being able to rent movies online and stream them directly to your television.  So, with all this movie-watching titillation, I decided to check out if the hubbub was actually worthy of my attention.  Turns out, not so [...]]]></description>
			<content:encoded><![CDATA[<p>Renting movies online.  Steve Jobs was hilariously excited about his new Apple TV product and being able to rent movies online and stream them directly to your television.  So, with all this movie-watching titillation, I decided to check out if the hubbub was actually worthy of my attention.  Turns out, not so much.</p>
<p>Prior to deciding which movie rental service to use, I googled to find the main competitors.  Apparently they are:</p>
<ul>
<li><a href="http://www.cinemanow.com/">CinemaNow</a></li>
<li><a href="http://www.movielink.com">Movielink</a></li>
<li><a href="http://www.apple.com/itunes/store/movies.html">iTunes Movies</a> (Ugh, what a name)</li>
<li><a href="http://www.amazon.com/Unbox-Video-Downloads/b?ie=UTF8&#038;node=16261631">Amazon Unbox</a></li>
<li><a href="http://www.netflix.com/">Netflix</a> (Barely)</li>
</ul>
<p>As of right now, I am not concerned with playing these movies on my television or any portable device.  All I want to do is save myself a trip to the video store.  Upon going to the CinemaNow and Movielink websites, they were both advertising the movie I wanted to rent on their home pages: Bourne Ultimatum.  iTunes Movies didn't even have the title -- it would appear that they're severely lacking in library quantity right now.  But after a little bit more review reading, I finally found Amazon Unbox.  Of course, I gravitated towards this service since I already had a consumer relationship with Amazon, and don't want to spread my credit information all over the web.  And it appeared that they had what I needed -- the Bourne Ultimatum, the PC viewing experience, and an non-exorbitant price tag, at $3.99.  More than ideal, but tonight I considered the trade off between not having to leave my house and letting Amazon use my bandwidth fair enough (although in a normal state, I would not consider $3.99 to be a fair price when the rental price is the same at the brick and mortar store, which should by all means include the cost of the building and the purchase of the actual DVD title I was carrying out of the store).  </p>
<p>So, considering my past dealings with Amazon, I went with their service.  They already had all my information and renting the DVD was almost too easy (I don't like the one click purchasing).  To my surprise and disappointment, however, I have yet to start watching my movie 35 minutes after renting it.  That's, in fact, why I am here writing this review.  I'm killing time.  I realized upon launching the client is that it <strong>requires a download time of 90 minutes at 240 KB/s</strong> (average)!  What???  What year is this?  That's almost 1.2 GB of movie!  This isn't P2P, this is an actual product that I spent money on.  CinemaNow, MovieLink, and iTunes movies all claim to have pseudo-instant-play, which allows you to start watching the movie immediately after purchase (with a little bit of buffering, of course).  Even <a href="http://www.netflix.com/">Netflix </a> has pseudo-instant-play, with it's online viewable library of pre-1990's classics (and not much else - let me tell you; Netflix definitely wants you to rent their DVDs in the mail, their online library is pathetic).</p>
<p>So, if you're sitting at home by yourself, with at least $4 on your credit card, a broadband internet connection at your fingertips, Windows XP or Vista on your computer browsing with Internet Explorer and the willingness to download and install a proprietary client, and you don't mind giving away your dignity and any self respect you have going against the ideals of capitalism and the reward a good product should receive by creating usable and <em>non-eye-gougable value</em> for the consumer in the form of a good trade off between hard earned money and the warm friendly glow of an entertaining movie, I would say that renting movies online is a great way to spend an evening.  However, if you're capable of sensing the least amount of dripping sarcasm from a well intentioned but entirely too wordy sentence, you'd be like me and wish you'd saved your money, because I still have 30 minutes to wait until my damn movie starts.</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/Amazon" rel="tag">Amazon</a>, <a href="http://technorati.com/tag/Unbox" rel="tag"> Unbox</a>, <a href="http://technorati.com/tag/Netflix" rel="tag"> Netflix</a>, <a href="http://technorati.com/tag/Movielink" rel="tag"> Movielink</a>, <a href="http://technorati.com/tag/CinemaNow" rel="tag"> CinemaNow</a>, <a href="http://technorati.com/tag/iTunes" rel="tag"> iTunes</a>, <a href="http://technorati.com/tag/Movies" rel="tag"> Movies</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/2008/01/25/online-movie-rental-review-amazon-unbox/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Obscurity, Security, and Captcha</title>
		<link>http://www.zachleat.com/web/2007/11/01/obscurity-security-and-captcha/</link>
		<comments>http://www.zachleat.com/web/2007/11/01/obscurity-security-and-captcha/#comments</comments>
		<pubDate>Fri, 02 Nov 2007 03:04:49 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
		
		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Captcha]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/11/01/obscurity-security-and-captcha/</guid>
		<description><![CDATA[On Ajaxian recently, there have been a few posts touting new and inventive replacements for the more traditional distorted and discolored "What does this image say?" Captcha gatekeeper for your web form.  Of course these are all intended to provide a mechanism to tell the difference between an automated web bot that is spamming [...]]]></description>
			<content:encoded><![CDATA[<p>On Ajaxian recently, there have been a few posts touting new and inventive replacements for the more traditional distorted and discolored "What does this image say?" Captcha gatekeeper for your web form.  Of course these are all intended to provide a mechanism to tell the difference between an automated web bot that is spamming your web form and a human being.</p>
<p>Obviously there are some accessibility issues with Captcha images, in that they are useless to those that are vision impaired.  Some sites provide an alternate link to an audio file that speaks a random word that you must then enter into the form.</p>
<p>One of the easiest ways to implement a Captcha on your site is to use the <a href="http://recaptcha.net/">reCAPTCHA plugin</a>.  But that's not what I'm going to talk about here.  What I want to talk about is these new methods being introduced.</p>
<p>The first that was recently linked was <a href="http://ajaxian.com/archives/preventing-spam-with-drag-and-drop">a method that involved drag and drop</a> to authenticate the user.  Obviously this method is flawed, especially if the automated robot has access to fire JavaScript events.  It does nothing but introduce a different door that the spammer may not have seen before.  When this method gains any sort of popularity, or if a spammer decides to attack the site implementing this method specifically, it would not be difficult to bypass the Captcha.  This is referred to in the computer world as "<a href="http://en.wikipedia.org/wiki/Security_through_obscurity">Security through Obscurity</a>".  This is not good practice.</p>
<p>The next post I read was <a href="http://almaer.com/blog/are-you-human">regarding an implementation that presented the user with 8 boxes</a>, with one of those boxes colored differently with an invitation to find and click on the differently colored box. The was implemented by <a href="http://www.passpack.com/info/home/">Passpack</a> (a password hosting service -- should be focused on security, right?).  Correctly me if I'm wrong, but how is this difficult for the Spammer at all?  The whole point of a Captcha is to distort the text inside the image so much that the image can't be read by an <a href="http://en.wikipedia.org/wiki/Optical_character_recognition">Optical Character Recognition (OCR)</a> program.  Basically, they've simplified it down to a one pixel image, which is an infinitely easier optical recognition problem.  You don't even have to recognize characters, you can just see if the pixel is a 1 or a 0.  Forgive me for asking, but is that problem NP complete?</p>
<p>I am all for having more friendly humane methods of Spam Bot detection.  Just be wary of the methods you're using.  Are they actually secure, or are they just obscure?</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/Security" rel="tag">Security</a>, <a href="http://technorati.com/tag/Captcha" rel="tag"> Captcha</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/2007/11/01/obscurity-security-and-captcha/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Why Do Fame-Based Bloggers Act Like Children?</title>
		<link>http://www.zachleat.com/web/2007/10/04/why-do-fame-based-bloggers-act-like-children/</link>
		<comments>http://www.zachleat.com/web/2007/10/04/why-do-fame-based-bloggers-act-like-children/#comments</comments>
		<pubDate>Fri, 05 Oct 2007 04:42:01 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
		
		<category><![CDATA[Artistic]]></category>

		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Blogging]]></category>

		<category><![CDATA[Comic]]></category>

		<category><![CDATA[Rant]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/10/04/why-do-fame-based-bloggers-act-like-children/</guid>
		<description><![CDATA[Normally this blog is about JavaScript and front-end engineering, but today I'm going to play my once per six month rant-card and go on for a bit, so please bear with me.  You can read my last rant-card here.
Ever open up your RSS reader only to be greeted with a collection of posts that [...]]]></description>
			<content:encoded><![CDATA[<p><em>Normally this blog is about JavaScript and front-end engineering, but today I'm going to play my once per six month rant-card and go on for a bit, so please bear with me.  You can read <a href="http://www.zachleat.com/web/2007/04/23/twitter-is-polluting-the-search-space/">my last rant-card here</a>.</em></p>
<p>Ever open up your RSS reader only to be greeted with a collection of posts that feels like an episode of prepubescent Survivor (Sorry to international readers, that is an American TV reference).  Whining, name calling, immaturity are all the rage nowadays, especially from so-called "professional" bloggers that seem more interested in their analytics package than providing decent content.  Here's a few rules that I use for pruning my subscriptions that others might find useful:</p>
<ol>
<li>If you're blog is named after yourself, that's one strike.  Having a domain name named after yourself is fine (exempt myself?), but a blog should be about a subject, and unless you're posting about your dating life and the consistency of your cat's shit in the litter box (which may or may not overlap each other), your blog title should suggest a subject as well.</li>
<li>If you've posted about a meaningless internet pissing match (a trivial contest in which a group of people stand in a line and see who's urine can travel the most in-air distance), that's big strike number two.  You're polluting my subset of the internet.  You know what I'm talking about because we've all read those train wrecks.</li>
<li>If you're constantly plugging something that is <strong>not</strong> interesting, say goodbye.  I don't mind it if you're talking about something that actually has value.  I love reading <a href="http://www.burningdoor.com/askthewizard/">Ask the Wizard</a>, because he's actually writing about something useful, not just plugging FeedBurner (not that he'd need to).</li>
</ol>
<p><img src='http://www.zachleat.com/web/wp-content/uploads/2007/10/promqueens.png' alt='Blogging Prom Queens' /></p>
<p>Now take a moment to consider which blogs in your feed reader might match these criteria.  Then indulge yourself and consider what actual value these blogs provide.  If you like the entertainment of a good cat fight, by all means, keep reading.  But if you're like me and find yourself with the conclusion that these blogs don't provide a <strong>wrinkle</strong> to the gray matter between your ears, I would encourage you to go into your feed reader and unsubscribe.  The best thing you can do with a troll is to ignore them completely.</p>
<p>What blogs do you stay away from?  (Titles only please, no links)</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/bloggers" rel="tag">bloggers</a>, <a href="http://technorati.com/tag/blogging" rel="tag"> blogging</a>, <a href="http://technorati.com/tag/rss" rel="tag"> rss</a>, <a href="http://technorati.com/tag/techmeme" rel="tag"> techmeme</a>, <a href="http://technorati.com/tag/techmeme-leaderboard" rel="tag"> techmeme-leaderboard</a>, <a href="http://technorati.com/tag/web-3.0" rel="tag"> web-3.0</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/2007/10/04/why-do-fame-based-bloggers-act-like-children/feed/</wfw:commentRss>
		</item>
		<item>
		<title>What Sound Does a Cow Make?  MooTools.</title>
		<link>http://www.zachleat.com/web/2007/07/22/what-sound-does-a-cow-make-mootools/</link>
		<comments>http://www.zachleat.com/web/2007/07/22/what-sound-does-a-cow-make-mootools/#comments</comments>
		<pubDate>Sun, 22 Jul 2007 06:51:16 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
		
		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Mootools]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/07/22/what-sound-does-a-cow-make-mootools/</guid>
		<description><![CDATA[Frameworks, Frameworks everywhere.  There are the big six: Dojo, jQuery, prototype/scriptaculous, Ext, Mootools, and YUI.  (Honorable meantion to Open Rico and Mochikit)  I've had limited experience with all of these frameworks, but have actually worked on projects involving YUI and jQuery.  So when I was shopping around for a framework that [...]]]></description>
			<content:encoded><![CDATA[<p>Frameworks, Frameworks everywhere.  There are the big six: Dojo, jQuery, prototype/scriptaculous, Ext, Mootools, and YUI.  (Honorable meantion to Open Rico and Mochikit)  I've had limited experience with all of these frameworks, but have actually worked on projects involving YUI and jQuery.  So when I was shopping around for a framework that I didn't have extensive experience with for my next project, I decided to with Mootools.  They've been getting a lot of traffic lately for posting their <a href="http://mootools.net/slickspeed/">SlickSpeed Selectors Test</a>, so I figured why not try their wares.</p>
<p>Originally coming from the YUI Library (a strictly namespaced, well organized package), and then learning jQuery (a language with object chaining, a more object oriented approach, and a much larger community), the Mootools package definitely caught me off guard.</p>
<p>My first surprise was that it put functions EVERYWHERE!  The Core file puts approximately ten functions in the global namespace, with the only indicator that they belong to Mootools being that they had a dollar sign prefix (e.g. $extend).  Couldn't these go into one global Mootools object?  $E, $ES?  These are given shortcuts with the normal $ and $$ functions.  It just seems all over the place.</p>
<p>That being said, there is a lot of good functionality in the base Mootools distribution.  A built in class to do Json communication (something YUI is lacking, although I'm sure it wouldn't be too hard to port it in from Captain Crockford's Code on his website), a class to Scroll to elements with nice transitions.  It seems like everytime I would hit a "functional" snag in my project, I could find the exact code I needed already included in the core file.</p>
<p>I love their download page!  Autopackaged code using Dean Edwards' Packer.  One small complaint is that there is no option to disable automatic include of dependencies.  They want you to package Mootools into one single file everytime (which is unwieldy, considering I have to maintain my own text file of which packages I put into the source code, if I don't want everything), and don't let you download just a certain package for separate inclusion.  But when the whole thing weighs in at 40KB, why does it even matter?  I would recommend just downloading all the Components together and just not worrying about it.</p>
<p>All in all, I'm quite happy with my Mootools experience.  I've definitely found that their SmoothScroll class and easy Color fading techniques are used pretty heavily by developers using Mootools, which gives you a sixth sense that the page you're viewing is using the Mootools library.  Sometimes I can just tell without even looking at the source files, which in this case is a good thing, given that we're talking about animation techniques and not raw widget style.  But I plan on writing more about my pet peeves with framework widget styles later on.</p>
<p>If you've been using one framework for a really long time, I would recommend checking out Mootools.  Or any other framework.  The more frameworks that you've tried, the better your perspective is on JavaScript in general, and what your framework's strengths and weaknesses are.  Mix it up!</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/Mootools" rel="tag">Mootools</a>, <a href="http://technorati.com/tag/JavaScript" rel="tag"> JavaScript</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/2007/07/22/what-sound-does-a-cow-make-mootools/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Twitter is Polluting the Search Space.</title>
		<link>http://www.zachleat.com/web/2007/04/23/twitter-is-polluting-the-search-space/</link>
		<comments>http://www.zachleat.com/web/2007/04/23/twitter-is-polluting-the-search-space/#comments</comments>
		<pubDate>Tue, 24 Apr 2007 01:02:48 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
		
		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Rant]]></category>

		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/04/23/twitter-is-polluting-the-search-space/</guid>
		<description><![CDATA[I don't have a problem with Twitter.  I can ignore the "internet enthusiasts" that go crazy over a simple CRUD/database entertainment website, thinly veild as the next big social evolution of the internet.  I can't help but feel that this is just a text-based version of the web-cam phase that the internet went [...]]]></description>
			<content:encoded><![CDATA[<p>I don't have a problem with Twitter.  I can ignore the "internet enthusiasts" that go crazy over a simple CRUD/database entertainment website, thinly veild as the next big social evolution of the internet.  I can't help but feel that this is just a text-based version of the web-cam phase that the internet went through approximately 8 years ago, but with a mobile twist.</p>
<p>Broadcasting Text (HTML and Websites) -> Music (Shoutcast and Internet Radio, Podcasts) -> Video from a Home Computer (Youtube)<br />
Reading Text (Ebooks, Sony Ebook Reader) -> Listening to Music (I-Pod) -> Watching Video (I-Pod, Portable DVD players) <em><strong>on</strong></em> a Mobile Device anywhere you go<br />
Broadcasting Text (Twitter) -> Music (Zune?) -> Video (Justin.tv for everyone?) <em><strong>from </strong></em> a Mobile Device anywhere you go</p>
<p>But they really need to adjust their robots.txt files to stop spiders from crawling the status of every one of their users.  Today I did a  search for YUI DataSource and got the following Google Link headline:</p>
<p><a href="http://twitter.com/bigwebguy/statuses/11125101">Twitter / Lee Shepherd: just finished extending YUI...</a></p>
<p>What sort of value is this going to provide to anyone?</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/twitter" rel="tag">twitter</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/2007/04/23/twitter-is-polluting-the-search-space/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Google Using YUI Grids CSS</title>
		<link>http://www.zachleat.com/web/2007/04/05/google-using-yui-grids-css/</link>
		<comments>http://www.zachleat.com/web/2007/04/05/google-using-yui-grids-css/#comments</comments>
		<pubDate>Thu, 05 Apr 2007 16:33:22 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
		
		<category><![CDATA[CSS]]></category>

		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Google]]></category>

		<category><![CDATA[Licensing]]></category>

		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/04/05/google-using-yui-grids-css/</guid>
		<description><![CDATA[Head over to the Google Homepage.  Log In using your Google Account.  Make sure you're at your Personalized Homepage.  Take a look at the source CSS file ig.css included on the page.  There are a few peculiar lines of code that I recognized from another source, the Yahoo User Interface Grids [...]]]></description>
			<content:encoded><![CDATA[<p>Head over to the <a href="http://www.google.com/ig?hl=en">Google Homepage</a>.  Log In using your Google Account.  Make sure you're at your <a href="http://www.google.com/ig?hl=en">Personalized Homepage</a>.  Take a look at the source CSS file <a href="http://www.google.com/ig/f/tB22vfBbv0g/ig.css">ig.css</a> included on the page.  There are a few peculiar lines of code that I recognized from another source, the Yahoo User Interface Grids CSS file.  Yahoo has provided a set of standard CSS definitions under the BSD license that allow a developer to easily make fluid or fixed width column layouts.  And on the Google Personalized Homepage, there are the following class definitions:</p>
<div class="syntax_hilite">
<div id="code-10">
<div class="code">#modules .<span style="">yui</span>-b<span style="color:#006600; font-weight:bold;">&#123;</span>position:static;display:block;margin:<span style="color:#800000;">0</span> <span style="color:#800000;">0</span> 1em <span style="color:#800000;">0</span>;float:none;width:auto;overflow:hidden;<span style="color:#006600; font-weight:bold;">&#125;</span><br />
.<span style="">yui</span>-gb .<span style="">yui</span>-u<span style="color:#006600; font-weight:bold;">&#123;</span>float:left;margin-left:<span style="color:#800000;">2</span>%;*margin-left:<span style="color:#800000;">1</span>.<span style="color:#800000;">895</span>%;width:<span style="color:#800000;">32</span>%;<span style="color:#006600; font-weight:bold;">&#125;</span><br />
.<span style="">yui</span>-gb div.<span style="">first</span><span style="color:#006600; font-weight:bold;">&#123;</span>margin-left:<span style="color:#800000;">0</span>;<span style="color:#006600; font-weight:bold;">&#125;</span><br />
#modules,.<span style="">yui</span>-gb<span style="color:#006600; font-weight:bold;">&#123;</span>zoom:<span style="color:#800000;">1</span>;<span style="color:#006600; font-weight:bold;">&#125;</span></div>
</div>
</div>
<p></p>
<p>This code includes identical Class names taken from the <a href="http://developer.yahoo.com/yui/grids/">Yahoo User Interface library Grids CSS</a> component.  Here is the source in the <a href="http://yui.yahooapis.com/2.2.0/build/grids/grids-min.css">grids.css</a> file from Yahoo (truncated for simplicity).</p>
<div class="syntax_hilite">
<div id="code-11">
<div class="code">#yui-main .<span style="">yui</span>-b<span style="color:#006600; font-weight:bold;">&#123;</span>position:static;<span style="color:#006600; font-weight:bold;">&#125;</span><br />
.<span style="">yui</span>-t7 #yui-main .<span style="">yui</span>-b <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; display:block;margin:<span style="color:#800000;">0</span> <span style="color:#800000;">0</span> 1em <span style="color:#800000;">0</span>;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span><br />
#yui-main .<span style="">yui</span>-b <span style="color:#006600; font-weight:bold;">&#123;</span>float:none;width:auto;<span style="color:#006600; font-weight:bold;">&#125;</span><br />
.<span style="">yui</span>-gb .<span style="">yui</span>-u<span style="color:#006600; font-weight:bold;">&#123;</span>float:left;margin-left:<span style="color:#800000;">2</span>%;*margin-left:<span style="color:#800000;">1</span>.<span style="color:#800000;">895</span>%;width:<span style="color:#800000;">32</span>%;<span style="color:#006600; font-weight:bold;">&#125;</span><br />
.<span style="">yui</span>-gb div.<span style="">first</span><span style="color:#006600; font-weight:bold;">&#123;</span>margin-left:<span style="color:#800000;">0</span>;<span style="color:#006600; font-weight:bold;">&#125;</span><br />
#bd,.<span style="">yui</span>-gb<span style="color:#006600; font-weight:bold;">&#123;</span>zoom:<span style="color:#800000;">1</span>;<span style="color:#006600; font-weight:bold;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Obviously, it's the same code, with a few minor differences.</p>
<p><img src='http://www.zachleat.com/web/wp-content/uploads/2007/04/yuigrids-google1.jpg' alt='Screenshot proof' /></p>
<p>The interesting thing to note is that the YUI Grids CSS source code is licensed under a <a href="http://developer.yahoo.com/yui/license.html">BSD license</a>, which includes the following provisions:</p>
<blockquote><p>Redistributions of source code must retain the above copyright notice, this list of conditions and the<br />
following disclaimer.</p></blockquote>
<p>The copyright notice they're referring to is not included anywhere on the Google Personalized Homepage (and would seem to be a violation of the license).  Now this may seem like a small infraction when we're just talking about 4 lines of CSS code.  But really, if they think the code is good enough that they will use it in such a prominent way and not write it from scratch using their own means, they should follow the licensing agreements stipulated.</p>
<p><strong>Update</strong><br />
Google has added the BSD license statement and attribution to Yahoo in their CSS file (<a href="http://www.google.com/ig/f/tB22vfBbv0g/ig.css">ig.css</a>):</p>
<div class="syntax_hilite">
<div id="code-12">
<div class="code"><span style="color:#008000;">/* ===============BEGIN BSD LICENSED PORTION============= */</span><br />
<span style="color:#008000;">/*<br />
Copyright (c) 2007, Yahoo! Inc. All rights reserved.<br />
Code licensed under the BSD License:<br />
http://developer.yahoo.net/yui/license.txt<br />
version: 2.2.0<br />
*/</span></p>
<p>#modules .<span style="">yui</span>-b <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; position:static;<br />
&nbsp; display:block;<br />
&nbsp; margin:<span style="color:#800000;">0</span> <span style="color:#800000;">0</span> 1em <span style="color:#800000;">0</span>;<br />
&nbsp; float:none;<br />
&nbsp; width:auto;<br />
&nbsp; overflow:hidden;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span><br />
.<span style="">yui</span>-gb .<span style="">yui</span>-u <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; float:left;<br />
&nbsp; margin-left:<span style="color:#800000;">2</span>%;<br />
&nbsp; *margin-left:<span style="color:#800000;">1</span>.<span style="color:#800000;">895</span>%;<br />
&nbsp; width:<span style="color:#800000;">32</span>%;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span><br />
.<span style="">yui</span>-gb div.<span style="">first</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; margin-left:<span style="color:#800000;">0</span>;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span><br />
#modules,.<span style="">yui</span>-gb <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; zoom:<span style="color:#800000;">1</span>;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span><br />
<span style="color:#008000;">/* ===============END BSD LICENSED PORTION============= */</span></div>
</div>
</div>
<p>
Sorry to everyone visiting the page for the extra millisecond or two it will take to load these comments.</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/YUI" rel="tag">YUI</a>, <a href="http://technorati.com/tag/Grids" rel="tag"> Grids</a>, <a href="http://technorati.com/tag/CSS" rel="tag"> CSS</a>, <a href="http://technorati.com/tag/Licensing" rel="tag"> Licensing</a>, <a href="http://technorati.com/tag/Google" rel="tag"> Google</a>, <a href="http://technorati.com/tag/Yahoo" rel="tag"> Yahoo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/2007/04/05/google-using-yui-grids-css/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Problems with YUI DataTable</title>
		<link>http://www.zachleat.com/web/2007/04/04/problems-with-yui-datatable/</link>
		<comments>http://www.zachleat.com/web/2007/04/04/problems-with-yui-datatable/#comments</comments>
		<pubDate>Wed, 04 Apr 2007 22:52:41 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
		
		<category><![CDATA[CSS]]></category>

		<category><![CDATA[Interface Design]]></category>

		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[ExtJS]]></category>

		<category><![CDATA[Grid]]></category>

		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/04/04/problems-with-yui-datatable/</guid>
		<description><![CDATA[If you have read anything I've written before or know me at all, you know that my go-to JavaScript library is the one and only YUI.  So obviously, when I was looking around for a Grid (or as YUI jargon goes, a DataTable), naturally I'm going to turn to YUI compatible components.  First, [...]]]></description>
			<content:encoded><![CDATA[<p>If you have read anything I've written before or know me at all, you know that my go-to JavaScript library is the one and only YUI.  So obviously, when I was looking around for a Grid (or as YUI jargon goes, a DataTable), naturally I'm going to turn to YUI compatible components.  First, I looked at Jack Slocum's EXT, which has a nice looking Grid component that had a lot of features I wouldn't need, but I didn't really want to take a 0.5 MB hit for the limited feature set I was requiring.  Adding the YUI DataTable would only tack on approximately 70-75 KB of additional download.  So first, let me establish what I'm going for:</p>
<p><strong>Minimum Feature Set</strong>:</p>
<ul>
<li>Client-Side Sorting: I don't want it to do an XMLHttpRequest to sort the data, I want it to be done all clientside.</li>
<li>Simple inline editing: Edit a field in the table right there on the table.  I hadn't established what types of data I would need to edit yet.</li>
<li>Data Sources: load from a native JavaScript array or a XMLHttpRequest returning XML or JSON.</li>
<li>Data Type Sort Algorithms: at the very minimum different sorting algorithms for numeric columns and string columns.</li>
<li>Hierarchical Columns: group column headers together under a parent header.</li>
<li>Easily customizable: must be able to customize the look and feel of the grid easily using CSS and not by editing Javascript.</li>
<li>Header Freeze: If I have overflow on my table vertically causing a scroll bar, I want the table headers to remain shown at the top of the table while I scroll from top to bottom.</li>
<li>Custom Cell Rendering: I have the data I'm loading, but I want to change how it looks when it is rendered to the table.  Common for date formatting.</li>
</ul>
<p><strong>Luxury Feature Set</strong>:</p>
<ul>
<li>Resizeable Columns: change the width of a column by dragging on the column header's right border.</li>
<li>Movable Columns: dragging a column will cause it to be moved on the table (TIBCO General Interface supports this).</li>
<li>Custom Sort Algorithm: write my own algorithm to specify how data is sorted, or provide a way to do multi-column sorting (sort within one column, ties are sorted by another column, and so on).</li>
<li>Dynamic Paging (don't make me click numbered links, load the data automatically when I scroll) both on the client (dynamically insert only what I'm looking at and remove what I've scrolled past) and using the server (load more data through an XMLHttpRequest)</li>
<li>Column Freeze: if the table is going to scroll horizontally, allow the developer to freeze a column or multiple columns so that they are shown when scrolling from left to right.</li>
</ul>
<p><strong>Evaluation of Options</strong>: How does the YUI DataTable stack up?</p>
<p>Basic Items: Client-Side Sorting, Simple inline editing, Data Sources, Data Type Sort Algorithms (<em>stock types not yet implemented out of the box</em>), Hierarchical Columns, Header Freeze (<em>buggy</em>), Custom Cell Rendering, and is easily customizable with CSS.</p>
<p>Luxury Items: Resizeable Columns, Movable Columns (<em>not supported</em>), Custom Sort Algorithms are supported (you can right your own Data Type Sort Algorithms with this feature), Dynamic Paging (manually, not dynamic), Column Freeze (<em>not supported</em>)</p>
<p>Problems:</p>
<ul>
<li>Any sort of fixed width table is going to be problematic.  Putting a fixed width on the table causes the table headers to be misaligned with the associated table data.  It's a mess.  The only viable option here is to let the table do it's own width calculations.  You can't even set the column widths manually using the {width} variable as suggested when using a fixed width table.</li>
<li>Data Type Sort Algorithms supposedly work from the column type, but this feature is documented in the code as being a TODO.  All columns are sorted by a string datatype, meaning that if your column is numeric and you had the following rows: { 3, 7, 40 }, the sort result would be { 3, 40, 7 }.</li>
<li>Header Freeze was problematic.  Implementing the {scrollable=true} feature as recommended by the documentation causes the table headers to be misaligned with the data in a fixed width table.</li>
<li>Paging uses the old school numbers method.  This wasn't a deal breaker, since I classified this feature as a luxury item.</li>
</ul>
<p>Granted, the DataTable in it's current form is a beta component, but that 0.5 MB ExtJS hit is looking pretty nice right now.</p>
<p><strong>Minor Update</strong>: to do a fixed width table that will overflow horizontally, this is the method you can use:</p>
<div class="syntax_hilite">
<div id="code-14">
<div class="code">div#dataTableId <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#008000;">/* change this to whatever id you're using to hold the dataTable */</span><br />
&nbsp; &nbsp; width:520px; <span style="color:#008000;">/* put in your own fixed width */</span><br />
&nbsp; &nbsp; overflow-x:auto;<br />
&nbsp; &nbsp; overflow-y:hidden;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span><br />
.<span style="">yui</span>-dt-headtext, .<span style="">yui</span>-dt-headcontainer <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; position: static; <span style="color:#008000;">/* without this declaration, the headers weren't horizontally scrolling with the data in IE6 */</span><br />
<span style="color:#006600; font-weight:bold;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Technorati Tags: <a href="http://technorati.com/tag/YUI" rel="tag">YUI</a>, <a href="http://technorati.com/tag/DataTable" rel="tag"> DataTable</a>, <a href="http://technorati.com/tag/Grid" rel="tag"> Grid</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/2007/04/04/problems-with-yui-datatable/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
