<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>BookShelf Development Blog</title>
    <link rel="alternate" type="text/html" href="http://www.iphonebookshelf.com/blog/" />
    <link rel="self" type="application/atom+xml" href="http://www.iphonebookshelf.com/blog/atom.xml" />
    <id>tag:www.iphonebookshelf.com,2009-09-07:/blog/1</id>
    <updated>2009-12-06T03:52:08Z</updated>
    <subtitle>Just another WordPress weblog</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.31-en</generator>

<entry>
    <title>QuickBuild!</title>
    <link rel="alternate" type="text/html" href="http://www.iphonebookshelf.com/blog/2009/12/quickbuild.html" />
    <id>tag:www.iphonebookshelf.com,2009:/blog//1.17</id>

    <published>2009-12-06T02:47:44Z</published>
    <updated>2009-12-06T03:52:08Z</updated>

    <summary><![CDATA[This isn't really BookShelf related, but I figured I'd mention it and give props to my favorite continuous integration build tool.BookShelf and ShelfServer's builds have moved from running on Hudson to QuickBuild.&nbsp; I gave Hudson an honest try, but the...]]></summary>
    <author>
        <name>Zachary Bedell</name>
        
    </author>
    
        <category term="BookShelf" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="ShelfServer" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="build" label="build" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="quickbuild" label="quickbuild" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="server" label="server" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.iphonebookshelf.com/blog/">
        <![CDATA[This isn't really BookShelf related, but I figured I'd mention it and give props to my favorite continuous integration build tool.<br /><br />BookShelf and ShelfServer's builds have moved from running on Hudson to <a href="http://www.pmease.com/">QuickBuild</a>.&nbsp; I gave Hudson an honest try, but the object-oriented approach to configuration management in QuickBuild is something I just don't want to live without.&nbsp; Considering I maintain separate distribution paths for beta/release and for full/LT, having to duplicate all of the build settings for each configuration was getting old...&nbsp; <br /><br />QuickBuild allows you to define common elements of a build at a top-level configuration.&nbsp; Each separate release (Full_Release, Full_Beta, LT_Release, etc.) has its own sub-configuration which only overrides the bare minimum that differs between the releases.&nbsp; For most of my builds, that means only one or two variables.&nbsp; Everything else -- source control settings, build scripts, paths, environment variables, etc. is all shared among the multiple configurations.&nbsp; The end result is that going "live" requires <i>minimal</i> configuration changes from what's been tested for weeks or months at a time in the Beta configurations.&nbsp; Fewer variables means fewer bugs, usually....<br /><br />I've used QuickBuild 1.x at $DAY_JOB for a few years now, and it's served us VERY well.&nbsp; The new community license option for QuickBuild 2.x made using it for BookShelf much more attractive.&nbsp; The fact that this will also serve as a good introduction to 2.x for when I finally get around to migrating our server at work doesn't hurt matters either.<br /><br />If you're in need of a build server for a small project, I'd definitely recommend taking a look at QuickBuild.&nbsp; While there are no shortage of free/opensource tools to choose from, if you have any kind of multi-tiered release to worry about, QuickBuild makes life quite a bit simpler.&nbsp; <br /><br />And of course QuickBuild is great for large projects as well -- it builds dozens of projects for us at work.&nbsp; More complicated setups would likely exceed the community license's limitations pretty quickly.&nbsp; Even so, the enterprise license is very reasonably priced considering how much time QuickBuild has saved me.&nbsp; You also get source access with the enterprise license which has been handy for making some enhancements we needed in the StarTeam revision control bindings.&nbsp; Support has been excellent and extremely responsive.&nbsp; They're one of the few vendors I work with (only two others come to mind) that I actually look forward to working with support.<br /><br />Comparing QuickBuild 2.0 to the 1.2.x series I've been using for the last year or so reveals some really nice new features and improvements.&nbsp; I'm definitely liking the new interface so far.&nbsp; It feels like the settings inheritance that QB 1.x had is finally "finished" in 2.0 with the ability to set just about everything at a higher level of the configuration.&nbsp; I love some of the new visual feed back of overrides like where build steps appear faded out in a sub-configuration if they're defined at a higher level.<br /><br />The auto-refresh on build progress is very nice.&nbsp; QB 1.x provided a simple running/pass/fail indication on the summary screen, but 2.x shows step-by-step how the build is progressing.&nbsp; It's a big time saver to be able to see at a glance from the summary screen how far a build has gone without needing to drill down into the textual log files.<br /><br />While I'm not yet really taking advantage of them for BookShelf, I'm looking forward to using the build statistics support for the various test &amp; code quality tools at work.&nbsp; We currently use JUnit, Cobertura, PMD, FindBugs, and Checkstyle.&nbsp; I'm definitely psyched to see support for all of those tools built into QuickBuild.<br /><br />Likewise, while the grid support for distributing builds doesn't really help me for BookShelf, but it will be convenient to be able to scale builds across multiple servers at work rather than needing a single monster buildbox to host everything.&nbsp; <br /><br /><br />So, yeah....&nbsp; That came out sounding a lot more like a paid endorsement than I'd intended, but still QuickBuild rocks. And no, they're not paying me for this. =)<br /><br /><br />In other news, the next release of BookShelf is *just* about ready to go out the door to Apple.&nbsp; This release updates the FeedBooks protocol support to work with recent FB server changes and also has a number of performance and user interface improvements.&nbsp; I've got one more minor bug to fix, and then off it goes.&nbsp; Maybe tomorrow if all goes well.<br /> ]]>
        
    </content>
</entry>

<entry>
    <title>Paul Graham on the AppStore (Apple&apos;s Mistake)</title>
    <link rel="alternate" type="text/html" href="http://www.iphonebookshelf.com/blog/2009/11/paul-graham-on-the-appstore-apples-mistake.html" />
    <id>tag:www.iphonebookshelf.com,2009:/blog//1.16</id>

    <published>2009-11-22T18:30:50Z</published>
    <updated>2009-11-22T19:01:33Z</updated>

    <summary><![CDATA[Paul perfectly covers the bases and pretty much describes my feelings to a tee.Apple's MistakeMy experience with the AppStore has definitely tarnished my opinion of Apple.&nbsp; Before working on the iPhone, I could (and frequently did) with no reservations whatsoever...]]></summary>
    <author>
        <name>Zachary Bedell</name>
        
    </author>
    
        <category term="Articles" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="BookShelf" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="appstore" label="appstore" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="iphone" label="iphone" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="whine" label="whine" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.iphonebookshelf.com/blog/">
        <![CDATA[Paul perfectly covers the bases and pretty much describes my feelings to a tee.<br /><br /><a href="http://paulgraham.com/apple.html">Apple's Mistake</a><br /><br />My experience with the AppStore has definitely tarnished my opinion of Apple.&nbsp; Before working on the iPhone, I could (and frequently did) with no reservations whatsoever rave about how wonderful Apple was and how great they treated their developers.<br /><br />While my iPhone development has been (in my consideration) highly successful (<b>thank you, loyal users, one and all!</b>) there have definitely been days I wonder why I spend a third or more of my life lately working on BookShelf.&nbsp; The money's nice, no doubt (again, thanks!), and I'm currently typing this from my new home, the down payment on which was paid entirely from AppStore proceeds.<br /><br />Money notwithstanding, I have trouble summoning the same rave reviews that once so freely came for Apple and their development ecosystem.&nbsp; Often is the time where during lunch at $DAY_JOB, I find myself ranting about some recent roadblock.&nbsp; My co-workers (mostly Linux &amp; a few Windows heads) occasionally call me on it.&nbsp; I still have the Apple fanboi gene that makes me want to backpedal and make apologies; but they're hollow, and lately I don't even bother.&nbsp; Apple's second biggest strength to me was always how well put together the development environment was and how easy it was to build compelling apps using it.&nbsp; (The biggest strength was of course the well-integrated, JustWorks™ platform they provide.)<br /><br />Working within the restrictions of the AppStore is outright frustrating, and nobody benefits from it.&nbsp; Crap apps still infest the AppStore. Several high-profile security related issues in less-than-legit apps have hit the media and even the courts lately.&nbsp; I spend inordinate amounts of time tip-toeing around functionality that I *know* the phone has (Apple's apps do it, and class-dump tells me so), but I can't touch them because it's "undocumented."&nbsp; And worst of all, buggy, outdated versions of BookShelf sit in the AppStore for weeks or months at a time, in part because the review process takes so long, and in part because I find myself rolling one development cycle into another without even bothering to submit since it's such a pain.&nbsp; I'm honestly not prepared to run branched development while waiting for an approval, but neither can I sit on my hands and do nothing for the month it typically takes to get BookShelf approved.&nbsp; I've had cycles where the app was rejected, and I end up just ignoring it and continuing on for the next cycle since I'm already too far in to unroll my changes.&nbsp; Yes, I should learn not to fear branching, but still...<br /><br />Paul sums up nicely the change in attitude towards Apple describing his feelings on buying the latest iMac recently:<br /><br /><blockquote><font face="verdana" size="2">
I felt the way I'd feel buying something made in a country with a
bad human rights record.  That was new.  In the past when I bought
things from Apple it was an unalloyed pleasure.  Oh boy!  They make
such great stuff.  This time it felt like a Faustian bargain.  They
make such great stuff, but they're such assholes.  Do I really want
to support this company?</font><br /></blockquote>The last few weeks have seen several high profile developers call "I quit!" over various AppStore frustrations.&nbsp; Now don't worry, because I'm not quite ready to throw my towel on the pile yet.&nbsp; Still, the platform can only suffer when hugely talented, highly dedicated, long-time Mac developers decide that Apple's phone is just too much trouble to work with.&nbsp; <br /><br />There'ss no shortage of good, easy to implement suggestions out there that could fix many of the AppStore's problems.&nbsp; One of my personal favorites is the idea of building a "reputation" with a series of good releases and simplifying or omitting entirely the approval process for those apps, subject to strong sanctions for abusing that trust.&nbsp; BookShelf's been in the store since day one, and as far as I know, it hasn't ruined anyone's phone...<br />]]>
        
    </content>
</entry>

<entry>
    <title>Moving Day!</title>
    <link rel="alternate" type="text/html" href="http://www.iphonebookshelf.com/blog/2009/10/moving-day.html" />
    <id>tag:www.iphonebookshelf.com,2009:/blog//1.15</id>

    <published>2009-10-31T16:15:21Z</published>
    <updated>2009-10-31T17:50:16Z</updated>

    <summary><![CDATA[Just a heads up for anyone trying to contact me...&nbsp; We're moving house next week, so I'll be a bit slower than usual responding to email &amp; forum posts &amp; such.&nbsp; My desktop Mac's already packed, so I'm down to...]]></summary>
    <author>
        <name>Zachary Bedell</name>
        
    </author>
    
        <category term="Meta" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="moving" label="moving" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.iphonebookshelf.com/blog/">
        <![CDATA[Just a heads up for anyone trying to contact me...&nbsp; We're moving house next week, so I'll be a bit slower than usual responding to email &amp; forum posts &amp; such.&nbsp; My desktop Mac's already packed, so I'm down to iPhone and scrounged WiFi for my trust old MacBook Pro.<br /><br />Actual move is planned for Thursday, so with any luck by this time next week I'll be semi-functional again.<br />]]>
        
    </content>
</entry>

<entry>
    <title>Presenting at Tech Valley Code Camp</title>
    <link rel="alternate" type="text/html" href="http://www.iphonebookshelf.com/blog/2009/10/presenting-at-tech-valley-code-camp.html" />
    <id>tag:www.iphonebookshelf.com,2009:/blog//1.14</id>

    <published>2009-10-31T16:10:33Z</published>
    <updated>2009-10-31T16:12:44Z</updated>

    <summary>If anyone&apos;s in the Albany, NY area (or will be next week), I&apos;ll be giving a talk about iPhone development at the Tech Valley Code Camp on November 7th at the SUNY Albany campus.Drop by if you can and say...</summary>
    <author>
        <name>Zachary Bedell</name>
        
    </author>
    
        <category term="Meta" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="code" label="code" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="codecamp" label="codecamp" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="iphone" label="iphone" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="presentation" label="presentation" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tvcc" label="tvcc" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.iphonebookshelf.com/blog/">
        <![CDATA[If anyone's in the Albany, NY area (or will be next week), I'll be giving a talk about iPhone development at the <a href="http://www.techvalleycodecamp.com/">Tech Valley Code Camp</a> on November 7th at the SUNY Albany campus.<br /><br />Drop by if you can and say Hi!&nbsp; Room &amp; time are still TBD, but keep an eye on the TVCC website for more info.<br />]]>
        
    </content>
</entry>

<entry>
    <title>Slowness &amp; Crashes in 2.1</title>
    <link rel="alternate" type="text/html" href="http://www.iphonebookshelf.com/blog/2009/09/slowness-crashes-in-21.html" />
    <id>tag:www.iphonebookshelf.com,2009:/blog//1.13</id>

    <published>2009-09-15T01:37:43Z</published>
    <updated>2009-09-15T01:40:14Z</updated>

    <summary><![CDATA[I've noticed a few reviews mentioning poor scrolling &amp; page turning speed in 2.1.&nbsp; The performance differences from 2.0 are caused completely by the new auto-hyphenation feature included in 2.1. &nbsp;If you're unhappy with the performance in 2.1, please try...]]></summary>
    <author>
        <name>Zachary Bedell</name>
        
    </author>
    
        <category term="BookShelf" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="21" label="2.1" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="bookshelf" label="bookshelf" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="crash" label="crash" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="hyphenation" label="hyphenation" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="reviews" label="reviews" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="slow" label="slow" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.iphonebookshelf.com/blog/">
        <![CDATA[I've noticed a few reviews mentioning poor scrolling &amp; page turning speed in 2.1.&nbsp; The performance differences from 2.0 are caused completely by the new auto-hyphenation feature included in 2.1. &nbsp;<br /><br />If you're unhappy with the performance in 2.1, please try setting the Hyphenation option to "(Disabled)" in BookShelf's global settings (accessed from the file listing, rather than inside a book).&nbsp; You should see increased performance when scrolling, faster startup when restoring page position, and possibly also increased stability on certain books.<br /><br />I'm considering removing hyphenation completely from the next build as it's proven to cause more problems than good (IMHO).&nbsp; I'm definitely interested in opinions on that, though.&nbsp; Is there anyone out there who completely loves auto-hyphenation and would be heart broken if it was removed?&nbsp; At the very least, I'm going to make the new out-of-box default to disable hyphenation as it was definitely the cause for some of the upgrade crashes seen in 2.1-take-one.<br /><br /><br />Input, as always is appreciated, though I'd <i><b>GREATLY</b></i> appreciate it if any prospective reviewers might post on the forums or drop me an email with their problems before reviewing.&nbsp; Often enough, I have a quick fix available, and if not, I'm always trying to improve BookShelf based on user input. &nbsp;<br /><br />I don't always see reviews, largely because reading about problems I'm powerless to help is just plain depressing.&nbsp; Drop me an email, and I'll do my best to help.&nbsp; If you just write a review, I have no way to tell you that there might just be a quick switch to flip and make BookShelf work the way you expect.&nbsp; Granted, I don't always get to every email as fast as I'd like.&nbsp; If I've ignored you, my apologies, please feel free to dis me in a review.&nbsp; In that case, I deserve it.&nbsp; Alas, being a one-man operation, there's only so many hours, and some email do fall through the cracks.&nbsp; <i>Mea culpa</i>...<br /><br />(Cross-posted to <a href="http://www.iphonebookshelf.com/forum/read.php?10,952">forums</a>)<br /> ]]>
        
    </content>
</entry>

<entry>
    <title>Wordpress be gone!</title>
    <link rel="alternate" type="text/html" href="http://www.iphonebookshelf.com/blog/2009/09/wordpress-be-gone.html" />
    <id>tag:www.iphonebookshelf.com,2009:/blog//1.12</id>

    <published>2009-09-08T00:31:05Z</published>
    <updated>2009-09-08T00:40:04Z</updated>

    <summary><![CDATA[Minor detour to migrate to Movable Type...&nbsp; I'm still not sure I like their Open Source attitude, but their security track record certainly beats WordPress into the ground.&nbsp; WP's reaction to latest worm attack on their software kind of finished...]]></summary>
    <author>
        <name>Zachary Bedell</name>
        
    </author>
    
        <category term="BookShelf" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Website" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="blog" label="blog" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="bookshelf" label="BookShelf" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="lit" label="LIT" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="pdf" label="PDF" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sdk" label="SDK" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="shelfserver" label="ShelfServer" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.iphonebookshelf.com/blog/">
        <![CDATA[Minor detour to migrate to Movable Type...&nbsp; I'm still not sure I like their Open Source attitude, but their security track record certainly beats WordPress into the ground.&nbsp; <br /><br />WP's reaction to latest worm attack on their software kind of finished me off on the platform.&nbsp; ("What?&nbsp; You didn't update the day after we released a new version?&nbsp; Oops!&nbsp; Hope you don't get hacked!")...&nbsp; WordPress updates are a protracted pain in the neck, in part because their auto-updater seems not to work on the local files but only via FTP and because they've evidently never heard of SCP.&nbsp; I can't even <i>remember</i> the last server I built that had an FTP server on it....<br /><br />For the record, neither this site nor my personal site were in fact hacked, but given that I was able to migrate all content to Movable Type in about the same time a WordPress update typically takes me to install, I'll call it a step forward.<br /><br />Even setting up the themes was relatively painless once I got the hang of their templating system.<br /><br /><br />In BookShelf related news, it's been a fairly productive long weekend.&nbsp; I've got image support in PDF's mostly working and LIT support looking relatively stable.&nbsp; I also managed to get BookShelf working more or less under the 3.0 SDK, but it's crashing like mad for some reason.&nbsp; Some posts I've read online suggest that it may be the fault of the 3.0 SDK and that a future build may fix it.&nbsp; I can't see any possible way I'll have another update ready before Apple releases 3.1, so hopefully everything will just fall into place.<br /> ]]>
        
    </content>
</entry>

<entry>
    <title>2.1.2198</title>
    <link rel="alternate" type="text/html" href="http://www.iphonebookshelf.com/blog/2009/08/2-1-2198.html" />
    <id>tag:www.iphonebookshelf.com,2009:/blogmt//1.11</id>

    <published>2009-08-27T03:09:33Z</published>
    <updated>2009-09-08T00:05:25Z</updated>

    <summary><![CDATA[2.1.2198 just hit the AppStore.&nbsp; A million thanks to Apple for rushing this one through for me!!! This should fix the crashing issue with the original 2.1 release.&nbsp; The change to this version will make BookShelf not reload the previously...]]></summary>
    <author>
        <name>Zachary Bedell</name>
        
    </author>
    
        <category term="BookShelf" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Releases" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.iphonebookshelf.com/blog/">
        <![CDATA[2.1.2198 just hit the AppStore.&nbsp; A million thanks to Apple for rushing this one through for me!!!

<br /><br />This should fix the crashing issue with the original 2.1 release.&nbsp; The change to this version will make BookShelf not reload the previously read file after a crash.&nbsp; Anyone who's currently stuck in a crash loop should apply the update &amp; launch BookShelf.&nbsp; It will probably crash or lock up *one* more time.&nbsp; Force-quit*&nbsp; BookShelf if necessary, and thereafter you should be fine.

<br /><br />Sorry again for the bumpy ride on this one!

<br /><br />* If you need to force-quit in case BookShelf hangs instead of crashing, do the following:

<br /><br />For 2.x devices, hold the Home button until the app disappears.

<br /><br />For 3.x devices, hold the Power button until the Slide to Turn Off screen appears, then release the Power button and hold the Home button until the app disappears &amp; the home screen reappears.]]>
        
    </content>
</entry>

<entry>
    <title>Issues with 2.1 update</title>
    <link rel="alternate" type="text/html" href="http://www.iphonebookshelf.com/blog/2009/08/issues-with-2-1-update.html" />
    <id>tag:www.iphonebookshelf.com,2009:/blogmt//1.10</id>

    <published>2009-08-26T12:26:29Z</published>
    <updated>2009-09-08T00:06:04Z</updated>

    <summary>I&apos;m still not sure what&apos;s going on with this update to BookShelf, but some users have run into issues after upgrading from the AppStore. I have an update in with Apple which they&apos;ve agreed to expedite (not sure what that...</summary>
    <author>
        <name>Zachary Bedell</name>
        
    </author>
    
        <category term="BookShelf" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Releases" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="bookshelf" label="BookShelf" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="bug" label="bug" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="crash" label="crash" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="lockup" label="lockup" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="oops" label="oops" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.iphonebookshelf.com/blog/">
        <![CDATA[<p>I'm still not sure what's going on with this update to BookShelf,
but some users have run into issues after upgrading from the AppStore.
I have an update in with Apple which they've agreed to expedite (not
sure what that means in terms of approval time) which prevents the
constant lockup issue by not trying to re-open the previously read book
after a crash. I'm still in the dark as to what's causing the crash at
this point.</p>
<p>In the mean time, the only work around I can offer is to delete
BookShelf from your phone and reinstall it (for free of course) from
the AppStore. You will of course need to re-download all your books,
but the stuck/crashing issue won't reoccur.</p>
<p>Sorry for the horrible upgrade experience on this version. I wish I
could have found this issue before release, but I have a hunch that it
has something to do with how the AppStore upgrade process works. None
of my beta testers ran into it because beta versions are installed
manually through iTunes and never come over the AppStore. At least
that's my best guess...</p>
<p>If you can afford to wait a day or two, the update with the fix may
be out quickly, but of course there's no way to predict AppStore
approval times.</p>
<p>Sorry about this one, folks!</p>]]>
        
    </content>
</entry>

<entry>
    <title>2.1 available in AppStore</title>
    <link rel="alternate" type="text/html" href="http://www.iphonebookshelf.com/blog/2009/08/2-1-available-in-appstore.html" />
    <id>tag:www.iphonebookshelf.com,2009:/blogmt//1.9</id>

    <published>2009-08-23T14:06:35Z</published>
    <updated>2009-09-07T21:38:02Z</updated>

    <summary>It dropped Saturday evening.  Enjoy!...</summary>
    <author>
        <name>Zachary Bedell</name>
        
    </author>
    
        <category term="BookShelf" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Releases" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.iphonebookshelf.com/blog/">
        It dropped Saturday evening.  Enjoy!
        
    </content>
</entry>

<entry>
    <title>BookShelf 2.1 submitted</title>
    <link rel="alternate" type="text/html" href="http://www.iphonebookshelf.com/blog/2009/07/bookshelf-2-1-submitted.html" />
    <id>tag:www.iphonebookshelf.com,2009:/blogmt//1.8</id>

    <published>2009-07-28T17:04:13Z</published>
    <updated>2009-09-08T00:07:20Z</updated>

    <summary><![CDATA[Version 2.1 has been submitted to Apple.&nbsp; Now we wait to see whether the Vatsyayana Curse will hit me this time, having dodged it twice before. The new feature list in 2.1 is fairly extensive.&nbsp; Top on the list are:...]]></summary>
    <author>
        <name>Zachary Bedell</name>
        
    </author>
    
        <category term="BookShelf" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Releases" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="apple" label="apple" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="bookshelf" label="BookShelf" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="release" label="release" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="waiting" label="waiting" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.iphonebookshelf.com/blog/">
        <![CDATA[Version 2.1 has been submitted to Apple.&nbsp; Now we wait to see whether the Vatsyayana Curse will hit me this time, having dodged it twice before.

<br /><br />The new feature list in 2.1 is fairly extensive.&nbsp; Top on the list are:
<ul>
	<li>Searching</li>
	<li>Dictionary support</li>
	<li>Customizable color themes</li>
	<li>Copy &amp; Paste</li>
	<li>Parental Controls</li>
	<li>Table of Contents (not just a link in the document)</li>
</ul>
And of course the usual handful of stability &amp; performance improvements.

<br /><br />With any luck, 2.1 should arrive for updating in the next couple of weeks.]]>
        
    </content>
</entry>

<entry>
    <title>OpenSource ShelfServer released</title>
    <link rel="alternate" type="text/html" href="http://www.iphonebookshelf.com/blog/2009/07/opensource-shelfserver-released.html" />
    <id>tag:www.iphonebookshelf.com,2009:/blogmt//1.7</id>

    <published>2009-07-05T17:16:58Z</published>
    <updated>2009-09-08T00:07:46Z</updated>

    <summary><![CDATA[It took me long enough, but source for the ShelfServer is finally available.&nbsp; If you'd like to setup your own server, there are hooks to customize security, and some other assorted goodies. Source links are here:&nbsp; http://www.iphonebookshelf.com/trac/wiki/ShelfServer The source is...]]></summary>
    <author>
        <name>Zachary Bedell</name>
        
    </author>
    
        <category term="ShelfServer" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="gpl" label="gpl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="opensource" label="opensource" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="shelfserver" label="ShelfServer" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="source" label="source" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.iphonebookshelf.com/blog/">
        <![CDATA[<p>It took me long enough, but source for the ShelfServer is finally
available.&nbsp; If you'd like to setup your own server, there are hooks to
customize security, and some other assorted goodies.</p>
<p>Source links are here:&nbsp; http://www.iphonebookshelf.com/trac/wiki/ShelfServer</p>
<p>The source is made available under the terms of the GNU General Public License, version 3.</p>
<p>Please post any questions or issues with the source release in the
support forum: http://www.iphonebookshelf.com/forum/list.php?17</p>
<p>The source release is of course provided as-is, without warranty,
and is officially unsupported. I'll do anything I can to help, but if
it breaks, you get to keep the pieces.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Searching for something?</title>
    <link rel="alternate" type="text/html" href="http://www.iphonebookshelf.com/blog/2009/05/searching-for-something.html" />
    <id>tag:www.iphonebookshelf.com,2009:/blogmt//1.6</id>

    <published>2009-05-22T12:31:56Z</published>
    <updated>2009-09-08T00:08:06Z</updated>

    <summary><![CDATA[I've been frantically coding away at BookShelf for the past few weeks, and search is just about ready to go.&nbsp; I should have a beta out this weekend with it, and I'm thinking a point release in the next couple...]]></summary>
    <author>
        <name>Zachary Bedell</name>
        
    </author>
    
        <category term="BookShelf" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="beta" label="Beta" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="organiazation" label="organiazation" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="planning" label="planning" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="search" label="search" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="settings" label="settings" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.iphonebookshelf.com/blog/">
        <![CDATA[<p>I've been frantically coding away at BookShelf for the past few
weeks, and search is just about ready to go.&nbsp; I should have a beta out
this weekend with it, and I'm thinking a point release in the next
couple of weeks to Apple which will include search as well as on-device
file organization (which is already in the current beta).</p>
<p>After that, I plan to work on color customization, an in-app sales
interface to buy books online, and a few other assorted goodies that
should hopefully be ready in time for BookShelf's first birthday.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Espresso Live Preview with Chrome, hold the Copypasta</title>
    <link rel="alternate" type="text/html" href="http://www.iphonebookshelf.com/blog/2009/04/espresso-live-preview-with-chrome.html" />
    <id>tag:www.iphonebookshelf.com,2009:/blogmt//1.5</id>

    <published>2009-04-30T02:16:15Z</published>
    <updated>2009-09-08T00:09:11Z</updated>

    <summary>It seems like ages now that I&apos;ve sought the &quot;perfect&quot; website design tool. Ever since the dark days of FrontPage, I&apos;ve loathed HTML generators with their bloated markup and non-standards compliance. Still, while hand-coding XHTML is clearly the One True...</summary>
    <author>
        <name>Zachary Bedell</name>
        
    </author>
    
        <category term="Articles" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Website" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ant" label="ant" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="espresso" label="espresso" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="freemarker" label="freemarker" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="website" label="Website" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="xslt" label="xslt" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.iphonebookshelf.com/blog/">
        <![CDATA[<p>It seems like ages now that I've sought the "perfect" website design tool.  Ever since the dark days of FrontPage, I've loathed HTML generators with their bloated markup and non-standards compliance.  Still, while hand-coding XHTML is clearly the One True Path to Enlightenment, I'm no Buddha; and being able to do things WYSIWYG from time to time is a nice crutch.  At the very least, I need a quick at hand live preview so that while I walk the Eight (below the) Fold Path, I can get a feel for what my page looks like as I'm writing it.</p>

<p>I spent a few weeks not long ago searching out Mac web design tools and putting them through their paces.  I looked at full WYSIWYG tools like <a href="http://www.karelia.com/">Sandvox</a> and <a href="http://www.realmacsoftware.com/rapidweaver/">Rapidweaver</a>, but both were a bit too invasive in terms of site layout, and neither allowed mixing rich text editing with manual markup creation while still providing a constant live preview.</p>

<p>I've always got my beloved <a href="http://macromates.com/">TextMate</a> to fall back on for markup editing, but Apple-Tabbing and hitting refresh in a browser isn't exactly what I have in mind for live preview.</p>

<p>I tried out <a href="http://www.panic.com/coda/">Coda</a> for a while, but decided to Refrain from that.  Nice enough, but not quite.  Finally I settled on <a href="http://macrabbit.com/espresso/">Espresso</a>, in part because it finally unlocked in the last <a href="http://www.macheist.com/">MacHeist</a>, but more because I already fell in love with <a href="http://macrabbit.com/">MacRabit's</a> <a href="http://macrabbit.com/cssedit/">CSSEdit</a> which I still use extensively for editing pages that haven't quite turned into "sites" of their own yet.</p>

<p>Espresso's not bad, all told.  It's got live preview which you can tear off into its own window.  It would be nice if you could dock the preview window to the top or bottom of the editor, but so be it.  Espresso doesn't have any kind of rich text editing, but with the rapidly updating live preview, I can pretty much live without that.  I still write better markup than any generator I've ever run into.</p>

<p>Still, I was left with the problem of chrome.  Espresso does make some valiant effort to preview script files like PHP, but it took one look at my pages and curled up in a ball whimpering in the corner.  So I write complicated PHP pages....  It was about that point I decided to scrap PHP for the content pages in the site anyways, so no biggie.  But the last thing I wanted to do was end up with all the chrome on every single page.  What a maintenance nightmare...</p>

<hr />Instead, I came up with a publishing process which applies the site chrome to bare XHTML pages as the site is uploaded.  Each page is well-formed XHTML which has an <strong>html</strong> and mostly empty <strong>head</strong> tag (the <strong>title</strong> is set in each page), and a <strong>body</strong> tag with only the main (center) content of each page.  All of the top/side navigation, colors, CSS, etc. is left off.

<p>I wrote a bit of <a href="http://ant.apache.org/">Ant</a> script which prepares the XHTML pages before upload.  I went with Ant mostly because it's the devil I know very well, being a Java coder by day.  Bash, Perl, or &lt;insert scripting language&gt; would surely have served just as well.  The Ant script compiles and executes a few Java classes which connect to my MySQL server to get news and FAQ's which are output to XHTML snippets using <a href="http://freemarker.org/">Freemarker</a> templates (again, the devil I use every day).  Finally the Ant script executes an XSLT transformation on all of the XHTML files to apply the chrome and output static HTML files which contain all of the chrome, ready to upload.</p>

<p>This way I only have to update the chrome in one place, but I still don't need any scripting on the webserver to display everything.  All of that's great except that live preview only ever shows black text on a white background.  Not too helpful that.  Today I finally found the missing link.</p>

<hr />It's always been in the back of my mind that web browsers can apply XSLT transforms to XML files on the fly when they load them.  The Daily WTF's <a href="http://thedailywtf.com/Articles/Stupid-Coding-Tricks-XSLT-Mandelbrot.aspx">XSLT Mandlebrot</a> reminded me of that this morning.  As it turns out, the Safari-based live preview in Espresso honors XML processing directives as well, and so my prayers were finally (mostly) answered.

<p>I had to tweak my XSLT a little bit to make it work.  It appears that Safari only has an XSLT 1.0 parser whereas Firefox happily takes XSLT 2.0.  Fortunately I didn't have to change much to make 1.0.  I had to default some of the xsl:param elements that are normally sent in from Ant to sensible values and also rename all of my source files from .html to .xhtml to get everything to work.</p>

<p>The final result is that I have plain XHTML files with no chrome and live preview WITH the chrome appearing in Espresso.  I can edit the basic XHTML files; and in less than a second, the preview updates with all of its chrome-y goodness.  The changes to make it all work are pretty minimal.</p>

<p>First, the web pages themselves:  All pages must be well-formed valid XHTML.  A minimum example looks something like this:<br />
<blockquote><tt>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;<br />
&lt;?xml-stylesheet type="text/xsl" href="apply-style.xsl"?&gt;<br />
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;News&lt;/title&gt;<br />
&lt;link href="style.css" rel="stylesheet" type="text/css"/&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;</tt></p>

<p><tt>&lt;div&gt;Put your main content here.&lt;/div&gt;</tt></p>

<p><tt>&lt;/body&gt;<br />
&lt;/html&gt;<br />
</tt></blockquote><br />
The file starts with an xml declaration and the XHTML doctype followed by an xml-stylesheet processing directive.  That's where the real magic happens.  That directive points to an XSL file in the same directory which can process this page's XML to create the final page.  Below that are the rest of a simple XHTML page.  The link to the CSS fools Espresso into thinking that there's a stylesheet that can be edited and overridden for this page.  The link element is actually replaced by the XSLT, but it does the job of allowing the CSS to be edited.  Finally inside the body is the main content of the page, no chrome required.</p>

<p>The XSLT file that brings the whole thing together looks something like this:<br />
<blockquote><tt>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;xsl:stylesheet<br />
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"<br />
xmlns:html="http://www.w3.org/1999/xhtml"<br />
xmlns="http://www.w3.org/1999/xhtml"<br />
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
xsi:schemaLocation="http://www.w3.org/1999/xhtml dtd/xhtml1-strict.xsd"<br />
exclude-result-prefixes="html"<br />
version="1.0"&gt;</tt></p>

<p><tt>&lt;xsl:strip-space elements="*"/&gt;</tt></p>

<p><tt>&lt;xsl:output<br />
indent="no"<br />
media-type="text/html"<br />
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"<br />
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"<br />
cdata-section-elements="html:style html:script"<br />
/&gt;<br />
&lt;!-- Default is just copy everything. --&gt;<br />
&lt;xsl:template match="@*|node()"&gt;&lt;xsl:copy&gt;&lt;xsl:apply-templates select="@*|node()"/&gt;&lt;/xsl:copy&gt;&lt;/xsl:template&gt;</tt></p>

<p><tt>&lt;xsl:template match="/"&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;&lt;xsl:value-of select="/html:html/html:head/html:title"/&gt;&lt;/title&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/&gt;<br />
&lt;meta name="description" content="EBook reader for iPhone or iPod Touch"/&gt;<br />
&lt;meta name="keywords" content="iphone,ebook,e-book,reader,electronic,ipod"/&gt;<br />
&lt;link href="{$httpRoot}style.css" rel="stylesheet" type="text/css"/&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;div id="header"&gt;<br />
Header stuff goes here.<br />
&lt;/div&gt;</tt></p>

<p><tt>&lt;div id="content"&gt;<br />
&lt;div id="maincontent"&gt;<br />
&lt;xsl:comment&gt;=======Main Content Starts Here=======&lt;/xsl:comment&gt;<br />
&lt;xsl:apply-templates select="/html:html/html:body/*"/&gt;<br />
&lt;xsl:comment&gt;========Main Content Ends Here========&lt;/xsl:comment&gt;<br />
&lt;/div&gt;</tt></p>

<p><tt>&lt;div id="sidecontent"&gt;<br />
Side-nav content here<br />
&lt;/div&gt;<br />
&lt;/div&gt;</tt></p>

<p><tt>&lt;div id="footer"&gt;<br />
&lt;div id="copyrightdesign"&gt;Copyright © 2008-2009 Zachary Bedell. All rights reserved.&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
&lt;/xsl:template&gt;<br />
&lt;/xsl:stylesheet&gt;<br />
</tt></blockquote><br />
The above template is greatly simplified, but it gets the idea across.  The real version has code to include the XML files containing site news &amp; FAQ's where appropriate, a template which calculates the correct value of {$httpRoot} based on the current sub-directory level, and some other BookShelf specific stuff.  When I need to update the chrome for the site, the XSLT is the only file I need to touch (plus maybe the CSS if it's a formatting change).  Once the XSLT is updated, re-running the Ant script generates new HTML files and SCP's them up to my Mac Mini webserver.</p>

<p>To make all of this work in Espresso, you need to ... do nothing.  Just open or create a project for your files, open an XHTML file and launch a live preview for it.  Done!</p>]]>
        
    </content>
</entry>

<entry>
    <title>ShelfServer Beta - ePub Support</title>
    <link rel="alternate" type="text/html" href="http://www.iphonebookshelf.com/blog/2009/04/shelfserver-beta-epub-support.html" />
    <id>tag:www.iphonebookshelf.com,2009:/blogmt//1.4</id>

    <published>2009-04-22T04:04:45Z</published>
    <updated>2009-09-08T00:09:46Z</updated>

    <summary><![CDATA[Just posted to the ShelfServer beta distribution is preliminary support for ePub format books. For anyone new to BookShelf's beta releases, please keep in mind the true meaning of the word BETA: Barely Even Tested At all...&nbsp; I've managed to...]]></summary>
    <author>
        <name>Zachary Bedell</name>
        
    </author>
    
        <category term="Beta" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="ShelfServer" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="beta" label="Beta" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="epub" label="epub" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="shelfserver" label="ShelfServer" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.iphonebookshelf.com/blog/">
        <![CDATA[Just posted to the ShelfServer beta distribution is preliminary support for ePub format books.
<br /><br />For anyone new to BookShelf's beta releases, <em>please</em> keep in mind the true meaning of the word <strong>BETA</strong>: <em>Barely Even Tested At all</em>...&nbsp; I've managed to get this working on a <a href="http://www.feedbooks.com/book/1918">couple</a> of <a href="http://www.feedbooks.com/book/2466">favorite</a> ePub's from <a href="http://www.feedbooks.com/">FeedBooks.com</a>, but it's certainly possible you may have trouble with it.&nbsp; Still, if you're feeling adventurous...

<a href="http://www.iphonebookshelf.com/webstartbeta/shelfserver.jnlp">ShelfServer Beta</a>]]>
        
    </content>
</entry>

<entry>
    <title>Obligatory App Store Complaint</title>
    <link rel="alternate" type="text/html" href="http://www.iphonebookshelf.com/blog/2009/04/obligatory-app-store-complaint.html" />
    <id>tag:www.iphonebookshelf.com,2009:/blogmt//1.3</id>

    <published>2009-04-22T01:37:53Z</published>
    <updated>2009-09-08T00:11:08Z</updated>

    <summary><![CDATA[And it's not even my own rant.&nbsp; Just a link to someone else's: [...] but when Apple ties my hands behind my back and lets users punch me publicly in the face without allowing me to at least respond back,...]]></summary>
    <author>
        <name>Zachary Bedell</name>
        
    </author>
    
        <category term="Articles" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="appstore" label="appstore" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rant" label="rant" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="reviews" label="reviews" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="support" label="support" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.iphonebookshelf.com/blog/">
        <![CDATA[And it's not even my own rant.&nbsp; Just a link to someone else's:
<blockquote>[...] but when Apple ties my hands behind my back and lets users punch me publicly in the face without allowing me to at least respond back, it&#8217;s hard to get excited about building an app.</blockquote>
<a href="http://log.maniacalrage.net/post/98510137/a-little-over-a-week-and-a-half-ago-google">http://log.maniacalrage.net/post/98510137/a-little-over-a-week-and-a-half-ago-google</a>

<br /><br />The desire to link that that post is actually what pushed me over the edge to finally setup WordPress on the site.&nbsp; Mr. Murray rather tidily sums up most of my major frustrations with the app store.&nbsp; The number of, "I couldn't figure out how to do <em>foo</em>!&nbsp; This app sucks!" reviews I've read is disgusting.&nbsp; Of course none of them ever bother to email me or post in the forums...

<br /><br />If you're reading this contemplating a review, please for the love of Steve, at least drop an email to support at iphone bookshelf dot com first.&nbsp; If I can possibly help you I will.]]>
        
    </content>
</entry>

</feed>
