<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://simonguest.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">simonguest.com</title><subtitle type="html">The only guy at Microsoft allowed to log in as guest</subtitle><id>http://simonguest.com/blogs/smguest/atom.aspx</id><link rel="alternate" type="text/html" href="http://simonguest.com/blogs/smguest/default.aspx" /><link rel="self" type="application/atom+xml" href="http://simonguest.com/blogs/smguest/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.60809.935">Community Server</generator><updated>2008-07-14T12:18:16Z</updated><entry><title>Online Talks from TechEd 2009</title><link rel="alternate" type="text/html" href="http://simonguest.com/blogs/smguest/archive/2009/05/27/Online-Talks-from-TechEd-2009.aspx" /><id>http://simonguest.com/blogs/smguest/archive/2009/05/27/Online-Talks-from-TechEd-2009.aspx</id><published>2009-05-27T17:31:47Z</published><updated>2009-05-27T17:31:47Z</updated><content type="html">&lt;p&gt;Just before heading home from TechEd 2009 in LA, I recorded a couple of online interviews, which are now available:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.msteched.com/online/view.aspx?tid=be79c48c-2215-4960-8acf-758c3dd0e245"&gt;Patterns for Moving to the Cloud&lt;/a&gt;:&amp;#160; Recorded with Denny Boynton, host of ARCast, we chat about where applications live, and what applications make sense for the cloud.&amp;#160; We also cover a set of patterns that was shown in my previous session.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.msteched.com/online/view.aspx?tid=63509b40-d758-4bab-807a-7d08e63aa32b"&gt;Demystifying the Cloud&lt;/a&gt;:&amp;#160; In this talk, I chat with Kevin Remde on what cloud computing means for IT managers, and some of the considerations for moving applications to the cloud.&lt;/p&gt;  &lt;p&gt;These were fun to put together; hope you find them useful.&amp;#160; &lt;/p&gt;&lt;img src="http://simonguest.com/aggbug.aspx?PostID=10103" width="1" height="1"&gt;</content><author><name>smguest</name><uri>http://simonguest.com/members/smguest.aspx</uri></author><category term="Events" scheme="http://simonguest.com/blogs/smguest/archive/tags/Events/default.aspx" /><category term="Technology" scheme="http://simonguest.com/blogs/smguest/archive/tags/Technology/default.aspx" /><category term="Architecture" scheme="http://simonguest.com/blogs/smguest/archive/tags/Architecture/default.aspx" /></entry><entry><title>Slides from TechEd 2009</title><link rel="alternate" type="text/html" href="http://simonguest.com/blogs/smguest/archive/2009/05/14/Slides-from-TechEd-2009.aspx" /><id>http://simonguest.com/blogs/smguest/archive/2009/05/14/Slides-from-TechEd-2009.aspx</id><published>2009-05-14T16:30:41Z</published><updated>2009-05-14T16:30:41Z</updated><content type="html">&lt;p&gt;Today is my last day at TechEd 2009 in LA, and as promised, I’ve uploaded the presentations from the three talks that I’ve given this week.&amp;#160; Thanks again to everyone that attended my talks, and I really enjoyed speaking with many of you after the presentations.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;PRC02 – Demystifying the Cloud&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is the presentation that I gave as part of the architecture preconference on Sunday 10th.&amp;#160; It’s a high level look at cloud computing and covers the definition of running applications on premise, in a hosted environment, and in the cloud, together with many of the considerations for doing so.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://simonguest.com/images/SlidesfromTechEd2009_88A5/image.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://simonguest.com/images/SlidesfromTechEd2009_88A5/image_thumb.png" width="244" height="200" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Click &lt;a href="http://www.slideshare.net/simonguest/demystifying-the-cloud-prc02-guest-1430393"&gt;here&lt;/a&gt; to view the presentation on SlideShare.&lt;/p&gt;  &lt;p&gt;Click &lt;a href="http://simonguest.com/downloads/TechEd2009_PRC02.zip"&gt;here&lt;/a&gt; to download the presentation. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ISB204 – Impact of the Cloud for IT Managers&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This presentation was delivered on Monday at 4.30pm and covers much of the pre-conference material from PRC02, but through the eyes of an IT Manager.&amp;#160; When I was putting the decks together I realized that there were many common concerns shared between the IT Manager (from an operations perspective) and the IT Architect (from a design perspective), in which I try to surface in this deck.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://simonguest.com/images/SlidesfromTechEd2009_88A5/image_3.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://simonguest.com/images/SlidesfromTechEd2009_88A5/image_thumb_3.png" width="244" height="201" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Click &lt;a href="http://www.slideshare.net/simonguest/impact-of-the-cloud-for-it-managers-isb204-guest-1430538"&gt;here&lt;/a&gt; to view the presentation on SlideShare.&lt;/p&gt;  &lt;p&gt;Click &lt;a href="http://simonguest.com/downloads/TechEd2009_ISB204.zip"&gt;here&lt;/a&gt; to download the presentation.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ARC308 – Patterns for Moving to the Cloud&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is my presentation from Tuesday at 8.30am that covered a series of patterns for moving to the cloud.&amp;#160; In this presentation I look at the differences between on premise, hosted, and the cloud, describe some applications that you may find running on premise in a large organization, and then cover five patterns for running these applications in the cloud.&amp;#160; The patterns I cover are:&amp;#160; &lt;strong&gt;Transference&lt;/strong&gt; – moving applications from on premise to the cloud,&lt;strong&gt; Scalable Web / Multi Tenancy&lt;/strong&gt; – cloud application that can scale on the web front end, &lt;strong&gt;Burst Compute&lt;/strong&gt; – cloud applications that have the ability to dial up / dial down compute resources as necessary, &lt;strong&gt;Elastic Storage&lt;/strong&gt; – looking at how the cloud can provide for storage that can grow on demand, and &lt;strong&gt;Inter-Org Communications&lt;/strong&gt; – sharing how part of the cloud can be used to connect multiple organizations through a service bus and workflow.&lt;/p&gt;  &lt;p&gt;As you can imagine, with the space being so new, these are not a definitive or exhaustive list of all patterns for cloud computing, but I hope they were useful in introducing the different types of applications running in the cloud. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://simonguest.com/images/SlidesfromTechEd2009_88A5/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://simonguest.com/images/SlidesfromTechEd2009_88A5/image_thumb_4.png" width="244" height="198" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Click &lt;a href="http://www.slideshare.net/simonguest/patterns-for-moving-to-the-cloud-arc308-guest-1430539"&gt;here&lt;/a&gt; to view the presentation on SlideShare.&lt;/p&gt;  &lt;p&gt;Click &lt;a href="http://simonguest.com/downloads/TechEd2009_ARC308.zip"&gt;here&lt;/a&gt; to download the presentation.&lt;/p&gt;  &lt;p&gt;I believe two of the three sessions (ISB204 and ARC308) were also recorded and will be online soon.&amp;#160; Once I get hold of them, I’ll update with the link.&lt;/p&gt;&lt;img src="http://simonguest.com/aggbug.aspx?PostID=10031" width="1" height="1"&gt;</content><author><name>smguest</name><uri>http://simonguest.com/members/smguest.aspx</uri></author><category term="Blogs" scheme="http://simonguest.com/blogs/smguest/archive/tags/Blogs/default.aspx" /><category term="Events" scheme="http://simonguest.com/blogs/smguest/archive/tags/Events/default.aspx" /><category term="Technology" scheme="http://simonguest.com/blogs/smguest/archive/tags/Technology/default.aspx" /><category term="Architecture" scheme="http://simonguest.com/blogs/smguest/archive/tags/Architecture/default.aspx" /></entry><entry><title>Using SketchFlow to Create Better Prototypes</title><link rel="alternate" type="text/html" href="http://simonguest.com/blogs/smguest/archive/2009/04/30/Using-SketchFlow-to-Create-Better-Prototypes.aspx" /><id>http://simonguest.com/blogs/smguest/archive/2009/04/30/Using-SketchFlow-to-Create-Better-Prototypes.aspx</id><published>2009-04-30T17:11:14Z</published><updated>2009-04-30T17:11:14Z</updated><content type="html">&lt;p&gt;I recently put together &lt;a href="http://www.infoq.com/articles/guest-simon-sketchflow"&gt;this article&lt;/a&gt; for &lt;a href="http://www.infoq.com"&gt;InfoQ&lt;/a&gt; on using SketchFlow to create better prototypes.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;img alt="" src="http://www.infoq.com/resource/articles/guest-simon-sketchflow/en/resources/image7.png" /&gt;&lt;/p&gt;  &lt;p&gt;In case you haven’t run across it yet, SketchFlow is a feature of Microsoft Expression 3, announced during the &lt;a href="http://www.visitmix.com"&gt;MIX09 conference&lt;/a&gt; in March this year.&amp;#160; In this article I cover the importance of prototyping (I’ve often said that we don’t do enough prototyping in IT), and take the reader on a walkthrough of using SketchFlow to build a prototype shopping store for InfoQ.&lt;/p&gt;  &lt;p&gt;Hope you enjoy the article – feedback always welcomed!&lt;/p&gt;&lt;img src="http://simonguest.com/aggbug.aspx?PostID=9895" width="1" height="1"&gt;</content><author><name>smguest</name><uri>http://simonguest.com/members/smguest.aspx</uri></author><category term="Events" scheme="http://simonguest.com/blogs/smguest/archive/tags/Events/default.aspx" /><category term="Technology" scheme="http://simonguest.com/blogs/smguest/archive/tags/Technology/default.aspx" /><category term="UX" scheme="http://simonguest.com/blogs/smguest/archive/tags/UX/default.aspx" /></entry><entry><title>Displaying XPS Documents in Silverlight</title><link rel="alternate" type="text/html" href="http://simonguest.com/blogs/smguest/archive/2009/04/20/Displaying-XPS-Documents-in-Silverlight.aspx" /><id>http://simonguest.com/blogs/smguest/archive/2009/04/20/Displaying-XPS-Documents-in-Silverlight.aspx</id><published>2009-04-21T00:10:39Z</published><updated>2009-04-21T00:10:39Z</updated><content type="html">&lt;p&gt;I’ve recently been involved on a project that has a requirement to create and view XPS documents in Silverlight.&amp;#160; The application needs to display the XPS file in a full screen window together with zoom and navigation features.&lt;/p&gt;  &lt;p&gt;After a little searching on how to do this, I was able to get a head start with &lt;a href="http://blogs.msdn.com/delay/archive/2007/05/22/lighting-up-the-xml-paper-specification-proof-of-concept-xps-reader-for-silverlight.aspx"&gt;this great post&lt;/a&gt; from David Anson, which includes sample code for viewing XPS files in Silverlight 2 beta 2.&amp;#160; As his &lt;a href="http://blogs.msdn.com/delay/archive/2008/10/18/roadblock-in-the-way-of-migrating-the-proof-of-concept-silverlight-xps-reader-simplesilverlightxpsviewer-sample-does-not-work-on-silverlight-2-rtw.aspx"&gt;updated post&lt;/a&gt; attests to however, there were a few issues with Silverlight 2 due to a breaking change with the ways that font resources could be referenced from within a Silverlight assembly.&amp;#160; Fortunately, &lt;a href="http://www.dotneteer.com/Weblog/post/2008/11/Fix-for-Simple-XPS-Silverlight-Viewer-for-Silverlight-2.aspx"&gt;this post&lt;/a&gt; from Li Chen pointed me in the right direction, separating out the ODTTF fonts into separate XAP files which can be referenced at runtime.&amp;#160; &lt;/p&gt;  &lt;p&gt;The sample code provided by Li Chen works well with the sample XPS files provided, but I couldn’t get it working with an XPS file generated using Microsoft Word.&amp;#160; After a little debugging this weekend, I found a few subtleties with how the code dealt with XPS files geneated from Microsoft Word:&lt;/p&gt;  &lt;p&gt;Firstly, the root document of the XPS file is called FixedDoc.fdoc instead of FixedDocument.fdoc (which is the name when using the XPS Printer Driver).&amp;#160; This was fairly easy to correct using a simple check:&lt;/p&gt;  &lt;div class="code"&gt;   &lt;p&gt;// Added to support &amp;quot;Save as XPS&amp;quot; from Microsoft Word      &lt;br /&gt;if (resourceInfo == null)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; resourceInfo = Application.GetResourceStream(_streamResourceInfo, ConvertPartName(&amp;quot;/Documents/1/FixedDoc.fdoc&amp;quot;));       &lt;br /&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Secondly, the .fdoc file refers to pages using relative links.&amp;#160; Instead of the absolute link (e.g. /Documents/1/Pages/1.page), a relative link (e.g. /Page/1.page) was causing the sample to be unable to find the pages.&amp;#160; A small piece of code to append the full path quickly fixes this also.&lt;/p&gt;  &lt;div class="code"&gt;   &lt;p&gt;// Update the page names for &amp;quot;Save as XPS&amp;quot; from Microsoft Word      &lt;br /&gt;List&amp;lt;string&amp;gt; _newPageNames = new List&amp;lt;string&amp;gt;();       &lt;br /&gt;foreach (String pageName in _pageNames)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (pageName.StartsWith(&amp;quot;Page&amp;quot;))       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _newPageNames.Add(&amp;quot;/Documents/1/&amp;quot; + pageName);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;} &lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Finally, it looks like Word includes a page attribute called BidiLevel, which isn’t recognized by the Canvas element.&amp;#160; Adding an additional exclusion line into the sample code quickly fixed it.&lt;/p&gt;  &lt;div class="code"&gt;   &lt;p&gt;_elementAttributesToRemove.Add(&amp;quot;Glyphs&amp;quot;, new List&amp;lt;string&amp;gt; { &amp;quot;BidiLevel&amp;quot; });&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The result seems to work quite well, with an XPS file saved from Microsoft Word viewable within Silverlight.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://simonguest.com/images/DisplayingXPSDocumentsinSilverlight_9130/image.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://simonguest.com/images/DisplayingXPSDocumentsinSilverlight_9130/image_thumb.png" width="244" height="198" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If you are interested in trying this yourself, I’ve posted a version of the sample code &lt;a href="http://simonguest.com/downloads/SimpleSilverlightXpsViewer.zip"&gt;here&lt;/a&gt; which contains the above modifications.&amp;#160; To use the modified sample with your own XPS file, do the following:&amp;#160; &lt;/p&gt;  &lt;p&gt;1.&amp;#160; Go into Microsoft Word and “Save as / XPS” to create a new XPS file.&lt;/p&gt;  &lt;p&gt;2.&amp;#160; Download and compile the sample (note: only works in Visual Studio 2008).&amp;#160; &lt;/p&gt;  &lt;p&gt;3.&amp;#160; Copy the XPS into your Visual Studio project, in the &lt;strong&gt;SimpleSilverlightXpsViewer_Web &lt;/strong&gt;project.&amp;#160; &lt;/p&gt;  &lt;p&gt;4.&amp;#160; In Windows Explorer, rename the original XPS file to a ZIP file.&amp;#160; Ignore the warning about changing the file extension.&lt;/p&gt;  &lt;p&gt;5.&amp;#160; Open the zip file and go into the /Resources directory.&amp;#160; Look for font files ending in ODTTF - these are embedded font files for the XPS file and must be referenced separately in the Silverlight project.&amp;#160; Copy all of these ODTTF files to the &lt;strong&gt;SampleWordGenerated &lt;/strong&gt;project in the solution.&amp;#160; Also note that the ODTTF files are dynamically named when the XPS file is generated.&amp;#160; This means that although you may have already imported the correct ODTTF files for previous XPS file that use the same fonts, you’ll still need to re-import the fonts again to handle a new XPS file.&amp;#160; &lt;/p&gt;  &lt;p&gt;6.&amp;#160; Edit &lt;strong&gt;default.html &lt;/strong&gt;in &lt;strong&gt;SimpleSilverlightXpsViewer_Web &lt;/strong&gt;and on line 70 change the &lt;strong&gt;xpsDocument=SampleWordGenerated.xps &lt;/strong&gt;to the correct name of your XPS file.&amp;#160; &lt;/p&gt;  &lt;p&gt;7.&amp;#160; F5 to run and you should see your XPS document displayed within a Silverlight control!&lt;/p&gt;  &lt;p&gt;There is still a bit of work to do with the sample code, which I think would be worth taking into a CodePlex project.&amp;#160; For example, the code should initially read the XPS root file (FixedDocSeq.fdseq) instead of looking or FixedDoc.fdoc or FixedDocument.fdoc directly.&amp;#160; It would also be great to figure out a better way of extracting the fonts more dynamically at runtime.&amp;#160; Other than that though I found this to be a good solution to display XPS files in Silverlight applications, especially useful as Silverlight doesn’t support the FlowDocument element (which is commonly used in WPF applications for creating documents and report generation).&lt;/p&gt;&lt;img src="http://simonguest.com/aggbug.aspx?PostID=9778" width="1" height="1"&gt;</content><author><name>smguest</name><uri>http://simonguest.com/members/smguest.aspx</uri></author><category term="Technology" scheme="http://simonguest.com/blogs/smguest/archive/tags/Technology/default.aspx" /><category term="UX" scheme="http://simonguest.com/blogs/smguest/archive/tags/UX/default.aspx" /></entry><entry><title>Cloud Computing Talks at TechEd 2009</title><link rel="alternate" type="text/html" href="http://simonguest.com/blogs/smguest/archive/2009/04/16/Cloud-Computing-Talks-at-TechEd-2009.aspx" /><id>http://simonguest.com/blogs/smguest/archive/2009/04/16/Cloud-Computing-Talks-at-TechEd-2009.aspx</id><published>2009-04-16T23:04:17Z</published><updated>2009-04-16T23:04:17Z</updated><content type="html">&lt;p&gt;I wanted to share the details of two cloud computing sessions that I will be presenting at TechEd 2009 in Los Angeles next month:&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ISB204:&amp;#160; The Impact of the Cloud and Software as a Service - &lt;/strong&gt;5/11/2009 4:30PM-5:45PM&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ARC308:&amp;#160; Patterns for Moving to the Cloud - &lt;/strong&gt;5/12/2009 8:30AM-9:45AM&lt;/p&gt;  &lt;p&gt;The first session (ISB204) is part of the IT Manager track.&amp;#160; The goal of this 200 level session is to explore the significance of cloud computing for IT decision makers.&amp;#160; This will include looking at different types of applications and understanding whether they make sense for the cloud, and why – and then investigating some of the tradeoffs and risks for moving certain applications to the cloud.&amp;#160; &lt;/p&gt;  &lt;p&gt;The second session (ARC308) is the next level deeper:&amp;#160; an architect/developer focused session that will cover a collection of design and implementation patterns for cloud based applications.&amp;#160; For example, how the cloud can enable parallelization across multiple machines, blob storage in the cloud, and some of the finer points of identity management within applications. &lt;/p&gt;  &lt;p&gt;We are still a few weeks away from the event, so if there are questions that would like to see answered or other items that you think would make sense in either presentation, do get in touch and let me know.&amp;#160; &lt;/p&gt;  &lt;p&gt;And to those that will be attending TechEd 2009, I look forward to seeing you there!&lt;/p&gt;&lt;img src="http://simonguest.com/aggbug.aspx?PostID=9769" width="1" height="1"&gt;</content><author><name>smguest</name><uri>http://simonguest.com/members/smguest.aspx</uri></author><category term="Events" scheme="http://simonguest.com/blogs/smguest/archive/tags/Events/default.aspx" /><category term="Technology" scheme="http://simonguest.com/blogs/smguest/archive/tags/Technology/default.aspx" /><category term="Architecture" scheme="http://simonguest.com/blogs/smguest/archive/tags/Architecture/default.aspx" /></entry><entry><title>Twitter for Office Communicator</title><link rel="alternate" type="text/html" href="http://simonguest.com/blogs/smguest/archive/2009/03/26/Twitter-for-Office-Communicator.aspx" /><id>http://simonguest.com/blogs/smguest/archive/2009/03/26/Twitter-for-Office-Communicator.aspx</id><published>2009-03-26T04:22:16Z</published><updated>2009-03-26T04:22:16Z</updated><content type="html">&lt;p&gt;One of my observations from MIX09 last week was the sheer number of attendees using Twitter at the event.&amp;#160; In addition to the “flotzam” wall (a realtime display of tweets) during the keynote session, I couldn’t turn a corner without running into someone tweeting about something.&amp;#160; &lt;/p&gt;  &lt;p&gt;Although I must admit that “I still don’t get twitter”, on the plane ride back to Seattle, I thought it would be interesting to create a twitter client that works in conjunction with &lt;a href="http://www.microsoft.com/uc/products/oc2007.mspx"&gt;Office Communicator&lt;/a&gt;.&amp;#160; &lt;/p&gt;  &lt;p&gt;As you may know, Office Communicator provides the ability to set presence information as part of the UI.&amp;#160; Presence information is useful for out of the office details such as “At Chicago office today”. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://simonguest.com/images/TwitterforOfficeCommunicator_D20B/image.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://simonguest.com/images/TwitterforOfficeCommunicator_D20B/image_thumb.png" width="244" height="124" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;After having used this in the past, I wondered how easy it would be to take this presence information and publish it to Twitter.&amp;#160; i.e. When I update the presence text in Office Communicator it would also update my twitter account with the same information.&amp;#160; That way I can provide short presence information in one place and have it published to both internal users of Office Communicator and my (small number of) followers on Twitter.&amp;#160; &lt;/p&gt;  &lt;p&gt;The result is &lt;strong&gt;Twitter4OC&lt;/strong&gt;, a small client app that runs in the background and listens for presence updates from Office Communicator, creating new tweets as appropriate.&amp;#160; If you are interested in seeing how it works, you can find the binaries &lt;a href="http://simonguest.com/downloads/Twitter4OC-bin.zip"&gt;here&lt;/a&gt; and the sample code &lt;a href="http://simonguest.com/downloads/Twitter4OC-src.zip"&gt;here&lt;/a&gt;.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Twitter4OC&lt;/strong&gt; uses the &lt;strong&gt;OCSDKWrapper&lt;/strong&gt; libraries from &lt;a href="http://www.codeplex.com/OCSDKWrapper"&gt;this excellent project&lt;/a&gt; on codeplex to listen to status changes in Office Communicator.&amp;#160; &lt;/p&gt;  &lt;div class="code"&gt;   &lt;p&gt;MOCAutomation _moc = null;&lt;/p&gt;    &lt;p&gt;if (_moc == null)      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; _moc = MOCAutomation.Instance;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; _moc.MyStatusChange += new EventHandler&amp;lt;OCSDKWrapper.MOCEventArgs.MyStatusChangeEventArgs&amp;gt;(_moc_MyStatusChange);       &lt;br /&gt;} &lt;/p&gt; &lt;/div&gt;  &lt;p&gt;If it detects that the presence information has been updated, it firsts calls the TinyURL API to change any URLs into a smaller format, and then makes a call to the Twitter API to tweet the updated status.&amp;#160; &lt;/p&gt;  &lt;div class="code"&gt;   &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; private string Post(string url, string username, string password, string data)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Prevents HTTP-417 error code from API       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ServicePointManager.Expect100Continue = false; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Construct the WebRequest      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WebRequest request = WebRequest.Create(url);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; request.Credentials = new NetworkCredential(username, password);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; request.ContentType = &amp;quot;application/x-www-form-urlencoded&amp;quot;;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; request.Method = &amp;quot;POST&amp;quot;; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; byte[] bytes = Encoding.UTF8.GetBytes(data);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; request.ContentLength = bytes.Length;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (Stream requestStream = request.GetRequestStream())       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; requestStream.Write(bytes, 0, bytes.Length); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (WebResponse response = request.GetResponse())      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (StreamReader reader = new StreamReader(response.GetResponseStream()))       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return reader.ReadToEnd();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public string Update(string username, string password, string presence)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // First tinyfy the URLs       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; presence = TinyURL.TinyfyPresence(presence); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Check the length of the status &amp;lt; 140 chars      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (presence.Length &amp;gt; 140) throw new StatusTooLongException(); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string url = TWITTER_UPDATE_URL;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string data = string.Format(&amp;quot;status={0}&amp;quot;, HttpUtility.UrlEncode(presence));       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return Post(url, username, password, data);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; catch (Exception e)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new UpdateFailedException(e.ToString());       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The application runs as a small exe that can be launched at startup and takes parameters via a simple credential form or via settings in the App.Config file.&lt;/p&gt;&lt;img src="http://simonguest.com/aggbug.aspx?PostID=9487" width="1" height="1"&gt;</content><author><name>smguest</name><uri>http://simonguest.com/members/smguest.aspx</uri></author><category term="Technology" scheme="http://simonguest.com/blogs/smguest/archive/tags/Technology/default.aspx" /></entry><entry><title>Speaking at JavaOne 2009!</title><link rel="alternate" type="text/html" href="http://simonguest.com/blogs/smguest/archive/2009/03/16/Speaking-at-JavaOne-2009_2100_.aspx" /><id>http://simonguest.com/blogs/smguest/archive/2009/03/16/Speaking-at-JavaOne-2009_2100_.aspx</id><published>2009-03-16T18:18:09Z</published><updated>2009-03-16T18:18:09Z</updated><content type="html">&lt;p&gt;I recently found out that I will be speaking at JavaOne again this year!&amp;#160; I’ll be participating on a quick-fire demo panel called &lt;strong&gt;Cloud Computing:&amp;#160; Show Me the Money!&lt;/strong&gt; together with &lt;strong&gt;Gregor Hohpe&lt;/strong&gt; from Google, &lt;strong&gt;Raghavan Srinivas&lt;/strong&gt; from Intuit and others from SFDC and other vendors in the cloud space.&lt;/p&gt;  &lt;p&gt;JavaOne is one of my favorite conferences, so I’m really looking forward to returning this year.&amp;#160; My last JavaOne was in 2005, where my session on &lt;a href="http://gceclub.sun.com.cn/java_one_online/2005/TS-9866/index.html"&gt;Advanced Web Services Interoperability&lt;/a&gt; (co-presented with Raghavan) was one of the top ten of the conference!&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://simonguest.com/images/SpeakingatJavaOne_1273C/image.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://simonguest.com/images/SpeakingatJavaOne_1273C/image_thumb.png" width="244" height="92" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://simonguest.com/aggbug.aspx?PostID=9245" width="1" height="1"&gt;</content><author><name>smguest</name><uri>http://simonguest.com/members/smguest.aspx</uri></author><category term="Events" scheme="http://simonguest.com/blogs/smguest/archive/tags/Events/default.aspx" /></entry><entry><title>Using Search Folders in Outlook 2007 for GTD</title><link rel="alternate" type="text/html" href="http://simonguest.com/blogs/smguest/archive/2009/03/11/Using-Search-Folders-in-Outlook-2007-for-GTD.aspx" /><id>http://simonguest.com/blogs/smguest/archive/2009/03/11/Using-Search-Folders-in-Outlook-2007-for-GTD.aspx</id><published>2009-03-11T16:57:03Z</published><updated>2009-03-11T16:57:03Z</updated><content type="html">&lt;p&gt;One of my favorite features of Outlook 2007 is &lt;strong&gt;Search Folders&lt;/strong&gt;.&amp;#160; A Search Folder is a dynamic folder, automatically populated based on a query.&amp;#160; For example, a Search Folder can be used to show all email over 1Mb in size.&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;Being a &lt;a href="http://www.davidco.com"&gt;GTD&lt;/a&gt; (Getting Things Done) addict, I wanted to see if I could use Search Folders to create separate folders for each of my project categories.&amp;#160; For example, if I have an Outlook category called &lt;strong&gt;TechEd 2009&lt;/strong&gt;, wouldn’t it be nice to have a couple of search folders - one to show all of the active tasks associated with that category, the other to show all of the mail filed under that category.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://simonguest.com/images/UsingSearchFoldersinOutlook2007forGTD_12518/image.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://simonguest.com/images/UsingSearchFoldersinOutlook2007forGTD_12518/image_thumb.png" width="161" height="39" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Out of the box however, this is a little difficult to setup – while you can easily create a Search Folder that displays mail relating to a category, in Outlook 2007 you can’t actually create a Search Folder that filters on tasks.&amp;#160; After a little digging, I found out that Search Folders do support the capability of filtering other types of objects, but only querying of mail items are exposed in the Outlook UI.&lt;/p&gt;  &lt;p&gt;To overcome this limitation however, we can use a simple macro:&lt;/p&gt;  &lt;div class="code"&gt;   &lt;p&gt;Sub CreateNewSearchFolder()&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; Set MyOutlookApplication = Outlook.Application     &lt;br /&gt;&amp;#160;&amp;#160; SearchSubFolders = True      &lt;br /&gt;&amp;#160;&amp;#160; Set MapiNamespace = Application.GetNamespace(&amp;quot;MAPI&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160; Set TasksFolder = MapiNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderTasks).Parent      &lt;br /&gt;&amp;#160;&amp;#160; strS = &amp;quot;'&amp;quot; &amp;amp; TasksFolder.FolderPath &amp;amp; &amp;quot;'&amp;quot;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; Dim folderName As String     &lt;br /&gt;&amp;#160;&amp;#160; folderName = InputBox(&amp;quot;What category would you like to create a search folder for?:&amp;quot;, &amp;quot;Category&amp;quot;, &amp;quot;&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160; Dim objSch As Search      &lt;br /&gt;&amp;#160;&amp;#160; Dim categoryFilter As String      &lt;br /&gt;&amp;#160;&amp;#160; categoryFilter = &amp;quot;(&amp;quot;&amp;quot;urn:schemas-microsoft-com:office:office#Keywords&amp;quot;&amp;quot; LIKE '%&amp;quot; &amp;amp; folderName &amp;amp; &amp;quot;%')&amp;quot;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; Dim taskFilter As String     &lt;br /&gt;&amp;#160;&amp;#160; taskFilter = &amp;quot;(&amp;quot;&amp;quot;&lt;a href="http://schemas.microsoft.com/mapi/proptag/0x0e05001f&amp;quot;&amp;quot;="&gt;http://schemas.microsoft.com/mapi/proptag/0x0e05001f&amp;quot;&amp;quot;=&lt;/a&gt; 'Tasks' AND &amp;quot;&amp;quot;&lt;a href="http://schemas.microsoft.com/mapi/id/{00062003-0000-0000-C000-000000000046}/81010003&amp;quot;&amp;quot;"&gt;http://schemas.microsoft.com/mapi/id/{00062003-0000-0000-C000-000000000046}/81010003&amp;quot;&amp;quot;&lt;/a&gt; &amp;lt;&amp;gt; 2) OR (NOT(&amp;quot;&amp;quot;&lt;a href="http://schemas.microsoft.com/mapi/proptag/0x10900003&amp;quot;&amp;quot;"&gt;http://schemas.microsoft.com/mapi/proptag/0x10900003&amp;quot;&amp;quot;&lt;/a&gt; IS NULL) AND &amp;quot;&amp;quot;&lt;a href="http://schemas.microsoft.com/mapi/id/{00062003-0000-0000-C000-000000000046}/81010003&amp;quot;&amp;quot;"&gt;http://schemas.microsoft.com/mapi/id/{00062003-0000-0000-C000-000000000046}/81010003&amp;quot;&amp;quot;&lt;/a&gt; &amp;lt;&amp;gt; 2)&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160; Dim strTag As String      &lt;br /&gt;&amp;#160;&amp;#160; strTag = &amp;quot;RecurSearch&amp;quot;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; ' Create the tasks folder &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; Set objSch = Application.AdvancedSearch(Scope:=strS, Filter:=categoryFilter &amp;amp; &amp;quot; AND (&amp;quot; + taskFilter + &amp;quot;)&amp;quot;, _     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SearchSubFolders:=True, Tag:=strTag)      &lt;br /&gt;&amp;#160;&amp;#160; objSch.Save (folderName)&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; ' Create the mail folder&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; Set objSch = Application.AdvancedSearch(Scope:=strS, Filter:=categoryFilter, _     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SearchSubFolders:=True, Tag:=strTag)      &lt;br /&gt;&amp;#160;&amp;#160; objSch.Save (folderName &amp;amp; &amp;quot; (Mail)&amp;quot;)&lt;/p&gt;    &lt;p&gt;End Sub&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The above macro will prompt you for a category name and auto-magically create two search folders – one that will display the active tasks assigned to that category, and one that will display all items (both mail and tasks) assigned to that category.&amp;#160; &lt;/p&gt;  &lt;p&gt;Your mileage with this may vary (and I’m sure you’ll believe me when I say the above is not officially supported :-)) but I’ve found this very useful to look at active tasks and filed mail for a specific GTD category without leaving the comfort my email folder list.&lt;/p&gt;&lt;img src="http://simonguest.com/aggbug.aspx?PostID=9152" width="1" height="1"&gt;</content><author><name>smguest</name><uri>http://simonguest.com/members/smguest.aspx</uri></author></entry><entry><title>MIX09</title><link rel="alternate" type="text/html" href="http://simonguest.com/blogs/smguest/archive/2009/03/11/MIX09.aspx" /><id>http://simonguest.com/blogs/smguest/archive/2009/03/11/MIX09.aspx</id><published>2009-03-11T16:50:54Z</published><updated>2009-03-11T16:50:54Z</updated><content type="html">&lt;p&gt;Coming to MIX 09 in Las Vegas next week?&amp;#160; I’ll be there and will be looking forward to catching up with many other attendees.&amp;#160; Hope to see you there!&lt;/p&gt;  &lt;p&gt;&lt;img src="http://2009.visitmix.com/Images/BlogBling/FINAL_BANNER_ADS/Interface/180x150_MIX09B_101508.gif" /&gt;&lt;/p&gt;&lt;img src="http://simonguest.com/aggbug.aspx?PostID=9151" width="1" height="1"&gt;</content><author><name>smguest</name><uri>http://simonguest.com/members/smguest.aspx</uri></author><category term="Events" scheme="http://simonguest.com/blogs/smguest/archive/tags/Events/default.aspx" /></entry><entry><title>Using Windows 7 to host PHP applications in 5 easy steps!</title><link rel="alternate" type="text/html" href="http://simonguest.com/blogs/smguest/archive/2009/03/09/Using-Windows-7-to-host-PHP-applications-in-5-easy-steps_2100_.aspx" /><id>http://simonguest.com/blogs/smguest/archive/2009/03/09/Using-Windows-7-to-host-PHP-applications-in-5-easy-steps_2100_.aspx</id><published>2009-03-10T00:24:55Z</published><updated>2009-03-10T00:24:55Z</updated><content type="html">&lt;p&gt;A few people have asked me recently whether it’s possible to setup Windows 7 as a PHP server (for development purposes).&amp;#160; The answer is absolutely yes, and it’s a breeze to setup.&amp;#160; Follow these five simple steps to get PHP up and running in minutes:&lt;/p&gt;  &lt;p&gt;1.&amp;#160; In the &lt;strong&gt;Programs and Features &lt;/strong&gt;control panel, click on the &lt;strong&gt;Turn Windows features on or off&lt;/strong&gt; link:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://simonguest.com/images/UsingPHPonWindows7_BFFB/image.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://simonguest.com/images/UsingPHPonWindows7_BFFB/image_thumb.png" width="210" height="76" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;2.&amp;#160; In the list of Windows Features, expand&lt;strong&gt; Internet Information Services&lt;/strong&gt;, &lt;strong&gt;World Wide Web Services&lt;/strong&gt;, and the &lt;strong&gt;Application Deployment Features&lt;/strong&gt;.&amp;#160; If it’s not already, select the &lt;strong&gt;CGI&lt;/strong&gt; checkbox and click OK.&amp;#160; (The most reliable way of hosting PHP applications on Windows 7 is to use the built in FastCGI interface for IIS – checking this box installs it together with any pre-requisites.)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://simonguest.com/images/UsingPHPonWindows7_BFFB/image_3.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://simonguest.com/images/UsingPHPonWindows7_BFFB/image_thumb_3.png" width="244" height="215" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;3.&amp;#160; Download the &lt;strong&gt;non-thread-safe&lt;/strong&gt; &lt;strong&gt;(NTS) &lt;/strong&gt;version of PHP from &lt;a href="http://www.php.net/downloads.php"&gt;http://www.php.net/downloads.php&lt;/a&gt;.&amp;#160; The current version (as of time of writing is 5.2.9).&amp;#160; (The thread safe (TS) version will also work, but generally NTS is faster, and thread safety is not an issue under FastCGI).&amp;#160; Expand the zip to an installation directory of your choice – e.g. c:\dev\php&lt;/p&gt;  &lt;p&gt;4.&amp;#160; Copy the &lt;strong&gt;php.ini-recommended &lt;/strong&gt;file to &lt;strong&gt;php.ini &lt;/strong&gt;in the PHP directory.&amp;#160; Edit the php.ini file and add correctly configure &lt;strong&gt;extension_dir&lt;/strong&gt;, pointing to the PHP extensions directory (normally the .\ext folder of the PHP installation – e.g c:\dev\php\ext).&amp;#160; You can also configure other php.ini options and modules here if required.&lt;/p&gt;  &lt;p&gt;5.&amp;#160; Run &lt;strong&gt;Internet Information Services Manager&lt;/strong&gt; by typing &lt;strong&gt;inetmgr&lt;/strong&gt; in the Start menu.&amp;#160; You can either set the global settings of the server, or (recommended) add a new web site to run the PHP applications.&amp;#160; Once you’ve done this, double click on the &lt;strong&gt;Handler Mappings &lt;/strong&gt;for the site and add a new module mapping with the following settings:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://simonguest.com/images/UsingPHPonWindows7_BFFB/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://simonguest.com/images/UsingPHPonWindows7_BFFB/image_thumb_4.png" width="244" height="212" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Request path &lt;/strong&gt;should be set to *.php.&amp;#160; &lt;strong&gt;Module&lt;/strong&gt; should be FastCgiModule.&amp;#160; &lt;strong&gt;Executable&lt;/strong&gt; should be {php_install_dir}\php-cgi.exe.&amp;#160; &lt;strong&gt;Name&lt;/strong&gt; can be anything – I use “PHP via Fast CGI”.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;That’s it! Simply start/restart IIS and you are ready to go.&amp;#160; The easiest way to test that everything is working is to create a simple info.php file with a single line:&lt;/p&gt;  &lt;div class="code"&gt;   &lt;p&gt;&amp;lt;?php phpinfo(); ?&amp;gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;When you access this page from a browser (e.g. &lt;a href="http://localhost:8081/info.php"&gt;http://localhost:8081/info.php&lt;/a&gt;), you should see the PHP info screen:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://simonguest.com/images/UsingPHPonWindows7_BFFB/image_5.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://simonguest.com/images/UsingPHPonWindows7_BFFB/image_thumb_5.png" width="244" height="177" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Validate that the server API is using CGI/FastCGI and that the loaded configuration file is the one in your installation directory.&amp;#160; &lt;/p&gt;&lt;img src="http://simonguest.com/aggbug.aspx?PostID=9148" width="1" height="1"&gt;</content><author><name>smguest</name><uri>http://simonguest.com/members/smguest.aspx</uri></author><category term="Technology" scheme="http://simonguest.com/blogs/smguest/archive/tags/Technology/default.aspx" /></entry><entry><title>“Micro Architectures”</title><link rel="alternate" type="text/html" href="http://simonguest.com/blogs/smguest/archive/2009/01/15/_1C20_Micro-Architectures_1D20_.aspx" /><id>http://simonguest.com/blogs/smguest/archive/2009/01/15/_1C20_Micro-Architectures_1D20_.aspx</id><published>2009-01-16T01:35:28Z</published><updated>2009-01-16T01:35:28Z</updated><content type="html">&lt;p&gt;&lt;a href="http://architect-center.com/blogs/wiltjk/default.aspx"&gt;Jim Wilt&lt;/a&gt; and I had an interesting discussion today, around the role of software architecture in the current economy.&amp;#160; I shared some thoughts around something I’ve been thinking that I call “micro architectures” (for lack of a better name).&lt;/p&gt;  &lt;p&gt;Let me start with a personal dilemma:&amp;#160; I’m debating moving my blog (currently running an old version of Community Server) to something different (either a different provider or upgrading to the latest version of Community Server).&amp;#160; Although it’s been very reliable, the thing that concerns me about my blog is that I don’t intimately know how it works.&amp;#160; I’ve looked through a lot of the forums, and even other open source blog providers, but the architecture for everything that I’ve seen so far seems just too unwieldy for what I’m trying to accomplish.&lt;/p&gt;  &lt;p&gt;While searching, I began asking myself the question - “Instead of the most &lt;strong&gt;architecturally correct design&lt;/strong&gt;, what would be the &lt;strong&gt;smallest&lt;/strong&gt; &lt;strong&gt;design &lt;/strong&gt;that supports my need?&amp;#160; And more importantly, how would these two be different?”&amp;#160; &lt;em&gt;Small &lt;/em&gt;in this instance refers to the number of modules, configuration files, lines of code, and other parts of the design.&amp;#160; I think as architects and developers we have a habit of defaulting to configuration files, extensibility, and dependency injection into our designs from day one – even though the core use cases of the design don’t immediately demand it.&amp;#160; We design too much in for the future or for edge cases which ends up in “I’ve abstracted this setting into this_obscure_setting_config.xml just in case we need to switch the setting in the future”.&amp;#160; Nice extensibility - but will anyone ever actually switch that setting?&amp;#160; Really?&amp;#160; And if someone did, does a recompile of the code really add that much headache over the additional abstraction and testing required for the extensibility?&amp;#160; &lt;a href="http://jeffreypalermo.com"&gt;Jeffrey Pallermo&lt;/a&gt; covers an element of this recently in &lt;a href="http://jeffreypalermo.com/blog/hardcoding-considered-harmful-or-is-it"&gt;his post about hard coding&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Coming back to my blog example, what would a “micro architecture” for my blog look like?&amp;#160; I would assert that I could do the following:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Eliminate Elaborate Database Access Code.&lt;/strong&gt;&amp;#160; Do I really need it?&amp;#160; Do I really need a database abstraction layer (myDal) that inherits from an interface (IDal), uses a configuration file (database_config.xml) and some dependency injection under the covers so that I can switch out the driver at some point in the future?&amp;#160; Probably not.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Question the Need for a Database.&lt;/strong&gt;&amp;#160; Talking of which, do I actually need the database itself?&amp;#160; Access to the database (or lack thereof) seems to be the root cause of issues that I have when my blog goes down.&amp;#160; Two primary considerations for using a database are performance and indexing.&amp;#160; Performance?&amp;#160; I would like to think that millions of people visit my blog every day, but the reality is somewhat different.&amp;#160; Even with 50 comments attached to a blog post, a file system solution would probably perform well enough for anyone reading the blog.&amp;#160; Indexing?&amp;#160; Sure, I would like search enabled on my blog, but why not just redirect to (or embed) an existing Google search, parameterized to my domain?&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Create a Minimal User Interface.&lt;/strong&gt;&amp;#160; I got thinking about what HTML controls I would need to supply to enable updates and edits to posts – the question is, do I really need a fully functioning Admin UI to update the blog?&amp;#160; Would it not be simpler to only expose a MetaWeblog or ATOM publishing API instead and use something like Windows Live Writer to create and edit my posts?&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;No Admin UI for Creating “About” and Other Pages.&lt;/strong&gt;&amp;#160; Again, do I really need the administration overhead for handling this?&amp;#160; Can I not just create a new .ASPX or PHP page and attach it to the site.&amp;#160; Seriously?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Remove Skins and Styles from the Code.&amp;#160; &lt;/strong&gt;No brainer.&amp;#160; Reference a CSS and be done with it.&amp;#160; The blog’s responsibility should be to only output well formatted HTML that can be styled with CSS.&lt;/p&gt;  &lt;p&gt;I’m sure there’s more that I’m missing, but hopefully you get the idea.&amp;#160; To sum this up and conclude, I would argue that a “micro architecture” could have the following principles:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;It’s OK to ignore edge cases.&amp;#160; &lt;/strong&gt;The architecture is designed only against core use cases, and nothing else.&amp;#160; With the exception of input validation, edge cases are not considered.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;It’s OK to write code - as long as that functionality doesn’t exist in another solution that can be reused.&amp;#160; &lt;/strong&gt;Subsystems are written only when there is not a valid external solution that can be used.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;It’s OK to hardcode configuration values.&amp;#160; &lt;/strong&gt;Hardcoding is OK for core use cases (providing that it doesn’t invalidate security – for example, you don’t want to be hardcoding usernames and passwords, of course)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;It’s OK to recompile.&amp;#160; &lt;/strong&gt;Recompiling is really OK if edge cases are introduced at a later point in the future.&amp;#160; I actually think this is healthy because it encourages developers to open up the solution (and possibly improve the solution as a result of what they’ve learned since they last wrote the code).&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;It’s OK to unit test.&amp;#160; &lt;/strong&gt;Because a greater focus is given to the code of an application (as opposed to 50 million different configuration files), unit tests and test driven development become even more important.&amp;#160; &lt;/p&gt;  &lt;p&gt;Maybe I’ll actually try this out and see what happens?&lt;/p&gt;&lt;img src="http://simonguest.com/aggbug.aspx?PostID=8491" width="1" height="1"&gt;</content><author><name>smguest</name><uri>http://simonguest.com/members/smguest.aspx</uri></author><category term="Technology" scheme="http://simonguest.com/blogs/smguest/archive/tags/Technology/default.aspx" /><category term="Architecture" scheme="http://simonguest.com/blogs/smguest/archive/tags/Architecture/default.aspx" /><category term="UX" scheme="http://simonguest.com/blogs/smguest/archive/tags/UX/default.aspx" /><category term="Aspiring Architect" scheme="http://simonguest.com/blogs/smguest/archive/tags/Aspiring+Architect/default.aspx" /></entry><entry><title>PDC2008 Symposium Announced!</title><link rel="alternate" type="text/html" href="http://simonguest.com/blogs/smguest/archive/2008/09/24/PDC2008-Symposium-Announced_2100_.aspx" /><id>http://simonguest.com/blogs/smguest/archive/2008/09/24/PDC2008-Symposium-Announced_2100_.aspx</id><published>2008-09-25T03:41:14Z</published><updated>2008-09-25T03:41:14Z</updated><content type="html">&lt;p&gt;&lt;a href="http://simonguest.com/images/PDC2008SymposiumAnnounced_122A5/image.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;border-top:0px;border-right:0px;" border="0" alt="image" src="http://simonguest.com/images/PDC2008SymposiumAnnounced_122A5/image_thumb.png" width="244" height="72" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Coming to PDC?&amp;#160; Interested in what it means to move to the cloud?&amp;#160; If so, you should definitely check out the &lt;a href="http://www.microsoftpdc.com/Agenda/Symposia.aspx#head-in-the-clouds"&gt;PDC symposium&lt;/a&gt; this year.&amp;#160; &lt;/p&gt;  &lt;p&gt;The symposium is three sessions that wrap up the last day of the PDC - the goal of which is to &amp;quot;connect the dots&amp;quot; between everything that you'll have heard at the event, and look at some of the next steps and challenges for making it real.&amp;#160; The sessions cover expanding applications to the cloud, making enterprise-grade cloud applications, and emerging patterns that take into consideration some of the physical aspects of moving applications to the cloud. &lt;/p&gt;  &lt;p&gt;Not coming to PDC? There's &lt;a href="http://www.microsoftpdc.com/"&gt;still time&lt;/a&gt; to register and attend!&lt;/p&gt;&lt;img src="http://simonguest.com/aggbug.aspx?PostID=7504" width="1" height="1"&gt;</content><author><name>smguest</name><uri>http://simonguest.com/members/smguest.aspx</uri></author><category term="Events" scheme="http://simonguest.com/blogs/smguest/archive/tags/Events/default.aspx" /><category term="Technology" scheme="http://simonguest.com/blogs/smguest/archive/tags/Technology/default.aspx" /><category term="Architecture" scheme="http://simonguest.com/blogs/smguest/archive/tags/Architecture/default.aspx" /></entry><entry><title>Architecture Journal Issue 16 Released, and Issue 18 Call For Papers</title><link rel="alternate" type="text/html" href="http://simonguest.com/blogs/smguest/archive/2008/08/25/Architecture-Journal-Issue-16-Released_2C00_-and-Issue-18-Call-For-Papers.aspx" /><id>http://simonguest.com/blogs/smguest/archive/2008/08/25/Architecture-Journal-Issue-16-Released_2C00_-and-Issue-18-Call-For-Papers.aspx</id><published>2008-08-25T04:23:19Z</published><updated>2008-08-25T04:23:19Z</updated><content type="html">&lt;p&gt;I wanted to share a couple of updates about the Microsoft Architecture Journal:&lt;/p&gt;  &lt;p&gt;1.&amp;#160; Issue 16 has just been released to the web!&amp;#160; You can find it &lt;a href="http://msdn.microsoft.com/en-us/arcjournal/cc836389.aspx"&gt;here&lt;/a&gt;, and can also download a PDF version of the magazine &lt;a href="http://download.microsoft.com/download/a/7/6/a76e5770-19b1-415b-8b6c-6ff5c7b71574/J16_EN.zip"&gt;here&lt;/a&gt;.&amp;#160; The theme of issue 16 is &lt;strong&gt;Identity and Access&lt;/strong&gt;, and &lt;a href="http://blogs.msdn.com/diegumzone"&gt;Diego&lt;/a&gt; explains more about the articles in his &lt;a href="http://blogs.msdn.com/diegumzone/archive/2008/08/22/just-released-architecture-journal-16-on-identity-and-access.aspx"&gt;blog post&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;2.&amp;#160; The call for papers for Issue 18 has just been released.&amp;#160; Again, Diego uncovers the details &lt;a href="http://blogs.msdn.com/diegumzone/archive/2008/08/20/microsoft-architecture-journal-issue-18-call-for-papers.aspx"&gt;here&lt;/a&gt;, the theme of this upcoming issue is &lt;strong&gt;Green Computing&lt;/strong&gt;.&amp;#160; I'm really looking forward to this issue, especially given all the work that is happening in this space, especially some of the advances in infrastructure architecture.&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;&lt;img src="http://simonguest.com/aggbug.aspx?PostID=7225" width="1" height="1"&gt;</content><author><name>smguest</name><uri>http://simonguest.com/members/smguest.aspx</uri></author><category term="Technology" scheme="http://simonguest.com/blogs/smguest/archive/tags/Technology/default.aspx" /><category term="Architecture" scheme="http://simonguest.com/blogs/smguest/archive/tags/Architecture/default.aspx" /><category term="Aspiring Architect" scheme="http://simonguest.com/blogs/smguest/archive/tags/Aspiring+Architect/default.aspx" /></entry><entry><title>Microsoft Strategic Architect Forum (SAF) 2008</title><link rel="alternate" type="text/html" href="http://simonguest.com/blogs/smguest/archive/2008/07/17/Microsoft-Strategic-Architect-Forum-_2800_SAF_2900_-2008.aspx" /><id>http://simonguest.com/blogs/smguest/archive/2008/07/17/Microsoft-Strategic-Architect-Forum-_2800_SAF_2900_-2008.aspx</id><published>2008-07-18T00:43:13Z</published><updated>2008-07-18T00:43:13Z</updated><content type="html">&lt;p&gt;&lt;a href="http://simonguest.com/images/MicrosoftStrategicArchitectForumSAF2008_F924/image.png"&gt;&lt;img style="border-right:0px;border-top:0px;margin:0px 10px 0px 0px;border-left:0px;border-bottom:0px;" height="220" alt="image" src="http://simonguest.com/images/MicrosoftStrategicArchitectForumSAF2008_F924/image_thumb.png" width="156" align="left" border="0" /&gt;&lt;/a&gt;Today we announced the dates for this year's Microsoft Strategic Architect Forum, also known as SAF.&amp;#160; This year we will be holding SAF on the 19th - 22nd November 2008 in San Francisco.&lt;/p&gt;  &lt;p&gt;Now in it's 7th year, SAF is one of my favorite events - a gathering of around 350 of the smartest architects across a wide range of companies, cultures, and countries - discussing architectural challenges and sharing solutions.&amp;#160; Although now retired, a tradition at all previous events has been an architect Q&amp;amp;A session with BillG himself.&lt;/p&gt;  &lt;p&gt;Even though this is an invite-only event, we heard some great feedback about the &lt;a href="http://msdn.microsoft.com/en-us/architecture/bb267380.aspx"&gt;online recordings&lt;/a&gt; that we posted of last year's event, and we definitely plan to do the same this year.&amp;#160; We also use a lot of input as we plan the agenda for the event - so if you have ideas about topics that you would like to see at such an event, we'd love to hear from you.&lt;/p&gt;&lt;img src="http://simonguest.com/aggbug.aspx?PostID=6920" width="1" height="1"&gt;</content><author><name>smguest</name><uri>http://simonguest.com/members/smguest.aspx</uri></author><category term="Events" scheme="http://simonguest.com/blogs/smguest/archive/tags/Events/default.aspx" /><category term="Architecture" scheme="http://simonguest.com/blogs/smguest/archive/tags/Architecture/default.aspx" /></entry><entry><title>Architecture Journal Issue 17 - Call for Papers</title><link rel="alternate" type="text/html" href="http://simonguest.com/blogs/smguest/archive/2008/07/14/Architecture-Journal-Issue-17-_2D00_-Call-for-Papers.aspx" /><id>http://simonguest.com/blogs/smguest/archive/2008/07/14/Architecture-Journal-Issue-17-_2D00_-Call-for-Papers.aspx</id><published>2008-07-14T16:18:16Z</published><updated>2008-07-14T16:18:16Z</updated><content type="html">&lt;p&gt;Interested in writing for the next issue of the &lt;a href="http://www.architecturejournal.net"&gt;Architecture Journal&lt;/a&gt; - and having your article read by over 62,000 people in multiple languages, and distributed at PDC and SAF this year?&amp;#160; If so, check out the &lt;a href="http://blogs.msdn.com/diegumzone/archive/2008/07/12/microsoft-architecture-journal-issue-17-call-for-papers.aspx"&gt;call for papers&lt;/a&gt; from &lt;a href="http://blogs.msdn.com/diegumzone"&gt;Diego Dagum&lt;/a&gt;.&amp;#160; The theme of the next issue is around distributed computing.&amp;#160; &lt;/p&gt;&lt;img src="http://simonguest.com/aggbug.aspx?PostID=6899" width="1" height="1"&gt;</content><author><name>smguest</name><uri>http://simonguest.com/members/smguest.aspx</uri></author><category term="Events" scheme="http://simonguest.com/blogs/smguest/archive/tags/Events/default.aspx" /><category term="Architecture" scheme="http://simonguest.com/blogs/smguest/archive/tags/Architecture/default.aspx" /><category term="Aspiring Architect" scheme="http://simonguest.com/blogs/smguest/archive/tags/Aspiring+Architect/default.aspx" /></entry></feed>