<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">

<channel>
	<title>WebDev FeedHouse</title>
	<link>http://www.webdevfeedhouse.com</link>
	<language>en</language>
	<description>WebDev FeedHouse - http://www.webdevfeedhouse.com</description>

<item>
	<title>W3C: XHTML Modularization 1.1 - Second Edition is a W3C Recommendation</title>
	<guid>tag:www.w3.org,2010://4.8868</guid>
	<link>http://www.w3.org/News/2010.html#entry-8868</link>
	<description>&amp;amp;lt;p&amp;amp;gt;The &amp;amp;lt;a href=&quot;/MarkUp/&quot;&amp;amp;gt;XHTML2 Working Group&amp;amp;lt;/a&amp;amp;gt; has published a W3C Recommendation of &amp;amp;lt;a href=&quot;/TR/2010/REC-xhtml-modularization-20100729/&quot;&amp;amp;gt;XHTML Modularization 1.1 - Second Edition&amp;amp;lt;/a&amp;amp;gt;. XHTML Modularization is a tool for people who design markup languages. XHTML Modularization helps people design and manage markup language schemas and DTDs; it explains how to write schemas that will plug together. Modules can be reused and recombined across different languages, which helps keep related languages in sync. This edition includes several minor updates to provide clarifications and address errors found in version 1.1. Learn more about the &amp;amp;lt;a href=&quot;/MarkUp/Activity&quot;&amp;amp;gt;HTML Activity&amp;amp;lt;/a&amp;amp;gt;.&amp;amp;lt;/p&amp;amp;gt;
    &amp;lt;/content&amp;gt;</description>
	<pubDate>Fri, 30 Jul 2010 18:00:12 +0000</pubDate>
	<dc:creator>W3C Staff</dc:creator>
</item>
<item>
	<title>W3C: First Draft of Emotion Markup Language (EmotionML) 1.0  Published</title>
	<guid>tag:www.w3.org,2010://4.8867</guid>
	<link>http://www.w3.org/News/2010.html#entry-8867</link>
	<description>&amp;amp;lt;p&amp;amp;gt;The &amp;amp;lt;a href=&quot;/2002/mmi/&quot;&amp;amp;gt;Multimodal Interaction Working Group&amp;amp;lt;/a&amp;amp;gt; has published the First Public Working Draft of &amp;amp;lt;a href=&quot;/TR/2010/WD-emotionml-20100729/&quot;&amp;amp;gt;Emotion Markup Language (EmotionML) 1.0&amp;amp;lt;/a&amp;amp;gt;. As the web is becoming ubiquitous, interactive, and multimodal, technology needs to deal increasingly with human factors, including emotions. The present draft specification of Emotion Markup Language 1.0 aims to strike a balance between practical applicability and basis in science. The language is conceived as a &quot;plug-in&quot; language suitable for use in three different areas: (1) manual annotation of data; (2) automatic recognition of emotion-related states from user behavior; and (3) generation of emotion-related system behavior. Learn more about the &amp;amp;lt;a href=&quot;/2002/mmi/&quot;&amp;amp;gt;Multimodal Interaction Activity&amp;amp;lt;/a&amp;amp;gt;.&amp;amp;lt;/p&amp;amp;gt;
    &amp;lt;/content&amp;gt;</description>
	<pubDate>Fri, 30 Jul 2010 18:00:12 +0000</pubDate>
	<dc:creator>W3C Staff</dc:creator>
</item>
<item>
	<title>W3C: Privacy Workshop Participants to Study Data Usage and Handling</title>
	<guid>tag:www.w3.org,2010://4.8866</guid>
	<link>http://www.w3.org/News/2010.html#entry-8866</link>
	<description>&amp;amp;lt;p&amp;amp;gt;W3C announces organization of a &amp;amp;lt;a href=&quot;/2010/policy-ws/&quot;&amp;amp;gt;Workshop on Privacy and Data Usage Control&amp;amp;lt;/a&amp;amp;gt;, to take place in Cambridge, MA, UA on 4-5 October 2010. Users trust enormous amounts of personal information to a large variety of online services including social network sites, search engines, photo and video sharing services, and hosted email solutions. As those services become ever more tightly integrated, it becomes increasingly difficult to control the spread of information on the Web. Participants will represent a broad set of stakeholders, including researchers, database manufacturers, CRM-system manufacturers, and Social Networking Providers. Participants will study whether there is interest in further work on policy languages and data handling/data usage work within W3C. Anyone may participate in the Workshop; all participants must submit a short &amp;amp;lt;a href=&quot;/2010/policy-ws/#paper&quot;&amp;amp;gt;position paper&amp;amp;lt;/a&amp;amp;gt;. More information about the Workshop is available in the &amp;amp;lt;a href=&quot;/2010/policy-ws/&quot;&amp;amp;gt;Call for Participation&amp;amp;lt;/a&amp;amp;gt;. Learn more about W3C's &amp;amp;lt;a href=&quot;/Privacy/&quot;&amp;amp;gt;Privacy Activity&amp;amp;lt;/a&amp;amp;gt;.
&amp;amp;lt;/p&amp;amp;gt;
    &amp;lt;/content&amp;gt;</description>
	<pubDate>Fri, 30 Jul 2010 18:00:12 +0000</pubDate>
	<dc:creator>W3C Staff</dc:creator>
</item>
<item>
	<title>W3C: First Draft of WOFF File Format 1.0 Published</title>
	<guid>tag:www.w3.org,2010://4.8865</guid>
	<link>http://www.w3.org/News/2010.html#entry-8865</link>
	<description>&amp;amp;lt;p&amp;amp;gt;The &amp;amp;lt;a href=&quot;/Fonts/WG/&quot;&amp;amp;gt;WebFonts Working Group&amp;amp;lt;/a&amp;amp;gt; has published the First Public Working Draft of &amp;amp;lt;a href=&quot;/TR/2010/WD-WOFF-20100727/&quot;&amp;amp;gt;WOFF File Format 1.0&amp;amp;lt;/a&amp;amp;gt;. This document specifies the WOFF font format. This format was designed to provide lightweight, easy-to-implement compression of the font data, suitable for use in conjunction with CSS. Any TrueType/OpenType/Open Font Format file can be losslessly converted to WOFF for Web use (subject to licensing of the font data); once decoded by a user agent, the WOFF font will display identically to the original desktop font from which it was created. Learn more about the &amp;amp;lt;a href=&quot;/Fonts/&quot;&amp;amp;gt;Fonts Activity&amp;amp;lt;/a&amp;amp;gt;.&amp;amp;lt;/p&amp;amp;gt;
    &amp;lt;/content&amp;gt;</description>
	<pubDate>Fri, 30 Jul 2010 18:00:12 +0000</pubDate>
	<dc:creator>W3C Staff</dc:creator>
</item>
<item>
	<title>W3C: Last Call: Cascading Style Sheets (CSS) Snapshot 2007</title>
	<guid>tag:www.w3.org,2010://4.8864</guid>
	<link>http://www.w3.org/News/2010.html#entry-8864</link>
	<description>&amp;amp;lt;p&amp;amp;gt;The &amp;amp;lt;a href=&quot;/Style/CSS/members&quot;&amp;amp;gt;Cascading Style Sheets (CSS) Working Group&amp;amp;lt;/a&amp;amp;gt; has published a Last Call Working Draft of &amp;amp;lt;a href=&quot;/TR/2010/WD-css-beijing-20100727/&quot;&amp;amp;gt;Cascading Style Sheets (CSS) Snapshot 2007&amp;amp;lt;/a&amp;amp;gt;. This document collects together into one definition all the specifications that together form the current state of Cascading Style Sheets (CSS) as of 2007. The primary audience is CSS implementors, not CSS authors, as this definition includes modules by specification stability, not Web browser adoption rate. Comments are welcome through 15 August. Learn more about the &amp;amp;lt;a href=&quot;/Style/&quot;&amp;amp;gt;Style Activity&amp;amp;lt;/a&amp;amp;gt;.&amp;amp;lt;/p&amp;amp;gt;
    &amp;lt;/content&amp;gt;</description>
	<pubDate>Fri, 30 Jul 2010 18:00:12 +0000</pubDate>
	<dc:creator>W3C Staff</dc:creator>
</item>
<item>
	<title>W3C: Cross-Origin Resource Sharing Draft Published</title>
	<guid>tag:www.w3.org,2010://4.8863</guid>
	<link>http://www.w3.org/News/2010.html#entry-8863</link>
	<description>&amp;amp;lt;p&amp;amp;gt;The &amp;amp;lt;a href=&quot;/2008/webapps/&quot;&amp;amp;gt;Web Applications Working Group&amp;amp;lt;/a&amp;amp;gt; has published a Working Draft of &amp;amp;lt;a href=&quot;/TR/2010/WD-cors-20100727/&quot;&amp;amp;gt;Cross-Origin Resource Sharing&amp;amp;lt;/a&amp;amp;gt;. User agents commonly apply same-origin restrictions to network requests. These restrictions prevent a client-side Web application running from one origin from obtaining data retrieved from another origin, and also limit unsafe HTTP requests that can be automatically launched toward destinations that differ from the running application's origin. In user agents that follow this pattern, network requests typically use ambient authentication and session management information, including HTTP authentication and cookie information. This specification extends this model in a number of ways.Learn more about the &amp;amp;lt;a href=&quot;/2006/rwc/&quot;&amp;amp;gt;Rich Web Client Activity&amp;amp;lt;/a&amp;amp;gt;.&amp;amp;lt;/p&amp;amp;gt;
    &amp;lt;/content&amp;gt;</description>
	<pubDate>Fri, 30 Jul 2010 18:00:12 +0000</pubDate>
	<dc:creator>W3C Staff</dc:creator>
</item>
<item>
	<title>W3C: W3C Releases Unicorn, an All-in-One Validator</title>
	<guid>tag:www.w3.org,2010://4.8862</guid>
	<link>http://www.w3.org/News/2010.html#entry-8862</link>
	<description>&amp;amp;lt;p&amp;amp;gt;W3C is pleased to announce the release of &amp;amp;lt;a href=&quot;http://validator.w3.org/unicorn/&quot;&amp;amp;gt;Unicorn&amp;amp;lt;/a&amp;amp;gt;, a one-stop tool to help people improve the quality of their Web pages. Unicorn combines a number of popular tools in a single, easy interface, including the &amp;amp;lt;a href=&quot;http://validator.w3.org/&quot;&amp;amp;gt;Markup validator&amp;amp;lt;/a&amp;amp;gt;, &amp;amp;lt;a href=&quot;http://jigsaw.w3.org/css-validator/&quot;&amp;amp;gt;CSS validator&amp;amp;lt;/a&amp;amp;gt;, &amp;amp;lt;a href=&quot;http://validator.w3.org/mobile/&quot;&amp;amp;gt;mobileOk checker&amp;amp;lt;/a&amp;amp;gt;, and &amp;amp;lt;a href=&quot;http://validator.w3.org/feed/&quot;&amp;amp;gt;Feed validator&amp;amp;lt;/a&amp;amp;gt;, which remain available as individual services as well. W3C invites developers to enhance the service by &amp;amp;lt;a href=&quot;http://code.w3.org/unicorn/wiki/Documentation/Observer&quot;&amp;amp;gt;creating new modules&amp;amp;lt;/a&amp;amp;gt; and testing them in our &amp;amp;lt;a href=&quot;http://code.w3.org/unicorn/wiki#DevelopUnicornandValidationServices&quot;&amp;amp;gt;online developer space&amp;amp;lt;/a&amp;amp;gt; (or &amp;amp;lt;a href=&quot;http://code.w3.org/unicorn/wiki/Documentation/Install&quot;&amp;amp;gt;installing Unicorn locally&amp;amp;lt;/a&amp;amp;gt;). W3C looks forward to code contributions from the community as well as &amp;amp;lt;a href=&quot;http://code.w3.org/unicorn/wiki#Feedback&quot;&amp;amp;gt;suggestions for new features&amp;amp;lt;/a&amp;amp;gt;. W3C would like to thank the many people whose work has led up to this first release of Unicorn. This includes developers  who started and improved the tool over the past few years, users who have provided feedback, &amp;amp;lt;a href=&quot;http://code.w3.org/unicorn/wiki/Translators&quot;&amp;amp;gt;translators&amp;amp;lt;/a&amp;amp;gt; who have helped localize the interface with  &amp;amp;lt;a href=&quot;http://validator.w3.org/unicorn/translations&quot;&amp;amp;gt;21 translations&amp;amp;lt;/a&amp;amp;gt; so far, and sponsors HP and Mozilla and other individual donors. W3C welcomes &amp;amp;lt;a href=&quot;http://code.w3.org/unicorn/wiki#Feedback&quot;&amp;amp;gt;feedback&amp;amp;lt;/a&amp;amp;gt; and &amp;amp;lt;a href=&quot;http://www.w3.org/QA/Tools/Donate&quot;&amp;amp;gt;donations&amp;amp;lt;/a&amp;amp;gt; so that W3C can continue to expand this free service to the community. Learn more about &amp;amp;lt;a href=&quot;http://www.w3.org/Status&quot;&amp;amp;gt;W3C open source software&amp;amp;lt;/a&amp;amp;gt;.
&amp;amp;lt;/p&amp;amp;gt;

    &amp;lt;/content&amp;gt;</description>
	<pubDate>Fri, 30 Jul 2010 18:00:12 +0000</pubDate>
	<dc:creator>W3C Staff</dc:creator>
</item>
<item>
	<title>W3C: The Multilingual Web - Where Are We? Find out at the W3C Workshop</title>
	<guid>tag:www.w3.org,2010://4.8861</guid>
	<link>http://www.w3.org/News/2010.html#entry-8861</link>
	<description>&amp;amp;lt;p&amp;amp;gt;
&amp;amp;lt;a class=&quot;imageLink&quot; href=&quot;/International/multilingualweb/madrid/cfp&quot;&amp;amp;gt;
&amp;amp;lt;img width=&quot;98&quot; height=&quot;98&quot; src=&quot;http://www.w3.org/International/multilingualweb/madrid/mw3-small.png&quot; alt=&quot;Multilingual Web logo&quot;/&amp;amp;gt;
&amp;amp;lt;/a&amp;amp;gt;
W3C is organizing a Workshop: 
&amp;amp;lt;a href=&quot;/International/multilingualweb/madrid/cfp&quot;&amp;amp;gt;The Multilingual Web - Where Are We?&amp;amp;lt;/a&amp;amp;gt;, to take place 26-27 October 2010 in Madrid, Spain. Workshop participants will  survey and introduce currently available best practices and standards that help content creators, localizers, language technology developers, browser makers, and others meet the challenges of the multilingual Web. The Workshop also provides opportunities for networking that span the various communities involved in enabling the multilingual Web. &amp;amp;lt;a href=&quot;/International/multilingualweb/madrid/cfp#participation&quot;&amp;amp;gt;Participation&amp;amp;lt;/a&amp;amp;gt; is free and open to anyone. However, space is limited and participants must send an &amp;amp;lt;a href=&quot;/International/multilingualweb/madrid/cfp#eoi&quot;&amp;amp;gt;expression of interest&amp;amp;lt;/a&amp;amp;gt; to the program committee. People wishing to speak should also submit a presentation outline as soon as possible.
&amp;amp;lt;/p&amp;amp;gt;
&amp;amp;lt;p&amp;amp;gt;
This is the first of four Workshops being planned by W3C over the next two years as part of the &amp;amp;lt;a href=&quot;http://www.multilingualweb.eu/&quot;&amp;amp;gt;MultilingualWeb&amp;amp;lt;/a&amp;amp;gt; European Project. The first Workshop is hosted by the Universidad PolitĆ©cnica de Madrid. For more information, see the &amp;amp;lt;a href=&quot;/International/multilingualweb/madrid/cfp&quot;&amp;amp;gt;call for participation&amp;amp;lt;/a&amp;amp;gt;. Learn more about W3C's &amp;amp;lt;a href=&quot;/International/&quot;&amp;amp;gt;Internationalization Activity&amp;amp;lt;/a&amp;amp;gt;.&amp;amp;lt;/p&amp;amp;gt;
    &amp;lt;/content&amp;gt;</description>
	<pubDate>Fri, 30 Jul 2010 18:00:12 +0000</pubDate>
	<dc:creator>W3C Staff</dc:creator>
</item>
<item>
	<title>W3C: HTML Media Capture Draft Published</title>
	<guid>tag:www.w3.org,2010://4.8859</guid>
	<link>http://www.w3.org/News/2010.html#entry-8859</link>
	<description>&amp;amp;lt;p&amp;amp;gt;The &amp;amp;lt;a href=&quot;/2009/dap/&quot;&amp;amp;gt;Device APIs and Policy Working Group&amp;amp;lt;/a&amp;amp;gt; has published a Working Draft of &amp;amp;lt;a href=&quot;/TR/2010/WD-html-media-capture-20100720/&quot;&amp;amp;gt;HTML Media Capture&amp;amp;lt;/a&amp;amp;gt;. This specification defines HTML form enhancements that provide access to the audio, image and video capture capabilities of the device. The title of the specification changed in this draft (from &quot;The Capture API&quot;). Learn more about the &amp;amp;lt;a href=&quot;/2007/uwa/&quot;&amp;amp;gt;Ubiquitous Web Applications Activity&amp;amp;lt;/a&amp;amp;gt;.&amp;amp;lt;/p&amp;amp;gt;
    &amp;lt;/content&amp;gt;</description>
	<pubDate>Fri, 30 Jul 2010 18:00:12 +0000</pubDate>
	<dc:creator>W3C Staff</dc:creator>
</item>
<item>
	<title>W3C: Last Call: Web Services SOAP Assertions (WS-SOAPAssertions)</title>
	<guid>tag:www.w3.org,2010://4.8856</guid>
	<link>http://www.w3.org/News/2010.html#entry-8856</link>
	<description>&amp;amp;lt;p&amp;amp;gt;The &amp;amp;lt;a href=&quot;/2002/ws/ra/&quot;&amp;amp;gt;Web Services Resource Access Working Group&amp;amp;lt;/a&amp;amp;gt; has published a Last Call Working Draft of &amp;amp;lt;a href=&quot;/TR/2010/WD-ws-soap-assertions-20100713/&quot;&amp;amp;gt;Web Services SOAP Assertions (WS-SOAPAssertions)&amp;amp;lt;/a&amp;amp;gt;. This specification defines two WS-Policy assertions that can be used to advertise the requirement to use a certain version of SOAP in message exchanges. Comments are welcome through 27 August. The group also published &amp;amp;lt;a href=&quot;http://www.w3.org/TR/2010/NOTE-ws-resource-transfer-20100713/&quot;&amp;amp;gt;Web Services Resource Transfer (WS-RT)&amp;amp;lt;/a&amp;amp;gt; as a Note today. That specification defines extensions to WS-Transfer primarily to provide fragment-based access to resources. Learn more about the &amp;amp;lt;a href=&quot;/2002/ws/&quot;&amp;amp;gt;Web Services Activity&amp;amp;lt;/a&amp;amp;gt;.&amp;amp;lt;/p&amp;amp;gt;
    &amp;lt;/content&amp;gt;</description>
	<pubDate>Fri, 30 Jul 2010 18:00:12 +0000</pubDate>
	<dc:creator>W3C Staff</dc:creator>
</item>
<item>
	<title>W3C: Last Call: Mobile Web Application Best Practices</title>
	<guid>tag:www.w3.org,2010://4.8855</guid>
	<link>http://www.w3.org/News/2010.html#entry-8855</link>
	<description>&amp;amp;lt;p&amp;amp;gt;The &amp;amp;lt;a href=&quot;/2005/MWI/BPWG/&quot;&amp;amp;gt;Mobile Web Best Practices Working Group&amp;amp;lt;/a&amp;amp;gt; has published a Last Call Working Draft of &amp;amp;lt;a href=&quot;/TR/2010/WD-mwabp-20100713/&quot;&amp;amp;gt;Mobile Web Application Best Practices&amp;amp;lt;/a&amp;amp;gt;. The goal of this document is to aid the development of rich and dynamic mobile Web applications. It collects the most relevant engineering practices, promoting those that enable a better user experience and warning against those that are considered harmful. The Mobile Web Best Practices Working Group does not expect more substantive changes at this point and expects to be able to transition directly to Proposed Recommendation at the end of the Last Call review period. Last call comments welcome before Comments are welcome through 06 August 2010. Learn more about the &amp;amp;lt;a href=&quot;/Mobile/&quot;&amp;amp;gt;Mobile Web Initiative Activity&amp;amp;lt;/a&amp;amp;gt;.&amp;amp;lt;/p&amp;amp;gt;
    &amp;lt;/content&amp;gt;</description>
	<pubDate>Fri, 30 Jul 2010 18:00:12 +0000</pubDate>
	<dc:creator>W3C Staff</dc:creator>
</item>
<item>
	<title>W3C: RDF Workshop Report Emphasizes Support for JSON, Turtle, Other Formats</title>
	<guid>tag:www.w3.org,2010://4.8854</guid>
	<link>http://www.w3.org/News/2010.html#entry-8854</link>
	<description>&amp;amp;lt;p&amp;amp;gt;The last week of June, participants at the &amp;amp;lt;a href=&quot;/2009/12/rdf-ws/&quot;&amp;amp;gt;W3C RDF Next Steps Workshop&amp;amp;lt;/a&amp;amp;gt; concluded that support for JSON, Turtle, and for &quot;Named Graphs&quot; are top priorities for any future work on RDF. Participants also highlighted the importance of compatibility with existing deployment. Read about these and other topics in the &amp;amp;lt;a href=&quot;/2009/12/rdf-ws/Report.html&quot;&amp;amp;gt;Workshop report&amp;amp;lt;/a&amp;amp;gt;. To join the discussion about organizing future work on RDF, please share your thoughts on the &amp;amp;lt;a href=&quot;mailto:semantic-web@w3.org&quot;&amp;amp;gt;Semantic Web Interest Group&amp;amp;lt;/a&amp;amp;gt; mailing list (with a copy to the separate &amp;amp;lt;a href=&quot;mailto:www-rdf-comments@w3.org&quot;&amp;amp;gt;RDF Comments list&amp;amp;lt;/a&amp;amp;gt;). W3C thanks the
&amp;amp;lt;a href=&quot;http://bioontology.org/&quot;&amp;amp;gt;National Center for Biomedical Ontology&amp;amp;lt;/a&amp;amp;gt; at Stanford, Palo Alto, USA, for hosting the Workshop. Learn more about the &amp;amp;lt;a href=&quot;/standards/semanticweb/&quot;&amp;amp;gt;Semantic Web&amp;amp;lt;/a&amp;amp;gt;.&amp;amp;lt;/p&amp;amp;gt;
    &amp;lt;/content&amp;gt;</description>
	<pubDate>Fri, 30 Jul 2010 18:00:12 +0000</pubDate>
	<dc:creator>W3C Staff</dc:creator>
</item>
<item>
	<title>W3C: Last Call: Authoring Tool Accessibility Guidelines (ATAG) 2.0, Implementing ATAG 2.0</title>
	<guid>tag:www.w3.org,2010://4.8852</guid>
	<link>http://www.w3.org/News/2010.html#entry-8852</link>
	<description>&amp;amp;lt;p&amp;amp;gt;The &amp;amp;lt;a href=&quot;http://www.w3.org/WAI/AU/&quot;&amp;amp;gt;Authoring Tool Accessibility
Guidelines Working Group&amp;amp;lt;/a&amp;amp;gt; has published Last Call Working Drafts of &amp;amp;lt;a href=&quot;/TR/2010/WD-ATAG20-20100708/&quot;&amp;amp;gt;Authoring Tool Accessibility
Guidelines (ATAG) 2.0&amp;amp;lt;/a&amp;amp;gt; and the companion document 
&amp;amp;lt;a href=&quot;/TR/2010/WD-IMPLEMENTING-ATAG20-20100708/&quot;&amp;amp;gt;Implementing ATAG 2.0&amp;amp;lt;/a&amp;amp;gt;. ATAG defines how authoring tools should help developers produce accessible web content that conforms to Web Content Accessibility Guidelines (WCAG) 2.0. The ATAG documents also describe how to make authoring tools accessible so that people with disabilities can use them. Comments are welcome through 2 September 2010. Read the &amp;amp;lt;a href=&quot;http://lists.w3.org/Archives/Public/w3c-wai-ig/2010JulSep/0002.html&quot;&amp;amp;gt;invitation to review the ATAG 2.0 Last Call Working Draft&amp;amp;lt;/a&amp;amp;gt; and
about the &amp;amp;lt;a href=&quot;http://www.w3.org/WAI/&quot;&amp;amp;gt;Web Accessibility Initiative (WAI)&amp;amp;lt;/a&amp;amp;gt;.&amp;amp;lt;/p&amp;amp;gt;
    &amp;lt;/content&amp;gt;</description>
	<pubDate>Fri, 30 Jul 2010 18:00:12 +0000</pubDate>
	<dc:creator>W3C Staff</dc:creator>
</item>
<item>
	<title>W3C: For Review: Updated Techniques for Web Content Accessibility Guidelines (WCAG)</title>
	<guid>tag:www.w3.org,2010://4.8851</guid>
	<link>http://www.w3.org/News/2010.html#entry-8851</link>
	<description>&amp;amp;lt;p&amp;amp;gt;The &amp;amp;lt;a href=&quot;http://www.w3.org/WAI/GL/&quot;&amp;amp;gt;Web Content Accessibility Guidelines Working Group&amp;amp;lt;/a&amp;amp;gt; today requests review of draft updates to Notes that accompany WCAG 2.0: &amp;amp;lt;a href=&quot;http://www.w3.org/WAI/GL/2010/WD-WCAG20-TECHS-20100708/&quot;&amp;amp;gt;Techniques for WCAG 2.0 (Editors' Draft)&amp;amp;lt;/a&amp;amp;gt; and &amp;amp;lt;a href=&quot;http://www.w3.org/WAI/GL/2010/WD-UNDERSTANDING-WCAG20-20100708/&quot;&amp;amp;gt;Understanding WCAG 2.0 (Editors' Draft)&amp;amp;lt;/a&amp;amp;gt;.  Comments are welcome through 9 August 2010. (This is not an update to WCAG 2.0, which is a stable document.) To learn more about the updates, see the &amp;amp;lt;a href=&quot;http://lists.w3.org/Archives/Public/w3c-wai-ig/2010JulSep/0003.html&quot;&amp;amp;gt;Call for Review: WCAG 2.0 Techniques Draft Updates e-mail&amp;amp;lt;/a&amp;amp;gt;. Read about the &amp;amp;lt;a href=&quot;http://www.w3.org/WAI/&quot;&amp;amp;gt;Web Accessibility Initiative (WAI)&amp;amp;lt;/a&amp;amp;gt;.&amp;amp;lt;/p&amp;amp;gt;
    &amp;lt;/content&amp;gt;</description>
	<pubDate>Fri, 30 Jul 2010 18:00:12 +0000</pubDate>
	<dc:creator>W3C Staff</dc:creator>
</item>
<item>
	<title>W3C: Contacts API Working Draft Published</title>
	<guid>tag:www.w3.org,2010://4.8848</guid>
	<link>http://www.w3.org/News/2010.html#entry-8848</link>
	<description>&amp;amp;lt;p&amp;amp;gt;The &amp;amp;lt;a href=&quot;http://www.w3.org/2009/dap/&quot;&amp;amp;gt;Device APIs and Policy Working Group&amp;amp;lt;/a&amp;amp;gt; has published a Working Draft of &amp;amp;lt;a href=&quot;http://www.w3.org/TR/2010/WD-contacts-api-20100701/&quot;&amp;amp;gt;Contacts API&amp;amp;lt;/a&amp;amp;gt;. This document defines the high-level interfaces required to provide access to a user's unified address book, which may source address book data from several sources, both online and locally. Learn more about the &amp;amp;lt;a href=&quot;http://www.w3.org/2007/uwa/&quot;&amp;amp;gt;Ubiquitous Web Applications Activity&amp;amp;lt;/a&amp;amp;gt;.&amp;amp;lt;/p&amp;amp;gt;
    &amp;lt;/content&amp;gt;</description>
	<pubDate>Fri, 30 Jul 2010 18:00:12 +0000</pubDate>
	<dc:creator>W3C Staff</dc:creator>
</item>
<item>
	<title>Vitamin: PHP Login Form Part 1 [Video Tutorial]</title>
	<guid>http://thinkvitamin.com/?p=6780</guid>
	<link>http://thinkvitamin.com/dev/php-login-form-part-1-video-tutorial/</link>
	<description>&lt;div class=&quot;tweetmeme_button&quot;&gt;
			&lt;a href=&quot;http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fdev%2Fphp-login-form-part-1-video-tutorial%2F&quot;&gt;&lt;br&gt;
				&lt;img src=&quot;http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fdev%2Fphp-login-form-part-1-video-tutorial%2F&amp;amp;source=thinkvitamin&amp;amp;style=normal&amp;amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot;&gt;&lt;br&gt;
			&lt;/a&gt;
		&lt;/div&gt;
&lt;p&gt;For our second free weekly helping from the &lt;a href=&quot;http://membership.thinkvitamin.com/&quot;&gt;Think Vitamin Membership&lt;/a&gt; video library we Jim looks at how to create the perfect &lt;a href=&quot;http://membership.thinkvitamin.com/library/php/authentication/log-in-form-part-1/&quot;&gt;login form using PHP&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Don&amp;#8217;t forget to check out the video library for free videos as well as learning more about &lt;a href=&quot;http://membership.thinkvitamin.com/pages/plans/&quot;&gt;our new membership service&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;img src=&quot;http://thinkvitamin.com/?ak_action=api_record_view&amp;id=6780&amp;type=feed&quot; alt=&quot;&quot;&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?a=om2LHo-hQks:2RtOjyUzmeA:FMJD1cDTPr0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?d=FMJD1cDTPr0&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Thu, 29 Jul 2010 12:00:41 +0000</pubDate>
	<dc:creator>Keir Whitaker</dc:creator>
</item>
<item>
	<title>QuirksMode: Four mobile links</title>
	<guid>http://www.quirksmode.org/blog/archives/2010/07/four_mobile_lin.html</guid>
	<link>http://www.quirksmode.org/blog/archives/2010/07/four_mobile_lin.html</link>
	<description>&lt;p&gt;Here are four interesting mobile articles that caught my eye in the past 24 hours:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://mobile.venturebeat.com/2010/07/27/your-mobile-app-is-spying-on-you/&quot; class=&quot;external&quot;&gt;Your mobile app is spying on you&lt;/a&gt;. About the danger in free apps.
	&lt;blockquote&gt;
	&lt;p&gt;The study also found that a large proportion of apps contain third-party code with the capability to interact with sensitive data in a way that may not be apparent to users or the developers of the apps themselves. The third-party code is generally used for advertising or analytics. The project found that 47 percent of free Android apps included this third-party code, while 23 percent of free iPhone apps use it. Third-party code represents a security risk because it is difficult to update (and patch a vulnerability) on a global basis. Apple changed its terms of service for the iPhone recently because of its concerns about what third-party analytics and other companies were doing with private data.&lt;/p&gt;
	&lt;/blockquote&gt;
	&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://wiki.forum.nokia.com/index.php/JavaScript_Performance_Best_Practices&quot; class=&quot;external&quot;&gt;Nokia&amp;#8217;s JavaScript Peformance Best Practices&lt;/a&gt;. Contains a lot that was taken from &lt;a href=&quot;http://stevesouders.com&quot; class=&quot;external&quot;&gt;Steve Souders&amp;#8217;s&lt;/a&gt; research and common knowledge, but also a few things I&amp;#8217;ve never heard before. I&amp;#8217;d really have to do an evaluation of some of the practices. Also contains a few ugly-but-necessary tricks for Symbian WebKit (S60).&lt;/li&gt;
	&lt;li&gt;Also from Nokia: &lt;a href=&quot;http://betalabs.nokia.com/blog/2010/07/28/introducing-ovi-browser-beta-for-series-40-%E2%80%93-faster-easier-web-browsing-that-saves-d&quot; class=&quot;external&quot;&gt;Introducing Ovi Browser Beta for Series 40&lt;/a&gt;. Nokia, too, has produced a mini-browser that relies on a server for the actual rendering and sends out the fully-rendered page, just as Opera Mini does. Now I need to lay my hands on an S40 device so that I can test it.&lt;/li&gt;
	&lt;li&gt;From Bruce Lawson at Opera, finally, comes &lt;a href=&quot;http://dev.opera.com/articles/view/the-mobile-web-optimization-guide/&quot; class=&quot;external&quot;&gt;Mobile-friendly: The mobile web optimization guide&lt;/a&gt; with useful tips and tricks for making your website mobile-friendly.
	&lt;blockquote&gt;
	&lt;p&gt;[...] mobile users are in a hurry; they're on the go and want to perform one specific task and then finish. A common example cited is that of a restaurant site. The mobile user wants to find the location, the menu and the opening hours so, the argument goes, the mobile site should contain this and nothing else.&lt;/p&gt;
	&lt;p&gt;This is a good argument, but it's only half true. If it were 100% true, what would be on the &quot;full&quot; website? Presumably, a movie of the decor, some atmospheric music, animated representations of the house special dishes, and a downloadable menu in some fancy font. The fallacy here is that users of desktop computers are not task-focussed and have time to waste on an immersive branding experience.&lt;/p&gt;

&lt;/ul&gt;</description>
	<pubDate>Thu, 29 Jul 2010 11:11:54 +0000</pubDate>
</item>
<item>
	<title>Wisdump: Anorexic vs. obese layouts: you can't please everyone, but you should try</title>
	<guid>http://wisdump.com/?p=752</guid>
	<link>http://www.wisdump.com/design/anorexic-vs-obese-layouts-you-cant-please-everyone-but-you-should-try/</link>
	<description>&lt;p&gt;This comes as a surprise. Aux of Cogent Metal is &lt;a href=&quot;http://www.cogentmetal.org/aux/archives/2007/10/&quot;&gt;vehemently against&lt;/a&gt; webpages that have narrow layout widths. And I thought web designers are now more worried about the opposite: the wide layouts that whip out the horizontal scrollbars in resolutions narrower than 1024&amp;#215;768. &lt;/p&gt;
&lt;p&gt;This is another proof that you can&amp;#8217;t guess every possible reaction to a &lt;a href=&quot;http://wisdump.com/design/a-need-for-information-and-interface-design-pattern-websites/&quot;&gt;design pattern&lt;/a&gt;. In this case Aux would rather have wide layouts because it would mean a larger area to present content. But what can you do about someone just like Aux, but who believes the complete opposite?&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-752&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Elasticity is tricky&lt;/h3&gt;
&lt;p&gt;The ideal solution to please both lovers and haters of the narrow look would be to construct an elastic layout. But images are the number one obstacle. They have fixed dimensions and look horrible when resized using HTML or CSS attributes&amp;#8212;please, don&amp;#8217;t go there, it&amp;#8217;s just atrocious. Other solutions are just for decorative purposes, not for every image on the page.&lt;/p&gt;
&lt;p&gt;Ads, widgets, and plug-ins all tend to have fixed dimensions as well. It&amp;#8217;s a chicken-and-egg thing: designers resort to fixed layouts because they can&amp;#8217;t resize all those fixed objects, and all those objects are fixed because their creators assume they&amp;#8217;ll be placed in fixed layouts anyway. That, and there hasn&amp;#8217;t been a move towards flexible &lt;em&gt;anything&lt;/em&gt;. Is it because we fear the &lt;em&gt;unpredictability&lt;/em&gt; of flexibility? If it were possible to have webpage elements with flexible dimensions, would we use them, or still go for the fixed-dimension ones?&lt;/p&gt;
&lt;p&gt;A completely flexible layout width isn&amp;#8217;t that appealing, either. In larger screens the lines of text will be so long that it becomes difficult to read. Every layout option has its advantages and disadvantages. You have to pick one and accept that you&amp;#8217;ll piss someone off one way or the other.&lt;/p&gt;
&lt;h3&gt;Custom-tailored user experience&lt;/h3&gt;
&lt;p&gt;However, you should try to please as many people as possible especially if your website is any of the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Very popular (e.g., CNN)&lt;/li&gt;
&lt;li&gt;Text-heavy (e.g., Wikipedia)&lt;/li&gt;
&lt;li&gt;Requires registration (e.g., My Yahoo!)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&amp;#8217;t stop with the layout width. The general ability to customize is important. See what &lt;a href=&quot;http://www.msnbc.msn.com/&quot;&gt;MSNBC&lt;/a&gt; and &lt;a href=&quot;http://www.bbc.co.uk/displayoptions/index.shtml&quot;&gt;BBC&lt;/a&gt; have done. Users can control the type of news that appears, the order in which the news sections appear, the complexity of the page layout, the text styles (from color to letter spacing), and so on. It&amp;#8217;s the empowerment you bring to the audiences that tells them they are highly valued &lt;em&gt;individuals&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Design is about presenting information in the best possible way. Unfortunately there is no single way that is considered the best as long as someone other than the designer is experiencing that design. Although more difficult to implement, websites can let users &lt;em&gt;choose&lt;/em&gt; that experience. If you can help it, let them.&lt;/p&gt;

	&lt;h4&gt;Related reading:&lt;/h4&gt;
	&lt;ul class=&quot;st-related-posts&quot;&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.wisdump.com/css/two-lightweight-css-grid-frameworks-the-1kb-and-the-1-liner/&quot; title=&quot;Two lightweight CSS grid frameworks: the 1KB and the 1-liner (June 11, 2009)&quot;&gt;Two lightweight CSS grid frameworks: the 1KB and the 1-liner&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.wisdump.com/css/really-everything-i-know-about-css-is-wrong/&quot; title=&quot;Really? Everything I Know About CSS Is Wrong? (October 29, 2008)&quot;&gt;Really? Everything I Know About CSS Is Wrong?&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.wisdump.com/design/more-niche-design-inspiration-galleries-popping-up-do-we-really-need-them/&quot; title=&quot;More niche design inspiration galleries popping up (do we really need them?) (September 19, 2008)&quot;&gt;More niche design inspiration galleries popping up (do we really need them?)&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.wisdump.com/good-sites/microsoft-committed-to-a-better-web-with-mix-online/&quot; title=&quot;Microsoft is committed to a better web with MIX Online (December 26, 2008)&quot;&gt;Microsoft is committed to a better web with MIX Online&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.wisdump.com/business/apple-the-pot-stirrer/&quot; title=&quot;Apple, the pot-stirrer (April 11, 2010)&quot;&gt;Apple, the pot-stirrer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/f1Mn_3FzSyjYJC7On9K6up9Fp68/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/f1Mn_3FzSyjYJC7On9K6up9Fp68/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/f1Mn_3FzSyjYJC7On9K6up9Fp68/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/f1Mn_3FzSyjYJC7On9K6up9Fp68/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Wisdump?a=FSs0UNNbbIg:YrmDJxZbYTk:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Wisdump?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Wisdump?a=FSs0UNNbbIg:YrmDJxZbYTk:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Wisdump?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Wisdump?a=FSs0UNNbbIg:YrmDJxZbYTk:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Wisdump?i=FSs0UNNbbIg:YrmDJxZbYTk:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Wisdump?a=FSs0UNNbbIg:YrmDJxZbYTk:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Wisdump?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Wisdump/~4/FSs0UNNbbIg&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
	<pubDate>Thu, 29 Jul 2010 04:19:58 +0000</pubDate>
	<dc:creator>Sophia Lucero</dc:creator>
</item>
<item>
	<title>ajaxian: Canto.js: An Improved Canvas API</title>
	<guid>http://ajaxian.com/?p=9889</guid>
	<link>http://feedproxy.google.com/~r/ajaxian/~3/VkGN6XlnS_g/canto-js-an-improved-canvas-api</link>
	<description>&lt;p&gt;Javascript author extraordinaire David Flanagan released &lt;a href=&quot;http://code.google.com/p/canto-js/&quot;&gt;Canto.js&lt;/a&gt; recently, a lightweight wrapper API for canvas, &lt;a href=&quot;http://www.davidflanagan.com/2010/07/cantojs-an-impr.html&quot;&gt;introduced here&lt;/a&gt; and documented at &lt;a href=&quot;http://code.google.com/p/canto-js/source/browse/trunk/canto.js&quot;&gt;the top of the source code&lt;/a&gt;. Example:&lt;/p&gt;
&lt;div class=&quot;igBar&quot;&gt;&lt;a href=&quot;javascript:showCodeTxt('javascript-3');&quot;&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;syntax_hilite&quot;&gt;&lt;span&gt;JAVASCRIPT:&lt;/span&gt;
&lt;div id=&quot;javascript-3&quot;&gt;
&lt;div class=&quot;javascript&quot;&gt;
canto&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&quot;canvas_id&quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;moveTo&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;,&lt;span&gt;100&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;lineTo&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;200&lt;/span&gt;,&lt;span&gt;200&lt;/span&gt;,&lt;span&gt;100&lt;/span&gt;,&lt;span&gt;200&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;closePath&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;stroke&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Notice three things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; canto() returns an abstraction of the canvas - a &quot;Canto&quot; object.
&lt;/li&gt;
&lt;li&gt; As with jQuery and similar libraries, there's method chaining; each method called on a Canto also returns the Canto.
&lt;/li&gt;
&lt;li&gt; lineTo() has been extended to support multiple lines being drawn in a single call.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead of setting the ink properties and then painting it, you can do it all in one step:&lt;/p&gt;
&lt;div class=&quot;igBar&quot;&gt;&lt;a href=&quot;javascript:showCodeTxt('javascript-4');&quot;&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;syntax_hilite&quot;&gt;&lt;span&gt;JAVASCRIPT:&lt;/span&gt;
&lt;div id=&quot;javascript-4&quot;&gt;
&lt;div class=&quot;javascript&quot;&gt;
canto&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&quot;canvas_id&quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;moveTo&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;,&lt;span&gt;100&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;lineTo&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;200&lt;/span&gt;,&lt;span&gt;200&lt;/span&gt;,&lt;span&gt;100&lt;/span&gt;,&lt;span&gt;200&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;closePath&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;stroke&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#123;&lt;/span&gt;lineWidth: &lt;span&gt;15&lt;/span&gt;, strokeStyle: &lt;span&gt;&quot;red&quot;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And plenty more syntactic sugar - check out the API in the &lt;a href=&quot;http://code.google.com/p/canto-js/source/browse/trunk/canto.js&quot;&gt;source code comments&lt;/a&gt;. Sweet!&lt;/p&gt;
&lt;p&gt;Thanks &lt;a href=&quot;http://twitter.com/pkeane/statuses/19785917337&quot;&gt;@pkeane&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=VkGN6XlnS_g:T_L2JEgipHI:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=VkGN6XlnS_g:T_L2JEgipHI:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=VkGN6XlnS_g:T_L2JEgipHI:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?i=VkGN6XlnS_g:T_L2JEgipHI:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Thu, 29 Jul 2010 04:10:24 +0000</pubDate>
	<dc:creator>Michael Mahemoff</dc:creator>
</item>
<item>
	<title>Vitamin: Around the Web: CSS3 Animations, Agile + UX, Processed Identity</title>
	<guid>http://thinkvitamin.com/?p=6783</guid>
	<link>http://thinkvitamin.com/business/around-the-web-css3-animations-agile-ux-processed-identity/</link>
	<description>&lt;div class=&quot;tweetmeme_button&quot;&gt;
			&lt;a href=&quot;http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fbusiness%2Faround-the-web-css3-animations-agile-ux-processed-identity%2F&quot;&gt;&lt;br&gt;
				&lt;img src=&quot;http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fbusiness%2Faround-the-web-css3-animations-agile-ux-processed-identity%2F&amp;amp;source=thinkvitamin&amp;amp;style=normal&amp;amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot;&gt;&lt;br&gt;
			&lt;/a&gt;
		&lt;/div&gt;
&lt;p&gt;Hey there!&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s Wednesday, so this mid-week roundup is devoted to all things business and development.&lt;/p&gt;
&lt;p&gt;Some links are newsworthy, some retweeted across Twitter, and others just meet our &quot;awesomeness&quot;¯ requirement, and regardless we hope you'll enjoy them. Without further delay:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.leemunroe.com/css3-animations/&quot; target=&quot;_blank&quot;&gt;Start Experimenting With CSS3 Animations&lt;/a&gt; (via&lt;a href=&quot;http://twitter.com/leemunroe&quot; target=&quot;_blank&quot;&gt;@leemunroe&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Arggggh! Subterfuge.&lt;a href=&quot;http://www.core77.com/blog/columns/why_design_contests_are_bad_17024.asp&quot; target=&quot;_blank&quot;&gt; Why Design Contests Are Bad&lt;/a&gt; (via Core77)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.leftontheweb.com/message/Open_Source_Your_Career_my_story&quot; target=&quot;_blank&quot;&gt;Open Source Your Career&lt;/a&gt; (via Stefan Koopmanschap)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.thinkingandmaking.com/view/agile-ux-remembering&quot; target=&quot;_blank&quot;&gt;Agile + UX, Remembering What a Team is Supposed to Be&lt;/a&gt; (via Thinking &amp;amp; Making)&lt;/li&gt;
&lt;li&gt;If you&amp;#8217;ve ever worked on a brand identity or run into challenges you&amp;#8217;ll enjoy &lt;a href=&quot;http://www.processedidentity.com/category/discussion/&quot; target=&quot;_blank&quot;&gt;&amp;#8220;Processed Identity,&amp;#8221; &lt;/a&gt;which s the story of how you got &amp;#8220;there&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Wildcard: &lt;a href=&quot;http://www.mcsweeneys.net/links/commenter/7commenter.html&quot; target=&quot;_blank&quot;&gt;Get to Know an Internet Commenter&lt;/a&gt; (via McSweeny&amp;#8217;s)&lt;a href=&quot;http://design-swap.com/2010/07/06/a-day-in-the-life/&quot; target=&quot;_blank&quot;&gt;&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Please shoot me links to projects your working on or awesome things you&amp;#8217;ve released! &lt;a href=&quot;mailto:news@thinkvitamin.com&quot;&gt;news@thinkvitamin.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Handpicked by,&lt;/p&gt;
&lt;p&gt;Chrissie (&lt;a href=&quot;http://twitter.com/tenaciouscb&quot; target=&quot;_blank&quot;&gt;@tenaciouscb&lt;/a&gt;)&lt;/p&gt;
&lt;img src=&quot;http://thinkvitamin.com/?ak_action=api_record_view&amp;id=6783&amp;type=feed&quot; alt=&quot;&quot;&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?a=-a1fsjQfqro:TzYxQYmDCns:FMJD1cDTPr0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?d=FMJD1cDTPr0&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Thu, 29 Jul 2010 02:38:01 +0000</pubDate>
	<dc:creator>Chrissie Brodigan</dc:creator>
</item>
<item>
	<title>Vitamin: PHP Basics: Installation [Video Tutorial]</title>
	<guid>http://thinkvitamin.com/?p=6776</guid>
	<link>http://thinkvitamin.com/dev/php-basics-installation-video-tutorial/</link>
	<description>&lt;div class=&quot;tweetmeme_button&quot;&gt;
			&lt;a href=&quot;http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fdev%2Fphp-basics-installation-video-tutorial%2F&quot;&gt;&lt;br&gt;
				&lt;img src=&quot;http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fdev%2Fphp-basics-installation-video-tutorial%2F&amp;amp;source=thinkvitamin&amp;amp;style=normal&amp;amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot;&gt;&lt;br&gt;
			&lt;/a&gt;
		&lt;/div&gt;
&lt;p&gt;It&amp;#8217;s Wednesday and time for our first free weekly helping from the &lt;a href=&quot;http://membership.thinkvitamin.com/&quot;&gt;Think Vitamin Membership&lt;/a&gt; video library. &lt;/p&gt;
&lt;p&gt;Today Jim looks at getting started with the popular programming language PHP. In this 8 minute video he shows you how to install PHP and write your first lines of PHP code.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;img src=&quot;http://thinkvitamin.com/?ak_action=api_record_view&amp;id=6776&amp;type=feed&quot; alt=&quot;&quot;&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?a=3sldtwDqRo0:wlzBWp60cCA:FMJD1cDTPr0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?d=FMJD1cDTPr0&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Wed, 28 Jul 2010 11:21:48 +0000</pubDate>
	<dc:creator>Keir Whitaker</dc:creator>
</item>
<item>
	<title>QuirksMode: Opera&amp;#8217;s problems on mobile</title>
	<guid>http://www.quirksmode.org/blog/archives/2010/07/operas_problems.html</guid>
	<link>http://www.quirksmode.org/blog/archives/2010/07/operas_problems.html</link>
	<description>&lt;p&gt;In the mobile browser space all the advanced browsers are based on WebKit. That&amp;#8217;s fine &amp;#8212; WebKit is an excellent rendering engine &amp;#8212; but if &lt;em&gt;all&lt;/em&gt; browsers were based on WebKit I would start to worry about a monoculture. At least some browsers should be based on other rendering engines, as far as I&amp;#8217;m concerned.&lt;/p&gt;

&lt;p&gt;The only serious mobile candidate for &amp;#8220;other rendering engine&amp;#8221; is Opera. But I&amp;#8217;m starting to wonder whether it can keep up with the WebKit browsers. With the recent release of Samsung Dolfin Opera Mobile has firmly dropped from third-best to fourth-best mobile browser on my &lt;a href=&quot;http://www.quirksmode.org/mobile/browsers.html&quot;&gt;list&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The problem is not that Opera isn&amp;#8217;t innovating. It is. But I&amp;#8217;m starting to wonder about the direction that innovation is taking.&lt;/p&gt;

&lt;p&gt;Witness the recent release of Opera Mobile 10.1 beta for Symbian (on my 40th birthday; thanks, guys). I went through the &lt;a href=&quot;http://www.opera.com/press/releases/2010/07/15/&quot; class=&quot;external&quot;&gt;press release&lt;/a&gt;, which highlights the following changes:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Geolocation is now supported (although it doesn&amp;#8217;t give the coordinates in my &lt;a href=&quot;http://www.quirksmode.org/html5/tests/geolocation.html&quot;&gt;test page&lt;/a&gt;). That&amp;#8217;s cool; it&amp;#8217;s definitely something that&amp;#8217;s extremely important on mobile.&lt;/li&gt;
	&lt;li&gt;Vega graphics library and Carakan JavaScript engine. That&amp;#8217;s fun to have, but I&amp;#8217;m not sure if it&amp;#8217;s the most important step Opera could have taken right now. I&amp;#8217;ll get back to this.&lt;/li&gt;
	&lt;li&gt;Various improvements to the user interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that&amp;#8217;s it, according to the press release. (&lt;code&gt;border-radius&lt;/code&gt; is supported, maybe some other stuff too, and there will be some bug fixes here and there, but I haven&amp;#8217;t yet studied it sufficiently to give you a full list.)&lt;/p&gt;

&lt;h3&gt;Relative importance&lt;/h3&gt;

&lt;p&gt;Nowadays all desktop browsers are innovating like mad in their JavaScript engines. For about a year and a half or so, significant improvements in JavaScript speed have been the Holy Grail of browser making, and every new release of every browser now routinely claims to be the fastest browser available.&lt;/p&gt;

&lt;p class=&quot;smaller&quot;&gt;(So routine has this claim become that I do not believe any of them any more. Besides, as far as I can tell they&amp;#8217;re all testing JavaScript Core speed, while the biggest bottleneck is the speed with which DOM changes are made.)&lt;/p&gt;

&lt;p&gt;Now on desktop this is a very important development. On mobile it&amp;#8217;s also important, but I feel there are several other topics that are even more important than JavaScript speed, and that Opera is ignoring these topics.&lt;/p&gt;

&lt;p&gt;Point is, a super-fast JavaScript engine is relatively worthless if you can&amp;#8217;t properly set up a JavaScript-heavy interface. And the very first requirement for a JavaScript-heavy interface is that you always know exactly what the user is doing, so that you can react to his actions naturally and great UX is born.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s in the latter part of that equation that Opera Mobile has serious problems. I feel that, while innovating in JavaScript engines, Opera is forgetting basic mobile functionality without which a fast JavaScript engine is pointless.&lt;/p&gt;

&lt;h3&gt;Touch and viewport&lt;/h3&gt;

&lt;p&gt;There&amp;#8217;s a reason I started my foray into &lt;a href=&quot;http://www.quirksmode.org/mobile/&quot;&gt;mobile browsing&lt;/a&gt; by studying the touch events and the viewport dimensions. These two functionalities are absolutely vital to building compelling mobile interfaces.&lt;/p&gt;

&lt;p&gt;The touch events allow us to follow exactly what the user is doing to the touchscreen. Without these events you can only detect whether the user clicks somewhere. That is enough for some interfaces, but others will definitely want to react to more subtle actions from the user.&lt;/p&gt;

&lt;p&gt;The viewport dimensions are important for knowing how much of your site the user is currently seeing on his screen. An example will clarify why this is important.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m currently working on a little side project that involves writing the perfect JavaScript touch-scroll interface. This presupposes the touch events: without them it&amp;#8217;s absolutely impossible to create a compelling UX.&lt;/p&gt;

&lt;p&gt;However, I want several scrollable areas on the same page, and with that comes the problem of deciding when to allow a user to scroll. If the user has zoomed in and sees a little bit of one scrollable area on the edge of his screen, it makes sense &lt;em&gt;not&lt;/em&gt; to scroll that area when he touches it, because it might confuse him. Instead, we should wait until the scrollable area covers most of the screen before allowing a scroll action. My prototype with this behaviour works pretty intuitively.&lt;/p&gt;

&lt;p&gt;However, in order to know whether the scrollable area is on the screen I must be able to read out the dimensions of the visual viewport. I need to know which part of the page the user is currently viewing, compare it to the scrollable area, check their coordinates, and decide whether the user is allowed to scroll. That&amp;#8217;s something that few browsers support right now.&lt;/p&gt;

&lt;p&gt;Android and Samsung support the touch events, but not the visual viewport dimensions. Symbian, BlackBerry and IE support the visual viewport dimensions, but not the touch events. All other browsers, including Opera Mobile, support neither. So this script only works on the iPhone, which is the single browser to support both. &lt;/p&gt;

&lt;p&gt;So this interface, which I feel is an example of a mobile-specific UX, will not work on Opera Mobile, regardless of the speed of its JavaScript engine. That&amp;#8217;s what I mean when I say that I&amp;#8217;m wondering about Opera&amp;#8217;s direction of innovation.&lt;/p&gt;

&lt;p&gt;Opera Mobile simply &lt;em&gt;must&lt;/em&gt; support the touch events and the viewport dimensions.&lt;/p&gt;

&lt;h3&gt;Zooming&lt;/h3&gt;

&lt;p&gt;But Opera Mobile has an even larger problem, and that is zooming. Basically it has the worst zooming functionality of any mobile browser I tested. It seems Opera ignored the emerging standard for touch-based zooming, and instead created its own system. That&amp;#8217;s fine, as long as the system works. But it doesn&amp;#8217;t.&lt;/p&gt;

&lt;p&gt;So what exactly is wrong with Opera&amp;#8217;s zooming? Basically everything.&lt;/p&gt;

&lt;h4&gt;Two levels&lt;/h4&gt;

&lt;p&gt;Opera has only two zooming levels: in and out. Initially you see the entire page, just as on all other mobile browsers. When you zoom in, however, you go to one single pre-defined zooming level, and once you&amp;#8217;ve arrived there your only option is to zoom out again.&lt;/p&gt;

&lt;p&gt;This behaviour is not unique to Opera Mobile. Many other second-tier mobile browsers, such as Symbian WebKit on touchscreen Nokias, or IE, have only two zoom levels.&lt;/p&gt;

&lt;p&gt;But there are two other characteristics that make the Opera zooming experience uniquely lousy.&lt;/p&gt;

&lt;h4&gt;Pre-emptive narrowing of text&lt;/h4&gt;

&lt;p&gt;Opera kind of pre-emptively narrows your text into columns that fit snugly in the screen when you zoom in. Although that&amp;#8217;s excellent behaviour to display &lt;em&gt;when the user actually zooms in&lt;/em&gt; (as Android does), doing this beforehand makes no sense and has the ability to destroy your page&amp;#8217;s graphic design.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s my &lt;a href=&quot;http://www.quirksmode.org/compatibility.html&quot;&gt;compatibility master page&lt;/a&gt; as it should display on mobile (Dolfin on Samsung Wave). Note that the text in the table stretches all the way from left to right, as it should:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;Compatibility page in Dolfin&quot; src=&quot;http://www.quirksmode.org/mobile/pix/zoom_bada.jpg&quot;&gt;

&lt;p&gt;And here is the same page on Opera Mobile 10.10 (Nokia N97). Here the text in the table is narrowed to the width Opera is going to take later on, when you zoom in:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;Compatibility page in Opera Mobile&quot; src=&quot;http://www.quirksmode.org/mobile/pix/zoom_opera.jpg&quot;&gt;

&lt;p&gt;In this particular case I don&amp;#8217;t mind much, but this feature has the ability to completely destroy a well-designed page. As far as I know you can&amp;#8217;t do anything against this effect and will have to accept the damage it does to your page.&lt;/p&gt;

&lt;h4&gt;Single tap&lt;/h4&gt;

&lt;p&gt;But by far the worst feature of Opera&amp;#8217;s zoom is the user interaction. On touchscreens an industry standard is emerging for zooming. You either pinch-zoom or you double-tap. Some browsers don&amp;#8217;t support pinch-zoom, but the double-tap works pretty well, too.&lt;/p&gt;

&lt;p&gt;However, Opera in its wisdom uses not a double-tap but a single-tap interface. Tap once when zoomed out and you will zoom in on roughly the area you tapped on.&lt;/p&gt;

&lt;p&gt;This is terrible. In order to understand why, take a look at my &lt;a href=&quot;http://www.quirksmode.org/m/tests/touch.html&quot;&gt;Touch test page&lt;/a&gt;. It&amp;#8217;s fully zoomed-out:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;Touch test page in Opera Mobile&quot; src=&quot;http://www.quirksmode.org/mobile/pix/zoom_opera2.jpg&quot;&gt;

&lt;p&gt;This is how I designed the page: I want it to be usable even fully zoomed-out. Thus I can load the page, hit Record, and record an event sequence of my choice.&lt;/p&gt;

&lt;p&gt;But what happens in Opera Mobile when I hit Record with a single tap in order to start recording? &lt;em&gt;It. Bloody. Zooms. In!&lt;/em&gt; That makes my test page much harder to use.&lt;/p&gt;

&lt;p&gt;To be fair, Opera Mobile 10.10 does not zoom at all in pages that have a &lt;code&gt;&amp;lt;meta viewport&amp;gt;&lt;/code&gt;, as my test page has. That solves this particular issue, but I feel it&amp;#8217;s still a stop-gap solution. All other browsers &lt;em&gt;do&lt;/em&gt; allow the user to zoom in on a &lt;code&gt;&amp;lt;meta viewport&amp;gt;&lt;/code&gt;-enhanced page. (Some even allow you to zoom out.)&lt;/p&gt;

&lt;h3&gt;Opera&amp;#8217;s problems&lt;/h3&gt;

&lt;p&gt;Concluding, Opera Mobile has a serious zoom problem that must be addressed in addition to the touch event and viewport dimension problem.&lt;/p&gt;

&lt;p&gt;I feel that addressing these issues is more important than yet another faster JavaScript engine or yet another UX upgrade. Besides, as long as zoom remains lousy the UX can be upgraded only so much. Zooming is a fundamental part of the mobile UX; without it many other innovations just don&amp;#8217;t make sense.&lt;/p&gt;

&lt;p&gt;So in order to remain relevant on the highest tier of mobile browsing, Opera will have to concentrate on three things:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;Fix zooming: double-tap interaction, many more zoom levels, no pre-emptive narrowing of text columns.&lt;/li&gt;
	&lt;li&gt;Support the touch events.&lt;/li&gt;
	&lt;li&gt;Allow us to read out the viewport dimensions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I more-or-less expect the busy engineers in Oslo to be working on these problems, and I assume that the next major Opera Mobile upgrade will bring significant improvements here.&lt;/p&gt;

&lt;p&gt;If it doesn&amp;#8217;t, I&amp;#8217;m afraid Opera is out of the race for the top spot. That is not necessarily bad: it could always forget about the top tier and instead concentrate on the low-end smartphone market. Right now Opera Mobile is available only for Symbian and Windows Mobile, and on those operating systems it&amp;#8217;s the best available browser.&lt;/p&gt;

&lt;p&gt;Without a serious upgrade of mobile-specific functionality ruling this second tier is the best Opera can hope for. The top tier will be WebKit-only.&lt;/p&gt;</description>
	<pubDate>Wed, 28 Jul 2010 10:07:11 +0000</pubDate>
</item>
<item>
	<title>ajaxian: YUI 3.2.0 preview release 1 "“ touch events support, transitions and browser-specific loading</title>
	<guid>http://ajaxian.com/?p=9885</guid>
	<link>http://feedproxy.google.com/~r/ajaxian/~3/V-QsdWBOxZI/yui-3-2-0-preview-release-1-touch-events-support-transitions-and-browser-specific-loading</link>
	<description>&lt;p&gt;Over at the &lt;a href=&quot;http://www.yuiblog.com/blog/2010/07/26/3-2-0pr1/&quot;&gt;the YUI blog the team just announced the preview release of YUI 3.2.0&lt;/a&gt;. YUI3 now has some interesting new features that the team wants you to try and tell them if they work out for you. The changes to the already very powerful library are quite ambitious:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://yuiblog.com/sandbox/yui/3.2.0pr1/tests/event-gestures/tests/manual/gestures.html&quot;&gt;Touch event support&lt;/a&gt; for mobile interfaces including flick and move gestures&lt;/li&gt;
&lt;li&gt;Browser capability loading - which means that every browser gets the least amount of code necessary to make it work&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://yuiblog.com/sandbox/yui/3.2.0pr1/examples/transition/transition-usage.html&quot;&gt;Transition support for the animation module&lt;/a&gt; - meaning only browsers that don't support CSS3 transitions get the JavaScript animation fallback&lt;/li&gt;
&lt;li&gt;An &lt;a href=&quot;http://yuiblog.com/sandbox/yui/3.2.0pr1/examples/cssgrids/cssgrids-units.html&quot;&gt;update to the CSS grids&lt;/a&gt; to allow for more flexible layouts&lt;/li&gt;
&lt;li&gt;A &lt;a href=&quot;http://yuiblog.com/sandbox/yui/3.2.0pr1/examples/scrollview/index.html&quot;&gt;ScrollView widget&lt;/a&gt; similar to the one in Apple iOS&lt;/li&gt;
&lt;li&gt;The uploader has been transitioned over from YUI2 to YUI3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So check out what is on offer and give the YUI team feedback on what would be nice to have and what is broken. In their own words:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The goal of a preview release is to make it as easy as possible for all of us in the community to evaluate progress of the upcoming release and provide feedback.  Please take some time to test 3.2.0pr1 and let us know what you find by filing tickets in the &lt;a href=&quot;http://yuilibrary.com/projects/yui3/newticket?version=3.2.0%20PR1&quot;&gt;YUI 3 bug database&lt;/a&gt; marked as &quot;Observed in version&quot;¯ 3.2.0pr1.  We'll do our best to address preview-release questions on the &lt;a href=&quot;http://yuilibrary.com/forum/viewforum.php?f=15&quot; title=&quot;YUI Library :: Forums :: View forum - YUI 3.x:&quot;&gt;YUI 3 Forums&lt;/a&gt;, too.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;There are three ways to get started with the preview release:  YUI 3.2.0pr1 is available on the CDN via the 3.2.0pr1 version tag &quot;” so you can reference preview-release files like &lt;code&gt;&lt;a href=&quot;http://yui.yahooapis.com/combo?3.2.0pr1/build/yui/yui-min.js&quot;&gt;http://yui.yahooapis.com/combo?3.2.0pr1/build/yui/yui-min.js&lt;/a&gt;&lt;/code&gt;.  If you switch to this seed file for the preview release, all subsequent &lt;code&gt;use()&lt;/code&gt; statements will continue to load YUI 3.2.0pr1. Or You can download the full YUI 3.2.0pr1 from &lt;a href=&quot;http://yuilibrary.com/downloads/&quot;&gt;YUILibrary.com&lt;/a&gt;, including source code and examples for all components. Or you can simply explore the &lt;a href=&quot;http://yuiblog.com/sandbox/yui/3.2.0pr1/examples/&quot; title=&quot;YUI 3: Index of Library Examples&quot;&gt;functioning examples roster&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=V-QsdWBOxZI:Tkj0nOzxPDM:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=V-QsdWBOxZI:Tkj0nOzxPDM:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=V-QsdWBOxZI:Tkj0nOzxPDM:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?i=V-QsdWBOxZI:Tkj0nOzxPDM:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Tue, 27 Jul 2010 18:34:02 +0000</pubDate>
	<dc:creator>Chris Heilmann</dc:creator>
</item>
<item>
	<title>Vitamin: Recurring Billing For Web Apps</title>
	<guid>http://carsonified.com/?p=6601</guid>
	<link>http://thinkvitamin.com/dev/reoccurring-billing-for-web-apps/</link>
	<description>&lt;div class=&quot;tweetmeme_button&quot;&gt;
			&lt;a href=&quot;http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fdev%2Freoccurring-billing-for-web-apps%2F&quot;&gt;&lt;br&gt;
				&lt;img src=&quot;http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fdev%2Freoccurring-billing-for-web-apps%2F&amp;amp;source=thinkvitamin&amp;amp;style=normal&amp;amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot;&gt;&lt;br&gt;
			&lt;/a&gt;
		&lt;/div&gt;
&lt;p&gt;Increasingly web application developers and entrepreneurs are turning to the &amp;#8220;Software As A Service&amp;#8221; (SaaS) model to monetize their products.&lt;br&gt;
Together with this growth has come the need for reliable recurring billing systems and in turn a number of enterprising folks have built said solutions and fittingly used the SaaS model to monetize their efforts.&lt;/p&gt;
&lt;p&gt;In this article we will look at how these services work, why you&amp;#8217;d want to use them, the various options available, and how they differ from one another. Hopefully it should give you a better idea of which service is right for you and how you plan to use it.&lt;/p&gt;
&lt;h3&gt;Why do I Need this Service?&lt;/h3&gt;
&lt;p&gt;There are many tools that are making web application development easier and easier, whether that be development frameworks such as &lt;a href=&quot;http://rubyonrails.org/&quot;&gt;Rails&lt;/a&gt; and &lt;a href=&quot;http://www.djangoproject.com/&quot;&gt;Django&lt;/a&gt; or services like &lt;a href=&quot;http://aws.amazon.com/&quot;&gt;Amazon Web Services&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/appengine/&quot;&gt;Google App Engine&lt;/a&gt;, recurring billing systems are no different.&lt;span id=&quot;more-6601&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Building a billing system can be a complicated process with issues such as how to handle failed transactions, when and how to recharge cards, and not to mention all the data protection issues surrounding storing financial information and PCI compliance etc. These services allow you to abstract these concerns and let you focus on building the software you care about.&lt;/p&gt;
&lt;h3&gt;How do They Work?&lt;/h3&gt;
&lt;p&gt;The services all have a number of core functions in common. They provide a web application interface where you can create different products and configure pricing options. The service then deals with taking and storing your customer&amp;#8217;s credit card details (normally with a PCI compliant third-party).&lt;/p&gt;
&lt;p&gt;The information about customers, products and subscriptions is then exposed via a secure API which allows you to hook your app into the service. A fairly simple, elegant and, in my experience, reliable solution to something that could potentially be a major headache for app developers.&lt;/p&gt;
&lt;p&gt;Essentially as a developer you have two options:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option One&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You choose to forward paying customers to the service&amp;#8217;s hosted payment pages. This is the quickest and simplest way to get started. These pages are secure and accept query string parameters to pre-populate fields such as name and email address.&lt;/p&gt;
&lt;p&gt;Successful payments will then be forwarded to a callback URL and any change to a subscription&amp;#8217;s status will be posted back to your app via a post-back URL.&lt;/p&gt;
&lt;p&gt;Both of these URLs are specified by you in the product settings of the billing service. Obviously, you would be mad not to validate the callback with a API query and likewise you will also need to check the nature of the subscription status change upon post-back notification.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option Two&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The process is almost identical to option one, however, you do not send users to the service&amp;#8217;s hosted page to take payment. Your application collects (but does not store) all payment details and that data is then delivered to the billing service via their API.&lt;/p&gt;
&lt;p&gt;In this instance the onus is upon you to take the user&amp;#8217;s credit card details securely and handle the API&amp;#8217;s response appropriately. However, the obvious benefits of this option is that the user&amp;#8217;s experience is seamless, you have complete control over user interface design and user&amp;#8217;s are unaware you&amp;#8217;re using an external billing service.&lt;/p&gt;
&lt;h3&gt;Billing Systems vs. Payment Gateways&lt;/h3&gt;
&lt;p&gt;Amidst these technical decisions it is also important remember that these billing services are not payment gateways, they do not carry out the card transitions. They purely deal with the business logic of charges, re-charges, charge backs and data storage. In order to charge the card and for the money to end up in your account the billing service provider hooks into the API of your payment gateway of choice.&lt;/p&gt;
&lt;p&gt;This means that it is important to check which payment gateways these service providers support. Some support more than others and until recently some have had a very limited choice of gateways.&lt;/p&gt;
&lt;p&gt;Some common payment gateways include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.authorize.net/&quot;&gt;Authorize.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.rbsworldpay.com/&quot;&gt;Worldpay&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.trustcommerce.com/&quot;&gt;TrustCommerce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.paymentexpress.com/index.html&quot;&gt;Payment Express&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.paypal-business.co.uk/process-online-payments-with-paypal/index.htm&quot;&gt;PayPal Website Payments Pro&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are also differences in these gateways and it is important to choose the right one for you and the billing service you choose.&lt;/p&gt;
&lt;p&gt;Something to consider is that most of the gateways mentioned above require a merchant account which you would have to arrange with your bank. However, a lot of people avoid this by using Paypal Payments Pro where the money is transfered into a Paypal account ready for you to withdraw.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;d like to know more about merchant accounts hear what Ryan has to say about his experience in this arena on &lt;a href=&quot;http://carsonified.com/blog/tvr/think-vitamin-radio-episode-7/&quot;&gt;Think Vitamin Radio Episode 7&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;What&amp;#8217;s on Offer?&lt;/h3&gt;
&lt;p&gt;There are a good range of providers to choose from and unlike some services they do vary in their cost, features and pricing model. Here&amp;#8217;s a breakdown of a few of the big players in the space.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chargify&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://chargify.com/&quot;&gt;&lt;img title=&quot;chargify&quot; src=&quot;http://carsonified.com/wp-content/uploads/2010/07/chargify.jpg&quot; alt=&quot;&quot; width=&quot;470&quot; height=&quot;250&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Chargify is seemingly the solution with the richest set of features and the lowest barrier to entry. They offer a free account which is limited to 50 paying customers plus 1,000 non-paying customers.&lt;/p&gt;
&lt;p&gt;Their pricing model is clearly designed with the thought that those first 50 customers are the hardest to acquire and once you have those customers paying X amount per month you can afford to pay for their higher volume service.&lt;/p&gt;
&lt;p&gt;These start from $49 a month for up to 500 customers and is graduated there on up to $2,499 per month for unlimited customers. As a result of these graduated monthly fees Chargify does not add any per-transaction cost, so within their pricing brackets your costs are fixed.&lt;/p&gt;
&lt;p&gt;The people behind &lt;a href=&quot;http://twitter.com/chargify&quot;&gt;@chargify&lt;/a&gt; on Twitter are extremely helpful both in explaining their own service and in offering advice about merchant accounts and receptive banks in both the UK and USA.&lt;/p&gt;
&lt;p&gt;This is unsurprising as Chargify is brought to you by the guys behind Grasshopper and if you&amp;#8217;re a Rails person it is also worth noting that Chargify&amp;#8217;s CEO and Founder is Lance Walley who was also Co-Founder of Rails hosting provider Engine Yard. Both these companies are known for their excellent software and, in my experience, great customer service which bodes well for Chargify.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://chargify.com/&quot;&gt;http://chargify.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Spreedly&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://spreedly.com/&quot;&gt;&lt;img title=&quot;spreedly&quot; src=&quot;http://carsonified.com/wp-content/uploads/2010/07/spreedly.jpg&quot; alt=&quot;&quot; width=&quot;470&quot; height=&quot;250&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Spreedly is a younger service and therefore less feature rich. For example, I expressed an interest in charging a set up fee. A one-off fee that is only charged upon sign up. This can be useful to those services that have a fixed overheads for each user who signs up and something that&amp;#8217;s easy to set up on Chargify.&lt;/p&gt;
&lt;p&gt;However, Spreedly don&amp;#8217;t currently offer this feature, but they say it is something that they are keen to do in the future. Likewise, at this point they don&amp;#8217;t seem to have the choice to create add-ons for customers to add to their purchase at point of sale. Again, this is very useful for SaaS businesses offering bolt-on services.&lt;/p&gt;
&lt;p&gt;Spreedly also takes a slightly different approach to Chargify in terms of pricing. They have a flat-rate monthly charge of $19 but also take 20c or 2% (whichever is the lower amount) of each transaction.&lt;/p&gt;
&lt;p&gt;As with Chargify this pricing model scales with your business and means that at times Spreedly could be considerable cheaper than Chargify. That said, there are also points of customer volume where Spreedly&amp;#8217;s costs will exceed Chargify&amp;#8217;s. Plus with Chargify the frequency of your payment transactions is not an issue, if you want to charge users every 14 days you can at no extra cost whereas this would prove an expensive exercise with Spreedly.&lt;/p&gt;
&lt;p&gt;A great benefit of Spreedly is the quantity of payment gateways they support. They are clearly focusing on simplicity and their support for gateways which is by no means a bad thing. As with Chargify the folks behind &lt;a href=&quot;http://twitter.com/spreedly&quot;&gt;@spreedly&lt;/a&gt; were extremely helpful via Twitter and found my questions about their service without the need for a direct @ message. They were happy to answer questions and offer alternative approaches to features that weren&amp;#8217;t available yet. In short, Spreedly is definitely worth a look if your current needs are simple and you like the idea of a per-transaction cost.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://spreedly.com/&quot;&gt;http://spreedly.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CheddarGetter&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;cheddar&quot; src=&quot;http://carsonified.com/wp-content/uploads/2010/07/cheddar.jpg&quot; alt=&quot;&quot; width=&quot;470&quot; height=&quot;250&quot;&gt;&lt;/p&gt;
&lt;p&gt;First up &amp;#8211; what a name &amp;#8211; CheddarGetter definitely wins in the name game. However, how does it stand up against Chargify and Spreedly. Well, in terms of features CheddarGetter definitely rivals Chargify and exceeds Spreedly. However, their pricing structure is different again. Like Chargify they have graduated montlhy charges based on customer volume with no transaction fees.&lt;/p&gt;
&lt;p&gt;As with both Spreedly and Chargify &lt;a href=&quot;http://twitter.com/cheddargetter&quot;&gt;@cheddargetter&lt;/a&gt; offer phenomenal service via Twitter. Mention the name CheddarGetter in the context of a question and they will find you and offer support. This proactive approach seems to be the norm is this space but we shouldn&amp;#8217;t forget how rare it is to get this kind of customer service.&lt;/p&gt;
&lt;p&gt;The major downside of CheddarGetter right now is its lack of payment gateway integration. The limited list of gateways includes Network Merchants and Authorize.net but no Paypal Website Payments Pro for those of you who don&amp;#8217;t want to deal with getting a merchant account with your bank. That said, with some more payment gateway integration CheddarGetter has real potential.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cheddargetter.com/&quot;&gt;https://cheddargetter.com/&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;But How do I Choose?&lt;/h3&gt;
&lt;p&gt;As you can see the billing services spaces has quite a spread of different pricing models so they can be hard to compare in terms of price and work out features vs. cost per customer vs. potentially cost per transaction with Spreedly.&lt;/p&gt;
&lt;p&gt;Chad Glendenin has &lt;a href=&quot;http://blog.glendenin.com/chargify-vs-spreedly-vs-cheddargetter-subscri&quot;&gt;an excellent comparison of the pricing of these services&lt;/a&gt; including graphs which map customer growth vs. cost of service for all these of the providers I&amp;#8217;ve mentioned. These are extremely useful in demonstrating how these services actually compare in terms of price and highlights the customer volume markers where favour shifts from one service to another. He also provides his Python script for generating these figures so that you can run the numbers with your own payment frequencies and prices.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s clear that if you expect a very high quantity of subscribers, meaning 15,000+ customers paying monthly, then Chargify&amp;#8217;s features and unlimited plan makes them the obvious choice.&lt;/p&gt;
&lt;p&gt;However, if you&amp;#8217;re expecting very low volume, or your only taking annual payments and this is something you&amp;#8217;re setting up on the side of a day job, Spreedly&amp;#8217;s per-transaction model and simplicity would suit your needs. However, these are both extreme ends of the spectrum.&lt;/p&gt;
&lt;p&gt;Extremes aside, I think this decision is really about features and not price. The costs are marginal compared to whether the service can provide you with what you need. Integration with a billing system while a fairly straightforward process isn&amp;#8217;t something that you want to have change after 18 months.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;If you&amp;#8217;re planning more complicated pricing models, add on products, short payment intervals, or want a metered service where customers pay for their usage then you need to hunt down each service&amp;#8217;s feature list and ensure they offer what you need. You are buying simplicity, you&amp;#8217;re buying the ability to focus on your own app and abstract the billing logic, make sure the service you choose offers you what you need not just the best price.&lt;/p&gt;
&lt;p&gt;Finally, if you guys are using any of these services it would be great to hear from you in the comments about your experiences and your decision making when you chose the service.&lt;/p&gt;
&lt;img src=&quot;http://thinkvitamin.com/?ak_action=api_record_view&amp;id=6601&amp;type=feed&quot; alt=&quot;&quot;&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?a=8UiuroqV98I:dBDsRsWN6x0:FMJD1cDTPr0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?d=FMJD1cDTPr0&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Tue, 27 Jul 2010 13:00:55 +0000</pubDate>
	<dc:creator>Kieran Masterton</dc:creator>
</item>
<item>
	<title>QuirksMode: Mobile payments made easy</title>
	<guid>http://www.quirksmode.org/blog/archives/2010/07/mobile_payments.html</guid>
	<link>http://www.quirksmode.org/blog/archives/2010/07/mobile_payments.html</link>
	<description>&lt;p&gt;This is just in: Google seems to be &lt;a href=&quot;http://android-developers.blogspot.com/2010/07/adjustment-to-market-legals.html&quot; class=&quot;external&quot;&gt;taking steps&lt;/a&gt; to allow operator billing. If that&amp;#8217;s true it&amp;#8217;s huge news.&lt;/p&gt;

&lt;p&gt;Note from the outset that the article doesn&amp;#8217;t say in so many words that operator billing is coming, although it certainly gives that impression, and &lt;a href=&quot;http://phandroid.com/2010/07/26/googles-introducing-new-market-purchase-options-pay-for-apps-alongside-your-monthly-bill/&quot; class=&quot;external&quot;&gt;plenty of&lt;/a&gt; &lt;a href=&quot;http://www.mobilecrunch.com/2010/07/26/carrier-billing-coming-soon-to-android/&quot; class=&quot;external&quot;&gt;publications&lt;/a&gt; &lt;a href=&quot;http://www.boygeniusreport.com/2010/07/24/carrier-billing-coming-soon-to-the-android-market/&quot; class=&quot;external&quot;&gt;translate it&lt;/a&gt; as such.&lt;/p&gt;

&lt;p&gt;The basic idea of operator billing is very simple: if you want to buy an app, or access to online content, the price is automatically added to your operator bill (or, I assume, deducted from your pre-paid account).&lt;/p&gt;

&lt;p&gt;Now I&amp;#8217;m not a mobile billing specialist by any means, but I still want to give you an idea of what we&amp;#8217;re talking about. If I make any technical mistakes, please correct them in the comments.&lt;/p&gt;

&lt;h3&gt;The billing process&lt;/h3&gt;

&lt;p&gt;Just yesterday I made my first Android Market purchase, and although the process was relatively smooth, I still had to fill in all my credit card stuff, make mistakes, being told off, etc. Besides, when I tried to do the same a few months ago, the Android Market rejected my credit card. Why? Probably because the Dutch market wasn&amp;#8217;t active yet &amp;#8212; but I thought of that only much later. At the moment I was pretty pissed.&lt;/p&gt;

&lt;p&gt;Now with operator billing I wouldn&amp;#8217;t have all this hassle. I&amp;#8217;d just click on whatever I want to buy, give a one-time confirmation &amp;#8220;Yes, I do want to spend &amp;euro; 2.39 on this&amp;#8221; and be done. When my next operator bill comes around, the &amp;euro; 2.39 will be added to it.&lt;/p&gt;

&lt;p&gt;In addition, operators can verify your identity through your SIM card, without you having to do anything. No more hassle with credit card numbers. (In fact, the only parties that have a lot to lose from operator billing are the credit card companies. Expect resistance from them; they&amp;#8217;ll probably say it&amp;#8217;s unsafe or something.)&lt;/p&gt;

&lt;p&gt;Thus operator billing is by far the most user-friendly way of making mobile purchases. That&amp;#8217;s what makes it so important. Besides, it also opens up the mobile marketplace to those that do not have a credit card.&lt;/p&gt;

&lt;h3&gt;A question of identity&lt;/h3&gt;

&lt;p&gt;However, Google&amp;#8217;s rather vague announcement does leave some questions unanswered. No doubt that&amp;#8217;s because Google is still figuring out how to answer those questions. But let&amp;#8217;s review them anyway:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;What do I have to do in order to make a purchase? A one-step system is within reach; I hope it will be implemented.&lt;/li&gt;
	&lt;li&gt;How will my identity (and thus my bill) be verified?&lt;/li&gt;
	&lt;li&gt;How will the various parties communicate?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last question is probably the most important one. If I want to make a purchase through operator billing, there are three parties involved: me, the selling party, and the operator. Somehow, the selling party has to connect to the operator to figure out exactly who I am, and to make a request to put &amp;euro; 2.39 on my bill for my purchase. In addition, the operator has to pay that money (maybe minus a fee) to the selling party.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://developer.vodafone.com/getting-started&quot; class=&quot;external&quot;&gt;JIL 1.2 API&lt;/a&gt; gives us some clues as to how this system is going to work. This API, that will eventually be implemented in Vodafone 360 phones as well as, one hopes, many others, has two properties that are meant specifically for operator billing (p. 16):&lt;/p&gt;

&lt;pre&gt;
Widget.Device.AccountInfo.phoneUserUniqueId
Widget.Device.AccountInfo.phoneOperatorName
&lt;/pre&gt;

&lt;p&gt;Thus, when purchase times comes around, the store has some grip on your identity. It will have to send off a communication to the specified operator stating that user with unique ID X wants to make a &amp;euro; 2.39 purchase.&lt;/p&gt;

&lt;p&gt;The operator will have to make some effort to verify this information; after all I might be able to hack a phone to send false unique IDs. Thus the operator will probably send me an SMS &amp;#8220;Are you sure you want to purchase product X for &amp;euro; 2.39?&amp;#8220; Once I reply to that SMS the purchase is made and downloading can commence.&lt;/p&gt;

&lt;p&gt;Still, I hope that the process will become even more user-friendly. The same JIL specification defines a way to send an SMS from a widget. Thus, if I want to purchase something the system could automatically generate an SMS for me and send it off to the operator. Thus the operator will be able to verify my intent by comparing my unique user ID with the SIM card through which the SMS was sent. If they match the purchase is made and downloading can commence.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s one step less, and thus more user-friendly. Hell, if it&amp;#8217;s implemented correctly I don&amp;#8217;t even have to switch to my SMS application. (The operator still has to tell the store &amp;#8220;Purchase made, proceed with download.&amp;#8221; But a proper system will not bother me with the details.)&lt;/p&gt;

&lt;p&gt;Unfortunately the JIL 1.2 spec does not yet contain the methods that will be used for actual payments, nor the exact workflow. Besides, it&amp;#8217;s unclear which operators Google is talking to right now. Probably US-based ones, and of those only Verizon is part of the JIL consortium. The others might use other APIs. (Come to think of it, so might Verizon. One never knows.)&lt;/p&gt;

&lt;h3&gt;Future expansion&lt;/h3&gt;

&lt;p&gt;Let&amp;#8217;s close on a positive note and assume that a system roughly similar to what I describe above will actually be in place in two years or so. Apart from the increased user-friendliness of the purchasing process, what will it bring?&lt;/p&gt;

&lt;p&gt;The basic answer is Long Tail. Increased user-friendliness and the scrapping of the requirement to own a credit card may entice more consumers to make a mobile purchase. That would be good.&lt;/p&gt;

&lt;p&gt;The real benefit will lie with developers, though. In theory, the system could be set up so that individual developers who offer one or two apps for download on their own site can also use it.&lt;/p&gt;

&lt;p&gt;Thus the requirement to offer your wares through one or more app stores might also be scrapped. That could be especially important to cross-platform apps such as W3C Widgets. Whichever phone with whichever operator ends up at the developer&amp;#8217;s site, they can all make a purchase, provided they support widgets.&lt;/p&gt;

&lt;p&gt;One more nail in the app stores&amp;#8217; coffin would be the opportunity to make in-app purchases; say some articles from a news site or a few new levels for your game. Operator billing is explicitly meant for such purchases, too. And if we can use operator billing in our apps, too, the app store infrastructure is basically not necessary any more.&lt;/p&gt;

&lt;p&gt;Picture the following:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;I write a news reader app as a W3C Widget. Anyone can download it for free from my website.&lt;/li&gt;
	&lt;li&gt;If you like my app you can share it with your friends. Just send over the widget via Bluetooth. No more complicated user-unfriendly Send-To-Friend systems necessary.&lt;/li&gt;
	&lt;li&gt;But how do I make money? By selling access to the actual articles. Every article you want to read costs you, say &amp;euro; 0.02. Alternatively, you can buy a day of unlimited access for, I don&amp;#8217;t know, &amp;euro; 0.99.&lt;/li&gt;
	&lt;li&gt;All the billing is done in-app through the operator. My users never have to do anything beyond saying &amp;#8220;Yes, I want to buy this article.&amp;#8221;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Where&amp;#8217;s the app store in this process? Nowhere. We don&amp;#8217;t need it any more. Wouldn&amp;#8217;t that be something?&lt;/p&gt;

&lt;p class=&quot;smaller&quot;&gt;(I should note that although sending widgets via Bluetooth is possible nowadays &amp;#8212; I&amp;#8217;ve done it &amp;#8212; the process is not very user-friendly yet. But this functionality is definitely coming; it&amp;#8217;s not a pipe dream.)&lt;/p&gt;

&lt;h3&gt;Waiting for Google&lt;/h3&gt;

&lt;p&gt;So I&amp;#8217;m impatiently waiting for Google to announce more details. Exactly how will their system work? What does the user have to do? Which operators? Questions, questions.&lt;/p&gt;

&lt;p&gt;Anyway, the future of mobile payments has come one step closer.&lt;/p&gt;</description>
	<pubDate>Tue, 27 Jul 2010 12:06:37 +0000</pubDate>
</item>
<item>
	<title>Vitamin: Around the Web: Inspiredology, Avatars in Motion, &amp; Quite Strong</title>
	<guid>http://thinkvitamin.com/?p=6768</guid>
	<link>http://thinkvitamin.com/design/around-the-web-inspiredology-avatars-in-motion-quite-strong/</link>
	<description>&lt;div class=&quot;tweetmeme_button&quot;&gt;
			&lt;a href=&quot;http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fdesign%2Faround-the-web-inspiredology-avatars-in-motion-quite-strong%2F&quot;&gt;&lt;br&gt;
				&lt;img src=&quot;http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fdesign%2Faround-the-web-inspiredology-avatars-in-motion-quite-strong%2F&amp;amp;source=thinkvitamin&amp;amp;style=normal&amp;amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot;&gt;&lt;br&gt;
			&lt;/a&gt;
		&lt;/div&gt;
&lt;p&gt;Hey there!&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s Monday, so this roundup is devoted to all things web  design (ux, photo, illustration, art, graphics, CSS, jQuery, tutorials,  and more). Some links are newsworthy, some retweeted across Twitter, and  others just meet our &quot;awesomeness&quot;¯ requirement, and regardless we hope  you'll enjoy them. Without further delay:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ever wonder what avatar development looks like when it gets really really good? &lt;a href=&quot;http://tinyspeck.com&quot; target=&quot;_blank&quot;&gt;Tiny Speck&amp;#8217;s&lt;/a&gt; &lt;a href=&quot;http://glitch.com&quot;&gt;Glitch&lt;/a&gt; released a perfect &amp;amp; &lt;a href=&quot;http://www.youtube.com/watch?v=G7hrMjSpDdQ&amp;amp;feature=player_embedded&quot;&gt;highly fun video&lt;/a&gt; about this very thingĀ  (via &lt;a href=&quot;http://twitter.com/playglitch&quot;&gt;@playglitch&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Inspiredology launches a &lt;a href=&quot;http://inspiredology.com/&quot; target=&quot;_blank&quot;&gt;fun redesign&lt;/a&gt; (anticipate some mad scientist quirk!)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;This might be the best read you read this week.&lt;/em&gt;&lt;a href=&quot;http://jasonsantamaria.com/articles/a-real-web-design-application&quot; target=&quot;_blank&quot;&gt; &amp;#8220;A Real Web Design Application&amp;#8221; &lt;/a&gt;(via &lt;a href=&quot;http://twitter.com/jasonsantamaria&quot; target=&quot;_blank&quot;&gt;@jasonsantamaria&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A fun find on &lt;a href=&quot;http://pinterest.com/&quot;&gt;Pinterest,&lt;/a&gt; &lt;a href=&quot;http://pinterest.com/scatterbox/design-inspiration/&quot;&gt;Art &amp;amp; Design &amp;#8211; Type &amp;amp; Love&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;5 creatives of the female variety, all based in Chicago, have united as &lt;a href=&quot;http://twitter.com/Quite_Strong&quot;&gt;@quite_strong&lt;/a&gt; (you&amp;#8217;ll enjoy the quirktastic Twitter background) &amp;amp; indeed they are worth a follow, great things are ahead from this group&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Wildcard: &lt;a href=&quot;http://twitter.com/trentwalton&quot; target=&quot;_blank&quot;&gt;Trent Walton&lt;/a&gt; shared &lt;a href=&quot;http://webkit.org/blog/181/css-masks/&quot; target=&quot;_blank&quot;&gt;a little tip&lt;/a&gt; on how he and &lt;a href=&quot;http://twitter.com/yarcom&quot;&gt;@yarcom &lt;/a&gt;design rounded avatars on &lt;a href=&quot;http://design-swap.com/&quot; target=&quot;_blank&quot;&gt;Design-Swap, &lt;/a&gt;and a bonus? Dan Mall &amp;amp; Brian Hoff have &lt;a href=&quot;http://design-swap.com/2010/07/06/a-day-in-the-life/&quot; target=&quot;_blank&quot;&gt;swapped!&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Please send me links to your projects, so we can help promote you and your work!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Handpicked by,&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Chrissie &lt;a href=&quot;http://twitter.com/tenaciouscb&quot;&gt;@tenaciouscb&lt;/a&gt;&lt;br&gt;
&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;http://thinkvitamin.com/?ak_action=api_record_view&amp;id=6768&amp;type=feed&quot; alt=&quot;&quot;&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?a=O3bLSa2DSK8:AAygkkSzD7U:FMJD1cDTPr0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?d=FMJD1cDTPr0&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Tue, 27 Jul 2010 03:40:30 +0000</pubDate>
	<dc:creator>Chrissie Brodigan</dc:creator>
</item>
<item>
	<title>ajaxian: Canvas Color Cycling</title>
	<guid>http://ajaxian.com/?p=9881</guid>
	<link>http://feedproxy.google.com/~r/ajaxian/~3/hunOZZijfXA/canvas-color-cycling</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.effectgames.com/demos/canvascycle/?sound=0&quot;&gt;&lt;img src=&quot;http://ajaxian.com/wp-content/images/Canvas-Cycle_-True-8-bit-Color-Cycling-with-HTML5.jpg&quot; alt=&quot;&quot; title=&quot;Canvas Cycle_ True 8-bit Color Cycling with HTML5&quot; width=&quot;525&quot; height=&quot;421&quot; class=&quot;alignnone size-full wp-image-9880&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Interest in Canvas, as well as mobile apps, has led to a renaissance of old-school 8-bit graphics. Joe Huckaby of &lt;a href=&quot;http://www.effectgames.com/&quot;&gt;Effect Games&lt;/a&gt; has been playing around with color cycling, leading to some &lt;a href=&quot;http://www.effectgames.com/demos/canvascycle/?sound=0&quot;&gt;stunning effects&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Anyone remember &lt;a href=&quot;http://en.wikipedia.org/wiki/Color_cycling&quot; class=&quot;dx_external_link&quot; target=&quot;_blank&quot;&gt;Color cycling&lt;/a&gt; from the 90s?  This was a technology often used in 8-bit video games of the era, to achieve interesting visual effects by cycling (shifting) the color palette.  Back then video cards could only render 256 colors at a time, so a palette of selected colors was used.  But the programmer could change this palette at will, and all the onscreen colors would instantly change to match.  It was fast, and took virtually no memory.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;There's a neat optimization going on here too: instead of clearing and redrawing the entire scene with each frame, he only updates the pixels that change:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
In order to achieve fast frame rates in the browser, I had to get a little crazy in the engine implementation. Rendering a 640x480 indexed image on a 32-bit RGB canvas means walking through and drawing 307,200 pixels per frame, in JavaScript. That's a very big array to traverse, and some browsers just couldn't keep up. To overcome this, I pre-process the images when they are first loaded, and grab the pixels that reference colors which are animated (i.e. are part of cycling sets in the palette). Those pixel X/Y offsets are stored in a separate, smaller array, and thus only the pixels that change are refreshed onscreen. This optimization trick works so well, that the thing actually runs at a pretty decent speed on my iPhone 3GS and iPad!
&lt;/p&gt;&lt;/blockquote&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=hunOZZijfXA:5VcbFCwGFb8:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=hunOZZijfXA:5VcbFCwGFb8:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=hunOZZijfXA:5VcbFCwGFb8:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?i=hunOZZijfXA:5VcbFCwGFb8:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Tue, 27 Jul 2010 00:21:55 +0000</pubDate>
	<dc:creator>Michael Mahemoff</dc:creator>
</item>
<item>
	<title>Vitamin: Exception Handling in PHP5</title>
	<guid>http://thinkvitamin.com/?p=6654</guid>
	<link>http://thinkvitamin.com/dev/exception-handling-in-php5/</link>
	<description>&lt;div class=&quot;tweetmeme_button&quot;&gt;
			&lt;a href=&quot;http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fdev%2Fexception-handling-in-php5%2F&quot;&gt;&lt;br&gt;
				&lt;img src=&quot;http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fdev%2Fexception-handling-in-php5%2F&amp;amp;source=thinkvitamin&amp;amp;style=normal&amp;amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot;&gt;&lt;br&gt;
			&lt;/a&gt;
		&lt;/div&gt;
&lt;p&gt;This article follows on from my earlier posts, &lt;a href=&quot;http://thinkvitamin.com/dev/getting-started-with-oop-php5/&quot;&gt;introducing OOP in PHP&lt;/a&gt;, taking &lt;a href=&quot;http://thinkvitamin.com/dev/getting-started-with-oop-php5-part-2/&quot;&gt;a closer look at OOP concepts in PHP&lt;/a&gt;, and also covering the various &lt;a href=&quot;http://thinkvitamin.com/dev/9-magic-methods-for-php&quot;&gt;magic methods&lt;/a&gt; on offer in PHP 5.  We&amp;#8217;ll now move on to look at exceptions, which is how PHP 5 handles errors in an object-oriented way.&lt;br&gt;
&lt;span id=&quot;more-6654&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;What are Exceptions?&lt;/h3&gt;
&lt;p&gt;Exceptions are the PHP 5 way of flagging up an unexpected event.  They contain an information message, and can be extended just like any other object.  Exceptions are thrown rather than warnings in newer PHP extensions, although you do still see extensions returning errors.&lt;/p&gt;
&lt;p&gt;When an exception is thrown, we either catch it where it happens, or it causes the code to return to its calling context.  If it isn&amp;#8217;t caught there, it returns again, and so on.  As usual it is easier to explain with examples than words! &lt;/p&gt;
&lt;p&gt;Here is an example in which &lt;tt&gt;DateTimeZone&lt;/tt&gt; objects are created, first with a valid timezone string of &amp;#8216;Europe/Amsterdam&amp;#8217;, then another with an invalid timezone &amp;#8216;nonsense&amp;#8217;:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
4
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;php&quot;&gt;&lt;span&gt;$timezone&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; DateTimeZone&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'Europe/Amsterdam'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;var_dump&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$timezone&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;$timezone2&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; DateTimeZone&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'nonsense'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As the &lt;a href=&quot;http://www.php.net/manual/en/datetimezone.construct.php&quot;&gt;documentation explains&lt;/a&gt;, &lt;tt&gt;DateTimeZone&lt;/tt&gt; throws an exception when called with unexpected data.  This indeed happens if you run the above script, and the exception appears as an error message from PHP, looking something like this:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;php&quot;&gt;Exception&lt;span&gt;:&lt;/span&gt; DateTimeZone&lt;span&gt;::&lt;/span&gt;__construct&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; Unknown or bad timezone &lt;span&gt;&amp;#40;&lt;/span&gt;nonsense&lt;span&gt;&amp;#41;&lt;/span&gt; in &lt;span&gt;/...../&lt;/span&gt;exception1&lt;span&gt;.&lt;/span&gt;php on line &lt;span&gt;6&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We don&amp;#8217;t want our entire application to stop and spit out errors over a nonsense timezone, and working with exceptions means we can do so much more with these situations than we can with errors.  We &amp;#8220;&lt;tt&gt;catch&lt;/tt&gt;&amp;#8221; exceptions and can use the information in the exception itself and in the context of the current scope to decide how best to react.&lt;/p&gt;
&lt;p&gt;This is a great improvement on the previous situation of having a few different error levels and only being able to choose whether to display, log or ignore each level as was the situation before PHP 5.&lt;/p&gt;
&lt;h3&gt;Handling Exceptions&lt;/h3&gt;
&lt;p&gt;We handle exceptions with a try/catch block like this:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
4
5
6
7
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;php&quot;&gt;try &lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;$timezone2&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; DateTimeZone&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'nonsense'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;echo&lt;/span&gt; &lt;span&gt;&quot;time!&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt; catch&lt;span&gt;&amp;#40;&lt;/span&gt;Exception &lt;span&gt;$e&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;echo&lt;/span&gt; &lt;span&gt;&quot;Oops!  Something bad happened!&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;print_r&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$e&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &amp;#8220;&lt;tt&gt;try&lt;/tt&gt;&amp;#8221; bit goes around the code that you would normally write, but which contains operations which can cause an exception.  The &amp;#8220;&lt;tt&gt;catch&lt;/tt&gt;&amp;#8221; bit states what kind of exception to catch, and contains the code to execute if we do catch anything.&lt;/p&gt;
&lt;p&gt;If you ran this script with a valid timezone as the argument to the &lt;tt&gt;DateTimeZone&lt;/tt&gt; constructor, you would see the &amp;#8220;time!&amp;#8221; output and never enter the code inside the &amp;#8220;catch&amp;#8221; block.  However in our example, an exception will be caused and so we jump straight into this block, without echoing &amp;#8220;time!&amp;#8221;.&lt;/p&gt;
&lt;p&gt;This is a fairly key concept &amp;#8211; the code in the try block actually stops and we jump into the catch block and start executing from there.  Any code after the point at which the exception is throw simply isn&amp;#8217;t run.&lt;/p&gt;
&lt;h3&gt;Inside an Exception&lt;/h3&gt;
&lt;p&gt;Exceptions can hold all sorts of information.  If we inspect our Exception thrown by DateTimeZone&amp;#8217;s constructor using &lt;tt&gt;print_r&lt;/tt&gt;, we&amp;#8217;d see something like this:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;php&quot;&gt;Exception Object
&lt;span&gt;&amp;#40;&lt;/span&gt;
    &lt;span&gt;&amp;#91;&lt;/span&gt;message&lt;span&gt;:&lt;/span&gt;protected&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; DateTimeZone&lt;span&gt;::&lt;/span&gt;__construct&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt; Unknown or bad timezone &lt;span&gt;&amp;#40;&lt;/span&gt;nonsense&lt;span&gt;&amp;#41;&lt;/span&gt;
    &lt;span&gt;&amp;#91;&lt;/span&gt;string&lt;span&gt;:&lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;#91;&lt;/span&gt;code&lt;span&gt;:&lt;/span&gt;protected&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;
    &lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;protected&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;/&lt;/span&gt;home&lt;span&gt;/&lt;/span&gt;lorna&lt;span&gt;/&lt;/span&gt;data&lt;span&gt;/&lt;/span&gt;personal&lt;span&gt;/&lt;/span&gt;publish&lt;span&gt;/&lt;/span&gt;thinkvitamin&lt;span&gt;/&lt;/span&gt;exceptions&lt;span&gt;/&lt;/span&gt;exceptions2&lt;span&gt;.&lt;/span&gt;php
    &lt;span&gt;&amp;#91;&lt;/span&gt;line&lt;span&gt;:&lt;/span&gt;protected&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;4&lt;/span&gt;
    &lt;span&gt;&amp;#91;&lt;/span&gt;trace&lt;span&gt;:&lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;Array&lt;/span&gt;
        &lt;span&gt;&amp;#40;&lt;/span&gt;
            &lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;Array&lt;/span&gt;
                &lt;span&gt;&amp;#40;&lt;/span&gt;
                    &lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;/&lt;/span&gt;home&lt;span&gt;/&lt;/span&gt;lorna&lt;span&gt;/&lt;/span&gt;data&lt;span&gt;/&lt;/span&gt;personal&lt;span&gt;/&lt;/span&gt;publish&lt;span&gt;/&lt;/span&gt;thinkvitamin&lt;span&gt;/&lt;/span&gt;exceptions&lt;span&gt;/&lt;/span&gt;exceptions2&lt;span&gt;.&lt;/span&gt;php
                    &lt;span&gt;&amp;#91;&lt;/span&gt;line&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;4&lt;/span&gt;
                    &lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; __construct
                    &lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; DateTimeZone
                    &lt;span&gt;&amp;#91;&lt;/span&gt;type&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;-&amp;gt;&lt;/span&gt;
                    &lt;span&gt;&amp;#91;&lt;/span&gt;args&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;Array&lt;/span&gt;
                        &lt;span&gt;&amp;#40;&lt;/span&gt;
                            &lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; nonsense
                        &lt;span&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
                &lt;span&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
        &lt;span&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
    &lt;span&gt;&amp;#91;&lt;/span&gt;severity&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;2&lt;/span&gt;
&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Walking through the object, there are many useful elements here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;message&lt;/b&gt; This contains a useful and relevant information message&lt;/li&gt;
&lt;li&gt;&lt;b&gt;code&lt;/b&gt; By default this is zero but we can use this to include a numeric error code with our exception&lt;/li&gt;
&lt;li&gt;&lt;b&gt;file&lt;/b&gt; Path to the file where this exception was thrown&lt;/li&gt;
&lt;li&gt;&lt;b&gt;line&lt;/b&gt; Line number where the exception was thrown&lt;/li&gt;
&lt;li&gt;&lt;b&gt;trace &lt;/b&gt;This is the stack trace, so you can see the stack of calls which were made before this exception was thrown&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is all valuable information and we can use it to inform how we handle errors in the catch block in our code.  In addition we&amp;#8217;ll take a look at how we can set these ourselves by making our own exceptions a little later on.&lt;/p&gt;
&lt;h3&gt;Throwing Exceptions&lt;/h3&gt;
&lt;p&gt;It isn&amp;#8217;t only PHP itself that can throw exceptions, we can use exactly the same functionality in our own code.  Here is a really simple example, taken directly from &lt;a href=&quot;http://php.net/manual/en/language.exceptions.php&quot;&gt;the PHP manual&lt;/a&gt; itself, of how to throw an exception manually.&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
4
5
6
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;php&quot;&gt;&lt;span&gt;function&lt;/span&gt; inverse&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$x&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;$x&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
        throw &lt;span&gt;new&lt;/span&gt; Exception&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'Division by zero.'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;&amp;#125;&lt;/span&gt;
    &lt;span&gt;else&lt;/span&gt; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;1&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;$x&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We simply throw a new &lt;tt&gt;Exception&lt;/tt&gt; object, that we create as we need it.  The string passed into the constructor becomes the object&amp;#8217;s message property, and we can also pass a second argument to the constructor if we want to set the code property as well.&lt;/p&gt;
&lt;p&gt;It is usual to throw exceptions in functions or methods, and then catch them from the location they are called &amp;#8211; this lets the calling code decide what to do in the context of what it intended and is much more flexible than simple errors or having your methods return false and set an error string somewhere, which I&amp;#8217;m sure is how I solved this before exceptions were introduced in PHP 5.&lt;/p&gt;
&lt;h3&gt;Extending Exceptions&lt;/h3&gt;
&lt;p&gt;The Exception object by itself is great, but we can extend it so that we can return additional information and different types of exceptions &amp;#8211; so if one of a number of different scenarios actually happens, we can respond differently.  Consider this script and in particular the &lt;tt&gt;takeTwoNumbers&lt;/tt&gt; function:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;php&quot;&gt;&lt;span&gt;class&lt;/span&gt; BigNumberException &lt;span&gt;extends&lt;/span&gt; Exception &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;
&lt;span&gt;class&lt;/span&gt; FavouriteNumberException &lt;span&gt;extends&lt;/span&gt; Exception &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;function&lt;/span&gt; takeTwoNumbers&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$a&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;$b&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;if&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$a&lt;/span&gt; &lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;15&lt;/span&gt; &lt;span&gt;||&lt;/span&gt; &lt;span&gt;$b&lt;/span&gt; &lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;15&lt;/span&gt; &lt;span&gt;||&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$a&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; &lt;span&gt;$b&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;20&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
        throw &lt;span&gt;new&lt;/span&gt; BigNumberException&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'Keep it simple with smaller numbers'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;&amp;#125;&lt;/span&gt; &lt;span&gt;elseif&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$a&lt;/span&gt; &lt;span&gt;!=&lt;/span&gt; &lt;span&gt;3&lt;/span&gt; &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span&gt;$b&lt;/span&gt; &lt;span&gt;!=&lt;/span&gt; &lt;span&gt;3&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
        throw &lt;span&gt;new&lt;/span&gt; FavouriteNumberException&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'But three is my favourite number!'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;&amp;#125;&lt;/span&gt; &lt;span&gt;else&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
        &lt;span&gt;return&lt;/span&gt; &lt;span&gt;$a&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; &lt;span&gt;$b&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;&amp;#125;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
try &lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;echo&lt;/span&gt; takeTwoNumbers&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;9&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;.&lt;/span&gt; &lt;span&gt;&quot;&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;echo&lt;/span&gt; takeTwoNumbers&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;16&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;.&lt;/span&gt; &lt;span&gt;&quot;&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;echo&lt;/span&gt; takeTwoNumbers&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;.&lt;/span&gt; &lt;span&gt;&quot;&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt; catch&lt;span&gt;&amp;#40;&lt;/span&gt;Exception &lt;span&gt;$e&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;echo&lt;/span&gt; &lt;span&gt;$e&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getMessage&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;.&lt;/span&gt; &lt;span&gt;&quot;&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The function accepts two numbers, checks the values, and if there are any problems, throws a relevant exception.  If the values are OK (and yes, this is a totally contrived example, in an effort to illustrate the concept without any complicating factors like the real world getting involved!) then the function simply adds them together and returns them.&lt;/p&gt;
&lt;p&gt;Our calling script calls the function 3 times, with different number sets.  The first one executes fine and the numbers get added together.  However the second includes a large number and so an error is thrown, causing our code to jump to the &amp;#8220;&lt;tt&gt;catch&lt;/tt&gt;&amp;#8221; block, and so the third function call is never made.&lt;/p&gt;
&lt;p&gt;Although we declared empty classes to extend &lt;tt&gt;Exception&lt;/tt&gt; here and so only the class name changed, you can do all sorts of things to help record the information you need.  We would set custom error messages here (remember the helpful error message returned by &lt;tt&gt;DateTimeZone&lt;/tt&gt;?), set error codes, or even set new properties of our own.&lt;/p&gt;
&lt;p&gt;It depends on your application which of these is helpful but having the custom exception classes makes it very nice and tidy to do so.  The differing class names let us detect what *kind* of a problem occured and what we want to do in response.  When we catch an exception, we can state what kind of an exception we wanted to catch &amp;#8211; so we can narrow ourselves down to only dealing with a known situation.  We can also use multiple catch blocks, like this:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
9
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;php&quot;&gt;try &lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;echo&lt;/span&gt; takeTwoNumbers&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;9&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;.&lt;/span&gt; &lt;span&gt;&quot;&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;echo&lt;/span&gt; takeTwoNumbers&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;16&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;.&lt;/span&gt; &lt;span&gt;&quot;&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;echo&lt;/span&gt; takeTwoNumbers&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;.&lt;/span&gt; &lt;span&gt;&quot;&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt; catch&lt;span&gt;&amp;#40;&lt;/span&gt;BigNumberException &lt;span&gt;$e&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;echo&lt;/span&gt; &lt;span&gt;&quot;Big Number: &quot;&lt;/span&gt; &lt;span&gt;.&lt;/span&gt; &lt;span&gt;$e&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getMessage&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;.&lt;/span&gt; &lt;span&gt;&quot;&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt; catch&lt;span&gt;&amp;#40;&lt;/span&gt;FavouriteNumberException &lt;span&gt;$e&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;echo&lt;/span&gt; &lt;span&gt;&quot;Favourite Number: &quot;&lt;/span&gt; &lt;span&gt;.&lt;/span&gt; &lt;span&gt;$e&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getMessage&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;.&lt;/span&gt; &lt;span&gt;&quot;&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In this example, we can handle the two types of exception differently.  If any other type of exception were to occur, it wouldn&amp;#8217;t be caught here, but instead would &amp;#8220;bubble&amp;#8221; up the stack, getting returned from the end of the second catch block to wherever this code was called from &amp;#8211; in this very simple example we are in a simple PHP file but if we were nested in functions, the code would keep on returning until PHP caught the exception, or until it reached the top at which point it would show an error like the one we saw at the start of this post.&lt;/p&gt;
&lt;h3&gt;Uncaught Exceptions&lt;/h3&gt;
&lt;p&gt;So if an exception is thrown in a method, and not caught, it returns from the function to where that function is called from.  If it isn&amp;#8217;t caught here, it returns to where this code was called from, and so on until it reaches the top of the stack.  If it gets to the top of the stack, uncaught, we&amp;#8217;ll see the error we saw at the beginning of the post. &lt;/p&gt;
&lt;p&gt;We can also give PHP instructions about how to handle any exceptions that get this far, using &lt;a href=&quot;http://www.php.net/manual/en/function.set-exception-handler.php&quot;&gt;&lt;tt&gt;set_exception_handler&lt;/tt&gt;&lt;/a&gt;.  Many frameworks will do this and return nicely formatted messages, often logging the detail of the error so that users do not see it but developers can do so.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s an example of a catch-all exception handling function:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
4
5
6
7
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;php&quot;&gt;&lt;span&gt;function&lt;/span&gt; my_exception_handler&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$exception&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
  &lt;span&gt;error_log&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&quot;Uncaught &quot;&lt;/span&gt; &lt;span&gt;.&lt;/span&gt; &lt;span&gt;get_class&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$exception&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;.&lt;/span&gt; &lt;span&gt;&quot; exception: &quot;&lt;/span&gt; &lt;span&gt;.&lt;/span&gt; &lt;span&gt;$exception&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getMessage&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;.&lt;/span&gt; &lt;span&gt;&quot;&lt;span&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
set_exception_handler&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'my_exception_handler'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
throw &lt;span&gt;new&lt;/span&gt; Exception&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'Oooops!'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All we need to do is declare our exception handling function and then tell PHP to use it for uncaught exceptions.  This simple example simply passes a string to &lt;a href=&quot;http://www.php.net/manual/en/function.error-log.php&quot;&gt;&lt;tt&gt;error_log&lt;/tt&gt;&lt;/a&gt; function, which you can configure to behave however you need it to for your system.  In a real-world application you might want to notify administrators of the problem or perhaps provide some nice feedback to the user in addition to logging the error.&lt;/p&gt;
&lt;h3&gt;Exceptions in Your Applications&lt;/h3&gt;
&lt;p&gt;Hopefully this has given some insight into what you can do with exceptions and how they interact with the rest of your object-oriented application.  Even functional code needs awareness of exceptions since some core language elements now throw them, so it is worth making sure you have the exception handler declared alongside your existing error handler even if you don&amp;#8217;t need to be extending or throwing exceptions yourself.  &lt;/p&gt;
&lt;p&gt;Are you extending the Exception class?  What do you use this for?  I&amp;#8217;m really interested to hear about the various applications of this theory so let me know in the comments!&lt;/p&gt;
&lt;img src=&quot;http://thinkvitamin.com/?ak_action=api_record_view&amp;id=6654&amp;type=feed&quot; alt=&quot;&quot;&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?a=lOeCwfBFGn0:rrmv_iQIPR4:FMJD1cDTPr0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?d=FMJD1cDTPr0&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Mon, 26 Jul 2010 13:00:30 +0000</pubDate>
	<dc:creator>Lorna Jane Mitchell</dc:creator>
</item>
<item>
	<title>QuirksMode: New kid on the browser block: Samsung Dolfin</title>
	<guid>http://www.quirksmode.org/blog/archives/2010/07/new_kid_on_the.html</guid>
	<link>http://www.quirksmode.org/blog/archives/2010/07/new_kid_on_the.html</link>
	<description>&lt;p&gt;Back in early June I got a Samsung Wave that runs the brand-new bada OS and did some &lt;a href=&quot;http://www.quirksmode.org/blog/archives/2010/06/ultraquick_sams.html&quot;&gt;brief tests&lt;/a&gt; of the native Dolfin browser. In the past few days I&amp;#8217;ve done some more extensive testing, and the verdict is in: good browser, well on the way to becoming excellent.&lt;/p&gt;

&lt;p class=&quot;smaller&quot;&gt;(Oh, and Dolfin ought not to be confused with Dol&lt;em&gt;ph&lt;/em&gt;in, which is a skin for Android WebKit.)&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s Samsung&amp;#8217;s philosophy that it will not compete in a market unless it belongs to the top three of that market. In the case of the mobile browsing market Samsung has succeeded: from nothing, Dolfin has become the third-best mobile browser in the world. Only iPhone and Android are better.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re keeping track of the mobile browser landscape you should add Dolfin to your A-list. It&amp;#8217;s easily good enough, and Samsung has big plans with the bada operating system.  Somewhere in 2011 the installed base of Dolfin will pass that of Safari iPhone, and bada might even become a competitor to Android. (Samsung sure hopes so.)&lt;/p&gt;

&lt;p&gt;I have updated my &lt;a href=&quot;http://www.quirksmode.org/mobile/&quot;&gt;mobile pages&lt;/a&gt; with Dolfin data. &lt;span class=&quot;smaller&quot;&gt;(By the way, I also tested Android 2.2 while I was at it: few changes. There&amp;#8217;s not a single difference with 2.1 in my &lt;a href=&quot;http://www.quirksmode.org/webkit.html&quot;&gt;great WebKit
table&lt;/a&gt;.)&lt;/span&gt;&lt;/p&gt;

&lt;h3&gt;The good parts&lt;/h3&gt;

&lt;p&gt;Dolfin is only the third browser in the world to support the touch events, after iPhone and Android, and that&amp;#8217;s a large part of the reason I count it as the third-best mobile browser.&lt;/p&gt;

&lt;p&gt;Mobile browsers for touchscreen phones just &lt;em&gt;must&lt;/em&gt; support these events by the end of the year, or they&amp;#8217;re out of the race. (Opera, Firefox, Microsoft, NetFront, Nokia, BlackBerry,  you have been warned.)&lt;/p&gt;

&lt;p&gt;Dolfin&amp;#8217;s implementation is even slightly better than Android&amp;#8217;s. If I do a pinch-zoom test on my &lt;a href=&quot;http://www.quirksmode.org/m/tests/touch.html&quot;&gt;touch test page&lt;/a&gt; I use two fingers, and during replay I want the browser to show the position of both fingers. iPhone does so, Android doesn&amp;#8217;t. Now Dolfin also shows both fingers&amp;#8217; position.&lt;/p&gt;

&lt;p&gt;Unfortunately Dolfin is not quite up to iPhone quality: my &lt;a href=&quot;http://www.quirksmode.org/m/tests/drag2.html&quot;&gt;multitouch drag-and-drop&lt;/a&gt; does not work. Still, the stuff it does support is quite impressive for a browser that didn&amp;#8217;t exist at the start of this year.&lt;/p&gt;

&lt;p&gt;Dolfin&amp;#8217;s responsiveness to pinch-zooming is good. One friend who&amp;#8217;s used to the iPhone even said it&amp;#8217;s better than Apple&amp;#8217;s implementation. I&amp;#8217;m not quite prepared to go that far yet, but it easily gives Android a run for its money.&lt;/p&gt;

&lt;p&gt;Dolfin incorporates a very modern WebKit version, and in my &lt;a href=&quot;http://www.quirksmode.org/webkit.html&quot;&gt;great WebKit
table&lt;/a&gt; it is the best mobile browser, narrowly above Android 2.1/2.2 and comfortably above the iPhone 3.1 (4 not yet tested).&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m currently working on a little side project: the perfect scrolling layer script for touchscreens. Obviously it should work in all three browsers that support the touch events. Of the three Android gives me the biggest problems right now, with Dolfin smoothly sailing along in the wake of the iPhone without any serious problems.&lt;/p&gt;

&lt;p&gt;Dolfin is just a bloody good browser.&lt;/p&gt;

&lt;h3&gt;The buggy parts&lt;/h3&gt;

&lt;p&gt;Still, not all is rosy. I found a few bugs in Dolfin, and I&amp;#8217;ll enumerate them here for the benefit of the Samsung team:&lt;/p&gt;


&lt;ul&gt;
	&lt;li&gt;The &lt;a href=&quot;http://www.quirksmode.org/mobile/tableViewport.html&quot;&gt;viewport dimension properties&lt;/a&gt; are an absolute mess. Not only do they generally give wrong data, but a few of them &lt;em&gt;change meaning&lt;/em&gt; when a &lt;code&gt;&amp;lt;meta viewport&amp;gt;&lt;/code&gt; is present in the page. This &lt;em&gt;must&lt;/em&gt; be addressed as soon as possible; it&amp;#8217;s a show-stopper.&lt;/li&gt;
	&lt;li&gt;There&amp;#8217;s a bug in the touchstart event. When you assign an event handler to it and 	execute it once, the event handler is removed. See &lt;a href=&quot;http://www.quirksmode.org/m/tests/dragSamsung.html&quot;&gt;this test page&lt;/a&gt; for the effect. Works fine on iPhone and Android, but fails in Dolfin the second time you want to drag the item.&lt;br&gt;
	The workaround, obviously, is setting the touchstart event handler again ontouchend. That
	&lt;a href=&quot;http://www.quirksmode.org/m/tests/drag.html&quot;&gt;works fine&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;Dolfin is over-eager in firing the scroll and contextmenu events. Basically they always fire, even if an action does not result in a scroll or a contextmenu. (In fact, I haven&amp;#8217;t yet discovered any contextmenu on Dolfin.)&lt;br&gt;
	These events should only fire if the scroll or contextmenu action actually take place.&lt;/li&gt;
	&lt;li&gt;The event coordinates are wrong: &lt;code&gt;clientX/Y&lt;/code&gt; and &lt;code&gt;screenX/Y&lt;/code&gt; copy the values of &lt;code&gt;pageX/Y&lt;/code&gt;, while they should report the coordinates relative to the visual viewport in CSS pixels and in device pixels, respectively.&lt;/li&gt;
	&lt;li&gt;A personal peeve: on the browser software keyboard the &amp;#8220;Go&amp;#8221; button is located on the left. A standard is emerging whereby it&amp;#8217;s the &lt;em&gt;right&lt;/em&gt; button that says &amp;#8220;OK, do it,&amp;#8221; while the left button says &amp;#8220;Never mind.&amp;#8221; I got confused by Samsung&amp;#8217;s button placement more than once.&lt;/li&gt;
	&lt;li&gt;Samsung bada is supposed to support W3C Widgets, but there is no way for developers to upload test widgets to the phone. In practice that means nobody will test on Samsung bada. This situation &lt;em&gt;must&lt;/em&gt; be rectified.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still, such bugs are only to be expected from a first release. In general Samsung has delivered a good browser that&amp;#8217;s only a few small steps away from becoming excellent. I will follow Samsung&amp;#8217;s next moves with interest.&lt;/p&gt;</description>
	<pubDate>Mon, 26 Jul 2010 12:25:36 +0000</pubDate>
</item>
<item>
	<title>ajaxian: Looking at JS emulator core for GameBoy</title>
	<guid>http://ajaxian.com/?p=9875</guid>
	<link>http://feedproxy.google.com/~r/ajaxian/~3/Fgnm6axN_FA/looking-at-js-emulator-core-for-gameboy</link>
	<description>&lt;p&gt;JavaScript as a general-purpose &quot;Turing-complete language&quot; is illustrated - the example discussed in the first part of a series:Ā  How a CPU can be emulated through JS, and how one might start building an emulation core for the GameBoy console. Looking forward: Ā How a game image can be loaded into the emulator over the Web. For now: Hello, Z80! &lt;a href=&quot;http://imrannazar.com/GameBoy-Emulation-in-JavaScript:-The-CPU&quot;&gt;Check out Ice Station ImRannazar!&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=Fgnm6axN_FA:m6WrdHMfKVI:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=Fgnm6axN_FA:m6WrdHMfKVI:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=Fgnm6axN_FA:m6WrdHMfKVI:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?i=Fgnm6axN_FA:m6WrdHMfKVI:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Sun, 25 Jul 2010 03:29:06 +0000</pubDate>
	<dc:creator>jvaughan</dc:creator>
</item>
<item>
	<title>Vitamin: Around the Web: Forrst's App Contest, inForums, Cow Clicker</title>
	<guid>http://thinkvitamin.com/?p=6724</guid>
	<link>http://thinkvitamin.com/business/around-the-web-forrsts-app-contest-inforums-cow-clicker/</link>
	<description>&lt;div class=&quot;tweetmeme_button&quot;&gt;
			&lt;a href=&quot;http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fbusiness%2Faround-the-web-forrsts-app-contest-inforums-cow-clicker%2F&quot;&gt;&lt;br&gt;
				&lt;img src=&quot;http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fbusiness%2Faround-the-web-forrsts-app-contest-inforums-cow-clicker%2F&amp;amp;source=thinkvitamin&amp;amp;style=normal&amp;amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot;&gt;&lt;br&gt;
			&lt;/a&gt;
		&lt;/div&gt;
&lt;p&gt;Hey there!&lt;/p&gt;
&lt;p&gt;It's very late on Friday night!(woo-hoo!), so this roundup is  devoted to all things     &amp;#8220;awesome.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Some links are newsworthy, some retweeted across Twitter, and others        just meet our &quot;awesomeness&quot;¯   requirement, and regardless we hope       you'll  enjoy them. Without further   delay:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Design Informer&amp;#8217;s Jad Limcaco releases &lt;a href=&quot;http://designinformer.com/forums/&quot; target=&quot;_blank&quot;&gt;inForums&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://apps.facebook.com/cowclicker/&quot;&gt;Cow Clicker&lt;/a&gt; is a Facebook game about Facebook games. It&amp;#8217;s partly a satire, and partly a playable theory of today&amp;#8217;s social games, and partly an earnest example of that genre. (via Ian Bogost)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://sixrevisions.com/web_design/a-guide-on-layout-types-in-web-design/&quot; target=&quot;_blank&quot;&gt;Guide to layouts in web design&lt;/a&gt; (via Six Revisions)&lt;/li&gt;
&lt;li&gt;Forrst users self-organize an &lt;a href=&quot;http://forrstappcontest.com/&quot; target=&quot;_blank&quot;&gt;app contest &lt;/a&gt;(it&amp;#8217;s awesome, well-designed, &amp;amp; expect some insider info)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wheresitup.com/&quot; target=&quot;_blank&quot;&gt;Where&amp;#8217;s it Up&lt;/a&gt; is a site that tells you where in the world any site is up (via &lt;a href=&quot;http://blog.preinheimer.com/index.php?/archives/359-Wheres-it-Up.html&quot; target=&quot;_blank&quot;&gt;Paul Reinheimer&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Wildcard: &lt;/em&gt;&lt;a href=&quot;http://michaelbox.net/2010/07/19/handwritten-tweets-express-more/&quot; target=&quot;_blank&quot;&gt;Handwritten Tweets Express More&lt;/a&gt; (via Michael Beckwith &amp;amp; discovered via &lt;a href=&quot;http://postscript5.co.uk/&quot; target=&quot;_blank&quot;&gt;Grace Smith&amp;#8217;s&lt;/a&gt; fabulous &lt;a href=&quot;http://twitter.com/gracesmith&quot; target=&quot;_blank&quot;&gt;Twitter stream&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Please shoot me links to projects your working on or awesome things      you&amp;#8217;ve released! &lt;a href=&quot;mailto:news@thinkvitamin.com&quot;&gt;news@thinkvitamin.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Handpicked by,&lt;/p&gt;
&lt;p&gt;Chrissie (&lt;a href=&quot;http://twitter.com/tenaciouscb&quot; target=&quot;_blank&quot;&gt;@tenaciouscb&lt;/a&gt;)&lt;/p&gt;
&lt;img src=&quot;http://thinkvitamin.com/?ak_action=api_record_view&amp;id=6724&amp;type=feed&quot; alt=&quot;&quot;&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?a=5CpegjHEZa0:3gsCj1LFvvE:FMJD1cDTPr0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?d=FMJD1cDTPr0&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Sat, 24 Jul 2010 03:37:15 +0000</pubDate>
	<dc:creator>Chrissie Brodigan</dc:creator>
</item>
<item>
	<title>Vitamin: CSS3 Transitions Part 1 [Video Tutorial]</title>
	<guid>http://thinkvitamin.com/?p=6716</guid>
	<link>http://thinkvitamin.com/design/css3-transitions-part-1-video-tutorial/</link>
	<description>&lt;div class=&quot;tweetmeme_button&quot;&gt;
			&lt;a href=&quot;http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fdesign%2Fcss3-transitions-part-1-video-tutorial%2F&quot;&gt;&lt;br&gt;
				&lt;img src=&quot;http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fdesign%2Fcss3-transitions-part-1-video-tutorial%2F&amp;amp;source=thinkvitamin&amp;amp;style=normal&amp;amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot;&gt;&lt;br&gt;
			&lt;/a&gt;
		&lt;/div&gt;
&lt;p&gt;It&amp;#8217;s Friday and time for our second free weekly helping from the &lt;a href=&quot;http://membership.thinkvitamin.com/&quot;&gt;Think Vitamin Membership&lt;/a&gt; video library. Today we move our attention to &lt;a href=&quot;http://membership.thinkvitamin.com/library/css3/animation/transitions-part-1&quot;&gt;CSS3 Transitions&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Don&amp;#8217;t forget 2 new videos are added to the library every day, to find out more about Think Vitamin membership videos and all the other benefits &lt;a href=&quot;http://membership.thinkvitamin.com/pages/plans&quot;&gt;check out the site&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;http://thinkvitamin.com/?ak_action=api_record_view&amp;id=6716&amp;type=feed&quot; alt=&quot;&quot;&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?a=NzABDJCtBbo:oqmOvhAz1FY:FMJD1cDTPr0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?d=FMJD1cDTPr0&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Fri, 23 Jul 2010 10:30:59 +0000</pubDate>
	<dc:creator>Keir Whitaker</dc:creator>
</item>
<item>
	<title>Vitamin: The 7 Sins of Managing Web Projects</title>
	<guid>http://thinkvitamin.com/?p=6671</guid>
	<link>http://thinkvitamin.com/business/the-7-sins-of-managing-web-projects/</link>
	<description>&lt;div class=&quot;tweetmeme_button&quot;&gt;
			&lt;a href=&quot;http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fbusiness%2Fthe-7-sins-of-managing-web-projects%2F&quot;&gt;&lt;br&gt;
				&lt;img src=&quot;http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fbusiness%2Fthe-7-sins-of-managing-web-projects%2F&amp;amp;source=thinkvitamin&amp;amp;style=normal&amp;amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot;&gt;&lt;br&gt;
			&lt;/a&gt;
		&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;http://thinkvitamin.com/wp-content/uploads/2010/07/7sins.jpg&quot; alt=&quot;&quot; title=&quot;7sins&quot; width=&quot;470&quot; class=&quot;aligncenter size-full wp-image-6744&quot;&gt;&lt;/p&gt;
&lt;p&gt;Managing web projects is both tough and satisfying in equal measures. Every project is a new learning curve and even though I'm educated from every project I work on, new problems are presented to me on a daily basis.&lt;/p&gt;
&lt;p&gt;Some problems and challenges on the other hand, rear their head time after time, and I have classified these in line with the 7 deadly sins, renaming them of course as the 7 sins of managing web projects.&lt;/p&gt;
&lt;h3&gt;Pride&lt;/h3&gt;
&lt;p&gt;As a Project Manager it is easy, too easy, to blame clients or members of the project team when things go wrong. You should never be too proud to admit when mistakes have been made and as manager of that project you should take ownership of trying to resolve the issue.&lt;/p&gt;
&lt;p&gt;At some stage in the project you will almost always have to compromise on something or face an issue that wasn't planned for. It is far more productive to focus on the solution, so identify the problem, agree the course of action to getting it resolved and get things back on track.&lt;/p&gt;
&lt;h3&gt;Envy&lt;/h3&gt;
&lt;p&gt;Depending on the process you adopt on your projects, chances are you will indulge in some sort of competitor research. Upon doing so we can learn what works and what doesn't for others.&lt;/p&gt;
&lt;p&gt;It is unlikely that you will find a site that answers your client's brief down to the last pixel but with trends emerging seemingly overnight and with work being shared more freely through sites like &lt;a href=&quot;http://dribbble.com&quot;&gt;Dribbble&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/&quot;&gt;Twitter&lt;/a&gt; and others, there is probably a site out there that you like, that you really like.&lt;/p&gt;
&lt;p&gt;It is easy to be jealous of other sites and want to incorporate bits of them in your own. That's fine of course as we can all be inspired by others but don't let envy stomp all over your creativity. Ensure your website is not a tapestry of others. Be original, make sure you answer your client's brief and consider their audience throughout the project. Be inspired by others but don't copy them.&lt;/p&gt;
&lt;h3&gt;Gluttony&lt;/h3&gt;
&lt;p&gt;Clients are demanding, naturally they want as much as they can for as little money as possible. Who wouldn't?&lt;/p&gt;
&lt;p&gt;This is where we have to &lt;a href=&quot;http://thinkvitamin.com/design/just-say-no-to-clients/&quot;&gt;say no&lt;/a&gt; though. Don't try to cram everything into phase 1. Be realistic about what is achievable based on the allocated budget and timescales. Agree on the core tasks, essential pages and functionality that have to be incorporated for initial launch.&lt;/p&gt;
&lt;p&gt;Anything else can be achieved during retainers or additional phases. Trying to incorporate a little of everything will mean you are spread too thinly. Nobody wants to be a jack of all trades and nor should your client's website be.&lt;/p&gt;
&lt;h3&gt;Lust&lt;/h3&gt;
&lt;p&gt;It is important to love what you do; being passionate will motivate the project team, fuel creativity and ensure that even the most wearing of projects will reach the finish line. The key though is not to get too involved. Doing so can cloud your judgement when it comes to making those tough project related decisions.&lt;/p&gt;
&lt;p&gt;Take a step back and be impartial. Does your work answer the brief? Refer back to the signed off project scoping/briefing document to check this before proceeding. Immerse yourself in your client's world and in the project but not at the expense of bumbling along answering yes to everything.&lt;/p&gt;
&lt;h3&gt;Anger&lt;/h3&gt;
&lt;p&gt;It is easier said than done at times but don&amp;#8217;t lose your cool when client demands reach fever pitch or things aren't going right. I don't think I've ever worked on a project where I wasn't pushed to my limits at some point. This is good though, being challenged helps us learn, quickly.&lt;/p&gt;
&lt;p&gt;Instead of getting wound up though, focus your energy on trying to plan as much as possible at the start of the project and adopt standard risk assessment processes into your planning phase such as SWOT analysis (strengths, weaknesses, opportunities, threats).&lt;/p&gt;
&lt;h3&gt;Greed&lt;/h3&gt;
&lt;p&gt;Delegation is one of qualities of a good Project Manager. It isn't to be confused with passing the buck, rather delegating tasks across the team so people are used to their strengths. Don&amp;#8217;t try to handle everything yourself, it will only end in tears, big over budget, behind schedule tears!&lt;/p&gt;
&lt;p&gt;The role of the Project Manager is to ensure things get done, to budget and on schedule so there is no time to be greedy. Project work is all about communication and collaboration. Share the work and the glory (and the problems).&lt;/p&gt;
&lt;h3&gt;Sloth&lt;/h3&gt;
&lt;p&gt;Continuing from the last point above, don&amp;#8217;t let members of the project team drag their feet. As Project Manager you will need to keep them motivated and involved throughout the project. Be firm with the project team, set clear tasks, deliverables, responsibilities and deadlines.&lt;/p&gt;
&lt;p&gt;Report back throughout the project so the team know what has been achieved, feedback from the client is communicated and any changes in deliverables is understood. The minute anyone in the team feels uninvolved in the project is the minute they will lose enthusiasm for it.&lt;/p&gt;
&lt;p&gt;Communication throughout is paramount to any project being successful and in my experience, never underestimate the power of the simple words, &quot;please' and &quot;thank you'.&quot;Ø&quot;Ø Just seven?&lt;/p&gt;
&lt;p&gt;Are there any sins that I have omitted? If you have your own please share them in the comments below.&lt;/p&gt;
&lt;img src=&quot;http://thinkvitamin.com/?ak_action=api_record_view&amp;id=6671&amp;type=feed&quot; alt=&quot;&quot;&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?a=fHtoxKhJ10o:F7S1hxkcbZE:FMJD1cDTPr0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?d=FMJD1cDTPr0&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Fri, 23 Jul 2010 10:30:25 +0000</pubDate>
	<dc:creator>Rob Mills</dc:creator>
</item>
<item>
	<title>ajaxian: Dojo 1.5 is Out and it's Feature Packed!</title>
	<guid>http://ajaxian.com/?p=9851</guid>
	<link>http://feedproxy.google.com/~r/ajaxian/~3/8e2PPSSbB2w/dojo-1-5-is-out-and-its-feature-packed</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://dojotoolkit.org/&quot;&gt;&lt;img src=&quot;http://ajaxian.com/wp-content/images/Dojo-1.5.png&quot; alt=&quot;&quot; title=&quot;Dojo 1.5&quot; width=&quot;150&quot; height=&quot;134&quot; class=&quot;alignright size-full wp-image-9855&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://dojotoolkit.org/&quot;&gt;The Dojo project&lt;/a&gt; continues to pump out goodness &lt;a href=&quot;http://www.sitepen.com/blog/2010/07/22/dojo-1-5-ready-to-power-your-web-app/&quot;&gt;announcing version 1.5 of the Dojo Toolkit&lt;/a&gt; with a number of new and exciting features. &lt;/p&gt;
&lt;p&gt;Dylan Schiemann had this to say about the release:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The JavaScript world is evolving at an intense pace. We're very pleased with this release of Dojo, which offers the stability needed for existing apps and browsers, while introducing some of the capabilities of building great apps of the future.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Some of the biggest updates came to the Dijit UI library with the addition of the &lt;a href=&quot;http://download.dojotoolkit.org/release-1.5.0/dojo-release-1.5.0/dijit/themes/themeTester.html&quot;&gt;new Claro theme&lt;/a&gt; which helps provide a nice desktop look-and-feel to web applications as well as improvements to the charting and drawing components of the library.&lt;/p&gt;
&lt;p&gt;And Dojo team lead Pete Higgins added:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;If you haven't seen the new theme Claro, you should. Julie Santilli and her awesome design team at IBM put some incredible design and style on top of an already stable and accessible UI library&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The &lt;a href=&quot;http://download.dojotoolkit.org/release-1.5.0/dojo-release-1.5.0/dijit/themes/themeTester.html&quot;&gt;theme is incredibly clean&lt;/a&gt;. Check out some of the controls styled using Claro:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://ajaxian.com/wp-content/images/tree.png&quot;&gt;&lt;img src=&quot;http://ajaxian.com/wp-content/images/tree.png&quot; alt=&quot;&quot; title=&quot;tree&quot; width=&quot;300&quot; height=&quot;434&quot; class=&quot;alignleft size-full wp-image-9860&quot;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://ajaxian.com/wp-content/images/sliders.png&quot;&gt;&lt;img src=&quot;http://ajaxian.com/wp-content/images/sliders.png&quot; alt=&quot;&quot; title=&quot;sliders&quot; width=&quot;421&quot; height=&quot;186&quot; class=&quot;alignleft size-full wp-image-9861&quot;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://ajaxian.com/wp-content/images/buttons.png&quot;&gt;&lt;img src=&quot;http://ajaxian.com/wp-content/images/buttons.png&quot; alt=&quot;&quot; title=&quot;buttons&quot; width=&quot;439&quot; height=&quot;87&quot; class=&quot;alignleft size-full wp-image-9862&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br clear=&quot;both&quot;&gt;&lt;/p&gt;
&lt;p&gt;Other important updates include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Strong support for HTML5 &amp;#038; CSS3 features such as local storage, transforms and Canvas with fallback&lt;/li&gt;
&lt;li&gt;Implementation of &lt;a href=&quot;http://doughays.dojotoolkit.org/ImageResizeDemo/&quot;&gt;dojo.Stateful&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Update to dojo.Deferred to leverage a new &lt;a href=&quot;http://www.sitepen.com/blog/2010/05/03/robust-promises-with-dojo-deferred-1-5/&quot;&gt;underlying Promises-based API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, new initiatives are underway to provide solutions for the ever-growing and important mobile space: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://archive.dojotoolkit.org/nightly/dojotoolkit/dojox/mobile/&quot;&gt;dojox.mobile&lt;/a&gt;: lightweight mobile web widgets&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://shaneosullivan.wordpress.com/2010/06/13/dojos-new-mobile-app-project/&quot;&gt;dojox.mobile.app&lt;/a&gt;: mobile application development framework&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/uxebu/embedjs&quot;&gt;embedjs&lt;/a&gt;: Dojo API, optimized for mobile&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://uxebu.com/blog/2010/04/27/touchscroll-a-scrolling-layer-for-webkit-mobile/&quot;&gt;TouchScroll&lt;/a&gt;: scrolling layer for WebKit Mobile&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://winktoolkit.org/&quot;&gt;wink&lt;/a&gt;: mobile web app toolkit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This release continues the project's philosophy of modularity allowing developers to leverage the library for anything from simple DOM manipulation to full-blown RIA development. &lt;a href=&quot;http://dojotoolkit.org/download/&quot;&gt;Dojo 1.5 is immediately available for download&lt;/a&gt; and sports impressive, updated &lt;a href=&quot;http://dojotoolkit.org/documentation/&quot;&gt;documentation&lt;/a&gt; to get you started quickly.&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=8e2PPSSbB2w:zqPr-xEk1DA:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=8e2PPSSbB2w:zqPr-xEk1DA:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=8e2PPSSbB2w:zqPr-xEk1DA:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?i=8e2PPSSbB2w:zqPr-xEk1DA:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Thu, 22 Jul 2010 18:06:14 +0000</pubDate>
	<dc:creator>Rey Bango</dc:creator>
</item>
<item>
	<title>QuirksMode: Antennagate and Apple&amp;#8217;s hubris</title>
	<guid>http://www.quirksmode.org/blog/archives/2010/07/antennagate_and.html</guid>
	<link>http://www.quirksmode.org/blog/archives/2010/07/antennagate_and.html</link>
	<description>&lt;p&gt;Apple continues to startle me, and I do not mean by its iPhone 4. (I haven&amp;#8217;t yet seen it, so I can&amp;#8217;t say anything useful about it.) No, what I mean is the ongoing Antennagate problems, and even there I do not mean the actual problem, but Apple&amp;#8217;s way of dealing with it.  And even there I do not mean Antennagate as an isolated PR incident, but as yet another chapter in how Apple spends 2010 to piss off the world at large.&lt;/p&gt;

&lt;h3&gt;Antennagate&lt;/h3&gt;

&lt;p&gt;The problem with Antennagate is not the actual technical issue itself. That issue may or may not be severe, may or may not occur on other phones, and is probably solved adequately by the covers Apple is now giving away. Frankly I don&amp;#8217;t care about the details.&lt;/p&gt;

&lt;p&gt;No, the problem is in how Apple handled the entire affair. Not its acknowledgement of the problem itself, or giving away the covers; those are proper, correct responses to the technical issue.&lt;/p&gt;

&lt;p&gt;John Gruber made an &lt;a href=&quot;http://daringfireball.net/2010/07/antennagate_bottom_line&quot; class=&quot;external&quot;&gt;interesting remark&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It&amp;#8217;s telling that the criticism surrounding this issue has shifted, quickly, from speculation about a technical defect in the iPhone 4 hardware to criticism over the tone of Apple&amp;#8217;s response to it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The hardware defect is only a sideshow, and the way Apple is dealing with it is far more important to the world. Gruber is completely right in pointing this out, yet I believe he draws the wrong conclusions from it.&lt;/p&gt;

&lt;p&gt;PR is crucial for Apple. Good PR has created a legion of Apple fanbois and a chattering class of tech commentators that consistently paints Apple in the best light possible. A serious PR flap is far more dangerous than a technical issue because it can cost Apple the support of the tech commentators (and possibly even the fanboi legion, but that will take more than a mere year full of Fuck Yous).&lt;/p&gt;

&lt;p&gt;Thus I believe that Gruber is right, yet wrong. Weighing Apple&amp;#8217;s tone and response is more important than the technical issue. Antennagate is about PR, and not about the iPhone 4&amp;#8217;s antenna.&lt;/p&gt;

&lt;p&gt;In that light, &lt;a href=&quot;http://communities-dominate.blogs.com/brands/2010/07/the-son-of-death-grip-antennagate-the-sequel-the-iphone-4b-and-the-3-month-loaner-iphone-4a.html&quot; class=&quot;external&quot;&gt;Tomi Ahonen points at&lt;/a&gt; an important mistake Apple made:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why include that unnecessary hostile attack on the rest of the industry? That was a red flag to the rivals, and a clear challenge to the press to go compare. This is a lose-lose for Apple, even if others are implicated too, every time Death Grip is mentioned, Apple is the leading culprit of the news story. Every time the iPhone 4 is reminded to have Death Grip problems! And for every story where rivals are also implicated, there will be stories where at least one of the rivals is not shown as bad, or in the worst case, that Apple's iPhone 4 comes out worst at Death Grip. Apple's news coverage will be bad - or worse.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In other words, exactly &lt;em&gt;because&lt;/em&gt; Steve Jobs wanted to implicate other phones in this problem, Antennagate will come back to haunt him. We can expect a string of press releases from other mobile players, saying something along the lines of &amp;#8220;In contrast to Apple&amp;#8217;s iPhone 4, our flagship product X does not suffer from an antenna problem.&amp;#8221;&lt;/p&gt;

&lt;p&gt;Note that it &lt;em&gt;does not matter&lt;/em&gt; who&amp;#8217;s right here. Even if Jobs is completely right and the other phone vendors are lying through their teeth, the world will again and again be reminded of Antennagate. That&amp;#8217;s not disastrous, but it&amp;#8217;s certainly a major annoyance that will hurt the iPhone 4&amp;#8217;s sales figures somewhat.&lt;/p&gt;

&lt;p&gt;Still, Antennagate alone will not spell doom and disaster for Apple. I would expect the hubbub to die down within a few months &amp;#8212; if Antennagate were an isolated incident.&lt;/p&gt;

&lt;p&gt;Problem is, it isn&amp;#8217;t an isolated incident.&lt;/p&gt;

&lt;h3&gt;Apple pisses off everybody&lt;/h3&gt;

&lt;p&gt;I &lt;a href=&quot;http://www.quirksmode.org/blog/archives/2010/04/mobile_miscella.html&quot;&gt;said it before&lt;/a&gt; and I&amp;#8217;ll say it again: this year, Apple is being serious about pissing off absolutely everybody in sight. I do not think this is a viable long-term strategy, and I do think that if Apple keeps this up long enough it will eventually run into serious problems.&lt;/p&gt;

&lt;p&gt;So what exactly did Apple do wrong?&lt;/p&gt;

&lt;p&gt;First things first: in 2007 it barged in on the mobile market, changed the rules, and succeeded beyond everybody&amp;#8217;s wildest dreams. That&amp;#8217;s of course a huge success for Apple, and rightly celebrated as such, but it has also created a host of enemies: basically all other powerful  mobile players. That&amp;#8217;s not a disaster, but it does mean wolves are on the prowl, and Apple has to keep its defenses in order.&lt;/p&gt;

&lt;p&gt;Its main line of defense, as always, is PR. And it&amp;#8217;s exactly here that cracks are starting to show. Let&amp;#8217;s recap Apple&amp;#8217;s year so far:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;It pissed off Adobe by rejecting any kind of Flash on the iPhone. The problem here is not so much Adobe itself, which is facing serious trouble in making the move to mobile, but the Adobe fanboi legion, which got thoroughly  angry. Adobe, too, has a powerful PR machine, and it knows how to reach designers. Adobe&amp;#8217;s point of view has found powerful defenders. (So has Apple&amp;#8217;s, but that&amp;#8217;s not the point. It would have been far better to continue to let the Adobe hordes sleep.)&lt;br&gt;
	PR translation: the iPhone is a closed platform, and Apple is proud of it.&lt;/li&gt;
	&lt;li&gt;Closely related is the major SDK license flap when Apple banned 3rd-party runtimes from the iPhone. There are solid technical reasons for this, but that&amp;#8217;s not the point. It&amp;#8217;s one more PR flap and a serious gamble. To &lt;a href=&quot;http://arstechnica.com/staff/fatbits/2010/04/apples-wager.ars&quot; class=&quot;external&quot;&gt;quote one analysis&lt;/a&gt;:
	&lt;blockquote&gt;
	&lt;p&gt;The proposition is this: Apple is betting it can grow its platform fast enough, using any means necessary, that developers will stick around despite all the hardships and shoddy treatment. Each time it chooses to do what it thinks is best for the future of the iPhone OS platform instead of what will please developers, Apple is pushing more chips into the pot.&lt;/p&gt;
	&lt;/blockquote&gt;
	Besides, once again attention was drawn to Apple&amp;#8217;s almost frivolous app rejections. The problem here is not that Apple rejects some apps, but that the rules aren&amp;#8217;t clear.&lt;br&gt;
	PR translation: iPhone developers should bloody do what Apple tells them. The iPhone is a closed system that&amp;#8217;s wholly dependent on Apple. Start loving it.&lt;/li&gt;
	&lt;li&gt;Apple announced a lawsuit against patent infringements by HTC. To quote &lt;a href=&quot;http://www.zdnet.com/blog/btl/apples-htc-lawsuit-is-it-biting-off-more-than-it-can-sue/31565&quot; class=&quot;external&quot;&gt;one analysis&lt;/a&gt;:
	&lt;blockquote&gt;
	&lt;p&gt;Apple could be hoping for a chilling effect from other handset makers looking to avoid a legal battle. But Apple is walking a tightrope. It needs to whack HTC without drawing Google and Microsoft into the fight. Riddle me this: Can you realistically just focus on the hardware here? If so perhaps Apple can prosecute a surgical strike on HTC. The reality is that the smartphone software and hardware are intertwined. You can expect that Google and Microsoft will defend their code at some point.&lt;/p&gt;
	&lt;/blockquote&gt;
	In other words, Apple may have bitten off more than it can chew. In any case it has aligned some of its most powerful competitors against it.&lt;br&gt;
	PR translation: Apple will bully its weakest competitors on grounds that are not comprehensible to the general audience.&lt;/li&gt;
	&lt;li&gt;Then it pissed off Mac developers by focusing WWDC wholly on iOS.&lt;br&gt;
	PR translation: Fuck off, Mac devs. You&amp;#8217;re not important any more.&lt;/li&gt;
	&lt;li&gt;The case of the stolen prototype. I don&amp;#8217;t really care about the legal aspects. The only thing I see is a large, legendarily closed company suing some journalists and assorted helpers.&lt;br&gt;
	PR translation: Fuck you for not obeying our rules. We&amp;#8217;ll send our Gestapo after you.&lt;br&gt;
	I cannot help but be impressed by a &lt;a href=&quot;http://gizmodo.com/5520746/apple-didnt-leak-the-iphoneand-why-that-matters&quot; class=&quot;external&quot;&gt;closing remark on Gizmodo&lt;/a&gt;, the site that unveiled the stolen prototype:
	&lt;blockquote&gt;
	&lt;p&gt;If you think that Gizmodo shouldn't have shown you the iPhone before Apple wanted you to see it, you&amp;#8217;re accepting that Apple should be the one to control news about its products. That's not an irrational position, but let's be honest about what it means.&lt;/p&gt;
	&lt;p&gt;[...]&lt;/p&gt;
	&lt;p&gt;It hands back the control of the story to Apple because some are more comfortable believing Apple's machinations are infallible than that they&amp;#8217;re a company made up of human beings who try to control the news cycle &amp;#8212; and that even the best laid plan can fall apart because of a single human mistake.&lt;/p&gt;
	&lt;/blockquote&gt;
	This is the flip side of the huge amount of attention the US tech world lavishes on Apple.
	Now that Apple is &lt;a href=&quot;http://verploeg.com/2010/04/apples-new-goliath-status/&quot; class=&quot;external&quot;&gt;on the way to becoming a bully&lt;/a&gt; some media will gleefully report on it. It&amp;#8217;s a new kind of Apple news, after all, and inherently more interesting that the next release of iWhatever.&lt;/li&gt;
	&lt;li&gt;And now there is Antennagate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;smaller&quot;&gt;(Incidentally, there are two groups that Apple hasn&amp;#8217;t pissed off yet, and that I don&amp;#8217;t expect them to piss off, either. They are consumers, who get their covers against Antennagate, and web developers, who&amp;#8217;re still allowed to play with the most advanced mobile browser in the world. I continue to believe that web development is Apple&amp;#8217;s ace in a hole. If everything else goes wrong, Apple will still have the best mobile web platform in the world.)&lt;/p&gt;

&lt;p&gt;Is any of these mistakes fatal? Certainly not. Apple handled the technical aspects of Antennagate correctly, its rejection of Flash and the new SDK license agreements are defensible from a UX perspective, its dissing of Mac developers is understandable in the light of its mobile strategy, and I don&amp;#8217;t doubt the lawsuits against HTC and the prototype culprits have a solid legal grounding. Finally, the PR flap is manageable in every case taken by itself.&lt;/p&gt;

&lt;h3&gt;Hubris&lt;/h3&gt;

&lt;p&gt;However, if we take all these issues &lt;em&gt;together&lt;/em&gt; we see Apple spending 2010 by sending a cheerful Fuck You to people of all colours and all nations, and especially its own developers and former allies. &lt;/p&gt;

&lt;p&gt;Is Apple suffering from imperial overstretch? Is Apple guilty of an old-fashioned case of &lt;a href=&quot;http://en.wikipedia.org/wiki/Hubris&quot; class=&quot;external&quot;&gt;hubris&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;Judging from the evidence that&amp;#8217;s certainly a possibility.&lt;/p&gt;

&lt;p&gt;Fortune&amp;#8217;s wheel. What goes up must come down. The throne of the once-almighty king is toppled because he grew overconfident.&lt;/p&gt;

&lt;p&gt;Those are powerful story lines that have interested humanity for at least 2,500 years.
Since they conform to some sort of basic human expectation of how history works, the tech commentators who are Apple&amp;#8217;s PR mainstay could start to pursue them in order to present a different perspective and gain more readers. (Come to think of it, so am I.)&lt;/p&gt;

&lt;p&gt;Right now Apple is doing everything in its power to push those story lines. In the long run that is not healthy.&lt;/p&gt;

&lt;p&gt;I feel Apple has a PR problem, but isn&amp;#8217;t aware of it, possibly because it doesn&amp;#8217;t &lt;em&gt;want&lt;/em&gt; to be aware of it.&lt;/p&gt;

&lt;p&gt;Now let&amp;#8217;s see how this plays out. The story isn&amp;#8217;t done yet, and who knows, Apple might even see the errors of its ways before it&amp;#8217;s too late.&lt;/p&gt;</description>
	<pubDate>Thu, 22 Jul 2010 15:57:37 +0000</pubDate>
</item>
<item>
	<title>Wisdump: Prettier Posts: Clean Up Those Listings</title>
	<guid>http://wisdump.com/design/prettier-posts-clean-up-those-listings/</guid>
	<link>http://www.wisdump.com/design/prettier-posts-clean-up-those-listings/</link>
	<description>&lt;p&gt;&lt;img src=&quot;http://wisdump.com/wp-content/uploads/2007/12/alongone.jpg&quot; alt=&quot;A truly long one&quot;&gt;It&amp;#8217;s about time we clean up the blogosphere, it doesn&amp;#8217;t have to be this ugly, and not everyone needs to hire me or my likes to get a pretty blog. There&amp;#8217;s a lot you can do yourself, and most of it is related to your content.&lt;/p&gt;
&lt;p&gt;Take a look at your average listing of posts, usually your front page but it could also be a category page or an archive. Post after post after post after post. Boring? Might be. Long? In most cases, yes. &lt;a href=&quot;http://avc.blogs.com/&quot;&gt;Too long?&lt;/a&gt; Yep, I&amp;#8217;d say so.&lt;/p&gt;
&lt;p&gt;I believe in using &lt;em&gt;read more&lt;/em&gt; functionality, in other words, in just displaying some of the content (if the post is a semi-long or long one) in post listings. If you display a 20 paragraphs long post after a 30 paragraphs long post, but before a 50 paragraphs long post, then you have a very ugly page.&lt;/p&gt;
&lt;p&gt;By using &lt;em&gt;read more&lt;/em&gt; functionality, available in any good blogging software, you can show as much content as you like in your listings, and it shouldn&amp;#8217;t be too much.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-592&quot;&gt;&lt;/span&gt;Take a look at &lt;a href=&quot;http://wisdump.com&quot;&gt;Wisdump&lt;/a&gt;, for instance. You&amp;#8217;ll find a &lt;em&gt;Read the rest of this entry&lt;/em&gt; link on most of the posts I&amp;#8217;ve written, only very short ones get published in its whole in the listing. Even less gets published on my blog, &lt;a href=&quot;http://rethord.com&quot;&gt;rethord.com&lt;/a&gt;, but the principle is the same &amp;#8211; the only thing that varies is the font size, and that means I&amp;#8217;ll have to make the read more break earlier.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re a &lt;a href=&quot;http://wordpress.org&quot;&gt;WordPress&lt;/a&gt; user you might be tempted to use the_excerpt, which publishes what you put in the optional excerpt box, or cuts your posts for you. That&amp;#8217;s fine for long listings, but if you want an attractive front page, for instance, you want full control, and that means you&amp;#8217;ll have to use the optional excerpt box on every post, otherwise it might look like crap since you can&amp;#8217;t control where the post will get cut in a per-post basis.&lt;/p&gt;
&lt;p&gt;Today&amp;#8217;s homework is to take a look at your post listing. Do you have long post after long post after long post? Then reconsider, because it doesn&amp;#8217;t look good, and it doesn&amp;#8217;t offer the reader a decent overview.&lt;/p&gt;
&lt;p&gt;The lack of read more in the blogosphere is both a usability and a design problem. It&amp;#8217;s not practical to present big chunks of content in lists, and it looks like shit. That&amp;#8217;s the bad part.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The good part is that you can fix it on your end, right away.&lt;/strong&gt; So please do.&lt;/p&gt;

	&lt;h4&gt;Related reading:&lt;/h4&gt;
	&lt;ul class=&quot;st-related-posts&quot;&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.wisdump.com/design/wisdump-redesign-concept-part-2/&quot; title=&quot;Wisdump redesign concept, part 2 (January 23, 2008)&quot;&gt;Wisdump redesign concept, part 2&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.wisdump.com/css/css-logotypes-vs-images/&quot; title=&quot;Will CSS logotypes replace image-based ones? (May 28, 2010)&quot;&gt;Will CSS logotypes replace image-based ones?&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.wisdump.com/being-the-hype/web-trend-alert-virtual-business-card-sites/&quot; title=&quot;Web Trend Alert: Virtual business card sites (October 13, 2009)&quot;&gt;Web Trend Alert: Virtual business card sites&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.wisdump.com/designer-resources/type-designers-coming-together-for-haiti-hopefully-chile-too/&quot; title=&quot;Type designers ?Coming Together? for Haiti; hopefully Chile too (February 28, 2010)&quot;&gt;Type designers &amp;#8220;Coming Together&amp;#8221; for Haiti; hopefully Chile too&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.wisdump.com/design/ugliest-websites-in-the-world/&quot; title=&quot;The ugliest websites in the world (August 31, 2009)&quot;&gt;The ugliest websites in the world&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/WyNCLtLcG__y3pVVS_HIM08yOzw/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/WyNCLtLcG__y3pVVS_HIM08yOzw/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/WyNCLtLcG__y3pVVS_HIM08yOzw/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/WyNCLtLcG__y3pVVS_HIM08yOzw/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Wisdump?a=PqY6lcOExVM:zJ06aIC3ilg:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Wisdump?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Wisdump?a=PqY6lcOExVM:zJ06aIC3ilg:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Wisdump?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Wisdump?a=PqY6lcOExVM:zJ06aIC3ilg:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Wisdump?i=PqY6lcOExVM:zJ06aIC3ilg:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Wisdump?a=PqY6lcOExVM:zJ06aIC3ilg:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Wisdump?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Wisdump/~4/PqY6lcOExVM&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
	<pubDate>Thu, 22 Jul 2010 15:50:17 +0000</pubDate>
	<dc:creator>Thord Daniel Hedengren</dc:creator>
</item>
<item>
	<title>Vitamin: Think Vitamin Interview: Dan Cederholm at FOWD London 2010</title>
	<guid>http://thinkvitamin.com/?p=6757</guid>
	<link>http://thinkvitamin.com/design/think-vitamin-interview-dan-cederholm-at-fowd-london-2010/</link>
	<description>&lt;div class=&quot;tweetmeme_button&quot;&gt;
			&lt;a href=&quot;http://api.tweetmeme.com/share?url=http%3A%2F%2Fthinkvitamin.com%2Fdesign%2Fthink-vitamin-interview-dan-cederholm-at-fowd-london-2010%2F&quot;&gt;&lt;br&gt;
				&lt;img src=&quot;http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fthinkvitamin.com%2Fdesign%2Fthink-vitamin-interview-dan-cederholm-at-fowd-london-2010%2F&amp;amp;source=thinkvitamin&amp;amp;style=normal&amp;amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot;&gt;&lt;br&gt;
			&lt;/a&gt;
		&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;http://thinkvitamin.com/wp-content/uploads/2010/07/danc6s.jpg&quot; alt=&quot;&quot; title=&quot;danc6s&quot; width=&quot;470&quot; height=&quot;315&quot; class=&quot;aligncenter size-full wp-image-6764&quot;&gt;&lt;/p&gt;
&lt;p&gt;Earlier this year whilst attending &lt;a href=&quot;http://futureofwebdesign.com/&quot;&gt;Future of Web Design&lt;/a&gt; London I recorded a few interviews. &lt;/p&gt;
&lt;p&gt;First up is my chat with &lt;a href=&quot;http://stream.simplebits.com/&quot;&gt;Dan Cederholm&lt;/a&gt;, designer, author and co-creator of one of the most popular design focused apps &lt;a href=&quot;http://dribbble.com/&quot;&gt;Dribbble&lt;/a&gt;. Thanks to Dan for taking the time to chat.&lt;/p&gt;
&lt;p&gt;You can listen below or download the mp3 directly.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;img src=&quot;http://thinkvitamin.com/?ak_action=api_record_view&amp;id=6757&amp;type=feed&quot; alt=&quot;&quot;&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?a=021eGdm3jiU:1TwIvwVSeLA:FMJD1cDTPr0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/vitaminmasterfeed?d=FMJD1cDTPr0&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Thu, 22 Jul 2010 14:00:59 +0000</pubDate>
	<dc:creator>Keir Whitaker</dc:creator>
</item>
<item>
	<title>Stopdesign: My Measures &amp; Dimensions</title>
	<guid>https://stopdesign.com/archive/2010/07/20/my-measures-dimensions.html</guid>
	<link>http://stopdesign.com/archive/2010/07/20/my-measures-dimensions.html</link>
	<description>&lt;p&gt;I just discovered an iPhone app named &lt;strong&gt;My Measures &amp;amp; Dimensions&lt;/strong&gt; that lets you take any photo and quickly draw dimensions on top of objects or spaces in the photo. Typically, I use a piece of scrap paper for this, and end up forgetting to bring it with me when I need it. After photos are marked up with measurements, they can be emailed to anyone, or added to the iPhone&amp;#8217;s photo library.&lt;/p&gt;
&lt;p&gt;So far, this app seems incredibly useful for several purposes. I&amp;#8217;m using it to quickly record the measurements of rooms in our house. It&amp;#8217;s also handy to note the dimensions of some bookshelves in our daughter&amp;#8217;s room, so we&amp;#8217;ll know what can fit inside. I can easily imagine several other uses too. Here&amp;#8217;s a &lt;a href=&quot;http://itunes.apple.com/us/app/my-measures-dimensions/id325962257?mt=8&quot;&gt;direct link to My Measures&lt;/a&gt; in the iTunes Store. &lt;a class=&quot;linkurl&quot; href=&quot;http://www.sis.si/iphone/my-measures&quot;&gt;link&lt;/a&gt;&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/stopdesign/~4/wGMs2zbA6dI&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
	<pubDate>Tue, 20 Jul 2010 15:00:00 +0000</pubDate>
	<dc:creator>Douglas Bowman</dc:creator>
</item>
<item>
	<title>QuirksMode: The Firefox problem</title>
	<guid>http://www.quirksmode.org/blog/archives/2010/07/the_firefox_pro.html</guid>
	<link>http://www.quirksmode.org/blog/archives/2010/07/the_firefox_pro.html</link>
	<description>&lt;p&gt;In recent weeks Firefox 4 beta 1 and Opera 10.60 were released, and I could also put my hands on a working Chrome 4. I added all these browsers to the &lt;a href=&quot;http://www.quirksmode.org/compatibility.html&quot;&gt;compatibility tables&lt;/a&gt;, which are now all updated, except for the Events one.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s little difference with my &lt;a href=&quot;http://www.quirksmode.org/blog/archives/2010/06/ies_big_leap_fo.html&quot;&gt;earlier&lt;/a&gt; &lt;a href=&quot;http://www.quirksmode.org/blog/archives/2010/06/more_ie9_goodne.html&quot;&gt;reports&lt;/a&gt;, except that the new Firefox beta is making a serious effort to support the &lt;a href=&quot;http://www.quirksmode.org/css/background.html&quot;&gt;background module&lt;/a&gt;. It&amp;#8217;s not there yet, but Firefox is not as disastrously behind as it was a month back.&lt;/p&gt;

&lt;h3&gt;Firefox&lt;/h3&gt;

&lt;p&gt;Of course Firefox remains a pain in other respects: &lt;em&gt;still&lt;/em&gt; no support for &lt;code&gt;contains()&lt;/code&gt;, incorrect indexing of attributes (it&amp;#8217;s essentially random), no &lt;code&gt;innerText&lt;/code&gt; or &lt;code&gt;outerHTML&lt;/code&gt;, no sane second argument for the &lt;code&gt;add()&lt;/code&gt; method for select boxes, a &lt;code&gt;colorDepth&lt;/code&gt; of 24.&lt;/p&gt;

&lt;p&gt;All these bugs are Firefox-only, with the exception of the attribute indexing, which is also a problem in IE. Frankly, I&amp;#8217;m starting to get fed up with Firefox and its haughty refusal to implements useful methods and properties found in all other browsers. But maybe that&amp;#8217;s a passing phase. Maybe I&amp;#8217;ll pick another browser to be annoyed at next time around.&lt;/p&gt;

&lt;h3&gt;Events&lt;/h3&gt;

&lt;p&gt;I haven&amp;#8217;t yet updated the Events table, partly because it&amp;#8217;s such a lot of work (it takes me as much time as all other tables combined), and partly because I do not expect huge changes. I tested various problems in IE9, and sadly found no improvements.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m not sure when I&amp;#8217;ll have the time to do the Events table; I hope before I leave on holiday in early August.&lt;/p&gt;</description>
	<pubDate>Tue, 20 Jul 2010 11:00:06 +0000</pubDate>
</item>
<item>
	<title>ajaxian: A Little PIE with that CSS3?</title>
	<guid>http://ajaxian.com/?p=9835</guid>
	<link>http://feedproxy.google.com/~r/ajaxian/~3/orfn-gXlNhA/a-little-pie-with-that-css3</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://ajaxian.com/wp-content/images/pie-logo.png&quot;&gt;&lt;img src=&quot;http://ajaxian.com/wp-content/images/pie-logo.png&quot; alt=&quot;&quot; title=&quot;pie-logo&quot; width=&quot;194&quot; height=&quot;127&quot; class=&quot;alignright size-full wp-image-9836&quot;&gt;&lt;/a&gt;Everyone's chomping at the bit to leverage new HTML5 and CSS3 features but with some older browsers not supporting them, hacks are still needed to make things work in a cross-browser fashion. We've seen libs that make things easier such as &lt;a href=&quot;http://code.google.com/p/html5shiv/&quot;&gt;Remy Sharp's html5shiv&lt;/a&gt; and &lt;a href=&quot;http://www.modernizr.com/&quot;&gt;Modernizr&lt;/a&gt; and now we can add another one.&lt;/p&gt;
&lt;p&gt;Jason Johnston's new &lt;a href=&quot;http://css3pie.com/&quot;&gt;PIE library&lt;/a&gt; makes it easy to rendering several of the most useful CSS3 decoration features within Internet Explorer versions 6 through 8. He took an interesting approach by using IE DHTML Behaviors to style the elements and provide the necessary functionality to emulate the CSS3 functionality.  So to add rounded corners to an element, your CSS code might look like this in plain 'ole CSS:&lt;/p&gt;
&lt;div class=&quot;igBar&quot;&gt;&lt;a href=&quot;javascript:showCodeTxt('css-7');&quot;&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;syntax_hilite&quot;&gt;&lt;span&gt;CSS:&lt;/span&gt;
&lt;div id=&quot;css-7&quot;&gt;
&lt;div class=&quot;css&quot;&gt;
&lt;span&gt;#myElement &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;background&lt;/span&gt;: #EEE;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;padding&lt;/span&gt;: 2em;&lt;br&gt;
&amp;nbsp; &amp;nbsp; -moz-border-radius: 1em;&lt;br&gt;
&amp;nbsp; &amp;nbsp; -webkit-border-radius: 1em;&lt;br&gt;
&amp;nbsp; &amp;nbsp; border-radius: 1em;&lt;br&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To add support in IE 6-8 using PIE, you'd add this:&lt;/p&gt;
&lt;div class=&quot;igBar&quot;&gt;&lt;a href=&quot;javascript:showCodeTxt('css-8');&quot;&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;syntax_hilite&quot;&gt;&lt;span&gt;CSS:&lt;/span&gt;
&lt;div id=&quot;css-8&quot;&gt;
&lt;div class=&quot;css&quot;&gt;
&lt;span&gt;#myElement &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br&gt;
&amp;nbsp; &amp;nbsp; behavior: &lt;span&gt;url&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;PIE.htc&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;PIE currently has full or partial support for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;border-radius&lt;/li&gt;
&lt;li&gt;box-shadow&lt;/li&gt;
&lt;li&gt;border-image&lt;/li&gt;
&lt;li&gt;multiple background images&lt;/li&gt;
&lt;li&gt;linear-gradient background images&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unfortunately, there seems to only be one demo at the moment, which is border-radius rendering via the home page, but it's still seems like a good start with a lot of future potential. &lt;/p&gt;
&lt;p&gt;I've never personally used IE DHTML Behaviors or HTML Components so I looked them up and found these intro links for those who might be interested in better understanding them:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms532146.aspx&quot;&gt;Using HTML Components to Implement DHTML Behaviors in Script&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms531079.aspx&quot;&gt;Introduction to DHTML Behaviors&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=orfn-gXlNhA:eghAlLpzsY8:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=orfn-gXlNhA:eghAlLpzsY8:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=orfn-gXlNhA:eghAlLpzsY8:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?i=orfn-gXlNhA:eghAlLpzsY8:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Mon, 19 Jul 2010 15:51:00 +0000</pubDate>
	<dc:creator>Rey Bango</dc:creator>
</item>
<item>
	<title>Microsoft - IEBlog: How IE9 Platform Preview Feedback Changed the JavaScript Standard</title>
	<guid>91d46819-8472-40ad-a661-2c78acb4018c:10038899</guid>
	<link>http://blogs.msdn.com/b/ie/archive/2010/07/16/how-ie9-platform-preview-feedback-changed-the-javascript-standard.aspx</link>
	<description>&lt;p&gt;When we first &lt;a href=&quot;http://blogs.msdn.com/b/ie/archive/2010/03.aspx&quot;&gt;introduced&lt;/a&gt; our plans for Internet Explorer Platform Previews we said that &amp;ldquo;developers and people interested in standards and web development can try out new platform functionality and provide early feedback.&amp;rdquo; We are now getting such &lt;a href=&quot;https://connect.microsoft.com/ie&quot;&gt;feedback&lt;/a&gt; on a daily basis and are using it to improve IE9. However, sometimes the impact of the feedback extends beyond just IE9. Here is the story of how some recent feedback regarding the third IE9 Platform Preview resulted in a correction to the new &lt;a href=&quot;http://www.ecma-international.org/publications/standards/Ecma-262.htm&quot;&gt;ECMAScript 5&lt;sup&gt;th&lt;/sup&gt; Edition&lt;/a&gt; (ES5) standard for JavaScript.&lt;/p&gt;
&lt;p&gt;The ES5 standard &lt;a href=&quot;http://www.ecma-international.org/news/PressReleases/PR_Ecma%20approves%20major%20revision%20of%20ECMAScript.htm&quot;&gt;became official&lt;/a&gt; in December 2009 and the third IE9 Platform Preview is the first widely distributed implementation of some subtle details of the ES5 specification. ES5 was designed to be highly compatible with existing websites and the Ecma International &lt;a href=&quot;http://www.ecma-international.org/memento/TC39.htm&quot;&gt;TC39 technical committee&lt;/a&gt; worked to avoid any non-security related changes that might break existing JavaScript code. However, perfection generally does not exist in the world of software so with the third IE9 Platform Preview we were very interested to see if any ES5-related compatibility problems with existing sites would show up.&lt;/p&gt;
&lt;p&gt;Soon after releasing this platform preview, we received reports that some web-apps that use the &lt;a href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt; framework did not work correctly in the preview. We tracked the problem to a specific jQuery &lt;a href=&quot;http://api.jquery.com/jQuery.isFunction/&quot;&gt;API method&lt;/a&gt; that in some cases passed a caller provided value to &lt;code&gt;Object.prototype.toString &lt;/code&gt;without first checking if the value was null or undefined. Specifically, some calls to this jQuery method:&lt;/p&gt;
&lt;blockquote&gt;&lt;code&gt;
&lt;pre&gt;isFunction: function( obj ) {
     return toString.call(obj) === &quot;[object Function]&quot;;
},&lt;/pre&gt;
&lt;/code&gt;&lt;/blockquote&gt;
&lt;p&gt;failed with an exception: &amp;ldquo;TypeError: Object expected&amp;rdquo;. Further analysis showed that &lt;code&gt;toString&lt;/code&gt; in the above code was the built-in method &lt;code&gt;Object.prototpe.toString&lt;/code&gt; and that the failures occurred when &lt;code&gt;isFunction&lt;/code&gt; was being called with &lt;code&gt;undefined&lt;/code&gt; as its argument. Why does an exception occur in IE9 and not in previous versions of IE or other browsers? It is because the third IE9 Platform Preview in standards mode actually conforms to the ES5 specification for &lt;code&gt;Object.prototype.toString&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;According to the &lt;a href=&quot;http://www.ecma-international.org/publications/standards/Ecma-262-arch.htm&quot;&gt;prior editions&lt;/a&gt; of the ECMAScript specification, calling any built-in method using &lt;code&gt;null&lt;/code&gt; or &lt;code&gt;undefined&lt;/code&gt; as the &lt;code&gt;this&lt;/code&gt; value passes the &amp;ldquo;global object&amp;rdquo; (in browsers this is the DOM &lt;code&gt;window&lt;/code&gt; object) to the method as its &lt;code&gt;this&lt;/code&gt; value.&amp;nbsp; This opens a number of potential security holes for frameworks that aim to support mash-ups in a secure way.&lt;/p&gt;
&lt;p&gt;The ES5 specification changed this so that &lt;code&gt;null&lt;/code&gt; or &lt;code&gt;undefined&lt;/code&gt; is not replaced with the &lt;code&gt;window&lt;/code&gt; object and the definition for each built-in method was updated specifically to deal with receiving these values as their &lt;code&gt;this&lt;/code&gt; value. The ECMAScript technical committee tried to do this in a way that preserves backwards compatibility for normal usage and throws an exception in cases where that is not possible. &lt;code&gt;Object.prototype.toString&lt;/code&gt; was specified in ES5 to throw such an exception. This created the compatibility problem described above.&lt;/p&gt;
&lt;p&gt;This problem can be easily corrected by modifying the jQuery code with the additions shown in red:&lt;/p&gt;
&lt;blockquote&gt;&lt;code&gt;
&lt;pre&gt;isFunction: function( obj ) {
     return &lt;span&gt;obj &amp;amp;&amp;amp;&lt;/span&gt; toString.call(obj) === &quot;[object Function]&quot;;
},&lt;/pre&gt;
&lt;/code&gt;&lt;/blockquote&gt;
&lt;p&gt;The jQuery team actually &lt;a href=&quot;http://dev.jquery.com/ticket/6740&quot;&gt;intends&lt;/a&gt; to make this change. However, such a change will not correct the thousands of locally hosted copies of jQuery that already exist on the Web. With the broad use of jQuery, it is clear that the ES5 specification contains a significant compatibility problem. It is fairly obvious how we can modify the IE9 ES5 implementation to eliminate the problem. We can just return the same string value (&lt;code&gt;&quot;[object Object]&quot;&lt;/code&gt;) that IE8 returns in this situation. Such a fix does not reintroduce any of the security problems that ES5 strives to eliminate. However, we do not want to unilaterally introduce such a variation into our implementation of a new standard. It does not help either compatibility or interoperability if IE fixes this problem one way, and other browsers either don&amp;rsquo;t fix it or fixed it a different way.&lt;/p&gt;
&lt;p&gt;As soon as we understood the problem and the possible solution, I raised this on the TC39 es5-discuss &lt;a href=&quot;https://mail.mozilla.org/listinfo/es5-discuss&quot;&gt;mailing list&lt;/a&gt; as a backwards compatibility issue.&amp;nbsp; My first post on the issue went out at 5:51 PM on June 25, a Friday. By 10 PM there were responses from TC39 members representing Apple, Mozilla, and Google. We all agreed that this was a compatibility issue that needed to be fixed, and that in this case throwing the exception was unnecessary and undesirable. We also initially agreed that the idea of returning the same string value as ES3 for these cases sounded like a good idea. However, in further messages over the weekend we realized that browsers currently don&amp;rsquo;t all return &lt;code&gt;&quot;[object Object]&quot;&lt;/code&gt; in this situation, some other values that were observed include &lt;code&gt;&quot;[object Window]&quot;&lt;/code&gt; and &lt;code&gt;&quot;[object Global]&quot;&lt;/code&gt;. A proposal was made to return &lt;code&gt;&quot;[object null]&quot;&lt;/code&gt; and &lt;code&gt;&quot;[object undefined]&quot;&lt;/code&gt;. This seemed to be a better solution as it not only fixes use cases such as jQuery&amp;rsquo;s but it also explicitly distinguishes &lt;code&gt;null&lt;/code&gt; and &lt;code&gt;undefined&lt;/code&gt; from actual objects. It is also better for browser interoperability because it requires that all browsers produce identical results rather than the ES3 situation that allowed different browsers to produce different results.&lt;/p&gt;
&lt;p&gt;By Tuesday, the consensus on the mailing list was to follow this final proposal. As soon as that agreement was reached, I passed the revised &lt;code&gt;Object.prototype.toString&lt;/code&gt; specification on to our IE9 JavaScript development team so they could make the fix in time to widely test it with the next IE9 platform preview build.&amp;nbsp; Mozilla has also &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=575522&quot;&gt;indicated&lt;/a&gt; that they will be incorporating this fix into a future Firefox beta. I also updated the official TC39 &lt;a href=&quot;http://wiki.ecmascript.org/lib/exe/fetch.php?id=start&amp;amp;cache=cache&amp;amp;media=resources:es5_errata_7-1-10.pdf&quot;&gt;Erratum for ES5&lt;/a&gt;&amp;nbsp; so this specification change is recorded there (section 15.2.4.2).&lt;/p&gt;
&lt;p&gt;Web standards are complex software artifacts and like all software, they contain bugs. Sometimes the best way to find and fix compatibility bugs is to implement and deploy the standard on widely used browsers. This generally takes place in the context of early releases such as the IE9 platform preview builds. So, when you as a web developer are providing feedback on such releases you aren&amp;rsquo;t just providing feedback on a specific browser you are also providing feedback on the new and emerging standards that it implements. Of course, for this feedback to be worthwhile, browser implementers and standards authors need to be able and willing to quickly respond to feedback that identifies significant problems. The rapid response to the ES5 jQuery &lt;code&gt;toString&lt;/code&gt; problem and other issues on es5-discuss show how browser implementers and other TC39 members can and do work closely together to create a more compatible and interoperable Web. But it all starts with your feedback, so please keep it coming.&lt;/p&gt;
&lt;p&gt;Allen Wirfs-Brock &lt;br&gt;Microsoft JavaScript Language Architect&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;img src=&quot;http://blogs.msdn.com/aggbug.aspx?PostID=10038899&quot; width=&quot;1&quot; height=&quot;1&quot;&gt;</description>
	<pubDate>Fri, 16 Jul 2010 21:43:00 +0000</pubDate>
	<dc:creator>ieblog</dc:creator>
</item>
<item>
	<title>ajaxian: It's Friday. Take the time to learn the Web with a splash of French, German, and Irish</title>
	<guid>http://ajaxian.com/?p=9824</guid>
	<link>http://feedproxy.google.com/~r/ajaxian/~3/PsndHyzk0Js/its-friday-take-the-time-to-learn-the-web-with-a-splash-of-french-german-and-irish</link>
	<description>&lt;p&gt;The week has been long. Much code has been written. There is much more to do, but Friday is for relaxing a little. Take some time, sit back and watch, as three fantastic videos are available for you:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;French: Paul Rouget of Mozilla, shows you the future&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Paul builds the best demos. ever. At the Mozilla Summit in Whistler, he shows off what you can do when you remix HTML5, CSS3, SVG, WebGL, and WebSockets. A must see.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;German: Building an awesome social HTML5 engine&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Paul Bakaus of Dextrose (and jQuery UI fame) recently launched the Aves Engine, a social gaming engine in pure HTML! Dextrose also joined forces with Effect Games to bolster its Web gaming might. Paul gave a talk at Google explaining the technology, and it just went live:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;Irish&quot;: Paul shows you jQuery c0de&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ok, Irish by name, and maybe a touch by nature.... but not by nationality. Paul Irish has been doing an amazing talk at conferences where he walks through the jQuery source code to teach you fun and frolics of JavaScript. He picked up ScreenFlow and did it again to reach you all. Paul is a gem in our community, and at 52 minutes.... you will still want more:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Have a great weekend!&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=PsndHyzk0Js:T9tr4B0Ha0s:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=PsndHyzk0Js:T9tr4B0Ha0s:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=PsndHyzk0Js:T9tr4B0Ha0s:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?i=PsndHyzk0Js:T9tr4B0Ha0s:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Fri, 16 Jul 2010 17:34:34 +0000</pubDate>
	<dc:creator>Dion Almaer</dc:creator>
</item>
<item>
	<title>Microsoft - IEBlog: The CSS Corner: Better Web Typography For Better Design</title>
	<guid>91d46819-8472-40ad-a661-2c78acb4018c:10038871</guid>
	<link>http://blogs.msdn.com/b/ie/archive/2010/07/15/the-css-corner-better-web-typography-for-better-design.aspx</link>
	<description>&lt;p&gt;&lt;b&gt;Lost In Translation&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;&lt;a href=&quot;http://informationarchitects.jp/the-web-is-all-about-typography-period/&quot;&gt;Web design is 95% typography&lt;/a&gt;&amp;rdquo;. So much of the content produced and consumed on the web is text yet designers and users have been confined to a set of compatible fonts available across client operating systems. Escaping this typographical island has involved everything from cross-browser CSS workarounds, &lt;a href=&quot;http://cufon.shoqolate.com/generate/&quot;&gt;graphics-based&lt;/a&gt; solutions and even &lt;a href=&quot;http://wiki.novemberborn.net/sifr/&quot;&gt;plug-ins&lt;/a&gt;, with trade-offs ranging from extra storage and bandwidth to reduced accessibility.&lt;/p&gt;
&lt;p&gt;As a result, typefaces have too often been one of the first casualties of the translation from Photoshop design mock-up to live web page.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Not The Same CSS&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Solving this challenge required an interoperable CSS syntax to describe font resources. While IE added support for CSS2&amp;rsquo;s @font-face rule as long ago as 1997, the differences between this earliest of implementations and the far more recent ones supporting &lt;a href=&quot;http://www.w3.org/TR/css3-fonts/&quot;&gt;CSS3 Fonts&lt;/a&gt; have given rise to CSS design patterns built to ensure the same rule works for all users. A notable example is the &lt;a href=&quot;http://paulirish.com/2009/bulletproof-font-face-implementation-syntax/&quot;&gt;bulletproof @font-face syntax&lt;/a&gt; developed by Paul Irish from Google, et al. &lt;/p&gt;
&lt;p&gt;But crafting a cross-browser @font-face declaration turned out to be half the problem.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;No Common Web Font Format&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Internet Explorer&amp;rsquo;s @font-face implementation supports EOT (Embedded OpenType) fonts, a compressed font encoding &lt;a href=&quot;http://www.w3.org/Submission/2008/01/&quot;&gt;submitted to the W3C in 2008&lt;/a&gt;. Following &lt;a href=&quot;http://webkit.org/blog/124/downloadable-fonts/&quot;&gt;WebKit&amp;rsquo;s lead in 2007&lt;/a&gt;, Mozilla and Opera added support for raw TrueType and OpenType fonts. Raw fonts work well if your fonts&amp;rsquo; end-user license (EULA) allowed you to serve them from your web server. While this is true for many free fonts, this is not the case for the vast majority of commercial fonts. Web authors are thus effectively cut off from the richest font catalogs available. If they choose EOT they are able to license a number of commercial fonts for web use but only IE renders them.&lt;/p&gt;
&lt;p&gt;This leaves a challenge for the industry. The major browsers support two incompatible solutions and commercial font EULAs are generally incompatible with one of them.&amp;nbsp; This spawned dedicated hosting services like &lt;a href=&quot;http://typekit.com/&quot;&gt;TypeKit&lt;/a&gt; to help designers license typefaces for their site and use them across browsers. These services, however, may not offer all or even any of the desired fonts that a web developer needs for their site. In some cases, a font set could even require multiple subscriptions. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;WOFF&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;In late 2009, type designers &lt;a href=&quot;http://talleming.com/&quot;&gt;Tal Leming&lt;/a&gt; and &lt;a href=&quot;http://www.letterror.com/&quot;&gt;Erik van Blokland&lt;/a&gt; working together with Mozilla&amp;rsquo;s Jonathan Kew proposed &lt;a href=&quot;http://people.mozilla.com/~jkew/woff/woff-spec-latest.html&quot;&gt;a new web font container format&lt;/a&gt; to address the concerns of font vendors without reducing web author choice. It was well received and &lt;a href=&quot;http://www.w3.org/Submission/2010/03/&quot;&gt;submitted to the W3C in April 2010 by Mozilla, Opera and Microsoft.&lt;/a&gt; Today, Firefox 3.6 supports WOFF and other browser vendors &lt;a href=&quot;http://news.cnet.com/8301-30685_3-20003277-264.html&quot;&gt;will be following&lt;/a&gt; soon.&lt;/p&gt;
&lt;p&gt;Font foundries have also rallied behind the new format and already offer WOFF-encoded fonts for web use. Among them, &lt;a href=&quot;http://webfonts.fonts.com/&quot;&gt;Monotype Imaging&lt;/a&gt;, &lt;a href=&quot;http://www.ascendercorp.com/&quot;&gt;Ascender Corporation&lt;/a&gt;, &lt;a href=&quot;http://www.fontshop.com/&quot;&gt;FontShop&lt;/a&gt; and &lt;a href=&quot;http://www.typotheque.com/&quot;&gt;Typotheque&lt;/a&gt; provided us with the great WOFF fonts used in our our &lt;a href=&quot;http://ie.microsoft.com/testdrive/Graphics/WebFonts/Default.html&quot;&gt;Testdrive&lt;/a&gt; &lt;a href=&quot;http://ie.microsoft.com/testdrive/Graphics/MoreWebFonts/Default.html&quot;&gt;demos&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://ie.microsoft.com/testdrive/Graphics/WebFonts/Default.html&quot;&gt;&lt;img src=&quot;http://ieblog.members.winisp.net/images/Sylvain_WebTopo_1.png&quot; alt=&quot;IE9 WOFF testdrive demo&quot; title=&quot;IE9 WOFF testdrive demo&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://ie.microsoft.com/testdrive/Graphics/MoreWebFonts/Default.html&quot;&gt;&lt;img src=&quot;http://ieblog.members.winisp.net/images/Sylvain_WebTopo_2.png&quot; alt=&quot;IE9 WOFF testdrive demo&quot; title=&quot;IE9 WOFF testdrive demo&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Same CSS, Same Web Font Format&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Starting with Platform Preview 3, IE9&amp;rsquo;s @font-face implementation conforms to the &lt;a href=&quot;http://www.w3.org/TR/css3-fonts/&quot;&gt;CSS3 Fonts&lt;/a&gt; module; supported font formats include EOT and WOFF as well as raw fonts with embedding permissions set to installable. &lt;/p&gt;
&lt;p&gt;In future posts, we will look into IE9&amp;rsquo;s web font support in more detail, as well as the available techniques for cross-browser typography. In &lt;a href=&quot;http://blogs.msdn.com/b/fontblog/archive/2010/06/25/the-art-and-tradition-of-typography.aspx&quot;&gt;his latest post on the FontBlog&lt;/a&gt;, Greg Hitchcock offers rich context on the art and science behind the technologies involved in web typography.&lt;/p&gt;
&lt;p&gt;We look forward to your feedback on this Preview release, as well as ongoing work within the W3C to extend the reach of the typographic web.&lt;/p&gt;
&lt;p&gt;Sylvain Galineau &lt;br&gt;Program Manager&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;img src=&quot;http://blogs.msdn.com/aggbug.aspx?PostID=10038871&quot; width=&quot;1&quot; height=&quot;1&quot;&gt;</description>
	<pubDate>Fri, 16 Jul 2010 00:04:00 +0000</pubDate>
	<dc:creator>ieblog</dc:creator>
</item>
<item>
	<title>Wisdump: Authority Profile: Rand Fishkin</title>
	<guid>http://wisdump.com/good-sites/authority-profile-rand-fishkin/</guid>
	<link>http://www.wisdump.com/good-sites/authority-profile-rand-fishkin/</link>
	<description>&lt;p&gt;&lt;img src=&quot;http://wisdump.com/wp-content/uploads/2007/11/rand1.jpg&quot; alt=&quot;Rand Fishkin&quot;&gt;For my first post here, I wanted to introduce a new idea, an authority profile. I want to create a small database of people that help answer the question, &amp;#8220;who should I be following online?&amp;#8221;&lt;/p&gt;
&lt;p&gt;The first person on my list to talk about is Rand Fishkin. Who is Rand Fishkin? Well, first off &lt;a href=&quot;http://www.youtube.com/watch?v=EZssT0nwii0&quot;&gt;all the SEO girls want Rand Fishkin&lt;/a&gt;. Being a dude, I really can&amp;#8217;t say either way why that is, but I am pretty impressed with the site he has built. Rand is the CEO and Co-founder of SEOmoz, a site that includes a blog with over 10,000 RSS readers according to Feedburner. It was voted the best SEO blog in 2006 by Search Engine Journal, and has been mentioned in numerous high level places like USA Today, Washington Post, and Newsweek Magazine.&lt;/p&gt;
&lt;p&gt;The reason Rand is an authority is because of his mix of understanding of Finance, due to majoring in the subject, the web, from all his years of experience and bringing it all together. His articles on SEOmoz are some of my favorites, and the site is just a gold mine of information. You can find him at Search Engine Strategies &amp;#038; Pubcon conferences around the world, and of course on SEOmoz.&lt;/p&gt;

	&lt;h4&gt;Related reading:&lt;/h4&gt;
	&lt;ul class=&quot;st-related-posts&quot;&gt;
	&lt;li&gt;No related posts.&lt;/li&gt;
	&lt;/ul&gt;


&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/EmNrWZ7sxI0Dg8MkdyM0dwVtcfo/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/EmNrWZ7sxI0Dg8MkdyM0dwVtcfo/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/EmNrWZ7sxI0Dg8MkdyM0dwVtcfo/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/EmNrWZ7sxI0Dg8MkdyM0dwVtcfo/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Wisdump?a=prCY2EIp-rM:f28gL5MDNpM:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Wisdump?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Wisdump?a=prCY2EIp-rM:f28gL5MDNpM:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Wisdump?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Wisdump?a=prCY2EIp-rM:f28gL5MDNpM:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Wisdump?i=prCY2EIp-rM:f28gL5MDNpM:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Wisdump?a=prCY2EIp-rM:f28gL5MDNpM:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Wisdump?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Wisdump/~4/prCY2EIp-rM&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
	<pubDate>Wed, 14 Jul 2010 23:49:44 +0000</pubDate>
	<dc:creator>Josh Dunaway</dc:creator>
</item>
<item>
	<title>Microsoft - IEBlog: Caching Improvements in Internet Explorer 9</title>
	<guid>91d46819-8472-40ad-a661-2c78acb4018c:10038338</guid>
	<link>http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx</link>
	<description>&lt;p&gt;The network plays a crucial role in the overall performance of a web browser. The best way to improve network performance is to minimize the volume of network traffic by using HTTP compression and taking advantage of the browser cache.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve made a tremendous number of improvements to the way that Internet Explorer 9 caches content to ensure that as many resources as possible are loaded from the cache. This post describes those improvements which are now available in the &lt;a href=&quot;http://www.ietestdrive.com/&quot;&gt;third IE9 Platform Preview&lt;/a&gt; which was &lt;a href=&quot;http://blogs.msdn.com/b/ie/archive/2010/06/23/html5-native-third-ie9-platform-preview-available-for-developers.aspx&quot;&gt;released last month&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Understanding Caching&lt;/h4&gt;
&lt;p&gt;Let&amp;rsquo;s start with a quick refresher on how &lt;a href=&quot;http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html&quot;&gt;caching&lt;/a&gt; works in browsers. At a high level, web browsers make two types of requests over HTTP and HTTPS&amp;mdash;&lt;i&gt;conditional requests &lt;/i&gt;and &lt;i&gt;unconditional requests&lt;/i&gt;. &lt;/p&gt;
&lt;p&gt;An unconditional request is made when the client browser does not have a cached copy of the resource available locally. In this case, the server is expected to return the resource with a &lt;b&gt;HTTP/200 OK&lt;/b&gt; response. If the response&amp;rsquo;s headers permit it, the client may cache this response in order to reuse it later. &lt;/p&gt;
&lt;p&gt;If the browser later needs a resource which is in the local cache, that resource&amp;rsquo;s headers are checked to determine if the cached copy is still &lt;i&gt;fresh&lt;/i&gt;. If the cached copy is fresh, then no network request is made and the client simply reuses the resource from the cache.&lt;/p&gt;
&lt;p&gt;If a cached response is stale (older than its &lt;b&gt;max-age&lt;/b&gt; or past the &lt;b&gt;Expires&lt;/b&gt; date), then the client will make a &lt;i&gt;conditional &lt;/i&gt;request to the server to determine whether the previously cached response is still valid and should be reused. The conditional request contains an &lt;b&gt;If-Modified-Since&lt;/b&gt; and/or &lt;b&gt;If-None-Match&lt;/b&gt; header that indicates to the server what version of the content the browser cache already contains. The server can indicate that the client&amp;rsquo;s version is still fresh by returning &lt;b&gt;HTTP/304 Not Modified&lt;/b&gt; headers with no body, or it can indicate that the client&amp;rsquo;s version is obsolete by returning a &lt;b&gt;HTTP/200 OK&lt;/b&gt; response with the new version of the content.&lt;/p&gt;
&lt;p&gt;Obviously, conditional requests result in better performance than unconditional requests (because the server need not retransmit the entire file if the client&amp;rsquo;s version is fresh) but the best performance is obtained when the client knows that the version in its cache is fresh and the conditional revalidation can be avoided entirely.&lt;/p&gt;
&lt;h4&gt;Extremely Long-Life Cache Headers&lt;/h4&gt;
&lt;p&gt;While RFC2616 recommends that servers limit freshness to one year, some servers send Cache-Control directives specifying a much longer freshness lifetime. &lt;a href=&quot;http://blogs.msdn.com/b/ieinternals/archive/2010/01/26/use-max-age-values-less-than-maxint.aspx&quot;&gt;Prior to IE9&lt;/a&gt;, Internet Explorer would treat as stale any resource with a &lt;b&gt;Cache-Control: max-age&lt;/b&gt; value over 2147483648 (2^31) seconds, approximately 68 years. &lt;/p&gt;
&lt;p&gt;With Internet Explorer 9, we now accept any value up to 2^63 for the max-age value, although internally the freshness interval will be truncated to 2^31 seconds.&lt;/p&gt;
&lt;h4&gt;Vary Improvements&lt;/h4&gt;
&lt;p&gt;The HTTP/1.1 &lt;b&gt;Vary&lt;/b&gt; response header allows a server to specify that a fresh cached resource is valid for future reuse without server revalidation &lt;i&gt;only &lt;/i&gt;if the specified request headers in the later request match the request headers in the original request. &lt;/p&gt;
&lt;p&gt;For example, this enables a server to return content in English with a &lt;b&gt;Vary: Accept-Language&lt;/b&gt; header. If the user later changes their browser&amp;rsquo;s &lt;b&gt;Accept-Language&lt;/b&gt; from &lt;b&gt;en-US&lt;/b&gt; to &lt;b&gt;ja-JP&lt;/b&gt;, the previously cached content will not be reused, because the Accept-Language request header no longer matches the request header at the time that the original English response was cached. &lt;/p&gt;
&lt;p&gt;With Internet Explorer 9, we&amp;rsquo;ve enhanced support for key Vary header scenarios. Specifically, IE9 will no longer require server revalidation for responses which contain &lt;b&gt;Vary: Accept-Encoding &lt;/b&gt;and &lt;b&gt;Vary: Host &lt;/b&gt;directives.&lt;/p&gt;
&lt;p&gt;We can safely support these two directives because:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;All requests implicitly vary by Host, because the host is a component of the request URL.&lt;/li&gt;
&lt;li&gt;IE always decompresses HTTP responses in the cache, making &lt;b&gt;Vary: Accept-Encoding&lt;/b&gt; redundant. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Like IE6 and above, IE9 will also ignore the &lt;b&gt;Vary: User-Agent&lt;/b&gt; directive.&lt;/p&gt;
&lt;p&gt;If a response contains a Vary directive that specifies a header other than &lt;b&gt;Accept-Encoding&lt;/b&gt;, &lt;b&gt;Host&lt;/b&gt;, or &lt;b&gt;User-Agent&lt;/b&gt; (or any combination of these) then Internet Explorer will still cache the response &lt;i&gt;if &lt;/i&gt;the response contains an ETAG header. However, that response will be treated as stale and a conditional HTTP request will be made before reuse to determine if the cached copy is valid.&lt;/p&gt;
&lt;h4&gt;Redirect Caching&lt;/h4&gt;
&lt;p&gt;Internet Explorer 9 now supports caching of HTTP redirect responses, as described by RFC 2616. Responses with Permanent Redirect status (301) are cacheable unless there are headers which forbid it (e.g. &lt;b&gt;Cache-Control: no-cache&lt;/b&gt;) and those with Temporary Redirect status (&lt;b&gt;302&lt;/b&gt; or &lt;b&gt;307&lt;/b&gt;) are cacheable if there are headers which permit it (e.g.&lt;b&gt; Cache-Control: max-age=120&lt;/b&gt;).&lt;/p&gt;
&lt;p&gt;While this significantly improves performance, web applications that are misconfigured might not work as expected after this change. For example, we&amp;rsquo;ve found a few commonly-visited sites that use a pattern which looks like this:&lt;/p&gt;
&lt;blockquote&gt;&lt;code&gt;
&lt;pre&gt;&amp;gt; GET / HTTP/1.1 
&amp;lt; 301 Redirect to /SetCookie.asp

&amp;gt; GET /SetCookie.asp HTTP/1.1 
&amp;lt; 301 Redirect to /&lt;/pre&gt;
&lt;/code&gt;&lt;/blockquote&gt;
&lt;p&gt;The site&amp;rsquo;s goal is to have the homepage determine if the user has a cookie set, and if not, send them to a page that sets the cookie. The problem is that the server has chosen a 301 for this task, and a 301 is cacheable. Hence, IE will simply redirect between these two cached redirects on the client (never again contacting the server) until the user gets bored and closes the browser. Notably, any version of IE would hit a redirect loop in the scenario above if the user had disabled cookie storage for the site in question.&lt;/p&gt;
&lt;p&gt;If your site makes use of redirects, you should ensure that it is configured to avoid redirect loops by ensuring that any redirect that relies upon side-effects (e.g. testing or setting a cookie) is marked uncacheable.&lt;/p&gt;
&lt;h4&gt;HTTPS Caching Improvements&lt;/h4&gt;
&lt;p&gt;A few months ago, &lt;a href=&quot;http://blogs.msdn.com/b/ieinternals/archive/2010/04/21/internet-explorer-may-bypass-cache-for-cross-domain-https-content.aspx&quot;&gt;I mentioned&lt;/a&gt; that Internet Explorer will not reuse a previously-cached resource delivered over HTTPS until at least one secure connection to the target host has been established by the current process. This can cause previously-cached resources to be ignored, leading to unconditional network requests for content that was already in the local cache. &lt;/p&gt;
&lt;p&gt;In IE9, the unnecessary cross-host HTTPS requests are now conditional requests, so the server can simply return a &lt;b&gt;HTTP/304 Not Modified&lt;/b&gt; response for unchanged content. While a round-trip cost is still incurred, significant performance improvements are gained because the server does not need to retransmit the entire resource.&lt;/p&gt;
&lt;h4&gt;Back/Forward Optimization&lt;/h4&gt;
&lt;p&gt;For IE9, we&amp;rsquo;ve made improvements so that clicking the back and forward buttons results in faster performance. &lt;/p&gt;
&lt;p&gt;RFC2616 specifically states that a browser&amp;rsquo;s Back/Forward mechanisms are not subject to cache directives:&lt;/p&gt;
&lt;blockquote&gt;&lt;code&gt;
&lt;pre&gt;History mechanisms and caches are different. In particular history
mechanisms SHOULD NOT try to show a semantically transparent view of
the current state of a resource. Rather, a history mechanism is meant
to show exactly what the user saw at the time when the resource was
retrieved.

By default, an expiration time does not apply to history mechanisms.
If the entity is still in storage, a history mechanism SHOULD display
it even if the entity has expired, unless the user has specifically
configured the agent to refresh expired history documents.&lt;/pre&gt;
&lt;/code&gt;&lt;/blockquote&gt;
&lt;p&gt;In previous versions of Internet Explorer, when the user navigated back or forward, IE would check the freshness of resources if they had been sent with the &lt;b&gt;must-revalidate&lt;/b&gt; cache-control directive, and in numerous other circumstances depending on how recently the resource was downloaded. In IE9, the &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa383661(VS.85).aspx&quot;&gt;INTERNET_FLAG_FWD_BACK&lt;/a&gt; flag behaves as described on MSDN, and IE will not check the freshness of cached resources when the user navigates Back or Forward.&lt;/p&gt;
&lt;p&gt;As a result of this optimization, Internet Explorer 9 can perform far fewer conditional HTTP requests when navigating with Back and Forward. For example, the following table shows the improvement when going Back to a typical article on a popular website:&lt;/p&gt;
&lt;blockquote&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;157&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;150&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;b&gt;IE8&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;150&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;b&gt;IE9&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;204&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;b&gt;Improvement&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;157&quot;&gt;
&lt;p&gt;&lt;b&gt;Back/Forward Navigation&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;150&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Request Count: 21&lt;/p&gt;
&lt;p&gt;Bytes Sent: 12,475&lt;/p&gt;
&lt;p&gt;Bytes Recv: 216,580&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;150&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Request Count: 1&lt;/p&gt;
&lt;p&gt;Bytes Sent: 325&lt;/p&gt;
&lt;p&gt;Bytes Recv: 144,617&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;204&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Request Count: -20 &lt;b&gt;(-95%)&lt;/b&gt; &lt;/p&gt;
&lt;p&gt;Bytes Sent: -12,150 &lt;b&gt;(-97.4%)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Bytes Recv:-71,963 &lt;b&gt;(-33.3%)&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now, I mentioned that we ignore caching directives when navigating back and forward, so alert readers may be wondering why IE9 still makes one request when clicking Back on this site. The reason is that IE will not commit to the cache any uncacheable resource. An uncacheable resource is one delivered with a &lt;b&gt;Cache-Control: no-cache&lt;/b&gt; directive or with an &lt;b&gt;Expires&lt;/b&gt; date in the past or an Expires date not later than the &lt;b&gt;Date&lt;/b&gt; header. Therefore, the browser is forced to redownload such resources when the user navigates Back and Forward. To improve performance and enable a resource to be reused in Back/Forward navigation while still requiring revalidation for other uses, simply replace &lt;b&gt;Cache-Control: no-cache&lt;/b&gt; with &lt;b&gt;Cache-Control: max-age=0&lt;/b&gt;. &lt;/p&gt;
&lt;p&gt;Unlike the other improvements in described in this post, back/forward optimizations are not visible in the Platform Preview build because &lt;a href=&quot;http://ie.microsoft.com/testdrive/info/WhyNoBackButton/Default.html&quot;&gt;it does not have a back button&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Heuristic Cache Improvements&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://developer.yahoo.com/performance/rules.html&quot;&gt;Best practices&lt;/a&gt; recommend that web developers should specify an explicit expiration time for their content in order to ensure that the browser is able to reuse the content without making conditional HTTP requests to revalidate the content with the server. However, many sites deliver some content with no expiration information at all, relying upon the browser to use its own rules to judge the content&amp;rsquo;s freshness.&lt;/p&gt;
&lt;p&gt;Internet Explorer allows the user to configure what should happen when content is delivered without expiration information. Inside Tools &amp;gt; Internet Options &amp;gt; Browsing history &amp;gt; Settings, you will see four options:&lt;/p&gt;
&lt;blockquote&gt;&lt;img src=&quot;http://ieblog.members.winisp.net/images/EricLaw_CachePerfImprovements_1.png&quot;&gt; &lt;/blockquote&gt;
&lt;p&gt;These four options have the following behavior: &lt;/p&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;215&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Every time I visit the webpage&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;618&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Any resource without explicit freshness information is treated as stale and will be revalidated with the server before each reuse.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;215&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Every time I start Internet Explorer&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;618&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Any resource without explicit freshness information is validated with the server at least once per browser session (and every 12 hours thereafter in that session).&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;215&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Automatically (Default)&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;618&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Internet Explorer will use heuristics to determine freshness.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;215&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Never&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;618&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Any cached resource will be treated as fresh and will not be revalidated.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These options &lt;i&gt;only &lt;/i&gt;control the browser&amp;rsquo;s behavior when content is delivered without expiration information; if the content specifies an explicit policy (e.g. &lt;b&gt;Cache-Control: max-age=3600&lt;/b&gt; or &lt;b&gt;Cache-Control: no-cache&lt;/b&gt;) then the browser will respect the server&amp;rsquo;s directive and the options here have no effect.&lt;/p&gt;
&lt;p&gt;In earlier IE versions, the Automatic Heuristics were simple and &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb250442.aspx&quot;&gt;only affected cached images&lt;/a&gt;, but IE9 improves the heuristics to match RFC2616&amp;rsquo;s suggested behavior:&lt;/p&gt;
&lt;blockquote&gt;&lt;code&gt;
&lt;pre&gt;if the response does have a Last-Modified time, the heuristic
expiration value SHOULD be no more than some fraction of the interval
since that time. A typical setting of this fraction might be 10%.&lt;/pre&gt;
&lt;/code&gt;&lt;/blockquote&gt;
&lt;p&gt;If Internet Explorer 9 retrieves a cacheable resource which does not explicitly specify its freshness lifetime, a heuristic lifetime is calculated as follows:&lt;/p&gt;
&lt;blockquote&gt;max-age = (DownloadTime - LastModified) * 0.1&lt;/blockquote&gt;
&lt;p&gt;If a Last-Modified header wasn&amp;rsquo;t present in the server&amp;rsquo;s response, then Internet Explorer will fall back to the &amp;ldquo;Once per browser session&amp;rdquo; revalidation behavior.&lt;/p&gt;
&lt;p&gt;As a result of the improvement to heuristic caching, Internet Explorer 9 can perform far fewer conditional HTTP requests when reloading many pages. For example, the following table shows the improvement when revisiting a typical article on a popular website: &lt;/p&gt;
&lt;blockquote&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;157&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;150&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;b&gt;IE8&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;150&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;b&gt;IE9&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;204&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;b&gt;Improvement&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;157&quot;&gt;
&lt;p&gt;&lt;b&gt;Revisit in new browser session (PLT2)&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;150&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Request Count: 42&lt;/p&gt;
&lt;p&gt;Bytes Sent: 26,050&lt;/p&gt;
&lt;p&gt;Bytes Recv: 220,681&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;150&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Request Count: 2&lt;/p&gt;
&lt;p&gt;Bytes Sent: 1,134&lt;/p&gt;
&lt;p&gt;Bytes Recv: 145,217&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;204&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Request Count: -40
&lt;div&gt;&lt;b&gt;(-95.3%) &lt;/b&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;b&gt;
&lt;p&gt;Bytes Sent: -24,916 &lt;b&gt;(-95.6%)&lt;/b&gt; &lt;/p&gt;
&lt;/b&gt;
&lt;p&gt;Bytes Recv: -75,464&lt;b&gt;(-34.2%)&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Caching Inspector in &lt;a href=&quot;http://www.fiddler2.com/&quot;&gt;Fiddler&lt;/a&gt; will show you when a response expires, based on the headers provided on that response. For instance, here&amp;rsquo;s what you see for a response which contains an ETAG and Last-Modified header, but no expiration information:&lt;/p&gt;
&lt;blockquote&gt;&lt;img src=&quot;http://ieblog.members.winisp.net/images/EricLaw_CachePerfImprovements_2.png&quot;&gt; &lt;/blockquote&gt;
&lt;h4&gt;Other Networking Improvements&lt;/h4&gt;
&lt;p&gt;In this post, I&amp;rsquo;ve enumerated the improvements in Internet Explorer&amp;rsquo;s caching code that help ensure web sites can make the most efficient possible use of the network. Of course, web developers should continue to follow best practices and specify their desired cache behavior using the Expires and Cache-Control headers, but even sites that fail to do so will load more quickly in IE9. &lt;/p&gt;
&lt;p&gt;In a future post, I&amp;rsquo;ll describe other improvements we&amp;rsquo;ve made to the IE9 Networking Stack to further improve page load times.&lt;/p&gt;
&lt;p&gt;-Eric Lawrence&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;img src=&quot;http://blogs.msdn.com/aggbug.aspx?PostID=10038338&quot; width=&quot;1&quot; height=&quot;1&quot;&gt;</description>
	<pubDate>Wed, 14 Jul 2010 23:26:00 +0000</pubDate>
	<dc:creator>ieblog</dc:creator>
</item>
<item>
	<title>ajaxian: Synthetic Event Library Syn Aims to Make Testing Easier</title>
	<guid>http://ajaxian.com/?p=9812</guid>
	<link>http://feedproxy.google.com/~r/ajaxian/~3/Uah-jk56_FU/synthetic-event-library-syn-aims-to-make-testing-easier</link>
	<description>&lt;p&gt;The team at &lt;a href=&quot;http://jupiterjs.com/&quot;&gt;Jupiter IT&lt;/a&gt; have release &lt;a href=&quot;http://jupiterjs.com/#news/syn-a-standalone-synthetic-event-library&quot;&gt;Syn&lt;/a&gt;, a library which allows you to create synthetic events for use in testing. This standalone library is meant to assist in testing complex UI behavior by simulating user actions such as typing, clicking, dragging the mouse.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Testing rich, dynamic web applications sucks. At Jupiter, we've tried almost every testing solution available (qUnit, Quick Test Pro, Selenium, JsUnit, Env.js, TestCase) and all of them suffer from some fatal flaw. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problems:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manual - A tester has to run the tests manually on every supported browser. &amp;nbsp;People are lazy.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Unit Tests Only - We need to test the app as a whole and complex UI behavior like drag-drop.&lt;/li&gt;
&lt;li&gt;Low fidelity - We need to make sure the tests are reporting accurate results.&lt;/li&gt;
&lt;li&gt;Difficult to write - We sling JS like a ninja monkey throws poo. &amp;nbsp;We want to write tests in a nice JS API.&lt;/li&gt;
&lt;li&gt;Expensive - A QTP license is 5k a person! &amp;nbsp;I'd rather buy a vacation.&lt;/li&gt;
&lt;li&gt;Support - We want to test Mac and Linux browsers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We've solved all of these problems in our upcoming FuncUnit testing framework. It's a mashup of qUnit, Selenium, Rhino, and Env.js. But its core library, Syn, which does the work of simulating user actions with very high fidelity, is what we are releasing today.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So by using code like this:&lt;/p&gt;
&lt;div class=&quot;igBar&quot;&gt;&lt;a href=&quot;javascript:showCodeTxt('javascript-10');&quot;&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;syntax_hilite&quot;&gt;&lt;span&gt;JAVASCRIPT:&lt;/span&gt;
&lt;div id=&quot;javascript-10&quot;&gt;
&lt;div class=&quot;javascript&quot;&gt;
Syn.&lt;span&gt;click&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;,&lt;span&gt;'hello'&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp;.&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;'Hello World'&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp;.&lt;span&gt;drag&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt; $&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'#trash'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;; &lt;br&gt;
&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;you can simulate clicking an element with id='hello', typing &quot;Hello World&quot;, and then dragging your mouse from that element to an element with id='trash'.&lt;/p&gt;
&lt;p&gt;Pretty cool stuff. Check out their &lt;a href=&quot;http://v3.javascriptmvc.com/funcunit/synthetic/synthetic.html&quot;&gt;demo to see how playback occurs&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=Uah-jk56_FU:Hyb2_GYqJmw:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=Uah-jk56_FU:Hyb2_GYqJmw:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=Uah-jk56_FU:Hyb2_GYqJmw:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?i=Uah-jk56_FU:Hyb2_GYqJmw:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Wed, 14 Jul 2010 16:54:17 +0000</pubDate>
	<dc:creator>Rey Bango</dc:creator>
</item>
<item>
	<title>Eric Meyer: Events Sold Out and Coming Up</title>
	<guid>http://meyerweb.com/eric/thoughts/?p=1380</guid>
	<link>http://meyerweb.com/eric/thoughts/2010/07/13/events-sold-out-and-coming-up/</link>
	<description>&lt;p&gt;
Just before noon (Eastern U.S. time) today, &lt;a href=&quot;http://aneventapart.com/2010/minneapolis/&quot;&gt;An Event Apart Minneapolis&lt;/a&gt; sold its last available seat.  That&amp;#8217;s three events so far in 2010 and three sell-outs.  If you were hoping to join us in Minneapolis but hadn&amp;#8217;t registered yet, we&amp;#8217;re sorry we won&amp;#8217;t see you there!  You can &lt;a href=&quot;http://aneventapart.com/contact/&quot;&gt;contact our Event Manager&lt;/a&gt; to get put on the waiting list, or you can join us for one of the remaining two shows of the year: &lt;a href=&quot;http://aneventapart.com/2010/dc/&quot;&gt;Washington DC&lt;/a&gt; and &lt;a href=&quot;http://aneventapart.com/2010/sandiego/&quot;&gt;San Diego&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
There are strong reasons to prefer either one.  In &lt;a href=&quot;http://aneventapart.com/2010/dc/&quot;&gt;Washington DC&lt;/a&gt;, we&amp;#8217;ll have our second-ever &lt;a href=&quot;http://aneventapart.com/2010/dc/#dayapart&quot;&gt;A Day Apart&lt;/a&gt;, a full day of in-depth learning with &lt;a href=&quot;http://adactio.com/&quot; rel=&quot;&quot;&gt;Jeremy Keith&lt;/a&gt; and &lt;a href=&quot;http://unstoppablerobotninja.com/&quot; rel=&quot;friend colleague met&quot;&gt;Ethan Marcotte&lt;/a&gt; taking on the topics of HTML5 and CSS3, respectively.  We ran A Day Apart in Seattle earlier this year as something of an experiment, and it was such a huge hit that we immediately decided to add it to a future show.  We settled on Washington DC for a variety of reasons, not least of which was that the hotel had the space available to add a third day.  So far as we know it&amp;#8217;s the last time we&amp;#8217;ll do A Day Apart in 2010, so if you&amp;#8217;re interested, it&amp;#8217;s the place to be.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://aneventapart.com/2010/sandiego/&quot;&gt;San Diego&lt;/a&gt;, on the other hand&amp;#8230; well, it&amp;#8217;s San Diego!  In November!  It&amp;#8217;s also the last chance to see our 2010 lineup of speakers, who&amp;#8217;ve been consistently hitting it out of the park with insightful thinking and bold challenges to the status quo.  We may never again see this particular combination of pure smarts and talent, so if you can&amp;#8217;t make it to DC (or you&amp;#8217;d rather just hit the beach in advance of Thanksgiving) then come on down.
&lt;/p&gt;
&lt;p&gt;
From mobile design to advanced CSS to the latest in HTML5 to smart content to wonderful design, the sessions at AEA this year have been outstanding.  The audience feedback has been really incredible, almost overwhelming.  If you haven&amp;#8217;t seen this year&amp;#8217;s lineup, you should really consider checking it out.  We&amp;#8217;d love to see you there!
&lt;/p&gt;
&lt;p&gt;
(P.S. Want to hear more about An Event Apart&amp;#8217;s origin story, growth, vision, and future?  Tune in to &lt;a href=&quot;http://5by5.tv/bigwebshow&quot;&gt;The Big Web Show&lt;/a&gt; this Thursday at 1pm Eastern U.S.!  I&amp;#8217;ll be a guest along with Andy McMillan&amp;#8212;he of the fabulous &lt;a href=&quot;http://buildconf.com/&quot;&gt;Build Conference&lt;/a&gt; of Belfast&amp;#8212;talking about web conferences and more.  And if you miss the live show, don&amp;#8217;t worry; there will be a lovingly edited version up shortly after we&amp;#8217;re done taping.)
&lt;/p&gt;</description>
	<pubDate>Tue, 13 Jul 2010 19:20:52 +0000</pubDate>
	<dc:creator>Eric Meyer</dc:creator>
</item>
<item>
	<title>ajaxian: An alternative way to addEventListener</title>
	<guid>http://ajaxian.com/?p=9769</guid>
	<link>http://feedproxy.google.com/~r/ajaxian/~3/BZC9NQqE_n4/an-alternative-way-to-addeventlistener</link>
	<description>&lt;blockquote&gt;&lt;p&gt;I can't believe none of us knew DOM2&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This is how a tweet from &lt;a href=&quot;http://twitter.com/SubtleGradient/status/18388549003&quot;&gt;@SubtleGradient&lt;/a&gt;, re-tweeted by &lt;a href=&quot;http://twitter.com/jdalton/status/18380831635&quot;&gt;@jdalton&lt;/a&gt;, has been able to steal my rest tonight ... and this post is the consequence ...&lt;/p&gt;
&lt;h3&gt;What's new in a nutshell&lt;/h3&gt;
&lt;p&gt;There is a &lt;a href=&quot;http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration&quot;&gt;W3C Recommendation&lt;/a&gt; about addEventListener behavior, which clearly specify the second argument as an &lt;a href=&quot;http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventListener&quot;&gt;EventListener&lt;/a&gt;.&lt;br&gt;
The new part is that no library I know has ever used a proper EventListener interface, preferring the classic attached callback instead.&lt;/p&gt;
&lt;div class=&quot;igBar&quot;&gt;&lt;a href=&quot;javascript:showCodeTxt('javascript-16');&quot;&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;syntax_hilite&quot;&gt;&lt;span&gt;JAVASCRIPT:&lt;/span&gt;
&lt;div id=&quot;javascript-16&quot;&gt;
&lt;div class=&quot;javascript&quot;&gt;
&lt;p&gt;&lt;span&gt;// this is how it is&lt;/span&gt;&lt;br&gt;
document.&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&quot;click&quot;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;evt&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;/* stuff */&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;false&lt;/span&gt;&lt;br&gt;
&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&lt;span&gt;// this is how it could be as well&lt;/span&gt;&lt;br&gt;
&lt;span&gt;var&lt;/span&gt; listener = &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; handleEvent: &lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;evt&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;this&lt;/span&gt; === listener; &lt;span&gt;// true&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// and evt === classic event object&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&lt;br&gt;
document.&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&quot;click&quot;&lt;/span&gt;, listener, &lt;span&gt;false&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;Benefits&lt;/h3&gt;
&lt;p&gt;The most common case that may disappear is well explained in this &lt;a href=&quot;https://developer.mozilla.org/en/DOM/element.addEventListener#Memory_issues&quot;&gt;MDC addEventListener page&lt;/a&gt;.&lt;br&gt;
Rather than bind inline or add anonymous functions to make our object call context preserved, we can simply add an &lt;em&gt;handleEvent&lt;/em&gt; method to whatever object and pass it as EventListener.&lt;br&gt;
Moreover, being close to full ES5 support and &lt;em&gt;&quot;use strict&quot;&lt;/em&gt; directive where &lt;em&gt;arguments.callee&lt;/em&gt; disappears, it may be more than handy to be able to perform such operation:&lt;/p&gt;
&lt;div class=&quot;igBar&quot;&gt;&lt;a href=&quot;javascript:showCodeTxt('javascript-17');&quot;&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;syntax_hilite&quot;&gt;&lt;span&gt;JAVASCRIPT:&lt;/span&gt;
&lt;div id=&quot;javascript-17&quot;&gt;
&lt;div class=&quot;javascript&quot;&gt;
document.&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&quot;click&quot;&lt;/span&gt;, &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; handleEvent: &lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;evt&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// 1 shot callback event example&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;switch&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;evt.&lt;span&gt;target&lt;/span&gt;.&lt;span&gt;nodeType&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;case&lt;/span&gt; &lt;span&gt;1&lt;/span&gt;:&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;case&lt;/span&gt; &lt;span&gt;9&lt;/span&gt;:&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; evt.&lt;span&gt;target&lt;/span&gt;.&lt;span&gt;removeEventListener&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; evt.&lt;span&gt;type&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;this&lt;/span&gt;, &lt;span&gt;// here we are!&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;false&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;break&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;, &lt;span&gt;false&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;An opened door for custom listeners&lt;/h3&gt;
&lt;p&gt;As I have recently posted, custom listeners implementation can be truly handy when we are dealing with &lt;a href=&quot;http://webreflection.blogspot.com/2010/05/event-driven-application-and-most-basic.html&quot;&gt;events driven applications&lt;/a&gt;, but as soon as I have read the tweet, I had to rewrite a fresh new way to create a listener. Please note that following code is assuming that the browser supports both DOM Level 2 and Array extras, which is true for all modern browsers, mobile oriented included.&lt;/p&gt;
&lt;div class=&quot;igBar&quot;&gt;&lt;a href=&quot;javascript:showCodeTxt('javascript-18');&quot;&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;syntax_hilite&quot;&gt;&lt;span&gt;JAVASCRIPT:&lt;/span&gt;
&lt;div id=&quot;javascript-18&quot;&gt;
&lt;div class=&quot;javascript&quot;&gt;
&lt;span&gt;function&lt;/span&gt; createEventListener&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;/*! Andrea Giammarchi for Ajaxian - Mit Style */&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;// a function declaration reused internally&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;function&lt;/span&gt; notifyEvent&lt;span&gt;&amp;#40;&lt;/span&gt;callback, i, stack&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// use DOM Level 0 events strategy&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;//&amp;nbsp; to stop the loop if necessary&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// checking if the result is exactly false&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;callback.&lt;span&gt;call&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// the curent object as context&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;this&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// the classic event as first argument&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; event,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// the called callback (life easier)&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// again the current context&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// if the callback has been bound&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;this&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#41;&lt;/span&gt; === &lt;span&gt;false&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// if false, reassign the current stack ...&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; eventListener&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;&quot;@&quot;&lt;/span&gt;+event.&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; = stack.&lt;span&gt;slice&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// ... and break the current forEach loop&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// (or, for the record, whatever Array.extras)&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stack.&lt;span&gt;length&lt;/span&gt; = &lt;span&gt;0&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;var&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// local scoped object, reachable internally&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// usable as mixin so instances won't be polluted&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// with all possible event types&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// the type is prefixed in any case&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// so that name clashes should be&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// really rare however we use the object&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; eventListener = &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// we attach to a proper stack&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addEvent: &lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;type, callback&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;var&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// try to retrieve the stack ...&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stack = &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// if already there ...&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; eventListener&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;&quot;@&quot;&lt;/span&gt; + type&lt;span&gt;&amp;#93;&lt;/span&gt; ||&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// otherwise we create it once&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#40;&lt;/span&gt;eventListener&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;&quot;@&quot;&lt;/span&gt; + type&lt;span&gt;&amp;#93;&lt;/span&gt; = &lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// as addEventListener, don't attach&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// the same event twice&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i = stack.&lt;span&gt;indexOf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;callback&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// so if it was not there ...&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;-&lt;span&gt;1&lt;/span&gt; === i&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// FIFO order via stack&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stack.&lt;span&gt;push&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;callback&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;,&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// called via addEventListener&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// the &quot;this&quot; reference will be&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// the eventListener object,&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// or the current instance&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// if used as &quot;class&quot; mixin&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// or via Object.create / clone / merge&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; handleEvent: &lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;e&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// retrieve the stack&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;var&lt;/span&gt; stack = eventListener&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;&quot;@&quot;&lt;/span&gt; + e.&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// and if present ...&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;stack&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// set temporarily the local event var&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; event = e;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// notify all registered callbacks&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// using current this reference&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// as forEach context&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stack.&lt;span&gt;forEach&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;notifyEvent, &lt;span&gt;this&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// let the GC handle the memory later&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; event = &lt;span&gt;null&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;,&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// how we remove the event, if any ...&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; removeEvent: &lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;type, callback&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;var&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// try to retrieve the stack ...&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stack = eventListener&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;&quot;@&quot;&lt;/span&gt; + type&lt;span&gt;&amp;#93;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// find the index ...&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// if the stack is present&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;stack &amp;amp;&amp;amp; ~&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i = stack.&lt;span&gt;indexOf&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;callback&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// remove it&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stack.&lt;span&gt;splice&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;i, &lt;span&gt;1&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;,&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// I could have called this variable tmp&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// but it's actually the current event&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// once assigned ... so ...&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; event&lt;br&gt;
&amp;nbsp; &amp;nbsp; ;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;// ready to go!&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; eventListener;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here a usage example:&lt;/p&gt;
&lt;div class=&quot;igBar&quot;&gt;&lt;a href=&quot;javascript:showCodeTxt('javascript-19');&quot;&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;syntax_hilite&quot;&gt;&lt;span&gt;JAVASCRIPT:&lt;/span&gt;
&lt;div id=&quot;javascript-19&quot;&gt;
&lt;div class=&quot;javascript&quot;&gt;
&lt;span&gt;var&lt;/span&gt; lst = createEventListener&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;/** mixin example (add a slash before this line to test)&lt;/p&gt;
&lt;p&gt;function MyEventListener() {}&lt;br&gt;
MyEventListener.prototype.addEvent = lst.addEvent;&lt;br&gt;
MyEventListener.prototype.handleEvent = lst.handleEvent;&lt;br&gt;
MyEventListener.prototype.removeEvent = lst.removeEvent;&lt;/p&gt;
&lt;p&gt;lst = new MyEventListener;&lt;/p&gt;
&lt;p&gt;// */&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;document.&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&quot;click&quot;&lt;/span&gt;, lst, &lt;span&gt;false&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/p&gt;
&lt;p&gt;lst.&lt;span&gt;addEvent&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&quot;click&quot;&lt;/span&gt;, &lt;span&gt;function&lt;/span&gt; click&lt;span&gt;&amp;#40;&lt;/span&gt;e, callback, object&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#123;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;alert&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback === click, &lt;span&gt;// true&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;this&lt;/span&gt; === lst,&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;// true&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;this&lt;/span&gt; === object,&amp;nbsp; &amp;nbsp; &lt;span&gt;// true&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; e.&lt;span&gt;type&lt;/span&gt; === &lt;span&gt;&quot;click&quot;&lt;/span&gt;&amp;nbsp; &lt;span&gt;// true&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;// test that furthermore this&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// callback won't be fired again&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;removeEvent&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&quot;click&quot;&lt;/span&gt;, callback&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;// add delayed a callback&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// without any valid reason :-)&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; setTimeout&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;self&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// test addEvent again&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.&lt;span&gt;addEvent&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&quot;click&quot;&lt;/span&gt;, &lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;alert&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;, &lt;span&gt;0&lt;/span&gt;, &lt;span&gt;this&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;// block the current notification&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;;&lt;br&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;// the event fired only the second click&lt;/span&gt;&lt;br&gt;
lst.&lt;span&gt;addEvent&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&quot;click&quot;&lt;/span&gt;, &lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;alert&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;/** de-comment the mixin example to test&lt;br&gt;
//&amp;nbsp; &amp;nbsp;that no @click is attached ;-)&lt;br&gt;
for (var key in lst) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; alert(key);&lt;br&gt;
}&lt;br&gt;
// */&lt;/span&gt;&lt;br&gt;
&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;Advantages&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;both &lt;em&gt;evt.stopPropagation()&lt;/em&gt; and &lt;em&gt;evt.preventDefault()&lt;/em&gt; are not able to break the current notification of all attached listeners, if added to the same node, and while the &lt;acronym title=&quot;First In, First Out&quot;&gt;FIFO&lt;/acronym&gt; order gives to the node &quot;owner&quot; or creator the ability to pollute the event object with some flag such &lt;em&gt;evt.pleaseDontDoAnyOtherActionHere = true&lt;/em&gt;, not every library, script, or framework, may respect or understand this flag. With custom events we can adopt better strategies to actually avoid any other operation if this is what we meant, because we arrived before over the node and we may like to be that privileged&lt;/li&gt;
&lt;li&gt;being custom, we can also decide which argument should be passed for each callback, simplifying most common problems we may have when dealing with listeners&lt;/li&gt;
&lt;li&gt;we can better decouple DOM and listeners, being able to remove whatever amount of callbacks simply calling once &lt;em&gt;node.removeEventListener(evt.type, this, false);&lt;/em&gt; inside any kind of notification&lt;/li&gt;
&lt;li&gt;being based on standard and modern browsers, we can use native power, in this case provided by &lt;a href=&quot;https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/forEach&quot;&gt;forEach&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/indexOf&quot;&gt;indexOf&lt;/a&gt; operations, so that performances will be best possible&lt;/li&gt;
&lt;li&gt;thanks to automatic context injection, we can still reuse callbacks for different listeners, through bind, or simply considering the current context once called (or in this case the third argument by reference, if the context is different)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Last but not least, if we would like to fire an event we can bypass DOM initialization using handleEvent directly, e.g.&lt;/p&gt;
&lt;div class=&quot;igBar&quot;&gt;&lt;a href=&quot;javascript:showCodeTxt('javascript-20');&quot;&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;syntax_hilite&quot;&gt;&lt;span&gt;JAVASCRIPT:&lt;/span&gt;
&lt;div id=&quot;javascript-20&quot;&gt;
&lt;div class=&quot;javascript&quot;&gt;
lst.&lt;span&gt;handleEvent&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; target: document.&lt;span&gt;querySelector&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&quot;#myid&quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; type: &lt;span&gt;&quot;click&quot;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// custom properties&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; pageX: &lt;span&gt;0&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; pageY: &lt;span&gt;0&lt;/span&gt;,&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// stubbed methods&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; preventDefault: &lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; stopPropagation: &lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;Compatibility ?&lt;/h3&gt;
&lt;p&gt;Apparently both W3C behavior and provided examples are compatible with every modern browser with DOM Level 2 support, and I believe this is great.&lt;br&gt;
The only one behind here is IE9 pre 3, but again &lt;a href=&quot;http://twitter.com/jdalton/status/18391154901&quot;&gt;@jdalton has acted at speed light&lt;/a&gt;, thanks!&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=BZC9NQqE_n4:tmxa906u6pw:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=BZC9NQqE_n4:tmxa906u6pw:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=BZC9NQqE_n4:tmxa906u6pw:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?i=BZC9NQqE_n4:tmxa906u6pw:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Tue, 13 Jul 2010 13:00:42 +0000</pubDate>
	<dc:creator>webreflection</dc:creator>
</item>
<item>
	<title>ajaxian: Quilt: Stitching Your JavaScript Modules Together</title>
	<guid>http://ajaxian.com/?p=9758</guid>
	<link>http://feedproxy.google.com/~r/ajaxian/~3/hN2GIEPIBcU/quilt-stitching-your-javascript-modules-together</link>
	<description>&lt;p&gt;It floors me what young, talented developers are building these days. Kit Goncharov, who only recently turned 17, just cranked out &lt;a href=&quot;http://github.com/kitgoncharov/quilt&quot;&gt;Quilt, a JavaScript preprocessor written in JavaScript&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Quilt is very similar to the &lt;a href=&quot;http://getsprockets.org/&quot;&gt;Sprockets JS preprocessor&lt;/a&gt; in that it allows you to improve code organization by logically separating your code into multiple modules within their own specific directories. Instead of having one massive JavaScript file with all your source code in it (increasing the potential for errors and complications), you can break out your code into separate physical files and at build time, allow Quilt to roll it all up, line by line, into a single file, ready for deployment. Via support for directives, you can tell Quilt about dependencies to ensure your builds are structured the right way.&lt;/p&gt;
&lt;p&gt;In addition, if you use third-party frameworks in your code, Quilt allows you to specify a &quot;load path&quot; or &quot;search path&quot; which tells the preprocessor where to look for your specific lib. Then, when you build the final concatenated output, the library is included right in the source code.&lt;/p&gt;
&lt;p&gt;Although Quilt was heavily inspired by Sprockets, it does have several significant differences. Perhaps the most obvious is that it's written in pure JavaScript (as opposed to Ruby) and runs on Rhino. This means it's very portable and easy for JS developers to understand. Quilt also uses a slightly different syntax than Sprockets for including files (for instance, it allows single-quoted pathnames, and uses backticks instead of angle brackets for specifying third-party code), and can strip multi-line comments as well as single-line ones.&lt;/p&gt;
&lt;p&gt;As our client-side applications continue to grow, these types of solutions are becoming increasingly important for having a well-structured and maintainable codebase and it's great to see that the future development leaders are taking that into consideration. Be sure to check out &lt;a href=&quot;http://github.com/kitgoncharov/quilt&quot;&gt;Quilt&lt;/a&gt; along with &lt;a href=&quot;http://github.com/kitgoncharov&quot;&gt;Kit's other projects on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=hN2GIEPIBcU:-aKBQZoNnkU:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=hN2GIEPIBcU:-aKBQZoNnkU:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=hN2GIEPIBcU:-aKBQZoNnkU:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?i=hN2GIEPIBcU:-aKBQZoNnkU:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Tue, 13 Jul 2010 12:00:27 +0000</pubDate>
	<dc:creator>Rey Bango</dc:creator>
</item>
<item>
	<title>ajaxian: Strobe; A hot new HTML5-touch startup founded by Charles Jolley</title>
	<guid>http://ajaxian.com/?p=9755</guid>
	<link>http://feedproxy.google.com/~r/ajaxian/~3/4JFWSLX2-Ys/strobe-a-hot-new-html5-touch-startup-founded-by-charles-jolley</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://strobeapp.com/&quot;&gt;&lt;img src=&quot;http://ajaxian.com/wp-content/images/strobe.png&quot; alt=&quot;&quot; title=&quot;strobe&quot; width=&quot;382&quot; height=&quot;175&quot; class=&quot;alignnone size-full wp-image-9756&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Charles Jolley: &quot;I started working in SproutCore almost 5 years ago because I believe the future of software development lies in native-style apps in the web browser. It is the platform of the future and when that shift change happens, I want to be there with the technology. Now, I believe that time is almost finally upon us.  It's time to double down, and that is why I am leaving Apple.&quot;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Congrats to Charles as he starts a new adventure. At Apple, he lead the charge on the open source &lt;a href=&quot;http://sproutcore.com/&quot;&gt;SproutCore framework&lt;/a&gt; which powers Mobile Me and a bunch more.&lt;/p&gt;
&lt;p&gt;He recently showed off &lt;a href=&quot;http://ajaxian.com/archives/sproutcore-2010&quot;&gt;SproutCore Touch&lt;/a&gt; and with it a killer demo. Instead of just saying &quot;the Web can do as good a job as 'native' apps for some purposes&quot; he showed it. He and SproutCore folk were there with two iPads. One had the native iPad NPR app, and the other had a *week long* port to SproutCore Touch. The funny thing.... the touch version performed better and even had a nice hidden feature. If you are listening to NPR and go to another app, it kept playing! Who knew!&lt;/p&gt;
&lt;p&gt;For anyone wondering what the new company means for SproutCore, Charles makes it clear:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
First, SproutCore is now and will always be totally free and open source. I think this business of charging for a commercial license is not an effective way to grow a project. Sure you make a little cash, but at what expense to the community? My goal is to make SproutCore and all of the developer tools that surround it totally free to everyone. All I ask is that you participate in the community somehow to make things a little better for those who come after you.&lt;/p&gt;
&lt;p&gt;Second, now that I am no longer held back by big-company legal restrictions, I am going to be much more involved with the platform. Very soon I will post some new example code. Some others are working on new documentation and build tools to ease that pain as well. Starting this fall, my new company will also start to offer online and in person training and mentoring courses to your team get up to speed quickly.  We can also finally get started in that book.&lt;/p&gt;
&lt;p&gt;My goal is that by the end of the year, any average developer can pick up SproutCore, build, and deploy a basic app without feeling lost. This is open source and I can't usually guarantee timelines but at least now we can do what we need to make it happen.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;With Strobe he wants to revolutionize &quot;digital publishing&quot;. Put your thinking hats on to noodle on that one. One thing is for clear... it isn't just about making SproutCore Inc (as he discusses above).&lt;/p&gt;
&lt;p&gt;Congrats Charles!&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=4JFWSLX2-Ys:T6Bsl9DsAbI:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=4JFWSLX2-Ys:T6Bsl9DsAbI:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=4JFWSLX2-Ys:T6Bsl9DsAbI:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?i=4JFWSLX2-Ys:T6Bsl9DsAbI:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Mon, 12 Jul 2010 12:03:23 +0000</pubDate>
	<dc:creator>Dion Almaer</dc:creator>
</item>
<item>
	<title>Wisdump: My Design Process, from Sketch to ZIP</title>
	<guid>http://wisdump.com/design/my-design-process-from-sketch-to-zip/</guid>
	<link>http://www.wisdump.com/design/my-design-process-from-sketch-to-zip/</link>
	<description>&lt;p&gt;Today I&amp;#8217;ll just point you to a post over at &lt;a href=&quot;http://devlounge.net&quot;&gt;Devlounge&lt;/a&gt;, titled &lt;a href=&quot;http://www.devlounge.net/articles/my-design-process&quot;&gt;My Design Process&lt;/a&gt;, by yours truly. Basically, it&amp;#8217;s a five step walkthrough on how I tackle design projects, generally speaking.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;First, Consider the Problem&lt;/li&gt;
&lt;li&gt;Second, Bring Out the Sketchbook&lt;/li&gt;
&lt;li&gt;Third, Do that Mockup Thing&lt;/li&gt;
&lt;li&gt;Fourth, Time to Code&lt;/li&gt;
&lt;li&gt;Finally, Deliver and I'm Done&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;http://www.devlounge.net/articles/my-design-process&quot;&gt;Take a look.&lt;/a&gt; I&amp;#8217;m off to watch &lt;a href=&quot;http://alicecooper.com&quot;&gt;Alice Cooper&lt;/a&gt; hang himself.&lt;/p&gt;

	&lt;h4&gt;Related reading:&lt;/h4&gt;
	&lt;ul class=&quot;st-related-posts&quot;&gt;
	&lt;li&gt;No related posts.&lt;/li&gt;
	&lt;/ul&gt;


&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/adn-IypITuN5EDT3Z8r82JI_638/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/adn-IypITuN5EDT3Z8r82JI_638/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/adn-IypITuN5EDT3Z8r82JI_638/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/adn-IypITuN5EDT3Z8r82JI_638/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Wisdump?a=4UuumDB--G4:FhMWigMn2HE:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Wisdump?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Wisdump?a=4UuumDB--G4:FhMWigMn2HE:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Wisdump?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Wisdump?a=4UuumDB--G4:FhMWigMn2HE:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Wisdump?i=4UuumDB--G4:FhMWigMn2HE:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Wisdump?a=4UuumDB--G4:FhMWigMn2HE:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Wisdump?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Wisdump/~4/4UuumDB--G4&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;</description>
	<pubDate>Thu, 08 Jul 2010 15:22:09 +0000</pubDate>
	<dc:creator>Thord Daniel Hedengren</dc:creator>
</item>
<item>
	<title>Eric Meyer: Fixing Font Display in Thunderbird 3.1</title>
	<guid>http://meyerweb.com/eric/thoughts/?p=1364</guid>
	<link>http://meyerweb.com/eric/thoughts/2010/07/08/fixing-font-display-in-thunderbird-3-1/</link>
	<description>&lt;p&gt;
If you upgraded Thunderbird and discovered that the fonts used to display messages suddenly changed, and worse still, you were unable to get all messages to obey your font display settings, then this post is most likely for you.
&lt;/p&gt;
&lt;p&gt;
Here&amp;#8217;s what happened to me: I upgraded to Thunderbird 3.1, and suddenly all my messages were in a font I didn&amp;#8217;t recognize or appreciate.  I insist on seeing only the plain text version (technically, the &lt;tt&gt;text/plain&lt;/tt&gt; part) of all my e-mail; and what&amp;#8217;s more, that it be displayed in a monospace font.  Courier 13, in my case.
&lt;/p&gt;
&lt;p&gt;
So I made sure &amp;#8220;View &gt; Message Body As&amp;#8221; was still set to &amp;#8220;Plain Text&amp;#8221;, which it was.  Then I went into the preferences and messed around for a bit.  Eventually I set every font setting I could in &amp;#8220;Preferences&amp;#8230; &gt; Display &gt; Formatting &gt; Advanced&amp;#8230;&amp;#8221; to be Courier and have a size of 13, and also to make sure that &amp;#8220;Allow messages to use other fonts was &lt;em&gt;not&lt;/em&gt; checked.  All this was done, and Thunderbird relaunched to make sure the preferences stuck.  They did, and most of my mail was displayed as I intended.  And yet a number of messages, such as those generated by Basecamp, were still displaying in this new, thoroughly unwanted font.
&lt;/p&gt;
&lt;p class=&quot;standalone&quot;&gt;
&lt;img src=&quot;http://meyerweb.com/pix/2010/tb31-01.png&quot; alt=&quot;A screenshot showing that all the relevant preferences have been set over top of a mail message which clearly violates the preference settings by displaying the message in a different font and font size.&quot;&gt;
&lt;/p&gt;
&lt;p&gt;
At first I thought it was happening with any HTML mail, but after viewing source on a bunch of messages (using command-U, same as in any Gecko browser) that didn&amp;#8217;t seem to be true.  I Googled about and came across a post on &lt;a href=&quot;http://www.glazman.org/weblog/dotclear/index.php&quot;&gt;Daniel Glazman&amp;#8217;s blog&lt;/a&gt; which &lt;a href=&quot;http://www.glazman.org/weblog/dotclear/index.php?post/2010/06/25/Thunderbird-31&quot;&gt;decried the problem&lt;/a&gt; in terms very similar to those I&amp;#8217;d have used.  Unfortunately, all the comments on the post told me was that the interloping font is Menlo, that this was a deliberate decision by the Thunderbird team, and that they didn&amp;#8217;t seem to understand why anyone might be annoyed as hell to have their font settings changed out from under them with no apparent recourse.  What they didn&amp;#8217;t tell me was how to fix the problem.
&lt;/p&gt;
&lt;p&gt;
Eventually, I &lt;a href=&quot;https://twitter.com/meyerweb/status/17957964900&quot;&gt;tweeted a complaint&lt;/a&gt;&amp;#8212;you know, the way you do&amp;#8212;and &lt;a href=&quot;http://www.bryanwatson.ca/&quot;&gt;Bryan Watson&lt;/a&gt; got me &lt;a href=&quot;http://www.mozilla.org/support/thunderbird/edit#configeditor&quot;&gt;pointed in the right direction&lt;/a&gt;.  Something just told me that if I dug around in the hidden preferences, I&amp;#8217;d find what I needed.  So I went to &amp;#8220;Preferences&amp;#8230; &gt; Advanced &gt; Config Editor&amp;#8230;&amp;#8221; and searched for &amp;#8220;Menlo&amp;#8221;.  I got three hits, and it suddenly became clear what was happening:  Menlo was being used for Unicode-based mail.  Further, it would seem, the GUI options in &amp;#8220;Preferences&amp;#8230; &gt; Display &gt; Formatting&amp;#8221; don&amp;#8217;t affect the settings for Unicode mail.  For whatever reason.
&lt;/p&gt;
&lt;p class=&quot;standalone&quot;&gt;
&lt;img src=&quot;http://meyerweb.com/pix/2010/tb31-02.png&quot; alt=&quot;A screenshot of about:config (a.k.a. the Config Editor) showing the results of a search for the term&quot;&gt;
&lt;/p&gt;
&lt;p&gt;
So I ran a new search in the Config Editor, this time for &amp;#8220;unicode&amp;#8221;.  That got me several results, but it also got me what I needed: the settings for both the font face &lt;em&gt;and&lt;/em&gt; the font size used to display monospace and &amp;#8220;fixed&amp;#8221; type in Unicode mail.
&lt;/p&gt;
&lt;p&gt;
Accordingly, I changed three lines in the Config Editor&amp;#8212;the ones in the screenshot which are boldfaced and have a &amp;#8220;user set&amp;#8221; value for the &amp;#8220;Status&amp;#8221; column&amp;#8212;and with that, my mail was displayed the way I wanted it, which is to say the way it had been displayed for years, which is to say the way it would have continued to have been displayed if Thunderbird hadn&amp;#8217;t silently changed the settings on me and then refused to honor my reasserted preferences.
&lt;/p&gt;
&lt;p class=&quot;standalone&quot;&gt;
&lt;img src=&quot;http://meyerweb.com/pix/2010/tb31-03.png&quot; alt=&quot;The 'about:config' window showing the results of a search for the term 'unicode'.  The three preferences changed are 'font.name-list.monospace.x-unicode', 'font.name.monospace.x-unicode', and 'font.size.fixed.x-unicode'.  There are thirteen other preferences listed along with the three changed, for a total of sixteen.&quot;&gt;
&lt;/p&gt;
&lt;p&gt;
If you&amp;#8217;ve encountered a similar problem, now you can do what I did and hopefully avoid some of the annoyance I experienced in trying to get my mail client to behave properly.
&lt;/p&gt;
&lt;p&gt;
[&lt;strong&gt;Update 8 Jul 10:&lt;/strong&gt; Mook &lt;a href=&quot;http://meyerweb.com/eric/thoughts/2010/07/08/fixing-font-display-in-thunderbird-3-1/#comment-503944&quot;&gt;wrote in to point out where this setting is buried&lt;/a&gt; in the preferences UI, for those who might want to set it without diving into the Config Editor.  Thanks, Mook!]
&lt;/p&gt;
&lt;p&gt;
I&amp;#8217;m also really rather annoyed that Thunderbird can&amp;#8217;t seem to remember that I don&amp;#8217;t ever want to see the Message Pane, but that&amp;#8217;s &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=575864&quot;&gt;a reported bug&lt;/a&gt; and I only hope that they fix it sooner rather than later.
&lt;/p&gt;</description>
	<pubDate>Thu, 08 Jul 2010 12:59:26 +0000</pubDate>
	<dc:creator>Eric Meyer</dc:creator>
</item>
<item>
	<title>ajaxian: Ben and Dion Step Down as Editors of Ajaxian.com</title>
	<guid>http://ajaxian.com/?p=9745</guid>
	<link>http://feedproxy.google.com/~r/ajaxian/~3/VXinK69xCro/ben-and-dion-step-down-as-editors-of-ajaxian-com</link>
	<description>&lt;p&gt;In the spring of 2005, the two of us gave our first Ajax talk together. The subject of the talk was DHTML, but Jesse James Garrett had just coined &quot;Ajax&quot; a few days previous, so we sprinkled the term throughout the slide deck. We needed a place to put some source code that accompanied the talk--an RSS reader was called &quot;RSS Bling&quot;. Ajaxian.com was born.&lt;/p&gt;
&lt;p&gt;Here's a random picture someone took of us right before we gave that first talk:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ajaxian.com/wp-content/images/bendion.jpg&quot; title=&quot;Ben and Dion hacking away on their talk&quot; alt=&quot;Ben and Dion hacking away on their talk&quot; width=&quot;470&quot; height=&quot;352&quot; class=&quot;alignnone size-full wp-image-9746&quot;&gt;&lt;/p&gt;
&lt;p&gt;(Surely we're just reviewing the slides in this pic, not hurriedly hacking together something at the last minute.)&lt;/p&gt;
&lt;p&gt;Because the Ajax space was moving so quickly, we wanted a place to track the fun hacks, great libraries, and fantastic showcases that were coming out daily, so we started using Ajaxian to post Ajax news and very occasionally, an editorial. It's fun to think back to those early times; the web world was drunk with new possibilities and no one was really quite sure how the draw the boundaries.&lt;/p&gt;
&lt;p&gt;After a few months, things were moving so fast we thought it would be great to get the emerging Ajax community together. With help from Jay Zimmerman of No Fluff Just Stuff and Chris Haven, we put together the first Ajax Experience show in San Francisco. It was incredibly fun seeing so many of the folks in person we'd been covering on the site, and sharing with the broader developer community what was now possible.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ajaxian.com/wp-content/images/tae.jpg&quot; alt=&quot;Dion blesses the crowd at the first Ajax Experience&quot; title=&quot;Dion blesses the crowd at the first Ajax Experience&quot; width=&quot;470&quot; height=&quot;277&quot; class=&quot;alignnone size-full wp-image-9747&quot;&gt;&lt;/p&gt;
&lt;p&gt;Our little Ajaxian blog grew over time--we still remember with awe when someone compared the traffic Ajaxian sent them to Slashdot--and we've gone on to co-produce several more Ajax Experience shows. It's been a thrilling ride.&lt;/p&gt;
&lt;p&gt;Now, years later, it's time for us to formally hang up our Ajaxian hats. We've always juggled the site with our full-time jobs (various start-ups, Google for Dion, Mozilla, Palm, and now HP), and posting daily while balancing families and work can wear on you after a while--we can't do it all anymore. TechTarget (the company that has &lt;a href=&quot;http://www.techtarget.com/html/pr/pr-06182007.htm&quot;&gt;owned Ajaxian.com for some time&lt;/a&gt;) will take on editorial ownership of the site. We will still carry on posting every so often--it's in our blood--but it won't be on a regular schedule.&lt;/p&gt;
&lt;p&gt;This transition comes at an important time for us. Palm was an opportunity to show the world that an OS based on the Web can be fantastic, but now, with HP's resources behind Palm, there's an even bigger opportunity ahead that will require all of our focus and energy. Oh, and it's summer, too. :-)&lt;/p&gt;
&lt;p&gt;Thanks for being there for us over the years. We look forward to the next series of adventures. With HTML5 continuing to build steam and browser innovation hotter than ever, it is going to be a great time for us Web folk.&lt;/p&gt;
&lt;p&gt;As always, you can keep up with us on Twitter: &lt;a href=&quot;http://twitter.com/bgalbs&quot;&gt;Ben&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/dalmaer&quot;&gt;Dion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All the best,&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://galbraiths.org/blog&quot;&gt;Ben &lt;/a&gt;&lt;a href=&quot;http://developer.palm.com/&quot;&gt;and&lt;/a&gt; &lt;a href=&quot;http://almaer.com/blog&quot;&gt;Dion&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=VXinK69xCro:MpZOii-g3WY:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=VXinK69xCro:MpZOii-g3WY:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=VXinK69xCro:MpZOii-g3WY:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?i=VXinK69xCro:MpZOii-g3WY:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Wed, 07 Jul 2010 20:48:51 +0000</pubDate>
	<dc:creator>Ben Galbraith</dc:creator>
</item>
<item>
	<title>Eric Meyer: In Defense of Vendor Prefixes</title>
	<guid>http://meyerweb.com/eric/thoughts/?p=1360</guid>
	<link>http://meyerweb.com/eric/thoughts/2010/07/07/in-defense-of-vendor-prefixes/</link>
	<description>&lt;a href=&quot;http://alistapart.com/articles/prefix-or-posthack/&quot;&gt;&lt;img src=&quot;http://meyerweb.com/pix/2010/prefix-or-posthack-crop.png&quot; alt=&quot;&quot; class=&quot;pic left&quot;&gt;&lt;/a&gt;
&lt;p&gt;
&amp;#8230;that having been the original working title for &amp;#8220;&lt;a href=&quot;http://alistapart.com/articles/prefix-or-posthack/&quot;&gt;Prefix or Posthack&lt;/a&gt;&amp;#8220;, my latest article for &lt;a href=&quot;http://alistapart.com/&quot;&gt;A List Apart&lt;/a&gt;.  (Sort of like &lt;cite&gt;Return of the Jedi&lt;/cite&gt; had a working title of &lt;cite&gt;Blue Harvest&lt;/cite&gt;.)  In a fairly quick read, I make the case that vendor prefixes are not only good, they have the potential to be great &lt;em&gt;and&lt;/em&gt; to deliver greater interoperability and advancement of CSS.
&lt;/p&gt;
&lt;p&gt;
So far the reaction has been overwhelmingly positive, which frankly came as a bit of a surprise.  The annoyance factor of prefixes is undeniable, and it&amp;#8217;s been my experience that annoyance dramatically hardens opposition regardless of whether or not there are good reasons to oppose.  I could flatter myself that the agreement is due to the Obvious Rightness of my argument, but I suspect it&amp;#8217;s actually that I merely articulated what most people had already instinctively decided for themselves.  Which isn&amp;#8217;t a bad place to be.
&lt;/p&gt;
&lt;p&gt;
Anyway, if you haven&amp;#8217;t already, feel free to decide for yourself by &lt;a href=&quot;http://alistapart.com/articles/prefix-or-posthack/&quot;&gt;reading the article&lt;/a&gt;&quot;”which, I feel like mentioning for no clear reason, is only the fourth piece I&amp;#8217;ve ever written for ALA.
&lt;/p&gt;</description>
	<pubDate>Wed, 07 Jul 2010 17:53:44 +0000</pubDate>
	<dc:creator>Eric Meyer</dc:creator>
</item>
<item>
	<title>Microsoft - IEBlog: A GPU-Powered Shopping Experience with Amazon.com</title>
	<guid>91d46819-8472-40ad-a661-2c78acb4018c:10035112</guid>
	<link>http://blogs.msdn.com/b/ie/archive/2010/07/06/a-gpu-powered-shopping-experience-with-amazon-com.aspx</link>
	<description>&lt;p&gt;A few weeks ago, we &lt;a href=&quot;http://blogs.msdn.com/b/ie/archive/2010/06/03/a-gpu-powered-html5-flickr-photo-viewer.aspx&quot;&gt;talked about&lt;/a&gt; the performance characteristics of our &lt;a href=&quot;http://ie.microsoft.com/testdrive/Performance/10FlickrExplorer/Default.html&quot;&gt;Flickr Explorer&lt;/a&gt; sample. We showed how hardware acceleration benefits real world scenarios such as browsing photos, and how easily web developers can build these types of applications.&lt;/p&gt;
&lt;p&gt;Recently, we released a new set of &lt;a href=&quot;http://www.ietestdrive.com/&quot;&gt;demos&lt;/a&gt; alongside the third &lt;a href=&quot;http://ie.microsoft.com/testdrive/info/ThankYou/Default.html&quot;&gt;IE9 Platform Preview&lt;/a&gt;. Today we&amp;rsquo;re going to discuss the &lt;a href=&quot;http://ie.microsoft.com/testdrive/Performance/AmazonShelf/Default.html&quot;&gt;Amazon Shelf&lt;/a&gt; concept application (also see the companion &lt;a href=&quot;http://channel9.msdn.com/posts/LarryLarsen/Internet-Explorer-9-Platform-Preview-3-A-Look-at-Canvas-and-Amazoncom/&quot;&gt;Channel 9 video&lt;/a&gt;). &lt;/p&gt;
&lt;p&gt;Much like Flickr Explorer, Amazon Shelf is written using standard HTML, CSS and Javascript. Amazon Shelf also incorporates a key new HTML5 feature &amp;ndash; the canvas element. Canvas is an incredibly powerful way to draw directly to the screen using simple Javascript API calls.&lt;/p&gt;
&lt;p&gt;When you launch Amazon Shelf, you&amp;rsquo;re shown a list of the top selling books from Amazon. This data is retrieved using the &lt;a href=&quot;https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html&quot;&gt;Amazon Product Advertising API&lt;/a&gt;. You can search for specific books, browse, and &amp;ldquo;open&amp;rdquo; books to view detailed information and customer reviews. &lt;/p&gt;
&lt;p&gt;This demo uses common patterns that you find across many interactive web applications and games. There is one main loop that updates the books and other objects on the screen, and performs simple hit testing to support interacting with the elements on the canvas.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ieblog.members.winisp.net/images/Seth_Amazon_1.png&quot; alt=&quot;IE9 Platform Demo &amp;ndash; Amazon Shelf&quot; title=&quot;IE9 Platform Demo &amp;ndash; Amazon Shelf&quot;&gt;&lt;/p&gt;
&lt;p&gt;Canvas, like all graphics in IE9, is fully hardware accelerated by default. When IE9 users browse to a website that uses canvas, IE will automatically leverage the full capabilities of the PC to provide a great experience with levels of performance not possible with today&amp;rsquo;s browsers. Using IE9, Amazon Shelf is generally able to maintain a responsiveness of 60 frames per second, which is considered realtime. Today&amp;rsquo;s browsers are only able to achieve framerates of 1-8fps which is a small fraction of the performance provided by IE9.&lt;/p&gt;
&lt;p&gt;We recently blogged about using the &lt;a href=&quot;http://blogs.msdn.com/b/ie/archive/2010/06/21/measuring-browser-performance-with-the-windows-performance-tools.aspx&quot;&gt;Windows Performance Tools&lt;/a&gt; to analyze browser performance. Using these tools, we&amp;rsquo;ve taken some measurements of loading Amazon Shelf in the top browsers available today. We used the same hardware and methodology &lt;a href=&quot;http://blogs.msdn.com/ie/archive/2010/04/07/a-closer-look-at-internet-explorer-9-hardware-acceleration-through-flying-images.aspx&quot;&gt;discussed in the past&lt;/a&gt;. Let&amp;rsquo;s look at the CPU and GPU activity graphs to better understand how the demo performs in these browsers. &lt;/p&gt;
&lt;p&gt;&lt;i&gt;Note: Internet Explorer 8 is not included in this comparison since it does not support the Canvas element.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;First up is Chrome 5. Chrome is able to update the screen once every 0.99 seconds, yielding a frame rate of about 1 FPS during the bookshelf load animation. This results in a very slow, choppy experience. One core on this dual core machine is fully utilized, and the GPU is not employed by the browser at all.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ieblog.members.winisp.net/images/Seth_Amazon_2.png&quot; alt=&quot;Amazon Shelf performance graph in Chrome 5&quot; title=&quot;Amazon Shelf performance graph in Chrome 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Here are the results for Safari 5. During the load animation, Safari does not attempt to render the scene at all, resulting in an effective 0 frames per second. Again, one core on the CPU is fully utilized and the GPU remains untouched.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ieblog.members.winisp.net/images/Seth_Amazon_3.png&quot; alt=&quot;Amazon Shelf performance graph in Safari 5&quot; title=&quot;Amazon Shelf performance graph in Safari 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next up, Firefox 4 Beta. We used Minefield 4.0b2pre nightly for this analysis. Again, our tests ran this latest nightly build of Firefox (like all the others) in the default configuration. This means hardware rendering with the GPU was not enabled in Firefox.&lt;/p&gt;
&lt;p&gt;Here are the results for Firefox. The animation is rendered properly, and the screen is updated twice every .25 seconds, yielding a frame rate of about 8 FPS.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ieblog.members.winisp.net/images/Seth_Amazon_4.png&quot; alt=&quot;Amazon Shelf performance graph in Firefox 4 Beta&quot; title=&quot;Amazon Shelf performance graph in Firefox 4 Beta&quot;&gt;&lt;/p&gt;
&lt;p&gt;Finally, let&amp;rsquo;s take a look at Internet Explorer 9 Platform Preview 3. We see that IE9&amp;rsquo;s full usage of the GPU results in a steady, smooth frame rate of 60 FPS. The CPU handles the task without any trouble and rests frequently while the GPU renders Amazon Shelf to the screen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ieblog.members.winisp.net/images/Seth_Amazon_5.png&quot; alt=&quot;Amazon Shelf performance graph in IE9 Platform Preview 3&quot; title=&quot;Amazon Shelf performance graph in IE9 Platform Preview 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;There is a meaningful difference in the experience when running the demo in IE9 compared to other browsers. Check out &lt;a href=&quot;http://ie.microsoft.com/testdrive/Performance/AmazonShelf/Default.html&quot;&gt;Amazon Shelf&lt;/a&gt; on &lt;a href=&quot;http://www.ietestdrive.com&quot;&gt;www.ietestdrive.com&lt;/a&gt; to see for yourself.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;d like to thank Amazon for their help in putting this demo together, and embracing the new GPU powered, standards based markup enabled by Internet Explorer 9. &lt;/p&gt;
&lt;p&gt;Our team can&amp;rsquo;t wait to see what other graphically rich experiences web developers armed with hardware accelerated Canvas will dream up!&lt;/p&gt;
&lt;p&gt;Seth McLaughlin &lt;br&gt;Program Manager for IE Performance&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;img src=&quot;http://blogs.msdn.com/aggbug.aspx?PostID=10035112&quot; width=&quot;1&quot; height=&quot;1&quot;&gt;</description>
	<pubDate>Tue, 06 Jul 2010 23:48:00 +0000</pubDate>
	<dc:creator>ieblog</dc:creator>
</item>
<item>
	<title>QuirksMode: Mobile Developer Economics report</title>
	<guid>http://www.quirksmode.org/blog/archives/2010/07/mobile_develope.html</guid>
	<link>http://www.quirksmode.org/blog/archives/2010/07/mobile_develope.html</link>
	<description>&lt;p&gt;Vision Mobile just released its &lt;a href=&quot;http://www.visionmobile.com/blog/2010/07/mobile-developer-economics-2010-the-migration-of-developer-mindshare/&quot; class=&quot;external&quot;&gt;Mobile Developer Economics report&lt;/a&gt; in which it presents the result of a poll of 401 mobile developers across the eight main platforms: Android, iPhone, BlackBerry, Symbian, Windows Mobile, Flash, Java ME, and the mobile web.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re interested in the mobile developer world, download and read the report. It&amp;#8217;s free, though a valid email address is required. Below I treat some interesting aspects of the research, including the quote from me Vision Mobile decided to publish.&lt;/p&gt;

&lt;h3&gt;Platforms&lt;/h3&gt;

&lt;p&gt;The parity between the installed base of a platform and the amount of apps available is totally absent. As one would expect, the iPhone app store offers way more apps than the OS&amp;#8217;s relatively humble market share warrants. No surprise here. (p. 10)&lt;/p&gt;

&lt;p&gt;What &lt;em&gt;is&lt;/em&gt; surprising is that the most popular platform among the 401 developers is not the iPhone, but Android with 60%. iPhone comes distinctly second at around 50%, and the third most popular platform, Java ME, is not far removed from it. No clear iPhone superiority here.&lt;/p&gt;

&lt;p&gt;The mobile web does decently at 40% (i.e. 40% of the developers use the mobile web from time to time). Flash is used by about 20% of developers. The long tail is composed of Linux, BREW, bada, and webOS. It should be noted, however, that bada has only just been released. Thus its meager score is quite understandable. This is not the case for the other three platforms. (p. 12)&lt;/p&gt;

&lt;p&gt;It should be noted that developers who used Java ME were rather negative about the platform. One said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The vast majority of Java ME developers have lost faith in the write-once-run-anywhere vision&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Incidentally, which technology do you think has the best chance to take over this write-once-run-anywhere vision? Hint: it has existed for twelve years already and has already been deployed across &lt;em&gt;all&lt;/em&gt; smartphones.&lt;/p&gt;

&lt;h3&gt;Striking it rich&lt;/h3&gt;

&lt;p&gt;Why do developers choose a platform? The clear number one reason is market penetration at 75%, with revenue potential coming second at 50%. The existence of an app store or a development community is important for only 40% of the developers. (p. 13)&lt;/p&gt;

&lt;p&gt;Frankly I believe that reason number two is going to disappear. Mobile development is not a goldmine, although obviously you can earn a decent living by making apps for others.&lt;/p&gt;

&lt;p&gt;On page 26 the report explicitly treats the long-tail economics. If you&amp;#8217;re just a random developer who tries to make boatloads of money by selling apps, will you succeed? Vision Mobile doesn&amp;#8217;t think so.&lt;/p&gt;


&lt;blockquote&gt;
&lt;p&gt;The economics for long-tail developers - i.e. the per-capita profit for the average developer - remains dubious at best.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In other words, Apple&amp;#8217;s App Store is not a shortcut to riches. It can&amp;#8217;t take the place of the hard work of founding a succesful startup, making a compelling product that people want to use, and selling it to a large player.&lt;/p&gt;

&lt;p&gt;The App Store will dole out only niche income to most developers. Obviously there will be one or two notable exceptions to that rule. It&amp;#8217;s a casino,  after all, and the luck of the draw can be with you. Wanna try? Have fun, but don&amp;#8217;t complain that you don&amp;#8217;t make any money.&lt;/p&gt;

&lt;p&gt;Why is this so? The report pinpoints two main reasons:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;First, there are plenty of &amp;#8220;garage developers&amp;#8221; around who create apps not for the money, but for status among their peers. Usually they offer their work for free or a nominal fee. If such a free app competes with your paid one, tough luck.&lt;/li&gt;
	&lt;li&gt;The huge crowding especially in Apple&amp;#8217;s app store forces developers to lower their prices in order to remain competitive.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Mastering a platform&lt;/h3&gt;

&lt;p&gt;How much time does it take to master a platform? Android clocks in fastest with five months. The mobile web comes second with six (yay!), though it has to share this place with Flash. Then comes iPhone with about 7.5 months. By far the toughest nut to crack is Symbian, where it takes 15 months before you&amp;#8217;re proficient enough with the platform to write a couple of moderately-simple apps. (p. 32)&lt;/p&gt;

&lt;h3&gt;Operators&lt;/h3&gt;

&lt;p&gt;Finally, the report talks about operators, and this happens to be a subject I&amp;#8217;m deeply interested in. The general conclusion is that operators don&amp;#8220;t care a hoot about mobile developers, and treat them badly. Questions aren&amp;#8217;t answered, there is a complete lack of focus with initiatives and websites cropping up all over the place, and operators aren&amp;#8217;t interested in the long tail of niche developers.&lt;/p&gt;

&lt;p&gt;In other words, ADHD-suffering marketing people jump hither and tither, and don&amp;#8217;t care about anything remotely resembling long-term planning. I don&amp;#8217;t think that&amp;#8217;s going to change in the near future.&lt;/p&gt;

&lt;p&gt;Furthermore the operators refuse to send people to industry conferences, instead electing to hold their own. I&amp;#8217;ve been to several such events, and although it always works in the sense that it&amp;#8217;s a moderate-good conference with moderate-good speakers, the fact that they&amp;#8217;re free to enter but not free from marketing speak means that they&amp;#8217;re soon forgotten.&lt;/p&gt;

&lt;p&gt;I am convinced that the operators&amp;#8217; approach to conferences is wrong. I hope to prove that within the next year.&lt;/p&gt;

&lt;p&gt;Which brings me to the quote from me Vision Mobile decided to include (p. 43/44):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The first mobile company to TRULY reach out to web developers will have an edge over the competition, but right now I don&amp;#8217;t see any candidates. Except for Google, obviously. (And Apple, but they&amp;#8217;re playing their own game.) If Google became an operator our problems would be solved.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To be honest I completely forgot about this thought until Vision Mobile contacted me for permission to quote me. Reading it back I feel I&amp;#8217;m on to something. So yes, I agree with myself.&lt;/p&gt;

&lt;p&gt;Wondering what Google&amp;#8217;s next step will be? Becoming an operator. Especially in the &lt;a href=&quot;http://communities-dominate.blogs.com/brands/2010/06/us-vs-them-american-wireless-industry-come-meet-me-at-camera-3.html&quot; class=&quot;external&quot;&gt;totally dysfunctional&lt;/a&gt; American market. They&amp;#8217;ll bring simple mobile billing to the world. Unless the traditional operators do it first, but there&amp;#8217;s little chance of that.&lt;/p&gt;

&lt;p&gt;Interesting idea, no? Not easy, no sir, not at all. But it&amp;#8217;s the obvious next step as far as I&amp;#8217;m concerned. Operatorship is where the money is. And where the need for innovation is greatest. We don&amp;#8217;t have to expect anything from the current marketing-driven bunch.&lt;/p&gt;</description>
	<pubDate>Mon, 05 Jul 2010 16:07:23 +0000</pubDate>
</item>
<item>
	<title>ajaxian: text-rendering: optimizeLegibility; //Can you read me now?</title>
	<guid>http://ajaxian.com/?p=9732</guid>
	<link>http://feedproxy.google.com/~r/ajaxian/~3/UTk_eofZyAk/text-rendering-optimizelegibility-can-you-read-me-now</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.aestheticallyloyal.com/public/optimize-legibility/&quot;&gt;text-rendering: optimizeLegibility;&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.aestheticallyloyal.com/public/optimize-legibility/&quot;&gt;&lt;img src=&quot;http://ajaxian.com/wp-content/images/optimizeLegibility.png&quot; alt=&quot;&quot; title=&quot;optimizeLegibility&quot; width=&quot;460&quot; height=&quot;399&quot; class=&quot;alignnone size-full wp-image-9733&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Awesome.&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=UTk_eofZyAk:aErB4zt6AKI:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=UTk_eofZyAk:aErB4zt6AKI:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=UTk_eofZyAk:aErB4zt6AKI:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?i=UTk_eofZyAk:aErB4zt6AKI:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Fri, 02 Jul 2010 11:27:52 +0000</pubDate>
	<dc:creator>Dion Almaer</dc:creator>
</item>
<item>
	<title>Microsoft - IEBlog: IE9 Includes Hardware Accelerated Canvas</title>
	<guid>91d46819-8472-40ad-a661-2c78acb4018c:10030401</guid>
	<link>http://blogs.msdn.com/b/ie/archive/2010/07/01/ie9-includes-hardware-accelerated-canvas.aspx</link>
	<description>
        var ctx0, ctx1;
        var canvas0, canvas1;
        var wave = 1;
        var direction = 1;
        var timer;
        var HEIGHT2 = 100, WIDTH2 = 400;
        var count = 0;
        var currentX = 0, currentY = 0, lastX = 0, lastY = 0;
        var r = Math.floor(Math.random() * 255) + 70;
        var g = Math.floor(Math.random() * 255) + 70;
        var b = Math.floor(Math.random() * 255) + 70;
        window.onload=init;

        function init() {
            // Check to see if canvas is supported
            if (!document.createElement('canvas').getContext) return;

            // Set up canvas0
            ctx0 = document.getElementById(&quot;canvas0&quot;).getContext(&quot;2d&quot;);
            ctxWidth = document.getElementById(&quot;canvas0&quot;).width;
            ctxHeight = document.getElementById(&quot;canvas0&quot;).height;

            // Set up canvas1
            canvas1 = document.getElementById(&quot;canvas1&quot;);
            ctx1 = canvas1.getContext(&quot;2d&quot;);
            ctx1.lineWidth = 25;
            ctx1.lineCap = &quot;round&quot;;

            // Add event handlers
            if (canvas1.addEventListener) canvas1.addEventListener(&quot;mousemove&quot;, OnMouseMove, false);
            else if (canvas1.attachEvent) canvas1.attachEvent(&quot;onmousemove&quot;, OnMouseMove);

            // Start the renderLoop
            timer = setInterval(renderLoop, 16);

        }

        function OnMouseMove(e) {

            if (typeof e == 'undefined') e = canvas1.event;
            if (typeof e.offsetX != 'undefined' &amp;&amp; typeof e.offsetY != 'undefined') {
                currentX = e.offsetX;
                currentY = e.offsetY;
            }
            else {
                var relPos = getRelativePos(e.clientX, e.clientY);
                currentX = relPos[0];
                currentY = relPos[1];
            }
        }

        // My thanks to QuirksMode.org for the insight here
        function getRelativePos(x, y) {
            var curleft = curtop = 0;

            var obj = document.getElementById('canvas1');
            if (obj.offsetParent) {
                do {
                    curleft += obj.offsetLeft;
                    curtop += obj.offsetTop;
                } while (obj = obj.offsetParent);
            }

            // Webkit isn't compliant with CSS OM View here; thus, we need to grab scrollTop from body instead of documentElement

            if (document.body.scrollLeft &gt; 0) {
                var scrollLeft = document.body.scrollLeft;
            }
            else {
                scrollLeft = document.documentElement.scrollLeft;
            }

            if (document.body.scrollTop &gt; 0) {
                var scrollTop = document.body.scrollTop;
            }
            else {
                scrollTop = document.documentElement.scrollTop;
            }

            return [(x - curleft + scrollLeft), (y - curtop + scrollTop)];
        }

        function drawLines(ctx, x, y) {
            ctx.save();
            ctx.beginPath();
            ctx.moveTo(lastX, lastY);
            ctx.lineTo(x, y);
            ctx.strokeStyle = &quot;rgba(&quot; + r + &quot;,&quot; + g + &quot;,&quot; + b + &quot;, 1)&quot;;
            ctx.stroke();
            ctx.restore();
        }

        function clearLines(ctx) {
            // Clear first
            ctx.fillStyle = &quot;rgba(0,0,0,0.05)&quot;;
            ctx.fillRect(0, 0, WIDTH2, HEIGHT2);

            // Change up color
            if (count++ &gt; 50) {
                count = 0;
                r = Math.floor(Math.random() * 255) + 70;
                g = Math.floor(Math.random() * 255) + 70;
                b = Math.floor(Math.random() * 255) + 70;
            }
        }

        function renderLoop() {

            // Draw lines
            clearLines(ctx1);
            drawLines(ctx1, currentX, currentY);
            lastX = currentX;
            lastY = currentY;
            drawSimpleShapes(ctx0);
        }


        function drawSimpleShapes(ctx) {

            // Draw background
            if (wave &gt;= 60 || wave &lt;= 0) { direction = -direction; }

            var gradient1 = ctx.createLinearGradient(0, 15, 0, 70);
            gradient1.addColorStop(0, &quot;blue&quot;);
            gradient1.addColorStop(1, &quot;white&quot;);
            ctx.clearRect(0, 0, 300, 70);
            ctx.fillStyle = gradient1;
            ctx.beginPath();
            ctx.moveTo(0, 35);
            ctx.quadraticCurveTo(75, 70 - wave, 150, 35);
            ctx.quadraticCurveTo(225, 0 + wave, 300, 35);
            ctx.lineTo(300, 70);
            ctx.lineTo(0, 70);
            ctx.fill();
            wave = wave + direction / 5;


            // Draw green rectangle
            ctx.beginPath();
            ctx.fillStyle = &quot;rgba(0, 255,0,.3)&quot;;
            ctx.rect(10, 10, 50, 50);
            ctx.fill();
            ctx.stroke();


            // Draw  blue circle
            ctx.beginPath();
            ctx.fillStyle = &quot;rgba(0, 0, 255,.3)&quot;;
            ctx.arc(105, 35, 25, 0, 2 * Math.PI, true);
            ctx.fill();
            ctx.stroke();

            // Draw lines with decreasing widths
            ctx.strokeStyle = &quot;black&quot;;
            ctx.lineWidth = 10;
            ctx.beginPath();
            ctx.moveTo(155, 15);
            ctx.lineTo(205, 15);
            ctx.stroke();

            ctx.lineWidth = 8;
            ctx.beginPath();
            ctx.moveTo(155, 29);
            ctx.lineTo(205, 29);
            ctx.stroke();

            ctx.lineWidth = 6;
            ctx.beginPath();
            ctx.moveTo(155, 41);
            ctx.lineTo(205, 41);
            ctx.stroke();

            ctx.lineWidth = 4;
            ctx.beginPath();
            ctx.moveTo(155, 51);
            ctx.lineTo(205, 51);
            ctx.stroke();

            ctx.lineWidth = 2;
            ctx.beginPath();
            ctx.moveTo(155, 59);
            ctx.lineTo(205, 59);
            ctx.stroke();

            // Draw image
            var image = document.getElementById(&quot;ie-logo&quot;);
            ctx.drawImage(image, 220, 0, 70, 70);

        }
     
      

    &lt;img id=&quot;ie-logo&quot; src=&quot;http://ieblog.members.winisp.net/misc/CanvasBlogPostAssets/ie_logo.png&quot;&gt;  &lt;p&gt;With the recent release of the &lt;a href=&quot;http://blogs.msdn.com/b/ie/archive/2010/06/23/html5-native-third-ie9-platform-preview-available-for-developers.aspx&quot;&gt;latest IE9 platform preview&lt;/a&gt;, we talked about how we're rebuilding the browser to use the power of your whole PC to browse the web, and to unlock a new class of HTML5 applications. One area that &lt;a href=&quot;http://stuffandnonsense.co.uk/blog/about/internet_explorer_9_in_on_the_boil/&quot;&gt;developers are especially excited&lt;/a&gt; about is the potential of HTML5 canvas. Like all of the graphics in IE9, canvas is hardware accelerated through Windows and the GPU. In this blog post we discuss some of the details behind canvas and the kinds of things developers can build.&lt;/p&gt;  &lt;h2&gt;Canvas enables everything from basic shapes to fully interactive graphics&lt;/h2&gt;  &lt;p&gt;Canvas is a way to program graphics on the web. The &lt;a href=&quot;http://dev.w3.org/html5/2dcontext/&quot;&gt;&amp;lt;canvas&amp;gt;&lt;/a&gt; tag is an &lt;a href=&quot;http://www.wikipedia.org/wiki/Immediate_mode&quot;&gt;immediate mode&lt;/a&gt; 2d drawing surface that web developers can use to deliver things like real time graphs, animations or interactive games without requiring any extra downloads.&lt;/p&gt;  &lt;p&gt;At the most basic level, canvas enables you to draw primitives like &lt;a href=&quot;http://ie.microsoft.com/testdrive/Graphics/CanvasPad/Default.html?c=lineWidth&quot;&gt;lines&lt;/a&gt;, &lt;a href=&quot;http://ie.microsoft.com/testdrive/Graphics/CanvasPad/Default.html?c=rectangles&quot;&gt;rectangles&lt;/a&gt;, &lt;a href=&quot;http://ie.microsoft.com/testdrive/Graphics/CanvasPad/Default.html?c=arcs&quot;&gt;arcs&lt;/a&gt;, &lt;a href=&quot;http://ie.microsoft.com/testdrive/Graphics/CanvasPad/Default.html?c=bezier&quot;&gt;Bezier curves&lt;/a&gt;, &lt;a href=&quot;http://ie.microsoft.com/testdrive/Graphics/CanvasPad/Default.html?c=quadratic&quot;&gt;quadratic curves&lt;/a&gt;, &lt;a href=&quot;http://ie.microsoft.com/testdrive/Graphics/CanvasPad/Default.html?c=image&quot;&gt;images&lt;/a&gt; and &lt;a href=&quot;http://ie.microsoft.com/testdrive/Graphics/CanvasPad/Default.html?c=video&quot;&gt;video&lt;/a&gt; like the following: &lt;/p&gt;   &lt;div id=&quot;fallback&quot;&gt;   &lt;p class=&quot;caption&quot;&gt;&lt;img src=&quot;http://ieblog.members.winisp.net/misc/CanvasBlogPostAssets/simple_shapes.png&quot;&gt;&lt;/p&gt;    &lt;p class=&quot;caption&quot;&gt;This image is a simulation of what you'd see in a canvas enabled browser.&lt;/p&gt;    &lt;p class=&quot;caption&quot;&gt;Please use the &lt;a href=&quot;http://www.ietestdrive.com&quot;&gt;IE9 preview to see these examples&lt;/a&gt; running in canvas.&lt;/p&gt; &lt;/div&gt;   &lt;p&gt;The &lt;a href=&quot;http://ie.microsoft.com/testdrive/Graphics/CanvasPad/Default.html&quot;&gt;Canvas Pad&lt;/a&gt; demo on &lt;a href=&quot;http://www.ietestdrive.com&quot;&gt;the IE test drive site&lt;/a&gt; goes into detail on the canvas syntax and enables you to easily experiment with a wide range of examples. Feel free to make changes to any of the samples that are there to see how it works -- for example, try changing colors or sizes of things.&lt;/p&gt;  &lt;p&gt;Taking things a step further, you can use JavaScript to animate canvas drawings or make interactive experiences. The next example &lt;a href=&quot;http://ie.microsoft.com/testdrive/Graphics/CanvasPad/Default.html?c=mouse&quot;&gt;draws lines as you move your mouse&lt;/a&gt; (or as you move your finger on touch enabled devices) over the black box. You could also choose to have your canvas experience react to keyboard input, mouse clicks or &lt;a href=&quot;http://blogs.msdn.com/b/ie/archive/2010/03/26/dom-level-3-events-support-in-ie9.aspx&quot;&gt;any browser event&lt;/a&gt;. &lt;/p&gt;   &lt;div id=&quot;fallback&quot;&gt;   &lt;p class=&quot;caption&quot;&gt;&lt;img src=&quot;http://ieblog.members.winisp.net/misc/CanvasBlogPostAssets/scribble.png&quot;&gt;&lt;/p&gt;    &lt;p class=&quot;caption&quot;&gt;This image is a simulation of what you'd see in a canvas enabled browser.&lt;/p&gt;    &lt;p class=&quot;caption&quot;&gt;With canvas support in IE9, you can move your mouse over the black box and draw lines.&lt;/p&gt; &lt;/div&gt;   &lt;p&gt;By utilizing the full power of the PC with hardware acceleration for graphics and fast JavaScript for animation, web developers can use IE9 to build deep, graphically rich experiences. Since canvas is an element like other elements in HTML, it participates in the page layout and its API is exposed to JavaScript so it can be fully incorporated into a web page's design. This makes it possible for sites to include things like live data visualizations, games, splash pages and ads without the need for any extra downloads or plugins.&lt;/p&gt;  &lt;p&gt;The &lt;a href=&quot;http://www.ietestdrive.com&quot;&gt;IE testdrive&lt;/a&gt; site includes several examples that demonstrate the kinds of things that sites are now able to do in an interoperable way.&lt;/p&gt;  &lt;h2&gt;Shopping&lt;/h2&gt;&lt;p&gt;The &lt;a href=&quot;http://ie.microsoft.com/testdrive/Performance/AmazonShelf/Default.html&quot;&gt;Amazon Shelf&lt;/a&gt; shows what shopping for books could look like when the web site designer is able to use the kind of graphics, animations and smooth transitions that canvas enables. &lt;/p&gt;  &lt;p&gt; &lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt; &lt;div id=&quot;div1&quot;&gt; &lt;img id=&quot;image1&quot; src=&quot;http://ieblog.members.winisp.net/images/Paul_canvas_video1.png&quot;&gt;       &lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkID=124807&quot;&gt; &lt;img src=&quot;http://go.microsoft.com/fwlink/?LinkId=108181&quot; alt=&quot;Get Microsoft Silverlight&quot;&gt; &lt;/a&gt; &lt;!-- Script to detect lack of codec support and force fallback to contained &lt;object&gt; --&gt;
		var vid = document.getElementById(&quot;myvid&quot;);
		if(vid &amp;&amp; vid.canPlayType &amp;&amp; !vid.canPlayType(&quot;video/mp4&quot;).match(/^(probably|maybe)$/i)) {
			vid.parentNode.insertBefore(vid.firstElementChild, vid);
			vid.style.display = &quot;none&quot;;
			document.getElementById(&quot;image1&quot;).style.display=&quot;none&quot;;
			document.getElementById(&quot;div1&quot;).style.width=&quot;377px&quot;;
		}
		/*script to hide the play image if in IE8 */
		if (vid &amp;&amp; vid.canPlayType==null) {
			document.getElementById(&quot;image1&quot;).style.display=&quot;none&quot;;
			document.getElementById(&quot;div1&quot;).style.width=&quot;377px&quot;;
		}

	  &lt;/div&gt;&lt;/td&gt;&lt;td&gt; &lt;a href=&quot;http://ie.microsoft.com/testdrive/Performance/AmazonShelf/Default.html&quot;&gt;&lt;img alt=&quot;Demo of Amazon shelf in canvas&quot; src=&quot;http://ieblog.members.winisp.net/images/Paul_Canvas_1.png&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;/p&gt;  &lt;h2&gt;Immersive game experiences:&lt;/h2&gt;&lt;p&gt; The following demos showcase some gaming concepts like physics, character animation, collision detection and mouse interaction coupled with hardware accelerated graphics. In these demos, you'll notice that not all browsers can update the screen with the same frequency (FPS or frames per second). IE is able to maintain a high FPS by using &lt;a href=&quot;http://blogs.msdn.com/b/ie/archive/2010/04/09/benefits-of-gpu-powered-html5.aspx&quot;&gt;Windows technologies to make use of your GPU&lt;/a&gt; - your computer's hardware that's optimized for rendering graphics. &lt;/p&gt; &lt;h4&gt;FishIE Tank&lt;/h4&gt; &lt;p&gt; This demo makes use of sprites to animate the fish and basic collision logic to redirect the fish when they hit the edges of the tank. It's also good for measuring graphics performance because you can change the number of fish to increase or decrease the graphics load.&lt;/p&gt;    &lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt; &lt;div id=&quot;div2&quot;&gt; &lt;img id=&quot;image2&quot; src=&quot;http://ieblog.members.winisp.net/images/Paul_canvas_video2.png&quot;&gt;      &lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkID=124807&quot;&gt; &lt;img src=&quot;http://go.microsoft.com/fwlink/?LinkId=108181&quot; alt=&quot;Get Microsoft Silverlight&quot;&gt; &lt;/a&gt; &lt;!-- Script to detect lack of codec support and force fallback to contained &lt;object&gt; --&gt;
                    
		var vid = document.getElementById(&quot;myvid2&quot;);
		if(vid &amp;&amp; vid.canPlayType &amp;&amp; !vid.canPlayType(&quot;video/mp4&quot;).match(/^(probably|maybe)$/i)) {
			vid.parentNode.insertBefore(vid.firstElementChild, vid);
			vid.style.display = &quot;none&quot;;
	document.getElementById(&quot;image2&quot;).style.display=&quot;none&quot;;
	document.getElementById(&quot;div2&quot;).style.width=&quot;377px&quot;;
		}
	/*script to hide the play image if in IE8 */
		if (vid &amp;&amp; vid.canPlayType==null) {
			document.getElementById(&quot;image2&quot;).style.display=&quot;none&quot;;
			document.getElementById(&quot;div2&quot;).style.width=&quot;377px&quot;;
		}
	  &lt;/div&gt;&lt;/td&gt;&lt;td&gt;
&lt;a href=&quot;&gt;
&lt;a href=&quot;&gt;
&lt;a href=&quot;http://ie.microsoft.com/testdrive/Performance/FishIE%2520tank/Default.html&quot;&gt;&lt;img alt=&quot;Demo of Fish Tank in canvas&quot; src=&quot;http://ieblog.members.winisp.net/images/Paul_Canvas_2.png&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;h4&gt;Asteroid Belt&lt;/h4&gt; &lt;p&gt;The asteroid in the demo follows your mouse, scales and rotates. It's an example of direct interactivity that you might find in a game.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://ie.microsoft.com/testdrive/Performance/AsteroidBelt/Default.html&quot;&gt; &lt;img alt=&quot;Demo of asteroid belt in canvas&quot; src=&quot;http://ieblog.members.winisp.net/images/Paul_Canvas_3.png&quot; width=&quot;385&quot; height=&quot;282&quot;&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Mr. Potato Gun&lt;/h4&gt; &lt;p&gt;A physics engine in this demo defines how the different parts of Mr. Potato head are launched from the gun and then how they react when they bounce off the ground. Many games use some form of physics engine like this to manage particle movement and their response.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://ie.microsoft.com/testdrive/Performance/MrPotatoGun/Default.html&quot;&gt;&lt;img alt=&quot;Demo of potato gun in canvas&quot; src=&quot;http://ieblog.members.winisp.net/images/Paul_Canvas_4.png&quot; width=&quot;385&quot; height=&quot;282&quot;&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Canvas Zoom&lt;/h4&gt; &lt;p&gt;This demo enables you to start with a very wide angle on an image like this mountain range and then zoom in very close image like people at a picnic. For games, it's an interesting example of scaling and smooth transitions.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://ie.microsoft.com/testdrive/Graphics/DeepZoom/Default.html&quot;&gt;&lt;img alt=&quot;Demo of a mountain range than you can zoom into&quot; src=&quot;http://ieblog.members.winisp.net/images/Paul_Canvas_5.png&quot; width=&quot;385&quot; height=&quot;282&quot;&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Demos from around the web: &lt;/h2&gt; &lt;p&gt;There are some pretty amazing demos floating around the web and I'd like to share a couple of our favorites -- there are many more. An important part of implementing canvas is that we do it in &lt;a href=&quot;http://blogs.msdn.com/b/ie/archive/2010/04/14/same-markup-writing-cross-browser-code.aspx&quot;&gt;an interoperable way&lt;/a&gt; so that developers can use the same markup. To help achieve this goal, we're always looking for examples that work and those that don't. A future canvas blog post will go into detail about how we work to be interoperable and what we do when there's an issue reported. &lt;/p&gt;  &lt;p&gt;I hope you enjoy some of these canvas examples from people around the web.&lt;/p&gt;  &lt;h4&gt;Cloth Simulation &lt;/h4&gt; &lt;p&gt;This demo is interactive and the cloth is responsive to movement and gravity.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.andrew-hoyer.com/experiments/cloth&quot;&gt;&lt;img alt=&quot;An interactive cloth simulation with gravity&quot; src=&quot;http://ieblog.members.winisp.net/images/Paul_Canvas_6.png&quot; width=&quot;385&quot; height=&quot;282&quot;&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Zwibbler&lt;/h4&gt; &lt;p&gt;The shapes in this drawing app are preserved so you can select and then move, resize, or change their styling. &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://zwibbler.com/&quot;&gt;&lt;img alt=&quot;demo of a drawing tool named Zwibbler&quot; src=&quot;http://ieblog.members.winisp.net/images/Paul_Canvas_7.png&quot; width=&quot;386&quot; height=&quot;282&quot;&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Liquid Particles&lt;/h4&gt; &lt;p&gt;The particles in this demo are drawn to or repelled from the mouse.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://spielzeugz.de/html5/liquid-particles.html&quot;&gt;&lt;img alt=&quot;demo of particles&quot; src=&quot;http://ieblog.members.winisp.net/images/Paul_Canvas_8.png&quot; width=&quot;386&quot; height=&quot;282&quot;&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Kaleidoscope&lt;/h4&gt; &lt;p&gt;This one does a nice job of drawing you in &quot;“ it's engaging and interesting to watch the patterns as they evolve.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://www.chiptune.com/kaleidoscope/&quot;&gt;&lt;img alt=&quot;demo of a kaleidoscope&quot; src=&quot;http://ieblog.members.winisp.net/images/Paul_Canvas_9.png&quot; width=&quot;385&quot; height=&quot;282&quot;&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Nebula Visualization&lt;/h4&gt; &lt;p&gt;The alpha blending used by this demo are really well done. The result is a cloudy atmospheric look. It's graphics intensive and it's still very fast and smooth in IE9.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://www.professorcloud.com/mainsite/canvas-nebula.htm&quot;&gt;&lt;img alt=&quot;Nebula visualization using alpha blending&quot; src=&quot;http://ieblog.members.winisp.net/images/Paul_Canvas_10.png&quot; width=&quot;385&quot; height=&quot;282&quot;&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Animated Reflection&lt;/h4&gt; &lt;p&gt;The author of this demo says, &quot;The script is currently using 80% of my cpu so it's not really practical. Hopefully we will be getting JIT'd javascript sometime soon.&quot;¯ Well, now JavaScript is compiled in IE9. It generally uses about 1% of my CPU.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://timelessname.com/canvas/experiment01/&quot;&gt;&lt;img alt=&quot;animated image reflection&quot; src=&quot;http://ieblog.members.winisp.net/images/Paul_Canvas_11.png&quot; width=&quot;385&quot; height=&quot;282&quot;&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Asteroids in Canvas&lt;/h4&gt; &lt;p&gt;This is a full game with nice graphics, collision detection, keyboard interactivity, score keeping and&quot;¦ green lasers.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://www.kevs3d.co.uk/dev/asteroids/&quot;&gt;&lt;img alt=&quot;asteroids in canvas&quot; src=&quot;http://ieblog.members.winisp.net/images/Paul_Canvas_12.png&quot; width=&quot;385&quot; height=&quot;282&quot;&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Particle Animation&lt;/h4&gt; &lt;p&gt;See your name in lights. This is another demo that includes a particle system. You can run this with 300 or 1500 sprites. Go ahead and bump it up to 1500. &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://www.feedtank.com/labs/html_canvas/&quot;&gt;&lt;img alt=&quot;Particle animation showing letters&quot; src=&quot;http://ieblog.members.winisp.net/images/Paul_Canvas_13.png&quot; width=&quot;385&quot; height=&quot;282&quot;&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We're looking forward to seeing the kinds visual experiences web developers will be able to build with a fully hardware accelerated browser.&lt;/p&gt;  &lt;p&gt;Give it a try yourself.&lt;a href=&quot;http://channel9.msdn.com/Search/Default.aspx?Term=Internet%20Explorer%20platform%20preview%203&amp;amp;Type=site&quot;&gt; Watch the videos&lt;/a&gt;, get the &lt;a href=&quot;http://www.ietestdrive.com&quot;&gt;latest platfrom preview&lt;/a&gt;, try out the &lt;a href=&quot;http://www.ietestdrive.com&quot;&gt;canvas demos&lt;/a&gt; and build some examples of your own. If you find a bug in how canvas works or where the same markup behaves differently, please &lt;a href=&quot;http://blogs.msdn.com/b/ie/archive/2010/03/25/filing-a-great-bug.aspx&quot;&gt;report&lt;/a&gt; bugs on &lt;a href=&quot;http://connect.microsoft.com/ie&quot;&gt;Connect&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;- Thanks, Paul Cutsinger and Jatinder Mann&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;img src=&quot;http://blogs.msdn.com/aggbug.aspx?PostID=10030401&quot; width=&quot;1&quot; height=&quot;1&quot;&gt;</description>
	<pubDate>Fri, 02 Jul 2010 01:24:00 +0000</pubDate>
	<dc:creator>ieblog</dc:creator>
</item>
<item>
	<title>ajaxian: Firefox 4 with lots of speed improvements and inline SVG</title>
	<guid>http://ajaxian.com/?p=9742</guid>
	<link>http://feedproxy.google.com/~r/ajaxian/~3/7y5odf2XrXE/firefox-4-with-lots-of-speed-improvements-and-inline-svg</link>
	<description>&lt;p&gt;Mozilla went to London, England yesterday night to give a workshop about Mozilla Add-Ons and show some of the cool new stuff coming in Firefox 4. &lt;/p&gt;
&lt;p&gt;Probably the most impressive thing (next to the new Add-Ons Builder based on Bespin) was the upcoming Features of Firefox 4: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt; Video display&lt;/li&gt;
&lt;li&gt;Painting with Canvas&lt;/li&gt;
&lt;li&gt;Image manipulation with Canvas &amp;#8211; pixel testing, face detection with opencivitas&lt;/li&gt;
&lt;li&gt;Green screen technologies in images and video by detecting pixel colours.&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;HTML5 &lt;/span&gt;embedded inside &lt;span class=&quot;caps&quot;&gt;SVG &lt;/span&gt;(yes!)&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;SVG &lt;/span&gt;as an &lt;span class=&quot;caps&quot;&gt;IMG &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;SVG &lt;/span&gt;as a &lt;span class=&quot;caps&quot;&gt;CSS &lt;/span&gt;background &lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;SVG &lt;/span&gt;filter/mask/clip&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;SVG &lt;/span&gt;animations &lt;/li&gt;
&lt;li&gt;Inline &lt;span class=&quot;caps&quot;&gt;SVG &lt;/span&gt;inside &lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;CSS3 &lt;/span&gt;(selectors, @font-face, 2D Transforms, Transitions, Shadow, Gradients ,calculations &amp;#8211; calc(2em-10px) )&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;s: Geolocation, Offline (IndexDB, localStorage, AppCache, FileAPI &amp;#8211; binary content of a file input, file drag and drop, web workers, websockets)&lt;/li&gt;
&lt;li&gt;Websockets controller running the presentation from the mobile.&lt;/li&gt;
&lt;li&gt;WebGL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They proved some of the points with demos: &lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;CSS3 &lt;/span&gt;filters and &lt;span class=&quot;caps&quot;&gt;SVG &lt;/span&gt;masking on &lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt; Video:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Highly interactive video interface with &lt;span class=&quot;caps&quot;&gt;SVG &lt;/span&gt;masking and transitions:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;WebGL in Firefox 4 and on Android:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;After this, Tristan Nitot covered some of the other features of Firefox 4, especially the upcoming speed improvements:&lt;/p&gt;
&lt;p&gt;As to upcoming features to the core of Firefox, we heard about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TraceMonkey (a new Javascript engine)&lt;/li&gt;
&lt;li&gt;Lazy Frame Construction&lt;/li&gt;
&lt;li&gt;Reducing I/O from the main thread&lt;/li&gt;
&lt;li&gt;Improved startup Time &lt;/li&gt;
&lt;li&gt;Hardware accelleration &lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;GPU &lt;/span&gt;text/graphics/video rendering &lt;/li&gt;
&lt;li&gt;Using &lt;span class=&quot;caps&quot;&gt;GPU &lt;/span&gt;for text rendering &lt;/li&gt;
&lt;li&gt;JavaScript &lt;span class=&quot;caps&quot;&gt;JIT &lt;/span&gt;(JaegerMonkey)&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;HTML5 &lt;/span&gt;parser running own thread &lt;/li&gt;
&lt;li&gt;slicker interface&lt;/li&gt;
&lt;li&gt;no more modal dialogs&lt;/li&gt;
&lt;li&gt;no startup interuptions&lt;/li&gt;
&lt;li&gt;updates in the background&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For an in-depth report on all the things shown, check out &lt;a href=&quot;http://www.wait-till-i.com/2010/07/01/mozilla-add-on-workshop-and-firefox4-with-html5-css3-and-svg/&quot;&gt;this live blog post&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=7y5odf2XrXE:UdNxw0BRMqM:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=7y5odf2XrXE:UdNxw0BRMqM:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=7y5odf2XrXE:UdNxw0BRMqM:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?i=7y5odf2XrXE:UdNxw0BRMqM:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Thu, 01 Jul 2010 15:26:49 +0000</pubDate>
	<dc:creator>Chris Heilmann</dc:creator>
</item>
<item>
	<title>ajaxian: Keep your vows; Keeping wed to Node</title>
	<guid>http://ajaxian.com/?p=9728</guid>
	<link>http://feedproxy.google.com/~r/ajaxian/~3/G090uZxNuyw/keep-your-vows-keeping-wed-to-node</link>
	<description>&lt;p&gt;Vows can be a beautiful thing. &lt;a href=&quot;http://cloudhead.io/&quot;&gt;Alexis Sellier&lt;/a&gt; of LESS fame, is becoming an open source star. This time around he brings us &lt;a href=&quot;http://vowsjs.org/&quot;&gt;Vows&lt;/a&gt; an asynchronous-friendly behavior driven development framework for Node.js.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://vowsjs.org/&quot;&gt;&lt;img src=&quot;http://ajaxian.com/wp-content/images/vowsjs.png&quot; alt=&quot;&quot; title=&quot;vowsjs&quot; width=&quot;460&quot; height=&quot;216&quot; class=&quot;alignnone size-full wp-image-9729&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Write you BBD specs like this:&lt;/p&gt;
&lt;div class=&quot;igBar&quot;&gt;&lt;a href=&quot;javascript:showCodeTxt('javascript-23');&quot;&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;syntax_hilite&quot;&gt;&lt;span&gt;JAVASCRIPT:&lt;/span&gt;
&lt;div id=&quot;javascript-23&quot;&gt;
&lt;div class=&quot;javascript&quot;&gt;
&lt;span&gt;// division-by-zero-test.js&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;var&lt;/span&gt; vows = require&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'vows'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; assert = require&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'assert'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;// Create a Test Suite&lt;/span&gt;&lt;br&gt;
vows.&lt;span&gt;describe&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'Division by Zero'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;addBatch&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;'when dividing a number by zero'&lt;/span&gt;: &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; topic: &lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;42&lt;/span&gt; / &lt;span&gt;0&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;,&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;'we get Infinity'&lt;/span&gt;: &lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;topic&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; assert.&lt;span&gt;equal&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;topic, Infinity&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;'but when dividing zero by zero'&lt;/span&gt;: &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; topic: &lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt; / &lt;span&gt;0&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;,&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;'we get a value which'&lt;/span&gt;: &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;'is not a number'&lt;/span&gt;: &lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;topic&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; assert.&lt;span&gt;isNaN&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;topic&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;'is not equal to itself'&lt;/span&gt;: &lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;topic&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; assert.&lt;span&gt;notEqual&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;topic, topic&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;run&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;; &lt;span&gt;// Run it&lt;/span&gt;&lt;br&gt;
&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;and you get a very nice report card out of the other end:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ajaxian.com/wp-content/images/vowsoutput.png&quot; alt=&quot;&quot; title=&quot;vowsoutput&quot; width=&quot;460&quot; height=&quot;301&quot; class=&quot;alignnone size-full wp-image-9730&quot;&gt;&lt;/p&gt;
&lt;p&gt;With macros you end up with very nice DSL syntax such as:&lt;/p&gt;
&lt;div class=&quot;igBar&quot;&gt;&lt;a href=&quot;javascript:showCodeTxt('javascript-24');&quot;&gt;PLAIN TEXT&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;syntax_hilite&quot;&gt;&lt;span&gt;JAVASCRIPT:&lt;/span&gt;
&lt;div id=&quot;javascript-24&quot;&gt;
&lt;div class=&quot;javascript&quot;&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;'GET /'&lt;/span&gt;: &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; topic: api.&lt;span&gt;get&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'/'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;'shoud respond with a 200 OK'&lt;/span&gt;: assertStatus&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;200&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;'POST /'&lt;/span&gt;: &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; topic: api.&lt;span&gt;post&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'/'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;'shoud respond with a 405 Method not allowed'&lt;/span&gt;: assertStatus&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;405&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;'GET /resources (no api-key)'&lt;/span&gt;: &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; topic: api.&lt;span&gt;get&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'/resources'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;'shoud respond with a 403 Forbidden'&lt;/span&gt;: assertStatus&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;403&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;'GET /resources?apikey=af816e859c249fe'&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; topic: api.&lt;span&gt;get&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'/resources?apikey=af816e859c249fe'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;'shoud return a 200 OK'&lt;/span&gt;: assertStatus&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;200&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;'should return a list of resources'&lt;/span&gt;: &lt;span&gt;function&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;res&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; assert.&lt;span&gt;isArray&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;res.&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;// or even&lt;/span&gt;&lt;br&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;
&amp;nbsp; &lt;span&gt;'GET&amp;nbsp; /'&lt;/span&gt;:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;respondsWith&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;200&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &lt;span&gt;'POST /'&lt;/span&gt;:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;respondsWith&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;405&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br&gt;
&amp;nbsp; &lt;span&gt;'GET&amp;nbsp; /resources (no key)'&lt;/span&gt;: respondsWith&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;403&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;
&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The website itself goes into exquisite detail on the install process, sample usage, and more. The website also happens to be beautiful itself, and full of HTML5 markup to boot.&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=G090uZxNuyw:YkgL21I31g0:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=G090uZxNuyw:YkgL21I31g0:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ajaxian?a=G090uZxNuyw:YkgL21I31g0:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ajaxian?i=G090uZxNuyw:YkgL21I31g0:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Thu, 01 Jul 2010 11:14:55 +0000</pubDate>
	<dc:creator>Dion Almaer</dc:creator>
</item>

</channel>
</rss>
