<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1911055642115785886</id><updated>2011-07-07T18:13:30.567-07:00</updated><category term='Marketing'/><category term='Game Design'/><title type='text'>iPhone Dev Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pathologygame.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1911055642115785886/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pathologygame.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Kurt</name><uri>http://www.blogger.com/profile/03345585922194568537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1911055642115785886.post-1182336264200388631</id><published>2009-07-13T21:13:00.000-07:00</published><updated>2009-09-24T01:04:15.432-07:00</updated><title type='text'>Memory Management for Cocoa composite objects</title><content type='html'>&lt;span style="font:12px &amp;#39;Lucida Grande&amp;#39;, LucidaGrande, Verdana, sans-serif; color:#262626;"&gt;While working on Pathology, I had a lot of trouble understanding memory management of composite data structures such as arrays and dictionaries.&amp;nbsp; In particular, I had need to implement a deep copy of heavily nested data structures (e.g. a dictionary item that is an array of arrays of custom objects, etc.)&amp;nbsp; in order to take a "snapshot" of my game state at known stable points in the game loop.&lt;br /&gt;&lt;br /&gt;Here is some example code that I used to test my understanding of how to copy collection objects (NSArray, NSDictionary) as either a shallow copy or a deep copy.  Also, how to implement proper copying in your own class for deep and shallow copying:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font:12px Monaco; color:#262626;"&gt;int DEEP_COPY = 1;&lt;br /&gt;&lt;br /&gt;// This class has no distinction between mutable and immutable so I do not need to implement &lt;NSMutableCopying&gt;&lt;br /&gt;@interface MyClass : NSObject&lt;NSCopying&gt; &lt;br /&gt;{&lt;br /&gt;&amp;nbsp; NSMutableDictionary *myDict;&lt;br /&gt;&amp;nbsp; int myID;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@property (nonatomic, retain) NSMutableDictionary *myDict;&lt;br /&gt;&amp;nbsp; @propertyintmyID;&lt;br /&gt;&lt;br /&gt;-(id) initWithID: (int) _ID;&lt;br /&gt;- (id)copyWithZone:(NSZone *)zone;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@implementation MyClass&lt;br /&gt;@synthesize myDict, myID;&lt;br /&gt;&lt;br /&gt;-(id) initWithID: (int) ID {&lt;br /&gt;&amp;nbsp; if (self = [super init]) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.myDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"one",@"first",@"two",@"second",nil];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myID = _ID;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; returnself;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (id)copyWithZone:(NSZone *)zone {&lt;br /&gt;&amp;nbsp; MyClass *copy;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; if (DEEP_COPY) {&lt;br /&gt;// Deep copy&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSLog(@"Performing deep copy in copyWithZone (MyClass)");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; copy = [[MyClass allocWithZone:zone] initWithID:myID];&amp;nbsp; // This sets the value field&lt;br /&gt;// Continue the copy chain on dictionary elements&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; copy.myDict = [[NSMutableDictionary allocWithZone:zone] initWithDictionary:myDict copyItems:YES];&lt;br /&gt;&amp;nbsp; } else {&lt;br /&gt;// Shallow copy&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSLog(@"Performing shallow copy in copyWithZone (MyClass)");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; copy = NSCopyObject(self, 0, zone);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; return [copy autorelease];&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-(void) dealloc {&lt;br /&gt;&amp;nbsp; [myDict release];&lt;br /&gt;&amp;nbsp; [super dealloc];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#import &lt;UIKit/UIKit.h&gt;&lt;br /&gt;&lt;br /&gt;@interface MemoryTestAppDelegate : NSObject &lt;UIApplicationDelegate&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UIWindow *window;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSArray *firstArray;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSMutableArray *secondArray;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@property (nonatomic, retain) IBOutlet UIWindow *window;&lt;br /&gt;@property (nonatomic, retain) NSArray *firstArray;&lt;br /&gt;@property (nonatomic, retain) NSMutableArray *secondArray;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@implementation MemoryTestAppDelegate&lt;br /&gt;@synthesize window, firstArray, secondArray;&lt;br /&gt;&lt;br /&gt;- (void)applicationDidFinishLaunching:(UIApplication *)application {&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;// * Convenience method used, so should use self-dot accessor to retain.&lt;br /&gt;// * Each element is created, then retained by the array, then should be autoreleased so their retain count is balanced.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; self.firstArray = [NSArray arrayWithObjects:[[[MyClass alloc] initWithID:1] autorelease], [[[MyClass alloc] initWithID: 2] autorelease], nil];&lt;br /&gt;&amp;nbsp; [[[firstArray objectAtIndex:0] myDict] setValue:@"Initialized" forKey:@"first"];&lt;br /&gt;&lt;br /&gt;&amp;nbsp; NSMutableArray *outerArray = [[NSMutableArray alloc] init];&lt;br /&gt;&amp;nbsp; [outerArray addObject:firstArray];&amp;nbsp; //firstArray retain count incremented&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Test 1 - using copy&lt;br /&gt;// * New memory to hold a second array is allocated, but each object in the array points to the same elements&lt;br /&gt;//&amp;nbsp;&amp;nbsp; as firstArray.&amp;nbsp; Each element's retain count in the first array is incremented&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// * Should use mutableCopy if copying into a mutable array&lt;br /&gt;&lt;br /&gt;// * If copy is used here, the following line would cause an exception&lt;br /&gt;&lt;br /&gt;// * Since a copy function is called, do not use self dot, which would cause an additional retain&lt;br /&gt;&lt;br /&gt;&amp;nbsp; secondArray = [firstArray mutableCopy];&lt;br /&gt;&amp;nbsp; [secondArray addObject :[[[MyClassalloc] initWithID: 2] autorelease]];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// * New memory to hold a second array is allocated, but no new elements created.&amp;nbsp; firstArray retain count incremented.&lt;br /&gt;// * Elements of firstArray are not affected.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; NSArray *secondOuterArray = [outerArray copy];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// * After changing the value in the original array, I expect to see the same change in the copied arrays&lt;br /&gt;//&amp;nbsp;&amp;nbsp; because only shallow copies have been made so far.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; NSLog(@"Changing first array element to 3");&lt;br /&gt;&amp;nbsp; [[firstArray objectAtIndex:0] setMyID:3];&lt;br /&gt;&amp;nbsp; NSLog(@"Second array element ID is %0d (Expected value: 3)", [[secondArray objectAtIndex:0] myID]);&lt;br /&gt;&amp;nbsp; NSLog(@"Second outer array element ID is %0d (Expected value: 3)", [[[secondOuterArray objectAtIndex:0] objectAtIndex:0 ] myID]);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// ***** test 2 - using initWithArray:copyItems&lt;br /&gt;&amp;nbsp; [secondArray release];&amp;nbsp; // Sends a release to each element, balancing the retain from the copy&lt;br /&gt;&amp;nbsp; [secondOuterArray release];&amp;nbsp; // Sends a release to firstArray, firstArray's elements are unaffected.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// * This creates memory for secondArray and sends a copy message to each element in the first array.&lt;br /&gt;// * The copy message then calls copyWithZone on each element, so the elements must have that method defined.&lt;br /&gt;// * This will create a new MyClass object for each element in secondArray, but how pointers in that object are&lt;br /&gt;//&amp;nbsp;&amp;nbsp; treated will depend on the copyWithZone implementation.&lt;br /&gt;// * Value fields will be independent copies.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; secondArray = [[NSMutableArray alloc] initWithArray: firstArray copyItems: YES];&lt;br /&gt;&amp;nbsp; [secondArray addObject :[[[MyClassalloc] initWithID: 2] autorelease]];&lt;br /&gt;&lt;br /&gt;// * The only array element in this case is a NSMutableArray, so the copy message is sent to NSMutableArray.&lt;br /&gt;// * It creates a new NSArray element, but the child elements are not copied.&amp;nbsp; No new MyClass objects are created.&lt;br /&gt;// * NSMutableArrays and NSArrays always perform a shallow copy.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; secondOuterArray = [[NSArray alloc] initWithArray: outerArray copyItems: YES];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; NSLog(@"Changing first array element to 4");&lt;br /&gt;&amp;nbsp; [[firstArray objectAtIndex:0] setMyID: 4];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// ***** Test the value object&lt;br /&gt;// * In the case of secondArray, new MyClass objects were created by the copy, and the myID field is a value field.&lt;br /&gt;// * So, I expect to see no effect from the change to the original array.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; NSLog(@"Second array element ID after initWithArray:copyItems is %0d (Expected value: 3)", [[secondArray objectAtIndex:0]&amp;nbsp; myID]);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// * Here, no new MyClass objects were created in secondOuterArray, so I expect to see the change reflected here&lt;br /&gt;&lt;br /&gt;&amp;nbsp; NSLog(@"Second outer array element ID after initWithArray:copyItems is %0d (Expected value:4)", [[[secondOuterArray objectAtIndex:0] objectAtIndex:0 ] myID]);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// ***** Test a pointer object&lt;br /&gt;// * The results here depend on how copyWithZone is implemented in MyClass.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; [[[firstArray objectAtIndex:0] myDict] setValue:@"Changed" forKey:@"first"];&lt;br /&gt;&amp;nbsp; if (DEEP_COPY) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSLog(@"Second array element dict value after initWithArray:copyItems is %@ (Expected value: \"Initialized\")", [[[secondArray objectAtIndex:0]&amp;nbsp; myDict] objectForKey:@"first"]);&lt;br /&gt;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSLog(@"Second array element dict value after initWithArray:copyItems is %@ (Expected value: \"Changed\")", [[[secondArray objectAtIndex:0]&amp;nbsp; myDict] objectForKey:@"first"]);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;// * Here, as in the value object case, no new MyClass elements are in the copy, so the result will always&lt;br /&gt;//&amp;nbsp;&amp;nbsp; match the firstArray&lt;br /&gt;&lt;br /&gt;&amp;nbsp; NSLog(@"Second outer array element ID after initWithArray:copyItems is %@ (Expected value: \"Changed\")", [[[[secondOuterArray objectAtIndex:0] objectAtIndex:0 ] myDict] objectForKey: @"first"]);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; [secondOuterArray release];&lt;br /&gt;&amp;nbsp; [outerArray release];&lt;br /&gt;&lt;br /&gt;&amp;nbsp; [window makeKeyAndVisible];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- (void)dealloc {&lt;br /&gt;&amp;nbsp; [firstArray release];&lt;br /&gt;&amp;nbsp; [secondArray release];&lt;br /&gt;&amp;nbsp; [window release];&lt;br /&gt;&amp;nbsp; [super dealloc];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1911055642115785886-1182336264200388631?l=pathologygame.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pathologygame.blogspot.com/feeds/1182336264200388631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pathologygame.blogspot.com/2009/07/memory-management-for-cocoa-composite.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1911055642115785886/posts/default/1182336264200388631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1911055642115785886/posts/default/1182336264200388631'/><link rel='alternate' type='text/html' href='http://pathologygame.blogspot.com/2009/07/memory-management-for-cocoa-composite.html' title='Memory Management for Cocoa composite objects'/><author><name>Kurt</name><uri>http://www.blogger.com/profile/03345585922194568537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1911055642115785886.post-2897673921006050299</id><published>2009-05-14T00:48:00.000-07:00</published><updated>2009-05-14T01:00:47.207-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game Design'/><title type='text'>The first decision</title><content type='html'>After deciding on the game I wanted to develop, the first major decision was: do I use OpenGL or not?&lt;br /&gt;&lt;br /&gt;I have absolutely no experience in OpenGL, but was prepared to slog through learning it.  I really did not want to use it if I did not have to, though.&lt;br /&gt;&lt;br /&gt;My requirements for the game were:&lt;br /&gt;  - Drag a square from a "tray" area to the game board and double-tap to place it&lt;br /&gt;  - Rotate the square in 90 degree increments&lt;br /&gt;  - Animate tokens along a pre-calculated path made of lines, arcs, and curves&lt;br /&gt;&lt;br /&gt; So, I looked through the view and animation APIs, and I bought the 3 available books on iPhone programming.  It looked like I would not have to learn OpenGL.  The trickiest part would be doing the animation along a path, since rotating a view is fairly straightforward.  From the docs, it looked like the CGAnimation class had what I needed, and it turned out that it works great for me.&lt;br /&gt;&lt;br /&gt;So, one major design decision down, and a sigh of relief from me, because I would not have to learn OpenGL for this game.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1911055642115785886-2897673921006050299?l=pathologygame.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pathologygame.blogspot.com/feeds/2897673921006050299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pathologygame.blogspot.com/2009/05/first-decision.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1911055642115785886/posts/default/2897673921006050299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1911055642115785886/posts/default/2897673921006050299'/><link rel='alternate' type='text/html' href='http://pathologygame.blogspot.com/2009/05/first-decision.html' title='The first decision'/><author><name>Kurt</name><uri>http://www.blogger.com/profile/03345585922194568537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1911055642115785886.post-6259195162763769315</id><published>2009-05-10T18:21:00.000-07:00</published><updated>2009-05-14T00:45:58.073-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><title type='text'>Putting my Daughter to Work</title><content type='html'>Last night, my family went to see the new Star Trek movie.  While waiting in line, my 9 year-old daughter asked me if she could use my iPhone to play "Daddy's game."  Not having sold any copies of the game in about a week, I told her "Sure," but she would have to hold the phone out prominently so that someone might catch a glimpse of the game and be curious about it.  Yes, I'm that desperate.&lt;br /&gt;&lt;br /&gt;Sure enough, the people in line behind us were quietly watching my daughter play the game, and looked interested, so I told them about it.  They bought and downloaded a copy on the spot!  Good thing my daughter doesn't know about the concept of commission yet :)  She did get a big hug from Dad!&lt;br /&gt;&lt;br /&gt;This underscores the need for exposure when developing a game.  I know that people will like the game, but how do I go about competing for attention from the &gt; 10000 other games (over 2000 in the same category)?  That's my next big hurdle.  I've made a fun game with good quality.  I have solid enhancements planned and already well under development.  I just need a way for people to know about it.&lt;br /&gt;&lt;br /&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1911055642115785886-6259195162763769315?l=pathologygame.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pathologygame.blogspot.com/feeds/6259195162763769315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pathologygame.blogspot.com/2009/05/putting-my-daughter-to-work.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1911055642115785886/posts/default/6259195162763769315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1911055642115785886/posts/default/6259195162763769315'/><link rel='alternate' type='text/html' href='http://pathologygame.blogspot.com/2009/05/putting-my-daughter-to-work.html' title='Putting my Daughter to Work'/><author><name>Kurt</name><uri>http://www.blogger.com/profile/03345585922194568537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1911055642115785886.post-1525804711710195180</id><published>2009-05-08T00:47:00.000-07:00</published><updated>2009-05-14T00:45:57.740-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game Design'/><title type='text'>Yet another iPhone game is born</title><content type='html'>For anyone interested in writing a game for the iPhone, I thought that I'd try to journal some of my experiences developing Pathology.&lt;br /&gt;&lt;br /&gt;My sons and I regularly play board games with friends, and someone brought in a game called Tsuro, which my sons really enjoyed playing.  I took a look at the game, saw how simple the rules are, combined with deceptive strategy and depth, and I thought "This would be cool to play on the iPhone."  I had also been looking into the iPhone APIs and I saw a good fit.  I could leverage animation along a path as well as touch/drag, and the core of the game was born in my head.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1911055642115785886-1525804711710195180?l=pathologygame.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pathologygame.blogspot.com/feeds/1525804711710195180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://pathologygame.blogspot.com/2009/05/yet-another-iphone-game-is-born.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1911055642115785886/posts/default/1525804711710195180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1911055642115785886/posts/default/1525804711710195180'/><link rel='alternate' type='text/html' href='http://pathologygame.blogspot.com/2009/05/yet-another-iphone-game-is-born.html' title='Yet another iPhone game is born'/><author><name>Kurt</name><uri>http://www.blogger.com/profile/03345585922194568537</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
