<?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/"
	>

<channel>
	<title>Perspx</title>
	<atom:link href="https://perspx.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://perspx.com</link>
	<description></description>
	<lastBuildDate>Sun, 15 Jun 2014 04:03:07 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.18</generator>
	<item>
		<title>Simple table views in iOS</title>
		<link>https://perspx.com/archives/simple-table-views-in-ios/</link>
					<comments>https://perspx.com/archives/simple-table-views-in-ios/#comments</comments>
		
		<dc:creator><![CDATA[Alex Rozanski]]></dc:creator>
		<pubDate>Tue, 29 Mar 2011 10:59:27 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<guid isPermaLink="false">http://perspx.com/?p=1751</guid>

					<description><![CDATA[UITableView is arguably one of the most important UI classes in UIKit, for its use in so many interfaces, in fitting with the dominant list-based UI paradigm in iOS. The way UITableView is constructed makes it really well suited to displaying dynamic data, through the use of the delegation pattern. The control caters really well [&#8230;]]]></description>
										<content:encoded><![CDATA[<p class="nobigfirstletter"><code>UITableView</code> is arguably one of the most important UI classes in UIKit, for its use in so many interfaces, in fitting with the dominant list-based UI paradigm in iOS.</p>
<p>The way <code>UITableView</code> is constructed makes it really well suited to displaying dynamic data, through the use of the delegation pattern. The control caters really well to data changes, by not storing the data that is to be displayed, but rather asking for it when it is needed.</p>
<p>The problem with <code>UITableView</code> really lies in displaying static content – content that largely doesn&#8217;t change, and content which is known to you at development time. Good examples of this would be any form of navigation, such as the hierarchical navigation structure in Settings.app, or an interface that is fixed, such as the detail view for a single contact in Contacts.app.</p>
<p>For these kind of interfaces, although you may want the table view look and feel, implementing the delegate/data source methods often feels very verbose for how you are using it.</p>
<p>I really like the article <a href="http://speirs.org/blog/2008/10/11/a-technique-for-using-uitableview-and-retaining-your-sanity.html">Fraser Speirs</a> has written to counter the problems associated with <code>UITableView</code> in such a scenario. The idea is essentially to create enumerations for the sections in the table view, and the rows in each section. This provides constants as mappings between row and section indexes, and the data you want to display. What&#8217;s more is that each enumeration is ended with a constant which can be used for the number of sections/rows in that enumeration, which works on the fact that the enumeration is 0-based. Here is an example:</p>
<pre>enum Sections {
     kHeaderSection = 0,
     kTitleSection,
     kAuthorSection,
     kBodySection,
     NUM_SECTIONS
};</pre>
<p>Now you can return <code>NUM_SECTIONS</code> in<code>-numberOfSectionsInTableView:</code>, which will always be the number of sections in the enumeration, and you can use <code>switch</code> statements in row or section-dependent methods such as <code>-tableView:cellForRowAtIndexPath:</code> with these constants, rather than having to hard-code row and section numbers.</p>
<p>Although much more resistant to future change and more structured, the problem with this method is that your code quickly devolves into a mess of switch statements, which doesn&#8217;t make the code much less verbose.</p>
<h2>Solving the problem with PXSimpleTableAdapter</h2>
<p>My primary motivation for <code>PXSimpleTableAdapter</code> was to overcome this problem of verbosity, and make setup and getting information into a table view really easy.</p>
<p>Why did I name it &#8220;Simple&#8221; table adapter? Because the classes are designed for <em>only</em> this use case – where you have &#8220;static&#8221; data. If you have dynamic data, <code>UITableViewDelegate</code> and <code>UITableViewDataSource</code> are the way to go.</p>
<h3>Get the source</h3>
<p>As with all of my open source projects, you can <code>clone</code> the project straight from GitHub:</p>
<pre>git clone git://github.com/Perspx/PXSimpleTableAdapter.git</pre>
<p>Or have a look at the project page at <a href="http://github.com/Perspx/PXSimpleTableAdapter">http://github.com/Perspx/PXSimpleTableAdapter</a>.</p>
<h3>Classes</h3>
<p>The structure of the classes is simple:</p>
<ul>
<li><strong><code>PXSimpleTableAdapter</code></strong>: This is the class which transforms the data you pass it into cells that can be used by a <code>UITableView</code>, as well as handling selection.</li>
<li><strong><code>PXSimpleTableSection</code></strong>: This class encapsulates information about a section in the table, including the rows it contains.</li>
<li><strong><code>PXSimpleTableRow</code></strong>: This class encapsulates information about a row in the table, such as its title and icon.</li>
</ul>
<p>Using <code>PXSimpleTableAdapter</code> is very straighforward:</p>
<ol>
<li>Lay out a <code>UITableView</code> in Interface Builder.</li>
<li>Create an instance of <code>PXSimpleTableAdapter</code> in your view controller class and set the <code>tableView</code> property to your table view instance. This property is declared as an outlet so this step can also be done in IB, by dragging out an Object from the Object Library for your table adapter instance then hooking this up to your view controller as another outlet).</li>
<li>Create an array of <code>PXSimpleTableSection</code> instances, and set each section&#8217;s array of <code>PXSimpleTableRow</code> instances.</li>
<li>Pass the array of sections to <code>-setSections:</code> on the <code>PXSimpleTableAdapter</code> instance.</li>
</ol>
<p>Convenience methods can be added if sections or rows need to be added or removed. Have a look at the <code>PXSimpleTableSection</code> and <code>PXSimpleTableRow</code> header files for more information.</p>
<h3>Data Model</h3>
<p>Each <code>PXSimpleTableSection</code> instance encapsulates:</p>
<ul>
<li>The header title for the section</li>
<li>The footer title for the section</li>
<li>The array of rows for that section</li>
</ul>
<p>Each <code>PXSimpleTableRow</code> instance encapsulates:</p>
<ul>
<li>The title of the row</li>
<li>The icon for the row (if needed)</li>
<li>The accessory type (from the <code>UITableViewAccessoryType</code> enumeration)</li>
</ul>
<p>Rows also have a selection block and an accessory tapped block property. These blocks are invoked when the row is selected, or their accessory button is tapped, respectively.</p>
<h3>Example</h3>
<p>Here is an example of creating a view which looks similar to that of Settings.app (if using a table view with the grouped style):</p>
<pre class="prettyprint" style="overflow: auto;">NSArray *firstSectionRows = [NSArray arrayWithObjects:[PXSimpleTableRow rowWithTitle:@"Sounds"],
                                                      [PXSimpleTableRow rowWithTitle:@"Brightness"],
                                                      [PXSimpleTableRow rowWithTitle:@"Wallpaper"], nil];

PXSimpleTableSection *firstSection = [[PXSimpleTableSection alloc] initWithSectionHeaderTitle:nil
                                                                           sectionFooterTitle:nil
                                                                                         rows:firstSectionRows];

NSArray *secondSectionRows = [NSArray arrayWithObjects:[PXSimpleTableRow rowWithTitle:@"General"],
                                                       [PXSimpleTableRow rowWithTitle:@"Mail, Contacts, Calendars"],
                                                       [PXSimpleTableRow rowWithTitle:@"Phone"], nil];

PXSimpleTableSection *secondSection = [[PXSimpleTableSection alloc] initWithSectionHeaderTitle:nil
                                                                            sectionFooterTitle:nil
                                                                                          rows:secondSectionRows];

NSArray *sections = [[NSArray alloc] initWithObjects:firstSection, secondSection, nil];
[firstSection release];
[secondSection release];

PXSimpleTableAdapter *tableAdapter = ...
[tableAdapter setSections:sections];
[sections release];</pre>
<p>For such static content, this is much more manageable, and the code to set up the view resides in one method only, rather than 5 or so delegate messages with their own conditionals.</p>
<h3>Custom Cells</h3>
<p>By default, the data encapsulated in each <code>PXSimpleTableRow</code> is transformed to a <code>UITableViewCell</code> with the default style. This cell is then passed to the table view for display.</p>
<p>To use a custom cell in rows, you must subclass <code>PXSimpleTableRow</code> where you can provide your own cells and set them up as necessary. You must create one <code>PXSimpleTableRow</code> subclass for each type of cell you are going to be using.</p>
<p>There is more information on how to do this in the <a href="https://github.com/Perspx/PXSimpleTableAdapter/blob/master/README.markdown">project README</a>.</p>
<h3>But what about delegation?</h3>
<p>Delegation is one of my favourite patterns used in Cocoa and it really is powerful. The aim of this project is not to break delegation or suggest that this is the way <code>UITableView</code> should go.</p>
<p>However, the aim of <code>PXSimpleTableAdapter</code> is simply as a convenience for implementing this particular use case of table views in a simple manner.</p>
<h2>Support/Bugs</h2>
<p>If you have any bugs to report then you can do so on the <a href="http://github.com/Perspx/PXSimpleTableAdapter">GitHub project page</a>.</p>
<p>If you have any queries about the project, first check out the project README on GitHub, or the Demo App bundled with the source. If your question still remains unanswered, you can <a href="http://perspx.com/contact">contact me here</a>. I&#8217;ll do my best to reply to any queries if I can.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://perspx.com/archives/simple-table-views-in-ios/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Interface first. Implementation second.</title>
		<link>https://perspx.com/archives/interface-first/</link>
					<comments>https://perspx.com/archives/interface-first/#comments</comments>
		
		<dc:creator><![CDATA[Alex Rozanski]]></dc:creator>
		<pubDate>Tue, 18 Jan 2011 10:15:52 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<guid isPermaLink="false">http://perspx.com/?p=1685</guid>

					<description><![CDATA[In this post I explain the benefits to writing class interfaces before implementing anything under the hood. These include making you think more about the overall design, considering how you or another developer will use the class and not painting yourself into a corner before you've barely started.]]></description>
										<content:encoded><![CDATA[<p class="nobigfirstletter">The two people I always have in mind when designing a new class are:</p>
<ol>
<li>the <strong>user</strong> (if it is a visual component)</li>
<li>the <strong>developer</strong> who is going to be interacting with it.</li>
</ol>
<p>I&#8217;m a firm believer in user-driven design, and will tend to structure my classes in order that they make most sense to how they will be organised on-screen, if they are visual components. However equally important to this is designing classes and their interfaces with other modules in such a way that they are <strong>easy to interact with from other modules</strong>. This is paramount to a well-structured application.</p>
<p>As a Cocoa developer the place where I find this philosophy is most important is the exchange of data from Model to View, passing through a Controller — the mediator in the MVC pattern. As a developer who often designs and builds data-intensive views, building something which not only works well for the user but also the <em>developer</em> is important to structuring classes which have clean interfaces and exchange of information between one another.</p>
<h2>The bigger picture</h2>
<p>In an object-oriented context, my first thought with all of my classes is <strong>how am I or someone else going to use this thing?</strong> You could have the best implementation in the world but a poorly thought-out public interface for other classes is likely to lead to problems down the line. This task comes before I even start to implement anything internally in the class.</p>
<p>The main benefit to this is that by designing the interface before you do any actual coding of inner workings, it gives you a broader sense of the class and will allow you to <strong>make changes as early as possible</strong>, potentially saving you a lot of time.</p>
<p>This is supported by Hunt and Thomas in <em><a href="http://www.amazon.com/Pragmatic-Programmer-Andrew-Hunt/dp/020161622X/" target="_blank">The Pragmatic Programmer</a></em>, in the section on Prototyping Architecture:</p>
<blockquote><p>Most prototypes are constructed to model the entire system under consideration. As opposed to tracer bullets, <strong>none of the modules in the prototype system need to be particularly functional</strong>. In fact, you may not even need to code in order to prototype architecture—you can prototype on a whiteboard, with Post-it notes or index cards. <strong>What you are looking for is how the system hangs together as a whole, again deferring details</strong>.</p></blockquote>
<p>Of course internal details are important and can affect how the class will be used, but designing the interface around the implementation is rather backward, because the internal implementation has little dependency on anything (aside from some fundamentals such as the storage and structure of data, for instance). The public interface, however is important to get right as a bad one can make other parts of your application inefficient or poorly constructed.</p>
<h2>Development process</h2>
<h3>1. Design the public interface by listing methods</h3>
<p>I usually start out by creating a list of public methods which other classes will call; be that processes or querying or setting state.</p>
<p>A lot of Cocoa classes use the <strong>delegation pattern</strong>. That is, the class will query its delegate (a Controller in the MVC pattern) for data to such as information to display in a table, or to notify it that something of importance has happened. At this stage I will also write a list of methods that will be called upon the delegate, to get a feel for how the interchange of information will work.</p>
<p>Of course at this time you may not know the full picture of how this class is going to work, but build upon what you know already. Doing it to the best of your knowledge at the time is what you are trying to do, rather than going in completely blind when building the control.</p>
<h3>2. Test how other classes will interact with your new class</h3>
<p>Next, I will actually call these methods that I have defined on my new class in another module, or implement delegate methods in my class&#8217;s delegate, using a test Model if they return any data.</p>
<p>This is invaluable when starting out, because it allows me to get a feel of how I will interact with this class when I am finished with it; at that point the internal implementation will be irrelevant from the point of view of any external classes, and this is an opportunity to <strong>revise</strong> the public interface of the control before getting bogged down by the internal implementation.</p>
<p>This might seem a somewhat back-to-front approach; instead of implementing the internal workings of a control, then creating the interface for other classes to interact with it, I will implement the public interface with no internal backing, then implement the internal parts later.</p>
<p>However, this approach has several advantages:</p>
<ul>
<li><strong>You get a better sense of the overall design of the control.</strong> Before you start coding anything internal, you get a much broader picture of how the class is going to operate, which can be useful when it comes to implementing the internal workings later.</li>
<li><strong>It makes you think about how other classes/modules will use it</strong>. Doing these steps first allows you to think about how <em>you</em> (or another developer) will want to use the class, irrespective of how it will function internally. For another developer who may not understand the exact inner-workings of your class, making this abstracted to suit the needs of other classes will make using it much easier.</li>
<li><strong>Changes to the interface at this point are very cheap</strong>. If you decide you don&#8217;t like the public interface at this point, it is very easy to change it with few repercussions. If you design the interface as you go along, any changes you make will often affect the internal structure which can be costly.</li>
</ul>
<h3>3. Revise the interface</h3>
<p>If there are any things which I&#8217;m not happy with I will now change these with quite a <strong>minimal impact</strong>, as there will be no underlying changes to the new class. I can then make sure the class I&#8217;m testing interactions with is updated to reflect these changes, and I will keep repeating this until I have something I&#8217;m initially happy with to start implementing.</p>
<h3>4. Internal Implementation</h3>
<p>Now I can start to build the internal workings of the class, with this <strong>rough guide</strong> for how I want it to behave and how it is constructed.</p>
<p>Of course as the implementation continues you may have to alter the public interface as you add features and capabilities to the module, but the initial design you have come up with will likely minimise this, if you have enough of an idea of how the module is going to work.</p>
<h2>To Conclude</h2>
<p>It may seem that I am suggesting that this is an ideal process, one by which up-front design will create a perfectly designed interface that won&#8217;t have to be revised; this is not the case in many places, and as you start to build more complexity or requirements change it is certainly possible that you may have to gut your class.</p>
<p>Real software development is anything but perfect and ideological, but by thinking and revising module design and architecture up-front, it will help to reduce throwaway code that you write, and on the whole save you time.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://perspx.com/archives/interface-first/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>cocos2d for Mac</title>
		<link>https://perspx.com/archives/cocos2d-for-mac/</link>
					<comments>https://perspx.com/archives/cocos2d-for-mac/#comments</comments>
		
		<dc:creator><![CDATA[Alex Rozanski]]></dc:creator>
		<pubDate>Sun, 21 Nov 2010 13:35:16 +0000</pubDate>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Development]]></category>
		<guid isPermaLink="false">http://perspx.com/?p=1543</guid>

					<description><![CDATA[cocos2d for iPhone, the 2D graphics and games library used frequently in iOS apps, has recently been ported to the Mac. In this post I give an introduction to using cocos2d in Mac applications, from setting up to some of the differences between the iOS and Mac versions.]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" src="http://perspx.com/media/2010/11/cocos2dIcon.png" alt="" title="cocos2d Icon" width="96" height="96" class="left" /></p>
<p class="nobigfirstletter">cocos2d for iPhone is an open-source framework that is used to create 2D graphics and games for the iPhone and iPad, based on the <a href="http://www.cocos2d.org/">original cocos2d project</a> (which is written in Python). cocos2d for iPhone is a port to iOS and is written in Objective-C, and is built upon OpenGL. The cocos2d for iPhone project has been successful with games written for the iPhone, and there is a <a href="http://www.cocos2d-iphone.org/games/?orderby=rating&#038;order=down">long list</a> of apps which use the library.</p>
<p>In recent months it has been ported to the Mac (presumably with the upcoming opening of the Mac App Store) and in this post I&#8217;ll walk you through getting it up and running for Mac projects and then finish by listing some of the differences between the iOS version and the Mac port.</p>
<h2>1. Get the source</h2>
<p>At the time of writing, the Mac port of cocos2d is still in beta; but the latest version can be found <a href="https://github.com/cocos2d/cocos2d-iphone/">on GitHub</a> or is easily cloned from the command line with Git:</p>
<pre>$ git clone https://github.com/cocos2d/cocos2d-iphone.git</pre>
<p>You can also <code>checkout</code> the <code>develop</code> branch if you want the blindingly up-to-date code, but I didn&#8217;t bother.</p>
<h2>2. Build the cocos2d static library</h2>
<p>Once you&#8217;ve checked out the source, there is an Xcode project called <strong>cocos2d-mac</strong> in the root directory. Open this up in Xcode, and select the <strong>cocos2d</strong> target, which is a static library.</p>
<div class="photobox"><img loading="lazy" class="center" title="cocos2d Target" src="http://perspx.com/media/2010/11/cocos2dTarget.png" alt="" width="370" height="278" /></div>
<p>With the upcoming opening of the Mac app store, building cocos2d as a static library is the best way to go, since it is likely that the only permitted way of linking against third party libraries is if they are static libraries (this is where the compiled object files are copied into the application executable when it is built, rather than being loaded at runtime; see <a href="http://www.cocoadev.com/index.pl?ApplicationLinking">this post</a> for more information).</p>
<p>I did a Release build and set an installation directory for the static library as a &#8220;shared&#8221; folder I store libraries in that I use in several projects.</p>
<p>To do an installation when the project is being built, you need to set three values in the Build settings for the static library target (Ensuring the Configuration dropdown box is for a Release build):</p>
<ol>
<li>Set the <strong>Installation Build Products Location</strong> to the root directory that you want to copy the static library to when it is built.</li>
<li>Set the <strong>Installation Directory</strong> to the relative path that you want to copy the static library to when it is built. This value is appended to the installation build products location, forming the full path to which the library is copied to.</li>
<li>Check the <strong>Deployment Location</strong> checkbox.</li>
</ol>
<div class="photobox"><img loading="lazy" src="http://perspx.com/media/2010/11/StaticLibraryBuildSettings.png" alt="" title="Build Settings" width="695" height="330" class="center" /></div>
<p>Now do a Release build of the cocos2d static library target. The library will be built then copied to the location that you specified in the build settings.</p>
<h2>3. Setting up the project</h2>
<p>With the static library built and copied to a shared folder, you now need to create a new project and add cocos2d. First you need to add the static library that you have built. By default, the cocos2d static library is built as <strong>libcocos2d.a</strong>.</p>
<p>If you did a Release build and installed it to a folder then locate this and drag it into the <em>Frameworks &gt; Linked Frameworks</em> folder in the Groups &amp; Files Pane. Uncheck &#8220;Copy items into destination group&#8217;s folder&#8221; and check the checkbox for the application target that you want to link cocos2d with.</p>
<p>Now you need to add some other frameworks to your application target, namely:</p>
<ul>
<li>ApplicationServices.framework</li>
<li>QuartzCore.framework</li>
<li>OpenGL.framework</li>
<li>libz.dylib</li>
</ul>
<p>These are the dependencies of cocos2d and have to be added to the project because cocos2d is being linked as a static library.</p>
<p>You also need to set a flag in <strong>Other Linker Flags</strong> in the Build settings for your application target, which is <strong>-all_load</strong>. This forces copying of all the object files from the cocos2d static library to the application executable, and you will run into problems later if you don&#8217;t, for example when using cocos2d objects in Interface Builder, since the relevant object files won&#8217;t have been copied into the applicatione executable from the static library.</p>
<p>Have a look at <a href="http://developer.apple.com/library/mac/#qa/qa2006/qa1490.html">this technical note</a> for more information.</p>
<div class="photobox"><img loading="lazy" class="center" title="cocos2d Other Linker Flags" src="http://perspx.com/media/2010/11/OtherLinkerFlags.png" alt="" width="607" height="199" /></div>
<h2>4. Using cocos2d in your projects</h2>
<p>For those who have used cocos2d on the iPhone/iPad, building an application using the framework is pretty much the same process as for iOS devices. For those who haven&#8217;t, I would recommend looking at the following resources, especially before reading further with this article:</p>
<ul>
<li><a href="http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:index">The official cocos2d for iPhone Programming Guide</a></li>
<li><a href="http://www.cocos2d-iphone.org/api-ref/latest-stable/index.html">The cocos2d for iPhone API Reference</a></li>
</ul>
<p>Although both are listed as being &#8220;for iPhone&#8221;, the documentation is almost identical for both platforms.</p>
<p>However, there are a few distinct differences between using cocos2d for iOS and for the Mac, namely:</p>
<ul>
<li>The input devices are different</li>
<li>Integrating with AppKit/UIKit is slightly different</li>
</ul>
<p>Fortunately, since the Mac port of cocos2d <em>is a port</em>, most of the work has been done for us.</p>
<h3>Event Dispatcher</h3>
<p>Those who have used cocos2d on iOS devices will be used to using <code>CCTouchDispatcher</code> with the <code>CCTouchDelegateProtocol</code> for touch events.</p>
<p>For the Mac, you will be using the <code>CCEventDispatcher</code> instead, which handles both mouse and keyboard events. To register a node to receive mouse events, call <code>-addMouseDelegate:priority:</code> on <code>CCEventDispatcher</code>:</p>
<pre class="prettyprint">[[CCEventDispatcher sharedDispatcher] addMouseDelegate:node priority:0];</pre>
<p>To register a node to receive keyboard events, call <code>-addKeyboardDelegate:priority:</code></p>
<pre class="prettyprint">[[CCEventDispatcher sharedDispatcher] addKeyboardDelegate:node priority:0];</pre>
<p>The <code>priority</code> argument denotes the priority of which mouse or keyboard events are sent to the delegate(s). The nodes that have been registered with a lower priority will be notified of the events before the nodes with a higher priority.</p>
<p>Mouse delegates are notified of:</p>
<pre>
- (BOOL)ccMouseDown:(NSEvent*)event;
- (BOOL)ccMouseDragged:(NSEvent*)event;
- (BOOL)ccMouseMoved:(NSEvent*)event;
- (BOOL)ccMouseUp:(NSEvent*)event;

- (BOOL)ccRightMouseDown:(NSEvent*)event;
- (BOOL)ccRightMouseDragged:(NSEvent*)event;
- (BOOL)ccRightMouseUp:(NSEvent*)event;

- (BOOL)ccOtherMouseDown:(NSEvent*)event;
- (BOOL)ccOtherMouseDragged:(NSEvent*)event;
- (BOOL)ccOtherMouseUp:(NSEvent*)event;

- (BOOL)ccScrollWheel:(NSEvent*)theEvent;

- (void)ccMouseEntered:(NSEvent*)theEvent;
- (void)ccMouseExited:(NSEvent*)theEvent;
</pre>
<p>Keyboard delegates are notified of:</p>
<pre>
- (BOOL)ccKeyUp:(NSEvent*)event;
- (BOOL)ccKeyDown:(NSEvent*)event;
</pre>
<p>The event process is much like the Cocoa responder chain, in that delegates with the lowest priority are sent the event notifications first. If they respond to the event, they return <code>YES</code>. If they return <code>NO</code> then the notifications are sent to the delegate with the next lowest priority, and so on, until someone responds to the event or the list of delegates is exhausted.</p>
<h3>MacGLView</h3>
<p>The <code>MacGLView</code> is a subclass of <code>NSOpenGLView</code> which is used to integrate with the cocos2d framework.</p>
<p>When you create the view that you want your cocos2d project to run in, drag an <code>NSOpenGLView</code> out into Interface Builder then change its class to <code>MacGLView</code>, or create a <code>MacGLView</code> in code. Then when you call <code>-setOpenGLView:</code> on <code>CCDirector</code> pass the <code>MacGLView</code> reference in.</p>
<h2>Final thoughts</h2>
<p>This is just an introduction to using cocos2d in your Mac applications; for more information have a look at the <a href="http://www.cocos2d-iphone.org/">project website</a> or the <a href="https://github.com/cocos2d/cocos2d-iphone/">project page</a> on GitHub.</p>
<p>The version which had the Mac port included is also currently in beta; although I didn&#8217;t find any bugs when doing some tests, if you are using cocos2d in any production applications, bear this in mind.</p>
<p>Also make sure to observe <code>LICENSE.cocos2d</code> that is bundled with the source.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://perspx.com/archives/cocos2d-for-mac/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Lists and Visual Noise</title>
		<link>https://perspx.com/archives/lists-and-visual-noise/</link>
					<comments>https://perspx.com/archives/lists-and-visual-noise/#comments</comments>
		
		<dc:creator><![CDATA[Alex Rozanski]]></dc:creator>
		<pubDate>Fri, 15 Oct 2010 08:54:45 +0000</pubDate>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Usability]]></category>
		<guid isPermaLink="false">http://perspx.com/?p=1519</guid>

					<description><![CDATA[In this article, I talk about lists – a popular interface element – in particular thinking about how much information needs to be presented to the user whilst still serving the list's purpose, in order to remove visual clutter.]]></description>
										<content:encoded><![CDATA[<p class="nobigfirstletter">One of my favourite principles of good design is:</p>
<blockquote><p>You know you’ve achieved perfection in design, Not when you have nothing more to add, But when you have nothing more to take away.</p>
<p class="source">— Antoine De Saint-exupery</p>
</blockquote>
<p>I find this especially relevant when there is lots of information to be presented in an interface, to help with deciding which parts need to be displayed, and which bits don’t.</p>
<h2>Lists</h2>
<p>The list based interface seems to be a popular choice when displaying lots of information; all you have to do is look at sites such as Twitter, Facebook, YouTube, Delicious, Vimeo – or even iPhone apps, where list-based interfaces are pretty much <em>the</em> way to display information – to see that this is true.</p>
<p>Lists work as a way of displaying information for a few reasons:</p>
<ul>
<li>They display a set of <strong>connected items</strong>.</li>
<li>They can be used to display <strong>sorted data</strong>, often used when there is a <strong>chronology</strong> to information.</li>
<li>They are useful in <strong>summarising</strong> information which can be quickly and easily scanned through.</li>
</ul>
<p>Whilst a useful way of displaying lots of information, lists often fall short because of the amount of information that is presented in a small space, which leads to a cluttered interface.</p>
<h2>Swamped by Metadata</h2>
<p>Think about the actual content which is displayed in a list: statuses, blog entries, bookmarks etc. Most of these have associated <strong>metadata</strong> and this is often the cause of the problem of information crowding.</p>
<p>Take a Tweet on Twitter (as part of a conversation) for instance:</p>
<blockquote class="noquotemarks"><p>@alextgordon I&#8217;m surprised (but probably shouldn&#8217;t be) those are on different code paths</p></blockquote>
<p>That is the content, but is outweighed by its associated metadata:</p>
<ul>
<li>Author username: @rentzsch</li>
<li>Author real name: rentzsch</li>
<li>Time posted: 13 hours ago</li>
<li>In reply to: @alextgordon</li>
<li>Posted with: Mobile Web</li>
</ul>
<p>And it also has associated actions:</p>
<ul>
<li>Favourite</li>
<li>Retweet</li>
<li>Reply</li>
</ul>
<p>The challenge with listing information effectively lies in deciding which of these bits of information to display. Take the ‘New’ Twitter web UI, for example, which I feel displays far too much unnecessary information. The ‘conversations’ feature (probably inspired by clients such as Tweetie) has made it into the web app but feels too densely packed:</p>
<div class="photobox"><img class="center" src="http://perspx.com/media/2010/10/NewTwitterConversation.jpg" alt="" /></div>
<p>The conversation consists of only 2 tweets, but often Twitter conversations consist of many more. For serving the purpose of displaying an overview of the conversation, a lot of irrelevant information is displayed, such as “in reply to&#8230;” and the Favourite, Retweet and Reply actions (which are duplicated from the tweet in the main Twitter feed to the left). Because of all this information although the actual content (the Tweet itself) is only 88 characters and displayed in a larger font, it feels crowded by this metadata, which makes it harder to scan for the relevant information.</p>
<p>Non-web apps such as Tweetie and Echofon have already implemented conversations pretty well in a minimalist way which gets the most important information across and makes it easy to scan through the conversation:</p>
<div class="photobox"><img class="center" src="http://perspx.com/media/2010/10/EchofonConversation.jpg" alt="" /></div>
<p>Here the use of speech bubbles indicates that the tweets are connected and are replies to each other, which removes the “in reply to” line that the Twitter web app uses. The names and Twitter usernames have also been removed to further compress the information, and the interface uses avatars instead. The information is much easier to digest because there is lots of space and an absence of unnecessary data.</p>
<h2>Nothing more to take away</h2>
<p>In order to list information effectively, <strong>work out how much of it can be removed</strong> whilst still serving its purpose. Is that full timestamp needed? Do the number of comments on that blog entry make sense as a hook for what people want to read? These are all things you need to think about when deciding how to display information in the most effective way possible.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://perspx.com/archives/lists-and-visual-noise/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Making Cocoa list views really fast</title>
		<link>https://perspx.com/archives/making-list-views-really-fast/</link>
					<comments>https://perspx.com/archives/making-list-views-really-fast/#comments</comments>
		
		<dc:creator><![CDATA[Alex Rozanski]]></dc:creator>
		<pubDate>Thu, 20 May 2010 06:55:20 +0000</pubDate>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>
		<guid isPermaLink="false">http://perspx.com/?p=1427</guid>

					<description><![CDATA[Note: After writing this post, I have a project in the works building on some of the ideas I&#8217;ve discussed below; you can find PXListView on GitHub. It seems that many of the apps in use today rely on or display feeds or lists of data; be that a Twitter timeline, an RSS feed or [&#8230;]]]></description>
										<content:encoded><![CDATA[<div style="padding: 24px; background-color: #fff4d1;"><strong>Note:</strong> After writing this post, I have a project in the works building on some of the ideas I&#8217;ve discussed below; you can find <a href="https://github.com/Perspx/PXListView">PXListView on GitHub</a>.</div>
<p>It seems that many of the apps in use today rely on or display feeds or lists of data; be that a Twitter timeline, an RSS feed or a list of history in a version control system, there&#8217;s a common trend in UI for using lists.</p>
<p>But displaying lists in applications can be much more than trivial, certainly for applications on Mac OS X, especially when you have to deal with large quantities of data, and have to solve problems such as variable row heights or changes to this information.</p>
<p>Ever since using <a href="http://www.atebits.com/tweetie-mac/">Tweetie</a>, a Twitter client for Mac OS X, from a development point of view I was always curious as to how the list view for the Twitter timeline was implemented; hundreds of rows of tweets can be displayed in this control, and the performance hit appears to be minimal; scrolling is smooth, there doesn&#8217;t appear to be a huge memory footprint. So how is it done?</p>
<h2>Lists in Tweetie</h2>
<p>If you <a href="http://www.codethecode.com/projects/class-dump/">class-dump</a> Tweetie, you can see three classes at work:</p>
<ul>
<li><strong>ABScrollView</strong>: A subclass of <code>NSScrollView</code>. It&#8217;s not clear as to why there is this subclass but an <code>ABColor</code> object is used for the background (as opposed to an <code>NSColor</code>).</li>
<li><strong>ABTableView</strong>: A subclass of <code>ABScrollView</code> which is used as the list control.</li>
<li><strong>ABTableViewCell</strong>: The cell class used to display each row in <code>ABTableView</code>.</li>
</ul>
<p>The interesting part of the class hierarchy is contained in <code>ABTableView</code> and <code>ABTableViewCell</code>. <code>ABTableView</code> is a subclass of <code>ABScrollView</code> (<em>not</em> <code>NSTableView</code>) and is a control which can display a list of <code>ABTableViewCell</code>s. However the real misnomer here is the <em>cell</em> part, because <code>ABTableViewCell</code> is a subclass of <code>NSView</code>, and not <code>NSCell</code>.</p>
<div class="photobox"><img loading="lazy" class="center size-full wp-image-1434" title="Tweetie lists class diagram" src="http://perspx.com/wp-content/uploads/2010/04/TweetieClassDiagram.png" alt="" width="356" height="313" srcset="https://perspx.com/media/2010/04/TweetieClassDiagram.png 356w, https://perspx.com/media/2010/04/TweetieClassDiagram-300x263.png 300w" sizes="(max-width: 356px) 100vw, 356px" /></div>
<p>So essentially what we have here is an implementation of something similar to <code>NSCollectionView</code>, which has a set of subviews which each represent a row and have their own place in the view hierarchy. But how, then, is the Tweetie list view so performant?</p>
<pre class="prettyprint">@interface ABTableView : ABScrollView
{
    ...
    NSMutableDictionary *reusableTableCells;
    ...
}

...
- (id)reusableCellsArrayForIdentifier:(id)arg1;
- (id)dequeueReusableCellWithIdentifier:(id)arg1;
...
@end</pre>
<h3>Reusing Cells</h3>
<p>The answer seems to lie in a method declared on <code>ABTableView</code>, which is <code>-dequeueReusableCellWithIdentifier:</code>. For those of you who are iPhone developers, you will be familiar with a method on <code>UITableView</code> with <em>exactly</em> the same method signature.</p>
<p>For those who aren&#8217;t, I shall explain: certainly compared to simple <code>NSCell</code> instances, <code>NSView</code> instances are pretty expensive. In fact, <code>NSCell</code> is <em>actually designed</em> as a &#8220;mechanism for displaying text or images in an NSView without the overhead of a full NSView subclass&#8221;<sup>1</sup>. In light of this, if we have 100, 1,000 – or even more – rows in a list, we don&#8217;t want the overhead of 1,000 instances of <code>NSView</code>, each used to represent a row. What&#8217;s more is that most of these cached views are wasted, since 1,000 rows cannot be displayed in the viewport at the same time. The iPhone takes advantage of this, and ensures that there are only enough view (in this case <code>UIView</code>) instances to cover the height of the table view; if the associated rows are scrolled off screen, then the views are removed from the view hierarchy.</p>
<p>Scrolling works much like laying down track for a train by picking up track from behind it; when a row is scrolled so that it is no longer visible, it is removed from the table view and &#8220;enqueued&#8221; (ie stored in an array); when a row that is not visible is scrolled so that it becomes visible, the data source should first check to see if there are any enqueued views, and if so it is then added to the view hierarchy and displayed.</p>
<p>What this means is that hundreds of rows can be displayed in one control without a large performance hit, and is one of the optimizations that makes the iPhone UI so responsive.</p>
<h2>Lists in Echofon</h2>
<p>After class-dumping, you can see that Echofon implements their list views in pretty much the same way as Tweetie, using two main classes:</p>
<ul>
<li><strong>FastTableView</strong>: A subclass of <code>NSScrollView</code> which is the list control.</li>
<li><strong>FastTableCell</strong>: A subclass of <code>NSView</code> which represents a cell used for the table view.</li>
</ul>
<div class="photobox"><img loading="lazy" class="center size-full wp-image-1438" title="Echofon Class Diagram" src="http://perspx.com/wp-content/uploads/2010/04/EchofonClassDiagram.png" alt="" width="356" height="253" srcset="https://perspx.com/media/2010/04/EchofonClassDiagram.png 356w, https://perspx.com/media/2010/04/EchofonClassDiagram-300x213.png 300w" sizes="(max-width: 356px) 100vw, 356px" /></div>
<p>Although not as explicit as the enquing/dequeuing in Tweetie&#8217;s list control, it would <em>seem</em> that <code>FastTableView</code> does a similar job as it has declared on it <code>-popCellForRow:fromArray:</code> and <code>-popSpareCell</code>.</p>
<p>Also to note is the use of <code>NSControl</code> and <em>not</em> <code>NSView</code> as the superclass of the table &#8220;cell&#8221; object, unlike with Tweetie. I would guess that this is for some of the additions that <code>NSControl</code> provides, perhaps the target/action mechanism.</p>
<h2>Final word</h2>
<p>When displaying large amounts of data in a list, as many applications do, often <code>NSTableView</code> is not enough. It is a pretty performant class, but when you start doing things with variable row heights, it isn&#8217;t really cut for the job. Nor is a class such as <code>NSCollectionView</code>; again it doesn&#8217;t implement variable row heights and lots of items can slow it down.</p>
<p>It seems that using view objects for each row, which have an established presence in the view hierarchy is the way to go, if you have the optimizations on top of this. For one you get the added convenience of using instances of <code>NSView</code>, and not simply working with <code>NSCell</code>.</p>
<p>As a final note, a quote I recall from <a href="http://www.zarrastudios.com/ZDS/Home/Home.html">Marcus Zarra</a>&#8216;s <a href="http://www.amazon.com/Core-Data-Apples-API-Persisting/dp/1934356328">book on Core Data</a> says:</p>
<blockquote><p>The lesson I took away from that story is to expect my users to put thousands of times as much data into my application as I would ever consider reasonable</p></blockquote>
<p>When working with large quantities of data, it is these kinds of optimizations that make your app more responsive and provide a better experience to the user.</p>
<div id="footnotes">
<h2>Footnotes</h2>
<ol>
<li>From <a href="http://developer.apple.com/mac/library/documentation/cocoa/conceptual/ControlCell/Concepts/AboutControlsCells.html">Control and Cell Programming Topics for Cocoa: About Cells and Controls</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://perspx.com/archives/making-list-views-really-fast/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>Application Demos</title>
		<link>https://perspx.com/archives/application-demos/</link>
					<comments>https://perspx.com/archives/application-demos/#comments</comments>
		
		<dc:creator><![CDATA[Alex Rozanski]]></dc:creator>
		<pubDate>Sat, 13 Mar 2010 09:44:50 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Usability]]></category>
		<guid isPermaLink="false">http://perspx.com/?p=1363</guid>

					<description><![CDATA[You&#8217;ve created an awesome piece of software, which you have been working on for months. You&#8217;ve refined every aspect of it; the aesthetic qualities, the data model, the user interface and experience. But now you need people to buy it. You release a demo version of your software which allows your potential customers to get [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>You&#8217;ve created an awesome piece of software, which you have been working on for months. You&#8217;ve refined every aspect of it; the aesthetic qualities, the data model, the user interface and experience.</p>
<p>But now you need people to buy it. You release a demo version of your software which allows your potential customers to get a feel for the app and decide whether it&#8217;s right for them, or not. <strong>And in doing so, you screw up the entire thing.</strong></p>
<h2>Where demos suck</h2>
<p>It amazes me how many software companies get demo versions of their applications wrong. Demos <em>aren&#8217;t</em> a trial period for you of your users, <strong>but rather a trial period for your users of you and your software</strong>. And if you want to sell your app, you&#8217;d better make a good impression.</p>
<p>But time and time again, demo versions of applications aren&#8217;t done properly, and rather provide more friction for making sales than acting as a way of convincing your users that your software is worth them buying. Common areas where application demos fall down are:</p>
<ol>
<li>You have to <strong>register an account</strong> to download the demo.</li>
<li>The emphasis is placed on <strong>purchasing the app</strong> rather than downloading it.</li>
<li>The demo places a <strong>crippling restriction</strong> on the software that doesn&#8217;t let you get a proper feel for it. For example, restricting major features.</li>
<li>There is a <strong>time limit</strong> on the demo which pressures users into purchasing the full version.</li>
<li>An annoying <strong>window prompting you to buy the app</strong> is displayed at frequent intervals.</li>
</ol>
<p>All of these elements create a negative experience of you and your software, right from the very start. But what is it about some of these irritations that make such demos a bad experience for your users, and what are the alternatives?</p>
<h3>1. Account registration</h3>
<p>Everyone hates account registration. I – like most other people – already have too many online accounts, and to be quite honest, I don&#8217;t want any more.</p>
<p>But where this is even more of a problem for people who want to try out your apps before they buy is that <strong>you&#8217;re already putting rope around their neck</strong>. They may just want to try out your app but you are already asking them to make a partial commitment by signing up to try out the demo.</p>
<p style="text-align: center;"><a href="http://www.filemakertrial.com/nskto/form/entry.aspx?homepage=fm11_launch_try&amp;try=fm11_launch_try"><img loading="lazy" class="aligncenter size-full wp-image-1364" style="border: 1px solid #aaaaaa;" title="Registering to download a FileMaker Pro Trial" src="http://perspx.com/wp-content/uploads/2010/03/filemaker_register_thumb.jpg" alt="" width="437" height="230" srcset="https://perspx.com/media/2010/03/filemaker_register_thumb.jpg 624w, https://perspx.com/media/2010/03/filemaker_register_thumb-300x158.jpg 300w" sizes="(max-width: 437px) 100vw, 437px" /></a></p>
<p>An example of this is with the <a href="http://www.filemakertrial.com/nskto/form/entry.aspx?homepage=fm11_launch_try&amp;try=fm11_launch_try">FileMaker Pro trial download</a>. Before you get a copy of the software to try out, you have to fill in a form, providing your name, address, operating system, and other market research questions such as how you heard about the product. This will be a huge turnoff for any potential customers because they will be less inclined to go through this entire process, just to see whether the application is something they&#8217;re interested in or not.</p>
<p>The solution to this problem is simple: <strong>don&#8217;t do it</strong>. On the main page for your app, place a prominent &#8220;Download&#8221; link which allows people to download your demo in one-click, no strings attached. This way they can see whether your software is relevant to them, without them feeling as if they&#8217;re being tied to anything.</p>
<h3>2. Emphasis on buy, not try</h3>
<p>Another problem with demo software is that the emphasis of the product is immediately placed on <em>buying</em> the software, not offering users to try it first. This ties in with making the users register to download the demo version first, or nagging for them to hand over their credit card details and is again, annoying because it ties them down and makes them feel that they are making a commitment rather than just trying out the software in their own time.</p>
<p>A good example of this being done well is on the Agile Web Solutions <a href="http://agilewebsolutions.com/downloads">downloads page</a>; it is clear that the focus of the section is <em>downloading</em> a demo version of the software to try out first, and not immediately placed on buying it, as shown by the prominence and alternate colour of the &#8220;Download Now&#8221; button compared to the &#8220;Buy It&#8221; button.</p>
<p style="text-align: center;"><a href="http://agilewebsolutions.com/downloads"><img loading="lazy" class="aligncenter size-full wp-image-1390" title="1Password Download" src="http://perspx.com/wp-content/uploads/2010/03/1Password-Download.png" alt="" width="474" height="265" srcset="https://perspx.com/media/2010/03/1Password-Download.png 474w, https://perspx.com/media/2010/03/1Password-Download-300x167.png 300w" sizes="(max-width: 474px) 100vw, 474px" /></a></p>
<h3>3. Crippling restrictions</h3>
<p>Of course, some form of restriction needs to be placed on your demo applications so that people who have a genuine need or interest for your app can&#8217;t use it forever for free.</p>
<p>However, these crippling kinds of restrictions include things like restricting major features from the demo version, which is often counter-productive, because it doesn&#8217;t <em>actually</em> let your users see whether your software is right for them, since they don&#8217;t have access to certain features, which might be the main reason that they would be interested in using the full version.</p>
<p>Instead of imposing restrictions such as this on your demos, <em>where possible</em> it is better to provide some other restriction that allows your users to get a feel for the application, but perhaps provides an upper bound on their use of it. A good example of this is with <a href="http://realmacsoftware.com/littlesnapper/">LittleSnapper</a>, which limits the number of images in your library in the demo version to 30, but so long as you have 30 or less images in your library you get access to all the other features available in the full version of the app.</p>
<p>From a business perspective, you want to make sure that the restriction you place means that people who are genuinely interested in using your software can&#8217;t do so forever without paying, but which doesn&#8217;t provide a barrier for those who aren&#8217;t yet sure to see whether the app is right for them.</p>
<h3>4. Time restrictions</h3>
<p>This is probably one of my main annoyances with demo applications – where time limits are imposed  on the use of the demo. The reason I find this such a turnoff is that it it similar to being sold something by a salesman on commission: there is constant pressure on you to purchase the full version rather than doing it in your own time.</p>
<p>Again, this seems attractive from the business side of software, and sometimes this may be appropriate, as there is no other justifiable alternative as a restriction on the demo, but <strong>this should only be used as a last resort</strong>.</p>
<p>And as <a href="http://mattgemmell.com">Matt Gemmell</a> suggested on one of the World According to Gemmell segments on the MDN show, if you are going to impose a time limit as a restriction, make sure that the time limit <strong>only applies to the days that the software is actually used</strong>. For example, if you impose a 30-day time limit and the user first uses the demo on the 1<sup>st</sup> of the month, but doesn&#8217;t use it on the 2<sup>nd</sup>, 3<sup>rd</sup> or 4<sup>th</sup> and comes back and uses it on the 5<sup>th</sup>, only count that as 2 days of use, not 5.</p>
<h3 style="clear: both;">5. Prompts to buy</h3>
<p>This is probably my <em>biggest</em> annoyance of application demos: where they constantly nag you to purchase the full copy; be that on launch, on exit, or even just during use of the application, it&#8217;s a definite no and will not get me – and most other people, I imagine – on your good side.</p>
<p>As I mentioned earlier, application demos are a way for your users to decide whether your software is right for them, and whether it is worth their time (and money). But this is another really annoying feature of demos because it is again pressuring users to purchase your software, rather than letting them decide first whether it is right for them or not.</p>
<p>In this process, it provides your users with a negative experience, and pushes them in the opposite direction to buying your software.</p>
<h2>Final word</h2>
<p><strong>A</strong><strong>pplication demos are a way for the user to decide whether your software is right for them</strong>. It&#8217;s your one shot to impress them and convince them that your software is worth investing their time – in learning how to use the software – and money.</p>
<p>Although it might seem like a convenient excuse to offload a whole load of marketing onto your potential customers and pressuring them to make a purchase, this reflects badly on you, and if you offer multiple products they are unlikely to try out others if you create a bad first impression.</p>
<p>The key is to provide a user-friendly experience which portrays you and your software in a positive light; if the software is presented in this enticing manner and people have a genuine need or interest in your software then you are going to make some sales.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://perspx.com/archives/application-demos/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>The Psychology of Software</title>
		<link>https://perspx.com/archives/the-psychology-of-software/</link>
					<comments>https://perspx.com/archives/the-psychology-of-software/#comments</comments>
		
		<dc:creator><![CDATA[Alex Rozanski]]></dc:creator>
		<pubDate>Fri, 05 Feb 2010 18:22:22 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Usability]]></category>
		<guid isPermaLink="false">http://perspx.com/?p=1298</guid>

					<description><![CDATA[Attending Matt Gemmell&#8217;s workshop last week was a great exercise for thinking from the user&#8217;s perspective – something which we, as software developers, often do not usually spend enough time doing because of being wrapped up in other things. As developers, it is hard for us to detach ourselves from what we do and cater [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Attending <a href="http://perspx.com/blog/archives/1193/the-world-according-to-gemmell/">Matt Gemmell&#8217;s workshop</a> last week was a great exercise for thinking from the user&#8217;s perspective – something which we, as software developers, often do not usually spend enough time doing because of being wrapped up in other things.</p>
<p>As developers, it is hard for us to detach ourselves from what we do and cater to the user. We live on the other side of the fence and are often restrained from making the right decisions because of the way we think, and usually need an objective opinion. We have the curse of knowledge by being so deeply focused in on our software, and what seems intuitive and easy for us is unlikely going to be the same for the people who use our creations.</p>
<h2>Thinking from the user&#8217;s perspective</h2>
<p>The amazing thing about a lot of usability and application design is that <strong>most decisions come down to simple thought</strong> of how your software is going to be used, and to anticipate and accommodate the user&#8217;s various needs. It&#8217;s about thinking &#8220;I shouldn&#8217;t put that text field there because the relation to that other form is confusing&#8221; or &#8220;I should relabel that button because the current label is misleading&#8221;.</p>
<p>As software developers, <strong>our main subjects are not computers</strong> (even though we do instruct them on what to do) but rather <em>people</em>. We have to be psychologists to some degree and accommodate <em>their</em> needs – our software of which is an end to a means.</p>
<h2>The reality</h2>
<p>As Matt stated on an earlier MDN show podcast, users want to spend as <em>little</em> time in an application as possible, so that they can get on with their lives. But because we have an affinity with the software we produce it is often hard to detach ourselves from the way we go about our business and think in this way.</p>
<p>Of course this doesn&#8217;t mean that we shouldn&#8217;t design and architect our applications in a maintainable way, and doesn&#8217;t mean that we should write crap code that looks like something the dog threw up. However bear in mind that the user doesn&#8217;t actually <em>see</em> any of this. To paraphrase Gemmell again, all the user sees of our applications is the interface.</p>
<p>At the end of the day, users couldn&#8217;t care less whether you have a PHP backend or the UI implemented using Rails; they have such a different perspective of what we create. What they care about is <strong>how your software solves their problem</strong> and how it makes their life easier by doing so.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://perspx.com/archives/the-psychology-of-software/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>NSConference 2010: Mac Conference (Day 2)</title>
		<link>https://perspx.com/archives/nsconf-2010-mac-developer-conference-day-2/</link>
		
		<dc:creator><![CDATA[Alex Rozanski]]></dc:creator>
		<pubDate>Wed, 03 Feb 2010 17:29:32 +0000</pubDate>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Development]]></category>
		<guid isPermaLink="false">http://perspx.com/?p=1253</guid>

					<description><![CDATA[Rentzsch on Core Audio: The API of Rock Stars It was the second and final day of the NSConference 2010 Mac Developer Conference and most delegates were tired and a little hungover. But there was another great line up of speakers for the day, and it was another day of socialising and fun, as well [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="photobox">
<p><img loading="lazy" class="center" title="Core Audio" src="http://perspx.com/wp-content/uploads/2010/02/Core_audio.jpg" alt="" width="600" height="382" /></p>
<div class="caption">Rentzsch on Core Audio: The API of Rock Stars</div>
</div>
<p style="text-align: center;">
<p>It was the second and final day of the <code>NSConference</code> 2010 Mac Developer Conference and most delegates were tired and a little hungover. But there was another great line up of speakers for the day, and it was another day of socialising and fun, as well as all that other learning stuff.</p>
<p>Perhaps the biggest things I took away from the Mac conference was taking a pragmatic approach to anything which became a recurring theme in a lot of the talks – like yesterday&#8217;s conference, extremes were presented such as Dave on not using singletons, but at the end of the day it&#8217;s a judgement call and you shouldn&#8217;t do or not do something &#8216;because Dave said it&#8217;, but rather because it&#8217;s either right or not right for what you want to do. There was also some recurring memes, such as The Matrix and kitties, which snuck their way into certain presenters&#8217; talks, but most of all, I learnt that people <em>can</em> be (fairly) civil when discussing version control, and also that the GPL <em>sucks</em>.<strong> </strong></p>
<div class="photobox">
<img loading="lazy" class="center" title="Jeff LaMarche" src="http://perspx.com/media/2010/02/JeffLaMarche.jpg" alt="" width="800" height="498" /></div>
<h2>Jeff LaMarche – Writing Super Superclasses</h2>
<p>Jeff was still jetlagged and tired, and made <em>several</em> comments as such throughout his talk. However, despite this, his talk on the Objective-C runtime was very interesting and informative to listen to. He started the talk off with a cliché – &#8216;you can&#8217;t see the forest through the trees&#8217; – and likened this to software development. As developers we are often too pedantic and only focus on the little things, but we also need to be able to step back and look at our projects as a whole on a larger scale.</p>
<p>He then went into the guts of his talk, talking about such things as dynamic method resolution and introspection at a lower level. He introduced Objective-C as different from other languages in terms of the patterns used and also touched on a criticism by others that it is missing things, however this is <em>by design</em> and not simply an oversight.</p>
<p>He then started talking about his <a href="http://code.google.com/p/sqlitepersistentobjects/">SQLitePersistentObjects</a> project which leverages the Objective-C runtime in several ways, and then demonstrated some of these features such as dynamic method resolution using IMPs and was well explained with the associated pros and cons of using certain runtime features.  Like many of the other talks, he explained the limitations of using the runtime, for example Apple <em>may</em><em> not</em> approve apps for the App store that use it, and also to be pragmatic about its use and not simply use it because you can.</p>
<div class="photobox">
<img loading="lazy" class="center" title="Andy Finnell" src="http://perspx.com/media/2010/02/AndyFinnell.jpg" alt="" width="800" height="489" /></div>
<h2>Andy Finnell – Brushing up on OpenCL</h2>
<p>I&#8217;ll be honest, after listening to Andy&#8217;s talk, I felt stupid. And I think there were other attendees around the room who were in a similar boat. He opened up with a demo, which was a great start to his talk, a demo which simulated the effect of watercolours on a canvas, and leveraged OpenCL to provide the graphics and calculate the drawing of the pigment and the interaction with the surface.</p>
<p>Although the maths and physics was way above me (and wasn&#8217;t helped by lack of sleep) it was still an informative and interesting talk, and I liked the structure of the presentation – cool demo at the beginning which made you interested then the rest of the time spent explaining how it all worked.</p>
<p>Andy also opened with a short intro on OpenCL and how it operated which was nice for those who hadn&#8217;t been at Drew&#8217;s Concurrency workshop on Sunday, however it would have been nice for this section to be expanded a bit, with less of a focus on the mechanics of the demo.</p>
<p>The presentation was also entertaining with accommodation for British spellings (&#8220;watercolo(u)r&#8221;) which is always a nice touch and other comical remarks and slides which helped a bit when it came to digesting the hardcore code samples. The coding side was also a nice contrast from the higher-level talks that were presented over both days of the Mac conference which also made it a useful and informative talk.</p>
<h2>Dave Dribin – Version Control System Shoot Out</h2>
<p>[Apologies for not having an accompanying photo]</p>
<p>Dave&#8217;s talk was all about version control and mostly a history or comparison of the different VCS&#8217;s out there. There was a feeling before the talk that <a href="http://twitter.com/creednmd/status/8539677234">it could go</a> <a href="http://twitter.com/pilky/status/8539592251">horribly wrong</a> but Dave kept it pretty objective and didn&#8217;t particularly favour any of the VCS&#8217;s.</p>
<p>He presented the history of version control systems first, with SCCS, RCS, CVS, SVN and other systems that use similar acronyms, before moving onto distributed version control with Git, Mercurial and Bazaar, quoting Linus&#8217;s talk where he explained the naming for Git: &#8216;I&#8217;m an egotistical bastard and I name all my products after myself, first Linux and now Git&#8217;. With all the version control systems he presented the pros and cons, and only discredited Git slightly. Overall a pretty well rounded talk for the allotted time of about 35 mins.</p>
<div class="photobox">
<img loading="lazy" class="center" title="Graham Lee" src="http://perspx.com/media/2010/02/GrahamLee.jpg" alt="" width="800" height="519" /></div>
<h2>Graham Lee – Code Signing</h2>
<p>Graham had been given the opportunity to present at very short notice, and it was very well executed. It was astounding the quality and detail of his talk despite the little preparation time that he had, and he had a great presentation style which was very entertaining. He also included lots of puns and other fun comments, such as a reference to a hypothetical harmful piece of injected code which he called Malicious Monster and also referenced as Malicious Library. For those who didn&#8217;t attend, the reference to the Matrix had become kind of a meme by this point and even though Graham had prepared his presentation in about 24 hours he still managed to fit it in.</p>
<p>He also did a live demo which was very useful and demonstrated some of the code signing in action; he also anticipated our needs well by cutting a few minutes short in aid of food. Overall a brilliant, informative presentation.</p>
<div class="photobox">
<img loading="lazy" class="center" title="Aaron Hillegass" src="http://perspx.com/media/2010/02/AaronHillegass.jpg" alt="" width="800" height="573" /></div>
<h2>Aaron Hillegass – The Many Faces of Data Persistence</h2>
<p>Aaron&#8217;s talk was – as you probably guessed – focused on data persistence and the what the options are on Mac OS X. He started off by stating &#8216;The file is dead&#8217; and explaining how his HDD is essentially a cache for data that is stored in the Cloud, which prompted him to comment &#8216;Long live the cache!&#8217;. He used the example of iWork on the iPad in that it uses a &#8220;Library&#8221; to store files which is essentially an abstraction for the filesystem and that this is the way forward.</p>
<p>He then went on to talk about archiving in Cocoa and Cocoa Touch, discussing Keyed vs Unkeyed archiving and the associated pros and cons. He also presented a timeline of events in terms of data persistence, from the early 90&#8217;s with NeXT right up until Core Data in 2005. He presented some nicely formatted object graphs of some of the Core Data things which was also useful.</p>
<p>He spent most of the second half of the presentation talking about his new data persistence project, <a href="http://github.com/hillegass/BNRPersistence">BNRPersistence</a>, which provides classes that wrap Tokyo Cabinet which is used to store the data, which received much applause from everyone when he announced that it was open-source, available on GitHub, and <em>not</em> licensed under the GPL. It was certainly an interesting project and he had some numbers for certain cases compared to Core Data and it performed much faster. But he was dealing with object graphs that had 1K and 1M objects and for &#8220;everyday&#8221; use with smaller objects it was unclear whether BNRPersistence would be better than Core Data because he didn&#8217;t have any figures on it.</p>
<p>What I liked about Aaron&#8217;s talk which I don&#8217;t think any of the other speakers did was that he was more engaging with everyone whilst he was talking – his style was like a lecture, but he periodically checked that we were all following everything, something which I guess comes from the teaching which he does, and was a nice touch.</p>
<div class="photobox">
<img loading="lazy" class="center" title="Cocoa Rumble" src="http://perspx.com/media/2010/02/CocoaRumble.jpg" alt="" width="800" height="460" /></div>
<h2>Cocoa Rumble</h2>
<p>The rest of the allotted time had been reserved for something different, in the form of a &#8220;Cocoa Rumble&#8221;. Earlier in the day, Scotty had announced that people could put their names in a hat to be chosen for this mystery event. Names were picked out of this hat and each person chosen was assigned a speaker from the conference.</p>
<p>The combined speakers and delegates were then split up into three groups and had to pick from the hat which now contained another set of slips of paper, which had written on them different &#8220;Core–&#8221; frameworks. The three chosen were Core Text, Core Audio and Core Image, and the teams had some time to prepare a presentation for why their framework was the &#8220;Core of the Year&#8221;. All presentations were very entertaining, with talks from Mike, Wolf and Graham and at the end, Core Image (presented by Graham) won for the compelling reasons that he had put into a table.</p>
<p>Whilst the teams were preparing, there was also a chance for the speakers and some of the delegates to provide tips, and there were some great tips from such people as <a href="http://twitter.com/uliwitness">Uli</a> who provided a load of cool Xcode tips, Aaron on <a href="http://twitter.com/Perspx/status/8549070326">having the old Xcode documentation browsing behaviour</a>, and Jeff on conditional build settings.</p>
<p>A nice fun end to the day, with something different and all in the community and social spirit.</p>
<h2>Final thoughts</h2>
<p>It was my last day of <code>NSConference</code> and what a brilliant conference it had been, with Matt Gemmell&#8217;s workshop on Sunday and the Mac developer conference too. It was great to socialise with loads of Mac developers who were all really friendly and I entered into some interesting discussions, and I took a great deal away from the conference which was something that Scotty laid out as one of the goals at the beginning.</p>
<p>I would like to thank Scotty, Tim, Dave, Rob, Simon and all the other people who made <code>NSConference</code> possible, because it was a great experience indeed, and to all the great people that I met there. Thanks also to Uli for setting up the <a href="http://twitter.com/nsconfr">NSConference Reflector</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>NSConference 2010: Mac Conference (Day 1)</title>
		<link>https://perspx.com/archives/nsconference-2010-mac-developer-conference-day-1/</link>
		
		<dc:creator><![CDATA[Alex Rozanski]]></dc:creator>
		<pubDate>Tue, 02 Feb 2010 08:21:54 +0000</pubDate>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Development]]></category>
		<guid isPermaLink="false">http://perspx.com/?p=1210</guid>

					<description><![CDATA[It was the first day of the NSConference 2010 Mac developer conference and a great lineup was ahead. In terms of the day generally, it was a brilliant experience. It was well organised and many thanks go to Scotty, Tim, Dave and all the other NSConference staff. The WiFi (although irritating that you had to [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="photobox"><img loading="lazy" class="center" title="NSConference" src="http://perspx.com/wp-content/uploads/2010/02/nsconf.jpg" alt="" width="640" height="330" /></div>
<p>It was the first day of the <code>NSConference</code> 2010 Mac developer conference and a great lineup was ahead.</p>
<p>In terms of the day generally, it was a brilliant experience. It was well organised and many thanks go to Scotty, Tim, Dave and all the other <code>NSConference</code> staff. The WiFi (although irritating that you had to keep filling out the signup form) worked quite well and you could get some pretty good speeds, which was good considering that the room was filled with over 100 developers, almost all of which I imagine had a Mac or iPhone for most of the day.</p>
<p>It was also a great social event, and the breaks were a nice chance to go around and talk to someone you&#8217;d never met before and have some interesting discussions. It was also nice to be in this tight community, separated from all the &#8220;normal&#8221; people who were also around at the venue.</p>
<p>In terms of the talks generally, I felt that they were all very well done and it was clear that they had put a lot of work into them. The presentations were very well laid out and simple, and not wordy and the speakers all obviously knew what they were talking about and had lots of interesting things to say. However one big thing that I felt could be improved on was the interaction with the audience – that is, many of the slides were in more of a lecture-style and although a couple made up for this with a Q&amp;A at the end I thought this could be improved upon.</p>
<h2>Scotty – Conference Introduction</h2>
<div class="photobox"><img loading="lazy" class="center" title="Scotty" src="http://perspx.com/media/2010/02/Scotty.jpg" alt="" width="800" height="574" /></div>
<p>Scotty kicked off the morning with a nice introduction to the conference, welcoming everyone and thanking us all for being here. He presented his recent case of being rushed into hospital for a &#8220;routine&#8221; operation as a metaphor for what we&#8217;re doing here, and he explained how even though he has little knowledge of the detailed ins and outs of the medical profession, he had a respect for them due to the reputation that the collective members have earned over the years. This was related to Mac development and <em>our</em> collective &#8216;responsibility to the platform&#8217; and what we do, and the expectations of the Mac or iPhone platforms which is ultimately our responsibility. He also talked about how there is pioneering but also sharing of ideas in the medical profession and again linked this to our role in the Mac/iPhone/iPad community.</p>
<p>He also went on to talk about the community spirit, and emphasised that all the speakers had given up their own time (and money) to be here which because of this, and was a nice to start the day.</p>
<h2>Mike Lee – Conference Keynote: Engineering Life</h2>
<div class="photobox"><img loading="lazy" src="http://perspx.com/media/2010/02/MikeLeeEngineeringLife.jpg" alt="" title="MikeLeeEngineeringLife" width="800" height="487" class="center" /></div>
<p>Mike&#8217;s presentation was evidently something slightly different and original to start the day but was a nice sideline to our ability to crank code, and was more thinking at a higher level about what we do, and perhaps being a bit more philosophical about it. He was relating what we do and our profession to life in general, and how we can &#8216;engineer life&#8217;. He defined <em>problems</em> as &#8216;reality we do not like&#8217; which was a topical tie-in with software development since problem solving is one of the key aspects to what we do.</p>
<p>Mike also used several anecodes during his presentation which brought in a realistic sense rather than something purely theoretical, reality which is often missed when talking about software and software development, with purely theoretical statements. He also likened the Universe to a computer in that both are simply entities which are constantly changing state.</p>
<p>The next part of the talk became perhaps a little morbid with discussion on &#8216;Death 101&#8217; with the conclusion that &#8216;death sucks&#8217; but you can&#8217;t really do anything about it and you&#8217;ll be dead in the ground so won&#8217;t care about it anyway. However he also likened this to fear and how you can engineer your way around fear and tackle it head-on rather than let it get the better of you. He also talked about having a legacy and a part of you that lives on when you die by accomplishing something that you are remembered for, which can perhaps give you a kind of immortality.</p>
<p>He finished on the note of &#8216;be the hero&#8217;, and overall the talk was an interesting and somewhat unusual. I heard later on that there was about a 50/50 split on people who liked/disliked the presentation but I thought it was an interesting, though-provoking topic and good to be a part of.</p>
<h2>Wolf Rentzsch – Spelunking OS X</h2>
<div class="photobox"><img loading="lazy" src="http://perspx.com/media/2010/02/WolfRentzsch.jpg" alt="" title="Wolf Rentzsch" width="800" height="566" class="center" /></div>
<p>Wolf started with the statement that he had &#8217;90 slides in 60 minutes&#8217; and it was pretty fast-paced, although for the most part fine to follow. He dug into Mac OS X under the hood and ways you can access this information and interact with it, introducing such tools as otx, otool and class-dump.</p>
<p>The low-level nature of his talk was a great contrast to Mike&#8217;s previous talk which was a demonstration of the breadth of talks within <code>NSConference</code> and was more of a code and tool-based talk. He introduced hexadecimal editors such as HexFiend, which &#8216;are your friend&#8217;, then went on to deal with different sections with prying into OS X internals such as static analysis with strings and files, and code injection.</p>
<p>The great part of presenting these tools was the accompanying screenshots of a terminal and the associated output, and also examples of useful commands and how they could be used, which was probably the killer feature of the presentation for me. He also had a clear presentation style and after talking to him later at the bar was a nice, bubbly person to talk to and obviously knows his stuff.</p>
<p>As a suggestion for improvement it would have been nice to see a live demo of some of the tools in action – he had some screenshots of probing applications such as TextEdit, but a live demo of the tools live would have been a nice addition.</p>
<h2>Dave Dribin – Clean Code</h2>
<div class="photobox"><img loading="lazy" src="http://perspx.com/media/2010/02/DaveDribin.jpg" alt="" title="Dave Dribin" width="800" height="469" class="center" /></div>
<p>I think that Dave&#8217;s presentation was perhaps my favourite of the day and talked about different ways of writing clean code and bad ways that can introduce &#8220;code smell&#8221; and ways to get around this and I agree that it is an important part of being a programmer.</p>
<p>He used the analogy of the iPhone as a way into the presentation; with the divide between internal and external quality – the external beauty is the interface that is seen by the user but the internals are the code that we write and sits behind the scenes. With an application it&#8217;s the difference between a beautiful interface and the underlying implementation of that in code.</p>
<p>The presentation was filled with quite a lot of tips, such as guidelines on naming classes and common principles such as DRY (Don&#8217;t Repeat Yourself) and OAOO (Once and Only Once) with the example of using enumerations or constants for dictionary keys instead of repeating strings throughout your code.</p>
<p>The Q&amp;A was also useful and for most of the other talks there wasn&#8217;t time so it was a nice feature to be able to ask questions about the content discussed.</p>
<h2>Drew McCormack – Data Presentation in Mac Apps</h2>
<div class="photobox"><img loading="lazy" src="http://perspx.com/media/2010/02/DrewMcCormack.jpg" alt="" title="Drew McCormack" width="800" height="482" class="center" /></div>
<p>Drew lead into the presentation by talking about his scientific background and explaining how different data can be displayed and visualised in different ways. His presentation was also nice because it was one of the ones that wasn&#8217;t directly related to churning code and was more about the UI and talking about the various controls – standard or custom – and where they are best used.</p>
<p>I liked the format of looking at these different controls – he presented images of each and then talked about the advantages and disadvantages of each. This was particularly useful when comparing controls, such as the <code>NSTableView</code> and the <code>NSCollectionView</code>, and his slides were perhaps the best of the day and contained very little text on them, just visual cues such as images and the likes.</p>
<p>To this end I learnt a lot about how different views are implemented – he explained using Tweetie (Mac) as an example that it uses an <code>NSTableView</code> to display its list of data, and also Versions implements some of its custom controls using HTML, CSS and Javascript with WebKit.</p>
<p>Near the end he did talk about non-standard controls and focused on drawing graphs with CorePlot. However he spent quite a long time talking about this, which although interesting it would have been nicer if he&#8217;d demonstrated a few more, different controls.</p>
<h2>Marcus Zarra – Core Animation</h2>
<div class="photobox"><img loading="lazy" src="http://perspx.com/media/2010/02/MarcusZarra.jpg" alt="" title="Marcus Zarra" width="800" height="431" class="center" /></div>
<p>Marcus started his talk by explaining how Core Animation wasn&#8217;t just for designers, and used himself as an example of a non-designer, but that it could still be used to enhance or help create sleek interfaces. However he also warned that Core Animation can easily be overused and turn a simple, clean UI into something horrible and even very unintuitive. He also explained how Core Animation, although its interface is quite simple, it is also very powerful.</p>
<p>He gave a few examples of using Core Animation, and then gave a live demo of an application that was doing lots of complex animations using Core Animation and how smooth and seamless they all were. It was evident that he had spent a lot of time on the project and he explained how the rotating gears displayed were constructed as paths which was a nice touch to the talk, to get a real demo application.</p>
<p>However even though he had an hour slot, he only used about 35 minutes talking and left the rest of the time for questions, which was quite a nice idea since it was more engaging with everyone rather than simply a lecture. However, it would have been nice for him to use more of his allotted time to show some more Core Animation examples.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>NSConference 2010: The World According to Gemmell</title>
		<link>https://perspx.com/archives/the-world-according-to-gemmell/</link>
		
		<dc:creator><![CDATA[Alex Rozanski]]></dc:creator>
		<pubDate>Sun, 31 Jan 2010 19:47:29 +0000</pubDate>
				<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Usability]]></category>
		<guid isPermaLink="false">http://perspx.com/?p=1193</guid>

					<description><![CDATA[The first day of NSConference 2010 kicked off with two workshops – Concurrency Programming on Snow Leopard by Drew McCormack, and The World According to Gemmell, by the Legend himself, of which I was an attendee. The session started with a discussion about a certain recently released Apple product which was very interesting and allowed [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="photobox"><img loading="lazy" class="center" title="Matt Legend Gemmell at NSConference 2010" src="http://perspx.com/wp-content/uploads/2010/01/IMG_1420.jpg" alt="" width="600" height="428" /></div>
<p>The first day of <a href="http://nsconference.com/"><code>NSConference</code> 2010</a> kicked off with two workshops – <em>Concurrency Programming on Snow Leopard</em> by Drew McCormack, and <em>The World According to Gemmell</em>, by <a href="http://mattgemmell.com/">the Legend himself</a>, of which I was an attendee.</p>
<p><img loading="lazy" class="right" title="Andy's iPad Model" src="http://perspx.com/media/2010/01/AndyiPad.jpg" alt="" width="234" height="312" />The session started with a discussion about a <a href="http://www.apple.com/ipad/">certain recently released Apple product</a> which was very interesting and allowed us to present our thoughts on the device. We covered such areas as the human psychology behind it, the display of &#8220;real&#8221; objects as the interface and the much more emphasised touch interaction including two-handed UI, as well as getting &#8220;wanky&#8221; about the emotional connection with the device.</p>
<p><a href="http://twitter.com/creednmd">Andy</a> had also created a great model of the device, that was the exact dimensions (although the back didn&#8217;t slope like the real thing) and half the weight of an actual iPad. This was really useful in the talk from Matt, when he was explaining such things as how people would hold the device.</p>
<p>We also discussed the changing seeds of user interfaces and the switch away from clutter-based interfaces, such as inspector panels which &#8216;can edit anything that has ever lived&#8217;.</p>
<h2 style="clear: both;"><em>Our</em> workshop</h2>
<p>A few weeks ago Matt sent an email round to all the workshop attendees asking whether we had any UX topics that we wanted to discuss that could form the basis of the workshop. This was a great structure and in the session we got through 7 or 8 discrete topics, from such topics as the evolution of your app and removing features to when the best time to release your 1.0 is.</p>
<p>Although Gemmell said that he had put the slides together quickly and a bit haphazardly (and <a href="http://twitter.com/macdevnet">Scotty</a> had been fiddling around with the slide animations<span class="required">*</span>), the slides were well arranged, and contained only a few – although thought-provoking – bullet points for each topic, and allowed us to really discuss the ins and outs and how one would go about dealing with these problems. The workshop dynamic really helped this section and the group discussion bit was great as we could all have our opinions heard and commented on, with Matt being the suspiciously-bearded ringleader of the event.</p>
<h2>Workshop dynamic</h2>
<p>Matt&#8217;s talk was arranged as a workshop and consisted of around 30 people. The tables had also been arranged into groups of about 5 or 6 and all of this combined made a great, much more personal dynamic for the session, because as Matt himself put it, we were all participants and it was <em>our</em> workshop, not just his.</p>
<p>It was a great social occasion to this end, and allowed for group collaboration which was a real strength of the workshop and made it a really enjoyable event.<em></em></p>
<h2>Final thoughts</h2>
<p>A brilliant first day to <code>NSConference</code> and a great thought experiment with lots of things to take away and think about. As I mentioned when speaking to Matt in one of the breaks, the Mac/iPhone/iPad platforms are so brilliant partially due to the fusion and interwoven nature of code <em>and </em>design, the latter of which is given a lot of thought in most instances, which made the workshop a very topical and interesting one indeed.</p>
<p>The Mac conference (Monday 1st Jan &#8211; Tuesday 2nd Jan) has a lot to live up to but a great start to what I&#8217;m sure will be a great conference.</p>
<div style="font-size: 10px; color: #606060;">* I&#8217;m kidding, we all know that it was <a href="http://twitter.com/tarasis">Rob</a> – he was being suspiciously quiet.</div>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
