<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-17211474</atom:id><lastBuildDate>Mon, 16 Jan 2012 00:07:39 +0000</lastBuildDate><category>MonoDroid</category><category>Visual Studio</category><category>jQuery</category><category>MySQL</category><category>Email</category><category>Accessibility</category><category>Web Services</category><category>SQL Server</category><category>AJAX</category><category>MonoDevelop</category><category>.NET Framework</category><category>Windows</category><category>Java</category><category>SOA</category><category>IIS</category><category>Enterprise Architecture</category><category>ASP.NET MVC</category><category>Open Source</category><category>OS X</category><category>ASP.NET</category><category>CSLA</category><category>Apollo</category><category>ADO.NET</category><category>Windows Phone</category><category>Boot Camp</category><category>C#</category><category>PHP</category><category>Firefox</category><category>iPhone</category><category>Linux</category><category>HTML</category><category>MonoTouch</category><category>Durbinware</category><category>Mono</category><category>Internet Explorer</category><category>XHTML</category><category>Apache</category><category>iOS</category><category>JavaScript</category><category>Design Patterns</category><category>Silverlight</category><title>Spinning the Web</title><description /><link>http://spinningtheweb.blogspot.com/</link><managingEditor>noreply@blogger.com (Mark)</managingEditor><generator>Blogger</generator><openSearch:totalResults>41</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/SpinningTheWeb" /><feedburner:info uri="spinningtheweb" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-2294817784565134683</guid><pubDate>Mon, 26 Dec 2011 20:33:00 +0000</pubDate><atom:updated>2011-12-26T12:36:53.221-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">JavaScript</category><category domain="http://www.blogger.com/atom/ns#">.NET Framework</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET MVC</category><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">HTML</category><category domain="http://www.blogger.com/atom/ns#">jQuery</category><title>Delayed Download Prompt in ASP.NET MVC 3</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zAObZRpdtH4gqDc3XAzMc1c1mUE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zAObZRpdtH4gqDc3XAzMc1c1mUE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zAObZRpdtH4gqDc3XAzMc1c1mUE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zAObZRpdtH4gqDc3XAzMc1c1mUE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;There may be times when it's handy to prompt users to download a file after a slight delay.  Such a delay can be useful because it gives users time to review a page's content before they are prompted to save.  A good example of this technique can be found on &lt;a href="http://sourceforge.net/" target="_blank"&gt;SourceForge&lt;/a&gt; whenever a visitor attempts to download a project.
&lt;br /&gt;&lt;br /&gt;
How can this be accomplished using ASP.NET MVC 3?  Let's make a small use case to illustrate our goal and then dig into some sample code:
&lt;ol&gt;
&lt;li&gt;Load a "download" page.&lt;/li&gt;
&lt;li&gt;After a 2 second delay, prompt the user to save a PDF document. (In this case we do not want the browser to use any plugins to render the document).&lt;/li&gt;
&lt;/ol&gt;
As per usual, Stack Overflow had a great &lt;a href="http://stackoverflow.com/questions/156686/how-to-start-automatic-download-of-a-file-in-internet-explorer" target="_blank"&gt;post&lt;/a&gt; to get me started:

&lt;pre class="brush: js"&gt;
$(function() {
 $(window).bind('load', function() { 
  $("div.downloadProject").delay(2000).append(
    '&lt;iframe scrolling=No width=1 height=1 frameborder=0 src=/FileToDownload.pdf&gt;&lt;/iframe&gt;'); 
   });
});
&lt;/pre&gt;

Be sure to include the following in our Html:

&lt;pre class="brush: html"&gt;
&lt;div class="downloadProject"&gt;&lt;/div&gt;
&lt;/pre&gt;

This code inserts an iframe into the DOM after a 2 second delay. This iframe is responsible for triggering the prompt to save the PDF.  Unfortunately, I could not get this to work in ASP.NET MVC 3 by just referencing the path to the PDF in the source attribute of the iframe.  To solve this, I added an action (and associated routing rules) to my Home controller for downloading the PDF as a FileContentResult.

&lt;pre class="brush: csharp"&gt;
public ActionResult DownloadPDF()
{
 return File("~/FileToDownload.pdf", "application/pdf", "FileToDownload.pdf");           
}
&lt;/pre&gt;

Including the third parameter in the "File" method adds the "Content-Disposition: attachment;" header - this forces the browser to handle the file using the save dialog prompt instead of any browser plugins.
&lt;br /&gt;&lt;br /&gt;
To finish up, we'll revisit the jQuery code we started with and point the iframe to our new action instead of the direct path to the PDF.

&lt;pre class="brush: js"&gt;
$(function() {
 $(window).bind('load', function() { 
  $("div.downloadProject").delay(2000).append(
    '&lt;iframe scrolling=No width=1 height=1 frameborder=0 src=/DownloadPDF&gt;&lt;/iframe&gt;'); 
   });
});
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-2294817784565134683?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=X3pARKfXAbs:2iwXjzqfYdc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=X3pARKfXAbs:2iwXjzqfYdc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?i=X3pARKfXAbs:2iwXjzqfYdc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=X3pARKfXAbs:2iwXjzqfYdc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?i=X3pARKfXAbs:2iwXjzqfYdc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/X3pARKfXAbs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/X3pARKfXAbs/delayed-download-prompt-in-aspnet-mvc-3.html</link><author>noreply@blogger.com (Mark)</author><thr:total>0</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2011/12/delayed-download-prompt-in-aspnet-mvc-3.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-2384032725542871671</guid><pubDate>Tue, 27 Sep 2011 06:24:00 +0000</pubDate><atom:updated>2011-09-27T00:24:19.467-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">iOS</category><category domain="http://www.blogger.com/atom/ns#">MonoTouch</category><category domain="http://www.blogger.com/atom/ns#">Mono</category><title>Slide to Unlock Control in MonoTouch</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vSyITMbrD1U1L9fS0Lc5c6dvqAk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vSyITMbrD1U1L9fS0Lc5c6dvqAk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vSyITMbrD1U1L9fS0Lc5c6dvqAk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vSyITMbrD1U1L9fS0Lc5c6dvqAk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="float: left; padding-right: 10px; padding-bottom: 10px;"&gt;&lt;!-- copy and paste. Modify height and width if desired. --&gt; &lt;object id="scPlayer"  width="368" height="716" type="application/x-shockwave-flash" data="http://content.screencast.com/users/Tron5000/folders/SpinningTheWeb/media/c5c33b23-66a7-4695-b72d-7db8dfea2d8d/bootstrap.swf" &gt; &lt;param name="movie" value="http://content.screencast.com/users/Tron5000/folders/SpinningTheWeb/media/c5c33b23-66a7-4695-b72d-7db8dfea2d8d/bootstrap.swf" /&gt; &lt;param name="quality" value="high" /&gt; &lt;param name="bgcolor" value="#FFFFFF" /&gt; &lt;param name="flashVars" value="thumb=http://content.screencast.com/users/Tron5000/folders/SpinningTheWeb/media/c5c33b23-66a7-4695-b72d-7db8dfea2d8d/FirstFrame.jpg&amp;containerwidth=368&amp;containerheight=716&amp;content=http://content.screencast.com/users/Tron5000/folders/SpinningTheWeb/media/c5c33b23-66a7-4695-b72d-7db8dfea2d8d/SlideToUnlock.swf&amp;blurover=false" /&gt; &lt;param name="allowFullScreen" value="true" /&gt; &lt;param name="scale" value="showall" /&gt; &lt;param name="allowScriptAccess" value="always" /&gt; &lt;param name="base" value="http://content.screencast.com/users/Tron5000/folders/SpinningTheWeb/media/c5c33b23-66a7-4695-b72d-7db8dfea2d8d/" /&gt; Unable to display content. Adobe Flash is required.&lt;/object&gt;&lt;/div&gt;
In a recent MonoTouch project I needed to make something similar to the slide-to-unlock control at the bottom of the iOS lock screen. 
&lt;br /&gt;&lt;br /&gt;
The goal was to derive from a UIImageView and trigger an &lt;em&gt;Activate&lt;/em&gt; event when a specified slider image got within range of the right end of the control.  I found this was fairly straightforward to implement using a pan gesture.  Below is the class I came up with and the associated images that were used:
&lt;br /&gt;&lt;br /&gt;
&lt;em&gt;Image&lt;/em&gt;&lt;br /&gt;
&lt;img border="0" height="52" width="255" src="http://4.bp.blogspot.com/-9qkxjGzc--I/ToFyukRKihI/AAAAAAAAG-k/dalWyR4fcyE/s400/slidetoactivate.png" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;em&gt;Slider&lt;/em&gt;&lt;br /&gt;
&lt;img border="0" height="52" width="69" src="http://3.bp.blogspot.com/-XSo1LPW3GX8/ToFzJhiZF5I/AAAAAAAAG-s/nbXMcvs7BDk/s400/slider.png" /&gt;&lt;/a&gt;

&lt;pre class="brush: csharp"&gt;
public class UISlideToActivateImageView : UIImageView
{
  #region Fields and Properties

  public event EventHandler&amp;lt;EventArgs&amp;gt; Activate;

  protected const float DEFAULT_ACTIVATION_RANGE = 20;

  public float ActivationRange { get; set; }

  public static Selector PanSelector
  {
    get
    {
      return new Selector("HandlePan");
    }
  }

  private UIImageView _sliderView = null;
  public UIImage Slider
  {
    get
    {
      return _sliderView.Image;
    }
    set
    {
      if (value != null)
      {
        if (_sliderView != null)
        {
          _sliderView.RemoveFromSuperview();
        }
        _sliderView = new UIImageView(
          new RectangleF(new PointF(0, 0), value.Size));
        _sliderView.Image = value;
        AddSubview(_sliderView);
      }
    }
  }

  protected PointF InitialLocation { get; set; }

  #endregion

  #region Constructors

  public UISlideToActivateImageView(PointF location, UIImage image)
    : base(image)
  {
    ActivationRange = DEFAULT_ACTIVATION_RANGE;
    Frame = new RectangleF(location, image.Size);
    RegisterPanGesture();
  }

  public UISlideToActivateImageView(PointF location, UIImage image,
    UIImage slider) : base(image)
  {
    ActivationRange = DEFAULT_ACTIVATION_RANGE;
    Frame = new RectangleF(location, image.Size);
    Slider = slider;
    RegisterPanGesture();
  }

  #endregion

  #region Events, Overrides and Delegates
        
  [Export("HandlePan")]
  public void HandlePan(UIPanGestureRecognizer panGesture)
  {
    const double EndedAnimationDuration = 0.2d;
    PointF newLocation;
    float adjX;
    if (panGesture != null)
    {
      newLocation = panGesture.LocationInView(this);
      switch (panGesture.State)
      {
        case UIGestureRecognizerState.Began:
          //User first taps the slider
          if ((newLocation.X &lt;= (Frame.X + Slider.Size.Width))
            &amp;&amp; (newLocation.X &gt;= 0))
          {
            InitialLocation = newLocation;
          }
          break;
        case UIGestureRecognizerState.Changed:
          //Moved their finger - make slider follow horizontal movements
          adjX = Frame.X + (newLocation.X - InitialLocation.X);
          if ((InitialLocation != PointF.Empty) &amp;&amp; (adjX &gt;= 0)
            &amp;&amp; (adjX &lt;= (Frame.Width - Slider.Size.Width)))
          {
            UIView.Animate(0d, delegate() {
              _sliderView.Frame = new RectangleF(new PointF(adjX, 0),
                                             _sliderView.Frame.Size);
            });
            //If the Slider comes within ActivationRange of end of this
            //control, fire the Activate event
            if ((Activate != null)
              &amp;&amp; (adjX &gt;= 
                (Frame.Width - Slider.Size.Width - ActivationRange)))
            {
              //Moved the slider all the way across the image view
              Activate(this, EventArgs.Empty);
            }
          }
          break;
        case UIGestureRecognizerState.Cancelled:
        case UIGestureRecognizerState.Failed:
        case UIGestureRecognizerState.Ended:
          //Lifted up finger - return slider to original position
          InitialLocation = PointF.Empty;
          UIView.Animate(EndedAnimationDuration, delegate() {
            _sliderView.Frame = new RectangleF(new PointF(0, 0), 
                                             _sliderView.Frame.Size);
          });
          break;
      }
    }
  }

  //Delegate for allowing the pan gesture recognizer to receive touch.
  public class ReceiveTouchGestureRecognizerDelegate
    : UIGestureRecognizerDelegate
  {
    public override bool ShouldReceiveTouch (
      UIGestureRecognizer recognizer,
      UITouch touch)
    {
      return true;
    }
  }

  #endregion

  #region Helper Methods

  protected void RegisterPanGesture()
  {
    UserInteractionEnabled = true;
    UIPanGestureRecognizer pan = new UIPanGestureRecognizer();
    pan.AddTarget(this, PanSelector);
    pan.Delegate = new ReceiveTouchGestureRecognizerDelegate();
    AddGestureRecognizer(pan);
  }

  #endregion
}&lt;/pre&gt;

To use this control it's simply a matter of assigning images (Image and Slider properties) and adding the class as a sub-view:
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;
UISlideToActivateImageView slideToActivate = 
  new UISlideToActivateImageView(new PointF(31, 214), 
    UIImage.FromFile("slidetoactivate.png"), UIImage.FromFile("slider.png"));
slideToActivate.Activate += delegate(object sender, EventArgs e) {
  UIAlertView alert = new UIAlertView("Congratulations!", 
    "You've engaged the UISlideToActivateImageView!", null, "Okay");
  alert.Show();
};			
View.AddSubview(slideToActivate);
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-2384032725542871671?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=g8Sb5TXwt60:dssIGZ0pSKE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=g8Sb5TXwt60:dssIGZ0pSKE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?i=g8Sb5TXwt60:dssIGZ0pSKE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=g8Sb5TXwt60:dssIGZ0pSKE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?i=g8Sb5TXwt60:dssIGZ0pSKE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/g8Sb5TXwt60" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/g8Sb5TXwt60/slide-to-unlock-control-in-monotouch.html</link><author>noreply@blogger.com (Mark)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-9qkxjGzc--I/ToFyukRKihI/AAAAAAAAG-k/dalWyR4fcyE/s72-c/slidetoactivate.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2011/09/slide-to-unlock-control-in-monotouch.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-932917664563163715</guid><pubDate>Wed, 31 Aug 2011 05:29:00 +0000</pubDate><atom:updated>2011-09-04T14:11:28.957-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">iOS</category><category domain="http://www.blogger.com/atom/ns#">MonoTouch</category><category domain="http://www.blogger.com/atom/ns#">Mono</category><title>Custom Animations for the UINavigationController in MonoTouch</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iBU7FYIhdW6BLaTRsc1U2o3fGVY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iBU7FYIhdW6BLaTRsc1U2o3fGVY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iBU7FYIhdW6BLaTRsc1U2o3fGVY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iBU7FYIhdW6BLaTRsc1U2o3fGVY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Pushing and popping controllers in a standard UINavigationController is a frequent activity when navigating an iOS app. The transition from controller to controller on the navigation stack may be optionally animated. Unfortunately, there's little choice regarding the animation itself.  The developer determines whether or not the default right-to-left (push) or left-to-right (pop) effect is rendered by setting a boolean.  &lt;br /&gt;
&lt;br /&gt;
In some areas of my UI I wanted more control over the animations in my navigation stack.  This &lt;a href="http://stackoverflow.com/questions/1406037/custom-animation-for-pushing-a-uiviewcontroller" target="_blank"&gt;thread&lt;/a&gt; on Stack Overflow was a great place to start.  I ported some of the Objective-C code I found to C# extension methods as follows:&lt;pre class="brush: csharp"&gt;//Allows a UINavigationController to push using a custom animation transition
public static void PushControllerWithTransition(this UINavigationController 
  target, UIViewController controllerToPush, 
  UIViewAnimationOptions transition)
{
  UIView.Transition(target.View, 0.75d, transition, delegate() {
    target.PushViewController(controllerToPush, false);
  }, null);
}
		
//Allows a UINavigationController to pop a using a custom animation 
public static void PopControllerWithTransition(this UINavigationController 
  target, UIViewAnimationOptions transition)
{
  UIView.Transition(target.View, 0.75d, transition, delegate() {
    target.PopViewControllerAnimated(false);
  }, null);			
}&lt;/pre&gt;With these extensions in scope, moving between controllers with a flip animation is now as trivial as this:&lt;pre class="brush: csharp"&gt;//Pushing someController to the top of the stack
NavigationController.PushControllerWithTransition(someController, 
  UIViewAnimationOptions.TransitionFlipFromLeft);

//Popping the current controller off the top of the stack
NavigationController.PopControllerWithTransition(
  UIViewAnimationOptions.TransitionFlipFromRight);&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-932917664563163715?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=vRIcBw2YH3E:dXp6kjTBpy4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=vRIcBw2YH3E:dXp6kjTBpy4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?i=vRIcBw2YH3E:dXp6kjTBpy4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=vRIcBw2YH3E:dXp6kjTBpy4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?i=vRIcBw2YH3E:dXp6kjTBpy4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/vRIcBw2YH3E" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/vRIcBw2YH3E/custom-animations-for.html</link><author>noreply@blogger.com (Mark)</author><thr:total>0</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2011/08/custom-animations-for.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-6992486807629794727</guid><pubDate>Sat, 20 Aug 2011 05:09:00 +0000</pubDate><atom:updated>2011-08-28T15:00:36.051-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">iOS</category><category domain="http://www.blogger.com/atom/ns#">MonoTouch</category><category domain="http://www.blogger.com/atom/ns#">Mono</category><title>Scheduling Local Notifications in MonoTouch</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LFqv02J1iQdt1j2eYXZvREzS0tk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LFqv02J1iQdt1j2eYXZvREzS0tk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LFqv02J1iQdt1j2eYXZvREzS0tk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LFqv02J1iQdt1j2eYXZvREzS0tk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;script type="text/javascript" src="http://gettopup.com/releases/latest/top_up-min.js"&gt;&lt;/script&gt;&lt;a href="http://3.bp.blogspot.com/-lsTJ0xZkIrY/Tk9OsXCI5zI/AAAAAAAAG-Q/ktf2Rr3oQrw/s1600/bgscheduledlocalnotification2.gif" class="top_up"&gt;&lt;img style="float:left; margin:0 10px 10px 0;" src="http://1.bp.blogspot.com/--fdfbYRY2xU/Tk9OsacGjBI/AAAAAAAAG-Y/zpifooWwZFU/s1600/bgscheduledlocalnotification_sm2.gif" border="0" alt="" /&gt;&lt;/a&gt;iOS 4 introduced local notifications, allowing apps to communicate brief text messages to users.  In particular, a scheduled local notification can reach a user whether the app is running in the foreground, in the background or not running at all.  While not as versatile as push notifications, scheduled local notifications can be helpful when an app needs to set-up predetermined alarms or reminders.  Each app can have a total of 64 simultaneous scheduled local notifications (use them wisely so as to not annoy your users). 

Below is an example of how to schedule a UILocalNotification using MonoTouch: 



&lt;pre class="brush: csharp"&gt;//Schedule one minute from the time of execution with no repeat
UILocalNotification notification = new UILocalNotification{
  FireDate = DateTime.Now.AddMinutes(1),
  TimeZone = NSTimeZone.LocalTimeZone,
  AlertBody = "This is your scheduled local notification!",
  RepeatInterval = 0
};
UIApplication.SharedApplication.ScheduleLocalNotification(notification);&lt;/pre&gt;
You might notice that scheduled local notifications are automatically displayed when the current date/time surpasses our &lt;em&gt;FireDate&lt;/em&gt; and the app is in the background or not running at all.  However, when the app is in the foreground local notifications are seemingly ignored.  This is by design.  If the app is in the foreground you are in charge of responding to scheduled local notifications by overriding the &lt;em&gt;ReceivedLocalNotification&lt;/em&gt; method as follows:&lt;pre class="brush: csharp"&gt;public override void ReceivedLocalNotification(UIApplication application, 
  UILocalNotification notification)
{
  //Do something to respond to the scheduled local notification
  UIAlertView alert = new UIAlertView("Notification Test", 
  notification.AlertBody, null, "Okay");
  alert.Show();
}&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-6992486807629794727?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=512F2c8yRhA:dwqUBrjBr8c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=512F2c8yRhA:dwqUBrjBr8c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?i=512F2c8yRhA:dwqUBrjBr8c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=512F2c8yRhA:dwqUBrjBr8c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?i=512F2c8yRhA:dwqUBrjBr8c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/512F2c8yRhA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/512F2c8yRhA/scheduling-local-notifications-in.html</link><author>noreply@blogger.com (Mark)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/--fdfbYRY2xU/Tk9OsacGjBI/AAAAAAAAG-Y/zpifooWwZFU/s72-c/bgscheduledlocalnotification_sm2.gif" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2011/08/scheduling-local-notifications-in.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-2346807693923478151</guid><pubDate>Sun, 27 Feb 2011 01:31:00 +0000</pubDate><atom:updated>2011-02-26T21:45:41.701-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET Framework</category><category domain="http://www.blogger.com/atom/ns#">Web Services</category><category domain="http://www.blogger.com/atom/ns#">MonoDevelop</category><category domain="http://www.blogger.com/atom/ns#">iOS</category><category domain="http://www.blogger.com/atom/ns#">MonoTouch</category><category domain="http://www.blogger.com/atom/ns#">Mono</category><title>Async Web Service Timout</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iM-6F6QlPyttF-8CG-MCqeKZTDQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iM-6F6QlPyttF-8CG-MCqeKZTDQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iM-6F6QlPyttF-8CG-MCqeKZTDQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iM-6F6QlPyttF-8CG-MCqeKZTDQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;When using SOAP-based web services (in this case with MonoDevelop / MonoTouch) I found I had to rely on the asynchronous proxy web methods to keep my UI responsive.  Pretty common, right?  Unfortunately, the asynchronous web methods seem to ignore the &lt;em&gt;TimeOut&lt;/em&gt; property on the service.  Without a timeout my users could be left waiting indefinitely on an unresponsive server.  Not acceptable.&lt;br /&gt;&lt;br /&gt;To get around this issue I came up with a way to cancel an asynchronous web method request after a set period of time using a Timer object.  Maybe it can help others in a similar predicament?  Here's some sample code:&lt;pre class="brush: csharp"&gt;&lt;br /&gt;protected void GetServiceData()&lt;br /&gt;{&lt;br /&gt; //Indicates that network activity is going on&lt;br /&gt; UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;&lt;br /&gt;    &lt;br /&gt; //Make the async call&lt;br /&gt; using (MyService service = new MyService())&lt;br /&gt; {  &lt;br /&gt;  //Timer is set to go off one time after 15 seconds&lt;br /&gt;  Timer serviceTimer = new Timer(15000);&lt;br /&gt;  serviceTimer.AutoReset = false;&lt;br /&gt;  serviceTimer.Elapsed += delegate(object source, ElapsedEventArgs e) {&lt;br /&gt;  service.Abort();&lt;br /&gt;   throw new WebException("Timeout expired!"); &lt;br /&gt;  };&lt;br /&gt;  serviceTimer.Enabled = true;     &lt;br /&gt;&lt;br /&gt;  //Call the desired web method&lt;br /&gt;  service.WebMethodCompleted += ServiceWebMethodCompleted;  &lt;br /&gt;  service.WebMethodAsync(serviceTimer);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//The async callback method&lt;br /&gt;protected void ServiceWebMethodCompleted(object sender, WebMethodCompletedEventArgs e)&lt;br /&gt;{&lt;br /&gt; using (NSAutoreleasePool pool = new NSAutoreleasePool())&lt;br /&gt; {&lt;br /&gt;  //Disable the timer that would abort this call with an exception &lt;br /&gt;  //if the call to this web method took too long&lt;br /&gt;  Timer serviceTimer = e.UserState as Timer;&lt;br /&gt;  if (serviceTimer != null)&lt;br /&gt;  {&lt;br /&gt;   serviceTimer.Enabled = false;&lt;br /&gt;   serviceTimer.Dispose();&lt;br /&gt;  }&lt;br /&gt;    &lt;br /&gt;  if (e.Error != null)&lt;br /&gt;  {&lt;br /&gt;   if (e.Error is WebException)&lt;br /&gt;   {&lt;br /&gt;    //An error due to a timeout happened - handle it here      &lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    //Handle all other errors here&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;   //Async call successful - do something cool with e.Result    &lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  //Indicates network activity has finished&lt;br /&gt;  this.InvokeOnMainThread(delegate() {&lt;br /&gt;   UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false;&lt;br /&gt;  });&lt;br /&gt; }   &lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-2346807693923478151?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=-0W2E5r2JlA:_tamHhNYN2E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=-0W2E5r2JlA:_tamHhNYN2E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?i=-0W2E5r2JlA:_tamHhNYN2E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=-0W2E5r2JlA:_tamHhNYN2E:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?i=-0W2E5r2JlA:_tamHhNYN2E:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/-0W2E5r2JlA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/-0W2E5r2JlA/async-web-service-timout.html</link><author>noreply@blogger.com (Mark)</author><thr:total>1</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2011/02/async-web-service-timout.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-6344607348974794312</guid><pubDate>Sun, 19 Sep 2010 02:47:00 +0000</pubDate><atom:updated>2010-09-18T21:01:54.204-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MonoDroid</category><category domain="http://www.blogger.com/atom/ns#">Windows Phone</category><category domain="http://www.blogger.com/atom/ns#">iPhone</category><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">iOS</category><category domain="http://www.blogger.com/atom/ns#">MonoTouch</category><category domain="http://www.blogger.com/atom/ns#">Mono</category><category domain="http://www.blogger.com/atom/ns#">Durbinware</category><title>Geo Rally for the iPhone</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/caWnQeTm_WwLJEu1Tz7g_jdP3u4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/caWnQeTm_WwLJEu1Tz7g_jdP3u4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/caWnQeTm_WwLJEu1Tz7g_jdP3u4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/caWnQeTm_WwLJEu1Tz7g_jdP3u4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a href="http://itunes.apple.com/us/app/geo-rally/id371905343"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 78px; height: 84px;" src="http://4.bp.blogspot.com/_62xEdOi6MtU/S9l4rBzsSvI/AAAAAAAAACk/71ySm79l3R0/s400/GeoRallyIconForSite.gif" border="0" alt="Geo Rally" /&gt;&lt;/a&gt;My side project, &lt;a href="http://www.durbinware.com/" target="_blank"&gt;Durbinware&lt;/a&gt;, released our first iPhone app, &lt;a href="http://itunes.apple.com/us/app/geo-rally/id371905343" target="_blank"&gt;Geo Rally&lt;/a&gt;, to Apple's App Store back in May.  It allows users to create, share and challenge timed point-to-point treasure hunts.  If you've seen the movies Rat Race, or Midnight Madness you'll understand the basic concept.  The first point, or starting line, is revealed at the beginning of the challenge and then each consecutive waypoint requires users to solve text-based clues or riddles to proceed.  Solving a clue and arriving at the next location triggers another clue and so on until the user arrives at the last point, or finish line. Different users can compete against the same course, or Rally, and the app will optionally tweet race completion times for bragging rights.  It has the potential to facilitate a great team building experience among youth groups, friends or co-workers. If this MonoTouch based app sounds interesting to you then by all means please &lt;a href="http://itunes.apple.com/us/app/geo-rally/id371905343" target="_blank"&gt;&lt;strong&gt;download it&lt;/strong&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I had a great time working on &lt;a href="http://itunes.apple.com/us/app/geo-rally/id371905343" target="_blank"&gt;Geo Rally&lt;/a&gt; and was very thankful for &lt;a href="http://monotouch.net/" target="_blank"&gt;MonoTouch&lt;/a&gt;. Coming from a .NET background I was a little overwhelmed at the prospect of learning a new language (Objective C) and iOS's multitude of supporting core APIs.  MonoTouch eliminated one of these roadblocks so I could hit the ground running in a familiar language and branch out into unknown APIs as needed. In the end I believe this made me more productive. And now, coupled with &lt;a href="http://monodroid.net/" target="_blank"&gt;MonoDroid&lt;/a&gt; and Windows Phone 7, there are even more options for code reuse (everything but the UI). It's a good time to be a C# developer!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-6344607348974794312?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=v7xIq9C9ZaY:-NKnu0BLvng:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=v7xIq9C9ZaY:-NKnu0BLvng:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?i=v7xIq9C9ZaY:-NKnu0BLvng:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=v7xIq9C9ZaY:-NKnu0BLvng:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?i=v7xIq9C9ZaY:-NKnu0BLvng:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/v7xIq9C9ZaY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/v7xIq9C9ZaY/geo-rally-for-iphone.html</link><author>noreply@blogger.com (Mark)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_62xEdOi6MtU/S9l4rBzsSvI/AAAAAAAAACk/71ySm79l3R0/s72-c/GeoRallyIconForSite.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2010/09/geo-rally-for-iphone.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-4102965125627689865</guid><pubDate>Sun, 11 Jul 2010 06:24:00 +0000</pubDate><atom:updated>2011-02-26T20:24:44.873-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET Framework</category><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">iOS</category><category domain="http://www.blogger.com/atom/ns#">MonoTouch</category><category domain="http://www.blogger.com/atom/ns#">Mono</category><title>iOS 4 and Map Kit Overlays with MonoTouch</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Y95SL4MyuPhnZXF3fhYsqHE-TnU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Y95SL4MyuPhnZXF3fhYsqHE-TnU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Y95SL4MyuPhnZXF3fhYsqHE-TnU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Y95SL4MyuPhnZXF3fhYsqHE-TnU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;One of the "over 100 new features" in iOS 4 that I've been especially interested in are Map Kit overlays.  Previously, developers were limited to using annotations to express points on a map.  If you wanted to draw a shape of some sort you were more or less up a creek.&lt;br /&gt;&lt;br /&gt;Overlays are a special kind of annotation designed to represent an area on a map.  iOS 4's Map Kit comes with some common shapes built in (rectangles, circles, polygons, etc).  As I understand it it's also possible to make your own custom shapes.&lt;br /&gt;&lt;br /&gt;Each overlay object holds data to represent the shape and has a corresponding view that tells the MKMapView's delegate how to draw the overlay.  As an example here's how one might draw a circle overlay with a 100 meter radius around the Empire State Building.  The code below shows how to do this in C# via MonoTouch.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;CLLocationCoordinate2D empireStBld = new CLLocationCoordinate2D(40.748433, -73.985656);&lt;br /&gt;double radiusInMeters = 100d;    &lt;br /&gt;MKCircle circle = MKCircle.Circle(empireStBld, radiusInMeters);            &lt;br /&gt;MapView.Delegate = new MapViewDelegate(circle); &lt;br /&gt;MapView.AddOverlay(circle);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The only thing left is that the MapViewDelegate class needs to be set up to give an appropriate view for the overlay:&lt;pre class="brush: csharp"&gt;&lt;br /&gt;public class MapViewDelegate : MKMapViewDelegate&lt;br /&gt;{&lt;br /&gt;  private MKCircle _circle = null;&lt;br /&gt;  private MKCircleView _circleView = null;&lt;br /&gt;   &lt;br /&gt;  public MapViewDelegate(MKCircle circle)&lt;br /&gt;  {&lt;br /&gt;    _circle = circle;&lt;br /&gt;  }&lt;br /&gt;   &lt;br /&gt;  public override MKOverlayView GetViewForOverlay(MKMapView mapView, NSObject overlay)&lt;br /&gt;  {&lt;br /&gt;    if ((_circle != null) &amp;&amp; (_circleView == null))&lt;br /&gt;    {&lt;br /&gt;      _circleView = new MKCircleView(_circle);&lt;br /&gt;      _circleView.FillColor = UIColor.Cyan; &lt;br /&gt;    }&lt;br /&gt;      return _circleView;&lt;br /&gt;  } &lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-4102965125627689865?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=Q5kAXIuLxyE:rk8qjVdCnYI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=Q5kAXIuLxyE:rk8qjVdCnYI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?i=Q5kAXIuLxyE:rk8qjVdCnYI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=Q5kAXIuLxyE:rk8qjVdCnYI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?i=Q5kAXIuLxyE:rk8qjVdCnYI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/Q5kAXIuLxyE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/Q5kAXIuLxyE/ios-4-and-map-kit-overlays-with.html</link><author>noreply@blogger.com (Mark)</author><thr:total>4</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2010/05/ios-4-and-map-kit-overlays-with.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-7186344593872432206</guid><pubDate>Thu, 15 Oct 2009 05:22:00 +0000</pubDate><atom:updated>2011-02-26T20:26:33.390-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET Framework</category><category domain="http://www.blogger.com/atom/ns#">iPhone</category><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">MonoTouch</category><category domain="http://www.blogger.com/atom/ns#">Mono</category><title>Reading RGB Info from Images on the iPhone using MonoTouch</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zuqiZHK7YxpSpQFypIZmC-ptRMo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zuqiZHK7YxpSpQFypIZmC-ptRMo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zuqiZHK7YxpSpQFypIZmC-ptRMo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zuqiZHK7YxpSpQFypIZmC-ptRMo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a href="http://monotouch.net/" target="_blank"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 140px; height: 183px;" src="http://3.bp.blogspot.com/_UP67jTvyQ3Y/Stay_uKkP4I/AAAAAAAAG7E/DZYBH7p-KgM/s200/MonoTouchBoxPersonal.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5392694411616599938" /&gt;&lt;/a&gt;&lt;a href="http://monotouch.net/" target="_blank"&gt;MonoTouch&lt;/a&gt; is an intriguing new software development kit from Novell.  It utilizes the open source &lt;a href="http://mono-project.com/Main_Page" target="_blank"&gt;Mono&lt;/a&gt; project to allow developers to write code in C# that can then be statically compiled into native iPhone applications and deployed to devices or even to the App Store.  A free &lt;a href="http://monotouch.net/DownloadTrial" target="_blank"&gt;evaluation version&lt;/a&gt; is available if the product interests you. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I downloaded the evaluation version and decided to take this new development kit for a spin by using it to read RGB color information from all pixels in an image saved on the device.  I ended up creating a CGBitmapContext to do this and then marshaling the results into a byte array.  Please see the code below for more details: &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;//_selectedImage refers to the UIImage object of interest&lt;br /&gt;int width = _selectedImage.CGImage.Width;&lt;br /&gt;int height = _selectedImage.CGImage.Height;&lt;br /&gt;//4 color settings for every pixel (RGBA)&lt;br /&gt;int pixelDataCount = width * height * 4;&lt;br /&gt;IntPtr data = Marshal.AllocHGlobal(pixelDataCount);&lt;br /&gt;int bitsPerComponent = 8;&lt;br /&gt;int bytesPerPixel = 4;&lt;br /&gt;int bytesPerRow = bytesPerPixel * width;&lt;br /&gt;//Draw image to an RGB bitmap context&lt;br /&gt;CGBitmapContext imgContext = new CGBitmapContext(data, &lt;br /&gt;  width, height, bitsPerComponent, bytesPerRow, &lt;br /&gt;  CGColorSpace.CreateDeviceRGB(), CGImageAlphaInfo.PremultipliedLast);&lt;br /&gt;imgContext.DrawImage(new RectangleF(0.0F, 0.0F, width, height), &lt;br /&gt;  _selectedImage.CGImage);    &lt;br /&gt;byte[] pixelData = new byte[pixelDataCount];&lt;br /&gt;Marshal.Copy(data, pixelData, 0, pixelDataCount);&lt;br /&gt;    &lt;br /&gt;//Milk the color settings for each pixel in the image&lt;br /&gt;int red;&lt;br /&gt;int green;&lt;br /&gt;int blue;&lt;br /&gt;int currentPixelIndex = 0;                  &lt;br /&gt;for (int countHeight = 0; countHeight &lt; height; countHeight++)&lt;br /&gt;{&lt;br /&gt;  for (int countWidth = 0; countWidth &lt; width; countWidth++)&lt;br /&gt;  { &lt;br /&gt;    red = pixelData[currentPixelIndex];&lt;br /&gt;    currentPixelIndex++;&lt;br /&gt;    green = pixelData[currentPixelIndex];&lt;br /&gt;    currentPixelIndex++;      &lt;br /&gt;    blue = pixelData[currentPixelIndex];&lt;br /&gt;    currentPixelIndex++;&lt;br /&gt;&lt;br /&gt;    //Currently ignoring the alpha byte&lt;br /&gt;    currentPixelIndex++;&lt;br /&gt;&lt;br /&gt;    //Probably will want to Cache RGB values here for later use&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-7186344593872432206?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=NClL_KNbrbM:vRHN1br4Rw0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=NClL_KNbrbM:vRHN1br4Rw0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?i=NClL_KNbrbM:vRHN1br4Rw0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/SpinningTheWeb?a=NClL_KNbrbM:vRHN1br4Rw0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/SpinningTheWeb?i=NClL_KNbrbM:vRHN1br4Rw0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/NClL_KNbrbM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/NClL_KNbrbM/reading-rgb-info-from-images-on-iphone.html</link><author>noreply@blogger.com (Mark)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_UP67jTvyQ3Y/Stay_uKkP4I/AAAAAAAAG7E/DZYBH7p-KgM/s72-c/MonoTouchBoxPersonal.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2009/10/reading-rgb-info-from-images-on-iphone.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-2873446500734714057</guid><pubDate>Sat, 27 Sep 2008 05:40:00 +0000</pubDate><atom:updated>2011-02-26T20:29:19.983-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">C#</category><title>Closures in PHP 5.3</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uhh6g752XbntPAganDm6je3Vfbs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uhh6g752XbntPAganDm6je3Vfbs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uhh6g752XbntPAganDm6je3Vfbs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uhh6g752XbntPAganDm6je3Vfbs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;If early releases are any indication, PHP is scheduled to receive some pretty significant updates in version 5.3.  In addition to namespaces, I'm particularly interested in the addition of closures.  &lt;br /&gt;&lt;br /&gt;According to object-oriented programming expert &lt;a href="http://martinfowler.com/bliki/Closure.html" target="_blank"&gt;Martin Fowler&lt;/a&gt;, closures are defined as a block of code that can be passed to a function.  However, delegates (C#), anonymous classes (Java) and function pointers (C) don't quite qualify because the following also needs to be true:&lt;ol&gt;&lt;li&gt;Closures need to be able to refer to variables already present in scope at the time they're defined.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Closures shouldn't require complex syntax (I personally think this point is a tad subjective).&lt;/li&gt;&lt;/ol&gt;As you can imagine this capability might be helpful when writing a function that repeatedly executes a block of code specific to the function.  It wouldn't make sense to refactor this block of code to the class level if it doesn't get used anywhere outside the function.  With closures, the block of code distinct to the function may be defined and repeatedly called upon without having to bloat your classes.&lt;br /&gt;&lt;br /&gt;PHP's upcoming syntax for closures is shaping up to be comparable to the C# 2.0 implementation.  In the .NET world closures first arrived as anonymous methods in C# 2.0 (these were later simplified into lambda expressions in C# 3.0).&lt;br /&gt;&lt;br /&gt;For comparison's sake C# anonymous methods look something like this:&lt;pre class="brush: csharp"&gt;/* Returns true if tOne and tTwo are  both evenly &lt;br /&gt;   divisible by the denominator (denom) */&lt;br /&gt;public bool EvenlyDivisible(int denom, int tOne, int tTwo)&lt;br /&gt;{           &lt;br /&gt;  //Define the closure&lt;br /&gt;  Predicate&lt;int&gt; evenlyDivisible = delegate(int testNum)&lt;br /&gt;  {&lt;br /&gt;    //Note that denom is defined outside closure scope&lt;br /&gt;    if ((testNum % denom) == 0)&lt;br /&gt;    {&lt;br /&gt;      return true;&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;      return false;&lt;br /&gt;    }&lt;br /&gt;  };&lt;br /&gt;&lt;br /&gt;  //Use the closure as necessary&lt;br /&gt;  if (evenlyDivisible(tOne) &amp;&amp; (evenlyDivisible(tTwo)))&lt;br /&gt;  {&lt;br /&gt;      return true;&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;      return false;&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;When released, a comparable implementation in PHP 5.3 will probably look something like the following:&lt;pre class="brush: php"&gt;/* Returns true if $tOne and $tTwo are  both evenly &lt;br /&gt;   divisible by the denominator ($denom) */&lt;br /&gt;function EvenlyDivisible($denom, $tOne, $tTwo)&lt;br /&gt;{&lt;br /&gt;  $evenlyDivisible = function ($testNum) use ($denom) {&lt;br /&gt;    //Note that $denom is defined outside closure scope&lt;br /&gt;    if (($testNum % $denom) == 0)&lt;br /&gt;    {&lt;br /&gt;      return true;&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;      return false;&lt;br /&gt;    }&lt;br /&gt;  };&lt;br /&gt;&lt;br /&gt;  //Use the closure as necessary&lt;br /&gt;  if ($evenlyDivisible($tOne) &amp;&amp; ($evenlyDivisible($tTwo)))&lt;br /&gt;  {&lt;br /&gt;      return true;&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;      return false;&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;For additional information please check out the &lt;a href="http://wiki.php.net/rfc/closures" target="_blank"&gt;closure proposal on php.net&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-2873446500734714057?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=YP6lKJGZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=leOngibh"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=leOngibh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=PmBK3uVt"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=PmBK3uVt" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/i16yEFwMT7M" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/i16yEFwMT7M/closures-in-php-53.html</link><author>noreply@blogger.com (Mark)</author><thr:total>2</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2008/09/closures-in-php-53.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-6856819376377953694</guid><pubDate>Sat, 23 Aug 2008 06:20:00 +0000</pubDate><atom:updated>2011-02-26T20:30:57.890-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><title>The ref and out Keywords in C#</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qn_tCOerG0Nq6Wwbs4v-SonUIgA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qn_tCOerG0Nq6Wwbs4v-SonUIgA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qn_tCOerG0Nq6Wwbs4v-SonUIgA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qn_tCOerG0Nq6Wwbs4v-SonUIgA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;In C# all value type parameters (objects that inherit from System.ValueType) are allocated to the stack and passed by value.  This means that a copy of these variables is created and passed into the method being called.  Since the parameter is a local copy its scope is limited to that method.  See the following example below:&lt;pre class="brush: csharp"&gt;protected void Sample()&lt;br /&gt;{&lt;br /&gt;    int x = 5;&lt;br /&gt;    //Writes 5 to the console&lt;br /&gt;    Console.WriteLine(x.ToString());&lt;br /&gt;    //Send a copy of x&lt;br /&gt;    Increment(x);&lt;br /&gt;    //Writes 5 to the console&lt;br /&gt;    Console.WriteLine(x.ToString());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected void Increment(int incoming)&lt;br /&gt;{&lt;br /&gt;    incoming++;&lt;br /&gt;}&lt;/pre&gt;Note that the variable x is not changed by the Increment method.  In most cases this behavior is desired.  However, there are occasions when we may want to persist changes to a value type parameter beyond the scope of the method.  This is where the ref and out keywords come into play.  Here's our sample again but with the ref keyword used in the Increment method:&lt;pre class="brush: csharp"&gt;protected void Sample()&lt;br /&gt;{&lt;br /&gt;    int x = 5;&lt;br /&gt;    //Writes 5 to the console&lt;br /&gt;    Console.WriteLine(x.ToString());&lt;br /&gt;    //Send a reference of x&lt;br /&gt;    Increment(ref x);&lt;br /&gt;    //Writes 6 to the console&lt;br /&gt;    Console.WriteLine(x.ToString());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected void Increment(ref int incoming)&lt;br /&gt;{&lt;br /&gt;    incoming++;&lt;br /&gt;}&lt;/pre&gt;Note that this time around x is 6 after the Increment method is executed.&lt;br /&gt;&lt;br /&gt;The ref and out keywords operate identically except that ref parameters must be initialized before being passed into the method while out parameters must be initialized by the time the method returns.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-6856819376377953694?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=zaycl3Yi"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=fJSWG5le"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=fJSWG5le" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=R13gAJTQ"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=R13gAJTQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/mIj5szuJ_LI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/mIj5szuJ_LI/ref-and-out-keywords-in-c.html</link><author>noreply@blogger.com (Mark)</author><thr:total>0</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2008/08/ref-and-out-keywords-in-c.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-3169130366563895100</guid><pubDate>Sun, 10 Aug 2008 00:37:00 +0000</pubDate><atom:updated>2011-02-26T20:32:41.551-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQL Server</category><title>SQL Server 2005 Finicky with Nested Comments</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/R3olOYoqu09oGN7VFrRCvGICNtY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R3olOYoqu09oGN7VFrRCvGICNtY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/R3olOYoqu09oGN7VFrRCvGICNtY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R3olOYoqu09oGN7VFrRCvGICNtY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;I found out the hard way that MS SQL Server 2005 is sometimes finicky about nested comments leading up to &lt;span style="font-style:italic;"&gt;CREATE PROCEDURE&lt;/span&gt; or &lt;span style="font-style:italic;"&gt;ALTER PROCEDURE&lt;/span&gt; lines. Here's a simple illustration of this phenomenon:&lt;pre class="brush: sql"&gt;&lt;br /&gt;/*&lt;br /&gt;    /*Bad comment line*/2&lt;br /&gt;*/&lt;br /&gt;CREATE PROCEDURE [dbo].[GetProduct]&lt;br /&gt;AS&lt;br /&gt;&lt;br /&gt;SELECT * FROM Product&lt;/pre&gt;This code executes without error...but everything grinds to a halt when you try to modify or script it.  Management Studio reports a &lt;span style="font-style:italic;"&gt;Syntax error in TextHeader&lt;/span&gt;.  &lt;br /&gt;&lt;br /&gt;I ran into this behavior after working an hour on a fairly complex sproc.  I didn't back up my work before I ran it, assuming I could always pull it out of the database to make tweaks if necessary.  Needless to say I was miffed to find that I couldn't open the stored procedure and effectively lost my work.&lt;br /&gt;&lt;br /&gt;Thankfully, it's possible to retrieve code that's lost in this manner:&lt;pre class="brush: sql"&gt;&lt;br /&gt;SELECT &lt;br /&gt; ROUTINE_DEFINITION&lt;br /&gt;FROM INFORMATION_SCHEMA.Routines&lt;br /&gt;WHERE     &lt;br /&gt; ROUTINE_Name = 'GetProduct'&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-3169130366563895100?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=l7WxwpGQ"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=XUdQcnHR"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=XUdQcnHR" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=pd3A5qUe"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=pd3A5qUe" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/AeSkbOFQLz0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/AeSkbOFQLz0/sql-server-2005-finicky-with-nested.html</link><author>noreply@blogger.com (Mark)</author><thr:total>1</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2008/08/sql-server-2005-finicky-with-nested.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-9008833877836898110</guid><pubDate>Tue, 20 May 2008 06:15:00 +0000</pubDate><atom:updated>2008-05-20T00:06:49.393-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Internet Explorer</category><category domain="http://www.blogger.com/atom/ns#">Firefox</category><title>Browsershots Browser Compatibility Tool</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gXImTQS4r09x9veFc4_sYvNuN5w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gXImTQS4r09x9veFc4_sYvNuN5w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gXImTQS4r09x9veFc4_sYvNuN5w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gXImTQS4r09x9veFc4_sYvNuN5w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a href="http://browsershots.org/" target="_blank"&gt;&lt;img style="float:left; margin:0 10px 10px 0;" src="http://1.bp.blogspot.com/_UP67jTvyQ3Y/SDJvsm-KOgI/AAAAAAAAEZ8/1T1riX23JPY/s400/browsershots.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5202343331732535810" /&gt;&lt;/a&gt; For many projects I end up developing and testing my web applications on Internet Explorer, Firefox and Safari.  This strategy, though sufficient for testing common scenarios, does not take into account multiple operating systems, browser versions or additional browser vendors.  Any of these factors might introduce compatibility issues.  It would be very costly, boring and ultimately unrealistic to manually test against all of these possible variations.&lt;br /&gt;&lt;br /&gt;This is where &lt;a href="http://browsershots.org/" target="_blank"&gt;Browsershots&lt;/a&gt; enters the picture.  This open source service (created by Johann C. Rocholl) generates screen shots of your web application running under your choice of over 40 web browsers that span 4 platforms.  &lt;br /&gt;&lt;br /&gt;I'm very pleased to have such a tool available for automating the leg work that goes into browser testing, especially for the less likely scenarios.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-9008833877836898110?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=b7Ibb9EY"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=8fsAY0fn"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=8fsAY0fn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=lTef0hNb"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=lTef0hNb" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/Nu20N-z6sMg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/Nu20N-z6sMg/browsershots-browser-compatibility-tool.html</link><author>noreply@blogger.com (Mark)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_UP67jTvyQ3Y/SDJvsm-KOgI/AAAAAAAAEZ8/1T1riX23JPY/s72-c/browsershots.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2008/05/browsershots-browser-compatibility-tool.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-817516042767783734</guid><pubDate>Tue, 01 Apr 2008 04:21:00 +0000</pubDate><atom:updated>2008-03-31T21:59:04.026-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Design Patterns</category><category domain="http://www.blogger.com/atom/ns#">Enterprise Architecture</category><title>Design Pattern Reference</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/K_uHOk5hYoww-DFsQEc1TdWKIYI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/K_uHOk5hYoww-DFsQEc1TdWKIYI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/K_uHOk5hYoww-DFsQEc1TdWKIYI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/K_uHOk5hYoww-DFsQEc1TdWKIYI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;If you're interested in learning more about design patterns, or if you'd simply like to have a reference handy when sizing up your next project, I wholeheartedly recommend the following:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.netobjectivesrepository.com/" target="_blank"&gt;The Net Objectives Pattern Repository&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.netobjectives.com/" target="_blank"&gt;Net Objectives&lt;/a&gt; has put together some well articulated verbiage detailing the nuances of over half a dozen design patterns.  For myself, the inclusion of procedural analogs and non-software analogs (metaphors for each pattern in the real world) are especially helpful.  Sample implementations, motivations for use, testing issues and consequences of use are also explored for each pattern.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-817516042767783734?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=cC3FvYnb"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=HsbbsCLl"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=HsbbsCLl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=UwWEZuv0"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=UwWEZuv0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/A8ttbWYLyVM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/A8ttbWYLyVM/design-pattern-reference.html</link><author>noreply@blogger.com (Mark)</author><thr:total>0</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2008/03/design-pattern-reference.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-5269652611667036618</guid><pubDate>Sat, 06 Oct 2007 04:24:00 +0000</pubDate><atom:updated>2007-10-05T21:37:12.196-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">OS X</category><category domain="http://www.blogger.com/atom/ns#">Boot Camp</category><title>Removing Boot Camp</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8MRYODEazMgCKT4YoffFNAhUYNE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8MRYODEazMgCKT4YoffFNAhUYNE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8MRYODEazMgCKT4YoffFNAhUYNE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8MRYODEazMgCKT4YoffFNAhUYNE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img style="float:left; margin:0 10px 10px 0;" src="http://4.bp.blogspot.com/_UP67jTvyQ3Y/RwcPNkZEcDI/AAAAAAAADG4/A3KZ1VcLN58/s400/bootcamp.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5118076227311398962" /&gt;When I first got my MacBook Pro I installed Apple's &lt;a href="http://www.apple.com/macosx/bootcamp/" target="_blank"&gt;Boot Camp&lt;/a&gt; software so I could still run the odd Windows application.  This proved handy, albeit tedious to have to reboot whenever switching operating systems.  During the summer I installed a copy of &lt;a href="http://www.parallels.com/" target="_blank"&gt;Parallels&lt;/a&gt; and can now blissfully run Windows within OS X whenever necessary.&lt;br /&gt;&lt;br /&gt;Unfortunately, removing Boot Camp took a little leg work.  I started by using the "Boot Camp Assistant" to restore the startup disk to a single volume.  This seemed to work properly at first.  But before long I noticed this change affected the startup time.  Upon booting, a folder with a question mark would appear and spin its wheels for a moment prior to the gray Apple logo.  Everything else worked fine.&lt;br /&gt;&lt;br /&gt;Today I found a solution to this nagging issue in the Apple support forums.  Simply &lt;a href="http://docs.info.apple.com/article.html?artnum=2238" target="_blank"&gt;reset the PRAM&lt;/a&gt;:&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Shut down computer.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Turn on computer.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Press and hold the Command+Option+P+R keys before the startup screen appears.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Wait until the computer restarts and you hear the startup sound.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-5269652611667036618?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=Wh8kX0qu"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=Y3ouj8a6"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=Y3ouj8a6" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=fDqt63vB"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=fDqt63vB" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/3Cw8I_xD44E" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/3Cw8I_xD44E/removing-boot-camp.html</link><author>noreply@blogger.com (Mark)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_UP67jTvyQ3Y/RwcPNkZEcDI/AAAAAAAADG4/A3KZ1VcLN58/s72-c/bootcamp.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2007/10/removing-boot-camp.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-351805842055151880</guid><pubDate>Fri, 05 Oct 2007 05:40:00 +0000</pubDate><atom:updated>2007-10-04T22:52:50.180-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SOA</category><category domain="http://www.blogger.com/atom/ns#">Enterprise Architecture</category><title>Commitment to Service Oriented Architecture</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YNDrCoD8Se2GnCVb7GD_qZOLaIw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YNDrCoD8Se2GnCVb7GD_qZOLaIw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YNDrCoD8Se2GnCVb7GD_qZOLaIw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YNDrCoD8Se2GnCVb7GD_qZOLaIw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Let me begin with the admission that my knowledge of Service Oriented Architecture (SOA) is largely theoretical.  It stems from a composition of IT articles and war stories shared by other developers.  All this to say that my opinions in this post may be naive, but I'll toss them out there anyway.&lt;br /&gt;&lt;br /&gt;SOA, in many circles, is something of a holy grail in software development.  After all, a group of applications that're fluent in XML to gracefully synchronize with a central message bus makes for an enticing proposal.  Suddenly no single system is a lone island, but every application has to work together.  Existing redundancy between systems can be eliminated, alleviating maintenance.  If an application could be likened to a single-cell organism, then SOA enterprise architecture would represent a complex multi-celled creature.&lt;br /&gt;&lt;br /&gt;But how do businesses get from point A to point B?  It's unrealistic to pretend that the transition will happen all by itself.  It's my opinion that if an enterprise decides to pursue an SOA architecture it will have to drive it home with a top-down mandate from leaders within the company.  Anything less will equate to a lukewarm infinite loop of high expectations, varying degrees of commitment from developers and resulting projects that fail to consistently communicate with the message bus.&lt;br /&gt;&lt;br /&gt;The first application to transition to a service may be the biggest challenge.  It may consist of several identifiable resources each needing to be dissected into a smaller subset of unique services.  This process will take time, burn money and require a business to be fully on board with the new architecture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-351805842055151880?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=tSVJxAoL"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=bc6ijnB2"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=bc6ijnB2" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=OJlTC2Br"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=OJlTC2Br" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/j8zJ5Yj0dx8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/j8zJ5Yj0dx8/commitment-to-service-oriented.html</link><author>noreply@blogger.com (Mark)</author><thr:total>0</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2007/10/commitment-to-service-oriented.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-7907918545802184000</guid><pubDate>Sun, 05 Aug 2007 03:15:00 +0000</pubDate><atom:updated>2007-08-04T20:39:20.233-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>Mobile Web Forms in Visual Studio 2005 SP1</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eOnq1JGsZDaECs7XogihIXAQRmw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eOnq1JGsZDaECs7XogihIXAQRmw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eOnq1JGsZDaECs7XogihIXAQRmw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eOnq1JGsZDaECs7XogihIXAQRmw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;In a recent project I was required to alter my web application to make it more compatible with small devices (such as PDAs and cellphones).  I attempted to add a mobile web form and found that no such template was available.&lt;br /&gt;&lt;br /&gt;After a bit of searching I found out that Visual Studio 2005 SP1 removed this capability for web application projects (it was last present in Visual Studio 2003).  Thankfully the Visual Studio Web Tools group &lt;a href="http://blogs.msdn.com/webdevtools/archive/2007/01/09/tip-trick-using-mobile-web-forms-with-web-applicaiton-projects.aspx" target="_blank"&gt;posted the templates here&lt;/a&gt; as an optional download.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-7907918545802184000?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=1FmpS2Ri"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=tO9GRAGz"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=tO9GRAGz" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=K8QqrZaj"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=K8QqrZaj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/iN0Fb27GUNs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/iN0Fb27GUNs/mobile-web-forms-in-visual-studio-2005.html</link><author>noreply@blogger.com (Mark)</author><thr:total>0</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2007/08/mobile-web-forms-in-visual-studio-2005.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-1769516709874048794</guid><pubDate>Tue, 03 Jul 2007 21:09:00 +0000</pubDate><atom:updated>2007-08-04T20:29:45.537-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MySQL</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">IIS</category><category domain="http://www.blogger.com/atom/ns#">Open Source</category><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">Windows</category><category domain="http://www.blogger.com/atom/ns#">Apache</category><title>Experiments with Moodle</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vasd6pVpYaYbJrcVek0U43WgKYs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vasd6pVpYaYbJrcVek0U43WgKYs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vasd6pVpYaYbJrcVek0U43WgKYs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vasd6pVpYaYbJrcVek0U43WgKYs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a href="http://moodle.org/" target="_blank"&gt;&lt;img style="float:left; margin:0 10px 0px 0;" src="http://1.bp.blogspot.com/_UP67jTvyQ3Y/RoqwIW97z1I/AAAAAAAACiM/fe4pbDcnfio/s400/moodle.gif" border="0" alt="Moodle" id="BLOGGER_PHOTO_ID_5083068787091820370" /&gt;&lt;/a&gt;The other day I was asked to help install Moodle for a friend.  If you've not heard of it, Moodle is an open source PHP application used (as their &lt;a href="http://moodle.org/" target="_blank"&gt;site&lt;/a&gt; describes) to "help educators create effective online communities."  It includes blogs, wikis and content management combined to compliment lesson plans with the synergy of online collaboration and social interaction.  I won't get into reviewing the application itself but I will say a few things about my experience with the installation process.&lt;br /&gt;&lt;br /&gt;For starters Moodle requires a web server, PHP and a relational database.  My goal was to set up the application on an existing Windows / IIS / MySQL shared hosting account on &lt;a href="http://www.godaddy.com/" target="_blank"&gt;Go Daddy&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;To prepare for this activity I decided to take Moodle for a spin on my MacBook Pro where I'm running Apache, PHP 5 and MySQL.  The installation required two additional items I was not expecting: a cron job and permissions for the application to write to a special "Data" directory.  Nonetheless, the automated setup script worked flawlessly and I was up and running within fifteen minutes.&lt;br /&gt;&lt;br /&gt;I naively thought that the Windows installation would be similar.  However, no matter what I tried I couldn't get the setup script to run properly.  Perhaps due to hosting limitations?  Maybe I made a mistake somewhere along the line?  One way or another, I was quick to switch to a Linux plan where, similar to OS X, set up was quick and painless.&lt;br /&gt;&lt;br /&gt;I know others have had success with Moodle on Windows but all the same I'd recommend a Linux server as the most appropriate vehicle for this application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-1769516709874048794?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=qHBnuaVO"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=ppJOclWB"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=ppJOclWB" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=sAo5SbU4"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=sAo5SbU4" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/nCQlc9keZ4M" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/nCQlc9keZ4M/other-day-i-was-asked-to-help-install.html</link><author>noreply@blogger.com (Mark)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_UP67jTvyQ3Y/RoqwIW97z1I/AAAAAAAACiM/fe4pbDcnfio/s72-c/moodle.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2007/07/other-day-i-was-asked-to-help-install.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-7045974723202108899</guid><pubDate>Sun, 29 Apr 2007 05:27:00 +0000</pubDate><atom:updated>2007-04-28T23:56:58.818-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">JavaScript</category><category domain="http://www.blogger.com/atom/ns#">AJAX</category><category domain="http://www.blogger.com/atom/ns#">.NET Framework</category><category domain="http://www.blogger.com/atom/ns#">Apollo</category><category domain="http://www.blogger.com/atom/ns#">Silverlight</category><title>The Token AJAX Post</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nt163vGW_DwH40fphPKRP3pHvRM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nt163vGW_DwH40fphPKRP3pHvRM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nt163vGW_DwH40fphPKRP3pHvRM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nt163vGW_DwH40fphPKRP3pHvRM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;It's the backbone of the oft heralded "Web 2.0" movement.  It's the key to breathing fresh, interactive life into an aging XHTML spec.  If you had not already gathered from these clues and the title of my post, I'm referring to AJAX - asynchronous JavaScript and XML.&lt;br /&gt;&lt;br /&gt;I'd bet many readers can sympathize with the sense of bedazzlement I experienced upon first laying eyes on &lt;a href="http://maps.google.com/" target="_blank"&gt;Google Maps&lt;/a&gt;.  Add to that  &lt;a href="http://www.live.com/" target="_blank"&gt;Windows Live&lt;/a&gt;, &lt;a href="http://www.flickr.com/" target="_blank"&gt;Flickr&lt;/a&gt; and &lt;a href="http://gmail.google.com/" target="_blank"&gt;GMail&lt;/a&gt;, among a host of others, and there is an obvious trend of companies using JavaScript to push their applications to new heights.  &lt;br /&gt;&lt;br /&gt;With AJAX, interaction between the web server and the client are no longer limited to jagged, intermittent spurts of activity.  Instead the bits flow over the wire as soon as they're requested, making for a smoother browsing experience.  The best of these AJAX applications have often given me the eerie feeling that I'm not using a browser at all.   &lt;br /&gt;&lt;br /&gt;But is it just hype?  I think the AJAX phenomena has been around long enough to have settled comfortably into the minds of developers and the expectations of users.  I don't think it's a passing fad.  However, I also tend to believe that the overall usefulness of AJAX has been blown out of proportion.  True, it can make for a snappier user interface, but I don't see it as much of a revolution.  If anything, I think AJAX was the next evolutionary step beyond the dynamic HTML that was so heavily pushed in the late 90's.&lt;br /&gt;&lt;br /&gt;I used the MS AJAX package in a recent project and was pleased to see that this and similar toolkits are opening AJAX techniques to a wider audience of developers.  But in my mind I foresee the true next-generation web-based software to transcend traditional XHTML/JavaScript scenarios via new runtimes such as &lt;a href="http://labs.adobe.com/wiki/index.php/Apollo" target="_blank"&gt;Adobe Apollo&lt;/a&gt; and &lt;a href="http://www.microsoft.com/silverlight/" target="_blank"&gt;Microsoft Silverlight&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-7045974723202108899?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=5D4ehRQY"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=i4Wpr4mb"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=i4Wpr4mb" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=lNiSkCF0"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=lNiSkCF0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/Krd7iiGHMmE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/Krd7iiGHMmE/token-ajax-post.html</link><author>noreply@blogger.com (Mark)</author><thr:total>0</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2007/04/token-ajax-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-3987853270516879701</guid><pubDate>Mon, 05 Feb 2007 00:00:00 +0000</pubDate><atom:updated>2007-02-04T16:02:12.617-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ADO.NET</category><category domain="http://www.blogger.com/atom/ns#">.NET Framework</category><category domain="http://www.blogger.com/atom/ns#">CSLA</category><title>CSLA for .NET</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rU0-MCb5b-61-ZOzjsQ04fs4axw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rU0-MCb5b-61-ZOzjsQ04fs4axw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rU0-MCb5b-61-ZOzjsQ04fs4axw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rU0-MCb5b-61-ZOzjsQ04fs4axw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a href="http://www.amazon.com/Expert-2005-Business-Objects-Second/dp/1590596323/sr=8-1/qid=1169790347/ref=pd_bbs_sr_1/105-2704106-6444431?ie=UTF8&amp;s=books" target="_blank"&gt;&lt;img style="float:left; margin:0 10px 10px 0;" src="http://3.bp.blogspot.com/_UP67jTvyQ3Y/RcWg_dgGj-I/AAAAAAAAAAM/s5n9Npo9LhM/s320/cs2005.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5027601571140505570" /&gt;&lt;/a&gt;If you read one technical book this year I implore you to consider Rockford Lhotka's &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.amazon.com/Expert-2005-Business-Objects-Second/dp/1590596323/sr=8-1/qid=1169790347/ref=pd_bbs_sr_1/105-2704106-6444431?ie=UTF8&amp;s=books" target="_blank"&gt;Expert C# 2005 Business Objects&lt;/a&gt;&lt;/span&gt; (or &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.amazon.com/Expert-2005-Business-Objects-Second/dp/1590596315/sr=8-1/qid=1169790463/ref=pd_bbs_sr_1/105-2704106-6444431?ie=UTF8&amp;s=books" target="_blank"&gt;Expert VB 2005 Business Objects&lt;/a&gt;&lt;/span&gt; if curly braces don't float your boat).&lt;/span&gt;  This book does a marvelous job of describing the necessity for developers to strive towards a flexible means of interacting with data in a manner that's separated from presentation, modular, secure and scalable.   The book then introduces CSLA - the author's answer to this need in the form of a free .NET library.  After finishing the book and completing two projects that follow the CSLA methodology, I'm very pleased with the results and plan to continue using this framework in the future.  &lt;br /&gt;&lt;br /&gt;With CSLA, developers are encouraged to design responsibility-driven business objects that receive much of their core functionality by inheriting from the framework.  This way all the plumbing for authorization, validation, n-tier scalability and n-level undo is already baked in.  Additionally, care was taken to made sure that objects adhering to CSLA ideals are still first class citizens when data binding to WinForms and WebForms.&lt;br /&gt;&lt;br /&gt;Throughout the book Rocky takes time to explain his choices regarding the code and design patterns that went into developing CSLA.  It gave me an appreciation for the elegance and flexibility of his solution and prepared me for the later half of his book detailing usage of the framework in a sample project.&lt;br /&gt;&lt;br /&gt;Using CSLA in my own projects has forced me to look beyond the practice of mapping objects 1-1 against a database schema (eg. the ADO.NET DataSet).  Instead, it has led me to write my data-related objects based on the needs of my application, not the structure of my database.  This subtle shift in mindset has greatly helped me to plan my projects more effectively and has generally resulted in more organized code.&lt;br /&gt;&lt;br /&gt;The latest version of CSLA along with news regarding Rocky's books can be found &lt;a href="http://www.lhotka.net/" target="_blank"&gt;here&lt;/a&gt;.  Be sure to check it out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-3987853270516879701?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=RzIzWHk5"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=sRujkuzt"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=sRujkuzt" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=drj8nyvI"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=drj8nyvI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/eSqr2Qne1Ro" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/eSqr2Qne1Ro/csla-for-net.html</link><author>noreply@blogger.com (Mark)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_UP67jTvyQ3Y/RcWg_dgGj-I/AAAAAAAAAAM/s5n9Npo9LhM/s72-c/cs2005.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2007/01/csla-for-net.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-116461237303402385</guid><pubDate>Wed, 29 Nov 2006 06:34:00 +0000</pubDate><atom:updated>2006-11-28T22:41:06.706-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET Framework</category><title>Tips For Exam 70-536</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xISCf1rx_Y4uPKLVGK8WRJ0srv8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xISCf1rx_Y4uPKLVGK8WRJ0srv8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xISCf1rx_Y4uPKLVGK8WRJ0srv8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xISCf1rx_Y4uPKLVGK8WRJ0srv8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;I'm happy to report that I recently passed &lt;a href="http://www.microsoft.com/learning/exams/70-536.asp" target="_blank"&gt;Exam 70-536: .NET Framework 2.0 - Application Development Foundation&lt;/a&gt;.  This test is one of the  requirements necessary to obtain Microsoft's new MCTS certification.  And since the MCTS certification is a &lt;a href="http://www.microsoft.com/learning/mcp/newgen/default.mspx" target="_blank"&gt;pillar&lt;/a&gt; in the new accreditation structure, its relevance to the professional developer cannot be ignored.&lt;br /&gt;&lt;br /&gt;Here are a few suggestions I'll toss out to anyone interested in preparing for this exam:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Purchase a good certification study guide.&lt;/span&gt;  I used the one by Microsoft Press (&lt;a href="http://www.amazon.com/MCTS-Self-Paced-Training-Exam-70-536/dp/0735622779/sr=8-1/qid=1164614029/ref=pd_bbs_sr_1_s9_rk/102-4582235-1204922?ie=UTF8&amp;s=books&amp;amp;s9r=8a10f4b70de4726c010dfb5679810081" target="_blank"&gt;click here&lt;/a&gt; for details) mainly because it was the only one available at the time I needed it.  The book wasn't terribly noteworthy (and it even contained some minor errors) but at the end of the day it served its purpose as a prompt to direct my personal study times.  By next year new study guides with even better authors (such as Amit Kalani) should be hitting the shelves.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Take notes on topics as you learn.   &lt;/span&gt;I found it valuable to jot down notes as I studied the API's in the framework.  These notes were also a helpful review during the last few days leading up to the exam.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Become good friends with &lt;a href="http://msdn2.microsoft.com/en-us/default.aspx" target="_blank"&gt;MSDN&lt;/a&gt;.  &lt;/span&gt;Though a study guide is good, it will only get you so far.  The scope of this exam is very large and MSDN provides many helpful supplements to fill in the gaps.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-116461237303402385?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=KRLZRTwL"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=ecwBmab1"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=ecwBmab1" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=OOdCG73w"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=OOdCG73w" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/MPfnb_6uuMw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/MPfnb_6uuMw/tips-for-exam-70-536.html</link><author>noreply@blogger.com (Mark)</author><thr:total>2</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2006/11/tips-for-exam-70-536.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-116305188882452516</guid><pubDate>Thu, 09 Nov 2006 05:58:00 +0000</pubDate><atom:updated>2006-11-08T22:00:04.873-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET Framework</category><title>.NET Framework 3.0 Released!</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fV4nLgvn1i-d4FgOrBbeB5AVI3Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fV4nLgvn1i-d4FgOrBbeB5AVI3Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fV4nLgvn1i-d4FgOrBbeB5AVI3Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fV4nLgvn1i-d4FgOrBbeB5AVI3Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;The .NET Framework version 3.0 was released this week.  This iteration sees no change to the existing class library or the underlying CLR.  Instead, it simply adds some significant new APIs on top of the existing 2.0 framework.&lt;br /&gt;&lt;br /&gt;The new APIs are as follows: &lt;a href="http://wcf.netfx3.com/" target="_blank"&gt;Windows Communication Foundation&lt;/a&gt;, &lt;a href="http://wpf.netfx3.com/" target="_blank"&gt;Windows Presentation Foundation&lt;/a&gt;, &lt;a href="http://wf.netfx3.com/" target="_blank"&gt;Windows Workflow Foundation&lt;/a&gt; and &lt;a href="http://cardspace.netfx3.com/" target="_blank"&gt;Windows CardSpace&lt;/a&gt;.  &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=10CC340B-F857-4A14-83F5-25634C3BF043&amp;displaylang=en" target="_blank"&gt;Click here&lt;/a&gt; to download the redistributable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-116305188882452516?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=46GjkAxg"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=RO8eJ5NF"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=RO8eJ5NF" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=7FJakQV9"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=7FJakQV9" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/eH9egEoJv2M" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/eH9egEoJv2M/net-framework-30-released.html</link><author>noreply@blogger.com (Mark)</author><thr:total>0</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2006/11/net-framework-30-released.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-116071476442959753</guid><pubDate>Sat, 14 Oct 2006 02:40:00 +0000</pubDate><atom:updated>2006-11-11T22:45:07.786-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">Windows</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>Windows Vista as a Development Platform</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Py0Laf5xbwBn7ojVQxincb7w8RI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Py0Laf5xbwBn7ojVQxincb7w8RI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Py0Laf5xbwBn7ojVQxincb7w8RI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Py0Laf5xbwBn7ojVQxincb7w8RI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img style="float:left; margin:0 10px 10px 0;" src="http://photos1.blogger.com/blogger/548/1654/400/vista_logo.0.gif" border="0" alt="" /&gt;As Windows Vista RC2 hit last week I've come across several mildly disturbing articles regarding the integrity of Vista as a development platform.  First off was the announcement of SP1 Beta for Visual Studio 2005 on &lt;a href="http://blogs.msdn.com/somasegar/archive/2006/09/26/772250.aspx" target="_blank"&gt;Somasegar's blog&lt;/a&gt;.  Sounds like good news, right?  Well, further down he also reveals that Vista will not support Visual Studio 2002 or Visual Studio 2003.  In addition, he admits that Visual Studio 2005 will most likely suffer from compatibility issues beyond those addressed in SP1.  In my mind this doesn't communicate strong support for what is supposed to be Microsoft's flagship development platform.  I imagine this issue could easily stop most developers from trying Vista anytime soon due to the fact that they still need to continue supporting older applications via older versions of Visual Studio.&lt;br /&gt;&lt;br /&gt;There have also been rumors going &lt;a href="http://www.microsoft-watch.com/article2/0,2180,2022483,00.asp" target="_blank"&gt;back&lt;/a&gt; and &lt;a href="http://weblogs.java.net/blog/chet/archive/2006/10/java_on_vista_y.html" target="_target"&gt;forth&lt;/a&gt; debating Java's ability to keep up with the new "Aero" look and feel in Vista.  Thankfully, it appears as if this will only be an issue for older versions of Java.&lt;br /&gt;&lt;br /&gt;On a positive note, IIS 7 in Vista will finally elevate PHP to a first class citizen.  The newest version of Microsoft's webserver is on target to introduce a FastCGI host.  Such a change will honor the single-process-per-request execution model of PHP, but do so much more efficiently than traditional CGI.  For more information check out this &lt;a href="http://mvolo.com/2006/09/29/making-php-rock-on-windowsiis.aspx" target="_blank"&gt;blog entry&lt;/a&gt; by Mike Volodarsky (member of the IIS team).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-116071476442959753?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=bRDNKtWc"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=6gNSQSLI"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=6gNSQSLI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=ebBqO8MT"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=ebBqO8MT" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/4_qWAEeaEEI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/4_qWAEeaEEI/windows-vista-as-development-platform.html</link><author>noreply@blogger.com (Mark)</author><thr:total>2</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2006/10/windows-vista-as-development-platform.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-115903319486336779</guid><pubDate>Sat, 23 Sep 2006 16:16:00 +0000</pubDate><atom:updated>2011-02-26T20:36:13.758-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><title>The C# Coalesce Operator</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/b3AD1_O18hCjnqX6jOsJbByJeE8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/b3AD1_O18hCjnqX6jOsJbByJeE8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/b3AD1_O18hCjnqX6jOsJbByJeE8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/b3AD1_O18hCjnqX6jOsJbByJeE8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;This week I was excited to learn about the coalesce operator, a feature new to C# in .NET 2.0.  Coded as a double question mark (??), it works by yielding the first non-null item from a group of two or more objects (as you might expect, this behavior is very much like the COALESCE function in MS SQL).  Using this operator can help produce more elegant code if, for example, you've got something like this:&lt;br /&gt;&lt;pre class="brush: csharp"&gt;if (object1 != null)&lt;br /&gt;{&lt;br /&gt;  return object1;&lt;br /&gt;}&lt;br /&gt;else if (object2 != null)&lt;br /&gt;{&lt;br /&gt;  return object2;&lt;br /&gt;}&lt;br /&gt;else if (object3 != null)&lt;br /&gt;{&lt;br /&gt;  return object3;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;  return null;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;With the coalesce operator the above code block can be refactored into the following:&lt;br /&gt;&lt;pre class="brush: csharp"&gt;return object1 ?? object2 ?? object3;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-115903319486336779?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=R28hGRam"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=JnRpTkGh"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=JnRpTkGh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=cj44YQ51"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=cj44YQ51" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/wpYuNeey7jY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/wpYuNeey7jY/c-coalesce-operator.html</link><author>noreply@blogger.com (Mark)</author><thr:total>7</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2006/09/c-coalesce-operator.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-115639239312846527</guid><pubDate>Thu, 24 Aug 2006 04:06:00 +0000</pubDate><atom:updated>2011-02-26T20:37:31.365-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><title>Using FontInfo in a Custom Server Control</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZPaiPjNUpzAMHrI7-XsgLRquNe0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZPaiPjNUpzAMHrI7-XsgLRquNe0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZPaiPjNUpzAMHrI7-XsgLRquNe0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZPaiPjNUpzAMHrI7-XsgLRquNe0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;In many circumstances it's appropriate to assign a FontInfo structure as part of a custom server control. This easily allow programmers to adjust the look at feel of certain areas of text but can be a little tricky to implement because FontInfo doesn't have a public constructor.  One way to accomplish this is to create a CSS Style object and use it's Font property to do the dirty work.  This technique would look something like this: &lt;br /&gt;&lt;pre class="brush: csharp"&gt;private Style _headerFontStyle;&lt;br /&gt;&lt;br /&gt;[Bindable(true),&lt;br /&gt;DesignerSerializationVisibility(DesignerSerializationVisibility.Content),&lt;br /&gt;NotifyParentProperty(true),&lt;br /&gt;Category("Appearance"),&lt;br /&gt;Description("The font for the header."),&lt;br /&gt;Localizable(true)]&lt;br /&gt;public FontInfo HeaderFont&lt;br /&gt;{&lt;br /&gt;  get&lt;br /&gt;  {&lt;br /&gt;    if (_headerFontStyle == null)&lt;br /&gt;    {&lt;br /&gt;      _headerFontStyle = new Style();&lt;br /&gt;    }&lt;br /&gt;    return _headerFontStyle.Font;&lt;br /&gt;  }&lt;br /&gt;  set&lt;br /&gt;  {&lt;br /&gt;    _headerFontStyle.Font.CopyFrom(value);&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;So is that all there is to it?  Well, not exactly.  Unfortunately, FontInfo is not serializable, nor does it implement IStateManager making it difficult for us to track it's state if any changes are programmatically made to the structure.&lt;br /&gt;&lt;br /&gt;The good news is that in the code above we're using a Style object to get at the underlying FontInfo.  Since Style implements IStateManager we can override the following methods to make sure that the FontInfo property is always kept in ViewState across post backs.&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&lt;br /&gt;protected override object SaveViewState()&lt;br /&gt;{&lt;br /&gt;  object[] state = new object[2];&lt;br /&gt;  state[0] = base.SaveViewState();&lt;br /&gt;  state[1] = ((IStateManager)_headerFontStyle).SaveViewState();&lt;br /&gt;  return state;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected override void LoadViewState(object savedState)&lt;br /&gt;{&lt;br /&gt;  object[] state = (object[])savedState;&lt;br /&gt;  base.LoadViewState(state[0]);&lt;br /&gt;  ((IStateManager)_headerFontStyle).LoadViewState(state[1]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected override void TrackViewState()&lt;br /&gt;{&lt;br /&gt;  base.TrackViewState();&lt;br /&gt;  if (_headerFontStyle != null)&lt;br /&gt;  {&lt;br /&gt;    ((IStateManager)_headerFontStyle).TrackViewState();&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-115639239312846527?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=GJ1UFfJQ"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=U48lx73j"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=U48lx73j" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=0IYPtMSJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=0IYPtMSJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/XarnmtFe1O0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/XarnmtFe1O0/using-fontinfo-in-custom-server.html</link><author>noreply@blogger.com (Mark)</author><thr:total>0</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2006/08/using-fontinfo-in-custom-server.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17211474.post-115414301202359455</guid><pubDate>Sun, 30 Jul 2006 02:50:00 +0000</pubDate><atom:updated>2011-02-26T20:50:34.870-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><title>Approximating Master Pages in PHP</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BM6eKZyzT5sDS_3F6qjExFV49DA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BM6eKZyzT5sDS_3F6qjExFV49DA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BM6eKZyzT5sDS_3F6qjExFV49DA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BM6eKZyzT5sDS_3F6qjExFV49DA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Most sites on the Internet have common design elements that do not change from page to page.  Usually, only content or minor navigational cues vary.  To handle the unchanging aspects, developers have often relied on server-side includes - dividing regions like headers, side navigations and footers into separate files.&lt;br /&gt;&lt;br /&gt;But now with the advent of ASP.NET 2.0 Master Pages offer a more complete templating alternative.  With Master Pages an entire template common to the site is stored in one file with a .master extension.  Developers add a ContentPlaceHolder control inside a Master Page to indicate where they would like their page specific content to appear.  Then one or more Web Forms may be set up to automatically dress themselves with the shared visual components defined in the Master Page.&lt;br /&gt;&lt;br /&gt;So is it possible to make PHP emulate this behavior?  To some degree, yes, with &lt;a href="http://www.php.net/manual/en/ref.outcontrol.php" target="_blank"&gt;output buffering&lt;/a&gt; and one server-side include file that represents the "Master Page."  Lets say we are aiming to create our HTML by combining this template file and a content file (we'll call these master.php and index.php, respectfully).  Our simplified example will aim to achieve the following end result:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://photos1.blogger.com/blogger/548/1654/400/desiredresult.gif" border="0" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;The template that will act as our "Master Page" will need to contain all aspects of the design labeled "Template Specific."  Since no such control like the ContentPlaceHolder exists, we will use PHP variables to indicate where we would like our page specific content to appear.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;master.php&lt;/strong&gt;&lt;pre class="brush: html"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;&amp;lt;?php echo $pagetitle; ?&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body style=&amp;quot;margin-top:20px;margin-left:20px;margin-right:20px;&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;table width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot;border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;tr bgcolor=&amp;quot;#33FFFF&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;td colspan=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Template Specific Header&amp;lt;/h2&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr bgcolor=&amp;quot;#EEEEEE&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;td nowrap&amp;gt;&amp;lt;a href=#&amp;quot;&amp;gt;Navigation Link 1&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td nowrap&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Navigation Link 2&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td nowrap&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Navigation Link 3&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td nowrap&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Navigation Link 4&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td width=&amp;quot;100%&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;table width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td width=&amp;quot;30%&amp;quot; valign=&amp;quot;top&amp;quot; bgcolor=&amp;quot;#EEEEEE&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Template Specific &lt;br /&gt;Navigation&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 1&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 2&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 3&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td width=&amp;quot;70%&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt;&amp;lt;?php &lt;br /&gt;echo $pagemaincontent; &lt;br /&gt;?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;table width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot; border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; bgcolor=&amp;quot;#33FFFF&amp;quot;&amp;gt;Template Specific Footer&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;br /&gt;Now any pages that we would like to have adhere to the template only need to define the page specific variables and include our master.php file.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;index.php&lt;/strong&gt;&lt;pre class="brush: php"&gt;&amp;lt;?php&lt;br /&gt;  //Buffer larger content areas like the main page content&lt;br /&gt;  ob_start();&lt;br /&gt;?&amp;gt;&lt;br /&gt;&amp;lt;em&amp;gt;Page Specific Content Text&amp;lt;/em&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;  Lorem ipsum dolor sit amet, consectetuer adipiscing &lt;br /&gt;  elit, sed nonummy nibh euismod tincidunt ut laoreet &lt;br /&gt;  dolore magna aliat volutpat. Ut wisi enim ad minim &lt;br /&gt;  veniam, quis nostrud exercita ullamcorper &lt;br /&gt;  suscipit lobortis nisl ut aliquip ex consequat.&lt;br /&gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;  Duis autem vel eum iriure dolor in hendrerit in &lt;br /&gt;  vulputate velit molestie consequat, vel illum &lt;br /&gt;  dolore eu feugiat nulla facilisis ats eros et &lt;br /&gt;  accumsan et iusto odio dignissim qui blandit &lt;br /&gt;  prasent up zzril delenit augue duis dolore te &lt;br /&gt;  feugait nulla facilisi. Lorem euismod tincidunt &lt;br /&gt;  erat volutpat.&lt;br /&gt;&amp;lt;?php&lt;br /&gt;  //Assign all Page Specific variables&lt;br /&gt;  $pagemaincontent = ob_get_contents();&lt;br /&gt;  ob_end_clean();&lt;br /&gt;  $pagetitle = &amp;quot;Page Specific Title Text&amp;quot;;&lt;br /&gt;  //Apply the template&lt;br /&gt;  include(&amp;quot;master.php&amp;quot;);&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;br /&gt;Even though it's not perfectly aligned with ASP.NET's Master Page feature set, the technique described above allows us to consolidate what might otherwise be numerous server-side include files.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17211474-115414301202359455?l=spinningtheweb.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=33ZeQV18"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=WFNmiGz2"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=WFNmiGz2" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/SpinningTheWeb?a=5R5m0ZG2"&gt;&lt;img src="http://feeds.feedburner.com/~f/SpinningTheWeb?i=5R5m0ZG2" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SpinningTheWeb/~4/pMyMpsvvpA0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/SpinningTheWeb/~3/pMyMpsvvpA0/approximating-master-pages-in-php.html</link><author>noreply@blogger.com (Mark)</author><thr:total>37</thr:total><feedburner:origLink>http://spinningtheweb.blogspot.com/2006/07/approximating-master-pages-in-php.html</feedburner:origLink></item></channel></rss>

