<?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-13975555</id><updated>2011-08-17T03:06:40.119Z</updated><title type='text'>Literature and Latte</title><subtitle type='html'>Binary solo: 0000001000000110000001110000001111</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>36</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-13975555.post-5498951502457577227</id><published>2010-06-24T19:16:00.001Z</published><updated>2010-06-24T19:16:44.604Z</updated><title type='text'>Blog moved</title><content type='html'>Please note that this blog is no longer being updated because it has been moved here:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://www.literatureandlatte.com/blog&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We've moved everything over to Wordpress to be more integrated with the site, although all the old content from this blog should be intact over there with comments and all. Only a few of the comments that have been made in the past few days won't have made it across, because they were made after the transfer - my apologies to those commenters whose comments have been lost on the new site.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thank you all for reading, and I hope you will follow the new blog too - I promise news about 2.0 and other developments soon!&lt;/div&gt;&lt;div&gt;Keith&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-5498951502457577227?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/5498951502457577227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/5498951502457577227'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2010/06/blog-moved.html' title='Blog moved'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-1635657616206788770</id><published>2010-03-20T16:02:00.003Z</published><updated>2010-03-20T18:22:10.979Z</updated><title type='text'>How Big is Your Code Base?</title><content type='html'>&lt;div&gt;&lt;p&gt;This morning someone asked me how big Scrivener’s code base is, and I didn’t know how to answer - yet it’s something I’ve been wondering myself. It comes up occasionally, usually in two situations: 1) Someone writes to me wanting to know how much code it took to create Scrivener, because they have an idea for a program and wonder what’s involved; 2) Someone is insisting that I could port Scrivener to platform X or “just add” Y “easily enough” and is getting uppity that I’ve said no, so I want to puff out my chest and huff, “Look, I have written six billion lines of code mostly unique to the Mac platform and I’ve already got grey in my hair - coding Scrivener ain’t like dusting crops, kid!” (These exchanges usually end with me apologising for something.)&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Of course, how much code is behind any given program is misleading, and to a large extent rather meaningless, too. For a start, any Cocoa program stands on top of the vast amount of code written by Apple, so counting how much code you have written for a Cocoa application with a view to calculating how much work it would take to port it to another platform (even the iPhone or iPad) would be pointless, as it would not include all the extra code you might need to write to replicate features provided in Cocoa by Apple. Also, small programs with less code are often better for particular jobs than large programs with reams of code. For instance, &lt;a href="http://www.bean-osx.com/"&gt;Bean&lt;/a&gt; contains much less code than Microsoft Word, but it’s much nicer to user for basic documents. On the other hand, a good program that appears very simple to the user may contain a great deal of code that checks for potential errors. Besides, from a programming point of view, there’s nothing better than &lt;em&gt;cutting&lt;/em&gt; code. It’s always a good feeling when, upon reviewing a section of code you wrote ages ago, you slap your forehead and realise that you have written 50 lines that could have all been done in one. (There’s a &lt;a href="http://www.folklore.org/StoryView.py?project=Macintosh&amp;amp;story=Negative_2000_Lines_Of_Code.txt&amp;amp;topic=Software%20Design&amp;amp;sortOrder=Sort%20by%20Date&amp;amp;detail=medium"&gt;great story&lt;/a&gt; about an Apple Lisa programmer who, when forced to fill in a form declaring how many lines of code he had written that week for the sake of proving progress to the management, wrote “-2000” - they didn’t use the forms much longer.) Less code is usually better, but sometimes more lines of code is necessary for the sake of readability. You might be able to cram ten lines of code into one, but if you come back to it two years later and have no idea what that line is for, then what was the point? It would have been better to have written ten lines of code with well-named variables, or at least to have made more space for meaningful comments.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Still, caveats aside, after having worked on a project for more than five years, it would be interesting to know how much code you have ended up with. Yes, it’s meaningless - the results of your labour are measured by the quality of the application and not by the quantity of code - but the obsessive compulsive, anal retentive in me wants &lt;em&gt;hard figures&lt;/em&gt; (whatever a “hard figure” is - a die-cast Arnie?).&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;How do you measure the size of your code base, though? It’s not as simple as it at first sounds. Do you count the number of files you have generated? But then, in object-oriented programming, each class has at least two files, and sometimes more if you have created categories. So do you just count the number of different class files you have created? Each of those could contain wildly different amounts of code, though, so maybe you should could the total lines of code in all? But &lt;em&gt;then&lt;/em&gt;, even counting lines of code is far from straightforward. For a start, there will be lots of blank lines - so what about if you count only the lines of code that aren’t blank? But what about lines that don’t contain any statements, just an “if (something)” or an end bracket? Okay, so how about we just count lines that have a semi-colon in them, as that indicates the line has a statement in it. On top of all of this, though, when thinking about text, I like to think in word and character counts - if I’d been writing instead of coding, how many books could I have written (or, more accurately, agonised about not writing)?&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Well, in the name of procrastination, I decided to spend this morning writing an application that would count all of these things, as it seems to me that they all have something to say about how much code you have written. There are a few other apps out there that will count lines of code and so on, but after spending twenty minutes searching, I figured I would just write my own. I called it “Xcode Statistician”, and if you are a programmer you can run your own Xcode project through it by downloading it from here:&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href="http://www.literatureandlatte.com/freestuff/XcodeStatistician.zip"&gt;http://www.literatureandlatte.com/freestuff/XcodeStatistician.zip&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Here are the results of running the Scrivener 1.5 code base through it:&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.literatureandlatte.com/misc/Scriv1Stats.jpg" /&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Blimey. That’s quite a lot of code. But before I pick that apart a little, here are the results of running the Scrivener 2.0 code base through it:&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.literatureandlatte.com/misc/Scriv2Stats.jpg" /&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Blimey O’Riley - now that is a lot &lt;em&gt;more&lt;/em&gt; code. In fact, the code base has &lt;em&gt;doubled&lt;/em&gt; - Scrivener 2.0 has twice as much code as Scrivener 1.5. Perhaps this shouldn’t come as a great surprise to me, as I’ve been working on Scrivener 2.0 for over two years now (and it will be out later this year, folks, I promise). And yet it was a surprise, because Scrivener 2.0 is designed to be simpler to use than Scrivener 1.x - I’ve taken on board a lot of user feedback and had time to redesign elements with which I wasn’t happy, and I really feel it is more accommodating to new users. But then, I suppose making things look simple can sometimes take a lot of code. (Not all of that code is mine, of course - a small fraction of it will be source code I’ve used from elsewhere.) And then, I have written a plethora of new classes, from a text comments view to a collections view, I’ve separated code out into different files to make it more manageable, I’ve significantly enhanced the functionality of the corkboard, and so on - so I suppose it makes sense that I have written so much code in the past couple of years.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Still. It should give some indication of just what I mean when I say that porting Scrivener - even a putative “simplified” version - to the iPad or to any other platform would be a big job. Sure, in comparison to something like PhotoShop or Word, Scrivener’s code base is puny, but I think it’s a fair whack of code for a single developer. (And I don’t say this as a boast - if anything, the figures &lt;em&gt;depress&lt;/em&gt; me, because that now means twice the amount of code to maintain and double the fun when it comes to tracking bugs.)&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;So, to answer the question I was asked this morning: How big is Scrivener’s code base?&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Approximately 200,000 lines of code comprising at least 70,000 statements.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;600 class files comprising around 230 custom-built classes and 40 classes that extend the existing Cocoa ones.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Nearly 600 image files. (Even accounting for those sourced from elsewhere, how on earth did I manage that? I’m rubbish with Photoshop - no comments about icons you don’t like, please.)&lt;/p&gt;&lt;p&gt;50 interface files.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Over six &lt;em&gt;million&lt;/em&gt; characters.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;But here’s the real kicker: 600,000 words - of course that’s only rough given that many of them will be numbers and variables and single characters, but all the same. Had I the brains or creativity or drive to do the thing that drove me to create Scrivener in the first place (still with me?), I could have written about six 100,000-word novels.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;In fact, I think &lt;em&gt;that&lt;/em&gt; is how I’m going to quantify it, as it seems wholly appropriate:&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;How large is Scrivener’s code base?&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Answer: About six novels.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-1635657616206788770?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/1635657616206788770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=1635657616206788770' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/1635657616206788770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/1635657616206788770'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2010/03/how-big-is-your-code-base.html' title='How Big is Your Code Base?'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-8373555567249659096</id><published>2010-02-05T17:39:00.004Z</published><updated>2010-02-06T02:08:15.167Z</updated><title type='text'>Coding XML Formats in Cocoa</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;I’ve long been intending to add some technical, coding-related content to this blog. I’ve always admired the blogs of other developers who share some of the coding problems they have faced and solutions they have reached, and in developing Scrivener there are a number of issues that I’ve come across and found solutions for that I’m sure could be useful to other developers. So, this is the first more techie, coding-orientated post to make it to the blog. Those with no interest in Cocoa development, look away now.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;I have recently been rewriting Scrivener’s file format. As you may or may not know, .scriv files are packages - essentially folders that on OS X just look like, and are treated the same as, files. Were you to move a .scriv file to a different platform, it would appear as a regular folder. On OS X, you can ctrl-click on a .scriv file in the Finder and select “Show Package Contents”. File packages are great for programs such as Scrivener. Regular files usually have to be loaded into the program’s memory in their entirety when loaded; with a file package, the program can just look inside it and open whatever it needs as and when it needs it. Given that Scrivener can import movie, sound, PDF and image files, you can imagine how much memory might get eaten up if it had to load everything into memory right from the get-go. Instead, with its package format, it can just load the binder structure file and then load up each document as you select it in the binder, and flush from memory any large files that aren’t currently being used.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;For Scrivener 2.0, .scriv files will still be file packages, but I’ve been doing some work on the format of the files &lt;em&gt;inside&lt;/em&gt; the .scriv file. Currently all text files are saved internally as RTFD files (RTFD stands for “rich text format directory”). RTF files are a standard rich text format that can be opened on all major platforms (they are essentially plain text files with formatting mark-up), and were designed by Microsoft; RTF files support pretty much everything that Word documents do. RTFD is Apple’s extension of this format. An RTFD file is a file package in itself (as with .scriv files, you can ctrl-click on them in the Finder and select “Show Package Contents” - you will find a TXT.rtf file inside there, for instance, which holds the actual text). Apple designed the format so that such files could also hold QuickTime files and any other file type; but the trouble is that RTFD files can only be opened on Macs. Most of the other files inside .scriv packages use the Apple .plist format - I may have given some of them the .xml extension (.plist files are technically XML files), but internally they are just Apple .plists. (.plist stands for “property list”).&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;This format for Scrivener files was generally a great and solid 1.x file format. It works, and it doesn’t take too much code to maintain on my part - the Cocoa frameworks make it very easy to write to RTFD and PLIST formats. However, for 2.0 I wanted to make Scrivener’s format less platform-specific. The current format has two main flaws:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;1) Its use of .plist and .rtfd files means it’s a format that can only be read on the Mac. Although I personally have no plans to switch to or code for other platforms, this would be a significant hurdle for anyone we wanted to work with to port Scrivener to, say, Windows.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;2) The .plist format is not human-readable - at least, not when used with the sort of data that Scrivener has to write out. This makes it difficult for anyone on any platform, including the Mac, to write utilities that might work with the Scrivener format.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;For these reasons, I am in the process of making the following changes to the .scriv package format:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;1) The .scriv package will no longer contain all files in the root folder. Instead, subdirectories will be used to make it easier to navigate. That way, should it be ported to a different platform that doesn’t support packages, it will be easy for the user to find the file required to open the project. And in general it’s just neater, of course.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;2) I will no longer use the RTFD format and will switch to using RTF instead. The only reason I didn’t use RTF to begin with was that Apple’s standard RTF reader and writer - the one provided in the Cocoa frameworks - ignores images. That is, it fails to load or save images in the text. Over the years this is something I’ve fixed myself, though, so I use a modified version of the RTF reader/writer to save and load RTF files that retain images with no problems. This not only means that all the text files stored inside a .scriv file are now platform-independent, but also that they are using a file format that has been around for over twenty years. It’s also a format that can be opened in a plain-text reader.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;3) Instead of using .plist files, I am creating my own XML file formats where applicable.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;(There are other changes too - for instance I am now using a checksum file that can tell which files have been changed since the last session; this means that should Scrivener crash, you will no longer be faced with the time-consuming “Synchronising…” panel, as Scrivener will be able to update only the search indexes for the files that have changed rather than going through every single file in the project.)&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Needless to say, writing my own XML file formats is the most time-intensive part of this process. Fortunately, Cocoa has some excellent and easy-to-use classes for generating and reading XML - the NSXML… classes. For instance, suppose I wanted to create the following XML:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&amp;lt;MyXMLFormat Foo=&amp;quot;Yes&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&amp;lt;Text&amp;gt;This is some XML.&amp;lt;/text&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&amp;lt;/MyXMLFormat&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;It’s as easy as this:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;NSXMLElement *myXMLElement = NSXMLElement alloc] initWithName:@&amp;quot;MyXMLFormat&amp;quot;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;[myXMLElement addAttribute:[NSXMLElement attributeWithName:@&amp;quot;Foo&amp;quot; stringValue:@&amp;quot;Yes&amp;quot;]];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;NSXMLElement *textElement = [[NSXMLElement alloc] initWithName:@&amp;quot;Text&amp;quot; stringValue:@&amp;quot;This is some XML.&amp;quot;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;[myXMLElement addChild:textElement];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;[textElement release];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;// Do something with myXMLElement, such as write it to disk using NSXMLDocument.&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;[myXMLElement release];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Still, I came across a couple of problems in writing my own XML, and that’s what I want to share with you here - the problems and the solutions.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 115%"&gt;&lt;strong&gt;Writing Less Code&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;The first aspect of working with an XML format in Cocoa I’m going to talk about isn’t actually a problem at all. It’s just that I’m lazy - I get bored of writing out the same things over and over again. The NSXML classes and methods are fantastic - they contain everything you need to read and write good XML - but they are also rather generic, designed to cover all uses. But for many common uses, this can mean writing more code. For instance, suppose you need to read the example XML above and you know that the MyXMLFormat element only has one &amp;lt;Text&amp;gt; sub-element; or, if it has more than one, your app can only handle one anyway so that either way all you really need to do is get the first child element named “Text”. Using the NSXML classes as is, this is easy enough but it takes a few lines of code:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;NSString *textString = nil;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;// Initialise the variable with nil.&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;NSArray *childElements = [myXMLElement elementsForName:@&amp;quot;Text&amp;quot;];&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;// Gets all of the child elements named &amp;quot;Text&amp;quot;.&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;if ([childElements count] &amp;gt; 0)&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;// Did we find &amp;quot;Text&amp;quot; sub-elements?&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;textString = [[elements objectAtindex:0] stringValue];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;if (textString != nil)&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;// do something.&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Pedants will note that I can easily reduce the string-reading part of the code above to two lines of code if I sacrifice a micron of readability:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;NSArray *childElements = [myXMLElement elementsForName:@&amp;quot;Text&amp;quot;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;NSString *textString = ([childElements count] &amp;gt; 0 ? [[elements objectAtIndex:0] stringValue] : nil);&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Still, as I say, I’m lazy. Why write two lines of code when you can reduce it to one? So I wrote my own NSXMLElement category to reduce the lines of code in my XML read/write classes. Here are the two methods that do the job:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;@implementation&lt;/span&gt;&lt;span style="font-size: 77%"&gt; NSXMLElement (KBAdditions)&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;- (&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSXMLElement&lt;/span&gt;&lt;span style="font-size: 77%"&gt; *)firstChildElementWithName:(&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSString&lt;/span&gt;&lt;span style="font-size: 77%"&gt; *)name&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSArray&lt;/span&gt;&lt;span style="font-size: 77%"&gt; *elements = [&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;self&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;elementsForName&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:name];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;if&lt;/span&gt;&lt;span style="font-size: 77%"&gt; ([elements &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;count&lt;/span&gt;&lt;span style="font-size: 77%"&gt;] == &lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0&lt;/span&gt;&lt;span style="font-size: 77%"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;return&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;nil&lt;/span&gt;&lt;span style="font-size: 77%"&gt;;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;return&lt;/span&gt;&lt;span style="font-size: 77%"&gt; (&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSXMLElement&lt;/span&gt;&lt;span style="font-size: 77%"&gt; *)[elements &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;objectAtIndex&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:&lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0&lt;/span&gt;&lt;span style="font-size: 77%"&gt;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;- (&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSString&lt;/span&gt;&lt;span style="font-size: 77%"&gt; *)stringValueOfFirstChildElementWithName:(&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSString&lt;/span&gt;&lt;span style="font-size: 77%"&gt; *)name&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSXMLElement&lt;/span&gt;&lt;span style="font-size: 77%"&gt; *element = [&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;self&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #26474B"&gt;firstChildElementWithName&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:name];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;return&lt;/span&gt;&lt;span style="font-size: 77%"&gt; (element != &lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;nil&lt;/span&gt;&lt;span style="font-size: 77%"&gt; ? [element &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;stringValue&lt;/span&gt;&lt;span style="font-size: 77%"&gt;] : &lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;nil&lt;/span&gt;&lt;span style="font-size: 77%"&gt;);&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;@end&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;(Note that I split it into two methods as sometimes you will not want only the string value but will want to get the whole element - for instance to examine its attributes. -firstChildElementWithName: does that, and -stringValueOfFirstChildElementWithName is just a convenience method that calls the former method and returns only its string value.)&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Now, to get the string value of the sub-element &amp;lt;Text&amp;gt; from &amp;lt;MyXMLFomat&amp;gt;, I only have to write one line of code:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;NSString *textString = [myXMLElement stringValueOfFirstChildElementWithName:@&amp;quot;Text&amp;quot;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Nice.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;This reduced how much code I had to write for reading my custom XML files, but I was still finding there was one sequence of code I was repeating quite a lot in the code for writing to XML. Again, consider the example from above:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;NSXMLElement *myXMLElement = NSXMLElement alloc] initWithName:@&amp;quot;MyXMLFormat&amp;quot;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;[myXMLElement addAttribute:[NSXMLElement attributeWithName:@&amp;quot;Foo&amp;quot; stringValue:@&amp;quot;Yes&amp;quot;]];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;NSXMLElement *textElement = [[NSXMLElement alloc] initWithName:@&amp;quot;Text&amp;quot; stringValue:@&amp;quot;This is some XML.&amp;quot;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;[myXMLElement addChild:textElement];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;[textElement release];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;// Do something with myXMLElement, such as write it to disk using NSXMLDocument.&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;[myXMLElement release];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;In this case the “Text” element is really basic - it contains only a string value and no attributes. Still, it takes three lines of code to add it:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;NSXMLElement *textElement = NSXMLElement alloc] initWithName:@&amp;quot;Text&amp;quot; stringValue:@&amp;quot;This is some XML.&amp;quot;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;[myXMLElement addChild:textElement];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;[textElement release];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Again, pedants will note that I can reduce this to one line if I really want:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;[myXMLElement addChild:[NSXMLElement alloc] initWithName:@&amp;quot;Text&amp;quot; stringValue:@&amp;quot;This is some XML.&amp;quot;] autorelease]];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;That’s not so bad. But what if I want to add an attribute to the element? In that case I have to go back to my original code so that I have a reference to the element to work with:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;NSXMLElement *textElement = NSXMLElement alloc] initWithName:@&amp;quot;Text&amp;quot; stringValue:@&amp;quot;This is some XML.&amp;quot;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;[myXMLElement addChild:textElement];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;[textElement release];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;[textElement addAttribute:[NSXMLElement attributeWithName:@&amp;quot;SomeElement&amp;quot; stringValue:@&amp;quot;SomeValue&amp;quot;]];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;So, I added another method to my NSXMLElement category:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;- (&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSXMLElement&lt;/span&gt;&lt;span style="font-size: 77%"&gt; *)addChildElementWithName:(&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSString&lt;/span&gt;&lt;span style="font-size: 77%"&gt; *)name stringValue:(&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSString&lt;/span&gt;&lt;span style="font-size: 77%"&gt; *)stringValue&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSXMLElement&lt;/span&gt;&lt;span style="font-size: 77%"&gt; *childElement = [[&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSXMLElement&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;alloc&lt;/span&gt;&lt;span style="font-size: 77%"&gt;] &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;initWithName&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:name &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;stringValue&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:stringValue];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;[&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;self&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;addChild&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:childElement];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;return [childElement auto&lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;release&lt;/span&gt;&lt;span style="font-size: 77%"&gt;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;This adds the child element for me, creating it using the name and string value passed-in, and then returns a reference to the child element that was added. So now, to add the &amp;quot;Text&amp;quot; element, I can just do this:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;[myXMLElement addChildElementWithName:@&amp;quot;SomeElement&amp;quot; stringValue:@&amp;quot;SomeValue&amp;quot;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;And if I need to add an attribute, that’s easy too:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;NSXMLElement *textElement = [myXMLElement addChildElementWithName:@&amp;quot;SomeElement&amp;quot; stringValue:@&amp;quot;SomeValue&amp;quot;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;[textElement addAttribute:[NSXMLElement attributeWithName:@&amp;quot;SomeElement&amp;quot; stringValue:@&amp;quot;SomeValue&amp;quot;]];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;My code is tidier and easily readable; I’m happy.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;The other XML class I decided to write a category for was NSXMLDocument. To load an XML document from file, I need to do this:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;NSXMLDocument *xmlDoc = [&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;[NSXMLDocument alloc]&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;initWithContentsOfURL&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:url &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;options&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:&lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;NSXMLNodePreserveWhitespace&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;error&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:&amp;amp;error];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;I need the “preserve whitespace” option because otherwise Cocoa’s XML loader will obliterate any return and tab characters, and obviously I want to preserve them. (Although I use RTF for saving the text of files, there may be plain text representations of the text in some files - for instance, in the search.indexes file - and the user may have entered a tab or return in some other locations that get saved in the XML file.) However, sometimes I found that this could return nil unless I also passed in the NSXMLDocumentTidyXML option to tidy up any malformed XML (obviously I’m working hard to ensure that Scrivener can’t &lt;em&gt;generate&lt;/em&gt; any malformed XML, but there are instances in the program where it may need to try to read some, and equally obviously I need to ensure that it doesn’t fail to read projects in the event that it has created some dodgy XML somewhere). But you wouldn’t normally want the NSXMLDocumentTidyXML option passed in, because it wipes leading tab characters among other things; you only want to use it (or I did in this case) if there is a problem reading the XML document &lt;em&gt;without&lt;/em&gt; this option. In other words, I want to initialise an NSXMLDocument with  the NSXMLNodePreserveWhitespace option, but if that fails I want to try again using NSXMLDocumentTidyXML. That’s easy enough:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;NSXMLDocument *xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:url options: options:NSXMLNodePreserveWhitespace error:&amp;amp;error];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;// Did it fail? If so, try passing in the tidy option in case it failed because of malformed XML.&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;if (xmlDoc == nil)&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="font-size: 77%"&gt;[[NSXMLDocument alloc] initWithContentsOfURL:url options: options:NSXMLNodePreserveWhitespace|NSXMLDocumentTidyXML error:&amp;amp;error];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;if (xmlDoc == nil)&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;// If it still didn’t work, log an error.&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;[[NSAlert alertWithError:error] runModal];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;That does the job nicely, but rather than have three lines of code every time I need to do this, I can reduce it to one by separating the above out into an NSXMLDocument category:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;- (&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;id&lt;/span&gt;&lt;span style="font-size: 77%"&gt;)initWithContentsOfURLPreservingWhitespace:(&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSURL&lt;/span&gt;&lt;span style="font-size: 77%"&gt; *)url error:(&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSError&lt;/span&gt;&lt;span style="font-size: 77%"&gt; **)error&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;if&lt;/span&gt;&lt;span style="font-size: 77%"&gt; (&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;self&lt;/span&gt;&lt;span style="font-size: 77%"&gt; = [&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;self&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;initWithContentsOfURL&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:url &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;options&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:&lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;NSXMLNodePreserveWhitespace&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;error&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:error])&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;return&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;self&lt;/span&gt;&lt;span style="font-size: 77%"&gt;;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;self&lt;/span&gt;&lt;span style="font-size: 77%"&gt; = [&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;self&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;initWithContentsOfURL&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:url &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;options&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:&lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;NSXMLNodePreserveWhitespace&lt;/span&gt;&lt;span style="font-size: 77%"&gt;|&lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;NSXMLDocumentTidyXML&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;error&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:error];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;return&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;self&lt;/span&gt;&lt;span style="font-size: 77%"&gt;;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;@end&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;So, again, I have less code to maintan in all of my XML reading objects:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;NSXMLDocument *xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURLPreservingWhiteSpace:url error:&amp;amp;error];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;if (xmlDoc == nil)&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;// If it still didn’t work, log an error.&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;[[NSAlert alertWithError:error] runModal];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;That’s the convenience methods built to aid and abet my laziness out of the way. But I had a bigger problem.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 115%"&gt;&lt;strong&gt;Dealing with invalid XML characters&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Scrivener users paste text in from Word and other sources, and some of that text is going to end up in my XML files - maybe because the user copied some Word text into a document title, or maybe into the text itself, which will have a plain-text representation saved in the search.indexes XML file. The trouble is, it turns out that not all Word characters are valid XML characters. Not all &lt;em&gt;characters&lt;/em&gt; are valid XML characters, period. I discovered this when trying to load a project that had been converted to use XML and having it fail with an XML reading error message about “invalid pcdata char value 12” or some such. After some poking around, I discovered that this was caused by a page break character - Cocoa’s NSFormFeedCharacter - occurring in the text. The text is stored as RTF on disk - that part is fine - but also has a plain text representation saved in the search.indexes XML file. And that was the problem; the unicode character used for NSFormFeedCharacter (0x000c) made the XML reader choke when trying to load the search indexes table from the XML file. So I took the path of least resistance and wrote a shoddy method that removed all form feed characters from the plain-text version of any text that got saved in the search indexes XML file, making a mental note to look into it further later as I knew that couldn’t be the only character that would cause problems. Sure enough, a while later another file refused to load - and this time it was some other random Word character that had been pasted in that was causing the problems. The character appeared as some odd symbol in Scrivener and isn’t supported by the text system anyway, but when saved in the XML file it would cause the XML reader to choke and fail to open the file.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;That was when I started doing some more digging around and came across this:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;a href="http://cse-mjmcl.cse.bris.ac.uk/blog/2007/02/14/1171465494443.html"&gt;http://cse-mjmcl.cse.bris.ac.uk/blog/2007/02/14/1171465494443.html&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Wich in turn led me to the XML specs:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;a href="http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char"&gt;http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;It turns out that there are whole ranges of unicode characters that make for invalid XML, and I had wrongly assumed that the NSXML classes would take care of all of this for me when they won’t. As specified in the specs above, valid unicode ranges for XML files are:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Char&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;   ::=   &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;/* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;The invalid characters aren’t the sort of thing you are likely to be using in your document titles or text anyway, but that doesn’t mean they can’t appear in Scrivener documents when pasted in from other sources (such as Word). And it turns out that the NSXML classes will allow you to &lt;em&gt;write&lt;/em&gt; any string value, but will fail when you try to &lt;em&gt;read&lt;/em&gt; a string value that contains invalid XML characters.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;In other words, the Cocoa classes leave it up to the individual developer to ensure that whatever he is writing to XML contains only valid XML characters. So the trick now was to write an NSString category method that would clean up any strings to be written to XML by removing any characters that fell within the invalid XML ranges. I hacked something together based on the web page mentioned above, essentially going through a string character by character and checking it didn’t fall within the invalid ranges, but it threw up some odd warnings and, although it seemed to work, I knew it wasn’t very efficient. Thinking that I might need some low-level C magic to build an NSString out of unichars or some such (can you tell that I’m a high-level Cocoa guy?), I asked for advice on the Cocoa developer lists (&lt;a href="http://lists.apple.com"&gt;lists.apple.com&lt;/a&gt;), which are an amazing resource. There, the always helpful Jens Alfke (thank you, Jens!) pointed out I could specify ranges of unicode characters using NSMutableCharacterSet, which was something I had completely missed and which led to the solution, namely:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;• Build a character set containing all of the unicode characters that are valid XML as specified in the XML specs.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;• Invert this character set so that we have another character set containing all of the &lt;em&gt;invalid&lt;/em&gt; characters, and keep this character set around in memory so that it only ever needs creating once (because we don’t want to go through the process of creating it and adding all the character ranges every time it is required, which could be a lot).&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;• Check to see if the passed-in string contains any of the invalid characters contained in the character set.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;• If not, the string can be used as-is.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;• If it does contain invalid XML characters, though, go through it looking for all invalid characters and remove them.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;The resulting NSString category method is below:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;@implementation NSString (XMLMethods)&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;- (&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSString&lt;/span&gt;&lt;span style="font-size: 77%"&gt; *)validXMLString&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;// Not all UTF8 characters are valid XML.&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;// See:&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;// &lt;/span&gt;&lt;span style="font-size: 77%; color: #0E0EFF"&gt;&lt;a href="http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char"&gt;http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;// (Also see: &lt;/span&gt;&lt;span style="font-size: 77%; color: #0E0EFF"&gt;&lt;a href="http://cse-mjmcl.cse.bris.ac.uk/blog/2007/02/14/1171465494443.html"&gt;http://cse-mjmcl.cse.bris.ac.uk/blog/2007/02/14/1171465494443.html&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;&lt;/a&gt; )&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;//&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;// The ranges of unicode characters allowed, as specified above, are:&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;// Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;//&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;// To ensure the string is valid for XML encoding, we therefore need to remove any characters that&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;// do not fall within the above ranges.&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;// First create a character set containing all invalid XML characters.&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;// Create this once and leave it in memory so that we can reuse it rather&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;// than recreate it every time we need it.&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;static&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSCharacterSet&lt;/span&gt;&lt;span style="font-size: 77%"&gt; *invalidXMLCharacterSet = &lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;nil&lt;/span&gt;&lt;span style="font-size: 77%"&gt;;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;if&lt;/span&gt;&lt;span style="font-size: 77%"&gt; (invalidXMLCharacterSet == &lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;nil&lt;/span&gt;&lt;span style="font-size: 77%"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;// First, create a character set containing all valid UTF8 characters.&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSMutableCharacterSet&lt;/span&gt;&lt;span style="font-size: 77%"&gt; *xmlCharacterSet = [[&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSMutableCharacterSet&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;alloc&lt;/span&gt;&lt;span style="font-size: 77%"&gt;] &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;init&lt;/span&gt;&lt;span style="font-size: 77%"&gt;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;[xmlCharacterSet &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;addCharactersInRange&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:&lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;NSMakeRange&lt;/span&gt;&lt;span style="font-size: 77%"&gt;(&lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0x9&lt;/span&gt;&lt;span style="font-size: 77%"&gt;, &lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;1&lt;/span&gt;&lt;span style="font-size: 77%"&gt;)];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;[xmlCharacterSet &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;addCharactersInRange&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:&lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;NSMakeRange&lt;/span&gt;&lt;span style="font-size: 77%"&gt;(&lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0xA&lt;/span&gt;&lt;span style="font-size: 77%"&gt;, &lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;1&lt;/span&gt;&lt;span style="font-size: 77%"&gt;)];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;[xmlCharacterSet &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;addCharactersInRange&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:&lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;NSMakeRange&lt;/span&gt;&lt;span style="font-size: 77%"&gt;(&lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0xD&lt;/span&gt;&lt;span style="font-size: 77%"&gt;, &lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;1&lt;/span&gt;&lt;span style="font-size: 77%"&gt;)];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;[xmlCharacterSet &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;addCharactersInRange&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:&lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;NSMakeRange&lt;/span&gt;&lt;span style="font-size: 77%"&gt;(&lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0x20&lt;/span&gt;&lt;span style="font-size: 77%"&gt;, &lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0xD7FF&lt;/span&gt;&lt;span style="font-size: 77%"&gt; - &lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0x20&lt;/span&gt;&lt;span style="font-size: 77%"&gt;)];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;[xmlCharacterSet &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;addCharactersInRange&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:&lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;NSMakeRange&lt;/span&gt;&lt;span style="font-size: 77%"&gt;(&lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0xE000&lt;/span&gt;&lt;span style="font-size: 77%"&gt;, &lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0xFFFD&lt;/span&gt;&lt;span style="font-size: 77%"&gt; - &lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0xE000&lt;/span&gt;&lt;span style="font-size: 77%"&gt;)];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;[xmlCharacterSet &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;addCharactersInRange&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:&lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;NSMakeRange&lt;/span&gt;&lt;span style="font-size: 77%"&gt;(&lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0x10000&lt;/span&gt;&lt;span style="font-size: 77%"&gt;, &lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0x10FFFF&lt;/span&gt;&lt;span style="font-size: 77%"&gt; - &lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0x10000&lt;/span&gt;&lt;span style="font-size: 77%"&gt;)];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;// Then create and retain an inverted set, which will thus contain all invalid XML characters.&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;invalidXMLCharacterSet = [[xmlCharacterSet &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;invertedSet&lt;/span&gt;&lt;span style="font-size: 77%"&gt;] &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;retain&lt;/span&gt;&lt;span style="font-size: 77%"&gt;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;[xmlCharacterSet &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;release&lt;/span&gt;&lt;span style="font-size: 77%"&gt;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;// Are there any invalid characters in this string?&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSRange&lt;/span&gt;&lt;span style="font-size: 77%"&gt; range = [&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;self&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;rangeOfCharacterFromSet&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:invalidXMLCharacterSet];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;// If not, just return self unaltered.&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;if&lt;/span&gt;&lt;span style="font-size: 77%"&gt; (range.&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;length&lt;/span&gt;&lt;span style="font-size: 77%"&gt; == &lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0&lt;/span&gt;&lt;span style="font-size: 77%"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;return&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;self&lt;/span&gt;&lt;span style="font-size: 77%"&gt;;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #007400"&gt;// Otherwise go through and remove any illegal XML characters from a copy of the string.&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;NSMutableString&lt;/span&gt;&lt;span style="font-size: 77%"&gt; *cleanedString = [&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;self&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;mutableCopy&lt;/span&gt;&lt;span style="font-size: 77%"&gt;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;while&lt;/span&gt;&lt;span style="font-size: 77%"&gt; (range.&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;length&lt;/span&gt;&lt;span style="font-size: 77%"&gt; &amp;gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0&lt;/span&gt;&lt;span style="font-size: 77%"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;[cleanedString &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;deleteCharactersInRange&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:range];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;range = [cleanedString &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;rangeOfCharacterFromSet&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:invalidXMLCharacterSet&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;           &lt;/span&gt;   &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;options&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:&lt;/span&gt;&lt;span style="font-size: 77%; color: #1C00CF"&gt;0&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;            &lt;/span&gt; &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;range&lt;/span&gt;&lt;span style="font-size: 77%"&gt;:&lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;NSMakeRange&lt;/span&gt;&lt;span style="font-size: 77%"&gt;(range.&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;location&lt;/span&gt;&lt;span style="font-size: 77%"&gt;,[cleanedString &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;length&lt;/span&gt;&lt;span style="font-size: 77%"&gt;]-range.&lt;/span&gt;&lt;span style="font-size: 77%; color: #5C2699"&gt;location&lt;/span&gt;&lt;span style="font-size: 77%"&gt;)];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 77%; color: #AA0D91"&gt;return&lt;/span&gt;&lt;span style="font-size: 77%"&gt; [cleanedString &lt;/span&gt;&lt;span style="font-size: 77%; color: #2E0D6E"&gt;autorelease&lt;/span&gt;&lt;span style="font-size: 77%"&gt;];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;@end&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;So now I can ensure that I’m writing valid XML by passing any strings written to XML through my -validXMLString method:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 77%"&gt;NSXMLElement *fooElement = [[NSXMLElement alloc] initWithName:@&amp;quot;Foo&amp;quot; stringValue:[[binderDoc title] validXMLString]];&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Phew. Now I can get back to finishing Scrivener’s new internal XML generators confident that they won’t end up creating any projects that refuse to open because of bad XML.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;P.S. I apologise for the really poor formatting of the code on this page - no matter what I try, I can’t get Blogger to format it nicely. I’ve tried &lt;a href="http://formatmysourcecode.blogspot.com"&gt;http://formatmysourcecode.blogspot.com&lt;/a&gt; and other methods, but no matter what it just looks rubbish. If you know of a good way of formatting code so that it doesn’t look terrible on Blogger, please let me know (I’d love to make it automatic in Scrivener’s “Copy as HTML” code too).&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-8373555567249659096?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/8373555567249659096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=8373555567249659096' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/8373555567249659096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/8373555567249659096'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2010/02/coding-xml-formats-in-cocoa_05.html' title='Coding XML Formats in Cocoa'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-8243847561827608225</id><published>2010-02-04T22:44:00.001Z</published><updated>2010-02-04T23:02:46.917Z</updated><title type='text'>Why I Hate Sky But Quite Like David</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;p&gt;Grr, Sky! Grr, Cornwall! (The sky I am referring to is the corporation owned by devil-incarnate Rupert Murdoch*, by the way, and not the most excellent canopy, the brave overhanging firmament, the majestical roof fretted with… Not the actual sky, I mean.)&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Despite the year being 2010 (2010! Where’s my hovercar? Where’s my robot butler?), thanks to the Cornish infrastructure, my broadband connection is capped at 1.5MB per second. Mr Internet tells me it’s capable of 2.5MB (woo!), but is for some reason limited to 1.5. (Perhaps this snail-like connectivity is because the Cornish generally distrust anything fast - SUCH AS DRIVING ABOVE 15MPH, for instance. Seriously, a 17 year-old in a Mini told me to slow down the other day because I was doing 30 in a residential area. This English county - just provoking the locals there - is as strange as it is beautiful. But then after thirteeen years of living in London, I still haven’t got used to people being friendly and generally chilled out, and I still retain some of that city-dweller’s tendency of thinking that everyone else is just in my way.)&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Why is my internet connection in any way interesting, you ask? It’s not, but it is frustrating when you try to download the iPad (iPhone) SDK, which is 2Gb in size (and downloading is the only way you can get it, as far as I can see). And it’s even more frustrating when Sky Broadband suddenly reduce their 80Gb monthly usage to 10Gb without telling you and then keep cutting off your internet connection when the download gets to 1.9Gb. Thanks, Sky. The conspiracy theorist in me can’t help but think there is something intentional in this - after three attempts at downloading I was already at half of my monthly usage allowance, and it’s only the start of the month - and if I go over again the prices go up. Of course.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Maybe I wouldn’t mind if Sky had ever provided a half-decent service, but have you actually tried using a Sky+ box? It’s as though they kidnapped Sir Clive Sinclair from the past, fresh from inventing the ZX81, stopped off in the early nineties to pick up parts, and then locked him in a room to knock the thing together without bothering to tell him about any technological advance since Teletext. I swear it’s &lt;a href="http://www.abovetopsecret.com/forum/thread61544/pg1"&gt;John Titor&lt;/a&gt; all over again. I don’t know why I’m surprised by this - after all, the Sky box was designed by Amstrad. Using Amstrad technology as the basis for the country’s most popular (um, &lt;em&gt;only&lt;/em&gt;) satellite television box is a little like giving the troops on the front hum-vees built on the chassis of Robin Reliants. Oh look, it’s raining - the signal’s down. (Pity I live in Cornwall, then.) Oh look - it’s just turned itself off again. Oh look - it’s frozen on Peter Andre’s face for the past hour. But living in Cornwall you either use Sky or put up with four channels of drivel rather than a hundred (note to Richard Branson: hurry up and install cable down here you b*****d!). And I need those extra channels if only to pretend I’m not loving &lt;em&gt;Glee&lt;/em&gt; or really looking forward to the new series of &lt;em&gt;Supernatural&lt;/em&gt;, and so that I can bitch in an informed way about how rubbish &lt;em&gt;Caprica&lt;/em&gt; is and how Ron Moore should be made to wear a hair-shirt and personally apologise to everyone on the planet for his crimes against Good Endings That Don’t Make Me Want To Thrust Pencils Into My Eyes. Oh wait, some readers don’t like me mentioning that, best move on…&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;But anyway. Thanks to David, who since joining Literature &amp;amp; Latte has consistently won Employee of the Month &lt;em&gt;every single month&lt;/em&gt;,** for saving the day by downloading a copy of the SDK and getting it to me on DVD the very next day. (Even the British postal system is better than you, BSkyB!)&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Which is really just a roundabout way of saying that I now at least have the iPhone SDK (the one capable of iPad development), so I can take a look and make a more informed judgement on future possibilities for Scrivener when I get some time. This doesn’t change anything in the short-term, of course - Scrivener for the Mac remains my number one priority, Scrivener 2.0 will take up all my development time for the next few months, and I have no intention of doing anything that will have a long-term negative impact on the Scrivener I use and love myself. But it can’t hurt to take a peek, can it?&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;* I’m pretty sure Omen 3 was a Murdoch biopic sent back through time from the future.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;** Can you guess how many employees we have?&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-8243847561827608225?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/8243847561827608225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=8243847561827608225' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/8243847561827608225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/8243847561827608225'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2010/02/why-i-hate-sky-but-quite-like-david.html' title='Why I Hate Sky But Quite Like David'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-3663491138214484713</id><published>2010-02-04T16:31:00.003Z</published><updated>2010-02-05T10:25:24.629Z</updated><title type='text'>Stardust and Inciting Incidents</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Just to warn those who read this blog purely for Scrivener-related news: this post is only tangential to Scrivener, as it’s about my own fumbling attempts at writing (for which I use Scrivener, obviously), so you can safely tune out if you don’t like reading self-indulgent prattle.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;One of the reasons I created Scrivener in the first place was that, over the years, in the process of attempting to write a novel I had written a lot of scenes, snippets and ideas but had no idea how they all fitted together into anything like a coherent whole. Rather naively, I believed that if I kept plugging away at writing down those ideas and scenes, one day something would magically “click”, and in my Eureka moment I would suddenly just &lt;em&gt;know&lt;/em&gt; how everything I had written so far fitted together into a tightly interwoven whole that would win me the Booker Prize for sure.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;As I say - naive; as though by working on the parts the whole would somehow assemble itself without much conscious effort on my part. Nowadays I understand that this would be the same as attempting to come up with a writing program by building a corkboard, an outliner, a word processor, and so on, and then hoping that how they all fitted together would just come to me while I was pondering the curious blue hair of the old lady sitting in front of me on the bus. Suffice to say, that’s not how I designed Scrivener. Sure, there were some small things I knew I wanted in Scrivener beforehand, but it took a lot of design to figure out how it all fitted together. (The defunct Scrivener Gold, an early beta of Scrivener, &lt;em&gt;didn’t&lt;/em&gt; fit together. It had four separate interfaces for doing different things. In fact, I wrote &lt;a href="http://lit-n-lat.blogspot.com/2006_06_01_archive.html"&gt;a whole series of blog posts&lt;/a&gt; about my quest to work out a decent integrated interface. And Scrivener 2.0 integrates some of the features that don’t work so well together in 1.0. In other words, that design has taken years and is still ongoing.)&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;When, after a decade of halted attempts at finding what I was really writing &lt;em&gt;about&lt;/em&gt;, that hoped-for Eureka moment still hadn’t come, I started thinking that maybe I would be able to figure out how everything fitted together if only I could get a good overview of everything. I wanted an easy way of assigning a synopsis to each of my ideas and scenes; I wanted to be able to move these synopses around as a way of moving the underlying text around; I wanted to be able to see the whole, the parts, or just an overview, and to work with each. I’ve covered &lt;a href="http://lit-n-lat.blogspot.com/2006_05_01_archive.html"&gt;the conception of Scrivener in depth&lt;/a&gt; before, but what I’m saying here is that I thought that by getting an overview of the whole I would start seeing how everything fitted together. Well, Scrivener has been around several years now, and although I have certainly got much further along in my projects since having Scrivener, I still end up stumbling at this point: where is it going? How &lt;em&gt;does&lt;/em&gt; this fit together?&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;You’re probably ahead of me: just because you wrote it and used the same character names doesn’t mean it’s part of the same story. I wanted to pour everything into one story - the only problem being that I had no story.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Part of the problem is that over the years I’ve grown attached to some pieces of writing I’ve done that really don’t belong anywhere. Now, I’ve been very lucky in that developing Scrivener has brought me into contact with professional, published authors who have been very generous with their time and advice. (Yes, my dialogue with some users goes something like this: Author: “Hey, thanks for Scrivener. Just started using it for my new book and it’s really useful.” Me: “Great! Wait, you’re a published author?” Author: “Er, yes…” Me: “Tell me everything you know about the masonic secrets of writing a novel! Help!”) I used to be terrified of published authors, as in terms of what they have achieved they represent everything I hope for, so I’ve always put the very notion of a published author up on a pedestal, but it turns out that they’re human beings who use e-mail and are often really, really nice. Who’d have thunk it? And pretty much all of the authors whose time I have stolen have told me this in one form or another: KILL YOUR DARLINGS. It’s old advice, they say, and it’s really difficult to follow, but it’s good, sage advice. It’s taken me a long time to accept it, but they are of course right. I may be attached to all those passages of purple prose I wrote in my twenties, but really, if I’m just trying to find a place to slot them in so I can use them somewhere, I’m not really thinking about what this particular story needs, am I? And I’m certainly not &lt;em&gt;writing&lt;/em&gt;. If anything, I’m avoiding it by trying to reuse old stuff. For instance, there’s one passage I wrote years and years ago about a girl being born in the hour when the clocks go back, when BST becomes GMT again. I was really proud of that passage. It had all these phrases that at the time I considered dead clever, such as “edited from the spool of time by the scissoring of clock hands” and others you’d probably laugh at. Even after the birth of my first child six years ago I clung to it, despite now knowing that its description - and my younger self’s understanding -  of birth was woefully inaccurate. From that passage you would have thought that birth was something like a scene from &lt;em&gt;Alien&lt;/em&gt;. Oh, and for years I was desperate to find a use for this sentence: “The precipitation precipitated his capitulation.” Oscar Wilde eat your heart out. Hell, I might still use that one, actually. Anyway, my point is simply this: I was going at everything backwards; “arse-about-tit” in the proverbial phrase. I was trying to construct a story out of parts that had been written randomly with no story in mind. Imagine a painter folding up the canvas into tiny squares, painting something that appealed to him or her on each segment, and then unfolding it and trying to figure out what the hell sort of picture could be painted around the edges to make sense of a ten-foot pillbox, a bonsai tree, Medusa in a tutu and a purple duck. Same thing.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Like many would-be-writers-but-probably-won’t-bes, one of my fondest pastimes is procrastination. Indeed, some have pointed out that I have taken procrastination to whole new levels - I decided that before I could write The Novel, I had to spend several years writing The Software in which to write it. (For the record, this blog post is itself procrastination.) And one of my favourite forms of procrastination is reading books &lt;em&gt;about&lt;/em&gt; writing. (As any wannabe-writer knows, this is priceless - you can trick yourself into believing that you are furthering your writing efforts even though you really know that you are doing exactly the opposite because you are reading a book on writing instead of, y’know, actually &lt;em&gt;writing&lt;/em&gt;.) For the longest time I rejected all ideas about structure, narratology, acts, and so on; and I was - and still am, if to a slightly lesser extent - sceptical of any approach to writing that tries to give you a formula. Still, in my desperation I’ve recently been a little more open to taking on board ideas about approaching structure, and I have found some things particularly useful. For instance, I found &lt;a href="http://contour-at-the-movies.com/"&gt;Jeffrey Alan Schechter&lt;/a&gt;’s assertion that in most stories the protagonist goes through four stages of character development (orphan, wanderer, warrior, martyr) particularly insightful. It sounds like one of those rigid paint-by-numbers formulas until you realise that all he is really saying is that a protagonist changes over the course of a story - he or she starts off in need of something and ends up having to make sacrifices to get it after all the easy options have been exhausted. The four archetypes are just a way of hammering into your head that you need to think about how your character is changing over the course of the story, and you can see them operating in the character arc of almost any movie or story. (Jeffrey, incidentally, is the guy behind &lt;a href="http://www.marinersoftware.com/sitepage.php?page=138"&gt;Contour from Mariner Software&lt;/a&gt;, and there is a lot of other great stuff in his Contour theory.) But I’ve also been more open to the things you get told just &lt;em&gt;must&lt;/em&gt; be in a story, whereas before my fingers were placed firmly in my ears as I sang, “La, la, formula-la-la-la-la, not listening.” And the one thing that everyone agrees on is this:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;There must be an inciting incident.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Well, duh. That’s just a posh way of saying, “Something has to happen,” right? Except, I think I only recently realised how little importance I had attached to perhaps the most crucial part of working out my story. In his superb &lt;em&gt;On Writing&lt;/em&gt;, Stephen King says that most of his books  start with a “What if?” situation and then he writes the book to find out what happens as a natural outcome of that initial premise. And despite having read that, and despite all those authors I’ve hounded having told me that they usually start from something similar - whether they plan every little detail before they write or just make it up as they go along - I seem to have stumbled through years of failed writing attempts thinking, “I’ll worry about that later; if I just start with these characters and this location, something’s bound to happen…” Unsurprisingly, the things that tended to happen were all a bit jumbled and didn’t go anywhere. Then, I recently came across this site:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;a href="http://thedarksalon.blogspot.com"&gt;http://thedarksalon.blogspot.com&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;It’s the blog of American suspense and horror writer Alexandra Sokoloff. There’s absolutely loads on there - she used to be a Hollywood screenwriter, so a lot of it is about using screenwriting methods in writing fiction. One thing I found really useful, though, was her suggestion - which she repeats again and again - that if you’re stuck with a story, watch several of your favourite films and read several of your favourite books in your genre, breaking them down and making lists of very specific things. For instance, you might break down the structure of each one - she suggests using the eight-sequence structure such as the one described by Chris Soth and some other Hollywood screenwriters. Or you might just be looking at how the romance subplot is handled, or how plants and payoffs work - whatever it is you’re stuck on. Her main point, I think, is that if you’re going to use any sort of formula, it should be one that you work out on your own, based on your own favourite stories - because presumably they are what made you want to write stories in the first place. Now, these suggestions appealed no end to the procrastinator in me - not only do I get to read books (and websites) about writing and tell myself I’m working, but now I get to watch movies too (notebook in hand, of course). Brilliant! So I tried her suggestion.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;At this point, you may be reading this and thinking, “Wow, you really are the most useless wannabe novelist I have ever come across. Just &lt;em&gt;get on with it&lt;/em&gt; already!” I wholeheartedly agree. Although I would ask you, why are you reading this and not writing yourself, huh? Huh? So if you’re not thinking that and are instead one of the pitiful creatures like me who will try anything to help you get past three chapters before giving up in despair, you may find this useful. (Did I mention that you get to watch movies and pretend you’re &lt;em&gt;working&lt;/em&gt;? Genius.) I got a lot out of it. For a start, I found that identifying the structure in the films and books I liked best made me less afraid of structure as a concept. A couple of authors have told me that although they would hate to outline their whole novel, they use sort of “stepping stones” - that is, they have something like ten or twenty sentences or questions written down that guide them along as they write the story; rough markers that give them something to head for. Actually looking for these markers (set-pieces, I suppose) in stories I liked, and thinking about how the rest of the story built towards them, was something I found really helpful. Everyone knows that if you want to write you have to be a reader first, but normally when I read I’m not thinking about how it all fits together - I’m just getting sucked into the story. Stepping back and looking at certain specific elements as I read or watched (rather from memory) was an eye-opener. Which brings me back to…&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;The inciting incident.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Everything I watched and read that I loved had a really well-crafted inciting incident. I say “crafted” because I doubt the writers were as lazy as I hoped to be and had the inciting incident fall wholesale out of the sky into their laps. Oh, I bet some of the inciting incidents came to them out of nowhere, but then they surely must have crafted them to do a lot more work. The one that struck me as absolutely brilliant in its elegance, though, was the one in &lt;em&gt;Stardust&lt;/em&gt; (film or book). I’m not normally a fan of fantasy or anything even vaguely romantic, but hey, the film has Claire Danes and Robert de Niro in it… Actually, I love the film. Don’t get me wrong, Neil Gaiman’s book is great, but &lt;em&gt;Stardust&lt;/em&gt; the film gives me the same great warm-inside feeling as &lt;em&gt;The Princess Bride&lt;/em&gt;. Hmm, I probably shouldn’t be admitting to any of this in public. Whether you like the film or not, though, its inciting incident is perfect in that one single event kicks off the main plot and every subplot, putting into place all of the conflicts that will drive the narrative through to its conclusion. Namely:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;The dying King of Stormhold, having several sons remaining alive, which is against tradition (they are supposed to kill each other), throws the “power of Stormhold” - a gem on a necklace - out of the window and declares that the first male heir to retrieve it will take his place as king. This being a fairy tale, the stone soars into space and hits a star, which plummets down to earth. Three witches witness the star’s fall, as does Tristan, the protagonist, who in trying to woo the uppity Victoria declares that he will retrieve it for her in return for a kiss. (If you haven’t seen the film, this all sounds rather sickly, I know - trust me, it’s a fun story. I mean, it includes Robert de Niro doing the can-can in a dress.) The star hits the ground over in the faery kingdom of Stormhold - and it’s a beautiful girl; turns out stars in this world can take the form of people. So, with that one action - the throwing of the stone - everything is set up: Tristan is going to travel into the faery kingdom to fetch the star, and we know he is going to find a girl, not a lump of stone - and we already hope that he ditches Victoria for the star; the King’s sons are now out on a quest to find the stone, which the star possesses, and we have seen that one of them in particular is murderous; and we soon learn that the three witches want to cut out the star’s heart because eating it will restore their youth.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;You may not like the story itself, but I hope you’ll at least agree that this is a great inciting incident in the way it sets everything in motion. It made me realise how little I’d thought about the inciting incident in my own novel; in fact, it made me realise that I had several small, not-particularly-exciting inciting incidents that were only vaguely connected and that this was one of the big reasons why the various subplots I had been working on didn’t seem to gel very well. So, in light of this, I’ve gone back to the drawing board and am now looking at my various plot threads and working backwards to see how they could all have been fired off by the &lt;em&gt;same&lt;/em&gt; inciting incident rather than different ones. I printed off the synopses of a lot of my ideas (yes, Scrivener 2.0 supports the printing of synopsis index cards) and am going through them with a fresh eye. It’s made me realise that I have too many &lt;em&gt;What Ifs&lt;/em&gt; for one story, and by thinking more carefully about the inciting incident I’m actually starting to see which plot threads and characters just don’t belong in this particular story, no matter how much I like them. It’s hard, but I’m determined to kill my darlings.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;And it’s still a bit arse-about-tit, I admit, but at least it &lt;em&gt;feels&lt;/em&gt; like progress. &lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;P.S. While I’m at it, I’ll just put in a plug for a couple of Scrivener-using authors who regularly touch on various aspects of writing on their own blogs:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;a href="http://www.davidhewson.com"&gt;http://www.davidhewson.com&lt;/a&gt; - David’s book &lt;em&gt;The Blue Demon&lt;/em&gt; is out tomorrow and is the first book he wrote from start to finish in Scrivener (even though his books adorn shelves all over the world, it still took this one two years to get from final draft to publication, apparently).&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;a href="http://www.neil-cross.com/wordcount"&gt;http://www.neil-cross.com/wordcount&lt;/a&gt; - Neil’s past couple of books have been written in Scrivener and he is now documenting the process of writing his next on his “wordcount” blog.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;(I’m sure both would be appalled to read the above and realise that, despite the great advice they have handed out to others and to me personally over the past couple of years, I am still a fumbling simpleton when it comes to my own writing.)&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-3663491138214484713?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/3663491138214484713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=3663491138214484713' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/3663491138214484713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/3663491138214484713'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2010/02/stardust-and-inciting-incidents.html' title='Stardust and Inciting Incidents'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-2715082997998711579</id><published>2010-02-01T01:05:00.010Z</published><updated>2010-02-01T14:50:55.844Z</updated><title type='text'>The iPad and Mac Development</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;So. The iPad. (You may have heard of it. It’s a neat little gadget Apple released last week without much fanfare.) There are commentators out there declaring it the world’s most expensive Etch-a-Sketch (unfair; it has no stylus), and others praising it as being as “magical” and “revolutionary” as Steve Jobs and Jonathan Ive would have us believe. My own opinion on the device is somewhat schizophrenic (in the colloquial sense, obviously). I’m split between my thoughts as a user and my thoughts as a Mac developer.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Most of what follows is my thoughts on, and reaction to, the iPad from my perspective as a Mac developer. That is, as a developer rather than as an end-user, and specifically as a developer who has dedicated the past several years to developing an application for the &lt;em&gt;Mac&lt;/em&gt; platform. My views on the iPad as a Mac developer are different from my views as an end-user. I think it’s important to establish this up front, in case what follows comes across as me bashing the iPad before it’s even in stores. Far from it. As an end-user, my reaction can be summed up as: “Pretty cool for a &lt;em&gt;lot&lt;/em&gt; of people!” As someone who works on a writing and organisational program for the Mac, my reaction is, in short: “Oh bum.”&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;So, just for the record: I like the look of the iPad. I think it could turn out to be a fantastic device for consuming media and information (which is what it is for - more on that below). The main problem with computers as they currently exist is that they make many otherwise intelligent people feel like idiots. No one has to write to customer support just to work out how to use their television. Part of our job as developers is to make our programs as easy to use as possible - I’d go so far as to argue that this is in fact the hardest part of our job. (“What do you mean you don’t understand why the outliner button is greyed out? It makes sense to me, and I designed it!”) And it’s sometimes tough to admit that if more than one user is getting frustrated by an element of your program, then it’s probably a design flaw. (Note: 2.0 has a more fluid and integrated approach to the outliner, corkboard and Edit Scrivenings buttons - no more arbitrary greying out. Also note: If anything confuses you about Scrivener, I will still never admit it’s a design flaw.) With the iPad, Apple have thought about what most users actually &lt;em&gt;do&lt;/em&gt; with their computers and tried to make the resulting device as easy to use as possible. That has to be applauded, not least by those of us who spend time trying to help family members troubleshoot computer problems. In that regard, I think this guy nails it:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;a href="http://speirs.org/blog/2010/1/29/future-shock.html"&gt;http://speirs.org/blog/2010/1/29/future-shock.html&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;But if you’re reading this, you probably don’t care much about whether or not the iPad will result in me receiving fewer phone calls from family members with computer issues; what you most likely want to know is what impact the iPad has on Scrivener, if any.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;The first user-request for an iPad version of Scrivener came before Steve Jobs had even finished speaking - I don’t think he’d even got to the part about iBooks yet. (Just for the record, we developers have no inside information - we are just as much the “little guys” to Apple as everyone else.) Since then there has been a steady trickle of requests for a version of Scrivener that runs on the iPad. This is as understandable as it is inevitable. I have long objected to an iPhone version of Scrivener because Scrivener’s interface just would not scale down to the iPhone screen real-estate, and a scaled-down version of Scrivener that had to drop all of the features for which I created it in the first place always struck me as pointless. Moreover, I don’t see the iPhone as a serious writing tool anyway; it’s something for taking notes on when you’re out and about, sure, but for that you can use the brilliant &lt;a href="http://www.hogbaysoftware.com"&gt;WriteRoom&lt;/a&gt; and then import your notes into Scrivener using the simpletext.ws importer. (Yes, I know I’m a bit late in getting 1.54 out, which updates writeroom.ws to simpletext.ws, and many apologies for that - 2.0 has been taking up all my time, but 1.54 hasn’t been forgotten and will be out soon.) I’m also not averse to working with other iPhone developers to offer compatibility with other note-taking or outlining apps (quite the contrary - feel free to contact me if you are such a developer). But the iPad is a different beast isn’t it? After all, there is a keyboard dock for the iPad and Apple have even ported iWork, so how can my objections to an iPhone version hold up when it comes to the iPad?&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;So yes, you may quite reasonably be wondering: Are there any plans for an iPad version of Scrivener? And if not, why not?&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;The short answer to the first question is: Not at the moment. But I’ll attempt to give a full answer to both.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Before I continue, I’ll say again: what follows is my opinion as a &lt;em&gt;Mac developer&lt;/em&gt;. My opinion as a gadget-geek and &lt;em&gt;user&lt;/em&gt; is somewhat different, and will follow at the end. Sorry, but I have to reiterate this simply because I know from bitter experience that there is a minority of folk who vociferously take to task anyone whose words can be interpreted as constituting even the slightest attack on Apple (my partner once wrote a piece for a national UK newspaper - which was unfortunately poorly sub-edited - that dared to suggest Apple were a little too tight-lipped when it came to certain ongoing product defect and support issues at the time, and the ugly comments left by a handful of dolts on the otherwise brilliant MacRumors still make me ashamed to be of the same species as the commenters to this day) - though of course I’m sure this doesn’t apply to you, good reader. Right, enough prefatory apologies.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 115%"&gt;&lt;strong&gt;The iPad as Netbook Killer&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Mac users (note: &lt;em&gt;Mac&lt;/em&gt; users - Windows and Linux users have plenty of options) have been craving an Apple netbook for years now. The nearest thing they were given was the MacBook Air, which was a disappointment to many - myself included - partly because of its utter lack of connectivity unless you used wireless and paid-for adapters. Mainly, though, the problem was that it wasn’t cheap - certainly not cheap enough to become a college kid’s knockabout machine - and it wasn’t much smaller than a MacBook - just thinner. So thin, you could fit it in an envelope - it just had to be a &lt;em&gt;big&lt;/em&gt; envelope.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;(Another quick aside here: I’m not one of the users who have been craving an Apple netbook. I love my MacBook. It is my favourite machine ever, and given how much I loved my old iBook that is quite an achievement. But then I don’t keep it in my rucksack much - it gets plugged into my monitor and external keyboard during the day for development and writing, then taken downstairs and plonked on my lap in the evening so I can search IMDB to find out who the heck that actor on TV is, you know, the guy who was in thingy, with whatsherface. So as a &lt;em&gt;user&lt;/em&gt; I am more than catered for; I’m happy. But as a developer, I have to take into account what other users are after, and how that affects Scrivener.)&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Even after the Air, then, Mac users have been hoping for some sort of netbook. Something light, affordable, and with a 10” screen and keyboard. (A bunch of other users have been hoping for a tablet, but mainly for art and graphic design work, which is something the &lt;a href="http://www.axiotron.com/index.php?id=modbook"&gt;ModBook&lt;/a&gt; at least provides, even if Apple aren’t making money from it - it’s an entirely different sort of tablet to the iPad.) There is an elephant in the room here - a very small and possibly illegal elephant. I’m hesitant to mention it in case anyone misinterprets my doing so as condoning behaviour that violates Apple’s EULA (I’m not), but to omit it would be ignoring an important indicator that there is demand for a Mac netbook. I’m talking, of course, about the significant number of people who, fed up with lugging their MacBooks around and waiting for Apple to provide them with something smaller, have resorted to using a so-called “hackintosh” - that is, hacking OS X onto an existing Intel netboook such as a Dell mini 10v. These are otherwise loyal Apple users (although the idea of “brand loyalty” is rather sickly, isn’t it? May as well be loyal to a genus of flowering begonia), people who haven’t used anything but Macs for many years, who don’t want to use anything other than Mac OS X, but who just want something smaller on which to run their applications when out and about - writers on research field trips, students moving between lectures all day.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Did the iPad deliver what these users wanted?&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Well, yes and no.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;To quote Steve Jobs from his keynote speech:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;“Everybody uses a laptop and/or a smart phone. And the question has arisen lately, is there room for a third category of device in the middle? Something that’s between a laptop and a smart phone? And of course we’ve pondered this question for years as well. The bar’s pretty high. In order to really create a new category of devices, those devices are going to have to be far better at doing some key tasks... Better than the laptop, better than the smartphone. What kind of tasks? Things like browsing the web... Doing e-mail. Enjoying and sharing photographs. Video... Enjoying your music collection. Playing games. Reading e-books. If there’s going to be a third category of device, it has to be better at these tasks than a laptop or a smart phone, otherwise it has no reason for being. Now, some people have thought that that’s a netbook. The problem is, netbooks aren’t better at anything. [Cheers and laughter of recognition from the audience, who have cleary thought exactly the same thing for many years now.] ... They’re just cheaper than laptops.”&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;(Digression: Honestly, if Steve Jobs had a sense of humour, after revealing the name of his latest product he would wait until the inevitable whooping and cheering had died down and reveal a steaming pile of faecal matter, or a dead kitten or something. I swear the crowds at these things more and more think they are at a U2 concert. But then I’m English, and to us a stroke of the chin accompanied by a muted, “Hmm, interesting,” could be considered over-effusive.)&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;The moment Steve Jobs opened his keynote with the above words (not the digression about the faecal matter and dead kitten, obviously; the bit about netbooks), my heart sank. It was as clear a statement as we’re going to get that Apple has no interest in entering the netbook market; at least, not with an actual &lt;em&gt;netbook&lt;/em&gt;. So is Mr Jobs right? Is a netbook really no better than a laptop or smart phone at &lt;em&gt;anything&lt;/em&gt;? Within the parameters he set above, I’d have to agree with him; the iPad is indeed probably better than a netbook - &lt;em&gt;at the tasks he listed&lt;/em&gt;. But you’ll note that the list of tasks he gave excludes any kind of content &lt;em&gt;creation&lt;/em&gt;. (Yes, later in his speech he showed off iWork for the iPad, but that was given to the team to “see what they could do”, and content creation was &lt;em&gt;not&lt;/em&gt; on his list of essential tasks at which this new device should excel. I would say that is important, and telling.)&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;So, for the sake of argument, and ignoring for a moment the lists given on many other sites about multitasking and video conferencing and suchlike, what &lt;em&gt;do&lt;/em&gt; netbooks do better than laptops from the point of view of the average Scrivener customer?*&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;1) Most importantly of all, they are smaller, lighter, more portable. (Great! - So is the iPad.)&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;2) They still allow you to type fast on a small keyboard. (Okay - so does the iPad, although you’ll need to carry around the keyboard and assemble it - fine for writing in coffee houses, but not so good if you need to write on your lap for any length of time, I’d wager. Of course I could be proved wrong on this - maybe the dock is particularly sturdy and good at balancing on knees.)&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;3) Despite their lightness and portability, you can still run your preferred OS, and therefore most of your preferred programs on them. (Ah…)&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;So, again, did all of those Mac users who wanted a netbook device - a more portable &lt;em&gt;Mac&lt;/em&gt; - get what they wanted? Well, it depends. Yes (in a way) and no.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Yes, Apple delivered a small, light, affordable and portable device. It takes some extra assembly to add a decent keyboard, but you can type on it, and &lt;a href="http://www.suntimes.com/technology/ihnatko/2017907,ihnatko-ipad-hands-on-012810.article"&gt;accordingly to initial reports&lt;/a&gt; it responds well to fast touch-typing.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;But also no - because Mac users cannot run Mac OS X on Apple’s answer to the netbook. And thus they cannot run their favourite applications unless those applications are rewritten for the iPhone OS, which is what the iPad uses.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;In other words, Mac users hoping for a Mac netbook are, frankly, out of luck. If you were after a more mobile device that runs Mac OS X,  it still doesn’t exist - and although I hope I’m proved wrong, Mr Jobs seemed strongly to imply that it never will, because the iPad is their rebuttal to the very existence of the netbook; Steve Jobs doesn’t like netbooks, so you’re not getting one. But then, does it really matter that the iPad doesn’t run OS X? (Obviously not if you’re not a Mac user anyway, but what if you are?) After all, it does almost everything else, doesn’t it? Well, again, it depends. I would imagine that to the vast majority of people, no, it doesn’t matter one jot. Apple has provided a device that may well bring them even more customers - the iPhone wasn’t something limited to the Mac community, and likewise, the iPad has a global appeal. No Windows user is likely to object to it because it’s a Mac and they don’t like Macs - because it &lt;em&gt;isn’t&lt;/em&gt; a Mac. In a sense, in terms of computers, the iPad is platform agnostic - no one worries that their phone OS doesn’t run the same OS as the one on their computer, and by not pidgeon-holing this device as a Mac, Apple are not limiting their latest computing device to users of Mac computers. Quite the opposite - with the iPad they are after the same general user-base they achieved with the iPod and iPhone - it doesn’t matter what OS you are accustomed to on your main computer, because this device is intended as something &lt;em&gt;different&lt;/em&gt;. This is something new that is dedicated to making the access of all that content out there easy and convenient; it fits &lt;em&gt;between&lt;/em&gt; a smart phone and a computer.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;However, no matter how you look at it, it’s not a Mac netbook, and thus to those hoping to have the full Mac experience on a mobile device - to those who use their computers predominantly to &lt;em&gt;create &lt;/em&gt;content and who therefore wish to run a full range of Mac productivity applications without pared-down feature-sets - that surely does matter. For those users, the iPad is not a viable alternative to a netbook. Such users are almost certainly in the minority, I absolutely understand that, and perhaps the point of the iPad is that computers were built for content generation and finally here is something for everyone else. So, the number of computer users who spend more time generating content (outside of the day job, that is) than consuming it must be a minority to begin with. And of those, most will be happy to use a desktop or laptop machine for content generation, and an iPad for general browsing and the odd bit of note-taking. It’s only the minority of the minority who will now still long for a more mobile laptop on which they can run the whole host of Mac apps. I still wish there was something coming for them, though - not least because a good number of Scrivener users seem to fall into that very minority.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;And for me, as someone who develops for the Mac platform, it also matters. How much does it matter? I don’t know yet. Why do I keep asking myself rhetorical questions? Maybe I’m lonely. But I digress (again). Nobody can possibly know how much it matters because it’s not even in the stores yet. Half the pundits are declaring that the iPad is going to be a runaway success and every home will have one while the other half are saying it’s a damp squib that fails to be either computer or smart phone, neither fish nor fowl, and so is surely utterly pointless. It’s too early to know if either side will be right or something inbetween will be true. Whatever the outcome, even at this early stage it would be irresponsible not to consider the implications of the iPad for my own Mac application, especially with so many users already clamouring for Scrivener-for-the-iPad.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 115%"&gt;&lt;strong&gt;Mac Development and the iPad&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Okay, I’ll admit it: when I saw that what everybody had expected all along had actually been realised - that the iPad was essentially a large iPod Touch - I was gutted; gutted because of the implications for Scrivener, which currently runs only on the Mac. Perhaps the biggest disappointment and frustration for me as a developer is that, in a way, I feel that Apple’s decision to use the iPhone OS for a tablet that is ostensibly intended as an entry into the netbook niche of the market (rather than saying straight up that it is something completely &lt;em&gt;different&lt;/em&gt; to a netbook) is a bit of a two-fingers-up to us indie Mac developers; developers who have been quietly contributing great applications (at least, I like to &lt;em&gt;think&lt;/em&gt; Scrivener is a great application…) to the Mac platform, and who have even persuaded users of other platforms to switch (I’ve lost count of the number of users who have e-mailed me to say that they bought a Mac just to use Scrivener - perhaps the biggest compliment of all). Getting people to switch is irrelevant to Apple in the case of the iPad, though, because it’s not a Mac, so hasn’t set out to rival Windows at all; its stroke of genius is that it sets out to replace a hardware solution (the netbook) and by adopting the iPhone OS instead of Mac OS X it raises itself above platform partisanship; it transcends the Mac/Windows divide.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;I should step back a little here and explain what I mean by “indie development”, because this isn’t something that everyone realises about us. Often when we think of a software company, we tend to think of offices and cubicles and a handful of sweaty developers being hounded by a line manager, a PR team, some techies giving phone support and advertising folks on the other side of the office writing copy about how they are producing the “funnest” thing ever or suchlike. Or, at least, that’s what I used to think of when I thought of software companies. But that image is only true of the larger software houses (although I’m sure none of their coders are sweaty and many may even shower daily). Many software companies aren’t like that at all - we aren’t. If you’ve read our &lt;a href="http://www.literatureandlatte.com/about.html"&gt;About page&lt;/a&gt;, you’ll know that we are just two guys. I wrote Scrivener because it was the tool I wanted for my own writing - in fact, I taught myself to program just so I could create Scrivener. I didn’t study programming at university (I studied history and medieval literature, since you asked). I’m only a “professional” programmer in the sense that it is now my full time job (since I gave up teaching because Scrivener had taken off). David came on board to help out with all the non-coding stuff (for a large pay cut, so he could work with his friend - which would be me). He’s not a programmer either (he studied physics, since you’re so nosey). There are no Literature &amp;amp; Latte offices. My office is a spare room in my rented home, with a view of the garden and the occasional dog-walker in the fields earmarked for housing estate development opposite. David’s office is his garage. (No snow days for him.)&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;The great thing about the Mac is that this sort of one-guy-and-maybe-a-friend software development is still feasible. Years ago a lot of software was written by only a couple of guys - the old ZX Spectrum games, for instance; even the first versions of Final Draft. But it’s getting more and more difficult for a single person to code and maintain a complex application for a large enough user-base. We could argue all day about Apple’s faults, but one of the great things about Apple is that they have really fostered a strong independent development community. There are some wonderful independently-developed apps on Windows, don’t get me wrong, but I’d argue that it takes Windows developers a lot more time and money to polish them up to a high spec, and to do so they have to pay for a lot of third-party frameworks and development tools. On the Mac, all your development tools are free, so you can try developing software even if you don’t know whether or not you’ll ever make a penny back, and you don’t have to think about start-up costs. At all. And the development tools are fantastic, a real pleasure to use. Even better, because Apple have control over all their hardware, you know that as long as you follow their guidelines and test your app on all the versions of OS X you want to support, it should then work the same on the computer of every user out there. Windows programmers don’t have it nearly so good.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;So why is the iPad being based on the iPhone OS such a potential problem for Mac indie developers, in my own humble opinion?&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Because suddenly our Mac apps don’t run on all the machines a user might &lt;em&gt;expect&lt;/em&gt; them to run on. Because those of us with only one programmer are now faced with the demand for supporting two viable &lt;em&gt;computing&lt;/em&gt; platforms. We could debate the semantics of whether the iPad is indeed a computer or not, but initial murmurs would indicate that there are a good number of users out there who want to use it that way, if only as a secondary platform to their main workstation or laptop.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Wait, surely the iPhone and iPad are teeming with applications from independent developers, so how can this be a bad thing for indie development? Well, yes. That’s true. I’m not trying to say that Apple aren’t still fostering a strong independent development community, because they clearly are - it’s just on a different platform, no longer the Mac. And it’s a fantastic thing for all those iPhone developers out there; I envy them the excitement they must be feeling right now about the iPad, along with all the software houses who have the resources to start thinking about an iPad version of their flagship programs straight away, &lt;a href="http://blog.omnigroup.com/2010/01/29/ipad-or-bust/"&gt;such as the excellent Omni Group&lt;/a&gt;. But as an independent &lt;em&gt;Mac&lt;/em&gt; developer, here’s the thing: The iPhone and iPod Touch are undoubtedly small mobile platforms - in the smart phone category - and even if users ask from time to time for a scaled-down version of their favourite app to run on them, no one really expects to do any serious work on them - that has until now been left to Mac OS X, which was - &lt;em&gt;was&lt;/em&gt; - Apple’s &lt;em&gt;computing &lt;/em&gt;operating system. But building the iPad on the iPhone OS and then declaring that it is intended as something to replace netbooks, and by providing a keyboard accessory and porting iWork, their own main productivity suite, to it, Apple have changed the game. The resulting implication is this: either you build an iPhone/iPad version of your application, or you miss out on all the users that wanted a netbook and so bought the iPad - because the iPad is Apple’s answer to the netbook.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;That’s a pretty big blow, so I’m going to reiterate it: Mac users have been clamouring for an Apple netbook for years now. Users have been wanting something with a 10” screen that they can throw in their bag, something smaller, lighter and easier to haul around than a 13” MacBook. And I think it’s fair to say that everyone expected that, were Apple to introduce such a device, more users would come over to the platform from Windows. I get requests for a Windows version of Scrivener nearly every day, and along with price the other main reason many of these Windows users cite for not wanting to buy a Mac is size - they want a small, cheap netbook for college, something they can throw in their bag and carry between classes without shoulder-ache, for instance. They don’t want to carry a MacBook - it’s portable, but not something you want weighing on your shoulder all day. They want something smaller.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Well, this week Apple told us all, “You didn’t know it, but all along you didn’t want a netbook at all. This is what you wanted.” And then they introduced just such a cheap, portable device - but it won’t be bringing users over to OS X, at least not directly. So all those of us who develop for the Mac won’t see anything of those Windows users who are tempted by the iPad unless we switch our allegiances to the iPhone OS. And even worse, there are plenty of Mac users who have been putting up with a MacBook (which they consider too clunky) who are now talking about ditching their MacBooks in favour of an iPad. We could in fact &lt;em&gt;lose&lt;/em&gt; users. On the other hand, as apparently happened with the iPhone, the iPad may draw users to the Mac platform &lt;em&gt;in&lt;/em&gt;directly - Windows users may buy an iPad, fall in love with it and discover that the nearest full computing experience is Mac OS X. Only time will tell.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;So, there’s my dilemma. As a user, I think the iPad looks like a wonderful gadget, and I think it is going to be welcomed by the vast number of people who get frustrated by the often apparently arcane nature of computers - the people it’s &lt;em&gt;for&lt;/em&gt;. I’m looking forward to trying one out myself, especially once they get iBooks running in the UK (I hope that’s the plan). As a developer, &lt;a href="http://ow.ly/11rFF"&gt;it makes me want to scream&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Projecting forward into the murky and unfathomable future, another concern must be whether or not this augurs anything for Apple’s long-term commitment to Mac OS X. Jonathan Ive has clearly stated that he sees the iPad as the future, the right direction for Apple. I’m not saying it’s a bad direction, but I do wonder where that will leave those of us still tied to traditional platforms such as OS X in five years’ time. Again, it’s too early to say; only Apple really knows what the future is for these platforms. But I think I’m justified in being a little worried about the implications of Apple’s netbook solution not running OS X for those of us who have dedicated ourselves to providing software for that platform. Will there ever be a Mac OS 11? And if there is, will it be a version of the iPhone OS? Or are we heading the same way the games industry has headed, with a handful of people using full computers to create content that is then delivered to closed devices (as with games programmers who write for the Playstation or Xbox, for instance)?&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Before I’m accused of overreacting, let me just say that I don’t for one minute think that Apple &lt;em&gt;intended&lt;/em&gt; this as a big-two fingers-up at its indie Mac development community. Of course not. Apple are just doing what they do - working on great technology with the end-user in mind, and they are right to do that, because that is ultimately their job. I’m merely expressing how this step &lt;em&gt;feels&lt;/em&gt; as an independent Mac developer without the resources to support multiple platforms - because at the end of the day, the iPad (and iPhone) is, to all extents and purposes, another platform.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;So, onto the reality of getting Scrivener onto the iPad.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 115%"&gt;&lt;strong&gt;Will Scrivener Come to the iPad?&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Well, were the iPad running OS X, or even a stripped-down version of OS X, a port would have been a no-brainer. (There is a common misunderstanding that the iPhone OS &lt;em&gt;is&lt;/em&gt; just a stripped-down version of OS X; it’s not. They both use some of the same core libraries and are built around Objective-C and an AppKit - Cocoa. But the classes available for use in each are very different. For instance, Scrivener’s text input is a highly customised version of Apple’s NSTextView. It uses a modified version of its rich text system. The iPhone has no such thing - it has a UITextView, which doesn’t even support rich text. Scrivener’s binder is a customised version of NSOutlineView. But the iPhone doesn’t support outline views at all to the best of my knowledge. The only way to navigate trees on the iPhone is by drilling down into tables. These may seem superficial UI differences, but the differences go much deeper. As I’m not overly familiar with the iPhone frameworks (yet) I’m sure someone else could explain the differences better, but suffice to say it’s not a case of just changing a few lines of code and rebuilding.) But given that the iPad is not running OS X, right now I can’t see a way for us to produce an iPad version of Scrivener in the near future. Not because I’m not interested in such a thing - although I am reserving judgement until I hold one of these things in my hands. Practicalities, however - the dreaded Real World - get in the way. So, below are some of the reasons why we are not planning an iPad version just yet.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;1) Resources. We’re not Apple, we’re not Omni. As I say, there’s just me and David. Scrivener is a niche product - it has a whole bunch of users who are kind enough to rave about Scrivener, but not so many that we’re driving around in sports cars. So, we can’t afford to hire someone else to code Scrivener-for-the-iPad. But if I try to code it myself, then what happens to Scrivener-for-the-Mac? Realistically, I can’t do both - or at least, I can’t do both well. Scrivener is a big program, very complicated internally, with hundreds of thousands of lines of code. And there are still months of development to do on Scrivener 2.0. For me to develop a version of Scrivener for the iPad would mean abandoning Scrivener for the Mac (at least temporarily, but even after an initial release my time would then have to be divided), then learning to code for the iPhone OS, and then designing and building a mobile version of Scrivener. That’s not great for Mac users of Scrivener, even the ones who want an iPad version. (Oh, and did I mention I created Scrivener so I could use it myself? I really would like to get that novel written one of these days, too.) Perhaps the eventual ideal solution - should the iPad turn out to be a viable writing environment, which still remains to be seen - would be to team up with an iPhone/iPad developer who uses, understands and loves Scrivener and wants to give us huge swathes of the profits for his or her work (ha). But the problem there is that I’m a perfectionist control freak and like to keep control over everything that goes into Scrivener, so that’s not as straightforward as it seems. (In other words, I’m hell to work with; just ask David.)&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;2) Design. Is the sort of writing for which Scrivener is designed really the sort of thing for which the iPad will be used? In a way, the iPad - like the iPhone - is a notebook, a Moleskine, but Scrivener is the typewriter and corkboard, the book of clippings, the ring-binder - the stuff that requires more space. You might pull out your notebook in a café or on the train, you might even shuffle some index cards, but you wouldn’t spread your index cards out, label them, reshuffle your whole manuscript, pull out your clippings folder and lay out images and reference documents while you write in such locations - all the tasks that Scrivener takes up screen-space doing, the things it was built to do. You take your notebook with you when you’re working on a book, but not your whole ring-binder. Writing a long text is still for the most part something you do at a desk. Laptops enable you to take that desk with you; the iPad is very deliberately &lt;em&gt;not&lt;/em&gt; the entire desk. It is stripped down, something to read, to play games on, for playing music and videos, and in a pinch you can use it to take down some notes or throw a document together if you really need to. Trying to force Scrivener onto something like the iPad seems to me to be missing the point of both Scrivener and the iPad itself. I am ready to be proved utterly wrong on this, but these are my impressions based on the way the iPad was presented to us in the keynote (see the section below on &lt;em&gt;The iPad From a User’s Perspective&lt;/em&gt;), and until it hits stores that’s all I have to go on.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;3) Inclination. I created Scrivener because it was the program I wanted to use for my writing - although Scrivener is now a business which pays my and David’s wages, hippy-at-heart that I am, money still isn’t my chief motivation for continuing the development of Scrivener. I do it because I know it could still be better, there are things I want to refine and get really &lt;em&gt;right&lt;/em&gt;. But I love my MacBook; it’s the ideal writing machine for me. I can’t see myself ever using an iPad for serious writing - no, I haven’t seen one yet, but I write this with my MacBook on my lap with my fingers comfortable on a decent-sized keyboard and that works for me. So, I can get excited about the iPad for many things - for iBooks (maybe), for casual browsing, for watching videos - but not for use as a writing machine. Many Scrivener users may disagree and see the iPad an ideal writing platform, but if I haven’t the motivation - if I’m just doing it because I think I might make a quick buck - then I’m not qualified to do it right. (I know what you’re going to say: maybe the iPad isn’t good for all your writing, but what about notes and ideas while you are out and about? Well, again, in that case you could use something like WriteRoom and bring your notes into Scrivener later - there would be no advantage of having a version of Scrivener just for that.)&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;4) Scaling Scrivener down. This would be a massive feat in itself. It may sound simple - just do less! But it doesn’t work like that. And would a scaled-down version of Scrivener even be Scrivener? Would it do any more than other writing or notebook apps? Moreover, users are bound to disagree over what would be essential in a pared-down Scrivener. One user would argue it should just be a corkboard linked to notes; another would suggest it should be an outlining app, and yet another a table that allows navigation through text documents. Could the iPad even handle a .scriv file package? And what about users who have .scriv files of hundreds of megabytes - even gigabytes - in size?&lt;span style="color: #FF0000"&gt; &lt;/span&gt; I can’t answer that yet. But I don’t relish the idea of cutting any of the features I built Scrivener to have, let alone starting from scratch. So the jury’s still out. In fact, that’s worth clarifying, as the difference between operating systems and the problems involved in porting software programs between them isn’t something that’s necessarily immediately obvious to end-users. Getting Scrivener to run on the iPad is not just a matter of taking the existing code base and cutting here, modifying there. I’m sure some of the code could be reused, but for the most part we are talking about having to write a completely new version of Scrivener from the ground up for a new platform.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;5) The Touch interface. Although Scrivener is predominantly a writing application, a lot of the structural work is done with the mouse, or by tabbing around views and using keyboard shortcuts and the arrow keys to achieve the same effect. On the iPad, like the iPhone, this sort of manipulation is done using your fingers. While iPhone apps such as &lt;a href="http://carbonfin.com"&gt;CarbonFin Outliner&lt;/a&gt; do a wonderful job at providing a full outliner in small environment, even on the larger screen of the iPad something such as Scrivener’s binder would be severely limited. Because you would need to use your fingers to manipulate the rows, moving items around would either be frustratingly fiddly or the rows would need to be so large that you wouldn’t be able to see many of them on screen at any one time. And given that one of Scrivener’s purposes is to allow you to step back to get an overview of your project, I’d say that’s not an insignificant problem. Think of all the features that would need rethinking: the binder, the way keywords, label and status are assigned in the different views, references, dragging between different folders that are far apart in the structure, and so on. In other words, not only would Scrivener need rewriting from the ground up, but as the Mac version is built to take full advantage not only of screen real estate but also of the keyboard and mouse, its whole interface - the very way the user interacts with the documents and meta-data on screen - would need completely redesigning for the touch interface.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;6) I’m admittedly not a big fan of the App Store, because it’s a closed shop. Either Apple accept your app and put it on the store, or you can’t sell or distribute it. And Apple’s criteria for accepting and rejecting applications for the iPhone are notoriously nebulous and apparently whimsical. I certainly don’t relish the prospect of spending a year developing an iPad version of Scrivener only to have it rejected (perhaps because it is seen as competing with Pages or suchlike). Without transparency to the acceptance/rejection process, there’s no way of knowing in advance what problems you may run into. I have already read that Apple used a number of private APIs to create Pages for the iPad, for instance - but other developers have their apps rejected for using private APIs. Even legitimate workarounds can be rejected, though - one developer I know had an update to his app rejected from the App Store because it used HTML to render editable rich text, and Apple apparently wouldn’t allow this - meaning that only Apple are currently able to create apps capable of editable rich text on the iPhone. So while the App Store setup has worked very nicely for plenty of developers, it’s just not the sort of commercial environment I’m crazy about entering. I much prefer everything being open to all. I’ve nothing against Apple having their own store and limiting the products available there to only the ones they approve, but I don’t like the idea of that being the &lt;em&gt;only&lt;/em&gt; way a user can access your application.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;So, if you’re a user hoping for an iPad version of Scrivener in the near future - I’m sorry, but for all of the above reasons there are no plans in place yet. It’s not because we have anything againt the iPad - quite the opposite. Like many, I’m rather excited about the iPad. But even if there were an enormous audience for an iPad version of Scrivener and we were thus denying ourselves a fortune in not developing it (as a couple of enthusiastic users have insisted - perhaps not quite realising just how much of a niche application something like Scrivener is), this is sadly beside the point - because it’s not a matter of refusal but of being realistic about the resources we have available right now, and how to use those limited resources to best serve the user-base that is Scrivener’s foundation. Still, that’s not to say we aren’t interested in what happens with the iPad - we are, and we remain open-minded. How interested? Well, I have at least signed up for the iPhone OS developer program and ordered a book on iPhone development, if only out of curiosity and to see what is possible - to keep our options open for the future. Were it possible to develop something that didn’t take years (people often seem to understimate just how much work and code is involved in creating and maintaining a program of Scrivener’s scope) and required little maintenance (that’s &lt;em&gt;never&lt;/em&gt; possible), so that it didn’t detract from the full Mac version of Scrivener, then who knows what could happen?&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: 115%"&gt;&lt;strong&gt;The iPad From a User’s Perspective&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;As I’ve said above, as an end-user, I like the look of the iPad. I could never get excited about the iPhone - I don’t use mobile phones much, and for the little gaming I do these days I much prefer my PS3 or XBox. I bought an iPod Touch and what I really like about it is being able to browse the web - for reading, not posting - in bed or wherever, without having to prop up my laptop. For me, this is where the iPad is going to shine. I can use it for reading online papers in as comfortable a position as I read real papers, and I can watch movies more easily while travelling; but then I usually read print papers and don’t travel much, so in reality I probably wouldn’t have as much use for an iPad at all (I used these same justifications when buying my iPod Touch and I don’t use it as anything more than a regular iPod. On the other hand, I could keep an iPad on my coffee table especially for those IMDB searches.) But I do like the &lt;em&gt;look&lt;/em&gt; of it, just because it looks like the sort of thing I imagined to be futuristic as a kid. Give me a hovercar and a robot butler to go with it, and I’m happy.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Perhaps the most salient point I have heard made about the iPad is that it wasn’t really designed for us content &lt;em&gt;producers&lt;/em&gt; anyway. To recap on Steve Jobs’ list of key tasks for the iPad:&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;• Browsing&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;• Email&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;• Photos&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;• Video&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;• Music&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;• Games&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;• eBooks&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;With the exception of writing e-mails, everything on this list involves the &lt;em&gt;passive&lt;/em&gt; use of a computer. It’s not about &lt;em&gt;getting things done&lt;/em&gt;. It’s a reference device. It’s the &lt;em&gt;Hitch-hiker’s Guide to the Galaxy&lt;/em&gt; made real, and Ford Prefect didn’t write directly into his copy of the Hitch-hiker’s Guide - that’s not what it’s &lt;em&gt;for&lt;/em&gt;. Because of the Scrivener support forums, I spend as much time posting to the internet as reading from it - but that’s not average use. Most users of the web spend more time reading than writing - and even heavy Twitter and Facebook users will have no problem firing off short messages with the iPad’s virtual keyboard. Likewise using the iPad to send e-mails to family and friends will be just as natural as sending texts. I spend my day on abortive attempts at writing a novel, writing code, and writing support e-mails. The iPad isn’t aimed at that sort of computer use. Why should it be? Almost every other computer in existence has been designed for producing content rather than specifically for devouring it, and yet there are vast amounts of people out there who just browse the net, write the occasional short e-mail, listen to music and so on. Sure, they may spend all day writing documents in Word and hammering out e-mails, but that’s &lt;em&gt;work&lt;/em&gt;. At home the iPad may be ideal for them. And if they really need to write a letter or something a little longer they can always use Pages and the keyboard dock. Someone pointed out to me that this sort of computer use just hasn’t really been catered for until now, and it strikes me they’re right; you don’t need a four-track recorder to listen to a record or a typewriter to read a book, after all, but until now it has been computer-to-do-everything or nothing at all (or a smart phone). In that regard, the iPad could be a killer, and if enough users see it in that way then it could well be as revolutionary as Apple hope - it’s finally something really affordable and usable for the computer user who doesn’t really like computers.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;(I’m still not convinced about iBooks. The idea of reading for long periods from a backlit screen really isn’t appealing. iBooks itself looks beautiful - but then it would, &lt;a href="http://www.washingtonpost.com/wp-dyn/content/article/2010/01/27/AR2010012704221.html"&gt;because so does Delicious Monster&lt;/a&gt; - but the beauty of the reading environment has little to do with reading itself; for reading, all you need is something that isn’t going to strain your eyes and a good font. But maybe it’s aimed at the casual reader who just wants to read a couple of pages on the train to work, who knows?)&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;So. The iPad.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;My final thought on the iPad as a netbook replacement is simply this: does it really &lt;em&gt;have&lt;/em&gt; to be either/or? Is the iPad really a &lt;em&gt;replacement&lt;/em&gt; for the netbook, a better solution for everything a netbook can do, or is it really something &lt;em&gt;different&lt;/em&gt; to a netbook, something better at some of the common tasks we use all computers for? Couldn’t Apple have created the iPad for consumers of content and still created a smaller MacBook running OS X for &lt;em&gt;producers&lt;/em&gt; of content? Why not give Mac users, their most loyal customer base, what they have been hoping for &lt;em&gt;as well&lt;/em&gt; as bringing a fantastic browsing and reading experience to the wider public with the iPad? It seems a particular shame given all the streamlining work that went into Snow Leopard - 10.6 seemed a surefire contender as a netbook OS. Sadly, the answer may be simply that the iPod and iPhone have given Apple a taste of the big time, and have made Mac users less important to the company as a target demographic. After all, why target 5% of potential users when you can target 100%? The result is that the iPad is a great device for casual computer users regardless of the platform they are used to, but Mac users are still left in the cold without a really portable Mac and independent Mac developers have to face the possibility of losing existing MacBook-using customers as well as potential switchers. Or perhaps ultimately all of this speculation will turn out to be no more than a storm in a teacup; the iPad could become wildly popular as a means of reading and browsing while writers and other creators continue to use their Macs for the act of creation itself. And who knows, maybe all that work on streamlining Snow Leopard wasn’t for nothing - we can’t rule out its appearance on a netbook entirely. Remember what Steve Jobs said about the Kindle and e-reading?&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;Incidentally, if you were wondering what that strange sound was throughout your reading of this rambling post, it’s nothing to worry about; it was just the sound of my knee jerking uncontrollably.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;(On the plus side, this post was written in Scrivener and copied to Blogger using Scrivener 2.0’s new “Copy Special &gt; Copy as HTML” feature.)&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;*NOTE: There is no such thing as an “average” Scrivener customer. They are all extraordinary. Did I mention we have a paid update coming out this year?&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-2715082997998711579?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/2715082997998711579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=2715082997998711579' title='94 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/2715082997998711579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/2715082997998711579'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2010/02/ipad-and-mac-development.html' title='The iPad and Mac Development'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>94</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-1616446433751992631</id><published>2010-01-29T12:11:00.002Z</published><updated>2010-01-29T12:25:15.714Z</updated><title type='text'>J.D. Salinger</title><content type='html'>&lt;p&gt;&lt;em&gt;(Note: Although I've moved most non-Scrivener related posts over to my Machine Dreams blog following a couple of users taking umbrage over my opinions on the objectively terrible Battlestar Galactica finale, I'm making an exception for this one. This is a re-post from the forums, and I feel it's justified purely because J.D. Salinger was one of the authors who made me want to write, and thus had a direct impact on the eventual development of Scrivener. Justification over.)&lt;/em&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;J.D. Salinger died the day before yesterday. I don't suppose it will be considered by many as exactly a huge loss to literature given that he stopped publishing anything over fifty years ago, but still, I feel I have to pay my respects in some way as he was my absolute favourite author in my early twenties. Of course, it's not difficult to read all of his published works - a grand total of four extant books (one novel, one collection of short stories and two books containing two longer stories each). But I was such a fan that I tracked down much of the difficult-to-get stuff, the stories he refused to have reprinted. On a visit to the US, for instance, I went to a library and accessed the microfiche archives of the New Yorker to get a copy of his last-ever story ("Hapworth 16, 1924" - disappointing, as it made Seymour Glass seem an annoyingly precocious brat, quite at odds with his morose but seraphic portrayal in "A Perfect Day for Bananafish", and if that is the direction Salinger's writing was taking then maybe it wasn't such a bad thing to withdraw and let readers appreciate his past achievements).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;But even more obsessive, when I did my MA and had access to the British Library, I spent two weeks hand-copying &lt;em&gt;The Inverted Forest&lt;/em&gt; - a rare bootlegged collection of 22 of Salinger's stories that he has never allowed to be republished (I'm pretty sure the book itself was illegal, so I'm not sure what it was doing in the British Library but I'm glad it was there). I sincerely hope his family allow these stories to be republished now, even though it may be against his wishes, as they are wonderful. "A Young Girl in 1921 with No Waist At All" remains one of my favourite ever short stories. I don't know why. Not much happens - it's just beautiful, somehow, and whilst stories like "Teddy" seemed profound to me in my early twenties, it is these less ostentatiously Zen stories that still resound with me now.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So, thank you Mr Salinger. If the rumours are to believed, you may well have been the grumpiest man alive. You may have eaten frozen peas and raw sheep, drank your own urine, sent love letters to Winona Ryder and had a penchant for lawsuits that Apple would envy, and I have no doubt that you would have despised me for my fanboyism, but I thank you all the same. For &lt;em&gt;Catcher in the Rye&lt;/em&gt; and Holden Caulfield with his poor broken hand and his cool sister Phoebe. For the Glass family, with their tendency to take long baths and make phone calls to each other from within the same house to discuss Eastern philosophy. And for making me really think about the meaning of the words on the page, how a broken record could be a metaphor for a dead brother.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So I don't care what the naysayers say (they say nay). To me, J.D. Salinger deserves his place as a Great Author of the Twentieth Century, and I hope the kids of my kids are still taking university courses on the works of Salinger and Mr Vonnegut in forty or fifty years' time, or just holing up as teenagers in their bedrooms and nodding or grunting agreement with Holden about the phoniness of the world around them.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I am sorry that he's gone.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-1616446433751992631?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/1616446433751992631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=1616446433751992631' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/1616446433751992631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/1616446433751992631'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2010/01/jd-salinger.html' title='J.D. Salinger'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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><entry><id>tag:blogger.com,1999:blog-13975555.post-8083639218447895486</id><published>2009-06-30T08:58:00.002Z</published><updated>2009-06-30T09:13:49.153Z</updated><title type='text'>Final Draft 8</title><content type='html'>For all those scriptwriters out there, and for all those who don’t already know, Final Draft 8 was finally released not long ago. Final Draft is, of course, the industry standard of scriptwriting programs, and version 8 brings with it a raft of new features and an overhaul to the interface that makes it feel much more like a native Mac app than previous versions. I won’t go into the various new features - navigator, improved index card navigation, new interface, and so on - here; instead, I just thought I’d say a few words about Final Draft’s relationship with Scrivener.&lt;br /&gt;&lt;br /&gt;When Scrivener was in the early beta stages a few years ago, there were a number of frustrated Final Draft users who, wanting more organisational tools than Final Draft provided (and to be able to use something more “Mac-like”), asked me to provide scriptwriting features in Scrivener so that scriptwriters, too - along with writers of other types of prose - could draft and structure in Scrivener and then export to Final Draft for the - er - final draft (and production and so on). Because of those early pleas, Scrivener now has a scriptwriting mode, and I’m glad it does, as I like using it for playing around with dialogue and other formats myself (not to mention that my most recent endeavour in my never ending quest not to finish a work of fiction is a graphic novel, or comic, or something). But Scrivener isn’t a dedicated scriptwriting program and most scriptwriters will still need such software for preparing their script for submission or production, so it’s great to see a much anticipated Final Draft update prove worth the wait.&lt;br /&gt;&lt;br /&gt;With the help of the nice people at Final Draft, a recent update to Scrivener introduced .fcf (Final Draft File Converter Format) export, making it relatively straightforward for users to export to previous versions of Final Draft, but the most recent updates - 1.5x onwards - also include .fdx import and export; FDX (Final Draft XML) is Final Draft’s new default format, replacing FDR. Scrivener 2.0’s support for FDX will be even more advanced, allowing users to keep synopses (summaries in Final Draft) and structure intact when transferring files between the programs, but for now, Scrivener 1.5x’s FDX support is already great for getting your work out to Final Draft. (The FDX format is something I’m not used to - a good XML format. You can open it up in any text editor and it is easily readable. I’m going to blog on the woes of the .pages format a little later, but for now, suffice to say that I wish Microsoft and Apple had come up with a format as nice as .fdx when designing their .docx or .pages formats; and yes, I know that’s unrealistic for many, many reasons, but I can still wish, can’t I?)&lt;br /&gt;&lt;br /&gt;At this stage, lest this comes across as an advert for Final Draft, I should say that we are in partnership with Final Draft Inc. (you can see as much on their &lt;a href="http://www.finaldraft.com/company/technology-partners.php"&gt;partners page&lt;/a&gt; - I suppose we ought to have one of those, except we’d only have one company to put on there!). But all that means is that I e-mailed them a year or so ago, explained what Scrivener did, and asked if there was any way they would be willing to let me have access to one of their formats so that I could provide an importer and exporter. I expected that to be that, and that I would never hear back from them; instead I received a very helpful e-mail, followed by a phone call. They gave me access to the .fcf format and later suggested I support .fdx too; they’ve kept in touch ever since and even made time to meet with us on a couple of occasions. They didn’t need to do any of that; we are small fry (for now - obviously the long-term plan is world domination), but they just seemed to have a very open attitude towards other programs, and that’s something I really appreciate.&lt;br /&gt;&lt;br /&gt;Anyway, now that Final Draft 8 is out, a few users have asked, do I really need both programs now? Can’t I do it all in Final Draft? And inevitably, in a couple of Mac reviews of Final Draft, Scrivener has come up as a competitor. Scrivener is, of course, in no way direct competition to Final Draft (or Movie Magic Screenwriter or Montage for that matter), any more than it is in direct competition to Word or Pages. Scrivener is still very firmly about the first draft stages of a writing project. It is - I hope - great for organising ideas, structuring the project, and then hammering out that first draft of a script or novel (or legal document or thesis). But just as for the majority of cases you would take a thesis written in Scrivener to a word processor for final formatting, you are equally likely to take a screenplay written in Scrivener to a dedicated program such as Final Draft for the last stages of its development (the only reason I didn’t say stage play there as I am aware the requirements for stage plays vary).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.literatureandlatte.com/gfx/firstDraftFinalDraft.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 500px;" src="http://www.literatureandlatte.com/gfx/firstDraftFinalDraft.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So: Final Draft 8. More Mac-like, easier to use, looks better, developed by a friendly company, and now it’s simpler than ever to get scripts developed in Scrivener out to it.&lt;br /&gt;&lt;br /&gt;I’ll leave the final words to Sean, one of the L&amp;L forum users (I hope he doesn’t  mind me quoting him), as I think he hit the  nail on the head:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;One of the biggest complaints about [Final Draft] 7 was that it felt like a Windows app ported to the Mac. [With Final Draft 8] hey remedied this in a very smart, very professional way: not content to merely look like Mac software, they actually acted like Mac software. They recognized their place in the world, and they made that place as great as they could. There's no Microsoft "resistance is futile" thing here -- they didn't try to crush the Scriveners of the world by bloating their own software with their own crappy version of the binder. Instead, they literally encourage you to keep using the tools you love, and they made it easier for you to come home to Final Draft for your final draft… I say well done. I am now officially a Final Draft fan again. Well worth the $79 upgrade.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-8083639218447895486?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/8083639218447895486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=8083639218447895486' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/8083639218447895486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/8083639218447895486'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2009/06/final-draft-8.html' title='Final Draft 8'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-8246705059911431252</id><published>2009-06-26T12:47:00.004Z</published><updated>2009-06-27T12:10:27.519Z</updated><title type='text'>Creating TIF files with multiple images</title><content type='html'>So, in overhauling Scrivener's toolbar graphics and other graphic elements for 2.0, I noticed that a lot of OS X apps handle toolbar images a little more elegantly than Scrivener 1.x. Scrivener's toolbar looks fine when the icon size is set to normal, but if you set the it to use the small image size, the images get rescaled and don't look so hot. A lot of apps - look at Pages for instance - look great at both sizes, because they provide custom images for each rather than just allowing the toolbar to scale the larger images down when the small size option is selected. with Scrivener 1.x, though, I only created images for the larger size.&lt;br /&gt;&lt;br /&gt;I was waiting on overhauling images such as these to see if Snow Leopard introduced resolution independence - when that comes just about every image in every OS X app is going to need recreating at a much larger scale by professional artists. But seeing as that doesn't seem to be on the agenda for 10.6 (which makes me sigh with relief as a developer even if the end-user part of me would like to see it), I have started in on overhauling the icon set.&lt;br /&gt;&lt;br /&gt;The way OS X toolbars handle selecting the small or large image for a particular toolbar icon is to look in the one image file for both images; that is, it expects both images to be bundled into the same .tif or .icns file (the larger one at 32x32 pixels and the smaller one at 24x24). OS X comes with a tool that will create .icns files easily enough, but being obtuse I decided I wanted to keep the toolbar icons as .tif files (which is how most Apple apps do it). The trouble is, Photoshop doesn't support .tif files containing multiple images. So I Googled around to find a tool which would, but either my search terms were rubbish or the only tools that really do this sort of thing are paid-for, fully-featured apps, and I realised I could write my own tool to do this much more quickly than I could find one from searching through Google results - after all, all it needs to do is take two image files already created in Photoshop, one for the small size and one for the larger size, and bundle them both into the one .tif file.&lt;br /&gt;&lt;br /&gt;So, here is my ten-minute app that does exactly this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.literatureandlatte.com/freestuff/MultiTIFF.zip"&gt;http://www.literatureandlatte.com/freestuff/MultiTIFF.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's pretty self-explanatory - you just drag a 32x32 image into the 32x32 image well and a 24x24 image into the 24x24 well, and then hit Save to create a .tif file that combines the two, suitable for use in toolbars.&lt;br /&gt;&lt;br /&gt;EDIT: I've updated it so that you can open existing multi-page .tif files and export the small or large icons out as separate files.&lt;br /&gt;&lt;br /&gt;Who knows, maybe it will come in useful for somebody else putting their toolbar images together. Probably not; given that a lot of developers do this already, presumably there is already an abundance of tools out there that do this that I just missed, but it was a diverting ten-minute break from the intense coding I'm doing on Scrivener 2.0 at the moment. Which rocks, by the way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-8246705059911431252?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/8246705059911431252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=8246705059911431252' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/8246705059911431252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/8246705059911431252'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2009/06/creating-tif-files-with-multiple-images.html' title='Creating TIF files with multiple images'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-5656876323902588411</id><published>2009-06-18T16:56:00.002Z</published><updated>2009-06-18T17:27:02.071Z</updated><title type='text'>Apple: friendlier</title><content type='html'>A couple of years ago I got &lt;a href="http://lit-n-lat.blogspot.com/2007/06/apple-is-not-your-friend.html"&gt;all huffy&lt;/a&gt; about how Apple had withheld the Leopard beta released at WWDC '07 from developers who had paid for access to Leopard betas but could not attend WWDC, only finally releasing it to other Apple Developer Connection Select and Premier members about a month later - meaning a lot of developers who had paid up for early access to Leopard were unnecessarily left a month behind WWDC attendees in getting their apps Leopard-ready.&lt;br /&gt;&lt;br /&gt;I was not a happy bunny, as many panicked Scrivener users noted in their e-mails to me asking if my beta-rage meant I was likely to abandon Scrivener and the Mac platform (which was never in question). I like to think I have grown and calmed with age in the past couple of years (although my shouting at an ancient Cornish driver the other day may provide evidence to the contrary), so this year, with the coming of WWDC and the announcement that there would be a "near final" build of Snow Leopard available to attendees, I just accepted that I would have to wait another month or so to get access once more. (Despite my vow never to pay for ADC again, it would be a little irresponsible not to do so, as I have to ensure that Scrivener is Snow Leopard-ready for the day of its release... so I reluctantly handed over the cash again this year for the Snow Leopard betas.) Indeed, unlike two years ago, the Apple developer website didn't even claim that ADC Premier and Select members would get the "latest builds", so the signs weren’t exactly auspicious.&lt;br /&gt;&lt;br /&gt;So imagine my surprise when I logged into my ADC account the other day to find that the latest, WWDC, build of Snow Leopard was there, ready and waiting for download - and had been there since the 8th June, the very day it was made available to WWDC attendees. I nearly fell out of my chair. Or at least I swivelled in it a bit. I don’t know if there were a glut of other developers such as myself who complained bitterly at Apple two years ago - I certainly didn’t see much complaining about it anywhere else online - or if Apple just decided they should give all paid-up developers equal opportunity to get their apps Snow Leopard-ready, but whatever the reason, given the loudness of my lamentations and weilaways two years ago, I figured I should at least give credit where credit’s due this time around. Okay, it should have been like this in the first place, but at least Apple have got it together now and that makes me (for once) a happy bunny. So, thank you Apple for sorting this out.&lt;br /&gt;&lt;br /&gt;So Snow Leopard is now ready on my other system and waiting for me to make sure Scrivener works fine on it (early tests are good), which I will be doing in earnest very shortly, in the midst of the full-on development on 2.0 in which I’m currently immersed. (And to those waiting for news on 2.0... Sorry, but I’m holding back on further announcements or feature peeks until nearer the time. 2.0 is still slated for an end-of-2009 release, and suffice to say that I think a lot of Scrivener users are going to be very happy...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-5656876323902588411?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/5656876323902588411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=5656876323902588411' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/5656876323902588411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/5656876323902588411'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2009/06/apple-friendlier.html' title='Apple: friendlier'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-2517641954218415060</id><published>2009-04-02T08:17:00.005Z</published><updated>2009-04-02T13:28:43.900Z</updated><title type='text'></title><content type='html'>Since a couple of readers have taken umbrage at my using this blog to express my opinion on a beloved television show, I have removed the previous blog post on &lt;span style="font-style:italic;"&gt;Battlestar Galactica&lt;/span&gt;. I guess the misunderstanding arose because some (possibly new) users expect this to be a development blog whereas I, being a one-man development team, have always seen it as a &lt;span style="font-style:italic;"&gt;developer's&lt;/span&gt; blog. As I wrote in the first post on this blog four years ago:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;It's been about a year since I decided to learn how to program in Cocoa so that I could design and build my own application for writing in. I've been meaning to write down my thoughts on this process and on the reasons I decided to embark on this project for some time, so thought I'd start this 'blog as a place for those, and other, more general, blatherings.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Obviously, were it understood to be a developer's blog I doubt anyone would be surprised at a geeky coder expressing a passionate opinion on a science fiction show!&lt;br /&gt;&lt;br /&gt;However, these users have a valid point; four years ago no one had heard about Scrivener so I was free to ramble on here as much as I wanted. I have always said that Literature &amp; Latte was a one man company (although now, since David joined, it is of course a two man company) and to take it for what it is, but times change and as an application becomes more popular, users' expectations change, too.&lt;br /&gt;&lt;br /&gt;So from now on this blog will remain an impersonal development blog with its remit being limited to Literature &amp; Latte news and information about the ongoing development of Scrivener and other L&amp;L products (by "products" I mean "stuff that I code").  As always it will only be updated intermittently; inactivity here is never a sign of stalling development. The user forums are a much better indicator of our activity.&lt;br /&gt;&lt;br /&gt;Of course, Literature &amp; Latte itself remains just two guys working on a program they love.&lt;br /&gt;&lt;br /&gt;In the next few days I'll create a personal blog as an offshoot for the rare madman who can bare to read my off-topic ramblings, and I'll try to move all of the older off-topic stuff (discussion about books, films and so forth) over to that.&lt;br /&gt;&lt;br /&gt;EDITED TO ADD: I've now moved all of the non-Lit'n'Lat posts over to my new personal blog at &lt;a href="http://machine-dreams.blogspot.com"&gt;http://machine-dreams.blogspot.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Apologies to those who came here expecting a development blog rather than the misanthropic mumblings of a developer.&lt;br /&gt;&lt;br /&gt;Regards,&lt;br /&gt;Keith&lt;br /&gt;Scrivener developer&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-2517641954218415060?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/2517641954218415060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=2517641954218415060' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/2517641954218415060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/2517641954218415060'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2009/04/since-couple-of-readers-have-taken.html' title=''/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-8831403609420487703</id><published>2008-08-07T14:20:00.003Z</published><updated>2008-08-07T14:39:18.815Z</updated><title type='text'>Scrivener - alive and kicking</title><content type='html'>I've been receiving an increasing number of e-mails asking me if Scrivener is still in active development, which seems to be a result of people checking this blog and noting that my last post here was some time ago... So, yet again, I thought I'd best post a quick update to say that Scrivener is indeed alive, well, and in active development. (I've always said that the forums are a better indicator of the state of development, because I post on the forums nearly every day, but I do understand that some users, or potential users, don't really like forums much and therefore don't check them.) Of course, as I say on the About page of the main site, Scrivener isn't really about whizz-bang new features. I have always maintained that you should take it for what it is, and that my only real commitment is to bug-fixes and making it the best writing software for &lt;span class="Apple-style-span" style="font-style: italic;"&gt;my &lt;/span&gt;needs. And indeed, I stand by that.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, such caveats notwithstanding, the next version of Scrivener is a bit of a biggie - Scrivener 1.5. It has leapt internally from the current version (1.11) to 1.12 to 1.2 all the way to 1.5 as the changes, fixes and feature list has grown. In many ways, it's a 2.0 release, but I want to reserve the right to charge upgrade fees on major point releases, and I'm nowhere near the point at which I want to ask existing customers to pay for an upgrade, so 1.5 it is (in other words, it will be a free update to registered users). In many ways, it's a refinement release. There are some new features, true (such as a page layout view, which is important for screenwriters who judge time by a minute-per-page, although Scrivener remains steadfastly &lt;span class="Apple-style-span" style="font-style: italic;"&gt;not &lt;/span&gt;a page layout program, so there will never be columns, widows and orphans control, real footnotes or suchlike). But mostly it has been a chance for me to go back over areas that I have never quite been happy with and which I thought could be done better. For instance, the Compile Draft pane is very cluttered and not entirely intuitive, so it's been replaced with one that is more contextual and which has more options, but which keep out of your way if you don't need them. The preferences pane is also very cluttered, and I'll be overhauling that in the next few weeks. There are various other areas that have undergone, or are undergoing, refinement, too (such as the corkboard), but over all it will still be the same Scrivener.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, development is far from dead. I am still here, staring at my screen and scratching my head, pecking at the keyboard and waiting for builds to complete. But after 1.5, I really &lt;span class="Apple-style-span" style="font-style: italic;"&gt;am&lt;/span&gt; going to write The Bloody Novel.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I suppose at this point, I should provide an in-development screenshot of 1.5 (note the project that you can see open is the one I use for my development notes; not very interesting).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll have more news about the next update, and other developments at Literature &amp; Latte, in the next month or so...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://www.literatureandlatte.com/misc/Scrivener_1_5_Preview1.jpg"&gt;&lt;img src="http://www.literatureandlatte.com/misc/Scrivener_1_5_Preview1.jpg" width="500" border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-8831403609420487703?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/8831403609420487703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=8831403609420487703' title='33 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/8831403609420487703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/8831403609420487703'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2008/08/scrivener-alive-and-kicking.html' title='Scrivener - alive and kicking'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>33</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-5468138198606692123</id><published>2007-11-03T12:17:00.000Z</published><updated>2007-11-03T20:01:36.684Z</updated><title type='text'>Spooks + Scrivener</title><content type='html'>I just have to boast about this.* I've been enjoying the excellent sixth series of Spooks on BBC1 (Tuesdays - MI5 in the US) - I've been a big fan of the show since the second series, and would get around to renting the first season on DVD were it not for the thought of seeing Lisa Faulkner getting her face burned off with boiling oil. It's a great spy show with interesting characters (though Adam has got to be the most obvious spy ever - his "disguises" as a gardener, builder, phone company man or whatever tend to be somewhat undermined by his perfect hair, cut-glass accent and the giant microphone protruding from his collar), a healthy dose of cynicism, 24-style split-screen shots and more tension than the Humber bridge.&lt;br /&gt;&lt;br /&gt;All in all, Spooks has consistently been one of the best home-grown BBC programmes over the past few years, and you never know who they're going to kill off next.&lt;br /&gt;&lt;br /&gt;But I've been getting an extra thrill from series 6 because the over-arching story was drafted in Scrivener and some of the episodes were scripted in Scrivener, too, by author Neil Cross (whose new novel, &lt;a href="http://www.amazon.co.uk/Natural-History-Neil-Cross/dp/0743263758/ref=pd_bbs_sr_1/026-9729871-5875642?ie=UTF8&amp;amp;s=books&amp;amp;qid=1194092948&amp;amp;sr=8-1"&gt;Natural History&lt;/a&gt; - which was also mostly composed in Scrivener! - has been getting some &lt;a href="http://entertainment.timesonline.co.uk/tol/arts_and_entertainment/books/fiction/article2321358.ece"&gt;great reviews&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Now, if Neil has used Scrivener to kill of Zaf, I am going to be most upset - talk about turning your tools against you...&lt;div&gt;&lt;br /&gt;&lt;div&gt;* Yes, I know: technically I have nothing to boast about, as it's a bit like saying, "I have to boast that I loaned this bestselling author my pen and he used it!" But it still gives me a warm feeling inside (and it's not the wine, this time).&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-5468138198606692123?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/5468138198606692123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=5468138198606692123' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/5468138198606692123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/5468138198606692123'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2007/11/spooks-scrivener.html' title='Spooks + Scrivener'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-4438173874887312684</id><published>2007-10-27T23:41:00.000Z</published><updated>2007-10-27T23:56:02.082Z</updated><title type='text'>Scrivener + Leopard</title><content type='html'>I've been getting a number of concerned e-mails recently from Scrivener users who fear that I may have abandoned development of Scrivener because my last blog post here is rather old and was slagging off Apple, and because there is no mention of Leopard on the Scrivener product page...&lt;br /&gt;&lt;br /&gt;I would just like to make it very clear that Scrivener is &lt;em&gt;very much&lt;/em&gt; alive and in active development. Scrivener 1.1 is Leopard-ready, with a more "Leopard-esque" interface and a large number of tweaks for Leopard. As a paid-up member of the Apple developer program, I have been building Scrivener on Leopard for the past six months or so. I had hoped to get Scrivener 1.1 out yesterday, to coincide with Leopard's release, but there are a couple of things that have caused a delay (not the least of which being that my partner had to go in for an operation on her jaw yesterday; oh, and Tomb Raider Anniversary came out for the Xbox 360, too...). For a start, the release change list is so long that I need to simplify it, and I also need to update the project templates that come with Scrivener 1.1. Scrivener itself is ready and has gone through extensive beta-testing over the past few months.&lt;br /&gt;&lt;br /&gt;If you are concerned or need the Leopard-ready version right now (although 1.03 should work fine on Leopard for now anyway), please go to the Beta Testing section of the &lt;a href="http://www.literatureandlatte.com/forum"&gt;forum&lt;/a&gt;. There you can download the latest Scrivener 1.1 beta (1.095), which runs fine on Leopard (note that there is a minor bug related to script editing and Edit Scrivenings that has been fixed for 1.1). Note that you will be prompted to update your project, and you must get rid of older versions of Scrivener.&lt;br /&gt;&lt;br /&gt;At the same time as 1.1 is released as an official (and free) update, the website will also be updated. I have been working hard on that over the past week, as the old product page does not reflect the new look of Scrivener. I've also created a webcast for the page. Also note that as of 1.1, Scrivener's price will be increasing from $34.99 to $39.95 (except for students). The update will, of course, be free to registered users, though.&lt;br /&gt;&lt;br /&gt;I'll post again soon about Leopard. Leopard is a great update, and Scrivener 1.1 looks and works great on it. Please be patient as I get the release version ready. It will be with you very soon, and I apologise for the fact that it was not out on time for Leopard. I just wanted to make sure it was perfect...&lt;br /&gt;&lt;br /&gt;Oh, and Tiger users, rest assured that Scrivener will continue to work beautifully on both Leopard &lt;em&gt;and&lt;/em&gt; Tiger for the foreseeable future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-4438173874887312684?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/4438173874887312684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=4438173874887312684' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/4438173874887312684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/4438173874887312684'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2007/10/scrivener-leopard.html' title='Scrivener + Leopard'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-4311721820985845001</id><published>2007-06-28T17:51:00.001Z</published><updated>2007-06-28T18:10:29.349Z</updated><title type='text'>Apple is not your friend</title><content type='html'>Well, if you've been reading my previous posts about Apple's tardiness in posting the 9a466 (or whatever it is) Leopard beta to developers who paid for ADC Select or Premiere membership, you'll know I'm not a happy bunny. WWDC attendees received that beta nearly three weeks ago now. And you know what? That beta is now available on torrent sites. Meaning that pirates out there are running a version of Leopard for which they have not paid, whilst legitimate law-abiding ADC Select members such as myself still have no access to that version of Leopard despite having paid Apple for the "latest" Leopard releases - in other words, we have paid for exactly that copy.&lt;br /&gt;&lt;br /&gt;Do Apple care?&lt;br /&gt;&lt;br /&gt;No, they do not.&lt;br /&gt;&lt;br /&gt;I have written to them several times, with no reply. All developers received a general "you will receive the WWDC beta soon via ADC download" e-mail a few days ago. And when I e-mailed them to remind them that they had not replied to my earlier e-mails, they repeated the "soon" message to me.&lt;br /&gt;&lt;br /&gt;Well, you know what? I've lost interest. I won't pay for a Select ADC membership again, and I strongly advise other indie developers to think seriously before wasting money on it. Yes, you get hardware discounts, but the main impetus for coughing up for a paid ADC account is pre-release OS X versions. Given that Apple don't honour what you pay for, I strongly recommend not buying into this scam. Sadly, it will mean that users of my software lose out a little in future, in that if I do not pay for pre-release versions of the OS, then I can't guarantee that my software will run on the first release of any new OS upgrade. But if Apple don't make available the new releases of their OS to those of us who have paid for exactly that, then what is the point? The really sad thing in all of this is that I have got so p***ed off at Apple that I have not touched Scrivener development for three weeks now. When I finally get access to the new beta I will hopefully get my enthusiasm back, but as an indie developer, with Apple treating me as though I am worthless, it makes it really hard for me to get enthusiastic about updating a help file or adding a small tweak here or there.&lt;br /&gt;&lt;br /&gt;There really are times when I wish I had chosen to develop for Windows. Surely Microsoft cannot treat developers as poorly as Apple do? Apple is not your friend. They make lovely machines and a great OS, but they care very little for users or developers, it seems.&lt;br /&gt;&lt;br /&gt;In fact, it seems that the Apple developer model works something like this: 1) Pay hundreds of dollars for ADC membership and an "Early Start Kit" that gives access to latest OS versions; 2) Once you've paid, the latest versions will actually be withheld unless you pay thousands of dollars for a WWDC ticket and travel across the world to attend.&lt;br /&gt;&lt;br /&gt;Oh, and if you can't attend, it's not just the beta that is held back, but also any knowledge shared by engineers.&lt;br /&gt;&lt;br /&gt;I don't why I'm so surprised - I guess it's just years of Macheads telling me that Microsoft were evil and Apple were Good. When you finally switch to a Mac and develop for the platform for a few years, you soon realise that Apple are just as bad as MS - they just happen to be much smaller and less popular.&lt;br /&gt;&lt;br /&gt;So: really, really poor. Please do think twice before paying for ADC membership.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-4311721820985845001?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/4311721820985845001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=4311721820985845001' title='26 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/4311721820985845001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/4311721820985845001'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2007/06/apple-is-not-your-friend.html' title='Apple is not your friend'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>26</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-8935821867417565643</id><published>2007-06-19T21:53:00.000Z</published><updated>2007-06-19T22:05:58.819Z</updated><title type='text'>Are Apple taking the proverbial?</title><content type='html'>No, but really, are they?&lt;br /&gt;&lt;br /&gt;A couple of days ago I posted moaning about how Apple have not bothered to seed the latest beta of Leopard to paying ADC Select and Premier members who did not attend WWDC (despite the advertising on the Leopard Early Start Kit web page making it very clear that paying for membership entitles you to the latest versions of Leopard).&lt;br /&gt;&lt;br /&gt;I am a very conscientious developer, I like to think. Whenever I come across a bug in the OS, I post it over at bugreport.apple.com. I have posted a number of bugs related to developer seeds of Leopard. Well, today I received an e-mail from the Apple bug reporting team telling me that they believe that in the latest - WWDC - seed of Leopard they have fixed one of the bugs I reported. They asked me to test it and get back to them on whether it is, indeed, fixed.&lt;br /&gt;&lt;br /&gt;So I repeat my question: are they taking the ****? Because they haven't released the WWDC beta of Leopard to anyone who did not attend WWDC, so how on earth can I test this? I replied with a very terse e-mail asking them to keep the bug report open given that there was no way I could test until I received what I had already paid for - namely, the latest developer seed.&lt;br /&gt;&lt;br /&gt;What really worries me more than anything in all of this is that I can find no evidence of other developers getting really riled by what I see as seriously questionable behaviour on the part of Apple. Surely there must be other developers out there who feel that Apple are behaving immorally in all of this? Apparently not. At most, other developers are sighing, "Oh, I've been through the release cycle before, it always takes them a month or two to get this sort of thing up on ADC," as though that makes it all okay. Oh well. I guess I just have an overdeveloped sense of justice / desire for Leopard / desire to receive from a company what I have rightfully paid for (delete as appropriate, I just don't know any more).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-8935821867417565643?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/8935821867417565643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=8935821867417565643' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/8935821867417565643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/8935821867417565643'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2007/06/are-apple-taking-proverbial.html' title='Are Apple taking the proverbial?'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-6551130503057945561</id><published>2007-06-15T19:13:00.000Z</published><updated>2007-06-16T09:48:36.050Z</updated><title type='text'>Leopard beta for the rest of us?</title><content type='html'>As you may or may not know (and whether you care is a different matter entirely), today is the last day of Apple's WWDC (World Wide Developers' Conference) in San Francisco. If you're an Apple buff, you've probably seen the &lt;a href="http://www.apple.com/quicktime/qtv/keynote"&gt;keynote&lt;/a&gt;, showing off Leopard. Yes, the keynote was a little underwhelming. Leopard looks fantastic, but it does seem odd that after being told that it has 300 new features, of the ten that His Jobsness previewed, 8 had already been revealed at last year's conference. Still, it looks like the biggest release for a while, and unifying the interface is a Good Thing.&lt;br /&gt;&lt;br /&gt;You may also have heard that developers attending the conference were given the brand spanking new Leopard Beta to take home with them. Now, this has me mightily - well, vexed. I paid $500 this year for the Apple Developer Connection Select membership, which includes Leopard seeds. I run the latest developer seed and the developer tools upon which I rely for &lt;a href="http://www.literatureandlatte.com/scrivener.html"&gt;Scrivener&lt;/a&gt; crash constantly. As a developer and a paid-up member of the Apple developer program, I am outraged that they have used the beta as a carrot for attending their developers' conference. It annoys me doubly because I would have really liked to attend WWDC this year, but it was just not possible. I live in the UK, which means that - for a start - on top of the ticket price I have to pay a small fortune for a flight and a hotel. But more of an issue is that, as a shareware developer, I also have a day job. I can just see the look on my headteacher's face when I tell her that she needs to book a supply teacher for a week because I am attending a conference in the US...&lt;br /&gt;&lt;br /&gt;WWDC tickets, incidentally, cost just under $1,600. I have seen comments from developers on the web saying that, having paid this money, they are entitled to a feeling of smugness about getting their hands on the new beta. But are they? If the conference is not worth $1,600 without the beta carrot (hmm) then what is the implication? Of course, it is worth it. I would have loved to go not because of the idea of getting the beta into my hands first (that would just have been an added bonus). No, the main reason would be for the sheer number of useful sessions, to be able to talk to Apple engineers and get tips on developing for Leopard, or really harnessing the power of OS X. I could have cornered an engineer and got them to help me start adding AppleScript support to Scrivener. That would have been worth more than a Leopard beta, and I am gutted that Apple don't provide some smaller conferences with engineers available in the UK or Europe.&lt;br /&gt;&lt;br /&gt;But... the beta. I need the Leopard beta to ensure that Scrivener works perfectly on Leopard. I need it to continue development without continual crashes. (And yes, seeing the new dock and menu bar for myself would be nice too, I don't deny it.) But more importantly, I have *paid* for the Leopard Early Start kit. Leopard have my cash, and now they penalise me for not attending a conference in another country that I just could not possibly have made.&lt;br /&gt;&lt;br /&gt;Who knows? Maybe the new beta will be available for download for ADC members on Monday. If so, I will be happy and not to aggrieved that the release wasn't simultaneous. But based on previous WWDC seeds a lot of speculators have been suggesting that it could be nearer a month or two before the beta is made available to non-attendees. Should that be the case, I won't be signing up for ADC next year, that's for sure.&lt;br /&gt;&lt;br /&gt;ADDENDUM: As the obsessive-compulsive I am, I signed into the Leopard Dev Center (available to paying ADC Premier and Select members) today in the vain hope that the beta may have been posted. I normally sign in a different route, so I hadn't noticed this before, but right at the top of the Leopard Dev Center is the title "Leopard Seeds" with this text beneath it:&lt;br /&gt;&lt;blockquote&gt;Download the latest pre-release versions of the Mac OS X Leopard and Xcode 3.0 as soon as they become available.&lt;/blockquote&gt;&lt;br /&gt;Are they taking the proverbial? Because beneath that is still the old Leopard seed from a couple of months ago, and no sign of the actual latest pre-release version, the WWDC beta. What's even worse is that Apple are &lt;span style="font-style:italic;"&gt;selling&lt;/span&gt; the Leopard Early Start Kit on the promise that those who buy it will get the very latest seed. Check out the &lt;a href="https://developer.apple.com/leopard/"&gt;Leopard Early Start Kit&lt;/a&gt; page, where you will see this promise:&lt;br /&gt;&lt;blockquote&gt;Fast track your Mac OS X Leopard development by downloading the latest pre-release versions of Mac OS X Leopard and Xcode 3.0&lt;/blockquote&gt;&lt;br /&gt;Which is, of course, &lt;span style="font-style:italic;"&gt;exactly&lt;/span&gt; why I purchased my Select membership in the first place. Note the key words here: &lt;span style="font-weight:bold;"&gt;latest pre-release versions&lt;/span&gt;, &lt;span style="font-weight:bold;"&gt;as they become available&lt;/span&gt;. Yeah, yeah, I know - I should get a life. When (if?) they finally do seed the beta to the rest of us, I'll be happy as a pig in mud and forget all this anger (which leads to fear which leads to hate etc). But that's not really the point. The point is that Apple seems more interested in penalising developers for not attending an expensive conference than in providing them with the tools they need to make excellent Leopard-ready applications as soon as possible; and this mindset indicates that Apple cares very little for independent shareware developers who live overseas. Like, oh, say - just for example - me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-6551130503057945561?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/6551130503057945561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=6551130503057945561' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/6551130503057945561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/6551130503057945561'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2007/06/leopard-beta-for-rest-of-us.html' title='Leopard beta for the rest of us?'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-3764779648397437426</id><published>2007-04-26T21:48:00.000Z</published><updated>2007-04-26T22:02:03.240Z</updated><title type='text'>Mail 2.0-style split views</title><content type='html'>Just recently I've been invited to join a sort of round table discussion with several other UK-based Mac developers. It's been interesting so far, but I found myself moaning and bitching about the lack of frameworks available for common OS X controls. This, of course, is a career hazard of being a teacher - you end up moaning a lot. So I thought I ought to make amends.&lt;br /&gt;&lt;br /&gt;Just recently I've been updating Scrivener's split views to look more like those in Mail in Tiger, as this seems to be the way that the Mac interface is going. I was a little reluctant to do this at first - indeed, I considered Mail-style split views when designing Scrivener 1.0, but decided against them because I liked the 16-pixel separation between binder and main text. But these days, after several interface tweaks, I feel the new splitters might fit. Besides which, I think that if I don't implement them, Scrivener may start looking dated if I'm not careful - maybe not yet, but it's good to get in there ahead of time. Or something.&lt;br /&gt;&lt;br /&gt;So, I rolled my own solution. I enhanced the NSSplitView subclass that Scrivener uses so that it could be drawn with a single-pixel divider (and, as of 1.03, I also added functionality for it to state-save to file rather than just to user defaults so that split view state can be saved as part of the document, which is often desirable for document-based apps). I also wrote my own grab-handle class, SCRSplitViewResizer (by "grab handle", I mean the grabber that you click on in the footer view in mail to resize the split view). My class only handles the resizing of vertical split views, but then, outside of Path Finder, I haven't seen any apps that use grabbers for horizontal split views anyway. My grabber does have to handle resizing regardless of whether it's placed on the left or right of the splitter, though.&lt;br /&gt;&lt;br /&gt;Now, lots of folk have rolled their own grab handles and single-pixel split views, I know. But, to my knowledge, the only one publicly available is RBSplitView. So, to make amends for all that bitching I mentioned, here is mine:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.literatureandlatte.com/downloads/SCRSplitViews.zip"&gt;http://www.literatureandlatte.com/downloads/SCRSplitViews.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is the code that Scrivener 1.04 is using. It works pretty well. If you have the need of a Mail-2.0-style split view, feel free to use it however you wish.&lt;br /&gt;&lt;br /&gt;And the sad thing is that I am posting about the most ephemeral of phenomena - code classes - when my favourite author of all time died only two weeks ago. I didn't even blog it. I did shed a tear, though. God bless you, Mr Vonnegut (though I don't think that Vonnegut believed in a god any more than I do). My life changed for the better when I read Slaughterhouse 5 at nineteen. This really doesn't belong shunted at the end of a post entitled "Mail 2.0-style split views". Ho-hum.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-3764779648397437426?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/3764779648397437426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=3764779648397437426' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/3764779648397437426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/3764779648397437426'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2007/04/mail-20-style-split-views.html' title='Mail 2.0-style split views'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-117002825166952159</id><published>2007-01-28T23:25:00.000Z</published><updated>2007-01-28T23:50:51.683Z</updated><title type='text'>Scrivener first week, 1.01 and Xbox 360 distractions</title><content type='html'>Well, the first week of Scrivener going on a 1.0 release has gone way better than I could have hoped. Thank you to everybody who has purchased a copy or just taken the time to give me feedback so far. Notable events of the past couple of weeks include:&lt;br /&gt;&lt;br /&gt;- Michael Marshall Smith wrote his new novella in Scrivener!&lt;br /&gt;- The BBC show Spooks just started shooting in London, some of the treatments of which were drafted in Scrivener.&lt;br /&gt;- I bought myself an Xbox 360 to celebrate the launch; my eyes are now sore and dry after too much Gears of War.&lt;br /&gt;- I met up with a writer who works for the Financial Times at an exclusive media club in Covent Garden - and managed to spill water all over his PowerBook. (The Universe proving I do not belong in exclusive clubs in Covent Garden.) Paul - if you are reading: sorry. How's the PowerBook?&lt;br /&gt;- A senior Apple guru got in touch to ask about Scrivener.&lt;br /&gt;- MacFormat asked if they could put Scrivener and Scrivener Gold on one of their DVDs (so look out for it in a future edition).&lt;br /&gt;- I completely failed to start The Novel.&lt;br /&gt;&lt;br /&gt;All in all, a good start.&lt;br /&gt;&lt;br /&gt;Anyway... I have also been dealing with a gazillion e-mails. Many of these are students asking for discounts (there isn't one! Scrivener is cheap already! Though I sometimes give them a coupon anyway if they're really polite, although that will probably stop now that eSellerate are taking a bigger cut). Many more are support e-mails. Lots are really, really nice "thank you" and "great app" e-mails: an especially big thank you to all the authors of those, as they always make my day. I've also had a considerable number of "Will there be a Windows version?" mails, which makes me feel good to have produced something Windows users want. To those Windows users: Sorry, but no. Not because I have anything against PCs, but just because it is so difficult to port software between platforms and I haven't got a whole team. PageFour and Rough Draft are great PC programs, though. Oh, and I did - just this very moment - have one e-mail telling me that Scrivener was useless because it didn't act like a word processor and show page layout and invisible character, which just goes to show that you can't please all of the people all of the time.&lt;br /&gt;&lt;br /&gt;And in amongst all of that, I have been hard at work on 1.01, honestly. Here's a screenshot:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.literatureandlatte.com/blog/scriv101.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px;" src="http://www.literatureandlatte.com/blog/scriv101.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thanks again for all the support for Scrivener. And an especially big thank you to Merlin Mann for bigging it up on 43Folders.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-117002825166952159?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/117002825166952159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=117002825166952159' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/117002825166952159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/117002825166952159'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2007/01/scrivener-first-week-101-and-xbox-360.html' title='Scrivener first week, 1.01 and Xbox 360 distractions'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-116937805718760052</id><published>2007-01-21T10:59:00.000Z</published><updated>2007-01-21T11:14:17.200Z</updated><title type='text'>Scrivener makes 1.0</title><content type='html'>Well, Scrivener finally got to a 1.0 release yesterday, and I would like to sincerely thank* all of those users who have beta-tested both Scrivener Gold and then the Scrivener 1 betas over the past couple of years. You have all helped make Scrivener a much better application, truly. When I released beta 1 several months ago, I thought it was pretty much ready for release. I was mistaken, to put it mildly. The feedback was positive, but there were a lot of rough edges that made navigation a little unintuitive (remember how you could keep ending up with a blank corkboard because the modes weren't automatic?). My own ideas and vision got Scrivener part of the way; feedback from real world users got it the rest of the way. It is much better for it. So: thank you.&lt;br /&gt;&lt;br /&gt;A big thank you too to all of those who have already bought Scrivener - I am genuinely surprised at  the number of copies purchased in less than 24 hours - and to those who have taken the time to write such rave reviews on VersionTracker and MacUpdate.&lt;br /&gt;&lt;br /&gt;For those who haven't checked out Scrivener 1.0, it is available on the product web page at:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.literatureandlatte.com/scrivener.html"&gt;http://www.literatureandlatte.com/scrivener.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are a few minor tweaks and features I hope to add over the coming months, and of course, there will no doubt be another small development push when Leopard is released to ensure everything is compatible and to take advantage of new OS X features, but really, it is now time, at last, to turn back to the writing (i.e. actually using Scrivener myself). Now that is daunting. Developing Scrivener has really been the most amazing form of procrastination. So, hopefully in future this blog will cover both the ongoing development of Scrivener and my struggling attempts at writing The Novel...&lt;br /&gt;&lt;br /&gt;Thanks again!&lt;br /&gt;Keith&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*Pedants: yes, certain grammar freaks would say this is a "split infinitive", a misunderstanding that comes from Latin infinitives. This is the perfect example of why split infinitives are actually meaningless in English: "sincerely like to thank" would suggest it's my liking that is sincere; "to thank sincerely" is probably more correct but sounds hideous. Mind the Gaffe is a great book that really lays waste to nonsense such as split infinitives. Hmm, "pedant's corner" seems to be turning into a regular part of this blog...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-116937805718760052?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/116937805718760052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=116937805718760052' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/116937805718760052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/116937805718760052'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2007/01/scrivener-makes-10.html' title='Scrivener makes 1.0'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-116880595264482765</id><published>2007-01-14T19:57:00.000Z</published><updated>2007-01-14T20:19:12.666Z</updated><title type='text'>Gearing up for 1.0</title><content type='html'>Well, as of today I am putting the finishing touches on Scrivener's Help file (though it needs proof reading; it is very fortunate that the users of Scrivener are writers - a naturally pedantic* bunch, meself included).&lt;br /&gt;&lt;br /&gt;What does this mean? Well, hopefully it means that Scrivener should go on sale sometime during the week beginning 22nd January, but most certainly before the end this month. There are a couple of very minor annoyances I need to iron out of Scrivener first (a day's work at most - er, hopefully, at least), and I ought to release a beta 6 in the next day or two so that beta-testers can start proof-reading the Help file, I suppose... But that is really it.&lt;br /&gt;&lt;br /&gt;Not that Scrivener is entirely perfect (yet), but it is pretty damn near, in my own rather biased opinion. That is, perfect for me at least - but then that is the whole benefit of writing your own software. At this stage it does everything - in fact more - than it was originally intended to do, so by that definition, 1.0 is complete. There are a few things that would be nice, but which I have managed to say "no" to for version 1.0: for instance, the ability to view scrivenings in an arbitrary (non-binder) order; project notes and references combined into the inspector (the current Project Notepad is really only a pitstop); the ability to search snapshots; a binder HUD in full screen... and so on and so forth. All nice, but not necessary for 1.0. And I have got better at saying "no... for now" to suggestions recently, which is very important if we are to make it to 1.0 at all (it has been a year-and-a-quarter since Scrivener Gold - back then just "Scrivener", before it was down-graded - was first released in beta).&lt;br /&gt;&lt;br /&gt;It's been an interesting and gratifying journey to 1.0. I have had very little negative feedback, and a lot of positive and constructive feedback. Even better, I have had some published authors start using Scrivener, so I was able to bend their ears about writing and get some very good writing advice (a very big thank you to Neil Cross and Michael Bywater, both of whom very generously replied to my questions with long e-mails containing excellent advice, and to Michael Marshall Smith who, along with Neil Cross, has given me a great testimonial for Scrivener's web page).&lt;br /&gt;&lt;br /&gt;So now it is on with using Scrivener myself. We've booted The Girl (now nearly one) into her brother's bedroom, and I bought a £20 compact writing desk from Argos which now sits exactly where her cot did in our room. So now, really, all I need is talent. D'oh!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*cf. Post on "pedanticism"/"pedantry" below. Wasn't it Churchill who said, "Pedantry is something up with which I shall not put"? (If not, no doubt somebody will take delight in correcting me.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-116880595264482765?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/116880595264482765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=116880595264482765' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/116880595264482765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/116880595264482765'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2007/01/gearing-up-for-10.html' title='Gearing up for 1.0'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-115637106800879170</id><published>2006-08-23T21:59:00.000Z</published><updated>2006-08-23T22:11:08.053Z</updated><title type='text'>Beta-a-go-go</title><content type='html'>Phew. After just over a month of very focused work on Scrivener, I'm ready to release the new beta... I'm looking forward to hearing what the beta-testers make of it. Even more than that, though, I'm looking forward to importing my work into it and &lt;i&gt;using&lt;/i&gt; it. I've just finished writing the new tutorial, so it's now just a matter of writing the new readme file and creating the DMG. Not sure whether it will go up tonight or tomorrow, but it will definitely be up before tomorrow night (excepting any major disasters).&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.literatureandlatte.com/blog/ScrivBeta.jpg"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-115637106800879170?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/115637106800879170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=115637106800879170' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115637106800879170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115637106800879170'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2006/08/beta-go-go.html' title='Beta-a-go-go'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-115386963131757970</id><published>2006-07-25T23:16:00.000Z</published><updated>2006-07-25T23:20:31.336Z</updated><title type='text'>Full Screen: Evolved</title><content type='html'>As promised, a couple of screenshots of Scrivener's new full screen mode. It's not finished yet - I mainly just have to hook everything up - but these should give you a good idea of how it's going to look. The first screenshot shows how full screen mode when you launch into it, with no extraneous elements visible. And don't worry, although this is the default appearance, all colours are customisable, so you can always get that retro green-text-on-black look if you really want. The second screenshot shows full screen mode with the inspector (which allows you to view and edit document notes and keywords), the keywords HUD (which allows you to edit and assign project keywords) and the tool panel (which acts like the one in iPhoto) visible.&lt;br /&gt;&lt;br /&gt;There are still some minor conceptual problems, such as how the whole thing acts with expose, and it may therefore be that version 1.0 doesn't allow for the blanking out of other windows during full screen and full screen may end when the app deactivates (as with the current version of Ulysses). This behaviour is fine for most situations, but ideally I would like to have full screen persist when you select other applications (especially for a dual-screen set-up, which I am unable to test) at least. I'll have a look at it tomorrow, but after that I think these enhancements might just have to go into a 1.x update. Full screen is pretty sexy as it is, and the main thing is getting a 1.0 release. Anyway, enjoy the screenshots.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.literatureandlatte.com/blog/FullScreenNone.jpg"&gt;&lt;br /&gt;In this first picture, you can see that the background can be faded so that you can see windows beneath - including the main Scrivener window, which may be useful if you wish to refer to a different document.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.literatureandlatte.com/blog/FullScreenEvolved.jpg"&gt;&lt;br /&gt;Here you can see the other visual elements available in full screen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-115386963131757970?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/115386963131757970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=115386963131757970' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115386963131757970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115386963131757970'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2006/07/full-screen-evolved.html' title='Full Screen: Evolved'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-115378106537871359</id><published>2006-07-24T22:43:00.000Z</published><updated>2006-07-24T22:44:25.400Z</updated><title type='text'>Full Screen Ponderings and the Nature of Shareware</title><content type='html'>(Note: It's late and I can't be bothered right now to go through and check for spelling errors and missing words, so please excuse any poor grammar.)&lt;br /&gt;&lt;br /&gt;During the coding of the new full screen mode for Scrivener (still unfinished, grr), I suddenly realised that I'd made a silly mistake: the new keywords panel in Scrivener is a HUD panel, much (read "just") like the keywords HUD in Aperture. HUD panels look fantastic in full screen, and pretty cool out with normal windows, too. My mistake was that although the HUD panel looked great in the new full screen mode, you couldn't actually do anything useful with it. You use the HUD panel to assign keywords to a document by dragging them from the HUD to either the document in the binder, the document's header view, or the document's keywords list - none of which are visible in full screen mode. Whoops.&lt;br /&gt;&lt;br /&gt;Of course, I could just disallow viewing of the keywords HUD in full screen mode, but then there would be absolutely no point to it having the HUD look. Instead, it got me thinking: perhaps there should be a way to assign keywords in full screen mode. But what would be the best way of doing it? Full screen should be a "no distractions" environment, so I didn't want to bring in too many other visual elements. But then I had to question, what does "no distractions" mean in the context of Scrivener? Really, it just means that you don't want to get distracted by other programs, by e-mail, by the internet and so on. It doesn't mean that you don't need access to other parts of Scrivener. This got me thinking more: what are the bare essentials that you would need in full screen, so that you could work on one document at a time without having to leave full screen unless you wanted to start outlining? In other words, if you wanted to concentrate on writing in full screen, what would you need?&lt;br /&gt;&lt;br /&gt;Well, you wouldn't need the synopsis (index card) - that is more for outlining purposes. You could add that when you came out of full screen, and full screen should not be about worrying over the wording of a synopsis. And you wouldn't need the references table, because if you want to open up references then you are going to need the main window or another application. But you might want the notes, so that you can refer to your ideas and scribblings. And you might want the keywords list, because as you write, you might think, "I've just added Emily to this scene, I better add her name to the document's keywords."&lt;br /&gt;&lt;br /&gt;Thus, full screen now has an optional HUD that allows you to enter notes and keywords. On top of this, of course, you can always fade the background to view other windows (or Scrivener's main window) if you so wish. It looks pretty swish, I think - screenshots tomorrow, if all goes to plan.&lt;br /&gt;&lt;br /&gt;My other thought for the day is this: why is it that when users spend big bucks on a piece of software such as Microsoft Word or Adobe Photoshop they do not expect regular updates adding killer new features, but when they spend only a few dollar on a piece of shareware, they expect regular updates and regular new features? This is not a dig at my users in anyway, who have helped shape Scrivener into something I truly love from something with which I was not entirely satisfied, I am just genuinely curious. Actually, though, I think the answer is obvious. There is no way you can get near the developers of MS Word or Adobe Photoshop (actually, that's not entirely fair; the MS Word developers do keep an interesting blog on the MS site - but there's no way you are going to influence the direction of Word). Whereas, with a shareware app, you might find something that you find has some potential for you and you can actually contact the developer and try to sway him or her. Either way, I'm not complaining. Much of the swaying I have had has made Scrivener into a better program. But there will come a time when I will have to sway a little less, and write a little more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-115378106537871359?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/115378106537871359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=115378106537871359' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115378106537871359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115378106537871359'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2006/07/full-screen-ponderings-and-nature-of.html' title='Full Screen Ponderings and the Nature of Shareware'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-115367033456704863</id><published>2006-07-23T15:55:00.000Z</published><updated>2006-07-23T15:58:54.583Z</updated><title type='text'>One more interface task to go...</title><content type='html'>The new Scrivener interface is coming along nicely. All that remains now is building the full-screen window and control panel. After that, I am ready to start bringing in all of the “brain code” from Scrivener Gold and the never-released Scrivener 0.3b. That will take a couple of months, but once it’s done and the bugs have been ironed out through beta-testing, 1.0 is ready for release.&lt;br /&gt;&lt;br /&gt;What has been nice about building the interface first this time is that I now have clear goals to 1.0. Everything that needs doing can clearly be seen in the interface: once all of the menus are operational, the buttons actually do something and the Binder, tables and corkboard display data, then it is done. I’m refusing point-blank even to consider suggestions for new features or improvements until I am at that stage – I have goalposts and I’m not going to move them. It feels good.&lt;br /&gt;&lt;br /&gt;Once the full-screen window is done, I may even post an interface tech-demo so that beta-testers can check out the keyboard short-cuts, check to make sure there aren’t any silly spelling mistakes lurking anywhere, ensure that state-saving is working okay so far and test for potential crashes at this early stage. We’ll see...&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.literatureandlatte.com/blog/ScrivInterfaceNearlyFin.jpg"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-115367033456704863?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/115367033456704863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=115367033456704863' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115367033456704863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115367033456704863'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2006/07/one-more-interface-task-to-go.html' title='One more interface task to go...'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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-13975555.post-115248213204246944</id><published>2006-07-09T21:46:00.000Z</published><updated>2006-07-09T21:55:32.060Z</updated><title type='text'>Interface/off</title><content type='html'>Yeah, that entry title has nothing to do with much other than being a pointless pun on the word "interface" and the film "Face/Off" (and as if it wasn't pointless enough to begin with, I've just exacerbated the the whole pointlessness with a pointless explanation).&lt;br /&gt;&lt;br /&gt;I've been working on Scrivener for most of the day again today, mainly on the inspector, and I'm pretty happy with the results. I'm looking forward to the holidays when I might be able to put in enough time to get it towards a release state... Anyway, another screenshot - as you can see from the improved image view, I decided against dropping multi-media support:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.literatureandlatte.com/blog/ScrivInDevelopment2.jpg"&gt;&lt;br /&gt;&lt;br /&gt;I think it's fair to say that no one can say it looks like a "dirty pancake" (as some wise-ass once described a small Windows utility I created long ago...).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-115248213204246944?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/115248213204246944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=115248213204246944' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115248213204246944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115248213204246944'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2006/07/interfaceoff.html' title='Interface/off'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-115240076197167224</id><published>2006-07-08T23:14:00.000Z</published><updated>2006-11-17T17:27:07.130Z</updated><title type='text'>Development Continues</title><content type='html'>Development is going well on Scrivener beta RC1 (ie. what will become release candidate 1). At the moment, I have the main interface laid out; next comes all the finicky getting-the-data into the interface, but of course, most of the code is already written and lying around in Scrivener Gold and (the unreleased) Scrivener 0.30b, so a lot of it will be cut and paste, optimisation and refinement. A quick and very blank shot of how things are looking so far:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.literatureandlatte.com/blog/ScrivInDevelopment1.jpg" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-115240076197167224?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/115240076197167224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=115240076197167224' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115240076197167224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115240076197167224'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2006/07/development-continues.html' title='Development Continues'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-115065667782152000</id><published>2006-06-18T18:25:00.000Z</published><updated>2006-06-18T18:51:17.833Z</updated><title type='text'>Of Corkboards and Typewriters</title><content type='html'>Okay, I've been playing around with this simplicity idea, and I'm going to experiment with it to see if it is a viable future for Scrivener. My idea is to have the main window look a little like the one in OmniOutliner. It displays either an outliner or a corkboard, with a drawer that can show the binder (yes, I know a lot of people don't like drawers and they could put off some potential users, but I do like the way they work in OmniOutliner). You could see a document in a third pane in that window, but only as a preview and with no meta-data. Then you would open any documents you wanted to work with in a separate window. These editor windows would have a drawer for displaying meta-data, and would also allow a split view for viewing supporting documents. Here are a couple of mock-ups of how it might look:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.literatureandlatte.com/blog/ScrivPossibility.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px;" src="http://www.literatureandlatte.com/blog/ScrivPossibility.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.literatureandlatte.com/blog/ScrivPossibility2.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px;" src="http://www.literatureandlatte.com/blog/ScrivPossibility2.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-115065667782152000?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/115065667782152000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=115065667782152000' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115065667782152000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115065667782152000'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2006/06/of-corkboards-and-typewriters.html' title='Of Corkboards and Typewriters'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-115062853512837233</id><published>2006-06-18T10:56:00.000Z</published><updated>2006-06-18T11:02:15.140Z</updated><title type='text'>Simplicity (and the inspectors cometh)</title><content type='html'>I haven't got much time to do anything on Scrivener or the typewriter emulator this weekend. I wish the reason for this was that I am too busy enjoying Father's Day and spending quality time with T. and O., but no... It's actually because OFSTED have announced that they are inspecting our school this week, so all my plans and paperwork have to be spick and span, up-to-date and perfect, etc etc. Ugh.&lt;br /&gt;&lt;br /&gt;I have been having some thoughts, though (just as well). Right now, I'm really enjoying using and messing with my typewriter emulator. It feels good - it reminds me of the buzz I got from writing on my mother's old typewriter, back when I first wanted to write. It also makes me wonder if I shouldn't simplify everything else. As soon as I have time this week, I think I'm going to put together a very simple application that incorporates the typewriter application along with my corkboard view. If I can fit an outliner in there too, all the better. Complete simplicity, but useful... I'm beginning to think that the best prorams are the simplest, and maybe Scrivener should go completely spartan. Watch this space: .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-115062853512837233?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/115062853512837233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=115062853512837233' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115062853512837233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115062853512837233'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2006/06/simplicity-and-inspectors-cometh.html' title='Simplicity (and the inspectors cometh)'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-115014305053718817</id><published>2006-06-12T20:07:00.000Z</published><updated>2006-06-12T22:40:58.876Z</updated><title type='text'>Dev. Diary: Quest for an interface</title><content type='html'>I'm currently finishing off the &lt;a href="http://www.rumramruf.com/literatureandlatte"&gt;Literature &amp; Latte website&lt;/a&gt;: getting the new forum up and running, gathering together free downloadable stuff (a couple of trivial programs and some classes for Cocoa programmers), putting together a links page, and of course getting the Scrivener page ready (so that I'm ready to hit the ground running when it is actually finished). Whilst I've been doing this, I've also been mocking up the new interface for Scrivener. I had it sketched out on paper, but I wanted to see what it would look like in practice: there's no point in forging ahead unless it looks like it's going to work. (Pretty much all of the code for Scrivener has already been written - the hard part now is just putting it all back together so that it works well in the new interface, optimising it and ironing out any glaring bugs - a couple of months' work at least.)&lt;br /&gt;&lt;br /&gt;This is really the third iteration of Scrivener's interface; the fourth, if you count Hemingway, my prototype for Scrivener. Getting the interface right has probably been the single-most difficult aspect of designing Scrivener - after all, a good interface is crucial, and can make or break an application. These have been my objectives in designing the interface:&lt;br /&gt;&lt;br /&gt;1. It has to be intuitive. If you need to glance at a manual before you start writing, something is wrong.&lt;br /&gt;2. It has to allow fluid movement between outlining, composing and editing.&lt;br /&gt;3. Every document should be linked with a synopsis, to facilitate easy outlining.&lt;br /&gt;4. You should be able to get everything out of the way if you want to so that you are left with just you and your text.&lt;br /&gt;5. It should provide for easy cross-referencing, both with other text documents and media files used for research.&lt;br /&gt;6. You should be able to dictate the way you want to work (I hate software that tries to force you into a particular work flow), so it has to be flexible.&lt;br /&gt;7. There should be no bloat. If it's not essential to everyday writing, it doesn't belong in the application.&lt;br /&gt;&lt;br /&gt;The hardest part of designing a really good, intuitive interface has been simply this: there are currently no programs out there quite like Scrivener to refer to for inspiration. Now of course, I'm not claiming that there is nothing else out there that has the same purpose as Scrivener (there is plenty); just that nothing else quite works in the same way. For a  start, no other program I know allows you to keep a synopsis for each document that can be viewed in a separate overview as an outline (which was Scrivener's original &lt;i&gt;raison d'etre&lt;/i&gt;). And, whilst there are a few index card/corkboard emulations out there, all of the programs that do provide a corkboard provide it as their main feature, not as something integrated with project management, text editing or outlining (excepting perhaps &lt;a href="http://www.finaldraft.com" target="FinalDraft"&gt;Final Draft&lt;/a&gt;). This gives rise to numerous implementation problems: exactly when should you see the corkboard? How should you be able to access it? In Scrivener Gold, the corkboard is a separate mode altogether. It's like another program tacked on, which is not good. In the never-released Scrivener 0.3, you would see the corkboard when you clicked on a group in the binder - but this was problematic too, because groups could also hold text, so you needed a switch to toggle between viewing the corkboard and the text for group items. Hardly elegant. Now I have come up with another solution: the corkboard (and outliner mode, for that matter) works a little like "Bookmarks" in Camino. Click the corkboard in the toolbar and the current document turns into a corkboard, displaying the children of the currently selected document (outlining will be a little more fluid in the new version - like groups, text items in the binder can also have children, for instance). Click it again, and the corkboard disappears.&lt;br /&gt;&lt;br /&gt;And what about all the problems involved in having a split view that lets you look at your research in one view whilst looking at your text in another? To my knowledge, no other program has that feature (yet). I would be surprised if I'm not wrong, though - there &lt;i&gt;must&lt;/i&gt; be. It's such an obvious idea. I looked to DevonThink for ideas, but as good as DevonThink is for storing lots of different document types, it only lets you look at one at a time in any one window.&lt;br /&gt;&lt;br /&gt;Hence the many revisions and iterations of the Scrivener interface. I've finally hit on one I think really draws everything together in a unified, intuitive manner, though. So before I present you with a mock-up of the new interface, humour me whilst I blather a little about some of the other interfaces that nearly made the grade.&lt;br /&gt;&lt;br /&gt;Firstly, I should acknowledge some of the main influences on the Scrivener interface. The biggest influence at first, I think it's fair to say, was Xcode (which I believe also had an influence on various other apps out there, such as DevonThink):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rumramruf.com/literatureandlatte/blog/XcodeShot.jpg" target="xcode"&gt;&lt;img src="http://www.rumramruf.com/literatureandlatte/blog/XcodeShotSmall.jpg" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Xcode's interface is simple and effective: it shows all your files on the left, and you can organise them however you like; on the right, you edit them. It sets a standard for any kind of project manager. The navigation bar in Scrivener is straight out of Xcode.&lt;br /&gt;&lt;br /&gt;The next important influence was, of course, &lt;a href="http://www.blue-tec.com" target="BlueTec"&gt;Ulysses&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rumramruf.com/literatureandlatte/blog/Ulysses.jpg" target="Ulysses"&gt;&lt;img src="http://www.rumramruf.com/literatureandlatte/blog/UlyssesSmall.jpg" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ulysses has an undeniably beautiful interface: it is a triumph of minimalism (there isn't even a toolbar). It displays a "browser" of your documents on the left, with notes and meta-data on the right. It set several standards for similar programs, among them a full-screen view (now almost &lt;i&gt;de-rigeur&lt;/i&gt;, but I believe Blue-Tec were the first to do it) and a label and status for every document. The document area of the interface is distinguished by being contained in a box (actually a tab view) separate from the browser. The muted colours around the text area cause the eyes to be drawn to the actual text. Moreover, the text area looks comfortably like a page from a book. I fully admit that, whilst redesigning the interface to Scrivener, I have often fired up Ulysses to remind myself of what a well-designed interface looks like.&lt;br /&gt;&lt;br /&gt;Another, less obvious, influence has been &lt;a href="http://www.marinersoft.com" target="MarinerSoft"&gt;MacJournal&lt;/a&gt;, the excellent blogging software:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rumramruf.com/literatureandlatte/blog/MacJournal.jpg" target="MacJournal"&gt;&lt;img src="http://www.rumramruf.com/literatureandlatte/blog/MJSmall.jpg" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Studying MacJournal helped me figure out how to simplify the search/filter feature, as I wanted to get rid of the pane that is used to display search results in Scrivener Gold. MacJournal, a little like Ulysses, displays search results in its content table. It's interface is good because everything about it is functional and clearly defined. (Incidentally, the way MacJournal handles ctrl-clicks in its contents table is exactly the same as in the next version of Scrivener. I came up with this idea on my own, thought it was brilliantly original, and then, upon downloading MacJournal 4, discovered that Dan Schimpf had beaten me to it.)&lt;br /&gt;&lt;br /&gt;An even less obvious influence on the newest interface is the &lt;a href="http://www.caminobrowser.org" target="Camino"&gt;Camino&lt;/a&gt; web browser:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rumramruf.com/literatureandlatte/blog/Camino.jpg" target="Camino"&gt;&lt;img src="http://www.rumramruf.com/literatureandlatte/blog/CamSmall.jpg" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The tab bar and the way that "bookmarks" mode is toggled has been a direct influence on the tabbed interface and the way the corkboard and outliner modes are handled in Scrivener. Camino also looks like a cool, modern Cocoa application (aside from the pinstripes), which is, not unnaturally, what I want for Scrivener.&lt;br /&gt;&lt;br /&gt;There are many other interfaces I have looked at and which have had some influence, of course. From &lt;a href="http://www.yazsoft.com" target="SpeedDownload"&gt;Speed Download&lt;/a&gt; I took the rather beautiful gradient outline view (much more subtle than the blue of Mail and the iApps) and the colour-themed toolbar (Scrivener has a purplish-blue colour theme, whereas Speed Download uses an eye-catching red). &lt;a href="http://www.apple.com/aperture" target="Aperture"&gt;Aperture&lt;/a&gt; has influenced some of the HUD panels in Scrivener: the new keywords panel looks much like the black, translucent one found in Aperture. &lt;a href="http://www.omnigroup.com" target="Omni"&gt;OmniOutliner&lt;/a&gt; and &lt;a href="http://www.hogbaysoftware.com" target="Hog Bay"&gt;Hog Bay Notebook&lt;/a&gt; (now Mori) have had a large influence on the new outliner. &lt;a href="http://www.equinux.com/us/products/isale/index.html" target="iSale"&gt;iSale&lt;/a&gt; and &lt;a href="http://www.delicious-monster.com" target="Delicious"&gt;Delicious Library&lt;/a&gt; helped me rethink and redesign the corkboard view.&lt;br /&gt;&lt;br /&gt;Right, onto the Scrivener interfaces (click on the images to read more about each interface, if you haven't lost the will to live already):&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Hemingway&lt;/b&gt; (the prototype for Scrivener)&lt;br /&gt;&lt;a href="http://www.rumramruf.com/literatureandlatte/blog/Hemingway.jpg" target="Hemingway"&gt;&lt;img src="http://www.rumramruf.com/literatureandlatte/blog/HemSmall.jpg" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scrivener Gold&lt;/b&gt; (Scrivener betas 0.1 - 0.2)&lt;br /&gt;&lt;a href="http://www.rumramruf.com/literatureandlatte/blog/ScrivenerGold.jpg" target="ScrivenerGold"&gt;&lt;img src="http://www.rumramruf.com/literatureandlatte/blog/ScrivGSmall.jpg" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scrivener 0.3b&lt;/b&gt; (never released even to beta-testers)&lt;br /&gt;&lt;a href="http://www.rumramruf.com/literatureandlatte/blog/Scrivener03b.jpg" target="Scrivener03b"&gt;&lt;img src="http://www.rumramruf.com/literatureandlatte/blog/Scriv03bSmall.jpg" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scrivener&lt;/b&gt; (mock up of the new interface)&lt;br /&gt;&lt;a href="http://www.rumramruf.com/literatureandlatte/blog/ScrivenerFinalMockup.jpg" target="ScrivenerFinalMockup"&gt;&lt;img src="http://www.rumramruf.com/literatureandlatte/blog/ScrivFMSmall.jpg" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What you see there is the main view - how it is likely to look for most of the time you are using it. Yeah, I know not everyone is going to like it, but that is unavoidable; beauty is in the eye of... Well, you know. You can hopefully see how the eye is naturally drawn to the central column, where you actually edit and compose your text. It's simple, it separates the binder from the document area without resorting to a drawer (although you will be able to hide the binder and the inspector), and it is fairly obvious that it is a writing tool. Of course, this doesn't show how the corkboard, outliner and split views work - I'll leave that for another time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-115014305053718817?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/115014305053718817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=115014305053718817' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115014305053718817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115014305053718817'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2006/06/dev-diary-quest-for-interface_12.html' title='Dev. Diary: Quest for an interface'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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><entry><id>tag:blogger.com,1999:blog-13975555.post-115005137554076271</id><published>2006-06-11T18:30:00.000Z</published><updated>2006-06-11T18:42:55.550Z</updated><title type='text'>Dev go d'oh</title><content type='html'>I was just browsing the &lt;a href="http://www.jerssoftwarehut.com/bbs"&gt;Jer's Novel Writer forums&lt;/a&gt; (I often browse the forums of other writing programs to keep on top of what the users out there want, and I also think that Jer's is a lovely program - there's always a copy in my Applications folder). I came across a post in which a user is requesting the ability to see more than one outline at the same time, and I nearly slapped my forehead. I nearly made a very silly mistake in the new interface. In the new design, I have an "outliner" and a "corkboard" icon in the toolbar. Clicking on one of them puts the current document into that mode, showing an outline or a corkboard in the document view (clicking on them again toggles the document out of that mode). However, I had it so that once you clicked on, say, the outliner, the outliner would then take over the whole view. So that even if you had two different documents open in a split view, the focussed document would become an outline and the other document would be hidden so long as the outline was visible. What was I thinking? This is completely counter-intuitive. It's obvious to me now that the outline should only take over the selected split view. That way you can have two outlines, or two corkboards, open at the same time. Now that is going to be cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-115005137554076271?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/115005137554076271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=115005137554076271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115005137554076271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/115005137554076271'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2006/06/dev-go-doh.html' title='Dev go d&apos;oh'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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-13975555.post-114995006544062118</id><published>2006-06-10T14:22:00.000Z</published><updated>2006-06-11T10:36:45.110Z</updated><title type='text'>Full Screen vs Typewriter Mode...</title><content type='html'>I just came across a &lt;i&gt;very&lt;/i&gt; interesting post, via the Hog Bay Software forum, &lt;a href="http://www.subtraction.com/archives/2006/0509_blockwriter.php"&gt;here&lt;/a&gt;. The poster, Khoi Vinh, proposes an application (he mocks up something that he calls &lt;a href="http://www.blockwriter.com"&gt;BlockWriter&lt;/a&gt;) that works just like a typewriter. It blocks out everything else on your desktop and doesn't allow any editing, thus forcing you to forge on with your text. You can use the cursor keys to go back, but if you type, it types &lt;i&gt;over&lt;/i&gt; the text already there - so that you can block out mistakes using XXXXX just like on an old typewriter. You can't cut, copy or paste, and you can't go back and edit large chunks of your text. The idea is simply that you have to &lt;i&gt;type&lt;/i&gt;, and think more about what you are typing, just like you had to on a typewriter.&lt;br /&gt;&lt;br /&gt;I have to say, this idea appeals to me. I am messing around with it at the moment to see if it is something that might fit into Scrivener - a proper full-screen typewriting mode (as opposed to, or maybe as well as, the current full screen mode which is based on Ulysses' implementation... Interesting, definitely interesting.&lt;br /&gt;&lt;br /&gt;UPDATE: Well, I tried this out... Not the full screen part, but the crippled editing part. I put together a small &lt;a href="http://www.literatureandlatte.com/TypeWriter.zip"&gt;test app&lt;/a&gt; that doesn't allow any editing - only typing. To delete, you have to move the cursor back and then type over text (it just replaces the text with "X"s). It feels &lt;i&gt;awful&lt;/i&gt;. In theory, it's a good idea, but the fact is that if you touch-type, you can touch-type a lot quicker on a keyboard than you can on a typewriter, but at the same time you make more mistakes (I had no idea how much I relied on the backspace key). Moreover, because you are so used to being able to edit in a text editor, it feels very unnatural. Anyway, feel free to try it out for yourself, but there is no way this is going into Scrivener. Still, all this has given me an idea for a slightly nicer looking full screen...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-114995006544062118?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/114995006544062118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=114995006544062118' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/114995006544062118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/114995006544062118'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2006/06/full-screen-vs-typewriter-mode.html' title='Full Screen vs Typewriter Mode...'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-114963594465848867</id><published>2006-05-30T16:16:00.000Z</published><updated>2006-06-07T09:26:28.426Z</updated><title type='text'>A brief history of Scrivener: Part 3 (This isn't actually that brief, is it?)</title><content type='html'>I liked the idea of growing a tale so much that I was going to call my software BookTree, if I ever wrote it. BookTree also referred to the idea that you would use a tree view to organise your ideas - a "tree view" in Windows is what is known as an "outline view" in OS X. I got the idea for BookTree from a piece of PC software called NewNovelist. I looked at the screenshots and ordered it in the hope that it would be a decent organisational tool for my writing. Incidentally, I know a lot of people say that writing software is pointless - why can't you just use a cork-board, some index cards and a notebook like everybody else? I've tried, believe me I've tried. But my desk gets snowed under, I can't find anything, I end up rewriting index cards and synopses and spilling coffee and going mad and... Well, you get the idea. And is anybody saying that a real writer doesn't need a word processor? No. No sane person, at least. Good software just virtualises a real-world process, it doesn't try to force you into working in a way that you wouldn't were you using real-world methods... Which brings me neatly back to NewNovelist. NewNovelist was a great disappointment. It was completely rigid. The outline list on the left of the text view could not be changed - it had twelve items and that was that. And each of these twelve items corresponded to Christopher Vogler's twelve-step interpretation of Joseph Campbell's Hero's Journey. Groan. Enough already. I don't want to follow some pre-set plot, thank you very much.&lt;br /&gt;&lt;br /&gt;But the more I looked at NewNovelist, the more I thought, "Now that would be great - what a missed opportunity. All you need is a completely free outline view on the left which controls which text you see on the right... How hard can it be?" So I started a search for software that could do what I wanted. And whilst I said in another post that writing organisational software is rife on the PC, most of it is clunky and not much fun to use. Most of it has been written in REALBasic or some other non-native, prototyping tool (sorry, I'm just not a big fan of REALBasic apps on any platform). And most of it really limited the structure you could use, too - some only allowed you to work in acts, chapters and scenes, and others limited the levels of hierarchy you could have in your outline.&lt;br /&gt;&lt;br /&gt;Fine, I thought. I'll write my own. I had tinkered with C for a few years and had written a couple of very sub-par programs using the Windows API, so I thought I'd have a crack at it. It soon became apparent, though, that the only chance I had of creating this thing was if I learned C++ and MFC (if you have no idea what I'm talking about, don't worry - they're just what are used to create most Windows programs). So I bought a couple of books - and realised that I had better set aside the next five years of my life if I ever wanted to even start BookTree. Needless to say, I didn't. This thing was supposed to be a means to an end (The Novel), not the end in itself. So I tossed aside the design document I had enthusiastically cobbled together and returned to Word and desperately trying to remember where I had scattered all my files in Windows Explorer.&lt;br /&gt;&lt;br /&gt;And then, for one reason and another, I bought a Mac. I found a few decent writing applications (Ulysses and Copywrite being the forerunners; since then I have also discovered Avenir and Jer's Novel Writer, both of which are wonderful), but none really did what I wanted. I soon discovered, though, that writing software for the Mac was relatively easy. It only took me two or three months to go through the required reading (Kochan and Hillegass) and then I was onto experimenting, trying to put together what was now going to be called Hemingway (after Hemingway's famous declaration that "all first drafts are shit"). I banged together a decent attempt at what I wanted, but it was a complete mess code-wise. So I tore it apart and put it back together again, and this time I called it Scrivener. I like the name "Scrivener". It tells you what it's for straight away, even though the use of the word as meaning a writer of any kind is a little old fashioned, as it is mostly used nowadays to mean a legal notary (or some such). I quite like that old-fashioned-ness, to tell you the truth. It fits with the self-effacing embarrassment that most writers have about what they do. "What do you do?" "Er, well, I'm a bit of a scrivener, I guess."&lt;br /&gt;&lt;br /&gt;By October of 2005, I thought I had it cracked. I thought I was ready to release Scrivener 1.0 on the world and make my fortune (yeah, right). I figured I'd take my queue from the creator of Jerry's Novel Writer and drum up some interest by releasing a beta-version to the folks doing National Novel Writing Month in November. And then the fun really began.&lt;br /&gt;&lt;br /&gt;People actually started to use it. And as they started to use it, they made suggestions. At first I was mortified; it felt as though they were telling me that my child would be perfect if only his ears were a little smaller. You mean it isn't perfect? But as I used it more and more, I saw that they were right: it was nowhere near perfect. For a start, it had four different modes - one for importing stuff, one for composing, one for outlining, one for storyboarding. It was like using four different programs that had been mashed together. A lot of people liked it and are still using the betas I released, but I saw that I could make it much better by integrating the modes. So I created a new interface based on a lot of other Tiger interfaces, and refactored and rewrote a lot of code. And then, after many months, I looked at what I had done, and I said... No, that isn't quite right, either. A lot of users were waiting for the next beta version, so to keep them happy (very important) whilst Scrivener went through its third cycle of development hell, I released the old beta as freeware and called it Scrivener Gold. (Beware folks: if you use Scrivener Gold, stable as it is, it is just that: an old beta version.) And now I'm in that third cycle of development hell... But I'm happy, this time. I took all the user suggestions and incorporated the ones that fit into my design philosophy. I sat down and worked out exactly how the outlining should work, based on user feedback and my own needs, and what I like in outlining programs. I got brave, and I threw out anything that had kitchen-sink-syndrome. I simplified. And then I wrote it all down in a design document and I said: that's it. No more features. Once everything in there is done, and it works, 1.0 is finished and it will be released. So now it's onto putting it all together again. I am giving myself a deadline of September. Wish me luck.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-114963594465848867?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/114963594465848867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=114963594465848867' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/114963594465848867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/114963594465848867'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2006/05/brief-history-of-scrivener-part-3-this_30.html' title='A brief history of Scrivener: Part 3 (This isn&apos;t actually that brief, is it?)'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13975555.post-114943656820150986</id><published>2006-05-29T15:50:00.000Z</published><updated>2006-06-06T23:11:26.873Z</updated><title type='text'>A brief history of Scrivener: Part 2</title><content type='html'>About ten years ago I read some book or other that collected together a number of essays on writing by female writers. One of the essays was by Hilary Mantel, and it was called "Growing a Tale" - I liked it so much that I photocopied it. This is how Hilary Mantel describes her process of putting together a story:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;"When you begin the work on a book - mentally, before anything goes down on paper - you have a lot of ideas, I find, that you know are something to do with the book, which don't seem to relate to each other. You may find a location that seems of interest - or a name may pop into your head - or a phrase. It is important to capture these insights. I carry small notebooks, which I can easily tear pages from; or I carry 3 x 5 inch index cards. I try to put down every insight, every glimpse of what this book will be, even if it's only a word.&lt;br /&gt;&lt;br /&gt;"When I have a few of these cards I pin them up on a cork notice-board in the room where I work. You do not know at this stage what is important - that will emerge. You do not know the order of events - but you don't need to know. Ideas build around these glimpses, these key phrases. Perhaps I write something else on one of my cards, just a few words; or perhaps the original idea begins to develop, and I am moved to write a paragraph or two. I pin that paragraph behind the card to which it relates.&lt;br /&gt;&lt;br /&gt;"The little words breed - sometimes several hundred offspring. I keep them on the board, in any order, until one day I see a sequence, a logic, begin to emerge. Then I repin them, very approximately, very roughly, in the order in which I think the narrative will shape. A few weeks on, all these bits of paper - the original cards, and anything that has accumulated behind them - go into a ring-binder. With a ring-binder you can easily swap the papers around - you're still not committing yourself to an order of events. You can add pages, transpose pages. But now you can begin to see how much of your book you have written. Some incidents, behind their original card, will be fully described, and some characters will be complete with their biographies, snatches of dialogue, their appearance and their way of talking. Other parts of the book will not have 'written themselves' at all - they await focused attention. But you know - indeed, you can see - how much work you have to do.&lt;br /&gt;&lt;br /&gt;"This method is soothing. Its virtue is that you never write yourself into a cul-de-sac; you have flexibility. Until you sit down to write your first draft sequentially, you have not committed yourself to linear narrative. I am amazed at how easily ideas fall into place, how they multiply, if you give them a chance, and if you don't close off their possibilities too early. This is really a method of growing a book, rather than writing one."&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;(Isn't that wonderful? If you can get hold of the book - I've just looked it up and it's called &lt;a href="http://www.amazon.co.uk/exec/obidos/ASIN/014016975X/qid=1149436119/sr=8-2/ref=sr_8_xs_ap_i2_xgl/026-6568339-4401268"&gt;The Agony and the Ego&lt;/a&gt; - go buy it; it's full of other great stuff like that.)&lt;br /&gt;&lt;br /&gt;That is what Scrivener does: it is the notebook, the index cards, the cork notice-board and the ring-binder. When you have your first draft, you export it to Word or Mellel or Nisus Writer or whatever and you hammer out the details, fine-tune and re-format. But until then, you're not committed. You can shuffle, outline, storyboard, annotate and rewrite all you want. If you are one of those writers who sit down at your word processor, type "Chapter One" and keep going in a linear fashion until the end, then you will have no use for Scrivener or any of the other writing packages out there - and I envy you. But me, I have to grow my writing. Very slowly. And my fingers aren't that green. It wilts occasionally. I'm not sure where else I can take this metaphor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-114943656820150986?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/114943656820150986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=114943656820150986' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/114943656820150986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/114943656820150986'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2006/05/brief-history-of-scrivener-part-2.html' title='A brief history of Scrivener: Part 2'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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-13975555.post-114943619427138555</id><published>2006-05-28T16:36:00.000Z</published><updated>2006-06-04T15:49:54.276Z</updated><title type='text'>A brief history of Scrivener: Part 1</title><content type='html'>You know what gets my goat? When people accuse Scrivener - which hasn't even reached version 1.0 yet - of being a rip-off of &lt;a href="http://www.blue-tec.com"&gt;Ulysses&lt;/a&gt;. Let me get this straight: Ulysses is a wonderful application, but it is an original implementation and not an original idea. If you've been on a Mac for a while, you might remember a program called &lt;a href="http://www.stonetablesoftware.com"&gt;Z-Write&lt;/a&gt;. It had a list of documents on the left, and you clicked on one to select it and edit it in the text view on the right. It was around long before Ulysses, but it was nowhere near as sophisticated or beautiful. So in all fairness, if you are a long-time Mac user, you could be forgiven for thinking that Ulysses is the only software of its kind aimed specifically at writers. But I came to the Mac two years ago after being a long-time PC user, and the PC has been rife for some time with applications trying to do what Ulysses does so well: provide an organisational tool for writers. There is &lt;a href="http://www.writewaypro.com"&gt;WriteWay Pro&lt;/a&gt;, &lt;a href="http://www.ravensheadservices.com"&gt;WriteItNow!&lt;/a&gt;, &lt;a href="http://www.newnovelist.com"&gt;NewNovelist&lt;/a&gt;, &lt;a href="http://www.blackobelisksoftware.com"&gt;Liquid Story Binder&lt;/a&gt; and, by far the best in my opinion, &lt;a href="http://www.rsalsbury.co.uk"&gt;RoughDraft&lt;/a&gt;, to name but a few. All of them have some form of list of contents next to a text view for editing a chapter or scene, and they all allow you to keep separate notes for each chunk of text. Sound familiar?&lt;br /&gt;&lt;br /&gt;Oh, and you know what? You never hear anybody complain that &lt;a href="http://www.nisus.com"&gt;Nisus Writer&lt;/a&gt; or &lt;a href="http://www.redlers.com"&gt;Mellel&lt;/a&gt; are rip-offs of Microsoft Word.&lt;br /&gt;&lt;br /&gt;But anyway. The thing about programs aimed at writers is that no one program is going to suit all writers, because all writers work in different ways. Had Ulysses or any of the other writing software programs out there suited the way I write, you can be sure that I would never have created Scrivener. What would be the point? It's not like I'm ever going to make much money out of Scrivener; my only motivation for creating it is that I want software that suits me (more on that later). When I first bought my old iBook, I scoured the net for OS X writing applications, hoping to find the killer app that had eluded me on the PC. When I came across Ulysses, I thought I'd found it. The interface for me came to represent what I was beginning to love about OS X: simplicity and cool. The killer for me was that Ulysses is plain text, though: no formatting whatsoever. Now, I like being a little experimental in the appearance of my text. I'm a Vonnegut fan, so I may well want to put sketches or pictures into my text. (For a really good example of a work that plays with formatting, incidentally, read &lt;a href="http://www.amazon.co.uk/exec/obidos/ASIN/0701173114/qid=1149435545/sr=8-1/ref=sr_8_xs_ap_i1_xgl/026-6568339-4401268"&gt;The Only Good Thing Anyone Has Ever Done&lt;/a&gt; by Sandra Newman. It's all written in bullet points and lists, but it is tremendously moving.) I like the way Salinger adds emphasis to certain syllables of dialogue, so I often do the same, and I didn't want to have to look at text that looks like this while editing: "//Per//fect," he said, "That's //just// what we need." There was another killer for me, too: no hierarchical organisation in the list of documents. I wanted a bit more control in that area. And I know I'm not alone, because the Blue-Tec forums get about a dozen requests a week for italics and hierarchical folders. But Blue-Tec won't do it, and good for them. Good for them, because they have a very strong design philosophy and they're sticking to it. They have something that is beautiful and unique and a lot of users love it, and they shouldn't try to change it into something it's not for those of us who don't work like that. But those of us who don't work like that have to look elsewhere, and that is where Scrivener comes in.&lt;br /&gt;&lt;br /&gt;Was Scrivener influenced by Ulysses? Most certainly. In particular, the full screen mode and the idea of being able to assign each document a label and status were lifted straight from Ulysses. There was no way I could make my perfect writing software without them. But did the whole idea for Scrivener come from Ulysses? Definitely not. The idea for Scrivener came to me back when I was using a PC. Back then it was going to be called BookTree and it was just a pipe dream; it wasn't until I discovered the ease of coding applications for OS X that it became a reality.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-114943619427138555?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/114943619427138555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=114943619427138555' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/114943619427138555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/114943619427138555'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2006/05/brief-history-of-scrivener-part-1_28.html' title='A brief history of Scrivener: Part 1'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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><entry><id>tag:blogger.com,1999:blog-13975555.post-112102002537467247</id><published>2005-07-10T18:21:00.000Z</published><updated>2005-07-11T18:34:33.560Z</updated><title type='text'>If you really want to know about it...</title><content type='html'>It's been about a year since I decided to learn how to program in Cocoa so that I could design and build my own application for writing in. I've been meaning to write down my thoughts on this process and on the reasons I decided to embark on this project for some time, so thought I'd start this 'blog as a place for those, and other, more general, blatherings.&lt;br /&gt;&lt;br /&gt;The last 'blog I started (over on LiveJournal) died a death after only a few entries. It started with a rant on Why I Hate The Lord Of The Rings Films, and degenerated (which was quite a feat in itself) into an angry rant about how someone had stolen my son's name. I'm hoping this one will fare better.&lt;br /&gt;&lt;br /&gt;It's probably safe to say that the reasons for my decision to build a writing application and for me deciding to start this 'blog are one and the same: procrastination. It means I don't have to face the fact that I'm not doing the one thing I should be doing: working on The Novel. It's a strange doublethink: I *want* to work on The Novel, but I feel I can only ever look at it sideways, like the spaceship on the cricket pitch in So Long and Thanks For All the Fish. So I find a hundred other things to do to avoid facing it. One of my favourite quotes in this regard comes from the film Sliding Doors (otherwise complete tosh): when the writer boyfriend of Gwynneth Paltrow bursts into the pub announcing that he's got amazing news, his best friend asks him if he's finished his novel. The writer looks at him with contempt and snaps, "Of course not - I'm a writer, I'll never finish the novel." So at the moment I'm headed the Peter Camenzind route: forever collecting notes and writing down snippets, but never putting it all together.&lt;br /&gt;&lt;br /&gt;There are some good 'blogs out there too (and from here on in, as much as it pains me, I shall abandon the grammatically-correct apostrophe that prefixes 'blog - blog, there we go, that... wasn't... so... pain...ful), so I guess I also want to try my hand at this medium.&lt;br /&gt;&lt;br /&gt;As for the name, Literature and Latté, I always wanted to open up a coffee-cum-bookshop-cum-vegetarian-café with that name. I've probably been beaten to it somewhere - certainly the phrase googles a few hits. But it kind of sets the sort of tone I want for myself here - general coffee-conversational waffle in a bookish setting. And the Marcus Aurelius quote is just there 'cos it's one of my favourites, but it may well prove to be very apt: trite babbling, and I'll probably forget all about the blog after a few posts. God and Guatama, as I used to say when I didn't know any better.&lt;br /&gt;&lt;br /&gt;There, that's as good a blog introduction as any. Or at least, 't'will do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13975555-112102002537467247?l=lit-n-lat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lit-n-lat.blogspot.com/feeds/112102002537467247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13975555&amp;postID=112102002537467247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/112102002537467247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13975555/posts/default/112102002537467247'/><link rel='alternate' type='text/html' href='http://lit-n-lat.blogspot.com/2005/07/if-you-really-want-to-know-about-it.html' title='If you really want to know about it...'/><author><name>kayembi</name><uri>http://www.blogger.com/profile/03248443173867061123</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></feed>
