<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 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:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Andrew Hay - software</title>
    <link>http://www.andrewdothay.net/blog/</link>
    <description>Thinking way too long about the subtitle</description>
    <language>en-us</language>
    <copyright>Andrew Hay</copyright>
    <lastBuildDate>Thu, 19 Aug 2010 16:36:31 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.0.7226.0</generator>
    <managingEditor>andrewcameronhay@hotmail.com</managingEditor>
    <webMaster>andrewcameronhay@hotmail.com</webMaster>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=89ea2cf4-66e6-44e7-8815-8e8afac93005</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,89ea2cf4-66e6-44e7-8815-8e8afac93005.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,89ea2cf4-66e6-44e7-8815-8e8afac93005.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=89ea2cf4-66e6-44e7-8815-8e8afac93005</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
With some spare time on my hands, I took at look at the improved JavaScript SDK from
Facebook.
</p>
        <p>
In the past, I really disliked Facebook coding because the developer experience was
really hard. The documentation was wrong or obsolete, the sample code libraries rarely
worked and it was really frustrating. 
</p>
        <p>
Now with the push towards the JavaScript SDK, things are smooth sailing! Here’s the
reference: <a href="http://developers.facebook.com/docs/reference/javascript/">http://developers.facebook.com/docs/reference/javascript/</a></p>
        <p>
It’s super easy to sign in to Facebook from my external site and remove the need to
have my own authentication system. I’m always a fan of having one less username and
password to remember. The following sample page can be used to connect to your facebook
application and do a couple of simple tasks like retrieving your name. This Facebook
code comes right out of the JavaScript SDK reference.
</p>
        <p>
The 5 steps to set up this code are embedded in comments of this HTML file:
</p>
        <div id="codeSnippetWrapper">
          <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum1"> 1:</span> &lt;!DOCTYPE
html&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum2"> 2:</span> &lt;html
lang=<span style="color: #006080">"en"</span>&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum3"> 3:</span> &lt;head&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum4"> 4:</span> &lt;title&gt;Sample
Facebook JavaScript SDK&lt;/title&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum5"> 5:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum6"> 6:</span> &lt;!--</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum7"> 7:</span> How
to get started:</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum8"> 8:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum9"> 9:</span> 1.
Register an app on http:<span style="color: #008000">//www.facebook.com/developers/</span></pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum10"> 10:</span> 2.
Helpful table of facebook app settings can be found here: http:<span style="color: #008000">//msdn.microsoft.com/en-us/windows/ee395718.aspx</span></pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum11"> 11:</span> 3.
Create a Web Forms or MVC project <span style="color: #0000ff">in</span> Visual Studio</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum12"> 12:</span> 4.
Inside Visual Studio, set the specific PORT NUMBER to match the Facebook app registration</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum13"> 13:</span> 5.
Copy your app id from Facebook registration page to the JavaScript below</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum14"> 14:</span> --&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum15"> 15:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum16"> 16:</span> &lt;style&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum17"> 17:</span> input
{</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum18"> 18:</span> width:130px;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum19"> 19:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum20"> 20:</span> table
{</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum21"> 21:</span> width:100%;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum22"> 22:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum23"> 23:</span> .left
{</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum24"> 24:</span> width:200px;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum25"> 25:</span> vertical-align:top;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum26"> 26:</span> text-align:left;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum27"> 27:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum28"> 28:</span> .right
{</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum29"> 29:</span> vertical-align:top;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum30"> 30:</span> text-align:left;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum31"> 31:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum32"> 32:</span> &lt;/style&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum33"> 33:</span> &lt;/head&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum34"> 34:</span> &lt;body&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum35"> 35:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum36"> 36:</span> &lt;table&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum37"> 37:</span> &lt;tr&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum38"> 38:</span> &lt;td <span style="color: #0000ff">class</span>=<span style="color: #006080">"left"</span>&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum39"> 39:</span> &lt;ol&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum40"> 40:</span> &lt;li&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum41"> 41:</span> &lt;input
id=<span style="color: #006080">"getLoginStatusButton"</span> type=button value=<span style="color: #006080">"Get
Login Status"</span> /&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum42"> 42:</span> &lt;/li&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum43"> 43:</span> &lt;li&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum44"> 44:</span> &lt;input
id=<span style="color: #006080">"loginButton"</span> type=button value=<span style="color: #006080">"Login"</span> /&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum45"> 45:</span> &lt;/li&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum46"> 46:</span> &lt;li&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum47"> 47:</span> &lt;input
id=<span style="color: #006080">"getName"</span> type=<span style="color: #006080">"button"</span> value=<span style="color: #006080">"Get
Name"</span> /&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum48"> 48:</span> &lt;/li&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum49"> 49:</span> &lt;li&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum50"> 50:</span> &lt;input
id=<span style="color: #006080">"logoutButton"</span> type=<span style="color: #006080">"button"</span> value=<span style="color: #006080">"Logout"</span> /&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum51"> 51:</span> &lt;/li&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum52"> 52:</span> &lt;/ol&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum53"> 53:</span> &lt;/td&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum54"> 54:</span> &lt;td <span style="color: #0000ff">class</span>=<span style="color: #006080">"right"</span>&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum55"> 55:</span> &lt;h2&gt;Messages&lt;/h2&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum56"> 56:</span> &lt;ol
id=<span style="color: #006080">"messages"</span>&gt;&lt;/ol&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum57"> 57:</span> &lt;/td&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum58"> 58:</span> &lt;/tr&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum59"> 59:</span> &lt;/table&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum60"> 60:</span>
            </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum61"> 61:</span> &lt;script
type=<span style="color: #006080">"text/javascript"</span> src=<span style="color: #006080">"http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.min.js"</span>&gt;&lt;/script&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum62"> 62:</span> &lt;script
type=<span style="color: #006080">"text/javascript"</span>&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum63"> 63:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum64"> 64:</span> window.fbAsyncInit
= <span style="color: #0000ff">function</span> () {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum65"> 65:</span> FB.init({</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum66"> 66:</span> appId: <span style="color: #006080">'[YOUR
APP ID GOES HERE]'</span>,</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum67"> 67:</span> status: <span style="color: #0000ff">true</span>, </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum68"> 68:</span> cookie: <span style="color: #0000ff">true</span>,</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum69"> 69:</span> xfbml: <span style="color: #0000ff">true</span></pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum70"> 70:</span> });</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum71"> 71:</span> };</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum72"> 72:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum73"> 73:</span> $(<span style="color: #0000ff">function</span> ()
{</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum74"> 74:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum75"> 75:</span> $(<span style="color: #006080">'#getLoginStatusButton'</span>).click(<span style="color: #0000ff">function</span> ()
{</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum76"> 76:</span> console.log(<span style="color: #006080">'inside
button click event'</span>);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum77"> 77:</span> FB.getLoginStatus(<span style="color: #0000ff">function</span> (response)
{</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum78"> 78:</span>
              <span style="color: #0000ff">if</span> (response.session)
{</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum79"> 79:</span>
              <span style="color: #008000">//
logged in and connected user, someone you know</span>
            </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum80"> 80:</span> $(<span style="color: #006080">'#messages'</span>).append(<span style="color: #006080">'&lt;li&gt;logged
in; access token is '</span> + response.session.access_token + <span style="color: #006080">'&lt;/li&gt;'</span>);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum81"> 81:</span> } <span style="color: #0000ff">else</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum82"> 82:</span>
              <span style="color: #008000">//
no user session available, someone you dont know</span>
            </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum83"> 83:</span> $(<span style="color: #006080">'#messages'</span>).append(<span style="color: #006080">'&lt;li&gt;not
logged in&lt;/li&gt;'</span>);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum84"> 84:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum85"> 85:</span> });</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum86"> 86:</span> });</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum87"> 87:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum88"> 88:</span> $(<span style="color: #006080">'#loginButton'</span>).click(<span style="color: #0000ff">function</span> ()
{</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum89"> 89:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum90"> 90:</span> FB.login(<span style="color: #0000ff">function</span> (response)
{</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum91"> 91:</span>
              <span style="color: #0000ff">if</span> (response.session)
{</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum92"> 92:</span>
              <span style="color: #008000">//
user successfully logged in</span>
            </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum93"> 93:</span> $(<span style="color: #006080">'#messages'</span>).append(<span style="color: #006080">'&lt;li&gt;successful
log in; access token is '</span> + response.session.access_token + <span style="color: #006080">'&lt;/li&gt;'</span>);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum94"> 94:</span> } <span style="color: #0000ff">else</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum95"> 95:</span>
              <span style="color: #008000">//
user cancelled login</span>
            </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum96"> 96:</span> $(<span style="color: #006080">'#messages'</span>).append(<span style="color: #006080">'&lt;li&gt;cancelled
logged in&lt;/li&gt;'</span>);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum97"> 97:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum98"> 98:</span> });</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum99"> 99:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum100"> 100:</span> });</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum101"> 101:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum102"> 102:</span> $(<span style="color: #006080">'#getName'</span>).click(<span style="color: #0000ff">function</span> ()
{</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum103"> 103:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum104"> 104:</span> FB.api(<span style="color: #006080">'/me'</span>, <span style="color: #0000ff">function</span> (response)
{</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum105"> 105:</span> $(<span style="color: #006080">'#messages'</span>).append(<span style="color: #006080">'&lt;li&gt;'</span> +
response.name + <span style="color: #006080">'&lt;/li&gt;'</span>);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum106"> 106:</span> });</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum107"> 107:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum108"> 108:</span> });</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum109"> 109:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum110"> 110:</span> $(<span style="color: #006080">'#logoutButton'</span>).click(<span style="color: #0000ff">function</span> ()
{</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum111"> 111:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum112"> 112:</span> FB.logout(<span style="color: #0000ff">function</span> (response)
{</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum113"> 113:</span> $(<span style="color: #006080">'#messages'</span>).append(<span style="color: #006080">'&lt;li&gt;logged
out&lt;/li&gt;'</span>);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum114"> 114:</span> });</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum115"> 115:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum116"> 116:</span> });</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum117"> 117:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum118"> 118:</span> });</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum119"> 119:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum120"> 120:</span> &lt;/script&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum121"> 121:</span>
            </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum122"> 122:</span> &lt;div
id=<span style="color: #006080">"fb-root"</span>&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum123"> 123:</span> &lt;script
src=<span style="color: #006080">"http://connect.facebook.net/en_US/all.js"</span> type=<span style="color: #006080">"text/javascript"</span>&gt;&lt;/script&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum124"> 124:</span> &lt;/div&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum125"> 125:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum126"> 126:</span> &lt;/body&gt;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum127"> 127:</span> &lt;/html&gt;</pre>
            <!--CRLF-->
          </div>
        </div>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=89ea2cf4-66e6-44e7-8815-8e8afac93005" />
      </body>
      <title>Dinking around with the Facebook JavaScript SDK</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,89ea2cf4-66e6-44e7-8815-8e8afac93005.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2010/08/19/DinkingAroundWithTheFacebookJavaScriptSDK.aspx</link>
      <pubDate>Thu, 19 Aug 2010 16:36:31 GMT</pubDate>
      <description>&lt;p&gt;
With some spare time on my hands, I took at look at the improved JavaScript SDK from
Facebook.
&lt;/p&gt;
&lt;p&gt;
In the past, I really disliked Facebook coding because the developer experience was
really hard. The documentation was wrong or obsolete, the sample code libraries rarely
worked and it was really frustrating. 
&lt;/p&gt;
&lt;p&gt;
Now with the push towards the JavaScript SDK, things are smooth sailing! Here’s the
reference: &lt;a href="http://developers.facebook.com/docs/reference/javascript/"&gt;http://developers.facebook.com/docs/reference/javascript/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
It’s super easy to sign in to Facebook from my external site and remove the need to
have my own authentication system. I’m always a fan of having one less username and
password to remember. The following sample page can be used to connect to your facebook
application and do a couple of simple tasks like retrieving your name. This Facebook
code comes right out of the JavaScript SDK reference.
&lt;/p&gt;
&lt;p&gt;
The 5 steps to set up this code are embedded in comments of this HTML file:
&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt; 1:&lt;/span&gt; &amp;lt;!DOCTYPE
html&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt; 2:&lt;/span&gt; &amp;lt;html
lang=&lt;span style="color: #006080"&gt;"en"&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt; 3:&lt;/span&gt; &amp;lt;head&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt; 4:&lt;/span&gt; &amp;lt;title&amp;gt;Sample
Facebook JavaScript SDK&amp;lt;/title&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt; 5:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt; 6:&lt;/span&gt; &amp;lt;!--&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt; 7:&lt;/span&gt; How
to get started:&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt; 8:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt; 9:&lt;/span&gt; 1.
Register an app on http:&lt;span style="color: #008000"&gt;//www.facebook.com/developers/&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt; 10:&lt;/span&gt; 2.
Helpful table of facebook app settings can be found here: http:&lt;span style="color: #008000"&gt;//msdn.microsoft.com/en-us/windows/ee395718.aspx&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt; 11:&lt;/span&gt; 3.
Create a Web Forms or MVC project &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; Visual Studio&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt; 12:&lt;/span&gt; 4.
Inside Visual Studio, set the specific PORT NUMBER to match the Facebook app registration&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt; 13:&lt;/span&gt; 5.
Copy your app id from Facebook registration page to the JavaScript below&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt; 14:&lt;/span&gt; --&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt; 15:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt; 16:&lt;/span&gt; &amp;lt;style&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt; 17:&lt;/span&gt; input
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt; 18:&lt;/span&gt; width:130px;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt; 19:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt; 20:&lt;/span&gt; table
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt; 21:&lt;/span&gt; width:100%;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt; 22:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt; 23:&lt;/span&gt; .left
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt; 24:&lt;/span&gt; width:200px;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt; 25:&lt;/span&gt; vertical-align:top;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt; 26:&lt;/span&gt; text-align:left;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt; 27:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt; 28:&lt;/span&gt; .right
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum29"&gt; 29:&lt;/span&gt; vertical-align:top;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum30"&gt; 30:&lt;/span&gt; text-align:left;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum31"&gt; 31:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum32"&gt; 32:&lt;/span&gt; &amp;lt;/style&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum33"&gt; 33:&lt;/span&gt; &amp;lt;/head&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum34"&gt; 34:&lt;/span&gt; &amp;lt;body&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum35"&gt; 35:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum36"&gt; 36:&lt;/span&gt; &amp;lt;table&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum37"&gt; 37:&lt;/span&gt; &amp;lt;tr&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum38"&gt; 38:&lt;/span&gt; &amp;lt;td &lt;span style="color: #0000ff"&gt;class&lt;/span&gt;=&lt;span style="color: #006080"&gt;"left"&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum39"&gt; 39:&lt;/span&gt; &amp;lt;ol&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum40"&gt; 40:&lt;/span&gt; &amp;lt;li&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum41"&gt; 41:&lt;/span&gt; &amp;lt;input
id=&lt;span style="color: #006080"&gt;"getLoginStatusButton"&lt;/span&gt; type=button value=&lt;span style="color: #006080"&gt;"Get
Login Status"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum42"&gt; 42:&lt;/span&gt; &amp;lt;/li&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum43"&gt; 43:&lt;/span&gt; &amp;lt;li&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum44"&gt; 44:&lt;/span&gt; &amp;lt;input
id=&lt;span style="color: #006080"&gt;"loginButton"&lt;/span&gt; type=button value=&lt;span style="color: #006080"&gt;"Login"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum45"&gt; 45:&lt;/span&gt; &amp;lt;/li&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum46"&gt; 46:&lt;/span&gt; &amp;lt;li&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum47"&gt; 47:&lt;/span&gt; &amp;lt;input
id=&lt;span style="color: #006080"&gt;"getName"&lt;/span&gt; type=&lt;span style="color: #006080"&gt;"button"&lt;/span&gt; value=&lt;span style="color: #006080"&gt;"Get
Name"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum48"&gt; 48:&lt;/span&gt; &amp;lt;/li&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum49"&gt; 49:&lt;/span&gt; &amp;lt;li&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum50"&gt; 50:&lt;/span&gt; &amp;lt;input
id=&lt;span style="color: #006080"&gt;"logoutButton"&lt;/span&gt; type=&lt;span style="color: #006080"&gt;"button"&lt;/span&gt; value=&lt;span style="color: #006080"&gt;"Logout"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum51"&gt; 51:&lt;/span&gt; &amp;lt;/li&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum52"&gt; 52:&lt;/span&gt; &amp;lt;/ol&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum53"&gt; 53:&lt;/span&gt; &amp;lt;/td&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum54"&gt; 54:&lt;/span&gt; &amp;lt;td &lt;span style="color: #0000ff"&gt;class&lt;/span&gt;=&lt;span style="color: #006080"&gt;"right"&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum55"&gt; 55:&lt;/span&gt; &amp;lt;h2&amp;gt;Messages&amp;lt;/h2&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum56"&gt; 56:&lt;/span&gt; &amp;lt;ol
id=&lt;span style="color: #006080"&gt;"messages"&lt;/span&gt;&amp;gt;&amp;lt;/ol&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum57"&gt; 57:&lt;/span&gt; &amp;lt;/td&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum58"&gt; 58:&lt;/span&gt; &amp;lt;/tr&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum59"&gt; 59:&lt;/span&gt; &amp;lt;/table&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum60"&gt; 60:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum61"&gt; 61:&lt;/span&gt; &amp;lt;script
type=&lt;span style="color: #006080"&gt;"text/javascript"&lt;/span&gt; src=&lt;span style="color: #006080"&gt;"http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.min.js"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum62"&gt; 62:&lt;/span&gt; &amp;lt;script
type=&lt;span style="color: #006080"&gt;"text/javascript"&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum63"&gt; 63:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum64"&gt; 64:&lt;/span&gt; window.fbAsyncInit
= &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum65"&gt; 65:&lt;/span&gt; FB.init({&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum66"&gt; 66:&lt;/span&gt; appId: &lt;span style="color: #006080"&gt;'[YOUR
APP ID GOES HERE]'&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum67"&gt; 67:&lt;/span&gt; status: &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;, &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum68"&gt; 68:&lt;/span&gt; cookie: &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum69"&gt; 69:&lt;/span&gt; xfbml: &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum70"&gt; 70:&lt;/span&gt; });&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum71"&gt; 71:&lt;/span&gt; };&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum72"&gt; 72:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum73"&gt; 73:&lt;/span&gt; $(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; ()
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum74"&gt; 74:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum75"&gt; 75:&lt;/span&gt; $(&lt;span style="color: #006080"&gt;'#getLoginStatusButton'&lt;/span&gt;).click(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; ()
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum76"&gt; 76:&lt;/span&gt; console.log(&lt;span style="color: #006080"&gt;'inside
button click event'&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum77"&gt; 77:&lt;/span&gt; FB.getLoginStatus(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (response)
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum78"&gt; 78:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (response.session)
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum79"&gt; 79:&lt;/span&gt; &lt;span style="color: #008000"&gt;//
logged in and connected user, someone you know&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum80"&gt; 80:&lt;/span&gt; $(&lt;span style="color: #006080"&gt;'#messages'&lt;/span&gt;).append(&lt;span style="color: #006080"&gt;'&amp;lt;li&amp;gt;logged
in; access token is '&lt;/span&gt; + response.session.access_token + &lt;span style="color: #006080"&gt;'&amp;lt;/li&amp;gt;'&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum81"&gt; 81:&lt;/span&gt; } &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum82"&gt; 82:&lt;/span&gt; &lt;span style="color: #008000"&gt;//
no user session available, someone you dont know&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum83"&gt; 83:&lt;/span&gt; $(&lt;span style="color: #006080"&gt;'#messages'&lt;/span&gt;).append(&lt;span style="color: #006080"&gt;'&amp;lt;li&amp;gt;not
logged in&amp;lt;/li&amp;gt;'&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum84"&gt; 84:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum85"&gt; 85:&lt;/span&gt; });&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum86"&gt; 86:&lt;/span&gt; });&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum87"&gt; 87:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum88"&gt; 88:&lt;/span&gt; $(&lt;span style="color: #006080"&gt;'#loginButton'&lt;/span&gt;).click(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; ()
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum89"&gt; 89:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum90"&gt; 90:&lt;/span&gt; FB.login(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (response)
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum91"&gt; 91:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (response.session)
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum92"&gt; 92:&lt;/span&gt; &lt;span style="color: #008000"&gt;//
user successfully logged in&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum93"&gt; 93:&lt;/span&gt; $(&lt;span style="color: #006080"&gt;'#messages'&lt;/span&gt;).append(&lt;span style="color: #006080"&gt;'&amp;lt;li&amp;gt;successful
log in; access token is '&lt;/span&gt; + response.session.access_token + &lt;span style="color: #006080"&gt;'&amp;lt;/li&amp;gt;'&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum94"&gt; 94:&lt;/span&gt; } &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum95"&gt; 95:&lt;/span&gt; &lt;span style="color: #008000"&gt;//
user cancelled login&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum96"&gt; 96:&lt;/span&gt; $(&lt;span style="color: #006080"&gt;'#messages'&lt;/span&gt;).append(&lt;span style="color: #006080"&gt;'&amp;lt;li&amp;gt;cancelled
logged in&amp;lt;/li&amp;gt;'&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum97"&gt; 97:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum98"&gt; 98:&lt;/span&gt; });&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum99"&gt; 99:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum100"&gt; 100:&lt;/span&gt; });&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum101"&gt; 101:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum102"&gt; 102:&lt;/span&gt; $(&lt;span style="color: #006080"&gt;'#getName'&lt;/span&gt;).click(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; ()
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum103"&gt; 103:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum104"&gt; 104:&lt;/span&gt; FB.api(&lt;span style="color: #006080"&gt;'/me'&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (response)
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum105"&gt; 105:&lt;/span&gt; $(&lt;span style="color: #006080"&gt;'#messages'&lt;/span&gt;).append(&lt;span style="color: #006080"&gt;'&amp;lt;li&amp;gt;'&lt;/span&gt; +
response.name + &lt;span style="color: #006080"&gt;'&amp;lt;/li&amp;gt;'&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum106"&gt; 106:&lt;/span&gt; });&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum107"&gt; 107:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum108"&gt; 108:&lt;/span&gt; });&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum109"&gt; 109:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum110"&gt; 110:&lt;/span&gt; $(&lt;span style="color: #006080"&gt;'#logoutButton'&lt;/span&gt;).click(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; ()
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum111"&gt; 111:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum112"&gt; 112:&lt;/span&gt; FB.logout(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (response)
{&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum113"&gt; 113:&lt;/span&gt; $(&lt;span style="color: #006080"&gt;'#messages'&lt;/span&gt;).append(&lt;span style="color: #006080"&gt;'&amp;lt;li&amp;gt;logged
out&amp;lt;/li&amp;gt;'&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum114"&gt; 114:&lt;/span&gt; });&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum115"&gt; 115:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum116"&gt; 116:&lt;/span&gt; });&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum117"&gt; 117:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum118"&gt; 118:&lt;/span&gt; });&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum119"&gt; 119:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum120"&gt; 120:&lt;/span&gt; &amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum121"&gt; 121:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum122"&gt; 122:&lt;/span&gt; &amp;lt;div
id=&lt;span style="color: #006080"&gt;"fb-root"&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum123"&gt; 123:&lt;/span&gt; &amp;lt;script
src=&lt;span style="color: #006080"&gt;"http://connect.facebook.net/en_US/all.js"&lt;/span&gt; type=&lt;span style="color: #006080"&gt;"text/javascript"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum124"&gt; 124:&lt;/span&gt; &amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum125"&gt; 125:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum126"&gt; 126:&lt;/span&gt; &amp;lt;/body&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum127"&gt; 127:&lt;/span&gt; &amp;lt;/html&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=89ea2cf4-66e6-44e7-8815-8e8afac93005" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,89ea2cf4-66e6-44e7-8815-8e8afac93005.aspx</comments>
      <category>Facebook</category>
      <category>JavaScript</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=3cc2c51a-a0e8-4c1e-9228-cc27ae6ffc7d</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,3cc2c51a-a0e8-4c1e-9228-cc27ae6ffc7d.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,3cc2c51a-a0e8-4c1e-9228-cc27ae6ffc7d.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=3cc2c51a-a0e8-4c1e-9228-cc27ae6ffc7d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img style="border-right-width: 0px; margin: 0px 0px 10px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="I do (change your EXIF data)" border="0" alt="I do (change your EXIF data)" align="right" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/HowToEditJPGMetaInfo_8ABD/ring_5.jpg" width="404" height="322" />We
just got back from a great weekend at the beach; my sister-in-law got married on the
sands near Haystack Rock in Cannon Beach, OR. Really a great trip from start to finish. 
</p>
        <p>
My wife accepted the photographer duties and snapped nearly 2K photos with our Nikon
D40 and a Nikon D60 that we borrowed from a friend. She had a zoom lens on one and
a short lens on the other to avoid the need to change lenses in mid-moment. That part
worked great. 
</p>
        <p>
The part that we overlooked was the current date/time on each camera; they were not
synchronized. This will make sorting photos by time more difficult. No problem, I
say, on the drive back home. I’m a developer and JPG files have meta info that I can
manipulate, right? 
</p>
        <p>
It turns out that its not all that easy. Its actually a remarkable pain in the ass,
hence this blog post (that’s the remark-able part).
</p>
        <p>
I started with an online search and found <a href="http://www.hanselman.com/blog/AccessingEXIFPhotoDataFromJPEGsWithPowerShell.aspx" target="_blank">Hanselman’s
post</a> about combining PowerShell with Omar Shahine’s library, ImageLibrary.dll
that is evidently no longer accessible. Big phat 404 while trying to get that assembly.
</p>
        <p>
Next, I did some searches specific to StackOverflow.com and saw some posts about how
difficult reading/writing this meta data can be. At this point, I was beginning to
wonder if my wife was going to hear a broken promise or not. It wasn’t looking good.
</p>
        <p>
I found out that JPG files store meta data using EXIF, or Exchangeable Image File
Format, a standard used by the digital still camera industry. It looked like C# 4.0
could crack this open, but I might have to do get my hands dirty with some bit shuffling.
No worries, I was up for it. It didn’t look like there was a library out there that
was going to fall into my lap, so I cracked open Visual Studio 2010 and saw what kind
of trouble I could get into with Intellisense and a gin and tonic.
</p>
        <p>
          <strong>Let’s Take It Out for a Loop</strong>
        </p>
        <p>
I created a new project, loaded a Bitmap class with a sample JPG and iterated over
the properties:
</p>
        <div id="codeSnippetWrapper">
          <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum1"> 1:</span>
              <span style="color: #0000ff">using</span> System;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum2"> 2:</span>
              <span style="color: #0000ff">using</span> System.Drawing;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum3"> 3:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum4"> 4:</span>
              <span style="color: #0000ff">namespace</span> ReadExifInJPG</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum5"> 5:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum6"> 6:</span>
              <span style="color: #0000ff">class</span> Program</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum7"> 7:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum8"> 8:</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">void</span> Main()</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum9"> 9:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum10"> 10:</span> var
bitmap = <span style="color: #0000ff">new</span> Bitmap(<span style="color: #006080">"c:\\temp\\somephoto.jpg"</span>);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum11"> 11:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum12"> 12:</span>
              <span style="color: #0000ff">foreach</span> (var
item <span style="color: #0000ff">in</span> bitmap.PropertyItems)</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum13"> 13:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum14"> 14:</span> Console.WriteLine(<span style="color: #006080">"Id:
{0}, Type: {1}, Value: {2}"</span>, </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum15"> 15:</span> item.Id,
item.Type, item.Value);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum16"> 16:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum17"> 17:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum18"> 18:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum19"> 19:</span> }</pre>
            <!--CRLF-->
          </div>
        </div>
        <p>
I had lots of properties in my sample photo:
</p>
        <p>
          <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="output of simple iteration" border="0" alt="output of simple iteration" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/HowToEditJPGMetaInfo_8ABD/jpgexifoutput_1.png" width="421" height="927" />
        </p>
        <p>
I was thinking that this was going to be smooth sailing until I saw the values listed
as byte arrays. Ugh. Then I read a EXIF specification that said the values can be
stored in multiple formats and there are a ton of properties. I had over fifty on
a single JPG image. I needed to find the property that told me if the given photo
was taken by a Nikon D60 or a D40, and then change the date on the D60 images. Here’s
the EXIF specifications: <a href="http://www.exif.org/specifications.html">http://www.exif.org/specifications.html</a>,
and what a great document to read! Ugh.
</p>
        <p>
          <strong>I Just Want My Property</strong>
        </p>
        <p>
I found a list of property tags in numerical order on MSDN, note the id values are
listed in hex, so 0x0132 (hex) equals 306 (decimal): <a href="http://msdn.microsoft.com/en-us/library/ms534418(VS.85).aspx">http://msdn.microsoft.com/en-us/library/ms534418(VS.85).aspx</a></p>
        <p>
When you go about reading or changing a given property, there are three parts to consider: 
</p>
        <ol>
          <li>
the id number that identifies the given property 
</li>
          <li>
the type number which describes the data format 
</li>
          <li>
the actual data, encoded in the least accessible format you could want</li>
        </ol>
        <p>
Here’s a list of numeric types that identify the corresponding data format:
</p>
        <ol>
          <li>
A Byte 
</li>
          <li>
An array of Byte objects encoded as ASCII 
</li>
          <li>
A 16-bit integer 
</li>
          <li>
A 32-bit integer 
</li>
          <li>
An array of two Byte objects that represent a rational number 
</li>
          <li>
Not used 
</li>
          <li>
Undefined 
</li>
          <li>
Not used 
</li>
          <li>
SLong 
</li>
          <li>
SRational</li>
        </ol>
        <p>
Fortunately, everything I was interested in was of type 2, a byte array. This is a
great MSDN article that gave me a bunch of tips on how to manipulate the EXIF data: <a href="http://msdn.microsoft.com/en-us/library/xddt0dz7.aspx">http://msdn.microsoft.com/en-us/library/xddt0dz7.aspx</a></p>
        <p>
The property id of 306 holds the date of the photo, its a type 2 property, so the
value is stored in a byte array. Here’s how to read the string value:
</p>
        <div id="codeSnippetWrapper">
          <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum1"> 1:</span> var
property = bitmap.GetPropertyItem(306);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum2"> 2:</span> System.Text.ASCIIEncoding
encoding = <span style="color: #0000ff">new</span> System.Text.ASCIIEncoding();</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum3"> 3:</span>
              <span style="color: #0000ff">string</span>
              <span style="color: #0000ff">value</span> =
encoding.GetString(property.Value);</pre>
            <!--CRLF-->
          </div>
        </div>
        <p>
          <br />
          <strong>Caution, Byte Counting Ahead</strong>
        </p>
        <p>
Note, the date properties that I’m interested in updating have values stored as byte
arrays. More specifically, they’re exactly 20 bytes long. At first I wasn’t respecting
that boundary and I just let .Net do it’s thing to convert my formatted date string
into a byte array. When I tried to read the value back, it was empty because I overflowed
the value. 
</p>
        <p>
After some noodling, I changed my code to write out exactly 20 bytes of data, starting
at precisely 23 bytes into my new byte array, as follows.
</p>
        <div id="codeSnippetWrapper">
          <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum1"> 1:</span>
              <span style="color: #0000ff">private</span>
              <span style="color: #0000ff">void</span> ChangeTimeStamp(Bitmap
bitmap, <span style="color: #0000ff">int</span> minutesToAdd)</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum2"> 2:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum3"> 3:</span> DateTime
originalDateTime = GetOriginalDateTime(bitmap);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum4"> 4:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum5"> 5:</span> var
newDateTime = originalDateTime.AddMinutes(minutesToAdd);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum6"> 6:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum7"> 7:</span> BinaryFormatter
bf = <span style="color: #0000ff">new</span> BinaryFormatter();</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum8"> 8:</span> MemoryStream
ms = <span style="color: #0000ff">new</span> MemoryStream();</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum9"> 9:</span>
              <span style="color: #0000ff">string</span> formattedNewDateTime
= newDateTime.ToString(<span style="color: #006080">"yyyy:MM:dd HH:mm:ss"</span>);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum10"> 10:</span> bf.Serialize(ms,
formattedNewDateTime);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum11"> 11:</span> ms.Seek(0,
0);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum12"> 12:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum13"> 13:</span> var
tempArray = ms.ToArray();</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum14"> 14:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum15"> 15:</span>
              <span style="color: #0000ff">byte</span>[]
byteArray = <span style="color: #0000ff">new</span><span style="color: #0000ff">byte</span>[20];</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum16"> 16:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum17"> 17:</span> var
x = 0;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum18"> 18:</span>
              <span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i
= 23; i &lt; (23 + 19); i++)</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum19"> 19:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum20"> 20:</span> byteArray[x]
= tempArray[i];</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum21"> 21:</span> x++;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum22"> 22:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum23"> 23:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum24"> 24:</span> SetNewDateTime(bitmap,
byteArray, 306);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum25"> 25:</span> SetNewDateTime(bitmap,
byteArray, 36867);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum26"> 26:</span> SetNewDateTime(bitmap,
byteArray, 36868);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum27"> 27:</span> }</pre>
            <!--CRLF-->
          </div>
        </div>
        <div> 
</div>
        <p>
Note, the previous code shows I’m writing the same date to three different property
settings (306, 36867, and 36868). They all had the same date value, so I figured the
best thing to do was keep them all in sync. 
</p>
        <p>
          <strong>It Works on My Machine</strong>
        </p>
        <p>
So, I was finally done with the code and I tested it with a bunch of files on my machine.
Worked great. I installed VS 2010 C# Express on my netbook so I could create a console
application and run it on my wife’s laptop. I had been abusing a ASP.Net Web Forms
application with Visual Web Developer Express on my netbook. I made a quick console
app, copied it to my wife’s laptop and ka-pow! It no worky. Puzzled, I tried to think
what was wrong for about 30 minutes. After a couple of assertions inserted into my
code, I realized she had some non-JPG files in the folder and my program wasn’t filtering
for only JPG files. Doh! I did manage to get in a quick “hey, it works on my machine”
comment to my wife, but she didn’t think it was as funny as I did.
</p>
        <p>
          <strong>Nothing But The Code, The Whole Code, So Help Me .Net Runtime?</strong>
        </p>
        <p>
Here’s the final class I built, in “good enough” format. The entire coding time, not
including the installation of VS 2010 Express on my netbook, or .Net 4 on my wife’s
laptop was about 90 minutes. The console program just takes this class, passes in
the source and destination directories, along with the number of minutes to adjust
the timestamp on the photo.
</p>
        <div id="codeSnippetWrapper">
          <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum1"> 1:</span>
              <span style="color: #0000ff">using</span> System;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum2"> 2:</span>
              <span style="color: #0000ff">using</span> System.Collections.Generic;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum3"> 3:</span>
              <span style="color: #0000ff">using</span> System.Linq;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum4"> 4:</span>
              <span style="color: #0000ff">using</span> System.Text;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum5"> 5:</span>
              <span style="color: #0000ff">using</span> System.IO;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum6"> 6:</span>
              <span style="color: #0000ff">using</span> System.Drawing;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum7"> 7:</span>
              <span style="color: #0000ff">using</span> System.Runtime.Serialization.Formatters.Binary;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum8"> 8:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum9"> 9:</span>
              <span style="color: #0000ff">namespace</span> ImageMetaTool</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum10"> 10:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum11"> 11:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">class</span> TimeEditorService</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum12"> 12:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum13"> 13:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">void</span> AdjustDateTime(<span style="color: #0000ff">string</span> soureDir, <span style="color: #0000ff">string</span> destDir, <span style="color: #0000ff">int</span> minutesToAdd)</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum14"> 14:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum15"> 15:</span>
              <span style="color: #0000ff">if</span> (!Directory.Exists(soureDir))</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum16"> 16:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum17"> 17:</span> Console.WriteLine(<span style="color: #006080">"Source
directory does not exist."</span>);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum18"> 18:</span>
              <span style="color: #0000ff">return</span>;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum19"> 19:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum20"> 20:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum21"> 21:</span>
              <span style="color: #0000ff">if</span> (!Directory.Exists(destDir))</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum22"> 22:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum23"> 23:</span> Console.WriteLine(<span style="color: #006080">"Destination
directory does not exist."</span>);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum24"> 24:</span>
              <span style="color: #0000ff">return</span>;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum25"> 25:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum26"> 26:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum27"> 27:</span>
              <span style="color: #0000ff">int</span> x
= 0;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum28"> 28:</span> var
list = Directory.GetFiles(soureDir, <span style="color: #006080">"*.jpg"</span>);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum29"> 29:</span>
              <span style="color: #0000ff">foreach</span> (var
filename <span style="color: #0000ff">in</span> list)</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum30"> 30:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum31"> 31:</span> Console.WriteLine(<span style="color: #006080">"Processing
image {0} of {1}; {2}"</span>, x, list.Length, filename);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum32"> 32:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum33"> 33:</span>
              <span style="color: #0000ff">using</span> (var
fs = File.OpenRead(filename))</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum34"> 34:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum35"> 35:</span> var
bitmap = <span style="color: #0000ff">new</span> Bitmap(fs);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum36"> 36:</span> ProcessFile(bitmap,
minutesToAdd);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum37"> 37:</span> bitmap.Save(Path.Combine(destDir,
Path.GetFileName(filename)));</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum38"> 38:</span> x++;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum39"> 39:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum40"> 40:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum41"> 41:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum42"> 42:</span> Console.WriteLine(<span style="color: #006080">"Processing
completed."</span>);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum43"> 43:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum44"> 44:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum45"> 45:</span>
              <span style="color: #0000ff">private</span>
              <span style="color: #0000ff">void</span> ProcessFile(Bitmap
bitmap, <span style="color: #0000ff">int</span> minutesToAdd)</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum46"> 46:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum47"> 47:</span>
              <span style="color: #0000ff">if</span> (!IsD60(bitmap))</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum48"> 48:</span>
              <span style="color: #0000ff">return</span>;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum49"> 49:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum50"> 50:</span> ChangeTimeStamp(bitmap,
minutesToAdd);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum51"> 51:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum52"> 52:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum53"> 53:</span>
              <span style="color: #0000ff">private</span>
              <span style="color: #0000ff">void</span> ChangeTimeStamp(Bitmap
bitmap, <span style="color: #0000ff">int</span> minutesToAdd)</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum54"> 54:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum55"> 55:</span> DateTime
originalDateTime = GetOriginalDateTime(bitmap);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum56"> 56:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum57"> 57:</span> var
newDateTime = originalDateTime.AddMinutes(minutesToAdd);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum58"> 58:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum59"> 59:</span> BinaryFormatter
bf = <span style="color: #0000ff">new</span> BinaryFormatter();</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum60"> 60:</span> MemoryStream
ms = <span style="color: #0000ff">new</span> MemoryStream();</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum61"> 61:</span>
              <span style="color: #0000ff">string</span> formattedNewDateTime
= newDateTime.ToString(<span style="color: #006080">"yyyy:MM:dd HH:mm:ss"</span>);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum62"> 62:</span> bf.Serialize(ms,
formattedNewDateTime);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum63"> 63:</span> ms.Seek(0,
0);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum64"> 64:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum65"> 65:</span> var
tempArray = ms.ToArray();</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum66"> 66:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum67"> 67:</span>
              <span style="color: #0000ff">byte</span>[]
byteArray = <span style="color: #0000ff">new</span><span style="color: #0000ff">byte</span>[20];</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum68"> 68:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum69"> 69:</span> var
x = 0;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum70"> 70:</span>
              <span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i
= 23; i &lt; (23 + 19); i++)</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum71"> 71:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum72"> 72:</span> byteArray[x]
= tempArray[i];</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum73"> 73:</span> x++;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum74"> 74:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum75"> 75:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum76"> 76:</span> SetNewDateTime(bitmap,
byteArray, 306);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum77"> 77:</span> SetNewDateTime(bitmap,
byteArray, 36867);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum78"> 78:</span> SetNewDateTime(bitmap,
byteArray, 36868);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum79"> 79:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum80"> 80:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum81"> 81:</span>
              <span style="color: #0000ff">private</span>
              <span style="color: #0000ff">void</span> SetNewDateTime(Bitmap
bitmap, <span style="color: #0000ff">byte</span>[] newDateTime, <span style="color: #0000ff">int</span> propertyNumber)</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum82"> 82:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum83"> 83:</span> var
property = bitmap.GetPropertyItem(propertyNumber);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum84"> 84:</span> property.Value
= newDateTime;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum85"> 85:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum86"> 86:</span> bitmap.SetPropertyItem(property);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum87"> 87:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum88"> 88:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum89"> 89:</span>
              <span style="color: #0000ff">private</span> DateTime
GetOriginalDateTime(Bitmap bitmap)</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum90"> 90:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum91"> 91:</span> var
property = bitmap.GetPropertyItem(306);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum92"> 92:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum93"> 93:</span> System.Text.ASCIIEncoding
encoding = <span style="color: #0000ff">new</span> System.Text.ASCIIEncoding();</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum94"> 94:</span>
              <span style="color: #0000ff">string</span>
              <span style="color: #0000ff">value</span> =
encoding.GetString(property.Value);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum95"> 95:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum96"> 96:</span>
              <span style="color: #0000ff">string</span> value2
= <span style="color: #0000ff">value</span>.Split(<span style="color: #006080">' '</span>)[0].Replace(<span style="color: #006080">":"</span>, <span style="color: #006080">"/"</span>)
+ <span style="color: #006080">" "</span> + <span style="color: #0000ff">value</span>.Split(<span style="color: #006080">'
'</span>)[1];</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum97"> 97:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum98"> 98:</span>
              <span style="color: #0000ff">return</span> DateTime.Parse(value2); <span style="color: #008000">//2010:08:14
14:23:14</span></pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum99"> 99:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum100"> 100:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum101"> 101:</span>
              <span style="color: #0000ff">private</span>
              <span style="color: #0000ff">bool</span> IsD60(Bitmap
bitmap)</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum102"> 102:</span> {</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum103"> 103:</span> var
modelProperty = bitmap.GetPropertyItem(272);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum104"> 104:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum105"> 105:</span> System.Text.ASCIIEncoding
encoding = <span style="color: #0000ff">new</span> System.Text.ASCIIEncoding();</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum106"> 106:</span>
              <span style="color: #0000ff">string</span> modelName
= encoding.GetString(modelProperty.Value);</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum107"> 107:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum108"> 108:</span>
              <span style="color: #0000ff">if</span> (modelName.Contains(<span style="color: #006080">"D60"</span>)) <span style="color: #008000">//
NIKON D60</span></pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum109"> 109:</span>
              <span style="color: #0000ff">return</span>
              <span style="color: #0000ff">true</span>;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum110"> 110:</span>  </pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum111"> 111:</span>
              <span style="color: #0000ff">return</span>
              <span style="color: #0000ff">false</span>;</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum112"> 112:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum113"> 113:</span> }</pre>
            <!--CRLF-->
            <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
              <span style="color: #606060" id="lnum114"> 114:</span> }</pre>
            <!--CRLF-->
          </div>
        </div>
        <p>
 
</p>
        <p>
I hope you have a good time futzing with your EXIF data!
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=3cc2c51a-a0e8-4c1e-9228-cc27ae6ffc7d" />
      </body>
      <title>How to Edit Meta Data Inside JPG Files with C#</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,3cc2c51a-a0e8-4c1e-9228-cc27ae6ffc7d.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2010/08/16/HowToEditMetaDataInsideJPGFilesWithC.aspx</link>
      <pubDate>Mon, 16 Aug 2010 18:36:13 GMT</pubDate>
      <description>&lt;p&gt;
&lt;img style="border-right-width: 0px; margin: 0px 0px 10px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="I do (change your EXIF data)" border="0" alt="I do (change your EXIF data)" align="right" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/HowToEditJPGMetaInfo_8ABD/ring_5.jpg" width="404" height="322"&gt;We
just got back from a great weekend at the beach; my sister-in-law got married on the
sands near Haystack Rock in Cannon Beach, OR. Really a great trip from start to finish. 
&lt;/p&gt;
&lt;p&gt;
My wife accepted the photographer duties and snapped nearly 2K photos with our Nikon
D40 and a Nikon D60 that we borrowed from a friend. She had a zoom lens on one and
a short lens on the other to avoid the need to change lenses in mid-moment. That part
worked great. 
&lt;/p&gt;
&lt;p&gt;
The part that we overlooked was the current date/time on each camera; they were not
synchronized. This will make sorting photos by time more difficult. No problem, I
say, on the drive back home. I’m a developer and JPG files have meta info that I can
manipulate, right? 
&lt;/p&gt;
&lt;p&gt;
It turns out that its not all that easy. Its actually a remarkable pain in the ass,
hence this blog post (that’s the remark-able part).
&lt;/p&gt;
&lt;p&gt;
I started with an online search and found &lt;a href="http://www.hanselman.com/blog/AccessingEXIFPhotoDataFromJPEGsWithPowerShell.aspx" target="_blank"&gt;Hanselman’s
post&lt;/a&gt; about combining PowerShell with Omar Shahine’s library, ImageLibrary.dll
that is evidently no longer accessible. Big phat 404 while trying to get that assembly.
&lt;/p&gt;
&lt;p&gt;
Next, I did some searches specific to StackOverflow.com and saw some posts about how
difficult reading/writing this meta data can be. At this point, I was beginning to
wonder if my wife was going to hear a broken promise or not. It wasn’t looking good.
&lt;/p&gt;
&lt;p&gt;
I found out that JPG files store meta data using EXIF, or Exchangeable Image File
Format, a standard used by the digital still camera industry. It looked like C# 4.0
could crack this open, but I might have to do get my hands dirty with some bit shuffling.
No worries, I was up for it. It didn’t look like there was a library out there that
was going to fall into my lap, so I cracked open Visual Studio 2010 and saw what kind
of trouble I could get into with Intellisense and a gin and tonic.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Let’s Take It Out for a Loop&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
I created a new project, loaded a Bitmap class with a sample JPG and iterated over
the properties:
&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt; 1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt; 2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Drawing;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt; 3:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt; 4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; ReadExifInJPG&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt; 5:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt; 6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Program&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt; 7:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt; 8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Main()&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt; 9:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt; 10:&lt;/span&gt; var
bitmap = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Bitmap(&lt;span style="color: #006080"&gt;"c:\\temp\\somephoto.jpg"&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt; 11:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt; 12:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var
item &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; bitmap.PropertyItems)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt; 13:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt; 14:&lt;/span&gt; Console.WriteLine(&lt;span style="color: #006080"&gt;"Id:
{0}, Type: {1}, Value: {2}"&lt;/span&gt;, &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt; 15:&lt;/span&gt; item.Id,
item.Type, item.Value);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt; 16:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt; 17:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt; 18:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt; 19:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
I had lots of properties in my sample photo:
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="output of simple iteration" border="0" alt="output of simple iteration" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/HowToEditJPGMetaInfo_8ABD/jpgexifoutput_1.png" width="421" height="927"&gt; 
&lt;/p&gt;
&lt;p&gt;
I was thinking that this was going to be smooth sailing until I saw the values listed
as byte arrays. Ugh. Then I read a EXIF specification that said the values can be
stored in multiple formats and there are a ton of properties. I had over fifty on
a single JPG image. I needed to find the property that told me if the given photo
was taken by a Nikon D60 or a D40, and then change the date on the D60 images. Here’s
the EXIF specifications: &lt;a href="http://www.exif.org/specifications.html"&gt;http://www.exif.org/specifications.html&lt;/a&gt;,
and what a great document to read! Ugh.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;I Just Want My Property&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
I found a list of property tags in numerical order on MSDN, note the id values are
listed in hex, so 0x0132 (hex) equals 306 (decimal): &lt;a href="http://msdn.microsoft.com/en-us/library/ms534418(VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/ms534418(VS.85).aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
When you go about reading or changing a given property, there are three parts to consider: 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
the id number that identifies the given property 
&lt;li&gt;
the type number which describes the data format 
&lt;li&gt;
the actual data, encoded in the least accessible format you could want&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Here’s a list of numeric types that identify the corresponding data format:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
A Byte 
&lt;li&gt;
An array of Byte objects encoded as ASCII 
&lt;li&gt;
A 16-bit integer 
&lt;li&gt;
A 32-bit integer 
&lt;li&gt;
An array of two Byte objects that represent a rational number 
&lt;li&gt;
Not used 
&lt;li&gt;
Undefined 
&lt;li&gt;
Not used 
&lt;li&gt;
SLong 
&lt;li&gt;
SRational&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Fortunately, everything I was interested in was of type 2, a byte array. This is a
great MSDN article that gave me a bunch of tips on how to manipulate the EXIF data: &lt;a href="http://msdn.microsoft.com/en-us/library/xddt0dz7.aspx"&gt;http://msdn.microsoft.com/en-us/library/xddt0dz7.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The property id of 306 holds the date of the photo, its a type 2 property, so the
value is stored in a byte array. Here’s how to read the string value:
&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt; 1:&lt;/span&gt; var
property = bitmap.GetPropertyItem(306);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt; 2:&lt;/span&gt; System.Text.ASCIIEncoding
encoding = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; System.Text.ASCIIEncoding();&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt; 3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; =
encoding.GetString(property.Value);&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;br&gt;
&lt;strong&gt;Caution, Byte Counting Ahead&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Note, the date properties that I’m interested in updating have values stored as byte
arrays. More specifically, they’re exactly 20 bytes long. At first I wasn’t respecting
that boundary and I just let .Net do it’s thing to convert my formatted date string
into a byte array. When I tried to read the value back, it was empty because I overflowed
the value. 
&lt;/p&gt;
&lt;p&gt;
After some noodling, I changed my code to write out exactly 20 bytes of data, starting
at precisely 23 bytes into my new byte array, as follows.
&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt; 1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; ChangeTimeStamp(Bitmap
bitmap, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; minutesToAdd)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt; 2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt; 3:&lt;/span&gt; DateTime
originalDateTime = GetOriginalDateTime(bitmap);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt; 4:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt; 5:&lt;/span&gt; var
newDateTime = originalDateTime.AddMinutes(minutesToAdd);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt; 6:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt; 7:&lt;/span&gt; BinaryFormatter
bf = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; BinaryFormatter();&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt; 8:&lt;/span&gt; MemoryStream
ms = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MemoryStream();&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt; 9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; formattedNewDateTime
= newDateTime.ToString(&lt;span style="color: #006080"&gt;"yyyy:MM:dd HH:mm:ss"&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt; 10:&lt;/span&gt; bf.Serialize(ms,
formattedNewDateTime);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt; 11:&lt;/span&gt; ms.Seek(0,
0);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt; 12:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt; 13:&lt;/span&gt; var
tempArray = ms.ToArray();&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt; 14:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt; 15:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[]
byteArray = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[20];&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt; 16:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt; 17:&lt;/span&gt; var
x = 0;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt; 18:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; i
= 23; i &amp;lt; (23 + 19); i++)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt; 19:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt; 20:&lt;/span&gt; byteArray[x]
= tempArray[i];&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt; 21:&lt;/span&gt; x++;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt; 22:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt; 23:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt; 24:&lt;/span&gt; SetNewDateTime(bitmap,
byteArray, 306);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt; 25:&lt;/span&gt; SetNewDateTime(bitmap,
byteArray, 36867);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt; 26:&lt;/span&gt; SetNewDateTime(bitmap,
byteArray, 36868);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt; 27:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;p&gt;
Note, the previous code shows I’m writing the same date to three different property
settings (306, 36867, and 36868). They all had the same date value, so I figured the
best thing to do was keep them all in sync. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;It Works on My Machine&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
So, I was finally done with the code and I tested it with a bunch of files on my machine.
Worked great. I installed VS 2010 C# Express on my netbook so I could create a console
application and run it on my wife’s laptop. I had been abusing a ASP.Net Web Forms
application with Visual Web Developer Express on my netbook. I made a quick console
app, copied it to my wife’s laptop and ka-pow! It no worky. Puzzled, I tried to think
what was wrong for about 30 minutes. After a couple of assertions inserted into my
code, I realized she had some non-JPG files in the folder and my program wasn’t filtering
for only JPG files. Doh! I did manage to get in a quick “hey, it works on my machine”
comment to my wife, but she didn’t think it was as funny as I did.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Nothing But The Code, The Whole Code, So Help Me .Net Runtime?&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Here’s the final class I built, in “good enough” format. The entire coding time, not
including the installation of VS 2010 Express on my netbook, or .Net 4 on my wife’s
laptop was about 90 minutes. The console program just takes this class, passes in
the source and destination directories, along with the number of minutes to adjust
the timestamp on the photo.
&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt; 1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt; 2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt; 3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt; 4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt; 5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.IO;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt; 6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Drawing;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt; 7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Runtime.Serialization.Formatters.Binary;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt; 8:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt; 9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; ImageMetaTool&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt; 10:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt; 11:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; TimeEditorService&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt; 12:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt; 13:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; AdjustDateTime(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; soureDir, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; destDir, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; minutesToAdd)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt; 14:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt; 15:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!Directory.Exists(soureDir))&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt; 16:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt; 17:&lt;/span&gt; Console.WriteLine(&lt;span style="color: #006080"&gt;"Source
directory does not exist."&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt; 18:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt; 19:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt; 20:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt; 21:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!Directory.Exists(destDir))&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt; 22:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt; 23:&lt;/span&gt; Console.WriteLine(&lt;span style="color: #006080"&gt;"Destination
directory does not exist."&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt; 24:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt; 25:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt; 26:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt; 27:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; x
= 0;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt; 28:&lt;/span&gt; var
list = Directory.GetFiles(soureDir, &lt;span style="color: #006080"&gt;"*.jpg"&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum29"&gt; 29:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var
filename &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; list)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum30"&gt; 30:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum31"&gt; 31:&lt;/span&gt; Console.WriteLine(&lt;span style="color: #006080"&gt;"Processing
image {0} of {1}; {2}"&lt;/span&gt;, x, list.Length, filename);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum32"&gt; 32:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum33"&gt; 33:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var
fs = File.OpenRead(filename))&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum34"&gt; 34:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum35"&gt; 35:&lt;/span&gt; var
bitmap = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Bitmap(fs);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum36"&gt; 36:&lt;/span&gt; ProcessFile(bitmap,
minutesToAdd);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum37"&gt; 37:&lt;/span&gt; bitmap.Save(Path.Combine(destDir,
Path.GetFileName(filename)));&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum38"&gt; 38:&lt;/span&gt; x++;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum39"&gt; 39:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum40"&gt; 40:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum41"&gt; 41:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum42"&gt; 42:&lt;/span&gt; Console.WriteLine(&lt;span style="color: #006080"&gt;"Processing
completed."&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum43"&gt; 43:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum44"&gt; 44:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum45"&gt; 45:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; ProcessFile(Bitmap
bitmap, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; minutesToAdd)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum46"&gt; 46:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum47"&gt; 47:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!IsD60(bitmap))&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum48"&gt; 48:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum49"&gt; 49:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum50"&gt; 50:&lt;/span&gt; ChangeTimeStamp(bitmap,
minutesToAdd);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum51"&gt; 51:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum52"&gt; 52:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum53"&gt; 53:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; ChangeTimeStamp(Bitmap
bitmap, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; minutesToAdd)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum54"&gt; 54:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum55"&gt; 55:&lt;/span&gt; DateTime
originalDateTime = GetOriginalDateTime(bitmap);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum56"&gt; 56:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum57"&gt; 57:&lt;/span&gt; var
newDateTime = originalDateTime.AddMinutes(minutesToAdd);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum58"&gt; 58:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum59"&gt; 59:&lt;/span&gt; BinaryFormatter
bf = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; BinaryFormatter();&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum60"&gt; 60:&lt;/span&gt; MemoryStream
ms = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MemoryStream();&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum61"&gt; 61:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; formattedNewDateTime
= newDateTime.ToString(&lt;span style="color: #006080"&gt;"yyyy:MM:dd HH:mm:ss"&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum62"&gt; 62:&lt;/span&gt; bf.Serialize(ms,
formattedNewDateTime);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum63"&gt; 63:&lt;/span&gt; ms.Seek(0,
0);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum64"&gt; 64:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum65"&gt; 65:&lt;/span&gt; var
tempArray = ms.ToArray();&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum66"&gt; 66:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum67"&gt; 67:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[]
byteArray = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[20];&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum68"&gt; 68:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum69"&gt; 69:&lt;/span&gt; var
x = 0;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum70"&gt; 70:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; i
= 23; i &amp;lt; (23 + 19); i++)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum71"&gt; 71:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum72"&gt; 72:&lt;/span&gt; byteArray[x]
= tempArray[i];&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum73"&gt; 73:&lt;/span&gt; x++;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum74"&gt; 74:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum75"&gt; 75:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum76"&gt; 76:&lt;/span&gt; SetNewDateTime(bitmap,
byteArray, 306);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum77"&gt; 77:&lt;/span&gt; SetNewDateTime(bitmap,
byteArray, 36867);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum78"&gt; 78:&lt;/span&gt; SetNewDateTime(bitmap,
byteArray, 36868);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum79"&gt; 79:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum80"&gt; 80:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum81"&gt; 81:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SetNewDateTime(Bitmap
bitmap, &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] newDateTime, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; propertyNumber)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum82"&gt; 82:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum83"&gt; 83:&lt;/span&gt; var
property = bitmap.GetPropertyItem(propertyNumber);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum84"&gt; 84:&lt;/span&gt; property.Value
= newDateTime;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum85"&gt; 85:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum86"&gt; 86:&lt;/span&gt; bitmap.SetPropertyItem(property);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum87"&gt; 87:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum88"&gt; 88:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum89"&gt; 89:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; DateTime
GetOriginalDateTime(Bitmap bitmap)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum90"&gt; 90:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum91"&gt; 91:&lt;/span&gt; var
property = bitmap.GetPropertyItem(306);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum92"&gt; 92:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum93"&gt; 93:&lt;/span&gt; System.Text.ASCIIEncoding
encoding = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; System.Text.ASCIIEncoding();&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum94"&gt; 94:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; =
encoding.GetString(property.Value);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum95"&gt; 95:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum96"&gt; 96:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; value2
= &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;.Split(&lt;span style="color: #006080"&gt;' '&lt;/span&gt;)[0].Replace(&lt;span style="color: #006080"&gt;":"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"/"&lt;/span&gt;)
+ &lt;span style="color: #006080"&gt;" "&lt;/span&gt; + &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;.Split(&lt;span style="color: #006080"&gt;'
'&lt;/span&gt;)[1];&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum97"&gt; 97:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum98"&gt; 98:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; DateTime.Parse(value2); &lt;span style="color: #008000"&gt;//2010:08:14
14:23:14&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum99"&gt; 99:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum100"&gt; 100:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum101"&gt; 101:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; IsD60(Bitmap
bitmap)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum102"&gt; 102:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum103"&gt; 103:&lt;/span&gt; var
modelProperty = bitmap.GetPropertyItem(272);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum104"&gt; 104:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum105"&gt; 105:&lt;/span&gt; System.Text.ASCIIEncoding
encoding = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; System.Text.ASCIIEncoding();&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum106"&gt; 106:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; modelName
= encoding.GetString(modelProperty.Value);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum107"&gt; 107:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum108"&gt; 108:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (modelName.Contains(&lt;span style="color: #006080"&gt;"D60"&lt;/span&gt;)) &lt;span style="color: #008000"&gt;//
NIKON D60&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum109"&gt; 109:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum110"&gt; 110:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum111"&gt; 111:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum112"&gt; 112:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum113"&gt; 113:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum114"&gt; 114:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
I hope you have a good time futzing with your EXIF data!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=3cc2c51a-a0e8-4c1e-9228-cc27ae6ffc7d" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,3cc2c51a-a0e8-4c1e-9228-cc27ae6ffc7d.aspx</comments>
      <category>fun</category>
      <category>software</category>
      <category>utilities</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=0da8418b-fa06-4646-95e4-539ca754d570</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,0da8418b-fa06-4646-95e4-539ca754d570.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,0da8418b-fa06-4646-95e4-539ca754d570.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=0da8418b-fa06-4646-95e4-539ca754d570</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Behind the scenes, I see a lot of companies run on Excel and duct tape. So it's common
for clients to hand me a slab of data organized into neat little rows and columns.
Excel is just a handy way to throw some data over the wall and get things done. This
might be a list of dealers, a collection of user profiles, product information, or
anything that just needs to get somewhere else.
</p>
        <p>
Depending on the scenario, I'll might massage this data and slide it into a SQL Server
database or an XML file. I'm a web developer so I use the ADO.Net stack on a regular
basis. If I were a Windows client developer, I might prefer to solve this problem
with the Excel object model, but that really looks like more code to me, so here's
how I like to roll:
</p>
        <p>
The following code block accepts an Excel file path and returns an ordinary DataTable
object, which can be manipulated easily by the code that calls this method. The first
row of the Excel document becomes the columns in the DataTable object and each row
thereafter are DataRow objects.
</p>
        <p>
          <a href="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/ImportingDataFromExcelwithC_7CBC/ImportDataFromExcel_2.png">
            <img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="148" alt="ImportDataFromExcel" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/ImportingDataFromExcelwithC_7CBC/ImportDataFromExcel_thumb.png" width="244" border="0" />
          </a>
          <br />
(Click to enlarge)
</p>
        <p>
If you like, <a href="http://support.microsoft.com/kb/306023">take a look at both
techniques for working with Excel data</a> and see what one speaks to you. With this
block of code, I can happily accept large chunks of data from a client without spending
precious time fiddling with administrivia.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=0da8418b-fa06-4646-95e4-539ca754d570" />
      </body>
      <title>Importing Data From Excel In C#</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,0da8418b-fa06-4646-95e4-539ca754d570.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2008/07/31/ImportingDataFromExcelInC.aspx</link>
      <pubDate>Thu, 31 Jul 2008 16:00:16 GMT</pubDate>
      <description>&lt;p&gt;
Behind the scenes, I see a lot of companies run on Excel and duct tape. So it's common
for clients to hand me a slab of data organized into neat little rows and columns.
Excel is just a handy way to throw some data over the wall and get things done. This
might be a list of dealers, a collection of user profiles, product information, or
anything that just needs to get somewhere else.
&lt;/p&gt;
&lt;p&gt;
Depending on the scenario, I'll might massage this data and slide it into a SQL Server
database or an XML file. I'm a web developer so I use the ADO.Net stack on a regular
basis. If I were a Windows client developer, I might prefer to solve this problem
with the Excel object model, but that really looks like more code to me, so here's
how I like to roll:
&lt;/p&gt;
&lt;p&gt;
The following code block accepts an Excel file path and returns an ordinary DataTable
object, which can be manipulated easily by the code that calls this method. The first
row of the Excel document becomes the columns in the DataTable object and each row
thereafter are DataRow objects.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/ImportingDataFromExcelwithC_7CBC/ImportDataFromExcel_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="148" alt="ImportDataFromExcel" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/ImportingDataFromExcelwithC_7CBC/ImportDataFromExcel_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; 
&lt;br /&gt;
(Click to enlarge)
&lt;/p&gt;
&lt;p&gt;
If you like, &lt;a href="http://support.microsoft.com/kb/306023"&gt;take a look at both
techniques for working with Excel data&lt;/a&gt; and see what one speaks to you. With this
block of code, I can happily accept large chunks of data from a client without spending
precious time fiddling with administrivia.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=0da8418b-fa06-4646-95e4-539ca754d570" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,0da8418b-fa06-4646-95e4-539ca754d570.aspx</comments>
      <category>asp.net</category>
      <category>software</category>
      <category>SQL Server</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=6beae0a2-1c63-485a-9cf7-214866e9a0e1</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,6beae0a2-1c63-485a-9cf7-214866e9a0e1.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,6beae0a2-1c63-485a-9cf7-214866e9a0e1.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=6beae0a2-1c63-485a-9cf7-214866e9a0e1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
...or two.
</p>
        <p>
I've had two projects this week where their/my bacon was saved by the branching strategy
used for the source code repository. In my line of work, I touch a wide variety of
projects. Some are still shiny new and others were written years ago; they're all
in a source control repository.
</p>
        <p>
Modern source control repositories (and by modern, I mean things that are not your
file server or P:\ drive) let you create a branch. Branching might appear complex
at first, but it's really pretty simple - at least conceptually. Here's a little story
to illustrate the point of branches.
</p>
        <blockquote>
          <p>
When I create a branch, I have a snapshot of the code at a particular point in time.
So, imagine that on Monday, I have a single branch called the "trunk". It
contains all of the code for my web site. On Tuesday, I created a branch based on
the code in the trunk. I named my branch "BR-1". When I created BR-1, it
was a mirror image of the trunk. I edited the code in BR-1 for a couple of days and
nearly got it how I wanted it. My edits were isolated to BR-1 and they did not exist
in the trunk.
</p>
          <p>
I got a call early on Friday morning about an important change that needed to go out
right away. I couldn't implement the urgent change to BR-1 because it contained my
partially completed work. It was a pretty small change; a few hours of brilliant coding
and I would be ready for a peer review of my changes. So, I checked out the trunk
and made the edit right there and checked it back in. I published the urgent change
I made on the trunk out to the live web site in the early afternoon and went back
to working on BR-1.
</p>
          <p>
By mid-day on the following Monday, I had finished all of my changes to the BR-1 branch.
I had merged the BR-1 code into the trunk too. Now my trunk code contained the changes
from BR-1 as well as that urgent change that came through on Friday morning. Complete
control with the flick of a switch.
</p>
        </blockquote>
        <p>
In the previous story, I was able to handle the urgent request efficiently because
I used branching to manage my code changes. If I didn't have branching available as
a software development tool, I would have some bad choices to make. Either I merge
the urgent fix with my own enhancements and risk problems by rushing it, or force
the urgent change to wait until my own changes were done; neither are necessary.
</p>
        <p>
Branching is great way to ensure that I can always put my work on the shelf in lieu
of more pressing matters. Understanding the concepts of branching is essential to
being a valuable member of the team. The keys you actually press to make a branch
or merge two branches can be left up to the nerdy folk. For more info, check out <a href="http://www.amazon.com/Pragmatic-Version-Control-Using-Subversion/dp/0974514063" target="_blank">Pragmatic
Version Control Using Subversion</a>.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=6beae0a2-1c63-485a-9cf7-214866e9a0e1" />
      </body>
      <title>Its only Monday, and I'm Already Out on a Branch</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,6beae0a2-1c63-485a-9cf7-214866e9a0e1.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2008/02/05/ItsOnlyMondayAndImAlreadyOutOnABranch.aspx</link>
      <pubDate>Tue, 05 Feb 2008 06:28:37 GMT</pubDate>
      <description>&lt;p&gt;
...or two.
&lt;/p&gt;
&lt;p&gt;
I've had two projects this week where their/my bacon was saved by the branching strategy
used for the source code repository. In my line of work, I touch a wide variety of
projects. Some are still shiny new and others were written years ago; they're all
in a source control repository.
&lt;/p&gt;
&lt;p&gt;
Modern source control repositories (and by modern, I mean things that are not your
file server or P:\ drive) let you create a branch. Branching might appear complex
at first, but it's really pretty simple - at least conceptually. Here's a little story
to illustrate the point of branches.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
When I create a branch, I have a snapshot of the code at a particular point in time.
So, imagine that on Monday, I have a single branch called the &amp;quot;trunk&amp;quot;. It
contains all of the code for my web site. On Tuesday, I created a branch based on
the code in the trunk. I named my branch &amp;quot;BR-1&amp;quot;. When I created BR-1, it
was a mirror image of the trunk. I edited the code in BR-1 for a couple of days and
nearly got it how I wanted it. My edits were isolated to BR-1 and they did not exist
in the trunk.
&lt;/p&gt;
&lt;p&gt;
I got a call early on Friday morning about an important change that needed to go out
right away. I couldn't implement the urgent change to BR-1 because it contained my
partially completed work. It was a pretty small change; a few hours of brilliant coding
and I would be ready for a peer review of my changes. So, I checked out the trunk
and made the edit right there and checked it back in. I published the urgent change
I made on the trunk out to the live web site in the early afternoon and went back
to working on BR-1.
&lt;/p&gt;
&lt;p&gt;
By mid-day on the following Monday, I had finished all of my changes to the BR-1 branch.
I had merged the BR-1 code into the trunk too. Now my trunk code contained the changes
from BR-1 as well as that urgent change that came through on Friday morning. Complete
control with the flick of a switch.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
In the previous story, I was able to handle the urgent request efficiently because
I used branching to manage my code changes. If I didn't have branching available as
a software development tool, I would have some bad choices to make. Either I merge
the urgent fix with my own enhancements and risk problems by rushing it, or force
the urgent change to wait until my own changes were done; neither are necessary.
&lt;/p&gt;
&lt;p&gt;
Branching is great way to ensure that I can always put my work on the shelf in lieu
of more pressing matters. Understanding the concepts of branching is essential to
being a valuable member of the team. The keys you actually press to make a branch
or merge two branches can be left up to the nerdy folk. For more info, check out &lt;a href="http://www.amazon.com/Pragmatic-Version-Control-Using-Subversion/dp/0974514063" target="_blank"&gt;Pragmatic
Version Control Using Subversion&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=6beae0a2-1c63-485a-9cf7-214866e9a0e1" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,6beae0a2-1c63-485a-9cf7-214866e9a0e1.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=3af28ba0-d42d-4dbf-a26d-22f848fcd93f</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,3af28ba0-d42d-4dbf-a26d-22f848fcd93f.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,3af28ba0-d42d-4dbf-a26d-22f848fcd93f.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=3af28ba0-d42d-4dbf-a26d-22f848fcd93f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In my experiences as a software developer, its fairly normal to hear comments like
the following:
</p>
        <ul>
          <li>
That's too many hours 
</li>
          <li>
They don't have the budget 
</li>
          <li>
I'm not paid enough 
</li>
        </ul>
        <p>
I had the good fortune of attending a <a href="http://c2.com/cgi/wiki?PortlandXpUsersGroup" target="_blank">Portland
XP Users Group</a> presentation a few weeks ago by James Shore. He got off on a slight
tangent and gave us (well, at least me) a simple equation to chew on:
</p>
        <p align="center">
          <a href="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/ThinkingaboutROI_FFC9/roi_2.png">
            <img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="133" alt="roi" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/ThinkingaboutROI_FFC9/roi_thumb.png" width="240" border="0" />
          </a>
        </p>
        <p>
He explained that at its core, Return On Investment is represented by the previous
equation. It can help explain quite a bit about the world. This was in response to
someone asking about the high cost of the software development methodology under discussion
that night.
</p>
        <p>
If you're presented with a scenario where the value is constant, then the only way
to play the game is to minimize costs. Think of a job that never changes. If it always
provides the same value to a business, management will seek ways to reduce cost in
order to improve the ROI equation.
</p>
        <p>
On the other hand, a scenario where value has the capability for growth is much more
interesting. If you wanted to make $500,000 a year then you would be challenged to
deliver some multiple of that cost as a value to the business. 
</p>
        <p>
Here's my favorite take-away: At some point along the graph, as value increases then
cost becomes insignificant. This is the place to be.
</p>
        <p>
The initial cost of software can make some people squeamish. I'm certainly not one
to be afraid of zeros; I'm much more interested in the value.
</p>
        <ul>
          <li>
What is this solution doing for the business? 
</li>
          <li>
Is there a practice in place for tracking ROI over time? 
</li>
          <li>
How soon can it begin providing value? 
</li>
          <li>
Can it provide even more value? 
</li>
          <li>
It is possible to reduce cost and drive the equation even higher? 
</li>
        </ul>
        <p>
This is why I love my job at Pop Art. Driving value higher and then swooping back
to cut costs with new technology that makes me more productive. Value will often come
in several forms including cash value, brand value and community value. In any case,
it all starts with that equation.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=3af28ba0-d42d-4dbf-a26d-22f848fcd93f" />
      </body>
      <title>Thinking about ROI</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,3af28ba0-d42d-4dbf-a26d-22f848fcd93f.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2007/11/11/ThinkingAboutROI.aspx</link>
      <pubDate>Sun, 11 Nov 2007 02:11:25 GMT</pubDate>
      <description>&lt;p&gt;
In my experiences as a software developer, its fairly normal to hear comments like
the following:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
That's too many hours 
&lt;/li&gt;
&lt;li&gt;
They don't have the budget 
&lt;/li&gt;
&lt;li&gt;
I'm not paid enough 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I had the good fortune of attending a &lt;a href="http://c2.com/cgi/wiki?PortlandXpUsersGroup" target="_blank"&gt;Portland
XP Users Group&lt;/a&gt; presentation a few weeks ago by James Shore. He got off on a slight
tangent and gave us (well, at least me) a simple equation to chew on:
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;a href="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/ThinkingaboutROI_FFC9/roi_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="133" alt="roi" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/ThinkingaboutROI_FFC9/roi_thumb.png" width="240" border="0" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
He explained that at its core, Return On Investment is represented by the previous
equation. It can help explain quite a bit about the world. This was in response to
someone asking about the high cost of the software development methodology under discussion
that night.
&lt;/p&gt;
&lt;p&gt;
If you're presented with a scenario where the value is constant, then the only way
to play the game is to minimize costs. Think of a job that never changes. If it always
provides the same value to a business, management will seek ways to reduce cost in
order to improve the ROI equation.
&lt;/p&gt;
&lt;p&gt;
On the other hand, a scenario where value has the capability for growth is much more
interesting. If you wanted to make $500,000 a year then you would be challenged to
deliver some multiple of that cost as a value to the business. 
&lt;/p&gt;
&lt;p&gt;
Here's my favorite take-away: At some point along the graph, as value increases then
cost becomes insignificant. This is the place to be.
&lt;/p&gt;
&lt;p&gt;
The initial cost of software can make some people squeamish. I'm certainly not one
to be afraid of zeros; I'm much more interested in the value.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
What is this solution doing for the business? 
&lt;/li&gt;
&lt;li&gt;
Is there a practice in place for tracking ROI over time? 
&lt;/li&gt;
&lt;li&gt;
How soon can it begin providing value? 
&lt;/li&gt;
&lt;li&gt;
Can it provide even more value? 
&lt;/li&gt;
&lt;li&gt;
It is possible to reduce cost and drive the equation even higher? 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
This is why I love my job at Pop Art. Driving value higher and then swooping back
to cut costs with new technology that makes me more productive. Value will often come
in several forms including cash value, brand value and community value. In any case,
it all starts with that equation.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=3af28ba0-d42d-4dbf-a26d-22f848fcd93f" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,3af28ba0-d42d-4dbf-a26d-22f848fcd93f.aspx</comments>
      <category>events</category>
      <category>observations</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=6e4a1627-605a-4720-a69d-eeaf09e44949</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,6e4a1627-605a-4720-a69d-eeaf09e44949.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,6e4a1627-605a-4720-a69d-eeaf09e44949.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=6e4a1627-605a-4720-a69d-eeaf09e44949</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h3>
        </h3>
        <p>
By some cruel trick of nature, I've been surrounded by web content management systems
for the past several years. I've written several (who hasn't?) and stood up instances
of DotNetNuke, Windows SharePoint 2007, and now <a href="http://www.interwoven.com/components/page.jsp?topic=PRODUCT::TEAMSITE&amp;dcr=templatedata/profile/main/data/dcr-wcm-teamsite.xml" target="_blank">Interwoven
TeamSite</a>.
</p>
        <p>
I'm told Interwoven has been around for 14 years and they're currently on version
6.7.1 of their TeamSite product. This offering includes features for enterprise content
management (ECM) and the assorted adjacent technologies that simply must accompany
ECM in a large scale deployment. Since the beginning, their product has included version
control and workflow features. I'll describe a few core parts of Interwoven TeamSite
here.
</p>
        <h4>Source Control Repository
</h4>
        <p>
First off, developers will get a quick leg up if they simply know that TeamSite includes
a source control repository. It works like any other. You can get the latest source,
edit something, check it back in, compare versions, label a snapshot of the repository
as well as branching. There. You're farther ahead than I was when I got my first explanation,
about two years ago.
</p>
        <p>
Standards based developers can relish in the fact that they have carte blanche control
over the HTML and CSS sent down the wire to the browser. I'm talking about the production
site here, not the administration pages used to interact with TeamSite. Nearly everything
you'll do with TeamSite is done through a browser, providing that browser is IE or
Firefox. Sorry Safari, this car is just a two seater. Again, browser support for the
production site you're building is up to you - just talking about the TeamSite administration
pages here. You'll continue editing specific files in your favorite tool, such as
Visual Studio, Photoshop or TextMate. So once you get the subtle nuances of this source
control system in you're brain, the challenge is to build a compelling web site using
the same tools you have now; no silver bullets here.
</p>
        <p>
Its also worth noting that this is only a source control repository; not a web development
platform. You'll still need IIS, Apache, or some other web server technology to host
your site. Interwoven TeamSite is mature enough that it supports Windows, Unix and
Linux environments and several popular databases such as SQL Server and Oracle; just
what you'd expect from an enterprise content management system.
</p>
        <h4>FormsPublisher
</h4>
        <p>
Interwoven's TeamSite product includes a feature called FormsPublisher. This is useful
for scenarios where an information worker needs to contribute to the web site, but
lack HTML and CSS skills. This type of user can complete a form, let the system validate
it, and then press a button to have the system generate the equivalent HTML page.
The form can include validation, business logic, database queries or anything else
you can dream up. While an HTML expert would prefer their favorite text editor and
complete control to the HTML page. An information worker without HTML skills can now
edit an existing page, based on an customized form. Now the challenge shifts to having
the information worker select the appropriate form to build the page.
</p>
        <p>
A developer configures a set of files and folders to support this process. At a high
level, there are three parts in motion. The Data Capture Template (DCT) is an XML
file that describes how TeamSite should present the form to the information worker.
A Data Content Record (DCR) is an XML file that contains an instance of a form completed
by an information worker. You launch TeamSite, click File, New Form Entry and select
the form you want to complete. Next, the given form appears in the browser. The fields
of the form are defined by the DCT. After you click the Save button, the field values
are serialized into a DCR file. These files are organized in a collection of folders
on the TeamSite server; one folder per form. Each folder has a conventional set of
child folders to hold the DCR files as well as the presentation template file(s),
These are the files with the .tpl file extension.
</p>
        <p>
A presentation template converts a DCR into something else. Most of the time, at least
for me, that something else will be an HTML page. Imagine a single DCR file that contains
both public and private information for a company; perhaps the DCR contains public
information about a single product as well as private information for their tech support
staff. The DCR file can be send around via workflow for approval and the finally be
ran through both sets of presentation templates which results in two different HTML
files - one file is deployed to the public and the other file is kept on the Intranet.
Both files are assured of having the appropriate content via the approval process
and the presentation templates apply the correct branding and layout. This model supports
a good workflow model as well as good separation of design from content. Its just
one example of using the FormsPublisher in the enterprise.
</p>
        <p>
Since DCR files are just XML, it's relatively painless to import legacy data into
TeamSite. These imported XML files map to a given DCT, then they're translated into
HTML pages via a presentation template. For example, if you have the last 15 years
of press releases on the legacy system, you can import the existing information with
some batch processes and stand up a new TeamSite server pretty quick.
</p>
        <h4>Workflow
</h4>
        <p>
A workflow describes an automated business process. It can instruct an author to perform
an edit or add a new file to the site and manage the process of approvals, taking
a snapshot of the system for archival purposes and finally deployment. When a task
such as "Edit Content" or "Review Content" becomes active, an
e-mail can notify the appropriate party. When the work is completed, the assigned
person just pushes it through the hole. Reviewers can click "Accept" or
"Reject" after previewing the changes, they don't need to know the next
appropriate step in the process - its automated. The system tracks the state and flow
of information of the activities throughout the lifecycle according to the established
business rules approved by the given company rather than based on how the given employee
feels that particular day.
</p>
        <p>
TeamSite has always included a workflow mechanism, but I can only imagine how difficult
it was to develop them in the past. This latest version includes a Windows client
application that supports drag-and-drop editing of workflow designs. You can work
locally with workflows saved to your desktop in an offline mode, but you will eventually
need to save the workflow up to the TeamSite server via commands in the tool. Workflows
are serialized into XML files in the background, but its rare to look at the raw information.
The workflow designer application helps you do the things you would expect such as
setting up a series of tasks linked by arrows; some might be conditional based on
human interaction or automated entirely by Perl scripts, Java classes or some other
business logic.
</p>
        <p>
Its interesting that Interwoven prides itself on a large number of supported platforms
for the server product, but the Workflow designer client requires the Windows operating
system. As I understand it, some (or all) of the workflow client application was recently
purchased from another company. My hunch is the client application is written in C++
based on the look and feel as well as the OS requirement. Its a little clunky but
it gets the job done; I sure wouldn't want to hand code all of the XML it generates.
</p>
        <h4>Conclusion
</h4>
        <p>
Overall, I'm happy with my experiences thus far with TeamSite. The documentation is
rich, it has a thriving online developer community, and the paradigm isn't too hard
to grasp. At one point, I started getting bogged down with the massive about of XML
configuration files and customization points. After sleeping on it (and a stiff cup-o-coffee)
I realized that any other enterprise level application has a similar amount of customization.
Since TeamSite embraces a litany of platforms, it makes sense that they don't (or
haven't) invested a lot in slick little Windows GUI programs for configuration needs.
Why build a server GUI tools when Windows is only one of your supported OS platforms?
On the other hand, they could build a few more web based administration forms to get
around some of these XML file updates. Once I started tallying up how many configuration
pages I go through for Windows SharePoint, I stopped feeling like I was building my
own box and installing Linux and started thinking about the broader ideas and why
I was configuring the system instead of how - perhaps it just semantics, but I felt
better.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=6e4a1627-605a-4720-a69d-eeaf09e44949" />
      </body>
      <title>Interwoven TeamSite 6.7.1</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,6e4a1627-605a-4720-a69d-eeaf09e44949.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2007/11/05/InterwovenTeamSite671.aspx</link>
      <pubDate>Mon, 05 Nov 2007 18:29:32 GMT</pubDate>
      <description>&lt;h3&gt;
&lt;/h3&gt;
&lt;p&gt;
By some cruel trick of nature, I've been surrounded by web content management systems
for the past several years. I've written several (who hasn't?) and stood up instances
of DotNetNuke, Windows SharePoint 2007, and now &lt;a href="http://www.interwoven.com/components/page.jsp?topic=PRODUCT::TEAMSITE&amp;amp;dcr=templatedata/profile/main/data/dcr-wcm-teamsite.xml" target="_blank"&gt;Interwoven
TeamSite&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I'm told Interwoven has been around for 14 years and they're currently on version
6.7.1 of their TeamSite product. This offering includes features for enterprise content
management (ECM) and the assorted adjacent technologies that simply must accompany
ECM in a large scale deployment. Since the beginning, their product has included version
control and workflow features. I'll describe a few core parts of Interwoven TeamSite
here.
&lt;/p&gt;
&lt;h4&gt;Source Control Repository
&lt;/h4&gt;
&lt;p&gt;
First off, developers will get a quick leg up if they simply know that TeamSite includes
a source control repository. It works like any other. You can get the latest source,
edit something, check it back in, compare versions, label a snapshot of the repository
as well as branching. There. You're farther ahead than I was when I got my first explanation,
about two years ago.
&lt;/p&gt;
&lt;p&gt;
Standards based developers can relish in the fact that they have carte blanche control
over the HTML and CSS sent down the wire to the browser. I'm talking about the production
site here, not the administration pages used to interact with TeamSite. Nearly everything
you'll do with TeamSite is done through a browser, providing that browser is IE or
Firefox. Sorry Safari, this car is just a two seater. Again, browser support for the
production site you're building is up to you - just talking about the TeamSite administration
pages here. You'll continue editing specific files in your favorite tool, such as
Visual Studio, Photoshop or TextMate. So once you get the subtle nuances of this source
control system in you're brain, the challenge is to build a compelling web site using
the same tools you have now; no silver bullets here.
&lt;/p&gt;
&lt;p&gt;
Its also worth noting that this is only a source control repository; not a web development
platform. You'll still need IIS, Apache, or some other web server technology to host
your site. Interwoven TeamSite is mature enough that it supports Windows, Unix and
Linux environments and several popular databases such as SQL Server and Oracle; just
what you'd expect from an enterprise content management system.
&lt;/p&gt;
&lt;h4&gt;FormsPublisher
&lt;/h4&gt;
&lt;p&gt;
Interwoven's TeamSite product includes a feature called FormsPublisher. This is useful
for scenarios where an information worker needs to contribute to the web site, but
lack HTML and CSS skills. This type of user can complete a form, let the system validate
it, and then press a button to have the system generate the equivalent HTML page.
The form can include validation, business logic, database queries or anything else
you can dream up. While an HTML expert would prefer their favorite text editor and
complete control to the HTML page. An information worker without HTML skills can now
edit an existing page, based on an customized form. Now the challenge shifts to having
the information worker select the appropriate form to build the page.
&lt;/p&gt;
&lt;p&gt;
A developer configures a set of files and folders to support this process. At a high
level, there are three parts in motion. The Data Capture Template (DCT) is an XML
file that describes how TeamSite should present the form to the information worker.
A Data Content Record (DCR) is an XML file that contains an instance of a form completed
by an information worker. You launch TeamSite, click File, New Form Entry and select
the form you want to complete. Next, the given form appears in the browser. The fields
of the form are defined by the DCT. After you click the Save button, the field values
are serialized into a DCR file. These files are organized in a collection of folders
on the TeamSite server; one folder per form. Each folder has a conventional set of
child folders to hold the DCR files as well as the presentation template file(s),
These are the files with the .tpl file extension.
&lt;/p&gt;
&lt;p&gt;
A presentation template converts a DCR into something else. Most of the time, at least
for me, that something else will be an HTML page. Imagine a single DCR file that contains
both public and private information for a company; perhaps the DCR contains public
information about a single product as well as private information for their tech support
staff. The DCR file can be send around via workflow for approval and the finally be
ran through both sets of presentation templates which results in two different HTML
files - one file is deployed to the public and the other file is kept on the Intranet.
Both files are assured of having the appropriate content via the approval process
and the presentation templates apply the correct branding and layout. This model supports
a good workflow model as well as good separation of design from content. Its just
one example of using the FormsPublisher in the enterprise.
&lt;/p&gt;
&lt;p&gt;
Since DCR files are just XML, it's relatively painless to import legacy data into
TeamSite. These imported XML files map to a given DCT, then they're translated into
HTML pages via a presentation template. For example, if you have the last 15 years
of press releases on the legacy system, you can import the existing information with
some batch processes and stand up a new TeamSite server pretty quick.
&lt;/p&gt;
&lt;h4&gt;Workflow
&lt;/h4&gt;
&lt;p&gt;
A workflow describes an automated business process. It can instruct an author to perform
an edit or add a new file to the site and manage the process of approvals, taking
a snapshot of the system for archival purposes and finally deployment. When a task
such as &amp;quot;Edit Content&amp;quot; or &amp;quot;Review Content&amp;quot; becomes active, an
e-mail can notify the appropriate party. When the work is completed, the assigned
person just pushes it through the hole. Reviewers can click &amp;quot;Accept&amp;quot; or
&amp;quot;Reject&amp;quot; after previewing the changes, they don't need to know the next
appropriate step in the process - its automated. The system tracks the state and flow
of information of the activities throughout the lifecycle according to the established
business rules approved by the given company rather than based on how the given employee
feels that particular day.
&lt;/p&gt;
&lt;p&gt;
TeamSite has always included a workflow mechanism, but I can only imagine how difficult
it was to develop them in the past. This latest version includes a Windows client
application that supports drag-and-drop editing of workflow designs. You can work
locally with workflows saved to your desktop in an offline mode, but you will eventually
need to save the workflow up to the TeamSite server via commands in the tool. Workflows
are serialized into XML files in the background, but its rare to look at the raw information.
The workflow designer application helps you do the things you would expect such as
setting up a series of tasks linked by arrows; some might be conditional based on
human interaction or automated entirely by Perl scripts, Java classes or some other
business logic.
&lt;/p&gt;
&lt;p&gt;
Its interesting that Interwoven prides itself on a large number of supported platforms
for the server product, but the Workflow designer client requires the Windows operating
system. As I understand it, some (or all) of the workflow client application was recently
purchased from another company. My hunch is the client application is written in C++
based on the look and feel as well as the OS requirement. Its a little clunky but
it gets the job done; I sure wouldn't want to hand code all of the XML it generates.
&lt;/p&gt;
&lt;h4&gt;Conclusion
&lt;/h4&gt;
&lt;p&gt;
Overall, I'm happy with my experiences thus far with TeamSite. The documentation is
rich, it has a thriving online developer community, and the paradigm isn't too hard
to grasp. At one point, I started getting bogged down with the massive about of XML
configuration files and customization points. After sleeping on it (and a stiff cup-o-coffee)
I realized that any other enterprise level application has a similar amount of customization.
Since TeamSite embraces a litany of platforms, it makes sense that they don't (or
haven't) invested a lot in slick little Windows GUI programs for configuration needs.
Why build a server GUI tools when Windows is only one of your supported OS platforms?
On the other hand, they could build a few more web based administration forms to get
around some of these XML file updates. Once I started tallying up how many configuration
pages I go through for Windows SharePoint, I stopped feeling like I was building my
own box and installing Linux and started thinking about the broader ideas and why
I was configuring the system instead of how - perhaps it just semantics, but I felt
better.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=6e4a1627-605a-4720-a69d-eeaf09e44949" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,6e4a1627-605a-4720-a69d-eeaf09e44949.aspx</comments>
      <category>learning</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=ef26d1b0-b4d7-4932-9bca-f1f7a4e80df1</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,ef26d1b0-b4d7-4932-9bca-f1f7a4e80df1.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,ef26d1b0-b4d7-4932-9bca-f1f7a4e80df1.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=ef26d1b0-b4d7-4932-9bca-f1f7a4e80df1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just got a new Dell Latitude D830 laptop running Vista Ultimate and I'm
going about the lengthy process of installing all my software. When I got to PowerShell,
I grabbed a copy of the installation file from my 250GB external drive that
I had previously downloaded for my previous laptop, a Dell Latitude D610, running
Windows XP SP2.
</p>
        <p>
When I ran the install program, I was repeated met with the following error message:
</p>
        <p>
          <em>Not enough storage is available to process this command.</em>
        </p>
        <p>
A lot of other people had the same problem, but no one had posted a solution. Then,
I suspect I figured out the answer the same way others had. I was executing WindowsXP-KB926139-x86-ENU.exe
instead of Windows6.0-KB928439-x86.msu, I had overlooked the fact that Windows XP
and Vista had different installation programs for PowerShell.
</p>
        <p>
Drat.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=ef26d1b0-b4d7-4932-9bca-f1f7a4e80df1" />
      </body>
      <title>Installing Powershell on Vista</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,ef26d1b0-b4d7-4932-9bca-f1f7a4e80df1.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2007/09/26/InstallingPowershellOnVista.aspx</link>
      <pubDate>Wed, 26 Sep 2007 22:37:14 GMT</pubDate>
      <description>&lt;p&gt;
I just got a new Dell Latitude D830 laptop running Vista&amp;nbsp;Ultimate and&amp;nbsp;I'm
going about the lengthy process of installing all my software. When I got to PowerShell,
I grabbed a&amp;nbsp;copy of the installation file from my 250GB&amp;nbsp;external drive&amp;nbsp;that
I had previously downloaded for my previous laptop, a Dell Latitude D610, running
Windows XP SP2.
&lt;/p&gt;
&lt;p&gt;
When I ran the install program, I was repeated met with the following error message:
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Not enough storage is available to process this command.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
A lot of other people had the same problem, but no one had posted a solution. Then,
I suspect I figured out the answer the same way others had. I was executing WindowsXP-KB926139-x86-ENU.exe
instead of Windows6.0-KB928439-x86.msu, I had overlooked the fact that Windows XP
and Vista had different installation programs for PowerShell.
&lt;/p&gt;
&lt;p&gt;
Drat.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=ef26d1b0-b4d7-4932-9bca-f1f7a4e80df1" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,ef26d1b0-b4d7-4932-9bca-f1f7a4e80df1.aspx</comments>
      <category>PowerShell</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=baf7f285-def9-4707-a086-9cfc4a7717f0</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,baf7f285-def9-4707-a086-9cfc4a7717f0.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,baf7f285-def9-4707-a086-9cfc4a7717f0.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=baf7f285-def9-4707-a086-9cfc4a7717f0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've been battling some crazy ASP.NET 1.1 code the past couple of days. First, I was
calling some web services with entirely hand written SOAP protocol management. That's
always fun. While tedious and too low of a level to be mucking around, it was the
fastest means to an end with a crotchity ol' Apache/AXIS web service. Even though
I'm fresh off the WCF training regimen; that new stuff wouldn't have helped me here.
Perhaps just having the new stuff in my head pushed me in the right direction
to tackle this challenge - a man can dream, can't he? 
</p>
        <p>
Then, just to rub it in a little, the HTTPWebRequest object decided to give me a swift
kick in the shorts. You see, in .Net 1.1, there's a tiny little unknown (unanswered) bug. 
</p>
        <p>
I have two instance methods and each make a single call over HTTP with their own HTTPWebRequest
object, there's no sharing here. Every time, the second request would hang and throw
a "System.Net.WebException : The operation has timed-out." error. The same code runs
great in .Net 2.0 so I figure its a framework bug. 
</p>
        <p>
I call one method and return a string which is used as an input argument for the second
method. Both calls go to the same top level domain, but call to different end points
on the domain. 
</p>
        <p>
After much thought, trial and error, as well as reading about the same problem other
folks were having, I finally figured out the workaround. 
</p>
        <p>
It turns out that calling the Abort() method on the HTTPRequest instance after completing
the request is sufficient to break up the clog that is preventing subsequent calls.
The following code block shows the working helper method. If I comment out the calll
to Abort(), it no worky. 
</p>
        <pre>private string ExecuteHttpWebRequest(
   string url, RequestMethod method, string message)
{
   HttpWebRequest request = 
      (HttpWebRequest)HttpWebRequest.Create(url);

   request.Timeout = 30000;
   request.KeepAlive = false;
   request.Headers.Add("Cache-Control", "no-cache");
   request.Headers.Add("Pragma", "no-cache");

   switch( method )
   {
      case RequestMethod.Get :

         request.Method = "GET";

         break;

      case RequestMethod.Post :
         
         request.ContentType 
            = "application/x-www-form-urlencoded";
         request.Method = "POST";
         request.ContentLength = message.Length;

         StreamWriter sw = 
            new StreamWriter(request.GetRequestStream());
         sw.Write(message);
         sw.Flush();

         break;
   }

   string html = null;

   using( HttpWebResponse response 
      = (HttpWebResponse)request.GetResponse() )
   {
      Stream rs = response.GetResponseStream();
      StreamReader sr = new StreamReader(rs);
      html = sr.ReadToEnd();
      response.Close();

      // subsequent calls fail without this abort in .Net v1.1
      request.Abort();
   }

   return html;
}	
</pre>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=baf7f285-def9-4707-a086-9cfc4a7717f0" />
      </body>
      <title>System.Net.WebException : The operation has timed-out.</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,baf7f285-def9-4707-a086-9cfc4a7717f0.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2007/07/25/SystemNetWebExceptionTheOperationHasTimedout.aspx</link>
      <pubDate>Wed, 25 Jul 2007 05:27:37 GMT</pubDate>
      <description>&lt;p&gt;
I've been battling some crazy ASP.NET 1.1 code the past couple of days. First, I was
calling some web services with entirely hand written SOAP protocol management. That's
always fun. While tedious and too low of a level to be mucking around, it was the
fastest means to an end with a crotchity ol' Apache/AXIS web service. Even though
I'm fresh off the WCF training regimen; that new stuff wouldn't have helped me here.
Perhaps just having&amp;nbsp;the new stuff in my head pushed me in the right direction
to tackle this challenge - a man can dream, can't he? 
&lt;p&gt;
Then, just to rub it in a little, the HTTPWebRequest object decided to give me a swift
kick in the shorts. You see, in .Net 1.1, there's a tiny little unknown (unanswered)&amp;nbsp;bug. 
&lt;p&gt;
I have two instance methods and each make a single call over HTTP with their own HTTPWebRequest
object, there's no sharing here. Every time, the second request would hang and throw
a "System.Net.WebException : The operation has timed-out." error. The same code runs
great in .Net 2.0 so I figure its a framework bug. 
&lt;p&gt;
I call one method and return a string which is used as an input argument for the second
method. Both calls go to the same top level domain, but call to different end points
on the domain. 
&lt;p&gt;
After much thought, trial and error, as well as reading about the same problem other
folks were having, I finally figured out the workaround. 
&lt;p&gt;
It turns out that calling the Abort() method on the HTTPRequest instance after completing
the request is sufficient to break up the clog that is preventing subsequent calls.
The following code block shows the working helper method. If I comment out the calll
to Abort(), it no worky. &lt;pre&gt;private string ExecuteHttpWebRequest(
   string url, RequestMethod method, string message)
{
   HttpWebRequest request = 
      (HttpWebRequest)HttpWebRequest.Create(url);

   request.Timeout = 30000;
   request.KeepAlive = false;
   request.Headers.Add("Cache-Control", "no-cache");
   request.Headers.Add("Pragma", "no-cache");

   switch( method )
   {
      case RequestMethod.Get :

         request.Method = "GET";

         break;

      case RequestMethod.Post :
         
         request.ContentType 
            = "application/x-www-form-urlencoded";
         request.Method = "POST";
         request.ContentLength = message.Length;

         StreamWriter sw = 
            new StreamWriter(request.GetRequestStream());
         sw.Write(message);
         sw.Flush();

         break;
   }

   string html = null;

   using( HttpWebResponse response 
      = (HttpWebResponse)request.GetResponse() )
   {
      Stream rs = response.GetResponseStream();
      StreamReader sr = new StreamReader(rs);
      html = sr.ReadToEnd();
      response.Close();

      // subsequent calls fail without this abort in .Net v1.1
      request.Abort();
   }

   return html;
}	
&lt;/pre&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=baf7f285-def9-4707-a086-9cfc4a7717f0" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,baf7f285-def9-4707-a086-9cfc4a7717f0.aspx</comments>
      <category>asp.net</category>
      <category>popart</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=72bd7bf5-72cf-460d-b16e-6f2705559321</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,72bd7bf5-72cf-460d-b16e-6f2705559321.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,72bd7bf5-72cf-460d-b16e-6f2705559321.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=72bd7bf5-72cf-460d-b16e-6f2705559321</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've been using Google Reader <a href="http://www.andrewdothay.net/PermaLink,guid,693e459e-caf1-488a-86c4-114960833dce.aspx" target="_blank">for
a while now</a> and I love it. Its very quick to launch with my <a href="http://www.bayden.com/SlickRun/" target="_blank">SlickRun</a> shortcut
of "gr" and it manages my current list of 96 RSS subscriptions very well. 
</p>
        <p>
In fact, I recently figured out that this application is perhaps one of the <strong>worst
web applications to use with the mouse</strong>. The mouse is such an impediment to
reading several posts efficiently. I launch Google Reader several times a day and
its common for me to have nearly 50 unread posts from over
30 RSS subscriptions at any given perusal session.
</p>
        <p>
Here are the Google Reader keyboard shortcuts I use on a regular basis.
</p>
        <ol>
          <li>
Click the "Show Updated" hyperlink in the left column to show only the RSS subscriptions
with unread posts 
</li>
          <li>
Click the first RSS subscription link of the list in the
left column (getting in the mood) 
</li>
          <li>
Click the first unread post of the list if the right column (tee it
up) 
</li>
          <li>
Press <strong>space bar</strong> to traverse multi-page posts <strong>and</strong> advance
to the next unread post for a given RSS subscription 
</li>
          <li>
When all the posts are read for a given RSS subscription, press <strong>Shift+N</strong> to
advance the highlight to the next RSS subscription of the list in the left column 
</li>
          <li>
Press <strong>Shift+O</strong> (this is my Oh face) to open the list of the new highlighted
RSS subscription 
</li>
          <li>
Press the <strong>space bar</strong> to traverse this new feed like the
previous RSS subscription 
</li>
        </ol>
        <p>
 
</p>
        <p>
 <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="314" alt="googlereader" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/GoogleReaderKeyboardShortcuts_134B6/googlereader_ba731b6d-14fb-4def-9681-7b7e3eaa282f.png" width="500" border="0" /></p>
        <p>
To Summarize:
</p>
        <table cellspacing="0" cellpadding="4" border="1" unselectable="on">
          <tbody>
            <tr>
              <td>
                <strong>Space Bar</strong>
              </td>
              <td>
Scroll through a long post, then skip to next post when the last line of
current post is visible</td>
            </tr>
            <tr>
              <td>
                <strong>Shift + N</strong>
              </td>
              <td>
Highlight the next RSS subscription in the left column</td>
            </tr>
            <tr>
              <td>
                <strong>Shift + O</strong>
              </td>
              <td>
Open the list of posts for the highlighted RSS subscription</td>
            </tr>
          </tbody>
        </table>
        <p>
 There are a <a href="http://www.google.com/help/reader/faq.html#shortcuts" target="_blank">bunch
of other keyboard shortcuts</a> for Google Reader. These are the ones I use the most.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=72bd7bf5-72cf-460d-b16e-6f2705559321" />
      </body>
      <title>Google Reader Keyboard Shortcuts</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,72bd7bf5-72cf-460d-b16e-6f2705559321.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2007/07/19/GoogleReaderKeyboardShortcuts.aspx</link>
      <pubDate>Thu, 19 Jul 2007 04:57:20 GMT</pubDate>
      <description>&lt;p&gt;
I've been using Google Reader &lt;a href="http://www.andrewdothay.net/PermaLink,guid,693e459e-caf1-488a-86c4-114960833dce.aspx" target="_blank"&gt;for
a while now&lt;/a&gt; and I love it. Its very quick to launch with my &lt;a href="http://www.bayden.com/SlickRun/" target="_blank"&gt;SlickRun&lt;/a&gt; shortcut
of "gr" and it manages my current&amp;nbsp;list of 96 RSS subscriptions very well. 
&lt;/p&gt;
&lt;p&gt;
In fact, I recently figured out&amp;nbsp;that this application is perhaps one of the &lt;strong&gt;worst
web applications to use with the mouse&lt;/strong&gt;. The mouse is such an impediment to
reading several posts efficiently. I launch Google Reader several times a day and
its&amp;nbsp;common&amp;nbsp;for me to&amp;nbsp;have nearly&amp;nbsp;50 unread&amp;nbsp;posts from over
30&amp;nbsp;RSS subscriptions at any given perusal session.
&lt;/p&gt;
&lt;p&gt;
Here are the Google Reader keyboard shortcuts&amp;nbsp;I use on a regular basis.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Click the "Show Updated" hyperlink in the left column&amp;nbsp;to show only the RSS subscriptions
with unread posts 
&lt;li&gt;
Click the&amp;nbsp;first RSS subscription link&amp;nbsp;of&amp;nbsp;the&amp;nbsp;list&amp;nbsp;in the
left column (getting in the mood) 
&lt;li&gt;
Click the&amp;nbsp;first unread&amp;nbsp;post&amp;nbsp;of the list if the right column (tee it
up) 
&lt;li&gt;
Press &lt;strong&gt;space bar&lt;/strong&gt; to&amp;nbsp;traverse multi-page posts &lt;strong&gt;and&lt;/strong&gt; advance
to the next unread&amp;nbsp;post for a given&amp;nbsp;RSS subscription 
&lt;li&gt;
When all the&amp;nbsp;posts are read for a given RSS subscription, press &lt;strong&gt;Shift+N&lt;/strong&gt; to
advance the highlight to the next RSS subscription&amp;nbsp;of the list in the left column 
&lt;li&gt;
Press &lt;strong&gt;Shift+O&lt;/strong&gt; (this is my Oh face) to open the list of the new highlighted
RSS subscription 
&lt;li&gt;
Press the &lt;strong&gt;space bar&lt;/strong&gt; to&amp;nbsp;traverse this&amp;nbsp;new feed like the
previous RSS subscription 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="314" alt="googlereader" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/GoogleReaderKeyboardShortcuts_134B6/googlereader_ba731b6d-14fb-4def-9681-7b7e3eaa282f.png" width="500" border="0"&gt;
&lt;/p&gt;
&lt;p&gt;
To Summarize:
&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="4" border="1" unselectable="on"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Space&amp;nbsp;Bar&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
Scroll&amp;nbsp;through a long post, then skip to next post&amp;nbsp;when the last line of
current post is visible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Shift&amp;nbsp;+&amp;nbsp;N&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
Highlight the next RSS subscription in the left column&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Shift&amp;nbsp;+&amp;nbsp;O&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
Open the list of posts for the highlighted RSS subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
&amp;nbsp;There are a &lt;a href="http://www.google.com/help/reader/faq.html#shortcuts" target="_blank"&gt;bunch
of other keyboard shortcuts&lt;/a&gt; for Google Reader. These are the ones I use the most.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=72bd7bf5-72cf-460d-b16e-6f2705559321" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,72bd7bf5-72cf-460d-b16e-6f2705559321.aspx</comments>
      <category>blogging</category>
      <category>learning</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=693e459e-caf1-488a-86c4-114960833dce</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,693e459e-caf1-488a-86c4-114960833dce.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,693e459e-caf1-488a-86c4-114960833dce.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=693e459e-caf1-488a-86c4-114960833dce</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img style="border-right: 0px; border-top: 0px; margin: 0px 15px 5px 0px; border-left: 0px; border-bottom: 0px" height="43" alt="Google Reader" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/MyNewRSSReader_13ADC/googlereader%5B3%5D.png" width="142" align="left" border="0" /> I
used <a href="http://sharpreader.net/" target="_blank">SharpReader</a> for a long
time, then briefly used the RSS Reader in Outlook 2007, after an even briefer stint
with IE7's RSS reader client (ack!). I don't categorize myself as superstitious, but
was else do you call it when you suspect all those posts and media downloads in Outlook 2007
are slowing down your system and you have no real data to back it up?
</p>
        <p>
I liked the Outlook 2007 reader because I was horrible at opening SharpReader on my
laptop. I always had Outlook open. It took a while to launch SharpReader,
but it was a great application. Then, I'd open SharpReader on a weekend and be horrified
by (a) the number of posts that I was behind, and (2) the amount of information that
I could have used during the previous week. I'm always looking to get my compile time
down, so right or wrong, I'd close applications left and right to give my Dell
Latitude D610 as much horsepower as it can wield during the week.
</p>
        <p>
My buddy, <a href="http://spaceninja.com/lp-web-standards-redesign/" target="_blank">Scott</a>,
turned me on to <a href="http://www.google.com/reader/" target="_blank">Google Reader</a>.
As a big time RSS fan boy and an even bigger nerd than I, his opinion is to be respected.
</p>
        <p>
So this weekend, I imported my OPML file into Google's RSS Reader and away I go. So
far, I'm pretty impressed. There's a few things I'd like to do, such as return certain
posts to "unread" status as I want to come back to them later and rename
some folders, but all in all, I likey.
</p>
        <p>
Now, I can open my RSS reader without the cycles of a big application. (
type my new magic word, "gr", in SlickRun and launch my reader anytime I
like. Booya!
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=693e459e-caf1-488a-86c4-114960833dce" />
      </body>
      <title>My New RSS Reader</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,693e459e-caf1-488a-86c4-114960833dce.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2007/04/30/MyNewRSSReader.aspx</link>
      <pubDate>Mon, 30 Apr 2007 05:23:55 GMT</pubDate>
      <description>&lt;p&gt;
&lt;img style="border-right: 0px; border-top: 0px; margin: 0px 15px 5px 0px; border-left: 0px; border-bottom: 0px" height="43" alt="Google Reader" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/MyNewRSSReader_13ADC/googlereader%5B3%5D.png" width="142" align="left" border="0"&gt; I
used &lt;a href="http://sharpreader.net/" target="_blank"&gt;SharpReader&lt;/a&gt; for a long
time, then briefly used the RSS Reader in Outlook 2007, after an even briefer stint
with IE7's RSS reader client (ack!). I don't categorize myself as superstitious, but
was else do you call it when you suspect all those posts and media downloads in Outlook&amp;nbsp;2007
are slowing down your system and you have no real data to back it up?
&lt;/p&gt;
&lt;p&gt;
I liked the Outlook 2007 reader because I was horrible at opening SharpReader on my
laptop. I always&amp;nbsp;had Outlook open.&amp;nbsp;It took a while to launch SharpReader,
but it was a great application. Then, I'd open SharpReader on a weekend and be horrified
by (a) the number of posts that I was behind, and (2) the amount of information that
I could have used during the previous week. I'm always looking to get my compile time
down, so right or wrong, I'd close applications left and right&amp;nbsp;to give my Dell
Latitude D610 as much horsepower as it can wield during the week.
&lt;/p&gt;
&lt;p&gt;
My buddy, &lt;a href="http://spaceninja.com/lp-web-standards-redesign/" target="_blank"&gt;Scott&lt;/a&gt;,
turned me on to &lt;a href="http://www.google.com/reader/" target="_blank"&gt;Google Reader&lt;/a&gt;.
As a big time RSS fan boy and an even bigger nerd than I, his opinion is to be respected.
&lt;/p&gt;
&lt;p&gt;
So this weekend, I imported my OPML file into Google's RSS Reader and away I go. So
far, I'm pretty impressed. There's a few things I'd like to do, such as return certain
posts&amp;nbsp;to "unread" status&amp;nbsp;as I want to come back to them later and rename
some folders, but all in all, I likey.
&lt;/p&gt;
&lt;p&gt;
Now, I can open my RSS reader without the&amp;nbsp;cycles of a big application.&amp;nbsp;(
type my new magic word, "gr",&amp;nbsp;in SlickRun&amp;nbsp;and launch my reader anytime I
like. Booya!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=693e459e-caf1-488a-86c4-114960833dce" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,693e459e-caf1-488a-86c4-114960833dce.aspx</comments>
      <category>blogging</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=a802161d-8f36-480d-b56d-f9151b3d87aa</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,a802161d-8f36-480d-b56d-f9151b3d87aa.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,a802161d-8f36-480d-b56d-f9151b3d87aa.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=a802161d-8f36-480d-b56d-f9151b3d87aa</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; MARGIN: 0px 25px 10px 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="200" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/CardSpacetheLawsofIdentity_B37A/sao-devsig-cardspace-openid%5B2%5D.jpg" width="250" align="left" border="0" /> I
attended the Software Association of Oregon (SAO) event today. The Development
Special Interest Group (DEV SIG) hosted a discussion about Microsoft CardSpace, the
open source framework of OpenID, and basic identity management.
</p>
        <p>
Stuart Celarier walked the audience through <a href="http://www.identityblog.com/" target="_blank">Kim
Cameron's</a> paper called <a href="http://www.identityblog.com/?page_id=354" target="_blank">The
Laws of Identity</a> that articulate seven desired aspects of a good identity
system.
</p>
        <p>
Microsoft CardSpace was formerly named "InfoCard". This is a joint effort to implement
the identity metasystem defined by the laws of identity. CardSpace is the "identity
selector" for Windows. It needs IE7 and Microsoft .Net Framework 3.0 to operate. It implements
the WS-* specifications in this service.
</p>
        <p>
          <a href="http://osis.netmesh.org/" target="_blank">OSIS - Open Source Identity System</a>:
This is an open source group that's involved in the identity space.
</p>
        <p>
Stuart also showed a demo of a system he's been working on. It logs a user into Wachovia
banking site using CardSpace.  Scott Kveton of <a href="http://janrain.com/" target="_blank">JANRAIN</a> presented
OpenID to the SAO DEV SIG group. OpenID hopes to solve the problem of having too many
usernames and passwords. 
</p>
        <ul>
          <li>
Single Signon for the web 
</li>
          <li>
Simple, light-weight 
</li>
          <li>
Easy to use, easy to deploy 
</li>
          <li>
Open development process 
</li>
          <li>
Decentralized</li>
        </ul>
        <p>
Your OpenID is a URL: <a title="http://kveton.myopenid.com/" href="http://kveton.myopenid.com/">http://kveton.myopenid.com/</a></p>
        <ul>
          <li>
OpenID comes from the blogosphere 
</li>
          <li>
Biggest problem with identity; namespace 
</li>
          <li>
OpenID solves this by using DNS 
</li>
          <li>
Your identity is a destination 
</li>
          <li>
You have a unique endpoint on the web</li>
        </ul>
        <p>
Scott Kveton explained how sites enabled with OpenID enable users to authenticate.
Visitors type in their OpenID, and the browser redirects to your OpenID provider.
The visitor makes the appropriate decision and the browser redirects back the website.
</p>
        <p>
Scott's site is <a href="http://scott.kveton.com">http://scott.kveton.com</a></p>
        <p>
Last week Bill Gates announced support for OpenID. AOL announced support for OpenID
this morning. More companies are about to make similar announcments. Here's some interesting
stats on adoption:
</p>
        <ul>
          <li>
12-15 million users with OpenIDs. 
</li>
          <li>
1000+ OpenID enabled sites 
</li>
          <li>
10-15 new OpenID enabled sites each day 
</li>
          <li>
7% grown each week with new sites</li>
        </ul>
        <p>
Kveton also brought up "Microformats" - a way to describe data in an HTML format (contact
info, social network, calendar). These can be embedded on pages. There are some interesting
ways to use OpenID with these technologies:
</p>
        <ul>
          <li>
OpenID + iCal 
</li>
          <li>
OpenID + hCards 
</li>
          <li>
OpenID + Social Networking (XFN, FOAP or FOAF?) 
</li>
          <li>
OpenId + Reputation (jyte.com)</li>
        </ul>
        <p>
OpenID Predictions from Kveton:
</p>
        <ul>
          <li>
7500 sites supporting OpenID 
</li>
          <li>
100 million users with OpenID 
</li>
          <li>
Big players adopt OpenID</li>
        </ul>
        <p>
OpenID.net has a ton of info.
</p>
        <p>
Scott Hanselman explained how he enabled OpenID on his blog. Hte added two HTML
&lt;link&gt; tags to his website. <a href="http://simonwillison.net/" target="_blank">Simon
Willison</a> has an OpenID enabled blog. A visitor can click Sign in with OpenID.
The OpenID logo lives inside the textbox. Scott entered his OpenID in the textbox
on Simon's site. Using a web service, Simon's blog discovered Hanselman's
OpenID provider, then it redirected the browser to Scott's OpenID provider. 
</p>
        <p>
Scott's website indicates the OpenID provider is <a href="http://www.myopenid.com">www.myopenid.com</a>. 
</p>
        <p>
The OpenID provider prompts Scott to authenticate. After a successful login,
the browser redirects back to Simon's page and recogizes Scott Hanselman. This is
how Simon doesn't need to keep track of usernames and passwords for his blog; <font size="5">a
huge benefit.</font></p>
        <p>
Stuart helped explain the difference between self-insued cards and managed cards:
Business Cards from Kinko's versus a card issued from Visa.
</p>
        <p>
Scott Hanselman displayed a different identity selector using Firefox on Windows.
The page contains an HTML &lt;object&gt; tag of type "application/x-informationCard".
It wasn't as pretty as the CardSpace in IE7 and .Net 3.0, but it had the same behavior.
</p>
        <p>
There was some last minute discusson on "I-Name", an XRI technology (extensible
resource identifier). It sounds like its still being baked.
</p>
        <p>
2idi relays comments on Scott's blog. They will issue an I-Name. =kveton is Scott's
I-Name. They have an DNS resolver where visitors may enter xri://=scott.hanselman/photo
to redirect to his Flickr account.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=a802161d-8f36-480d-b56d-f9151b3d87aa" />
      </body>
      <title>CardSpace &amp;amp; the Laws of Identity</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,a802161d-8f36-480d-b56d-f9151b3d87aa.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2007/02/16/CardSpaceAmpTheLawsOfIdentity.aspx</link>
      <pubDate>Fri, 16 Feb 2007 00:47:54 GMT</pubDate>
      <description>&lt;p&gt;
&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; MARGIN: 0px 25px 10px 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=200 src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/CardSpacetheLawsofIdentity_B37A/sao-devsig-cardspace-openid%5B2%5D.jpg" width=250 align=left border=0&gt; I
attended the Software Association of Oregon (SAO)&amp;nbsp;event today. The Development
Special Interest Group (DEV SIG) hosted a discussion about Microsoft CardSpace, the
open source framework of OpenID, and basic identity management.
&lt;/p&gt;
&lt;p&gt;
Stuart Celarier walked the audience through &lt;a href="http://www.identityblog.com/" target=_blank&gt;Kim
Cameron's&lt;/a&gt; paper called &lt;a href="http://www.identityblog.com/?page_id=354" target=_blank&gt;The
Laws of Identity&lt;/a&gt;&amp;nbsp;that articulate seven desired aspects of a good identity
system.
&lt;/p&gt;
&lt;p&gt;
Microsoft CardSpace was formerly named "InfoCard". This is a joint effort to implement
the identity metasystem defined by the laws of identity. CardSpace is the "identity
selector" for Windows. It needs IE7 and Microsoft .Net Framework 3.0 to operate. It&amp;nbsp;implements
the WS-* specifications in this service.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://osis.netmesh.org/" target=_blank&gt;OSIS - Open Source Identity System&lt;/a&gt;:
This is an open source&amp;nbsp;group that's involved in the identity space.
&lt;/p&gt;
&lt;p&gt;
Stuart also showed a demo of a system he's been working on. It logs a user into Wachovia
banking site using CardSpace.&amp;nbsp; Scott Kveton of&amp;nbsp;&lt;a href="http://janrain.com/" target=_blank&gt;JANRAIN&lt;/a&gt; presented
OpenID to the SAO DEV SIG group. OpenID hopes to solve the problem of having too many
usernames and passwords. 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Single Signon for the web 
&lt;li&gt;
Simple, light-weight 
&lt;li&gt;
Easy to use, easy to deploy 
&lt;li&gt;
Open development process 
&lt;li&gt;
Decentralized&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Your OpenID is a URL: &lt;a title=http://kveton.myopenid.com/ href="http://kveton.myopenid.com/"&gt;http://kveton.myopenid.com/&lt;/a&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
OpenID comes from the blogosphere 
&lt;li&gt;
Biggest problem with identity; namespace 
&lt;li&gt;
OpenID solves this by using DNS 
&lt;li&gt;
Your identity is a destination 
&lt;li&gt;
You have a unique endpoint on the web&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Scott Kveton explained how sites enabled with OpenID enable users to authenticate.
Visitors type in their OpenID, and the browser redirects to your OpenID provider.
The visitor makes the appropriate decision and the browser redirects back the website.
&lt;/p&gt;
&lt;p&gt;
Scott's site is &lt;a href="http://scott.kveton.com"&gt;http://scott.kveton.com&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Last week Bill Gates announced support for OpenID. AOL announced support for OpenID
this morning. More companies are about to make similar announcments. Here's some interesting
stats on adoption:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
12-15 million users with OpenIDs. 
&lt;li&gt;
1000+ OpenID enabled sites 
&lt;li&gt;
10-15 new OpenID enabled sites each day 
&lt;li&gt;
7% grown each week with new sites&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Kveton also brought up "Microformats" - a way to describe data in an HTML format (contact
info, social network, calendar). These can be embedded on pages. There are some interesting
ways to use OpenID with these technologies:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
OpenID + iCal 
&lt;li&gt;
OpenID + hCards 
&lt;li&gt;
OpenID + Social Networking (XFN, FOAP or FOAF?) 
&lt;li&gt;
OpenId + Reputation (jyte.com)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
OpenID Predictions from Kveton:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
7500 sites supporting OpenID 
&lt;li&gt;
100 million users with OpenID 
&lt;li&gt;
Big players adopt OpenID&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
OpenID.net has a ton of info.
&lt;/p&gt;
&lt;p&gt;
Scott Hanselman&amp;nbsp;explained how he enabled OpenID on his blog. Hte added two HTML
&amp;lt;link&amp;gt; tags to his website. &lt;a href="http://simonwillison.net/" target=_blank&gt;Simon
Willison&lt;/a&gt; has an OpenID enabled blog. A visitor can click Sign in with OpenID.
The OpenID logo lives inside the textbox. Scott entered his OpenID in the textbox
on Simon's site.&amp;nbsp;Using a web service, Simon's blog&amp;nbsp;discovered&amp;nbsp;Hanselman's
OpenID&amp;nbsp;provider, then it&amp;nbsp;redirected the browser to Scott's OpenID provider. 
&lt;/p&gt;
&lt;p&gt;
Scott's&amp;nbsp;website indicates the OpenID provider is &lt;a href="http://www.myopenid.com"&gt;www.myopenid.com&lt;/a&gt;.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
The OpenID provider&amp;nbsp;prompts&amp;nbsp;Scott to authenticate. After a successful login,
the browser redirects back to Simon's page and recogizes Scott Hanselman. This is
how Simon doesn't need to keep track of usernames and passwords for his blog; &lt;font size=5&gt;a
huge benefit.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Stuart helped explain the difference between self-insued cards and managed cards:
Business Cards from Kinko's versus a card issued from Visa.
&lt;/p&gt;
&lt;p&gt;
Scott Hanselman displayed a different identity selector using Firefox on Windows.
The page contains an HTML &amp;lt;object&amp;gt; tag&amp;nbsp;of type "application/x-informationCard".
It wasn't as pretty as the CardSpace in IE7 and .Net 3.0, but it had the same behavior.
&lt;/p&gt;
&lt;p&gt;
There was some last minute discusson on&amp;nbsp;"I-Name",&amp;nbsp;an XRI technology (extensible
resource identifier). It sounds like its still being baked.
&lt;/p&gt;
&lt;p&gt;
2idi&amp;nbsp;relays comments on Scott's blog. They will issue an I-Name. =kveton is Scott's
I-Name. They have an DNS resolver where visitors may enter xri://=scott.hanselman/photo
to redirect to his Flickr account.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=a802161d-8f36-480d-b56d-f9151b3d87aa" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,a802161d-8f36-480d-b56d-f9151b3d87aa.aspx</comments>
      <category>asp.net</category>
      <category>blogging</category>
      <category>events</category>
      <category>ie7</category>
      <category>learning</category>
      <category>software</category>
      <category>CardSpace</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=f510ca78-ace7-44a6-b3df-9966e3a59659</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,f510ca78-ace7-44a6-b3df-9966e3a59659.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,f510ca78-ace7-44a6-b3df-9966e3a59659.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=f510ca78-ace7-44a6-b3df-9966e3a59659</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I had a need for a client services teammate to get their hands dirty with some XML.
In this project, an XML file defines the hierarchy of pages in a web
site. With a massive redesign under way, the team needed someone with familiarity
of the existing pages to make the changes. With the hopes of giving my non-developer
teammate a slick application to help them rearrange some angle brackets,
I took a look at Xml Notepad 2007 and WCMHelp's XmlPad.
</p>
        <h3>Xml Notepad 2007
</h3>
        <p>
The <a href="http://www.microsoft.com/downloads/details.aspx?familyid=72d6aa49-787d-4118-ba5f-4f30fe913628&amp;displaylang=en" target="_blank">bits
can be downloaded here</a> and this document a nice explanation of the <a href="http://msdn2.microsoft.com/en-us/library/aa905339.aspx" target="_blank">author's
intent</a>. 
</p>
        <p>
          <img height="361" alt="Xml Notepad 2007" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/XmlNotepad2007vsWMHelpXmlPad_12437/xmlnotepad2007%5B5%5D.png" width="450" />
        </p>
        <p>
The left window shows the tree. The red dots are attributes and the folder icons are
elements. The right window shows the values of the attributes. There's an XSL tab
for viewing transformations. You can point the application at an XSLT file and see
the output too.
</p>
        <p>
The part I like the best about this is application is its simplicity. I need my teammate
to look at each node and make a determination. They might need to move it anywhere
in the hierarchy. There are four buttons on the right side of the toolbar expressly
for this purpose. If they feel a little more ambitious, they can click and drag the
node to the new location in the left window.
</p>
        <h3>WMHelp XMLPad 3
</h3>
        <p>
You can <a href="http://www.wmhelp.com/xmlpad3.htm" target="_blank">get the bits here</a>.
This application feels a little more powerful than the first application. It can create
schemas and validate against them in a more flexible manner than XML Notepad. 
</p>
        <p>
          <img height="374" alt="WMHelp XMLPad" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/XmlNotepad2007vsWMHelpXmlPad_12437/wmhelpxmlpad%5B2%5D.png" width="500" />
        </p>
        <p>
The attribute names and values appear in the lower left window of this application.
There are different views of the XML available too. The picture above shows the source
view. There are three other views (Grid, Table and Preview) in the bottom of the right
window.
</p>
        <p>
This application doesn't show the simple set of buttons in the
toolbar for moving nodes, although they can be dragged around in the tree. I
find that dragging can be a little unpredictable with a large node set. With all the
on-the-spot decision making going on, I felt that the simple XML Notepad program
was better suited for the specific task and user. However, if I'm the one doing XML
work, I would probably choose XMLPad if VS.Net 2005 didn't do the trick
for some reason.
</p>
        <p>
At some point, I'd like to checkout <a href="http://www.altova.com/products/xmlspy/xml_editor.html" target="_blank">XMLSpy</a>.
I've heard great things about it for years. I chose to examine these two because
they were free and this was a one time gig. If I end up doing lots of work with my
angle bracket hammer, then I probably will put in a request for the XMLSpy license.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=f510ca78-ace7-44a6-b3df-9966e3a59659" />
      </body>
      <title>Xml Notepad 2007 vs WMHelp XmlPad</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,f510ca78-ace7-44a6-b3df-9966e3a59659.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2007/01/15/XmlNotepad2007VsWMHelpXmlPad.aspx</link>
      <pubDate>Mon, 15 Jan 2007 04:47:19 GMT</pubDate>
      <description>&lt;p&gt;
I had a need for a client services teammate to get their hands dirty with some XML.
In this project, an XML file defines the hierarchy of&amp;nbsp;pages&amp;nbsp;in&amp;nbsp;a web
site. With a massive redesign under way, the team needed&amp;nbsp;someone with familiarity
of the existing pages to make the changes. With the hopes of giving my non-developer
teammate a slick application to help them&amp;nbsp;rearrange&amp;nbsp;some angle brackets,
I took a look at Xml Notepad 2007 and WCMHelp's XmlPad.
&lt;/p&gt;
&lt;h3&gt;Xml Notepad 2007
&lt;/h3&gt;
&lt;p&gt;
The &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=72d6aa49-787d-4118-ba5f-4f30fe913628&amp;amp;displaylang=en" target="_blank"&gt;bits
can be downloaded here&lt;/a&gt; and this&amp;nbsp;document a nice explanation of the &lt;a href="http://msdn2.microsoft.com/en-us/library/aa905339.aspx" target="_blank"&gt;author's
intent&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
&lt;img height="361" alt="Xml Notepad 2007" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/XmlNotepad2007vsWMHelpXmlPad_12437/xmlnotepad2007%5B5%5D.png" width="450"&gt; 
&lt;/p&gt;
&lt;p&gt;
The left window shows the tree. The red dots are attributes and the folder icons are
elements. The right window shows the values of the attributes. There's an XSL tab
for viewing transformations. You can point the application at an XSLT file and see
the output too.
&lt;/p&gt;
&lt;p&gt;
The part I like the best about this is application is its simplicity. I need my teammate
to look at each node and&amp;nbsp;make a determination. They might need to move it anywhere
in the hierarchy. There are four buttons on the right side&amp;nbsp;of the toolbar expressly
for this purpose. If they feel a little more ambitious, they can click and drag the
node to the new location in the left window.
&lt;/p&gt;
&lt;h3&gt;WMHelp XMLPad 3
&lt;/h3&gt;
&lt;p&gt;
You can &lt;a href="http://www.wmhelp.com/xmlpad3.htm" target="_blank"&gt;get the bits here&lt;/a&gt;.
This application feels a little more powerful than the first application. It can create
schemas and validate against them&amp;nbsp;in a more flexible manner than XML Notepad. 
&lt;/p&gt;
&lt;p&gt;
&lt;img height="374" alt="WMHelp XMLPad" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/XmlNotepad2007vsWMHelpXmlPad_12437/wmhelpxmlpad%5B2%5D.png" width="500"&gt; 
&lt;/p&gt;
&lt;p&gt;
The attribute names and values appear in the lower left window of this application.
There are different views of the XML available too. The picture above shows the source
view. There are three other views (Grid, Table and Preview) in the bottom of the right
window.
&lt;/p&gt;
&lt;p&gt;
This application doesn't&amp;nbsp;show the&amp;nbsp;simple&amp;nbsp;set of&amp;nbsp;buttons in the
toolbar&amp;nbsp;for moving nodes, although they can be dragged around in the tree. I
find that dragging can be a little unpredictable with a large node set. With all the
on-the-spot decision making going on, I felt&amp;nbsp;that the simple XML Notepad program
was better suited for the specific task and user. However, if I'm the one doing XML
work, I&amp;nbsp;would probably&amp;nbsp;choose XMLPad&amp;nbsp;if VS.Net 2005 didn't do the trick
for some reason.
&lt;/p&gt;
&lt;p&gt;
At some point, I'd like to checkout &lt;a href="http://www.altova.com/products/xmlspy/xml_editor.html" target="_blank"&gt;XMLSpy&lt;/a&gt;.
I've heard great things about it for years. I&amp;nbsp;chose to examine these two because
they were free and this was a one time gig. If I end up doing lots of work with my
angle bracket hammer, then I probably will put in a request for the XMLSpy license.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=f510ca78-ace7-44a6-b3df-9966e3a59659" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,f510ca78-ace7-44a6-b3df-9966e3a59659.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=0456a1b7-d8f0-4ebc-ba56-74f7252b94c5</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,0456a1b7-d8f0-4ebc-ba56-74f7252b94c5.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,0456a1b7-d8f0-4ebc-ba56-74f7252b94c5.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=0456a1b7-d8f0-4ebc-ba56-74f7252b94c5</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I saw this <a href="http://www.codinghorror.com/blog/archives/000720.html" target="_blank">post</a> on
Jeff Atwood's blog about a <a href="http://www.slickedit.com/content/view/441" target="_blank">new
tool</a> from SlickEdit, the makers of SlickRun; easily the most frequently used program
on my laptop day-in and day-out.
</p>
        <p>
          <em>
            <strong>The Command Spy</strong>
            <br />
Whenever you click on a menu item or toolbar button in Visual Studio, you are executing
what is known as a "command". Unfortunately, it's almost impossible to tell what command
is linked to which menu items or toolbar buttons. The Command Spy monitors command
execution and allows you to see exactly what commands you've run, how many times you've
run them and what key bindings are used to invoke those commands. The main purpose
of this tool is to allow you to learn what commands are bound to which keystrokes,
so that you can work faster within the IDE. </em>
        </p>
        <p>
I installed Command Spy over the Thanksgiving holiday. It totally rocks!
Just run the VS.Net add-in while you're coding for a couple of hours and then take
a look at your metrics. Command Spy will tell you how many times you've run a command
without using the short-cut keystrokes. Its a great way to improve on your productivity.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=0456a1b7-d8f0-4ebc-ba56-74f7252b94c5" />
      </body>
      <title>Command Spy</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,0456a1b7-d8f0-4ebc-ba56-74f7252b94c5.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/11/27/CommandSpy.aspx</link>
      <pubDate>Mon, 27 Nov 2006 18:48:29 GMT</pubDate>
      <description>&lt;p&gt;
I saw this &lt;a href="http://www.codinghorror.com/blog/archives/000720.html" target="_blank"&gt;post&lt;/a&gt; on
Jeff Atwood's blog about a &lt;a href="http://www.slickedit.com/content/view/441" target="_blank"&gt;new
tool&lt;/a&gt; from SlickEdit, the makers of SlickRun; easily the most frequently used&amp;nbsp;program
on my laptop day-in and day-out.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;strong&gt;The Command Spy&lt;/strong&gt;
&lt;br&gt;
Whenever you click on a menu item or toolbar button in Visual Studio, you are executing
what is known as a "command". Unfortunately, it's almost impossible to tell what command
is linked to which menu items or toolbar buttons. The Command Spy monitors command
execution and allows you to see exactly what commands you've run, how many times you've
run them and what key bindings are used to invoke those commands. The main purpose
of this tool is to allow you to learn what commands are bound to which keystrokes,
so that you can work faster within the IDE. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
I installed&amp;nbsp;Command Spy&amp;nbsp;over the Thanksgiving holiday. It totally rocks!
Just run the VS.Net add-in while you're coding for a couple of hours and then take
a look at your metrics. Command Spy will tell you how many times you've run a command
without using the short-cut keystrokes. Its a great way to improve on your productivity.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=0456a1b7-d8f0-4ebc-ba56-74f7252b94c5" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,0456a1b7-d8f0-4ebc-ba56-74f7252b94c5.aspx</comments>
      <category>learning</category>
      <category>popart</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=f3278fd4-64a8-49e6-99b8-138b6c0c0db7</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,f3278fd4-64a8-49e6-99b8-138b6c0c0db7.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,f3278fd4-64a8-49e6-99b8-138b6c0c0db7.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=f3278fd4-64a8-49e6-99b8-138b6c0c0db7</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
I started using the RSS reader in Microsoft Outlook 2007. 
</p>
        <p>
I was using SharpReader for as long as I've ever had an RSS reader and subscribed
to feeds. I really like having just one application running for my communications
and work items (email, tasks, calendar, RSS feeds...). Its super easy to
add a feed when you're visiting a web page too. I used folders quite a bit in
SharpReader to categorize feeds, but I'm trying the "one big folder" approach for
now in Outlook.
</p>
        <p>
Sometimes, I got lazy and didn't open SharpReader on my laptop for a while. The
posts would get way out of control. Sure, I could add it to my Start Up
programs, but one of my quirks is to keep that list short, if not empty. Some weeks
I even tell SQL Server to not startup automatically. Perhaps that's one of the old
carry overs from living too long with too little RAM on a weak laptop.
</p>
        <p>
Outlook 2007 as an RSS reader is nice, but I miss some of the basics, like identifying
the URL to a blog I've already subscribed to. There's probably a way to display that
information easily in Outlook, but I haven't discovered it yet.
</p>
        <p>
To date, the most frustrating thing has been refreshing feeds. It gets joined at the
hip with my email send/receive request. So, when someone comes by my desk in a general
freak-out mode and asks how to solve a problem raised in a recent e-mail,
I click on Send/Receive if I haven't gotten it yet. Now, thanks to the additional
RSS feeds, I have to wait much longer as everything is updated. There must be a way
to decouple these requests from each other in Outlook.
</p>
        <p>
Overall, I'm very happy with the switch so far.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=f3278fd4-64a8-49e6-99b8-138b6c0c0db7" />
      </body>
      <title>Using Microsoft Outlook 2007 as an RSS Reader</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,f3278fd4-64a8-49e6-99b8-138b6c0c0db7.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/11/27/UsingMicrosoftOutlook2007AsAnRSSReader.aspx</link>
      <pubDate>Mon, 27 Nov 2006 18:39:22 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
I started using the RSS reader in Microsoft Outlook 2007. 
&lt;/p&gt;
&lt;p&gt;
I was using SharpReader for as long as I've ever had an RSS reader and subscribed
to feeds. I really like having just one application running for my communications
and work items&amp;nbsp;(email, tasks, calendar,&amp;nbsp;RSS feeds...). Its super easy to
add a feed when you're visiting a web page too. I used&amp;nbsp;folders quite a bit in
SharpReader to categorize feeds, but I'm trying the "one big folder" approach for
now in Outlook.
&lt;/p&gt;
&lt;p&gt;
Sometimes, I&amp;nbsp;got lazy and&amp;nbsp;didn't open SharpReader on my laptop for a while.&amp;nbsp;The
posts would get way out of control. Sure, I could&amp;nbsp;add it to&amp;nbsp;my Start Up
programs, but one of my quirks is to keep that list short, if not empty. Some weeks
I even tell SQL Server to not startup automatically. Perhaps that's one of the old
carry overs from living too long with too little RAM on a weak laptop.
&lt;/p&gt;
&lt;p&gt;
Outlook 2007 as an RSS&amp;nbsp;reader is nice, but I miss some of the basics, like&amp;nbsp;identifying
the URL to a blog I've already subscribed to. There's probably a way to display that
information easily in Outlook, but I haven't discovered it yet.
&lt;/p&gt;
&lt;p&gt;
To date, the most frustrating thing has been refreshing feeds. It gets joined at the
hip with my email send/receive request. So, when someone comes by my desk in a general
freak-out mode&amp;nbsp;and asks how to solve a problem raised in a recent&amp;nbsp;e-mail,
I click on Send/Receive if I haven't gotten it yet. Now, thanks to the additional
RSS feeds, I have to wait much longer as everything is updated. There must be a way
to decouple these requests from each other in Outlook.
&lt;/p&gt;
&lt;p&gt;
Overall, I'm very happy with the switch so far.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=f3278fd4-64a8-49e6-99b8-138b6c0c0db7" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,f3278fd4-64a8-49e6-99b8-138b6c0c0db7.aspx</comments>
      <category>learning</category>
      <category>popart</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=4f8fcdeb-532c-43a9-948c-7af774249b88</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,4f8fcdeb-532c-43a9-948c-7af774249b88.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,4f8fcdeb-532c-43a9-948c-7af774249b88.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=4f8fcdeb-532c-43a9-948c-7af774249b88</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
 One of our Pop-Art-Gives-Back-To-The-Community clients wants to implement some
simple online donation services on their website. So, I was flipping through a PDF
file from PayPal using my Foxit Reader and I noticed this little phrase at the top
of a page:
</p>
        <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="50" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/ThankYouPayPal_A256/complementarytechdoc%5B3%5D.png" width="350" border="0" />
        <p>
They're giving me complementary technical documenation! No orange juice or bagel,
but the doc is categorized and complete.
</p>
        <p>
I saw another funny part on the PayPal site. The link to the PDF file says it <em>requires</em> (my
emphasis) Adobe Acrobat to read it. Ha! I must be flaunting the rules with my Foxit
reader; breaking the law! breaking the law!
</p>
        <p>
By the way, I've had great experiences with Foxit up until yesterday. One of our black
turtleneck shirt wearing designers created a PDF version of a client proposal. When
I opened it in Foxit, some large background images flashed for a second, then the
text content appeared without much styling. Each page behaved this way. When I opened
it in Adobe Acrobat, the full beautiful proposal displayed great with background and
content. Huh. I'm not sure if the designer was leveraging some custom Adobe feature
or if Foxit was the culprit; it was the first and only time I didn't get parity though.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=4f8fcdeb-532c-43a9-948c-7af774249b88" />
      </body>
      <title>Thank You PayPal!</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,4f8fcdeb-532c-43a9-948c-7af774249b88.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/10/06/ThankYouPayPal.aspx</link>
      <pubDate>Fri, 06 Oct 2006 18:34:40 GMT</pubDate>
      <description>&lt;p&gt;
&amp;nbsp;One of our Pop-Art-Gives-Back-To-The-Community clients wants to implement some
simple online donation services on their website. So, I was flipping through a PDF
file from PayPal using my Foxit Reader and I noticed this little phrase at the top
of a page:
&lt;/p&gt;
&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="50" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/ThankYouPayPal_A256/complementarytechdoc%5B3%5D.png" width="350" border="0"&gt; 
&lt;p&gt;
They're giving me complementary technical documenation! No orange juice or bagel,
but the doc is categorized and complete.
&lt;/p&gt;
&lt;p&gt;
I saw another funny part on the PayPal site. The link to the PDF file says it&amp;nbsp;&lt;em&gt;requires&lt;/em&gt; (my
emphasis) Adobe Acrobat to read it. Ha! I must be flaunting the rules with my Foxit
reader; breaking the law! breaking the law!
&lt;/p&gt;
&lt;p&gt;
By the way, I've had great experiences with Foxit up until yesterday. One of our black
turtleneck shirt wearing designers created a PDF version of a client proposal. When
I opened it in Foxit, some large background images flashed for a second, then the
text content appeared without much styling. Each page behaved this way. When I opened
it in Adobe Acrobat, the full beautiful proposal displayed great with background and
content. Huh. I'm not sure if the designer was leveraging some custom Adobe feature
or if Foxit was the culprit; it was the first and only time I didn't get parity though.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=4f8fcdeb-532c-43a9-948c-7af774249b88" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,4f8fcdeb-532c-43a9-948c-7af774249b88.aspx</comments>
      <category>observations</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=6bb85547-6f48-482a-b78c-a13830c61d44</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,6bb85547-6f48-482a-b78c-a13830c61d44.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,6bb85547-6f48-482a-b78c-a13830c61d44.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=6bb85547-6f48-482a-b78c-a13830c61d44</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN: 0px 10px 5px 0px; BORDER-RIGHT-WIDTH: 0px" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/WindowsLiveWriter_9C20/windowslivewriter_thumb%5B6%5D.png" align="left" border="0" />Sweet
goodness. Hearts and bunnies, as The Wife and her sister would say.
</p>
        <p>
I'm authoring this post from Windows Live Writer, a Windows client application that
provides a place to author a post offline and then send 'er up the tubes to my blog
site. 
</p>
        <p>
DasBlog has long provided alternatives to the HTML form based post, such as email
based submission, but I've never delved into them. I read about Windows Live Writer
on a couple of posts, nothing too detailed, just a quick mention and on a lark I looked
it up online. 
</p>
        <p>
It seemed interesting, lots of features too. I downloaded a small .msi file, and it
was running great in seconds on my laptop. Right off the bat, it asked for the URL
to my blog and my credentials. It proceeded to chat with my blog to learn some things
about it; I didn't have to do anything.
</p>
        <p>
Sweet!
</p>
        <p>
Then a window opens and prompts me to enter a blog post. I think I'm going to really
like this. 
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=6bb85547-6f48-482a-b78c-a13830c61d44" />
      </body>
      <title>Windows Live Writer</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,6bb85547-6f48-482a-b78c-a13830c61d44.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/09/30/WindowsLiveWriter.aspx</link>
      <pubDate>Sat, 30 Sep 2006 18:08:49 GMT</pubDate>
      <description>&lt;p&gt;
&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN: 0px 10px 5px 0px; BORDER-RIGHT-WIDTH: 0px" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/WindowsLiveWriter_9C20/windowslivewriter_thumb%5B6%5D.png" align=left border=0&gt;&gt;Sweet
goodness. Hearts and bunnies, as The Wife and her sister would say.
&lt;/p&gt;
&lt;p&gt;
I'm authoring this post from Windows Live Writer, a Windows client application that
provides a place to author a post offline and then send 'er up the tubes to my blog
site. 
&lt;/p&gt;
&lt;p&gt;
DasBlog has long provided alternatives to the HTML form based post, such as email
based submission, but I've never delved into them. I read about Windows Live Writer
on a couple of posts, nothing too detailed, just a quick mention and on a lark I looked
it up online. 
&lt;/p&gt;
&lt;p&gt;
It seemed interesting, lots of features too. I downloaded a small .msi file, and it
was running great in seconds on my laptop. Right off the bat, it asked for the URL
to my blog and my credentials. It proceeded to chat with my blog to learn some things
about it; I didn't have to do anything.
&lt;/p&gt;
&lt;p&gt;
Sweet!
&lt;/p&gt;
&lt;p&gt;
Then a window opens and prompts me to enter a blog post. I think I'm going to really
like this. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=6bb85547-6f48-482a-b78c-a13830c61d44" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,6bb85547-6f48-482a-b78c-a13830c61d44.aspx</comments>
      <category>dasBlog</category>
      <category>popart</category>
      <category>software</category>
      <category>blogging</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=19b78088-df12-4ab0-8661-ec39eacb697f</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,19b78088-df12-4ab0-8661-ec39eacb697f.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,19b78088-df12-4ab0-8661-ec39eacb697f.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=19b78088-df12-4ab0-8661-ec39eacb697f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img hspace="14" src="http://www.andrewdothay.net/blog/content/binary/tortoiseupgradefrom135.png" align="left" border="0" />The
other day I fired up TortoiseSVN and it politely informed me that I might enjoy the
latest release.
</p>
        <p>
Hurrah!
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=19b78088-df12-4ab0-8661-ec39eacb697f" />
      </body>
      <title>TortoiseSVN version 1.4.0.7501</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,19b78088-df12-4ab0-8661-ec39eacb697f.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/09/27/TortoiseSVNVersion1407501.aspx</link>
      <pubDate>Wed, 27 Sep 2006 18:54:52 GMT</pubDate>
      <description>&lt;p&gt;
&lt;img hspace=14 src="http://www.andrewdothay.net/blog/content/binary/tortoiseupgradefrom135.png" align=left border=0&gt;The
other day I fired up TortoiseSVN and it politely informed me that I might enjoy the
latest release.
&lt;/p&gt;
&lt;p&gt;
Hurrah!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=19b78088-df12-4ab0-8661-ec39eacb697f" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,19b78088-df12-4ab0-8661-ec39eacb697f.aspx</comments>
      <category>popart</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=41792502-d510-4d76-96ae-600ed25c80fe</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,41792502-d510-4d76-96ae-600ed25c80fe.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,41792502-d510-4d76-96ae-600ed25c80fe.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=41792502-d510-4d76-96ae-600ed25c80fe</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h3>PPPbbbbbfffffttttttt!
</h3>
        <p>
That's my advice to iTunes on that. All I wanted to do last night was do exactly what
I had been doing every couple of nights for the past several weeks: watch another
episode of Battlestar Galactica. Last night was special, it was the very last episode
of Season 2.
</p>
        <p>
I launch iTunes, which takes forever. Then I click the button to buy the (last) episode,
just like any other night. Then I get this crap:
</p>
        <p>
          <img src="http://www.andrewdothay.net/blog/content/binary/itunes-forced-upgrade.png" border="1" />
        </p>
        <p>
They just launched the new version of iTunes yesterday, and they're forcing me to
upgrade my version immediately. On my very next purchase!! What kind of crap is that?
</p>
        <p>
On top of the unplanned time to download and install iTunes and the flippin undesired Quicktime
that's bummin a ride on the iTunes wagon. 
</p>
        <p>
So, a while later, I click on the buy button to purchase the last episode of Battlestar
Galactica with barely enought time to see it before I want to go to bed. All prior
downloads have been acheived in 10 minutes on the high end, usually less. Last night?
A couple of hours...
</p>
        <p>
Pbbbffffttttttt!!!
</p>
        <p>
I hear that some other vendors are joining this marketplace, like Amazon's Unbox.
Glad I'm all caught up on Battlestar, so I can watch Season 3 as it comes out.
</p>
        <p>
Forced upgrades on the day of the new product launch... I'm sure they had some great
technical reason for it, but still...what a load of crap!
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=41792502-d510-4d76-96ae-600ed25c80fe" />
      </body>
      <title>iTunes Forced Upgrade</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,41792502-d510-4d76-96ae-600ed25c80fe.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/09/13/iTunesForcedUpgrade.aspx</link>
      <pubDate>Wed, 13 Sep 2006 14:55:02 GMT</pubDate>
      <description>&lt;h3&gt;PPPbbbbbfffffttttttt!
&lt;/h3&gt;
&lt;p&gt;
That's my advice to iTunes on that. All I wanted to do last night was do exactly what
I had been doing every couple of nights for the past several weeks: watch another
episode of Battlestar Galactica. Last night was special, it was the very last episode
of Season 2.
&lt;/p&gt;
&lt;p&gt;
I launch iTunes, which takes forever. Then I click the button to buy the (last) episode,
just like any other night. Then I get this crap:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.andrewdothay.net/blog/content/binary/itunes-forced-upgrade.png" border=1&gt;
&lt;/p&gt;
&lt;p&gt;
They just launched the new version of iTunes yesterday, and they're forcing me to
upgrade my version immediately. On my very next purchase!! What kind of crap is that?
&lt;/p&gt;
&lt;p&gt;
On top of the unplanned time to download and install iTunes and the flippin undesired&amp;nbsp;Quicktime
that's bummin a ride on the iTunes wagon. 
&lt;/p&gt;
&lt;p&gt;
So, a while later, I click on the buy button to purchase the last episode of Battlestar
Galactica with barely enought time to see it before I want to go to bed. All prior
downloads have been acheived in 10 minutes on the high end, usually less. Last night?
A couple of hours...
&lt;/p&gt;
&lt;p&gt;
Pbbbffffttttttt!!!
&lt;/p&gt;
&lt;p&gt;
I hear that some other vendors are joining this marketplace, like Amazon's Unbox.
Glad I'm all caught up on Battlestar, so I can watch Season 3 as it comes out.
&lt;/p&gt;
&lt;p&gt;
Forced upgrades on the day of the new product launch... I'm sure they had some great
technical reason for it, but still...what a load of crap!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=41792502-d510-4d76-96ae-600ed25c80fe" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,41792502-d510-4d76-96ae-600ed25c80fe.aspx</comments>
      <category>observations</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=83e038fe-adcc-4f16-9bb5-c259ab981279</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,83e038fe-adcc-4f16-9bb5-c259ab981279.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,83e038fe-adcc-4f16-9bb5-c259ab981279.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=83e038fe-adcc-4f16-9bb5-c259ab981279</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The design team was inquiring amongst themselves about the name of the font used on
an image today. It struck me as odd that there's no clear method of identification
for identifying these things. 
</p>
        <p>
Its a file! Sure its an image file, but a computer file none-the-less. Why didn't
the architects of the image file format leave a little room in the file layout
for meta info including the fonts used in the image and any other info that might
have been useful to folks down the line? 
</p>
        <p>
This problem is like looking at a byte stream of an executable and trying
to decipher which program was used to write it so I can safely make a change to it.
If I could just look at the manifest, I'd be good to go!
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=83e038fe-adcc-4f16-9bb5-c259ab981279" />
      </body>
      <title>What The Font?</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,83e038fe-adcc-4f16-9bb5-c259ab981279.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/08/30/WhatTheFont.aspx</link>
      <pubDate>Wed, 30 Aug 2006 16:46:09 GMT</pubDate>
      <description>&lt;p&gt;
The design team was inquiring amongst themselves about the name of the font used on
an image today. It struck me as odd that there's no clear method of identification
for identifying these things. 
&lt;/p&gt;
&lt;p&gt;
Its a file! Sure its an image file, but a computer file none-the-less. Why didn't
the architects of the image file&amp;nbsp;format leave a little room in the file layout
for meta info including the fonts used in the image and any other info that might
have been useful to folks down the line? 
&lt;/p&gt;
&lt;p&gt;
This&amp;nbsp;problem is like&amp;nbsp;looking at a byte stream of an executable and trying
to decipher which program was used to write it so I can safely make a change to it.
If I could just&amp;nbsp;look at the manifest, I'd be good to go!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=83e038fe-adcc-4f16-9bb5-c259ab981279" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,83e038fe-adcc-4f16-9bb5-c259ab981279.aspx</comments>
      <category>observations</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=8e73100d-72c6-480c-85ad-cb4132f07b9d</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,8e73100d-72c6-480c-85ad-cb4132f07b9d.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,8e73100d-72c6-480c-85ad-cb4132f07b9d.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=8e73100d-72c6-480c-85ad-cb4132f07b9d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I had a fairly minor change to some code today that modified the display order
of some reports implemented as unique web user controls that are loaded dynamically
based on which items you select.
</p>
        <p>
I wrote out my plan and before editing any code, then I asked my co-worker, <a href="http://kelly.staging.popart.com">Kelly</a>,
to review it and see if it held water.
</p>
        <p>
Turns out, I sprung a leak. It was such a simple mistake. The code I inherited used
the Session object to store a value and my flawed plan slightly modified the values
in the existing Session object. My plan assumed the web user controls executed
serially, when in fact, I could not guarantee that level of access to the data in
the Session object. 
</p>
        <p>
Sans code review, I would have gone ahead and modified the code, tested it, and (hopefully)
seen the error of my ways before handing it off for final review before deployment.
It would have ran without throwing an error, but not correctly. The peer review saved
a significant amount of time, relative to the overall time spent on the task.
</p>
        <p>
Peer reviews rock. Do them early and often!
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=8e73100d-72c6-480c-85ad-cb4132f07b9d" />
      </body>
      <title>Peer Reviews Rock</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,8e73100d-72c6-480c-85ad-cb4132f07b9d.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/08/10/PeerReviewsRock.aspx</link>
      <pubDate>Thu, 10 Aug 2006 22:57:45 GMT</pubDate>
      <description>&lt;p&gt;
I had a fairly minor change to some code today that&amp;nbsp;modified the display order
of some reports implemented as unique web user controls that are loaded dynamically
based on which items you select.
&lt;/p&gt;
&lt;p&gt;
I wrote out my plan and before editing any code, then I asked my co-worker, &lt;a href="http://kelly.staging.popart.com"&gt;Kelly&lt;/a&gt;,
to review it and see if it held water.
&lt;/p&gt;
&lt;p&gt;
Turns out, I sprung a leak. It was such a simple mistake. The code I inherited used
the Session object to store a value and my flawed plan slightly modified the values
in the existing Session object. My plan assumed the web user controls&amp;nbsp;executed
serially, when in fact, I could not guarantee that level of access to the data in
the Session object. 
&lt;/p&gt;
&lt;p&gt;
Sans code review, I would have gone ahead and modified the code, tested it, and (hopefully)
seen the error of my ways before handing it off for final review before deployment.
It would have ran without throwing an error, but not correctly. The peer review saved
a significant amount of time, relative to the overall time spent on&amp;nbsp;the task.
&lt;/p&gt;
&lt;p&gt;
Peer reviews rock. Do them early and often!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=8e73100d-72c6-480c-85ad-cb4132f07b9d" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,8e73100d-72c6-480c-85ad-cb4132f07b9d.aspx</comments>
      <category>observations</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=70c4aa09-dc40-4ded-8a45-8f6d96f1a02f</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,70c4aa09-dc40-4ded-8a45-8f6d96f1a02f.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,70c4aa09-dc40-4ded-8a45-8f6d96f1a02f.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=70c4aa09-dc40-4ded-8a45-8f6d96f1a02f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A friend from an adjacent firm, <a href="http://www.selytics.com">Selytics</a>, sent
me this <a href="http://support.microsoft.com/default.aspx?scid=915782">support.microsoft.com</a> link
to me the other day with the hopes that it would solve a problem. His turned
out to be a different issue, but after further reading, I wish I read this one a few
weeks ago.
</p>
        <p>
I was working on an ASP.Net 2.0 solution that included some web user controls. I was
periodically getting the error message 
</p>
        <div class="sourcecodeblock">Unable to cast object of type 'ASP.XXXtype' to type 'ASP.XXXtype'.
</div>
        <p>
Where XXXtype was the namespace and class of my web user control. The message
made little sense. There's no conversion. They are the same type on the left and right
sides.
</p>
        <p>
The problem was that a web user control was being dynamically compiled into the same
assembly as the hosting web page and loaded on the fly. It *ought* to work fine, but
was actually failing on occassion.
</p>
        <p>
The link above identifies the issue and the simple bandaid to web.config that
will cease batch compilation, but that's not good for a production environment. Evidently,
there's a patch you can get from Microsoft that will fix this specific issue and it
will be included in an upcoming service pack.
</p>
        <p>
Without that, I was forced to solve the problem by converting my web user controls
into custom server controls; an extra couple of hours that I hadn't planned on consuming
that day. Harumph.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=70c4aa09-dc40-4ded-8a45-8f6d96f1a02f" />
      </body>
      <title>You may receive an InvalidCastException error in an ASP.NET-connected Web application</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,70c4aa09-dc40-4ded-8a45-8f6d96f1a02f.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/08/08/YouMayReceiveAnInvalidCastExceptionErrorInAnASPNETconnectedWebApplication.aspx</link>
      <pubDate>Tue, 08 Aug 2006 20:42:00 GMT</pubDate>
      <description>&lt;p&gt;
A&amp;nbsp;friend from an adjacent firm, &lt;a href="http://www.selytics.com"&gt;Selytics&lt;/a&gt;,&amp;nbsp;sent
me&amp;nbsp;this &lt;a href="http://support.microsoft.com/default.aspx?scid=915782"&gt;support.microsoft.com&lt;/a&gt; link
to me the other day with the hopes that it would solve a problem.&amp;nbsp;His turned
out to be a different issue, but after further reading, I wish I read this one a few
weeks ago.
&lt;/p&gt;
&lt;p&gt;
I was working on an ASP.Net 2.0 solution that included some web user controls. I was
periodically getting the error message 
&lt;/p&gt;
&lt;div class=sourcecodeblock&gt;Unable to cast object of type 'ASP.XXXtype' to type 'ASP.XXXtype'.
&lt;/div&gt;
&lt;p&gt;
Where XXXtype was the&amp;nbsp;namespace and class&amp;nbsp;of my web user control. The message
made little sense. There's no conversion. They are the same type on the left and right
sides.
&lt;/p&gt;
&lt;p&gt;
The problem was that a web user control was being dynamically compiled into the same
assembly as the hosting web page and loaded on the fly. It *ought* to work fine, but
was actually failing on occassion.
&lt;/p&gt;
&lt;p&gt;
The link above identifies the issue and the simple&amp;nbsp;bandaid to web.config that
will cease batch compilation, but that's not good for a production environment. Evidently,
there's a patch you can get from Microsoft that will fix this specific issue and it
will be included in an upcoming service pack.
&lt;/p&gt;
&lt;p&gt;
Without that, I was forced to solve the problem by converting my web user controls
into custom server controls; an extra couple of hours that I hadn't planned on consuming
that day. Harumph.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=70c4aa09-dc40-4ded-8a45-8f6d96f1a02f" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,70c4aa09-dc40-4ded-8a45-8f6d96f1a02f.aspx</comments>
      <category>asp.net</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=46a9fab4-946b-42b6-933b-5eb8707a8292</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,46a9fab4-946b-42b6-933b-5eb8707a8292.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,46a9fab4-946b-42b6-933b-5eb8707a8292.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=46a9fab4-946b-42b6-933b-5eb8707a8292</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
And the last presentation of the day, <a href="http://atlas.asp.net/">ATLAS</a>! 
</p>
        <p>
The best part of this was getting to meet <a href="http://andrew.staging.popart.com/www.west-wind.com">Rick
Strahl</a>. I'm reasonably familiar with the material and it got the normal gasps
and as usual, it got bogged down by questions from the audience. The room was
packed and about five or ten people had to stand in the back. When the meeting started
getting bogged down with questions, I fired up a new print cycle of my <a href="http://safari.oreilly.com/0596526725">ATLAS
Rough Cuts</a> on Safari Books Online. It might be done printing by now, maybe I should
got back to the site and check.
</p>
        <p>
Rick only made it through about half of his content. He's a great presenter and has
some cool ideas. My friend, <a href="http://kelly.staging.popart.com/">Kelly</a>,
has been reading his blog and now I'm on board. The website has an interesting <a href="http://west-wind.com/westwindwebstore/">e-commerce
package</a> for sale. I'm going to check that out in a few weeks. He was using <a href="http://andrew.staging.popart.com/2006/07/12/FiddlerRocks.aspx">Fiddler</a> to
watch traffic for his AJAX code. I got a few ideas on things to look at in Fiddler
just by watching him use the tool. 
</p>
        <p>
This was a great code camp. Too bad the sprinklers came on and doused the audio equipment.
Its was pretty damn hot and my folf skills are definitely better in my head than in
the field. Maybe its just that crazy disc. I think I could throw better with a normal
disc until I earn my green belt and need a driver and a putter in my line up.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=46a9fab4-946b-42b6-933b-5eb8707a8292" />
      </body>
      <title>Code Camp - Taking ATLAS for a Ride</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,46a9fab4-946b-42b6-933b-5eb8707a8292.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/07/24/CodeCampTakingATLASForARide.aspx</link>
      <pubDate>Mon, 24 Jul 2006 15:33:16 GMT</pubDate>
      <description>&lt;p&gt;
And the last presentation of the day, &lt;a href="http://atlas.asp.net/"&gt;ATLAS&lt;/a&gt;! 
&lt;/p&gt;
&lt;p&gt;
The best part of this was getting to meet &lt;a href="http://andrew.staging.popart.com/www.west-wind.com"&gt;Rick
Strahl&lt;/a&gt;. I'm reasonably familiar with the material and it got the normal gasps
and as usual, it got bogged down by questions from the audience.&amp;nbsp;The room was
packed and about five or ten people had to stand in the back. When the meeting started
getting bogged down with questions, I fired up a new print cycle of my &lt;a href="http://safari.oreilly.com/0596526725"&gt;ATLAS
Rough Cuts&lt;/a&gt; on Safari Books Online. It might be done printing by now, maybe I should
got back to the site and check.
&lt;/p&gt;
&lt;p&gt;
Rick only made it through about half of his content. He's&amp;nbsp;a great presenter and&amp;nbsp;has
some cool ideas. My friend, &lt;a href="http://kelly.staging.popart.com/"&gt;Kelly&lt;/a&gt;,
has been reading his blog and now I'm on board. The website has an interesting &lt;a href="http://west-wind.com/westwindwebstore/"&gt;e-commerce
package&lt;/a&gt; for sale. I'm going to check that out in a few weeks. He was using &lt;a href="http://andrew.staging.popart.com/2006/07/12/FiddlerRocks.aspx"&gt;Fiddler&lt;/a&gt; to
watch traffic&amp;nbsp;for his AJAX code. I got a few ideas on things to look at in Fiddler
just by watching him use the tool. 
&lt;/p&gt;
&lt;p&gt;
This was a great code camp. Too bad the sprinklers came on and doused the audio equipment.
Its was pretty damn hot and my folf skills are definitely better in my head than in
the field. Maybe its just that crazy disc. I think I could throw better with a normal
disc until I earn my green belt and need a driver and a putter in my line up.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=46a9fab4-946b-42b6-933b-5eb8707a8292" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,46a9fab4-946b-42b6-933b-5eb8707a8292.aspx</comments>
      <category>asp.net</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=9e2c79db-e274-4e8c-a0b2-d35ef27d6f0f</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,9e2c79db-e274-4e8c-a0b2-d35ef27d6f0f.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,9e2c79db-e274-4e8c-a0b2-d35ef27d6f0f.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=9e2c79db-e274-4e8c-a0b2-d35ef27d6f0f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h3>Presented by Stuart Celarier
</h3>
        <p>
I planned on attending the <a href="http://subversion.tigris.org/">Subversion</a> talk
as a brush up on what I already felt fairly comfortable with. It turned out to be
the best session I attended at the entire conference. There's just something about
learning new things that rocks!
</p>
        <p>
Stuart presented the foundations of Subversion and how it differs from <a href="http://en.wikipedia.org/wiki/Concurrent_Versions_System">CVS</a>.
Corillian runs Subversion on Win2K3 server with Apache, where SVN executes as Apache
module. This exposes SVN over the http:// protocol. We run SVN as a Windows service,
so its exposed over the svn:// protocol. I'm not sure if we're missing out on anything
here. I can get to my source code repository remotely or in the office; the protocol
hasn't mattered to me yet.
</p>
        <p>
So I learned some huge things about SVN, and a few tiny things:
</p>
        <p>
          <strong>Huge Thing #1: SVN tracks file name changes</strong>
        </p>
        <p>
So, if I need to change the name of a file, or even move a file, SVN will keep working
just fine. It handles that event just fine. CVS would loose all of its history for
a file if you moved it. There were even some gasps in the audience.
</p>
        <p>
          <strong>Huge Thing #2: SVN has ACID transaction semantics</strong>
        </p>
        <p>
That's right, its atomic! If you commit ten files, and the ninth commit fails due
to a merge conflict, then they all roll back. This has implications for continuous
integration too. You don't want your build to kick off before all of your files are
checked in, or if the checkin bombs and only part of your code makes it into the repository. 
</p>
        <p>
          <strong>Tiny Thing #1: Branching and Tagging are cool</strong>
        </p>
        <p>
A branch is a copy of the code base that you intend to modify. A tag is a copy of
the code that you do not intend to change. You just tag it to place a reference to
a state of the code at a given point in time. SVN doesn't care if you think its a
branch or just tagged, it does the same thing; make a copy.
</p>
        <p>
The copy is physically just a map of the changes. Its not a physical copy of all the
files. That makes for much less work. You can branch locally and create a new path
of code or you can branch remotely on the SVN server. That was a handy little tip.
</p>
        <p>
Stuart walked the group through a nice example of branching some code, making changes,
merging it with the trunk, continuing to modify it, then doing a final merge with
the code to close out the branch. It can still get mind boggling at times, but the
feature is so cool, I might have to find a T-Shirt for it on Wireless or something.
</p>
        <p>
          <strong>Tiny Thing #2: Hook scripts</strong>
        </p>
        <p>
Hook scripts are little bits of code that you can execute before a transaction commits.
It might send an email or inspect the work to commit for business rules. 
</p>
        <p>
          <strong>Tiny Thing #3: _svn folder contents</strong>
        </p>
        <p>
The _svn folder contains a pristine copy of the files in a given folder. This is what
lets you checkout a project, get on an airplane, make changes to the file, groan in
dispair at your bad idea, and simply revert back to the original. You don't need direct
access to SVN to revert your changes. Of course, this means that your local copy is
twice as big as the project files because you have physical duplicates of everything.
</p>
        <p>
Stuart also recommended a white paper called Stringed Lines presented at Pattern Languages
of Programming (PLoP) in '98. It describes patterns of branching and merging. I haven't
been able to find an online reference yet.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=9e2c79db-e274-4e8c-a0b2-d35ef27d6f0f" />
      </body>
      <title>Code Camp - Understanding Subversion</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,9e2c79db-e274-4e8c-a0b2-d35ef27d6f0f.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/07/24/CodeCampUnderstandingSubversion.aspx</link>
      <pubDate>Mon, 24 Jul 2006 15:18:21 GMT</pubDate>
      <description>&lt;h3&gt;Presented by Stuart Celarier
&lt;/h3&gt;
&lt;p&gt;
I planned on attending the &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; talk
as a brush up on what I already felt fairly comfortable with. It turned out to be
the best session I attended at the entire conference. There's just something about
learning new things that rocks!
&lt;/p&gt;
&lt;p&gt;
Stuart presented the foundations of Subversion and how it differs from &lt;a href="http://en.wikipedia.org/wiki/Concurrent_Versions_System"&gt;CVS&lt;/a&gt;.
Corillian runs Subversion on Win2K3 server with Apache, where SVN executes as Apache
module. This exposes SVN over the http:// protocol. We run SVN as a Windows service,
so its exposed over the svn:// protocol. I'm not sure if we're missing out on anything
here. I can get to my source code repository remotely or in the office; the protocol
hasn't mattered to me yet.
&lt;/p&gt;
&lt;p&gt;
So I learned some huge things about SVN, and a few tiny things:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Huge Thing #1: SVN tracks file name changes&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
So, if I need to change the name of a file, or even move a file, SVN will keep working
just fine. It handles that event just fine. CVS would loose all of its history for
a file if you moved it. There were even some gasps in the audience.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Huge Thing #2: SVN has ACID transaction semantics&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
That's right, its atomic! If you commit ten files, and the ninth commit fails due
to a merge conflict, then they all roll back. This has implications for continuous
integration too. You don't want your build to kick off before all of your files are
checked in, or if the checkin bombs and only part of your code makes it into the repository. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Tiny Thing #1: Branching and Tagging are cool&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
A branch is a copy of the code base that you intend to modify. A tag is a copy of
the code that you do not intend to change. You just tag it to place a reference to
a state of the code at a given point in time. SVN doesn't care if you think its a
branch or just tagged, it does the same thing; make a copy.
&lt;/p&gt;
&lt;p&gt;
The copy is physically just a map of the changes. Its not a physical copy of all the
files. That makes for much less work. You can branch locally and create a new path
of code or you can branch remotely on the SVN server. That was a handy little tip.
&lt;/p&gt;
&lt;p&gt;
Stuart walked the group through a nice example of branching some code, making changes,
merging it with the trunk, continuing to modify it, then doing a final merge with
the code to close out the branch. It can still get mind boggling at times, but the
feature is so cool, I might have to find a T-Shirt for it on Wireless or something.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Tiny Thing #2: Hook scripts&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Hook scripts are little bits of code that you can execute before a transaction commits.
It might send an email or inspect the work to commit for business rules. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Tiny Thing #3: _svn folder contents&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The _svn folder contains a pristine copy of the files in a given folder. This is what
lets you checkout a project, get on an airplane, make changes to the file, groan in
dispair at your bad idea, and simply revert back to the original. You don't need direct
access to SVN to revert your changes. Of course, this means that your local copy is
twice as big as the project files because you have physical duplicates of everything.
&lt;/p&gt;
&lt;p&gt;
Stuart also recommended a white paper called Stringed Lines presented at Pattern Languages
of Programming (PLoP) in '98. It describes patterns of branching and merging. I haven't
been able to find an online reference yet.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=9e2c79db-e274-4e8c-a0b2-d35ef27d6f0f" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,9e2c79db-e274-4e8c-a0b2-d35ef27d6f0f.aspx</comments>
      <category>learning</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=80f3c15b-c4d4-4ccb-a01c-2b61add299f8</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,80f3c15b-c4d4-4ccb-a01c-2b61add299f8.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,80f3c15b-c4d4-4ccb-a01c-2b61add299f8.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=80f3c15b-c4d4-4ccb-a01c-2b61add299f8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h3>Presented by Ashu Potnis
</h3>
        <p>
Ashu works for <a href="http://www.technosolutions.com">TechnoSolutions</a> which
offers use case modeling software in its product line. So, he was well versed in the
subject matter and did a good job of walking the line between presenting the topic
while not hanging out his shingle for his product. 
</p>
        <p>
He walked the group through the basics of use cases, the situations that they serve
best, and how to build a sample use case for an ATM machine. I remember working with
use case modeling software back in college (mid 90's) and it stunk. Clunky and slow.
It was interesting to see it fresh, running on the .Net platform in all of its glory. 
</p>
        <p>
The refresher was nice. Not too much in the OMG category, but good to see. During
the presentation, Ashu made a point of how the traditional software requirements specification
was long, boring and difficult to read. Use cases were better for everyone on the
team, regardless of background. When we completed the exercise, I thought back over
all of the documentation that we had created and how complex it became with all of
the alternative paths and exception cases. I don't think there is a "simple" way to
explain a complex problem. Software that costs a lot of money and consumes a lot of
hours just can't be explained sufficiently on one sheet of paper, 12 point font. Its
going to take stacks and stacks of paper and a keen eye to sift through the documents
to make sure each party is getting what they want. No way around it.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=80f3c15b-c4d4-4ccb-a01c-2b61add299f8" />
      </body>
      <title>Code Camp - Better Requirements Definition with Use Cases</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,80f3c15b-c4d4-4ccb-a01c-2b61add299f8.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/07/23/CodeCampBetterRequirementsDefinitionWithUseCases.aspx</link>
      <pubDate>Sun, 23 Jul 2006 17:38:46 GMT</pubDate>
      <description>&lt;h3&gt;Presented by Ashu Potnis
&lt;/h3&gt;
&lt;p&gt;
Ashu works for &lt;a href="http://www.technosolutions.com"&gt;TechnoSolutions&lt;/a&gt; which
offers use case modeling software in its product line. So, he was well versed in the
subject matter and did a good job of walking the line between presenting the topic
while not hanging out his shingle for his product. 
&lt;/p&gt;
&lt;p&gt;
He walked the group through the basics of use cases, the situations that they serve
best, and how to build a sample use case for an ATM machine. I remember working with
use case modeling software back in college (mid 90's) and it stunk. Clunky and slow.
It was interesting to see it fresh, running on the .Net platform in all of its glory. 
&lt;/p&gt;
&lt;p&gt;
The refresher was nice. Not too much in the OMG category, but good to see. During
the presentation, Ashu made a point of how the traditional software requirements specification
was long, boring and difficult to read. Use cases were better for everyone on the
team, regardless of background. When we completed the exercise, I thought back over
all of the documentation that we had created and how complex it became with all of
the alternative paths and exception cases. I don't think there is a "simple" way to
explain a complex problem. Software that costs a lot of money and consumes a lot of
hours just can't be explained sufficiently on one sheet of paper, 12 point font. Its
going to take stacks and stacks of paper and a keen eye to sift through the documents
to make sure each party is getting what they want. No way around it.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=80f3c15b-c4d4-4ccb-a01c-2b61add299f8" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,80f3c15b-c4d4-4ccb-a01c-2b61add299f8.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=a95f842b-50a0-4f0a-afc3-c89df19280ca</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,a95f842b-50a0-4f0a-afc3-c89df19280ca.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,a95f842b-50a0-4f0a-afc3-c89df19280ca.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=a95f842b-50a0-4f0a-afc3-c89df19280ca</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The Washington State University, Vancouver Campus is gorgeous. From the center of
the quad, Mt. St. Helen's is centered between a water fountain. If you turn 90 degrees,
Mt. Hood is centered to the east. It was so deliberate and beautiful, it could have
been a martial arts campus in Tibet.
</p>
        <p>
There are 40 sessions, and I only get to choose five. I hope I picked the right lectures!
</p>
        <h2>Session 1: .Net Refactoring 
</h2>
        <h3>Presented by <a href="http://weblogs.asp.net/wallen">Wayne Allen</a></h3>
        <p>
After a tough battle with the in-room projector, Woody rounded up a dandy little In-Focus
projector and we got so see the material. Wayne discussed what refactoring is, and
is not. There are several refactoring tools in the market place:
</p>
        <ul>
          <li>
DevExpress Refactor</li>
          <li>
Resharper</li>
          <li>
.Net Refactor</li>
          <li>
Code Explorer</li>
        </ul>
        <p>
Martin Fowler has a great website, <a href="http://refactoring.com/">http://refactoring.com/</a>,
that has some great resources. The book Refactoring to Patterns describes some concepts
for refactoring in a methodical manner. There are well over 50 types of refactoring
techniques like Remove Man In the Middle, Method Extraction, Introduce Null Object,
and Split Loop. They describe patterns of solving common problems in code.
</p>
        <p>
Here are some common problems that occur around refactoring:
</p>
        <ol>
          <li>
Not doing it enough (do it all time, its not a sprint item, code hygiene)</li>
          <li>
Refactoring in batches</li>
          <li>
Refactoring for "fun"</li>
          <li>
Meaningless style changes (m_Var vs _var vs. var)</li>
          <li>
Lack of tests</li>
          <li>
Shared Libraries (changing public members used by other software)</li>
        </ol>
        <p>
 
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=a95f842b-50a0-4f0a-afc3-c89df19280ca" />
      </body>
      <title>Code Camp - .Net Refactoring</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,a95f842b-50a0-4f0a-afc3-c89df19280ca.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/07/22/CodeCampNetRefactoring.aspx</link>
      <pubDate>Sat, 22 Jul 2006 20:39:34 GMT</pubDate>
      <description>&lt;p&gt;
The Washington State University, Vancouver Campus is gorgeous. From the center of
the quad, Mt. St. Helen's is centered between a water fountain. If you turn 90 degrees,
Mt. Hood is centered to the east. It was so deliberate and beautiful, it could have
been a martial arts campus in Tibet.
&lt;/p&gt;
&lt;p&gt;
There are 40 sessions, and I only get to choose five. I hope I picked the right lectures!
&lt;/p&gt;
&lt;h2&gt;Session 1: .Net Refactoring 
&lt;/h2&gt;
&lt;h3&gt;Presented by &lt;a href="http://weblogs.asp.net/wallen"&gt;Wayne Allen&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;
After a tough battle with the in-room projector, Woody rounded up a dandy little In-Focus
projector and we got so see the material. Wayne discussed what refactoring is, and
is not. There are several refactoring tools in the market place:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
DevExpress Refactor&lt;/li&gt;
&lt;li&gt;
Resharper&lt;/li&gt;
&lt;li&gt;
.Net Refactor&lt;/li&gt;
&lt;li&gt;
Code Explorer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Martin Fowler has a great website, &lt;a href="http://refactoring.com/"&gt;http://refactoring.com/&lt;/a&gt;,
that has some great resources. The book Refactoring to Patterns describes some concepts
for refactoring in a methodical manner. There are well over 50 types of refactoring
techniques like Remove Man In the Middle, Method Extraction, Introduce Null Object,
and Split Loop. They describe patterns of solving common problems in code.
&lt;/p&gt;
&lt;p&gt;
Here are some common problems that occur around refactoring:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Not doing it enough (do it all time, its not a sprint item, code hygiene)&lt;/li&gt;
&lt;li&gt;
Refactoring in batches&lt;/li&gt;
&lt;li&gt;
Refactoring for "fun"&lt;/li&gt;
&lt;li&gt;
Meaningless style changes (m_Var vs _var vs. var)&lt;/li&gt;
&lt;li&gt;
Lack of tests&lt;/li&gt;
&lt;li&gt;
Shared Libraries (changing public members used by other software)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=a95f842b-50a0-4f0a-afc3-c89df19280ca" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,a95f842b-50a0-4f0a-afc3-c89df19280ca.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=24bd2441-bb20-43a5-9957-e6d5834d851c</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,24bd2441-bb20-43a5-9957-e6d5834d851c.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,24bd2441-bb20-43a5-9957-e6d5834d851c.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=24bd2441-bb20-43a5-9957-e6d5834d851c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.cauldwell.net/patrick/blog/PermaLink,guid,a78d9178-e374-43a3-84b2-c67fc6f4aa93.aspx">Patrick
Caldwell commented</a> on a VS.Net add-in for using SVN inside VS.Net, its called <a href="http://ankhsvn.tigris.org/">AnkhSVN</a>.
</p>
        <p>
Coincidentally, I was reading the doc on AnkhSVN the other day and decided to pass
on it since the last stable release was 2004 and there are recent beta "snapshots"
available for VS.Net 2005. It seemed a little too raw for me and I was perfectly
happy to use the TortoiseSVN client.
</p>
        <p>
Now, after reading Patrick's post, I'll reconsider. He's a pretty good endorsement.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=24bd2441-bb20-43a5-9957-e6d5834d851c" />
      </body>
      <title>AnkhSVN Is a Go</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,24bd2441-bb20-43a5-9957-e6d5834d851c.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/07/14/AnkhSVNIsAGo.aspx</link>
      <pubDate>Fri, 14 Jul 2006 18:20:56 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.cauldwell.net/patrick/blog/PermaLink,guid,a78d9178-e374-43a3-84b2-c67fc6f4aa93.aspx"&gt;Patrick
Caldwell commented&lt;/a&gt; on a VS.Net add-in for using SVN inside VS.Net, its called &lt;a href="http://ankhsvn.tigris.org/"&gt;AnkhSVN&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Coincidentally, I was reading the doc on AnkhSVN the other day and decided to pass
on it since the last stable release was 2004 and there are recent beta "snapshots"
available for VS.Net 2005. It seemed a little too raw for me and I was&amp;nbsp;perfectly
happy to use the TortoiseSVN client.
&lt;/p&gt;
&lt;p&gt;
Now, after reading Patrick's post, I'll reconsider.&amp;nbsp;He's a pretty good endorsement.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=24bd2441-bb20-43a5-9957-e6d5834d851c" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,24bd2441-bb20-43a5-9957-e6d5834d851c.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=d1b85429-a76e-452a-89df-b174bce24c76</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,d1b85429-a76e-452a-89df-b174bce24c76.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,d1b85429-a76e-452a-89df-b174bce24c76.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d1b85429-a76e-452a-89df-b174bce24c76</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <img align="left" hspace="6" vspace="6" alt="Fiddler" src="http://andrew.staging.popart.com/content/binary/fiddler.png" border="1" />
        <p>
So, I was reading the <a href="http://blogs.telerik.com/blogs/valentin_stoychev/archive/2006/05/17/224.aspx">Telerik
blog post</a> and they discussed how to work around a specific issue with <a href="http://www.fiddlertool.com">Fiddler</a>.
</p>
        <p>
The problem is that Fiddler was not recording traffic when working locally with IE7.
The browser is configured to disallow proxies when working locally. The way around
this issue is to call your machine by its name instead of localhost. 
</p>
        <p>
Fiddler is a utility that you can use to inspect HTTP traffic between your browser
and the server. It's a nice tool. 
</p>
        <p>
Here's a few screen shots. You basically install the utility, then click the button
it creates in your browser to launch it. From there on, it will log the traffic between
your browser and whatever web server you're hitting. Good stuff. If you don't have
an HTTP monitor utility, try this one.
</p>
        <p>
          <b>The left side of the window shows one line for each HTTP request</b>
        </p>
        <p>
          <img src="http://andrew.staging.popart.com/content/binary/fiddler-left.png" border="1" />
        </p>
        <p>
          <b>The right side of the window shows the details for a selected row on the left</b>
        </p>
        <p>
          <img src="http://andrew.staging.popart.com/content/binary/fiddler-right.png" border="1" />
        </p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=d1b85429-a76e-452a-89df-b174bce24c76" />
      </body>
      <title>Fiddler Rocks</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,d1b85429-a76e-452a-89df-b174bce24c76.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/07/12/FiddlerRocks.aspx</link>
      <pubDate>Wed, 12 Jul 2006 21:18:57 GMT</pubDate>
      <description>&lt;img align="left" hspace="6" vspace="6" alt=Fiddler src="http://andrew.staging.popart.com/content/binary/fiddler.png" border=1&gt; 
&lt;p&gt;
So, I was reading the &lt;a href="http://blogs.telerik.com/blogs/valentin_stoychev/archive/2006/05/17/224.aspx"&gt;Telerik
blog post&lt;/a&gt; and they discussed how to work around a specific issue with &lt;a href="http://www.fiddlertool.com"&gt;Fiddler&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
The problem is that Fiddler was not recording traffic when working locally with IE7.
The browser is configured to disallow proxies when working locally. The way around
this issue is to call your machine by its name instead of localhost. 
&lt;/p&gt;
&lt;p&gt;
Fiddler is a utility that you can use to inspect HTTP traffic between your browser
and the server. It's a nice tool. 
&lt;/p&gt;
&lt;p&gt;
Here's a few screen shots. You basically install the utility, then click the button
it creates in your browser to launch it. From there on, it will log the traffic between
your browser and whatever web server you're hitting. Good stuff. If you don't have
an HTTP monitor utility, try this one.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;The left side of the window shows one line for each HTTP request&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://andrew.staging.popart.com/content/binary/fiddler-left.png" border=1&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;The right side of the window shows the details for a selected row on the left&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://andrew.staging.popart.com/content/binary/fiddler-right.png" border=1&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=d1b85429-a76e-452a-89df-b174bce24c76" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,d1b85429-a76e-452a-89df-b174bce24c76.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=2d2b144b-fcb1-4455-850a-fb976a68afda</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,2d2b144b-fcb1-4455-850a-fb976a68afda.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,2d2b144b-fcb1-4455-850a-fb976a68afda.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=2d2b144b-fcb1-4455-850a-fb976a68afda</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <img style="WIDTH: 112px; HEIGHT: 196px" alt="Getty Up!" hspace="14" src="http://andrew.staging.popart.com/content/binary/jake2.png" align="left" border="1" />
        <p>
          <em>
            <font color="#0000ff">7/1/2006 - Partial Retraction: Ok, so after testing this
on IIS (I was using Cassini when I learned about it) its a little less cool than I
originally thought. You still need to add the file extension to the list in IIS
so it knows which program is handling requests for the given file type. That's a little
less cool. Stinky for sites where you only have FTP access and not direct control
of IIS. The concept worked with Cassini because its all about .Net, all
files seem to go up through the .Net handler. It looked a little funny running trace.axd
and seeing requests for image files register in the trace utility.
I guess that should have been my first clue.</font>
          </em>
        </p>
        <p>
I unearthed a real gem today. Our web standards movement has made our CSS files much
more sophisticated. We're reaping the benefits of simple XHTML markup, flexible
designs and everything else the web standards movement is enamored about.
</p>
        <p>
There's always been this nagging problem of relative paths to image files in the CSS,
javascript files or anything else that isn't really executed on the server before
its rendered to the browser. The problem comes in when a web site is developed locally,
which means it has an application name in its path. When the site is migrated to the
staging or production server, the application name is gone. The following URLs point
to the same file, depending on which environment you're working in:
</p>
        <p>
Local Development Environment:<br />
"<a href="http://localhost:1978/web/images/gobbler.png">http://localhost:1978/web/images/gobbler.png</a>"
</p>
        <p>
Staging or Production Environment:<br />
"<a href="http://www.company.com/images/gobbler.png">http://www.company.com/images/gobbler.png</a>"
</p>
        <p>
These can be referred to as "absolute" paths. Note, everthing before the forward slash
in front of "images" will depend on the environment.
</p>
        <p>
So here in lies the rub:
</p>
        <p>
The CSS file(s) will often contain references to background images. They can reference
the images using a relative path. Relative paths use the double period ("..") syntax
to reference the parent folder and thus identify the path "relative" to the current
location:
</p>
        <p>
"../../images/gobbler.png"
</p>
        <p>
That can be referred to as a "relative" path. 
</p>
        <p>
The problem comes in when two web pages use the same CSS file(s) and they're in different
folders. Suppose one page is in the root folder of the web site and the other page
is three folders down from the root. They would have to use different "relative" paths
to reach the same file, right?
</p>
        <p>
ASP.Net 2.0 to the rescue!
</p>
        <p>
Now, we could always just write an .aspx file that contains the normal CSS content
and embed server side code that conditionally renders the application name before
all file references to make them "absolute" paths.
</p>
        <p>
The issue with this approach is that your web page uses the &lt;link&gt; tag to reference
the .aspx page like this:
</p>
        <p>
&lt;link rel="stylesheet" type="text/css" href="/css/print.aspx" /&gt;
</p>
        <p>
I've been told that some browsers won't treat this reference exactly the same as one
with a .css extension, so they always download the file instead of caching it. I don't
know this to be exactly true, but this gem I describe below solves that problem, so
everyone is happy.
</p>
        <p>
Here's how ASP.Net 2.0 can be configured to use server side code inside .css
files and dynamically insert the application name:
</p>
        <ol>
          <li>
Open web.config in a text editor<br /><ol><li>
Add an entry to &lt;buildProviders&gt; that tells ASP.Net which build provider to
use:<br /><pre>&lt;system.web&gt;
   &lt;compilation debug="false"&gt;
      &lt;buildProviders&gt;
         &lt;add type="System.Web.Compilation.PageBuildProvider" extension=".css" /&gt;
       &lt;/buildProviders&gt;
   &lt;/compilation&gt;
&lt;/system.web&gt;
</pre><br /></li><li>
Add an entry to &lt;httpHandlers&gt; that tells ASP.Net which factory to use:<br /><pre>&lt;httpHandlers&gt;
   &lt;add type="System.Web.UI.PageHandlerFactory" validate="true" path="*.css" verb="GET" /&gt;
&lt;/httpHandlers&gt;
</pre><br /></li></ol></li>
          <li>
Open you CSS files in a text editor<br /><ol><li>
In the first line of each CSS file, set the content type:<br /><pre>&lt;%@ ContentType="text/css" %&gt;
</pre><br /></li><li>
Add the application path before each file reference in the CSS file<br /><pre>background-image:url&lt;%= Request.ApplicationPath %&gt;/images/gobbler.png");
</pre><br /></li></ol></li>
        </ol>
        <p>
Now you can easily move from your development environment to your staging environment
without fear of breaking your image paths. Files in various levels of the directory
structure can use the same reference because everything has a path that begins at
the root. No more ".." syntax headaches. I love it!
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=2d2b144b-fcb1-4455-850a-fb976a68afda" />
      </body>
      <title>CSS files with background images (partially retracted)</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,2d2b144b-fcb1-4455-850a-fb976a68afda.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/06/09/CSSFilesWithBackgroundImagesPartiallyRetracted.aspx</link>
      <pubDate>Fri, 09 Jun 2006 00:41:25 GMT</pubDate>
      <description>&lt;img style="WIDTH: 112px; HEIGHT: 196px" alt="Getty Up!" hspace=14 src="http://andrew.staging.popart.com/content/binary/jake2.png" align=left border=1&gt; 
&lt;p&gt;
&lt;em&gt;&lt;font color=#0000ff&gt;7/1/2006 - Partial Retraction: Ok, so after testing this on
IIS (I was using Cassini when I learned about it) its a little less cool than I originally
thought. You still need to add the file extension to the&amp;nbsp;list in IIS so it knows
which program is handling requests for the given file type. That's a little less cool.
Stinky for sites where you only have FTP access and not direct control of IIS.&amp;nbsp;The
concept&amp;nbsp;worked with Cassini because its all about .Net, all files seem to go
up through the .Net handler. It looked a little funny running trace.axd and&amp;nbsp;seeing
requests&amp;nbsp;for&amp;nbsp;image files register in the trace utility. I guess that should
have been my first clue.&lt;/font&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
I unearthed a real gem today. Our web standards movement has made our CSS files much
more sophisticated. We're reaping the benefits of&amp;nbsp;simple XHTML markup, flexible
designs and everything else the web standards movement is enamored about.
&lt;/p&gt;
&lt;p&gt;
There's always been this nagging problem of relative paths to image files in the CSS,
javascript files or anything else that isn't really executed on the server before
its rendered to the browser. The problem comes in when a web site is developed locally,
which means it has an application name in its path. When the site is migrated to the
staging or production server, the application name is gone. The following URLs point
to the same file, depending on which environment you're working in:
&lt;/p&gt;
&lt;p&gt;
Local Development Environment:&lt;br&gt;
"&lt;a href="http://localhost:1978/web/images/gobbler.png"&gt;http://localhost:1978/web/images/gobbler.png&lt;/a&gt;"
&lt;/p&gt;
&lt;p&gt;
Staging or Production Environment:&lt;br&gt;
"&lt;a href="http://www.company.com/images/gobbler.png"&gt;http://www.company.com/images/gobbler.png&lt;/a&gt;"
&lt;/p&gt;
&lt;p&gt;
These can be referred to as "absolute" paths. Note, everthing before the forward slash
in front of "images" will depend on the environment.
&lt;/p&gt;
&lt;p&gt;
So here in lies the rub:
&lt;/p&gt;
&lt;p&gt;
The CSS file(s) will often contain references to background images. They can reference
the images using a relative path. Relative paths use the double period ("..") syntax
to reference the parent folder and thus identify the path "relative" to the current
location:
&lt;/p&gt;
&lt;p&gt;
"../../images/gobbler.png"
&lt;/p&gt;
&lt;p&gt;
That can be referred to as a "relative" path. 
&lt;/p&gt;
&lt;p&gt;
The problem comes in when two web pages use the same CSS file(s) and they're in different
folders. Suppose one page is in the root folder of the web site and the other page
is three folders down from the root. They would have to use different "relative" paths
to reach the same file, right?
&lt;/p&gt;
&lt;p&gt;
ASP.Net 2.0 to the rescue!
&lt;/p&gt;
&lt;p&gt;
Now, we could always just write an .aspx file that contains the normal CSS content
and embed server side code that conditionally renders the application name before
all file references to make them "absolute" paths.
&lt;/p&gt;
&lt;p&gt;
The issue with this approach is that your web page uses the &amp;lt;link&amp;gt; tag to reference
the .aspx page like this:
&lt;/p&gt;
&lt;p&gt;
&amp;lt;link rel="stylesheet" type="text/css" href="/css/print.aspx" /&amp;gt;
&lt;/p&gt;
&lt;p&gt;
I've been told that some browsers won't treat this reference exactly the same as one
with a .css extension, so they always download the file instead of caching it. I don't
know this to be exactly true, but this gem I describe below solves that problem, so
everyone is happy.
&lt;/p&gt;
&lt;p&gt;
Here's&amp;nbsp;how ASP.Net 2.0 can be configured to use server side code inside .css
files&amp;nbsp;and dynamically insert the application name:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Open web.config in a text editor&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;
Add an entry to &amp;lt;buildProviders&amp;gt; that tells ASP.Net which build provider to
use:&lt;br&gt;
&lt;pre&gt;&amp;lt;system.web&amp;gt;
   &amp;lt;compilation debug="false"&amp;gt;
      &amp;lt;buildProviders&amp;gt;
         &amp;lt;add type="System.Web.Compilation.PageBuildProvider" extension=".css" /&amp;gt;
       &amp;lt;/buildProviders&amp;gt;
   &amp;lt;/compilation&amp;gt;
&amp;lt;/system.web&amp;gt;
&lt;/pre&gt;
&lt;br&gt;
&lt;li&gt;
Add an entry to &amp;lt;httpHandlers&amp;gt; that tells ASP.Net which factory to use:&lt;br&gt;
&lt;pre&gt;&amp;lt;httpHandlers&amp;gt;
   &amp;lt;add type="System.Web.UI.PageHandlerFactory" validate="true" path="*.css" verb="GET" /&amp;gt;
&amp;lt;/httpHandlers&amp;gt;
&lt;/pre&gt;
&lt;br&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;
Open you CSS files in a text editor&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;
In the first line of each CSS file, set the content type:&lt;br&gt;
&lt;pre&gt;&amp;lt;%@ ContentType="text/css" %&amp;gt;
&lt;/pre&gt;
&lt;br&gt;
&lt;li&gt;
Add the application path before each file reference in the CSS file&lt;br&gt;
&lt;pre&gt;background-image:url&amp;lt;%= Request.ApplicationPath %&amp;gt;/images/gobbler.png");
&lt;/pre&gt;
&lt;br&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Now you can easily move from your development environment to your staging environment
without fear of breaking your image paths. Files in various levels of the directory
structure can use the same reference because everything has a path that begins at
the root. No more ".." syntax headaches. I love it!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=2d2b144b-fcb1-4455-850a-fb976a68afda" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,2d2b144b-fcb1-4455-850a-fb976a68afda.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=37b46884-5fd3-456c-8f45-452acf2cd451</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,37b46884-5fd3-456c-8f45-452acf2cd451.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,37b46884-5fd3-456c-8f45-452acf2cd451.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=37b46884-5fd3-456c-8f45-452acf2cd451</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've been meaning to learn more about the VS.Net 2005 details, so after a nicely grilled
steak and a glass of wine, I set myself down to read the MSDN library on the topic
of Code Snippets.
</p>
        <p>
Code Snippets are one of the great new features in VS.Net 2005. They provide a method
for a programmer to quickly insert snippets of code by typing just a few keystrokes. 
</p>
        <p>
An examination of the code over the course of several projects will reveal a set of
patterns: classes, properties, event handlers, constructors and methods. Just a few
characters vary in these patterns.
</p>
        <div style="PADDING-RIGHT: 6px; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; FONT-FAMILY: courier new; BACKGROUND-COLOR: #cccccc">private
int _name;<br /><br />
public int Name<br />
{<br />
   get { return _name; }<br />
   set { _name = value; }<br />
}
</div>
        <p>
The preceding lines of code provide an example of the pattern inherent in a property.
The values "_name" and "Name" represent the private and public values accessible to
the class. Code Snippets allow you to produce this code with a minimal amount of keystrokes. 
</p>
        <p>
To produce the property show above:
</p>
        <p>
Move your cursor to an appropriate position the class<br />
Press Control+K, Control+X to bring up the Code Snippets Intellisense Context Menu<br />
Type "prop" and press the Tab key
</p>
        <p>
This will result in the following code:
</p>
        <p>
          <img src="http://andrew.staging.popart.com/content/binary/snippet1.png" border="1" />
        </p>
        <p>
The cursor starts at the first green section, which defaults to the integer data type.
Entering the new data type will overwrite the characters "int". After the actual datatype
is entered, pressing the Tab key will advance the cursor to the next green section,
which defaults to "myVar". Entering the actual value here will overwrite the characters
on line 19, line 23 and line 24 simultaneously. This is where you should see the value
of code snippets. While C# is slightly more cryptic than VB.Net, there is still a
great deal of value to be gained by using a tool like Code Snippets.
</p>
        <p>
There are similar snippets for classes, interfaces and many other patterns. There
are over 50 snippets by default. Custom snippets can also be created. 
</p>
        <p>
Anywhere a pattern exists in code, a solid case can be made for using Code Snippets.
Imagine a class that has over 20 properties. The economy of scale becomes obvious.
</p>
        <p>
Code Snippets are great, but its just the start. 3rd party vendors like <a href="http://www.devexpress.com/">Developer
Express</a> have built great tools like <a href="http://www.devexpress.com/Products/NET/CodeRush/">CodeRush</a>,
which represent the next level up in productivity. If you have a great deal of code
that could be automatically generated, tools like <a href="http://www.codesmithtools.com/">CodeSmith</a> represent
the 3rd level. If you stand to gain a huge advantage from code generation, you can
author your own code generator using Microsoft.Net classes. That's right; code that
writes code. I just blew your mind.<br /></p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=37b46884-5fd3-456c-8f45-452acf2cd451" />
      </body>
      <title>Code Snippets</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,37b46884-5fd3-456c-8f45-452acf2cd451.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/05/02/CodeSnippets.aspx</link>
      <pubDate>Tue, 02 May 2006 04:02:51 GMT</pubDate>
      <description>&lt;p&gt;
I've been meaning to learn more about the VS.Net 2005 details, so after a nicely grilled
steak and a glass of wine, I set myself down to read the MSDN library on the topic
of Code Snippets.
&lt;/p&gt;
&lt;p&gt;
Code Snippets are one of the great new features in VS.Net 2005. They provide a method
for a programmer to quickly insert snippets of code by typing just a few keystrokes. 
&lt;/p&gt;
&lt;p&gt;
An examination of the code over the course of several projects will reveal a set of
patterns: classes, properties, event handlers, constructors and methods. Just a few
characters vary in these patterns.
&lt;/p&gt;
&lt;div style="PADDING-RIGHT: 6px; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; FONT-FAMILY: courier new; BACKGROUND-COLOR: #cccccc"&gt;private
int _name;&lt;br&gt;
&lt;br&gt;
public int Name&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;get { return _name; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;set { _name = value; }&lt;br&gt;
}
&lt;/div&gt;
&lt;p&gt;
The preceding lines of code provide an example of the pattern inherent in a property.
The values "_name" and "Name" represent the private and public values accessible to
the class. Code Snippets allow you to produce this code with a minimal amount of keystrokes. 
&lt;/p&gt;
&lt;p&gt;
To produce the property show above:
&lt;/p&gt;
&lt;p&gt;
Move your cursor to an appropriate position the class&lt;br&gt;
Press Control+K, Control+X to bring up the Code Snippets Intellisense Context Menu&lt;br&gt;
Type "prop" and press the Tab key
&lt;/p&gt;
&lt;p&gt;
This will result in the following code:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://andrew.staging.popart.com/content/binary/snippet1.png" border=1&gt;
&lt;/p&gt;
&lt;p&gt;
The cursor starts at the first green section, which defaults to the integer data type.
Entering the new data type will overwrite the characters "int". After the actual datatype
is entered, pressing the Tab key will advance the cursor to the next green section,
which defaults to "myVar". Entering the actual value here will overwrite the characters
on line 19, line 23 and line 24 simultaneously. This is where you should see the value
of code snippets. While C# is slightly more cryptic than VB.Net, there is still a
great deal of value to be gained by using a tool like Code Snippets.
&lt;/p&gt;
&lt;p&gt;
There are similar snippets for classes, interfaces and many other patterns. There
are over 50 snippets by default. Custom snippets can also be created. 
&lt;/p&gt;
&lt;p&gt;
Anywhere a pattern exists in code, a solid case can be made for using Code Snippets.
Imagine a class that has over 20 properties. The economy of scale becomes obvious.
&lt;/p&gt;
&lt;p&gt;
Code Snippets are great, but its just the start. 3rd party vendors like &lt;a href="http://www.devexpress.com/"&gt;Developer
Express&lt;/a&gt; have built great tools like &lt;a href="http://www.devexpress.com/Products/NET/CodeRush/"&gt;CodeRush&lt;/a&gt;,
which represent the next level up in productivity. If you have a great deal of code
that could be automatically generated, tools like &lt;a href="http://www.codesmithtools.com/"&gt;CodeSmith&lt;/a&gt; represent
the 3rd level. If you stand to gain a huge advantage from code generation, you can
author your own code generator using Microsoft.Net classes. That's right; code that
writes code. I just blew your mind.&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=37b46884-5fd3-456c-8f45-452acf2cd451" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,37b46884-5fd3-456c-8f45-452acf2cd451.aspx</comments>
      <category>learning</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=bf07308c-1ce6-4b4d-b1ed-bb0b12786755</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,bf07308c-1ce6-4b4d-b1ed-bb0b12786755.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,bf07308c-1ce6-4b4d-b1ed-bb0b12786755.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=bf07308c-1ce6-4b4d-b1ed-bb0b12786755</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've occassionally sent email to the wrong address. Its to the right person, just
the wrong account. When I open Outlook and create a new email message, the handy autocomplete
feature lets me type just a few letters of the person's name and it shows me the matching
entries. If I don't look really close, I sometimes send email to Dave's personal account,
instead of his business account. That sucks, especially when its important, and he
doesn't see it for a while.
</p>
        <p>
Google to the rescue.
</p>
        <p>
A quick Googling, and I had the answer to my problem in about 30 seconds.
</p>
        <p>
          <a href="http://www.feld.com/blog/archives/2005/09/clearing_your_m.html">http://www.feld.com/blog/archives/2005/09/clearing_your_m.html</a>
        </p>
        <p>
I figured out how to clear my autocomplete cache in Outlook. I rarely send email to
Dave's personal account, so now I can start fresh!
</p>
        <p>
Yay.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=bf07308c-1ce6-4b4d-b1ed-bb0b12786755" />
      </body>
      <title>Wrong Email Address</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,bf07308c-1ce6-4b4d-b1ed-bb0b12786755.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/04/12/WrongEmailAddress.aspx</link>
      <pubDate>Wed, 12 Apr 2006 21:29:43 GMT</pubDate>
      <description>&lt;p&gt;
I've occassionally sent email to the wrong address. Its to the right person, just
the wrong account. When I open Outlook and create a new email message, the handy autocomplete
feature lets me type just a few letters of the person's name and it shows me the matching
entries. If I don't look really close, I sometimes send email to Dave's personal account,
instead of his business account. That sucks, especially when its important, and he
doesn't see it for a while.
&lt;/p&gt;
&lt;p&gt;
Google to the rescue.
&lt;/p&gt;
&lt;p&gt;
A quick Googling, and I had the answer to my problem in about 30 seconds.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.feld.com/blog/archives/2005/09/clearing_your_m.html"&gt;http://www.feld.com/blog/archives/2005/09/clearing_your_m.html&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
I figured out how to clear my autocomplete cache in Outlook. I rarely send email to
Dave's personal account, so now I can start fresh!
&lt;/p&gt;
&lt;p&gt;
Yay.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=bf07308c-1ce6-4b4d-b1ed-bb0b12786755" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,bf07308c-1ce6-4b4d-b1ed-bb0b12786755.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=d6e7c29c-14a5-4b60-911f-547731a3dcd6</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,d6e7c29c-14a5-4b60-911f-547731a3dcd6.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,d6e7c29c-14a5-4b60-911f-547731a3dcd6.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d6e7c29c-14a5-4b60-911f-547731a3dcd6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img src="http://andrew.staging.popart.com/content/binary/www_asp_net_logo.gif" align="left" border="0" />Over
the weekend, I was playing in a sandbox, working out some ideas for our client, PICA.
</p>
        <p>
I was really impressed with all of the out-of-the-box functionality available in ASP.Net
2.0, specifically these:
</p>
        <ul>
          <li>
Personalization 
</li>
          <li>
Membership 
</li>
          <li>
Menu Control 
</li>
          <li>
Security Trimming 
</li>
          <li>
Two Way Data Binding</li>
        </ul>
        <p>
I was able to build a full app, albeit wanting of some CSS love, in about four hours
time.
</p>
        <p>
The site shows a few pages of content. It lists some events that were created in a
password protected part of the site. The events can be added to a cart and "bought"
by a user by clicking a dynamic link to PayPal. The user's cart is persisted via cookies
if they come back later. The user's cart is also migrated to a persistant data
source if they decide to authenticate. The menu of the site uses the asp.net
menu control and it has a nice "Security Trimming" feature that omits any items in
the site map that the given user doesn't have access to view.
</p>
        <p>
These features really let me focus on the core business problem, rather than getting
bogged down by plumbing and implementation details. The number of new features in
ASP.Net 2.0 is huge and a little overwhelming, but I'm starting to wrap my arms around
it, after months of reading. I really dig it.
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=d6e7c29c-14a5-4b60-911f-547731a3dcd6" />
      </body>
      <title>ASP.Net 2.0 Out-Of-The-Box</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,d6e7c29c-14a5-4b60-911f-547731a3dcd6.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/04/10/ASPNet20OutOfTheBox.aspx</link>
      <pubDate>Mon, 10 Apr 2006 22:15:14 GMT</pubDate>
      <description>&lt;p&gt;
&lt;img src="http://andrew.staging.popart.com/content/binary/www_asp_net_logo.gif" align=left border=0&gt;Over
the weekend, I was playing in a sandbox, working out some ideas for our client, PICA.
&lt;/p&gt;
&lt;p&gt;
I was really impressed with all of the out-of-the-box functionality available in ASP.Net
2.0, specifically these:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Personalization 
&lt;li&gt;
Membership 
&lt;li&gt;
Menu Control 
&lt;li&gt;
Security Trimming 
&lt;li&gt;
Two Way Data Binding&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I was able to build a full app, albeit wanting of some CSS love, in about four hours
time.
&lt;/p&gt;
&lt;p&gt;
The site shows a few pages of content. It lists some events that were created in a
password protected part of the site. The events can be added to a cart and "bought"
by a user by clicking a dynamic link to PayPal. The user's cart is persisted via cookies
if they come back later. The user's cart is also migrated to a&amp;nbsp;persistant data
source&amp;nbsp;if they decide to authenticate. The menu of the site uses the asp.net
menu control and it has a nice "Security Trimming" feature that omits any items in
the site map that the given user doesn't have access to view.
&lt;/p&gt;
&lt;p&gt;
These features really let me focus on the core business problem, rather than getting
bogged down by plumbing and implementation details. The number of new features in
ASP.Net 2.0 is huge and a little overwhelming, but I'm starting to wrap my arms around
it, after months of reading. I really dig it.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=d6e7c29c-14a5-4b60-911f-547731a3dcd6" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,d6e7c29c-14a5-4b60-911f-547731a3dcd6.aspx</comments>
      <category>learning</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=15efc95a-4e82-4161-8ed9-3b0c93abcb53</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,15efc95a-4e82-4161-8ed9-3b0c93abcb53.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,15efc95a-4e82-4161-8ed9-3b0c93abcb53.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=15efc95a-4e82-4161-8ed9-3b0c93abcb53</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
So, I'm working pretty late on some XML code. I used to be pretty good at reading
and writing XDR schemas, but those were Microsoft proprietary and the XSD schemas
have been approved by the W3C now. Back in the day, Microsoft thought it would be
better if they offered a flavor of the XSD schemas to the public before the XSD schemas
were passed. This approach would give us about two years to play with the technology
before we had a standard in place. Microsoft is more agile than a standards body.
Go figure. So XDR schemas were great. I never even bothered learning DTD schemas;
it just wasn't worth it to me and my work never brought me close to them. 
</p>
        <p>
So, now I only use XSD schemas, unless there's a damn good reason. I don't do it often
enough to be fluent in them. I can read them, but authoring them by hand in notepad
is tough. I took a look at XmlSpy, thinking a utility like that could be quite handy.
Turns out its damn handy at about five hundred smackers for the bits. I could have
downloaded the trial version, but I figured my machine is dirty enough with the bits
I have stacked up, waiting for a few minutes of my time to be evaluated.
</p>
        <p>
I had pretty simple challenge: I wanted to validate an XML document against a schema.
I'm writing a prototype for PICA. I wrote a nifty app that provides a WYSIWYG editor
for those who want it, and/or access to a plain old HTML file to edit content if you
prefer that method. I'm using the web.sitemap file in ASP.Net 2.0. Its really sweet.
It connects nicely with the asp.net menu control, and gives me my choice of horizontal
or vertical menus with just a few lines of declaritive coding. 
</p>
        <p>
I configured my web.config file to send 404 errors to a specific page. This page checks
to see if you have sufficient authorization. If you don't, it just renders a simple
message about and invalid URL and gives you a link back to the home page. If you do
have enough authorization, the code will copy the contents of the default.aspx file
to the file that you actually asked for. I'm assuming that all requests will be for
files in the root. Hey, its my game, I can do what I want. Then, I automatically add
an entry to the bottom of web.sitemap file. This will provide a link to your new page
that you created. The master pages make for a real clean model too. All of the ASPX
pages in my application that contain a WYSIWYG editor are essentially identical, except
for the URL. 
</p>
        <p>
The base class that each of these pages inherit has some methods that use the URL
of the page to determine which HTML file contains their content. When you create the
page the first time by way of a 404 error event, the HTML file is empty. If you have
sufficient authorization, you'll see a pencil above the content area for each page.
When you click it you see a WYSIWYG editor. You can save changes and essentially update
the page like a wiki. Again, if you perfer to get your hands dirty, you can always
muck with the HTML file directly; whatever floats your boat.
</p>
        <p>
So now in lies the rub. I tried a couple of approaches for providing an authorized
user with the ability to edit the web.sitemap file. Its just an XML file that conforms
to a schema. My first thought was to use a drop down list control, indenting nested
pages appropriately, and providing four buttons for moving the page up, down, to its
parent, or under a child. That seems a little complicated, but plausible. Then I thought
about drag and drop. That would be nice. However, I was relying on the ASP.Net menu
control for my current vertical menu, and it does support drag and drop. The thought
of converting it to a Telerik menu control didn't seem like fun, but I could have
implemented drag and drop there if I wanted to do it. Next, I tried databinding the
web.sitemap control to a GridView control, but it doesn't work will with hierarchial
data. Bad idea. Then it hit me, just load the XML file into a multi-line textbox.
Give the user one button, Save, and your done. Ka-doosh! I got that working pretty
quick. Its just XML, and the sitemap isn't that big, so this would work quite well. 
</p>
        <p>
Then I thought, how I can I add some validation, while still providing the user with
the same amount of flexibility? XSD Schema!! So, I went to writing a twenty line schema
to validate my XML. It did exactly half of what I wanted it to do. If the XML was
the third kind of XML, crap, it would correctly indicate the problem. The three kinds
of XML are well-formed, valid and crap. Well-formed XML just means it obeys the basic
rules about XML, it has closed tags, quotes, blah, blah. Valid XML conforms to a schema,
and well... crap is crap. For some reason, it didn't mind if I through in a tag like
&lt;testing /&gt; into the XML. It was very liberal in that sense. However, I was
looking for some conservative, afraid to talk to others, XSD Schema to protect my
XML. I couldn't figure it out. The XDR schema has an attribute named "model" and its
valid is set to "closed" to indicate the XML it was validating could not include any
elements that it did not specify. No rogue elements. That was what my &lt;testing
/&gt; element was doing, rogue agent work. Yet my liberal XSD schema was just flapping
in the breeze. I searched high and low in MSDN, Google, blogs, groups, you name it.
I didn't find any indication of the equivalent setting in XSD schema and what more,
XSD Schema said model="closed" was invalid! Bah! 
</p>
        <p>
I know there's an ASP.Net 2.0 object model for the sitemap data source, but that would
have required going down to the basement to get the book. Plus, adding a node to an
existing XML document during a 404 error event wasn't the hard part, it was the validation
the XML after I exposed to a user who ain't so good at the cut and paste.
</p>
        <p>
This is where I nearly reach for XmlSpy to do my dirty work. But then I realized I
might already have a tool. I had been wondering over the past few days about the XML
tools that are including in Visual Studio.Net, perhaps there was one that would do
what I needed. I looked a little in the GUI, but I didn't find what I needed. Then
I googled for a schema validator, and I found some online versions. Finally, I hit
the big one: xsd.exe, my old fried. I had used this one years ago. Its just a command
line program that I had forgotten about. It comes with the Visual Studio.Net SDK.
It does a ton of stuff. You can pass it an XML file, and it will derive an appropriate
XSD schema that you can customize. If you pass it a schema, it will generate a custom
class that it can deserialize into. If you pass it an XDR, it will convert it into
an XSD schema. Its pretty hot. This tool really saved me a ton of work a few years
ago. Hopefully, I'll get to explain more about that later.
</p>
        <p>
So, I used XSD.exe to generate a schema. It looks NEARLY identical to mine, sans a
few important attributes. Here it is:
</p>
        <div style="BACKGROUND-COLOR: #cccccc">
          <p>
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;xs:schema id="siteMap" targetNamespace="<a href="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">http://schemas.microsoft.com/AspNet/SiteMap-File-1.0</a>"
xmlns:mstns="<a href="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">http://schemas.microsoft.com/AspNet/SiteMap-File-1.0</a>"
xmlns="<a href="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">http://schemas.microsoft.com/AspNet/SiteMap-File-1.0</a>"
xmlns:xs="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified"
elementFormDefault="qualified"&gt;<br />
   &lt;xs:element name="siteMapNode"&gt;<br />
      &lt;xs:complexType&gt;<br />
         &lt;xs:sequence&gt;<br />
            &lt;xs:element
ref="siteMapNode" minOccurs="0" maxOccurs="unbounded" /&gt;<br />
         &lt;/xs:sequence&gt;<br />
         &lt;xs:attribute name="url" form="unqualified"
type="xs:string" /&gt;<br />
         &lt;xs:attribute name="title" form="unqualified"
type="xs:string" /&gt;<br />
         &lt;xs:attribute name="description"
form="unqualified" type="xs:string" /&gt;<br />
      &lt;/xs:complexType&gt;<br />
   &lt;/xs:element&gt;<br />
   &lt;xs:element name="siteMap" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"&gt;<br />
      &lt;xs:complexType&gt;<br />
         &lt;xs:choice minOccurs="1" maxOccurs="1"&gt;<br />
            &lt;xs:element
ref="siteMapNode" /&gt;<br />
         &lt;/xs:choice&gt;<br />
      &lt;/xs:complexType&gt;<br />
   &lt;/xs:element&gt;<br />
&lt;/xs:schema&gt;
</p>
        </div>
        <p>
        </p>
        <p>
This little baby is the one I needed. So now I have a wiki-style web application that
lets me prototype out site pretty quickly with content. I can post the web app and
put the client to work entering content, or do it myself and show them a clickable
version of their copy. Great for getting them thinking and talking about the acutal
web instead of some vague notion in their head.
</p>
        <p>
So I got that working, time to add a node to the XML file on the fly during the 404
event. What a stinker. The XML file included a default namespace. When I had added
the node, I didn't specify anything, so it thought it was a new namespace can kept
inserting junk in there for me. XML is quite a broad topic, and I usually just need
to do a few small things. It would be really fun to learn all the nitty gritty things
some day, but that's for later. Today, I just need to add a fricken node and three
attributes to an existing XML document. 
</p>
        <p>
Finally, I hit across the overload that I need. I pass in the NamespaceUri of the
XML document object that I'm using, like this:
</p>
        <div style="FONT-SIZE: 8pt; FONT-FAMILY: courier new; BACKGROUND-COLOR: #cccccc">
          <p>
XmlDocument xmlDoc = new XmlDocument();<br />
xmlDoc.Load(this._SiteMapFile);
</p>
          <p>
XmlElement siteMapNode = xmlDoc.CreateElement("siteMapNode", xmlDoc.DocumentElement.NamespaceURI);
</p>
          <p>
XmlAttribute urlAttr = xmlDoc.CreateAttribute("url");<br />
XmlAttribute titleAttr = xmlDoc.CreateAttribute("title");<br />
XmlAttribute descAttr = xmlDoc.CreateAttribute("description");
</p>
          <p>
urlAttr.Value = requestedPage;<br />
titleAttr.Value = pageName;<br />
descAttr.Value = pageName;
</p>
          <p>
siteMapNode.Attributes.Append(urlAttr);<br />
siteMapNode.Attributes.Append(titleAttr);<br />
siteMapNode.Attributes.Append(descAttr);
</p>
          <p>
xmlDoc.DocumentElement.FirstChild.AppendChild(siteMapNode);
</p>
          <p>
xmlDoc.Save(this._SiteMapFile);
</p>
        </div>
        <p>
That does the trick and I'm home free. Literally. The wife is out with her girlfriend
and I'm home free with my dog. 
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=15efc95a-4e82-4161-8ed9-3b0c93abcb53" />
      </body>
      <title>Xml is kicking my ass again</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,15efc95a-4e82-4161-8ed9-3b0c93abcb53.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/03/12/XmlIsKickingMyAssAgain.aspx</link>
      <pubDate>Sun, 12 Mar 2006 07:43:14 GMT</pubDate>
      <description>&lt;p&gt;
So, I'm working pretty late on some XML code. I used to be pretty good at reading
and writing XDR schemas, but those were Microsoft proprietary and the XSD schemas
have been approved by the W3C now. Back in the day, Microsoft thought it would be
better if they offered a flavor of the XSD schemas to the public before the XSD schemas
were passed. This approach would give us about two years to play with the technology
before we had a standard in place. Microsoft is more agile than a standards body.
Go figure. So XDR schemas were great. I never even bothered learning DTD schemas;
it just wasn't worth it to me and my work never brought me close to them. 
&lt;/p&gt;
&lt;p&gt;
So, now I only use XSD schemas, unless there's a damn good reason. I don't do it often
enough to be fluent in them. I can read them, but authoring them by hand in notepad
is tough. I took a look at XmlSpy, thinking a utility like that could be quite handy.
Turns out its damn handy at about five hundred smackers for the bits. I could have
downloaded the trial version, but I figured my machine is dirty enough with the bits
I have stacked up, waiting for a few minutes of my time to be evaluated.
&lt;/p&gt;
&lt;p&gt;
I had pretty simple challenge: I wanted to validate an XML document against a schema.
I'm writing a prototype for PICA. I wrote a nifty app that provides a WYSIWYG editor
for those who want it, and/or access to a plain old HTML file to edit content if you
prefer that method. I'm using the web.sitemap file in ASP.Net 2.0. Its really sweet.
It connects nicely with the asp.net menu control, and gives me my choice of horizontal
or vertical menus with just a few lines of declaritive coding. 
&lt;/p&gt;
&lt;p&gt;
I configured my web.config file to send 404 errors to a specific page. This page checks
to see if you have sufficient authorization. If you don't, it just renders a simple
message about and invalid URL and gives you a link back to the home page. If you do
have enough authorization, the code will copy the contents of the default.aspx file
to the file that you actually asked for. I'm assuming that all requests will be for
files in the root. Hey, its my game, I can do what I want. Then, I automatically add
an entry to the bottom of web.sitemap file. This will provide a link to your new page
that you created. The master pages make for a real clean model too. All of the ASPX
pages in my application that contain a WYSIWYG editor are essentially identical, except
for the URL. 
&lt;/p&gt;
&lt;p&gt;
The base class that each of these pages inherit has some methods that use the URL
of the page to determine which HTML file contains their content. When you create the
page the first time by way of a 404 error event, the HTML file is empty. If you have
sufficient authorization, you'll see a pencil above the content area for each page.
When you click it you see a WYSIWYG editor. You can save changes and essentially update
the page like a wiki. Again, if you perfer to get your hands dirty, you can always
muck with the HTML file directly; whatever floats your boat.
&lt;/p&gt;
&lt;p&gt;
So now in lies the rub. I tried a couple of approaches for providing an authorized
user with the ability to edit the web.sitemap file. Its just an XML file that conforms
to a schema. My first thought was to use a drop down list control, indenting nested
pages appropriately, and providing four buttons for moving the page up, down, to its
parent, or under a child. That seems a little complicated, but plausible. Then I thought
about drag and drop. That would be nice. However, I was relying on the ASP.Net menu
control for my current vertical menu, and it does support drag and drop. The thought
of converting it to a Telerik menu control didn't seem like fun, but I could have
implemented drag and drop there if I wanted to do it. Next, I tried databinding the
web.sitemap control to a GridView control, but it doesn't work will with hierarchial
data. Bad idea. Then it hit me, just load the XML file into a multi-line textbox.
Give the user one button, Save, and your done. Ka-doosh! I got that working pretty
quick. Its just XML, and the sitemap isn't that big, so this would work quite well. 
&lt;/p&gt;
&lt;p&gt;
Then I thought, how I can I add some validation, while still providing the user with
the same amount of flexibility? XSD Schema!! So, I went to writing a twenty line schema
to validate my XML. It did exactly half of what I wanted it to do. If the XML was
the third kind of XML, crap, it would correctly indicate the problem. The three kinds
of XML are well-formed, valid and crap. Well-formed XML just means it obeys the basic
rules about XML, it has closed tags, quotes, blah, blah. Valid XML conforms to a schema,
and well... crap is crap. For some reason, it didn't mind if I through in a tag like
&amp;lt;testing /&amp;gt; into the XML. It was very liberal in that sense. However, I was
looking for some conservative, afraid to talk to others, XSD Schema to protect my
XML. I couldn't figure it out. The XDR schema has an attribute named "model" and its
valid is set to "closed" to indicate the XML it was validating could not include any
elements that it did not specify. No rogue elements. That was what my &amp;lt;testing
/&amp;gt; element was doing, rogue agent work. Yet my liberal XSD schema was just flapping
in the breeze. I searched high and low in MSDN, Google, blogs, groups, you name it.
I didn't find any indication of the equivalent setting in XSD schema and what more,
XSD Schema said model="closed" was invalid! Bah! 
&lt;/p&gt;
&lt;p&gt;
I know there's an ASP.Net 2.0 object model for the sitemap data source, but that would
have required going down to the basement to get the book. Plus, adding a node to an
existing XML document during a 404 error event wasn't the hard part, it was the validation
the XML after I exposed to a user who ain't so good at the cut and paste.
&lt;/p&gt;
&lt;p&gt;
This is where I nearly reach for XmlSpy to do my dirty work. But then I realized I
might already have a tool. I had been wondering over the past few days about the XML
tools that are including in Visual Studio.Net, perhaps there was one that would do
what I needed. I looked a little in the GUI, but I didn't find what I needed. Then
I googled for a schema validator, and I found some online versions. Finally, I hit
the big one: xsd.exe, my old fried. I had used this one years ago. Its just a command
line program that I had forgotten about. It comes with the Visual Studio.Net SDK.
It does a ton of stuff. You can pass it an XML file, and it will derive an appropriate
XSD schema that you can customize. If you pass it a schema, it will generate a custom
class that it can deserialize into. If you pass it an XDR, it will convert it into
an XSD schema. Its pretty hot. This tool really saved me a ton of work a few years
ago. Hopefully, I'll get to explain more about that later.
&lt;/p&gt;
&lt;p&gt;
So, I used XSD.exe to generate a schema. It looks NEARLY identical to mine, sans a
few important attributes. Here it is:
&lt;/p&gt;
&lt;div style="BACKGROUND-COLOR: #cccccc"&gt;
&lt;p&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br&gt;
&amp;lt;xs:schema id="siteMap" targetNamespace="&lt;a href="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"&gt;http://schemas.microsoft.com/AspNet/SiteMap-File-1.0&lt;/a&gt;"
xmlns:mstns="&lt;a href="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"&gt;http://schemas.microsoft.com/AspNet/SiteMap-File-1.0&lt;/a&gt;"
xmlns="&lt;a href="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"&gt;http://schemas.microsoft.com/AspNet/SiteMap-File-1.0&lt;/a&gt;"
xmlns:xs="&lt;a href="http://www.w3.org/2001/XMLSchema"&gt;http://www.w3.org/2001/XMLSchema&lt;/a&gt;"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified"
elementFormDefault="qualified"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;xs:element name="siteMapNode"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xs:complexType&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xs:sequence&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;lt;xs:element
ref="siteMapNode" minOccurs="0" maxOccurs="unbounded" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xs:sequence&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xs:attribute name="url" form="unqualified"
type="xs:string" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xs:attribute name="title" form="unqualified"
type="xs:string" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xs:attribute name="description"
form="unqualified" type="xs:string" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xs:complexType&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;/xs:element&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;xs:element name="siteMap" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xs:complexType&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xs:choice minOccurs="1" maxOccurs="1"&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;lt;xs:element
ref="siteMapNode" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xs:choice&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xs:complexType&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;/xs:element&amp;gt;&lt;br&gt;
&amp;lt;/xs:schema&amp;gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
This little baby is the one I needed. So now I have a wiki-style web application that
lets me prototype out site pretty quickly with content. I can post the web app and
put the client to work entering content, or do it myself and show them a clickable
version of their copy. Great for getting them thinking and talking about the acutal
web instead of some vague notion in their head.
&lt;/p&gt;
&lt;p&gt;
So I got that working, time to add a node to the XML file on the fly during the 404
event. What a stinker. The XML file included a default namespace. When I had added
the node, I didn't specify anything, so it thought it was a new namespace can kept
inserting junk in there for me. XML is quite a broad topic, and I usually just need
to do a few small things. It would be really fun to learn all the nitty gritty things
some day, but that's for later. Today, I just need to add a fricken node and three
attributes to an existing XML document. 
&lt;/p&gt;
&lt;p&gt;
Finally, I hit across the overload that I need. I pass in the NamespaceUri of the
XML document object that I'm using, like this:
&lt;/p&gt;
&lt;div style="FONT-SIZE: 8pt; FONT-FAMILY: courier new; BACKGROUND-COLOR: #cccccc"&gt;
&lt;p&gt;
XmlDocument xmlDoc = new XmlDocument();&lt;br&gt;
xmlDoc.Load(this._SiteMapFile);
&lt;/p&gt;
&lt;p&gt;
XmlElement siteMapNode = xmlDoc.CreateElement("siteMapNode", xmlDoc.DocumentElement.NamespaceURI);
&lt;/p&gt;
&lt;p&gt;
XmlAttribute urlAttr = xmlDoc.CreateAttribute("url");&lt;br&gt;
XmlAttribute titleAttr = xmlDoc.CreateAttribute("title");&lt;br&gt;
XmlAttribute descAttr = xmlDoc.CreateAttribute("description");
&lt;/p&gt;
&lt;p&gt;
urlAttr.Value = requestedPage;&lt;br&gt;
titleAttr.Value = pageName;&lt;br&gt;
descAttr.Value = pageName;
&lt;/p&gt;
&lt;p&gt;
siteMapNode.Attributes.Append(urlAttr);&lt;br&gt;
siteMapNode.Attributes.Append(titleAttr);&lt;br&gt;
siteMapNode.Attributes.Append(descAttr);
&lt;/p&gt;
&lt;p&gt;
xmlDoc.DocumentElement.FirstChild.AppendChild(siteMapNode);
&lt;/p&gt;
&lt;p&gt;
xmlDoc.Save(this._SiteMapFile);
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
That does the trick and I'm home free. Literally. The wife is out with her girlfriend
and I'm home free with my dog. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=15efc95a-4e82-4161-8ed9-3b0c93abcb53" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,15efc95a-4e82-4161-8ed9-3b0c93abcb53.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=163beda2-eff6-44ba-b4bd-1639b739c802</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,163beda2-eff6-44ba-b4bd-1639b739c802.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,163beda2-eff6-44ba-b4bd-1639b739c802.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=163beda2-eff6-44ba-b4bd-1639b739c802</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The .Net programmers on my team were debating the concepts of how a generic class
is better than an object array. This <a href="http://www.15seconds.com/issue/031024.htm">website</a> seems
to explain it well.
</p>
        <p>
Basically, it comes down to this:
</p>
        <ol>
          <li>
If you want to change the item(s) in an array, you have to create a temp storage area,
copy them over, make the change to the array, and finally copy the items back. Boo.</li>
          <li>
You sure could write your own collection class; that would violate the best practice
of using the most of the Base Class Library. The less code YOU write, the better.
Microsoft has thought about it longer, harder and better than you ever could. Don't
re-code the wheel. Geometry and other concepts like pi are easy to flub up.</li>
          <li>
This <a href="http://blogs.msdn.com/joshwil/archive/2004/04/13/112598.aspx">site</a> does
a handy job of explaining the performance gains seen in generics. The memory footprint
stays lower with generics too.</li>
        </ol>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=163beda2-eff6-44ba-b4bd-1639b739c802" />
      </body>
      <title>Generics versus Object Arrays</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,163beda2-eff6-44ba-b4bd-1639b739c802.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/03/10/GenericsVersusObjectArrays.aspx</link>
      <pubDate>Fri, 10 Mar 2006 22:34:29 GMT</pubDate>
      <description>&lt;p&gt;
The .Net programmers on my team were debating the concepts of how a generic class
is better than an object array. This &lt;a href="http://www.15seconds.com/issue/031024.htm"&gt;website&lt;/a&gt; seems
to explain it well.
&lt;/p&gt;
&lt;p&gt;
Basically, it comes down to this:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
If you want to change the item(s) in an array, you have to create a temp storage area,
copy them over, make the change to the array, and finally copy the items back. Boo.&lt;/li&gt;
&lt;li&gt;
You sure could write your own collection class; that would violate the best practice
of using the most of the Base Class Library. The less code YOU write, the better.
Microsoft has thought about it longer, harder and better than you ever could. Don't
re-code the wheel. Geometry and other concepts like pi are easy to flub up.&lt;/li&gt;
&lt;li&gt;
This &lt;a href="http://blogs.msdn.com/joshwil/archive/2004/04/13/112598.aspx"&gt;site&lt;/a&gt; does
a handy job of explaining the performance gains seen in generics. The memory footprint
stays lower with generics too.&lt;/li&gt;
&lt;/ol&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=163beda2-eff6-44ba-b4bd-1639b739c802" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,163beda2-eff6-44ba-b4bd-1639b739c802.aspx</comments>
      <category>learning</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=3e3b45ff-ef4b-42ee-8ebe-f5ab84d7faa6</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,3e3b45ff-ef4b-42ee-8ebe-f5ab84d7faa6.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,3e3b45ff-ef4b-42ee-8ebe-f5ab84d7faa6.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=3e3b45ff-ef4b-42ee-8ebe-f5ab84d7faa6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
My boss asked me to research some software licensing per our Microsoft Certified Partner
status, and our Microsoft Action Pack subscription. Coupled with that, he asked about
the different versions of Microsoft 2003 Server: Web Edition, Standard, Enterprise
and Data Center.
</p>
        <p>
This link compares the features of the <a href="http://www.microsoft.com/windowsserver2003/evaluation/features/comparefeatures.mspx">different
editions of Windows 2003 Server</a>. There's a ton of features. The Web Edition has
nearly everything we would use on a normal day-to-day basis. Other versions would
be suitable for heavy duty systems like hosting Exchange Server.
</p>
        <p>
Here's the list of software made available to us through the Microsoft Certified Partner
program and the Microsoft Action Pack program, along with the number of licenses,
for example, MCPs have 25 licenses for Microsoft Office Professional.
</p>
        <p>
I phoned the Partner Resource Center at Microsoft and inquired about our licensing.
Normally, companies like Pop Art are either Microsoft Registered Members
or Microsoft Certified Partners. Registered Members get the Action Pack and Certified
Partners get a better software license package. Pop Art subscibes to both and the
licenses are additive, so we have multiple licenses available to us for Microsoft
Windows Server 2003. That works well for us because we have several servers around
the office in need of licensing.
</p>
        <p>
          <strong>Microsoft Certified Partner Licensing Benefits</strong>
        </p>
        <ul>
          <li>
Microsoft Office Professional Edition 2003, 25 
</li>
          <li>
Microsoft Office FrontPage 2003, 25 
</li>
          <li>
Microsoft Office OneNote 2003, 25 
</li>
          <li>
Microsoft Office InfoPath 2003, 25 
</li>
          <li>
Microsoft Windows XP Professional, 25 
</li>
          <li>
Microsoft Virtual PC 2004, 25 
</li>
          <li>
Microsoft Office Outlook 2003 with Business Contact Manager, 25 
</li>
          <li>
Microsoft Visio 2003 Professional, 25 
</li>
          <li>
Microsoft Project 2003 Professional, 25 
</li>
          <li>
Microsoft Project Server 2003, 1 
</li>
          <li>
Microsoft Project Server 2003 Client Access Licenses (CALs), 25 
</li>
          <li>
Microsoft MapPoint 2004, 25 
</li>
          <li>
Microsoft Windows Server 2003 Enterprise Edition, 2 
</li>
          <li>
Microsoft Windows Server 2003 Enterprise Edition CALs, 25 
</li>
          <li>
Microsoft Windows Server 2003 Terminal Server CALs, 25 
</li>
          <li>
Microsoft Windows Server Web Edition, 1 
</li>
          <li>
Microsoft SQL Server 2000 Enterprise Edition, 1 
</li>
          <li>
Microsoft SQL Server 2000 Enterprise Edition CALs, 25 
</li>
          <li>
Microsoft SQL Server 2000 Reporting Services Standard Edition, 25 
</li>
          <li>
Microsoft Exchange Server 2003 Enterprise Edition, 1 
</li>
          <li>
Microsoft Exchange Server 2003 Enterprise Edition CALs, 25 
</li>
          <li>
Microsoft Office SharePoint Portal Server 2003, 1 
</li>
          <li>
Microsoft Office SharePoint Portal Server 2003 CALs, 25 
</li>
          <li>
Microsoft SharePoint Services 2003 Enterprise, 25 
</li>
          <li>
Microsoft Small Business Server 2003 Premium Edition, 1 
</li>
          <li>
Microsoft Small Business Server 2003 Premium Edition CALs, 25 
</li>
          <li>
Microsoft Systems Management Server 2003, 3 
</li>
          <li>
Microsoft Systems Management Server 2003 CALs, 25 
</li>
          <li>
Microsoft BizTalk 2004 Server Enterprise Edition (Single-Processor), 3 
</li>
          <li>
Microsoft Internet Security and Acceleration (ISA) Server Enterprise Edition (Single-Processor),
1 
</li>
          <li>
Microsoft Internet Security and Acceleration (ISA) Server Enterprise Edition (Single-Processor)
CALs, 25 
</li>
          <li>
Microsoft Commerce Server 2002 Enterprise Edition (Single-Processor), 3 
</li>
          <li>
Microsoft Application Center (Single-Processor), NA 
</li>
          <li>
Microsoft CRM 3.0 of choice (either Microsoft CRM 3.0 Small Business Edition or Microsoft
CRM 3.0 Professional Edition, but not both), 25 
</li>
          <li>
Microsoft Identity Information Server Enterprise Edition (Per-Processor license),
1 
</li>
          <li>
Microsoft Windows Rights Management Services (RMS) for Windows Server 2003 CALs, 5 
</li>
          <li>
Microsoft Operations Manager Server 2005 Enterprise Edition, 1 
</li>
          <li>
Microsoft Operations Manager Server 2005 OML, 1 
</li>
          <li>
Microsoft Office Live Communication Server 2005 Enterprise Edition, 1 
</li>
          <li>
Microsoft Office Live Communication Server 2005 Enterprise Edition CALs, 25 
</li>
          <li>
Microsoft Virtual Server Enterprise Edition, 2 
</li>
        </ul>
        <p>
          <strong>Microsoft Action Pack Licensing Benefits</strong>
        </p>
        <ul>
          <li>
Microsoft Business Contact Manager for Office Outlook 2003, localized versions, 10 
</li>
          <li>
Microsoft Business Contact Manager Update for Microsoft Office Outlook 2003 Service
Pack 1*, N/A 
</li>
          <li>
Microsoft CRM 3.0 Small Business Edition, 1 
</li>
          <li>
Microsoft Exchange Server 2003 Standard, 1 
</li>
          <li>
Microsoft Exchange Server 2003 Service Pack 2*, N/A 
</li>
          <li>
Microsoft ISA Server 2004, including Service Pack 1 Multilingual Pack, 1 
</li>
          <li>
Microsoft Live Communications Server 2005, 1 
</li>
          <li>
Microsoft MapPoint 2004 Standard Edition (North America only), 10 
</li>
          <li>
Microsoft Office FrontPage 2003, 10 
</li>
          <li>
Microsoft Office InfoPath 2003, 10 
</li>
          <li>
Microsoft Office Professional Edition 2003, 10 
</li>
          <li>
Microsoft Office Professional Edition 2003 Service Pack 2*, N/A 
</li>
          <li>
Microsoft Office Project Professional 2003, 10 
</li>
          <li>
Microsoft Office Project Server 2003, 1 
</li>
          <li>
Microsoft Office SharePoint Portal Server 2003, 1 
</li>
          <li>
Microsoft Office Small Business Accounting 2006 (U.S. only)**, 10 
</li>
          <li>
Microsoft Office Visio Professional 2003, 10 
</li>
          <li>
Microsoft Office OneNote 2003, 10 
</li>
          <li>
Microsoft Operations Manager 2005 Workgroup Edition, 10 
</li>
          <li>
Microsoft SQL Server 2005 Standard Edition, 1 
</li>
          <li>
Microsoft System Center Data Protection Manager 2006 multilanguage version, 10 
</li>
          <li>
Microsoft Virtual PC 2004, 10 
</li>
          <li>
Microsoft Visual Basic 2005 Express Edition, 10 
</li>
          <li>
Microsoft Visual Web Developer 2005 Express Edition, 10 
</li>
          <li>
Microsoft Windows Server 2003 Standard Edition, including Service Pack 1, 1 
</li>
          <li>
Microsoft Windows Server 2003 Web Edition, 1 
</li>
          <li>
Microsoft Windows SharePoint Services Standard 2003, 1 
</li>
          <li>
Microsoft Windows Small Business Server 2003 Premium Edition, including Service Pack
1, 1 
</li>
          <li>
Microsoft Windows XP Professional Edition, including Service Pack 2, 10 
</li>
          <li>
Microsoft Windows XP Professional x64 Edition, 10 
</li>
        </ul>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=3e3b45ff-ef4b-42ee-8ebe-f5ab84d7faa6" />
      </body>
      <title>Microsoft Certified Partner Benefits and Windows Server 2003</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,3e3b45ff-ef4b-42ee-8ebe-f5ab84d7faa6.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/03/08/MicrosoftCertifiedPartnerBenefitsAndWindowsServer2003.aspx</link>
      <pubDate>Wed, 08 Mar 2006 22:10:03 GMT</pubDate>
      <description>&lt;p&gt;
My boss asked me to research some software licensing per our Microsoft Certified Partner
status, and our Microsoft Action Pack subscription. Coupled with that, he asked about
the different versions of Microsoft 2003 Server: Web Edition, Standard, Enterprise
and Data Center.
&lt;/p&gt;
&lt;p&gt;
This link compares the features of the &lt;a href="http://www.microsoft.com/windowsserver2003/evaluation/features/comparefeatures.mspx"&gt;different
editions of Windows 2003 Server&lt;/a&gt;. There's a ton of features. The Web Edition has
nearly everything we would use on a normal day-to-day basis. Other versions would
be suitable for heavy duty systems like hosting Exchange Server.
&lt;/p&gt;
&lt;p&gt;
Here's the list of software made available to us through the Microsoft Certified Partner
program and the Microsoft Action Pack program, along with the number of licenses,
for example, MCPs have 25 licenses for Microsoft Office Professional.
&lt;/p&gt;
&lt;p&gt;
I phoned the Partner Resource Center at Microsoft and inquired about our licensing.
Normally, companies like&amp;nbsp;Pop Art&amp;nbsp;are either Microsoft Registered Members
or Microsoft Certified Partners. Registered Members get the Action Pack and Certified
Partners get a better software license package. Pop Art subscibes to both and the
licenses are additive, so we have multiple licenses available to us for Microsoft
Windows Server 2003. That works well for us because we have several servers around
the office in need of licensing.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Microsoft Certified Partner Licensing Benefits&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Microsoft Office Professional Edition 2003, 25 
&lt;li&gt;
Microsoft Office FrontPage 2003, 25 
&lt;li&gt;
Microsoft Office OneNote 2003, 25 
&lt;li&gt;
Microsoft Office InfoPath 2003, 25 
&lt;li&gt;
Microsoft Windows XP Professional, 25 
&lt;li&gt;
Microsoft Virtual PC 2004, 25 
&lt;li&gt;
Microsoft Office Outlook 2003 with Business Contact Manager, 25 
&lt;li&gt;
Microsoft Visio 2003 Professional, 25 
&lt;li&gt;
Microsoft Project 2003 Professional, 25 
&lt;li&gt;
Microsoft Project Server 2003, 1 
&lt;li&gt;
Microsoft Project Server 2003 Client Access Licenses (CALs), 25 
&lt;li&gt;
Microsoft MapPoint 2004, 25 
&lt;li&gt;
Microsoft Windows Server 2003 Enterprise Edition, 2 
&lt;li&gt;
Microsoft Windows Server 2003 Enterprise Edition CALs, 25 
&lt;li&gt;
Microsoft Windows Server 2003 Terminal Server CALs, 25 
&lt;li&gt;
Microsoft Windows Server Web Edition, 1 
&lt;li&gt;
Microsoft SQL Server 2000 Enterprise Edition, 1 
&lt;li&gt;
Microsoft SQL Server 2000 Enterprise Edition CALs, 25 
&lt;li&gt;
Microsoft SQL Server 2000 Reporting Services Standard Edition, 25 
&lt;li&gt;
Microsoft Exchange Server 2003 Enterprise Edition, 1 
&lt;li&gt;
Microsoft Exchange Server 2003 Enterprise Edition CALs, 25 
&lt;li&gt;
Microsoft Office SharePoint Portal Server 2003, 1 
&lt;li&gt;
Microsoft Office SharePoint Portal Server 2003 CALs, 25 
&lt;li&gt;
Microsoft SharePoint Services 2003 Enterprise, 25 
&lt;li&gt;
Microsoft Small Business Server 2003 Premium Edition, 1 
&lt;li&gt;
Microsoft Small Business Server 2003 Premium Edition CALs, 25 
&lt;li&gt;
Microsoft Systems Management Server 2003, 3 
&lt;li&gt;
Microsoft Systems Management Server 2003 CALs, 25 
&lt;li&gt;
Microsoft BizTalk 2004 Server Enterprise Edition (Single-Processor), 3 
&lt;li&gt;
Microsoft Internet Security and Acceleration (ISA) Server Enterprise Edition (Single-Processor),
1 
&lt;li&gt;
Microsoft Internet Security and Acceleration (ISA) Server Enterprise Edition (Single-Processor)
CALs, 25 
&lt;li&gt;
Microsoft Commerce Server 2002 Enterprise Edition (Single-Processor), 3 
&lt;li&gt;
Microsoft Application Center (Single-Processor), NA 
&lt;li&gt;
Microsoft CRM 3.0 of choice (either Microsoft CRM 3.0 Small Business Edition or Microsoft
CRM 3.0 Professional Edition, but not both), 25 
&lt;li&gt;
Microsoft Identity Information Server Enterprise Edition (Per-Processor license),
1 
&lt;li&gt;
Microsoft Windows Rights Management Services (RMS) for Windows Server 2003 CALs, 5 
&lt;li&gt;
Microsoft Operations Manager Server 2005 Enterprise Edition, 1 
&lt;li&gt;
Microsoft Operations Manager Server 2005 OML, 1 
&lt;li&gt;
Microsoft Office Live Communication Server 2005 Enterprise Edition, 1 
&lt;li&gt;
Microsoft Office Live Communication Server 2005 Enterprise Edition CALs, 25 
&lt;li&gt;
Microsoft Virtual Server Enterprise Edition, 2 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Microsoft Action Pack Licensing Benefits&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Microsoft Business Contact Manager for Office Outlook 2003, localized versions, 10 
&lt;li&gt;
Microsoft Business Contact Manager Update for Microsoft Office Outlook 2003 Service
Pack 1*, N/A 
&lt;li&gt;
Microsoft CRM 3.0 Small Business Edition, 1 
&lt;li&gt;
Microsoft Exchange Server 2003 Standard, 1 
&lt;li&gt;
Microsoft Exchange Server 2003 Service Pack 2*, N/A 
&lt;li&gt;
Microsoft ISA Server 2004, including Service Pack 1 Multilingual Pack, 1 
&lt;li&gt;
Microsoft Live Communications Server 2005, 1 
&lt;li&gt;
Microsoft MapPoint 2004 Standard Edition (North America only), 10 
&lt;li&gt;
Microsoft Office FrontPage 2003, 10 
&lt;li&gt;
Microsoft Office InfoPath 2003, 10 
&lt;li&gt;
Microsoft Office Professional Edition 2003, 10 
&lt;li&gt;
Microsoft Office Professional Edition 2003 Service Pack 2*, N/A 
&lt;li&gt;
Microsoft Office Project Professional 2003, 10 
&lt;li&gt;
Microsoft Office Project Server 2003, 1 
&lt;li&gt;
Microsoft Office SharePoint Portal Server 2003, 1 
&lt;li&gt;
Microsoft Office Small Business Accounting 2006 (U.S. only)**, 10 
&lt;li&gt;
Microsoft Office Visio Professional 2003, 10 
&lt;li&gt;
Microsoft Office OneNote 2003, 10 
&lt;li&gt;
Microsoft Operations Manager 2005 Workgroup Edition, 10 
&lt;li&gt;
Microsoft SQL Server 2005 Standard Edition, 1 
&lt;li&gt;
Microsoft System Center Data Protection Manager 2006 multilanguage version, 10 
&lt;li&gt;
Microsoft Virtual PC 2004, 10 
&lt;li&gt;
Microsoft Visual Basic 2005 Express Edition, 10 
&lt;li&gt;
Microsoft Visual Web Developer 2005 Express Edition, 10 
&lt;li&gt;
Microsoft Windows Server 2003 Standard Edition, including Service Pack 1, 1 
&lt;li&gt;
Microsoft Windows Server 2003 Web Edition, 1 
&lt;li&gt;
Microsoft Windows SharePoint Services Standard 2003, 1 
&lt;li&gt;
Microsoft Windows Small Business Server 2003 Premium Edition, including Service Pack
1, 1 
&lt;li&gt;
Microsoft Windows XP Professional Edition, including Service Pack 2, 10 
&lt;li&gt;
Microsoft Windows XP Professional x64 Edition, 10 
&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=3e3b45ff-ef4b-42ee-8ebe-f5ab84d7faa6" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,3e3b45ff-ef4b-42ee-8ebe-f5ab84d7faa6.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=fcadb5e9-fa32-4edb-8b2e-ee660f6f645e</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,fcadb5e9-fa32-4edb-8b2e-ee660f6f645e.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,fcadb5e9-fa32-4edb-8b2e-ee660f6f645e.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=fcadb5e9-fa32-4edb-8b2e-ee660f6f645e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A project manager came to me this week and asked for a new web page on an existing
site. No problem. Then she said this enterprise client is very interested in
ROI for this page. How can the client track hits on this page and activity within
the page? Well, they have software for log file parsing, but its not easily availlable
to the client. So, I fired up Visual Studio.Net and built some software that writes
the unique combinations of referring URLs and the date to an XML file. If two people
come from the same referring URL on the same date, the counter of the element is incremented.
If its the same referring URL, but the date is different, a new element is inserted
into the XML file and the counter is set to one. I wrote the software for
this mini-tracking service and passed it off to another developer for the actual build. 
</p>
        <p>
This solution allows the client to capture the desired data and periodically recieve
reports on the traffic to this specific page. I spent about 30 minutes writing 67
lines of C# code (including blank lines for readability). The Microsoft .Net Framework
provided a very simple method for me to manipulate an XML file on disk, and increment
counters based on the activities on the URL. 
</p>
        <p>
A few days ago, we had another rush order for a different client. The task was to
create a simple form that enabled visitors to submit a varying number of email addresses
to a central repository. The new ASP.Net Wizard control was perfect for this. It handled
all of the state control and provided the Previous and Next buttons for me. I supplied
the interface on each wizard step along with the logic for validation and data persistence.
It was an easy way to plug in the logic that was unique to my application, but let
.Net handle the common tasks of paging between steps and notifying the business logic
of when it should ask for data validation or when its time to save the data. Glorious.
</p>
        <p>
With the new presentation layer developer on staff, I was able to stick to what I
do best, writing software, and hand off this application to the specialist who made
it look just right in my browser. Its fantastic when you can leverage what people
and frameworks do best; then you can focus on what you do best. It really helps you
be curious about the other specialists skills instead of being wildly dependent on
doing a sufficient job in those niche areas yourself. Its like having won the entire
game in darts by surpassing 18 points and still having one more game
of Cricket to play to complete the match. Its interesting, but not dangerous.
</p>
        <p>
2006 is going to be a great year.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=fcadb5e9-fa32-4edb-8b2e-ee660f6f645e" />
      </body>
      <title>Gotta Love .Net</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,fcadb5e9-fa32-4edb-8b2e-ee660f6f645e.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/03/03/GottaLoveNet.aspx</link>
      <pubDate>Fri, 03 Mar 2006 21:13:32 GMT</pubDate>
      <description>&lt;p&gt;
A project manager came to me this week and asked for a new web page on an existing
site. No problem. Then she said this enterprise&amp;nbsp;client is very interested in
ROI for this page. How can the client track hits on this page and activity within
the page? Well, they have software for log file parsing, but its not easily availlable
to the client. So, I fired up Visual Studio.Net and built some software that writes
the unique combinations of referring URLs and the date to an XML file. If two people
come from the same referring URL on the same date, the counter of the element is incremented.
If its the same referring URL, but the date is different, a new element is inserted
into the XML file and the counter is set to one. I wrote the&amp;nbsp;software&amp;nbsp;for
this mini-tracking service and passed it off to another developer for the actual build.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
This solution allows the client to capture the desired data and periodically recieve
reports on the traffic to this specific page. I spent about 30 minutes writing 67
lines of C# code (including blank lines for readability). The Microsoft .Net Framework
provided a very simple method for me to manipulate an XML file on disk, and increment
counters based on the activities on the URL. 
&lt;/p&gt;
&lt;p&gt;
A few days ago, we had another rush order for a different client. The task was to
create a simple form that enabled visitors to submit a varying number of email addresses
to a central repository. The new ASP.Net Wizard control was perfect for this. It handled
all of the state control and provided the Previous and Next buttons for me. I supplied
the interface on each wizard step along with the logic for validation and data persistence.
It was an easy way to plug in the logic that was unique to my application, but let
.Net handle the common tasks of paging between steps and notifying the business logic
of when it should ask for data validation or when its time to save the data. Glorious.
&lt;/p&gt;
&lt;p&gt;
With the new presentation layer developer on staff, I was able to stick to what I
do best, writing software, and hand off this application to the specialist who made
it look just right in my browser. Its fantastic when you can leverage&amp;nbsp;what people
and frameworks do best; then you can focus on what you do best. It really helps you
be curious about the other specialists skills instead of being wildly dependent on
doing a sufficient job in those niche areas yourself. Its like having won the entire
game in darts by surpassing 18 points&amp;nbsp;and still having&amp;nbsp;one more&amp;nbsp;game
of Cricket to play to complete the match. Its interesting, but not dangerous.
&lt;/p&gt;
&lt;p&gt;
2006 is going to be a great year.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=fcadb5e9-fa32-4edb-8b2e-ee660f6f645e" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,fcadb5e9-fa32-4edb-8b2e-ee660f6f645e.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=fe94199b-cb94-4a0e-92bf-a81e4c6786ba</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,fe94199b-cb94-4a0e-92bf-a81e4c6786ba.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,fe94199b-cb94-4a0e-92bf-a81e4c6786ba.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=fe94199b-cb94-4a0e-92bf-a81e4c6786ba</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img src="http://andrew.staging.popart.com/content/binary/exchange.jpg" border="0" />
          <br />
I did some research for my boss last week on the new Office 12 and the Exchange 12
products due out in Q4 of 2006. They look pretty good. There's a ton of information
out there: blogs, sites, events and workshops. Everyone uses Microsoft Word, Excel,
and PowerPoint. Email has been a mission critical service since the mid-to-late
90's. The Exchange 12 Server has been moved to x64 based architecture to increase
reliability. They're not even bothering with lessor systems. I've been attending workshops
regularly with my team on the new SharePoint tools and Workflow. Based on my research
documented on our Wiki, it looks like we're targeting a deployment of Q1 2007.
Its going to be a good year.
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=fe94199b-cb94-4a0e-92bf-a81e4c6786ba" />
      </body>
      <title>We Like Mail</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,fe94199b-cb94-4a0e-92bf-a81e4c6786ba.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/03/01/WeLikeMail.aspx</link>
      <pubDate>Wed, 01 Mar 2006 18:49:42 GMT</pubDate>
      <description>&lt;p&gt;
&lt;img src="http://andrew.staging.popart.com/content/binary/exchange.jpg" border=0&gt;
&lt;br&gt;
I did some research for my boss last week on the new Office 12 and the Exchange 12
products due out in Q4 of 2006. They look pretty good. There's a ton of information
out there: blogs, sites, events and workshops. Everyone uses Microsoft Word, Excel,
and PowerPoint.&amp;nbsp;Email has been a mission critical service since the&amp;nbsp;mid-to-late
90's. The Exchange 12 Server has been moved to x64 based architecture to increase
reliability. They're not even bothering with lessor systems. I've been attending workshops
regularly with my team on the new SharePoint tools and Workflow. Based on my research
documented on our Wiki,&amp;nbsp;it looks like we're targeting a deployment of Q1 2007.
Its going to be a good year.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=fe94199b-cb94-4a0e-92bf-a81e4c6786ba" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,fe94199b-cb94-4a0e-92bf-a81e4c6786ba.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=c1708d52-69cd-4f8b-b757-aa6cf5f7bdf9</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,c1708d52-69cd-4f8b-b757-aa6cf5f7bdf9.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,c1708d52-69cd-4f8b-b757-aa6cf5f7bdf9.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=c1708d52-69cd-4f8b-b757-aa6cf5f7bdf9</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
So I opted in for the beta of Windows Live Mail. It's pretty sweet. Everything you'd
expect from a leading AJAX enabled browser application. Plenty of Windows client-like
behaviors, right clicking, context menus, the works! The future looks bright.
</p>
        <img src="http://andrew.staging.popart.com/content/binary/mail.png" border="1" />
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=c1708d52-69cd-4f8b-b757-aa6cf5f7bdf9" />
      </body>
      <title>Windows Live Mail Beta</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,c1708d52-69cd-4f8b-b757-aa6cf5f7bdf9.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/02/21/WindowsLiveMailBeta.aspx</link>
      <pubDate>Tue, 21 Feb 2006 22:57:14 GMT</pubDate>
      <description>&lt;p&gt;
So I opted in for the beta of Windows Live Mail. It's pretty sweet. Everything you'd
expect from a leading AJAX enabled browser application. Plenty of Windows client-like
behaviors, right clicking, context menus, the works! The future looks bright.
&lt;/p&gt;
&lt;img src="http://andrew.staging.popart.com/content/binary/mail.png" border=1&gt;&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=c1708d52-69cd-4f8b-b757-aa6cf5f7bdf9" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,c1708d52-69cd-4f8b-b757-aa6cf5f7bdf9.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=274a505a-337a-4736-9691-57bbeb281054</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,274a505a-337a-4736-9691-57bbeb281054.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,274a505a-337a-4736-9691-57bbeb281054.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=274a505a-337a-4736-9691-57bbeb281054</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This <a href="http://www.dotnetrocks.com/default.aspx?showID=165">podcast</a> summed
up my last few outsourcing experiences pretty well. If you're working for a company
that includes this option in it's technical strategy, you have to listen to it.
</p>
        <img src="http://andrew.staging.popart.com/content/binary/title.jpg" border="0" />
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=274a505a-337a-4736-9691-57bbeb281054" />
      </body>
      <title>Outsourcing Gems</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,274a505a-337a-4736-9691-57bbeb281054.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/02/14/OutsourcingGems.aspx</link>
      <pubDate>Tue, 14 Feb 2006 15:55:02 GMT</pubDate>
      <description>&lt;p&gt;
This &lt;a href="http://www.dotnetrocks.com/default.aspx?showID=165"&gt;podcast&lt;/a&gt; summed
up my last few outsourcing experiences pretty well. If you're working for a company
that includes this option in it's technical strategy, you have to listen to it.
&lt;/p&gt;
&lt;img src="http://andrew.staging.popart.com/content/binary/title.jpg" border=0&gt;&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=274a505a-337a-4736-9691-57bbeb281054" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,274a505a-337a-4736-9691-57bbeb281054.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=33b6770a-4b6b-4f57-acd4-7bcf1df066fd</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,33b6770a-4b6b-4f57-acd4-7bcf1df066fd.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,33b6770a-4b6b-4f57-acd4-7bcf1df066fd.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=33b6770a-4b6b-4f57-acd4-7bcf1df066fd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've been reading up on a new technology emerging from Microsoft. Its called Windows
Workflow Foundation and its part of the WinFX. Here's some high level background info
from a key website:
</p>
        <div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #eeeeee">
          <p>
            <a href="http://www.windowsworkflow.net/">http://www.windowsworkflow.net</a>
          </p>
          <p>
Windows Workflow Foundation is an extensible programming model and runtime components
for building solutions on the Windows platform. As a platform component, Windows Workflow
Foundation will be included with the WinFx runtime components 3.0. Windows Workflow
Foundation will also be available as a downloadable component in the second half of
2006. 
</p>
          <p>
You can start using Windows Workflow Foundation <b>within your own applications</b> or
through <b>Windows SharePoint Services</b> in Office "12".
</p>
        </div>
        <p>
This technology has a very broad reach. I can envision several applications that would
benefit from an easier method of building sophisticated workflow. A visual designer
is used to build the workflows. That's going to help non-programmers feel more at
ease with developing a system using WWF.
</p>
        <p>
The technology is currently in Beta 2. I'm a little discouraged that a specific installation
order is required. This <a href="http://msdn.microsoft.com/windowsvista/getthebeta/default.aspx">site</a> lets
you download the beta, but the text about the specific install order is easy to miss. 
</p>
        <p>
 
</p>
        <div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #eeeeee">
          <p>
The following must be installed in the order presented.<br /><br /><b>If you want only to run WinFX applications:</b><br /><br />
WinFX RTC<br /><br /><b>If you want to develop and run WinFX applications:</b><br /><br />
WinFX RTC 
<br /><br />
[Optional] Visual Studio - You can use either a full version (available in the MSDN
Subscribers Download section) or the free Visual Studio 2005 Express Edition. 
<br /><br />
Windows SDK 
<br /><br />
[Optional] Visual Studio 2005 Extensions for WinFX 
<br /><br />
[Optional] Visual Studio 2005 Extensions for Windows Workflow Foundation 
<br /><br /></p>
        </div>
        <p>
I can think of at least three applications we're talking about right now that could
benefit from this technology. Yet, I'm very mindful of not jumping in too fast. I
know it will be an important technology, but we need to develop some competencies
in it first. Saddle up!
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=33b6770a-4b6b-4f57-acd4-7bcf1df066fd" />
      </body>
      <title>Windows Workflow Foundation</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,33b6770a-4b6b-4f57-acd4-7bcf1df066fd.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/02/03/WindowsWorkflowFoundation.aspx</link>
      <pubDate>Fri, 03 Feb 2006 17:46:24 GMT</pubDate>
      <description>&lt;p&gt;
I've been reading up on a new technology emerging from Microsoft. Its called Windows
Workflow Foundation and its part of the WinFX. Here's some high level background info
from a key website:
&lt;/p&gt;
&lt;div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #eeeeee"&gt;
&lt;p&gt;
&lt;a href="http://www.windowsworkflow.net/"&gt;http://www.windowsworkflow.net&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Windows Workflow Foundation is an extensible programming model and runtime components
for building solutions on the Windows platform. As a platform component, Windows Workflow
Foundation will be included with the WinFx runtime components 3.0. Windows Workflow
Foundation will also be available as a downloadable component in the second half of
2006. 
&lt;/p&gt;
&lt;p&gt;
You can start using Windows Workflow Foundation &lt;b&gt;within your own applications&lt;/b&gt; or
through &lt;b&gt;Windows SharePoint Services&lt;/b&gt; in Office "12".
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
This technology has a very broad reach. I can envision several applications that would
benefit from an easier method of building sophisticated workflow. A visual designer
is used to build the workflows. That's going to help non-programmers feel more at
ease with developing a system using WWF.
&lt;/p&gt;
&lt;p&gt;
The technology is currently in Beta 2. I'm a little discouraged that a specific installation
order is required. This &lt;a href="http://msdn.microsoft.com/windowsvista/getthebeta/default.aspx"&gt;site&lt;/a&gt; lets
you download the beta, but the text about the specific install order is easy to miss. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #eeeeee"&gt;
&lt;p&gt;
The following must be installed in the order presented.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;If you want only to run WinFX applications:&lt;/b&gt;
&lt;br&gt;
&lt;br&gt;
WinFX RTC&lt;br&gt;
&lt;br&gt;
&lt;b&gt;If you want to develop and run WinFX applications:&lt;/b&gt;
&lt;br&gt;
&lt;br&gt;
WinFX RTC 
&lt;br&gt;
&lt;br&gt;
[Optional] Visual Studio - You can use either a full version (available in the MSDN
Subscribers Download section) or the free Visual Studio 2005 Express Edition. 
&lt;br&gt;
&lt;br&gt;
Windows SDK 
&lt;br&gt;
&lt;br&gt;
[Optional] Visual Studio 2005 Extensions for WinFX 
&lt;br&gt;
&lt;br&gt;
[Optional] Visual Studio 2005 Extensions for Windows Workflow Foundation 
&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
I can think of at least three applications we're talking about right now that could
benefit from this technology. Yet, I'm very mindful of not jumping in too fast. I
know it will be an important technology, but we need to develop some competencies
in it first. Saddle up!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=33b6770a-4b6b-4f57-acd4-7bcf1df066fd" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,33b6770a-4b6b-4f57-acd4-7bcf1df066fd.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=f9b20186-073f-4ecc-ac0a-1084dda8d3f4</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,f9b20186-073f-4ecc-ac0a-1084dda8d3f4.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,f9b20186-073f-4ecc-ac0a-1084dda8d3f4.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=f9b20186-073f-4ecc-ac0a-1084dda8d3f4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.microsoft.com/windows/support/endofsupport.mspx">End of support
for Windows 98 and Windows Me</a>
        </p>
        <p>
Effective June 30, 2006, support for Windows 98, Windows 98 Second Edition, and Windows
Millennium Edition (Windows Me) will end. Existing support documents, however, will
continue to be available through the Microsoft Support Product Solution Center site.
</p>
        <p>
This was like a weird uncle for me. I never knew him that well, but others might have.
I made the jump from Win'95 to Windows 2000 and skipped right over it.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=f9b20186-073f-4ecc-ac0a-1084dda8d3f4" />
      </body>
      <title>Bye Bye, Old Friend</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,f9b20186-073f-4ecc-ac0a-1084dda8d3f4.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/02/01/ByeByeOldFriend.aspx</link>
      <pubDate>Wed, 01 Feb 2006 18:24:57 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.microsoft.com/windows/support/endofsupport.mspx"&gt;End of support
for Windows 98 and Windows Me&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Effective June 30, 2006, support for Windows 98, Windows 98 Second Edition, and Windows
Millennium Edition (Windows Me) will end. Existing support documents, however, will
continue to be available through the Microsoft Support Product Solution Center site.
&lt;/p&gt;
&lt;p&gt;
This was like a weird uncle for me. I never knew him that well, but others might have.
I made the jump from Win'95 to Windows 2000 and skipped right over it.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=f9b20186-073f-4ecc-ac0a-1084dda8d3f4" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,f9b20186-073f-4ecc-ac0a-1084dda8d3f4.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=cd8ae339-8ed0-4ad7-9613-7392f6c71ed6</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,cd8ae339-8ed0-4ad7-9613-7392f6c71ed6.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,cd8ae339-8ed0-4ad7-9613-7392f6c71ed6.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=cd8ae339-8ed0-4ad7-9613-7392f6c71ed6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>Hey, I got the January post in just in time (that's JIT) to you programmers.</em>
        </p>
        <p>
          <a href="http://www.web2con.com/">
            <img src="http://andrew.staging.popart.com/content/binary/web20conf.gif" border="0" />
          </a>
        </p>
        <p>
So, like a lot of things, the importance of Web 2.0 depends on who you are.
If you're new to the term of Web 2.0, I've included some important links that help
frame the conversation below. Its a difficult term to define. Some of the best I've
seen define it as an attitude or thought process. They utilize the most compelling
features of the latest software: the web as a service, exposing data that was once
isoloated in a silo, enabling the network to comprehend data as well as you do, and
applications that improve simply by having more people use them.
</p>
        <p>
Here are a few brief scenarios of people who may or may not know the Web 2.0
stick came up and knocked 'em in the head.
</p>
        <p>
          <strong>Chuckie the 14 year old music enthusiast</strong>
          <br />
Come on, Chuckie doesn't know what this is!?!? He was his <a href="http://www.music.com/">rock</a> and
he wants it now. Its tough being a teen! Services like <a href="http://www.napster.com/">Napster</a> and
blogs are great for exposing people to ideas, concepts and points of view. Chuckie
has over 200 people in his <a href="http://messenger.msn.com/">Instant Messenger</a> list
and he interacts with them every night after school.
</p>
        <p>
          <strong>Shawndell the housewife and online consumer</strong>
          <br />
Websites like <a href="http://www.amazon.com/">Amazon</a> expose their data for others
to consume and build upon. The plethora of services spawned by <a href="http://www.codeproject.com/aspnet/amazonportal.asp">Amazon’s
web service</a> contributes to a rich market place of products and services available.
Where else can you read up and compare the <a href="http://www.irobot.com/">iRobot</a> Roomba
4210? 
</p>
        <p>
          <strong>Mystie the hardcore C# web application programmer</strong>
          <br />
Well, it means Mystie has a good job for a while. No matter which Web 2.0 camp you're
in, <em>computer-centric</em> or <em>people-centric</em>, you have to admit its not
easy to build systems that run quickly, without errors and get better the more people
use them. Mystie also has to get on her horse and start learning a ton of new technologies: <a href="http://www.telerik.com/Default.aspx?PageId=2527">AJAX</a>, <a href="http://msdn.microsoft.com/webservices/">Web
Services</a>, <a href="http://msdn.microsoft.com/windowsvista/">Avalon</a>, <a href="http://msdn.microsoft.com/webservices/default.aspx?pull=/library/en-us/dnlong/html/introindigov1-0.asp">Indigo</a>,
and <a href="http://msdn.microsoft.com/windowsvista/building/workflow/">WinFX</a>. 
</p>
        <p>
          <strong>Alphonzo the designer</strong>
          <br />
Zo’s realm of possibilities just got bigger; Photoshop is just the start. He’s <a href="http://popcornsmell.blogspot.com/">thinking</a> about
interactivity, how to represent dynamic information that he’ll never see, like a movie
review, instant message, or aggregated blog posts. <a href="http://en.wikipedia.org/wiki/Mainframe_computer">A
few years ago</a>, he was greatly limited by how much could be accomplished in the
project lifecycle. The <a href="http://www.dotnetnuke.com/">frameworks</a> that have <a href="http://lhotka.net/">sprung</a> up
in the past year have reduced the barriers to really <a href="http://www.dasblog.info/">cool</a> applications. 
</p>
        <p>
There have been some great posts about this new word. I've aggregated some of them
here. I've included the links to the website and some excerpts from the postings.
I encourage you to follow those links and keep up on the conversation. Its sure to
have some insightful nuggets beyond what I've posted here. They respresent a wide
range of opinions and viewpoints on the definition and significance of Web 2.0.
</p>
        <p>
          <hr />
        </p>
        <p>
        </p>
        <p>
          <a href="http://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09/30/what-is-web-20.html">
            <strong>http://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09/30/what-is-web-20.html</strong>
          </a>
        </p>
        <p>
          <em>The concept of "Web 2.0" began with a conference brainstorming session between
O'Reilly and MediaLive International. Dale Dougherty, web pioneer and O'Reilly VP,
noted that far from having "crashed", the web was more important than ever, with exciting
new applications and sites popping up with surprising regularity. What's more, the
companies that had survived the collapse seemed to have some things in common. Could
it be that the dot-com collapse marked some kind of turning point for the web, such
that a call to action such as "Web 2.0" might make sense? We agreed that it did, and
so the Web 2.0 Conference was born.</em>
        </p>
        <p>
          <em>In our initial brainstorming, we formulated our sense of Web 2.0 by example: </em>
        </p>
        <p>
          <em>Web 1.0 --&gt; Web 2.0 </em>
        </p>
        <p>
          <em>DoubleClick --&gt; Google 
<br />
AdSense Ofoto --&gt; Flickr 
<br />
Akamai --&gt; BitTorrent 
<br />
mp3.com --&gt; Napster 
<br />
Britannica Online --&gt; Wikipedia 
<br />
personal websites --&gt; blogging 
<br />
evite --&gt; upcoming.org and EVDB 
<br />
domain name speculation --&gt; search engine optimization 
<br />
page views --&gt; cost per click 
<br />
screen scraping --&gt; web services 
<br />
publishing --&gt; participation 
<br />
content management systems --&gt; wikis 
<br />
directories (taxonomy) --&gt; tagging ("folksonomy") 
<br />
stickiness --&gt; syndication </em>
        </p>
        <p>
          <em>What we believe to be the core competencies of Web 2.0 companies: </em>
        </p>
        <ul>
          <li>
            <em>Services, not packaged software, with cost-effective scalability </em>
          </li>
          <li>
            <em>Control over unique, hard-to-recreate data sources that get richer as more people
use them</em>
          </li>
          <li>
            <em>Trusting users as co-developers </em>
          </li>
          <li>
            <em>Harnessing collective intelligence </em>
          </li>
          <li>
            <em>Leveraging the long tail through customer self-service </em>
          </li>
          <li>
            <em>Software above the level of a single device </em>
          </li>
          <li>
            <em>Lightweight user interfaces, development models, AND business models </em>
          </li>
        </ul>
        <p>
          <em>The next time a company claims that it's "Web 2.0," test their features against
the list above. The more points they score, the more they are worthy of the name.
Remember, though, that excellence in one area may be more telling than some small
steps in all seven. </em>
        </p>
        <p>
          <a href="http://radar.oreilly.com/archives/2005/10/web_20_compact_definition.html">
            <strong>http://radar.oreilly.com/archives/2005/10/web_20_compact_definition.html</strong>
          </a>
        </p>
        <ul>
          <li>
            <em>Web 2.0 is the network as platform, spanning all connected devices; Web 2.0 applications
are those that make the most of the intrinsic advantages of that platform: delivering
software as a continually-updated service that gets better the more people use it,
consuming and remixing data from multiple sources, including individual users, while
providing their own data and services in a form that allows remixing by others, creating
network effects through an "architecture of participation," and going beyond the page
metaphor of Web 1.0 to deliver rich user experiences.</em>
          </li>
          <li>
            <em>That's a great definition, though it also seems that many people pushing various
web technologies (AJAX) seem to think that's a Web 2.0 thing even though its been
around for years. Your definition is the most accurate for what I'd consider the "true"
Web 2.0 applications (del.icio.us, Upcoming, etc.) Posted by: Ben Bangert at October
2, 2005 10:05 AM</em>
          </li>
          <li>
            <em>Web 2.0 is definitely about people -- I believe that the central principle of
success in web 2.0 applications is harnessing the collective intelligence of users
-- and in my talks, I've often pointed to "the mechanical Turk, a 19th century chess
playing automaton with a man hidden inside, as a metaphor for modern web applications,
with programmers hidden inside them, performing their daily tasks. (See also my debate
with Dave Stutz about how even these web applications harden over time.) I believe
that time will show that Web 2.0 started out with exactly the opposite of Dan's formulation:
"Web 1.0 was about connecting computers and making technology more efficient for computers.
Web 2.0 is about connecting people, and making technology for efficient for people.” </em>
          </li>
        </ul>
        <p>
          <a href="http://radar.oreilly.com/archives/2005/08/not_20.html">
            <em>
              <strong>http://radar.oreilly.com/archives/2005/08/not_20.html</strong>
            </em>
          </a>
        </p>
        <p>
          <em>Tim Bray writes: I just wanted to say how much I’ve come to dislike this “Web
2.0” faux-meme. It’s not only vacuous marketing hype, it can’t possibly be right.
In terms of qualitative changes of everyone’s experience of the Web, the first happened
when Google hit its stride and suddenly search was useful for, and used by, everyone
every day. The second—syndication and blogging turning the Web from a library into
an event stream—is in the middle of happening. So a lot of us are already on 3.0.
Anyhow, I think Usenet might have been the real 1.0. But most times, the whole thing
still feels like a shaky early beta to me.</em>
        </p>
        <ul>
          <li>
            <em>While being completely right in the details (we are quite arguably on 3.0 or even
8.0 if we're thinking about the internet compared to other software versioning), Tim
is completely wrong about the big picture. Memes are almost always "marketing hype"
-- bumper stickers is a better way to say it -- but they tend to catch on only if
they capture some bit of the zeitgeist. The reason that the term "Web 2.0" has been
bandied about so much since Dale Dougherty came up with it a year and a half ago in
a conference planning session (leading to our Web 2.0 Conference) is because it does
capture the widespread sense that there's something qualitatively different about
today's web.</em>
          </li>
          <li>
            <em>More immediately, Web 2.0 is the era when people have come to realize that it's
not the software that enables the web that matters so much as the services that are
delivered over the web.</em>
          </li>
          <li>
            <em>You have to remember that every revolution occurs in stages, and often isn't recognized
till long after the new world is in place. The PC revolution began in the early 80s,
and most of the key PC companies and technology innovations were founded in that decade,
but it wasn't till the mid-90s that the new shape of the computer industry was clear
to everyone.</em>
          </li>
          <li>
            <em>Perhaps I'm biased, because O'Reilly was the source and has been one of the biggest
promoters of the Web 2.0 meme, but I think it captures exactly where we are at this
moment: a widespread awakening to the fact that the game has changed.</em>
          </li>
          <li>
            <em>There might be a better name (I tried "internet operating system" on for size
starting back in 2000), but the fact that Web 2.0 has caught on says that it's as
good a term as any. While the patterns that constitute Web 2.0 are far from completely
understood, there's a kind of intuitive recognition of sites that are expressing the
new model.</em>
          </li>
          <li>
            <em>I guess it's the old debate between language purists, and language pragmatists.
The right words are the ones people actually use, and this word is catching on.</em>
          </li>
          <li>
            <em>Obviously I can't disagree with your definition of Web 2.0, with O'Reilly being
the source... But what shifted my opinion of the meme from "hot air" to "something
useful" was Ian Davis' suggestion that Web 2.0 is an attitude not a technology. </em>
          </li>
        </ul>
        <p>
          <a href="http://www.nik.com.au/archives/2005/10/26/what-web-20-means-for-business/">
            <em>
              <strong>http://www.nik.com.au/archives/2005/10/26/what-web-20-means-for-business/</strong>
            </em>
          </a>
        </p>
        <ul>
          <li>
            <em>Tim O'Reilly, who describes Web 2.0 as an "architecture of participation"</em>
          </li>
          <li>
            <em>Jeff Bezos said "Web 1.0 was all about making the web easier for users to understand,
Web2.0 is all about making the web easier for computers to understand".</em>
          </li>
          <li>
            <em>Web 2.0 is all about making software, web applications and a web service easier
to inter-operate.</em>
          </li>
          <li>
            <em>AJAX is about making the web experience for a user as easy if not better than
the desktop experience.</em>
          </li>
          <li>
            <em>Flickr and Gmail are not Web 2.0 applications – Web 2.0 applications have nothing
to do with using Javascript, CSS, XHTML, using Web 2.0 colors and fonts but rather
how the application presents itself to other applications</em>
          </li>
          <li>
            <em>The great Web2.0 applications will be those that take care of a small niche, and
do it very well. A great Web 2.0 application becomes a module in a bigger broader
solution while at the same time being an application that the user can also make use
of independently.</em>
            <ul>
              <li>
                <em>Google maps</em>
              </li>
              <li>
                <em>Google Maps Mania, a blog showcasing integration work. o As an analogy, it is
like using standard libraries when developing applications – there is no need to write
your own components when they are readily available.</em>
              </li>
              <li>
                <em>The core competency at Amazon is their massive catalog and the breadth of metadata
available with each article within the catalog. Amazon are adapting to Web 2.0 and
are opening up their application as a web service. This service becomes a back-end
component to other offerings that have added value in their own way.</em>
              </li>
              <li>
                <em>Salesforce.com realizes that they are never going to be able to extend their application
to suit every requirement of every customer. Their approach is to open up their CRM
and allow others to develop interfaces that are able to speak to it.</em>
              </li>
              <li>
                <em>If today you are designing a web application for Web 2.0, think not about how
the user will see it. Do not attempt to implement a solution that does everything,
and do not attempt 'one size fits all' solutions. A Web 2.0 business should rather
think more about how they can take and application and work with other solutions,
specifically piggy-backing off of large base providers such as Salesforce. This approach
provides maximum value to your customer or user and allows a Web2.0 company to focus
on one core competency and to be the best at it.</em>
              </li>
            </ul>
          </li>
        </ul>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=cd8ae339-8ed0-4ad7-9613-7392f6c71ed6" />
      </body>
      <title>Web 2.0 and What It Means To You</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,cd8ae339-8ed0-4ad7-9613-7392f6c71ed6.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2006/01/31/Web20AndWhatItMeansToYou.aspx</link>
      <pubDate>Tue, 31 Jan 2006 23:09:26 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;Hey, I got the January post in just in time (that's JIT) to you programmers.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.web2con.com/"&gt;&lt;img src="http://andrew.staging.popart.com/content/binary/web20conf.gif" border=0&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
So, like a lot of things,&amp;nbsp;the importance of Web 2.0&amp;nbsp;depends on who you are.
If you're new to the term of Web 2.0, I've included some important links that help
frame the conversation below. Its a difficult term to define. Some of the best I've
seen define it as an attitude or thought process. They utilize the most compelling
features of the latest software: the web as a service, exposing data that was once
isoloated in a silo, enabling the network to comprehend data as well as you do, and
applications that improve simply by having more people use them.
&lt;/p&gt;
&lt;p&gt;
Here are a few brief&amp;nbsp;scenarios of people who may or may not know the Web 2.0
stick came up and knocked 'em in the head.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Chuckie the 14 year old music enthusiast&lt;/strong&gt;
&lt;br&gt;
Come on, Chuckie doesn't know what this is!?!? He was his &lt;a href="http://www.music.com/"&gt;rock&lt;/a&gt; and
he wants it now. Its tough being a teen! Services like &lt;a href="http://www.napster.com/"&gt;Napster&lt;/a&gt; and
blogs are great for exposing people to ideas, concepts and points of view. Chuckie
has over 200 people in his &lt;a href="http://messenger.msn.com/"&gt;Instant Messenger&lt;/a&gt; list
and he&amp;nbsp;interacts with them every night after school.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Shawndell the housewife and online consumer&lt;/strong&gt; 
&lt;br&gt;
Websites like &lt;a href="http://www.amazon.com/"&gt;Amazon&lt;/a&gt; expose their data for others
to consume and build upon. The plethora of services spawned by &lt;a href="http://www.codeproject.com/aspnet/amazonportal.asp"&gt;Amazon’s
web service&lt;/a&gt; contributes to a rich market place of products and services available.
Where else can you read up and compare&amp;nbsp;the &lt;a href="http://www.irobot.com/"&gt;iRobot&lt;/a&gt; Roomba
4210? 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Mystie the hardcore C# web application programmer&lt;/strong&gt; 
&lt;br&gt;
Well, it means Mystie has a good job for a while. No matter which Web 2.0 camp you're
in, &lt;em&gt;computer-centric&lt;/em&gt; or &lt;em&gt;people-centric&lt;/em&gt;, you have to admit its not
easy to build systems that run quickly, without errors and get better the more people
use them. Mystie also has to get on her horse and start learning a ton of new technologies: &lt;a href="http://www.telerik.com/Default.aspx?PageId=2527"&gt;AJAX&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/webservices/"&gt;Web
Services&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/windowsvista/"&gt;Avalon&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/webservices/default.aspx?pull=/library/en-us/dnlong/html/introindigov1-0.asp"&gt;Indigo&lt;/a&gt;,
and &lt;a href="http://msdn.microsoft.com/windowsvista/building/workflow/"&gt;WinFX&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Alphonzo the designer&lt;/strong&gt; 
&lt;br&gt;
Zo’s realm of possibilities just got bigger; Photoshop is just the start. He’s &lt;a href="http://popcornsmell.blogspot.com/"&gt;thinking&lt;/a&gt; about
interactivity, how to represent dynamic information that he’ll never see, like a movie
review, instant message, or aggregated blog posts. &lt;a href="http://en.wikipedia.org/wiki/Mainframe_computer"&gt;A
few years ago&lt;/a&gt;, he was greatly limited by how much could be accomplished in the
project lifecycle. The &lt;a href="http://www.dotnetnuke.com/"&gt;frameworks&lt;/a&gt; that have &lt;a href="http://lhotka.net/"&gt;sprung&lt;/a&gt; up
in the past year have reduced the barriers to really &lt;a href="http://www.dasblog.info/"&gt;cool&lt;/a&gt; applications. 
&lt;/p&gt;
&lt;p&gt;
There have been some great posts about this new word. I've aggregated some of them
here. I've included the links to the website and some excerpts from the postings.
I encourage you to follow those links and keep up on the conversation. Its sure to
have some insightful nuggets beyond what I've posted here. They respresent a wide
range of opinions and viewpoints on the definition and significance of Web 2.0.
&lt;/p&gt;
&lt;p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09/30/what-is-web-20.html"&gt;&lt;strong&gt;http://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09/30/what-is-web-20.html&lt;/strong&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The concept of "Web 2.0" began with a conference brainstorming session between
O'Reilly and MediaLive International. Dale Dougherty, web pioneer and O'Reilly VP,
noted that far from having "crashed", the web was more important than ever, with exciting
new applications and sites popping up with surprising regularity. What's more, the
companies that had survived the collapse seemed to have some things in common. Could
it be that the dot-com collapse marked some kind of turning point for the web, such
that a call to action such as "Web 2.0" might make sense? We agreed that it did, and
so the Web 2.0 Conference was born.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;In our initial brainstorming, we formulated our sense of Web 2.0 by example: &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Web 1.0 --&amp;gt; Web 2.0 &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;DoubleClick --&amp;gt; Google 
&lt;br&gt;
AdSense Ofoto --&amp;gt; Flickr 
&lt;br&gt;
Akamai --&amp;gt; BitTorrent 
&lt;br&gt;
mp3.com --&amp;gt; Napster 
&lt;br&gt;
Britannica Online --&amp;gt; Wikipedia 
&lt;br&gt;
personal websites --&amp;gt; blogging 
&lt;br&gt;
evite --&amp;gt; upcoming.org and EVDB 
&lt;br&gt;
domain name speculation --&amp;gt; search engine optimization 
&lt;br&gt;
page views --&amp;gt; cost per click 
&lt;br&gt;
screen scraping --&amp;gt; web services 
&lt;br&gt;
publishing --&amp;gt; participation 
&lt;br&gt;
content management systems --&amp;gt; wikis 
&lt;br&gt;
directories (taxonomy) --&amp;gt; tagging ("folksonomy") 
&lt;br&gt;
stickiness --&amp;gt; syndication &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;What we believe to be the core competencies of Web 2.0 companies: &lt;/em&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Services, not packaged software, with cost-effective scalability &lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Control over unique, hard-to-recreate data sources that get richer as more people
use them&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Trusting users as co-developers &lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Harnessing collective intelligence &lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Leveraging the long tail through customer self-service &lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Software above the level of a single device &lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Lightweight user interfaces, development models, AND business models &lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;em&gt;The next time a company claims that it's "Web 2.0," test their features against
the list above. The more points they score, the more they are worthy of the name.
Remember, though, that excellence in one area may be more telling than some small
steps in all seven. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://radar.oreilly.com/archives/2005/10/web_20_compact_definition.html"&gt;&lt;strong&gt;http://radar.oreilly.com/archives/2005/10/web_20_compact_definition.html&lt;/strong&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Web 2.0 is the network as platform, spanning all connected devices; Web 2.0 applications
are those that make the most of the intrinsic advantages of that platform: delivering
software as a continually-updated service that gets better the more people use it,
consuming and remixing data from multiple sources, including individual users, while
providing their own data and services in a form that allows remixing by others, creating
network effects through an "architecture of participation," and going beyond the page
metaphor of Web 1.0 to deliver rich user experiences.&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;That's a great definition, though it also seems that many people pushing various
web technologies (AJAX) seem to think that's a Web 2.0 thing even though its been
around for years. Your definition is the most accurate for what I'd consider the "true"
Web 2.0 applications (del.icio.us, Upcoming, etc.) Posted by: Ben Bangert at October
2, 2005 10:05 AM&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Web 2.0 is definitely about people -- I believe that the central principle of
success in web 2.0 applications is harnessing the collective intelligence of users
-- and in my talks, I've often pointed to "the mechanical Turk, a 19th century chess
playing automaton with a man hidden inside, as a metaphor for modern web applications,
with programmers hidden inside them, performing their daily tasks. (See also my debate
with Dave Stutz about how even these web applications harden over time.) I believe
that time will show that Web 2.0 started out with exactly the opposite of Dan's formulation:
"Web 1.0 was about connecting computers and making technology more efficient for computers.
Web 2.0 is about connecting people, and making technology for efficient for people.” &lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;a href="http://radar.oreilly.com/archives/2005/08/not_20.html"&gt;&lt;em&gt;&lt;strong&gt;http://radar.oreilly.com/archives/2005/08/not_20.html&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Tim Bray writes: I just wanted to say how much I’ve come to dislike this “Web
2.0” faux-meme. It’s not only vacuous marketing hype, it can’t possibly be right.
In terms of qualitative changes of everyone’s experience of the Web, the first happened
when Google hit its stride and suddenly search was useful for, and used by, everyone
every day. The second—syndication and blogging turning the Web from a library into
an event stream—is in the middle of happening. So a lot of us are already on 3.0.
Anyhow, I think Usenet might have been the real 1.0. But most times, the whole thing
still feels like a shaky early beta to me.&lt;/em&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;While being completely right in the details (we are quite arguably on 3.0 or even
8.0 if we're thinking about the internet compared to other software versioning), Tim
is completely wrong about the big picture. Memes are almost always "marketing hype"
-- bumper stickers is a better way to say it -- but they tend to catch on only if
they capture some bit of the zeitgeist. The reason that the term "Web 2.0" has been
bandied about so much since Dale Dougherty came up with it a year and a half ago in
a conference planning session (leading to our Web 2.0 Conference) is because it does
capture the widespread sense that there's something qualitatively different about
today's web.&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;More immediately, Web 2.0 is the era when people have come to realize that it's
not the software that enables the web that matters so much as the services that are
delivered over the web.&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;You have to remember that every revolution occurs in stages, and often isn't recognized
till long after the new world is in place. The PC revolution began in the early 80s,
and most of the key PC companies and technology innovations were founded in that decade,
but it wasn't till the mid-90s that the new shape of the computer industry was clear
to everyone.&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Perhaps I'm biased, because O'Reilly was the source and has been one of the biggest
promoters of the Web 2.0 meme, but I think it captures exactly where we are at this
moment: a widespread awakening to the fact that the game has changed.&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;There might be a better name (I tried "internet operating system" on for size
starting back in 2000), but the fact that Web 2.0 has caught on says that it's as
good a term as any. While the patterns that constitute Web 2.0 are far from completely
understood, there's a kind of intuitive recognition of sites that are expressing the
new model.&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;I guess it's the old debate between language purists, and language pragmatists.
The right words are the ones people actually use, and this word is catching on.&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Obviously I can't disagree with your definition of Web 2.0, with O'Reilly being
the source... But what shifted my opinion of the meme from "hot air" to "something
useful" was Ian Davis' suggestion that Web 2.0 is an attitude not a technology. &lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;a href="http://www.nik.com.au/archives/2005/10/26/what-web-20-means-for-business/"&gt;&lt;em&gt;&lt;strong&gt;http://www.nik.com.au/archives/2005/10/26/what-web-20-means-for-business/&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Tim O'Reilly, who describes Web 2.0 as an "architecture of participation"&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Jeff Bezos said "Web 1.0 was all about making the web easier for users to understand,
Web2.0 is all about making the web easier for computers to understand".&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Web 2.0 is all about making software, web applications and a web service easier
to inter-operate.&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;AJAX is about making the web experience for a user as easy if not better than
the desktop experience.&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Flickr and Gmail are not Web 2.0 applications – Web 2.0 applications have nothing
to do with using Javascript, CSS, XHTML, using Web 2.0 colors and fonts but rather
how the application presents itself to other applications&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;The great Web2.0 applications will be those that take care of a small niche, and
do it very well. A great Web 2.0 application becomes a module in a bigger broader
solution while at the same time being an application that the user can also make use
of independently.&lt;/em&gt; 
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Google maps&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Google Maps Mania, a blog showcasing integration work. o As an analogy, it is
like using standard libraries when developing applications – there is no need to write
your own components when they are readily available.&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;The core competency at Amazon is their massive catalog and the breadth of metadata
available with each article within the catalog. Amazon are adapting to Web 2.0 and
are opening up their application as a web service. This service becomes a back-end
component to other offerings that have added value in their own way.&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Salesforce.com realizes that they are never going to be able to extend their application
to suit every requirement of every customer. Their approach is to open up their CRM
and allow others to develop interfaces that are able to speak to it.&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;If today you are designing a web application for Web 2.0, think not about how
the user will see it. Do not attempt to implement a solution that does everything,
and do not attempt 'one size fits all' solutions. A Web 2.0 business should rather
think more about how they can take and application and work with other solutions,
specifically piggy-backing off of large base providers such as Salesforce. This approach
provides maximum value to your customer or user and allows a Web2.0 company to focus
on one core competency and to be the best at it.&lt;/em&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=cd8ae339-8ed0-4ad7-9613-7392f6c71ed6" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,cd8ae339-8ed0-4ad7-9613-7392f6c71ed6.aspx</comments>
      <category>learning</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=657b821d-25c7-4215-a59f-f4d908e07d81</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,657b821d-25c7-4215-a59f-f4d908e07d81.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,657b821d-25c7-4215-a59f-f4d908e07d81.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=657b821d-25c7-4215-a59f-f4d908e07d81</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
AJAX - Asynchronous Javascript and XML
</p>
        <p>
I had a great time working with some AJAX controls on Friday. Telerik has a product
named r.a.d. Callback that implements AJAX and extends its other products nicely. 
</p>
        <p>
AJAX has been around since I.E. 4, so its nothing new. I worked on an Intranet application
in 2000 made use of it. No postbacks in a browser business application is pretty damn
cool. 
</p>
        <p>
This is the way it works: Most browser have javascript enabled. Its a common technique
to do execute some business logic on the browser, without having to post back to the
web server. It has access to everything you see in the browser: textboxes, drop down
lists, radio buttons, checkboxes and even just plain old HTML text.
</p>
        <p>
Here's an example. The user requests a page in their web browser; nothing new here.
The secret is in the javascript in that page. The developer has wired up buttons and
other user actions to the javascript. , The click event of a button could open up
a connection to the web server, send some bits down the wire to the web server, and
expects a response back from the web server; much like a normal postback that every
browser can do. The difference is this communication with the web server is done behind
the scenes and the user doesn't see the browser flicker during the postback event.
The javascript processes the response from the server, and updates a textbox field
on the page. That's about it. 
</p>
        <p>
Now its up to the creativity of the programmer to make it sizzle. Imagine a page that
accepts scores from a dart league game. The user could enter in a set of scores, click
a button, see a new row pop insert into a table in another part of the page, all without
seeing the browser flicker or loose their scroll position on the page. 
</p>
        <p>
Web pages that make use of AJAX behave much like a windows client application. A windows
client application is the opposite of a browser based application. Things like Microsoft
Money or Quickbooks are examples of windows client appications. There are only a few
other types of programs that run on Windows. There are command line programs that
require the use to open up what looks like the old DOS prompt (c:\&gt;), type in the
name of the program, followed by any paramters and what it run. The only other type
of program is a windows service application. This is a program that runs continuously
in the background. It starts up when you turn on your computer and stops when you
turn your computer off. Your virus scanning software is an example of a windows server
application.
</p>
        <p>
AJAX technology has been around for a while in IE, and now are also available in Netscape
and Firefox.
</p>
        <p>
The first A in AJAX is for asynchronous. This means that I can wire up a button click
event that will start up three independent calls to three different web servers and
execute processing at the same time. Each call may take different amounts of time.
The first call might finish immediately and make some update to the page, like turn
a light from red to green. The second call might finish a few seconds later and select
a checkbox. The third call might take the longest and update a timestamp on the page.
The point is that all three calls are executing at the same time. The opposite is
a synchronous processing where the second call cannot start until the first call has
finished. Asynchronous processing can be a real time saver for long running transactions.
</p>
        <p>
The X in AJAX is for XML. This is just an indication of how the javascript sends and
receives data from a web server. It uses XML. The data is packaged up into XML, then
send across the wire to the server. The server reciprocates by receiving the XML package,
processing the request and sending an XML package back to the browser. Its just a
procedure for communicating that's easy for two different computers to understand.
XML is fairly new. I remember using it for the first time in Chicago around 1998.
Before that, if you wanted to exchange data with another computer, you had to agree
on a less intuitive structure, like comma delimited files. But what if your data contained
a comma. You could use a fixed position file where fields start and end at fixed locations.
For example, the name of an employee could start at position 52 and end at position
86. That's how most mainframe computers work today. Its a real hassle understanding
the position to get a single field out of a row in a text file. 
</p>
        <p>
XML is great. It marks up a file much like HTML. For example, this is some XML: 
</p>
        <p>
&lt;root&gt;<br />
 &lt;name&gt;Andrew&lt;/name&gt;<br />
 &lt;age&gt;32&lt;/age&gt;<br />
 &lt;address&gt;Portland, Oregon&lt;/address&gt;<br />
&lt;/root&gt;
</p>
        <p>
Just from that little snippet of XML, and without knowing anything else, your computer
could easily tell what my name was, how old I am and where I live. You didn't have
to know to start looking in position 7 for my name or sort out commas. Its just great.
</p>
        <p>
So the Telerik controls starts with AJAX and extends it quite a bit. I can place one
control on a page, which is as easy as dragging a control from my toolbar onto a page,
and it will automatically write any javascript for me to update a field on my browser.
It writes all of the glue for me. The stuff that opens a connection to the server,
sends a request, receives a request, and updates fields. All by itself!! I don't have
to worry about errors in my own code because I'm not writing it, they are! Its a great
extension that goes well beyond the raw level of access that AJAX provides. I'll give
a show-and-tell demo sometime in the near future. Keep a look out!
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=657b821d-25c7-4215-a59f-f4d908e07d81" />
      </body>
      <title>AJAX and Telerik's r.a.d. Callback product</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,657b821d-25c7-4215-a59f-f4d908e07d81.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2005/11/05/AJAXAndTeleriksRadCallbackProduct.aspx</link>
      <pubDate>Sat, 05 Nov 2005 20:34:43 GMT</pubDate>
      <description>&lt;p&gt;
AJAX - Asynchronous Javascript and XML
&lt;/p&gt;
&lt;p&gt;
I had a great time working with some AJAX controls on Friday. Telerik has a product
named r.a.d. Callback that implements AJAX and extends its other products nicely. 
&lt;/p&gt;
&lt;p&gt;
AJAX has been around since I.E. 4, so its nothing new. I worked on an Intranet application
in 2000 made use of it. No postbacks in a browser business application is pretty damn
cool. 
&lt;/p&gt;
&lt;p&gt;
This is the way it works: Most browser have javascript enabled. Its a common technique
to do execute some business logic on the browser, without having to post back to the
web server. It has access to everything you see in the browser: textboxes, drop down
lists, radio buttons, checkboxes and even just plain old HTML text.
&lt;/p&gt;
&lt;p&gt;
Here's an example. The user requests a page in their web browser; nothing new here.
The secret is in the javascript in that page. The developer has wired up buttons and
other user actions to the javascript. , The click event of a button could open up
a connection to the web server, send some bits down the wire to the web server, and
expects a response back from the web server; much like a normal postback that every
browser can do. The difference is this communication with the web server is done behind
the scenes and the user doesn't see the browser flicker during the postback event.
The javascript processes the response from the server, and updates a textbox field
on the page. That's about it. 
&lt;/p&gt;
&lt;p&gt;
Now its up to the creativity of the programmer to make it sizzle. Imagine a page that
accepts scores from a dart league game. The user could enter in a set of scores, click
a button, see a new row pop insert into a table in another part of the page, all without
seeing the browser flicker or loose their scroll position on the page. 
&lt;/p&gt;
&lt;p&gt;
Web pages that make use of AJAX behave much like a windows client application. A windows
client application is the opposite of a browser based application. Things like Microsoft
Money or Quickbooks are examples of windows client appications. There are only a few
other types of programs that run on Windows. There are command line programs that
require the use to open up what looks like the old DOS prompt (c:\&amp;gt;), type in the
name of the program, followed by any paramters and what it run. The only other type
of program is a windows service application. This is a program that runs continuously
in the background. It starts up when you turn on your computer and stops when you
turn your computer off. Your virus scanning software is an example of a windows server
application.
&lt;/p&gt;
&lt;p&gt;
AJAX technology has been around for a while in IE, and now are also available in Netscape
and Firefox.
&lt;/p&gt;
&lt;p&gt;
The first A in AJAX is for asynchronous. This means that I can wire up a button click
event that will start up three independent calls to three different web servers and
execute processing at the same time. Each call may take different amounts of time.
The first call might finish immediately and make some update to the page, like turn
a light from red to green. The second call might finish a few seconds later and select
a checkbox. The third call might take the longest and update a timestamp on the page.
The point is that all three calls are executing at the same time. The opposite is
a synchronous processing where the second call cannot start until the first call has
finished. Asynchronous processing can be a real time saver for long running transactions.
&lt;/p&gt;
&lt;p&gt;
The X in AJAX is for XML. This is just an indication of how the javascript sends and
receives data from a web server. It uses XML. The data is packaged up into XML, then
send across the wire to the server. The server reciprocates by receiving the XML package,
processing the request and sending an XML package back to the browser. Its just a
procedure for communicating that's easy for two different computers to understand.
XML is fairly new. I remember using it for the first time in Chicago around 1998.
Before that, if you wanted to exchange data with another computer, you had to agree
on a less intuitive structure, like comma delimited files. But what if your data contained
a comma. You could use a fixed position file where fields start and end at fixed locations.
For example, the name of an employee could start at position 52 and end at position
86. That's how most mainframe computers work today. Its a real hassle understanding
the position to get a single field out of a row in a text file. 
&lt;/p&gt;
&lt;p&gt;
XML is great. It marks up a file much like HTML. For example, this is some XML: 
&lt;/p&gt;
&lt;p&gt;
&amp;lt;root&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;lt;name&amp;gt;Andrew&amp;lt;/name&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;lt;age&amp;gt;32&amp;lt;/age&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;lt;address&amp;gt;Portland, Oregon&amp;lt;/address&amp;gt;&lt;br&gt;
&amp;lt;/root&amp;gt;
&lt;/p&gt;
&lt;p&gt;
Just from that little snippet of XML, and without knowing anything else, your computer
could easily tell what my name was, how old I am and where I live. You didn't have
to know to start looking in position 7 for my name or sort out commas. Its just great.
&lt;/p&gt;
&lt;p&gt;
So the Telerik controls starts with AJAX and extends it quite a bit. I can place one
control on a page, which is as easy as dragging a control from my toolbar onto a page,
and it will automatically write any javascript for me to update a field on my browser.
It writes all of the glue for me. The stuff that opens a connection to the server,
sends a request, receives a request, and updates fields. All by itself!! I don't have
to worry about errors in my own code because I'm not writing it, they are! Its a great
extension that goes well beyond the raw level of access that AJAX provides. I'll give
a show-and-tell demo sometime in the near future. Keep a look out!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=657b821d-25c7-4215-a59f-f4d908e07d81" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,657b821d-25c7-4215-a59f-f4d908e07d81.aspx</comments>
      <category>learning</category>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=49f32609-55e1-4d13-9d70-5df0a4c60d59</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,49f32609-55e1-4d13-9d70-5df0a4c60d59.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,49f32609-55e1-4d13-9d70-5df0a4c60d59.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=49f32609-55e1-4d13-9d70-5df0a4c60d59</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've been working on performance improvements to an existing administrative
webpage and the viewstate size was crazy, 80K for just one component! I've happened
upon a feature of the Telerik TreeView control that we're using and it supports Ajax
before it was the big buzzword!! I can populate child nodes of the tree just
by setting one property in the component. This property setting informs the component
to send back an async request for the child nodes of the given node. The server side
method hits and returns the collection of nodes. True page loads are down to about
3 seconds now. Pretty sharp for a huge form.
</p>
        <p>
The viewstate was reduced by 70K on this component and the performance was much
better. Some quick changes on the server side code to replace the OOP model was pretty
straight forward too. Now the page resembles the classic ASP model a little more than
it did before, but the perf is way better. 
</p>
        <p>
I've been turned on to some nice Ajax assemblies in .net (<a href="http://weblogs.asp.net/mschwarz/archive/2005/08/11/422293.aspx">http://weblogs.asp.net/mschwarz/archive/2005/08/11/422293.aspx</a>) that
are worth some more investigation but this just a nice shiny wrapper on stuff that's
been available since 2002, at least that's the last time I've done it. 
</p>
        <p>
As a side note, I met with the SEM folks today who greenlighted the DotNetNuke model
for a new project. I was concerned they would object to the method DNN uses for URL
generation. Basically, it's not the friendly name you'd expect from a hand-coded site,
because, well, its not hand-coded. That was the last big unknown for me. I think we
can tackle pretty much everything else with a little bit of study, hard work and damn
good luck. Wa-hooo!!!
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=49f32609-55e1-4d13-9d70-5df0a4c60d59" />
      </body>
      <title>Oh Glorious ViewState; Why Are Thee So Fat?</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,49f32609-55e1-4d13-9d70-5df0a4c60d59.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2005/09/26/OhGloriousViewStateWhyAreTheeSoFat.aspx</link>
      <pubDate>Mon, 26 Sep 2005 22:43:01 GMT</pubDate>
      <description>&lt;p&gt;
I've been&amp;nbsp;working on performance improvements to&amp;nbsp;an existing administrative
webpage and the viewstate size&amp;nbsp;was crazy, 80K for just one component! I've happened
upon a feature of the Telerik TreeView control that we're using and it supports Ajax
before it was&amp;nbsp;the big buzzword!! I can populate child nodes of the tree just
by setting one property in the component. This property setting informs the component
to send back an async request for the child nodes of the given node. The server side
method hits and returns the collection of nodes. True page loads are down to about
3 seconds now. Pretty sharp for a huge form.
&lt;/p&gt;
&lt;p&gt;
The viewstate was reduced by 70K on this component&amp;nbsp;and the performance was much
better. Some quick changes on the server side code to replace the OOP model was pretty
straight forward too. Now the page resembles the classic ASP model a little more than
it did before, but the perf is way better. 
&lt;/p&gt;
&lt;p&gt;
I've been turned on to some nice Ajax&amp;nbsp;assemblies in .net (&lt;a href="http://weblogs.asp.net/mschwarz/archive/2005/08/11/422293.aspx"&gt;http://weblogs.asp.net/mschwarz/archive/2005/08/11/422293.aspx&lt;/a&gt;)&amp;nbsp;that
are worth some more investigation but this just a nice shiny wrapper on stuff that's
been available since 2002, at least that's the last time I've done it. 
&lt;/p&gt;
&lt;p&gt;
As a side note, I met with the SEM folks today who greenlighted the DotNetNuke model
for a new project. I was concerned they would object to the method DNN uses for URL
generation. Basically, it's not the friendly name you'd expect from a hand-coded site,
because, well, its not hand-coded. That was the last big unknown for me. I think we
can tackle pretty much everything else with a little bit of study, hard work and damn
good luck. Wa-hooo!!!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=49f32609-55e1-4d13-9d70-5df0a4c60d59" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,49f32609-55e1-4d13-9d70-5df0a4c60d59.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=1c44ae25-8e98-4b3d-b611-6faabdf8eb09</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,1c44ae25-8e98-4b3d-b611-6faabdf8eb09.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,1c44ae25-8e98-4b3d-b611-6faabdf8eb09.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=1c44ae25-8e98-4b3d-b611-6faabdf8eb09</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I listened to a podcast of <a href="http://www.dotnetrocks.com">DotNetRocks</a> from a
few months ago and they had one of the principals of <a href="http://www.dotnetnuke.com">DotNetNuke</a> on.
I've heard about this open source effort, but I hadn't played with it much. Last night,
in the matter of 15 minutes, I had downloaded the ASP.Net source code, installed it
and was playing with the page creation feature! Holy Crap! 
</p>
        <p>
I see they also have a book out from Wrox press on the usage of it. They're on v3
right now and support ASP.Net v1.1 with a good eye on v2.0 coming out this fall. It's
quite a system. A ton of features and at first glance, this product is definitely
worth some serious research.
</p>
        <p>
The open source team just focuses on the core features of the system. Other developers
create add-on modules for it. Some modules are free, and others are commerically available.
I would think that one could make a decent go of it for a good module offered at a
reasonable price. 
</p>
        <p>
The site boasts a high number of sites using the framework and they're super tight
with Microsoft. It claims to be in the same space as Microsoft SharePoint (WSS), but
WSS is really for Intranet sites, and this product can easily be pushed into a public
website space. Albeit, WSS is also geared for enterprise use, and many other items,
where this is more for small to medium sized businesses.
</p>
        <p>
Take a look, its worth it!
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=1c44ae25-8e98-4b3d-b611-6faabdf8eb09" />
      </body>
      <title>dotnetnuke is PDK (pretty damn kewl)</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,1c44ae25-8e98-4b3d-b611-6faabdf8eb09.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2005/08/30/dotnetnukeIsPDKPrettyDamnKewl.aspx</link>
      <pubDate>Tue, 30 Aug 2005 15:28:53 GMT</pubDate>
      <description>&lt;p&gt;
I listened to a podcast of &lt;a href="http://www.dotnetrocks.com"&gt;DotNetRocks&lt;/a&gt; from&amp;nbsp;a
few months ago and they had&amp;nbsp;one of the principals&amp;nbsp;of &lt;a href="http://www.dotnetnuke.com"&gt;DotNetNuke&lt;/a&gt; on.
I've heard about this open source effort, but I hadn't played with it much. Last night,
in the matter of 15 minutes, I had downloaded the ASP.Net source code, installed it
and was playing with the page creation feature! Holy Crap!&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
I see they also have a book out from Wrox press on the usage of it. They're on v3
right now and support ASP.Net v1.1 with a good eye on v2.0 coming out this fall. It's
quite a system. A ton of features and at first glance, this product is definitely
worth some serious research.
&lt;/p&gt;
&lt;p&gt;
The open source team just focuses on the core features of the system. Other developers
create add-on modules for it. Some modules are free, and others are commerically available.
I would think that one could make a decent go of it for a good module offered at a
reasonable price. 
&lt;/p&gt;
&lt;p&gt;
The site boasts a high number of sites using the framework and they're super tight
with Microsoft. It claims to be in the same space as Microsoft SharePoint (WSS), but
WSS is really for Intranet sites, and this product can easily be pushed into a public
website space. Albeit, WSS is also geared for enterprise use, and many other items,
where this is more for small to medium sized businesses.
&lt;/p&gt;
&lt;p&gt;
Take a look, its worth it!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=1c44ae25-8e98-4b3d-b611-6faabdf8eb09" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,1c44ae25-8e98-4b3d-b611-6faabdf8eb09.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=d0fbffa1-229d-40b6-816f-76a97c247e37</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,d0fbffa1-229d-40b6-816f-76a97c247e37.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,d0fbffa1-229d-40b6-816f-76a97c247e37.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d0fbffa1-229d-40b6-816f-76a97c247e37</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In the lastest tug of war with the default security settings in IIS6, if it doesn't
know the MIME type of the file you're requesting, even if you totally expected it
to stream down as an octect style... no dice.... IIS6 will just give you the good
ol' 404 and shrug.
</p>
        <p>
I found this nugget that tells you how to edit the MIME type on the web server to
permit people to download files of other MIME types, in my case a .dwg file
</p>
        <p>
          <a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;326965">http://support.microsoft.com/default.aspx?scid=kb;en-us;326965</a>
        </p>
        <p>
Grrrr...
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=d0fbffa1-229d-40b6-816f-76a97c247e37" />
      </body>
      <title>IIS Security &gt; Glad to have it and Dang if it don't cause a ton of problems</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,d0fbffa1-229d-40b6-816f-76a97c247e37.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2005/08/25/IISSecurityGladToHaveItAndDangIfItDontCauseATonOfProblems.aspx</link>
      <pubDate>Thu, 25 Aug 2005 18:36:32 GMT</pubDate>
      <description>&lt;p&gt;
In the lastest tug of war with the default security settings in IIS6, if it doesn't
know the MIME type of the file you're requesting, even if you totally expected it
to stream down as an octect style... no dice.... IIS6 will just give you the good
ol' 404 and shrug.
&lt;/p&gt;
&lt;p&gt;
I found this nugget that tells you how to edit the MIME type on the web server to
permit people to download files of other MIME types, in my case a .dwg file
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;326965"&gt;http://support.microsoft.com/default.aspx?scid=kb;en-us;326965&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Grrrr...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=d0fbffa1-229d-40b6-816f-76a97c247e37" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,d0fbffa1-229d-40b6-816f-76a97c247e37.aspx</comments>
      <category>software</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=d14f5ade-edf7-4d56-98ac-684766c22ec8</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,d14f5ade-edf7-4d56-98ac-684766c22ec8.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,d14f5ade-edf7-4d56-98ac-684766c22ec8.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d14f5ade-edf7-4d56-98ac-684766c22ec8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
So I was wandering around the tech isle in Borders at the mall over the weekend. I
picked up a copy of Project Server 2003 Unleashed. I checked the print date, July
2005. Hmmm.... Project Server 2003, book print date of 2005... We'll I hope it has
a few more nuggets of info. 
<br /><br />
I'm planning on installing Project Server in a sandbox and spiking it to see if it
can help with our forecasting and project status reporting. Being a small organization,
I feel we're agile enough to adapt our methods to a full featured solution. Now its
just a matter of identifing the features and executing a gap analysis. 
<br /><br />
My last job had some beta's of this solution and while interesting, word on the street
(cubicle) was it didn't measure up too well. I didn't get too close to it, just word-of-mouth.
So, I don't know if that was just technical snobbery or an objective evaluation. 
<br /><br />
The book is written by a company who specializes in its installation. They've done
quite a few installations. That alone tells me that someone can make a go of it. If
this app has a full featured system available, and we can get it to work well enough,
it could improve our reporting and forecasting abilities by quite a bit.<br /><br />
The current time system, Cerebro, is an adaptation of the Microsoft ASP.Net Starter
Kits. In particular, the time tracking starter kit. It replaced the home-grown time
app that required you to "punch in" and "punch out" of tasks. Yuck! Good luck if you
were two or three tasks downstream of what you were currently punched into, and had
to go "correct" it. Oye! Plus, that system had craptastic reporting features. Cerebro,
was a major step up from that system. However, the current system is still far from
great. Who doesn't want a new report? Project status reporting is still more difficult
that it needs to be. Consistent time tracking across all employees is policed at a
more manual level than it should be, and approval of a weeks hours isn't available.
But still, compared to the last system, we're getting better. 
<br /><br />
So, I'm hoping that our continued efforts to improve our processes will continue.
We have tons of software at our fingertips, plus there's this thing called "The Internet".
Its just a matter of allocating a sufficient amount of time to consider the problem
and solve it!<br /><img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=d14f5ade-edf7-4d56-98ac-684766c22ec8" /></body>
      <title>Project Server 2003</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,d14f5ade-edf7-4d56-98ac-684766c22ec8.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2005/08/22/ProjectServer2003.aspx</link>
      <pubDate>Mon, 22 Aug 2005 00:38:12 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
So I was wandering around the tech isle in Borders at the mall over the weekend. I
picked up a copy of Project Server 2003 Unleashed. I checked the print date, July
2005. Hmmm.... Project Server 2003, book print date of 2005... We'll I hope it has
a few more nuggets of info. 
&lt;br&gt;
&lt;br&gt;
I'm planning on installing Project Server in a sandbox and spiking it to see if it
can help with our forecasting and project status reporting. Being a small organization,
I feel we're agile enough to adapt our methods to a full featured solution. Now its
just a matter of identifing the features and executing a gap analysis. 
&lt;br&gt;
&lt;br&gt;
My last job had some beta's of this solution and while interesting, word on the street
(cubicle) was it didn't measure up too well. I didn't get too close to it, just word-of-mouth.
So, I don't know if that was just technical snobbery or an objective evaluation. 
&lt;br&gt;
&lt;br&gt;
The book is written by a company who specializes in its installation. They've done
quite a few installations. That alone tells me that someone can make a go of it. If
this app has a full featured system available, and we can get it to work well enough,
it could improve our reporting and forecasting abilities by quite a bit.&lt;br&gt;
&lt;br&gt;
The current time system, Cerebro, is an adaptation of the Microsoft ASP.Net Starter
Kits. In particular, the time tracking starter kit. It replaced the home-grown time
app that required you to "punch in" and "punch out" of tasks. Yuck! Good luck if you
were two or three tasks downstream of what you were currently punched into, and had
to go "correct" it. Oye! Plus, that system had craptastic reporting features. Cerebro,
was a major step up from that system. However, the current system is still far from
great. Who doesn't want a new report? Project status reporting is still more difficult
that it needs to be. Consistent time tracking across all employees is policed at a
more manual level than it should be, and approval of a weeks hours isn't available.
But still, compared to the last system, we're getting better. 
&lt;br&gt;
&lt;br&gt;
So, I'm hoping that our continued efforts to improve our processes will continue.
We have tons of software at our fingertips, plus there's this thing called "The Internet".
Its just a matter of allocating a sufficient amount of time to consider the problem
and solve it!&lt;br&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=d14f5ade-edf7-4d56-98ac-684766c22ec8" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,d14f5ade-edf7-4d56-98ac-684766c22ec8.aspx</comments>
      <category>software</category>
    </item>
  </channel>
</rss>