<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Cykod Blog</title>
    <link>http://cykod.com/blog</link>
    <description>Cykod Blog</description>
    
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/cykod/AOTY" /><feedburner:info uri="cykod/aoty" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>42.365028</geo:lat><geo:long>-71.056369</geo:long><feedburner:emailServiceId>cykod/AOTY</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
      <title>HTML5 Gaming: the sound of Inevitability</title>
      <link>http://feedproxy.google.com/~r/cykod/AOTY/~3/KQaasTAq8bc/2012-01-html5-game-development-the-sound-of-inevitability</link>
      <guid isPermaLink="false">http://cykod.com/blog/post/2012-01-html5-game-development-the-sound-of-inevitability</guid>
      <dc:creator>Pascal Rettig</dc:creator>
      <pubDate>Fri, 27 Jan 2012 13:40:26 -0500</pubDate>
      <description>&lt;div&gt;
&lt;p&gt;[X-post from &lt;a href='http://www.html5gamedevelopment.org/html5-news/2012-01-html5-gaming-the-sound-of-inevitability' target='_blank'&gt;HTML5GameDevelopment.org&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;There's a scene in the original Matrix near the end where one of the Agents is holding Neo in front of a train and says: "Do you hear that sound Mr. Anderson? That is the sound of inevitability."&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;With the cacophony of discussion of whether HTML5 is ready or not as a gaming platform, that phrase always pops into my mind (Let's ignore, for the sake of the bad metaphor, that the Agent was wrong)&lt;/div&gt;
&lt;p&gt;2012 will most likely be a gap year in HTML5 gaming. It's not there yet, primarily because on mobile, HTML5's sweet spot, the platform is still underpowered for games. But I'd guess that at some point late during the year, when hardware accelerated canvas has reached a crucial level of market penetration, there's going to be a game that captivates the masses that could only have been written in HTML5. Much like the shot in the arm of Indie developers everywhere that MineCraft gave, this game will do the same.&lt;/p&gt;
&lt;p&gt;But that is actually beside the point. It doesn't matter if there is never a game that does that. The die have been cast and the tea leaves have been read. The reason for the inevitable sucess of HTML5 gaming over competing platforms is access. Everyone in the world with an electronic device has access to a HTML5 Game development environment (the Browser) with a full debugger (Dev Tools, Firebug) already installed on their Desktop.&amp;nbsp;Throw in a text editor and you have a world-class IDE.&lt;/p&gt;
&lt;p&gt;A discussion I had with some&amp;nbsp;colleagues&amp;nbsp;at a meetup recently&amp;nbsp;drove this point home. Every one of them had gotten into programming by developing games. Out of 5 people in the conversation, every single one had the same story.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The next generation of programmers (and game programmers) are already weaning themselves on the most accessible programming environment at their disposal: JavaScript. Online coures like&amp;nbsp;&lt;a href='http://www.codecademy.com/languages/javascript' target='_blank'&gt;Codecademy&lt;/a&gt;&amp;nbsp;teach JavaScript because there's an interpretor already built into every browser. Programmers in training aren't going to buy a $500 program (Flash) or download gigabytes of IDEs (Visual Studio, XCode) to learn a development environment that's more difficult with less instant gratification unless they have to.&lt;/p&gt;
&lt;p&gt;As soon as HTML5 Gaming as platform is "Good Enough" for whatever it is you want to build (which it is dangerously close to being,) the battle is going to be over. Look at the success of JavaScript versus all the alternatives that have come and gone. Simplicity and availability win the day.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;When that next generation starts building indie games and starts entering the&amp;nbsp;workforce, they are going to come pre-packaged as HTML5 Game Developers and have their say on the next generation of games being developed.&lt;/p&gt;
&lt;p&gt;It may be in a year or so or it may be a few, but it's a train that's a coming.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/cykod/AOTY/~4/KQaasTAq8bc" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://cykod.com/blog/post/2012-01-html5-game-development-the-sound-of-inevitability</feedburner:origLink></item>
    <item>
      <title>How to speak Internet.</title>
      <link>http://feedproxy.google.com/~r/cykod/AOTY/~3/xmnQCRWXBUM/2012-01-how-to-speak-internet</link>
      <guid isPermaLink="false">http://cykod.com/blog/post/2012-01-how-to-speak-internet</guid>
      <dc:creator>Pascal Rettig</dc:creator>
      <pubDate>Wed, 25 Jan 2012 10:05:52 -0500</pubDate>
      <description>&lt;h2&gt;Alternative title: Internet speak for the over 50.&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; - drop the The when talking about Internet sites, know what Memes are.&lt;/p&gt;
&lt;p&gt;Any work group or subculture has its own language that is unique to group. Architects, computer scientists, Construction workers, and pretty much any other profession all have unique sayings and phrases that sound strange to people outside the group. People who spend a lot of time on Internet are no different. The only difference is that the Internet, in its ubiquity, tends to spread its tenticle-like vocabulary to the rest of the world. You can't escape Twitter, Facebook or Google. Even if you're just a regular person in another field just trying to get through the day.&lt;/p&gt;
&lt;p&gt;So, despite your best efforts you'll occasionally be called on to speak about Internet related things, whether it be by your colleagues or your children. If this is the case and you're not an Internet illuminati, it's important to keep a level head and remember a few basic rules.&lt;/p&gt;
&lt;h2&gt;1. Drop the "The"&lt;/h2&gt;
&lt;p class="emphasis"&gt;The first mistake people make is to try to treat internet websites as if they are one of a franchise of locations by putting definite articles in front of them. Don't do this. There is only 1 Twitter around, you don't want to preface it with "The" as if you were talking about a specific one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compare the following:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;I'm going to Starbucks&lt;br /&gt;I'm going to the Starbucks.&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;The latter only makes sense if you are referring to a particular one of many (in this case there are many starbucks) and the person you are talking to should know the one you are talking to about. The second one is basically an abbreviation for something like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;I'm going to the Starbucks around corner.&amp;nbsp;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;Putting "The" in front of something like "Twitter" or "Google" sounds wrong. It's like you're saying:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I'm going to the Twitter over there on the weird Internet thingy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It's pretty much a clear give away that you're not a comfortable with the ways of the Internet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Let's try a few examples out:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Yes: Do you have a Tumblr blog?&lt;br /&gt;No: Do you have a blog on the Tumblr?&lt;br /&gt;&lt;br /&gt;Yes: I'm listening to Spotify&lt;br /&gt;No: I'm listening to the Spotify&lt;br /&gt;&lt;br /&gt;Yes: Are you on Twitter?&lt;br /&gt;No: Are you on the Twitter?&lt;/p&gt;
&lt;p&gt;Yes: I'm on Facebook&lt;br /&gt;No: I'm on the Facebook&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Facebook is an especially challenging example because the site actually was "TheFacebook.com" when it launched, so referring to it as The Facebook back in 2004 was perfectly acceptable, but that ship has long sailed. It's Facebook. Not "The Facebook."&lt;/p&gt;
&lt;p&gt;Overcome the urge to add in "The" and you'll be happy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; the same applies to using demonstratives like "That Twitter" or "This Facebook Thing." Don't do it. You'll sound much more current and will draw far less attention to yourself if you just go with the name of the website or service and leave the rest off.&lt;/p&gt;
&lt;p&gt;The Internet is an exception to this rule. It should almost always be prefaced with "The" when used as a noun.&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;Wrong: I'm going to surf Internet&lt;br /&gt;Right: I'm going to surf the Internet&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;If you are feeling really confidant in your newfound ability to speak Internet websites, you can opt to occasionally go for a rather advanced combo - intentionally add the "The" back in and pluralize your noun. Here's an example:&lt;/div&gt;
&lt;blockquote&gt;
&lt;div&gt;I haven't seen you on the Twitters lately.&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; this is an area you'll want to tread carefully on as it must be clear you're making and joke and being intentionally ironic or people will miss the point.&lt;/p&gt;
&lt;h2&gt;2. Know your verbs&lt;/h2&gt;
&lt;p class="emphasis"&gt;The second major point is to know your verbs. Just like you wouldn't say "I'm going to Car myself to Starbucks" It's important to know when there is a verb that has entered common usage.&lt;/p&gt;
&lt;p&gt;Most of the time that verb will match the name of the company, but sometimes a different verb will be used. Sometimes a company has not reached a level of ubiquity that using their name as a verb sounds wrong. It's a fine line here and you'll want to tread carefully. There is also a specificity issue, when the verb is specific enough you can drop the company name completely, when it's not you'll want to keep it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;Wrong: Did you search Google for it?&lt;br /&gt;Right: Did you Google it? (To Google now means "to search")&lt;/div&gt;
&lt;div&gt;Wrong: Did you post something?&lt;br /&gt;Right: Did you post something on Facebook? (not specific enough, unless FB is already in discussion)&lt;/div&gt;
&lt;div&gt;Wrong: Do you Tweet on Twitter?&lt;br /&gt;Right: Do you Tweet? (Twitter is the only place you can Tweet)&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sometimes it's less clear. For example Foursquare is wildly popular among a subset. Which of the following to use depends on context:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Did you check-in?&lt;br /&gt;Did you check-in on Foursquare?&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here's a general table of websites and actions relating to them:&lt;/p&gt;
&lt;table cellspacing="10" cellpadding="5" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;h3&gt;Website&lt;/h3&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;h3&gt;Actions&lt;/h3&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;h3&gt;Means&lt;/h3&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;h3&gt;&lt;span&gt;Company name?&lt;/span&gt;&lt;/h3&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;h4&gt;Facebook&lt;/h4&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Post&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Post Content&lt;/td&gt;
&lt;td style="text-align: center;"&gt;Yes&lt;/td&gt;
&lt;td style="text-align: right;"&gt;You should post that to Facebook&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Like&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Like something from another website&lt;/td&gt;
&lt;td style="text-align: center;"&gt;No&lt;/td&gt;
&lt;td style="text-align: right;"&gt;Did you Like the Band's page?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Friend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Add someone as a friend&lt;/span&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;No&lt;/td&gt;
&lt;td style="text-align: right;"&gt;Did you Friend Joanne?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Unfriend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Remove someone as a friend&lt;/span&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;No&lt;/td&gt;
&lt;td style="text-align: right;"&gt;I unfriended Steven&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;h4&gt;Google&lt;/h4&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Google&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;To search for something&lt;/td&gt;
&lt;td style="text-align: center;"&gt;No&lt;/td&gt;
&lt;td style="text-align: right;"&gt;I don't know, Google it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Plus One&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Click the +1 on (similar to Like)&lt;/td&gt;
&lt;td style="text-align: center;"&gt;No&lt;/td&gt;
&lt;td style="text-align: right;"&gt;Make sure you Plus One our website&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Share&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Share something on Google+&lt;/td&gt;
&lt;td style="text-align: center;"&gt;Yes&lt;/td&gt;
&lt;td style="text-align: right;"&gt;Did you share that on Google+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Add to a Circle&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Add someone to your Google+ account so you see their posts.&lt;/td&gt;
&lt;td style="text-align: center;"&gt;No&lt;/td&gt;
&lt;td style="text-align: right;"&gt;You should add them to your Circles.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;h4&gt;Twitter&lt;/h4&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Tweet&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Post a Tweet&lt;/td&gt;
&lt;td style="text-align: center;"&gt;No&lt;/td&gt;
&lt;td style="text-align: right;"&gt;Did you Tweet about it?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Follow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Click Follow &amp;amp; add them to your stream&lt;/td&gt;
&lt;td style="text-align: center;"&gt;No*&lt;/td&gt;
&lt;td style="text-align: right;"&gt;Make sure you follow them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Unfollow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Remove someone form your stream&lt;/td&gt;
&lt;td style="text-align: center;"&gt;No*&lt;/td&gt;
&lt;td style="text-align: right;"&gt;They Tweeted too much, I unfollowed them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;h4&gt;Foursquare&lt;/h4&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Check-in&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mark your current location&lt;/td&gt;
&lt;td style="text-align: center;"&gt;No*&lt;/td&gt;
&lt;td style="text-align: right;"&gt;Did you Check-in to the concert?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;h4&gt;Tumblr&lt;/h4&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Post&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Write a blog Post&lt;/td&gt;
&lt;td style="text-align: center;"&gt;Yes&lt;/td&gt;
&lt;td style="text-align: right;"&gt;You should post that to your Tumblr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;h4&gt;Wikipedia&lt;/h4&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Wikipedia&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;To look something up on Wikipedia&lt;/td&gt;
&lt;td style="text-align: center;"&gt;No&lt;/td&gt;
&lt;td style="text-align: right;"&gt;Let's Wikipedia it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;h4&gt;IMDB&lt;/h4&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IMDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;To look something up on IMDB.com&lt;/td&gt;
&lt;td style="text-align: center;"&gt;No&lt;/td&gt;
&lt;td style="text-align: right;"&gt;I can't remember the actor's name - IMDB him.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;h4&gt;Blog&lt;/h4&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Write a Post&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;To write a blog post&lt;/span&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;N/A&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;span&gt;I wrote a blog post today&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Memes&lt;/h2&gt;
&lt;p class="emphasis"&gt;The last frontier of Internet-speak citizenship is the understanding of Memes.&lt;/p&gt;
&lt;p&gt;Memes are the shared jokes of the Internet that are pop up on a regular basis and are usually beaten into the ground just as quickly through overuse. Some memes stick around and stand the test of time (like &lt;a href='http://knowyourmeme.com/memes/people/chuck-norris' target='_blank'&gt;Chuck Norris&lt;/a&gt;) but most come and go rather quickly. If you are really interested check out &lt;a href='http://knowyourmeme.com' target='_blank'&gt;http://knowyourmeme.com&lt;/a&gt;. In general there are far too many to try to keep track of and unless you spend your entire life on &lt;a href='http://en.wikipedia.org/wiki/4chan' target='_blank'&gt;4chan&lt;/a&gt; there are a few tricks to avoid looking dumb around memes.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The first triack is to make sure you are pronouncing the word correctly. Take a look at &lt;a href='http://www.youtube.com/watch?v=3dErjFPTarc' target='_blank'&gt;this video&lt;/a&gt;&amp;nbsp;if you need help.&lt;/p&gt;
&lt;p&gt;The next is to recognize when Memes are being discussed. The general giveaway is when Internet hipster folks are laughing at stuff that isn't funny or doesn't make sense. Usually they are laughing because of shared knowledge of some meme. Don't laugh along if you haven't heard of the meme as you may get lost and called out in the ensuing conversation, just nonchalantly say something like "Oh is that a meme?" or, if you're sure it's a meme, say "Oh, I haven't heard of that one." Since the Internet moves quickly you won't be expected to know all the current memes, and someone will jump at the opportunity to explain, in most likely overly tedious detail, where the meme popped up from and why you should think it's funny.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Did you know? &lt;/strong&gt;The TL;DR at the top of this post is a Meme that got started by lazy internet folks who are upset with having to read more than a few sentences. It's short for "Too Long; didn't read." It's now sometimes used to provide a summary for those same folks who don't have attention spans that last more than a few paragraphs.&lt;/p&gt;
&lt;p class="emphasis"&gt;There you have it - all you need to not flop around like a fish out of water when things on the Internet are being discussed.&lt;/p&gt;
&lt;p&gt;&lt;img  src='http://cykod.com/system/storage/3/60/7/435/13619322.jpg' /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cykod/AOTY/~4/xmnQCRWXBUM" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://cykod.com/blog/post/2012-01-how-to-speak-internet</feedburner:origLink></item>
    <item>
      <title>Class Slides from Web Design 1 - Fall 2011</title>
      <link>http://feedproxy.google.com/~r/cykod/AOTY/~3/cG-tvPCkuPs/2012-01-class-slides-from-web-design-1---fall-2011</link>
      <guid isPermaLink="false">http://cykod.com/blog/post/2012-01-class-slides-from-web-design-1---fall-2011</guid>
      <dc:creator>Pascal Rettig</dc:creator>
      <pubDate>Mon, 02 Jan 2012 11:31:08 -0500</pubDate>
      <description>&lt;p&gt;Martha and I taught Web Design 1 this past fall semester at MassArt and used &lt;a href='https://github.com/cykod/CoderDeck' target='_blank'&gt;CoderDeck&lt;/a&gt;&amp;nbsp;for creating interactive, runnable slides. We had the students all use GitHub (specifically GitHub for mac) for pushing their code to the Web using Github pages - which despite the&amp;nbsp;occasional crash worked out pretty well.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;We're releasing the class sides under the &lt;a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' target='_blank'&gt;creative commons BY-NC-SA&lt;/a&gt; license.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Use the arrow keys to go between slides. There's a &lt;a href='http://cykod.github.com/class/massart/web304-fall2011/' target='_blank'&gt;master list of links to each class&lt;/a&gt;. It's Reproduced below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href='http://cykod.github.com/class/massart/web304-fall2011/1/' target='_blank'&gt;Class 1 - Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://cykod.github.com/class/massart/web304-fall2011/2/' target='_blank'&gt;Class 2 - HTML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://cykod.github.com/class/massart/web304-fall2011/3/' target='_blank'&gt;Class 3 - IA &amp;amp; Wireframing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://cykod.github.com/class/massart/web304-fall2011/4/' target='_blank'&gt;Class 4 - CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://cykod.github.com/class/massart/web304-fall2011/5/' target='_blank'&gt;Class 5 - Web Design Basics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://cykod.github.com/class/massart/web304-fall2011/6/' target='_blank'&gt;Class 6 - Responsive Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://cykod.github.com/class/massart/web304-fall2011/7/' target='_blank'&gt;Class 7 - Typography&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://cykod.github.com/class/massart/web304-fall2011/8/' target='_blank'&gt;Class 8 - JavaScript &amp;amp; jQuery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://cykod.github.com/class/massart/web304-fall2011/9/' target='_blank'&gt;Class 9 - Extras (Images, Hosting, Contact Form, Widgets)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;We're both teaching again this spring, any feedback or suggestions very welcome.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cykod/AOTY/~4/cG-tvPCkuPs" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://cykod.com/blog/post/2012-01-class-slides-from-web-design-1---fall-2011</feedburner:origLink></item>
    <item>
      <title>Discover your non-testing Goat w/ Git blame and RCov</title>
      <link>http://feedproxy.google.com/~r/cykod/AOTY/~3/9n1GKwqdD74/2011-11-find-out-who-the-non-testing-goat</link>
      <guid isPermaLink="false">http://cykod.com/blog/post/2011-11-find-out-who-the-non-testing-goat</guid>
      <dc:creator>Pascal Rettig</dc:creator>
      <category>Consulting</category>
      <category>Development</category>
      <pubDate>Tue, 29 Nov 2011 09:48:53 -0500</pubDate>
      <description>&lt;p&gt;I wrote a quick n' dirty script for fun last night to see how we were doing on test coverage and who was responsible for the most untested code in the git repo. The idea behind the script is to take the output of RCov and line it up with the output of `git blame` and then track who's responsible for each line. It's ugly code, but it's was fun to pull together a couple of different pieces. Here's a sample modified coverage/ file (with the commit and person responsible for the code add on the left):&lt;/p&gt;
&lt;p&gt;&lt;img  src='http://cykod.com/system/storage/3/cb/a/433/blog-image/goat.png' /&gt;&lt;/p&gt;
&lt;p&gt;Gist below.&lt;/p&gt;
&lt;p&gt;I unfortunately discovered I was the goat.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cykod/AOTY/~4/9n1GKwqdD74" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://cykod.com/blog/post/2011-11-find-out-who-the-non-testing-goat</feedburner:origLink></item>
    <item>
      <title>Gumptionology for developers</title>
      <link>http://feedproxy.google.com/~r/cykod/AOTY/~3/HK4wDlwYn4w/2011-10-gumptionology-for-developers</link>
      <guid isPermaLink="false">http://cykod.com/blog/post/2011-10-gumptionology-for-developers</guid>
      <dc:creator>Pascal Rettig</dc:creator>
      <pubDate>Sat, 15 Oct 2011 15:14:16 -0400</pubDate>
      <description>&lt;p style="text-align: left;"&gt;Having just finished "Zen and the Art of Motorcycle Maintenance" I find that the word "Gumption" has been rattling around my brain for the past week, sneaking it's way into my mindset as I go about my daily tasks.&lt;/p&gt;
&lt;p&gt;"Zen and the Art of Motorcycle Maintenance," (ZAMM) &amp;nbsp;subtitled "An enquiry into values" was recommended to me as a great "Programmer book" - not a "Programming book", but rather one of the those more intangibly beneficial books that effect pause and reflection in the normally full-speed-ahead world of software development. A book that couldn't be further from the world of development yet somehow come across referenced in a bibliography or quoted in a presentation every couple of months.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="line-height: 19px;"&gt;So I took the bait and jumped in, and really had no idea what hit me. I found myself sneaking in reading to get through the book - before work in the mornings - waiting in line - with an enthusiasm normally saved for Neal Stephenson and Douglas Adams.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The central focus of the book is the concept of "Quality" as a unifying principle for the world. Heady stuff. I'll leave the discussion on "Quality" in software development to more intelligent people than I, but there was one distinctly concrete idea that Pirsig dropped into near the end of ZAMM: The concept of Gumption and Gumption traps.&lt;/p&gt;
&lt;p&gt;&lt;span style="line-height: 19px;"&gt;Of Gumption, Pirsig says:&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="line-height: 19px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-style: italic; line-height: 19px;"&gt;"I like it because it describes exactly what happens to someone who connects with Quality. He gets filled with gumption.&lt;/span&gt;&lt;span style="font-style: italic; line-height: 19px;"&gt;&amp;nbsp;The greeks called it enthousiasmos, the root of "enthusiasm," which means literally "filled with Theos," or God, or Quality. See how that fits? ( Loc. 4928 )&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The programmer with an ample supply of gumption is easy to spot - he's the one for whom no problem is a boring problem, because we as developers can create our own gumption by solving boring problems in novel ways. Yes, tying together a rube-goldberg machine of Unix pipes is probably not the best way to solve a 10-minute data entry problem, but if it takes 9 minutes and let's me learn more about AWK, it should get counted in the win column. (You can take this way too far, but good dev's skirt the line between making boring problems interesting and making problems out of non-problems.)&lt;/p&gt;
&lt;p&gt;&lt;span style="line-height: 19px;"&gt;But Gumption is easy to lose. When the job becomes rote and there's not a creative spark left in the daily grind, work suffers. Life suffers. And developers will either die a little inside or spend that creative spark on side projects and leave nothing for the 9-5.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="line-height: 19px;"&gt;So in the same way Pirsig described the Gumption traps that hinder Motorcycle Maintenance, here are the Programmer Gumptions Traps I've come across (imagine a PHB saying the following to get in the spirit)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="emphasis"&gt;"This is the way we do it" &lt;/span&gt;&lt;span style="line-height: 19px;"&gt;- There's nothing quite as dehabilitating as being told, when proposing a novel solution to a problem that "this is the way we do it, this is the way we've always done it, this is the way you're going to do it" It literally can deflate the life out of a developer in two seconds flat. That doesn't mean every programming-language or framework-related whim should be catered to, but it does mean that people making the technical decisions in a company should have the technical knowledge to make them and be able to make them on solid technical grounds. Nothing kills creativity quite like being told that whatever flawed methodology that last guy in your position came up with during a caffeine induced epiphany is one of the 10 commandments of company methodology. Not allowing any discussion on the methodologies a company uses is a sign that the company isn't doing things for the most technically sound reasons.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="line-height: 25px;" class="emphasis"&gt;"Implement this UML" &lt;/span&gt;&lt;span style="line-height: 19px;"&gt;- As I've written about before Implementation matters - it's not just a matter of taking some designs a software architect wrote up and just writing the simple code that makes it actually run. Real software doesn't work like that, and code implemented to fullfill the requirements of waterfall design usually jump through a number of hoops to account for design flaws that could have been weeded out with a few feedback loop driven iterations. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="line-height: 19px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 25px;" class="emphasis"&gt;"This is the best hardware we can afford"&lt;/span&gt;&lt;span style="line-height: 19px;"&gt; - Programmers are expensive, and giving them sub-standard hardware (or less than 2 monitors) makes absolutely no sense from both a financial and a gumption perspective. If your developers are sitting around waiting for tests to run or libraries to compile, they aren't working. There's a certain length of time that sites as the cut-off time for the "flow" that transcendent state where the developer and machine becomes one. If you're machine response time is less than that magic number, you'll be able to keep razor focused on that task at hand. If it's above that line, your hand will subconsciously hit Ctrl-t, bring up a new tab and type in slashdot or reddit.com.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="line-height: 19px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 19px;"&gt;Keeping your Gumption, being allowed to bring something of Quality into the world is one of the greatest feeling in the entire world. If you're working for yourself of managing developers, make the world a little bit of a better place by paying attention to the Gumption traps that you're laying for yourself and your developers.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/cykod/AOTY/~4/HK4wDlwYn4w" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://cykod.com/blog/post/2011-10-gumptionology-for-developers</feedburner:origLink></item>
    <item>
      <title>Using Node.js and your phone to control a Browser game</title>
      <link>http://feedproxy.google.com/~r/cykod/AOTY/~3/SlUmSKLurd8/2011-08-using-nodejs-and-your-phone-to-control-a-browser-game</link>
      <guid isPermaLink="false">http://cykod.com/blog/post/2011-08-using-nodejs-and-your-phone-to-control-a-browser-game</guid>
      <dc:creator>James Burke</dc:creator>
      <category>Development</category>
      <category>HTML5</category>
      <pubDate>Wed, 24 Aug 2011 21:15:51 -0400</pubDate>
      <description>&lt;p&gt;This past week I undertook a pretty cool project as the Intern here at Cykod. We were wondering how easily a smart phone &amp;ndash;specifically using its gyroscopes and accelerometers&amp;ndash; could be used as a controller for a multi-player game on a larger screen. With a bit of Node.js and HTML5 magic, it turned out to be pretty simple.&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;Concept&lt;/h2&gt;
&lt;p&gt;We want to use a desktop (laptop, iPad, etc. something with a bigger screen that multiple players can easily look at) connection to act as the common game space. Once that screen is initialized, each player connects to a specific URL in their phone browser that links them to that game instance.  We'll follow this basic outline:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Register new connections to the server and decide if it is a room or mobile user:&lt;/li&gt;
&lt;li&gt;Create a new room,&lt;/li&gt;
&lt;li&gt;Or add the connection to an existing room&lt;/li&gt;
&lt;li&gt;Constantly poll the mobile device for orientation data&lt;/li&gt;
&lt;li&gt;Use said data to update the HTML5 Canvas game&lt;/li&gt;
&lt;li&gt;Handle dropped connections appropriately&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;meta content="text/html; charset=utf-8" http-equiv="content-type" /&gt;
&lt;/p&gt;
&lt;h2&gt;Result&lt;/h2&gt;
&lt;p&gt;The proof-of-concept full game is up at&amp;nbsp;&lt;a href='http://bit.ly/G4LSpaceWords' target='_blank'&gt;http://bit.ly/G4LSpaceWords&lt;/a&gt; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://bit.ly/G4LSpaceWords' target='_blank'&gt;&lt;img  src='http://cykod.com/system/storage/3/d4/5/429/blog-image/g4lgame.png' /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;The Technology&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Node.js&lt;br /&gt;&lt;/strong&gt;&lt;a title="Node.js" href='http://nodejs.org/' target='_blank'&gt;Node.js&lt;/a&gt; is what makes this project possible. Built on Google's V8 Javascript Engine, Node.js is a server environment written in -wait for it- JavaScript. I started this project with zero knowledge of writing a server or what it would take, and Node made it super easy. Unfortunately, because the Node.js project is growing so quickly, up-to-date documentation with current-version examples can be lacking.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Socket.io&lt;br /&gt;&lt;/strong&gt;A Node.js module, &lt;a title="Socket.io" href='http://socket.io/' target='_blank'&gt;Socket.io&lt;/a&gt; adds multiple levels of socket support, accommodating nearly every browser. This allows Node.js to quickly communicate with the browser similar to the way AJAX would, but with less overhead. &lt;span style="text-decoration: line-through;"&gt;Socket.io does not yet seem to support the updated Websocket Spec deployed in the latest Chrome and Firefox&lt;/span&gt;. &lt;span style="text-decoration: line-through;"&gt;As soon as it does, performance will be significantly smoother compared to the current default of XHR Long polling.&lt;/span&gt;&amp;nbsp; Now supported in the newest version of Socket.io, and controller performance is better.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mobile Phone Orientation&lt;br /&gt;&lt;/strong&gt;Nearly all smart phones on the market have some sort of accelerometer or gyroscope in them. The phone parses this information and makes it accessible in the browser. The HTML5 DeviceOrienation and DeviceMotion events allow us to take advantage of this. You can read more about it at &lt;a title="Device Orientation at HTML5 Rocks" href='http://www.html5rocks.com/en/tutorials/device/orientation/' target='_blank'&gt;HTML5 Rocks&lt;/a&gt;.  (Fun Fact: The native Android browser does not support access of this data. A third party browser like &lt;a title="Firefox in the Android Marketplace" href='https://market.android.com/details?id=org.mozilla.firefox' target='_blank'&gt;Firefox&lt;/a&gt; is needed)&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;Building the server&lt;/h2&gt;
&lt;p&gt;The actions performed by the mobile phone and desktop will be completely independent of each other, communicating only through the server (app.js). The best way to do this is through two different html files. We could embed all the code into one large file, but that would overly complicate our simple proof of concept. Create index.html (for the desktop), and mobile.html (for the phone).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Room Structure&lt;br /&gt;&lt;/strong&gt;Each game instance needs a desktop screen and at least one mobile device to communicate. We don't want any outside interference, so we'll create a new game instance for each desktop screen. We'll refer to a game instance as a room. Each room contains a desktop and an unknown number of mobile connections. For clarity's sake (and to help distinguish between different rooms), we'll also include a room id.  Room Structure:&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;code&gt;App.js&lt;/code&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;&lt;code&gt;//An array to store the existing rooms &lt;br /&gt; var rooms = [];&lt;br /&gt;function room(roomSocket, roomId){&lt;br /&gt;&amp;nbsp; this.roomSocket = roomSocket; &amp;nbsp;//Stores the socket for the desktop connection&lt;br /&gt;&amp;nbsp; this.roomId = roomId; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//The room id/name. A unique string that links desktop to mobile&lt;br /&gt;&amp;nbsp; this.mobileSockets = []; &amp;nbsp; &amp;nbsp; &amp;nbsp; //A list of all the mobile connections&lt;br /&gt;};&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;em&gt;Definition: A &lt;strong&gt;socket&lt;/strong&gt; is how we refer to a single connection. So for every device connected to the server, a socket is created. Node.js and Socket.io streamline this process, automatically creating and destroying sockets as needed. This continually simplifies our room management.&lt;br /&gt;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New Connections&lt;br /&gt;&lt;/strong&gt;When a new socket is created (anytime a user visits index.html or mobile.html), we want to notify app.js so it can either:&lt;/p&gt;
&lt;p&gt;A) Create a new room (if index.html is sending the data),&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;code&gt; index.html&lt;/code&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;//This sends the signal 'new room' to the server, along with data containing the room name id. For live deployment, this should be a random string. See the full documentation for example         socket.emit('new room', { room: &amp;ldquo;lolcats&amp;rdquo;});&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;code&gt;app.js&lt;/code&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;&lt;code&gt;//The receiving end of 'new room'&lt;br /&gt;&lt;/code&gt;&lt;span style="font-family: monospace;"&gt;socket.on("new room", function(data){&lt;br /&gt;&amp;nbsp; //Pushes a new room instance, storing the desktop connection as the roomSocket and data.room ("lolcats") as the roomId&lt;br /&gt;&amp;nbsp; rooms.push(new room(socket, data.room));&lt;br /&gt;});&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;Awesome! So we have a new room object being created and stored each time a new desktop connection is established. For efficiency's sake, we want to monitor any lost connections and delete those rooms, but we'll get into that shortly.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;B) Or add a user to a room instance (if mobile.html is sending the data)&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;code&gt;mobile.html&lt;/code&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;&lt;code&gt;socket.emit('connect mobile', { room: getUrlVars()["id"]}, function(data){ &lt;br /&gt;&amp;nbsp; if(data.registered = true){&lt;br /&gt;&amp;nbsp; &amp;nbsp; registered = true;&lt;br /&gt;&amp;nbsp; }else{&lt;br /&gt;&amp;nbsp; &amp;nbsp; $('#error').append(data.error);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;});&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Similar to a new desktop connection, mobile.html sends an emit('connect mobile') to app.js. We also pass along the id parameter from the URL (mobile.html?id=RoomName) to specify which room this mobile user should belong to. Lastly, a callback function informs the mobile user that they have connected successfully, and can now transmit data.&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;code&gt;app.js&lt;/code&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;&lt;code&gt;socket.on("connect mobile", function(data, fn){&lt;br /&gt;&amp;nbsp; var desktopRoom = null;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; //Cycle through all the rooms and find the room with the same roomId as our mobile device&lt;br /&gt;&amp;nbsp; for(var i = 0; i &amp;lt; rooms.length; i++){&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(rooms[i].roomId == data.room){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; desktopRoom = i;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; if(desktopRoom !== null){&lt;br /&gt;&amp;nbsp; &amp;nbsp; rooms[desktopRoom].mobileSockets.push(socket);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //Store the position of our room that this mobile device belongs to&lt;br /&gt;&amp;nbsp; &amp;nbsp; socket.set('roomi', desktopRoom, function(){})&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //Return the callback as true&lt;br /&gt;&amp;nbsp; &amp;nbsp; fn({registered: true});&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //Access the room that this socket belongs to, and emit directly to the index.html to 'add user' with the socketId as a unique indentifier.&lt;br /&gt;&amp;nbsp; &amp;nbsp; rooms[socket.store.data.roomi].roomSocket.emit('add user', socket.id, data);&lt;br /&gt;&amp;nbsp; }else{&lt;br /&gt;&amp;nbsp; &amp;nbsp; //Callback returns false with an error &lt;br /&gt;&amp;nbsp; &amp;nbsp; fn({registered: false, error: "No live desktop connection found"});&lt;br /&gt;&amp;nbsp; } &lt;br /&gt; });&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;The server searches through the array of rooms to locate the correct one. Once we've identified the room by its name, it is saved in desktopRoom.   After double checkingagainst a null value to ensure we have located a room, the mobile socket is pushed into the room[id].mobileSocket array. The socket.set method is then used to store data directly in the socket. We save the room's position in the array. With this value, we can easily access the appropriate room without having to search the array each time. The callback is returned as true if successful, or false with an error message.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lost connections&lt;br /&gt;&lt;/strong&gt;But what happens when we lose a connection? Socket.io has a built in 'disconnect' function that is called when a socket disconnects. We start by testing for the existence of socket.store.data.roomi. Because we only set that value for the mobile connections, we know instantly the type of connection.&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;code&gt;node.js&lt;/code&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;&lt;code&gt;socket.on("disconnect", function(){&lt;br /&gt;&amp;nbsp; var destroyThis = null;&lt;br /&gt;&amp;nbsp; i&lt;/code&gt;&lt;span style="font-family: monospace;"&gt;f(typeof socket.store.data.roomi == 'undefined'){&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;&lt;span style="font-family: monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&amp;nbsp; &amp;nbsp;//The lost socket is a room&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; //Search through all the rooms and remove the socket which matches our disconnected id&lt;br /&gt;&amp;nbsp; &amp;nbsp; for(var i in rooms){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if(rooms[i].roomSocket.id == socket.id){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; destroyThis = rooms[i];&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(destroyThis !== null){&amp;nbsp;rooms.splice(destroyThis, 1);}&lt;br /&gt;&lt;br /&gt;&amp;nbsp; }else{&lt;br /&gt;&amp;nbsp; &amp;nbsp; //Lost socket is a mobile connections&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //Sort through the mobile sockets for that particular room, and remove accordingly&lt;br /&gt;&amp;nbsp; &amp;nbsp; var roomId = socket.store.data.roomi;&lt;br /&gt;&amp;nbsp; &amp;nbsp; for(var i in rooms[roomId].mobileSockets){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if(rooms[roomId].mobileSockets[i] == socket){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; destroyThis = i;&lt;br /&gt;&lt;/code&gt;&lt;span style="font-family: monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; if(destroyThis !== null){rooms[roomId].mobileSockets.splice(destroyThis, 1);}&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; //alert the room that this user was a member of&lt;br /&gt;&amp;nbsp; &amp;nbsp; rooms[roomId].roomSocket.emit('remove user', socket.id);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;/code&gt;&lt;span style="font-family: monospace;"&gt;});&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;We now have a fully functioning Node.js server that handles all connections, disconnections, and stores our data in easy to parse room structures.&lt;/p&gt;
&lt;h2&gt;Updating the Tilt Data&lt;/h2&gt;
&lt;p&gt;With the connection established, we can easily send tilt data from the mobile to desktop side. This is covered in much better detail over at HTML5 Rocks, so we'll skip to the Node stuff.&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;code&gt; mobile.html&lt;/code&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;&lt;code&gt;function deviceOrientationHandler(tiltLR, tiltFB, dir, motionUD) {&lt;br /&gt;&amp;nbsp; if(registered){&lt;br /&gt;&amp;nbsp; &amp;nbsp; socket.emit('update movement', { tilt_LR: Math.round(tiltLR), tilt_FB: Math.round(tiltFB)});&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This function will run every time the phone gets new mobile tilt data. We're really only interested in the tiltLR (Left Right), and tilfFB (front back). Read through the &lt;a href='http://www.html5rocks.com/en/tutorials/device/orientation/' title="HTML5 Rocks" target='_blank'&gt;HTML5 Rocks&lt;/a&gt; for more info.  app.js receives this data and immediately forwards it along to the desktop corresponding to our mobibile device.&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;code&gt;app.js &lt;/code&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;code&gt;//Update the position         socket.on("update movement", function(data){&lt;br /&gt;&amp;nbsp; if(typeof socket.store.data.roomi !== 'undefined'){&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(typeof rooms[socket.store.data.roomi] !== 'undefined'){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; rooms[socket.store.data.roomi].roomSocket.emit('update position', socket.id, data);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;});&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;Because mobile.html transmits data after a connection is established, there is no error checking to make sure the index.html counterpart still exists. Our 'update movement' performs this check to ensure the desktop connection still exits. It emits data directly to the correct room in the 'update position' signal.&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;&lt;code&gt;socket.on('update position', function(socketId, data){}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;The server will then signal index.html and call the socket.on("update position") . This passes all our tilt data to the desktop client, leaving the world wide open for awesome canvas implementations.&lt;/p&gt;
&lt;p&gt;I won't be going into the canvas game aspects, but the example code and a basic version of canvas game play is available on &lt;a href='https://github.com/jameswburke/Node-Server-with-Mobile-Phones' title="Node Server and Mobile Phone Orientation on GitHub" target='_blank'&gt;Github&lt;/a&gt;. You can also see our language learning game implementation, &lt;a href='http://spacewords.gamesforlanguage.com' target='_blank'&gt;Super Space Words&lt;/a&gt; .&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cykod/AOTY/~4/SlUmSKLurd8" height="1" width="1"/&gt;</description>
      <media:thumbnail height="128" width="128" url="http://cykod.com/system/storage/3/54/1/430/preview/rocket.gif" />
    <feedburner:origLink>http://cykod.com/blog/post/2011-08-using-nodejs-and-your-phone-to-control-a-browser-game</feedburner:origLink></item>
    <item>
      <title>How To: Social Plugins</title>
      <link>http://feedproxy.google.com/~r/cykod/AOTY/~3/_FQ5h_xtXcw/2011-07-how-to-social-plugins</link>
      <guid isPermaLink="false">http://cykod.com/blog/post/2011-07-how-to-social-plugins</guid>
      <dc:creator>James</dc:creator>
      <category>Development</category>
      <pubDate>Fri, 29 Jul 2011 12:41:21 -0400</pubDate>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ This is a Guest Post from Cykod Intern&amp;nbsp;&lt;a href='http://jameswburke.com' target='_blank'&gt;James Burke&lt;/a&gt;&amp;nbsp;]&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;This is a follow up post to the talk I gave recently on Social Plugins and Widgets at the &lt;a title="Boston Front End Developers" href='http://www.meetup.com/Boston-Frontend-Developers/' target='_blank'&gt;Boston Front End Developers Meetup&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Social Plugins are still a fairly new concept. While widgets that track visitors or display RSS feeds have been done to death, Facebook breathed new life into social sharing with their Facebook Platform and Social Graph. Since debut, Facebook has been storing user information and building a huge network of data. With the debut of Social Plugins, any site can take advantage of the social giant Facebook has become.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Facebook&amp;rsquo;s Open Graph Protocol:&lt;/h2&gt;
&lt;p&gt;Access to Facebook&amp;rsquo;s Social Graph is accessible through their aptly named, &lt;a title="Facebook's Graph API" href='https://developers.facebook.com/docs/reference/api/' target='_blank'&gt;Graph API&lt;/a&gt;. Nearly all Facebook public data is available through this graph. People, pages, events, photo galleries, etc. The ability to see this information is a very cool and powerful way to do analytics research.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re going to use this platform to socialize our websites. In order to properly integrate our web pages, we need to turn our content into a form that Facebook can recognize. We declare this information as meta data in the page header. There are a &lt;a title="Open Graph Protocol" href='http://ogp.me/' target='_blank'&gt;bunch of properties&lt;/a&gt; to use, but Facebook requires these four specifically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;og:title - What your content is about.&lt;/li&gt;
&lt;li&gt;og:type - What &lt;a title="Facebook's Object Types" href='https://developers.facebook.com/docs/opengraph/#types' target='_blank'&gt;object type&lt;/a&gt; your content is.&lt;/li&gt;
&lt;li&gt;og:url - The URL for this object, usually dynamically generated.&lt;/li&gt;
&lt;li&gt;og:image - An image that Facebook with utilize in their graph and other social actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;So in my example for Cykod.com, the Open Graph tags would look like this,&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;code&gt; &amp;lt;meta property="og:title" content="Cykod"/&amp;gt;&lt;br /&gt;&amp;lt;meta property="og:type" content="website"/&amp;gt;&lt;br /&gt;&amp;lt;meta property="og:url" content="http://cykod.com/"/&amp;gt;&lt;br /&gt;&amp;lt;meta property="og:image" content="http://cykod.com/system/storage/3/11/logo.png"/&amp;gt;&lt;br /&gt;&amp;lt;meta property="og:description" content="A forward thinking, Rails-based web start-up looking to change the way you interact and play with the web."/&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You can take a shortcut for your Open Graph tags by skipping to step two on the &lt;a title="Like Plugin Page" href='https://developers.facebook.com/docs/reference/plugins/like/' target='_blank'&gt;Like plugin page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Like/Share Button:&lt;/h2&gt;
&lt;p&gt;This is a really simple one to implement. Just follow along on the &lt;a title="Facebook Documentation for the Like/Share Button" href='https://developers.facebook.com/docs/reference/plugins/like/' target='_blank'&gt;Facebook documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a form to help you out. Enter in the content you like, and compare to the live preview.&lt;/p&gt;
&lt;p&gt;Like/Share button options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URL to Like - Leaving this blank will default it to the current page (for XFBML only, but we&amp;rsquo;ll get more into that in a second).&lt;/li&gt;
&lt;li&gt;Send Button - Once again, XFBML only. It allows the user to specifically target who they want this page to be &amp;lsquo;sent&amp;rsquo; to. Clever name right?&lt;/li&gt;
&lt;li&gt;Layout Style - Each is a little different. Play with different settings and the live preview to decide what fits best.&lt;/li&gt;
&lt;li&gt;Width - Based on your site layout.&lt;/li&gt;
&lt;li&gt;Show Faces - The option to display small thumbnail images of the user&amp;rsquo;s friends when they see the like button.&lt;/li&gt;
&lt;li&gt;Verb to display - &amp;ldquo;Like&amp;rdquo; or &amp;ldquo;Recommend&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Color Scheme and Font - Again, based on your layout.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;XFBML or IFrame?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;&lt;strong&gt;eXtended Facebook Markup Language&lt;/strong&gt; is Facebook&amp;rsquo;s very own specialized XML markup to quickly add these plugins.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IFrames&lt;/strong&gt; are HTML tags that allow other pages to be embedded as a frame within another page. These are quick and easy to implement, but carry &lt;a href='http://webaim.org/techniques/frames/' target='_blank'&gt;accessibility&lt;/a&gt; and &lt;a href='http://blog.futtta.be/2010/03/03/5-tips-to-tackle-the-problem-with-iframes/' target='_blank'&gt;SEO concerns&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In my opinion, XFBML is a cleaner approach with more options. It gives you &amp;mdash;the developer&amp;mdash; more control over the code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Comments:&lt;/h2&gt;
&lt;p&gt;The comments plugin is pretty cool. In just a few minutes, your entire site can be up and running with a fully-fledged comment and moderation system without worrying about login/registering users.&lt;/p&gt;
&lt;p&gt;Similar to the Like button we just covered, Facebook offers a nice form that &lt;a title="Facebook - Social Comments" href='https://developers.facebook.com/docs/reference/plugins/comments/' target='_blank'&gt;generates&lt;/a&gt; the code for us.&lt;/p&gt;
&lt;p&gt;After entering your site URL, your code will look like this:&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;code&gt; &amp;lt;div id="fb-root"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;fb:comments href="example.com" num_posts="2" width="500"&amp;gt;&amp;lt;/fb:comments&amp;gt; &lt;/code&gt;&lt;/p&gt;
&lt;script type="text/javascript"&gt;&lt;/script&gt;
&lt;ul&gt;
&lt;li&gt;We specify a div with the id &amp;ldquo;fb-root&amp;rdquo;. This is necessary for the running the &lt;a title="Facebook Javascript API" href='https://developers.facebook.com/docs/reference/javascript/' target='_blank'&gt;JavaScript SDK&lt;/a&gt; (ie. any XFBML we use). If you&amp;rsquo;re using more than one plugin, it would be wise to consolidate the location of this tag.&lt;/li&gt;
&lt;li&gt;The necessary JavaScript is pulled directly from Facebook.&lt;/li&gt;
&lt;li&gt;A custom XML based tag is where our comment box will be inserted. Check out the additional parameters in the documentation for more customization.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Special Note:&lt;/strong&gt; If you want each page on your site to have a different comment box (versus a side wide comment thread), then you&amp;rsquo;ll want to replace the url found in the href attribute. Using your favorite server side language, print out the url of the current page. For example, in Code Igniter (a PHP framework), I have a global function current_url(); that will return the &amp;mdash;wait for it&amp;mdash; current url. so, &lt;code&gt;&amp;lt;fb:comments href=&amp;rdquo;&amp;lt;?php echo current_url(); ?&amp;gt; ...&amp;nbsp; &lt;/code&gt; creates a different comment thread for each page. Try Googling "{language of choice} print current url" if you need more help with the back end.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;You should see the comment box being displayed. Make sure you&amp;rsquo;re logged into Facebook and enjoy your quick commenting system!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Posting a message on the user&amp;rsquo;s wall:&lt;/h2&gt;
&lt;p&gt;The &lt;a title="Facebook Javascript API" href='https://developers.facebook.com/docs/reference/javascript/' target='_blank'&gt;JavaScript SDK&lt;/a&gt;offers us a bunch of additional tools to play with user data. First though, we need to take a short detour and setup a Facebook application page (so Facebook knows who is asking to publish content).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visit the create application form.&lt;/li&gt;
&lt;li&gt;Fill out the name of your app appropriately (I usually just use whatever the title of my site is), and agree to Facebook&amp;rsquo;s terms.&lt;/li&gt;
&lt;li&gt;Skip ahead by clicking save.&lt;/li&gt;
&lt;li&gt;Copy the App ID for your application. Hold onto this.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;rsquo;re going to focus on the first example from the &lt;a title="Social Channels Page" href='https://developers.facebook.com/docs/channels/' target='_blank'&gt;Social Channels page&lt;/a&gt;. We want to prompt a logged in user to share a link on their wall. Facebook gives us the following base code.&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;code&gt; &amp;lt;div id="fb-root"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&amp;lt;script src="http://connect.facebook.net/en_US/all.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;FB.init({ appId:'YOUR_APP_ID', cookie:true, status:true, xfbml:true });&lt;br /&gt;FB.ui({ method: 'feed', message: 'Facebook for Websites is super-cool'});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The first two lines should seem pretty familiar. We have the #fb-root again, as well as the JavaScript sdk.&lt;/p&gt;
&lt;p&gt;Additionally, the FB.init and FB.ui methods are called right away;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FB.init&lt;/strong&gt; is Facebook&amp;rsquo;s initialize method. This connects to our app and sets a few other basic parameters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FB.ui&amp;nbsp;&lt;/strong&gt;is another SDK method. There&amp;rsquo;s a lot more to it, but we&amp;rsquo;re calling the feed method to display a popup to post on the users wall.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;FB.ui will execute as soon as the page is done loading, which is not the best scenario. We would really like it only occur after clicking a link. Let&amp;rsquo;s wrap FB.ui in a method we can then easily call.&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;code&gt; &amp;lt;script&amp;gt;&lt;br /&gt; function postToFacebookWall(content){ &lt;br /&gt;FB.ui({ method: 'feed', message: content}); &lt;br /&gt;}&lt;br /&gt; &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;code&gt;&amp;lt;a href=&amp;rdquo;javascript:postToFacebookWall('This is our content!');&amp;rdquo;&amp;gt;Click here to share this page on your Facebook wall&amp;lt;/a&amp;gt; &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;When a user clicks on our link, we call the FB.ui to prompt a post. We pass the content parameter to populate the message value within FB.ui. This should give a bit more control when creating new links.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Other Sharing:&lt;/h2&gt;
&lt;p&gt;Besides Facebook plugins, there&amp;rsquo;s a whole world of different sharing plugins. Thankfully, they&amp;rsquo;re all very similar in code and usage. Nearly every instance you come across will have a form to generate customized code for you.&lt;/p&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Twitter - &lt;a href='https://twitter.com/about/resources/tweetbutton' target='_blank'&gt;Tweet Button&lt;/a&gt; 
&lt;ul&gt;
&lt;li&gt;Select your shape, the default tweet text, what URL to focus on, and you&amp;rsquo;re done! Copy, paste, and tweet!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Twitter - &lt;a href='https://twitter.com/about/resources/followbutton' target='_blank'&gt;Follow Button&lt;/a&gt; 
&lt;ul&gt;
&lt;li&gt;Enter your user name. Copy, paste, follow!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Google Plus - &lt;a href='http://www.google.com/webmasters/+1/button/' target='_blank'&gt;Plus 1&lt;/a&gt; 
&lt;ul&gt;
&lt;li&gt;The newest kid on the block, the asynchronous code looks worse than it is.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn - &lt;a href='http://www.linkedin.com/publishers' target='_blank'&gt;Share Button&lt;/a&gt; 
&lt;ul&gt;
&lt;li&gt;You may want keep this one away from your cute kitten Tumblr.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Delicious - &lt;a href='http://www.delicious.com/help/savebuttons' target='_blank'&gt;Save Buttons&lt;/a&gt; 
&lt;ul&gt;
&lt;li&gt;Although it may not be around for much longer, Delicious was the original social bookmarking website.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Digg - &lt;a href='http://about.digg.com/downloads/button/smart' target='_blank'&gt;Digg Button&lt;/a&gt; 
&lt;ul&gt;
&lt;li&gt;One of the earliest implementations of the social sharing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Reddit - &lt;a href='http://www.reddit.com/buttons/' target='_blank'&gt;Reddit Buttons&lt;/a&gt; 
&lt;ul&gt;
&lt;li&gt;Arguably where all the former Digg users now live.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;Group Sharing Widgets&lt;/h2&gt;
&lt;p&gt;Easily embed dozens of Social Widgets at once. These take the guess work out of your code and make it very easy to share. There are a bunch more, but these are generally the top three options.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="Add This" href='http://www.addthis.com/' target='_blank'&gt;AddThis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="Share This" href='http://sharethis.com/' target='_blank'&gt;ShareThis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="Add to Any" href='http://www.addtoany.com/' target='_blank'&gt;AddToAny.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Building social functions is a tricky task, but these social plugins help the hurt. Optimized by some of the best engineers in the industry, these code snippets will help your site grow and make sharing content easy.&lt;/p&gt;
&lt;p&gt;Make sure you dig through the Facebook documentation and let us know how you integrate social into your sites!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://jameswburke.com' target='_blank'&gt;James Burke&lt;/a&gt; is&amp;nbsp;the summer intern at Cykod. He is a&amp;nbsp;front end designer and developer from Pennslvania, going into his senior year for Computer Science.&lt;/p&gt;
&lt;p&gt;&lt;a data-show-count="false" class="twitter-follow-button" href='http://twitter.com/jameswburke' target='_blank'&gt;Follow @jameswburke&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cykod/AOTY/~4/_FQ5h_xtXcw" height="1" width="1"/&gt;</description>
      <media:thumbnail height="128" width="128" url="http://cykod.com/system/storage/3/45/2/431/preview/media-icons.gif" />
    <feedburner:origLink>http://cykod.com/blog/post/2011-07-how-to-social-plugins</feedburner:origLink></item>
    <item>
      <title>Boston Front End Web Developers Meetup, Round #1</title>
      <link>http://feedproxy.google.com/~r/cykod/AOTY/~3/Ejx5jbngvwQ/2011-05-boston-front-end-web-developers-meetup-round-1</link>
      <guid isPermaLink="false">http://cykod.com/blog/post/2011-05-boston-front-end-web-developers-meetup-round-1</guid>
      <dc:creator>Pascal Rettig</dc:creator>
      <category>Development</category>
      <category>HTML5</category>
      <category>Presentation</category>
      <pubDate>Sat, 28 May 2011 18:03:48 -0400</pubDate>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The first Boston Front End Web Developers Meetup went off this past Wednesday (May 25th) according to plan with around 30 people showing up for the&amp;nbsp;inaugural meeting - I gave a couple of talks, the first was a "State of Front End Development 2011" covering the current state of the craft and talked a bit about the aims of the group. The second one covered the basics of a Semantic HTML5 Chop with some extra details on Meta-data and the Semantic Web (I believe only a couple people nodded off during that one) Both presentations are embedded at the end of this post.&lt;/p&gt;
&lt;p&gt;I asked people to fill out a&amp;nbsp;survey&amp;nbsp;with a few questions - the most important of which was what topics of interest for upcoming presentation might be - here's the responses:&lt;/p&gt;
&lt;p&gt;&lt;img mce_ src='http://cykod.com/system/storage/3/d7/8/423/chart.png' src="/system/storage/3/d7/8/423/chart.png" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Actual Data:&lt;/p&gt;
&lt;table border="0" cellspacing="0" cellpadding="0" id="table#4"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="ss-table-label"&gt;Writing Semantic HTML, HTML5 101&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class="ss-table-number"&gt;20&lt;/td&gt;
&lt;td class="ss-table-percentage"&gt;69%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="ss-table-label"&gt;HTML5 &amp;amp; Progressive Enhancement, Shiv &amp;amp; Fallback Options&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class="ss-table-number"&gt;21&lt;/td&gt;
&lt;td class="ss-table-percentage"&gt;72%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="ss-table-label"&gt;Using Grids, Fixed and Fluid&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class="ss-table-number"&gt;17&lt;/td&gt;
&lt;td class="ss-table-percentage"&gt;59%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="ss-table-label"&gt;SaSS, Haml, Less&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class="ss-table-number"&gt;11&lt;/td&gt;
&lt;td class="ss-table-percentage"&gt;38%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="ss-table-label"&gt;Coding for the Mobile Web - Media queries, jQuery Touch, Mobile CSS support, etc&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class="ss-table-number"&gt;21&lt;/td&gt;
&lt;td class="ss-table-percentage"&gt;72%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="ss-table-label"&gt;Javascript, Basic (language overview)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class="ss-table-number"&gt;15&lt;/td&gt;
&lt;td class="ss-table-percentage"&gt;52%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="ss-table-label"&gt;Javascript, Advanced (closures, namespacing, ... )&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class="ss-table-number"&gt;14&lt;/td&gt;
&lt;td class="ss-table-percentage"&gt;48%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="ss-table-label"&gt;jQuery, Basic (jQuery 101 - Selectors, Animation, Ajax)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class="ss-table-number"&gt;17&lt;/td&gt;
&lt;td class="ss-table-percentage"&gt;59%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="ss-table-label"&gt;jQuery, Advanced (Promises, Templating, Data elements, new features&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class="ss-table-number"&gt;18&lt;/td&gt;
&lt;td class="ss-table-percentage"&gt;62%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="ss-table-label"&gt;Client side performance optimization (CDNs, minification, async loading, spriting, ... )&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class="ss-table-number"&gt;17&lt;/td&gt;
&lt;td class="ss-table-percentage"&gt;59%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="ss-table-label"&gt;A/B Testing&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class="ss-table-number"&gt;14&lt;/td&gt;
&lt;td class="ss-table-percentage"&gt;48%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="ss-table-label"&gt;Analytics Options&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class="ss-table-number"&gt;12&lt;/td&gt;
&lt;td class="ss-table-percentage"&gt;41%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="ss-table-label"&gt;Facebook integration, OAuth, OpenGraph, Social Widgets&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class="ss-table-number"&gt;18&lt;/td&gt;
&lt;td class="ss-table-percentage"&gt;62%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="ss-table-label"&gt;Semantic Web, RDFa, Microdata&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class="ss-table-number"&gt;11&lt;/td&gt;
&lt;td class="ss-table-percentage"&gt;38%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;What I thought was interesting was: one, the number of topics that had significant interest (no topic got under 38%) and two, the level of interest in learning more about mobile. It's pretty clear that there's a lot of interest in everything HTML5 related, and additionally both a serious need for mobile development and a lack of confidence in the best practices. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;If you're in the Boston area, join us for the next &lt;a href='http://www.meetup.com/Boston-Frontend-Developers/events/17783351/' target='_blank'&gt;Boston Front End Web Developers meetup&lt;/a&gt;, and if you're interested in presenting on a topic shoot me an email at pascal at this domain.&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cykod/AOTY/~4/Ejx5jbngvwQ" height="1" width="1"/&gt;</description>
      <media:thumbnail height="95" width="128" url="http://cykod.com/system/storage/3/d5/c/422/preview/boston-front-end.jpeg" />
    <feedburner:origLink>http://cykod.com/blog/post/2011-05-boston-front-end-web-developers-meetup-round-1</feedburner:origLink></item>
    <item>
      <title>When's the best time to email a busy person?</title>
      <link>http://feedproxy.google.com/~r/cykod/AOTY/~3/9cI8cyUZcpU/2011-05-whens-the-best-time-to-email-a-busy-person</link>
      <guid isPermaLink="false">http://cykod.com/blog/post/2011-05-whens-the-best-time-to-email-a-busy-person</guid>
      <dc:creator>Pascal Rettig</dc:creator>
      <category>Consulting</category>
      <pubDate>Tue, 24 May 2011 09:47:50 -0400</pubDate>
      <description>&lt;h3&gt;&lt;/h3&gt;
&lt;h2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/h2&gt;
&lt;h2&gt;Mid-morning.&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="emphasis"&gt;Here's why:&lt;/span&gt; many people (myself included) don't get through their emails each day. When the number of emails someone receives each day exceeds their ability to respond to them those emails start to back up and can go unanswered for days. Now, most mail clients show the newest emails first, so new emails actually have a higher visual priority than old emails and will tend to get handled sooner as the recipient races to try to keep up with the inflow of contact requests.&lt;/p&gt;
&lt;p&gt;If you get your emails into someone's inbox after they have handled all the overnight notifications, marketing and spam messages, it'll sit as close to the top of their inbox for the greatest period of time and has the best chance of actually getting handled before falling into the bottom-of-the-inbox-hell. 
&lt;meta http-equiv="content-type" content="text/html; charset=utf-8" /&gt;
Given the variation in times in when people arrive at the office, mornings also tend to be less "busy" (with calls, meetings and the like) and so I'd guess people tend to spend more of their time responding to emails in the AM than the PM.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="emphasis"&gt;When's the worst time to email someone?&lt;/span&gt; Anytime in the late afternoon into the evening. Those email will get stacked up with all the overnight emails and may be ignored. Even worse, If they are viewed on a smartphone or the like but can't be responded to immediately because the reader is not at the office, they email client will still mark them as "read" and they will effectively disappear into the clutter of the inbox.&lt;/p&gt;
&lt;p&gt;(Note, this is all from my own personal experience as both the sender and recipient, so I'm sure there's lots of other opinions on the matter)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cykod/AOTY/~4/9cI8cyUZcpU" height="1" width="1"/&gt;</description>
      <media:thumbnail height="128" width="128" url="http://cykod.com/system/storage/3/97/f/272/preview/clock_fake.gif" />
    <feedburner:origLink>http://cykod.com/blog/post/2011-05-whens-the-best-time-to-email-a-busy-person</feedburner:origLink></item>
    <item>
      <title>Programmer Short Stories</title>
      <link>http://feedproxy.google.com/~r/cykod/AOTY/~3/3fqNHeldcTk/2011-04-programmer-short-stories</link>
      <guid isPermaLink="false">http://cykod.com/blog/post/2011-04-programmer-short-stories</guid>
      <dc:creator>Pascal Rettig</dc:creator>
      <pubDate>Mon, 25 Apr 2011 10:55:42 -0400</pubDate>
      <description>&lt;p&gt;While reading heavyweight developer tomes is a good way to get in-depth details about a specific topic, sometimes it's nice to snack on some lighter fare that's easier to pick up and put down. To that end, here's the list of my favorite developer "Short Stories" e.g short, easy to read&amp;nbsp;compilations&amp;nbsp;of little tidbits of knowledge about software development.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cykod/AOTY/~4/3fqNHeldcTk" height="1" width="1"/&gt;</description>
      <media:thumbnail height="128" width="128" url="http://cykod.com/system/storage/3/119/preview/heartbooks.gif" />
    <feedburner:origLink>http://cykod.com/blog/post/2011-04-programmer-short-stories</feedburner:origLink></item>
  </channel>
</rss>

