<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" 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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>John Dyer</title>
    <description>Technology and web development in curly bracket languages {Javascript, C#, ActionScript}</description>
    <link>http://johndyer.name/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.5.0.7</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://johndyer.name/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd?format=rss</blogChannel:blink>
    <dc:creator>John Dyer</dc:creator>
    <dc:title>John Dyer</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/johndyer" /><feedburner:info uri="johndyer" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><media:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</media:keywords><media:category scheme="http://www.itunes.com/dtds/podcast-1.0.dtd">Technology</media:category><itunes:owner><itunes:email>johndyer@gmail.com</itunes:email></itunes:owner><itunes:explicit>no</itunes:explicit><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><itunes:subtitle>Technology and web development in ASP.NET, Flash, and JavaScript</itunes:subtitle><itunes:category text="Technology" /><item>
      <title>Optimizing CSS with Base64 Embedded Images (with Bonus Utility!)</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;As I design a new site (&lt;a href="http://www.dts.edu/"&gt;current site&lt;/a&gt; | &lt;a href="http://www.dts.edu/dts7/"&gt;early demo of new site&lt;/a&gt;), I am working through what combination of technologies (CDN, sprites, caching, gzipping, etc.) we want to use to optimize it. One tool I&amp;rsquo;m looking at is embedding images in CSS with base64 strings. Instead of the browser needing to make several calls, one for the CSS file and then one for each image, base64 embedding means that all of the images are embedded within the CSS file itself.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s great for small images or images that only show up on :hover or mouseover and you don't want there to be any delay in the image appearing. Here&amp;rsquo;s what it looks like:&lt;/p&gt;
&lt;h3&gt;Normal CSS&lt;/h3&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;.myclass {&lt;br /&gt;    width: 45px;&lt;br /&gt;    background: transparent url(myimage.jpg) top left no-repeat;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;CSS with Base64 Embedded Image&lt;/h3&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;.myclass {&lt;br /&gt;    width: 45px;&lt;br /&gt;    background: transparent url(data:image/png;base64,LONG-STRING-OF-BASE64-TEXT) top left no-repeat;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Problems with Base64&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Works in all browsers except IE6 and IE7&lt;/strong&gt;. Solution: use a conditional comments to give IE6/7 a stylesheet that still references the images.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Base64 is bigger than real images&lt;/strong&gt;: In my tests a base64 encoded string image is somewhere around 150% the size of a regular image. This means it&amp;rsquo;s unusable for large images.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hard to manage&lt;/strong&gt;: If you change the image, you&amp;rsquo;ll need to reembed the base64 string. You also have to maitain a separate IE stylesheet.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;How to manage it&lt;/h3&gt;
&lt;p&gt;To help figure out which images were worth embedded and help
&lt;script src="http://johndyer.name/editors/tiny_mce3/themes/advanced/langs/en.js" type="text/javascript"&gt;&lt;/script&gt;
manage it, I developed a small utility that analyzes a CSS file and allows you to select which images you want to embed. You can also preselect them by adding a comment somewhere within your CSS declaration that says &lt;code&gt;/*embed*/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://johndyer.name/image.axd?picture=2010%2f1%2fCSSembedder.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h3&gt;What It Does&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Finds all image URLs in your CSS file (note: no CSS3 multiples or borders)&lt;/li&gt;
&lt;li&gt;Shows the size difference between the image and the base64 string&lt;/li&gt;
&lt;li&gt;Shows the final size output size and the GZipped size for comparison to the original&lt;/li&gt;
&lt;li&gt;Removes comments and whitespace if you want&lt;/li&gt;
&lt;li&gt;Creates a new base64 stylesheet and a IE6/7 stylesheet with references to the original image&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Download&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Download &lt;a href="http://johndyer.name/file.axd?file=2010%2f1%2fCssImageEmbedder.zip"&gt;CssImageEmbedder.zip (9.55 kb)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Requires: .NET Framework (sorry! It was just faster than doing it in AIR)&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/n85beg_SItc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/n85beg_SItc/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2010/01/26/Optimizing-CSS-with-Base64-Embedded-Images-with-Bonus-Utility.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=ad366e41-7b6b-4ff2-8178-0897d216e5ee</guid>
      <pubDate>Tue, 26 Jan 2010 09:42:00 -0500</pubDate>
      <category>Code Lab</category>
      <category>Technology</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=ad366e41-7b6b-4ff2-8178-0897d216e5ee</pingback:target>
      <slash:comments>8</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=ad366e41-7b6b-4ff2-8178-0897d216e5ee</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2010/01/26/Optimizing-CSS-with-Base64-Embedded-Images-with-Bonus-Utility.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=ad366e41-7b6b-4ff2-8178-0897d216e5ee</wfw:commentRss>
    <enclosure url="http://johndyer.name/file.axd?file=2010%2f1%2fCssImageEmbedder.zip" length="9778" type="application/octet-stream" /><media:content url="http://johndyer.name/file.axd?file=2010%2f1%2fCssImageEmbedder.zip" fileSize="9778" type="application/octet-stream" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> &amp;nbsp; As I design a new site (current site | early demo of new site), I am working through what combination of technologies (CDN, sprites, caching, gzipping, etc.) we want to use to optimize it. One tool I&amp;rsquo;m looking at is embedding images in CSS w</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> &amp;nbsp; As I design a new site (current site | early demo of new site), I am working through what combination of technologies (CDN, sprites, caching, gzipping, etc.) we want to use to optimize it. One tool I&amp;rsquo;m looking at is embedding images in CSS with base64 strings. Instead of the browser needing to make several calls, one for the CSS file and then one for each image, base64 embedding means that all of the images are embedded within the CSS file itself. It&amp;rsquo;s great for small images or images that only show up on :hover or mouseover and you don't want there to be any delay in the image appearing. Here&amp;rsquo;s what it looks like: Normal CSS .myclass { width: 45px; background: transparent url(myimage.jpg) top left no-repeat; } CSS with Base64 Embedded Image .myclass { width: 45px; background: transparent url(data:image/png;base64,LONG-STRING-OF-BASE64-TEXT) top left no-repeat; } Problems with Base64 Works in all browsers except IE6 and IE7. Solution: use a conditional comments to give IE6/7 a stylesheet that still references the images. Base64 is bigger than real images: In my tests a base64 encoded string image is somewhere around 150% the size of a regular image. This means it&amp;rsquo;s unusable for large images. Hard to manage: If you change the image, you&amp;rsquo;ll need to reembed the base64 string. You also have to maitain a separate IE stylesheet. How to manage it To help figure out which images were worth embedded and help manage it, I developed a small utility that analyzes a CSS file and allows you to select which images you want to embed. You can also preselect them by adding a comment somewhere within your CSS declaration that says /*embed*/ What It Does Finds all image URLs in your CSS file (note: no CSS3 multiples or borders) Shows the size difference between the image and the base64 string Shows the final size output size and the GZipped size for comparison to the original Removes comments and whitespace if you want Creates a new base64 stylesheet and a IE6/7 stylesheet with references to the original image Download Download CssImageEmbedder.zip (9.55 kb) Requires: .NET Framework (sorry! It was just faster than doing it in AIR) </itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=ad366e41-7b6b-4ff2-8178-0897d216e5ee</feedburner:origLink></item>
    <item>
      <title>Refactoring the JavaScript Color Picker - Step 1: Clean up the HTML and CSS</title>
      <description>&lt;p&gt;On of the most popular posts on this blog was a &lt;a href="http://johndyer.name/post/2007/09/PhotoShop-like-JavaScript-Color-Picker.aspx"&gt;color picker&lt;/a&gt; (&lt;a href="http://johndyer.name/lab/colorpicker/"&gt;demo&lt;/a&gt;) I created about 4 years ago and then released 2 years ago. It was based on the &lt;a href="http://prototypejs.com/"&gt;Prototype&lt;/a&gt; library which at the time was the only major mega-JavaScript library. Since then, others have ported the color picker to jQuery, MooTools, YUI, and other libraries, and it's popularity can be seen by searching for "&lt;a href="http://www.google.com/search?q=javascript+color+picker"&gt;javascript color picker&lt;/a&gt;" on Google.&lt;/p&gt;
&lt;h3&gt;The Original Color Picker (mimics Photoshop)&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://johndyer.name/lab/colorpicker/"&gt;&lt;img src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/JavaScriptPhotoShopColorPicker_8D6/CropperCapture%5B11%5D_1.png" alt="Color Picker Example" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Rebuilding Goals&lt;br /&gt;&lt;/h3&gt;
&lt;p&gt;If the original color picker was popular, it was because of it's functionality, not so much pretty code. So, I'd like to rebuild the color picker with a few goals in mind:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Be library independent - I'll have to add a little bit of extra code for things like event management, but this will allow it to work for everyone.&lt;/li&gt;
&lt;li&gt;Small and fast - The original JavaScript isn't too slow, but the color picker uses lots of separate images (27!). Originally, I hid these inside a &amp;lt;div&amp;gt; so that the browser would keep them cached, but I'd like to combine them into a few sprites to speed up the load time.&lt;/li&gt;
&lt;li&gt;Clean up the HTML/CSS - The original has a lot of inline styles and unnecessary complexity, making it ugly and unwieldy.&lt;/li&gt;
&lt;li&gt;Clean up the JavaScript - The original code separated out some functionality which makes it harder to figure out what's going on. I plan bring these together, so that I have one class for color conversion, one class for slider functionality, and one class for the color picker. The new code will also include code to function as a plugin to the major existing libraries (jQuery, Prototype, Mootools, YUI, etc.).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first big step is to clean up the HTML and CSS. To get a feel for the old HTML/CSS, check out the &lt;a href="http://johndyer.name/lab/colorpicker/"&gt;version 1 example&lt;/a&gt; page. Here's what I've come up with so far:&lt;/p&gt;
&lt;h3&gt;Color Picker CSS&lt;/h3&gt;
&lt;p&gt;.color-picker&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { border: 0; padding: 0; margin: 0; font-family: Tahoma; font-size: 12px;}&lt;br /&gt;.color-picker table, .color-picker td&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { border: 0; margin: 0; padding: 0; vertical-align: top;}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;.color-picker label&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { margin: 4px 0; display: block;}&lt;br /&gt;.cp-container&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { position: relative; float: left; border: solid 1px #000; padding: 0px; }&lt;br /&gt;.cp-layer1, .cp-layer2, .cp-layer3, .cp-layer4&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { display: block; position: absolute; top: 0px; left: 0px; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;.cp-map&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { width: 256px; height: 256px; margin: 0px; }&lt;br /&gt;.cp-map div&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { width: 256px; height: 256px; position: absolute; top: 0; left: 0; background: transparent url(maps.png) 0px 0px no-repeat;}&lt;br /&gt;.cp-bar&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { width: 20px; height: 256px; margin: 0px 9px;}&lt;br /&gt;.cp-bar div&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { width: 20px; height: 256px; position: absolute; top: 0; left: 0; background: transparent url(bars.png) 0px 0px no-repeat;}&lt;br /&gt;.cp-preview&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { width: 60px; height: 60px; padding: 0px; margin: 0px; border: solid 1px #000; }&lt;br /&gt;.cp-hsv, .cp-rgb&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { width: 40px; }&lt;br /&gt;.cp-hex&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { width: 55px; }&lt;br /&gt;.cp-map-arrow&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { background: transparent url(map-arrow.gif) 0px 0px no-repeat; width: 40px; height: 9px; position: absolute;}&lt;br /&gt;.cp-bar-arrow&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { background: transparent url(bar-arrow.gif) 0px 0px no-repeat; width: 15px; height: 15px; position: absolute;}&lt;/p&gt;
&lt;h3&gt;Color Picker HTML&lt;/h3&gt;
&lt;p&gt;&amp;lt;div id="cp1" class="color-picker"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;table cellpadding="0"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-container cp-map"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-layer1"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-layer2"&amp;gt;&amp;lt;/div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-container cp-bar"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-layer1"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-layer2"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-layer3"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-layer4"&amp;gt;&amp;lt;/div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;table&amp;gt;&amp;lt;tbody&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td colspan="3"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-preview"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input type="radio" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;label&amp;gt;H:&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input class="cp-hsv" type="text" /&amp;gt; &amp;amp;#176;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input type="radio" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;label&amp;gt;S:&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input class="cp-hsv" type="text" /&amp;gt; %&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input type="radio" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;label&amp;gt;B:&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input class="cp-hsv" type="text" /&amp;gt; %&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input type="radio" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;label&amp;gt;R:&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input class="cp-rgb" type="text" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input type="radio" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;label&amp;gt;G:&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input class="cp-rgb" type="text" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input type="radio" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;label&amp;gt;B:&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input class="cp-rgb" type="text" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;#&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td colspan="2"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input class="cp-hex" type="text" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-map-arrow"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-slider-arrow"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3&gt;Cleanup Comments&lt;/h3&gt;
&lt;p&gt;To make it more readable, I've removed all the id attributes except for the single id on the containing div, taken out all inline styles, and moved the CSS to a separate file. I also changed the layers to &amp;lt;div&amp;gt; tags with background images instead of &amp;lt;img&amp;gt; tags. This may present some problems with IE6 opacity down the road, so I might need to change it back. I've also removed z-index values from the CSS to prevent problems with other JavaScript controls on the page. I was not careful with DOCTYPE in the past, but the new HTML and CSS should work in any DOCTYPE (I'll be using the HTML5 DOCTYPE in all the examples). Finally, the arrows are created using &amp;lt;div&amp;gt; that are inside the main block, which will make it easer to show and hide the entire color picker.&lt;/p&gt;
&lt;h3&gt;Bar Sprite&lt;br /&gt;&lt;/h3&gt;
&lt;p&gt;As a preview, I'm including the sprite for the value bar of the color picker. This combines 14 different bars into one 1.77KB file. Next time, we'll talk about memory consumption and sprites and see if the sprite usage is actually helpful.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://johndyer.name/file.axd?file=2009%2f11%2fbars.png" alt="new color bars sprite" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/5ykpKElEZJ4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/5ykpKElEZJ4/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2009/11/19/refactoring-the-javascript-color-picker-1-clean-up-the-html-and-css.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=3c1367a3-dffc-43c0-8c64-8071bb69f7a2</guid>
      <pubDate>Thu, 19 Nov 2009 11:03:00 -0500</pubDate>
      <category>JavaScript</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=3c1367a3-dffc-43c0-8c64-8071bb69f7a2</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=3c1367a3-dffc-43c0-8c64-8071bb69f7a2</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2009/11/19/refactoring-the-javascript-color-picker-1-clean-up-the-html-and-css.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=3c1367a3-dffc-43c0-8c64-8071bb69f7a2</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=3c1367a3-dffc-43c0-8c64-8071bb69f7a2</feedburner:origLink></item>
    <item>
      <title>HTML5 (XHTML5) Validation Schema and Intellisense for Visual Studio 2008</title>
      <description>&lt;p&gt;I've been playing around with HTML5 (&lt;a href="http://www.smashingmagazine.com/2009/07/16/html5-and-the-future-of-the-web/"&gt;nice intro at Smashing Magazine&lt;/a&gt;) for a &lt;a href="http://biblewebapp.com/"&gt;side project&lt;/a&gt;, and I wanted Visual Studio 2008 to stop telling me the new elements were not valid. So I created a new Validation Schema for Visual Studio 2008 that implements much of the HTML5 spec. I found some hints on &lt;a href="http://blogs.msdn.com/mikhailarkhipov/archive/2006/02/01/522614.aspx"&gt;how to do this in Visual Studio 2005&lt;/a&gt; and went from there. Here's a pic of it in action giving you the attributes of of the new &amp;lt;source&amp;gt; tag under a new &amp;lt;video&amp;gt; tag:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://johndyer.name/image.axd?picture=2009%2f7%2fhtml5-vs2008.gif" alt="" /&gt;&lt;/p&gt;
&lt;h3&gt;Readme.txt&lt;br /&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;There is a lot of confusion about HTML, XHTML, and mime-types. I've chose to go with a stricter XML-like syntax of closed tags and quoted attributes, rather than the looser HTML, so I called it "XHTML 5" although that doesn't really make it offically XHTML 5 until you do the rest of the research, work, and fun.&lt;/li&gt;
&lt;li&gt;This is not a 100% perfect implementation. There are bound to be different interpretations of what's "correct" HTML5 and &lt;a href="http://www.webmonkey.com/blog/HTML_5_Won_t_Be_Ready_Until_2022DOT_Yes__2022DOT"&gt;you have until 2022 to get it right&lt;/a&gt;, so please don't worry about it too much.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What's Finished&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;All the new elements in HTML5 have been added in the follow groupings          
&lt;ul&gt;
&lt;li&gt;structure: article, aside, footer, header, nav, section&lt;/li&gt;
&lt;li&gt;media: audio, video, source&lt;/li&gt;
&lt;li&gt;other: bb, canvas, command, datagrid, datalist, details, dialog, eventsource, figure, hgroup, keygen, mark, menu, meter, output, progress, time&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;When new elements have custom attributes (such as height and width for video, I've tried to add those)&lt;/li&gt;
&lt;li&gt;I've also changed a few things like not requiring the type attribute on script blocks and allowing meta tags to have a charset attribute&lt;/li&gt;
&lt;li&gt;I've begun adding HTML5 events (ondrag, onplay, etc.) but have not completed all of them&lt;/li&gt;
&lt;li&gt;I am not sure how to add HTML5 style data- attributes, so those won't validate yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;How to Use it&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://johndyer.name/file.axd?file=xhtml5.xsd"&gt;&lt;strong&gt;Download XHTML Validation Schema for Visual Studio 2008&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Save it to C:\Program Files\Microsoft Visual Studio 9.0\Common7\Packages\schemas\html\&lt;/li&gt;
&lt;li&gt;Add the following to the Registry:&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Packages\{1B437D20-F8FE-11D2-A6AE-00104BCC7269}\Schemas\&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;Schema 23&lt;/strong&gt;&lt;/span&gt;]&lt;br /&gt;"Friendly Name"="XHTML 5"&lt;br /&gt;"URI"="&lt;a href="http://schemas.microsoft.com/intellisense/ie7"&gt;http://schemas.microsoft.com/intellisense/xhtml5&lt;/a&gt;"&lt;br /&gt;"File"="html\\xhtml5.xsd"&lt;br /&gt;&lt;br /&gt;Note that you might need to change "Schema 23" to something else if you already have other non-default schemas installed. You just need to use the next available number in the list.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I hope you find it helpful. Please let me know if you end up using it and feel free to suggest updates or corrections.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/tDdGuGjmM1I" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/tDdGuGjmM1I/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2009/07/21/HTML5-XHTML5-Validation-Schema-for-Visual-Studio-2008.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=f12bd758-0b8d-4ff1-abc7-6ee9e5fcc5bc</guid>
      <pubDate>Tue, 21 Jul 2009 11:46:00 -0500</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=f12bd758-0b8d-4ff1-abc7-6ee9e5fcc5bc</pingback:target>
      <slash:comments>15</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=f12bd758-0b8d-4ff1-abc7-6ee9e5fcc5bc</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2009/07/21/HTML5-XHTML5-Validation-Schema-for-Visual-Studio-2008.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=f12bd758-0b8d-4ff1-abc7-6ee9e5fcc5bc</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=f12bd758-0b8d-4ff1-abc7-6ee9e5fcc5bc</feedburner:origLink></item>
    <item>
      <title>MVC Edit View Template Upgrades</title>
      <description>&lt;p&gt;I’m building a new LMS using ASP.NET MVC and I am making heavy use of the &lt;a href="http://haacked.com/archive/2009/01/31/t4-templates-in-asp.net-mvc.aspx"&gt;View templates&lt;/a&gt; added in RC1. (see: &lt;a href="http://blogs.msdn.com/webdevtools/archive/2009/01/29/t4-templates-a-quick-start-guide-for-asp-net-mvc-developers.aspx"&gt;T4 Templates: A Quick-Start Guide for ASP.NET MVC Developers&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;I made a few changes to the default template to allow (1) table rows and cells instead of &amp;lt;p&amp;gt; tags, (2)add spaced to “ProperyName” so it looks like “Property Name”, and (3) use reflection to determine the &amp;lt;input&amp;gt; type generated by the Html helper. For all string Properties, a normal &amp;lt;input type=”text” /&amp;gt; is still generated, but for Int32, I am generating a &amp;lt;select&amp;gt; and for Booleans, a &amp;lt;input type=”checkbox” /&amp;gt; since these are the normal fields I use for forms.&lt;/p&gt;  &lt;p&gt;For an object that looks like this&lt;/p&gt;  &lt;pre class="prettyprint"&gt;&lt;blockquote&gt;public class Person {&lt;br /&gt;   public string FullName { get; set; }&lt;br /&gt;   public bool IsActive { get; set; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;/pre&gt;

&lt;p&gt;The default Edit View looks like this:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&amp;lt;p&amp;gt;&lt;br /&gt;    &amp;lt;label for=&amp;quot;FullName&amp;quot;&amp;gt;FullName:&amp;lt;/label&amp;gt;&lt;br /&gt;    &amp;lt;%= Html.TextBox(&amp;quot;FullName&amp;quot;) %&amp;gt;&lt;br /&gt;    &amp;lt;%= Html.ValidationMessage(&amp;quot;FullName&amp;quot;, &amp;quot;*&amp;quot;) %&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;    &amp;lt;label for=&amp;quot;CampusID&amp;quot;&amp;gt;IsActive:&amp;lt;/label&amp;gt;&lt;br /&gt;    &amp;lt;%= Html.TextBox(&amp;quot;IsActive&amp;quot;) %&amp;gt;&lt;br /&gt;    &amp;lt;%= Html.ValidationMessage(&amp;quot;IsActive&amp;quot;, &amp;quot;*&amp;quot;) %&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;/pre&gt;

&lt;p&gt;Here's what I wanted the Edit View to look like:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td class=&amp;quot;form-title&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;FullName&amp;quot;&amp;gt;&lt;strong&gt;Full Name&lt;/strong&gt;&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td class=&amp;quot;form-input&amp;quot;&amp;gt;&amp;lt;%= Html.TextBox(&amp;quot;FullName&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td class=&amp;quot;form-val&amp;quot;&amp;gt;&amp;lt;%= Html.ValidationMessage(&amp;quot;FullName&amp;quot;, &amp;quot;*&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td class=&amp;quot;form-title&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;Password&amp;quot;&amp;gt;Is Active&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td class=&amp;quot;form-input&amp;quot;&amp;gt;&amp;lt;%= Html.&lt;strong&gt;CheckBox&lt;/strong&gt;(&amp;quot;IsActive&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td class=&amp;quot;form-val&amp;quot;&amp;gt;&amp;lt;%= Html.ValidationMessage(&amp;quot;IsActive&amp;quot;, &amp;quot;*&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Here’s how I handled the different property types&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="2" width="442"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" width="132"&gt;&lt;strong&gt;Property Type&lt;/strong&gt;&lt;/td&gt;

      &lt;td valign="top" width="125"&gt;&lt;strong&gt;Html Helper&lt;/strong&gt;&lt;/td&gt;

      &lt;td valign="top" width="183"&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="132"&gt;String (and others)&lt;/td&gt;

      &lt;td valign="top" width="125"&gt;Html.TextBox&lt;/td&gt;

      &lt;td valign="top" width="183"&gt;&amp;lt;input type=&amp;quot;text&amp;quot; /&amp;gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="132"&gt;Boolean&lt;/td&gt;

      &lt;td valign="top" width="125"&gt;Html.CheckBox&lt;/td&gt;

      &lt;td valign="top" width="183"&gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; /&amp;gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="132"&gt;Int32&lt;/td&gt;

      &lt;td valign="top" width="125"&gt;Html.DropDownList&lt;/td&gt;

      &lt;td valign="top" width="183"&gt;&amp;lt;select&amp;gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;You can modify this easily in the code below to put whatever controls you want for each property type. To use the template, just create a folder in your project called CodeTemplates\AddView:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://johndyer.name/image.axd?picture=image.png" width="191" height="267" /&gt; &lt;/p&gt;

&lt;p&gt;Here is my are the parts of Edit.tt file that I updated:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&amp;lt;#
    &lt;br /&gt;if(!String.IsNullOrEmpty(mvcHost.ViewDataTypeGenericString)) {    &lt;br /&gt;    List&amp;lt;PropertyInfo&amp;gt; properties = new List&amp;lt;PropertyInfo&amp;gt;();
&lt;br /&gt;    FilterProperties(mvcHost.ViewDataType, properties);  &lt;br /&gt;#&amp;gt;    &lt;br /&gt;    &amp;lt;%= Html.ValidationSummary() %&amp;gt;     &amp;lt;% using (Html.BeginForm()) {%&amp;gt; &lt;p&gt;&lt;/p&gt;
&lt;br /&gt;        &amp;lt;table class=&amp;quot;form-admin&amp;quot;&amp;gt;    &lt;br /&gt;&amp;lt;#
&lt;br /&gt;    foreach(PropertyInfo pi in properties) {    &lt;br /&gt;#&amp;gt;
&lt;br /&gt;            &amp;lt;tr&amp;gt;    &lt;br /&gt;                &amp;lt;td class=&amp;quot;form-title&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;&amp;lt;#= pi.Name #&amp;gt;&amp;quot;&amp;gt;&amp;lt;#= FormatLabel(pi.Name) #&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;
&lt;br /&gt;                &amp;lt;td class=&amp;quot;form-input&amp;quot;&amp;gt;&amp;lt;%= Html.&amp;lt;#= GetInputType(pi) #&amp;gt;(&amp;quot;&amp;lt;#= pi.Name #&amp;gt;&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt;    &lt;br /&gt;                &amp;lt;td class=&amp;quot;form-val&amp;quot;&amp;gt;&amp;lt;%= Html.ValidationMessage(&amp;quot;&amp;lt;#= pi.Name #&amp;gt;&amp;quot;, &amp;quot;*&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt;
&lt;br /&gt;            &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;#    &lt;br /&gt;    }    &lt;br /&gt;#&amp;gt;  &lt;br /&gt;        &amp;lt;/table&amp;gt;  &lt;br /&gt;        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Save&amp;quot; /&amp;gt;    &lt;br /&gt;    &amp;lt;% } %&amp;gt; 
&lt;p&gt;&lt;/p&gt;&lt;br /&gt;    &amp;lt;div&amp;gt;   &lt;br /&gt;        &amp;lt;%=Html.ActionLink(&amp;quot;Back to List&amp;quot;, &amp;quot;Index&amp;quot;) %&amp;gt;    &lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;#+
    &lt;br /&gt;public string FormatLabel(string label) {    &lt;br /&gt;    return System.Text.RegularExpressions.Regex.Replace(label, &amp;quot;([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))&amp;quot;, &amp;quot;$1 &amp;quot;);
&lt;br /&gt;} &lt;p&gt;&lt;/p&gt;  &lt;br /&gt;public string GetInputType(PropertyInfo pi) {    &lt;br /&gt;    switch (pi.PropertyType.ToString()) {
    &lt;br /&gt;        case &amp;quot;System.Int32&amp;quot;:    &lt;br /&gt;        case &amp;quot;System.Int64&amp;quot;:    &lt;br /&gt;            return &amp;quot;DropDownList&amp;quot;;
    &lt;br /&gt;        case &amp;quot;System.Boolean&amp;quot;:    &lt;br /&gt;            return &amp;quot;CheckBox&amp;quot;;
    &lt;br /&gt;        case &amp;quot;System.String&amp;quot;:    &lt;br /&gt;        default:    &lt;br /&gt;            return &amp;quot;TextBox&amp;quot;;    &lt;br /&gt;    }    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public void FilterProperties(Type type, List&amp;lt;PropertyInfo&amp;gt; properties) {     if(type != null) {    &lt;br /&gt;        PropertyInfo[] publicProperties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); 
  &lt;p&gt;&lt;/p&gt;&lt;br /&gt;        foreach (PropertyInfo pi in publicProperties)    &lt;br /&gt;        {    &lt;br /&gt;            if (IsBindableType(pi.PropertyType) &amp;amp;&amp;amp; pi.CanRead &amp;amp;&amp;amp; pi.CanWrite)    &lt;br /&gt;            {    &lt;br /&gt;                properties.Add(pi);    &lt;br /&gt;            }    &lt;br /&gt;        }    &lt;br /&gt;    }    &lt;br /&gt;} 
&lt;br /&gt;#&amp;gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Hope this is helpful to you!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/8u9E1qGndcI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/8u9E1qGndcI/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2009/03/11/MVC-Edit-View-Template-Upgrades.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=850950d3-72d6-47e2-885e-40cffbbb6d23</guid>
      <pubDate>Wed, 11 Mar 2009 13:11:23 -0500</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=850950d3-72d6-47e2-885e-40cffbbb6d23</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=850950d3-72d6-47e2-885e-40cffbbb6d23</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2009/03/11/MVC-Edit-View-Template-Upgrades.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=850950d3-72d6-47e2-885e-40cffbbb6d23</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=850950d3-72d6-47e2-885e-40cffbbb6d23</feedburner:origLink></item>
    <item>
      <title>iTunesU Manager App Source Released</title>
      <description>&lt;p&gt;
A while back, I &lt;a href="http://johndyer.name/admin/pages/johndyer.name/post/2008/07/18/iTunesU-Site-Utility-in-C-(NET).aspx"&gt;created an iTunesU Manager application&lt;/a&gt; for &lt;a href="http://www.dts.edu/itunesu"&gt;DTS&amp;#39;s iTunesU site&lt;/a&gt;, and I finally got around to putting up the source code and executables. Below is a screenshot of the app and links to the Google code repository. The app requires .NET 2.0 (it&amp;#39;s written in C#) and an iTunesU administrative account. 
&lt;/p&gt;
&lt;img src="http://johndyer.name/image.axd?picture=itunesumanager.png" alt="iTunesU Manager" /&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://code.google.com/p/itunesumanager/"&gt;iTunesU Manager on Google Code&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://itunesumanager.googlecode.com/files/iTunesUManager-1-0.zip"&gt;Download iTunesU Manager 1.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/LlouFi9fA0I" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/LlouFi9fA0I/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2009/02/20/iTunesU-Manager-App-Source-Released.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=a0946430-50ae-4b1a-b4b7-45e961db15fe</guid>
      <pubDate>Fri, 20 Feb 2009 14:30:00 -0500</pubDate>
      <category>Code Lab</category>
      <category>Dallas Seminary</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=a0946430-50ae-4b1a-b4b7-45e961db15fe</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=a0946430-50ae-4b1a-b4b7-45e961db15fe</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2009/02/20/iTunesU-Manager-App-Source-Released.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=a0946430-50ae-4b1a-b4b7-45e961db15fe</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=a0946430-50ae-4b1a-b4b7-45e961db15fe</feedburner:origLink></item>
    <item>
      <title>Nested Comments for BlogEngine.NET</title>
      <description>&lt;p&gt;There are some great changes coming for &lt;a href="http://www.dotnetblogengine.net/"&gt;BlogEngine.NET&lt;/a&gt; 1.5.0.0, and one of them is nested comments! I checked in the changes to &lt;a href="http://www.codeplex.com/blogengine"&gt;Codeplex&lt;/a&gt; just last night, and I’ve implemented them here as a demo while we hammer out the final details. &lt;/p&gt;  &lt;p&gt;Nested (or threaded) comments have been added to a lot of blog platforms lately (including WordPress 2.7), and it is a major feature of comment plugins like &lt;a href="http://www.disqus.com/"&gt;Disqus&lt;/a&gt; and &lt;a href="http://www.intensedebate.com/"&gt;Intense Debate&lt;/a&gt;. I personally think threaded comments make longer posts with lots of comments make a lot more sense. &lt;/p&gt;  &lt;p&gt;Here’s an example of how a the comments in a recent post of mine make a lot more sense after turning on nesting. Since I responded in bursts to comments, they were out of order, but with nesting you can see that my comment (in dark brown) are now contextually nested and make much more sense. (Note: To make this work, I had to go back and manually add the “parentid” attribute to my comments to make them nested.) &lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="550"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="275"&gt;         &lt;h3&gt;Before (not nested)&lt;/h3&gt;       &lt;/td&gt;        &lt;td valign="top" width="275"&gt;         &lt;h3&gt;After (nested)&lt;/h3&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="275"&gt;&lt;a href="http://johndyer.name/image.axd?picture=commments-flat-full.jpg"&gt;&lt;img title="Not nested" border="0" alt="Not nested" src="http://johndyer.name/image.axd?picture=comments-flat-thumb.jpg" width="150" /&gt;&lt;/a&gt; &lt;/td&gt;        &lt;td valign="top" width="275"&gt;&lt;a href="http://johndyer.name/image.axd?picture=commments-threaded-full.jpg"&gt;&lt;img title="Nested" border="0" alt="Not Nested" src="http://johndyer.name/image.axd?picture=comments-threaded-thumb.jpg" width="150" /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;If you want to try it out, you can try it on this post or download the latest check-in from Codeplex. &lt;em&gt;Just be warned that this isn’t the final release&lt;/em&gt;. There may be some quirks in the JavaScript. &lt;/p&gt;  &lt;p&gt;To add nesting to your existing themes, you’ll need to add the following code (marked by HTML comments) from the Standard Theme: &lt;/p&gt;  &lt;pre class="prettyprint"&gt;&lt;p&gt;&amp;lt;div id=&amp;quot;id_&amp;lt;%=Comment.Id %&amp;gt;&amp;quot; class=&amp;quot;vcard comment&amp;lt;%= Post.Author.Equals(Comment.Author, StringComparison.OrdinalIgnoreCase) ? &amp;quot; self&amp;quot; : &amp;quot;&amp;quot; %&amp;gt;&amp;quot;&amp;gt;  &lt;br /&gt;  &amp;lt;p class=&amp;quot;date&amp;quot;&amp;gt;&amp;lt;%= Comment.DateCreated %&amp;gt; &amp;lt;a href=&amp;quot;#id_&amp;lt;%=Comment.Id %&amp;gt;&amp;quot;&amp;gt;#&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p class=&amp;quot;gravatar&amp;quot;&amp;gt;&amp;lt;%= Gravatar(80)%&amp;gt;&amp;lt;/p&amp;gt;  &lt;br /&gt;  &amp;lt;p class=&amp;quot;content&amp;quot;&amp;gt;&amp;lt;%= Text %&amp;gt;&amp;lt;/p&amp;gt;  &lt;br /&gt;  &amp;lt;p class=&amp;quot;author&amp;quot;&amp;gt;
    &amp;lt;%= Comment.Website != null ? &amp;quot;&amp;lt;a href=\&amp;quot;&amp;quot; + Comment.Website + &amp;quot;\&amp;quot; class=\&amp;quot;url fn\&amp;quot;&amp;gt;&amp;quot; + Comment.Author + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;lt;span class=\&amp;quot;fn\&amp;quot;&amp;gt;&amp;quot; +Comment.Author + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot; %&amp;gt;&lt;br /&gt;    &amp;lt;%= Flag %&amp;gt;&lt;br /&gt;    &amp;lt;%= ((BlogEngine.Core.BlogSettings.Instance.IsCommentNestingEnabled &amp;amp;&amp;amp; Comment.IsApproved) ? &amp;quot; | &amp;quot; : &amp;quot;&amp;quot;) %&amp;gt;&lt;br /&gt;    &amp;lt;%= ReplyToLink %&amp;gt; &amp;lt;!—- add this for reply to links –&amp;gt;&lt;br /&gt;    &amp;lt;%= AdminLinks %&amp;gt;&lt;br /&gt;  &amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;!—- Start: threading –&amp;gt;&lt;br /&gt;&amp;lt;div class=&amp;quot;comment-replies&amp;quot; id=&amp;quot;replies_&amp;lt;%=Comment.Id %&amp;gt;&amp;quot; &amp;lt;%= (Comment.Comments.Count == 0) ? &amp;quot; style=\&amp;quot;display:none;\&amp;quot;&amp;quot; : &amp;quot;&amp;quot; %&amp;gt;&amp;gt;&lt;br /&gt;  &amp;lt;asp:PlaceHolder ID=&amp;quot;phSubComments&amp;quot; runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;!—- End: threading –&amp;gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;Hope you like it, and let me know if you implement it on your site! &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/87nvkswb0tI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/87nvkswb0tI/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2009/01/16/Nested-Comments-for-BlogEngineNET.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=eccff77c-3d24-47ca-96aa-af1c84738a3b</guid>
      <pubDate>Fri, 16 Jan 2009 12:03:00 -0500</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=eccff77c-3d24-47ca-96aa-af1c84738a3b</pingback:target>
      <slash:comments>16</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=eccff77c-3d24-47ca-96aa-af1c84738a3b</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2009/01/16/Nested-Comments-for-BlogEngineNET.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=eccff77c-3d24-47ca-96aa-af1c84738a3b</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=eccff77c-3d24-47ca-96aa-af1c84738a3b</feedburner:origLink></item>
    <item>
      <title>Everyone&amp;rsquo;s Going &amp;ldquo;HD&amp;rdquo; (Sort of)</title>
      <description>&lt;p&gt;Last week, &lt;a href="http://www.techcrunch.com/2008/12/05/did-youtube-just-turn-on-hd-for-real/"&gt;YouTube made big news by introducing “HD” video&lt;/a&gt;, thought it’s unclear what YouTube’s definition of “HD” is. The video is certainly high&lt;strong&gt;&lt;em&gt;er&lt;/em&gt;&lt;/strong&gt; definition, but it’s certainly not 720p or 1080p which is technically what HD is supposed to be. It might be 480p which is what &lt;a href="http://www.hulu.com/"&gt;Hulu.com&lt;/a&gt; does for their high quality streams (and is also what the Wii ouputs).&lt;/p&gt;  &lt;p&gt;At DTS, we also recently revamped our videos to be “HD” (in the high&lt;strong&gt;&lt;em&gt;er&lt;/em&gt;&lt;/strong&gt; definition sense), moving to 480p in most cases.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;For &lt;a href="http://www.dts.edu/media/chapel/"&gt;chapels&lt;/a&gt; and &lt;a href="http://www.dts.edu/media/profiles/"&gt;profiles of students and alumni&lt;/a&gt;, we have moved from RMTP streamed 426x240 FLV videos to progressively downloaded 640x360 MP4 (H.264) videos using Amazon S3 (and soon, CloudFront) for video. &lt;/li&gt;    &lt;li&gt;For &lt;a href="http://www.dts.edu/onlineed/"&gt;online education&lt;/a&gt; we moved from 320x240 streamed FLVs to 640x480 MP4s also from Amazon (c.f. &lt;a href="http://johndyer.name/post/2008/06/02/Online-Education-Player-Design-Considerations.aspx"&gt;previous post on online education player design&lt;/a&gt;).&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;We’ve also changed the player quite a bit. The old player had a lot of “chrome” around it and this new one is chromeless (ala Vimeo) and has the option to popout (similar to Hulu). Compare the old player below, with the new player showing two recent profiles, one of an alumnus and the other of a currents student who is also an NFL player.&lt;/p&gt;  &lt;h3&gt;Old player&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/EveryonesGoingHDSortof_AB19/image_2.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; border-right-width: 0px" height="350" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/EveryonesGoingHDSortof_AB19/image_thumb.png" width="492" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;New Embedded Player Samples&lt;/h3&gt;  &lt;p&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="640" height="360" id="dtsplayer"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="movie" value="http://media.dts.edu/embeddedplayer/?MediaItemID=7689a28b-ce17-4215-a0bc-eb7ebae1258f" /&gt;&lt;embed id="dtsplayer" width="640" height="360" allowfullscreen="true" allowscriptaccess="always" quality="high" name="dtsplayer" src="http://media.dts.edu/embeddedplayer/?MediaItemID=7689a28b-ce17-4215-a0bc-eb7ebae1258f" type="application/x-shockwave-flash" /&gt;&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="640" height="360" id="dtsplayer"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="movie" value="http://media.dts.edu/embeddedplayer/?MediaItemID=58ff0008-b980-4115-8efd-241b8099074e" /&gt;&lt;embed id="dtsplayer" width="640" height="360" allowfullscreen="true" allowscriptaccess="always" quality="high" name="dtsplayer" src="http://media.dts.edu/embeddedplayer/?MediaItemID=58ff0008-b980-4115-8efd-241b8099074e" type="application/x-shockwave-flash" /&gt;&lt;/object&gt;&lt;/p&gt;  &lt;h3&gt;Some Technical Information&lt;/h3&gt;  &lt;p&gt;This player needed to be able to play both MP4s for video and MP3s for audio. Unfortunately, Flash’s built-in video controls like PlayButton and Seekbar only work for video, and there is no way to use them for audio. I wrote a some wrapper classes that can handle both MP4/FLVs and MP3s and normalizes the event model so they can both be hooked to the same control UI. If we move back to streaming it should be easy to write another class for that and have it all “just work.”&lt;/p&gt;  &lt;p&gt;If anyone is interested in the source code, I’d be happy to publish it as an example of a Flash IDE AS3 video player that can also handle MP3s.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/LIwqVOfUmGk" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/LIwqVOfUmGk/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/12/08/everyones-going-hd-sort-of.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=943816ab-3f87-4955-84bb-f66f1455fd44</guid>
      <pubDate>Mon, 08 Dec 2008 13:10:10 -0500</pubDate>
      <category>Flash</category>
      <category>Dallas Seminary</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=943816ab-3f87-4955-84bb-f66f1455fd44</pingback:target>
      <slash:comments>16</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=943816ab-3f87-4955-84bb-f66f1455fd44</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/12/08/everyones-going-hd-sort-of.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=943816ab-3f87-4955-84bb-f66f1455fd44</wfw:commentRss>
    <enclosure url="http://media.dts.edu/embeddedplayer/?MediaItemID=7689a28b-ce17-4215-a0bc-eb7ebae1258f" length="93613" type="application/x-shockwave-flash" /><media:content url="http://media.dts.edu/embeddedplayer/?MediaItemID=7689a28b-ce17-4215-a0bc-eb7ebae1258f" fileSize="93613" type="application/x-shockwave-flash" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> Last week, YouTube made big news by introducing “HD” video, thought it’s unclear what YouTube’s definition of “HD” is. The video is certainly higher definition, but it’s certainly not 720p or 1080p which is technically what HD is supposed to be. It might</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> Last week, YouTube made big news by introducing “HD” video, thought it’s unclear what YouTube’s definition of “HD” is. The video is certainly higher definition, but it’s certainly not 720p or 1080p which is technically what HD is supposed to be. It might be 480p which is what Hulu.com does for their high quality streams (and is also what the Wii ouputs). At DTS, we also recently revamped our videos to be “HD” (in the higher definition sense), moving to 480p in most cases. For chapels and profiles of students and alumni, we have moved from RMTP streamed 426x240 FLV videos to progressively downloaded 640x360 MP4 (H.264) videos using Amazon S3 (and soon, CloudFront) for video. For online education we moved from 320x240 streamed FLVs to 640x480 MP4s also from Amazon (c.f. previous post on online education player design). We’ve also changed the player quite a bit. The old player had a lot of “chrome” around it and this new one is chromeless (ala Vimeo) and has the option to popout (similar to Hulu). Compare the old player below, with the new player showing two recent profiles, one of an alumnus and the other of a currents student who is also an NFL player. Old player New Embedded Player Samples Some Technical Information This player needed to be able to play both MP4s for video and MP3s for audio. Unfortunately, Flash’s built-in video controls like PlayButton and Seekbar only work for video, and there is no way to use them for audio. I wrote a some wrapper classes that can handle both MP4/FLVs and MP3s and normalizes the event model so they can both be hooked to the same control UI. If we move back to streaming it should be easy to write another class for that and have it all “just work.” If anyone is interested in the source code, I’d be happy to publish it as an example of a Flash IDE AS3 video player that can also handle MP3s.</itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=943816ab-3f87-4955-84bb-f66f1455fd44</feedburner:origLink></item>
    <item>
      <title>Technology Blog</title>
      <description>&lt;p&gt;I would like to keep this blog focused on technical developments and code samples, but a few recent posts have been showing I am growing in my interest for the philosophy behind technology. To keep the two interests separate, I’ve started a separate blog called&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://www.donteatthefruit.com"&gt;www.donteatthefruit.com&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;It will be aimed at discussing the influence of technology on society and human relationships. Right now, I’m looking at Neil Postman’s “Five Things You Need to Know about Technological Change” as related to churches. &lt;/p&gt;  &lt;p&gt;Stay tuned to this blog for more technical developments!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/NT2SxC9ZQXc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/NT2SxC9ZQXc/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/12/08/dont-eat-the-fruit.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=73396d05-9d42-4e45-89f2-a7a6509b5adb</guid>
      <pubDate>Mon, 08 Dec 2008 12:56:29 -0500</pubDate>
      <category>Off Topic</category>
      <category>Personal</category>
      <category>Technology</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=73396d05-9d42-4e45-89f2-a7a6509b5adb</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=73396d05-9d42-4e45-89f2-a7a6509b5adb</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/12/08/dont-eat-the-fruit.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=73396d05-9d42-4e45-89f2-a7a6509b5adb</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=73396d05-9d42-4e45-89f2-a7a6509b5adb</feedburner:origLink></item>
    <item>
      <title>PNG transparency in IE6 (without JavaScript)</title>
      <description>&lt;p&gt;As most of us know IE6 does not support PNGs with alpha transparency. We recently updated &lt;a href="http://www.dts.edu/"&gt;DTS’s site&lt;/a&gt; with some popups that have a drop shadow using PNG-24 images with alpha transparency. Here’s how it looks in IE6 compared to any modern browser (FF, IE7, Opera, Safari, Chrome, etc.). Notice the nasty blue border.&lt;/p&gt;  &lt;h3&gt;PNG-32 (problems in IE6)&lt;/h3&gt;  &lt;table cellspacing="0" cellpadding="2" width="600" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="300"&gt;         &lt;p align="center"&gt;IE6           &lt;br /&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_4.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="203" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_1.png" width="274" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="300"&gt;         &lt;p align="center"&gt;Correct Display           &lt;br /&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_6.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="209" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_2.png" width="267" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;I wish we could ignore IE6 users, but around 20% of our traffic still hasn’t upgraded, so we have to make it work for them. There are tons of &lt;a href="www.twinhelix.com/css/iepngfix/"&gt;JavaScript&lt;/a&gt; and &lt;a href="http://support.microsoft.com/kb/294714"&gt;CSS hacks&lt;/a&gt; out there to get IE6 to display PNGs with alpha transparency correctly, but we’re trying to avoid hacks whenever possible so as to not break things in the future. Also IE6’s filter technology can cause other problems. To fix this, I found a sweet “non-hack” solution on &lt;a href="http://www.sitepoint.com/blogs/2007/09/18/png8-the-clear-winner/"&gt;sitepoint which recommends using PNG-8 instead of PNG-24&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;To summarize the &lt;a href="http://en.wikipedia.org/wiki/Portable_Network_Graphics"&gt;article on PNG-8 and PNG-32&lt;/a&gt;.&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="600" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="300"&gt;&lt;strong&gt;PNG-32&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="300"&gt;&lt;strong&gt;PNG-8&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="300"&gt;16.7 million colors (like a JPEG)&lt;/td&gt;        &lt;td valign="top" width="300"&gt;256 colors (like a GIF)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="300"&gt;alpha transparency, not just indexed (like GIF)&lt;/td&gt;        &lt;td valign="top" width="300"&gt;alpha transparency (just like PNG-32)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="300"&gt;doesn’t work in IE6&lt;/td&gt;        &lt;td valign="top" width="300"&gt;works in IE6 like a GIF (indexed transparency)&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;PNG-8 with alpha transparency (IE6 works, pretty much)&lt;/h3&gt;  &lt;p&gt;Here’s what the PNG8 looks like in IE6 on our site. Notice that the drop shadow is missing, but the transparency still remains.&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="602" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="300"&gt;         &lt;p align="center"&gt;IE6           &lt;br /&gt;&amp;#160;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_8.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="198" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_3.png" width="280" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="300"&gt;         &lt;p align="center"&gt;Correct Display           &lt;br /&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_6.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="209" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_2.png" width="266" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Everything “works” for IE6 users even thought it’s a slightly downgraded experience since the shadow is missing. For us, this is preferable to using JavaScript or CSS hacks that could cause other problems with animation. Since this is a image that only needs 256 colors, the PNG-8 is the perfect solution that is win-win-win.&lt;/p&gt;  &lt;h3&gt;How to make Alpha PNG-8 Images&lt;/h3&gt;  &lt;p&gt;The problem with all of this is that there is only one program that can make this specific kind of PNG-8 – Adobe Fireworks. Photoshop can’t do it, and I’m not sure if any other graphics programs can either. Here’s a step by step for making the PNG-8&lt;/p&gt;  &lt;h4&gt;1. Open the PNG-32 (or photoshop file)&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_14.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="321" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_6.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;2. Change the Image Type to “PNG 8”&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_18.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="321" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_8.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;3. Change to “Alpha Transparency”, then click the “Rebuild” button &lt;/h4&gt;  &lt;p&gt;Now you will see the new color palette with alpha colors. IE6 will only display the solid colors, not the fully transparent (upper left) or semi-transparent (the three with inset clear boxes).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_20.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="321" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_9.png" width="504" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_12.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="321" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_5.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;4. Chose File-Export to save the PNG-8&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_10.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="316" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_4.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And that’s it. It takes a little more time but has made our development easier and provides a more stable experience for users.&lt;/p&gt;  &lt;p&gt;Sources&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.sitepoint.com/blogs/2007/09/18/png8-the-clear-winner/"&gt;Sitepoint: PNG8 – The Clear Winner&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="www.sitepoint.com/blogs/2008/03/20/making-ie6-friendly-png8-images/"&gt;Sitepoint: Making ‘IE6-friendly’ PNG8 images&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/Rojy80187FQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/Rojy80187FQ/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/12/02/png-transparency-in-ie6-with-png8.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=6992ed09-1b72-498a-8f53-ba0323cb0ec3</guid>
      <pubDate>Tue, 02 Dec 2008 17:35:30 -0500</pubDate>
      <category>Design</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=6992ed09-1b72-498a-8f53-ba0323cb0ec3</pingback:target>
      <slash:comments>8</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=6992ed09-1b72-498a-8f53-ba0323cb0ec3</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/12/02/png-transparency-in-ie6-with-png8.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=6992ed09-1b72-498a-8f53-ba0323cb0ec3</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=6992ed09-1b72-498a-8f53-ba0323cb0ec3</feedburner:origLink></item>
    <item>
      <title>Wii + Flash + Papervision3D + C# = Alumni World Map</title>
      <description>&lt;p&gt;The 2008 class gift for &lt;a href="http://www.dts.edu/"&gt;Dallas Seminary&lt;/a&gt; is supposed to be a large flat screen with a 3D world that shows where in the world DTS alumni are serving. The requirements were:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;The target OS is still unknown and I haven't done much native Windows or Mac 3D programming. This leads me to use Papervision in Flash which I know and is very easy to use.  &lt;li&gt;The data needs to be easily updatable. Rather than use a database, I built a flat file using a quick C# app that plots alumni by state and country and geocodes their location.  &lt;li&gt;At DTS, the Admissions and Alumni offices are nearby, so the application needs to be interesting to Admissions. Ever since my sweet wife got me a Nintendo Wii a few months ago, I've wanted an excuse to program with it. For this project I thought, What's more fun and interesting than controlling the globe with a Nintendo Wii controller?&lt;/li&gt;&lt;/ol&gt; &lt;h3&gt;Video Demo&lt;/h3&gt; &lt;p&gt;Here is a (low quality) video of an early version of the project that gives you an idea of what it's supposed to accomplish and look like. The first few seconds use mouse navigation, then it switches to WiiMote navigation.&lt;/p&gt; &lt;p&gt;&lt;div id="wiiflashworld_container" style="width:480px;height:380px;" class="flashVideo"&gt;
	
	&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" 
	   codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" 
	   width="480" height="380" id="wiiflashworld_obj" align="middle" flashvars="autostart=false&amp;file=http://johndyer.name/flashvideo/wiiflashworld.mp4&amp;image=http://johndyer.name/flashvideo/wiiflashworld.jpg"&gt;
	&lt;param name="allowScriptAccess" value="sameDomain" /&gt;
	&lt;param name="movie" value="http://johndyer.name/flashvideo/flvplayer.swf" /&gt;
	&lt;param name="quality" value="high" /&gt;
	&lt;param name="bgcolor" value="#ffffff" /&gt;
	&lt;embed src="http://johndyer.name/flashvideo/flvplayer.swf" quality="high" bgcolor="#ffffff" width="480" 
	   height="380" name="mymovie" align="middle" allowScriptAccess="sameDomain" 
	   flashvars="autostart=false&amp;file=http://johndyer.name/flashvideo/wiiflashworld.mp4&amp;image=http://johndyer.name/flashvideo/wiiflashworld.jpg"
	   type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" /&gt;
	&lt;/object&gt;						
							&lt;/div&gt;&lt;p&gt;&lt;a href="http://johndyer.name/flashvideo/wiiflashworld.mp4"&gt;wiiflashworld.mp4&lt;/a&gt;&lt;/p&gt;&lt;/p&gt; &lt;h3&gt;Live Demo&lt;/h3&gt; &lt;p&gt;To see a live demo, click the following image. If you want to control using a WiiMote, do the following. (1) connect your WiiMote to a PC via bluetooth. (2) Download the &lt;a href="http://wiiflash.googlecode.com/files/WiiFlash%20Package%200.4.2.zip"&gt;WiiFlash 0.4 package&lt;/a&gt; (3) run the included WiiFlash Server, (4) refresh the demo page page, (5) click the "Home" button the WiiMote to toggle controlling via mouse or WiiMote.&lt;/p&gt; &lt;p&gt;&lt;a href="http://johndyer.name/lab/pv3d/alumniglobe/"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="354" alt="Alumni World Globe" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/WiiFlashPapervision3DCAlumniWorldMap_D8D6/image_3.png" width="484" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Libraries Used&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://code.google.com/p/papervision3d/"&gt;Papervision3D&lt;/a&gt;  &lt;li&gt;&lt;a href="http://code.google.com/p/tweener/"&gt;Tweener&lt;/a&gt;  &lt;li&gt;&lt;a href="http://code.google.com/p/wiiflash/"&gt;WiiFlash&lt;/a&gt;  &lt;li&gt;Also thanks to &lt;a href="http://udon.nudoru.com/2008/02/26/wiiflash-tip-2-smoothing-out-the-edges/"&gt;this tip on WiiMote data&lt;/a&gt; and &lt;a href="http://www.adobe.com/newsletters/edge/june2008/articles/article2/"&gt;this tip on Papervision geocoding&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;All the tools for this project have been around for almost a year, so nothing is particularly cutting edge, but the mashup and purpose are pretty unique and really fun. Hopefully, playing with the WiiMote will be as fun as actually viewing the map, making the entire experience for prospective students really positive.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/sK-LpJyy4R0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/sK-LpJyy4R0/post.aspx</link><enclosure url="http://johndyer.name/flashvideo/wiiflashworld.mp4" length="1952110" type="video/mp4" /><author>johndyer@gmail.com</author><comments>http://johndyer.name/post/2008/09/15/Wii-2b-Flash-2b-Papervision3D-2b-C-3d-Alumni-World-Map.aspx#comment</comments><guid isPermaLink="false">http://johndyer.name/post.aspx?id=ef414118-eaae-4630-af24-25ce677ba463</guid><pubDate>Mon, 15 Sep 2008 16:37:40 -0500</pubDate><category>Code Lab</category><category>Dallas Seminary</category><category>Flash</category><dc:publisher>John Dyer</dc:publisher><pingback:server>http://johndyer.name/pingback.axd</pingback:server><pingback:target>http://johndyer.name/post.aspx?id=ef414118-eaae-4630-af24-25ce677ba463</pingback:target><slash:comments>5</slash:comments><trackback:ping>http://johndyer.name/trackback.axd?id=ef414118-eaae-4630-af24-25ce677ba463</trackback:ping><wfw:comment>http://johndyer.name/post/2008/09/15/Wii-2b-Flash-2b-Papervision3D-2b-C-3d-Alumni-World-Map.aspx#comment</wfw:comment><wfw:commentRss>http://johndyer.name/syndication.axd?post=ef414118-eaae-4630-af24-25ce677ba463</wfw:commentRss><media:content url="http://johndyer.name/flashvideo/wiiflashworld.mp4" fileSize="1952110" type="video/mp4" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> The 2008 class gift for Dallas Seminary is supposed to be a large flat screen with a 3D world that shows where in the world DTS alumni are serving. The requirements were: The target OS is still unknown and I haven't done much native Windows or Mac 3D pro</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> The 2008 class gift for Dallas Seminary is supposed to be a large flat screen with a 3D world that shows where in the world DTS alumni are serving. The requirements were: The target OS is still unknown and I haven't done much native Windows or Mac 3D programming. This leads me to use Papervision in Flash which I know and is very easy to use. The data needs to be easily updatable. Rather than use a database, I built a flat file using a quick C# app that plots alumni by state and country and geocodes their location. At DTS, the Admissions and Alumni offices are nearby, so the application needs to be interesting to Admissions. Ever since my sweet wife got me a Nintendo Wii a few months ago, I've wanted an excuse to program with it. For this project I thought, What's more fun and interesting than controlling the globe with a Nintendo Wii controller? Video Demo Here is a (low quality) video of an early version of the project that gives you an idea of what it's supposed to accomplish and look like. The first few seconds use mouse navigation, then it switches to WiiMote navigation. wiiflashworld.mp4 Live Demo To see a live demo, click the following image. If you want to control using a WiiMote, do the following. (1) connect your WiiMote to a PC via bluetooth. (2) Download the WiiFlash 0.4 package (3) run the included WiiFlash Server, (4) refresh the demo page page, (5) click the "Home" button the WiiMote to toggle controlling via mouse or WiiMote. &amp;nbsp; Libraries Used Papervision3D Tweener WiiFlash Also thanks to this tip on WiiMote data and this tip on Papervision geocoding All the tools for this project have been around for almost a year, so nothing is particularly cutting edge, but the mashup and purpose are pretty unique and really fun. Hopefully, playing with the WiiMote will be as fun as actually viewing the map, making the entire experience for prospective students really positive.</itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=ef414118-eaae-4630-af24-25ce677ba463</feedburner:origLink></item>
    <item>
      <title>Papervision3D Bookshelf</title>
      <description>&lt;p&gt;
I &lt;a href="http://blog.bestcommentaries.com/post/2008/08/19/Site-quot3bLaunchquot3b.aspx"&gt;recently completed&lt;/a&gt; a website that catalogs books and in the development I wanted to make something really new. The backend is all ASP.NET, implementing &lt;a href="http://www.urlrewriting.net"&gt;UrlRewriter.NET&lt;/a&gt; and &lt;a href="http://ajaxpro.info/"&gt;AJAX.NET&lt;/a&gt; libraries. The frontend uses several JavaScript libraries including &lt;a href="http://www.prototypejs.org/"&gt;Prototype&lt;/a&gt;, &lt;a href="http://script.aculo.us/"&gt;Scriptaculous&lt;/a&gt;, and &lt;a href="http://tetlaw.id.au/view/blog/table-sorting-with-prototype/"&gt;Tablesort&lt;/a&gt;.
&lt;/p&gt;
 
&lt;p&gt;
The one really unique feature of the site is the 3D bookshelf built using &lt;a href="http://www.papervision3d.org/"&gt;Papervision3D&lt;/a&gt;. Just yesterday it was featured in blog &lt;a href="http://dailypv3d.wordpress.com/2008/08/20/ot-commentaries/trackback/"&gt;Daily PV3D&lt;/a&gt; as Papervision showcase.
&lt;/p&gt;
 
&lt;p&gt;
You can check out the book shelf here:
&lt;/p&gt;
 
&lt;blockquote&gt;
	 
	&lt;p&gt;
	&lt;a href="http://www.bestcommentaries.com/category/proverbs/" title="http://www.bestcommentaries.com/category/proverbs/"&gt;http://www.bestcommentaries.com/category/proverbs/&lt;/a&gt;
	&lt;/p&gt;
&lt;/blockquote&gt;
 
&lt;h4&gt;Screenshots&lt;/h4&gt; 
&lt;p&gt;
Plain bookshelf:
&lt;/p&gt;
 
&lt;p&gt;
&lt;a href="http://www.bestcommentaries.com/category/proverbs/"&gt;&lt;img style="border: 0px none " src="http://johndyer.name/file.axd?file=WindowsLiveWriter/Papervision3DBookshelf_EF95/image_11.png" border="0" alt="image" width="550" height="105" /&gt;&lt;/a&gt; 
&lt;/p&gt;
 
&lt;p&gt;
Mouse over the third book from the left:
&lt;/p&gt;
 
&lt;p&gt;
&lt;a href="http://www.bestcommentaries.com/category/proverbs/"&gt;&lt;img style="border: 0px none " src="http://johndyer.name/file.axd?file=WindowsLiveWriter/Papervision3DBookshelf_EF95/image_12.png" border="0" alt="image" width="550" height="105" /&gt;&lt;/a&gt;&amp;nbsp; 
&lt;/p&gt;
 
&lt;p&gt;
Book clicked:
&lt;/p&gt;
 
&lt;p&gt;
&lt;a href="http://www.bestcommentaries.com/category/proverbs/"&gt;&lt;img style="border: 0px none " src="http://johndyer.name/file.axd?file=WindowsLiveWriter/Papervision3DBookshelf_EF95/image_13.png" border="0" alt="image" width="550" height="105" /&gt;&lt;/a&gt; 
&lt;/p&gt;
 
&lt;h4&gt;How it works&lt;/h4&gt; 
&lt;p&gt;
Using Papervision, it&amp;#39;s relatively easy to make a 6 sided polygon (cube) and then wrap images around it. I use the physical dimensions of the actual book to size the cube. Then, for the cover, I use an image of the book and wrap the last pixel around the side since I don&amp;#39;t have spin images. I tried using System.Drawing code to write the author&amp;#39;s name on the spine, but I could never get it to look just right, so I left it out. The only real catch was that I needed to place the shelf on a different Papervision scene to prevent clipping problems. The bookshelf also interacts with an HTML table down below via Flash&amp;#39;s JavaScript &lt;a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/external/ExternalInterface.html"&gt;ExternalInterface&lt;/a&gt;.
&lt;/p&gt;
 
&lt;p&gt;
Since developing this 3D bookshelf, I found one site that does &lt;a href="http://www.boek.net/"&gt;something somewhat similar&lt;/a&gt;, but they have the spine images which I can&amp;#39;t afford to find for 1000s of books. Also, I think that the JavaScript interaction on mine might give it an edge.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/XIpOJV8G2M4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/XIpOJV8G2M4/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/08/20/Papervision3D-Bookshelf.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=220780a7-71c3-475d-b6ed-a4969bc2f14d</guid>
      <pubDate>Wed, 20 Aug 2008 18:02:00 -0500</pubDate>
      <category>ASP.NET</category>
      <category>Flash</category>
      <category>JavaScript</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=220780a7-71c3-475d-b6ed-a4969bc2f14d</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=220780a7-71c3-475d-b6ed-a4969bc2f14d</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/08/20/Papervision3D-Bookshelf.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=220780a7-71c3-475d-b6ed-a4969bc2f14d</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=220780a7-71c3-475d-b6ed-a4969bc2f14d</feedburner:origLink></item>
    <item>
      <title>Podcast on Technology</title>
      <description>&lt;p&gt;A few weeks ago, I was invited to speak on a podcast with the best possible name of all time:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;a href="http://www.pontificast.com"&gt;www.pontificast.com&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.pontificast.com/"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="60" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/PodcastonTechnology_E9BB/image_3.png" width="240" border="0"&gt;&lt;/a&gt; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Joey and Ryan (two smart, funny, creative guys) had me on for three episodes to discuss the effect of technology on people. I've been reading quite a few books and articles in this area lately, and concurrently such considerations have begun to move out of the academy and into the mainstream with articles such as &lt;a href="http://www.theatlantic.com/doc/200807/google"&gt;Nicholas Carr's article "Is Google Making Us Stupid?&lt;/a&gt;"&lt;/p&gt; &lt;p&gt;Here are links to the three episodes:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.pontificast.com/wp-trackback.php?p=7"&gt;The Medium is the Message&lt;/a&gt; (the effect of communication technologies on our thinking)  &lt;li&gt;&lt;a href="http://www.pontificast.com/wp-trackback.php?p=8"&gt;Technology's Effect on People&lt;/a&gt; (the speed of modern life takes its toll)  &lt;li&gt;&lt;a href="http://www.pontificast.com/wp-trackback.php?p=9"&gt;Technology and Relationships&lt;/a&gt; (the impact of facebook, twitter, and the rest)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Hope you enjoy!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/rZyMYQttYEY" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/rZyMYQttYEY/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/08/18/Podcast-on-Technology.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=5c9291ba-3415-403a-baaf-40bd937e4cc1</guid>
      <pubDate>Mon, 18 Aug 2008 17:27:57 -0500</pubDate>
      <category>Technology</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=5c9291ba-3415-403a-baaf-40bd937e4cc1</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=5c9291ba-3415-403a-baaf-40bd937e4cc1</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/08/18/Podcast-on-Technology.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=5c9291ba-3415-403a-baaf-40bd937e4cc1</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=5c9291ba-3415-403a-baaf-40bd937e4cc1</feedburner:origLink></item>
    <item>
      <title>Show Commenter's Latest Post: BlogEngine.NET Extension</title>
      <description>&lt;h4&gt;Background&lt;/h4&gt; &lt;p&gt;Over the past few weeks, I've seen a few WordPress blogs that pull in the last post from a commenter's website. I also saw a post from &lt;a href="http://blog.madskristensen.dk/"&gt;Mads&lt;/a&gt; about &lt;a href="http://blog.madskristensen.dk/post/Find-semantic-links-in-a-web-page.aspx"&gt;how to find semantic links on a webpage&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;So, I mashed his code together with some code from the BlogRoll control and created an extension that goes out and looks for RSS feeds at the commenter's website and then pulls in the latest post. [side note: I wish I could say, "a half hour later ... ", but it actually took me a while to get it to work...]&lt;/p&gt; &lt;p&gt;It all happens asynchronously, so if you comment on this post, it'll take a few seconds for it to show up. Then it will keep checking every so often for new posts.&lt;/p&gt; &lt;h4&gt;Example&lt;/h4&gt; &lt;p&gt;Last year, I posted a &lt;a href="http://johndyer.name/post/2007/09/26/PhotoShop-like-JavaScript-Color-Picker.aspx"&gt;JavaScript color picker&lt;/a&gt; and the post now has over 100 comments. Here's what it looks like with the extension running:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="569" alt="Comments with Recent Posts" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/ShowCommentersLatestPostBlo.NETExtension_F1CB/CropperCapture%5B62%5D_3.jpg" width="484" border="0"&gt; &lt;/p&gt; &lt;h4&gt;Download &amp;amp; Installation&lt;/h4&gt; &lt;ul&gt; &lt;li&gt;Download &lt;a href="file.axd?file=BE-CommentersLastPost.zip"&gt;Commenter's Latest Post Extension&lt;/a&gt;  &lt;li&gt;The last post is wrapped in the following class so you can style it: &lt;br&gt;&lt;pre class="prettyprint"&gt;&amp;lt;span class="commenterslastpost"&amp;gt;&amp;lt;/span&amp;gt;&lt;/pre&gt;
&lt;li&gt;Sometimes the ResolveLinks extension interferes with this, so you might want to add the following code around the foreach loop:&lt;br&gt;&lt;pre class="prettypring"&gt;if (e.Body.IndexOf("href=\"" + match.Value + "\"") == -1) { ... }&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Add a comment to this post to see it in action...&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/h3_7oUIks6I" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/h3_7oUIks6I/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/07/22/Show-Commenters-Latest-Post-BlogEngineNET-Extension.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=e1a45f16-9574-40c1-bc3e-afa72dcb7bec</guid>
      <pubDate>Tue, 22 Jul 2008 18:11:38 -0500</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=e1a45f16-9574-40c1-bc3e-afa72dcb7bec</pingback:target>
      <slash:comments>7</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=e1a45f16-9574-40c1-bc3e-afa72dcb7bec</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/07/22/Show-Commenters-Latest-Post-BlogEngineNET-Extension.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=e1a45f16-9574-40c1-bc3e-afa72dcb7bec</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=e1a45f16-9574-40c1-bc3e-afa72dcb7bec</feedburner:origLink></item>
    <item>
      <title>iTunesU Site Utility in C# (.NET)</title>
      <description>&lt;p&gt;In the process of moving &lt;a href="http://www.dts.edu/"&gt;Dallas Seminary&lt;/a&gt;'s content to &lt;a href="http://www.apple.com/education/itunesu/"&gt;iTunesU&lt;/a&gt;, I created a very simple application to edit site details via the Web Service API. It currently has the following functions:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Add/Edit/Delete Sections  &lt;li&gt;Add/Edit/Delete Courses  &lt;li&gt;Add/Edit/Delete Groups  &lt;li&gt;Upload/Edit/Delete Tracks &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;There are a lot of things it doesn't do, like let you edit themes or add images to courses, but it is really helping us get started. Here's a screenshot:&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="488" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/iTunesUSiteUtilityinC.NET_AD68/image7.png" width="484" border="0"&gt; &lt;/p&gt; &lt;p&gt;You just enter your shared secret and domain name, press "Load Site Tree" and then right click on the various items to add/edit/delete.&lt;/p&gt; &lt;p&gt;And here's what it looks like in iTunes.&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="396" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/iTunesUSiteUtilityinC.NET_AD68/image_6.png" width="484" border="0"&gt; &lt;/p&gt; &lt;h4&gt;Download &amp;amp; Installation&lt;/h4&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="file.axd?file=iTunesUUtility-0-1.zip"&gt;Download iTunes U Utility 0.1&lt;/a&gt;  &lt;li&gt;Requirements - Microsoft .NET Framework 2.0; PC only &lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;Links&lt;/h4&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.apple.com/support/itunes_u/"&gt;iTunesU Support Site&lt;/a&gt; - Here's where I started  &lt;li&gt;&lt;a href="http://itunesu-api-java.googlecode.com/"&gt;iTunesU Java Library&lt;/a&gt; - this is much more fully featured and documented than my code.  &lt;li&gt;&lt;a href="http://itunes.uic.edu/Woolamaloo.html"&gt;Woolamaloo&lt;/a&gt; - Rich Wolf's Mac tool which is much more fully featured than this tool. He also has a Windows app, but as far as I can tell it only lets you login. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;My source code is very rough, but it someone needs it, I'm happy to provide it. Also, our iTunes U site is not yet public, but it will be in a few weeks.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/ixNMNwwHMTU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/ixNMNwwHMTU/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/07/18/iTunesU-Site-Utility-in-C-(NET).aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=24e1d3ae-3bad-4359-9453-4a8df42c4e04</guid>
      <pubDate>Fri, 18 Jul 2008 13:24:21 -0500</pubDate>
      <category>Code Lab</category>
      <category>Dallas Seminary</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=24e1d3ae-3bad-4359-9453-4a8df42c4e04</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=24e1d3ae-3bad-4359-9453-4a8df42c4e04</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/07/18/iTunesU-Site-Utility-in-C-(NET).aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=24e1d3ae-3bad-4359-9453-4a8df42c4e04</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=24e1d3ae-3bad-4359-9453-4a8df42c4e04</feedburner:origLink></item>
    <item>
      <title>Programming History</title>
      <description>&lt;p&gt;
From &lt;a href="http://nayyeri.net/blog/how-i-got-started-in-software-development/"&gt;Keyvan Nayyari&lt;/a&gt; and &lt;a href="http://www.jankoatwarpspeed.com/post/2008/07/11/How-I-Got-Started-in-Software-Development.aspx"&gt;Janko&lt;/a&gt; to &lt;a href="http://blog.madskristensen.dk/post/From-wine-to-web.aspx"&gt;Mads Kristensen&lt;/a&gt; and now to me comes a challenge to tell how I got into programming...
&lt;/p&gt;
  
&lt;h4&gt;How old were you when you started programming?&lt;/h4&gt;  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	I think I was around 14 or 15.
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;h4&gt;How did you get started in programming?&lt;/h4&gt;  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	My friend and I made text adventure games.
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;h4&gt;What was your first language?&lt;/h4&gt;  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	It was some form of BASIC.
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;h4&gt;What was the first real program you wrote?&lt;/h4&gt;  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	By &amp;quot;text adventure game&amp;quot;, I really mean lame spaghetti-coded ASCII choose your own adventure &amp;quot;games.&amp;quot; My friend had most of the funny ideas and I did most of the programming. He&amp;#39;s now in a crazy band in Austin, TX called &lt;a href="http://www.myspace.com/natchet"&gt;Natchet Taylor&lt;/a&gt;, and I work at a &lt;a href="http://www.dts.edu/"&gt;seminary&lt;/a&gt;!
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;h4&gt;What languages have you used since?&lt;/h4&gt;  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	ASP, PHP, C#, ActionScript, SQL, X/HTML, JavaScript, CSS, and all the rest...
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;h4&gt;What was your first professional programming gig?&lt;/h4&gt;  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	When I graduated from college, I took a job as a youth pastor. I needed extra cash, so I got a job as as ASP programmer for &lt;a href="http://www.texags.com/"&gt;http://www.texags.com/&lt;/a&gt;. At that point, all I had really done was build a personal webpage in college (with animated flaming gifs!), so I just learned everything on the job. It was great fun. In those days, I&amp;#39;d write everything for IE, and then fix it for Netscape. Funny how things change.
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;h4&gt;If you knew then what you know now, would you have started programming?&lt;/h4&gt;  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	Totally. There&amp;#39;s always good work, and it really frees me up to be anywhere. I&amp;#39;ve made it through an entire &lt;a href="http://www.dts.edu/thm"&gt;masters degree&lt;/a&gt; since I could work whenever and wherever, and still be involved with friends and in ministry.
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;h4&gt;What is the one thing you would tell new developers?&lt;/h4&gt;  
&lt;p&gt;
I&amp;#39;ll cheat and go with two:
&lt;/p&gt;
  
&lt;ol&gt;
	   
	&lt;li&gt;Always, always, always have a signed contract with everything spelled out in detail and a 25-50% payment before writing a single line of code. &lt;/li&gt;    
	&lt;li&gt;Release as much code as you can (to a blog or whatever). If your code is worth publishing, it means you probably did a good job, and would be something you won&amp;#39;t hate to go back and modify later. &lt;/li&gt; 
&lt;/ol&gt;
  
&lt;h4&gt;What&amp;rsquo;s the most fun you&amp;rsquo;ve ever had &amp;hellip; programming?&lt;/h4&gt;  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	I would have to say programming &lt;a href="http://www.dts.edu/onlineed"&gt;online education stuff&lt;/a&gt; with foreign language support. I have no idea what any of it says, but it&amp;#39;s really fun to develop stuff that is used in a home in Dallas, a tent in the deserts of Iraq, in the Packers lockerroom, and in an underground church in China - and all of it not just to make a buck, but to make a difference in the world. That&amp;#39;s rock-star coding.
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;p&gt;
Okay, I&amp;#39;m passing this on to &lt;a href="http://www.sonspring.com"&gt;Nathan Smith&lt;/a&gt;, &lt;a href="http://www.pixelightcreative.com/"&gt;Chris Merritt&lt;/a&gt;, and &lt;a href="http://human3rror.com"&gt;John Saddington&lt;/a&gt;. Have fun guys.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/jXxKacOdHjs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/jXxKacOdHjs/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/07/17/Programming-History.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=ec11412c-8f61-4724-9541-bee9b0118a57</guid>
      <pubDate>Thu, 17 Jul 2008 13:48:00 -0500</pubDate>
      <category>Off Topic</category>
      <category>Personal</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=ec11412c-8f61-4724-9541-bee9b0118a57</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=ec11412c-8f61-4724-9541-bee9b0118a57</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/07/17/Programming-History.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=ec11412c-8f61-4724-9541-bee9b0118a57</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=ec11412c-8f61-4724-9541-bee9b0118a57</feedburner:origLink></item>
    <item>
      <title>Online Education Player Design Considerations</title>
      <description>&lt;p&gt;
&lt;a href="http://www.dts.edu/"&gt;Dallas Seminary&lt;/a&gt; has been doing video-based online education for about 5 years now. One of the initial goals was to replicate the classroom teaching experience as much as possible by including the video and the professor&amp;#39;s illustrations (Powerpoint, Keynote, etc.). Beyond that, we also wanted to enhance the experience by adding things like a transcript and editing down the video to the most important segments.
&lt;/p&gt;
  
&lt;p&gt;
Our initial player was created by Yahoo!&amp;#39;s Broadcast.com division and it used HTML frames and Windows media. This limited us to Internet Explorer, but there was no other option at the time. Then Flash 7 came out with video support and I custom built the player below. Since then, video on the web has come a long way, and the introduction of H.264 support means that we only need one format for playing on the web and on the desktop.
&lt;/p&gt;
  
&lt;p&gt;
Here is the original design using 320x240 video and 480x360 slides:
&lt;/p&gt;
  
&lt;ul&gt;
	   
	&lt;li&gt;&lt;a href="http://my.dts.edu/player/"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_5.png" border="0" alt="image" width="484" height="282" /&gt;&lt;/a&gt; &lt;/li&gt; 
&lt;/ul&gt;
  
&lt;p&gt;
Here are some changes we wanted to make:
&lt;/p&gt;
  
&lt;ul&gt;
	   
	&lt;li&gt;&lt;strong&gt;Move from Flash 8 to 9&lt;/strong&gt; - use AS3 and enable fullscreen support &lt;/li&gt;    
	&lt;li&gt;&lt;strong&gt;Use H.264 video&lt;/strong&gt; - to simplify our workflow &lt;/li&gt;    
	&lt;li&gt;Increase the &lt;strong&gt;video size, quality&lt;/strong&gt;, and availability &lt;/li&gt;    
	&lt;li&gt;Some users found the auto-scrolling transcript distracting and we need another option for them &lt;/li&gt;    
	&lt;li&gt;Many classes don&amp;#39;t have slides, so we need to de-emphasize those, yet also provide a good slide navigation system. &lt;/li&gt;    
	&lt;li&gt;&lt;strong&gt;More narrow player &lt;/strong&gt;- the current design is about 850px which makes it hard to have many more windows open at the same time. &lt;/li&gt; 
&lt;/ul&gt;
  
&lt;p&gt;
Here are wireframe mockups of various design proposals
&lt;/p&gt;
  
&lt;ul&gt;
	   
	&lt;li&gt;&lt;strong&gt;First player (2003) using Yahoo!&amp;#39;s Broadcast.com using HTML/Frames/WMV        &lt;br /&gt;
	&lt;/strong&gt;&lt;em&gt;Obviously, WMV is limited to really working in IE, and we were stuck with Yahoo!&amp;#39;s platform.&lt;/em&gt;       &lt;br /&gt;
	&lt;a href="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_4.png"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_thumb.png" border="0" alt="image" width="404" height="354" /&gt;&lt;/a&gt;       &lt;br /&gt;
	&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/old_online_ed_Yahoo_Video_Skin_2.jpg"&gt;&lt;img style="border: 0px none " src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/old_online_ed_Yahoo_Video_Skin_thumb.jpg" border="0" alt="old_online_ed_Yahoo_Video_Skin" width="403" height="332" /&gt;&lt;/a&gt;       &lt;br /&gt;
	&lt;/li&gt;    
	&lt;li&gt;&lt;strong&gt;Flash player with 320x240 video        &lt;br /&gt;
	&lt;/strong&gt;&lt;em&gt;This player is wider since the slides are bigger, but the transcript is more narrow column which makes it easier to read.&lt;/em&gt;       &lt;br /&gt;
	&lt;a href="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_7.png"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_thumb_1.png" border="0" alt="image" width="484" height="228" /&gt;&lt;/a&gt;&amp;nbsp; &lt;br /&gt;
	&lt;a href="http://my.dts.edu/player/"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_5.png" border="0" alt="image" width="484" height="282" /&gt;&lt;/a&gt;       &lt;br /&gt;
	&lt;/li&gt; 
&lt;/ul&gt;
  
&lt;p&gt;
New Designs
&lt;/p&gt;
  
&lt;ul&gt;
	   
	&lt;li&gt;&lt;strong&gt;Swapped video and slides sizes, controls at the bottom &lt;/strong&gt;      &lt;br /&gt;
	&lt;em&gt;This swaps the video and slide sizes. It&amp;#39;s nice, but the transcript is far away and the slides are hard to read. The player is also still very wide.&lt;/em&gt;       &lt;br /&gt;
	&lt;a href="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_9.png"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_thumb_2.png" border="0" alt="image" width="484" height="246" /&gt;&lt;/a&gt;       &lt;br /&gt;
	&lt;/li&gt;    
	&lt;li&gt;&lt;strong&gt;Larger video size, small slides on the side&lt;/strong&gt;       &lt;br /&gt;
	&lt;em&gt;To make the video even bigger, the transcript is now a single line like closed captioning on TV. Rather than give the slides their own dedicated space, the slides have a tray on the right and the full size slide appears over the video for a few seconds. The width is slightly smaller, but not much.&lt;/em&gt;       &lt;br /&gt;
	&lt;a href="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_13.png"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_thumb_4.png" border="0" alt="image" width="484" height="302" /&gt;&lt;/a&gt;       &lt;br /&gt;
	&amp;nbsp; &lt;/li&gt;    
	&lt;li&gt;&lt;strong&gt;Coverflow Style Player        &lt;br /&gt;
	&lt;/strong&gt;&lt;em&gt;To make the player more narrow (for multi-tasking), we move the slides to the bottom and use the Apple CoverFlow to show a lot of them at once. This makes the player more narrow which is good, but also taller. To shorten it, we&amp;#39;ve moved all the controls on top of the video that appears/diasppears on mouse hover.        &lt;br /&gt;
	        &lt;br /&gt;
	&amp;nbsp;&lt;a href="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_21.png"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_thumb_8.png" border="0" alt="image" width="484" height="352" /&gt;&lt;/a&gt;         &lt;br /&gt;
	        &lt;br /&gt;
	Here is a screenshot of a fairly common desktop size (1680x1050) with MS Word and a preview version of this player open. (note: I&amp;#39;ve made sure the controls are visible for the screenshot, but they are hidden normally)&amp;nbsp; &lt;br /&gt;
	&lt;a href="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_15.png"&gt;&lt;img style="border: 0px none " src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_thumb_5.png" border="0" alt="image" width="484" height="304" /&gt;&lt;/a&gt;         &lt;br /&gt;
	&lt;a href="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_23.png"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_thumb_9.png" border="0" alt="image" width="484" height="304" /&gt;&lt;/a&gt; &lt;/em&gt;&lt;/li&gt; 
&lt;/ul&gt;
  
&lt;p&gt;
This seems effective, but there is a possible drawback in that the Coverflow might be somewhat distracting to some students (it can be turned off). Also, some may prefer the older style transcript with more than one line visible at once.
&lt;/p&gt;
  
&lt;p&gt;
Links to preview the players:
&lt;/p&gt;
  
&lt;ul&gt;
	   
	&lt;li&gt;Old Player: &lt;a href="http://my.dts.edu/player/experiments/coverflow/"&gt;http://my.dts.edu/player/&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;Coverflow: &lt;a href="http://my.dts.edu/player2/"&gt;http://my.dts.edu/player2/&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;
  
&lt;p&gt;
Another future goal is to build the player as an AIR application so that videos can be downloaded for offline use.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/lF0itbFydUc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/lF0itbFydUc/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/06/02/Online-Education-Player-Design-Considerations.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=34389687-9b6d-4e0d-b209-5dd6e6b90428</guid>
      <pubDate>Mon, 02 Jun 2008 09:33:00 -0500</pubDate>
      <category>Dallas Seminary</category>
      <category>Flash</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=34389687-9b6d-4e0d-b209-5dd6e6b90428</pingback:target>
      <slash:comments>15</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=34389687-9b6d-4e0d-b209-5dd6e6b90428</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/06/02/Online-Education-Player-Design-Considerations.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=34389687-9b6d-4e0d-b209-5dd6e6b90428</wfw:commentRss>
    <enclosure url="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_4.png" length="22621" type="application/octet-stream" /><media:content url="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_4.png" fileSize="22621" type="application/octet-stream" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> Dallas Seminary has been doing video-based online education for about 5 years now. One of the initial goals was to replicate the classroom teaching experience as much as possible by including the video and the professor&amp;#39;s illustrations (Powerpoint, K</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> Dallas Seminary has been doing video-based online education for about 5 years now. One of the initial goals was to replicate the classroom teaching experience as much as possible by including the video and the professor&amp;#39;s illustrations (Powerpoint, Keynote, etc.). Beyond that, we also wanted to enhance the experience by adding things like a transcript and editing down the video to the most important segments. Our initial player was created by Yahoo!&amp;#39;s Broadcast.com division and it used HTML frames and Windows media. This limited us to Internet Explorer, but there was no other option at the time. Then Flash 7 came out with video support and I custom built the player below. Since then, video on the web has come a long way, and the introduction of H.264 support means that we only need one format for playing on the web and on the desktop. Here is the original design using 320x240 video and 480x360 slides: Here are some changes we wanted to make: Move from Flash 8 to 9 - use AS3 and enable fullscreen support Use H.264 video - to simplify our workflow Increase the video size, quality, and availability Some users found the auto-scrolling transcript distracting and we need another option for them Many classes don&amp;#39;t have slides, so we need to de-emphasize those, yet also provide a good slide navigation system. More narrow player - the current design is about 850px which makes it hard to have many more windows open at the same time. Here are wireframe mockups of various design proposals First player (2003) using Yahoo!&amp;#39;s Broadcast.com using HTML/Frames/WMV Obviously, WMV is limited to really working in IE, and we were stuck with Yahoo!&amp;#39;s platform. Flash player with 320x240 video This player is wider since the slides are bigger, but the transcript is more narrow column which makes it easier to read. &amp;nbsp; New Designs Swapped video and slides sizes, controls at the bottom This swaps the video and slide sizes. It&amp;#39;s nice, but the transcript is far away and the slides are hard to read. The player is also still very wide. Larger video size, small slides on the side To make the video even bigger, the transcript is now a single line like closed captioning on TV. Rather than give the slides their own dedicated space, the slides have a tray on the right and the full size slide appears over the video for a few seconds. The width is slightly smaller, but not much. &amp;nbsp; Coverflow Style Player To make the player more narrow (for multi-tasking), we move the slides to the bottom and use the Apple CoverFlow to show a lot of them at once. This makes the player more narrow which is good, but also taller. To shorten it, we&amp;#39;ve moved all the controls on top of the video that appears/diasppears on mouse hover. &amp;nbsp; Here is a screenshot of a fairly common desktop size (1680x1050) with MS Word and a preview version of this player open. (note: I&amp;#39;ve made sure the controls are visible for the screenshot, but they are hidden normally)&amp;nbsp; This seems effective, but there is a possible drawback in that the Coverflow might be somewhat distracting to some students (it can be turned off). Also, some may prefer the older style transcript with more than one line visible at once. Links to preview the players: Old Player: http://my.dts.edu/player/ Coverflow: http://my.dts.edu/player2/ Another future goal is to build the player as an AIR application so that videos can be downloaded for offline use. </itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=34389687-9b6d-4e0d-b209-5dd6e6b90428</feedburner:origLink></item>
    <item>
      <title>ISBN Functions in C# (ISBN-10 to ISBN-13 Conversion)</title>
      <description>&lt;p&gt;While working with some book data, I needed to merge the old ISBN-10 and ISBN-13 data. Unfortunately, I couldn't find any C# code to do the conversion. Search for &amp;quot;ISBN C#&amp;quot; in Google only return book stores with C# books.&lt;/p&gt;  &lt;p&gt;So here is a little class that will convert and validate ISBNs. Here's how the code would look:&lt;/p&gt;  &lt;pre class="prettyprint"&gt;string isbn10 = &amp;quot;0830818030&amp;quot;; 
string isbn13 = ISBN.Convert10to13(isbn10); // returns &amp;quot;9780830818037&amp;quot;

string isbn = &amp;quot;083081803X&amp;quot;; // this one has a bad checksum (last digit) 
string correctIsbn = &amp;quot;&amp;quot;; 
if (!ISBN.IsValid(isbn, out correctIsbn)) { 
	isbn = corretnIsbn; // returns &amp;quot;0830818030&amp;quot;
}&lt;/pre&gt;

&lt;p&gt;An ISBN object can also be instantiated and used:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;IBSN myBook = new ISBN(&amp;quot;0-83081-803-0&amp;quot;); 
string isbn13 = myBook.ISBN13; // returns &amp;quot;9780830818037&amp;quot;
string isbn10 = myBook.ISBN10; // returns &amp;quot;0830818030&amp;quot; &lt;/pre&gt;

&lt;p&gt;Here is the class:&lt;/p&gt;

&lt;div &gt;
  &lt;pre class="prettyprint" style="overflow: auto; height: 500px"&gt;public class ISBN
    {

        public ISBN(string isbn)
        {
            SetIsbn(isbn);
        }

        private string _isbn10 = &amp;quot;&amp;quot;;
        private string _isbn13 = &amp;quot;&amp;quot;;

        public string ISBN10
        {
            get
            {
                return _isbn10;
            }
            set
            {                
                string corrected = &amp;quot;&amp;quot;;
               
                if (!IsValid(value, out corrected) &amp;amp;&amp;amp; corrected == &amp;quot;&amp;quot;)
                    throw new Exception(&amp;quot;invalid ISBN&amp;quot;);

                SetIsbn(corrected);
            }
        }

        public string ISBN13
        {
            get
            {
                return _isbn13;
            }
            set
            {
                string corrected = &amp;quot;&amp;quot;;

                if (!IsValid(value, out corrected) &amp;amp;&amp;amp; corrected == &amp;quot;&amp;quot;)
                    throw new Exception(&amp;quot;invalid ISBN&amp;quot;);

                SetIsbn(corrected);
            }
        }

        private void SetIsbn(string isbn)
        {
            isbn = CleanIsbn(isbn);

            if (isbn.Length == 10)
            {
                _isbn10 = isbn;
                _isbn13 = Convert10to13(isbn);
            }
            else if (isbn.Length == 13)
            {
                _isbn13 = isbn;
                _isbn10 = Convert13to10(isbn);
            }
        }

        private static string CleanIsbn(string isbn)
        {
            return isbn.Replace(&amp;quot;-&amp;quot;, &amp;quot;&amp;quot;).Replace(&amp;quot; &amp;quot;, &amp;quot;&amp;quot;);
        }


        public static string Convert10to13(string isbn)
        {
            return Convert10to13(isbn, true);
        }
        public static string Convert10to13(string isbn, bool throwError) {
            
            // remove - and space
            string isbn10 = CleanIsbn(isbn);

            if (isbn10.Length != 10 &amp;amp;&amp;amp; throwError)
                throw new Exception(&amp;quot;ISBN must be 10 characters long&amp;quot;);

            // 1) Drop the check digit (the last digit)
            isbn10 = isbn10.Substring(0, 9);

            // 2) Add the prefix '978' 
            string isbn13 = &amp;quot;978&amp;quot; + isbn10;

            // 3) Recalculate check digit 
            isbn13 = isbn13 + Isbn13Checksum(isbn13);

            return isbn13;
        }

        public static string Convert13to10(string isbn)
        {
            return Convert13to10(isbn, true);
        }

        public static string Convert13to10(string isbn, bool throwError)
        {

            // remove - and space
            string isbn13 = CleanIsbn(isbn);

            if (isbn13.Length != 13 &amp;amp;&amp;amp; throwError)
                throw new Exception(&amp;quot;ISBN must be 13 characters long&amp;quot;);

            // 1) Drop the check digit (the last digit) and prefix '978'
            string isbn10 = isbn13.Substring(3, 9);
     
            // 2) Recalculate your check digit using the modules 10 check digit routine.
            isbn10 = isbn10 + Isbn10Checksum(isbn10);

            return isbn10;
        }

        public static bool IsValid(string isbn)
        {
            string correctIsbn = &amp;quot;&amp;quot;;
            return IsValid(isbn, out correctIsbn);
        }

        public static bool IsValid(string isbn, out string correctISBN)
        {
            // remove - and space
            isbn = CleanIsbn(isbn);

            if (isbn.Length == 10) {
                return ValidateIsbn10(isbn, out correctISBN);
            }
            else if (isbn.Length == 13)
            {
                return ValidateIsbn13(isbn, out correctISBN);
            }
            else
            {
                correctISBN = &amp;quot;&amp;quot;;
                return false;
            }

        }

        private static string Isbn10Checksum(string isbn)
        {
            int sum = 0;
            for (int i = 0; i &amp;lt; 9; i++)
                 sum += (10-i) * Int32.Parse(isbn[i].ToString());
   
            float div = sum / 11;
            float rem = sum % 11;

            if (rem == 0)
                return &amp;quot;0&amp;quot;;
            else if (rem == 1)
                return &amp;quot;X&amp;quot;;
            else
                return (11 - rem).ToString();
        }

        private static string Isbn13Checksum(string isbn)
        {
            float sum = 0;
            for (int i = 0; i &amp;lt; 12; i++)
                sum += ((i % 2 == 0) ? 1 : 3) * Int32.Parse(isbn[i].ToString());

            float div = sum / 10;
            float rem = sum % 10;

            if (rem == 0)
                return &amp;quot;0&amp;quot;;
            else
                return (10 - rem).ToString();
        }


        private static bool ValidateIsbn10(string isbn, out string correctISBN)
        {
            correctISBN = isbn.Substring(0, 9) + Isbn10Checksum(isbn);

            return (correctISBN == isbn);
        }

        private static bool ValidateIsbn13(string isbn, out string correctISBN)
        {
            correctISBN = isbn.Substring(0, 12) + Isbn13Checksum(isbn);

            return (correctISBN == isbn);
        }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;I initially wanted to also make a method that would add back in the correct dashes, but I found out that the make up is based on country and publisher codes assigned by the &lt;a href="http://www.isbn-international.org/"&gt;International ISBN Agency&lt;/a&gt; which regularly updates the list of codes making it pretty much impossible to permanantly functionalize.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/KEm5CalAoTE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/KEm5CalAoTE/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/05/15/ISBN-Functions-in-C-(ISBN-10-to-ISBN-13-Conversion).aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=9a33183f-9ede-43cd-bc7f-0d824698ce8f</guid>
      <pubDate>Thu, 15 May 2008 16:05:16 -0500</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=9a33183f-9ede-43cd-bc7f-0d824698ce8f</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=9a33183f-9ede-43cd-bc7f-0d824698ce8f</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/05/15/ISBN-Functions-in-C-(ISBN-10-to-ISBN-13-Conversion).aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=9a33183f-9ede-43cd-bc7f-0d824698ce8f</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=9a33183f-9ede-43cd-bc7f-0d824698ce8f</feedburner:origLink></item>
    <item>
      <title>The Best Way to Demo Websites for Clients</title>
      <description>&lt;p&gt;For the last few years, my web team has used a projector to collaborate on web projects. We use it for going through our weekly work items, demoing designs, doing training, and so on.&lt;/p&gt;  &lt;p&gt;Unfortunately, it was an old projector with a weak bulb so we always had to turn out the lights to use it. Even then it was hard to see because the contrast and color depth were poor, and the resolution was only 1024x768. So last year I budgeted to get a new projector to solve these problems.&lt;/p&gt;  &lt;p&gt;Instead of getting a new projector, I decided to get a LCD HDTV and use it as a monitor. I found a &lt;a href="http://www.samsclub.com/shopping/navigate.do?dest=5&amp;amp;item=386506&amp;amp;pCatg=5883"&gt;killer deal at Sam's Club&lt;/a&gt; on a &lt;a href="http://olevia.com/en-us/Products/2Series/265TFHDLCDHDTV.aspx"&gt;65&amp;quot; &lt;a href="http://olevia.com/en-us/Products/2Series/265TFHDLCDHDTV.aspx"&gt;Olevia&lt;/a&gt;.&lt;/a&gt; The screen isn't quote as nice as something like a Sony, but for what we are doing, it is absolutely amazing. The 1920x1080 resolution and super bright LCD screen is perfect for looking at web designs. In this pic, We have our task app on the right and a full size web page on the left. Even though the text is tiny it's readable from about 8' away:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/TheBestWaytoDemoWebsitesforClients_851F/IMG_3278_2.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="322" alt="IMG_3278" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/TheBestWaytoDemoWebsitesforClients_851F/IMG_3278_thumb.jpg" width="500" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/TheBestWaytoDemoWebsitesforClients_851F/IMG_3279_2.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="310" alt="IMG_3279" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/TheBestWaytoDemoWebsitesforClients_851F/IMG_3279_thumb.jpg" width="500" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I have an old PC running the display, and I'm using a few little utilities to make enhance presentations:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.entechtaiwan.com/util/ps.shtm"&gt;PowerStrip&lt;/a&gt; - Some PCs and Macs can't natively display 1920x1080 resolution. This little Windows app helps out and can usually enable even really old machines to do HD resolutions.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb897434.aspx"&gt;ZoomIt&lt;/a&gt; - this is a little app by the former SysInternals.com guys. It lets you zoom into a screen with the mouse scroll wheel and draw on the screen. This features are invaluable for mockups.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=75078"&gt;Zune Theme Modified&lt;/a&gt; - I also used a modified Zune theme, because I like how the dark colors make the UI fade into the background and focus attention on the design.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;On the fun side, we can occasionally use it for things other than web design. Since we're in a basement, we don't have a good way of getting an antenna to pipe in some HD goodness, but we can watch trailers in full 1080p goodness!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/TheBestWaytoDemoWebsitesforClients_851F/IMG_3281_2.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="316" alt="IMG_3281" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/TheBestWaytoDemoWebsitesforClients_851F/IMG_3281_thumb.jpg" width="500" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/AHHaEZ5kB4Y" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/AHHaEZ5kB4Y/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/05/12/The-Best-Way-to-Demo-Websites-for-Clients.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=8e6e3ccf-197b-44a7-9fe0-f8c62a752dbf</guid>
      <pubDate>Mon, 12 May 2008 10:29:10 -0500</pubDate>
      <category>Dallas Seminary</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=8e6e3ccf-197b-44a7-9fe0-f8c62a752dbf</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=8e6e3ccf-197b-44a7-9fe0-f8c62a752dbf</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/05/12/The-Best-Way-to-Demo-Websites-for-Clients.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=8e6e3ccf-197b-44a7-9fe0-f8c62a752dbf</wfw:commentRss>
    <enclosure url="http://go.microsoft.com/fwlink/?LinkID=75078" length="1722880" type="application/octet-stream" /><media:content url="http://go.microsoft.com/fwlink/?LinkID=75078" fileSize="1722880" type="application/octet-stream" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> For the last few years, my web team has used a projector to collaborate on web projects. We use it for going through our weekly work items, demoing designs, doing training, and so on. Unfortunately, it was an old projector with a weak bulb so we always h</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> For the last few years, my web team has used a projector to collaborate on web projects. We use it for going through our weekly work items, demoing designs, doing training, and so on. Unfortunately, it was an old projector with a weak bulb so we always had to turn out the lights to use it. Even then it was hard to see because the contrast and color depth were poor, and the resolution was only 1024x768. So last year I budgeted to get a new projector to solve these problems. Instead of getting a new projector, I decided to get a LCD HDTV and use it as a monitor. I found a killer deal at Sam's Club on a 65&amp;quot; Olevia. The screen isn't quote as nice as something like a Sony, but for what we are doing, it is absolutely amazing. The 1920x1080 resolution and super bright LCD screen is perfect for looking at web designs. In this pic, We have our task app on the right and a full size web page on the left. Even though the text is tiny it's readable from about 8' away: &amp;#160; I have an old PC running the display, and I'm using a few little utilities to make enhance presentations: PowerStrip - Some PCs and Macs can't natively display 1920x1080 resolution. This little Windows app helps out and can usually enable even really old machines to do HD resolutions. ZoomIt - this is a little app by the former SysInternals.com guys. It lets you zoom into a screen with the mouse scroll wheel and draw on the screen. This features are invaluable for mockups. Zune Theme Modified - I also used a modified Zune theme, because I like how the dark colors make the UI fade into the background and focus attention on the design. On the fun side, we can occasionally use it for things other than web design. Since we're in a basement, we don't have a good way of getting an antenna to pipe in some HD goodness, but we can watch trailers in full 1080p goodness! </itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=8e6e3ccf-197b-44a7-9fe0-f8c62a752dbf</feedburner:origLink></item>
    <item>
      <title>Web Marketing using Facebook Ads and Video for Dallas Seminary</title>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note: &lt;/strong&gt;This blog is usually fairly technical, dealing with ASP.NET, Flash, and JavaScript code samples, but this is a brief deviation into the broader world of the web as a technology platform for communicating an institution's message.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;For &lt;a href="http://www.dts.edu/"&gt;Dallas Theological Seminary&lt;/a&gt;, we've been experimenting with &amp;quot;branding&amp;quot; and reaching different audiences by producing some new videos and experimenting with &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;'s relatively new &lt;a href="http://www.facebook.com/ads/"&gt;targeted advertising&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;Marketing for Seminaries?&lt;/h4&gt;  &lt;p&gt;Advertising and marketing for churches and seminaries can be a tricky thing, because it seems rather sacrilegious to &amp;quot;market&amp;quot; something spiritual. We've all seen &lt;a href="http://www.bennyhinn.org"&gt;late night&lt;/a&gt; and &lt;a href="http://www.oprah.com/spiritself/ss_landing.jhtml"&gt;afternoon televangelists&lt;/a&gt; that make us cringe. But DTS isn't offering a &amp;quot;product&amp;quot; that someone buys; rather its mission is to train pastors, professors, and missionaries for a lifetime of service. If you call an admissions counselor and ask why you should go to DTS, you won't get a sales pitch. The admissions counselor will tell you that you should go to the school to which God is calling you. The admissions person will then mention some of DTS's strengths, but stay away from comparisons with other schools or &amp;quot;selling DTS.&amp;quot;&lt;/p&gt;  &lt;p&gt;Still, it is important for DTS to inform prospective students on what kind of school it is and what it's strengths are. Basic marketing ideas can help convey this, and naturally the web is a great place to start.&lt;/p&gt;  &lt;h4&gt;Context for the Advertisements&lt;/h4&gt;  &lt;p&gt;Any time you create an ad for a &amp;quot;company,&amp;quot; it is important to know the background of the business and the historical context in which the ad is situated. This history of seminaries and churches in America is key to understanding what ads will communicate to the seminary audience. &lt;a href="http://www.dts.edu/catalog"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 10px; border-right-width: 0px" height="350" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/FacebookAdsandVideoforDallasSeminary_A169/image_10.png" width="220" align="right" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;In the early 1900s, was a debate in the Christian church between &amp;quot;fundamentalists&amp;quot; (those who believe certain &lt;em&gt;truths&lt;/em&gt; are the most important thing about Christianity) and &amp;quot;liberals&amp;quot; (those who believe certain &lt;em&gt;actions&lt;/em&gt; are the most important thing about Christianity). In this debate, it seemed that the &amp;quot;liberals&amp;quot; forgot that Jesus asked Christians to &lt;em&gt;believe &lt;/em&gt;something (that he is the savior and the Son of God), while the the fundamentalists often forgot that Jesus asked Christians to &lt;em&gt;do&lt;/em&gt; something (love others).&lt;/p&gt;  &lt;p&gt;DTS was started in the 1920s during the fundamentalist movement. Unfortunately, many of the seminaries which started during this time period have a reputation of caring about teaching the Bible, but neglecting to meet real world needs. By the 60s and 70s, some Christians wanted to balance the emphases of both the liberals (loving) and fundamentalists (truth), and there they were called &amp;quot;evangelicals.&amp;quot; Today, this term has become politically decisive and has less positive connotations in many places, so the word &amp;quot;evangelical&amp;quot; communicates something different than it used it.&lt;/p&gt;  &lt;p&gt;Today's students who are considering seminary are more concerned than ever about balancing these two things and so DTS needs new ways to communicate that it wants to care about Christian beliefs &lt;em&gt;and &lt;/em&gt;Christian practices without making one too dominate. These students also don't read traditional Christian publications, so DTS needs to shift from print publications to Internet and from top down communication to allowing prospects to connect to real students.&lt;/p&gt;  &lt;h4&gt;A New Tagline&lt;/h4&gt;  &lt;p&gt;The older taglines for DTS have been things that primarily emphasize Biblical teaching such as &amp;quot;Standing Strong for the Truth&amp;quot; or &amp;quot;Training You Can Trust. Leaders You Can Follow.&amp;quot;&lt;/p&gt;  &lt;p&gt;We wanted something shorter and somewhat pithy that emphasized both aspects of truth and love. Here's what we came up with.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;em&gt;Teach Truth. Love Well.&lt;/em&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Not too revolutionary, but hopefully it's clear and it communicates. Here's how Google sees it :)&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="77" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/FacebookAdsandVideoforDallasSeminary_A169/image_3.png" width="555" border="0" /&gt; &lt;/p&gt;  &lt;h4&gt;Facebook Page and Ads Summary&lt;/h4&gt;  &lt;p&gt;DTS has traditionally run ads on large Christian website like ChristianityToday.com and OnePlace.com. But to reach younger students, we moved over to Facebook.&lt;/p&gt;  &lt;p&gt;Also, in the past, a traditional DTS ad might have emphasized something like &amp;quot;Want to be a Pastor?&amp;quot;, but many of today's seminarians are going into non-traditional forms of ministry. DTS grads still have a very strong emphasis on teaching the Bible, but more students are doing this outside the traditional church pastor role. The first few ads we ran emphasize these other forms of ministry. We ran each one for around a week and paid per click with click-through rates of around 0.10%. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="190" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/FacebookAdsandVideoforDallasSeminary_A169/image6.png" width="145" border="0" /&gt; &lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="214" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/FacebookAdsandVideoforDallasSeminary_A169/image91.png" width="144" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Which one do you like more?&lt;/p&gt;  &lt;p&gt;The second ad turned out to be more successful (higher click-through rates). This is probably because the image is more appealing and &amp;quot;Dallas Seminary&amp;quot; doesn't show up until later in the text of the ad.&lt;/p&gt;  &lt;p&gt;In addition to advertisements, we also setup a &lt;a href="http://www.facebook.com/pages/Dallas-TX/Dallas-Theological-Seminary/17261545566?ref=ts"&gt;Facebook Page for DTS&lt;/a&gt;. Rather than aggressively market to students through physical mail or email blasts, this allows interested students to check out DTS and ask questions of current students and alumni before talking to an admissions counselor. On &lt;a href="http://goingtoseminary.com/selecting-a-seminary-interview-current-students/"&gt;the GoingToSeminary blog&lt;/a&gt;, there is a great post about connecting to a current student to get real answers. Below is an example of a prospect asking a question that a current student answered on Facebook. That person got a real answer from a real student without ever needing to visit the main seminary website.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="424" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/FacebookAdsandVideoforDallasSeminary_A169/image1.png" width="403" border="0" /&gt; &lt;/p&gt;  &lt;h4&gt;Connecting with Video&lt;/h4&gt;  &lt;p&gt;DTS's excellent AV team has also produced several videos that communicate the &amp;quot;Teach truth. Love Well.&amp;quot; message. These are sent to alumni and supporters via email every few months.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.dts.edu/media/play/?MediaItemID=7701b08a-0bae-4f99-8c4d-af5c73e4f503"&gt;Ben Stuart&lt;/a&gt;       &lt;br /&gt;&lt;/strong&gt;Ben leads a college ministry called BreakAway which is attended by about 5,000 Texas A&amp;amp;M (my alma mater) students. His story is classic DTS and emphasizes &amp;quot;Teach Truth&amp;quot;.&lt;/p&gt; &lt;object id="dtsplayer" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" height="340" width="485" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"&gt;&lt;param name="_cx" value="12832"&gt;&lt;param name="_cy" value="8996"&gt;&lt;param name="FlashVars" value=""&gt;&lt;param name="Movie" value="http://media.dts.edu/embeddedplayer/?MediaItemID=7701b08a-0bae-4f99-8c4d-af5c73e4f503"&gt;&lt;param name="Src" value="http://media.dts.edu/embeddedplayer/?MediaItemID=7701b08a-0bae-4f99-8c4d-af5c73e4f503"&gt;&lt;param name="WMode" value="Window"&gt;&lt;param name="Play" value="0"&gt;&lt;param name="Loop" value="-1"&gt;&lt;param name="Quality" value="High"&gt;&lt;param name="SAlign" value=""&gt;&lt;param name="Menu" value="-1"&gt;&lt;param name="Base" value=""&gt;&lt;param name="AllowScriptAccess" value=""&gt;&lt;param name="Scale" value="ShowAll"&gt;&lt;param name="DeviceFont" value="0"&gt;&lt;param name="EmbedMovie" value="0"&gt;&lt;param name="BGColor" value=""&gt;&lt;param name="SWRemote" value=""&gt;&lt;param name="MovieData" value=""&gt;&lt;param name="SeamlessTabbing" value="1"&gt;&lt;param name="Profile" value="0"&gt;&lt;param name="ProfileAddress" value=""&gt;&lt;param name="ProfilePort" value="0"&gt;&lt;param name="AllowNetworking" value="all"&gt;&lt;param name="AllowFullScreen" value="false"&gt;     &lt;embed id="dtsplayer" width="485" height="340" allowfullscreen="true" allowscriptaccess="always" quality="high" name="dtsplayer" src="http://media.dts.edu/embeddedplayer/?MediaItemID=7701b08a-0bae-4f99-8c4d-af5c73e4f503" type="application/x-shockwave-flash" /&gt;&lt;/object&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.dts.edu/media/play/?MediaItemID=e4856ced-5ac3-4e81-bb96-c836f008c068"&gt;Christ in North Africa&lt;/a&gt;&lt;/strong&gt;     &lt;br /&gt;Where Ben highlights &amp;quot;Teach Truth,&amp;quot; Christy highlights &amp;quot;Love Well.&amp;quot; She is an English teacher North Africa, but never &amp;quot;teaches&amp;quot; Christianity verbally; she does it by loving the girls in her classes. &lt;/p&gt; &lt;object id="dtsplayer" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" height="340" width="485" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"&gt;&lt;param name="_cx" value="12832"&gt;&lt;param name="_cy" value="8996"&gt;&lt;param name="FlashVars" value=""&gt;&lt;param name="Movie" value="http://media.dts.edu/embeddedplayer/?MediaItemID=e4856ced-5ac3-4e81-bb96-c836f008c068"&gt;&lt;param name="Src" value="http://media.dts.edu/embeddedplayer/?MediaItemID=e4856ced-5ac3-4e81-bb96-c836f008c068"&gt;&lt;param name="WMode" value="Window"&gt;&lt;param name="Play" value="0"&gt;&lt;param name="Loop" value="-1"&gt;&lt;param name="Quality" value="High"&gt;&lt;param name="SAlign" value=""&gt;&lt;param name="Menu" value="-1"&gt;&lt;param name="Base" value=""&gt;&lt;param name="AllowScriptAccess" value=""&gt;&lt;param name="Scale" value="ShowAll"&gt;&lt;param name="DeviceFont" value="0"&gt;&lt;param name="EmbedMovie" value="0"&gt;&lt;param name="BGColor" value=""&gt;&lt;param name="SWRemote" value=""&gt;&lt;param name="MovieData" value=""&gt;&lt;param name="SeamlessTabbing" value="1"&gt;&lt;param name="Profile" value="0"&gt;&lt;param name="ProfileAddress" value=""&gt;&lt;param name="ProfilePort" value="0"&gt;&lt;param name="AllowNetworking" value="all"&gt;&lt;param name="AllowFullScreen" value="false"&gt;     &lt;embed id="dtsplayer" width="485" height="340" allowfullscreen="true" allowscriptaccess="always" quality="high" name="dtsplayer" src="http://media.dts.edu/embeddedplayer/?MediaItemID=e4856ced-5ac3-4e81-bb96-c836f008c068" type="application/x-shockwave-flash" /&gt;&lt;/object&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.dts.edu/media/play/?MediaItemID=738d01bc-c6bc-4887-b810-ddab83e9cc18"&gt;William &amp;quot;Duce&amp;quot; Branch&lt;/a&gt;       &lt;br /&gt;&lt;/strong&gt;&amp;quot;Duce&amp;quot; Branch is a pastor who ministers to the hip hop generation through his music.This is a guy who took 120 hours of course work and still managed to keep his love for his culture. He really embraces both elements of &amp;quot;Teach Truth. Love Well.&amp;quot;&lt;/p&gt; &lt;object id="dtsplayer" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" height="340" width="485" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"&gt;&lt;param name="_cx" value="12832"&gt;&lt;param name="_cy" value="8996"&gt;&lt;param name="FlashVars" value=""&gt;&lt;param name="Movie" value="http://media.dts.edu/embeddedplayer/?MediaItemID=738d01bc-c6bc-4887-b810-ddab83e9cc18"&gt;&lt;param name="Src" value="http://media.dts.edu/embeddedplayer/?MediaItemID=738d01bc-c6bc-4887-b810-ddab83e9cc18"&gt;&lt;param name="WMode" value="Window"&gt;&lt;param name="Play" value="0"&gt;&lt;param name="Loop" value="-1"&gt;&lt;param name="Quality" value="High"&gt;&lt;param name="SAlign" value=""&gt;&lt;param name="Menu" value="-1"&gt;&lt;param name="Base" value=""&gt;&lt;param name="AllowScriptAccess" value=""&gt;&lt;param name="Scale" value="ShowAll"&gt;&lt;param name="DeviceFont" value="0"&gt;&lt;param name="EmbedMovie" value="0"&gt;&lt;param name="BGColor" value=""&gt;&lt;param name="SWRemote" value=""&gt;&lt;param name="MovieData" value=""&gt;&lt;param name="SeamlessTabbing" value="1"&gt;&lt;param name="Profile" value="0"&gt;&lt;param name="ProfileAddress" value=""&gt;&lt;param name="ProfilePort" value="0"&gt;&lt;param name="AllowNetworking" value="all"&gt;&lt;param name="AllowFullScreen" value="false"&gt;     &lt;embed id="dtsplayer" width="485" height="340" allowfullscreen="true" allowscriptaccess="always" quality="high" name="dtsplayer" src="http://media.dts.edu/embeddedplayer/?MediaItemID=738d01bc-c6bc-4887-b810-ddab83e9cc18" type="application/x-shockwave-flash" /&gt;&lt;/object&gt;  &lt;p&gt;This last video also has a great metaphor for communicating to different audiences where the president of the school is shown on an upper-middle-class HDTV while Duce is shown on various older TVs. They both are working for the same goal with the same message, but the context and transmission system changes to be audience appropriate. Good stuff. &lt;/p&gt;  &lt;p&gt;I hope this is a helpful summary of how DTS works and how the newer media forms can be used to communicate to changing audiences.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/d9t8py6Y6JM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/d9t8py6Y6JM/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/05/06/Web-Marketing-using-Facebook-Ads-and-Video-for-Dallas-Seminary.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=8a811777-f72e-4372-8b7f-929e8addb9fa</guid>
      <pubDate>Tue, 06 May 2008 09:22:19 -0500</pubDate>
      <category>Dallas Seminary</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=8a811777-f72e-4372-8b7f-929e8addb9fa</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=8a811777-f72e-4372-8b7f-929e8addb9fa</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/05/06/Web-Marketing-using-Facebook-Ads-and-Video-for-Dallas-Seminary.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=8a811777-f72e-4372-8b7f-929e8addb9fa</wfw:commentRss>
    <enclosure url="http://media.dts.edu/embeddedplayer/?MediaItemID=7701b08a-0bae-4f99-8c4d-af5c73e4f503" length="93613" type="application/x-shockwave-flash" /><media:content url="http://media.dts.edu/embeddedplayer/?MediaItemID=7701b08a-0bae-4f99-8c4d-af5c73e4f503" fileSize="93613" type="application/x-shockwave-flash" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> Note: This blog is usually fairly technical, dealing with ASP.NET, Flash, and JavaScript code samples, but this is a brief deviation into the broader world of the web as a technology platform for communicating an institution's message. For Dallas Theolog</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> Note: This blog is usually fairly technical, dealing with ASP.NET, Flash, and JavaScript code samples, but this is a brief deviation into the broader world of the web as a technology platform for communicating an institution's message. For Dallas Theological Seminary, we've been experimenting with &amp;quot;branding&amp;quot; and reaching different audiences by producing some new videos and experimenting with Facebook's relatively new targeted advertising. Marketing for Seminaries? Advertising and marketing for churches and seminaries can be a tricky thing, because it seems rather sacrilegious to &amp;quot;market&amp;quot; something spiritual. We've all seen late night and afternoon televangelists that make us cringe. But DTS isn't offering a &amp;quot;product&amp;quot; that someone buys; rather its mission is to train pastors, professors, and missionaries for a lifetime of service. If you call an admissions counselor and ask why you should go to DTS, you won't get a sales pitch. The admissions counselor will tell you that you should go to the school to which God is calling you. The admissions person will then mention some of DTS's strengths, but stay away from comparisons with other schools or &amp;quot;selling DTS.&amp;quot; Still, it is important for DTS to inform prospective students on what kind of school it is and what it's strengths are. Basic marketing ideas can help convey this, and naturally the web is a great place to start. Context for the Advertisements Any time you create an ad for a &amp;quot;company,&amp;quot; it is important to know the background of the business and the historical context in which the ad is situated. This history of seminaries and churches in America is key to understanding what ads will communicate to the seminary audience. &amp;#160; In the early 1900s, was a debate in the Christian church between &amp;quot;fundamentalists&amp;quot; (those who believe certain truths are the most important thing about Christianity) and &amp;quot;liberals&amp;quot; (those who believe certain actions are the most important thing about Christianity). In this debate, it seemed that the &amp;quot;liberals&amp;quot; forgot that Jesus asked Christians to believe something (that he is the savior and the Son of God), while the the fundamentalists often forgot that Jesus asked Christians to do something (love others). DTS was started in the 1920s during the fundamentalist movement. Unfortunately, many of the seminaries which started during this time period have a reputation of caring about teaching the Bible, but neglecting to meet real world needs. By the 60s and 70s, some Christians wanted to balance the emphases of both the liberals (loving) and fundamentalists (truth), and there they were called &amp;quot;evangelicals.&amp;quot; Today, this term has become politically decisive and has less positive connotations in many places, so the word &amp;quot;evangelical&amp;quot; communicates something different than it used it. Today's students who are considering seminary are more concerned than ever about balancing these two things and so DTS needs new ways to communicate that it wants to care about Christian beliefs and Christian practices without making one too dominate. These students also don't read traditional Christian publications, so DTS needs to shift from print publications to Internet and from top down communication to allowing prospects to connect to real students. A New Tagline The older taglines for DTS have been things that primarily emphasize Biblical teaching such as &amp;quot;Standing Strong for the Truth&amp;quot; or &amp;quot;Training You Can Trust. Leaders You Can Follow.&amp;quot; We wanted something shorter and somewhat pithy that emphasized both aspects of truth and love. Here's what we came up with. Teach Truth. Love Well. Not too revolutionary, but hopefully it's clear and it communicates. Here's how Google sees it :) Facebook Page and Ads Summary DTS has traditionally run ads on large Christian website like ChristianityToday.com and OnePlace.com. But to reach younger students, we moved over </itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=8a811777-f72e-4372-8b7f-929e8addb9fa</feedburner:origLink></item>
    <item>
      <title>Dynamic Text Replacement with JavaScript and C# ASP.NET</title>
      <description>&lt;h4&gt;What it Does&lt;/h4&gt;  &lt;p&gt;You write some basic markup and include a JavaScript file and some code which replaces normal text with a .NET generated image:&lt;/p&gt;  &lt;pre class="prettyprint"&gt;&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;
h2 { color: #9E100F; size: 22px; }
&amp;lt;/style&amp;gt;

&amp;lt;!-- This says &amp;quot;Frequently asked questions in zh-TW --&amp;gt;&lt;br /&gt;&amp;lt;!-- If you just see boxes, you need to install Asian fonts on your machine --&amp;gt;
&amp;lt;h2&amp;gt;關於網上教育常見的問題&amp;lt;/h2&amp;gt;

&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;fontreplacer.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
FontReplacer.replace('h2','*', 'MyGreatFont');
&amp;lt;/script&amp;gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://johndyer.name/lab/fontwriter/"&gt;See the DEMO&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will take all h2 tags with any class (*) and replace them with and image rendered using 'MyGreatFont'. This font needs to be installed the c:\windows\fonts\ folder of your server or in the same folder as the .NET script which generates it. Initially the page will look like this (using the standard font for Chinese script on a PC which is 'MS Mincho'):&lt;/p&gt;

&lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="55" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DynamicTextReplacementusingCASP.NET_D615/image6.png" width="294" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;But after the replacement happens, it looks like this:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="55" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DynamicTextReplacementusingCASP.NET_D615/image3.png" width="294" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;With another less formal font, it could look like this:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="55" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DynamicTextReplacementusingCASP.NET_D615/image11.png" width="294" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;Of course, you can use any font installed on the server and it is not limited to Chinese text. Here is an example replacing the default Times New Roman text with Century Gothic:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="44" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DynamicTextReplacementusingCASP.NET_D615/image_19.png" width="340" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="44" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DynamicTextReplacementusingCASP.NET_D615/image_20.png" width="340" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;This may be useful in other scenarios for viewing Unicode text on a machine without Unicode fonts installed (Greek, Hebrew, Arabic, etc.).&lt;/p&gt;

&lt;p&gt;It can also produce anti-aliased PNGs for use on top of an image:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="61" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DynamicTextReplacementusingCASP.NET_D615/image_12.png" width="217" border="0" /&gt; &lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="61" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DynamicTextReplacementusingCASP.NET_D615/image_13.png" width="217" border="0" /&gt; &lt;/p&gt;

&lt;h4&gt;Why I did it&lt;/h4&gt;

&lt;p&gt;Recently, I needed to have the titles for a series of webpages be rendered in a specific Chinese font (see &lt;a href="http://www.dts.edu/chinese"&gt;http://www.dts.edu/chinese&lt;/a&gt; and click on &amp;quot;zh-TW&amp;quot; in the upper right) because the default doesn't look very official (according to my Chinese friends). I wanted to use &lt;a href="http://novemberborn.net/sifr3"&gt;sIFR&lt;/a&gt; which replaces the HTML text node with a Flash file that has the font embedded. The problem is that Chinese fonts are 3-8MB which means the user has to download a gigantic SWF. Also, there can be copyright problems with using sIFR.&lt;/p&gt;

&lt;p&gt;So I turned to .NET to generate images using the font. The basic technique was first published back in a 2004 A List Apart article titled &lt;a href="http://www.alistapart.com/articles/dynatext"&gt;Dynamic Text Replacement&lt;/a&gt;. ALA used JavaScript and PHP and, since then, there have been many permutations of the basic idea, some using &lt;a href="http://www.artypapers.com/csshelppile/pcdtr/"&gt;pure CSS&lt;/a&gt; instead of JavaScript. I haven't seen a good one for .NET, so I had to write my own. I don't like using CSS for some of the &lt;a href="http://www.quirksmode.org/dom/fir.html"&gt;reasons mentioned here&lt;/a&gt;, so I went with JavaScript for the replacement. This way users without images or JavaScript can still see the text. Users with images and JavaScript get a slightly nicer view.&lt;/p&gt;

&lt;h4&gt;How it Works&lt;/h4&gt;

&lt;p&gt;The JavaScript method looks at the HTML element(s) you send it and pulls out the text and font color. It then sends a request to ASP.NET to return an image which renders the text using your assigned font and colors. There are three ways to call it:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;// elements by tag and class
FontReplacer.replace(tag, class, fontName);
// elements by tag and class inside a given elmenent
FontReplacer.replaceIn(element, tag, class, fontName);
// replace array of elements
FontReplacer.replaceElements(elementArray, fontName);&lt;/pre&gt;

&lt;p&gt;This calls up a .NET script which writes the text to an image using the specified font. The C# code can generate a JPG or transparent PNG which happily sits on top of any background and looks very nice. (There is a flag in the JavaScript to to allow the PNG transparency). There are some tricks in .NET for generating a PNG with alpha channels and for saving a JPEG with a specified quality, so here's the full code for that part.&lt;/p&gt;

&lt;pre class="prettyprint"&gt;if (backColor == &amp;quot;transparent&amp;quot;)
{
	MemoryStream io = new MemoryStream();
	bitmap.Save(io, ImageFormat.Png);

	context.Response.ContentType = &amp;quot;image/png&amp;quot;;
	context.Response.BinaryWrite(io.GetBuffer());
}
else
{
	context.Response.ContentType = &amp;quot;image/jpg&amp;quot;;
	SaveAsJpeg(bitmap, context.Response.OutputStream, (long)100);
}
void SaveAsJpeg(Image inputImage, Stream stream, long quality)
{
	 // generate JPEG stuff
	 ImageCodecInfo codecEncoder = GetEncoder(&amp;quot;image/jpeg&amp;quot;);
	 EncoderParameters encoderParams = new EncoderParameters(1);
	 EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
	 encoderParams.Param[0] = qualityParam;
	 inputImage.Save(stream, codecEncoder, encoderParams);
}
ImageCodecInfo GetEncoder(string mimeType)
{
	ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
	foreach (ImageCodecInfo codec in codecs)
	{
		if (codec.MimeType == mimeType)
		{
			return codec;
		}
	}
	return null;

}&lt;/pre&gt;

&lt;p&gt;There are also flags in the JavaScript to force the returned image to be the same height and width as the element you are replacing. By default, the height is forced so that the page doesn't jerk at all, but you should be aware that browsers often report the font size inaccurately. Also, .NET's measurement of the size a given string will take up can include some padding depending on the font, so you may have to play with it for your scenario.&lt;/p&gt;

&lt;p&gt;Lastly, there are some important things to know about using fonts on the server.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;When you install a font on c:\windows\fonts\, IIS doesn't immediately know it's there. You'll need to run the &amp;quot;resetiis&amp;quot; command for IIS to pick up the new fonts. &lt;/li&gt;

  &lt;li&gt;If you're in a hosted environment and can't install fonts, you're still in luck. There is some code to load a *.TTF file in the fontwriter.ashx script. In this case, you'll need to specify the font file name ('gothic.ttf') rather than the installed font name ('Century Gothic'). &lt;/li&gt;

  &lt;li&gt;You might want to adjust the TextRenderingHint hint property at the top if you don't want anti-aliased rendering.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Download &amp;amp; Example&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://johndyer.name/lab/fontwriter/"&gt;Example page&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://johndyer.name/file.axd?file=fontwriter.zip"&gt;Download ASP.NET Dynamic Text Replacement&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/3LCWaO2wnX4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/3LCWaO2wnX4/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/04/23/dynamic-text-replacement-with-javascript-csharp-asp-net.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=2af92b21-9945-45c8-8031-35b4aa66cb76</guid>
      <pubDate>Wed, 23 Apr 2008 09:32:42 -0500</pubDate>
      <category>ASP.NET</category>
      <category>Code Lab</category>
      <category>JavaScript</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=2af92b21-9945-45c8-8031-35b4aa66cb76</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=2af92b21-9945-45c8-8031-35b4aa66cb76</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/04/23/dynamic-text-replacement-with-javascript-csharp-asp-net.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=2af92b21-9945-45c8-8031-35b4aa66cb76</wfw:commentRss>
    <enclosure url="http://johndyer.name/file.axd?file=fontwriter.zip" length="115742" type="application/octet-stream" /><media:content url="http://johndyer.name/file.axd?file=fontwriter.zip" fileSize="115742" type="application/octet-stream" /><itunes:explicit>no</itunes:explicit><itunes:subtitle>What it Does You write some basic markup and include a JavaScript file and some code which replaces normal text with a .NET generated image: &amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt; h2 { color: #9E100F; size: 22px; } &amp;lt;/style&amp;gt; &amp;lt;!-- This says &amp;quot;</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary>What it Does You write some basic markup and include a JavaScript file and some code which replaces normal text with a .NET generated image: &amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt; h2 { color: #9E100F; size: 22px; } &amp;lt;/style&amp;gt; &amp;lt;!-- This says &amp;quot;Frequently asked questions in zh-TW --&amp;gt; &amp;lt;!-- If you just see boxes, you need to install Asian fonts on your machine --&amp;gt; &amp;lt;h2&amp;gt;關於網上教育常見的問題&amp;lt;/h2&amp;gt; &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;fontreplacer.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt; FontReplacer.replace('h2','*', 'MyGreatFont'); &amp;lt;/script&amp;gt; See the DEMO This will take all h2 tags with any class (*) and replace them with and image rendered using 'MyGreatFont'. This font needs to be installed the c:\windows\fonts\ folder of your server or in the same folder as the .NET script which generates it. Initially the page will look like this (using the standard font for Chinese script on a PC which is 'MS Mincho'): But after the replacement happens, it looks like this: With another less formal font, it could look like this: Of course, you can use any font installed on the server and it is not limited to Chinese text. Here is an example replacing the default Times New Roman text with Century Gothic: This may be useful in other scenarios for viewing Unicode text on a machine without Unicode fonts installed (Greek, Hebrew, Arabic, etc.). It can also produce anti-aliased PNGs for use on top of an image: Why I did it Recently, I needed to have the titles for a series of webpages be rendered in a specific Chinese font (see http://www.dts.edu/chinese and click on &amp;quot;zh-TW&amp;quot; in the upper right) because the default doesn't look very official (according to my Chinese friends). I wanted to use sIFR which replaces the HTML text node with a Flash file that has the font embedded. The problem is that Chinese fonts are 3-8MB which means the user has to download a gigantic SWF. Also, there can be copyright problems with using sIFR. So I turned to .NET to generate images using the font. The basic technique was first published back in a 2004 A List Apart article titled Dynamic Text Replacement. ALA used JavaScript and PHP and, since then, there have been many permutations of the basic idea, some using pure CSS instead of JavaScript. I haven't seen a good one for .NET, so I had to write my own. I don't like using CSS for some of the reasons mentioned here, so I went with JavaScript for the replacement. This way users without images or JavaScript can still see the text. Users with images and JavaScript get a slightly nicer view. How it Works The JavaScript method looks at the HTML element(s) you send it and pulls out the text and font color. It then sends a request to ASP.NET to return an image which renders the text using your assigned font and colors. There are three ways to call it: // elements by tag and class FontReplacer.replace(tag, class, fontName); // elements by tag and class inside a given elmenent FontReplacer.replaceIn(element, tag, class, fontName); // replace array of elements FontReplacer.replaceElements(elementArray, fontName); This calls up a .NET script which writes the text to an image using the specified font. The C# code can generate a JPG or transparent PNG which happily sits on top of any background and looks very nice. (There is a flag in the JavaScript to to allow the PNG transparency). There are some tricks in .NET for generating a PNG with alpha channels and for saving a JPEG with a specified quality, so here's the full code for that part. if (backColor == &amp;quot;transparent&amp;quot;) { MemoryStream io = new MemoryStream(); bitmap.Save(io, ImageFormat.Png); context.Response.ContentType = &amp;quot;image/png&amp;quot;; context.Response.BinaryWrite(io.GetBuffer()); } else { context.Response.ContentType = &amp;quot;image/jpg&amp;quot;; SaveAsJpeg(bitmap, context.Response.OutputStream, (long)100); } void SaveAsJpeg(Image inputImage, Stream stream, long quality) { // gener</itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=2af92b21-9945-45c8-8031-35b4aa66cb76</feedburner:origLink></item>
    <item>
      <title>var baby = john.Meiosis() + amber.Meiosis();</title>
      <description>&lt;p&gt;
Just a little genetics (my college major)  humor written in C# 3.0 syntax (with overloaded operators and an implicitely typed local var) to announce that we&amp;#39;re going to be parents later this fall! Check out the sweet spin moves below. I&amp;#39;m calling all-star running back...
&lt;/p&gt;
&lt;p&gt;
&lt;div id="offspring01_sonogram_container" style="width:480px;height:380px;" class="flashVideo"&gt;
	
	&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" 
	   codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" 
	   width="480" height="380" id="offspring01_sonogram_obj" align="middle" flashvars="autostart=false&amp;file=http://johndyer.name/flashvideo/offspring01_sonogram.flv&amp;image=http://johndyer.name/flashvideo/offspring01_sonogram.jpg"&gt;
	&lt;param name="allowScriptAccess" value="sameDomain" /&gt;
	&lt;param name="movie" value="http://johndyer.name/flashvideo/flvplayer.swf" /&gt;
	&lt;param name="quality" value="high" /&gt;
	&lt;param name="bgcolor" value="#ffffff" /&gt;
	&lt;embed src="http://johndyer.name/flashvideo/flvplayer.swf" quality="high" bgcolor="#ffffff" width="480" 
	   height="380" name="mymovie" align="middle" allowScriptAccess="sameDomain" 
	   flashvars="autostart=false&amp;file=http://johndyer.name/flashvideo/offspring01_sonogram.flv&amp;image=http://johndyer.name/flashvideo/offspring01_sonogram.jpg"
	   type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" /&gt;
	&lt;/object&gt;						
							&lt;/div&gt;&lt;p&gt;&lt;a href="http://johndyer.name/flashvideo/offspring01_sonogram.flv"&gt;offspring01_sonogram.flv&lt;/a&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;ldquo;&lt;span&gt;Behold, children are a gift of the LORD; The fruit of the womb is a reward.&amp;rdquo; Psalm 127:3&lt;/span&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/-pait6ZLcSc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/-pait6ZLcSc/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/04/16/var-baby-john-Meiosis-amber-Meiosis.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=f92ff5d2-a104-4d59-9bcc-6aafa7b84bda</guid>
      <pubDate>Wed, 16 Apr 2008 19:21:00 -0500</pubDate>
      <category>Off Topic</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=f92ff5d2-a104-4d59-9bcc-6aafa7b84bda</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=f92ff5d2-a104-4d59-9bcc-6aafa7b84bda</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/04/16/var-baby-john-Meiosis-amber-Meiosis.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=f92ff5d2-a104-4d59-9bcc-6aafa7b84bda</wfw:commentRss>
    <enclosure url="http://johndyer.name/flashvideo/offspring01_sonogram.flv" length="6967045" type="video/x-flv" /><media:content url="http://johndyer.name/flashvideo/offspring01_sonogram.flv" fileSize="6967045" type="video/x-flv" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> Just a little genetics (my college major) humor written in C# 3.0 syntax (with overloaded operators and an implicitely typed local var) to announce that we&amp;#39;re going to be parents later this fall! Check out the sweet spin moves below. I&amp;#39;m calling </itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> Just a little genetics (my college major) humor written in C# 3.0 syntax (with overloaded operators and an implicitely typed local var) to announce that we&amp;#39;re going to be parents later this fall! Check out the sweet spin moves below. I&amp;#39;m calling all-star running back... offspring01_sonogram.flv &amp;ldquo;Behold, children are a gift of the LORD; The fruit of the womb is a reward.&amp;rdquo; Psalm 127:3 &amp;nbsp; </itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=f92ff5d2-a104-4d59-9bcc-6aafa7b84bda</feedburner:origLink></item>
    <item>
      <title>Dallas Seminary Mobile Site</title>
      <description>&lt;p&gt;Since &lt;a href="http://www.flashdevices.net/2008/03/microsoft-licenses-flash-lite-3-and.html"&gt;Microsoft&lt;/a&gt; and &lt;a href="http://www.flashdevices.net/2008/03/adobe-flash-player-coming-to-iphone.html"&gt;Apple&lt;/a&gt; finally decided to allow/license versions of &lt;a href="http://www.adobe.com/products/flashlite/"&gt;Flash Lite 3.0&lt;/a&gt; for their mobile devices (Windows Mobile and iPhone), I created an initial build of a mobile site for Dallas Seminary which will eventually use Flash Lite 3.0 for all the audio and video content.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Main site: &lt;a href="http://www.dts.edu"&gt;www.dts.edu&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Mobile site: &lt;a href="http://mobile.dts.edu"&gt;mobile.dts.edu&lt;/a&gt;&amp;#160; (view with &lt;a href="iphonetester.com/?url=http%3A%2F%2Fmobile.dts.edu"&gt;iPhone tester&lt;/a&gt;) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The goal was to make it look like an iPhone application using the list format, but have it work properly on other mobile devices by not specifically targeting the iPhone's screen size such as Windows Mobile and Blackberry. It's a bit more cramped on the smaller WM screen, but it works well.&lt;/p&gt;  &lt;p&gt;Here are a few screen shots:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="500" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="250"&gt;iPhone&lt;/td&gt;        &lt;td valign="top" width="250"&gt;Windows Mobile&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="250"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="485" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DallasSeminaryMobileSite_D1D7/image_3.png" width="324" border="0" /&gt; &lt;/td&gt;        &lt;td valign="top" width="250"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="324" alt="dts_wm_home" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DallasSeminaryMobileSite_D1D7/dts_wm_home_3.png" width="244" border="0" /&gt; &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="250"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="485" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DallasSeminaryMobileSite_D1D7/image_9.png" width="324" border="0" /&gt; &lt;/td&gt;        &lt;td valign="top" width="250"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="324" alt="dts_wm_media" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DallasSeminaryMobileSite_D1D7/dts_wm_media_3.png" width="244" border="0" /&gt; &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;There is one gotcha on the iPhone that doesn't show up using Safari. The iPhone may try to startup zoomed out like it would need for a normal website. If your &amp;lt;div&amp;gt; tags are set to expand, the iPhone will stretch everything out and then zoom out.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="482" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DallasSeminaryMobileSite_D1D7/image_10.png" width="324" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;To fix this add the following:&lt;/p&gt;  &lt;pre class="prettyprint"&gt;&amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;user-scalable=no,width=320,scale=1.0&amp;quot; /&amp;gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/HjLToIPny6Q" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/HjLToIPny6Q/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/04/14/Dallas-Seminary-Mobile-Site.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=4f9e50fa-2d31-4898-a736-acba0022ee89</guid>
      <pubDate>Mon, 14 Apr 2008 15:56:10 -0500</pubDate>
      <category>ASP.NET</category>
      <category>Dallas Seminary</category>
      <category>Flash</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=4f9e50fa-2d31-4898-a736-acba0022ee89</pingback:target>
      <slash:comments>7</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=4f9e50fa-2d31-4898-a736-acba0022ee89</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/04/14/Dallas-Seminary-Mobile-Site.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=4f9e50fa-2d31-4898-a736-acba0022ee89</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=4f9e50fa-2d31-4898-a736-acba0022ee89</feedburner:origLink></item>
    <item>
      <title>Totally Unobtrusive (and totally awesome) Upside Down Text</title>
      <description>&lt;p&gt;There is a huge need for upside down text on the web. With everyone &amp;quot;going mobile,&amp;quot; developers cannot simply rely on users having their screens oriented the same way all the time. I went through all of the possible options for creating upside down text and finally came up with a totally unobtrusive, Unicode enabled, completely web-changing piece of code (which is mostly from &lt;a href="http://www.sevenwires.com/play/UpsideDownLetters.html"&gt;someone else&lt;/a&gt; and using &lt;a href="http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/"&gt;this&lt;/a&gt; and &lt;a href="http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html"&gt;this&lt;/a&gt;).&lt;/p&gt;  &lt;h4&gt;Options for Upside Down Text&lt;/h4&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Images&lt;/strong&gt;&lt;em&gt; &lt;/em&gt;- The most obvious option for upside down text is to open up Photoshop, enter some text, and use Rotate Canvas.       &lt;br /&gt;&lt;em&gt;Pros:&lt;/em&gt; easy to do.       &lt;br /&gt;&lt;em&gt;Cons:&lt;/em&gt; must be done for every piece of text. Not every OS/browser in the world can display images. This is just unacceptable.       &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;sIFR&lt;/strong&gt; - I know it's a little 2005 of me to say it, but a great use of Flash is to &lt;a href="http://www.mikeindustries.com/sifr"&gt;replace text&lt;/a&gt; and rotate it around.       &lt;br /&gt;&lt;em&gt;Pros: &lt;/em&gt;works for any HTML text element.       &lt;br /&gt;&lt;em&gt;Cons: &lt;/em&gt;requires Flash which has even less support than images. Also, requires extra coding.       &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Canvas&lt;/strong&gt; - one day it might be possible to do more with &lt;a href="http://www.federated.com/~jim/canvastext/"&gt;text drawing on a canvas tag&lt;/a&gt;, but right now its not       &lt;br /&gt;&lt;em&gt;Pros: &lt;/em&gt;none, for now.       &lt;br /&gt;&lt;em&gt;Cons: &lt;/em&gt;doesn't exist.       &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;JavaScript&lt;em&gt; &lt;/em&gt;&lt;/strong&gt;- Everyone knows JavaScript can do anything. See my experiments in &lt;a href="http://johndyer.name//post/2007/12/Stupid-JavaScript-Tricks-3D-Panorama.aspx"&gt;3D&lt;/a&gt; and &lt;a href="http://johndyer.name//post/2007/09/PhotoShop-like-JavaScript-Color-Picker.aspx"&gt;color&lt;/a&gt; and &lt;a href="http://www.overdrawn.net/mario/"&gt;this guy's port of Mario&lt;/a&gt;. Using &lt;a href="http://www.sevenwires.com/play/UpsideDownLetters.html"&gt;this great script&lt;/a&gt; its possible to simulate upside down characters using Unicode equivalents.      &lt;br /&gt;&lt;em&gt;Pros: &lt;/em&gt;is awesome.       &lt;br /&gt;&lt;em&gt;Cons: &lt;/em&gt;nothing at all. &lt;/li&gt; &lt;/ol&gt;  &lt;h4&gt;Usage &amp;amp;Implementation&lt;/h4&gt;  &lt;p&gt;Just give your HTML element a class called &amp;quot;upsidedowntext&amp;quot; and add the script in the header and you have pure greatness:&lt;/p&gt;  &lt;div class="indent" style="margin-left: 20px"&gt;   &lt;pre class="prettyprint"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;upsidedown.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;div class=&amp;quot;upsidedowntext&amp;quot;&amp;gt;I can be read in any orientation&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div&amp;gt;I can be read in any orientation&amp;lt;/div&amp;gt;

&amp;lt;div class=&amp;quot;upsidedowntext&amp;quot;&amp;gt;This is Tom Cruise taking your picture&amp;lt;/div&amp;gt;
&amp;lt;div&amp;gt;This is a boring Russian Mig&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Result:&lt;/p&gt;

&lt;div class="indent" style="margin-left: 20px"&gt;
  &lt;div&gt;uoıʇɐʇuǝıɹo ʎuɐ uı pɐǝɹ ǝq uɐɔ ı&lt;/div&gt;

  &lt;div&gt;I can be read in any orientation&lt;/div&gt;

  &lt;br /&gt;

  &lt;div&gt;ǝɹnʇɔıd ɹnoʎ ƃuıʞɐʇ ǝsınɹɔ ɯoʇ sı sıɥʇ&lt;/div&gt;

  &lt;div&gt;This is a boring Russian Mig &lt;/div&gt;
&lt;/div&gt;

&lt;h4&gt;Demo and Download&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://johndyer.name/lab/upsidedowntext/"&gt;Upside down text in action&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
  &lt;br /&gt;Note: this post was intended to be an light-hearted (late) April's fools poke at all the random stuff developers are doing with JavaScript, sometimes in the name of a standard or idea that really isn't really needed. Also, I think upside down text is funny.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/mXyNx0aA1WA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/mXyNx0aA1WA/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/04/10/Stupid-JavaScript-Tricks-Totally-Unobtrusive-Upside-Down-Text.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=9d57a900-b504-4c44-8cbe-e9f710c5cfce</guid>
      <pubDate>Thu, 10 Apr 2008 17:38:26 -0500</pubDate>
      <category>JavaScript</category>
      <category>Off Topic</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=9d57a900-b504-4c44-8cbe-e9f710c5cfce</pingback:target>
      <slash:comments>7</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=9d57a900-b504-4c44-8cbe-e9f710c5cfce</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/04/10/Stupid-JavaScript-Tricks-Totally-Unobtrusive-Upside-Down-Text.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=9d57a900-b504-4c44-8cbe-e9f710c5cfce</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=9d57a900-b504-4c44-8cbe-e9f710c5cfce</feedburner:origLink></item>
    <item>
      <title>QTVR like Panoramas of Chichen Itza made in Flash with Papervision3D</title>
      <description>&lt;p&gt;
Last week, I visited Cancun with my in-laws and had a chance to see the ruins at &lt;a href="http://en.wikipedia.org/wiki/Chichen_Itza"&gt;Chichen Itza&lt;/a&gt;. I took a series of photos and made them into a panorama using &lt;a href="http://www.papervision3d.org/"&gt;Papervision3D&lt;/a&gt; (as done &lt;a href="http://labs.blitzagency.com/?p=388"&gt;here by BlitzAgency for NBC&amp;#39;s The Office&lt;/a&gt; and &lt;a href="http://flashpanoramas.com/blog/2007/05/23/add-some-life-to-panoramas/"&gt;here by a company selling a product called Flash Panoramas&lt;/a&gt;). I made a little script that can handle both spherical and cubic images to see how both would look. Here&amp;#39;s some previews of the two versions (The lines are there to show how the panorama is being constructed):
&lt;/p&gt;
  
&lt;table border="0" cellspacing="0" cellpadding="2" width="500"&gt;
	&lt;tbody&gt;
		     
		&lt;tr&gt;
			       
			&lt;td width="250" valign="top"&gt;&lt;strong&gt;Spherical&lt;/strong&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
			&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/QTVRlikePanoramasofChichenItzamadeinFlas_CD9D/CropperCapture%5B45%5D_2.jpg"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/QTVRlikePanoramasofChichenItzamadeinFlas_CD9D/CropperCapture%5B45%5D_thumb.jpg" border="0" alt="CropperCapture[45]" width="280" height="215" /&gt;&lt;/a&gt; &lt;/td&gt;        
			&lt;td width="250" valign="top"&gt;&lt;strong&gt;Cubic&lt;/strong&gt;&lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/CropperCapture[42][3].jpg"&gt;            &lt;br /&gt;
			&lt;/a&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/QTVRlikePanoramasofChichenItzamadeinFlas_CD9D/CropperCapture%5B42%5D_4.jpg"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/QTVRlikePanoramasofChichenItzamadeinFlas_CD9D/CropperCapture%5B42%5D_thumb_1.jpg" border="0" alt="CropperCapture[42]" width="280" height="215" /&gt;&lt;/a&gt; &lt;/td&gt;     
		&lt;/tr&gt;
		   
	&lt;/tbody&gt;
&lt;/table&gt;
  
&lt;p&gt;
A cubsic panorama is composed of six images (top, bottom, left, right, front, back) while a spherical panorama is made using a single image which is stretched at the top and bottom (like a map of the world where Greenland and Antarctica are distorted). In general, it looks like the spherical version can generate the same level of detail with fewer polygons and thus more speed, but the cubic images can be a little smaller and are more easily edited.
&lt;/p&gt;
  
&lt;p&gt;
Each of these is composed from approximately 45-50 images. I took around 15 in a circle at the horizon, 15 looking up about 45 degrees, and 15 looking down 45 degrees. Unfortunately, I didn&amp;#39;t take enough pictures to complete the sky or the ground below, so you&amp;#39;ll see some black spots if you &amp;quot;look&amp;quot; up or down. I used &lt;a href="http://hugin.sourceforge.net/"&gt;Hugin&lt;/a&gt; to stitch the images together, and it did a pretty good job considering I didn&amp;#39;t have a tripod or wide angle lens to accurately take the pictures. (link: &lt;a href="http://rosaurophotography.com/html/technical.html"&gt;the best tutorial I have seen on image stitching&lt;/a&gt;)
&lt;/p&gt;
  
&lt;p&gt;
&lt;strong&gt;3D Panoramas&lt;/strong&gt;
&lt;/p&gt;
  
&lt;ul&gt;
	   
	&lt;li&gt;Pyramid: &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/?image=pyramid"&gt;spherical&lt;/a&gt; | &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/?image=pyramid&amp;amp;mode=cube"&gt;cubic&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;Ball court: &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/?image=ballcourt"&gt;spherical&lt;/a&gt; | &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/?image=ballcourt&amp;amp;mode=cube"&gt;cubic&lt;/a&gt; &lt;/li&gt; 
&lt;/ul&gt;
  
&lt;p&gt;
&lt;strong&gt;Original Images&lt;/strong&gt;
&lt;/p&gt;
  
&lt;ul&gt;
	   
	&lt;li&gt;Pyramid:      
	&lt;ul&gt;
		       
		&lt;li&gt;&lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/pyramid.jpg"&gt;sphere&lt;/a&gt; &lt;/li&gt;        
		&lt;li&gt;&lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/pyramid_0.jpg"&gt;front&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/pyramid_1.jpg"&gt;right&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/pyramid_2.jpg"&gt;back&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/pyramid_3.jpg"&gt;left&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/pyramid_4.jpg"&gt;top&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/pyramid_5.jpg"&gt;bottom&lt;/a&gt; &lt;/li&gt;     
	&lt;/ul&gt;
	   &lt;/li&gt;    
	&lt;li&gt;Ball Court      
	&lt;ul&gt;
		       
		&lt;li&gt;&lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/ballcourt.jpg"&gt;sphere&lt;/a&gt; &lt;/li&gt;        
		&lt;li&gt;&lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/ballcourt_0.jpg"&gt;front&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/ballcourt_1.jpg"&gt;right&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/ballcourt_2.jpg"&gt;back&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/ballcourt_3.jpg"&gt;left&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/ballcourt_4.jpg"&gt;top&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/ballcourt_5.jpg"&gt;bottom&lt;/a&gt; &lt;/li&gt;     
	&lt;/ul&gt;
	   &lt;/li&gt; 
&lt;/ul&gt;
  
&lt;p&gt;
The view page also has a list of commands (f=fullscreen) and links to the original files.
&lt;/p&gt;
  
&lt;p&gt;
&lt;strong&gt;Update: &lt;/strong&gt;I changed the navigation to be more like QTVR where you have to click to move, and there is an arrow cursor. Also, smoothing and precision are automatically applied when you stop moving.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/1Gx3-6WEnoM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/1Gx3-6WEnoM/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/03/16/QTVR-like-Panoramas-of-Chichen-Itza-made-in-Flash-with-Papervision.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=fddd2cd2-321d-4d96-822e-53da580255dc</guid>
      <pubDate>Sun, 16 Mar 2008 15:38:00 -0500</pubDate>
      <category>Code Lab</category>
      <category>Flash</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=fddd2cd2-321d-4d96-822e-53da580255dc</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=fddd2cd2-321d-4d96-822e-53da580255dc</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/03/16/QTVR-like-Panoramas-of-Chichen-Itza-made-in-Flash-with-Papervision.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=fddd2cd2-321d-4d96-822e-53da580255dc</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=fddd2cd2-321d-4d96-822e-53da580255dc</feedburner:origLink></item>
    <item>
      <title>Data Portability Pack now in BlogEngine.NET Core</title>
      <description>&lt;p&gt;
The &lt;a href="http://johndyer.name/post/2008/02/Data-Portability-Pack-for-BlogEngineNET.aspx"&gt;Data Portability Pack that I posted about&lt;/a&gt; a few weeks ago has now made it into the core of BlogEngine.NET for version 1.4. &lt;a href="http://blog.madskristensen.dk/post/Be-in-charge-of-your-online-life.aspx"&gt;Mads Kristensen added the SIOC and APML&lt;/a&gt; handlers, and &lt;a href="http://www.romanclarkson.us/"&gt;Roman Clarkson&lt;/a&gt; is working on a FOAF implementation that includes adding some Profile data (first and last name, etc.) to users of a BE.NET instance. 
&lt;/p&gt;
&lt;p&gt;
FOAF (friend of a friend) currently doesn&amp;#39;t have any way of (1) automatting &amp;quot;Add as Friend&amp;quot; style interactions (like Facebook or Myspace) or (2) verifying connections between people. Roman and I would like to find a secure way of implementing this functionality which would in effect create a decentralized social network. There are however, several problems to work through regarding security (public vs. private friends lists), identification (unique IDs: email or OpenID?), verification (preventing friend spam), and so on. These issues have been talked about for some time in the FOAF community, but so far there hasn&amp;#39;t been an implementation. Here are some older (2003) and newer (2007) discussions on the subject to get caught up:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.w3.org/2001/sw/Europe/events/foaf-galway/papers/pp/semblog_personal_publishing_platform/" target="_blank"&gt;http://www.w3.org/2001/sw/Europe/events/foaf-galway/papers/pp/semblog_personal_publishing_platform/&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://lists.foaf-project.org/pipermail/foaf-dev/2003-June/005405.html" target="_blank"&gt;http://lists.foaf-project.org/pipermail/foaf-dev/2003-June/005405.html&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.knowing.net/PermaLink,guid,2b569984-7ee9-4a66-b009-156fd5f5cb33.aspx" target="_blank"&gt;http://www.knowing.net/PermaLink,guid,2b569984-7ee9-4a66-b009-156fd5f5cb33.aspx&lt;/a&gt;&lt;br /&gt;
	&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/HUcZCPm9MC0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/HUcZCPm9MC0/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/03/12/Data-Portability-Pack-now-in-BlogEngineNET-Core.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=379f05b3-7ab4-4870-ad09-a5876c8b95ae</guid>
      <pubDate>Wed, 12 Mar 2008 14:41:00 -0500</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=379f05b3-7ab4-4870-ad09-a5876c8b95ae</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=379f05b3-7ab4-4870-ad09-a5876c8b95ae</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/03/12/Data-Portability-Pack-now-in-BlogEngineNET-Core.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=379f05b3-7ab4-4870-ad09-a5876c8b95ae</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=379f05b3-7ab4-4870-ad09-a5876c8b95ae</feedburner:origLink></item>
    <item>
      <title>Implementing Map Mashups with Mapstraction</title>
      <description>&lt;p&gt;
&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/ImplementingMapMashupswithMapstraction_10E49/image_13.png" border="0" alt="image" width="260" height="204" align="right" /&gt; A few years ago, I made my &lt;a href="http://johndyer.name/post/2005/07/Google-Maps-(gmaps)--DTS-Church-Search.aspx"&gt;first map mashup&lt;/a&gt; with Google Maps for &lt;a href="http://www.dts.edu/"&gt;Dallas Theological Seminary&lt;/a&gt;. It allows visitors to search for churches around the world where DTS alumni are serving. Recently, we decided to update the mashup with several features in mind:
&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Larger map - 2 years ago we were using a 800px wide layout and now we can use a 1024px layout  &lt;/li&gt;
	&lt;li&gt;Use updated API - Google has changed APIs since then  &lt;/li&gt;
	&lt;li&gt;Implement other maps - Yahoo and Microsoft each have good points  &lt;/li&gt;
	&lt;li&gt;Use custom icons - we are not just showing churches now, but also schools and counselors&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
To handle all of this, especially the implementation of other multiple map engines, I chose to use &lt;a href="http://www.mapstraction.com/"&gt;mapstraction&lt;/a&gt;, a JavaScript layer which allows developers to program against a common API for all mapping engines. It turns these two proprietary mapping code blocks:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
// Google maps specific code
var gmap = new GMap2(document.getElementById(&amp;quot;map&amp;quot;));
map.addControl(new GMapTypeControl());
gmap.setCenter(new GLatLng(37.4419, -122.1419), 13);
var gmarker = new GMarker( new GLatLng(37.443, -122.166) );
gmap.addOverlay(gmarker);
// Microsoft Live maps specific code
mmap = new VEMap(&amp;#39;map&amp;#39;);
mmap.SetDashboardSize(VEDashboardSize.Normal);
mmap.LoadMap();
mmap.SetCenterAndZoom(new VELatLong(37.4419, -122.1419), 10);
var shape = new VEShape(VEShapeType.Pushpin, new VELatLong(37.443, -122.166));
map.AddShape(shape);
&lt;/pre&gt;
&lt;p&gt;
into this single common set of code:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
// universal map API, just change &amp;#39;google&amp;#39; to &amp;#39;yahoo&amp;#39;, &amp;#39;microsoft&amp;#39;, etc.
var mapstraction = new Mapstraction(&amp;#39;map&amp;#39;,&amp;#39;google&amp;#39;);
mapstraction.addControls({ pan: true, zoom: &amp;#39;large&amp;#39;, overview: false, scale: true, map_type: true });
mapstraction.setCenterAndZoom(new LatLonPoint(37.4419, -122.1419), 12);
var marker = new Marker(new LatLonPoint(37.443, -122.166));
mapstraction.addMarker(marker);
&lt;/pre&gt;
&lt;p&gt;
In addition to &lt;a href="http://maps.live.com/"&gt;Microsoft&lt;/a&gt;, &lt;a href="http://maps.yahoo.com/"&gt;Yahoo&lt;/a&gt;, and &lt;a href="http://maps.google.com/"&gt;Google&lt;/a&gt; maps, you also get free access to a 3D map called &lt;a href="http://freeearth.poly9.com/"&gt;Freeearth&lt;/a&gt; which is an amazing implementation of a 3D globe map (like Google Earth) using Papervision3D.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Examples&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Here are examples using all four mapping engines. The only unique code is the shadow on the icons under Google maps. Also, &lt;a href="http://www.prototypejs.org/"&gt;prototype&lt;/a&gt; (which is used throughout the site) is handling the AJAX calls.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/ImplementingMapMashupswithMapstraction_10E49/image_2.png"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/ImplementingMapMashupswithMapstraction_10E49/image_thumb.png" border="0" alt="image" width="250" height="212" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/ImplementingMapMashupswithMapstraction_10E49/image_6.png"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/ImplementingMapMashupswithMapstraction_10E49/image_thumb_2.png" border="0" alt="image" width="250" height="212" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/ImplementingMapMashupswithMapstraction_10E49/image_8.png"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/ImplementingMapMashupswithMapstraction_10E49/image_thumb_3.png" border="0" alt="image" width="250" height="212" /&gt;&lt;/a&gt; &lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/ImplementingMapMashupswithMapstraction_10E49/image_10.png"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/ImplementingMapMashupswithMapstraction_10E49/image_thumb_4.png" border="0" alt="image" width="250" height="212" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Try it out&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Find a Church - &lt;a href="http://www.dts.edu/alumni/findachurch/?map=google"&gt;Google&lt;/a&gt;, &lt;a href="http://www.dts.edu/alumni/findachurch/?map=microsoft"&gt;Microsoft&lt;/a&gt;, &lt;a href="http://www.dts.edu/alumni/findachurch/?map=yahoo"&gt;Yahoo&lt;/a&gt;, &lt;a href="http://www.dts.edu/alumni/findachurch/?map=freeearth"&gt;Freeearth3D&lt;/a&gt; 
	&lt;/li&gt;
	&lt;li&gt;Find a Counselor - &lt;a href="http://www.dts.edu/alumni/findacounselor/?map=google"&gt;Google&lt;/a&gt;, &lt;a href="http://www.dts.edu/alumni/findacounselor/?map=microsoft"&gt;Microsoft&lt;/a&gt;, &lt;a href="http://www.dts.edu/alumni/findacounselor/?map=yahoo"&gt;Yahoo&lt;/a&gt;, &lt;a href="http://www.dts.edu/alumni/findacounselor/?map=freeearth"&gt;Freeearth3D&lt;/a&gt; 
	&lt;/li&gt;
	&lt;li&gt;Find a School - &lt;a href="http://www.dts.edu/alumni/findachurch/?map=google"&gt;Google&lt;/a&gt;, &lt;a href="http://www.dts.edu/alumni/findaschool/?map=microsoft"&gt;Microsoft&lt;/a&gt;, &lt;a href="http://www.dts.edu/alumni/findaschool/?map=yahoo"&gt;Yahoo&lt;/a&gt;, &lt;a href="http://www.dts.edu/alumni/findaschool/?map=freeearth"&gt;Freeearth3D&lt;/a&gt;
	&lt;/li&gt;
	&lt;li&gt;Old &lt;a href="http://www.dts.edu/alumni/findachurchold/"&gt;Find a Church&lt;/a&gt; page&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Links&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.mapstraction.com/"&gt;Mapstraction&lt;/a&gt; 
	&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://code.google.com/apis/maps/"&gt;Google Maps API docs&lt;/a&gt; 
	&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://dev.live.com/virtualearth/sdk"&gt;Microsoft Live Maps API docs&lt;/a&gt; 
	&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://developer.yahoo.com/maps/"&gt;Yahoo Maps API docs&lt;/a&gt; 
	&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://freeearth.poly9.com/api/documentation.php"&gt;Freeearth docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/pHNtyZQMdG0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/pHNtyZQMdG0/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/02/21/Implementing-Map-Mashups-with-Mapstraction.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=4eec6c99-e092-44f3-bf22-00a0559e991b</guid>
      <pubDate>Thu, 21 Feb 2008 18:45:00 -0500</pubDate>
      <category>Dallas Seminary</category>
      <category>JavaScript</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=4eec6c99-e092-44f3-bf22-00a0559e991b</pingback:target>
      <slash:comments>9</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=4eec6c99-e092-44f3-bf22-00a0559e991b</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/02/21/Implementing-Map-Mashups-with-Mapstraction.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=4eec6c99-e092-44f3-bf22-00a0559e991b</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=4eec6c99-e092-44f3-bf22-00a0559e991b</feedburner:origLink></item>
    <item>
      <title>Data Portability Pack for BlogEngine.NET</title>
      <description>&lt;img style="margin: 10px; float: right" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/IntroductiontothestateofDataPortabilitys_111CE/image_3.png" alt="" /&gt;  
&lt;p&gt;
&lt;strong&gt;What it Does &lt;/strong&gt;
&lt;/p&gt;
 
&lt;p&gt;
This is an initial release of 3 extensions which will add the follow protocols to your &lt;a href="http://www.dotnetblogengine.net"&gt;BlogEngine.NET&lt;/a&gt; blog: 
&lt;/p&gt;
 
&lt;ul&gt;
	 
	&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/SIOC"&gt;SIOC&lt;/a&gt; - Somewhat like RSS, but utilizes RDF to describe connections to&amp;nbsp; other sites and between users and posts (&lt;a href="http://johndyer.name/sioc.axd"&gt;example&lt;/a&gt;).  &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/APML"&gt;APML&lt;/a&gt; - Creates an &amp;quot;attention profile&amp;quot; of your interests based on tags and categories. Each is given a value based on its frequency (&lt;a href="http://johndyer.name/admin/Pages/apml.axd"&gt;example&lt;/a&gt;).  &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.foaf-project.org/"&gt;FOAF&lt;/a&gt; - A list of your friends, their websites, and a hashed version of their email for a unique key (&lt;a href="http://johndyer.name/foaf.axd"&gt;example&lt;/a&gt;). &lt;/li&gt;
&lt;/ul&gt;
 
&lt;p&gt;
You can see examples of each of these by clicking on the links on the upper right of this blog. To learn more about &lt;a href="http://johndyer.name/post/2008/02/Introduction-to-the-state-of-DataPortability-and-its-standards.aspx"&gt;data portability, see this post&lt;/a&gt;. The following links show this data in a browsable format: 
&lt;/p&gt;
 
&lt;ul&gt;
	 
	&lt;li&gt;&lt;a href="http://sparql.captsolo.net/browser/browser.py?url=http%3A%2F%2Fjohndyer.name%2Fsioc.axd"&gt;SIOC browser&lt;/a&gt;  &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://sparql.captsolo.net/browser/browser.py?url=http%3A%2F%2Fjohndyer.name%2Ffoaf.axd"&gt;FOAF browser&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
 
&lt;p&gt;
&lt;strong&gt;How it Works&lt;/strong&gt; 
&lt;/p&gt;
 
&lt;p&gt;
&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/DataPortabilityPackforBlogEngine.NET_C34F/image_6.png" border="0" alt="image" width="142" height="63" align="right" /&gt;Each of these has a Handler, a Generator, and an Extension file. The extension files automatically add &amp;lt;meta&amp;gt; discovery files to your &amp;lt;head&amp;gt; tag. 
&lt;/p&gt;
 
&lt;p&gt;
&lt;em&gt;Note: &lt;/em&gt;Currently, the FOAF information is stored in two different Extension files due to a limitation in BE.NET 1.3 (it cannot store both scalar and table data). One extension is for your personal information and the other is for your friends&amp;#39; data. BE 1.4 will allow these to be merged into one file. 
&lt;/p&gt;
 
&lt;p&gt;
&lt;em&gt;Warning:&lt;/em&gt; BE.NET currently deletes extension data when you change *.cs files, so please backup your extension file when adding or changing extensions. 
&lt;/p&gt;
 
&lt;p&gt;
&lt;strong&gt;Installation and Usage&lt;/strong&gt; 
&lt;/p&gt;
 
&lt;ol&gt;
	 
	&lt;li&gt;Download &lt;a href="http://johndyer.name/file.axd?file=BE-DataPortability.zip"&gt;Data Portability Pack for BlogEngine.NET&lt;/a&gt;  &lt;/li&gt;
	&lt;li&gt;Copy the *.cs files into your /App_Code/Extensions folder (you can also create a sub-directory within that folder)  &lt;/li&gt;
	&lt;li&gt;Add the following to your web.config file&lt;br /&gt;
	&lt;pre class="prettyprint"&gt;
	&amp;lt;add verb=&amp;quot;*&amp;quot; path=&amp;quot;sioc.axd&amp;quot; type=&amp;quot;BlogEngine.DataPortability.SiocHandler, App_Code&amp;quot; validate=&amp;quot;false&amp;quot;/&amp;gt;
	&amp;lt;add verb=&amp;quot;*&amp;quot; path=&amp;quot;foaf.axd&amp;quot; type=&amp;quot;BlogEngine.DataPortability.FoafHandler, App_Code&amp;quot; validate=&amp;quot;false&amp;quot;/&amp;gt;
	&amp;lt;add verb=&amp;quot;*&amp;quot; path=&amp;quot;apml.axd&amp;quot; type=&amp;quot;BlogEngine.DataPortability.ApmlHandler, App_Code&amp;quot; validate=&amp;quot;false&amp;quot;/&amp;gt;	
	&lt;/pre&gt;
	&lt;/li&gt;
	&lt;li&gt;Go to your Admin-&amp;gt;Extensions page and you should see 4 extensions prefixed with &amp;quot;DP_&amp;quot;. The FoafFriends and MyProfile extensions need data entered, the other ones you can just leave as their defaults.&lt;br /&gt;
	&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/DataPortabilityPackforBlogEngine.NET_C34F/image_3.png" border="0" alt="image" width="446" height="99" /&gt; 
	&lt;/li&gt;
	&lt;li&gt;Optionally, you can add links to each of these files (as I have on the upper right) &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;strong&gt;Future Work&lt;/strong&gt; 
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Merge FOAF extensions for BE 1.4 
	&lt;/li&gt;
	&lt;li&gt;Possibly store FOAF data in a separate file rather than as Extension data 
	&lt;/li&gt;
	&lt;li&gt;Add additional settings to APML such as parsing blog roll 
	&lt;/li&gt;
	&lt;li&gt;If you also add OpenID support to your blog, then you will have everything that is currently on the data portability standards list. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fjohndyer.name%2fpost%2f2008%2f02%2fData-Portability-Pack-for-BlogEngineNET.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fjohndyer.name%2fpost%2f2008%2f02%2fData-Portability-Pack-for-BlogEngineNET.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/SSHFW-VwDRI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/SSHFW-VwDRI/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/02/14/Data-Portability-Pack-for-BlogEngineNET.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=ac4c75c7-5d3a-4a67-9b2f-b507e4319a3f</guid>
      <pubDate>Thu, 14 Feb 2008 13:45:00 -0500</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=ac4c75c7-5d3a-4a67-9b2f-b507e4319a3f</pingback:target>
      <slash:comments>22</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=ac4c75c7-5d3a-4a67-9b2f-b507e4319a3f</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/02/14/Data-Portability-Pack-for-BlogEngineNET.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=ac4c75c7-5d3a-4a67-9b2f-b507e4319a3f</wfw:commentRss>
    <enclosure url="http://johndyer.name/foaf.axd" length="2169" type="application/rdf+xml" /><media:content url="http://johndyer.name/foaf.axd" fileSize="2169" type="application/rdf+xml" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> What it Does This is an initial release of 3 extensions which will add the follow protocols to your BlogEngine.NET blog: SIOC - Somewhat like RSS, but utilizes RDF to describe connections to&amp;nbsp; other sites and between users and posts (example). APML -</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> What it Does This is an initial release of 3 extensions which will add the follow protocols to your BlogEngine.NET blog: SIOC - Somewhat like RSS, but utilizes RDF to describe connections to&amp;nbsp; other sites and between users and posts (example). APML - Creates an &amp;quot;attention profile&amp;quot; of your interests based on tags and categories. Each is given a value based on its frequency (example). FOAF - A list of your friends, their websites, and a hashed version of their email for a unique key (example). You can see examples of each of these by clicking on the links on the upper right of this blog. To learn more about data portability, see this post. The following links show this data in a browsable format: SIOC browser FOAF browser How it Works Each of these has a Handler, a Generator, and an Extension file. The extension files automatically add &amp;lt;meta&amp;gt; discovery files to your &amp;lt;head&amp;gt; tag. Note: Currently, the FOAF information is stored in two different Extension files due to a limitation in BE.NET 1.3 (it cannot store both scalar and table data). One extension is for your personal information and the other is for your friends&amp;#39; data. BE 1.4 will allow these to be merged into one file. Warning: BE.NET currently deletes extension data when you change *.cs files, so please backup your extension file when adding or changing extensions. Installation and Usage Download Data Portability Pack for BlogEngine.NET Copy the *.cs files into your /App_Code/Extensions folder (you can also create a sub-directory within that folder) Add the following to your web.config file &amp;lt;add verb=&amp;quot;*&amp;quot; path=&amp;quot;sioc.axd&amp;quot; type=&amp;quot;BlogEngine.DataPortability.SiocHandler, App_Code&amp;quot; validate=&amp;quot;false&amp;quot;/&amp;gt; &amp;lt;add verb=&amp;quot;*&amp;quot; path=&amp;quot;foaf.axd&amp;quot; type=&amp;quot;BlogEngine.DataPortability.FoafHandler, App_Code&amp;quot; validate=&amp;quot;false&amp;quot;/&amp;gt; &amp;lt;add verb=&amp;quot;*&amp;quot; path=&amp;quot;apml.axd&amp;quot; type=&amp;quot;BlogEngine.DataPortability.ApmlHandler, App_Code&amp;quot; validate=&amp;quot;false&amp;quot;/&amp;gt; Go to your Admin-&amp;gt;Extensions page and you should see 4 extensions prefixed with &amp;quot;DP_&amp;quot;. The FoafFriends and MyProfile extensions need data entered, the other ones you can just leave as their defaults. Optionally, you can add links to each of these files (as I have on the upper right) Future Work Merge FOAF extensions for BE 1.4 Possibly store FOAF data in a separate file rather than as Extension data Add additional settings to APML such as parsing blog roll If you also add OpenID support to your blog, then you will have everything that is currently on the data portability standards list. </itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=ac4c75c7-5d3a-4a67-9b2f-b507e4319a3f</feedburner:origLink></item>
    <item>
      <title>SIOC implementation for BlogEngine.NET</title>
      <description>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; This is now part of the &lt;a href="http://johndyer.name/post/2008/02/Data-Portability-Pack-for-BlogEngineNET.aspx"&gt;Data Portability Pack for BlogEngine.NET&lt;/a&gt;&lt;/p&gt; &lt;p&gt;A major feature of &lt;a href="http://www.dotnetblogengine.net"&gt;BlogEngine.NET&lt;/a&gt; is that it &lt;a href="http://www.dotnetblogengine.net/page/features.aspx"&gt;supports a lot of open standards&lt;/a&gt;. Keeping with this, I've setup an initial implementation of &lt;a href="http://en.wikipedia.org/wiki/SIOC"&gt;SIOC&lt;/a&gt; for BlogEngine.NET. &lt;a href="http://en.wikipedia.org/wiki/SIOC"&gt;SIOC&lt;/a&gt; (Semantically-Interconnected Online Communities) is an extension of RDF which goes beyond RSS in that it describes not only the content of a website, but the connections between site content, users on the site, and another websites. While RSS has one big document for recent content, &lt;a href="http://en.wikipedia.org/wiki/SIOC"&gt;SIOC&lt;/a&gt; splits up its data into (1) a site profile, (2) profiles for authors, (3) profiles for posts, and (4) profiles for comments. Each of these not only lists the author's name, but also includes &lt;a href="http://en.wikipedia.org/wiki/FOAF"&gt;FOAF&lt;/a&gt; (Friend of a Friend) data to help identify users across the Internet via a hashed email address. If all sites were SIOC/FOAF enabled, you could theoretically search an aggregator site (like Technorati if it supported &lt;a href="http://en.wikipedia.org/wiki/SIOC"&gt;SIOC&lt;/a&gt;) for all posts and comments by a given user within a set of blogs, forums, or other websites. For more information on this, see my post on &lt;a href="http://johndyer.name/post/2008/02/Introduction-to-the-state-of-DataPortability-quot3bstandardsquot3b.aspx"&gt;Data Portability standards&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Site Profile&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;To get a feel for the data, here's what the site profile looks like (note: I've tried to match the &lt;a href="http://sioc-project.org/wordpress"&gt;Word Press SIOC plugin&lt;/a&gt; URL conventions as much as possible)&lt;br&gt;&lt;a href="http://johndyer.name/sioc.axd?sioc_type=site"&gt;http://johndyer.name/sioc.axd?sioc_type=site&lt;/a&gt;&lt;/p&gt;&lt;pre class="prettyprint"&gt;&amp;lt;rdf:RDF&amp;gt;&lt;br&gt;  &amp;lt;!-- users --&amp;gt;&lt;br&gt;  &amp;lt;sioc:Usergroup rdf:about="http://localhost/johndyer/sioc.axd?sioc_type=site#authors"&amp;gt;
    &amp;lt;dc:title&amp;gt;Authors at "John Dyer"&amp;lt;/dc:title&amp;gt;
    &amp;lt;sioc:has_member&amp;gt;
      &amp;lt;sioc:User rdf:about="http://localhost/johndyer/author/John+Dyer.aspx" rdfs:label="John Dyer"&amp;gt;
        &amp;lt;sioc:see_also rdf:resource="http://localhost/johndyer/sioc.axd?sioc_type=user&amp;amp;amp;sioc_id=John+Dyer" /&amp;gt;
      &amp;lt;/sioc:User&amp;gt;
    &amp;lt;/sioc:has_member&amp;gt;
  &amp;lt;/sioc:Usergroup&amp;gt;&lt;br&gt;  &amp;lt;!-- site info --&amp;gt;&lt;br&gt;  &amp;lt;sioc:Site rdf:about="http://johndyer.name/"&amp;gt;
    &amp;lt;dc:title&amp;gt;John Dyer&amp;lt;/dc:title&amp;gt;
    &amp;lt;dc:description&amp;gt;ASP.NET, Flash, and JavaScript from FreeTextBox and Dallas Seminary&amp;lt;/dc:description&amp;gt;
    &amp;lt;sioc:link&amp;gt;http://johndyer.name/&amp;lt;/sioc:link&amp;gt;
    &amp;lt;sioc:host_of&amp;gt;http://johndyer.name/sioc.axd?sioc_type=site#webblog&amp;lt;/sioc:host_of&amp;gt;
    &amp;lt;sioc:has_group&amp;gt;http://johndyer.name/sioc.axd?sioc_type=site#authors&amp;lt;/sioc:has_group&amp;gt;&lt;br&gt;  &amp;lt;/sioc:Site&amp;gt;&lt;br&gt;  &amp;lt;!-- blog info, posts--&amp;gt;
  &amp;lt;sioc:Forum rdf:about="http://johndyer.name/sioc.axd?sioc_type=site#webblog"&amp;gt;
    &amp;lt;sioc:name&amp;gt;John Dyer&amp;lt;/sioc:name&amp;gt;
    &amp;lt;sioc:link rdf:resource="http://johndyer.name/sioc.axd?sioc_type=site#webblog" /&amp;gt;
    &amp;lt;sioc:container_of&amp;gt;
      &amp;lt;sioc:Post rdf:about="http://johndyer.name/post/2008/02/BlogEngineNET-Extension-Flash-Video-Player.aspx" dc:title="BlogEngine.NET Extension: Flash Video Player"&amp;gt;
        &amp;lt;rdfs:seeAlso rdf:resource="http://johndyer.name/sioc.axd?sioc_type=post&amp;amp;amp;sioc_id=06af08e0-c4eb-421c-9e18-b618358d33ca" /&amp;gt;
      &amp;lt;/sioc:Post&amp;gt;
    &amp;lt;/sioc:container_of&amp;gt;
  &amp;lt;/sioc:Forum&amp;gt;
&amp;lt;/rdf:RDF&amp;gt;&lt;/pre&gt;
&lt;p&gt;This describes (1) the users on the site (&lt;code&gt;sioc:Usergroup&lt;/code&gt;) which would be blog authors, (2) the site in general (&lt;code&gt;sioc:Site&lt;/code&gt;), and (3) and displays the content (&lt;code&gt;sioc:Forum&lt;/code&gt;). Each of these has links to other SIOC documents for the user and then for the posts. 
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Post Profile&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here's what a post looks like:&lt;br&gt;&lt;a title="http://johndyer.name/sioc.axd?sioc_type=post&amp;amp;sioc_id=612564cd-3cfa-42b5-92e9-44beb52f7cd5" href="http://johndyer.name/sioc.axd?sioc_type=post&amp;amp;sioc_id=612564cd-3cfa-42b5-92e9-44beb52f7cd5"&gt;http://johndyer.name/sioc.axd?sioc_type=post&amp;amp;sioc_id=612564cd-3cfa-42b5-92e9-44beb52f7cd5&lt;/a&gt;&lt;/p&gt;&lt;pre class="prettyprint"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;rdf:RDF xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rss="http://purl.org/rss/1.0/" xmlns:admin="http://webns.net/mvcb/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content" xmlns:sioc="http://rdfs.org/sioc/ns#"&amp;gt;
  &amp;lt;foaf:Document rdf:about="http://johndyer.name/"&amp;gt;
    &amp;lt;dc:title&amp;gt;SIOC post profile for "John Dyer"&amp;lt;/dc:title&amp;gt;
    &amp;lt;dc:description&amp;gt;A SIOC profile describes the structure and contents of a weblog in a machine readable form. For more information please refer to http://sioc-project.org/.&amp;lt;/dc:description&amp;gt;
    &amp;lt;foaf:primaryTopic&amp;gt;http://johndyer.name/post/2008/02/Website-Break-Coke-vs-Diet-Coke-vs-Coke-Zero.aspx&amp;lt;/foaf:primaryTopic&amp;gt;
    &amp;lt;admin:generatorAgent&amp;gt;BlogEngine.NET SIOC Generator (1.0) by John Dyer&amp;lt;/admin:generatorAgent&amp;gt;
  &amp;lt;/foaf:Document&amp;gt;&lt;br&gt;  &amp;lt;!-- post data --&amp;gt;&lt;br&gt;  &amp;lt;sioc:Post rdf:about="http://johndyer.name/post/2008/02/Website-Break-Coke-vs-Diet-Coke-vs-Coke-Zero.aspx"&amp;gt;
    &amp;lt;sioc:link rdf:resource="http://johndyer.name/post/2008/02/Website-Break-Coke-vs-Diet-Coke-vs-Coke-Zero.aspx" /&amp;gt;
    &amp;lt;sioc:has_container rdf:resource="http://johndyer.name/sioc.axd?sioc_type=site#webblog" /&amp;gt;
    &amp;lt;dc:title&amp;gt;Website Break: Coke vs. Diet Coke vs. Coke Zero&amp;lt;/dc:title&amp;gt;
    &amp;lt;!-- post author --&amp;gt;&lt;br&gt;    &amp;lt;sioc:has_creator&amp;gt;
      &amp;lt;sioc:User rdf:about="http://johndyer.name/author/John+Dyer.aspx"&amp;gt;
        &amp;lt;rdfs:seeAlso rdf:resource="http://johndyer.name/sioc.axd?sioc_type=user&amp;amp;amp;sioc_id=John+Dyer" /&amp;gt;
      &amp;lt;/sioc:User&amp;gt;&lt;br&gt;    &amp;lt;/sioc:has_creator&amp;gt;
    &amp;lt;foaf:maker&amp;gt;
      &amp;lt;foaf:Person rdf:about="http://johndyer.name/author/John+Dyer.aspx" foaf:name="John Dyer"&amp;gt;
        &amp;lt;foaf:mbox_sha1sum&amp;gt;3eb435778fafc3efde35fba2ca731c6d3234178f&amp;lt;/foaf:mbox_sha1sum&amp;gt;
        &amp;lt;foaf:homepage rdf:resource="http://johndyer.name/" /&amp;gt;
        &amp;lt;rdfs:seeAlso rdf:resource="http://johndyer.name/sioc.axd?sioc_type=user&amp;amp;amp;sioc_id=John+Dyer" /&amp;gt;
      &amp;lt;/foaf:Person&amp;gt;
    &amp;lt;/foaf:maker&amp;gt;&lt;br&gt;    &amp;lt;dcterms:created&amp;gt;2/1/2008 4:40:53 PM&amp;lt;/dcterms:created&amp;gt;
    &amp;lt;sioc:content&amp;gt; Today, we decided to take a break from web development and do something truly important: a taste test. Tim, Adam, Brian, and I wanted to see if we could identify Coke, Diet Coke, and Coke Zero in a blind test. We each had three cups that another team member had setup. We tasted each drink and tried to match the drink with the cup and also mark our favorite. Tim is the narrator and then the participants from left to right are: John (me), Adam, Tim, and Brian.    &amp;lt;/sioc:content&amp;gt;
    &amp;lt;content:encoded&amp;gt;&amp;amp;lt;p&amp;amp;gt;Today, we decided to take a break from web development and do something truly important: a taste test. Tim, Adam, Brian, and I wanted to see if we could identify Coke, Diet Coke, and Coke Zero in a blind test. We each had three cups that another team member had setup. We tasted each drink and tried to match the drink with the cup and also mark our favorite. Tim is the narrator and then the participants from left to right are: John (me), Adam, Tim, and Brian.&amp;amp;lt;/p&amp;amp;gt;&amp;lt;/content:encoded&amp;gt;
    &amp;lt;!-- categories and tags --&amp;gt;&lt;br&gt;    &amp;lt;sioc:topic rdfs:label="Off Topic" rdf:resource="http://johndyer.name//category/Off Topic.aspx" /&amp;gt;
    &amp;lt;sioc:topic rdfs:label="challenge" rdf:resource="http://johndyer.name//?tag=/challenge" /&amp;gt;
    &amp;lt;sioc:topic rdfs:label="soda" rdf:resource="http://johndyer.name//?tag=/soda" /&amp;gt;&lt;br&gt;    &amp;lt;!-- comments --&amp;gt;
    &amp;lt;sioc:has_reply&amp;gt;
      &amp;lt;sioc:Post rdf:about="http://johndyer.name/post/2008/02/Website-Break-Coke-vs-Diet-Coke-vs-Coke-Zero.aspx#id_a82699f9-77e2-460d-b3b1-d1d470180df9"&amp;gt;
        &amp;lt;rdfs:seeAlso rdf:resource="http://johndyer.name/sioc.axd?sioc_type=comment&amp;amp;amp;sioc_id=a82699f9-77e2-460d-b3b1-d1d470180df9" /&amp;gt;
      &amp;lt;/sioc:Post&amp;gt;
    &amp;lt;/sioc:has_reply&amp;gt;&lt;br&gt;    &amp;lt;!-- outbound links --&amp;gt;
    &amp;lt;sioc:links_to rdf:resource="http://www.cokezero.com/" rdfs:label="Coke Zero" /&amp;gt;
  &amp;lt;/sioc:Post&amp;gt;
&amp;lt;/rdf:RDF&amp;gt;&lt;/pre&gt;
&lt;p&gt;This one also has a "document" description (which I left out on the site profile) and then has information about the post including its author (both &lt;code&gt;sioc:has_creator&lt;/code&gt; and &lt;code&gt;foaf:maker&lt;/code&gt; which has my email as a SHA1 hash), content (&lt;code&gt;sioc:content&lt;/code&gt; and &lt;code&gt;content:encoded&lt;/code&gt;), categories (&lt;code&gt;sioc:topic&lt;/code&gt;), outbound links (&lt;code&gt;sioc:links_to&lt;/code&gt;), and then links to the comments for the post (&lt;code&gt;sioc:has_reply&lt;/code&gt;) 
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Download and Installation &lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strike&gt;Download BlogEngine.NET SIOC extension&lt;/strike&gt;&lt;strike&gt; &lt;/strike&gt;
&lt;li&gt;&lt;strike&gt;Copy the three files into the \App_Code\Sioc\ directory &lt;/strike&gt;
&lt;li&gt;&lt;strike&gt;Add the following line to your web.config&lt;br&gt;&lt;code&gt;&amp;lt;add verb="*" path="sioc.axd" type="SIOC.SiocHandler, App_Code" validate="false"/&amp;gt;&lt;/code&gt;&lt;/strike&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;Update: This is now part of the &lt;a href="http://johndyer.name/post/2008/02/Data-Portability-Pack-for-BlogEngineNET.aspx"&gt;Data Portability Pack&lt;/a&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What's Next?&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;This extension will add a &amp;lt;link&amp;gt; tag to your header, but you view it directly at: &lt;a href="http://yoursite.com/sioc.axd"&gt;http://yoursite.com/sioc.axd&lt;/a&gt; 
&lt;li&gt;Explore the SIOC file at:&amp;nbsp; &lt;a title="http://sparql.captsolo.net/browser/browser.py?url=http%3A%2F%2Fjohndyer.name%2Fsioc.axd" href="http://sparql.captsolo.net/browser/browser.py?url=http%3A%2F%2Fjohndyer.name%2Fsioc.axd"&gt;http://sparql.captsolo.net/browser/browser.py?url=http%3A%2F%2Fjohndyer.name%2Fsioc.axd&lt;/a&gt; 
&lt;li&gt;An SIOC explorer is also available here which allows you to search and sort the data from among several sites: &lt;a title="http://www.activerdf.org/sioc/" href="http://www.activerdf.org/sioc/"&gt;http://www.activerdf.org/sioc/&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/UvoHQKpP2-0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/UvoHQKpP2-0/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/02/08/SIOC-implementation-for-BlogEngineNET.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=14968acf-bd9b-46cc-9b7a-7d313f8d94f6</guid>
      <pubDate>Fri, 08 Feb 2008 09:01:03 -0500</pubDate>
      <category>ASP.NET</category>
      <category>Code Lab</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=14968acf-bd9b-46cc-9b7a-7d313f8d94f6</pingback:target>
      <slash:comments>11</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=14968acf-bd9b-46cc-9b7a-7d313f8d94f6</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/02/08/SIOC-implementation-for-BlogEngineNET.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=14968acf-bd9b-46cc-9b7a-7d313f8d94f6</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=14968acf-bd9b-46cc-9b7a-7d313f8d94f6</feedburner:origLink></item>
    <item>
      <title>Introduction to DataPortability and the state of its standards</title>
      <description>&lt;p&gt;
&lt;a href="http://www.dataportability.org/"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/IntroductiontothestateofDataPortabilitys_111CE/image_3.png" border="0" alt="image" width="110" height="100" align="right" /&gt;&lt;/a&gt;Since November 2007, the &lt;a href="http://www.dataportability.org/"&gt;DataPortability&lt;/a&gt; discussion has been big news. The following post is an overview of the underlying ideas of &amp;quot;data portability&amp;quot; as well as the status of the proposed technologies which will enable it. 
&lt;/p&gt;
 
&lt;p&gt;
&lt;strong&gt;What is Data Portability?&lt;/strong&gt; 
&lt;/p&gt;
 
&lt;p&gt;
The idea behind &amp;quot;data portability&amp;quot; is that website visitors should be able to control the data that a site has about them. It&amp;#39;s a philosophical ideal that harkens back to the early days of the Internet before big businesses got into the game, and the Internet was thought to be a place of independence and freedom. Today, Gmail has all my email, Facebook has my friends, flickr my photos, Amazon my book and music purchases, and so on. &lt;a href="http://www.dataportability.org/"&gt;DataPortability&lt;/a&gt; is a work group which is trying to urge these web companies to allow its users to export all of their data and be able to import into another site at will. Over the past month, representatives from big players like Microsoft, Google, and Facebook have joined &lt;a href="http://www.dataportability.org/"&gt;DataPortability&lt;/a&gt; to help create standards for data transmission. 
&lt;/p&gt;
 
&lt;p&gt;
Here&amp;#39;s a video explanation: 
&lt;/p&gt;
 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;br /&gt;
&lt;a href="http://www.vimeo.com/610179/l:embed_610179"&gt;DataPortability - Connect, Control, Share, Remix&lt;/a&gt; from &lt;a href="http://www.vimeo.com/smashcutmedia/l:embed_610179"&gt;Smashcut Media&lt;/a&gt; on &lt;a href="http://vimeo.com/l:embed_610179"&gt;Vimeo&lt;/a&gt;.
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
 
&lt;p&gt;
&lt;strong&gt;What will I hopefully be able to do with Data Portability?&lt;/strong&gt; 
&lt;/p&gt;
 
&lt;p&gt;
Though you can&amp;#39;t do anything yet since &amp;quot;data portability&amp;quot; is just an idea right now, here are two possible scenarios: 
&lt;/p&gt;
 
&lt;p&gt;
&lt;em&gt;Transferring friends and interests between sites. &lt;/em&gt;Facebook has data on who my &amp;quot;friends&amp;quot; are and information about things they like; Amazon has information on book and music I like based on what I&amp;#39;ve purchased and clicked on over the years; Pandora has information on what music I like, and so on. If one of my musician friends joined another social network like Bebo and I wanted to follow him, &amp;quot;data portability&amp;quot; would allow me to compile my interests and friends from Facebook, Amazon, and Pandora together and import that data into Bebo so I didn&amp;#39;t have to start over there. It would already know what I like and who my friends are. 
&lt;/p&gt;
 
&lt;p&gt;
&lt;em&gt;Collating my online activities. &lt;/em&gt;Much of my life has either &amp;quot;happened&amp;quot; on the web (blog posts, facebook messages, flickr photos, etc.) or I have left a record of real world events on the Internet. It would be good for me to be able to get all of this data and store it for my own use. Today I can&amp;#39;t do this, but if all those sites were enabled with &amp;quot;data portability,&amp;quot; I could theoretically pull out my photos from flickr, tickets from American Airlines, blog posts, emails, reviews at Trip Advisor, etc. and put together a timeline of my last vacation. 
&lt;/p&gt;
 
&lt;p&gt;
&lt;strong&gt;What possible problems are there with Data Portability?&lt;/strong&gt; 
&lt;/p&gt;
 
&lt;p&gt;
&amp;quot;Data portabilty&amp;quot; sounds great in theory, but there are some problems that have to be overcome before it can really happen. These &amp;quot;problems&amp;quot; are not deal-breakers, just issues that the &lt;a href="http://www.dataportability.org/"&gt;DataPortability&lt;/a&gt; workgroup is attempting to solve, and things users ought to think through before they immediately adopt such technology. 
&lt;/p&gt;
 
&lt;p&gt;
&lt;em&gt;Identity verification.&lt;/em&gt; Probably the biggest technical hurdle is in the area of &amp;quot;identity management.&amp;quot; If your list of friends has more than one person named &amp;quot;John Smith&amp;quot; or a friend with just a screen name like &amp;quot;JohnMayerLover556,&amp;quot; then it will be difficult to import these into another site, especially if that site has has 10 more users named &amp;quot;John Smith.&amp;quot; Websites usually assign a number to keep track of each user (a unique ID), but these cannot be shared among sites since they often overlap. Some standards propose using an email address as a unique ID, but people generally don&amp;#39;t want their email address openly shared because of SPAM. One proposed standard (FOAF, see below) proposes using hashing the email address, but currently many sites don&amp;#39;t allow email to be exported (such as Facebook). Also, since this information is being exported from a site, it is then made more public. This will require that &amp;quot;friends&amp;quot; can be verified in both directions since someone could merely copy the unique ID into their friends list. 
&lt;/p&gt;
 
&lt;p&gt;
&lt;em&gt;Business value.&lt;/em&gt; There is some question as to why big websites would want to do &amp;quot;data portability&amp;quot; even if they&amp;#39;ve already joined the &lt;a href="http://www.dataportability.org/"&gt;DataPortability&lt;/a&gt; workgroup. Most introductions to &amp;quot;data portability&amp;quot; usually use Amazon as an example, but interestingly Amazon has not yet joined. They have worked hard to build a great store, and they have collected a lot of data over a long period of time that they are not likely to want to give up to every new site that pops up. Similarly, Facebook&amp;#39;s targeted advertisement platform is built on the interests that users enter into the site. This is an important part of their business model, and not something they are likely to give up unless there is a good business reason to do so. I don&amp;#39;t think that Google, Microsoft, and Facebook joined &lt;a href="http://www.dataportability.org/"&gt;DataPortability&lt;/a&gt; merely of good will and adherence to philosophical ideals of freedom, but because they believe they can make money doing so. 
&lt;/p&gt;
 
&lt;p&gt;
&lt;em&gt;Security. &lt;/em&gt;As with &amp;quot;identity management&amp;quot; the overall security of publicly posting a lot of data about oneself could pose problems. For example, if I post all my interests, all my website associations, all my personal relationships in accessible XML files, then &amp;quot;identity&amp;quot; theft could be a genuine possibility. If someone can do damage with just a name, address, and social security number, imagine what they could do with data that allows them to mimic your lifestyle. 
&lt;/p&gt;
 
&lt;p&gt;
&lt;strong&gt;What technologies will hopefully enable Data Portability?&lt;/strong&gt; 
&lt;/p&gt;
 
&lt;p&gt;
So &amp;quot;data portability&amp;quot; has awesome potential and some problems to work through. Another issue is what &amp;quot;standards&amp;quot; should be used to transfer this data. Long before the &lt;a href="http://www.dataportability.org/"&gt;DataPortability&lt;/a&gt; workgroup was formed, several formats were proposed to handle this kind of information. Here is a summary of four of the most important ones: 
&lt;/p&gt;
 
&lt;ul&gt;
	 
	&lt;li&gt;&lt;a href="http://openid.net/"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/IntroductiontothestateofDataPortabilitys_111CE/image_17.png" border="0" alt="image" width="110" height="69" align="right" /&gt;&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/OpenID"&gt;OpenID&lt;/a&gt; - Instead of having separate usernames and passwords for each site you visit, OpenID allows you to have one login across the internet that you control through a URL. For example, I could have openid.johndyer.name be my OpenID. If I go to a site that supports OpenID, I would not enter a username and password at that site, but just my OpenID (openid.johndyer.name). The site would send me to openid.johndyer.name where login and then verify that I wanted to return to the sending site. This way, I control the username and password and I can use it anywhere. &lt;br /&gt;
	 &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://sioc-project.org/"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/IntroductiontothestateofDataPortabilitys_111CE/image_6.png" border="0" alt="image" width="110" height="100" align="right" /&gt;&lt;/a&gt; &lt;a href="http://sioc-project.org/"&gt;SIOC&lt;/a&gt; (Semantically-Interlinked Online Communities) - SIOC&amp;#39;s goal is to connect websites and content on those sites together. For example, it should be able to help identify blog posts, Amazon book reviews, blog comments, and forum posts made by the same person. Also, it should be able to semantically connect websites and blogs based on their tags and content. Right now, plugins exist for popular web applications (such as WordPress and phpBB), but there are very few applications which can actually do much with the data.&lt;br /&gt;
	 &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://foaf-project.org"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/IntroductiontothestateofDataPortabilitys_111CE/image_11.png" border="0" alt="image" width="110" height="69" align="right" /&gt;&lt;/a&gt;&lt;a href="http://www.foaf-project.org/"&gt;FOAF&lt;/a&gt; (Friend of a Friend) - While SIOC is about websites and content, FOAF is more about people and relationships. The idea is to be able to represent &amp;quot;friend&amp;quot; lists in a standard way. Obviously this introduces security questions (do I really want my friends on Facebook importing my data into xanga?), but some have already been addressed. FOAF proposes using either OpenID or a hashed email as a unique ID. In addition to relationships, FOAF can also describes activities people do through calendars, photos, blogs, etc. (working example: &lt;a href="http://johndyer.name/admin/Pages/www.dcs.shef.ac.uk/~mrowe/foafgenerator.html"&gt;Facebook FOAF exporter app&lt;/a&gt;)&lt;br /&gt;
	 &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://apml.org"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/IntroductiontothestateofDataPortabilitys_111CE/image_14.png" border="0" alt="image" width="110" height="69" align="right" /&gt;&lt;/a&gt; &lt;a href="http://www.apml.org/"&gt;APML&lt;/a&gt; (Attention Profile Markup Language) - APML is the proposed standard for cataloging &amp;quot;interest.&amp;quot; The idea is to take all of the things you do on the web (uploading photos, blog posting, music and book purchases, etc.) and organize the related subjects and topics into one standardized document of your interests. If you found a new music store or website, and you wanted to see if it had things you like, you could upload your APML document, and it would filter its data to only show things of interest to you. (see: &lt;a href="http://www.engagd.com/" title="http://engagd.com/"&gt;http://www.engagd.com/&lt;/a&gt; for a working example)&lt;br /&gt;
	&lt;/li&gt;
&lt;/ul&gt;
 
&lt;p&gt;
There are also additional proposals for relationships (&lt;a href="http://en.wikipedia.org/wiki/XHTML_Friends_Network"&gt;XFN&lt;/a&gt;), personal details (&lt;a href="http://en.wikipedia.org/wiki/Hcard"&gt;hCard&lt;/a&gt;), and identity management (&lt;a href="http://yadis.org/"&gt;Yarid&lt;/a&gt;) which have some overlap with the standards above. Also, &lt;a href="http://en.wikipedia.org/wiki/OPML"&gt;OMPL&lt;/a&gt; is a standard for collecting lists such as the RSS feeds. Here is the &lt;a href="http://groups.google.com/group/dataportability-public/web/standards-communities"&gt;full list of proposed standards&lt;/a&gt;. 
&lt;/p&gt;
 
&lt;p&gt;
&lt;strong&gt;What does it all mean and what can I do today?&lt;/strong&gt; 
&lt;/p&gt;
 
&lt;p&gt;
Since there are very few real world uses of these technologies, &amp;quot;data portability&amp;quot; is only an idea at this point. Right now, there are no sites listed as &amp;quot;&lt;a href="http://groups.google.com/group/dataportability-public/web/supporting-dp-enabled-applications"&gt;DP Enabled&lt;/a&gt;&amp;quot; This is mostly because &amp;quot;DP&amp;quot; hasn&amp;#39;t been fully defined yet which shows us how early in the game this all is. OpenID perhaps has the greatest number of sites which support it, though some sites are merely offering their own login as an OpenID (for example, Yahoo offers openid.yahoo.com/youryahooid as an OpenID URL). AMPL, FOAF, and SIOC are currently not supported by any major sites, and they may not for some time unless a unique ID can be reliably used. Also, it seems that the current standards can&amp;#39;t really handle all that the entire &amp;quot;connect, control, share, remix&amp;quot; vision, so a lot of work will probably need to be done. Hopefully it will go more smoothly than HTML5 and ES4 development. 
&lt;/p&gt;
 
&lt;p&gt;
Interestingly, the idea behind &amp;quot;data portability&amp;quot; is a lot like the early 90s before the Internet was widely available and people were on closed networks like AOL and Compuserve. They could only send email to people on the same network, but when Netscape came on the scene, access became universal, email and HTML became standard, and it changed everything. Today users are on different networks (MySpace, Facebook, xanga, etc.) with no way to connect. Hopefully, &amp;quot;data portability&amp;quot; will be able to change all that. 
&lt;/p&gt;
 
&lt;p&gt;
&lt;strong&gt;Links:&lt;/strong&gt; 
&lt;/p&gt;
 
&lt;ul&gt;
	 
	&lt;li&gt;&lt;a href="http://johndyer.name/admin/Pages/www.dcs.shef.ac.uk/~mrowe/foafgenerator.html"&gt;FOAF exporter&lt;/a&gt; for Facebook  &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://engagd.com"&gt;engagd&lt;/a&gt; - APML example site  &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://cluztr.com/"&gt;cluztr&lt;/a&gt; - another APML enabled site  &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://tagurself.com/"&gt;Tagurself.com&lt;/a&gt; - one more APML site &lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/4nQ5AAcXuH8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/4nQ5AAcXuH8/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/02/05/Introduction-to-the-state-of-DataPortability-and-its-standards.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=8e1760d3-b1b0-4589-b529-f0e0c311aefb</guid>
      <pubDate>Tue, 05 Feb 2008 21:04:00 -0500</pubDate>
      <category>Technology</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=8e1760d3-b1b0-4589-b529-f0e0c311aefb</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=8e1760d3-b1b0-4589-b529-f0e0c311aefb</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/02/05/Introduction-to-the-state-of-DataPortability-and-its-standards.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=8e1760d3-b1b0-4589-b529-f0e0c311aefb</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=8e1760d3-b1b0-4589-b529-f0e0c311aefb</feedburner:origLink></item>
    <item>
      <title>BlogEngine.NET Extension: Flash Video Player</title>
      <description>&lt;p&gt;Last week, I &lt;a href="http://johndyer.name/post/2008/02/Website-Break-Coke-vs-Diet-Coke-vs-Coke-Zero.aspx"&gt;posted a flash video&lt;/a&gt; using &lt;a href="http://www.betaparticle.com/post/2007/12/FLV-Player-for-BlogEngineNET.aspx"&gt;flvplayer&lt;/a&gt; extension from betaparticle for &lt;a href="http://www.dotnetblogengine.net/"&gt;BlogEngine.NET&lt;/a&gt;. I wanted to make some adjustments to the extension and I ended up completely rewriting it. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Updates/improvements:&lt;/strong&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Plays &lt;strong&gt;FLV&lt;/strong&gt; or &lt;strong&gt;MP4&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;All properties are available in the BlogEngine.NET extension manager so you don't have to touch the code to change settings. &lt;/li&gt;    &lt;li&gt;The size of the player will automatically make room for the controls at the bottom (20px) &lt;/li&gt;    &lt;li&gt;Uses &lt;a href="http://blog.deconcept.com/swfobject"&gt;SWFObject&lt;/a&gt; for flash replacement. This allow graceful degradation for those without Flash including mobile users. (I'll upgrade it to SWFObject 2.0 when it's released) &lt;/li&gt;    &lt;li&gt;Enables Fullscreen playback. &lt;/li&gt;    &lt;li&gt;Shows an initial image at startup named the same as the flv (myvideo.flv and myvideo.jpg). This way the video is not black at startup. &lt;/li&gt;    &lt;li&gt;Optionally, instead of SWFObject, full &amp;lt;object&amp;gt;&amp;lt;embed&amp;gt; formatting can be used. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Credits&lt;/strong&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.betaparticle.com/post/2007/12/FLV-Player-for-BlogEngineNET.aspx"&gt;flvplayer from betaparticle&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.flawlesscode.com/post/2007/12/Silverlight-video-player-extension-for-BlogengineNET.aspx"&gt;Silverlight player from flawlesscode&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Uses&lt;/strong&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blog.deconcept.com/swfobject"&gt;SWFObject&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.jeroenwijering.com/?item=JW_FLV_Player"&gt;JW Flash Player&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Installation &amp;amp; Usage&lt;/strong&gt; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Download the file and unzip: &lt;a href="http://johndyer.name/file.axd?file=BE-FlashVideoPlayer.zip"&gt;Flash Video Player extension for BlogEngine.NET&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Copy FlashVideoPlayer.cs to /App_Code/Extensions/ &lt;/li&gt;    &lt;li&gt;Copy the flashvideo folder to the root of your application (this can be customized in the settings) &lt;/li&gt;    &lt;li&gt;Add videos (myvideo.flv or myvideo.mp4) and images (myvideo.jpg) to the flashvideo folder. &lt;/li&gt;    &lt;li&gt;To use, just add &lt;code&gt;[&lt;span&gt;&lt;/span&gt;flv:myvideo.flv]&lt;/code&gt; anywhere in your post. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;&lt;div id="oregon_container" style="width:480px;height:380px;" class="flashVideo"&gt;
	
	&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" 
	   codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" 
	   width="480" height="380" id="oregon_obj" align="middle" flashvars="autostart=false&amp;file=http://johndyer.name/flashvideo/oregon.flv&amp;image=http://johndyer.name/flashvideo/oregon.jpg"&gt;
	&lt;param name="allowScriptAccess" value="sameDomain" /&gt;
	&lt;param name="movie" value="http://johndyer.name/flashvideo/flvplayer.swf" /&gt;
	&lt;param name="quality" value="high" /&gt;
	&lt;param name="bgcolor" value="#ffffff" /&gt;
	&lt;embed src="http://johndyer.name/flashvideo/flvplayer.swf" quality="high" bgcolor="#ffffff" width="480" 
	   height="380" name="mymovie" align="middle" allowScriptAccess="sameDomain" 
	   flashvars="autostart=false&amp;file=http://johndyer.name/flashvideo/oregon.flv&amp;image=http://johndyer.name/flashvideo/oregon.jpg"
	   type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" /&gt;
	&lt;/object&gt;						
							&lt;/div&gt;&lt;p&gt;&lt;a href="http://johndyer.name/flashvideo/oregon.flv"&gt;oregon.flv&lt;/a&gt;&lt;/p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Download:&lt;/strong&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://johndyer.name/file.axd?file=BE-FlashVideoPlayer.zip"&gt;Flash Video Player extension for BlogEngine.NET&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/exAtMNkv5I0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/exAtMNkv5I0/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/02/04/BlogEngineNET-Extension-Flash-Video-Player.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=edca83fe-437e-41fa-92de-9e6f0acc0605</guid>
      <pubDate>Mon, 04 Feb 2008 15:13:00 -0500</pubDate>
      <category>ASP.NET</category>
      <category>Code Lab</category>
      <category>Flash</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=edca83fe-437e-41fa-92de-9e6f0acc0605</pingback:target>
      <slash:comments>16</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=edca83fe-437e-41fa-92de-9e6f0acc0605</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/02/04/BlogEngineNET-Extension-Flash-Video-Player.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=edca83fe-437e-41fa-92de-9e6f0acc0605</wfw:commentRss>
    <enclosure url="http://johndyer.name/file.axd?file=BE-FlashVideoPlayer.zip" length="296758" type="application/octet-stream" /><media:content url="http://johndyer.name/file.axd?file=BE-FlashVideoPlayer.zip" fileSize="296758" type="application/octet-stream" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> Last week, I posted a flash video using flvplayer extension from betaparticle for BlogEngine.NET. I wanted to make some adjustments to the extension and I ended up completely rewriting it. Updates/improvements: Plays FLV or MP4. All properties are availa</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> Last week, I posted a flash video using flvplayer extension from betaparticle for BlogEngine.NET. I wanted to make some adjustments to the extension and I ended up completely rewriting it. Updates/improvements: Plays FLV or MP4. All properties are available in the BlogEngine.NET extension manager so you don't have to touch the code to change settings. The size of the player will automatically make room for the controls at the bottom (20px) Uses SWFObject for flash replacement. This allow graceful degradation for those without Flash including mobile users. (I'll upgrade it to SWFObject 2.0 when it's released) Enables Fullscreen playback. Shows an initial image at startup named the same as the flv (myvideo.flv and myvideo.jpg). This way the video is not black at startup. Optionally, instead of SWFObject, full &amp;lt;object&amp;gt;&amp;lt;embed&amp;gt; formatting can be used. Credits flvplayer from betaparticle Silverlight player from flawlesscode Uses SWFObject JW Flash Player Installation &amp;amp; Usage Download the file and unzip: Flash Video Player extension for BlogEngine.NET Copy FlashVideoPlayer.cs to /App_Code/Extensions/ Copy the flashvideo folder to the root of your application (this can be customized in the settings) Add videos (myvideo.flv or myvideo.mp4) and images (myvideo.jpg) to the flashvideo folder. To use, just add [flv:myvideo.flv] anywhere in your post. Example oregon.flv Download: Flash Video Player extension for BlogEngine.NET </itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=edca83fe-437e-41fa-92de-9e6f0acc0605</feedburner:origLink></item>
    <item>
      <title>Website Break: Coke vs. Diet Coke vs. Coke Zero</title>
      <description>&lt;p&gt;Today, we decided to take a break from web development and do something truly important: a taste test. Tim, Adam, Brian, and I wanted to see if we could identify Coke, Diet Coke, and Coke Zero in a blind test. We each had three cups that another team member had setup. We tasted each drink and tried to match the drink with the cup and also mark our favorite. Tim is the narrator and then the participants from left to right are: John (me), Adam, Tim, and Brian.&lt;/p&gt; &lt;p&gt;&lt;div id="coke_challenge_container" style="width:480px;height:380px;" class="flashVideo"&gt;
	
	&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" 
	   codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" 
	   width="480" height="380" id="coke_challenge_obj" align="middle" flashvars="autostart=false&amp;file=http://johndyer.name/flashvideo/coke_challenge.flv&amp;image=http://johndyer.name/flashvideo/coke_challenge.jpg"&gt;
	&lt;param name="allowScriptAccess" value="sameDomain" /&gt;
	&lt;param name="movie" value="http://johndyer.name/flashvideo/flvplayer.swf" /&gt;
	&lt;param name="quality" value="high" /&gt;
	&lt;param name="bgcolor" value="#ffffff" /&gt;
	&lt;embed src="http://johndyer.name/flashvideo/flvplayer.swf" quality="high" bgcolor="#ffffff" width="480" 
	   height="380" name="mymovie" align="middle" allowScriptAccess="sameDomain" 
	   flashvars="autostart=false&amp;file=http://johndyer.name/flashvideo/coke_challenge.flv&amp;image=http://johndyer.name/flashvideo/coke_challenge.jpg"
	   type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" /&gt;
	&lt;/object&gt;						
							&lt;/div&gt;&lt;p&gt;&lt;a href="http://johndyer.name/flashvideo/coke_challenge.flv"&gt;coke_challenge.flv&lt;/a&gt;&lt;/p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Results: &lt;/strong&gt;Adam, Brian, and I all correctly identified the three flavors of Coke. Adam and I choose Coke Zero as the best, while Brian favored Coke Classic. The most interesting result was that Tim thought Coke Zero was Coke Classic and he also thought it was the best tasting. So, &lt;a href="http://www.cocacolazero.com/"&gt;Coke Zero&lt;/a&gt; is our big winner.&lt;/p&gt; &lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="314" alt="coke_challenge" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/WebsiteBreakCokevs.DietCokevs.CokeZero_DF87/coke_challenge_3.jpg" width="550" border="0"&gt; &lt;/p&gt; &lt;p&gt;Please post your workplace challenge!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/WkxKhqm8zT4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/WkxKhqm8zT4/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/02/01/Website-Break-Coke-vs-Diet-Coke-vs-Coke-Zero.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=612564cd-3cfa-42b5-92e9-44beb52f7cd5</guid>
      <pubDate>Fri, 01 Feb 2008 22:40:53 -0500</pubDate>
      <category>Off Topic</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=612564cd-3cfa-42b5-92e9-44beb52f7cd5</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=612564cd-3cfa-42b5-92e9-44beb52f7cd5</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/02/01/Website-Break-Coke-vs-Diet-Coke-vs-Coke-Zero.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=612564cd-3cfa-42b5-92e9-44beb52f7cd5</wfw:commentRss>
    <enclosure url="http://johndyer.name/flashvideo/coke_challenge.flv" length="17391671" type="video/x-flv" /><media:content url="http://johndyer.name/flashvideo/coke_challenge.flv" fileSize="17391671" type="video/x-flv" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> Today, we decided to take a break from web development and do something truly important: a taste test. Tim, Adam, Brian, and I wanted to see if we could identify Coke, Diet Coke, and Coke Zero in a blind test. We each had three cups that another team mem</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> Today, we decided to take a break from web development and do something truly important: a taste test. Tim, Adam, Brian, and I wanted to see if we could identify Coke, Diet Coke, and Coke Zero in a blind test. We each had three cups that another team member had setup. We tasted each drink and tried to match the drink with the cup and also mark our favorite. Tim is the narrator and then the participants from left to right are: John (me), Adam, Tim, and Brian. coke_challenge.flv Results: Adam, Brian, and I all correctly identified the three flavors of Coke. Adam and I choose Coke Zero as the best, while Brian favored Coke Classic. The most interesting result was that Tim thought Coke Zero was Coke Classic and he also thought it was the best tasting. So, Coke Zero is our big winner. Please post your workplace challenge!</itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=612564cd-3cfa-42b5-92e9-44beb52f7cd5</feedburner:origLink></item>
    <item>
      <title>Book Review: Nicholas Carr's "The Big Switch: Rewiring the World, From Edison to Google"</title>
      <description>&lt;div style="margin: 0px 0px 5px 5px; float: right"&gt;
&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0393062287/"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/BookReviewNicholasCarrsTheBigSwitchFromE_13C4D/the%20big%20switch2_1.jpg" border="0" alt="The Big Switch" width="158" height="240" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;
Apparently, &lt;a href="http://www.techcrunch.com/2007/12/18/the-big-switch-12-signed-pre-release-copies-for-techcrunch-readers/trackback/#comment-1853748"&gt;my comment&lt;/a&gt; on &lt;a href="http://www.techcrunch.com/"&gt;TechCrunch&lt;/a&gt; was interesting enough for them to send me a copy of &lt;a href="http://www.roughtype.com/"&gt;Nicholas Carr&lt;/a&gt;&amp;#39;s &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0393062287/"&gt;&lt;em&gt;The Big Switch: Rewiring the World, From Edison to Google&lt;/em&gt;&lt;/a&gt;, so I thought I&amp;#39;d take a break from code samples and give it a brief review. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Overview&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Carr&amp;#39;s is thesis is very interesting. In the early 20th century, electricity went from being produced in-house by each company that needed it to being mass produced and made available on a power grid which companies could tap into. This revolution made changes in every facet of life from business to education to medicine to the architecture of living spaces. In the 21st century, Carr argues that a similar revolution is happening with computing and information technology. Today, companies still build their own IT infrastructure and buy individual computers, but the internet is beginning to form a sort of computing grid which companies can tap into just like they do today with electricity. A current example of this is Amazon&amp;#39;s various services like &lt;a href="http://aws.amazon.com/s3"&gt;S3 for data storage&lt;/a&gt; and &lt;a href="http://aws.amazon.com/ec2"&gt;EC2 for computing power&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
The book is very fun to read, especially if you like both technology and &amp;quot;the story behind the story.&amp;quot; In the first half of the book, Carr weaves the tale of electricity&amp;#39;s rise and the birth of the information technology industry. Then, in the second half, he discusses some of the implications of the &amp;quot;programmable internet.&amp;quot; I would definitely recommend it to anyone who enjoys technology and likes a good story.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;My Thoughts&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
While I really enjoyed the story Carr tells and some of the things he thinks will happen in the future, what was interesting to me was that he never really asks the question: Is this stuff &amp;quot;good&amp;quot; for us? Carr does talk a little bit about business level concerns and how the IT industry will be affected by these changes. He does not, however, engage in questions about how the changes he describes in the book will affect the individual person and what it means to be human. This unquestioning attitude is exactly what Neil Postman wrote about in his book &lt;em&gt;&lt;a href="http://www.amazon.com/Technopoly-Surrender-Technology-Neil-Postman/dp/0679745408/"&gt;Technopoly: The Surrender of Culture to Technology&lt;/a&gt;&lt;/em&gt; in which he asked talks about how our culture today tends to immediately adopt technology without thinking through its implications.
&lt;/p&gt;
&lt;p&gt;
For example, in the final chapter of the book, entitled &amp;quot;iGod,&amp;quot; Carr discusses how Google eventually hopes to build a system in which all the world&amp;#39;s information plugs directly into our brains. Many of their &amp;quot;products&amp;quot; are just steps to this end. For example, 800-GOOG-411 is an &lt;a href="http://johndyer.name/admin/Pages/The%20Surrender%20of%20Culture%20to%20Technology"&gt;experiment in voice recognition&lt;/a&gt;. Carr quotes Google engineers saying that &lt;a href="http://books.google.com/"&gt;Google Books&lt;/a&gt; is not really about displaying books for humans to read, but about making a better Artificial Intelligence that can understand the content of the books. Eventually this will help create a vast Intelligence (iGod?) that people can hook directly to their brains. Carr discusses the cybernetic enhancement this would require (for more, the &lt;a href="http://en.wikipedia.org/wiki/Transhumanism"&gt;Transhumanism&lt;/a&gt; essay in &lt;a href="http://www.amazon.com/Everyday-Theology-Cultural-Interpret-Exegesis/dp/0801031672"&gt;Everyday Theology&lt;/a&gt; by &lt;a href="http://www.tiu.edu/divinity/people/vanhoozer"&gt;Vanhoozer&lt;/a&gt;&amp;#39;s student, Matthew Eppinette: &lt;a href="http://www.cambridgebibles.com/Media/MediaManager/Excerpt_Vanhoozer_EverydayTheo.pdf"&gt;excerpt&lt;/a&gt;), Yet, he only mentions two people who question whether this is a good idea. (1) Bill Gates &amp;quot;I&amp;#39;m happy to have the computer over there and I&amp;#39;m over here&amp;quot; and (2) Ted Kaczynski (the Unabomber, &amp;quot;People won&amp;#39;t be able to turn the machines off, because they will be so dependent on them that turning them off would amount to suicide&amp;quot;)! Everyone else seems to see this as a Utopia of sorts.
&lt;/p&gt;
&lt;p&gt;
I work in the technology field and I love to try new toys and learn new programming languages, so I&amp;#39;m definitely not against technology by any means. But I do think that people need to begin considering how different technologies will affect them before they buy (into) them. For example, many people are beginning to notice that since we have all been placing a lot of information in our cell phones, PDAs, and online calendars, our memories seem to be becoming weaker. We don&amp;#39;t commit to memory what we can just search for over and over (see &lt;a href="http://mashable.com/2007/05/14/google-dumber"&gt;Why Google Is Making Us Dumber&lt;/a&gt;). It might seem helpful to not have to remember a bunch of phone numbers, but this has the unintended consequence of making our memories generally weaker. My wife and I have also noticed that we tend to forget major events or things we&amp;#39;ve done together unless we have pictures of it. On one hand, this might be a net gain since I will be able to more vividly relive events if I ever get Alzheimer&amp;#39;s. But on the other hand its seems that that my concept of being human has been changed such that I am dependent on a digital camera to experience the past.
&lt;/p&gt;
&lt;p&gt;
This seems to correspond with what the observations of philosopher of technology, &lt;a href="http://www.MarshallMcLuhan.com"&gt;Marshall McLuhan&lt;/a&gt;, who said that &amp;quot;every innovation is an amputation.&amp;quot; When you invent the wheel, your legs become weaker. When you invent the amplifier, your voice becomes weaker. It seems that when we invent online information storage, our memories become weaker. Of course, wheels, amplifiers, and online storage are not evil things&amp;nbsp; - in fact they have the potential to be really good things. The argument I just made about cameras could have been made about a keeping a paper journal a century ago. But it is still important to think through how such technologies change us as people, and consider if certain technologies should be handled more carefully and thoughtfully.
&lt;/p&gt;
&lt;p&gt;
Industries and companies certainly won&amp;#39;t do this thinking for anyone. Businesses are not terribly interested in what&amp;#39;s &amp;quot;good&amp;quot; for people, but what people will buy (and buy lots of). Perhaps it isn&amp;#39;t Carr&amp;#39;s place either to do such thinking for us, but his book leaves quite a bit open for discussion. I for one am personally motivated to figure out ways to keep more of my life/data in me instead of in someone else&amp;#39;s computer. (&lt;a href="http://www.dataportability.org/"&gt;DataPortability&lt;/a&gt; notwithstanding :)
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/lfL1uCQB2-g" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/lfL1uCQB2-g/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/01/16/Book-Review-Nicholas-Carrs-quot3bThe-Big-Switch-Rewiring-the-World2c-From-Edison-to-Googlequot3b.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=7ddc1d6f-5186-4217-9f88-f79ad3a8dc75</guid>
      <pubDate>Wed, 16 Jan 2008 23:48:00 -0500</pubDate>
      <category>Technology</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=7ddc1d6f-5186-4217-9f88-f79ad3a8dc75</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=7ddc1d6f-5186-4217-9f88-f79ad3a8dc75</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/01/16/Book-Review-Nicholas-Carrs-quot3bThe-Big-Switch-Rewiring-the-World2c-From-Edison-to-Googlequot3b.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=7ddc1d6f-5186-4217-9f88-f79ad3a8dc75</wfw:commentRss>
    <enclosure url="http://www.cambridgebibles.com/Media/MediaManager/Excerpt_Vanhoozer_EverydayTheo.pdf" length="427551" type="application/pdf" /><media:content url="http://www.cambridgebibles.com/Media/MediaManager/Excerpt_Vanhoozer_EverydayTheo.pdf" fileSize="427551" type="application/pdf" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> Apparently, my comment on TechCrunch was interesting enough for them to send me a copy of Nicholas Carr&amp;#39;s The Big Switch: Rewiring the World, From Edison to Google, so I thought I&amp;#39;d take a break from code samples and give it a brief review. Overv</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> Apparently, my comment on TechCrunch was interesting enough for them to send me a copy of Nicholas Carr&amp;#39;s The Big Switch: Rewiring the World, From Edison to Google, so I thought I&amp;#39;d take a break from code samples and give it a brief review. Overview Carr&amp;#39;s is thesis is very interesting. In the early 20th century, electricity went from being produced in-house by each company that needed it to being mass produced and made available on a power grid which companies could tap into. This revolution made changes in every facet of life from business to education to medicine to the architecture of living spaces. In the 21st century, Carr argues that a similar revolution is happening with computing and information technology. Today, companies still build their own IT infrastructure and buy individual computers, but the internet is beginning to form a sort of computing grid which companies can tap into just like they do today with electricity. A current example of this is Amazon&amp;#39;s various services like S3 for data storage and EC2 for computing power. The book is very fun to read, especially if you like both technology and &amp;quot;the story behind the story.&amp;quot; In the first half of the book, Carr weaves the tale of electricity&amp;#39;s rise and the birth of the information technology industry. Then, in the second half, he discusses some of the implications of the &amp;quot;programmable internet.&amp;quot; I would definitely recommend it to anyone who enjoys technology and likes a good story. My Thoughts While I really enjoyed the story Carr tells and some of the things he thinks will happen in the future, what was interesting to me was that he never really asks the question: Is this stuff &amp;quot;good&amp;quot; for us? Carr does talk a little bit about business level concerns and how the IT industry will be affected by these changes. He does not, however, engage in questions about how the changes he describes in the book will affect the individual person and what it means to be human. This unquestioning attitude is exactly what Neil Postman wrote about in his book Technopoly: The Surrender of Culture to Technology in which he asked talks about how our culture today tends to immediately adopt technology without thinking through its implications. For example, in the final chapter of the book, entitled &amp;quot;iGod,&amp;quot; Carr discusses how Google eventually hopes to build a system in which all the world&amp;#39;s information plugs directly into our brains. Many of their &amp;quot;products&amp;quot; are just steps to this end. For example, 800-GOOG-411 is an experiment in voice recognition. Carr quotes Google engineers saying that Google Books is not really about displaying books for humans to read, but about making a better Artificial Intelligence that can understand the content of the books. Eventually this will help create a vast Intelligence (iGod?) that people can hook directly to their brains. Carr discusses the cybernetic enhancement this would require (for more, the Transhumanism essay in Everyday Theology by Vanhoozer&amp;#39;s student, Matthew Eppinette: excerpt), Yet, he only mentions two people who question whether this is a good idea. (1) Bill Gates &amp;quot;I&amp;#39;m happy to have the computer over there and I&amp;#39;m over here&amp;quot; and (2) Ted Kaczynski (the Unabomber, &amp;quot;People won&amp;#39;t be able to turn the machines off, because they will be so dependent on them that turning them off would amount to suicide&amp;quot;)! Everyone else seems to see this as a Utopia of sorts. I work in the technology field and I love to try new toys and learn new programming languages, so I&amp;#39;m definitely not against technology by any means. But I do think that people need to begin considering how different technologies will affect them before they buy (into) them. For example, many people are beginning to notice that since we have all been placing a lot of information in our cell phones, PDAs, and online calendars, our memories seem to be becoming weaker. We don&amp;#39;</itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=7ddc1d6f-5186-4217-9f88-f79ad3a8dc75</feedburner:origLink></item>
    <item>
      <title>Simple Gravatar Image Tester</title>
      <description>&lt;p&gt;
For some testing, I needed a simple page where I could test out a &lt;a href="http://www.gravatar.com"&gt;gravatar&lt;/a&gt;. Unfortunately, I couldn&amp;#39;t find anything on gravatar&amp;#39;s site where you can see if your gravatar is working or just get the URL to the image. So I put together a super-simple page using this &lt;a href="http://www.webtoolkit.info/"&gt;JavaScript MD5 hash function&lt;/a&gt;.
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://johndyer.name/lab/gravatartest/"&gt;Gravatar tester&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;a href="http://johndyer.name/lab/gravatartest/"&gt;&lt;img style="border: 0px none " src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/SimpleGravatarImageTester_E273/image_5.png" border="0" alt="image" width="526" height="155" /&gt;&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/Ysv-WxP4_yI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/Ysv-WxP4_yI/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/01/14/Simple-Gravatar-Image-Tester.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=fd029cd0-c6c1-4f83-8b10-d26503fe9bfc</guid>
      <pubDate>Mon, 14 Jan 2008 17:07:00 -0500</pubDate>
      <category>JavaScript</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=fd029cd0-c6c1-4f83-8b10-d26503fe9bfc</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=fd029cd0-c6c1-4f83-8b10-d26503fe9bfc</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/01/14/Simple-Gravatar-Image-Tester.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=fd029cd0-c6c1-4f83-8b10-d26503fe9bfc</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=fd029cd0-c6c1-4f83-8b10-d26503fe9bfc</feedburner:origLink></item>
    <item>
      <title>New Theme for BlogEngine.Net</title>
      <description>&lt;p&gt;
I&amp;#39;m working on a new theme that is closer to a lot of WordPress &lt;a href="http://www.wp-themes.designdisease.com/testrun/?theme=wp_illacrimo/illacrimo"&gt;looks&lt;/a&gt; out there. 
&lt;/p&gt;
&lt;p&gt;
Right now, I&amp;#39;ve going with a zero-image look to see what I could accomplish without using images for curves. &lt;strike&gt;So far it&amp;#39;s looking pretty boxy, but the colors aren&amp;#39;t too bad.&lt;/strike&gt; I decided to use &lt;a href="http://www.curvycorners.net/"&gt;curvyCorners&lt;/a&gt; instead of images to round things out. Since this is primarly a blog about coding, not design, I think it&amp;#39;s appropriate that the design doesn&amp;#39;t have a lot of imagery, and that the site uses code to accomplish its look.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.dotnetblogengine.net/"&gt;BlogEngine.NET&lt;/a&gt; makes skinning the site &lt;a href="http://www.razorant.com/blog/post/Using-the-BlogEngineNET-SQL-Server-Provider-Screencast.aspx"&gt;super easy&lt;/a&gt; since it&amp;#39;s basically just a MasterPage and a CSS file. I also made a &lt;a href="http://www.codeplex.com/blogengine/WorkItem/View.aspx?WorkItemId=5032"&gt;small change&lt;/a&gt; to the tag cloud and created an alternate version of the recent comments control so it just has the author and post title. 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/JibCvvmCPeE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/JibCvvmCPeE/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2008/01/10/New-Theme.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=ed547e38-2034-47a2-b9e1-7c7e3385d09a</guid>
      <pubDate>Thu, 10 Jan 2008 15:10:00 -0500</pubDate>
      <category>Personal</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=ed547e38-2034-47a2-b9e1-7c7e3385d09a</pingback:target>
      <slash:comments>9</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=ed547e38-2034-47a2-b9e1-7c7e3385d09a</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2008/01/10/New-Theme.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=ed547e38-2034-47a2-b9e1-7c7e3385d09a</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=ed547e38-2034-47a2-b9e1-7c7e3385d09a</feedburner:origLink></item>
    <item>
      <title>C# Template for Creating Google Video Sitemap</title>
      <description>&lt;p&gt;Earlier this month, Google introduced "&lt;a href="http://googlewebmastercentral.blogspot.com/2007/12/introducing-video-sitemaps.html"&gt;Video Sitemaps&lt;/a&gt;" as an extension to the &lt;a href="http://www.sitemaps.org/protocol.php"&gt;Sitemap Protocol&lt;/a&gt; standard. It allows website owners to expose their video content (including embedded video) to be indexed and included in &lt;a href="http://video.google.com/"&gt;Google's video search&lt;/a&gt; (here is &lt;a href="http://www.google.com/support/webmasters/bin/answer.py?answer=80472&amp;topic=10079&amp;safe=active"&gt;Google's spec&lt;/a&gt;). Embrace and extend ;)&lt;/p&gt; &lt;p&gt;I just added this to &lt;a href="http://www.dts.edu/media/"&gt;Dallas Theological Seminary&lt;/a&gt;'s site: &lt;a href="http://www.dts.edu/videositemap.xml"&gt;http://www.dts.edu/videositemap.xml&lt;/a&gt; and I thought it might help to share the template to speed someone else's development:&lt;/p&gt;&lt;pre class="prettyprint"&gt;using System;
using System.Data;
using System.Configuration;
using System.Collections.Generic;
using System.Web;
using System.Xml;
using System.Text;

namespace YourNamespace
{
    public class VideoSiteMap : IHttpHandler
    {
        public VideoSiteMap()
        {
        } 
        
        public void ProcessRequest(HttpContext context)
        {
            XmlTextWriter writer = new XmlTextWriter(context.Response.OutputStream, Encoding.UTF8); 
            context.Response.ContentType = "text/xml";

            writer.Formatting = Formatting.Indented;
            writer.WriteStartDocument(); 
            writer.WriteStartElement("urlset");
            
            // add namespaces
            writer.WriteAttributeString("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");
            writer.WriteAttributeString("xmlns", "video", null, "http://www.google.com/schemas/sitemap-video/1.0");
            
            // fake loop
            for (int i=0; i&amp;lt;10; i++) {
                writer.WriteStartElement("url");

				// required
                writer.WriteElementString("loc", "http://mysite.com/myplayer.aspx");
                writer.WriteStartElement("video", "video", null); 
                
                // start:optional
                writer.WriteElementString("video", "title", null, "Video Title");
                writer.WriteElementString("video", "description", null, "a great video");
                writer.WriteElementString("video", "thumbnail_loc", null, "http://mysite.com/myvideothumb.jpg");
                writer.WriteElementString("video", "family_friendly", null, "Yes");
                writer.WriteElementString("video", "content_loc", null, "http://mysite.com/myvideo.flv");
                writer.WriteElementString("video", "duration", null, "100");                    
                
                writer.WriteStartElement("video", "player_loc", null);                
                writer.WriteAttributeString("allow_embed", "true");
                writer.WriteString("http://mysite.com/embeddedplayer.swf");
                writer.WriteEndElement(); // video:player_loc
                // end:optional
                
                writer.WriteEndElement(); // video:video
                writer.WriteEndElement(); //url
            }
            
            writer.WriteEndElement(); //urlset 
            writer.WriteEndDocument();
            writer.Close();
        }
        public bool IsReusable
        {
            get { return false; }
        }
    }
}&lt;/pre&gt;
&lt;p&gt;Just add this class to your web.config and you're all set: 
&lt;p&gt;&lt;pre class="prettyprint"&gt;&amp;lt;system.web&amp;gt;
   &amp;lt;httpHandlers&amp;gt;
      &amp;lt;add verb="*" path="videositemap.xml" type="YourNamespace.VideoSiteMap, YourNamespace"/&amp;gt;
   &amp;lt;/httpHandlers&amp;gt;
&amp;lt;/system.web&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Hope that helps!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/Olo0PsFD9WI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/Olo0PsFD9WI/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/2007/12/31/C-Template-for-Creating-Google-Video-Sitemap.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=ebacafd8-557d-424c-9843-21d445b20366</guid>
      <pubDate>Mon, 31 Dec 2007 11:48:22 -0500</pubDate>
      <category>ASP.NET</category>
      <category>Dallas Seminary</category>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=ebacafd8-557d-424c-9843-21d445b20366</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=ebacafd8-557d-424c-9843-21d445b20366</trackback:ping>
      <wfw:comment>http://johndyer.name/post/2007/12/31/C-Template-for-Creating-Google-Video-Sitemap.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=ebacafd8-557d-424c-9843-21d445b20366</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=ebacafd8-557d-424c-9843-21d445b20366</feedburner:origLink></item>
  <media:rating>nonadult</media:rating><media:description type="plain">Technology and web development in ASP.NET, Flash, and JavaScript</media:description></channel>
</rss>
