<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-35312635</id><updated>2010-01-01T02:21:52.657-08:00</updated><title type='text'>Tales of Coding</title><subtitle type='html'>Assorted tales of coding Rich Web Applications, using Ajax, PHP, MySQL, XML, JavaScript, DOM, CSS, and many other trendy acronyms. I will try to update this on a regular basis. Wish me luck.</subtitle><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default?start-index=26&amp;max-results=25'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.frozen-o.com/blog/atom.xml'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>94</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-35312635.post-901766870387548617</id><published>2009-11-15T12:50:00.000-08:00</published><updated>2009-11-15T13:18:28.758-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='advanced ajax'/><title type='text'>Select Advanced Ajax chapters released under Creative Commons</title><content type='html'>&lt;p&gt;So with many thanks to my agent David Fugate and Debra Williams-Cauley at Prentice Hall, I have posted four chapters of &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FAdvanced-Ajax-Architecture-Best-Practices%2Fdp%2F0131350641%3Fie%3DUTF8%26qid%3D1188960159%26sr%3D11-1&amp;tag=amitshaw-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;Advanced Ajax&lt;/a&gt; to archive.org under the Creative Commons &lt;a href="http://creativecommons.org/licenses/by-nc-sa/3.0/us/"&gt;Attribution-Noncommercial-Share Alike&lt;/a&gt; license!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.archive.org/details/AdvancedAjax-Chapter2-Accessibility"&gt;Chapter 2: Accessibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.archive.org/details/AdvancedAjax-Chapter3-Client-sideApplicationArchitecture"&gt;Chapter 3: Client-side Application Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.archive.org/details/AdvancedAjax-Chapter4-DebuggingClient-sideCode"&gt;Chapter 4: Debugging Client-side Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.archive.org/details/AdvancedAjax-Chapter8-KeepingAWebApplicationSecure"&gt;Chapter 8: Keeping a Web Application Secure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I picked these chapters to set free for two main reasons: 1) I think they can prove the most helpful to the largest number of web developers, and; 2) they could also use the most attention in getting updated to include developments since I first wrote them years ago.&lt;/p&gt;

&lt;p&gt;In releasing these under a license that permits remixing/adapting, I also hope to adapt these chapters to use other technologies. One note that I have seen echoed across reviews: this book has a heavy PHP leaning. As such, I've made plans with a &lt;a href="http://code.google.com/webtoolkit/"&gt;&lt;acronym title="Google Web Toolkit"&gt;GWT&lt;/acronym&gt;&lt;/a&gt; enthusiast to start work immediately on a &lt;acronym title="Google Web Toolkit"&gt;GWT&lt;/acronym&gt; version of &lt;a href="http://www.archive.org/details/AdvancedAjax-Chapter3-Client-sideApplicationArchitecture"&gt;Chapter 3: Client-side Application Architecture&lt;/a&gt;, which should also give people more of an idea of how I think these adaptations can work.&lt;/p&gt;

&lt;p&gt;Random note: I recently received a few copies of my book translated into both Hungarian and Polish. While I want to hang onto one of each for the novelty of it, anyone in the Austin area who reads one of those languages please feel free to get in touch and I'll gladly give one to you in exchange for feedback on how well the translation works.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-901766870387548617?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/901766870387548617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=901766870387548617' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/901766870387548617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/901766870387548617'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2009/11/select-advanced-ajax-chapters-released.html' title='Select Advanced Ajax chapters released under Creative Commons'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-6320531753958088151</id><published>2009-02-26T19:08:00.000-08:00</published><updated>2009-02-26T19:15:45.386-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='webkit'/><category scheme='http://www.blogger.com/atom/ns#' term='sample code'/><category scheme='http://www.blogger.com/atom/ns#' term='randomness'/><category scheme='http://www.blogger.com/atom/ns#' term='web standards'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>WebKit CSS Animation behavior weirdness</title><content type='html'>&lt;p&gt;Okay, not weirdness. I guess more like (up until now) undocumented behavior. Due to a workaround that I needed to implement in order to properly clear out CSS properties when starting a new transition in my hacked-out S5 presentation, I filed &lt;a href="https://bugs.webkit.org/show_bug.cgi?id=23528"&gt;Bug 23528: CSS transitions on opacity fail when used with visibility in certain circumstances&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When performing a transition, I had expected that a function like the following (simplified for demonstration) would work:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;/**
 * 1. take the element,
 * 2. make it visible,
 * 3. yet transparent,
 * 4. then set the transition,
 * 5. and then have it fade from opacity of 0 to 1 over one second.
 */
function fadeIn() {
    // &amp;lt;span id="one" style="visibility: hidden;"&amp;gt;testing&amp;lt;/span&amp;gt;
    var theOne = document.getElementById("one");
    theOne.style.visibility = "visible";
    theOne.style.opacity = 0;
    theOne.style.WebkitTransition = "all 1s ease-in-out";
    theOne.style.opacity = 1;
}&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Instead of fading in over one second, the &lt;span&gt;span&lt;/span&gt; instantly appears, as if the last three lines of the function didn't even exist. This happens because CSS changes don't take effect when you assign new values. They queue up, taking effect once the JavaScript thread of execution ends. This makes sense for static changes, so that if you have a whole load of changes to apply to the DOM where many of the changes end up canceling out by the time the thread ends, the browser has no reason to apply each one of them to the DOM just in order to remove the change in the end. It also makes sense in a pure performance sense, since this keeps the JavaScript execution moving along at a nice, steady pace, rather than having to wait for the DOM to apply the change before moving on to the next step in the process.&lt;/p&gt;

&lt;p&gt;Unfortunately for the code example above, it means that since the DOM node starts out completely opaque, the last three lines of the &lt;code&gt;fadeIn&lt;/code&gt; function &lt;em&gt;do&lt;/em&gt; effectively fall off and the &lt;code&gt;span&lt;/code&gt; simply becomes visible. In order to get around this, the last couple of lines have to run on a different JavaScript "thread" so that it splits up the batched DOM changes into two parts and the node properly fades in:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;function fadeIn() {
    // &amp;lt;span id="one" style="visibility: hidden;"&amp;gt;testing&amp;lt;/span&amp;gt;
    var theOne = document.getElementById("one");
    theOne.style.visibility = "visible";
    theOne.style.opacity = 0;
    setTimeout(function() {
        theOne.style.WebkitTransition = "all 1s ease-in-out";
        theOne.style.opacity = 1;
    }, 0);
}&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-6320531753958088151?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/6320531753958088151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=6320531753958088151' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/6320531753958088151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/6320531753958088151'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2009/02/webkit-css-animation-behavior-weirdness.html' title='WebKit CSS Animation behavior weirdness'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-7464224531234416149</id><published>2009-02-20T14:19:00.000-08:00</published><updated>2009-02-20T14:31:06.604-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Proposal in for IPC 2009</title><content type='html'>&lt;p&gt;I should hear back within a couple of weeks as to whether I'll need to start learning some basic German before heading to Berlin at the end of May. I &lt;em&gt;just&lt;/em&gt; made the deadline for the &lt;a href="http://it-republik.de/php/phpconference/"&gt;International PHP Conference&lt;/a&gt;' call for papers, basically to give the "Digging Through the Guts of Enterprise PHP" talk, albeit reworked based on how it went at the Zend/PHP Conference last September.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-7464224531234416149?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/7464224531234416149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=7464224531234416149' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/7464224531234416149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/7464224531234416149'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2009/02/proposal-in-for-ipc-2009.html' title='Proposal in for IPC 2009'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-4362264905583089305</id><published>2009-01-04T20:36:00.000-08:00</published><updated>2009-01-04T20:57:33.669-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='randomness'/><title type='text'>Macworld</title><content type='html'>&lt;p&gt;Anyone heading to &lt;a href="http://www.macworldexpo.com/"&gt;Macworld&lt;/a&gt; this week, should feel free to swing by booth 3418 in the North Hall and say hello! I attend in order to demo and talk about &lt;a href="http://www-01.ibm.com/software/awdtools/buildforge/enterprise/"&gt;IBM Rational Build Forge&lt;/a&gt; to and with anyone interested. It may seem like an odd thing to demo at Macworld, but I have prepared things especially for showing off in MacOS 10.5, which I use on both my own personal machine &lt;i&gt;and&lt;/i&gt; my work machine.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-4362264905583089305?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/4362264905583089305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=4362264905583089305' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/4362264905583089305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/4362264905583089305'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2009/01/macworld.html' title='Macworld'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-1926879742994064056</id><published>2008-11-29T20:59:00.000-08:00</published><updated>2008-11-29T21:36:43.942-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='webkit'/><category scheme='http://www.blogger.com/atom/ns#' term='zendcon'/><category scheme='http://www.blogger.com/atom/ns#' term='sample code'/><category scheme='http://www.blogger.com/atom/ns#' term='randomness'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='zendcon08'/><category scheme='http://www.blogger.com/atom/ns#' term='ipod'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Enterprise Guts slides up, with CSS animations</title><content type='html'>&lt;p&gt;I just realized that I didn't post the final version of my slides from my talk at ZendCon, but now I have: &lt;a href="http://frozen-o.com/misc/enterpriseguts/"&gt;Digging Through the Guts of Enterprise PHP&lt;/a&gt;. However, they will only work in Safari, since I &lt;a href="http://www.frozen-o.com/blog/2008/09/s5-with-css-slide-transitions-in-webkit.html" title="S5 with CSS Slide Transitions in WebKit"&gt;hacked CSS transitions into S5&lt;/a&gt;. Different builds of WebKit (and different releases of Safari) will have varying degrees of support for everything used in there (sliding, fading, and flipping). For the talk itself, I ended up having to go back a couple of weeks in the WebKit builds, since they broke a few things... Part of the fun of using experimental technology in a nightly build, though.&lt;/p&gt;

&lt;p&gt;As a bonus, this means that the slides (mostly) work in the iPhone/iPod Touch version of Safari:&lt;/p&gt;

&lt;object width="320" height="256"
classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B"
codebase="http://www.apple.com/qtactivex/qtplugin.cab"&gt;
&lt;param name="src" value="http://frozen-o.com/misc/enterpriseguts/enterprisegutsiphone.mov"&gt;
&lt;param name="autoplay" value="false"&gt;
&lt;param name="controller" value="true"&gt;
&lt;embed src="http://frozen-o.com/misc/enterpriseguts/enterprisegutsiphone.mov" width="320" height="256"
autoplay="false" controller="true"
pluginspage="http://www.apple.com/quicktime/download/"&gt;
&lt;/embed&gt;
&lt;/object&gt;

&lt;p&gt;Due to how S5 triggers moving to the next slide, you just need to bring up the control bar at the bottom so you can tap on the arrows to move forward. In the last bit there, the animation of two simultaneous transforms, flipping the slides around, caused what we software engineers refer to as a "rendering freak out" followed by mobile Safari freezing up. All in due time!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-1926879742994064056?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/1926879742994064056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=1926879742994064056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/1926879742994064056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/1926879742994064056'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/11/enterprise-guts-slides-up-with-css.html' title='Enterprise Guts slides up, with CSS animations'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-864985790294553842</id><published>2008-11-17T09:23:00.000-08:00</published><updated>2008-11-17T09:42:02.670-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='randomness'/><title type='text'>OLPC G1G1</title><content type='html'>&lt;p&gt;Having taken part in the first round of &lt;a href="http://laptop.org/"&gt;&lt;acronym title="One Laptop per Child"&gt;OLPC&lt;/acronym&gt;&lt;/a&gt;'s &lt;abbr title="Give One, Get One"&gt;G1G1&lt;/abbr&gt;, I can definitely say that these things make fantastic ultra-portable machines. Since they run Redhat-based Linux (which you can of course replace with Debian if you prefer, or just replace the UI), you can easily install everything from FreeDoom to Apache HTTPD Server. In short order, I installed subversion, Apache HTTPD Server, PHP5, and MySQL (Vim and SSH come preinstalled). Since they designed these things for kids to carry to school through everything from rain storms to sand storms, they'll out-rugged anything else even remotely like it.&lt;/p&gt;

&lt;p&gt;Or, you can give it to someone you know who can get use out of the myriad of Activities it includes for kids to learn everything from reading and writing to programming to music.&lt;/p&gt;

&lt;p&gt;Either way, &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2Fb%3Fie%3DUTF8%26node%3D721521011%26ref_%3Dsv__img&amp;tag=amitshaw-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325" title="One Laptop per Child Foundation @ Amazon.com"&gt;Go give one&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-864985790294553842?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/864985790294553842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=864985790294553842' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/864985790294553842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/864985790294553842'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/11/olpc-g1g1.html' title='OLPC G1G1'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-7175695395738059287</id><published>2008-10-09T23:12:00.000-07:00</published><updated>2008-10-09T23:14:49.389-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='randomness'/><category scheme='http://www.blogger.com/atom/ns#' term='opera'/><title type='text'>Opera may have just found what it needed</title><content type='html'>&lt;p&gt;Today, &lt;a href="http://my.opera.com/desktopteam/blog/2008/10/09/focus-on-desktop"&gt;the Opera Desktop Team&lt;/a&gt; and &lt;a href="http://www.hicksdesign.co.uk/journal/and-now-opera"&gt;Jon Hicks&lt;/a&gt; both announced Jon's joining &lt;a href="http://www.opera.com/"&gt;Opera&lt;/a&gt; as Senior Designer! This comes as very exciting news to someone who has had to continually add "...and Opera." to many browser discussions here in the States, even among fellow developers.&lt;/p&gt;

&lt;p&gt;Jon's biggest challenge (and advantage) will, in my opinion, come in the form of making Opera approachable and continually usable to new users, without hiding its power from them. I definitely wish the both of them the best of luck, and eagerly wait to see what happens next.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-7175695395738059287?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/7175695395738059287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=7175695395738059287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/7175695395738059287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/7175695395738059287'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/10/opera-may-have-just-found-what-it.html' title='Opera may have just found what it needed'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-5913264124352292712</id><published>2008-10-02T22:13:00.001-07:00</published><updated>2008-10-02T22:17:58.729-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='randomness'/><title type='text'>Power Failure + Road Trip = Fail</title><content type='html'>&lt;p&gt;Well, that sucked. Back on a normal hosting service...backup power supplies work much better when outages only last a matter of seconds.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-5913264124352292712?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/5913264124352292712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=5913264124352292712' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/5913264124352292712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/5913264124352292712'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/10/power-failure-road-trip-fail.html' title='Power Failure + Road Trip = Fail'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-2187306640886354116</id><published>2008-09-02T07:23:00.000-07:00</published><updated>2009-01-25T02:49:25.545-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='webkit'/><category scheme='http://www.blogger.com/atom/ns#' term='zendcon'/><category scheme='http://www.blogger.com/atom/ns#' term='sample code'/><category scheme='http://www.blogger.com/atom/ns#' term='zendcon08'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>S5 with CSS Slide Transitions in WebKit</title><content type='html'>&lt;p&gt;So, in an effort to have the ability to post my slides for my Zend/PHP Conference talk online without having to rely on Flash or typically awkward HTML exports from other formats, I've decided to go with &lt;a href="http://meyerweb.com/eric/tools/s5/"&gt;&lt;abbr title="A Simple Standards-Based Slide Show System"&gt;S5&lt;/abbr&gt;&lt;/a&gt;, as mentioned previously. I've also decided to add a little of WebKit's recent additions of &lt;acronym title="Cascading Style Sheets"&gt;CSS&lt;/acronym&gt; &lt;a href="http://webkit.org/blog/130/css-transforms/"&gt;transforms&lt;/a&gt; and &lt;a href="http://webkit.org/blog/138/css-animation/"&gt;animation&lt;/a&gt; support for transitions.&lt;/p&gt;

&lt;p&gt;Since CSS &lt;acronym title="Cascading Style Sheets"&gt;CSS&lt;/acronym&gt; animation only occurs when attributes change, it just means that the current and next slides need to have the changes applied at different times, or at the same time, depending. To make managing these things easier, I started with a base object:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function Transition() { }
Transition.prototype = {
 "duration" : 1,
 "cslide" : null,
 "nslide" : null,
 "transition" : function(toggle) {
  this.cslide.style.WebkitTransition =
   this.nslide.style.WebkitTransition =
    (toggle
     ? 'all ' + this.duration + 's ease-in-out'
     : 'all 0s none');
 },
 "prepare" : function() { },
 "perform" : function() { },
 "cleanup" : function() { },
 "run" : function(cid, nid) {
  this.cslide = document.getElementById(cid);
  this.nslide = document.getElementById(nid);
  this.cslide.style.visibility = this.nslide.style.visibility = 'visible';
  this.transition(false);
  this.prepare();
  var dis = this;
  setTimeout(function() {
   dis.transition(true);
   setTimeout(function() { dis.perform.apply(dis); }, 0);
  }, 0);
  setTimeout(function() {
   dis.transition(false);
   dis.cslide.style.visibility = 'hidden';
   dis.cleanup.apply(dis);
  }, dis.duration * 1000);
 }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The code managing the switch of the slides now calls &lt;code&gt;RunTransition(transitions[snum], cid, nid);&lt;/code&gt;, where &lt;code&gt;transitions&lt;/code&gt; just holds an array of constructor references corresponding to the slide numbers (&lt;code&gt;snum&lt;/code&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var transitions = [
 null,
 Fade,
 Wipe,
 Rotate,
 Rotate,
 Fade
]

function RunTransition(className, cid, nid) {
 var trans = new className();
 trans.run.call(trans, cid, nid);
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Each transition just extends &lt;code&gt;Transition&lt;/code&gt; and overrides the applicable methods in order to change the slide CSS properties at the correct time, like this &lt;code&gt;Fade&lt;/code&gt; transition:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function Fade() { }
Fade.prototype = new Transition;
Fade.prototype.prepare = function() {
 this.cslide.style.opacity = '1';
 this.nslide.style.opacity = '0';
}
Fade.prototype.perform = function() {
 this.cslide.style.opacity = '0';
 this.nslide.style.opacity = '1';
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I've uploaded &lt;a href="http://frozen-o.com/misc/s5webkit/slidedemo1.html"&gt;a &lt;em&gt;very&lt;/em&gt; quick demo of the transitions in action&lt;/a&gt;, which will work in whichever builds of &lt;a href="http://webkit.org/"&gt;WebKit&lt;/a&gt; support &lt;acronym title="Cascading Style Sheets"&gt;CSS&lt;/acronym&gt; transforms and animation. It worked a bit smoother in WebKit builds a few weeks ago than those current (bugs galore at the moment), but nightly builds always tend introduce unpredictable behavior.&lt;/p&gt;

&lt;p&gt;Update (1/25): Between fixes in the WebKit trunk since this post, and fixes in my code (with many thanks to smfr in comments and on &lt;a href="https://bugs.webkit.org/show_bug.cgi?id=22598"&gt;the bug itself&lt;/a&gt;), all of the transitions work in the current Webkit nightly! From my final note, just in case anyone else has issues with transforms when used with transformations:&lt;/p&gt;

&lt;blockquote cite="https://bugs.webkit.org/show_bug.cgi?id=22598#c8"&gt;"If you set the WebkitTransform using just matrix() in the first step, then set the WebkitTransition, then set the WebkitTransform using both matrix and scale, it (reasonably) will not apply the transformation. When I set both both functions for the start and end styles, it works beautifully."&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-2187306640886354116?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/2187306640886354116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=2187306640886354116' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/2187306640886354116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/2187306640886354116'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/09/s5-with-css-slide-transitions-in-webkit.html' title='S5 with CSS Slide Transitions in WebKit'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-4817098222356502567</id><published>2008-09-01T11:59:00.000-07:00</published><updated>2008-09-01T15:59:17.752-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webkit'/><category scheme='http://www.blogger.com/atom/ns#' term='randomness'/><title type='text'>Google launching open source browser based on WebKit?</title><content type='html'>&lt;p&gt;No idea whether this theory holds any water, but given the recent speculation hitting...everywhere, I checked &lt;a href="http://code.google.com/p/chrome/"&gt;http://code.google.com/p/chrome/&lt;/a&gt; and found a login screen (quickly followed by a permission denied error), rather than a Not Found error for a project that doesn't exist.&lt;/p&gt;

&lt;p&gt;Wondering what this will bring to WebKit that Safari doesn't (aside from Gears and even-more-targeted advertising), but I guess we'll see soon enough.&lt;/p&gt;

&lt;p&gt;Edited to add: &lt;a href="http://googleblog.blogspot.com/2008/09/fresh-take-on-browser.html" title="Official Google Blog: A fresh take on the browser"&gt;the more I read about this&lt;/a&gt;, the more it looks like they ported a bunch of features from Opera (tabs above window chrome, long-running scripts' threads not killing your browser, Speed Dial-like default page, etc.) to a WebKit-based browser with what sounds like XUL for the window chrome itself. I guess tomorrow we'll find out for sure, but it seems a bit odd that an open source project would outright deny access to the public before launch, and distribute the info under the most closed-minded &lt;a href="http://creativecommons.org/"&gt;&lt;acronym title="Creative Commons"&gt;CC&lt;/acronym&gt;&lt;/a&gt; license available (feel free to share it, just don't touch it, don't charge for it, and you'd better tell people who made it). I suppose after the recent Android SDK excitement, this still makes a decent step forward, but still. I guess so long as it takes market share away from IE, I shouldn't complain too much.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-4817098222356502567?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/4817098222356502567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=4817098222356502567' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/4817098222356502567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/4817098222356502567'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/09/google-launching-open-source-browser.html' title='Google launching open source browser based on WebKit?'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-5701696439356642364</id><published>2008-08-27T17:50:00.000-07:00</published><updated>2008-08-27T18:10:24.101-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='randomness'/><category scheme='http://www.blogger.com/atom/ns#' term='web standards'/><title type='text'>Target to pay out $6M and have quarterly/annual accessibility tests</title><content type='html'>&lt;p&gt;Found &lt;a href="http://www.glendathegood.com/blog/?p=284" title="Targeting Accessibility"&gt;via Glenda the Good&lt;/a&gt;, this marks a &lt;em&gt;huge&lt;/em&gt; milestone in moving from infrequently enforced laws regarding government sites to making sites and web applications of private entities accessible to the general public.&lt;/p&gt;

&lt;blockquote cite="http://www.nfb.org/nfb/NewsBot.asp?MODE=VIEW&amp;ID=357"&gt;"As part of the settlement, Target will establish a $6 million fund from which members of the California settlement class can make claims.  In addition, the National Federation of the Blind will certify the Target Web site through its Nonvisual Accessibility Web Certification program once agreed upon improvements are completed in early 2009.  Target and NFB have agreed to a three-year relationship during which NFB will perform accessibility testing of the Target Web site.  For more information about the terms of the settlement, please visit &lt;a href="http://www.nfbtargetlawsuit.com/"&gt;www.nfbtargetlawsuit.com&lt;/a&gt;."&lt;/blockquote&gt;

&lt;p&gt;The $6,000,000 fund doled out to those who file claims will draw attention to this, but to me the (comparatively) rapid compliance and ongoing tests make this worthwhile. Target won't just throw money at the issue, but will make its site accessible to those using assistive technologies, and maintain that for at least &lt;em&gt;three years following&lt;/em&gt;!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-5701696439356642364?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/5701696439356642364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=5701696439356642364' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/5701696439356642364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/5701696439356642364'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/08/target-to-pay-out-6m-and-have.html' title='Target to pay out $6M and have quarterly/annual accessibility tests'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-1266172289129905504</id><published>2008-08-26T20:14:00.000-07:00</published><updated>2008-08-26T20:24:46.779-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='advanced ajax'/><title type='text'>Zend DevZone book review</title><content type='html'>&lt;p&gt;Cal Evans of Zend just posted &lt;a href="http://devzone.zend.com/article/3796-Book-Review-Advanced-Ajax-by-Shawn-M.-Lauriat" title="Book Review: Advanced Ajax by Shawn M. Lauriat"&gt;a shining review&lt;/a&gt; of &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FAdvanced-Ajax-Architecture-Best-Practices%2Fdp%2F0131350641%3Fie%3DUTF8%26qid%3D1188960159%26sr%3D11-1&amp;tag=amitshaw-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;Advanced Ajax&lt;/a&gt;!&lt;/p&gt;

&lt;blockquote cite="http://devzone.zend.com/article/3796-Book-Review-Advanced-Ajax-by-Shawn-M.-Lauriat"&gt;&lt;p&gt;It’s not often that I review a book that is a year old for several reasons. The main reason is that technology changes so fast. In this day and age a book 12 months old usually contains out dated information. As with any good rule, there are exemptions, this book is one of them.&lt;/p&gt;&lt;p&gt;Having said that let me lay out a warning, “Advanced Ajax” means what it says, it is an advanced book. If you are a web designer who has just completed “Learn JavaScript in One Week” then you do not want to buy this book. Go play with the other crayons and come back when you’ve got a few years experience under your belt. This book is for those developers that already know what a pain it is to develop using JavaScript and love it anyhow. If you’ve already busted one flat-screen by banging your head on it because “the code should work!” then you are ready for this book.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://devzone.zend.com/article/3796-Book-Review-Advanced-Ajax-by-Shawn-M.-Lauriat" title="Book Review: Advanced Ajax by Shawn M. Lauriat"&gt;Read the rest of the review&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-1266172289129905504?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/1266172289129905504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=1266172289129905504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/1266172289129905504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/1266172289129905504'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/08/zend-devzone-book-review.html' title='Zend DevZone book review'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-8206759127206402495</id><published>2008-08-10T01:08:00.000-07:00</published><updated>2008-08-10T01:33:19.912-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zendcon'/><category scheme='http://www.blogger.com/atom/ns#' term='advanced ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='zendcon08'/><title type='text'>Books to give away during my ZendCon08 talk!</title><content type='html'>&lt;p&gt;In order to bribe more people to attend &lt;a href="http://www.zendcon.com/ZendCon08/public/schedule/detail/13" title="Digging Through the Guts of Enterprise PHP: A Case Study"&gt;my talk at ZendCon08&lt;/a&gt;, my publisher has sent me three copies of &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FAdvanced-Ajax-Architecture-Best-Practices%2Fdp%2F0131350641%3Fie%3DUTF8%26qid%3D1188960159%26sr%3D11-1&amp;tag=amitshaw-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325" title="Advanced Ajax: Architecture and Best Practices"&gt;my book&lt;/a&gt; to give away! I haven't quite figured out how to dole them out yet, or even have any idea how many people will attend the talk &lt;em&gt;and&lt;/em&gt; want a copy, but I'll figure something out.&lt;/p&gt;

&lt;p&gt;I think for the talk, I'll use a modified &lt;a href="http://meyerweb.com/eric/tools/s5/"&gt;&lt;abbr title="A Simple Standards-Based Slide Show System"&gt;S5&lt;/abbr&gt;&lt;/a&gt; theme I have in-progress using Safari's new &lt;acronym title="Cascading Style Sheets"&gt;CSS&lt;/acronym&gt; &lt;a href="http://webkit.org/blog/130/css-transforms/"&gt;transforms&lt;/a&gt; and &lt;a href="http://webkit.org/blog/138/css-animation/"&gt;animation&lt;/a&gt; support for transitions. I'll post some examples of that as I make it ready for the talk, since I can't really post the content of my talk until I get the go-ahead from those who give it at IBM. The talk centers around looking at source code from &lt;a href="http://www-306.ibm.com/software/awdtools/buildforge/enterprise/" title="IBM Rational Build Forge"&gt;work&lt;/a&gt;, and I'd rather not upset IBM's Higher Powers by exposing even part of the product without explicit permission...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-8206759127206402495?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/8206759127206402495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=8206759127206402495' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/8206759127206402495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/8206759127206402495'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/08/books-to-give-away-during-my-zendcon08.html' title='Books to give away during my ZendCon08 talk!'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-8048015141777984248</id><published>2008-07-07T18:40:00.000-07:00</published><updated>2008-07-07T19:41:52.191-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web standards'/><title type='text'>W3C recently posts updated docs on relationship between usability and accessibility</title><content type='html'>&lt;p&gt;The &lt;a href="http://w3.org/"&gt;&lt;abbr title="World Wide Web Consortium"&gt;W3C&lt;/abbr&gt;&lt;/a&gt; posted an update to the &lt;a href="http://www.w3.org/TR/mwbp-wcag/"&gt;Relationship between Mobile Web Best Practices (MWBP) and Web Content Accessibility Guidelines (WCAG)&lt;/a&gt;, something which I (for some reason) don't remember seeing go by in January when they posted the initial draft.&lt;/p&gt;

&lt;p&gt;Work like this means a great deal to web developers who promote accessibility, as most people regard accessibility as little more than a drain or a checkbox on a compliance to-do list. The &lt;acronym title="Mobile Web Best Practices"&gt;MWBP&lt;/acronym&gt; and &lt;acronym title="Web Content Accessibility Guidelines"&gt;WCAG&lt;/acronym&gt; relationship guidelines look at the similarities in issues and solutions found in each working group, providing a comprehensive list of direct connections between accessibility and usability. Until seeing this work, I have had little reference material to offer those who questioned my (and others') relentless insisting that they should use accessible markup and scripting in order to make their web applications both accessible and more usable in one fell swoop. All efforts had previously resulted in spontaneous lectures at the nearest machine where I could demonstrate examples, and (more recently) &lt;i&gt;Chapter 1: Usability&lt;/i&gt; and &lt;i&gt;Chapter 2: Accessibility&lt;/i&gt; in &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FAdvanced-Ajax-Architecture-Best-Practices%2Fdp%2F0131350641%3Fie%3DUTF8%26qid%3D1188960159%26sr%3D11-1&amp;tag=amitshaw-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;Advanced Ajax: Architectures and Best Practices&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The current &lt;acronym title="Mobile Web Best Practices"&gt;MWBP&lt;/acronym&gt; and &lt;acronym title="Web Content Accessibility Guidelines"&gt;WCAG&lt;/acronym&gt; relationship guidelines have the following in-progress sections available, which will all prove exceedingly useful to web developers and designers, especially for those learning about one side of this after implementing the other:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.w3.org/TR/mwbp-wcag/Overview.html"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.w3.org/TR/mwbp-wcag/together.html"&gt;WCAG 2.0 and MWBP Together&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.w3.org/TR/mwbp-wcag/mwbp-wcag20.html"&gt;MWBP to WCAG 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.w3.org/TR/mwbp-wcag/mwbp-wcag10.html"&gt;MWBP to WCAG 1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.w3.org/TR/mwbp-wcag/wcag20-mwbp.html"&gt;WCAG 2.0 to MWBP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.w3.org/TR/mwbp-wcag/wcag10-mwbp.html"&gt;WCAG 1.0 to MWBP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These sections cover specific examples of matching mobile web usability issues  with accessibility issues, ranging from color contrast requirements (&lt;q&gt;...unfavorable ambient light and the ability of devices to display contrasting color at all, while users may have color blindness and color perception deficits...&lt;/q&gt;) to the fact that large amounts of dry text becomes equally unreadable for those with attention deficit related disabilities to those with postage stamp-sized screen. Anyone who had clicked impatiently through an &lt;acronym title="End User License Agreement"&gt;EULA&lt;/acronym&gt; displayed in a one-inch &lt;code&gt;textarea&lt;/code&gt; knows the latter of these two quick examples all too well.&lt;/p&gt;

&lt;p&gt;For a quick introduction to the correlation between web accessibility mobile web usability, the &lt;a href="http://www.w3.org/WAI/"&gt;&lt;acronym title="Web Accessibility Initiative"&gt;WAI&lt;/acronym&gt;&lt;/a&gt; has posted &lt;a href="http://www.w3.org/WAI/mobile/"&gt;Web Content Accessibility and Mobile Web: Making a Web Site Accessible Both for People with Disabilities and for Mobile Devices&lt;/a&gt; as part of their &lt;a href="http://www.w3.org/WAI/impl/Overview.html"&gt;Implementation Plan for Web Accessibility&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-8048015141777984248?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/8048015141777984248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=8048015141777984248' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/8048015141777984248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/8048015141777984248'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/07/w3c-recently-posts-updated-docs-on.html' title='W3C recently posts updated docs on relationship between usability and accessibility'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-7853969518828298118</id><published>2008-06-12T12:12:00.000-07:00</published><updated>2008-06-12T12:23:56.457-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zendcon'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='zendcon08'/><title type='text'>Proposal accepted for ZendCon08</title><content type='html'>&lt;p&gt;My proposal "Digging Through the Guts of Enterprise PHP: A Case Study," which looks at PHP usage, techniques, and features as used at my day job at IBM, got accepted for the Zend/PHP Conference and EXPO 2008!&lt;/p&gt;&lt;blockquote&gt;An exploration of the features of PHP used in the Ajax-driven user interface of IBM Rational Build Forge, with a focus on inheritance, interfaces, and Iterators. This talk will demonstrate how we built its user interface on a solid foundation of PHP.&lt;/blockquote&gt;&lt;p&gt;I submitted it shortly after the call for papers opened up and this year, I got in. I've never spoken at a conference before, but it'll at least make for an interesting (and hopefully even successful) experience.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-7853969518828298118?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/7853969518828298118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=7853969518828298118' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/7853969518828298118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/7853969518828298118'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/06/proposal-accepted-for-zendcon08.html' title='Proposal accepted for ZendCon08'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-2899551868980159636</id><published>2008-06-02T17:50:00.000-07:00</published><updated>2008-06-02T18:05:53.372-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='sample code'/><category scheme='http://www.blogger.com/atom/ns#' term='randomness'/><title type='text'>I couldn't resist one named "Tendrils"</title><content type='html'>&lt;p&gt;While setting up the most recent addition to the house (my wife's new hi-res 17" MacBook Pro), I had a little time during Windows' installation into its VMWare image, so I took a look through some more of the visualizations. I saw this one, and ported it to JavaScript, adding a few lines to animate it:&lt;/p&gt;

&lt;div style="text-align: center;"&gt;&lt;a href="http://frozen-o.com/misc/tendrils/"&gt;&lt;img style="border: 1px;" src="http://frozen-o.com/misc/tendrils/tendrils.png" alt="13 long, winding tendrils starting from a central base" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;I recommend sticking to a low number of tendrils (especially in Opera, which gets choppy rather quickly), or the non-animated version.&lt;/p&gt;

&lt;p&gt;Based on &lt;a href="http://www.nodebox.net/code/index.php/Tendrils"&gt;Tendrils&lt;/a&gt;, Created by Tom De Smedt
(which Tom based on the "Tendrils" algorithm by ART+COM).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-2899551868980159636?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/2899551868980159636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=2899551868980159636' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/2899551868980159636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/2899551868980159636'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/06/i-couldnt-resist-one-named-tendrils.html' title='I couldn&apos;t resist one named &quot;Tendrils&quot;'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-7167882706663751867</id><published>2008-05-31T17:12:00.000-07:00</published><updated>2008-05-31T17:35:41.889-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='sample code'/><category scheme='http://www.blogger.com/atom/ns#' term='randomness'/><title type='text'>Fun with visualizations</title><content type='html'>&lt;p&gt;Looking through &lt;a href="http://macresearch.org/"&gt;MacResearch&lt;/a&gt;, I saw &lt;a href="http://nodebox.net/"&gt;NodeBox&lt;/a&gt;, "...a Mac OS X application that lets you create 2D visuals (static, animated or interactive) using Python programming code and export them as a PDF or a QuickTime movie." A bit of a hobbyist math geek, I checked it out a bit and realized that a lot of the Python source code used with NodeBox looks rather similar to JavaScript interacting with the canvas HTML5 element.&lt;/p&gt;

&lt;p&gt;So I took a few and wrote a quick library to behave similarly to NodeBox, albeit for JavaScript to run in a browser. I just looked at the &lt;a href="http://nodebox.net/code/index.php/Mark_Meyer_|_Parametric_surfaces"&gt;parametric equation examples&lt;/a&gt; for something easy to start off with, and wrote a few examples. The first, &lt;em&gt;extremely&lt;/em&gt; simple example more or less just draws a circle within certain bounds:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function CircleEquation(dt, steps, r) {
 Frozen.Chart.Equation.call(this, steps, dt);
 this.r = r;
}
CircleEquation.prototype = new Frozen.Chart.Equation;
CircleEquation.prototype.next = function() {
 this.x = Math.cos(this.t) * this.r;
 this.y = Math.sin(this.t) * this.r;
 return Frozen.Chart.Equation.prototype.next.apply(this);
};

function circleTest1() {
 chart.clear();
 chart.map.lineWidth = 0.5;
 chart.renderEquation(new CircleEquation(4.5, 75, 95));
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This results in the following visualization:&lt;/p&gt;

&lt;div style="text-align: center;"&gt;&lt;img style="border: 1px;" src="http://frozen-o.com/misc/visualizations/circletest1.png" alt="A spiral design made up of thin lines making up a 100 pixel circle" /&gt;&lt;/div&gt;

&lt;p&gt;You can &lt;a href="http://frozen-o.com/misc/visualizations/"&gt;see it in action&lt;/a&gt;, along with a couple of slightly more interesting examples. NodeBox can do a lot more than simple charting, this part of its functionality just inspired a fun exercise in web+math geekery.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-7167882706663751867?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/7167882706663751867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=7167882706663751867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/7167882706663751867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/7167882706663751867'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/05/fun-with-visualizations.html' title='Fun with visualizations'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-4912849649853438404</id><published>2008-05-06T09:37:00.001-07:00</published><updated>2008-05-06T14:50:40.128-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='webkit'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='opera'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Opera Dragonfly (alpha) Released</title><content type='html'>&lt;p&gt;Over a year ago, &lt;a href="http://www.frozen-o.com/blog/2007/03/opera-developer-console.html"&gt;I wrote about the Opera Developer Console&lt;/a&gt;. This morning (for me, at any rate), Opera &lt;a href="http://my.opera.com/dragonfly/blog/2008/05/06/introducing-the-dragonfly" title="Hello World - Introducing Opera Dragonfly"&gt;posted Dragonfly&lt;/a&gt;, which (two years in the making) offers a completely fresh look at browser-based debugging.&lt;/p&gt;

&lt;div style="text-align: center;"&gt;&lt;a href="http://frozen-o.com/misc/images/dragonfly.png"&gt;&lt;img src="http://frozen-o.com/misc/images/dragonfly_small.png" alt="An Opera Dragonfly window showing a JavaScript console, stack trace, and active debugger, stepping through a call to add an event listener" style="border: solid 1px;" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;It offers most of the familiar tools for &lt;acronym title="Document Object Model"&gt;DOM&lt;/acronym&gt; inspection (along with a nice DOM editing capability), error logging (with the same granularity as before wrapped in a more polished &lt;acronym title="User Interface"&gt;UI&lt;/acronym&gt;), a JavaScript debugger that rivals WebKit's &lt;a href="http://trac.webkit.org/wiki/Drosera"&gt;Drosera&lt;/a&gt;, a JavaScript thread logger, and a lot more that I haven't explored yet.&lt;/p&gt;

&lt;p&gt;Time will tell whether Dragonfly can get enough developers to use Opera and keep them there, and how much the developers behind the new developer tools listen to the community in the coming iterations, but so far this looks extremely promising.&lt;/p&gt;

&lt;p&gt;Edit: Chris Mills from Opera gave me some additional info:&lt;/p&gt;

&lt;p&gt;Part of the reason I haven't found the &lt;code&gt;XMLHttpRequest&lt;/code&gt; logger/debugger apparently stems from it not getting exposed yet, though it &lt;em&gt;will&lt;/em&gt; appear in an upcoming iteration, along with HTTP header inspection (not just for &lt;code&gt;XMLHttpRequest&lt;/code&gt;s, of course) and a new "single window mode" which sounds like it will make things much more usable! When using Safari's inspector, I almost always find myself attaching it to the window, and I always had the urge to do the same with Opera's developer console.&lt;/p&gt;

&lt;p&gt;Chris also mentioned something which makes me very happy to hear: even though the Developer Tools (loaded via the Tools &amp;rarr; Advanced &amp;rarr; Developer Tools) download from Opera's server, it only does so the first time, and for each following update of the tools. This ensures that it not only saves Opera's servers when usage takes off, but it also ensures that developers can work offline, and the slow loading of the tools will only happen initially, loading from the local drive after installation.&lt;/p&gt;

&lt;p&gt;Written in XML/CSS/JavaScript, Dragonfly will run in all browsers including Opera's Core-2.1 rendering engine (except Opera Mini for some reason), and even supports debugging on mobile devices by way of a proxy setup between the device and the desktop Dragonfly installation! This will prove &lt;em&gt;invaluable&lt;/em&gt; for developers of web applications supporting devices, as they will have the ability to use their normal desktop tools to debug on the mobile browser without having to use emulation.&lt;/p&gt;

&lt;p&gt;You can find more information in an &lt;a href="http://dev.opera.com/articles/view/introduction-to-opera-dragonfly/"&gt;Introduction to Opera Dragonfly&lt;/a&gt; and on the &lt;a href="http://www.opera.com/products/dragonfly/"&gt;Opera Dragonfly product page&lt;/a&gt; (which has a very good start of fleshed-out &lt;a href="http://www.opera.com/products/dragonfly/documentation/"&gt;documentation&lt;/a&gt; already, &lt;a href="http://www.opera.com/products/dragonfly/feedback/"&gt;feedback and bugtracking&lt;/a&gt;, and of course a &lt;a href="http://my.opera.com/dragonfly/blog/"&gt;blog&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Edited to fix the &lt;a href="http://dev.opera.com/articles/view/introduction-to-opera-dragonfly/"&gt;Introduction to Opera Dragonfly&lt;/a&gt; link...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-4912849649853438404?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/4912849649853438404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=4912849649853438404' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/4912849649853438404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/4912849649853438404'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/05/opera-dragonfly-alpha-released.html' title='Opera Dragonfly (alpha) Released'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-2127426596402015025</id><published>2008-05-05T19:26:00.000-07:00</published><updated>2008-05-05T19:39:32.868-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='google i/o'/><category scheme='http://www.blogger.com/atom/ns#' term='randomness'/><title type='text'>Heading to Google I/O at the end of the month</title><content type='html'>&lt;p&gt;As an added benefit of living in the Bay Area again, I get much easier access to many of the conferences and events that go on around Ajax/&lt;acronym title="Rich Internet Application"&gt;RIA&lt;/acronym&gt;s/etc. May 28-29, I'll take &lt;acronym title="Bay Area Rapid Transit"&gt;BART&lt;/acronym&gt; into the city in order to attend &lt;a href="http://code.google.com/events/io/"&gt;Google I/O&lt;/a&gt;, which looks extremely interesting. Somehow, in the short two days, I need to find my way to the sessions on design patterns, performance, HTML5, open source, and chase down some of the speakers and fellow developers to pick their brains for a bit. Fun!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-2127426596402015025?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/2127426596402015025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=2127426596402015025' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/2127426596402015025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/2127426596402015025'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/05/heading-to-google-io-at-end-of-month.html' title='Heading to Google I/O at the end of the month'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-3727291689880197477</id><published>2008-04-15T10:13:00.000-07:00</published><updated>2008-04-24T18:59:23.160-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='randomness'/><title type='text'>History meme</title><content type='html'>&lt;p&gt;Indirectly tagged by &lt;a href="http://virtuelvis.com/archives/2008/04/history_meme" title="Arve Bersvendsen - History Meme"&gt;Arve Bersvendsen's entry&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;wollstonecraft:~ shawn$ history | awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}'|sort -rn|head
85 screen
52 ssh
50 ls
44 vi
39 cd
36 svn
25 ping
20 telnet
16 cp
14 mv&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I guess I reattach my &lt;a href="http://www.gnu.org/software/screen/" title="GNU Screen"&gt;screen&lt;/a&gt; session a lot. The telnet calls probably stem from checking the server once I got it up and running again, since the router had some issues letting everyone through for a while.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-3727291689880197477?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/3727291689880197477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=3727291689880197477' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/3727291689880197477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/3727291689880197477'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/04/history-meme.html' title='History meme'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-734161873544870896</id><published>2008-04-05T16:32:00.000-07:00</published><updated>2008-04-05T16:44:38.100-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='advanced ajax'/><title type='text'>Part 2 of the Advanced Ajax review went up!</title><content type='html'>&lt;p&gt;In the midst of things, the &lt;a href="http://blogs.pathf.com/agileajax/2008/04/book-review-adv.html" title="Book review: Advanced Ajax by Lauriat (Part 2 of 2)"&gt;second half of the review&lt;/a&gt; from &lt;a href="http://blogs.pathf.com/agileajax/"&gt;Agile Ajax&lt;/a&gt; went up! It seems that despite the rather heavy use of PHP for the server-side example code, Brian (apparently more into ASP, JSP, and Ruby) still liked it, which makes me very happy.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Back in February, I reviewed the first half of Shawn M. Lauriat's "Advanced Ajax: Architecture and Best Practices" (Prentice Hall, 2008, 360p). The first four chapters of Lauriat's book, which focused almost exclusively on client-side technologies, impressed me considerably. But it's taken me several weeks to get through the remainder of the book, and there's one reason why: PHP.&lt;/p&gt;

&lt;p&gt;The server-side portion of "Advanced Ajax" uses PHP code to illustrate its many and varied lessons about Ajax architecture. It's not that I have anything against the popular web-development framework and scripting language. It's just that, after spending my career in the ASP Classic and JSP trenches and slowly ramping up on Rails in the last year, I'm not the ideal target audience for these code samples. Adding "PHP" to the title of the book might have limited its potential audience, but it also would have been more accurate.&lt;/p&gt;

&lt;p&gt;That said, there's a lot of value here for adherents of any server-side framework. Lauriat discusses each topic from a general perspective before diving into the code. The technical approach to a given problem would obviously differ by framework, but the high-level approach wouldn't. If you don't mind skimming past the content that doesn't apply to you, Lauriat's advice about developing stable, scalable, accessible and secure Ajax applications transcends framework allegiance.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://blogs.pathf.com/agileajax/2008/04/book-review-adv.html#more" title="Book review: Advanced Ajax by Lauriat (Part 2 of 2)"&gt;Read the rest of the review&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sidenote: On the &lt;a href="http://ajaxian.com/archives/book-review-advanced-ajax-by-lauriat-part-2-of-2" title="Book review: Advanced Ajax by Lauriat (Part 2 of 2)"&gt;Ajaxian post for the review (part 2)&lt;/a&gt;, Joeri left a comment that really hit on what I tried for in writing the book, almost quoting what I told Prentice Hall when describing the type book I intended to write:&lt;/p&gt;

&lt;blockquote&gt;I’ve read this since the last review.&lt;br /&gt;It does a pretty good job documenting the best practices when building ajax apps. This is a book to read when you want to move beyond knowing the basics of javascript and xmlhttp to building a real web app using ajax methods.&lt;/blockquote&gt;

&lt;p&gt;Thank you, Joeri! I feel glad knowing that people out there have read the book and gotten out of it something resembling what I had hoped they would.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-734161873544870896?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/734161873544870896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=734161873544870896' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/734161873544870896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/734161873544870896'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/04/part-2-of-advanced-ajax-review-went-up.html' title='Part 2 of the Advanced Ajax review went up!'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-3419600083660950904</id><published>2008-04-05T16:23:00.000-07:00</published><updated>2008-04-05T16:30:04.391-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='randomness'/><title type='text'>No place like 67.102.65.250</title><content type='html'>&lt;p&gt;I haven't posted in a while, partly to figure out the details of, and then execute a move from Austin, TX to Oakland, CA. It made for a hell of a trip, but a successful one nonetheless. I still have my job with IBM, now working remotely and officially from my home office. From my desk chair, I can see the loading docks of the bay in the distance, and have already timed the trip from &lt;a href="http://www.phuketthaisf.com/" title="Phuket Thai Restaurant"&gt;my favorite peanut sauce source&lt;/a&gt; to the house at a mere 15 minutes (with light traffic)!&lt;/p&gt;

&lt;p&gt;The site(s) and email(s) went down during the move partly because of DNS issues that resulted in utter failure to move to the temporary hosting service, and partly because so much came up that needed handling in the last couple of weeks that I just had too many higher priority things to do. Speaking of which...back to unpacking!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-3419600083660950904?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/3419600083660950904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=3419600083660950904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/3419600083660950904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/3419600083660950904'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/04/no-place-like-6710265250.html' title='No place like 67.102.65.250'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-5503897894222160852</id><published>2008-02-16T11:42:00.000-08:00</published><updated>2008-02-16T11:47:19.393-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='advanced ajax'/><title type='text'>Advanced Ajax (Kindle Edition)</title><content type='html'>&lt;p&gt;For those interested: &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FAdvanced-Ajax%2Fdp%2FB00142KQCA&amp;tag=amitshaw-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;Advanced Ajax (Kindle Edition)&lt;/a&gt; apparently went up on Amazon. I haven't met anyone yet who has a Kindle, but I imagine someone out there does! Hopefully lots of Ajax developers...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-5503897894222160852?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/5503897894222160852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=5503897894222160852' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/5503897894222160852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/5503897894222160852'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/02/advanced-ajax-kindle-edition.html' title='Advanced Ajax (Kindle Edition)'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-8122809454082252664</id><published>2008-02-12T17:20:00.000-08:00</published><updated>2008-02-12T17:31:38.320-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='iui'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='vienna'/><category scheme='http://www.blogger.com/atom/ns#' term='randomness'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='ipod'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Vienna + PHP (source code) + iUI</title><content type='html'>&lt;p&gt;&lt;a href="http://www.frozen-o.com/misc/vienna/vienna.tgz"&gt;Source posted!&lt;/a&gt; BSD License. From the README:&lt;/p&gt;

&lt;pre&gt;You'll need to do a few things to get this working:

1. Move the extracted vienna directory to /Library/WebServer/Documents
2. Download iUI (http://code.google.com/p/iui/) and put the main iui directory into the extracted vienna/ directory
3a. Setup a cron job to copy ~/Library/Application Support/Vienna/messages.db to the extracted vienna/ directory
3b. For the adventurous: mv ~/Library/Application Support/Vienna/messages.db to the extracted vienna/ directory and sym-link it back to ~/Library/Application Support/Vienna/
4. Make sure to enable web sharing
5. Go to (your computer's name).local/vienna&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-8122809454082252664?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/8122809454082252664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=8122809454082252664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/8122809454082252664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/8122809454082252664'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/02/vienna-php-source-code-iui.html' title='Vienna + PHP (source code) + iUI'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35312635.post-3757898902260924205</id><published>2008-02-12T16:05:00.000-08:00</published><updated>2008-02-12T16:38:09.204-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='advanced ajax'/><title type='text'>Book review up on Agile Ajax</title><content type='html'>&lt;p&gt;&lt;a href="http://blogs.pathf.com/agileajax/2008/02/book-review-adv.html"&gt;Book review: Advanced Ajax by Lauriat (Part 1 of 2)&lt;/a&gt; went up earlier today (also &lt;a href="http://ajaxian.com/archives/book-review-advanced-ajax-by-lauriat" title="Book review: Advanced Ajax by Lauriat"&gt;linked to from Ajaxian&lt;/a&gt;), and so far Brian Dillard (&lt;a href="http://www.pathf.com/aboutUsBiosBDillard.html"&gt;RIA Evangelist @ pathfinder&lt;/a&gt; and project lead for &lt;a href="http://code.google.com/p/reallysimplehistory/"&gt;Really Simple History&lt;/a&gt;) seems to like it:&lt;/p&gt;

&lt;blockquote&gt;Because Ajax moves so much application logic from the server to the client, it forces many developers to master a wider range of web technologies than ever before. To work effectively on Ajax projects, front-end developers have to concern themselves with database performance, business logic and other server-side concerns. Back-end and middleware developers, meanwhile, have to make friends with XHTML, CSS, JavaScript and a wide range of browsers. Sure, it's possible to develop Ajax apps in a siloed team environment. But it's not the easiest way, and it rarely provides the strongest results.&lt;/p&gt;

&lt;p&gt;Shawn M. Lauriat's "&lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FAdvanced-Ajax-Architecture-Best-Practices%2Fdp%2F0131350641%3Fie%3DUTF8%26qid%3D1188960159%26sr%3D11-1&amp;tag=amitshaw-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;Advanced Ajax: Architecture and Best Practices&lt;/a&gt;" (Prentice Hall, 2008, 360p) bridges the gap between developers with exclusive client- or server-side skills. By exploring tools, technologies and best practices for every layer of the Ajax programming model, this solid new programming manual promises to plug the holes in any developer's resume. Lauriat's tops-to-tails approach offers something for almost any developer, but it also guarantees most readers will find some sections remedial. As this two-part review will demonstrate, that's not necessarily a liability.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://blogs.pathf.com/agileajax/2008/02/book-review-adv.html" title="Book review: Advanced Ajax by Lauriat (Part 1 of 2)"&gt;Read the full review&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35312635-3757898902260924205?l=www.frozen-o.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/3757898902260924205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35312635&amp;postID=3757898902260924205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/3757898902260924205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35312635/posts/default/3757898902260924205'/><link rel='alternate' type='text/html' href='http://www.frozen-o.com/blog/2008/02/book-review-up-on-agile-ajax.html' title='Book review up on Agile Ajax'/><author><name>Frozen O</name><uri>http://www.blogger.com/profile/06147633031841516655</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12977404418327092201'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>