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

<channel>
	<title>The Naked Technologist</title>
	<atom:link href="http://www.nakedtechnologist.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.nakedtechnologist.com</link>
	<description>Technology, the web and everything else that gets in the way</description>
	<lastBuildDate>Thu, 27 May 2010 21:54:31 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Building social applications with OpenSocial 0.9 JavaScript APIs</title>
		<link>http://www.nakedtechnologist.com/?p=563</link>
		<comments>http://www.nakedtechnologist.com/?p=563#comments</comments>
		<pubDate>Mon, 17 May 2010 06:06:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Opensocial]]></category>
		<category><![CDATA[Social API]]></category>

		<guid isPermaLink="false">http://www.nakedtechnologist.com/?p=563</guid>
		<description><![CDATA[The majority of OpenSocial networks implement (or support) version 0.8 or version 0.9 of the specification. While version 1.0 is the upcoming release, version 0.9 will be the main focus of this post as it is the current standard employed by the Yahoo! Application Platform.  We will specifically explore the lightweight JavaScript APIs introduced [...]]]></description>
			<content:encoded><![CDATA[<p>The majority of OpenSocial networks implement (or support) version 0.8 or version 0.9 of the specification. While version 1.0 is the upcoming release, version 0.9 will be the main focus of this post as it is the current standard employed by the <a href="http://developer.yahoo.com/yap">Yahoo! Application Platform</a>.  We will specifically explore the lightweight JavaScript APIs introduced in OpenSocial 0.9, as well as some of the helper methods available.</p>
<ul>
<li class="bullist"><a href="#1">What Is OpenSocial</a></li>
<li class="bullist"><a href="#2">A Few Core Concepts</a></li>
<li class="bullist"><a href="#3">Capture User Profile Data to Personalize Your Application</a></li>
<li class="bullist"><a href="#4">Utilize User Connections to Build Your Social Graph</a></li>
<li class="bullist"><a href="#5">Promote and Customize Your Application Using Updates</a></li>
<li class="bullist"><a href="#6">The Gadgets API Tool Set</a></li>
<li class="bullist"><a href="#7">Summary</a></li>
</ul>
<p><a name="1"><br />
<h3>What Is OpenSocial</h3>
<p></a></p>
<p>OpenSocial is a set of common APIs for working with data from various social networks. The concept behind OpenSocial is to develop once and distribute broadly, meaning that if the OpenSocial specification is used to build out an application, it can be easily and quickly ported to another platform. This concept is important, because when building a social application, you want to reach the largest audience you can. Portability, along with the vast amount of user data that can be pulled, makes OpenSocial an ideal tool for quick and scalable development of social applications.</p>
<p>&nbsp;</p>
<p>Many networks and companies implement the OpenSocial specification, such as the Yahoo! Application Platform, MySpace, Orkut, and a large number of others. The <a href="http://wiki.opensocial.org">OpenSocial site</a> offers a full list of networks implementing the OpenSocial specification.</p>
<p><a name="2"><br />
<h3>A Few Core Concepts</h3>
<p></a></p>
<p>Before diving further into making OpenSocial JavaScript requests, there are a few core concepts of what we will cover in this spec as well as request methods that should be reviewed.</p>
<p>&nbsp;</p>
<p><strong>Lightweight JavaScript APIs</strong></p>
<p>With the implementation of OpenSocial 0.9 comes a new set of lightweight JavaScript APIs to help developers by providing simple JSON input/output through simple methods when making data requests to the REST APIs. This new feature significantly reduces the amount of code required to make requests and should reduce ramp-up time for developers.  These APIs use a new namespace (osapi) so that the requests will be nicely sandboxed from your older code base. </p>
<p>&nbsp;</p>
<p><strong>Batching Requests</strong></p>
<p>One of the important aspects to be aware of when making OpenSocial JavaScript requests is request batching. Instead of having to make multiple requests to capture profile information, connection details or updates, a user can tie all of those data fetches into a single AJAX request instead of three. This brings quite a performance boost to your application, for obvious reasons.  </p>
<p>&nbsp;</p>
<p>Additionally, batching requests will ensure that all data is obtained from the request prior to the callback being executed. In Listing 1, we set up a request to capture profile details for the owner of the application (labeled as ownerData) and then another request for the friends of the owner (labeled as ownerFriends).</p>
<pre name="code" class="js">
var batch = osapi.newBatch().
    add("ownerData", osapi.people.getOwner({fields: ['name']})).
    add('ownerFriends', osapi.people.get({userId: '@owner', groupId: '@friends'}));

batch.execute(function(result){
    var ownerName = result.ownerData.name.formatted;
});
</pre>
<p><em>Listing 1 &#8211; Batching Data Requests</em></p>
<p>&nbsp;</p>
<p>We’ll explore these requests in more detail in the following sections.</p>
<p><a name="3"><br />
<h3>Capture User Profile Data to Personalize Your Application</h3>
<p></a></p>
<p>Due to the rise of many social networks over the years, one realization about users has become blatantly obvious: the vast majority of people want everyone to know as much about them as they can cram onto their profile. While this is a concern from a privacy and &#8220;good sense&#8221; perspective, this wealth of knowledge provides the application developer with an extremely large warehouse of data that can be used to personalize applications.</p>
<p>&nbsp;</p>
<p>This can be anything, from demographically targeting ads, all the way to gender personalization. With all of this information readily available for use, the benefit here is quite clear.</p>
<p>&nbsp;</p>
<p>Let’s look at this from another angle. One thing that many users have become intolerant of is having to build multiple profiles for every application or social network they use. If you’re using an application on a popular social network like Facebook or MySpace, why would you want to have to type out the exact same information in that  application that you’ve already spent a painstaking amount of time entering into your profile? The simple fact is you don’t have to &mdash; and that’s why capturing and using the profile information of a user to pre-customize their experience is vital.</p>
<p>&nbsp;</p>
<p>This task can be accomplished quickly and easily using the getViewer or getOwner methods within OpenSocial (Listing 2).</p>
<pre name="code" class="js">
//opensocial person data request
osapi.people.getViewer({fields: ['name']}).execute(function(result){
    if (!result.error){
        var name = result.name.formatted;
    }
});
</pre>
<p><em>Listing 2 &#8211; Capturing User Profile Information</em></p>
<p>&nbsp;</p>
<p>To create a request to get details about a person, you need to take a few steps (all chained nicely together though).  Breaking down the request into its individual parts, we have three distinct sections.</p>
<ul>
<li class="bullist"><b>osapi.people.getViewer(&#8230;)</b> is the method which defines that we want to capture profile information from the viewer.  The parameter that we pass into this method is a JSON structure, which defines the fields that we want to return from the profile.  In this case, we want to capture the name of the viewer.</li>
<li class="bullist"><b>execute(&#8230;)</b> will initialize the viewer data request.</li>
<li class="bullist"><b>the callback</b>, listed as the parameter in the execute function, will be the callback that is hit when the viewer data request completes and will contain the person object returned (result parameter).  From this result we can use standard dot notation to get at the data we requested.</li>
</ul>
<p>&nbsp;</p>
<p>Every network implements its own list of supported OpenSocial.Person fields, depending on what’s included in their profile system. The full list of <a href="http://wiki.opensocial.org/index.php?title=Opensocial.Person_%28v0.9%">OpenSocial 0.9 Person fields</a> is described in the wiki.</p>
<p><a name="4"><br />
<h3>Utilize User Connections to Build Your Social Graph</h3>
<p></a></p>
<p>The connections a user creates generally builds out a social graph, which can be used to increase your user base and drive up activity. Connections are a two-way reciprocated link between two users, and when present, means that you are usually able to leverage off profile details of a wider range of people. These concepts work equally well in a follower model such as Twitter; you’re looking for a means of using a physical connection (like a friendship or work tie) to your advantage.</p>
<p>&nbsp;</p>
<p>Many of us who are present on any of the popular social networks have either participated in (or at least received) annoying status updates from one of the virally popular games such as Mafia Wars, Vampires, or Zombies. Peering into the innards of Mafia Wars, I can see that one of the reasons it has become so virally successful is because of the vast relevant social graph that they’ve built up in their game. </p>
<p>&nbsp;</p>
<p>The important word here is relevant &mdash; something that many networks struggle with at times. Most users of a social platform add many more people other than friends and family &mdash; coworkers, the postman, the cousin of the neighbor you say hi to while getting the paper in the morning &mdash; and these connections aren’t really what we can call relevant to the user. </p>
<p>&nbsp;</p>
<p>This means that, for the social container itself, the link between non-relevant users has far less value than one where the users know each other or interact with each other on a regular basis. This same concept is true for your application: When you build the links between the people who use your application, they need to have a way to interact with each other on a regular basis to be of any use to you. </p>
<p>&nbsp;</p>
<p>Mafia Wars does this by adding your application connections into your “mob,”  effectively making them interact with each other in some form whenever they play the game.</p>
<p>&nbsp;</p>
<p>Much like our previous person request, we can make a simple get request to capture owner friends (Listing 3).</p>
<pre name="code" class="js">
//get owner friends
osapi.people.get({userId: '@owner', groupId: '@friends', count: 10}).execute(function(result){
    if (!result.error){
        var friends = result.list;
        var html = '';
        for (var i = 0; i < friends.length; i++){
            html += friends[i].name.formatted + '';
        }
    }
});
</pre>
<p><em>Listing 3 &#8211; Capturing User Connections</em></p>
<p>&nbsp;</p>
<p>Again, this request can be split up into three individual sections:</p>
<ul>
<li class="bullist"><b>osapi.people.get(&#8230;)</b> is a standard get method that can be used to capture any people data.  In this case, we denote within the JSON passed into this function that we would like to capture information from the &#8220;owner&#8221; of the application where the groupId is &#8220;friends&#8221;.  These are simple strings defining that we would like to capture the owner&#8217;s friends.</li>
<li class="bullist"><b>execute(&#8230;)</b> will initialize the owner friend data request.</li>
<li class="bullist"><b>the callback</b>, listed as the parameter in the execute function, will be the callback that is hit when the owner friend data request completes and contains all friend person objects for the owner (friends parameter).  From this result, we can get the number of friends returned using .totalResults or loop through the list of person objects for each friend.</li>
</ul>
<p><a name="5"><br />
<h3>Promote and Customize Your Application Using Updates</h3>
<p></a></p>
<p>A powerful tool for social application developers is the ability to send updates to the stream of a user. The update stream is the central news area for the user and their connections.</p>
<p>&nbsp;</p>
<p><strong>Getting Updates</strong></p>
<p>Earlier I mentioned that users will go to great lengths to add in every detail about themselves and their lives into their profiles. What I didn’t mention is that those details might not always be fully accurate, or they may be out of date. </p>
<p>&nbsp;</p>
<p>The defining truth in any social network is the update stream of the user. When the user sends messages, who they’re contacting, what they’re doing, and what applications they’re using will all become accessible through this stream. This type of request will follow the same syntax as our previous requests but will use the activities API rather than the person API (Listing 4).</p>
<pre name="code" class="js">
//capture viewer activities
osapi.activities.get({userId: '@viewer', count: 20}).execute(function(result){
    if (!result.error){
        var activities = result.list;
        var html = '';

        for (var i = 0; i < activities.length; i++){
            html += 'Activity Title: ' + activities[i].title +
                    'Activity URL: ' + activities[i].url;
        }
    }
});
</pre>
<p><em>Listing 4 &#8211; Capturing User Activities</em></p>
<p>&nbsp;</p>
<p>Within this request we are making a call to <code>osapi.activities.get(...)</code>, denoting that we wish to return someone&#8217;s activity stream.  The JSON object provided as the parameter to this request denotes that we want the activities for a userid that matches that of the current application viewer and we would also like to return only 20 activities.</p>
<p>&nbsp;</p>
<p>Once this request completes, we can parse through each of the activities and use them however we&#8217;d like.</p>
<p>&nbsp;</p>
<p>For a full list of activity fields defined within the spec, see <a href="http://wiki.opensocial.org/index.php?title=Opensocial.Activity_%28v0.9%29">Opensocial.Activity</a>.</p>
<p>&nbsp;</p>
<p><strong>Setting Updates</strong></p>
<p>One of the best methods that a developer can use to encourage user growth in an application is to promote the application through the user update stream. Sadly, networks are generally overly saturated with applications, and they sometimes place applications in undesirable locations. </p>
<p>&nbsp;</p>
<p>The update stream is one of the few prime-time outlets to users that developers still have access to. When a developer taps into this by setting updates that draw in the users attention, they generally see a larger number of users coming to their application. When implementing this in your code, the syntax will look familiar to our previous GET request (Listing 5).</p>
<pre name="code" class="js">
//insert new activity for the current viewer
osapi.activities.create({
    userId: '@viewer',
    activity: {
        title: 'This is my activity',
        url: 'http://www.yahoo.com/'
    }
}).execute();
</pre>
<p><em>Listing 5 &#8211; Setting User Updates Setup</em></p>
<p>&nbsp;</p>
<p>To accomplish the update insert, we make a request to <code>osapi.activities.create(...)</code>.  As with our other requests, we will pass in a JSON payload defining what we&#8217;d like to insert.  In the preceding example, we set the userId to viewer to denote that we would like to insert the update for the current application user.  Within the activity definition, we create an object which contains the content of the activity.  Here we define the title and URL that the title should link to.</p>
<p>&nbsp;</p>
<p>There are numerous <a href="http://wiki.opensocial.org/index.php?title=Opensocial.Activity_%28v0.9%29">additional fields</a> available for developers to use in order to further customize the update.</p>
<p><a name="6"><br />
<h3>The Gadgets API Tool Set</h3>
<p></a></p>
<p>The gadgets API specification within OpenSocial contains a number of helpful utilities to make your development life easier. When building out applications in a container that has heavy restrictions on front-end code, these helper functions will be a lifesaver. Even if the restrictions aren’t there, not having to build out this functionality yourself makes development quicker &mdash; no need to reinvent the wheel.</p>
<p>&nbsp;</p>
<p><strong>AJAX Requests with gadgets.io</strong></p>
<p>One of the helpful utilities under gadgets.io is the makeRequest function for making AJAX requests. When creating social applications, it’s important that the user experience should be as seamless as possible. In this regard, running data requests in the background is an important implementation tactic.</p>
<pre name="code" class="js">
var params = {};
var url = 'http://www.mysite.com/myfile.php';
var callback = callbackFunc;
params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.
io.ContentType.TEXT;
params[gadgets.io.RequestParameters.METHOD] = gadgets.
io.MethodType.GET;
gadgets.io.makeRequest(url, callback, params);
function callbackFunc(response){
   if (response.text){
      //use data returned from server
   }
}</pre>
<p><em>Listing 6 &#8211; Making AJAX Requests</em></p>
<p>&nbsp;</p>
<p>In the makeRequest method, we define our parameter list to be the type and method of data request that we’re making. We set the content type as “TEXT” and the method as “GET”. The makeRequest call takes in three parameters; the URL to be called, the callback function to call once completed, and the optional parameter list defining what the content / method types are. When the callback is instantiated, we can pull our response object from response.text. </p>
<p>&nbsp;</p>
<p>The complete gadgets.io spec can be found on <a href="http://wiki.opensocial.org/index.php?title=Gadgets.io_%28v0.9%29">OpenSocial  gadgets.io</a>.</p>
<p>&nbsp;</p>
<p><strong>Localization Support with gadgets.Prefs</strong></p>
<p>Another helpful utility within the gadgets spec provides the ability to pull out user localization information for your application using gadgets.Prefs. When building applications, chances are that your app will be seen throughout numerous countries, with numerous languages. Being aware of these details will allow you to better gear your application towards the needs of the viewer. </p>
<p>&nbsp;</p>
<p>Using gadgets.Prefs, we can pull out the country and language of preference for the user. These two values will go a long way towards customizing your application for your user base (Listing 7).</p>
<pre name="code" class="js">
var prefs = new gadgets.Prefs();
var country = prefs.getCountry();
var language = prefs.getLang();</pre>
<p><em>Listing 7 &#8211; Capturing User Localization Information</em></p>
<p>&nbsp;</p>
<p>The complete gadgets.Prefs spec can be found on <a href="http://wiki.opensocial.org/index.php?title=Gadgets.Prefs_(v0.9)">OpenSocial gadgets.Prefs</a>.</p>
<p><a name="7"><br />
<h3>Summary</h3>
<p></a></p>
<p>OpenSocial seeks to bridge a large gap, providing common methods for accessing social data on a wide range of networks, allowing developers to build once and distribute broadly. This concept allows a developer to construct an application and deploy it across many supporting networks, providing maximum impact and the most views for a minimal effort.</p>
<p>&nbsp;</p>
<p><b>- Jonathan LeBlanc</b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nakedtechnologist.com/?feed=rss2&amp;p=563</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yahoo! Developer Network Updates (Third Podcast)</title>
		<link>http://www.nakedtechnologist.com/?p=559</link>
		<comments>http://www.nakedtechnologist.com/?p=559#comments</comments>
		<pubDate>Mon, 26 Apr 2010 19:50:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Videos]]></category>
		<category><![CDATA[podcast]]></category>
		<category><![CDATA[Yahoo!]]></category>
		<category><![CDATA[YQL]]></category>

		<guid isPermaLink="false">http://www.nakedtechnologist.com/?p=559</guid>
		<description><![CDATA[This is the third &#8220;State of the Yahoo! Developer Network&#8221; podcast with Gene Crawford of unmatchedstyle.com.  In this episode we talk about the new Yahoo! Firehose for accessing 1 million + social updates per day, the sketch-a-search iPhone search app and Yahoo! Entertainment iPad app, as well as reviewing updates and plans for YQL. [...]]]></description>
			<content:encoded><![CDATA[<p>This is the third &#8220;State of the Yahoo! Developer Network&#8221; podcast with Gene Crawford of <a href="http://www.unmatchedstyle.com" target="_blank">unmatchedstyle.com</a>.  In this episode we talk about the new <a href="http://developer.yahoo.net/blog/archives/2010/04/yahoo_updates_firehose.html" target="_blank">Yahoo! Firehose</a> for accessing 1 million + social updates per day, the <a href="http://itunes.apple.com/us/app/yahoo-sketch-a-search/id361077521?mt=8" target="_blank">sketch-a-search</a> iPhone search app and <a href="http://itunes.apple.com/us/app/yahoo-entertainment/id363783657?mt=8" target="_blank">Yahoo! Entertainment</a> iPad app, as well as reviewing updates and plans for <a href="http://developer.yahoo.com/yql" target="_blank">YQL</a>. </p>
<p>&nbsp;</p>
<div align="center">
<embed src="http://blip.tv/play/gqUjgdmCLQI%2Em4v" type="application/x-shockwave-flash" width="480" height="346" allowscriptaccess="always" allowfullscreen="true"></embed>
</div>
<p>&nbsp;</p>
<p><b>- Jonathan LeBlanc</b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nakedtechnologist.com/?feed=rss2&amp;p=559</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I&#8217;m speaking at Open Source Bridge</title>
		<link>http://www.nakedtechnologist.com/?p=546</link>
		<comments>http://www.nakedtechnologist.com/?p=546#comments</comments>
		<pubDate>Wed, 21 Apr 2010 06:33:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Conferences]]></category>
		<category><![CDATA[YQL]]></category>

		<guid isPermaLink="false">http://www.nakedtechnologist.com/?p=546</guid>
		<description><![CDATA[I just received confirmation that one of my proposals (the YQL talk) was accepted for Open Source Bridge in Portand, Oregon from June 1-4.  If you're heading out to the conference let me know on <a href="http://www.twitter.com/jcleblanc" target="_blank">twitter</a> so that we can meet up at the conference.  ]]></description>
			<content:encoded><![CDATA[<p><img src="http://opensourcebridge.org/badges/2010/speak125.png" width="125" height="125" alt="I'm speaking at Open Source Bridge" style="background-color:#fff; float:left; margin:0 10px 10px 0;" />I just received confirmation that one of my proposals (the YQL talk) was accepted for Open Source Bridge in Portand, Oregon from June 1-4.  If you&#8217;re heading out to the conference let me know on <a href="http://www.twitter.com/jcleblanc" target="_blank">twitter</a> so that we can meet up at the conference.</p>
<p>&nbsp;</p>
<p>I&#8217;m hoping to provide some live demos of YQL and build out some real use cases around using open data to build out applications.  We have some great data that the community would be interested in within YQL including government data, geo targeting tables, as well as many others.  Below is the presentation I will be delivering at the conference:</p>
<p>&nbsp;</p>
<p><b>Title:</b> SELECT * FROM Internet Using YQL<br />
<b>Link:</b> <a href="http://opensourcebridge.org/proposals/379" target="_blank">http://opensourcebridge.org/proposals/379</a></p>
<p>&nbsp;</p>
<p><b>Excerpt:</b></p>
<div style="font-style:italic">Treating the internet and all its sources as a database, YQL seeks to allow developers to explore government, social, api and all other external data in a standardized way. Further allowing developers to manipulate this data and mash different sources together, YQL works to open up the web and all its sources.</div>
<p>&nbsp;</p>
<p><b>Description:</b></p>
<div style="font-style:italic">
The Yahoo! Query Language provides a rich and dynamic method for obtaining and manipulating data from any source or API on the internet – with YQL the internet becomes your database. Using the simplified SQL syntax that YQL is based in, YQL seeks to open all data on the web into a standardized format. Manipulating and mashing up sources as if they were tables, YQL becomes a repository for exploring government, event, social and API data on the web.</p>
<p>&nbsp;</p>
<p>This talk will cover the core techniques within YQL, including server-side JavaScript with native E4X support for manipulating data, key / value pair data storage and the process of creating your own YQL tables for accessing web based content. Going further with the integration of the open authentication standards defined by OAuth, we’ll delve into advanced authentication techniques using this standard within YQL.
</p></div>
<p>&nbsp;</p>
<p><b>- Jonathan LeBlanc</b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nakedtechnologist.com/?feed=rss2&amp;p=546</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Slideshare Slideshows YQL Table</title>
		<link>http://www.nakedtechnologist.com/?p=540</link>
		<comments>http://www.nakedtechnologist.com/?p=540#comments</comments>
		<pubDate>Sun, 18 Apr 2010 04:00:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[YQL]]></category>

		<guid isPermaLink="false">http://www.nakedtechnologist.com/?p=540</guid>
		<description><![CDATA[I&#8217;m in the process of building out a new personal site which will use YQL to pull in all of my recent photos, slideshows, events, etc. from the different sites I use to build out the content of the website.  This task has led me to create a new YQL table to wrap the [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m in the process of building out a new personal site which will use YQL to pull in all of my recent photos, slideshows, events, etc. from the different sites I use to build out the content of the website.  This task has led me to create a new YQL table to wrap the slideshow RSS feed to display the slideshows of a user.  </p>
<p>&nbsp;</p>
<p>This new table is available at <a href="http://github.com/yql/yql-tables/blob/master/slideshare/slideshare.slideshows.xml" target="_blank">http://github.com/yql/yql-tables/blob/master/slideshare/slideshare.slideshows.xml</a> for the time being until it becomes available in the community tables in the <a href="http://developer.yahoo.com/yql/console">YQL Console</a>.  You can test the new table out in the console by using the USE clause as <a href="http://developer.yahoo.com/yql/console/?q=USE%20%27http%3A%2F%2Fgithub.com%2Fyql%2Fyql-tables%2Fraw%2Fmaster%2Fslideshare%2Fslideshare.slideshows.xml%27%20AS%20slideshare.slideshows%3B%20SELECT%20*%20FROM%20slideshare.slideshows%20WHERE%20user%3D%27jcleblanc%27&#038;env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&#038;debug=true" target="_blank">displayed here</a>.  The feed that will be available to a developer using this table will look like the below:</p>
<p>&nbsp;</p>
<p><script src="http://gist.github.com/369986.js"></script></p>
<p>&nbsp;</p>
<p><b>- Jonathan LeBlanc</b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nakedtechnologist.com/?feed=rss2&amp;p=540</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My Proposals at Open Source Bridge 2010</title>
		<link>http://www.nakedtechnologist.com/?p=474</link>
		<comments>http://www.nakedtechnologist.com/?p=474#comments</comments>
		<pubDate>Thu, 08 Apr 2010 01:03:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Opensocial]]></category>
		<category><![CDATA[YQL]]></category>

		<guid isPermaLink="false">http://www.nakedtechnologist.com/?p=474</guid>
		<description><![CDATA[
The Open Source Bridge conference will be going on from June 1-4, 2010 in Portland, Oregon.  This conference would be a great opportunity to explore open source development and techniques in the industry.  Open Source conferences like this are very important for the promotion of open development products and pushing web standards.  [...]]]></description>
			<content:encoded><![CDATA[<div style="float:left; padding:0 10px 10px 0;width:135px;height:135px;"><a href="http://opensourcebridge.org/?ref=2010submit125" mce_href="http://opensourcebridge.org/?ref=2010submit125"><img src="http://opensourcebridge.org/badges/2010/submit125.png" mce_src="http://opensourcebridge.org/badges/2010/submit125.png" style="background-color:#fff;" alt="I’m Submitting a Talk to Open Source Bridge – June 1–4, 2010 – Portland, OR" border="0" /></a></div>
<p>The <a href="http://opensourcebridge.org/" target="_blank">Open Source Bridge</a> conference will be going on from June 1-4, 2010 in Portland, Oregon.  This conference would be a great opportunity to explore open source development and techniques in the industry.  Open Source conferences like this are very important for the promotion of open development products and pushing web standards.  If you have an opportunity to make it out to this conference I would definitely suggest heading out their way.</p>
<p>&nbsp;</p>
<p>I&#8217;ve submitted two proposals to the conference for this year:</p>
<ul>
<li><a href="http://opensourcebridge.org/proposals/377" target="_blank">Harnessing the Social Web with OpenSocial 0.9</a></li>
<li><a href="http://opensourcebridge.org/proposals/379" target="_blank">SELECT * FROM Internet Using YQL</a></li>
</ul>
<p>&nbsp;</p>
<p><b>- Jonathan LeBlanc</b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nakedtechnologist.com/?feed=rss2&amp;p=474</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building Flickr URLs from YQL flickr.photos.search Results</title>
		<link>http://www.nakedtechnologist.com/?p=476</link>
		<comments>http://www.nakedtechnologist.com/?p=476#comments</comments>
		<pubDate>Tue, 06 Apr 2010 15:32:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[YQL]]></category>
		<category><![CDATA[Flickr]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.nakedtechnologist.com/?p=476</guid>
		<description><![CDATA[After having to build out the URL structure from the ]]></description>
			<content:encoded><![CDATA[<p>After having to build out the URL structure from the <a href="http://developer.yahoo.com/yql' target='_blank'>Yahoo! Query Language (YQL)</a> results returned by the flickr.photos.search table yet again, I&#8217;ve decided to actually document how to generate <a href="http://www.flickr.com' target='_blank'>Flickr</a> URLs using the results returned from YQL.  </p>
<p>&nbsp;</p>
<p>When we use YQL the structure of results returned by a Flickr photo search contains all of the pieces that you will need to generate a whole series of author and photo links with Flickr, but it does not go the extra step of returning these links back to you.  For instance, if we run a Flickr photo search query within the YQL (e.g. <a href="http://developer.yahoo.com/yql/console/?q=select%20*%20from%20flickr.photos.search%20where%20has_geo%3D%22true%22%20and%20text%3D%22san%20francisco%22" target="_blank">http://developer.yahoo.com/yql/console/?q=select%20*%20from%20flickr.photos.search%20where%20has_geo%3D%22true%22%20and%20text%3D%22san%20francisco%22</a>) the result set that is returned back from YQL from flickr.photos.search looks something like this:</p>
<pre class="xml" name="code">
<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="10" yahoo:created="2010-03-31T06:27:19Z" yahoo:lang="en-US" yahoo:updated="2010-03-31T06:27:19Z" yahoo:uri="http://query.yahooapis.com/v1/yql?q=select+*+from+flickr.photos.search+where+has_geo%3D%22true%22+and+text%3D%22san+francisco%22">
    <diagnostics>
<publiclyCallable>true</publiclyCallable>
        <url execution-time="444"><![CDATA[http://api.flickr.com/services/rest/?method=flickr.photos.search&#038;has_geo=true&#038;text=san%20francisco&#038;page=1&#038;per_page=10]]&gt;</url>
        <user-time>445</user-time>
        <service-time>444</service-time>
        <build-version>5275</build-version>
    </diagnostics>
    <results>
<photo farm="3" id="4477865149" isfamily="0" isfriend="0" ispublic="1" owner="15934794@N03" secret="5b4c8501cb" server="2704" title="Jagged Edge"/>
<photo farm="5" id="4478473530" isfamily="0" isfriend="0" ispublic="1" owner="16091106@N00" secret="be83bdeaa6" server="4034" title="Montgomery Street"/>
<photo farm="5" id="4478415772" isfamily="0" isfriend="0" ispublic="1" owner="54726853@N00" secret="3899a2b7a9" server="4050" title="the Ferry Building as seen from Grant Avenue at Commercial Street, San Francisco, July 4, 2009"/>
<photo farm="5" id="4477746749" isfamily="0" isfriend="0" ispublic="1" owner="24215152@N04" secret="dfb17c637a" server="4069" title="Beach dogs"/>
<photo farm="5" id="4478348062" isfamily="0" isfriend="0" ispublic="1" owner="40432809@N05" secret="b9702f581a" server="4037" title="I can see my life stretchin' out before me."/>
<photo farm="3" id="4478335940" isfamily="0" isfriend="0" ispublic="1" owner="76608717@N00" secret="f991cf00a5" server="2682" title="Tongue"/>
<photo farm="3" id="4477712091" isfamily="0" isfriend="0" ispublic="1" owner="76608717@N00" secret="8380a0aed0" server="2682" title="Favorite"/>
<photo farm="5" id="4477711369" isfamily="0" isfriend="0" ispublic="1" owner="76608717@N00" secret="2e9ca9ebc6" server="4056" title="Football player"/>
<photo farm="5" id="4478325942" isfamily="0" isfriend="0" ispublic="1" owner="98732074@N00" secret="2a6f6bac18" server="4017" title="Old Pier 22-1/2 Fire House"/>
<photo farm="5" id="4477695779" isfamily="0" isfriend="0" ispublic="1" owner="98732074@N00" secret="c6e23421a0" server="4018" title="Old Pier 22-1/2 Fire House"/>
    </results>
</query>
</pre>
<p>&nbsp;</p>
<p>Now let&#8217;s take a look at how to do something with those data pieces.</p>
<p>&nbsp;</p>
<p><b>Generating an image source</b><br />
Using the farm, server, id and secret parameters from the result set, we can generate an image source that will display the searched image.  The structure of the source using these parameters will look like:</p>
<pre class='html' name='code'>
&lt;img src='http://farm{$farm}.static.flickr.com/{$server}/{$id}_{$secret}.jpg' alt='{$title}' /&gt;
</pre>
<p>&nbsp;</p>
<p><b>Generating a link back to the photo page on Flickr</b><br />
Under the terms of service, all photos that you use from Flickr will need to link back to the Flickr photo page of the owner.  Using the owner and id parameters from the result set, we can generate a link back to the Flickr page for the searched image.  Building upon the image source that we built above, we can wrap the image with a link that sends the user back to the original image page on Flickr:</p>
<pre class='html' name='code'>
&lt;a href='http://www.flickr.com/photos/{$owner}/{$id}' target='_blank'&gt;
&lt;img src='http://farm{$farm}.static.flickr.com/{$server}/{$id}_{$secret}.jpg' alt='{$title}' /&gt;
&lt;/a&gt;
</pre>
<p>&nbsp;</p>
<p><b>Generating a link back to the photo owner&#8217;s profile</b><br />
It&#8217;s always nice to provide a credit for the photo by linking back to the root profile of the photo owner (instead of just the photo page that we saw above).  By using the owner variable in the photo return data, we can easily create a link back to the profile of the photo owner and give him/her credit.  Building upon our current linked photo example, we can add in one more piece to do this:</p>
<pre class='html' name='code'>
&lt;a href='http://www.flickr.com/photos/{$owner}/{$id}' target='_blank'&gt;
&lt;img src='http://farm{$farm}.static.flickr.com/{$server}/{$id}_{$secret}.jpg' alt='{$title}' /&gt;
&lt;/a&gt;
&lt;a href="http://www.flickr.com/photos/{$owner}" target="_blank"&gt;Photo Owner&lt;/a&gt;
</pre>
<p>&nbsp;</p>
<p>Now let&#8217;s see how to code a script in PHP that will output the photos wrapped in links back to their original sources (as seen in the second example above listed as &#8220;Generating a link back to the photo page on Flickr&#8221;).  What we do in the code below is generate the YQL query URL, capture the results into a variable using simplexml_load_file, then pass the array of photos through to a function to build the HTML for us.  </p>
<pre class='html' name='code'>
&lt;?php
$yql_url = 'http://query.yahooapis.com/v1/public/yql?';
$query = 'SELECT * FROM flickr.photos.search WHERE has_geo="true" AND text="san francisco"';
$query_url = $yql_url . 'q=' . urlencode($query) . '&#038;format=xml';

$photos = simplexml_load_file($query_url);
$result = build_photos($photos->results->photo);
echo $result;

function build_photos($photos){
    $html = '';
    if (count($photos) > 0){
        foreach ($photos as $photo){
            $html .= "&lt;a href='http://www.flickr.com/photos/{$photo['owner']}/{$photo['id']}' target='_blank'&gt;&lt;img src='http://farm4.static.flickr.com/{$photo['server']}/{$photo['id']}_{$photo['secret']}.jpg' width='75' height='75' alt='{$photo['title']}' /&gt;&lt;/a&gt;";
        }
    } else {
        $html .= 'No Photos Found';
    }
    return $html;
}
?&gt;
</pre>
<p>These are easy ways of displaying Flickr photos and links based on the results returned from the flickr.photo.search table in YQL.  They&#8217;re simple examples but worth documenting so that you don&#8217;t need to go through the hassle of pieces the URL structures together on your next project.</p>
<p>&nbsp;</p>
<p><b>- Jonathan LeBlanc</b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nakedtechnologist.com/?feed=rss2&amp;p=476</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Confoo Conference Screencasts and Overview</title>
		<link>http://www.nakedtechnologist.com/?p=470</link>
		<comments>http://www.nakedtechnologist.com/?p=470#comments</comments>
		<pubDate>Thu, 25 Mar 2010 04:00:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Caja]]></category>
		<category><![CDATA[Conferences]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[OpenID]]></category>
		<category><![CDATA[Opensocial]]></category>
		<category><![CDATA[Screencast]]></category>
		<category><![CDATA[YAP]]></category>
		<category><![CDATA[YQL]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://www.nakedtechnologist.com/?p=470</guid>
		<description><![CDATA[A few weeks ago I was out in Montreal, Quebec for the Confoo.ca Conference.  This conference tied in many technology groups under one roof &#8211; PHP Québec, Montréal-Python, Montréal on Rails, W3Qc and OWASP Montréal &#8211; all congregating at the Hilton Bonaventure Hotel in downtown Montreal.  From what they told us, the conference [...]]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago I was out in Montreal, Quebec for the <a href="http://confoo.ca/en">Confoo.ca Conference</a>.  This conference tied in many technology groups under one roof &#8211; PHP Québec, Montréal-Python, Montréal on Rails, W3Qc and OWASP Montréal &#8211; all congregating at the Hilton Bonaventure Hotel in downtown Montreal.  From what they told us, the conference had: 500 session proposals, 100 speakers, 130 sessions, and 250 visitors over a three-day period.</p>
<p>&nbsp;</p>
<p>While I was out there I gave a few presentations on some of the great technology coming out of Yahoo.  On Friday I ran through a talk on &#8220;Browser MVC with YQL and YUI,&#8221; highlighting the highly extensible nature of YQL to accept design patterns such as MVC and visualization and controller capabilities built into technologies such as YUI.  This is a screencast with the presentation as the audio overlay &#8211; if you missed the talk then you can catch it below.</p>
<div align="center">
<div style="width:425px" id="__ss_3411109"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/jcleblanc/browser-mvc-with-yql-and-yui" title="Browser MVC with YQL and YUI">Browser MVC with YQL and YUI</a></strong><object width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=confoobrowsermvc03122010-100312101651-phpapp02&#038;stripped_title=browser-mvc-with-yql-and-yui" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=confoobrowsermvc03122010-100312101651-phpapp02&#038;stripped_title=browser-mvc-with-yql-and-yui" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/jcleblanc">Jonathan LeBlanc</a>.</div>
</div>
</div>
<p>&nbsp;</p>
<p>The other talk I gave (on Wednesday afternoon) &#8220;Foundations of a Social Application Platform&#8221;, had to do with some of the core technologies behind social platforms like YAP, MySpace and Facebook.  This is a look in from the perspective of a developer and is taken from the years of work we&#8217;ve invested in developing applications on many social networks.  Below is the screencast from the presentation:</p>
<div align="center">
<div style="width:425px" id="__ss_2357544"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/jcleblanc/foundations-of-a-social-platform" title="Foundations of a Social Application Platform">Foundations of a Social Application Platform</a></strong><object width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=socialplatforms-091027092809-phpapp01&#038;stripped_title=foundations-of-a-social-platform" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=socialplatforms-091027092809-phpapp01&#038;stripped_title=foundations-of-a-social-platform" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/jcleblanc">Jonathan LeBlanc</a>.</div>
</div>
</div>
<p>&nbsp;</p>
<p>During the conference I had a chance to meet up with <a href="http://www.twitter.com/ashyboy">Asher Snyder</a> (EVP of Technology) and Philip Ross (VP of Engineering) who work on a very interesting PHP Framework called <a href="http://www.noloh.com/#/home/">NOLOH</a> (Not One Line Of HTML).  Asher ran me through the foundations and functionality behind the makeup of the framework.  I can definitely see the potential of NOLOH for server-side engineers who don&#8217;t want to deal with the front-end code and functionality of a site or web application.  NOLOH integrates a rich set of widgets to rival many of the JavaScript libraries out there . When I asked about the performance of the framework Asher assured me that includes are added in as they are needed, speeding up initial page load.  I unfortunately had to miss his talk because it overlapped one of my own but Asher sent by a screencast.  One of the other nice pieces of the framework that I saw were the listeners that allow you to tie in a data request for the transport layer.  At the end of the screencast Asher ties in flickr photos into his listener but I was thinking of the potential of integrating that with the dynamic data fetching capabilities of YQL.  Take a look at  &#8220;<a href="http://www.noloh.com/#/home/">NOLOH PHP Framework &#8211; Unified Server Side Development</a>&#8220;, and see for yourself.</p>
<p>&nbsp;</p>
<div align="center"><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10106797&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=10106797&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object>
<p><a href="http://vimeo.com/10106797">NOLOH PHP Framework &#8211; Unified Server Side Development</a> from <a href="http://vimeo.com/user2821870">Asher Snyder</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
</div>
<p>&nbsp;</p>
<p>Diving into the innards of SQL and the uses of EXPLAIN we had an expert presentation from <a href="http://www.twitter.com/sheeri">Sheeri Cabral</a> of <a href="http://www.pythian.com/">Pythian</a> on &#8220;<a href="http://bit.ly/explainslides">Bending Queries to Your Will with EXPLAIN</a>&#8221; (A.K.A Optimizing Queries with EXPLAIN).  These are some great slides for all you database administrators out there.</p>
<p>&nbsp;</p>
<p>I can&#8217;t dive into all of the talks that were given but if more information is what you&#8217;re looking for then take a look at these links:
<ul>
<li class="bullist">Confoo Flickr Group: <a href="http://www.flickr.com/groups/confoo">http://www.flickr.com/groups/confoo</a></li>
<li class="bullist">Tweets About Confoo: <a href="http://search.twitter.com/search?q=confoo">http://search.twitter.com/search?q=confoo</a></li>
<li class="bullist">Slide Downloads for Sessions: <a href="http://confoo.ca/en/download">http://confoo.ca/en/download</a></li>
</ul>
<p></p>
<p>&nbsp;</p>
<p><b>- Jonathan LeBlanc</b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nakedtechnologist.com/?feed=rss2&amp;p=470</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An Exploration of HTML 5</title>
		<link>http://www.nakedtechnologist.com/?p=466</link>
		<comments>http://www.nakedtechnologist.com/?p=466#comments</comments>
		<pubDate>Mon, 22 Mar 2010 02:41:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.nakedtechnologist.com/?p=466</guid>
		<description><![CDATA[
Photo from justinsomniaOriginal t-shirt version

&#160;
At the Confoo.ca conference in Montreal, Quebec, Mark Pilgrim of Google gave an impressive keynote providing an overview of the current state of HTML 5.  The information in this post was inspired by his comphehensive talk.  Are you wondering what is currently available in HTML 5 and if you [...]]]></description>
			<content:encoded><![CDATA[<div style="float:right;align:right;padding:0 0 10px 10px;width:210;align:center;" /><img src="http://farm1.static.flickr.com/191/513636061_98d07f7966.jpg" width="200" alt="HTML 5 Fist" />
<div align="right">Photo from <a href="http://www.flickr.com/photos/justinsomnia/513636061/">justinsomnia</a><br />Original <a href="http://www.alistapart.com/store/tshirt-xhtmlfist">t-shirt version</a></div>
</div>
<p>&nbsp;</p>
<p>At the <a href="http://confoo.ca/en">Confoo.ca</a> conference in Montreal, Quebec, Mark Pilgrim of Google gave an impressive keynote providing an overview of the current state of HTML 5.  The information in this post was inspired by his comphehensive talk.  Are you wondering what is currently available in HTML 5 and if you can start using it?  Take a look at <a href="http://ishtml5readyyet.com">ishtml5readyyet.com</a> or <a href="http://ishtml5ready.com">ishtml5ready.com</a> to get your answer.</p>
<p>&nbsp;</p>
<p>If you take a look at <a href="http://ishtml5ready.com">ishtml5ready.com</a> in a browser that supports HTML 5 you&#8217;ll see that HTML 5 is somewhat ready.  That is, some browsers provide some current support for HTML 5.  But that shouldn&#8217;t stop us from playing around with it right?</p>
<p>&nbsp;</p>
<p>HTML5 is a container term used to describe a technology bundle that makes up the new standard.  What HTML 5 really encapsulates is HTML 5, CSS 3, and JavaScript all thrown together into the pleasantly marketeering term that is HTML 5.  Did you look at those links above in Internet Explorer?  Well I&#8217;m afraid you&#8217;re out of luck for the time being.  The A-grade browsers that are currently supporting some of the features of HTML 5 include Safari, Chrome, Firefox and Opera.  Still want to use HTML 5 in IE?  If you simply put the term &#8220;<a href="http://search.yahoo.com/search?p=%22HTML5+elements+in+IE%22&#038;ei=UTF-8&#038;fr=chrf-ytbm">HTML5 elements in IE</a>&#8221; (linked directly to Yahoo! Search because I know you all use it right?) into your favorite search engine you&#8217;ll get a nice wrapper on how to do this.</p>
<p>&nbsp;</p>
<p>Let&#8217;s explore a few of the great improvements coming in HTML 5:</p>
<p>&nbsp;</p>
<p><b>Grouping Tags</b><br />
There are a number of new tags available for all of your tag grouping needs.  <a href="http://dev.w3.org/html5/spec/semantics.html#the-hgroup-element">&lt;hgroup&gt;</a> is used for defining logical groups of tags or sections on your page, <a href="http://dev.w3.org/html5/spec/semantics.html#the-nav-element">&lt;nav&gt;</a> is present to define navigation systems &#8211; great for search engines to easily define your site structure. Tags such as <a href="http://dev.w3.org/html5/spec/semantics.html#the-section-element">&lt;section&gt;</a>, <a href="http://dev.w3.org/html5/spec/semantics.html#the-article-element">&lt;article&gt;</a> and <a href="http://dev.w3.org/html5/spec/semantics.html#the-aside-element">&lt;aside&gt;</a> can be used for data grouping.  Properly using these tags can help you easily define the sections and most important content of your page. This helps search engine crawlers pick up the structure of your website.</p>
<p>&nbsp;</p>
<p><b>Form Elements and Attributes</b><br />
Forms have received quite a nice overhaul in HTML 5 with new features and methods for defining what data truly is.  Let&#8217;s take a look at these changes:</p>
<ul>
<li class="bullist"><b>Sliders:</b> Creating a simple slider within a form is as simple as defining &lt;input type=&#8221;range&#8221; &#8230;&gt; &#8211; no more JavaScript needed.</li>
<li class="bullist"><b>Auto Focus:</b> If you need to autofocus the user directly on a part of your form when they first come to your site (plea: please don&#8217;t) then the autofocus parameter of an input field is ready to do the dirty work.  Simply use the format &lt;input autofocus &#8230;&gt; and you&#8217;re ready to go.  This standardizes the approach so that websites no longer have to use a level of JavaScript interaction to accomplish the same task.</li>
<li class="bullist"><b>Placeholder Text:</b> In an input field, it&#8217;s sometimes neccessary to guide your users to input the values you expect, using the <i>value</i> attribute (e.g., add mm/dd/yyyy for them to define a date).  This usually involves adding a click event with JavaScript such as <i>this.value = &#8220;&#8221;</i> to purge the input when the user clicks on it. Then you need some alternate logic to put the placeholder back when the focus is no longer on the input and the user didn&#8217;t type anything.  This is where the placeholder attribute comes in.  Using the form of &lt;input placeholder=&#8221;some text&#8221; &#8230;&gt; the input box will take care of this for you.  You have a populated value of &#8220;some text.&#8221; When the user clicks on the input it disappears, then reappears when the user clicks off of the input and there is no text. Simple yet brilliant. (Currently works in 2 browsers.)</li>
<li class="bullist"><b>Calendar Picker:</b> Prior to HTML 5, calendar pickers in forms were non-standard and usually involved some fairly hefty JavaScript components or libraries to build the functionality.  In HTML 5, we have a new input type called datetime, used in the form of &lt;input type=&#8221;datetime&#8221; &#8230;&gt;.  This generates a standard input form for the user. When a user clicks on it, it pops up a calendar picker widget automatically.  Less code is always a win.</li>
<li class="bullist"><b>Multiple File Uploader:</b> Extending upon the file type of an input field, a new &#8220;multiple&#8221; property implementation allows you to specify multiple files for upload and takes the form of &lt;input type=&#8217;file&#8217; multiple &#8230;&gt;.  When selecting multiple files,  you should display &#8220;N files&#8221; in the input box, instead of the single filename. (Currently works only in Safari.)</li>
<li class="bullist"><b>Yet More Input Types:</b> There are even more input types that you can logically define.  type=&#8221;email&#8221; and type=&#8221;url&#8221; are  definitions you can explore to define the data that users will input into your forms.</li>
</ul>
<p>&nbsp;</p>
<p>Simply put, forms make sense now.  No need to heavily augment a form with layers of visualization and JavaScript just to allow data to be defined as it should be in the first place, or to allow base levels of functionality that everyone uses anyway.  If you want to see what your current browser supports, take a look at <a href="http://www.miketaylr.com/code/input-type-attr.html">www.miketaylr.com/code/input-type-attr.html</a>.</p>
<p>&nbsp;</p>
<p><b>Accessibility</b><br />
HTML 5 has not forgotten about improving web accessibility.  <a href="http://www.w3.org/WAI/intro/aria">ARIA (Accessibly Rich Internet Applications)</a> defines methods for building websites and web applications in a way that make them more accessible to people wth disabilities.  One way HTML 5 endeavors to improve ARIA capabilities is through the use of the role=&#8217;group&#8217; attribute, which will allow screenreaders to properly define group content.  For a more comprehensive look at common ARIA attributes, take a look at <a href="http://dev.w3.org/html5/markup/aria/aria.html">dev.w3.org/html5/markup/aria/aria.html</a> or search for &#8220;ARIA accessibility&#8221; in your favorite search engine.</p>
<p>&nbsp;</p>
<p><b>Web Fonts</b><br />
From the time I first started developing web applications I knew that font support was a joke and never functioned as it should have (great idea &#8211; bad implementation).  Well, this fact is no longer true, I am happy to say.  Web fonts finally work, allowing you to define your own font faces, even if all browsers have different implementations.  For more information, take a look at Paul Irish&#8217;s post: <a href="http://paulirish.com/2009/bulletproof-font-face-implementation-syntax/">Bulletproof @font-face syntax</a>.</p>
<p>&nbsp;</p>
<p><b>Video and Audio</b><br />
<img src="http://i919.photobucket.com/albums/ad40/jcleblanc/html5_video_youtube.jpg?t=1268948709" width="319" height="192" alt="HTML 5 video tag screenshot from YouTube" style="float:right;padding:0 0 10px 10px" /><br />
Video is now scriptable, folks.  With the new <a href="http://dev.w3.org/html5/spec/video.html#video">&lt;video&gt;</a> tag, you&#8217;ll be able to include a video player, implementing ogv &#038; mp4 formats.  You can now use DOM scripting to control video &#8211; mute, forward, stop &#8211; all through the DOM.  The <a href="http://dev.w3.org/html5/spec/video.html#audio">&lt;audio&gt;</a> tag is there as well, to include audio files easily.  If you want to see the video tag in action, go to <a href="http://youtube.com/html5">youtube.com/html5</a> to opt in to HTML 5 standards beta.  YouTube will not use the Flash player when video tag support is available in the browser and uses the HTML 5 video player instead.  The video tag may be styled in exactly the same way as you would see with the standard Flash video players out there.  </p>
<p>&nbsp;</p>
<p><b>Freeform Drawing with Canvas</b><br />
Have you ever wanted a blank canvas where you could programmatically draw anything within a website or web application?  Well there are a number of server-side languages that do this &#8211; but have you ever wanted to do this through scripting (with a little bit of embedded JavaScript)?  Well that&#8217;s where the <a href="http://dev.w3.org/html5/spec/the-canvas-element.html#the-canvas-element">&lt;canvas&gt;</a> tag comes in.  There are many canvas demos available for you to see exactly what can be done with the canvas tag by typing in &#8220;<a href="http://search.yahoo.com/search?p=HTML5+canvas+demos&#038;ei=UTF-8&#038;fr=chrf-ytbm">HTML5 canvas demos</a>&#8221; in your favorite search engine. The code for creating a canvas and working with it is also very simple:</p>
<p>&nbsp;</p>
<p><script src="http://gist.github.com/336982.js"></script></p>
<p>&nbsp;</p>
<p>Using JavaScript, you can draw on the canvas:</p>
<p>&nbsp;</p>
<p><script src="http://gist.github.com/336983.js"></script></p>
<p>&nbsp;</p>
<p><b>More Information and Links</b><br />
We&#8217;ve just scratched the surface of HTML 5 and all of the new functionality. There are some great resources available if you want to explore even further:</p>
<ul>
<li class="bullist">Current HTML 5 Draft Standard &#8211; <a href="http://whatwg.org/html5">http://whatwg.org/html5</a></li>
<li class="bullist">Dive Into HTML 5 by Mark Pilgrim &#8211; <a href="http://diveintohtml5.org/">diveintohtml5.org</a></li>
</ul>
<p>&nbsp;</p>
<p>A big thanks to Mark Pilgrim for his talk at Confoo. I look forward to seeing the standard expanded and adopted by all the browsers out there.</p>
<p>&nbsp;</p>
<p><b>- Jonathan LeBlanc</b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nakedtechnologist.com/?feed=rss2&amp;p=466</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
