<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Codeshape</title>
	<atom:link href="http://codeshape.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://codeshape.wordpress.com</link>
	<description>Tim Ebenezer&#039;s Programming Blog</description>
	<lastBuildDate>Wed, 07 Dec 2011 11:43:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='codeshape.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Codeshape</title>
		<link>http://codeshape.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://codeshape.wordpress.com/osd.xml" title="Codeshape" />
	<atom:link rel='hub' href='http://codeshape.wordpress.com/?pushpress=hub'/>
		<item>
		<title>NullReferenceException when using a custom WorkflowTask derived content type</title>
		<link>http://codeshape.wordpress.com/2011/06/06/nullreferenceexception-when-using-a-custom-workflowtask-derived-content-type/</link>
		<comments>http://codeshape.wordpress.com/2011/06/06/nullreferenceexception-when-using-a-custom-workflowtask-derived-content-type/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 13:23:25 +0000</pubDate>
		<dc:creator>timebenezer</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[content type]]></category>
		<category><![CDATA[exceptions]]></category>
		<category><![CDATA[nullreferenceexception]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[workflowtask]]></category>

		<guid isPermaLink="false">http://codeshape.wordpress.com/?p=73</guid>
		<description><![CDATA[If you are encountering an &#8220;Unknown Error&#8221; or exception when calling Update() on a task item using a custom content type derived from WorkflowTask, of type NullReferenceException; then it&#8217;s worth checking that your ContentType definition includes the FieldRefs tag, even if it will be a self closing tag. I encountered this problem recently, and it [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=73&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>If you are encountering an &#8220;Unknown Error&#8221; or exception when calling Update() on a task item using a custom content type derived from WorkflowTask, of type NullReferenceException; then it&#8217;s worth checking that your ContentType definition includes the FieldRefs tag, even if it will be a self closing tag.</p>
<p>I encountered this problem recently, and it manifested itself when calling Update() on the list item from the custom Edit form.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeshape.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeshape.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeshape.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeshape.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeshape.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeshape.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeshape.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeshape.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeshape.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeshape.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeshape.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeshape.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeshape.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeshape.wordpress.com/73/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=73&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeshape.wordpress.com/2011/06/06/nullreferenceexception-when-using-a-custom-workflowtask-derived-content-type/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/539af8d2cd50f8ddbe69a50a390af1dc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">timebenezer</media:title>
		</media:content>
	</item>
		<item>
		<title>Creating a lazy loading UIImageView for iOS</title>
		<link>http://codeshape.wordpress.com/2011/05/10/creating-a-lazy-loading-uiimageview-for-ios/</link>
		<comments>http://codeshape.wordpress.com/2011/05/10/creating-a-lazy-loading-uiimageview-for-ios/#comments</comments>
		<pubDate>Tue, 10 May 2011 12:02:13 +0000</pubDate>
		<dc:creator>timebenezer</dc:creator>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[asynchronous]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[mutable]]></category>
		<category><![CDATA[nsdata]]></category>
		<category><![CDATA[nsmutabledata]]></category>
		<category><![CDATA[uiimageview]]></category>

		<guid isPermaLink="false">http://codeshape.wordpress.com/?p=68</guid>
		<description><![CDATA[The UIImageView in the iOS SDK is a great class that allows developers to quickly and easily handle the display of an image. The UIImageView is simple a container view with a single UIImage displayed within it. The nice part is that it handles all the display and sizing of the UIImage, so that developers [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=68&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The UIImageView in the iOS SDK is a great class that allows developers to quickly and easily handle the display of an image. The UIImageView is simple a container view with a single UIImage displayed within it. The nice part is that it handles all the display and sizing of the UIImage, so that developers don&#8217;t need to spend a long time playing around with ratios to get the sizing that they require.</p>
<p>We can initialise the UIImageView directly with an image, and this image supports using NSData to initialise it. It would seem we could simple get NSData from an NSURL, and bingo, we could load images easily from remote addresses. However, as you will find out &#8211; although this works, it essentially blocks the UI display thread until the image has loaded. This means that the display does not update until the image has been fetched from the web, and will present the user with what seems like an unusable pause.</p>
<p>To get round this we can implement lazy loading; where the request to retrieve the image is fired off asynchronously, and allows the UI display thread to continue till the image is received. Apple has an example in their dev knowledge base that allows you to do this directly on models. In this article we are going to look at doing this directly on a UIImageView. </p>
<p>In order to do this, we first create a header file for a class that inherits from UIImageView. We can call this UILazyImageView. It will, at first, look like the below:</p>
<p><pre class="brush: objc;">
#import &lt;Foundation/Foundation.h&gt;


@interface UILazyImageView : UIImageView {
}

@end
</pre></p>
<p>In order to implement the delegate for NSURLConnection, which we will use to do the asynchronous fetch of the image (as in last week&#8217;s post <a href="http://codeshape.wordpress.com/2011/04/28/creating-an-asynchronous-xml-parser-for-ios-applications/">on creating an asynchronous XML parser for iOS applications</a>); we will need a NSMutableData variable to store the data retrieved from the URL. We use NSMutableData rather than NSData, because we can append to it since it is a <a href="http://mail.python.org/pipermail/tutor/2000-August/001976.html">mutable data type</a>.</p>
<p>We will also need a new initialisation method, to initialise with a URL; and this will call off to a method to load from a URL.</p>
<p>Having input these the header file will now look like this:</p>
<p><pre class="brush: objc;">
#import &lt;Foundation/Foundation.h&gt;


@interface UILazyImageView : UIImageView {
    NSMutableData *receivedData;    
}

- (id)initWithURL:(NSURL *)url;
- (void)loadWithURL:(NSURL *)url;

@end
</pre></p>
<p>Next, in our code (.m) file for UILazyImageView we can add the init method, which calls the load method, as follows:</p>
<p><pre class="brush: objc;">
- (id)initWithURL:(NSURL *)url
{
    self = [self init];
    
    if (self)
    {
	    receivedData = [[NSMutableData alloc] init];
        [self loadWithURL:url];
    }

    return self;
}
</pre></p>
<p>Next, we need to implement the loadWithURL method. This needs to fire of an asynchronous connection; the work of dealing with the image will only happen once the connection has completed.</p>
<p>This will look like:</p>
<p><pre class="brush: objc;">
- (void)loadWithURL:(NSURL *)url    
{
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:url]delegate:self];
    [connection start];
}
</pre></p>
<p>We now need to implement the delegate for the connection (which has been set to the UILazyImageView. For this we need to at least implement didReceiveResponse, didReceiveData and connectionDidFinishLoading.</p>
<p>We will implement didReceiveResponse to clear the data (as this may be called when 302 redirects occur); and didReceiveData to append to the receivedData item.</p>
<p>Finally in connectionDidFinishLoading we can display the image, from the receivedData.</p>
<p>This will look like:</p>
<p><pre class="brush: objc;">
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [receivedData setLength:0];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [receivedData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    self.image = [[UIImage alloc] initWithData:receivedData];
}
</pre></p>
<p>If we run this, we will notice it works as planned, but the image seems to appear very suddenly. We can make this a more gentle introduction, by setting the alpha to 0 before the connection begins, and then animating it to 1 (effectively creating a fade in effect).</p>
<p>We would do this with code like:</p>
<p><pre class="brush: objc;">
- (void)loadWithURL:(NSURL *)url    
{
	self.alpha = 0;
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:url]delegate:self];
    [connection start];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    self.image = [[UIImage alloc] initWithData:receivedData];
    [UIView beginAnimations:@&quot;fadeIn&quot; context:NULL];
    [UIView setAnimationDuration:0.5];
    self.alpha = 1.0;
    [UIView commitAnimations];
}
</pre></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeshape.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeshape.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeshape.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeshape.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeshape.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeshape.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeshape.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeshape.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeshape.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeshape.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeshape.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeshape.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeshape.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeshape.wordpress.com/68/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=68&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeshape.wordpress.com/2011/05/10/creating-a-lazy-loading-uiimageview-for-ios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/539af8d2cd50f8ddbe69a50a390af1dc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">timebenezer</media:title>
		</media:content>
	</item>
		<item>
		<title>Creating an asynchronous XML parser for iOS applications</title>
		<link>http://codeshape.wordpress.com/2011/04/28/creating-an-asynchronous-xml-parser-for-ios-applications/</link>
		<comments>http://codeshape.wordpress.com/2011/04/28/creating-an-asynchronous-xml-parser-for-ios-applications/#comments</comments>
		<pubDate>Thu, 28 Apr 2011 10:15:31 +0000</pubDate>
		<dc:creator>timebenezer</dc:creator>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://codeshape.wordpress.com/?p=62</guid>
		<description><![CDATA[If you are anything like me, and are a developer who has been working primarily with the .NET platform for the last little while, you may have a bit of a culture shock when coming to iOS development. I have worked with Objective C in the past, but primarily for OS X, and although the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=62&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>If you are anything like me, and are a developer who has been working primarily with the .NET platform for the last little while, you may have a bit of a culture shock when coming to iOS development. I have worked with Objective C in the past, but primarily for OS X, and although the paradigms for programming are similar, the APIs available to iOS are slightly more limited. Subjectively, I have to say that Visual Studio is a far better IDE than Xcode &#8211; though Xcode has improved massively with version 4.</p>
<p>In this article I am going to explore how to write an XML parser that parses XML from a given URL asynchronously by implementing the NSXMLParserDelegate protocol and the NSURLConnectionProtocol, and using the NSXMLParser and NSURLConnection objects.</p>
<p>If you do not have a good grounding in Objective C, first please go and have a read of a few tutorials; if you have a decent grounding in an object oriented language, you should pick it up fairly quickly &#8211; though the memory management side of things may be confusing (and will probably be for a while!), unless you come from a non GC language background.</p>
<p>For the purpose of this exercise we are going to assume we are tackling a standard RSS XML feed (SlashDot RSS), that we want to represent as a collection of objects to be used in our application.</p>
<p>The first thing we need is an object that we will use for the representation of each item in the RSS.</p>
<p>We can create this as a new object, deriving from NSObject, with instance variables and @property&#8217;s for each of the RSS items.</p>
<p>The object&#8217;s header file would look something like:</p>
<p><pre class="brush: objc;">
@interface RSSItem : NSObject {
    NSString *title;
    NSString *description;
}

@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSString *description;

@end
</pre></p>
<p>And its simple implementation file would like something like:</p>
<p><pre class="brush: objc;">
#import &quot;RSSItem.h&quot;

@implementation RSSItem

@synthesize title, description;

- (void)dealloc
{
    [title release];
    [description release];
    
    [super dealloc];
}

@end
</pre></p>
<p>The above obviously only captures two of our RSS elements, but as a proof-of-concept will be fine, and can be extended to capture more elements.</p>
<p>Now that we have this defined, we can define our RSSParser. Our RSSParser can inherit directly from NSObject, but we will need to define it to comply to the NSXMLParserDelegate protocol, which allows us to set it to be the delegate object for an NSXMLParser object, so that it can deal with the elements therein.</p>
<p>Our header file for RSSParser would, therefore, look something like:</p>
<p><pre class="brush: objc;">
#import &quot;RSSItem.h&quot;

@interface RSSParser : NSObject &lt;NSXMLParserDelegate&gt; {
	//This variable will eventually (once the asynchronous event has completed) hold all the RSSItems in the feed
    NSMutableArray *allItems;
    
    //This variable will be used to map properties in the XML to properties in the RSSItem object
    NSMutableArray *propertyMap;
    
    //This variable will be used to build up the data coming back from NSURLConnection
    NSMutableData *receivedData;
    
    //This item will be declared and created each time a new RSS item is encountered in the XML
    RSSItem *currentItem;
    
    //This stores the value of the XML element that is currently being processed
    NSMutableString *currentValue;
    
    //This allows the creating object to know when parsing has completed
    BOOL parsing;
    
    //This internal variable allows the object to know if the current property is inside an item element
    BOOL inItemElement;
}

@property (nonatomic, readonly) NSMutableArray *allItems;
@property (nonatomic, retain) NSMutableArray *propertyMap;
@property (nonatomic, retain) NSData *receivedData;
@property (nonatomic, retain) RSSItem *currentItem;
@property (nonatomic, retain) NSMutableString *currentValue;
@property BOOL parsing;

//This method kicks off a parse of a URL at a specified string
- (void)startParse:(NSString*)url;

@end
</pre></p>
<p>You will notice we have NOT specified that this object complies to the NSURLConnectionProtocol. The reason for this is that NSObject informally complies to this protocol by default, so we can add the necessary methods we need, and set this object as the delegate for the NSURLConnection object too.</p>
<p>So, when we first kick off a parse using the startParse: method, we will need to create an NSURLConnection object, which will kick off the retrieval of the data from the specified URL. Once this data is all retrieved we can then actually parse the XML.</p>
<p>We can use code similar to the following to achieve this:</p>
<p><pre class="brush: objc;">
- (void)startParse:(NSString *)url
{
    //Set the status to parsing
    parsing = true;

	//Initialise the receivedData object
    receivedData = [[NSMutableData alloc] init];
    
    //Create the connection with the string URL and kick it off
    NSURLConnection *urlConnection = [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]] delegate:self];
    [urlConnection start];
}
</pre></p>
<p>As can be seen in our creation of the connection object, we have set the delegate to be the current object.</p>
<p>We can then define the methods we need to add the necessary data from the request as it comes back; and once it has all finished, to start the XML parser.</p>
<p><pre class="brush: objc;">
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
	//Reset the data as this could be fired if a redirect or other response occurs
    [receivedData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
	//Append the received data each time this is called
    [receivedData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
	//Start the XML parser with the delegate pointing at the current object
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:receivedData];
    [parser setDelegate:self];
    [parser parse];
    
    parsing = false;
}
</pre></p>
<p>As can be seen, the implementation of this is very simple. In addition we should implement the method</p>
<p><pre class="brush: objc;">
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
</pre></p>
<p>to handle the failure of the connection request.</p>
<p>Finally, once we have done this we can define the methods for the NSXMLParserDelegate protocol, so that the item is built and added to allItems correctly.</p>
<p>We can do this with code similar to the following:</p>
<p><pre class="brush: objc;">
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
	//Create the property map that will be used to check and populate from elements
    propertyMap = [[NSMutableArray alloc] initWithObjects:@&quot;title&quot;, @&quot;description&quot;, nil];
    //Clear allItems each time we kick off a new parse
    [allItems removeAllObjects];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
	//If we find an item element, then ensure that the object knows we are inside it, and that the new item is allocated
    if ([elementName isEqualToString:@&quot;item&quot;])
    {
        currentItem = [[RSSItem alloc] init];
        inItemElement = true;
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
	//When we reach the end of an item element, we should add the RSSItem to the allItems array
    if ([elementName isEqualToString:@&quot;item&quot;])
    {
        [allItems addObject:currentItem];
        [currentItem release];
        currentItem = nil;
        inItemElement = false;
    }
    //If we are in element and we reach the end of an element in the propertyMap, we can trim its value and set it using the setValue method on RSSItem
    if (inItemElement)
    {
        if ([propertyMap containsObject:elementName])
        {
            [currentItem setValue:[currentValue stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] forKey:elementName];
        }
    }
    
    //If we've reached the end of an element then we should the scrap the value regardless of whether we've used it
    [currentValue release];
    currentValue = nil;
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
	//When we find characters inside an element, we can add it to the current value, which is created if it is not initialized at present
    if (!currentValue)
    {
        currentValue = [[NSMutableString alloc] init];
    }
    [currentValue appendString:string];
}
</pre></p>
<p>As can be seen again, this implementation is very simple, but requires a slight degree of lateral thinking, compared to using a DOM based parser, as most programmers from a .NET background would be familiar with.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeshape.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeshape.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeshape.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeshape.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeshape.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeshape.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeshape.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeshape.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeshape.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeshape.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeshape.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeshape.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeshape.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeshape.wordpress.com/62/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=62&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeshape.wordpress.com/2011/04/28/creating-an-asynchronous-xml-parser-for-ios-applications/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/539af8d2cd50f8ddbe69a50a390af1dc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">timebenezer</media:title>
		</media:content>
	</item>
		<item>
		<title>Access Denied error for pages with SummaryLinkWebPart</title>
		<link>http://codeshape.wordpress.com/2011/04/14/access-denied-error-for-pages-with-summarylinkwebpart/</link>
		<comments>http://codeshape.wordpress.com/2011/04/14/access-denied-error-for-pages-with-summarylinkwebpart/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 09:59:38 +0000</pubDate>
		<dc:creator>timebenezer</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[accessdenied]]></category>
		<category><![CDATA[moss2007]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[summarylinkwebpart]]></category>

		<guid isPermaLink="false">http://codeshape.wordpress.com/?p=60</guid>
		<description><![CDATA[If you are getting an Access Denied error for pages with a (potentially empty) Summary Link Web Part on it, on WSS 3 or MOSS2007, do check that the permissions on the Style Library for the current site collection allow read access for the group that the user, getting the error, is in. You may [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=60&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>If you are getting an Access Denied error for pages with a (potentially empty) Summary Link Web Part on it, on WSS 3 or MOSS2007, do check that the permissions on the Style Library for the current site collection allow read access for the group that the user, getting the error, is in.</p>
<p>You may see List guids appended to the end of the Access Denied page URL, but these MAY NOT be directly at fault, and it&#8217;s worth a quick check to ensure that the Style Library has the correct permissions, as the XSL Style Sheets for the Summary Link Web Part are used directly from this web part.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeshape.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeshape.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeshape.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeshape.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeshape.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeshape.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeshape.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeshape.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeshape.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeshape.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeshape.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeshape.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeshape.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeshape.wordpress.com/60/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=60&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeshape.wordpress.com/2011/04/14/access-denied-error-for-pages-with-summarylinkwebpart/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/539af8d2cd50f8ddbe69a50a390af1dc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">timebenezer</media:title>
		</media:content>
	</item>
		<item>
		<title>OSX Cisco VPN Client: Error 39: Unable to import certificate</title>
		<link>http://codeshape.wordpress.com/2011/04/08/osx-cisco-vpn-client-error-39-unable-to-import-certificate/</link>
		<comments>http://codeshape.wordpress.com/2011/04/08/osx-cisco-vpn-client-error-39-unable-to-import-certificate/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 08:37:21 +0000</pubDate>
		<dc:creator>timebenezer</dc:creator>
				<category><![CDATA[General Technology]]></category>
		<category><![CDATA[certificates]]></category>
		<category><![CDATA[cisco]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[vpn]]></category>

		<guid isPermaLink="false">http://codeshape.wordpress.com/?p=54</guid>
		<description><![CDATA[If you&#8217;re having problems with the Cisco VPN client on Mac rejecting certificates, and giving the unhelpful error: Error 39: Unable to import certificate Check that you have the correct password for the certificate. Be assure that the Mac client can read pfx files, and this does not require you to import the certificate into [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=54&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re having problems with the Cisco VPN client on Mac rejecting certificates, and giving the unhelpful error:<br />
<code><br />
Error 39: Unable to import certificate<br />
</code></p>
<p>Check that you have the correct password for the certificate. Be assure that the Mac client <strong>can</strong> read pfx files, and this does not require you to import the certificate into Keychain Access and export as a p12 file &#8211; as reported elsewhere.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeshape.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeshape.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeshape.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeshape.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeshape.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeshape.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeshape.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeshape.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeshape.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeshape.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeshape.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeshape.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeshape.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeshape.wordpress.com/54/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=54&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeshape.wordpress.com/2011/04/08/osx-cisco-vpn-client-error-39-unable-to-import-certificate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/539af8d2cd50f8ddbe69a50a390af1dc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">timebenezer</media:title>
		</media:content>
	</item>
		<item>
		<title>Inbox Zero with Google Mail</title>
		<link>http://codeshape.wordpress.com/2011/02/08/inbox-zero-with-google-mail/</link>
		<comments>http://codeshape.wordpress.com/2011/02/08/inbox-zero-with-google-mail/#comments</comments>
		<pubDate>Tue, 08 Feb 2011 12:32:26 +0000</pubDate>
		<dc:creator>timebenezer</dc:creator>
				<category><![CDATA[General Technology]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[inboxzero]]></category>
		<category><![CDATA[lifeskills]]></category>
		<category><![CDATA[organising]]></category>

		<guid isPermaLink="false">http://codeshape.wordpress.com/?p=51</guid>
		<description><![CDATA[I&#8217;ve started using the inbox zero techniques recently, and have seen my productivity increase massively due to it. If you don&#8217;t know what inbox zero is &#8211; you should read the articles at 43 folders first. Google Mail gives us some additional tools that can really help over and above what the 43 folders articles [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=51&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve started using the inbox zero techniques recently, and have seen my productivity increase massively due to it.</p>
<p>If you don&#8217;t know what inbox zero is &#8211; you should read the articles at <a href="http://www.43folders.com/43-folders-series-inbox-zero">43 folders</a> first.</p>
<p>Google Mail gives us some additional tools that can really help over and above what the 43 folders articles offer. In this article I&#8217;m going to briefly outline some of the tools you can use with Google Mail to improve your productivity around email.</p>
<p>Much of what is referenced below uses the google lab features. If you are not familiar with them, look for the green conical jar icon in between your email address and the Settings menu in the top right of your Google Mail screen.</p>
<p>Using inbox zero, I went from 21,000 emails in my inbox to just actionable email (currently 5).</p>
<p>1. Filters and Labels</p>
<p>Create filters! Lots of them! Make this an active, on going process. The Gmail filters are very powerful, and so I&#8217;d recommend using these to clear your inbox. I don&#8217;t quite agree with the 43 folders motto of &#8220;Delete, delete, delete&#8221;. Instead, with Gmail, archive, archive, archive is the way forward. Make certain email types auto archive (for me this is Twitter, Facebook, LinkedIn etc.); and also make sure you label all emails that come in &#8211; this not only increases the findability of information in the future, but also ensures that you can deal with only the emails you want to at any moment. Archived emails are not visible to you, but you can use the powerful search functionality of Gmail to find old information at any time.</p>
<p>2. Nested Labels</p>
<p>There is a great lab feature available to enable nested labels. Nested labels allow you to create &#8220;folders&#8221; of labels; and this is great for being able to manage large numbers of labels (I have 60 labels, seperated into 3 main categories, some of which have sub categories).</p>
<p>3. Hide Read Labels</p>
<p>Another lab feature that is incredible is the &#8220;Hide Read Labels&#8221; lab. This hides any label which does not have any unread messages in it. Pairing this with auto archive, means that you can quickly come back to unread (though unimportant) messages at any time.</p>
<p>4. Send and Archive</p>
<p>Send and archive is a lab feature that allows you to archive a thread as soon as you send the response. Enable this to ensure that your inbox remains clean.</p>
<p>5. Tasks</p>
<p>Enable Google Tasks lab feature if you haven&#8217;t already, and then use the More Actions menu to create tasks from emails where you have actions within an email. You can then archive the email, and use the Google Tasks feature to manage your to do list. In addition, if you add a deadline to the task, this will appear in your Google Calendar.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeshape.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeshape.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeshape.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeshape.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeshape.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeshape.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeshape.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeshape.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeshape.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeshape.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeshape.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeshape.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeshape.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeshape.wordpress.com/51/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=51&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeshape.wordpress.com/2011/02/08/inbox-zero-with-google-mail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/539af8d2cd50f8ddbe69a50a390af1dc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">timebenezer</media:title>
		</media:content>
	</item>
		<item>
		<title>Capacity planning for FAST Search Server 2010 for SharePoint</title>
		<link>http://codeshape.wordpress.com/2011/01/12/capacity-planning-for-fast-search-server-2010-for-sharepoint/</link>
		<comments>http://codeshape.wordpress.com/2011/01/12/capacity-planning-for-fast-search-server-2010-for-sharepoint/#comments</comments>
		<pubDate>Wed, 12 Jan 2011 09:17:14 +0000</pubDate>
		<dc:creator>timebenezer</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[fast search qps performance sizing crawl database]]></category>

		<guid isPermaLink="false">http://codeshape.wordpress.com/?p=48</guid>
		<description><![CDATA[Information on FAST Search Server 2010, though better than it has been, is still scarce. Particularly its application in large environments is largely undocumented, though there is evidence that, at least internally, it has been proved. FAST ESP of course is well proven on large corpus&#8217; of data and has been used in very large [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=48&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Information on FAST Search Server 2010, though better than it has been, is still scarce. Particularly its application in large environments is largely undocumented, though there is evidence that, at least internally, it has been proved. FAST ESP of course is well proven on large corpus&#8217; of data and has been used in very large enterprises.</p>
<p>When it came to my latest project, to architect the FAST search component of a system with a highly active userbase of 140,000, and a reasonably sized corpus of data (240 terabytes); with FAST Search Server 2010 for SharePoint chosen as the search server, I started to discover there were some holes, or at least some level of disjointing in the data presented by Microsoft.</p>
<p>The purpose of this article is to draw together some of this knowledge into a more coherent form to help future architects designing the topology and in particular ensuring that their design is performant and scalable.</p>
<p>This article assumes a reasonable knowledge of SharePoint and FAST search architecture.</p>
<p>FAST farms consist of two composite components:</p>
<ul>
<li>Service servers: one or more servers which holding one or more of the core roles. (<a href="http://technet.microsoft.com/en-us/library/ff599530.aspx">Technet article</a>)</li>
<li>Search cluster matrix: one or more servers in a row/column structure to handle the indexing and query matching components. See the above article for detailed information on the performance of these services.</li>
</ul>
<p>There are two primary drivers when considering the topology of our FAST farm. The size of the corpus, and the performance needed. In my case the performance I was aiming for was 350 queries per second (qps). The general rule of thumb with FAST is that you can reasonably expect 1qps performance for each 1ghz core available to the query matching component of FAST. This is assuming that you are using the search cluster model topology, and not a single server deployment.</p>
<p>Since we are looking for a performance of 350 qps, we can assume we need 350 cores at 1ghz, or 175 cores at 2 ghz. Since our target servers are running dual quad-core CPUs @ 2.93 ghz, we essentially have the ability to run 23.44 qps per query matching server ((1 x) 2.93 x 8). Dividing 350 through by 23.44 we round up to get 15. So we need 15 of our servers running the query matching service to achieve 350 qps throughput.</p>
<p>Once we know we need 15 query matching servers (ie. servers in the search row component of the clusters) we need to ensure this is arranged correctly in the server matrix to ensure that we can handle the corpus of data we need. In my case, we have a 30 million item corpus, however; allowing for reasonably growth, I am allowing for 60 million items. Since we can have a performant maximum of 15 million items per index column this means we are looking at 4 index columns.</p>
<p>The query matching servers MUST be distributed evenly between the index columns, so the closest we can get to 15 query matching servers is having 4 index columns with 4 query matching servers in each; a total of 16 query matching servers.</p>
<p>Each index column should also have at least one server running the indexer service. An additional index server can be used, but is present purely for failover.</p>
<p>On the storage sizing side of things, we have two types of storage needed:</p>
<ul>
<li>Local directly attached storage on the indexer boxes. This is used for the storage of the indices; and is stored in a flat file format. A good rule of thumb is to allow approximately 20% of the total corpus size for the indices.</li>
<li>SQL Database storage for the Crawl Databases. These are used by the Content SSA in SharePoint to store metadata on the corpus crawled. A general rule of thumb is to use 5% of the total corpus size (in my case 240 terabytes, so a crawl DB allowance of 12 terabytes.) These can be scaled out across multiple crawl databases, and the best advice would be to host these on a separate box to the SharePoint database as they will be extremely intense on disk I/O; especially with a large, fast changing corpus.</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeshape.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeshape.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeshape.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeshape.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeshape.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeshape.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeshape.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeshape.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeshape.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeshape.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeshape.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeshape.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeshape.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeshape.wordpress.com/48/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=48&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeshape.wordpress.com/2011/01/12/capacity-planning-for-fast-search-server-2010-for-sharepoint/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/539af8d2cd50f8ddbe69a50a390af1dc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">timebenezer</media:title>
		</media:content>
	</item>
		<item>
		<title>Provisioning additional view fields when provisioning lookup fields in code</title>
		<link>http://codeshape.wordpress.com/2010/11/05/provisioning-additional-view-fields-when-provisioning-lookup-fields-in-code/</link>
		<comments>http://codeshape.wordpress.com/2010/11/05/provisioning-additional-view-fields-when-provisioning-lookup-fields-in-code/#comments</comments>
		<pubDate>Fri, 05 Nov 2010 12:14:15 +0000</pubDate>
		<dc:creator>timebenezer</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[adddependentlookup]]></category>
		<category><![CDATA[lookup]]></category>
		<category><![CDATA[primary]]></category>
		<category><![CDATA[provisioning fields]]></category>
		<category><![CDATA[secondary]]></category>

		<guid isPermaLink="false">http://codeshape.wordpress.com/?p=42</guid>
		<description><![CDATA[When provisioning a lookup field through the UI in SharePoint 2010, there is the useful option of adding additional fields to be displayed in the view of the list. This lets us see not only the title field, as was available in 2007, but allows virtual denormalisation of data. When provisioning lookup fields in code, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=42&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>When provisioning a lookup field through the UI in SharePoint 2010, there is the useful option of adding additional fields to be displayed in the view of the list. This lets us see not only the title field, as was available in 2007, but allows virtual denormalisation of data.</p>
<p>When provisioning lookup fields in code, however, there don&#8217;t appear, at first, to be any additional properties to allow us to set these additional view fields.</p>
<p>However, when we are provisioning the fields to a field collection (using the AddLookup method), there is an additional method that allows us to provision these additional view fields. The AddDependentLookup method adds this field, and can be used on any SPFieldCollection (to add the field either as a Site Column, or as a Field directly on a list).</p>
<p>We can, therefore, use code similar to the below to achieve this:</p>
<p><pre class="brush: csharp;">
	using (SPWeb web = SPContext.Current.Site.OpenWeb())
            {
                SPList lookupList = web.Lists[&quot;MyList&quot;];
                string primaryFieldName = web.Fields.AddLookup(&quot;MyCol&quot;, lookupList.ID, false);
                SPFieldLookup primaryField = web.Fields.GetFieldByInternalName(primaryFieldName) as SPFieldLookup;
                primaryField.LookupField = &quot;Title&quot;;
                primaryField.Update();
                string dependantFieldName = web.Fields.AddDependentLookup(&quot;MyCol:SubField&quot;, primaryField.Id);
                SPFieldLookup dependentField = web.Fields.GetFieldByInternalName(dependantFieldName) as SPFieldLookup;
                dependentField.LookupField = &quot;SubField&quot;;
                dependentField.Update();
                web.Update();
            }
</pre></p>
<p>We can achieve the same with CAML by setting the FieldRef attribute of the Field element on the dependent field, to the ID of the primary field, and setting the ShowField attribute to the name of the Field to show from the Lookup List. This will have to be combined with a method to set the List ID from the List Name. </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeshape.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeshape.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeshape.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeshape.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeshape.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeshape.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeshape.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeshape.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeshape.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeshape.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeshape.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeshape.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeshape.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeshape.wordpress.com/42/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=42&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeshape.wordpress.com/2010/11/05/provisioning-additional-view-fields-when-provisioning-lookup-fields-in-code/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/539af8d2cd50f8ddbe69a50a390af1dc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">timebenezer</media:title>
		</media:content>
	</item>
		<item>
		<title>Versioning attachments in a SharePoint list &#8211; an implementation</title>
		<link>http://codeshape.wordpress.com/2010/10/21/versioning-attachments-in-a-sharepoint-list-an-implementation/</link>
		<comments>http://codeshape.wordpress.com/2010/10/21/versioning-attachments-in-a-sharepoint-list-an-implementation/#comments</comments>
		<pubDate>Thu, 21 Oct 2010 14:24:38 +0000</pubDate>
		<dc:creator>timebenezer</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[attachments]]></category>
		<category><![CDATA[feature]]></category>
		<category><![CDATA[list]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[solution]]></category>
		<category><![CDATA[versioning]]></category>

		<guid isPermaLink="false">http://codeshape.wordpress.com/?p=39</guid>
		<description><![CDATA[Further to the post on the 14th of October, here is a complete implementation of versioning attachments in a SharePoint list as a Visual Studio 2010 project. Once the .wsp has been built and deployed, it can be activated at the web scope. Once this is done, on all lists an item called &#8220;List attachment [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=39&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Further to the post on the 14th of October, here is a complete implementation of versioning attachments in a SharePoint list as a Visual Studio 2010 project. </p>
<p>Once the .wsp has been built and deployed, it can be activated at the web scope. Once this is done, on all lists an item called &#8220;List attachment versioning&#8221; appears on the List Settings page. When accessed this allows the user to switch attachment versioning on or off. This in turn will create a hidden document library and hidden fields as necessary to support the attachment versioning.</p>
<p>Please do try it and let me know what you think.</p>
<p><a href="https://docs.google.com/leaf?id=0BxTsEIw3f8puNDkxNDA5MzMtZTIzYS00MzhiLWI3YjUtMjQwODI4ZTA5ZDJl&amp;sort=name&amp;layout=list&amp;num=50">Download the solution here</a>.</p>
<p>Update: 17/11/2011 &#8211; Error fixed where the solution only works on a root site.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeshape.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeshape.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeshape.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeshape.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeshape.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeshape.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeshape.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeshape.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeshape.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeshape.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeshape.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeshape.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeshape.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeshape.wordpress.com/39/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=39&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeshape.wordpress.com/2010/10/21/versioning-attachments-in-a-sharepoint-list-an-implementation/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/539af8d2cd50f8ddbe69a50a390af1dc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">timebenezer</media:title>
		</media:content>
	</item>
		<item>
		<title>Versioning attachments in a SharePoint list</title>
		<link>http://codeshape.wordpress.com/2010/10/14/versioning-attachments-in-a-sharepoint-list/</link>
		<comments>http://codeshape.wordpress.com/2010/10/14/versioning-attachments-in-a-sharepoint-list/#comments</comments>
		<pubDate>Thu, 14 Oct 2010 13:14:36 +0000</pubDate>
		<dc:creator>timebenezer</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[attachments]]></category>
		<category><![CDATA[feature]]></category>
		<category><![CDATA[receiver]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[versioning]]></category>

		<guid isPermaLink="false">http://codeshape.wordpress.com/?p=29</guid>
		<description><![CDATA[One drawback that SharePoint lists have is that attachments are not versioned along with other changes to a list item when list versioning is enabled. This means that certain circumstances are made more complex than they need to be in grouping multiple documents that are actually related to a list item, rather than classified by [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=29&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>One drawback that SharePoint lists have is that attachments are not versioned along with other changes to a list item when list versioning is enabled. This means that certain circumstances are made more complex than they need to be in grouping multiple documents that are actually related to a list item, rather than classified by the meta data within the list item.</p>
<p>In order to overcome this in SharePoint 2010 there are a few things we must do. We need to attach receivers to the ItemAdding, ItemUpdating, ItemAttachmentAdding and ItemAttachmentDeleting methods. These will be used to push the attachments to a document library. Since we will use a document library to store the files, we will need to provision a document library. Finally we will need a custom number field we can use to store the current version of the ListItem. We need to do this because there is no way from the properties object in a receiver method to discover whether we are involved in a rollback. Therefore we can use a custom number field which we increment in the ItemAdding and ItemUpdating methods to store which version we are at. When a rollback occurs this field would also be attempted to be rolled back. We can detect this in the ItemUpdating receiver and therefore pull back documents which were at this version.</p>
<p>So to start with we initially create a Site Column with a Type of &#8220;Number&#8221;, and include this in our Content Type and List Definition. In addition we can create a ListInstance from this content type and a ListInstance of a document library, where the documents will be persisted. We will also need a custom Site Column of Type &#8220;Text&#8221; to hold the version numbers the attachment is associated with. We declare this with our normal <code>Field</code> and <code>ListInstance</code> syntax, using <code>ContentTypeBinding</code> to bind our content types to the lists we have created.</p>
<p>Next we need to create the receiver, as defined above. We can do this with a class like the following:<br />
<pre class="brush: csharp;">
    /// &lt;summary&gt;
    /// Handles the redirection of attachments to a document library
    /// &lt;/summary&gt;
    public class RedirectAttachmentsItemEventReceiver : SPItemEventReceiver
    {
        /// &lt;summary&gt;
        /// Local HTTP Context cache
        /// &lt;/summary&gt;
        private HttpContext context;

        private string targetDocumentLibrary;
        private string targetLookupField;

        /// &lt;summary&gt;
        /// HTTP Context is available in creation
        /// &lt;/summary&gt;
        public RedirectAttachmentsItemEventReceiver()
            : base()
        {
            context = HttpContext.Current;
        }

        /// &lt;summary&gt;
        /// Parses the receiver data string into private variables
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;receiverData&quot;&gt;&lt;/param&gt;
        private void ParseReceiverData(string receiverData)
        {
            this.targetDocumentLibrary = receiverData.Split(';')[0];
            this.targetLookupField = receiverData.Split(';')[1];
        }

        /// &lt;summary&gt;
        /// Handles the adding of an attachment to the list
        /// Adds it into the document library
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;properties&quot;&gt;&lt;/param&gt;
        public override void ItemAttachmentAdding(SPItemEventProperties properties)
        {
            base.ItemAttachmentAdding(properties);
            int attachmentNumber = 0;
            if (int.TryParse(SPContext.GetContext(context).Web.Properties[&quot;attachmentNumber&quot;], out attachmentNumber))
            {
                attachmentNumber++;
                SPContext.GetContext(context).Web.Properties[&quot;attachmentNumber&quot;] = attachmentNumber.ToString();
                ParseReceiverData(properties.ReceiverData);
                string fileName = properties.AfterUrl.Split('/')[4];
                //Put the item into the document library
                using (SPWeb web = properties.OpenWeb())
                {
                    SPList documentLibrary = web.Lists[targetDocumentLibrary];
                    SPFolder targetFolder;
                    try
                    {
                        targetFolder = documentLibrary.RootFolder.SubFolders[properties.ListItemId.ToString()];
                    }
                    catch
                    {
                        targetFolder = documentLibrary.RootFolder.SubFolders.Add(properties.ListItemId.ToString());
                    }
                    SPFile document;
                    try
                    {
                        document = targetFolder.Files[fileName];
                    }
                    catch (ArgumentException)
                    {
                        document = targetFolder.Files.Add(fileName, context.Request.Files[attachmentNumber - 1].InputStream);
                    }
                    if (document.Item[&quot;VersionLabel&quot;] != null)
                        document.Item[&quot;VersionLabel&quot;] = document.Item[&quot;VersionLabel&quot;].ToString() + &quot;;&quot; + properties.ListItem.Versions[0].VersionLabel + &quot;;&quot;;
                    else
                        document.Item[&quot;VersionLabel&quot;] = &quot;;&quot; + properties.ListItem.Versions[0].VersionLabel + &quot;;&quot;;
                    document.Item[targetLookupField] = new SPFieldLookupValue(properties.ListItem.ID, properties.ListItem.Title);
                    document.Item.Update();
                }
            }
        }

        /// &lt;summary&gt;
        /// Handles the deleting of an attachment from the list
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;properties&quot;&gt;&lt;/param&gt;
        public override void ItemAttachmentDeleting(SPItemEventProperties properties)
        {
            base.ItemAttachmentDeleting(properties);
            ParseReceiverData(properties.ReceiverData);
            int nextVersion = (int)float.Parse(properties.ListItem[&quot;CustomVersion&quot;].ToString()) + 1;
            string fileName = properties.BeforeUrl.Split('/')[4];
            //Put the item into the document library
            using (SPWeb web = properties.OpenWeb())
            {
                SPList documentLibrary = web.Lists[targetDocumentLibrary];
                SPFolder targetFolder;
                try
                {
                    targetFolder = documentLibrary.RootFolder.SubFolders[properties.ListItemId.ToString()];
                }
                catch
                {
                    targetFolder = documentLibrary.RootFolder.SubFolders.Add(properties.ListItemId.ToString());
                }
                SPFile document = targetFolder.Files[fileName];
                if (document.Item[&quot;VersionLabel&quot;] != null)
                    document.Item[&quot;VersionLabel&quot;] = document.Item[&quot;VersionLabel&quot;].ToString().Replace(&quot;;&quot; + nextVersion.ToString() + &quot;.0;&quot;, &quot;&quot;);
                document.Item.Update();
            }
        }

        /// &lt;summary&gt;
        /// Set the custom version property
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;properties&quot;&gt;&lt;/param&gt;
        public override void ItemAdding(SPItemEventProperties properties)
        {
            base.ItemAdding(properties);
            ParseReceiverData(properties.ReceiverData);
            properties.AfterProperties[&quot;CustomVersion&quot;] = 1;
            SPContext.GetContext(context).Web.Properties[&quot;attachmentNumber&quot;] = &quot;0&quot;;
        }

        /// &lt;summary&gt;
        /// Update the custom version property
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;properties&quot;&gt;&lt;/param&gt;
        public override void ItemUpdating(SPItemEventProperties properties)
        {
            base.ItemUpdating(properties);
            SPContext.GetContext(context).Web.Properties[&quot;attachmentNumber&quot;] = &quot;0&quot;;
            ParseReceiverData(properties.ReceiverData);
            int currentVersion = (int)float.Parse(properties.ListItem[&quot;CustomVersion&quot;].ToString());
            int newVersion;
            if (properties.AfterProperties[&quot;CustomVersion&quot;] == null)
                newVersion = currentVersion;
            else
                newVersion = (int)float.Parse(properties.AfterProperties[&quot;CustomVersion&quot;].ToString());
            int nextVersion = currentVersion + 1;
            using (SPWeb web = properties.OpenWeb())
            {
                SPList documentLibrary = web.Lists[targetDocumentLibrary];
                SPFolder targetFolder;
                try
                {
                    targetFolder = documentLibrary.RootFolder.SubFolders[properties.ListItemId.ToString()];
                }
                catch
                {
                    targetFolder = documentLibrary.RootFolder.SubFolders.Add(properties.ListItemId.ToString());
                }
                if (currentVersion &gt; newVersion)
                {
                    EventFiringEnabled = false;
                    //Clear the list items attachments
                    List&lt;string&gt; attachmentsToDelete = new List&lt;string&gt;();
                    foreach (string attachmentName in properties.ListItem.Attachments)
                    {
                        attachmentsToDelete.Add(attachmentName);
                    }
                    foreach (string attachmentName in attachmentsToDelete)
                    {
                        properties.ListItem.Attachments.Delete(attachmentName);
                    }
                    //Pull attachments for this version
                    SPQuery query = new SPQuery();
                    query.ViewAttributes = &quot;Scope='Recursive'&quot;;
                    query.Query = String.Format(&quot;&lt;Where&gt;&lt;And&gt;&lt;Contains&gt;&lt;FieldRef Name='VersionLabel' /&gt;&lt;Value Type='Text'&gt;;{0}.0;&lt;/Value&gt;&lt;/Contains&gt;&lt;Eq&gt;&lt;FieldRef Name='{1}' /&gt;&lt;Value Type='Lookup'&gt;{2}&lt;/Value&gt;&lt;/Eq&gt;&lt;/And&gt;&lt;/Where&gt;&quot;, newVersion, targetLookupField, properties.ListItem.Title);
                    SPListItemCollection items = documentLibrary.GetItems(query);
                    foreach (SPListItem item in items)
                    {
                        properties.ListItem.Attachments.Add(item.File.Name, item.File.OpenBinary());
                        item[&quot;VersionLabel&quot;] = item[&quot;VersionLabel&quot;].ToString() + &quot;;&quot; + nextVersion.ToString() + &quot;.0;&quot;;
                        item.SystemUpdate(false);
                    }
                    properties.ListItem.SystemUpdate(false);
                    EventFiringEnabled = true;
                }
                else
                {
                    //Update all attachments
                    foreach (string fileName in properties.ListItem.Attachments)
                    {
                        SPFile document = targetFolder.Files[fileName];
                        document.Item[&quot;VersionLabel&quot;] = document.Item[&quot;VersionLabel&quot;].ToString() + &quot;;&quot; + nextVersion.ToString() + &quot;.0;&quot;;
                        document.Item.Update();
                    }
                }
            }
            properties.AfterProperties[&quot;CustomVersion&quot;] = nextVersion;
        }
    }
</pre></p>
<p>In the class above we can see we are using the ReceiverData field which we will define below, when attaching the event receiver, to store the document library and the name of the lookup field in the content type that we will be using to link back. We are creating a folder per ID of the item in the master list, and using this folder to store all attachments against any version of this item. We are tracking the version on the master list, and can, using the ListItem values and the AfterProperties values deduce from this whether we are doing a rollback or not.</p>
<p>Finally we need to attach this to our list and let it know which document library to point at using the following syntax:<br />
<pre class="brush: xml;">
  &lt;Receivers ListUrl=&quot;Lists/My List&quot;&gt;
    &lt;Receiver&gt;
      &lt;Name&gt;RedirectAttachmentsItemEventReceiver&lt;/Name&gt;
      &lt;Assembly&gt;$SharePoint.Project.AssemblyFullName$&lt;/Assembly&gt;
      &lt;Class&gt;Ebenezer.RedirectAttachments.EventReceivers.RedirectAttachmentsItemEventReceiver&lt;/Class&gt;
      &lt;Type&gt;ItemAttachmentAdding&lt;/Type&gt;
      &lt;SequenceNumber&gt;10000&lt;/SequenceNumber&gt;
      &lt;Data&gt;My List Attachments;My List&lt;/Data&gt;
    &lt;/Receiver&gt;
    &lt;Receiver&gt;
      &lt;Name&gt;RedirectAttachmentsItemEventReceiver&lt;/Name&gt;
      &lt;Assembly&gt;$SharePoint.Project.AssemblyFullName$&lt;/Assembly&gt;
      &lt;Class&gt;Ebenezer.RedirectAttachments.EventReceivers.RedirectAttachmentsItemEventReceiver&lt;/Class&gt;
      &lt;Type&gt;ItemUpdating&lt;/Type&gt;
      &lt;SequenceNumber&gt;10001&lt;/SequenceNumber&gt;
      &lt;Data&gt;My List Attachments;My List&lt;/Data&gt;
    &lt;/Receiver&gt;
    &lt;Receiver&gt;
      &lt;Name&gt;RedirectAttachmentsItemEventReceiver&lt;/Name&gt;
      &lt;Assembly&gt;$SharePoint.Project.AssemblyFullName$&lt;/Assembly&gt;
      &lt;Class&gt;Ebenezer.RedirectAttachments.EventReceivers.RedirectAttachmentsItemEventReceiver&lt;/Class&gt;
      &lt;Type&gt;ItemAdding&lt;/Type&gt;
      &lt;SequenceNumber&gt;10002&lt;/SequenceNumber&gt;
      &lt;Data&gt;My List Attachments;My List&lt;/Data&gt;
    &lt;/Receiver&gt;
    &lt;Receiver&gt;
      &lt;Name&gt;RedirectAttachmentsItemEventReceiver&lt;/Name&gt;
      &lt;Assembly&gt;$SharePoint.Project.AssemblyFullName$&lt;/Assembly&gt;
      &lt;Class&gt;Ebenezer.RedirectAttachments.EventReceivers.RedirectAttachmentsItemEventReceiver&lt;/Class&gt;
      &lt;Type&gt;ItemAttachmentDeleting&lt;/Type&gt;
      &lt;SequenceNumber&gt;10003&lt;/SequenceNumber&gt;
      &lt;Data&gt;My List Attachments;My List&lt;/Data&gt;
    &lt;/Receiver&gt;
  &lt;/Receivers&gt;
</pre></p>
<p>The advantage of this method is that no changes are needed to the out of the box edit/new forms in order for the attachments to be correctly versioned and updated with rollbacks.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codeshape.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codeshape.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codeshape.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codeshape.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codeshape.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codeshape.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codeshape.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codeshape.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codeshape.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codeshape.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codeshape.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codeshape.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codeshape.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codeshape.wordpress.com/29/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codeshape.wordpress.com&amp;blog=13467906&amp;post=29&amp;subd=codeshape&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codeshape.wordpress.com/2010/10/14/versioning-attachments-in-a-sharepoint-list/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/539af8d2cd50f8ddbe69a50a390af1dc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">timebenezer</media:title>
		</media:content>
	</item>
	</channel>
</rss>
