<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" media="screen" href="/styles/xslt/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:c9="http://channel9.msdn.com">
<channel>
	<title>Channel 9</title>
	<atom:link rel="self" type="application/rss+xml" href="http://channel9.msdn.com/Feeds/RSS"></atom:link>
	<itunes:summary>Channel 9 keeps you up to date with the latest news and behind the scenes info from Microsoft that developers love to keep up with. From LINQ to SilverLight – Watch videos and hear about all the cool technologies coming and the people behind them.</itunes:summary>
	<itunes:author>Microsoft</itunes:author>
	<itunes:subtitle></itunes:subtitle>
	<image>
		<url>http://mschnlnine.vo.llnwd.net/d1/Dev/App_Themes/C9/images/feedimage.png</url>
		<title>Channel 9</title>
		<link>http://channel9.msdn.com/</link>
	</image>
	<itunes:image href="http://mschnlnine.vo.llnwd.net/d1/Dev/App_Themes/C9/images/feedimage.png"></itunes:image>
	<itunes:category text="Technology"></itunes:category>
	<description>Channel 9 keeps you up to date with the latest news and behind the scenes info from Microsoft that developers love to keep up with. From LINQ to SilverLight – Watch videos and hear about all the cool technologies coming and the people behind them.</description>
	<link>http://channel9.msdn.com/</link>
	<language>en</language>
	<pubDate>Sun, 19 May 2013 15:13:18 GMT</pubDate>
	<lastBuildDate>Sun, 19 May 2013 15:13:18 GMT</lastBuildDate>
	<generator>Rev9</generator>
	<item>
			<title>TWC9: New Win Dev Center, Charles Petzold, ALM Rangers and more | This Week On Channel 9</title>
			<description><![CDATA[<p>This week on Channel 9, Mark and Dan discuss the week's top developer news, including;</p><ul><li><a href="http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9-May-17-2013#time=1m07s">[01:07]</a> <a href="http://blogs.msdn.com/b/windowsappdev/archive/2013/05/14/introducing-a-new-windows-dev-center-experience.aspx">Introducing a new Windows Dev Center experience</a>, <a href="http://msdn.microsoft.com/en-us/windows/default.aspx">Windows Dev Center</a> </li><li><a href="http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9-May-17-2013#time=2m25s">[02:25]</a> <a href="http://blogs.windows.com/windows/b/bloggingwindows/archive/2013/05/14/windows-keeps-getting-better.aspx">Windows 8.1 at //build (Windows Keeps Getting Better)</a> (Brandon LeBlanc) </li><li><a href="http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9-May-17-2013#time=3m25s">[03:25]</a> Channel 9 Highlight: <a href="http://channel9.msdn.com/posts/MVA-Live-QA-Programming-Windows-with-Charles-Petzold">Programming Windows with Charles Petzold</a> (Charles Petzold, Jaime Rodriguez) </li><li><a href="http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9-May-17-2013#time=4m44s">[04:44]</a> <a href="http://channel9.msdn.com/coding4fun/articles/MissionControl-A-Flexible-API-for-Remote-Device-Control">MissionControl - A Flexible API for Remote Device Control</a> (Clint Rutkas, Den Delimarsky) </li><li><a href="http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9-May-17-2013#time=6m08s">[06:08]</a> <a href="http://blogs.msdn.com/b/willy-peter_schaub/archive/2013/05/16/visual-studio-alm-ranger-solutions-catalog.aspx">Visual Studio ALM Ranger Solutions Catalog</a> (Willy-P. Schaub) </li><li><a href="http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9-May-17-2013#time=7m30s">[07:30]</a> <a href="http://www.clemensreijnen.nl/post/2013/05/12/6-Testing-with-Visual-Studio-2012-Agile-TMap-_-The-QUALITY-A-Z-Roadshow.aspx">Testing with Visual Studio 2012 Agile TMap The QUALITY A-Z Roadshow</a> (Clemens Reijnen) </li><li><a href="http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9-May-17-2013#time=8m20s">[08:20]</a> Channel 9 Highlight: <a href="http://channel9.msdn.com/coding4fun/articles/Getting-started-with-Cinder-for-Windows-Store-Apps">Getting started with Cinder for Windows Store Apps</a> (Rick Barraza) </li><li><a href="http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9-May-17-2013#time=9m30s">[09:30]</a> <a href="http://primaryobjects.com/CMS/Article152.aspx">Solving Mazes with AI Pathfinding Techniques: A* vs Tremaux</a> (Kory Becker) </li></ul><p><strong>Picks of the Week!</strong></p><ul><li>Mark's Pick of the Week:<a href="http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9-May-17-2013#time=12m04s">[12:04]</a> <a href="http://visualstudiogallery.msdn.microsoft.com/33b0242d-7158-4d39-9a01-0a08cf7c28bd">Farticus</a> (Sayed Hashimi, Mads Kristensen) </li><li>Dan's Pick of the Week:<a href="http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9-May-17-2013#time=13m27s">[13:27]</a> <a href="http://www.quora.com/Blue-Screen-of-Death/Who-designed-the-original-Windows-Blue-Screen-of-Death">Blue Screen of Death: Who designed the original Windows Blue Screen of Death?</a> (John Vert) </li></ul> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Entry:RSSView:fecc85bdd7aa487fb410a1c1015bf052">]]></description>
			<comments>http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9-May-17-2013</comments>
			<itunes:summary>This week on Channel 9, Mark and Dan discuss the week&#39;s top developer news, including; [01:07] Introducing a new Windows Dev Center experience, Windows Dev Center [02:25] Windows 8.1 at //build (Windows Keeps Getting Better) (Brandon LeBlanc) [03:25] Channel 9 Highlight: Programming Windows with Charles Petzold (Charles Petzold, Jaime Rodriguez) [04:44] MissionControl - A Flexible API for Remote Device Control (Clint Rutkas, Den Delimarsky) [06:08] Visual Studio ALM Ranger Solutions Catalog (Willy-P. Schaub) [07:30] Testing with Visual Studio 2012 Agile TMap The QUALITY A-Z Roadshow (Clemens Reijnen) [08:20] Channel 9 Highlight: Getting started with Cinder for Windows Store Apps (Rick Barraza) [09:30] Solving Mazes with AI Pathfinding Techniques: A* vs Tremaux (Kory Becker) Picks of the Week! Mark&#39;s Pick of the Week:[12:04] Farticus (Sayed Hashimi, Mads Kristensen) Dan&#39;s Pick of the Week:[13:27] Blue Screen of Death: Who designed the original Windows Blue Screen of Death? (John Vert) </itunes:summary>
			<itunes:duration>892</itunes:duration>
			<link>http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9-May-17-2013</link>
			<pubDate>Fri, 17 May 2013 22:01:54 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9-May-17-2013</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/50e9/428670cd-e541-48ab-9294-0043ef1450e9/TWC905172013_100.jpg" height="56" width="100"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/50e9/428670cd-e541-48ab-9294-0043ef1450e9/TWC905172013_220.jpg" height="123" width="220"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/50e9/428670cd-e541-48ab-9294-0043ef1450e9/TWC905172013_512.jpg" height="288" width="512"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/50e9/428670cd-e541-48ab-9294-0043ef1450e9/TWC905172013_960.jpg" height="540" width="960"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/50e9/428670cd-e541-48ab-9294-0043ef1450e9/TWC905172013.mp3" expression="full" duration="892" fileSize="14281665" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/50e9/428670cd-e541-48ab-9294-0043ef1450e9/TWC905172013.mp4" expression="full" duration="892" fileSize="84684810" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/50e9/428670cd-e541-48ab-9294-0043ef1450e9/TWC905172013.webm" expression="full" duration="892" fileSize="59844057" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/50e9/428670cd-e541-48ab-9294-0043ef1450e9/TWC905172013.wma" expression="full" duration="892" fileSize="7223643" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/50e9/428670cd-e541-48ab-9294-0043ef1450e9/TWC905172013.wmv" expression="full" duration="892" fileSize="58175165" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/50e9/428670cd-e541-48ab-9294-0043ef1450e9/TWC905172013_high.mp4" expression="full" duration="892" fileSize="186242244" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/50e9/428670cd-e541-48ab-9294-0043ef1450e9/TWC905172013_mid.mp4" expression="full" duration="892" fileSize="129970348" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/50e9/428670cd-e541-48ab-9294-0043ef1450e9/TWC905172013_Source.wmv" expression="full" duration="892" fileSize="114015756" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://smooth.ch9.ms/ch9/50e9/428670cd-e541-48ab-9294-0043ef1450e9/TWC905172013.ism/manifest" expression="full" duration="892" fileSize="6036" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/50e9/428670cd-e541-48ab-9294-0043ef1450e9/TWC905172013.wmv" length="58175165" type="video/x-ms-wmv"></enclosure>
			<dc:creator>Dan Fernandez, Greg Duncan, Mark DeFalco</dc:creator>
			<itunes:author>Dan Fernandez, Greg Duncan, Mark DeFalco</itunes:author>
			<slash:comments>1</slash:comments>
			<wfw:commentRss>http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9-May-17-2013/RSS</wfw:commentRss>
			<category>ALM</category>
			<category>C#</category>
			<category>Visual Studio</category>
			<category>Windows 8</category>
			<category>Visual Studio 2012</category>
	</item>
	<item>
			<title>Episode 107 - Service Bus updates in Windows Azure SDK 2.0 | Windows Azure Cloud Cover Show</title>
			<description><![CDATA[<p>In this episode <a href="http://nickharris.net/">Nick Harris</a>&nbsp;and <a href="http://ntotten.com/">Nathan Totten </a>are joined by <a href="http://twitter.com/AbhishekRLal">Abhishek Lal</a> <span>–&nbsp;Senior </span>Program&nbsp;Manager on Windows&nbsp;Azure&nbsp;<span>– who&nbsp;demonstrates what's new&nbsp;for Service Bus in the Windows Azure SDK 2.0 update including OnMessage receiver, Message Browse and SAS.</span></p><p>Links to deck, demo source code and update shown on the show follow:</p><ul><li><a href="http://abhishekrlal.com/?attachment_id=183" target="_blank">Slides </a>presented&nbsp; </li><li><a href="" target="_blank">What's new in Service Bus for SDK 2.0 release</a> </li><li>Code samples: <a href="http://code.msdn.microsoft.com/windowsazure/OnMessage-programing-model-58451157">OnMessage</a>, <a href="http://code.msdn.microsoft.com/windowsazure/Service-Bus-Message-Browse-4e434ffe">Message Browse</a>, <a href="http://code.msdn.microsoft.com/windowsazure/Shared-Access-Signature-0a88adf8">SAS</a> </li></ul><p><a href="https://www.facebook.com/CloudCoverShow"><span>Like Cloud Cover on Facebook!</span></a></p><p><a class="twitter-follow-button" href="https://twitter.com/cloudcovershow">Follow @CloudCoverShow</a><br><a class="twitter-follow-button" href="https://twitter.com/cloudnick">Follow @cloudnick</a> <br><a class="twitter-follow-button" href="https://twitter.com/ntotten">Follow @ntotten</a> <br><a class="twitter-follow-button" href="https://twitter.com/abhishekrlal">Follow @abhishekrlal</a></p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Entry:RSSView:4344d91910d3405eb620a1bf0122d58a">]]></description>
			<comments>http://channel9.msdn.com/Shows/Cloud+Cover/Episode-107-Service-Bus-updates-in-Windows-Azure-SDK-20</comments>
			<itunes:summary>In this episode Nick Harris&amp;nbsp;and Nathan Totten are joined by Abhishek Lal –&amp;nbsp;Senior Program&amp;nbsp;Manager on Windows&amp;nbsp;Azure&amp;nbsp;– who&amp;nbsp;demonstrates what&#39;s new&amp;nbsp;for Service Bus in the Windows Azure SDK 2.0 update including OnMessage receiver, Message Browse and SAS. Links to deck, demo source code and update shown on the show follow: Slides presented&amp;nbsp; What&#39;s new in Service Bus for SDK 2.0 release Code samples: OnMessage, Message Browse, SAS Like Cloud Cover on Facebook! Follow @CloudCoverShowFollow @cloudnick Follow @ntotten Follow @abhishekrlal </itunes:summary>
			<itunes:duration>2497</itunes:duration>
			<link>http://channel9.msdn.com/Shows/Cloud+Cover/Episode-107-Service-Bus-updates-in-Windows-Azure-SDK-20</link>
			<pubDate>Fri, 17 May 2013 22:32:22 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/Shows/Cloud+Cover/Episode-107-Service-Bus-updates-in-Windows-Azure-SDK-20</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/4879/46858690-ef6f-4796-82b6-a567e99b4879/CloudCover108_100.jpg" height="56" width="100"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/4879/46858690-ef6f-4796-82b6-a567e99b4879/CloudCover108_220.jpg" height="123" width="220"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/4879/46858690-ef6f-4796-82b6-a567e99b4879/CloudCover108_512.jpg" height="288" width="512"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/4879/46858690-ef6f-4796-82b6-a567e99b4879/CloudCover108_960.jpg" height="540" width="960"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/4879/46858690-ef6f-4796-82b6-a567e99b4879/CloudCover108.mp3" expression="full" duration="2497" fileSize="39960273" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4879/46858690-ef6f-4796-82b6-a567e99b4879/CloudCover108.mp4" expression="full" duration="2497" fileSize="238355936" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4879/46858690-ef6f-4796-82b6-a567e99b4879/CloudCover108.webm" expression="full" duration="2497" fileSize="149394575" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4879/46858690-ef6f-4796-82b6-a567e99b4879/CloudCover108.wma" expression="full" duration="2497" fileSize="20200923" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4879/46858690-ef6f-4796-82b6-a567e99b4879/CloudCover108.wmv" expression="full" duration="2497" fileSize="150370571" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4879/46858690-ef6f-4796-82b6-a567e99b4879/CloudCover108_high.mp4" expression="full" duration="2497" fileSize="521734362" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4879/46858690-ef6f-4796-82b6-a567e99b4879/CloudCover108_mid.mp4" expression="full" duration="2497" fileSize="365998178" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4879/46858690-ef6f-4796-82b6-a567e99b4879/CloudCover108_Source.wmv" expression="full" duration="2497" fileSize="390912021" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://smooth.ch9.ms/ch9/4879/46858690-ef6f-4796-82b6-a567e99b4879/CloudCover108.ism/manifest" expression="full" duration="2497" fileSize="6046" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/4879/46858690-ef6f-4796-82b6-a567e99b4879/CloudCover108.wmv" length="150370571" type="video/x-ms-wmv"></enclosure>
			<dc:creator>Nathan Totten, Nick Harris, Abhishek Lal</dc:creator>
			<itunes:author>Nathan Totten, Nick Harris, Abhishek Lal</itunes:author>
			<slash:comments>0</slash:comments>
			<wfw:commentRss>http://channel9.msdn.com/Shows/Cloud+Cover/Episode-107-Service-Bus-updates-in-Windows-Azure-SDK-20/RSS</wfw:commentRss>
			<category>Cloud Computing</category>
			<category>Service Bus</category>
			<category>Windows Azure</category>
	</item>
	<item>
			<title>Developer Diaries: Jing Chan gets over 1 Million Facebook &quot;likes&quot; | Developer Diaries</title>
			<description><![CDATA[<p>Jing Chan talks about his personal history as a developer and his experience creating <a href="http://www.windowsphone.com/en-us/store/app/camwow/d9b26305-6c0d-4a9e-8960-00568a355d69">CamWow</a>.</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Entry:RSSView:423cd36dae9e49e7924ba1bf013c350b">]]></description>
			<comments>http://channel9.msdn.com/Series/Developer-Diaries/Developer-DIaries-Jing-Chan-gets-over-1-Million-Facebook-likes</comments>
			<itunes:summary>Jing Chan talks about his personal history as a developer and his experience creating CamWow. </itunes:summary>
			<itunes:duration>875</itunes:duration>
			<link>http://channel9.msdn.com/Series/Developer-Diaries/Developer-DIaries-Jing-Chan-gets-over-1-Million-Facebook-likes</link>
			<pubDate>Fri, 17 May 2013 16:53:34 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/Series/Developer-Diaries/Developer-DIaries-Jing-Chan-gets-over-1-Million-Facebook-likes</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/4d94/2a97c2e9-9562-4e81-a500-428fee234d94/JingChan_100.jpg" height="56" width="100"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/4d94/2a97c2e9-9562-4e81-a500-428fee234d94/JingChan_220.jpg" height="123" width="220"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/4d94/2a97c2e9-9562-4e81-a500-428fee234d94/JingChan_512.jpg" height="288" width="512"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/4d94/2a97c2e9-9562-4e81-a500-428fee234d94/JingChan_960.jpg" height="540" width="960"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/4d94/2a97c2e9-9562-4e81-a500-428fee234d94/JingChan.mp3" expression="full" duration="875" fileSize="14011629" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4d94/2a97c2e9-9562-4e81-a500-428fee234d94/JingChan.mp4" expression="full" duration="875" fileSize="84196481" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4d94/2a97c2e9-9562-4e81-a500-428fee234d94/JingChan.webm" expression="full" duration="875" fileSize="78529454" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4d94/2a97c2e9-9562-4e81-a500-428fee234d94/JingChan.wma" expression="full" duration="875" fileSize="7088463" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4d94/2a97c2e9-9562-4e81-a500-428fee234d94/JingChan.wmv" expression="full" duration="875" fileSize="75684743" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4d94/2a97c2e9-9562-4e81-a500-428fee234d94/JingChan_high.mp4" expression="full" duration="875" fileSize="184806855" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4d94/2a97c2e9-9562-4e81-a500-428fee234d94/JingChan_mid.mp4" expression="full" duration="875" fileSize="129131621" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4d94/2a97c2e9-9562-4e81-a500-428fee234d94/JingChan_Source.wmv" expression="full" duration="875" fileSize="260997245" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://smooth.ch9.ms/ch9/4d94/2a97c2e9-9562-4e81-a500-428fee234d94/JingChan.ism/manifest" expression="full" duration="875" fileSize="7576" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/4d94/2a97c2e9-9562-4e81-a500-428fee234d94/JingChan.wmv" length="75684743" type="video/x-ms-wmv"></enclosure>
			<dc:creator>Laura Foy</dc:creator>
			<itunes:author>Laura Foy</itunes:author>
			<slash:comments>3</slash:comments>
			<wfw:commentRss>http://channel9.msdn.com/Series/Developer-Diaries/Developer-DIaries-Jing-Chan-gets-over-1-Million-Facebook-likes/RSS</wfw:commentRss>
			<category>Developer Community</category>
			<category>Windows Phone</category>
			<category>Apps</category>
			<category>Windows 8</category>
	</item>
	<item>
			<title>Edge Show 62 - Hyper-V Server 2012 Cluster Deployment Using Free Tools  | Edge</title>
			<description><![CDATA[<p>At <a href="http://channel9.msdn.com/Shows/Edge/Edge-Show-62-Hyper-V-Server-2012-Cluster-Deployment-Using-Free-Tools#time=06m25s">[06:25]</a> Symon Perriman&nbsp;and Rick Claus talk through an end-to-end deploy of a Hyper-V cluster using entirely free tools (without any evaluation bits—you get to keep everything!). First Symon introduces the free tools, which include Hyper-V Server 2012 (<a href="http://microsoft.com/hvs">http://microsoft.com/hvs</a>), Microsoft iSCSI Software Target 3.3 (<a href="http://aka.ms/iSCSITarget">http://aka.ms/iSCSITarget</a>), Remote Desktop Connection Manager (RDCMan: <a href="http://aka.ms/RDCman">http://aka.ms/RDCman</a>), and Remote Server Administration Tools (RSAT: <a href="http://aka.ms/RSAT">http://aka.ms/RSAT</a>).</p><p>Next, at <a href="http://channel9.msdn.com/Shows/Edge/Edge-Show-62-Hyper-V-Server-2012-Cluster-Deployment-Using-Free-Tools#time=11m55s">[11:55]</a> the team walks through an installation of Hyper-V Server 2012 using Windows 8 Client Hyper-V, taking advantage of the lightweight installation package and small storage footprint. Symon then uses RDCMan to manage a new Hyper-V Server 2012 host and discusses some password management features. Then, Rick talks about the GUIless configuration options used to join the Hyper-V Server to the domain, and also discusses different GUI-based remote management options.</p><p>Symon then <a href="http://channel9.msdn.com/Shows/Edge/Edge-Show-62-Hyper-V-Server-2012-Cluster-Deployment-Using-Free-Tools#time=16m20s">[16:20]</a> installs the iSCSI Software Target, creates an iSCSI target and virtual disks, and connects both hosts to the target through their iSCSI initiators. Next, the team uses PowerShell to initialize and format the newly created iSCSI disks. The team then <a href="http://channel9.msdn.com/Shows/Edge/Edge-Show-62-Hyper-V-Server-2012-Cluster-Deployment-Using-Free-Tools#time=28m25s">[28:25]</a> switches to using RSAT for remote server management of the Hyper-V hosts from a Windows 8 laptop. After connecting to the hosts, they install the Failover Clustering feature and being to build the cluster. After validating the Hyper-V hosts and iSCSI storage, the team ends the demo by creating a Failover Clustering.</p><p><strong>News:</strong></p><ul><li><a href="http://channel9.msdn.com/Shows/Edge/Edge-Show-62-Hyper-V-Server-2012-Cluster-Deployment-Using-Free-Tools#time=0m20s">[00:20]</a> Join the System Center&nbsp;2012 Live Q&amp;A event on May 21st: <a href="http://aka.ms/AzureJS">http://aka.ms/Earn-SysCtr</a> (this link will redirect you to the recording approximately one week after the&nbsp;event) </li><li><a href="http://channel9.msdn.com/Shows/Edge/Edge-Show-62-Hyper-V-Server-2012-Cluster-Deployment-Using-Free-Tools#time=1m10s">[01:10]</a> Register for TechEd North America (<a href="http://northamerica.msteched.com">http://northamerica.msteched.com</a>)&nbsp;and TechEd Europe (<a href="http://europe.msteched.com">http://europe.msteched.com</a>) before they sell out! </li><li><a href="http://channel9.msdn.com/Shows/Edge/Edge-Show-62-Hyper-V-Server-2012-Cluster-Deployment-Using-Free-Tools#time=1m45s">[01:45]</a> 5 new System Center 2012 SP1 virtual labs are now available from TechNet: <a href="http://aka.ms/SCLabs">http://aka.ms/SCLabs</a> </li><li><a href="http://channel9.msdn.com/Shows/Edge/Edge-Show-62-Hyper-V-Server-2012-Cluster-Deployment-Using-Free-Tools#time=2m25s">[02:25]</a> Check out the exciting&nbsp;news about the upcoming Windows 8.1 from the Windows blog: <a href="http://blogs.windows.com/windows/b/bloggingwindows/archive/2013/05/14/windows-keeps-getting-better.aspx">http://blogs.windows.com/windows/b/bloggingwindows/archive/2013/05/14/windows-keeps-getting-better.aspx</a> </li><li><a href="http://channel9.msdn.com/Shows/Edge/Edge-Show-62-Hyper-V-Server-2012-Cluster-Deployment-Using-Free-Tools#time=3m15s">[03:15]</a> A new System Center 2012&nbsp;Operations Manager (SCOM) Management Pack has been released to monitor&nbsp;Amazon Web Services (AWS): <a href="https://aws.amazon.com/windows/system-center/">https://aws.amazon.com/windows/system-center/</a> &nbsp;&nbsp;&nbsp;&nbsp; </li><li><a href="http://channel9.msdn.com/Shows/Edge/Edge-Show-62-Hyper-V-Server-2012-Cluster-Deployment-Using-Free-Tools#time=4m15s">[04:15]</a> Learn more about creating a OEM Appliance OOBE for simplified Failover Clustering deployments: <a href="http://blogs.technet.com/b/filecab/archive/2013/05/08/oem-appliance-oobe-update-set-up-a-4-node-cluster-in-30-minutes.aspx">http://blogs.technet.com/b/filecab/archive/2013/05/08/oem-appliance-oobe-update-set-up-a-4-node-cluster-in-30-minutes.aspx</a> </li></ul><p><strong>Connect with the Edge Team: </strong><a href="https://www.facebook.com/group.php?gid=5850797374">Facebook</a> – <a href="https://twitter.com/tnedge">Twitter</a>&nbsp;- <a href="mailto:edge@microsoft.com">Email</a></p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Entry:RSSView:5ccc29f4f7564d5baf2fa1bf011794d4">]]></description>
			<comments>http://channel9.msdn.com/Shows/Edge/Edge-Show-62-Hyper-V-Server-2012-Cluster-Deployment-Using-Free-Tools</comments>
			<itunes:summary>At [06:25] Symon Perriman&amp;nbsp;and Rick Claus talk through an end-to-end deploy of a Hyper-V cluster using entirely free tools (without any evaluation bits—you get to keep everything!). First Symon introduces the free tools, which include Hyper-V Server 2012 (http://microsoft.com/hvs), Microsoft iSCSI Software Target 3.3 (http://aka.ms/iSCSITarget), Remote Desktop Connection Manager (RDCMan: http://aka.ms/RDCman), and Remote Server Administration Tools (RSAT: http://aka.ms/RSAT). Next, at [11:55] the team walks through an installation of Hyper-V Server 2012 using Windows 8 Client Hyper-V, taking advantage of the lightweight installation package and small storage footprint. Symon then uses RDCMan to manage a new Hyper-V Server 2012 host and discusses some password management features. Then, Rick talks about the GUIless configuration options used to join the Hyper-V Server to the domain, and also discusses different GUI-based remote management options. Symon then [16:20] installs the iSCSI Software Target, creates an iSCSI target and virtual disks, and connects both hosts to the target through their iSCSI initiators. Next, the team uses PowerShell to initialize and format the newly created iSCSI disks. The team then [28:25] switches to using RSAT for remote server management of the Hyper-V hosts from a Windows 8 laptop. After connecting to the hosts, they install the Failover Clustering feature and being to build the cluster. After validating the Hyper-V hosts and iSCSI storage, the team ends the demo by creating a Failover Clustering. News: [00:20] Join the System Center&amp;nbsp;2012 Live Q&amp;amp;A event on May 21st: http://aka.ms/Earn-SysCtr (this link will redirect you to the recording approximately one week after the&amp;nbsp;event) [01:10] Register for TechEd North America (http://northamerica.msteched.com)&amp;nbsp;and TechEd Europe (http://europe.msteched.com) before they sell out! [01:45] 5 new System Center 2012 SP1 virtual labs are now available from TechNet: http://aka.</itunes:summary>
			<itunes:duration>2122</itunes:duration>
			<link>http://channel9.msdn.com/Shows/Edge/Edge-Show-62-Hyper-V-Server-2012-Cluster-Deployment-Using-Free-Tools</link>
			<pubDate>Fri, 17 May 2013 16:10:41 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/Shows/Edge/Edge-Show-62-Hyper-V-Server-2012-Cluster-Deployment-Using-Free-Tools</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/493c/992fe9e4-1c40-4125-8fa6-e08c74ba493c/EdgeShow62HyperVServer2012ClusterDeploymentusingF_100.jpg" height="56" width="100"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/493c/992fe9e4-1c40-4125-8fa6-e08c74ba493c/EdgeShow62HyperVServer2012ClusterDeploymentusingF_220.jpg" height="123" width="220"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/493c/992fe9e4-1c40-4125-8fa6-e08c74ba493c/EdgeShow62HyperVServer2012ClusterDeploymentusingF_512.jpg" height="288" width="512"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/493c/992fe9e4-1c40-4125-8fa6-e08c74ba493c/EdgeShow62HyperVServer2012ClusterDeploymentusingF_960.jpg" height="540" width="960"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/493c/992fe9e4-1c40-4125-8fa6-e08c74ba493c/EdgeShow62HyperVServer2012ClusterDeploymentusingF.mp3" expression="full" duration="2122" fileSize="33955884" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/493c/992fe9e4-1c40-4125-8fa6-e08c74ba493c/EdgeShow62HyperVServer2012ClusterDeploymentusingF.mp4" expression="full" duration="2122" fileSize="205743474" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/493c/992fe9e4-1c40-4125-8fa6-e08c74ba493c/EdgeShow62HyperVServer2012ClusterDeploymentusingF.webm" expression="full" duration="2122" fileSize="117570397" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/493c/992fe9e4-1c40-4125-8fa6-e08c74ba493c/EdgeShow62HyperVServer2012ClusterDeploymentusingF.wma" expression="full" duration="2122" fileSize="17166883" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/493c/992fe9e4-1c40-4125-8fa6-e08c74ba493c/EdgeShow62HyperVServer2012ClusterDeploymentusingF.wmv" expression="full" duration="2122" fileSize="116699537" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/493c/992fe9e4-1c40-4125-8fa6-e08c74ba493c/EdgeShow62HyperVServer2012ClusterDeploymentusingF_high.mp4" expression="full" duration="2122" fileSize="449156508" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/493c/992fe9e4-1c40-4125-8fa6-e08c74ba493c/EdgeShow62HyperVServer2012ClusterDeploymentusingF_mid.mp4" expression="full" duration="2122" fileSize="313798697" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/493c/992fe9e4-1c40-4125-8fa6-e08c74ba493c/EdgeShow62HyperVServer2012ClusterDeploymentusingF_Source.wmv" expression="full" duration="2122" fileSize="433949795" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://smooth.ch9.ms/ch9/493c/992fe9e4-1c40-4125-8fa6-e08c74ba493c/EdgeShow62HyperVServer2012ClusterDeploymentusingF.ism/manifest" expression="full" duration="2122" fileSize="6406" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/493c/992fe9e4-1c40-4125-8fa6-e08c74ba493c/EdgeShow62HyperVServer2012ClusterDeploymentusingF.wmv" length="116699537" type="video/x-ms-wmv"></enclosure>
			<dc:creator>Symon Perriman</dc:creator>
			<itunes:author>Symon Perriman</itunes:author>
			<slash:comments>1</slash:comments>
			<wfw:commentRss>http://channel9.msdn.com/Shows/Edge/Edge-Show-62-Hyper-V-Server-2012-Cluster-Deployment-Using-Free-Tools/RSS</wfw:commentRss>
			<category>Amazon</category>
			<category>Cluster</category>
			<category>HyperV</category>
			<category>Hyper-V</category>
			<category>OEM</category>
			<category>PowerShell</category>
			<category>Storage</category>
			<category>System Center Operations Manager</category>
			<category>Tech.Ed</category>
			<category>TechNet</category>
			<category>Windows</category>
			<category>Windows Server</category>
			<category>Remote Desktop</category>
			<category>TechEd Europe</category>
			<category>System Center 2012</category>
			<category>Windows Server 2012</category>
			<category>Failover Clustering</category>
	</item>
	<item>
			<title>Countdown to TechEd: All About Foundation Sessions, MS Store and Travel Tips | The Countdown Show</title>
			<description><![CDATA[<p>Episode #8 of the 2013 countdown season has Joey and Rick&nbsp;sneaking into the Green Screen studio to record this episode. Lots of great information about the Foundation sessions, the new Channel 9 event application for Teched (and beyond) and&nbsp;the differences between the conference store&nbsp;vs the newly announced Microsoft Store.&nbsp;&nbsp;For everyone traveling to TechEd NorthAmerica and Europe -&nbsp;we wrap up with some helpful travel tips we've collected along the way.</p><ul><li><a href="http://channel9.msdn.com/Events/TechEd/NorthAmerica/2013?sort=sequential&amp;direction=desc&amp;term=&amp;y=Foundational" target="_blank">The Complete&nbsp;Foundation Session list</a> </li><li><a href="http://channel9.msdn.com/Blogs/TechEd/Microsoft-Retail-Store-Open-for-Business-at-TechEd-North-America" target="_blank">Details</a> on the Microsoft Store </li><li><a href="http://www.windowsphone.com/en-us/store/app/ch9-events/d0b702c7-90a2-4e71-aaaf-ca66f04ba418" target="_blank">Get the Windows Phone App </a>for Channel 9 events </li></ul><p>Get out there&nbsp;and interact Online:</p><ul><li>C9 TechEd Forums (<a href="http://channel9.msdn.com/Forums/TechEdNA">NorthAmerica</a>&nbsp;and&nbsp;<a href="http://channel9.msdn.com/Forums/TechEdEU">Europe</a>) </li><li>Twitter: use the&nbsp;<a href="https://twitter.com/search?q=%23msteched" target="_blank">#msteched&nbsp;</a>hashtag for NA,&nbsp;<a href="https://twitter.com/search?q=%23tee13" target="_blank">#TEE13</a>&nbsp;for Europe. </li><li>Facebook:&nbsp;<a href="http://www.facebook.com/teched" target="_blank">NorthAmerica</a>&nbsp;and&nbsp;<a href="http://facebook.com/techedeurope" target="_blank">Europe</a> </li></ul><p>Get out there and&nbsp;<a href="http://msteched.com" target="_blank">REGISTER if you haven't already</a>!</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Entry:RSSView:cc958bdbca664b818e47a1bf017197ad">]]></description>
			<comments>http://channel9.msdn.com/Shows/The-Countdown-Show/Countdown-to-TechEd-All-About-Foundation-Sessions-MS-Store-and-Travel-Tips</comments>
			<itunes:summary>Episode #8 of the 2013 countdown season has Joey and Rick&amp;nbsp;sneaking into the Green Screen studio to record this episode. Lots of great information about the Foundation sessions, the new Channel 9 event application for Teched (and beyond) and&amp;nbsp;the differences between the conference store&amp;nbsp;vs the newly announced Microsoft Store.&amp;nbsp;&amp;nbsp;For everyone traveling to TechEd NorthAmerica and Europe -&amp;nbsp;we wrap up with some helpful travel tips we&#39;ve collected along the way. The Complete&amp;nbsp;Foundation Session list Details on the Microsoft Store Get the Windows Phone App for Channel 9 events Get out there&amp;nbsp;and interact Online: C9 TechEd Forums (NorthAmerica&amp;nbsp;and&amp;nbsp;Europe) Twitter: use the&amp;nbsp;#msteched&amp;nbsp;hashtag for NA,&amp;nbsp;#TEE13&amp;nbsp;for Europe. Facebook:&amp;nbsp;NorthAmerica&amp;nbsp;and&amp;nbsp;Europe Get out there and&amp;nbsp;REGISTER if you haven&#39;t already! </itunes:summary>
			<itunes:duration>1119</itunes:duration>
			<link>http://channel9.msdn.com/Shows/The-Countdown-Show/Countdown-to-TechEd-All-About-Foundation-Sessions-MS-Store-and-Travel-Tips</link>
			<pubDate>Thu, 16 May 2013 17:15:09 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/Shows/The-Countdown-Show/Countdown-to-TechEd-All-About-Foundation-Sessions-MS-Store-and-Travel-Tips</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/a8b3/233fb463-78c0-482d-88ad-1a9f4264a8b3/2013countdownshow8_100.jpg" height="56" width="100"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/a8b3/233fb463-78c0-482d-88ad-1a9f4264a8b3/2013countdownshow8_220.jpg" height="123" width="220"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/a8b3/233fb463-78c0-482d-88ad-1a9f4264a8b3/2013countdownshow8_512.jpg" height="288" width="512"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/a8b3/233fb463-78c0-482d-88ad-1a9f4264a8b3/2013countdownshow8_960.jpg" height="540" width="960"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/a8b3/233fb463-78c0-482d-88ad-1a9f4264a8b3/2013countdownshow8.mp3" expression="full" duration="1119" fileSize="17913300" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/a8b3/233fb463-78c0-482d-88ad-1a9f4264a8b3/2013countdownshow8.mp4" expression="full" duration="1119" fileSize="105840138" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/a8b3/233fb463-78c0-482d-88ad-1a9f4264a8b3/2013countdownshow8.webm" expression="full" duration="1119" fileSize="139237743" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/a8b3/233fb463-78c0-482d-88ad-1a9f4264a8b3/2013countdownshow8.wma" expression="full" duration="1119" fileSize="9059087" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/a8b3/233fb463-78c0-482d-88ad-1a9f4264a8b3/2013countdownshow8.wmv" expression="full" duration="1119" fileSize="140346527" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/a8b3/233fb463-78c0-482d-88ad-1a9f4264a8b3/2013countdownshow8_high.mp4" expression="full" duration="1119" fileSize="232648832" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/a8b3/233fb463-78c0-482d-88ad-1a9f4264a8b3/2013countdownshow8_mid.mp4" expression="full" duration="1119" fileSize="162391936" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/a8b3/233fb463-78c0-482d-88ad-1a9f4264a8b3/2013countdownshow8_Source.wmv" expression="full" duration="1119" fileSize="228889232" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://smooth.ch9.ms/ch9/a8b3/233fb463-78c0-482d-88ad-1a9f4264a8b3/2013countdownshow8.ism/manifest" expression="full" duration="1119" fileSize="6096" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/a8b3/233fb463-78c0-482d-88ad-1a9f4264a8b3/2013countdownshow8.wmv" length="140346527" type="video/x-ms-wmv"></enclosure>
			<dc:creator>RicksterCDN, Joey Snow</dc:creator>
			<itunes:author>RicksterCDN, Joey Snow</itunes:author>
			<slash:comments>3</slash:comments>
			<wfw:commentRss>http://channel9.msdn.com/Shows/The-Countdown-Show/Countdown-to-TechEd-All-About-Foundation-Sessions-MS-Store-and-Travel-Tips/RSS</wfw:commentRss>
			<category>Countdown</category>
	</item>
	<item>
			<title>Windows 8 Tip 3: Using Windows File Explorer | Windows 8 Tips</title>
			<description><![CDATA[<p>You may know File Explorer by it's previous name, Windows Explorer. Along with the new name are some in features. In this tip I'll walk you through some of the newer features as well as common functions that will help you increase productivity when working with the files on your Windows PC.</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Entry:RSSView:139d54ec520a42c98cfea0b4014abc0b">]]></description>
			<comments>http://channel9.msdn.com/Series/Windows-8-Tips/Windows-8-Tip-3-Using-Windows-File-Explorer</comments>
			<itunes:summary>You may know File Explorer by it&#39;s previous name, Windows Explorer. Along with the new name are some in features. In this tip I&#39;ll walk you through some of the newer features as well as common functions that will help you increase productivity when working with the files on your Windows PC. </itunes:summary>
			<itunes:duration>241</itunes:duration>
			<link>http://channel9.msdn.com/Series/Windows-8-Tips/Windows-8-Tip-3-Using-Windows-File-Explorer</link>
			<pubDate>Wed, 15 May 2013 22:54:06 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/Series/Windows-8-Tips/Windows-8-Tip-3-Using-Windows-File-Explorer</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/09ef/6c7f525f-acff-4028-a6b9-af301ca209ef/Win8TipsFileExplorer_100.jpg" height="56" width="100"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/09ef/6c7f525f-acff-4028-a6b9-af301ca209ef/Win8TipsFileExplorer_220.jpg" height="123" width="220"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/09ef/6c7f525f-acff-4028-a6b9-af301ca209ef/Win8TipsFileExplorer_512.jpg" height="288" width="512"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/09ef/6c7f525f-acff-4028-a6b9-af301ca209ef/Win8TipsFileExplorer_960.jpg" height="540" width="960"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/09ef/6c7f525f-acff-4028-a6b9-af301ca209ef/Win8TipsFileExplorer.mp3" expression="full" duration="241" fileSize="3870043" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/09ef/6c7f525f-acff-4028-a6b9-af301ca209ef/Win8TipsFileExplorer.mp4" expression="full" duration="241" fileSize="24140238" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/09ef/6c7f525f-acff-4028-a6b9-af301ca209ef/Win8TipsFileExplorer.webm" expression="full" duration="241" fileSize="8579139" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/09ef/6c7f525f-acff-4028-a6b9-af301ca209ef/Win8TipsFileExplorer.wma" expression="full" duration="241" fileSize="1960635" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/09ef/6c7f525f-acff-4028-a6b9-af301ca209ef/Win8TipsFileExplorer.wmv" expression="full" duration="241" fileSize="9950915" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/09ef/6c7f525f-acff-4028-a6b9-af301ca209ef/Win8TipsFileExplorer_high.mp4" expression="full" duration="241" fileSize="53359620" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/09ef/6c7f525f-acff-4028-a6b9-af301ca209ef/Win8TipsFileExplorer_mid.mp4" expression="full" duration="241" fileSize="37185164" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/09ef/6c7f525f-acff-4028-a6b9-af301ca209ef/Win8TipsFileExplorer_Source.wmv" expression="full" duration="241" fileSize="20701220" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://smooth.ch9.ms/ch9/09ef/6c7f525f-acff-4028-a6b9-af301ca209ef/Win8TipsFileExplorer.ism/manifest" expression="full" duration="241" fileSize="6116" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/09ef/6c7f525f-acff-4028-a6b9-af301ca209ef/Win8TipsFileExplorer.wmv" length="9950915" type="video/x-ms-wmv"></enclosure>
			<dc:creator>Larry Larsen</dc:creator>
			<itunes:author>Larry Larsen</itunes:author>
			<slash:comments>10</slash:comments>
			<wfw:commentRss>http://channel9.msdn.com/Series/Windows-8-Tips/Windows-8-Tip-3-Using-Windows-File-Explorer/RSS</wfw:commentRss>
			<category>Tips tricks</category>
			<category>Windows 8</category>
	</item>
	<item>
			<title>Defrag: .hlp files on Win8, Cutting PC Power, Moving PageFile | The Defrag Show</title>
			<description><![CDATA[<p>Microsoft tech troubleshooter extraordinaire Gov Maharaj and I help walk you through troubleshooting solutions to your tech support problems. If you have a problem you want to send us, you can use the Problem Step Recorder in Windows 7 (<a href="http://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-003-Win7-Shutdown-Slowdowns-Prob-Step-Recorder-MSI-Failures#time=">see this</a>&nbsp;for details on how) and send us the zip file to&nbsp;<a>DefragShow@microsoft.com</a>. We will also be checking comments for problems, but the email address will let us contact you if needed.<br><br><a href="http://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-hlp-files-on-Win8-Cutting-PC-Power-Moving-PageFile#time=01m17s">[01:17]</a> - Network card getting a red X.&nbsp;<br><a href="http://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-hlp-files-on-Win8-Cutting-PC-Power-Moving-PageFile#time=04m22s">[04:22]</a> - Can't read .hlp files on Windows 7. [<a href="http://support.microsoft.com/kb/917607">link</a>]<br><a href="http://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-hlp-files-on-Win8-Cutting-PC-Power-Moving-PageFile#time=05m26s">[05:26]</a> - What actually goes on with automatic maintenance. [<a href="http://msdn.microsoft.com/en-us/library/windows/desktop/hh848037(v=vs.85).aspx">link</a>]<br><a href="http://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-hlp-files-on-Win8-Cutting-PC-Power-Moving-PageFile#time=08m08s">[08:08]</a> - Is it a good idea to move pagefile to another drive.&nbsp;<br><a href="http://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-hlp-files-on-Win8-Cutting-PC-Power-Moving-PageFile#time=09m20s">[09:20]</a> - Perils of just cutting power to turn off a PC.&nbsp;<br><a href="http://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-hlp-files-on-Win8-Cutting-PC-Power-Moving-PageFile#time=14m22s">[14:22]</a> - Admin account not acting as an admin account.&nbsp;<br><a href="http://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-hlp-files-on-Win8-Cutting-PC-Power-Moving-PageFile#time=18m07s">[18:07]</a> - Using higher res icons for folders. &nbsp;<br><a href="http://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-hlp-files-on-Win8-Cutting-PC-Power-Moving-PageFile#time=21m27s">[21:27]</a> - Thumbnails in a directory are not filling in.&nbsp;<br><a href="http://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-hlp-files-on-Win8-Cutting-PC-Power-Moving-PageFile#time=00m00s">[00:00]</a> - Pick of the Week: NettleBox virtual holography. [<a href="http://nttl.ru/en/nettlebox/">link</a>]<br><br></p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Entry:RSSView:6b0acc3eedbc4d7db74da1b9010f26b1">]]></description>
			<comments>http://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-hlp-files-on-Win8-Cutting-PC-Power-Moving-PageFile</comments>
			<itunes:summary>Microsoft tech troubleshooter extraordinaire Gov Maharaj and I help walk you through troubleshooting solutions to your tech support problems. If you have a problem you want to send us, you can use the Problem Step Recorder in Windows 7 (see this&amp;nbsp;for details on how) and send us the zip file to&amp;nbsp;DefragShow@microsoft.com. We will also be checking comments for problems, but the email address will let us contact you if needed.[01:17] - Network card getting a red X.&amp;nbsp;[04:22] - Can&#39;t read .hlp files on Windows 7. [link][05:26] - What actually goes on with automatic maintenance. [link][08:08] - Is it a good idea to move pagefile to another drive.&amp;nbsp;[09:20] - Perils of just cutting power to turn off a PC.&amp;nbsp;[14:22] - Admin account not acting as an admin account.&amp;nbsp;[18:07] - Using higher res icons for folders. &amp;nbsp;[21:27] - Thumbnails in a directory are not filling in.&amp;nbsp;[00:00] - Pick of the Week: NettleBox virtual holography. [link] </itunes:summary>
			<itunes:duration>1670</itunes:duration>
			<link>http://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-hlp-files-on-Win8-Cutting-PC-Power-Moving-PageFile</link>
			<pubDate>Wed, 15 May 2013 18:50:19 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-hlp-files-on-Win8-Cutting-PC-Power-Moving-PageFile</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/9bf0/9ef90dee-e262-4553-bb47-ca5cfde39bf0/20130515Defrag_100.jpg" height="56" width="100"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/9bf0/9ef90dee-e262-4553-bb47-ca5cfde39bf0/20130515Defrag_220.jpg" height="123" width="220"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/9bf0/9ef90dee-e262-4553-bb47-ca5cfde39bf0/20130515Defrag_512.jpg" height="288" width="512"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/9bf0/9ef90dee-e262-4553-bb47-ca5cfde39bf0/20130515Defrag_960.jpg" height="540" width="960"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/9bf0/9ef90dee-e262-4553-bb47-ca5cfde39bf0/20130515Defrag.mp3" expression="full" duration="1670" fileSize="26736823" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/9bf0/9ef90dee-e262-4553-bb47-ca5cfde39bf0/20130515Defrag.mp4" expression="full" duration="1670" fileSize="161003118" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/9bf0/9ef90dee-e262-4553-bb47-ca5cfde39bf0/20130515Defrag.webm" expression="full" duration="1670" fileSize="95548869" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/9bf0/9ef90dee-e262-4553-bb47-ca5cfde39bf0/20130515Defrag.wma" expression="full" duration="1670" fileSize="13517023" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/9bf0/9ef90dee-e262-4553-bb47-ca5cfde39bf0/20130515Defrag.wmv" expression="full" duration="1670" fileSize="87737129" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/9bf0/9ef90dee-e262-4553-bb47-ca5cfde39bf0/20130515Defrag_high.mp4" expression="full" duration="1670" fileSize="352022503" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/9bf0/9ef90dee-e262-4553-bb47-ca5cfde39bf0/20130515Defrag_mid.mp4" expression="full" duration="1670" fileSize="246169394" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/9bf0/9ef90dee-e262-4553-bb47-ca5cfde39bf0/20130515Defrag_Source.wmv" expression="full" duration="1670" fileSize="341716576" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://smooth.ch9.ms/ch9/9bf0/9ef90dee-e262-4553-bb47-ca5cfde39bf0/20130515Defrag.ism/manifest" expression="full" duration="1670" fileSize="6056" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/9bf0/9ef90dee-e262-4553-bb47-ca5cfde39bf0/20130515Defrag.wmv" length="87737129" type="video/x-ms-wmv"></enclosure>
			<dc:creator>Larry Larsen, Rhymes With Orange</dc:creator>
			<itunes:author>Larry Larsen, Rhymes With Orange</itunes:author>
			<slash:comments>1</slash:comments>
			<wfw:commentRss>http://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-hlp-files-on-Win8-Cutting-PC-Power-Moving-PageFile/RSS</wfw:commentRss>
			<category>Tech Support</category>
	</item>
	<item>
			<title>Ping 177: Female CFO, Barnes &amp; Noble, Facebook App, Working at Microsoft | Ping!</title>
			<description><![CDATA[<p>The fun never stops and the news just keeps coming. Laura &amp; Paul stay on top of all of it...for you:</p><p><a href="http://www.siliconindia.com/news/enterpriseit/Microsoft-Appoints-First-Female-CFO-nid-146766-cid-7.html">Microsoft appoints first female CFO</a>&nbsp; <a href="http://channel9.msdn.com/Shows/PingShow/Ping-177-Female-CFO-Barnes--Noble-Facebook-App-Working-at-Microsoft#time=08m19s">[08:19]</a></p><p><a href="http://www.bizjournals.com/portland/morning_call/2013/05/microsoft-buying-nook-for-1b.html">Microsoft and Barnes &amp; Noble</a>&nbsp; <a href="http://channel9.msdn.com/Shows/PingShow/Ping-177-Female-CFO-Barnes--Noble-Facebook-App-Working-at-Microsoft#time=10m05s">[10:05]</a></p><p><a href="http://www.pcworld.com/article/2038192/facebook-to-microsoft-dump-fake-facebook-apps-from-windows-phone-store.html">Official Facebook App</a>&nbsp; <a href="http://channel9.msdn.com/Shows/PingShow/Ping-177-Female-CFO-Barnes--Noble-Facebook-App-Working-at-Microsoft#time=03m20s">[03:20]</a></p><p><a href="http://www.businessweek.com/articles/2013-05-09/business-students-pick-microsoft-over-facebook">I want to work at Microsoft!</a> &nbsp; <a href="http://channel9.msdn.com/Shows/PingShow/Ping-177-Female-CFO-Barnes--Noble-Facebook-App-Working-at-Microsoft#time=12m39s">[12:39]</a></p><p>&nbsp;</p><p>Don't forget to chime in and answer the question of the week!</p><p>&nbsp;</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Entry:RSSView:69120c86f5274c1fa4f5a1be010111c1">]]></description>
			<comments>http://channel9.msdn.com/Shows/PingShow/Ping-177-Female-CFO-Barnes--Noble-Facebook-App-Working-at-Microsoft</comments>
			<itunes:summary>The fun never stops and the news just keeps coming. Laura &amp;amp; Paul stay on top of all of it...for you: Microsoft appoints first female CFO&amp;nbsp; [08:19] Microsoft and Barnes &amp;amp; Noble&amp;nbsp; [10:05] Official Facebook App&amp;nbsp; [03:20] I want to work at Microsoft! &amp;nbsp; [12:39] &amp;nbsp; Don&#39;t forget to chime in and answer the question of the week! &amp;nbsp; </itunes:summary>
			<itunes:duration>1044</itunes:duration>
			<link>http://channel9.msdn.com/Shows/PingShow/Ping-177-Female-CFO-Barnes--Noble-Facebook-App-Working-at-Microsoft</link>
			<pubDate>Tue, 14 May 2013 21:37:01 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/Shows/PingShow/Ping-177-Female-CFO-Barnes--Noble-Facebook-App-Working-at-Microsoft</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/173f/62c7e8ea-7050-4f2e-be0e-6076ae19173f/Ping177_100.jpg" height="56" width="100"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/173f/62c7e8ea-7050-4f2e-be0e-6076ae19173f/Ping177_220.jpg" height="123" width="220"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/173f/62c7e8ea-7050-4f2e-be0e-6076ae19173f/Ping177_512.jpg" height="288" width="512"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/173f/62c7e8ea-7050-4f2e-be0e-6076ae19173f/Ping177_960.jpg" height="540" width="960"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/173f/62c7e8ea-7050-4f2e-be0e-6076ae19173f/Ping177.mp3" expression="full" duration="1044" fileSize="16707465" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/173f/62c7e8ea-7050-4f2e-be0e-6076ae19173f/Ping177.mp4" expression="full" duration="1044" fileSize="100795028" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/173f/62c7e8ea-7050-4f2e-be0e-6076ae19173f/Ping177.webm" expression="full" duration="1044" fileSize="99815795" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/173f/62c7e8ea-7050-4f2e-be0e-6076ae19173f/Ping177.wma" expression="full" duration="1044" fileSize="8449275" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/173f/62c7e8ea-7050-4f2e-be0e-6076ae19173f/Ping177.wmv" expression="full" duration="1044" fileSize="102368591" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/173f/62c7e8ea-7050-4f2e-be0e-6076ae19173f/Ping177_high.mp4" expression="full" duration="1044" fileSize="220917102" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/173f/62c7e8ea-7050-4f2e-be0e-6076ae19173f/Ping177_mid.mp4" expression="full" duration="1044" fileSize="154476502" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/173f/62c7e8ea-7050-4f2e-be0e-6076ae19173f/Ping177_Source.wmv" expression="full" duration="1044" fileSize="392803058" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://smooth.ch9.ms/ch9/173f/62c7e8ea-7050-4f2e-be0e-6076ae19173f/Ping177.ism/manifest" expression="full" duration="1044" fileSize="8350" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/173f/62c7e8ea-7050-4f2e-be0e-6076ae19173f/Ping177.wmv" length="102368591" type="video/x-ms-wmv"></enclosure>
			<dc:creator>Laura Foy</dc:creator>
			<itunes:author>Laura Foy</itunes:author>
			<slash:comments>7</slash:comments>
			<wfw:commentRss>http://channel9.msdn.com/Shows/PingShow/Ping-177-Female-CFO-Barnes--Noble-Facebook-App-Working-at-Microsoft/RSS</wfw:commentRss>
			<category>Facebook</category>
			<category>Life at Microsoft</category>
			<category>PingShow</category>
			<category>Apps</category>
			<category>jobs</category>
			<category>careers</category>
	</item>
	<item>
			<title>Trigonometry for Designers (Don&#39;t Panic!) | Creative Coding with Processing.js for Windows 8 JavaScript applications</title>
			<description><![CDATA[<p><a href="http://media.ch9.ms/coding4fun/processingjs/trig.html">See trig sketch in action</a></p><p>Trigonometry is the secret weapon of many top creative coders. Unfortunately for many designers, though, it was never taught in a visual or interactive way. We try and fix that with this whirlwind tour of the key concepts of SIN and COS and how we can use them to generate circles, spirals and patterns. We also introduce more advanced rendering concepts by introducing&nbsp;pushMatrix() and popMatrix() for handling rotation and scale of our visual elements. We finish off the lesson with an sketch that explores the Golden Ratio.</p><p>To follow along in Visual Studio, please <a href="https://processingjs.codeplex.com/releases/view/106003">download the Processing Sketchbook projection.</a></p><p>The finished sketch for this lesson can be found below:</p><p><pre class="brush: js">
float ToRadians = PI / 180.0;
float gAngle = 137.5077640844293;
float rotation = 0.0;
float initialRotation = 0.0;
int width, height;
int totalPetals = 300;
Petal[] petals = new Petal[totalPetals];
float radiusGrowth = 1.0049;
float radius = 60;
 
void setup() {
    width = 500;
    height = 550;
    size(width, height);
    noStroke();
    smooth();
    background(0);
    for (int i = 0; i &lt; totalPetals; i&#43;&#43;) {
        rotation &#43;= gAngle;
        radius *= radiusGrowth;
        Petal petal = new Petal();
        petal.x = width / 2 &#43; cos(rotation * ToRadians) * radius;
        petal.y = height / 2 &#43; sin(rotation * ToRadians) * radius;
        petal.rotation = rotation * ToRadians;
        petal.scale &#43;= (i * 2) / totalPetals;
        petal.render();
        petals[i] = petal;
    }
};
 
class Petal {
  float x = 0.0;
  float y = 0.0;
  float rotation = 0.0;
  float scaleVar = 1;
  color baseColor = color(0, 255, 255, 150);   
  color detailColor = color(255, 255, 255, 160);
  color trimColor = color(0, 0, 0);
  void render (){
      pushMatrix();
      translate(this.x, this.y);
      fill(this.baseColor);
      rotate(this.rotation);
      scale(this.scaleVar, this.scaleVar);
      rect(-10, -1, 20, 2);
      ellipse(0, 0, 10, 10);
      fill(this.detailColor);
      ellipse(0, 0, 8, 8);
      fill(this.trimColor);
      ellipse(0, 0, 5, 5);
      popMatrix();
  }
}
</pre></p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Entry:RSSView:04ca89aa95ec450b9ff2a157012a722f">]]></description>
			<comments>http://channel9.msdn.com/Series/Sketchbooktutorial/Trigonometry-for-Designers-Dont-Panic</comments>
			<itunes:summary>See trig sketch in action Trigonometry is the secret weapon of many top creative coders. Unfortunately for many designers, though, it was never taught in a visual or interactive way. We try and fix that with this whirlwind tour of the key concepts of SIN and COS and how we can use them to generate circles, spirals and patterns. We also introduce more advanced rendering concepts by introducing&amp;nbsp;pushMatrix() and popMatrix() for handling rotation and scale of our visual elements. We finish off the lesson with an sketch that explores the Golden Ratio. To follow along in Visual Studio, please download the Processing Sketchbook projection. The finished sketch for this lesson can be found below: 
float ToRadians = PI / 180.0;
float gAngle = 137.5077640844293;
float rotation = 0.0;
float initialRotation = 0.0;
int width, height;
int totalPetals = 300;
Petal[] petals = new Petal[totalPetals];
float radiusGrowth = 1.0049;
float radius = 60;
 
void setup() {
    width = 500;
    height = 550;
    size(width, height);
    noStroke();
    smooth();
    background(0);
    for (int i = 0; i &amp;lt; totalPetals; i&amp;#43;&amp;#43;) {
        rotation &amp;#43;= gAngle;
        radius *= radiusGrowth;
        Petal petal = new Petal();
        petal.x = width / 2 &amp;#43; cos(rotation * ToRadians) * radius;
        petal.y = height / 2 &amp;#43; sin(rotation * ToRadians) * radius;
        petal.rotation = rotation * ToRadians;
        petal.scale &amp;#43;= (i * 2) / totalPetals;
        petal.render();
        petals[i] = petal;
    }
};
 
class Petal {
  float x = 0.0;
  float y = 0.0;
  float rotation = 0.0;
  float scaleVar = 1;
  color baseColor = color(0, 255, 255, 150);   
  color detailColor = color(255, 255, 255, 160);
  color trimColor = color(0, 0, 0);
  void render (){
      pushMatrix();
      translate(this.x, this.y);
      fill(this.baseColor);
      rotate(this.rotation);
      scale(this.scaleVar, this.scaleVar);
      rect(-10, -1, 20, 2);</itunes:summary>
			<itunes:duration>3041</itunes:duration>
			<link>http://channel9.msdn.com/Series/Sketchbooktutorial/Trigonometry-for-Designers-Dont-Panic</link>
			<pubDate>Mon, 22 Apr 2013 21:16:10 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/Series/Sketchbooktutorial/Trigonometry-for-Designers-Dont-Panic</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/54f5/2b0dec35-cb82-452e-9f16-e5c0c00554f5/SketchbookTutorial5_100.jpg" height="56" width="100"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/54f5/2b0dec35-cb82-452e-9f16-e5c0c00554f5/SketchbookTutorial5_220.jpg" height="123" width="220"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/54f5/2b0dec35-cb82-452e-9f16-e5c0c00554f5/SketchbookTutorial5_512.jpg" height="288" width="512"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/54f5/2b0dec35-cb82-452e-9f16-e5c0c00554f5/SketchbookTutorial5.mp3" expression="full" duration="3041" fileSize="48665474" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/54f5/2b0dec35-cb82-452e-9f16-e5c0c00554f5/SketchbookTutorial5.mp4" expression="full" duration="3041" fileSize="273612039" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/54f5/2b0dec35-cb82-452e-9f16-e5c0c00554f5/SketchbookTutorial5.webm" expression="full" duration="3041" fileSize="93664326" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/54f5/2b0dec35-cb82-452e-9f16-e5c0c00554f5/SketchbookTutorial5.wma" expression="full" duration="3041" fileSize="24598779" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/54f5/2b0dec35-cb82-452e-9f16-e5c0c00554f5/SketchbookTutorial5.wmv" expression="full" duration="3041" fileSize="169616555" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/54f5/2b0dec35-cb82-452e-9f16-e5c0c00554f5/SketchbookTutorial5_high.mp4" expression="full" duration="3041" fileSize="626361747" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/54f5/2b0dec35-cb82-452e-9f16-e5c0c00554f5/SketchbookTutorial5_mid.mp4" expression="full" duration="3041" fileSize="435613785" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/54f5/2b0dec35-cb82-452e-9f16-e5c0c00554f5/SketchbookTutorial5_Source.wmv" expression="full" duration="3041" fileSize="363073259" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://smooth.ch9.ms/ch9/54f5/2b0dec35-cb82-452e-9f16-e5c0c00554f5/SketchbookTutorial5.ism/manifest" expression="full" duration="3041" fileSize="6106" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/54f5/2b0dec35-cb82-452e-9f16-e5c0c00554f5/SketchbookTutorial5.wmv" length="169616555" type="video/x-ms-wmv"></enclosure>
			<dc:creator>Rick Barraza</dc:creator>
			<itunes:author>Rick Barraza</itunes:author>
			<slash:comments>7</slash:comments>
			<wfw:commentRss>http://channel9.msdn.com/Series/Sketchbooktutorial/Trigonometry-for-Designers-Dont-Panic/RSS</wfw:commentRss>
	</item>
	<item>
			<title>MissionControl - A Flexible API for Remote Device Control</title>
			<description><![CDATA[<p>In a race to optimize everything, developers often go to extremes to build software that performs routine tasks. MissionControl is a system that allows users to program a control center that stores interfaces with attached hardware sensors, allowing the users to control any other devices that can be activated via the underlying protocol. For demo purposes, the MissionControl build at this point is compatible with the Phidgets IR hybrid sensor.</p><p>The system has two core components:</p><ul><li>A server application, which is a Win32 console application that handles incoming queries and returns data to the connected clients. This application runs on the desktop machine with the connected sensor. </li><li>The Windows Phone application that sends requests to the target server and can trigger a variety of pre-programmed commands. </li></ul><h1>The Basics</h1><h3>Hardware and Communication Infrastructure</h3><p>One of the most important parts of the project is the signal capture and replication hardware. For the purposes of this project, I decided to use a dual-mode <a href="http://www.phidgets.com/products.php?product_id=1055_0">Phidgets IR sensor</a>. It supports both IR code capture and subsequent replication. From a user’s perspective, this device also eliminates a substantial code-learning overhead as well as the potential error rate. Instead of searching for a device-specific hexadecimal sequence that later has to be transformed in a working IR code, the user simply has to point his remote control at the sensor and press the button that he wants accessible from a mobile device. Given that the capturing software is running on the target machine, once the sensor detects that a code can be repeated within an acceptable precision range, it will be automatically captured and stored, with all required transformations worked out in the backend using the free Phidgets SDK.</p><h3><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/clip_image0026.jpg"><img title="clip_image002" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/clip_image002_thumb3.jpg" alt="clip_image002" width="368" height="246" border="0"></a></h3><p>Even though I can, I don’t have to handle the binary code content received through the sensor—the Phidgets .NET libraries carry built-in types that contain all the processed metadata that I will discuss later in this article.</p><p>This sensor is connected through a USB port to a machine that acts as a communication gateway. This server should have port 6169 open for inbound connections.</p><p><strong>NOTE:</strong> <em>The port number can be changed, but you have to keep it consistent between your server and client applications.</em></p><p>The communication between the phone and the computer running the client is performed via a TCP channel—<a href="http://en.wikipedia.org/wiki/Internet_socket">sockets</a> are used to perform the initial connections and serialized data transfer. You can see the generalized data flow between the devices that are involved in the procedure in the graphic below:</p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/clip_image0046.jpg"><img title="clip_image004" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/clip_image004_thumb3.jpg" alt="clip_image004" width="520" height="289" border="0"></a></p><p>The server (desktop client) handles the local storage and release of all incoming IR codes. The mobile client has to know the location of the server—once specified and confirmed, it can send one of the pre-defined commands to it and either query the server for existing command groups (sets) or invoke one of the stored IR codes. When I pass data between devices, I use JSON for the serializable components. The data is also processed before being sent in order to speed-up the process—for example, on the server side the sets are serialized together with the associated codes. Like this:</p><p><pre class="brush: js">
[
{
    &quot;Name&quot;:&quot;batman&quot;,
    &quot;IsList&quot;:false,
    &quot;Commands&quot;:[
    {
        &quot;Name&quot;:&quot;test command&quot;,
        &quot;Code&quot;:{
            &quot;Mask&quot;:{
                &quot;BitSize&quot;:12,
                &quot;CodeData&quot;:&quot;AAA=&quot;
            },
            &quot;BitSize&quot;:12,
            &quot;Encoding&quot;:2,
            &quot;CarrierFrequency&quot;:38000,
            &quot;DutyCycle&quot;:50,
            &quot;Gap&quot;:44761,
            &quot;Header&quot;:[
            2374,
            606
            ],
            &quot;CodeData&quot;:&quot;DJA=&quot;,
            &quot;MinRepeat&quot;:5,
            &quot;One&quot;:[
            1189,
            606
            ],
            &quot;Repeat&quot;:null,
            &quot;Trail&quot;:0,
            &quot;Zero&quot;:[
            582,
            606
            ]
        }
    },
    {
        &quot;Name&quot;:&quot;turn off&quot;,
        &quot;Code&quot;:{
            &quot;Mask&quot;:{
                &quot;BitSize&quot;:12,
                &quot;CodeData&quot;:&quot;AAA=&quot;
            },
            &quot;BitSize&quot;:12,
            &quot;Encoding&quot;:2,
            &quot;CarrierFrequency&quot;:38000,
            &quot;DutyCycle&quot;:50,
            &quot;Gap&quot;:44770,
            &quot;Header&quot;:[
            2360,
            613
            ],
            &quot;CodeData&quot;:&quot;DJA=&quot;,
            &quot;MinRepeat&quot;:5,
            &quot;One&quot;:[
            1169,
            613
            ],
            &quot;Repeat&quot;:null,
            &quot;Trail&quot;:0,
            &quot;Zero&quot;:[
            585,
            613
            ]
        }
    }
    ]
}
]
</pre></p><p>The inherent problem with the JSON data above is the fact that the phone client does not need the information related to the code binary sequence and all the metadata that goes with it. So it is effectively stripped down and reduced to the names of the sets (when a list of sets is requested) and commands (when a list of commands is requested).</p><h3>The Data Model</h3><p>As you saw from the description above, the server organizes individual infrared codes in sets. A single set is a bundle of codes that may or may not be related to each other—ultimately, this is the user’s decision. A good example of using sets is organizing IR commands by rooms, devices or code types. Each set has a unique name on the server, therefore eliminating the possibility of a request conflict.</p><p>Each set stores individual commands built around the <strong>Command</strong> model:</p><p><pre class="brush: csharp">
namespace Coding4Fun.MissionControl.API.Models 
{ 
    public class Command 
    { 
        public Command() 
        { 
        } 
    
    public string Name { get; set; }     
    public SerializableIRCode Code { get; set; } 
    } 
}
</pre></p><p>Despite the obvious <strong>Name</strong> property, you can see that I am using a <strong>SerializableIRCode</strong> instance that is specific to each model. Before going any further, I need to mention that the Phidgets SDK offers the <strong>IRLearnedCode</strong> model to store code contents. I could have used it instead, but there is an issue that prevents me from doing that—there is no public constructor defined for <strong>IRLearnedCode</strong>, therefore there is no way to serialize it, either with the built-in .NET serialization capabilities or JSON.NET, which I am using in the context of the project.</p><p>Instead, I have this:</p><p><pre class="brush: csharp">
using Phidgets; 
namespace Coding4Fun.MissionControl.API.Models 
{     
    public class SerializableIRCode     
    {         
        public SerializableIRCode()         
        { 
            
        } 
        
    IRLearnedCode code;         
    public ToggleMask Mask { get; set; } 
    public int BitSize { get; set; } 
    public Phidgets.IRCodeInfo.IREncoding Encoding { get; set; } 
    public int CarrierFrequency { get; set; } 
    public int DutyCycle { get; set; } 
    public int Gap { get; set; } 
    public int[] Header { get; set; } 
    public byte[] CodeData { get; set; } 
    public int MinRepeat { get; set; } 
    public int[] One { get; set; } 
    public int[] Repeat { get; set; } 
    public int Trail { get; set; } 
    public int[] Zero { get; set; } 
    }     
}
</pre></p><p>It is an almost identical 1:1 copy of the original class, storing both the layout of the IR code and additional information related to its replication mechanism. You can learn more about each property listed in the model above by reading the <a href="http://www.phidgets.com/docs/IR_Remote_Control_Primer">official document on the topic</a>.</p><p><strong>ToggleMask</strong>, the identity bit carrier that helps marking the code as repeated or not, is also implemented through a built-in Phidgets SDK model, and it has the same problem as <strong>IRLearnedCode</strong>. I implemented this model to replace it in the serializable code:</p><p><pre class="brush: csharp">
namespace Coding4Fun.MissionControl.API.Models 
{ 
    public class ToggleMask 
    { 
        public ToggleMask() 
        { 
            
        } 

    public int BitSize { get; set; }         
    public byte[] CodeData { get; set; } 
    } 
}
</pre></p><p>I also needed an easy way to store all sets at once and carry all associated codes in a single instance retrieved from the storage. Here is the <strong>Set</strong> class:</p><p><pre class="brush: csharp">
namespace Coding4Fun.MissionControl.API.Models 
{     
    public class Set 
    { 
        public Set() 
        { 
            Commands = new List&lt;Command&gt;(); 
        } 
        
    public string Name { get; set; } 
    public bool IsList { get; set; } 
    public List&lt;Command&gt; Commands { get; set; } 
    } 
}
</pre></p><p>Notice that there is an <strong>IsList</strong> flag that allows me to specify how to display this specific list on the connecting device. This adds some level of flexibility for situations where the user wants to build a virtual remote for closely-related keys, such as digits. With that in mind, displaying those as a list might be inconvenient, wasting visual space on the client. But if the flag is set to false, the list can be displayed as a pad.</p><p>Also, when the server performs the data exchange, it provides a single “envelope” that allows the connecting device to easily understand what the server is trying to do:</p><p><pre class="brush: csharp">
namespace Coding4Fun.MissionControl.API.Models 
{     
    public class ServerResponse     
    {     
    public string Identifier { get; set; }     
    public string Marker { get; set; }     
    public string Content { get; set; }     
    } 
}
</pre></p><p>The <strong>Identifier</strong> property carries the server IP address. That way, when a device receives a response, it is able to either accept it, because it knows that a response is requested from a target location, or discard it because the user is no longer using the specific server.</p><p><strong>Marker</strong> carries the command type of the sent command, therefore giving the Windows Phone application a hint as to what to do with the data. The server can send the following commands:</p><ul><li><em>SET_LIST</em> – returns the list of sets that are currently available on the server. </li><li><em>SET_COMMANDS<strong>:</strong>SET_NAME<strong>:</strong>IS_LIST</em> – returns the list of commands that are associated with a given set that is currently stored on the server. </li><li><em>NOTIFICATION</em> – send a simple notification to the client; no further action is required. </li></ul><p>Last but not least, <strong>Content</strong> is used to push the necessary data that is associated with the given <strong>Marker</strong>. It can be either a JSON-based string that lists the sets or commands, or a plain-text message that is used as an alert for the end-user.</p><h1>Server Architecture</h1><p>The server is the only component of this entire system that does all the heavy lifting. It learns commands, stores them and then generates new IR signal requests, as controlled from any of the connected clients. Let’s take a closer look at what happens behind the scenes—to start, I am going to document the network infrastructure.</p><h3>The Network Layer</h3><p>In order to be a reliable system, the server needs to be always ready to accept an incoming connection. For that purpose, it is possible to use the <a href="http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.aspx">TcpListener</a> class—an “always on” receiver that can handle incoming TCP connections. I integrated it in my <strong>CoreStarter</strong> class that is used to start the listener when the application is launched:</p><p><pre class="brush: csharp">
namespace Coding4Fun.MissionControl.API 
{ 
    public class CoreStarter 
    { 
        static TcpListener listener; 
        
        public static void LaunchSocket()     
        {     
            Console.WriteLine(&quot;Starting socket server on port {0}...&quot;, Constants.DEFAULT_PORT); 
            listener = new TcpListener(NetworkHelper.GetLocalIPAddress(), Constants.DEFAULT_PORT); 
            listener.Start(); 
            
            for (int i = 0; i &lt; Constants.MAX_CONCURRENT_CLIENTS; i&#43;&#43;) 
            {     
                Thread socketThread = new Thread(new ThreadStart(ListenForData));     
                socketThread.Start(); 
            } 
        } 
        
        private static void ListenForData() 
        { 
            Console.WriteLine(&quot;Listener thread started.&quot;); 

            while (true) 
            { 
                Socket acceptedSocket = listener.AcceptSocket(); 
                using (MemoryStream coreStream = new MemoryStream()) 
                {     
                    try 
                    { 
                        Console.WriteLine(&quot;Incoming connection: {0}&quot;, acceptedSocket.RemoteEndPoint); 
                        
                        using (Stream sourceStream = new NetworkStream(acceptedSocket)) 
                        {     
                            sourceStream.ReadTimeout = Constants.SOCKET_READ_TIMEOUT; 
                            
                            byte[] buffer = new byte[Constants.DEFAULT_BUFFER_SIZE]; 
                            int i; 
                
                            while ((i = sourceStream.Read(buffer, 0, buffer.Length)) != 0) 
                            { 
                                coreStream.Write(buffer, 0, i); 
                            } 
                        } 
                    } 
                    catch 
                    { 
                        string data = Encoding.ASCII.GetString(coreStream.ToArray()); 
        
                        CommandHelper.InterpretCommand(data, acceptedSocket.RemoteEndPoint.ToString()); 
                    } 
                } 
            } 
        } 
    } 
}
</pre></p><p>When <strong>LaunchSocket</strong> is called, the listener is activated on the current machine. As I mentioned above, the port number can be arbitrarily assigned, but has to be consistent between connecting apps in order for the TCP links to be established. Because I expect that more than one device will be connecting to the service at a time, the listener is set as active across a constant number of threads.</p><p><strong>NOTE:</strong> By default, a there is a maximum limit of 5 simultaneous clients. Although this number can be adjusted, be aware of the requirements of each environment in which a limited number of potential devices can connect. Even though the performance footprint of each thread is minimal, it can have a negative effect if used in unnecessarily large instances.</p><p><strong>ListenForData</strong> is used to read the incoming stream. When an inbound connection is accepted, the data is read with the help of a fixed content buffer. Then a read timeout is specified to prevent situations where the stream was completely read but the application still waits to pull non-existent data. Once the timeout milestone is hit, an exception is thrown, which marks the end of the stream—at this point, the plain text data that was received (remember that both the server and client exchange text data only) is passed to the command interpreter—<strong>CommandHelper</strong>, with a reference to the source of the command.</p><p>The commands from the device are passed as serialized key-value pairs (<a href="http://msdn.microsoft.com/en-us/library/5tbh8a42.aspx">KeyValuePair&lt;T, T&gt;</a>), the key being the command with any possible suffixes, and the value being the contents of the command itself that helps the server identify the specific item in the local storage.</p><p><strong>InterpretCommand</strong>,in this case, does three things sequentially:</p><ol><li>Deserialize the incoming string and create a <strong>KeyValuePair&lt;string,string&gt;</strong> instance. </li><li>Process the command and check whether it is recognizable. </li><li>Send a response to the client, if deemed necessary by the command type. </li></ol><p>The serialization and deserialization is done via <a href="http://james.newtonking.com/projects/json-net.aspx">JSON.NET</a>. You can install this package in your console managed Win32 project and the Windows Phone application project via NuGet:</p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/clip_image0056.gif"><img title="clip_image005" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/clip_image005_thumb3.gif" alt="clip_image005" width="553" height="65" border="0"></a></p><p>The deserialization step is as simple as one line of C# code:</p><p><pre class="brush: csharp">
KeyValuePair&lt;string, string&gt; result = JsonConvert.DeserializeObject&lt;KeyValuePair&lt;string, string&gt;&gt;(rawCommand.Remove(0, rawCommand.IndexOf('{')));
</pre></p><p>The string is sanitized to ensure that only JSON content is being passed to the serializer.</p><p>Because of a relatively limited command set, I can put together the entire interpretation stack like this:</p><p><pre class="brush: csharp">
// Get the initial list of sets on the target server
if (result.Key == Constants.COMMAND_INIT)
{
    SendSets(sourceLocation);
}
// Create a new set on the target server
else if (result.Key.Contains(Constants.COMMAND_CREATE_SET))
{
    CreateSet(result, sourceLocation);
    SendSets(sourceLocation);
}
// Get the commands that are associated with a given set.
else if (result.Key == Constants.COMMAND_GET_COMMANDS)
{
    SendCommands(result.Value, sourceLocation);
}
// The client requested the server to learn a new command.
else if (result.Key.Contains(Constants.COMMAND_LEARN_COMMAND))
{
    LearnCommand(result, sourceLocation);
}
// The client requested one of the commands to be executed on the 
// target server.
else if (result.Key.Contains(Constants.COMMAND_EXECUTE))
{
    ExecuteCommand(result);
}
// The client has requested a set to be deleted from the target server.
else if (result.Key == Constants.COMMAND_DELETE_SET)
{
    DeleteSet(result.Value);
    SendSets(sourceLocation);
}
// The client has requested a set to be deleted from the target server.
else if (result.Key.Contains(Constants.COMMAND_DELETE_COMMAND))
{
    DeleteCommand(result);
    SendCommands(result.Key.Split(new char[] { ':' })[1], sourceLocation);
}
</pre></p><p>All commands are constants, declared in the local helper class:</p><p><pre class="brush: csharp">
public const string COMMAND_INIT = &quot;INIT&quot;; 

public const string COMMAND_CREATE_SET = &quot;CREATE_SET&quot;; 

public const string COMMAND_GET_COMMANDS = &quot;GET_COMMANDS&quot;; 

public const string COMMAND_LEARN_COMMAND = &quot;LEARN_COMMAND&quot;; 

public const string COMMAND_EXECUTE = &quot;EXECUTE&quot;; 

public const string COMMAND_DELETE_SET = &quot;DELETE_SET&quot;;
public const string COMMAND_DELETE_COMMAND = &quot;DELETE_COMMAND&quot;;
</pre></p><p>Notice that these are not the commands that the server sends back, but rather the commands it receives from connecting Windows Phone devices.</p><p>Let’s now take a look at the breakdown for each command.</p><p><strong>SendSets:</strong></p><p><pre class="brush: csharp">
/// &lt;summary&gt; 
/// Send the list of sets to the client that requested those. 
/// &lt;/summary&gt; 
/// &lt;param name=&quot;sourceLocation&quot;&gt;The location of the requesting client.&lt;/param&gt; 
private static void SendSets(string sourceLocation) 
{ 
    Console.WriteLine(&quot;Received an initial set query from {0}&quot;, sourceLocation);     
    ServerResponse response = new ServerResponse(); 
    response.Marker = &quot;SET_LIST&quot;; 
    response.Content = JsonConvert.SerializeObject(StorageHelper.GetRawSetNames()); 
    response.Identifier = NetworkHelper.GetLocalIPAddress().ToString(); 
    NetworkHelper.SendData(sourceLocation, JsonConvert.SerializeObject(response)); 
    Console.WriteLine(&quot;Sent the set list to {0}&quot;, sourceLocation);     
}
</pre></p><p>When this command is received, the server does not have to do much processing. It is only invoked when the client establishes the initiating link and needs to know what possible sets it can get from the target machine. The request is logged in the console and a server response is prepared that contains a serialized list of set names, which is later serialized as well and sent back to the source machine location.</p><p><strong>StorageHelper</strong> and <strong>NetworkHelper</strong> will be documented later in this article.</p><p><strong>CreateSet:</strong></p><p><pre class="brush: csharp">
/// &lt;summary&gt; 
/// Create a new set and store it on the local server. 
/// &lt;/summary&gt; 
/// &lt;param name=&quot;result&quot;&gt;The original deserialized command.&lt;/param&gt; 
/// &lt;param name=&quot;sourceLocation&quot;&gt;The location of the requesting client.&lt;/param&gt; 
private static void CreateSet(KeyValuePair&lt;string,string&gt; result, string sourceLocation) 
{ 
    bool isSuccessful = false; 
    string[] data = result.Key.Split(new char[] { ':' }); 
    
    Console.WriteLine(&quot;There is an attempt to create the {0} set from {1}.&quot;, result.Value, sourceLocation); 
    
    if (data[1].ToLower() == &quot;list&quot;) 
        isSuccessful = StorageHelper.AddSet(result.Value); 
    else 
        isSuccessful = StorageHelper.AddSet(result.Value, false); 
    
    if (isSuccessful) 
        Console.WriteLine(&quot;The {0} set was successfully created.&quot;, result.Value); 
    else 
        Console.WriteLine(&quot;Something happened and the {0} set was not created.&quot;, result.Value);     
}
</pre></p><p>When a mobile device attempts to create a new set on the server, it sends a command in the following format:</p><p><strong>CREATE_SET</strong>:<strong>list/pad</strong>, <strong>SET_NAME</strong></p><p>CreateSet will get the type of the set that was created, will check whether a set with the same name already exists and will either create it or ignore the command altogether. No notification is sent to the connecting device, but either the failure or the success of the command is registered in the local console.</p><p><strong>SendCommands:</strong></p><p><pre class="brush: csharp">
/// &lt;summary&gt;
/// Send a list of commands that are associated with the pushed set.
/// &lt;/summary&gt;
/// &lt;param name=&quot;setName&quot;&gt;The original deserialized command.&lt;/param&gt;
/// &lt;param name=&quot;sourceLocation&quot;&gt;The location of the requesting client.&lt;/param&gt;
private static void SendCommands(string setName, string sourceLocation)
{
    Console.WriteLine(&quot;There was a request to get the commands for the {0} set from {1}.&quot;, setName, sourceLocation);
    
    bool isList = StorageHelper.IsSetAList(setName);
    
    ServerResponse response = new ServerResponse();
    response.Marker = string.Format(&quot;SET_COMMANDS:{0}:{1}&quot;, setName, isList);
    response.Identifier = NetworkHelper.GetLocalIPAddress().ToString();
    response.Content = JsonConvert.SerializeObject(StorageHelper.GetRawCommandNames(setName));
    
    NetworkHelper.SendData(sourceLocation, JsonConvert.SerializeObject(response));
    
    Console.WriteLine(&quot;Command list for the {0} set were sent to {1}.&quot;, setName, sourceLocation);
}
</pre></p><p>Commands are sent in the same manner as sets—once the set is recognized, the names of the associated commands are retrieved and serialized inside a <strong>ServerResponse</strong> instance and then pushed back to the requesting device.</p><p><strong>LearnCommand:</strong></p><p><pre class="brush: csharp">
/// &lt;summary&gt; 
/// Learn a new command and store it on the target server. 
/// &lt;/summary&gt; 
/// &lt;param name=&quot;result&quot;&gt;The original deserialized command.&lt;/param&gt; 
/// &lt;param name=&quot;sourceLocation&quot;&gt;The location of the requesting client.&lt;/param&gt; 
private static void LearnCommand(KeyValuePair&lt;string,string&gt; result, string sourceLocation) 
{     
    Console.WriteLine(&quot;[!] Server in COMMAND LEARNING MODE! Point the remote towards the sensor and send a command.&quot;); 
    
    string[] data = result.Key.Split(new char[] { ':' });     
    var set = StorageHelper.GetSingleSet(StorageHelper.GetSets(), data[1]); 
    
    if (set != null)     
    {     
        if ((from c in set.Commands where c.Name == result.Value select c).FirstOrDefault() != null) 
        {     
            Console.WriteLine(&quot;Cannot learn command {0} for the following set: {1}. Command already exists.&quot;, data[1], result.Value); 
            
            ServerResponse response = new ServerResponse();     
            response.Marker = &quot;NOTIFICATION&quot;;     
            response.Identifier = NetworkHelper.GetLocalIPAddress().ToString(); 
            response.Content = &quot;We could not save the following command - &quot; &#43; result.Value &#43; &quot;. It already exists in the set.&quot;; 
            
            NetworkHelper.SendData(sourceLocation, JsonConvert.SerializeObject(response));     
        } 
        else 
        { 
            if (sensor == null) 
                sensor = new IR(); 
            
            sensor.open(-1); 

            sensor.waitForAttachment(); 
    
            sensor.Learn &#43;= (sender, args) =&gt; 
            { 
                Console.WriteLine(&quot;[!] Server learned the command and is no longer in COMMAND LEARNING MODE.&quot;); 
                IRLearnedCode code = args.LearnedCode; 
                code.CodeInfo.MinRepeat = 5; 
            
                Command command = new Command(); 
                command.Name = result.Value; 
                command.Code = IRCodeWorker.GetSerializableIRCode(code); 
                
                StorageHelper.AddCommand(command, set.Name); 
                
                ServerResponse response = new ServerResponse(); 
                response.Marker = &quot;NOTIFICATION&quot;; 
                response.Identifier = NetworkHelper.GetLocalIPAddress().ToString(); 
                response.Content = &quot;The following command has been stored: &quot; &#43; result.Value; 
                
                NetworkHelper.SendData(sourceLocation, JsonConvert.SerializeObject(response)); 
            }; 
        } 
    } 
}
</pre></p><p>Once a request was received that the server needs to learn a new command, an initial verification is done to make sure that the requested command name and set are not already taken. If neither the command nor the set exist, both will be created.</p><p>After the basic setup is complete, the IR sensor is activated and will be waiting for the command to be learned. The way it works is quite simple – the sensor will remain in learning mode until the point where it recognizes a command without error, being 100% sure that it can be reproduced internally. You will need to point your remote towards the sensor and hold the button you want captured for one or two seconds in order for the command to be learned.</p><p><strong>NOTE:</strong> To ensure that a proper transmission is done, I manually set the minimal repeat value to 5. This is the number of times the sensor will fire the same code towards the target. That is the optimal value for a target device to receive the code if the remote is pointed directly at it without necessarily triggering the same command twice or more.</p><p>After the command is learned, the code is processed and transformed into a serializable instance. The connecting client is then notified about whether the command was learned.</p><p><strong>ExecuteCommand:</strong></p><p><pre class="brush: csharp">
/// &lt;summary&gt; 
/// Execute one of the commands currently stored on the local server. 
/// &lt;/summary&gt; 
/// &lt;param name=&quot;result&quot;&gt;The original deserialized command.&lt;/param&gt; 
private static void ExecuteCommand(KeyValuePair&lt;string,string&gt; result) 
{ 
    string[] data = result.Key.Split(new char[] { ':' }); 

    var set = StorageHelper.GetSingleSet(StorageHelper.GetSets(), data[1]); 
    
    if (set != null) 
    {     
        var command = StorageHelper.GetSingleCommand(StorageHelper.GetCommands(set.Name), result.Value); 

        IRLearnedCode code = IRCodeWorker.GetLearnedCode(command.Code); 
        
        if (sensor == null) 
            sensor = new IR(); 

        sensor.open(-1); 
        sensor.waitForAttachment(); 
        sensor.transmit(code.Code, code.CodeInfo); 
        sensor.close(); 
    } 
}
</pre></p><p>Command execution relies on the hardware sensor. The phone sends a command execution request in the following format:</p><p><strong>EXECUTE</strong>:<strong>SET_NAME</strong>, <strong>COMMAND_NAME</strong></p><p>Once the command is parsed out and found in the local storage, the IR code is transformed back to a model that is recognizable by the Phidgets SDK and transmitted towards the location where the sensor is pointed at the time of the execution.</p><p><strong>DeleteSet:</strong></p><p><pre class="brush: csharp">
/// &lt;summary&gt; 
/// Delete a single set and all the associated commands 
/// &lt;/summary&gt; 
/// &lt;param name=&quot;target&quot;&gt;The name of the set.&lt;/param&gt; 
private static void DeleteSet(string target) 
{ 
    var sets = StorageHelper.GetSets(); 
    var targetSet = StorageHelper.GetSingleSet(sets, target); 
    
    if (targetSet != null) 
    { 
        StorageHelper.RemoveSet(sets, targetSet); 
    } 
}
</pre></p><p>When deleting a set, only the name of the set should be specified. The user will get a warning on the client side that requires a confirmation of the deletion. The server will blindly execute the command.</p><p><strong>DeleteCommand:</strong></p><p><pre class="brush: csharp">
private static void DeleteCommand(KeyValuePair&lt;string, string&gt; result)
{
    var sets = StorageHelper.GetSets();
    string setName = result.Key.Split(new char[] {':'})[1];
    var targetSet = StorageHelper.GetSingleSet(sets, setName);
    var command = (from c in targetSet.Commands where c.Name == result.Value select c).FirstOrDefault();
    
    if (command != null)
    {
        targetSet.Commands.Remove(command);
        StorageHelper.SerializeSets(sets);
    }
}
</pre></p><p>Not only can the user remove entire sets, but he can also target specific commands from a given set. Once a <strong>DELETE_COMMAND</strong> directive is recognized, the set name is parsed out from the original string, that follows the <strong>DELETE_COMMAND:SET_NAME, COMMAND_NAME</strong> format, and a simple LINQ query extracts the command instance, removes it and stores the set content on the local hard drive.</p><p>Notice that for some commands, particularly for set creation, deletion and command deletion, the server will return a list of the remaining items. The contents will be automatically updated on the devices, which will be waiting for that response. This measure was deliberately introduced to minimize the chances of a user triggering a command that was already deleted or trying to query a previously removed set.</p><h3>Transforming Codes</h3><p>You might have noticed that I am using <strong>IRCodeWorker.GetSerializableCodeType</strong> to transform a Phidgets SDK native IR code model into a serializable one. This is a helper function that performs a field copy of the existing object. Because of the differences in the model structure, it has to be done manually:</p><p><pre class="brush: csharp">
public static SerializableIRCode GetSerializableIRCode(IRLearnedCode code) 
{ 
    SerializableIRCode sCode = new SerializableIRCode();     
    sCode.BitSize = code.Code.BitCount;     
    sCode.Encoding = code.CodeInfo.Encoding;     
    sCode.CarrierFrequency = code.CodeInfo.CarrierFrequency;     
    sCode.CodeData = code.Code.Data;     
    sCode.DutyCycle = code.CodeInfo.DutyCycle;     
    sCode.Gap = code.CodeInfo.Gap;     
    sCode.Header = code.CodeInfo.Header;     
    sCode.MinRepeat = 5;     
    sCode.One = code.CodeInfo.One;     
    sCode.Repeat = code.CodeInfo.Repeat;     
    sCode.Trail = code.CodeInfo.Trail;     
    sCode.Zero = code.CodeInfo.Zero;     
    sCode.Mask = new ToggleMask()     
    {         
        BitSize = code.CodeInfo.ToggleMask.BitCount,         
        CodeData = code.CodeInfo.ToggleMask.Data         
    }; 
    
    return sCode;     
}
</pre></p><p>The reverse process is easier because I can pass each of the existing properties to the <strong>IRCodeInfo</strong> constructor. The only difference is the fact that I need to use Reflection to create an instance of <strong>IRLearnedCode</strong> because there is no public constructor defined and a dynamic object has to be created:</p><p><pre class="brush: csharp">
internal static IRLearnedCode GetLearnedCode(SerializableIRCode serializableIRCode) 
{ 
    IRCode code = new IRCode(serializableIRCode.CodeData, serializableIRCode.BitSize);     
    IRCodeInfo info = new IRCodeInfo(serializableIRCode.Encoding, serializableIRCode.BitSize, serializableIRCode.Header,     
    serializableIRCode.Zero, serializableIRCode.One, serializableIRCode.Trail, serializableIRCode.Gap, serializableIRCode.Repeat, 
serializableIRCode.MinRepeat, serializableIRCode.Mask.CodeData, IRCodeInfo.IRCodeLength.Constant,
serializableIRCode.CarrierFrequency, serializableIRCode.DutyCycle); 
    
    object[] parameters = new object[] { code, info }; 
    
    BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance; 
    object instantType = Activator.CreateInstance(typeof(IRLearnedCode), flags, null, parameters, null); 

    return (IRLearnedCode)instantType; 
}
</pre></p><h3>Command and Set Management</h3><p>Looking back at the code that I put together for the command interpreter, there is one class that does all local content manipulation—<strong>StorageHelper</strong>. This is a simple class that performs LINQ queries on set as well as command collections, and makes sure that all the changes are preserved in the <strong>sets.xml</strong> file in the application folder that is used as the only storage place for all the content that is being manipulated by the server.</p><p><pre class="brush: csharp">
namespace Coding4Fun.MissionControl.API.Helpers 
{ 
    public class StorageHelper 
    { 
        
        /// &lt;summary&gt; 
        /// Lists all available sets that are currently stored on the server.         
        /// &lt;/summary&gt; 
        /// &lt;returns&gt;List of sets on the machine.&lt;/returns&gt;         
        internal static List&lt;Set&gt; GetSets()         
        {             
            List&lt;Set&gt; sets = null; 
            
            string rawContent = GetRawSets();             
            sets = JsonConvert.DeserializeObject&lt;List&lt;Set&gt;&gt;(rawContent); 
            
            return sets;             
        } 
        
        /// &lt;summary&gt;         
        /// Returns the list of commands that are associated with the given set.         
        /// &lt;/summary&gt;         
        /// &lt;param name=&quot;setName&quot;&gt;The name of the target set.&lt;/param&gt;         
        /// &lt;returns&gt;List of commands associated with the given set.&lt;/returns&gt;         
        internal static List&lt;Command&gt; GetCommands(string setName)         
        {             
            List&lt;Command&gt; commandList = null; 
            
            var sets = GetSets(); 
            
            Set singleSet = null;             
            if (sets != null)             
                singleSet = (from c in sets where c.Name == setName select c).FirstOrDefault(); 
            
            if (singleSet != null)         
            {         
                commandList = singleSet.Commands;     
            } 
            
            return commandList; 
        } 
        
        /// &lt;summary&gt;     
        /// Gets the list of names for the commands in the requested set. 
        /// &lt;/summary&gt; 
        /// &lt;param name=&quot;setName&quot;&gt;The name of the target set.&lt;/param&gt; 
        /// &lt;returns&gt;List of commands associated with the given set.&lt;/returns&gt; 
        internal static List&lt;string&gt; GetRawCommandNames(string setName) 
        { 
            List&lt;Command&gt; commandList = GetCommands(setName); 
            
            List&lt;string&gt; stringSet = null; 
            
            if (commandList != null) 
            {     
                stringSet = commandList.Select(x =&gt; x.Name).ToList();     
            } 
            
            return stringSet;     
        } 
        
        /// &lt;summary&gt; 
        /// Get the list of names for all sets on the local server. 
        /// &lt;/summary&gt; 
        /// &lt;returns&gt;List of sets on the machine.&lt;/returns&gt; 
        internal static List&lt;string&gt; GetRawSetNames() 
        {     
            List&lt;Set&gt; sets = GetSets(); 
            
            List&lt;string&gt; stringSet = null; 
    
            if (sets != null) 
            {     
                stringSet = sets.Select(x =&gt; x.Name).ToList();     
            } 
            
            return stringSet; 
        } 
        
        /// &lt;summary&gt; 
        /// Get the raw string contents of sets.xml. Should only be used in the 
        /// context of this class. 
        /// &lt;/summary&gt; 
        /// &lt;returns&gt;JSON string representing stored sets and commands.&lt;/returns&gt; 
        internal static string GetRawSets() 
        { 
            string sets = string.Empty; 
            
            if (File.Exists(&quot;sets&quot;)) 
            { 
                using (StreamReader reader = new StreamReader(File.OpenRead(&quot;sets&quot;))) 
                { 
                    sets = reader.ReadToEnd(); 
                } 
            } 
            else 
            { 
                FileStream stream = File.Create(&quot;sets.xml&quot;); 
                
                stream.Close();     
            } 
            
            return sets; 
        } 
        
        /// &lt;summary&gt; 
        /// Check whether a set is marked with a IsList flag. 
        /// &lt;/summary&gt; 
        /// &lt;param name=&quot;setName&quot;&gt;The name of the target set.&lt;/param&gt; 
        /// &lt;returns&gt;TRUE - set is a list. FALSE - set is not a list.&lt;/returns&gt; 
        internal static bool IsSetAList(string setName) 
        { 
            bool isList = true; 
            var sets = GetSets(); 
            Set set = null; 

            if (sets != null) 
                set = (from c in sets where c.Name == setName select c).FirstOrDefault(); 
            
            if (set != null) 
                isList = set.IsList; 
            
            return isList;     
        } 
        
        /// &lt;summary&gt; 
        /// Serialize the set collection to sets.xml 
        /// &lt;/summary&gt; 
        /// &lt;param name=&quot;sets&quot;&gt;Collection to be serialized.&lt;/param&gt; 
        /// &lt;returns&gt;true if sets are serialized.&lt;/returns&gt; 
        private static bool SerializeSets(List&lt;Set&gt; sets) 
        { 
            try 
            { 
                using (StreamWriter writer = new StreamWriter(&quot;sets.xml&quot;, false)) 
                {     
                    string data = JsonConvert.SerializeObject(sets); 
            
                    writer.Write(data); 
                } 
                
                return true; 
            } 
            catch 
            {     
                return false;     
            } 
        } 
        
        /// &lt;summary&gt; 
        /// Add a new set to the existing global set collection. 
        /// &lt;/summary&gt; 
        /// &lt;param name=&quot;name&quot;&gt;Set name.&lt;/param&gt; 
        /// &lt;returns&gt;true if successfully added set.&lt;/returns&gt; 
        internal static bool AddSet(string name, bool isList = true) 
        { 
            var sets = GetSets(); 

            if (sets == null) 
                sets = new List&lt;Set&gt;(); 
            
            var singleSet = GetSingleSet(sets, name); 

            if (singleSet == null) 
                sets.Add(new Set { Name = name, IsList = isList }); 
            
            if (SerializeSets(sets)) 
                return true; 
            else 
                return false; 
        } 
        
        /// &lt;summary&gt; 
        /// Retrieves a single set from a collection that has a specific name. 
        /// &lt;/summary&gt; 
        /// &lt;param name=&quot;sets&quot;&gt;The source collection from which to extract the set.&lt;/param&gt; 
        /// &lt;param name=&quot;name&quot;&gt;The name of the set to get.&lt;/param&gt; 
        /// &lt;returns&gt;An instance of the found set, if any.&lt;/returns&gt; 
        internal static Set GetSingleSet(List&lt;Set&gt; sets, string name) 
        { 
            if (sets != null) 
                return (from c in sets where c.Name == name select c).FirstOrDefault(); 
            else 
                return null; 
        } 
        
        /// &lt;summary&gt; 
        /// Add a IR command to an existing set. If the set is not found, it will be created. 
        /// &lt;/summary&gt; 
        /// &lt;param name=&quot;command&quot;&gt;The command instance to be added.&lt;/param&gt; 
        /// &lt;param name=&quot;targetSet&quot;&gt;The name of the target set.&lt;/param&gt; 
        /// &lt;returns&gt;true if the command was successfully added.&lt;/returns&gt; 
        internal static bool AddCommand(Command command, string targetSet) 
        { 
            var sets = GetSets(); 
            
            if (sets == null) 
                sets = new List&lt;Set&gt;(); 
            
            var singleSet = GetSingleSet(sets, targetSet); 
            
            if (singleSet == null) 
                singleSet = new Set { Name = targetSet }; 
            
            var singleCommand = (from c in singleSet.Commands where c.Name == command.Name select c).FirstOrDefault(); 
            
            if (singleCommand == null) 
            { 
                singleSet.Commands.Add(command); 
                
                if (SerializeSets(sets)) 
                    return true; 
                else 
                    return false; 
            } 
            else 
                return false; 
        } 
        
        /// &lt;summary&gt; 
        /// Retrieve a single command instance from one of the sets on the local server. 
        /// &lt;/summary&gt; 
        /// &lt;param name=&quot;commands&quot;&gt;Original list of commands.&lt;/param&gt; 
        /// &lt;param name=&quot;name&quot;&gt;Name of the command to be retrieved.&lt;/param&gt; 
        /// &lt;returns&gt;An instance of the command, if found. NULL if not.&lt;/returns&gt; 
        internal static Command GetSingleCommand(List&lt;Command&gt; commands, string name) 
        { 
            if (commands != null) 
                return (from c in commands where c.Name == name select c).FirstOrDefault(); 
            else 
                return null; 
        } 
        
        /// &lt;summary&gt; 
        /// Remove a set from a local machine. 
        /// &lt;/summary&gt; 
        /// &lt;param name=&quot;sets&quot;&gt;Original list of sets.&lt;/param&gt; 
        /// &lt;param name=&quot;targetSet&quot;&gt;Name of the set to remove.&lt;/param&gt; 
        internal static void RemoveSet(List&lt;Set&gt; sets, Set targetSet) 
        { 
            sets.Remove(targetSet); 
            
            SerializeSets(sets); 
        } 
    } 
}
</pre></p><h2>Sending Data Back to the Client</h2><p><strong>SendData</strong> in the <strong>NetworkHelper</strong> class handles all outbound connections. Here is its structure:</p><p><pre class="brush: csharp">
/// &lt;summary&gt; 
/// Send data to the target network machine. 
/// &lt;/summary&gt; 
/// &lt;param name=&quot;destination&quot;&gt;The target machine IP.&lt;/param&gt; 
/// &lt;param name=&quot;data&quot;&gt;Data to be sent, in string format.&lt;/param&gt; 
/// &lt;param name=&quot;sanitizeIp&quot;&gt;Determines whether to remove the port from the given IP string.&lt;/param&gt; 
public static void SendData(string destination, string data, bool sanitizeIp = true) 
{ 
    using (Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) 
    {     
        string completeIp = string.Empty; 
        
        if (sanitizeIp)     
            completeIp = destination.Remove(destination.IndexOf(&quot;:&quot;), destination.Length - destination.IndexOf(&quot;:&quot;)); 
        
        client.Connect(completeIp, 6169); 
        client.Send(Encoding.UTF8.GetBytes(data));     
    }     
}
</pre></p><p>A new stream socket is created in order to connect to the target machine over the TCP pipe. If IP sanitization is enabled, the port is stripped from the address in order to pass a valid IP. A <strong>Socket</strong> instance cannot directly handle IPs of the format:</p><p><strong><em>255.255.255.0:PORT_NUMBER</em></strong></p><p>Later, in a synchronous manner, a connection is established and the data is sent.</p><p>At this point, you can see that the barebones service offers a flexible way to manage content. It can be accessed by any application type as long as the server can be accessed and the application can send commands in the pre-defined format and the content requested is actually located on the target server. This allows for high levels of extensibility and interoperability, as the server usage is not limited to a single platform. If I decide to create a Windows Store application that would allow me to control my TV, I simply need to add socket connection layer that will send plain strings to the machine where the IR sensor is connected.</p><p>Similarly, if some functionality needs to be added, it is possible to do so without ever touching the client applications. A modification in the endpoint will be reflected with no direct effect on all connection applications as long as all handled returned and requested values are preserved. The only additional requirement is that if the client applications want to take advantage of newly introduced capabilities, they need to have an updated command transmission layer for the new command types.</p><p>In <strong>Program.cs</strong>, I simply need to start the server through the <strong>CoreStarter</strong> class:</p><p><pre class="brush: csharp">
namespace Coding4Fun.MissionControl.API 
{ 
    class Program     
    {         
        static void Main(string[] args)         
        {             
            Console.WriteLine(&quot;Coding4Fun MissionControl Server&quot;);             
            CoreStarter.LaunchSocket();             
        }         
    }     
}
</pre></p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/clip_image0076.jpg"><img title="clip_image007" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/clip_image007_thumb3.jpg" alt="clip_image007" width="527" height="267" border="0"></a></p><h1>Mobile client overview</h1><p>The mobile client does not have the capability to send commands directly to the IR sensor. Instead, it connects to a remote machine that has the IR sensor plugged in and attempts to invoke a command from the list returned by the service. A single mobile client can support control over multiple servers.</p><p><strong>NOTE:</strong> Make sure that at the time of working with the Windows Phone client, the server is actually running on your local machine. To make it easier to test, also open port 6169 for incoming connections in Windows Firewall.</p><p>When building a Windows Phone application, make sure you have the <a href="http://developer.windowsphone.com/en-us/downloadsdk">proper version of the SDK installed</a>, as well as a <a href="http://en.wikipedia.org/wiki/Second_Level_Address_Translation">SLAT-compatible</a> machine if you plan on testing the application in the emulator.</p><h2>Networking Infrastructure</h2><p>The Windows Phone application also relies on a network infrastructure somewhat similar to that of the server. There is a TCP listener that is created when the application is started:</p><p><pre class="brush: csharp">
// Code to execute when the application is launching (eg, from Start) 
// This code will not execute when the application is reactivated 
private void Application_Launching(object sender, LaunchingEventArgs e) 
{ 
    ServiceSerializer.DeserializeServices(); 
    
    listener.OnClientConnected &#43;= listener_OnClientConnected; 
    listener.Start(6169); 
}
</pre></p><p>Here, listener is an instance of <strong>TcpSocketListener</strong>—a custom class designed to handle incoming network connections:</p><p><pre class="brush: csharp">
namespace Coding4Fun.MissionControl.WP.Network 
{ 
    public class TcpSocketListener : SocketConnectorBase     
    {     
        StreamSocketListener coreSocket; 
        
        public async void Start(int port)     
        {     
            coreSocket = new StreamSocketListener();         
            coreSocket.ConnectionReceived &#43;= coreSocket_ConnectionReceived; 
            
            try     
            {         
                await coreSocket.BindServiceNameAsync(port.ToString());         
            }     
            catch (Exception ex) 
            {     
                Debug.WriteLine(ex.Message); 
                
                coreSocket.Dispose();     
                coreSocket = null; 
                OnConnectionCompleted(new ConnectionEventArgs { IsSuccessful = false, DeviceID = string.Empty }); 
            } 
        } 
        
        async void coreSocket_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args) 
        { 
            Debug.WriteLine(&quot;Connection received!&quot;); 
            
            DataReader reader = new DataReader(args.Socket.InputStream); 
            
            try 
            { 
                while (true) 
                { 
                    StringBuilder builder = new StringBuilder(); 
        
                    uint actualLength = 1; 

                    while (actualLength &gt; 0) 
                    {     
                        actualLength = await reader.LoadAsync(256); 
                        builder.Append(reader.ReadString(actualLength)); 
                    } 
                    
                    OnConnectionCompleted(new ConnectionEventArgs 
                    { 
                        Socket = args.Socket, 
                        IsSuccessful = true, 
                        DeviceID = args.Socket.Information.RemoteHostName.DisplayName, 
                        Token = builder.ToString() 
                    }); 
                    break; 
                } 
            } 
            catch (Exception exception) 
            { 
                Debug.WriteLine(exception.Message); 
                
                OnConnectionCompleted(new ConnectionEventArgs { IsSuccessful = false }); 
            } 
        } 
    } 
}
</pre></p><p>A <strong>StreamSocketListener</strong> is used for the connection core. When a connection is received, a continuous loop reads the entire contents of the incoming stream. <strong>OnConnectionCompleted</strong> is declared in the base class—<strong>SocketConnectorBase</strong>.</p><p><pre class="brush: csharp">
namespace Coding4Fun.MissionControl.WP.Network 
{ 
    public class SocketConnectorBase 
    { 
        public event EventHandler&lt;ConnectionEventArgs&gt; OnClientConnected; 
        public virtual void OnConnectionCompleted(ConnectionEventArgs connectionArgs) 
        { 
            if (OnClientConnected != null) 
            { 
                OnClientConnected(this, connectionArgs); 
            } 
        } 
        
        public event EventHandler&lt;bool&gt; OnSendCompletedEvent; 
        public virtual void OnSendCompleted(bool succeeded) 
        { 
            if (OnSendCompletedEvent != null) 
            { 
                OnSendCompletedEvent(this, succeeded); 
            } 
        } 
    } 
    
    public class ConnectionEventArgs : EventArgs 
    { 
        public StreamSocket Socket { get; set; }     
        public string DeviceID { get; set; }     
        public string Token { get; set; }     
        public bool IsSuccessful { get; set; }     
    } 
}
</pre></p><p><strong>ConnectionEventArgs</strong> here is used to identify the content that is passed to the client. <strong>DeviceID</strong> gives access to the source IP, <strong>IsSuccessful</strong> tells the developer whether the established connection is active and the <strong>Token</strong> carries the raw string if any was received.</p><p>Sending data is simplified to the maximum with the help of the <strong>SocketClient</strong> class, which relies on a <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.sockets.streamsocket.aspx">StreamSocket</a> instance that handles outbound connections and writing to the output stream:</p><p><pre class="brush: csharp">
namespace Coding4Fun.MissionControl.WP.Network 
{ 
    public class SocketClient : SocketConnectorBase 
    {     
        StreamSocket _socket; 
        
        public SocketClient() 
        {     
            _socket = new StreamSocket();     
        } 
        
        public SocketClient(StreamSocket socket) 
        {     
            _socket = socket;     
        } 
        
        public async void Connect(string hostName, int portNumber) 
        { 
            try 
            { 
                await _socket.ConnectAsync(new HostName(hostName), portNumber.ToString(), SocketProtectionLevel.PlainSocket); 
            
                OnConnectionCompleted(new ConnectionEventArgs { IsSuccessful = true }); 
            } 
            catch (Exception ex) 
            {     
                Debug.WriteLine(ex.Message); 
                
                OnConnectionCompleted(new ConnectionEventArgs { IsSuccessful = false });     
            } 
        } 
        
        public async void Send(string dataToSend) 
        { 
            try 
            {     
                using (DataWriter writer = new DataWriter(_socket.OutputStream)) 
                { 
                    // Write the length of the binary data that is being 
                    // sent to the client. 
                    writer.WriteUInt32((UInt32)dataToSend.Length); 
                    
                    writer.WriteString(dataToSend); 
        
                    // Send the actual data. 
                    await writer.StoreAsync(); 
                    
                    writer.DetachStream(); 
                    
                    OnSendCompleted(true); 
                } 
            } 
            catch 
            { 
                _socket.Dispose();     
                _socket = null;     
                OnSendCompleted(false);     
            }     
        }     
    }     
}
</pre></p><p>As with the listener class, <strong>SocketClient</strong> supports <strong>OnConnectionCompleted</strong> to notify the application that the connection attempt completed.</p><p>Back in <strong>App.xaml.cs</strong>, the data from the incoming connection captured by the <strong>TcpSocketListener</strong> instance is passed to the <strong>ResponseHelper</strong> class:</p><p><pre class="brush: csharp">
void listener_OnClientConnected(object sender, ConnectionEventArgs e) 
{ 
    ResponseHelper.HandleIncomingResponse(e.Token); 
}
</pre></p><p>This class reads the possible three commands sent by the server and interprets them, creating internal collections from the raw data if the current server IP matches the one obtained in the <strong>ServerResponse</strong> (the same model in the desktop application):</p><p><pre class="brush: csharp">
using Coding4Fun.MissionControl.WP.Models;
using Coding4Fun.MissionControl.WP.ViewModels;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows;

namespace Coding4Fun.MissionControl.WP.Misc
{
        public class ResponseHelper
        {
                public static void HandleIncomingResponse(string rawResponse)
                {
                        if (rawResponse != null)
                        {
                                ServerResponse response = JsonConvert.DeserializeObject&lt;ServerResponse&gt;(rawResponse);
                
                                if (response.Marker == Constants.COMMAND_SERVER_NOTIFICATION)
                                {
                                        Deployment.Current.Dispatcher.BeginInvoke(() =&gt;
                                        {
                                                MessageBox.Show(response.Content, &quot;Server Response&quot;, MessageBoxButton.OK);
                                        });
                                }
                                else
                                {
                                        if (CommonViewModel.Instance.IsWaiting)
                                        {
                                                if (response.Identifier == CommonViewModel.Instance.CurrentServer.Location)
                                                {
                                                        // returns the list of sets that are associated with the current server.
                                                        if (response.Marker == Constants.COMMAND_SERVER_SET_LIST)
                                                        {
                                
                                                                List&lt;string&gt; items = JsonConvert.DeserializeObject&lt;List&lt;string&gt;&gt;(response.Content);
                                
                                                                if (items != null)
                                                                {
                                                                        List&lt;Group&lt;string&gt;&gt; groupedItems = Group&lt;string&gt;.CreateGroups(items,
                                                                        CultureInfo.CurrentCulture, (string s) =&gt; { return s[0].ToString(); }, true);
                                                                        SetsPageViewModel.Instance.Sets = groupedItems;
                                                                }
                                                                else
                                                                {
                                                                        SetsPageViewModel.Instance.Sets = new List&lt;Group&lt;string&gt;&gt;();
                                                                }
                                
                                                                Deployment.Current.Dispatcher.BeginInvoke(() =&gt;
                                                                    {
                                                                            CommonViewModel.Instance.IsWaiting = false;
                                    
                                                                            if (!App.RootFrame.CurrentSource.ToString().Contains(&quot;SetsPage&quot;))
                                                                            {
                                                                                    App.RootFrame.Navigate(new Uri(&quot;/Views/SetsPage.xaml&quot;, UriKind.Relative));
                                                                            }
                                                                    });
                                
                                                        }
                                                        // returns the list of commands associated with a given set.
                                                        else if (response.Marker.Contains(Constants.COMMAND_SERVER_SET_COMMANDS))
                                                        {
                                                            string[] data = response.Marker.Split(new char[] { ':' });
                                                                if (data[1] == CommonViewModel.Instance.CurrentSet)
                                                                {
                                                                        bool isList = false;
                                                                        bool.TryParse(data[2].ToLower(), out isList);
                                    
                                                                        if (isList)
                                                                        {
                                                                                CommonViewModel.Instance.CurrentSetType = &quot;list&quot;;
                                                                        }
                                                                        else
                                                                        {
                                                                                CommonViewModel.Instance.CurrentSetType = &quot;pad&quot;;
                                                                        }
                                    
                                                                        CommandsPageViewModel.Instance.Commands = new System.Collections.ObjectModel.ObservableCollection&lt;string&gt;(JsonConvert.DeserializeObject&lt;List&lt;string&gt;&gt;(response.Content));
                                    
                                                                        Deployment.Current.Dispatcher.BeginInvoke(() =&gt;
                                                                            {
                                                                                    CommonViewModel.Instance.IsWaiting = false;
                                                                                    App.RootFrame.Navigate(new Uri(&quot;/Views/CommandsPage.xaml&quot;, UriKind.Relative));
                                                                            });
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }
}
</pre></p><p>If the response comes from a server that is different than the one that is currently active, the data is discarded as the user no longer needs it. Also, for specific commands, the mobile application will be on standby, waiting for a response (unless the user decides to cancel the request) – the <strong>IsWaiting</strong> flag is an application-wide indicator that a pending server action is in the queue.</p><p>Same as with the server, the commands in the Windows Phone application are represented through pre-defined constants:</p><p><pre class="brush: csharp">
public const string COMMAND_SERVER_SET_LIST = &quot;SET_LIST&quot;; 

public const string COMMAND_SERVER_SET_COMMANDS = &quot;SET_COMMANDS&quot;; 

public const string COMMAND_SERVER_NOTIFICATION = &quot;NOTIFICATION&quot;;
</pre></p><p>Let’s now take a closer look at how it is handled internally to build the visual layer.</p><h4>Handling the Data</h4><p>The first thing users will see when the application is launched is the list of registered servers:</p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/wp_ss_20130507_0003%5B4%5D.png"><img title="wp_ss_20130507_0003" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/wp_ss_20130507_0003_thumb%5B2%5D.png" alt="wp_ss_20130507_0003" width="288" height="480" border="0"></a></p><p>This is <strong>ServiceListPage.xaml</strong>. The list of servers that were added is retrieved from the isolated storage on application startup, with the help of the standard serialization routine implemented in the <a href="https://coding4fun.codeplex.com/">Coding4Fun Toolkit</a>—specifically, its storage subset (you can get it <a href="http://nuget.org/packages/Coding4Fun.Toolkit.Storage/">via NuGet</a>):</p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/clip_image0116.jpg"><img title="clip_image011" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/clip_image011_thumb3.jpg" alt="clip_image011" width="535" height="61" border="0"></a></p><p>The one-liner that initializes the internal server collection is as follows:</p><p><pre class="brush: csharp">
MainPageViewModel.Instance.Servers = Serialize.Open&lt;ObservableCollection&lt;Server&gt;&gt;(Constants.SERVERS_FILE);
</pre></p><p>&nbsp;</p><p>Here, the <strong>SERVERS_FILE</strong> constant is equal to <strong>servers.xml</strong>. It is a good idea to use constants for file names in order to be able to later modify the location through a single change instead of digging through the many source files in a solution to find references to the old location.</p><p>The user can define an unlimited number of servers, as long as he can access those. There is no restriction on the location of the server itself—it can work with the desktop in your room just as well as with a PC on the other end of the world (yes, this was tested).</p><p>When adding a new server, the user is redirected to <strong>AddServicePage.xaml</strong>, where he can fill in connection details, as well as the location of an image that would help him identify that specific item in the general list:</p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/wp_ss_20130423_0005%5B4%5D.png"><img title="wp_ss_20130423_0005" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/wp_ss_20130423_0005_thumb%5B2%5D.png" alt="wp_ss_20130423_0005" width="288" height="480" border="0"></a></p><p>Once data entry is complete, it is validated internally to make sure that the server is not already registered with the same name and location. If the validation step passes, the server is added to the list of local access points and the user is returned back to the server selection page:</p><p><pre class="brush: csharp">
private void AttemptAddService()
{
        if (!string.IsNullOrWhiteSpace(txtName.Text) &amp;&amp; !string.IsNullOrWhiteSpace(txtLocation.Text))
        {
                Server server = new Server
                    {
                            Name = txtName.Text,
                            Location = txtLocation.Text,
                            ImageURL = !string.IsNullOrWhiteSpace(txtAvatar.Text) ? txtAvatar.Text : string.Empty
                    };
        
                if (!CollectionHelper.CheckServerExists(server))
                {
                        MainPageViewModel.Instance.Servers.Add(server);
            
                        Serialize.Save(Constants.SERVERS_FILE, MainPageViewModel.Instance.Servers);
                        NavigationService.GoBack();
                }
                else
                {
                        Alert.Send(&quot;The service with this name or location is already registered.&quot;);
                }
        }
        else
        {
                Alert.Send(&quot;The service needs a name and a location.&quot;);
        }
}
</pre></p><p>When a server selection is made by the user, it is necessary to show <strong>SetsPage.xaml</strong>. However, it is necessary to also check whether the server is active or not prior to the actual navigation. With the help of internal bindings, I am doing it through a <strong>RelayCommand</strong>:</p><p><pre class="brush: csharp">
public RelayCommand SelectServerCommand { get; private set; }
private async void SelectServer(object server)
{
        CommonViewModel.Instance.IsWaiting = true;
        CommonViewModel.Instance.CurrentServer = (Server)server;
    
        bool result = await CommonViewModel.Instance.CommandClient.SendCommand(CommonViewModel.Instance.CurrentServer.Location, 
        Constants.COMMAND_SERVER_HELLO, string.Empty);
        if (!result)
        {
                Alert.Send(Constants.MESSAGE_SERVER_CONNECT_FAIL);
                CommonViewModel.Instance.CurrentServer = null;
        
                CommonViewModel.Instance.IsWaiting = false;
        }
}
</pre></p><p>&nbsp;</p><p><strong>COMMAND_SERVER_HELLO</strong> represents the initial handshake command that I mentioned earlier—it requests the list of sets on the target server. To streamline command processing, <strong>CommandClient</strong> is used and wraps around the <strong>SocketClient</strong> class, giving me the possibility to call <strong>SendCommand</strong> with the command metadata without having to explicitly handle socket interactions in my views:</p><p><pre class="brush: csharp">
namespace Coding4Fun.MissionControl.WP.Network 
{     
    public class CommandClient     
    {     
        private SocketClient client; 
        
        public Task&lt;bool&gt; SendCommand(string key, string value, Action&lt;bool&gt; onCompleted = null) 
        {     
            var taskCompletionSource = new TaskCompletionSource&lt;bool&gt;(); 
            
            client = new SocketClient();     
            client.OnClientConnected &#43;= (s, args) =&gt;     
            {     
                if (args.IsSuccessful)     
                {     
                    string data = JsonConvert.SerializeObject(new KeyValuePair&lt;string, string&gt;(key, value));     
                    client.Send(data);     
                } 
            
                taskCompletionSource.SetResult(args.IsSuccessful); 
                client = null; 
            }; 
            
            client.Connect(Binder.Instance.CurrentService.Location, 6169); 
            return taskCompletionSource.Task;     
        } 
    } 
}
</pre></p><p>From here on, <strong>ResponseHelper</strong> is once again involved, grouping all the data alphabetically—remember this call:</p><p><pre class="brush: csharp">
// returns the list of sets that are associated with the current server. 
if (response.Marker == Constants.COMMAND_SERVER_SET_LIST) 
{     
    List&lt;string&gt; items = JsonConvert.DeserializeObject&lt;List&lt;string&gt;&gt;(response.Content);     
    if (items != null) 
    {     
        List&lt;Group&lt;string&gt;&gt; groupedItems = Group&lt;string&gt;.CreateGroups(items,     
    CultureInfo.CurrentCulture, (string s) =&gt; { return s[0].ToString(); }, true);     
        Binder.Instance.Sets = groupedItems;     
    } 
    else 
    {     
        Binder.Instance.Sets = new List&lt;Group&lt;string&gt;&gt;();     
    } 
}
</pre></p><p>&nbsp;</p><p>The grouped collection is later bound to a <a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj244365(v=vs.105).aspx">LongListSelector</a> instance:</p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/wp_ss_20130507_0001%5B4%5D.png"><img title="wp_ss_20130507_0001" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/wp_ss_20130507_0001_thumb%5B2%5D.png" alt="wp_ss_20130507_0001" width="288" height="480" border="0"></a></p><p>For each handshake call to the server, the set collection will be re-initialized, in case the server was updated by another device while the user was not taking any actions.</p><p>Adding a set takes the user to <strong>AddSetPage.xaml</strong>, where the user input is once again validated and the appropriate command sent to the currently selected server:</p><p><pre class="brush: csharp">
private async void AttemptAddSet()
{
        if (!string.IsNullOrWhiteSpace(txtName.Text))
        {
                this.Focus();
        
                bool commandSent = await CommonViewModel.Instance.CommandClient.SendCommand(CommonViewModel.Instance.CurrentServer.Location, 
                    string.Format(Constants.COMMAND_CREATE_SET, ((ListPickerItem)lstType.SelectedItem).Content.ToString()), txtName.Text);
                if (!commandSent)
                {
                        Alert.Send(Constants.MESSAGE_SERVER_CONNECT_FAIL);
                }
                else
                {
                        CommonViewModel.Instance.IsWaiting = true;
                        NavigationService.GoBack();
                }
        }
        else
        {
                Alert.Send(Constants.MESSAGE_NO_NAME_FAIL);
        }
}
</pre></p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/wp_ss_20130430_0002%5B4%5D-1.png"><img title="wp_ss_20130430_0002" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/wp_ss_20130430_0002_thumb%5B2%5D-1.png" alt="wp_ss_20130430_0002" width="288" height="480" border="0"></a></p><p>The end-user is also able to specify whether the new set is a list or a pad. Since the server does not explicitly define the type of a set beyond marking whether it’s a list, it is possible to have an arbitrary type here.</p><p>To give you an idea of what it looks like in the current release of MissionControl, here is the pad representation of a set of commands:</p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/wp_ss_20130507_0002%5B13%5D.png"><img title="wp_ss_20130507_0002" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/wp_ss_20130507_0002_thumb%5B11%5D.png" alt="wp_ss_20130507_0002" width="288" height="480" border="0"></a></p><p>It is a convenient way to display buttons for typical actions, such as channel switching through digits. Since we can safely assume many of those will be tapped sequentially, a list would be inconvenient to scroll through.</p><p>On the other hand, some remote control commands work well with a list because no sequences are invoked most of the time:</p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/wp_ss_20130507_0004%5B4%5D.png"><img title="wp_ss_20130507_0004" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/wp_ss_20130507_0004_thumb%5B2%5D.png" alt="wp_ss_20130507_0004" width="288" height="480" border="0"></a></p><p>If the pad is not desired, it can easily be swapped with another design and internal template - the appearance is swapped dynamically and is not hard-bound to a string value.</p><p>Once a set is selected, a connection attempt is made to the current server in order to check whether there is still a communication channel available with the resource that fetched the initial list of commands. If a connection is established, the server will also return a set of commands that are available in the set at the time of the request.</p><p><pre class="brush: csharp">
private async void AttemptLoadCommands()
{
        bool commandSent = await CommonViewModel.Instance.CommandClient.SendCommand(CommonViewModel.Instance.CurrentServer.Location,
            Constants.COMMAND_GET_COMMANDS, CommonViewModel.Instance.CurrentSet);
        if (!commandSent)
        {
                Alert.Send(Constants.MESSAGE_SERVER_CONNECT_FAIL);
                CommonViewModel.Instance.IsWaiting = false;
        }
}
</pre></p><p>You’ve probably already noticed that both for commands and sets, the initial routine verifies the connection to the server. The server might go dark after the set list is loaded, therefore rendering any attempt to process other commands impossible. To avoid scenarios in which the user is waiting for a response from a server that doesn’t run, the user is notified before being redirected to the subsequent view, if the connection fails. That way unnecessary navigation passes are out of the picture.</p><p>If the user selects a command from one of the lists demonstrated above, an <strong>EXECUTE</strong> directive is issued via the <strong>CommandClient</strong> class:</p><p><pre class="brush: csharp">
private async void lstCommands_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (lstCommands.SelectedItem != null)
    { 
        string selectedItem = lstCommands.SelectedItem.ToString(); 
        
        CommandClient commandClient = new CommandClient(); 
        bool commandSent = await commandClient.SendCommand(string.Format(Constants.COMMAND_EXECUTE, 
        
        Binder.Instance.CurrentSet), selectedItem); 
    
        if (!commandSent) 
        {     
            Alert.Send(Constants.MESSAGE_SERVER_CONNECT_FAIL);     
        } 
        
        lstCommands.SelectedItem = null; 
    } 
}
</pre></p><p>Once the server receives the command, it will send it to the target without additional notifications being released to the connecting client.</p><p>When it comes to learning a new remote control code in <strong>LearnCodePage.xaml</strong>, the procedure is exactly the same as with any other part of the server communication process — a <strong>LEARN_CODE</strong> command is sent to the server with the associated set and new command name, and the server will wait for incoming IR input, leaving the connecting device free (no waiting lock is issued):</p><p><pre class="brush: csharp">
private async void AttemptLearnCode()
{
        if (!string.IsNullOrWhiteSpace(txtName.Text))
        {
                CommonViewModel.Instance.IsWaiting = true;
                this.Focus();
        
                bool commandSent = await CommonViewModel.Instance.CommandClient.SendCommand(CommonViewModel.Instance.CurrentServer.Location,
                    string.Format(Constants.COMMAND_LEARN_NEW, CommonViewModel.Instance.CurrentSet), txtName.Text);
                if (!commandSent)
                {
                        Alert.Send(Constants.MESSAGE_SERVER_CONNECT_FAIL);
                }
                else
                {
                        Alert.Send(Constants.MESSAGE_COMMAND_LEARN_WAIT);
                        NavigationService.GoBack();
                }
        
                CommonViewModel.Instance.IsWaiting = false;
        }
        else
        {
                Alert.Send(Constants.MESSAGE_NO_NAME_FAIL);
        }
}
</pre></p><p>Once the server learns a new command — if, and only if, the user still works in the context of the same server — an alert will be displayed, telling the user whether the command was successfully learned.</p><p>For convenience purposes, I also implemented a quick launch panel, where frequently-used commands can be placed. Whenever a user wants to add something here, he will tap-and-hold on an existing command in any of the sets that are available for any given server, and select the &quot;add to quick launch&quot; option. Once completed, the stored commands will be available on the main page, even when the user is not directly connected to the server that carries the command:</p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/wp_ss_20130507_0005%5B4%5D.png"><img title="wp_ss_20130507_0005" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/wp_ss_20130507_0005_thumb%5B2%5D.png" alt="wp_ss_20130507_0005" width="288" height="480" border="0"></a></p><p>Because this interaction layer is placed outside the boundaries of a single server or set, I needed to create a special data model to store the quick commands and the related connection information, that would let me call the server even when it is not the currently selected one:</p><p><pre class="brush: csharp">
namespace Coding4Fun.MissionControl.WP.Models
{
        public class Favorite
        {
            public string CommandName { get; set; }
            public string ParentSet { get; set; }
            public string ServerLocation { get; set; }
        }
}
</pre></p><p>Same as with the list of servers, the list of favorites is deserialized on application startup:</p><p><pre class="brush: csharp">
MainPageViewModel.Instance.Favorites = Serialize.Open&lt;ObservableCollection&lt;Favorite&gt;&gt;(Constants.FAVORITES_FILE);
</pre></p><p>&nbsp;</p><p>Logically, we would also need to have a way to eliminate trailing commands for servers or sets that have been removed, since those can no longer be invoked or might have a different meaning on servers that were added and have the same IP as the previous owner. This is easily done with a simple LINQ expression that is passed to <strong>RemoveTrailingFavorites </strong>in the <strong>CollectionHelper </strong>class:</p><p><pre class="brush: csharp">
internal static void RemoveTrailingFavorites(Func&lt;Favorite,bool&gt; predicate)
{
        var favorites = MainPageViewModel.Instance.Favorites.Where(predicate).ToList();
    
        if (favorites.Count() &gt; 0)
        {
                foreach (var favorite in favorites)
                {
                        Deployment.Current.Dispatcher.BeginInvoke(() =&gt;
                            {
                                    MainPageViewModel.Instance.Favorites.Remove(favorite);
                            });
                }
        
                Serialize.Save(Constants.FAVORITES_FILE, MainPageViewModel.Instance.Favorites);
        }
}
</pre></p><p>A typical usage scenario is reflected in the server removal snippet:</p><p><pre class="brush: csharp">
public static bool RemoveServer(Server server)
{
        try
        {
                RemoveTrailingFavorites(x=&gt; x.ServerLocation == server.Location);
        
                MainPageViewModel.Instance.Servers.Remove(server);
        
                Serialize.Save(Constants.SERVERS_FILE, MainPageViewModel.Instance.Servers);
        
                return true;
        }
        catch
        {
                return false;
        }
}
</pre></p><p>Because an <a href="http://msdn.microsoft.com/en-us/library/ms668604(v=vs.95).aspx" target="_blank">ObservableCollection&lt;T&gt;</a> is used for both the list of servers and quick launch commands, the view will be instantly updated to reflect the changes.</p><h1>Improvements to the project</h1><p>This specific project relies on a hybrid IR transmitter and receiver, which is not exactly cheap. As a step forward for this project, it can be adapted to use a central microcontroller that acts as a server (e.g. <a href="http://www.netduino.com/" target="_blank">Netduino</a>) and a series of IR emitters (instead of using a composite receiver/emitter) connected to it. Reduced cost for the IR infrastructure is key, as not every single component needs the capability to learn IR commands. You can have a single command capturing endpoint and multiple transmitters. This will also eliminate the need for a desktop client, since the server on the microcontroller can be built to be accessible via a web-browser.</p><p>Another important aspect not covered in this article is security. With the current workflow, anyone who has direct access to the server IP is able to do anything he wants with the data handled by the server. I am basing my writing on the assumption that you are testing the application on a secure local network and that the the odds of something like this happening are close to zero. However, for other environments where tampering with a server might be unacceptable, consider implementing a layer of security between the server and the client.</p><h2>Conclusion</h2><p>With affordable microcontrollers and sensors, home and office automation can be a nice bonus resulting from little investment. This article covers the implementation of a proof-of-concept server and application that can be easily extended and adapted to a variety of environments and devices.</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Entry:RSSView:b029d939c55f459c9663a1b70159bff4">]]></description>
			<comments>http://channel9.msdn.com/coding4fun/articles/MissionControl-A-Flexible-API-for-Remote-Device-Control</comments>
			<itunes:summary>In a race to optimize everything, developers often go to extremes to build software that performs routine tasks. MissionControl is a system that allows users to program a control center that stores interfaces with attached hardware sensors, allowing the users to control any other devices that can be activated via the underlying protocol. For demo purposes, the MissionControl build at this point is compatible with the Phidgets IR hybrid sensor. The system has two core components: A server application, which is a Win32 console application that handles incoming queries and returns data to the connected clients. This application runs on the desktop machine with the connected sensor. The Windows Phone application that sends requests to the target server and can trigger a variety of pre-programmed commands. The BasicsHardware and Communication InfrastructureOne of the most important parts of the project is the signal capture and replication hardware. For the purposes of this project, I decided to use a dual-mode Phidgets IR sensor. It supports both IR code capture and subsequent replication. From a user’s perspective, this device also eliminates a substantial code-learning overhead as well as the potential error rate. Instead of searching for a device-specific hexadecimal sequence that later has to be transformed in a working IR code, the user simply has to point his remote control at the sensor and press the button that he wants accessible from a mobile device. Given that the capturing software is running on the target machine, once the sensor detects that a code can be repeated within an acceptable precision range, it will be automatically captured and stored, with all required transformations worked out in the backend using the free Phidgets SDK. Even though I can, I don’t have to handle the binary code content received through the sensor—the Phidgets .NET libraries carry built-in types that contain all the processed metadata that I will discuss later in this article. </itunes:summary>
			<itunes:duration>229</itunes:duration>
			<link>http://channel9.msdn.com/coding4fun/articles/MissionControl-A-Flexible-API-for-Remote-Device-Control</link>
			<pubDate>Mon, 13 May 2013 15:12:48 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/coding4fun/articles/MissionControl-A-Flexible-API-for-Remote-Device-Control</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/330a/ce7e23b2-7e59-47e3-ba68-af17f8ab330a/MissionControl_100.jpg" height="56" width="100"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/330a/ce7e23b2-7e59-47e3-ba68-af17f8ab330a/MissionControl_220.jpg" height="123" width="220"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/330a/ce7e23b2-7e59-47e3-ba68-af17f8ab330a/MissionControl_512.jpg" height="288" width="512"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/330a/ce7e23b2-7e59-47e3-ba68-af17f8ab330a/MissionControl_960.jpg" height="540" width="960"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/330a/ce7e23b2-7e59-47e3-ba68-af17f8ab330a/MissionControl.mp3" expression="full" duration="229" fileSize="3674107" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/330a/ce7e23b2-7e59-47e3-ba68-af17f8ab330a/MissionControl.mp4" expression="full" duration="229" fileSize="22113376" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/330a/ce7e23b2-7e59-47e3-ba68-af17f8ab330a/MissionControl.webm" expression="full" duration="229" fileSize="16308048" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/330a/ce7e23b2-7e59-47e3-ba68-af17f8ab330a/MissionControl.wma" expression="full" duration="229" fileSize="1867511" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/330a/ce7e23b2-7e59-47e3-ba68-af17f8ab330a/MissionControl.wmv" expression="full" duration="229" fileSize="15574259" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/330a/ce7e23b2-7e59-47e3-ba68-af17f8ab330a/MissionControl_high.mp4" expression="full" duration="229" fileSize="48262843" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/330a/ce7e23b2-7e59-47e3-ba68-af17f8ab330a/MissionControl_mid.mp4" expression="full" duration="229" fileSize="33783291" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/330a/ce7e23b2-7e59-47e3-ba68-af17f8ab330a/MissionControl_Source.wmv" expression="full" duration="229" fileSize="135746099" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/330a/ce7e23b2-7e59-47e3-ba68-af17f8ab330a/MissionControl.wmv" length="15574259" type="video/x-ms-wmv"></enclosure>
			<dc:creator>Clint Rutkas, Den Delimarsky</dc:creator>
			<itunes:author>Clint Rutkas, Den Delimarsky</itunes:author>
			<slash:comments>5</slash:comments>
			<wfw:commentRss>http://channel9.msdn.com/coding4fun/articles/MissionControl-A-Flexible-API-for-Remote-Device-Control/RSS</wfw:commentRss>
			<category>Networking</category>
			<category>Windows</category>
			<category>Windows  Phone</category>
	</item>
	<item>
			<title>Debug visually with Code Map debugger integration : Visual Studio Ultimate | Visual Studio TV</title>
			<description><![CDATA[<p><span>This short video introduces Code Map debugger integration, a new feature for debugging complex code in C#, VB, C&#43;&#43;, JavaScript, and other languages without getting lost.</span></p><p><span>Related MSDN Article: </span><a href="http://go.microsoft.com/fwlink/?LinkId=291306">Visualize and Debug Code Execution with Call Stacks in Visual Studio</a></p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Entry:RSSView:03ee779f3a404410b04ca18e00884397">]]></description>
			<comments>http://channel9.msdn.com/Series/Visual-Studio-2012-Premium-and-Ultimate-Overview/Visual-Studio-Ultimate-2012Debug-visually-with-Code-Map-debugger-integration</comments>
			<itunes:summary>This short video introduces Code Map debugger integration, a new feature for debugging complex code in C#, VB, C&amp;#43;&amp;#43;, JavaScript, and other languages without getting lost. Related MSDN Article: Visualize and Debug Code Execution with Call Stacks in Visual Studio </itunes:summary>
			<itunes:duration>141</itunes:duration>
			<link>http://channel9.msdn.com/Series/Visual-Studio-2012-Premium-and-Ultimate-Overview/Visual-Studio-Ultimate-2012Debug-visually-with-Code-Map-debugger-integration</link>
			<pubDate>Thu, 28 Mar 2013 05:55:17 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/Series/Visual-Studio-2012-Premium-and-Ultimate-Overview/Visual-Studio-Ultimate-2012Debug-visually-with-Code-Map-debugger-integration</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/16a8/b9d3a424-6bd9-4e80-bc59-1fd3ac6516a8/ENUCodeMapDebugger_100.jpg" height="56" width="100"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/16a8/b9d3a424-6bd9-4e80-bc59-1fd3ac6516a8/ENUCodeMapDebugger_220.jpg" height="123" width="220"></media:thumbnail>
			<media:thumbnail url="http://media.ch9.ms/ch9/16a8/b9d3a424-6bd9-4e80-bc59-1fd3ac6516a8/ENUCodeMapDebugger_512.jpg" height="288" width="512"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/16a8/b9d3a424-6bd9-4e80-bc59-1fd3ac6516a8/ENUCodeMapDebugger.mp3" expression="full" duration="141" fileSize="2269541" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/16a8/b9d3a424-6bd9-4e80-bc59-1fd3ac6516a8/ENUCodeMapDebugger.mp4" expression="full" duration="141" fileSize="12852598" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/16a8/b9d3a424-6bd9-4e80-bc59-1fd3ac6516a8/ENUCodeMapDebugger.webm" expression="full" duration="141" fileSize="4144828" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/16a8/b9d3a424-6bd9-4e80-bc59-1fd3ac6516a8/ENUCodeMapDebugger.wma" expression="full" duration="141" fileSize="1157134" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/16a8/b9d3a424-6bd9-4e80-bc59-1fd3ac6516a8/ENUCodeMapDebugger.wmv" expression="full" duration="141" fileSize="5735848" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/16a8/b9d3a424-6bd9-4e80-bc59-1fd3ac6516a8/ENUCodeMapDebugger_high.mp4" expression="full" duration="141" fileSize="29096660" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/16a8/b9d3a424-6bd9-4e80-bc59-1fd3ac6516a8/ENUCodeMapDebugger_mid.mp4" expression="full" duration="141" fileSize="20212602" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/16a8/b9d3a424-6bd9-4e80-bc59-1fd3ac6516a8/ENUCodeMapDebugger_Source.wmv" expression="full" duration="141" fileSize="6060402" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/16a8/b9d3a424-6bd9-4e80-bc59-1fd3ac6516a8/ENUCodeMapDebugger.wmv" length="5735848" type="video/x-ms-wmv"></enclosure>
			<dc:creator>alvinho, David Starr</dc:creator>
			<itunes:author>alvinho, David Starr</itunes:author>
			<slash:comments>1</slash:comments>
			<wfw:commentRss>http://channel9.msdn.com/Series/Visual-Studio-2012-Premium-and-Ultimate-Overview/Visual-Studio-Ultimate-2012Debug-visually-with-Code-Map-debugger-integration/RSS</wfw:commentRss>
			<category>VSUltimate</category>
			<category>vspremium</category>
	</item>
	<item>
			<title>Keynote: Scott Guthrie  | Windows AzureConf 2013 </title>
			<description><![CDATA[<p>Scott Guthrie kicks off the Windows Azure Conf by presenting an overview of Windows Azure. Scott will demonstrate how to build a wide variety of applications ranging from web sites, mobile applications, and multi-tier cloud services.</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Session:RSSView:ed4b98f083084e93a40ba1a900fd3646">]]></description>
			<comments>http://channel9.msdn.com/Events/windowsazure/Windows-AzureConf-2013/Keynote-Scott-Guthrie</comments>
			<itunes:summary>Scott Guthrie kicks off the Windows Azure Conf by presenting an overview of Windows Azure. Scott will demonstrate how to build a wide variety of applications ranging from web sites, mobile applications, and multi-tier cloud services. </itunes:summary>
			<itunes:duration>5768</itunes:duration>
			<link>http://channel9.msdn.com/Events/windowsazure/Windows-AzureConf-2013/Keynote-Scott-Guthrie</link>
			<pubDate>Tue, 23 Apr 2013 15:22:00 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/Events/windowsazure/Windows-AzureConf-2013/Keynote-Scott-Guthrie</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/60ee/c61ca1d6-2e36-4d6a-abf4-71733d6560ee/AzureConf2013ScottGu_220.jpg" height="220" width="165"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/60ee/c61ca1d6-2e36-4d6a-abf4-71733d6560ee/AzureConf2013ScottGu.mp3" expression="full" duration="5768" fileSize="92296213" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/60ee/c61ca1d6-2e36-4d6a-abf4-71733d6560ee/AzureConf2013ScottGu.mp4" expression="full" duration="5768" fileSize="552146731" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/60ee/c61ca1d6-2e36-4d6a-abf4-71733d6560ee/AzureConf2013ScottGu.webm" expression="full" duration="5768" fileSize="194010263" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/60ee/c61ca1d6-2e36-4d6a-abf4-71733d6560ee/AzureConf2013ScottGu.wma" expression="full" duration="5768" fileSize="46648139" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/60ee/c61ca1d6-2e36-4d6a-abf4-71733d6560ee/AzureConf2013ScottGu.wmv" expression="full" duration="5768" fileSize="320156405" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/60ee/c61ca1d6-2e36-4d6a-abf4-71733d6560ee/AzureConf2013ScottGu_high.mp4" expression="full" duration="5768" fileSize="1210722357" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/60ee/c61ca1d6-2e36-4d6a-abf4-71733d6560ee/AzureConf2013ScottGu_mid.mp4" expression="full" duration="5768" fileSize="844265044" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/60ee/c61ca1d6-2e36-4d6a-abf4-71733d6560ee/AzureConf2013ScottGu_Source.wmv" expression="full" duration="5768" fileSize="677765079" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://smooth.ch9.ms/ch9/60ee/c61ca1d6-2e36-4d6a-abf4-71733d6560ee/AzureConf2013ScottGu.ism/manifest" expression="full" duration="5768" fileSize="6116" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/60ee/c61ca1d6-2e36-4d6a-abf4-71733d6560ee/AzureConf2013ScottGu.wmv" length="320156405" type="video/x-ms-wmv"></enclosure>
			<dc:creator>Scott Guthrie</dc:creator>
			<itunes:author>Scott Guthrie</itunes:author>
			<slash:comments>5</slash:comments>
	</item>
	<item>
			<title>Deep dive: Tips &amp; tricks for porting games from other platforms to Windows 8 | Building Windows Games with Unity</title>
			<description><![CDATA[<p>Go deep under the hood of Unity for Windows Store apps. After&nbsp;this session you will understand how the engine works, and the changes you will need to make to port a Unity game to run on the Windows Store app model.</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Session:RSSView:8ab8ccbb03214c3181c8a17a0029f820">]]></description>
			<comments>http://channel9.msdn.com/Events/Windows-Camp/Building-Windows-Games-with-Unity/Deep-dive-Tips-tricks-for-porting-games-from-other-platforms-to-Windows-8</comments>
			<itunes:summary>Go deep under the hood of Unity for Windows Store apps. After&amp;nbsp;this session you will understand how the engine works, and the changes you will need to make to port a Unity game to run on the Windows Store app model. </itunes:summary>
			<itunes:duration>3178</itunes:duration>
			<link>http://channel9.msdn.com/Events/Windows-Camp/Building-Windows-Games-with-Unity/Deep-dive-Tips-tricks-for-porting-games-from-other-platforms-to-Windows-8</link>
			<pubDate>Sat, 06 Apr 2013 17:58:00 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/Events/Windows-Camp/Building-Windows-Games-with-Unity/Deep-dive-Tips-tricks-for-porting-games-from-other-platforms-to-Windows-8</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/8007/0e20c3d9-0f75-486b-8ab6-5643534c8007/Unity2013Deepdivetipstricksforportinggames_220.jpg" height="220" width="165"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/8007/0e20c3d9-0f75-486b-8ab6-5643534c8007/Unity2013Deepdivetipstricksforportinggames.mp3" expression="full" duration="3178" fileSize="50855218" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/8007/0e20c3d9-0f75-486b-8ab6-5643534c8007/Unity2013Deepdivetipstricksforportinggames.mp4" expression="full" duration="3178" fileSize="303866865" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/8007/0e20c3d9-0f75-486b-8ab6-5643534c8007/Unity2013Deepdivetipstricksforportinggames.webm" expression="full" duration="3178" fileSize="99635929" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/8007/0e20c3d9-0f75-486b-8ab6-5643534c8007/Unity2013Deepdivetipstricksforportinggames.wma" expression="full" duration="3178" fileSize="25707255" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/8007/0e20c3d9-0f75-486b-8ab6-5643534c8007/Unity2013Deepdivetipstricksforportinggames.wmv" expression="full" duration="3178" fileSize="253699697" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/8007/0e20c3d9-0f75-486b-8ab6-5643534c8007/Unity2013Deepdivetipstricksforportinggames_high.mp4" expression="full" duration="3178" fileSize="665771344" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/8007/0e20c3d9-0f75-486b-8ab6-5643534c8007/Unity2013Deepdivetipstricksforportinggames_mid.mp4" expression="full" duration="3178" fileSize="465230476" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/8007/0e20c3d9-0f75-486b-8ab6-5643534c8007/Unity2013Deepdivetipstricksforportinggames_Source.wmv" expression="full" duration="3178" fileSize="818023070" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://smooth.ch9.ms/ch9/8007/0e20c3d9-0f75-486b-8ab6-5643534c8007/Unity2013Deepdivetipstricksforportinggames.ism/manifest" expression="full" duration="3178" fileSize="6336" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/8007/0e20c3d9-0f75-486b-8ab6-5643534c8007/Unity2013Deepdivetipstricksforportinggames.wmv" length="253699697" type="video/x-ms-wmv"></enclosure>
			<dc:creator>Randy Spong</dc:creator>
			<itunes:author>Randy Spong</itunes:author>
			<slash:comments>0</slash:comments>
	</item>
	<item>
			<title>Introduction to building games with Unity | Building Windows Games with Unity</title>
			<description><![CDATA[<p>In this session, Carl Callewaert&nbsp;demos how to&nbsp;build a game using Unity Editor.</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Session:RSSView:8041b07acc2b4b749f4aa17a0027902e">]]></description>
			<comments>http://channel9.msdn.com/Events/Windows-Camp/Building-Windows-Games-with-Unity/Introduction-to-building-games-with-Unity</comments>
			<itunes:summary>In this session, Carl Callewaert&amp;nbsp;demos how to&amp;nbsp;build a game using Unity Editor. </itunes:summary>
			<itunes:duration>6111</itunes:duration>
			<link>http://channel9.msdn.com/Events/Windows-Camp/Building-Windows-Games-with-Unity/Introduction-to-building-games-with-Unity</link>
			<pubDate>Fri, 12 Apr 2013 19:18:00 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/Events/Windows-Camp/Building-Windows-Games-with-Unity/Introduction-to-building-games-with-Unity</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/0231/f7522d35-f357-417d-8328-cdc644620231/Unity2013IntrotobuildinggameswithUnity_220.jpg" height="220" width="165"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/0231/f7522d35-f357-417d-8328-cdc644620231/Unity2013IntrotobuildinggameswithUnity.mp3" expression="full" duration="6111" fileSize="97790093" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/0231/f7522d35-f357-417d-8328-cdc644620231/Unity2013IntrotobuildinggameswithUnity.mp4" expression="full" duration="6111" fileSize="618396340" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/0231/f7522d35-f357-417d-8328-cdc644620231/Unity2013IntrotobuildinggameswithUnity.webm" expression="full" duration="6111" fileSize="196065621" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/0231/f7522d35-f357-417d-8328-cdc644620231/Unity2013IntrotobuildinggameswithUnity.wma" expression="full" duration="6111" fileSize="49423835" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/0231/f7522d35-f357-417d-8328-cdc644620231/Unity2013IntrotobuildinggameswithUnity.wmv" expression="full" duration="6111" fileSize="363030287" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/0231/f7522d35-f357-417d-8328-cdc644620231/Unity2013IntrotobuildinggameswithUnity_high.mp4" expression="full" duration="6111" fileSize="1338208500" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/0231/f7522d35-f357-417d-8328-cdc644620231/Unity2013IntrotobuildinggameswithUnity_mid.mp4" expression="full" duration="6111" fileSize="942666102" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/0231/f7522d35-f357-417d-8328-cdc644620231/Unity2013IntrotobuildinggameswithUnity_Source.wmv" expression="full" duration="6111" fileSize="934960795" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://smooth.ch9.ms/ch9/0231/f7522d35-f357-417d-8328-cdc644620231/Unity2013IntrotobuildinggameswithUnity.ism/manifest" expression="full" duration="6111" fileSize="6296" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/0231/f7522d35-f357-417d-8328-cdc644620231/Unity2013IntrotobuildinggameswithUnity.wmv" length="363030287" type="video/x-ms-wmv"></enclosure>
			<dc:creator>Carl Callewaert</dc:creator>
			<itunes:author>Carl Callewaert</itunes:author>
			<slash:comments>3</slash:comments>
			<category>Windows Games</category>
			<category>Windows Phone</category>
			<category>Unity</category>
			<category>Windows 8</category>
	</item>
	<item>
			<title>Cloud Optimize Your Business with Microsoft Management Solutions | MMS 2013</title>
			<description><![CDATA[With a set of breakthrough new products and growing industry momentum, Microsoft is transforming IT management. The new capabilities of Windows Server 2012 with System Center 2012 SP1 enable customers to build and manage elastic infrastructures while reducing complexity, improving deployment of critical applications, and advancing the consumerization of IT. In this keynote session, Brad Anderson will demonstrate how Microsoft technologies deliver new cloud capabilities, and he will showcase how customers are already realizing gains in productivity, growth, and innovation through Microsoft solutions. <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Session:RSSView:ecc2b3ed1571410fbc08a19301724724">]]></description>
			<comments>http://channel9.msdn.com/Events/MMS/2013/KEY1</comments>
			<itunes:summary>With a set of breakthrough new products and growing industry momentum, Microsoft is transforming IT management. The new capabilities of Windows Server 2012 with System Center 2012 SP1 enable customers to build and manage elastic infrastructures while reducing complexity, improving deployment of critical applications, and advancing the consumerization of IT. In this keynote session, Brad Anderson will demonstrate how Microsoft technologies deliver new cloud capabilities, and he will showcase how customers are already realizing gains in productivity, growth, and innovation through Microsoft solutions.</itunes:summary>
			<itunes:duration>6806</itunes:duration>
			<link>http://channel9.msdn.com/Events/MMS/2013/KEY1</link>
			<pubDate>Tue, 02 Apr 2013 05:28:00 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/Events/MMS/2013/KEY1</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/4d29/06881f24-3c9d-4064-ac5e-4b3dea5a4d29/KeynoteMMS2013CloudOptimizeYourBusiness_220.jpg" height="220" width="165"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/4d29/06881f24-3c9d-4064-ac5e-4b3dea5a4d29/KeynoteMMS2013CloudOptimizeYourBusiness.mp3" expression="full" duration="6806" fileSize="108908067" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4d29/06881f24-3c9d-4064-ac5e-4b3dea5a4d29/KeynoteMMS2013CloudOptimizeYourBusiness.mp4" expression="full" duration="6806" fileSize="642575275" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4d29/06881f24-3c9d-4064-ac5e-4b3dea5a4d29/KeynoteMMS2013CloudOptimizeYourBusiness.webm" expression="full" duration="6806" fileSize="226321619" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4d29/06881f24-3c9d-4064-ac5e-4b3dea5a4d29/KeynoteMMS2013CloudOptimizeYourBusiness.wma" expression="full" duration="6806" fileSize="55053331" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4d29/06881f24-3c9d-4064-ac5e-4b3dea5a4d29/KeynoteMMS2013CloudOptimizeYourBusiness.wmv" expression="full" duration="6806" fileSize="598405193" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4d29/06881f24-3c9d-4064-ac5e-4b3dea5a4d29/KeynoteMMS2013CloudOptimizeYourBusiness_high.mp4" expression="full" duration="6806" fileSize="1415648339" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4d29/06881f24-3c9d-4064-ac5e-4b3dea5a4d29/KeynoteMMS2013CloudOptimizeYourBusiness_mid.mp4" expression="full" duration="6806" fileSize="989046427" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/4d29/06881f24-3c9d-4064-ac5e-4b3dea5a4d29/KeynoteMMS2013CloudOptimizeYourBusiness_Source.wmv" expression="full" duration="6806" fileSize="1902349981" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://smooth.ch9.ms/ch9/4d29/06881f24-3c9d-4064-ac5e-4b3dea5a4d29/KeynoteMMS2013CloudOptimizeYourBusiness.ism/manifest" expression="full" duration="6806" fileSize="8862" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/4d29/06881f24-3c9d-4064-ac5e-4b3dea5a4d29/KeynoteMMS2013CloudOptimizeYourBusiness.wmv" length="598405193" type="video/x-ms-wmv"></enclosure>
			<dc:creator>Brad Anderson</dc:creator>
			<itunes:author>Brad Anderson</itunes:author>
			<slash:comments>7</slash:comments>
	</item>
	<item>
			<title>Fluid Code in the Real World | ALM Summit 3</title>
			<description><![CDATA[<p>In the end, you get rated on your software's ability to meet your customers' goals. All the Agile practices wrap around one core, inner loop: writing the software. In this hands-on session, we explore that inner loop. How do you write fluid software? How do you test first and design last? How do you get a good design to emerge, every time, even when your first ideas are guaranteed to be wrong? We will explore the engine that makes Agile go: TDD and Refactoring. You will do these in both basic and advanced cases. And we'll do it in the real world, indebted code and all.</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Session:RSSView:0fad12f2b2254eee85f2a164016d1be3">]]></description>
			<comments>http://channel9.msdn.com/Events/ALM-Summit/ALM-Summit-3/Fluid-Code-in-the-Real-World</comments>
			<itunes:summary>In the end, you get rated on your software&#39;s ability to meet your customers&#39; goals. All the Agile practices wrap around one core, inner loop: writing the software. In this hands-on session, we explore that inner loop. How do you write fluid software? How do you test first and design last? How do you get a good design to emerge, every time, even when your first ideas are guaranteed to be wrong? We will explore the engine that makes Agile go: TDD and Refactoring. You will do these in both basic and advanced cases. And we&#39;ll do it in the real world, indebted code and all. </itunes:summary>
			<itunes:duration>3856</itunes:duration>
			<link>http://channel9.msdn.com/Events/ALM-Summit/ALM-Summit-3/Fluid-Code-in-the-Real-World</link>
			<pubDate>Fri, 15 Feb 2013 22:20:00 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/Events/ALM-Summit/ALM-Summit-3/Fluid-Code-in-the-Real-World</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/fae4/88eab078-923c-4537-84c9-b7d014d3fae4/Day2Belshee_220.jpg" height="220" width="165"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/fae4/88eab078-923c-4537-84c9-b7d014d3fae4/Day2Belshee.mp3" expression="full" duration="3856" fileSize="61708451" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/fae4/88eab078-923c-4537-84c9-b7d014d3fae4/Day2Belshee.mp4" expression="full" duration="3856" fileSize="364995170" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/fae4/88eab078-923c-4537-84c9-b7d014d3fae4/Day2Belshee.webm" expression="full" duration="3856" fileSize="144432570" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/fae4/88eab078-923c-4537-84c9-b7d014d3fae4/Day2Belshee.wma" expression="full" duration="3856" fileSize="31189555" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/fae4/88eab078-923c-4537-84c9-b7d014d3fae4/Day2Belshee.wmv" expression="full" duration="3856" fileSize="359586533" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/fae4/88eab078-923c-4537-84c9-b7d014d3fae4/Day2Belshee_high.mp4" expression="full" duration="3856" fileSize="799356724" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/fae4/88eab078-923c-4537-84c9-b7d014d3fae4/Day2Belshee_mid.mp4" expression="full" duration="3856" fileSize="558573991" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/fae4/88eab078-923c-4537-84c9-b7d014d3fae4/Day2Belshee_Source.wmv" expression="full" duration="3856" fileSize="1521980281" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://smooth.ch9.ms/ch9/fae4/88eab078-923c-4537-84c9-b7d014d3fae4/Day2Belshee.ism/manifest" expression="full" duration="3856" fileSize="8414" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/fae4/88eab078-923c-4537-84c9-b7d014d3fae4/Day2Belshee.wmv" length="359586533" type="video/x-ms-wmv"></enclosure>
			<dc:creator>Arlo Belshee</dc:creator>
			<itunes:author>Arlo Belshee</itunes:author>
			<slash:comments>0</slash:comments>
			<category>Agile Development</category>
	</item>
	<item>
			<title>Staying in the Groove | ALM Summit 3</title>
			<description><![CDATA[<p>Getting in the groove, achieving flow, being focused... these are all different ways of talking about that magical place that agile teams strive to find. Getting there is hard, staying there is harder. How do you get yourself and your teams motivated, engaged and focused on their work so they can achieve this state? Peter Provost is a robe-and-sandals agilista with 10&#43; years of experience leading agile teams inside and outside of Microsoft. He has been on teams that have succeeded in finding the groove and teams that did not. In this session Peter will bring his perspective on what it takes to get your teams to gel, collaborate and find this magic place from which we can deliver great software and products, and of course, have fun!</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Feeds/RSS&WT.dl=0&WT.entryid=Session:RSSView:9d73aaa7e92a4e27a1c9a1640143f292">]]></description>
			<comments>http://channel9.msdn.com/Events/ALM-Summit/ALM-Summit-3/Staying-in-the-Groove</comments>
			<itunes:summary>Getting in the groove, achieving flow, being focused... these are all different ways of talking about that magical place that agile teams strive to find. Getting there is hard, staying there is harder. How do you get yourself and your teams motivated, engaged and focused on their work so they can achieve this state? Peter Provost is a robe-and-sandals agilista with 10&amp;#43; years of experience leading agile teams inside and outside of Microsoft. He has been on teams that have succeeded in finding the groove and teams that did not. In this session Peter will bring his perspective on what it takes to get your teams to gel, collaborate and find this magic place from which we can deliver great software and products, and of course, have fun! </itunes:summary>
			<itunes:duration>3883</itunes:duration>
			<link>http://channel9.msdn.com/Events/ALM-Summit/ALM-Summit-3/Staying-in-the-Groove</link>
			<pubDate>Thu, 14 Feb 2013 06:09:00 GMT</pubDate>
			<guid isPermaLink="false">http://channel9.msdn.com/Events/ALM-Summit/ALM-Summit-3/Staying-in-the-Groove</guid>
			<media:thumbnail url="http://media.ch9.ms/ch9/3b6e/8f344781-e4a5-4bd6-af63-223fc3873b6e/Day1Provost_220.jpg" height="220" width="165"></media:thumbnail>
			<media:group>
				<media:content url="http://media.ch9.ms/ch9/3b6e/8f344781-e4a5-4bd6-af63-223fc3873b6e/Day1Provost.mp3" expression="full" duration="3883" fileSize="62129742" type="audio/mp3" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/3b6e/8f344781-e4a5-4bd6-af63-223fc3873b6e/Day1Provost.mp4" expression="full" duration="3883" fileSize="370084029" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/3b6e/8f344781-e4a5-4bd6-af63-223fc3873b6e/Day1Provost.webm" expression="full" duration="3883" fileSize="141766716" type="video/webm" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/3b6e/8f344781-e4a5-4bd6-af63-223fc3873b6e/Day1Provost.wma" expression="full" duration="3883" fileSize="31408847" type="audio/x-ms-wma" medium="audio"></media:content>
				<media:content url="http://media.ch9.ms/ch9/3b6e/8f344781-e4a5-4bd6-af63-223fc3873b6e/Day1Provost.wmv" expression="full" duration="3883" fileSize="282544097" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/3b6e/8f344781-e4a5-4bd6-af63-223fc3873b6e/Day1Provost_high.mp4" expression="full" duration="3883" fileSize="811700596" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/3b6e/8f344781-e4a5-4bd6-af63-223fc3873b6e/Day1Provost_mid.mp4" expression="full" duration="3883" fileSize="566890139" type="video/mp4" medium="video"></media:content>
				<media:content url="http://media.ch9.ms/ch9/3b6e/8f344781-e4a5-4bd6-af63-223fc3873b6e/Day1Provost_Source.wmv" expression="full" duration="3883" fileSize="1731612799" type="video/x-ms-wmv" medium="video"></media:content>
				<media:content url="http://smooth.ch9.ms/ch9/3b6e/8f344781-e4a5-4bd6-af63-223fc3873b6e/Day1Provost.ism/manifest" expression="full" duration="3883" fileSize="8520" type="video/x-ms-wmv" medium="video"></media:content>
			</media:group>
				<enclosure url="http://media.ch9.ms/ch9/3b6e/8f344781-e4a5-4bd6-af63-223fc3873b6e/Day1Provost.wmv" length="282544097" type="video/x-ms-wmv"></enclosure>
			<dc:creator>Peter Provost</dc:creator>
			<itunes:author>Peter Provost</itunes:author>
			<slash:comments>0</slash:comments>
			<category>Agile Development</category>
	</item>
</channel>
</rss>