The Stochastic Game

Ramblings of General Geekery

Graphicly: Continually Evolving For Content Publishers

Graphicly just announced a dramatic change of direction:

In challenging ourselves to think broader and wider, we stumbled on a very simple idea: the best place to sell books is in a bookstore. It’s an idea that’s worked for hundreds of years in the real world, so why not extend that to the digital world. Additionally, with close to a hundred million installs of Kindle, iBooks, Nook and others (and not to mention the close to a billion Facebook users) it makes complete sense to provide a platform for publishers and creators to take advantage of those native marketplaces.

They’re basically dropping out of the digital comics store race to focus on helping publishers digitize their content and delivering it on existing, well-established digital stores.

It means I did well not to buy any books on Graphicly and recommending to always go through a publisher’s official store. However, it sucks for people who did buy books on their app. The Graphicly app won’t be available for download anymore, and unless you still have it on your tablet or phone, you will have to read your comics on the web reader. Since it’s not uncommon for a smartphone or tablet to have a problem that forces a factory reset of some sort, or for a user to upgrade to a new portable device, it means those previously purchased comics are lost — who wants to read comics in a browser, and how long until Graphicly eventually unplugs all those servers that only lose money?

Although I wish the Graphicly guys all the best, it’s a harsh reminder that digital goods, for all the advantages they have on traditional goods, come with a lots of problems when they are locked into an ecosystem (whether it’s with DRM or just web-service obfuscation). I hope that we’ll see the same kind of revolution we’ve seen with digital music — but in the meantime, it reinforces my opinion that you should use whatever means necessary to get yourself a personal backup of anything you buy online.


Announcing PieCrust For Vim

After my Mercurial plugin for Vim, Lawrencium, here’s my second official Vim plugin! You won’t be surprised to know it’s a PieCrust plugin which adds a few commands that make it easier to work on your website. It’s of course named “vim-piecrust” and is available on BitBucket.

Old Time Tropical Pie

Well, actually, at the moment it’s only got on command: Pcedit. You will need the latest PieCrust to make it work. When you do, typing :Pcedit something<tab> in Vim will bring an autocomplete list that contains any page, post or template that contains “something” in its filename. It makes it very quick to edit files in your website.

I’ll add more commands in the future of course.


The Journey To Digital Comics: US Comics Apps

The first step in the journey to digital comics was to figure out what kind of hardware device to use. I concluded at the time that either the Transformer Prime or the iPad were the best choices available (the first one for its ideal aspect ratio and superior resolution, and the second one for its better use as a general tablet device). Since then, the New iPad (or iPad 3 if you read this 2 years in the future… thank you Apple) was released with a new fantastic display that makes it the best reading tablet on the market, so you may want to look into this one as well.

IMG_6095.jpg

The second step is to find out what channels are available to get your american comics fix.

The Elephant in the Room

Before we get to the real stuff, let me rant a bit on the subject everyone knows about: piracy. Like any other media, comic books are pretty easy to find on torrent websites or newsgroups, and it’s handy to download that stuff for free. You can then use an app like FileBrowser or even Dropbox to get the
files on your tablet, and use any of the pretty decent comicbook viewers, like Bookman, to read them.

But where I really don’t care one way or the other when it comes to movies and TV, the comics medium is much more special to me and I refuse to go through illegal means. First, pretty much none of the comics authors are nearly as wealthy as a movie actor or director – at least not the kind of actor or director whose movies you would steal. Second, it’s not like the comic industry has ever been doing well. Third, I just really want to give my money to those guys. I even purposedly avoid buying comics through iOS’s in-app purchases to make sure as much of my money as possible goes to the authors (skipping Apple’s 30% tax).

The Big Ones

Comixology

IMG_6104.jpg

When it comes to american comics, the one app that’s slowly taking over the whole market is Comixology’s Comics app, available on iOS, Android and Kindle Fire at the time of this writing. You can also read comics in any Flash-friendly browser.

It’s got a very decent catalog, and it’s constantly expanding with back issues. A few indie publishers have deals with them, along with the big ones, including DC, Marvel and Image. DC even uses Comixology as their official digital store.

One of the cool things is that those publishers came to their senses relatively quickly and now offer “same day digital” books, where new issues are available in digital format at the same time they are available in your friendly neighbourhood comic store.

Prices for new issues are between $2 and $4 (which ranges from “Ok” to “Kinda expensive”), but those prices fall down to $1 to $3 for older issues. They also have very frequent sales – not all of which would be of interest to you, of course, but it’s still a welcome policy.

Dark Horse

IMG_6102.jpg

Dark Horse decided to not go the Comixology way like the other big guys. It could have been a disaster – sometimes if you want something done right, it’s best not to do it yourself, especially if that’s not your core business – but it turned out ok.

Their online store is decent, and has a nice feature where you can search directly for “bundles” (the rough equivalent of a TPB). Prices are similar to those on Comixology, and the catalog seems well furnished (at least they have all the series I follow). As far as I can tell, they also got on board with the “same day digital” idea, which is good.

Their apps (iOS and Android at the moment) get the job done, but are not as smooth as Comixology’s. For example, you can’t start reading a comic while it’s downloading, and the navigation is sometimes a bit weird.

Graphicly

IMG_6103.jpg

I really wanted Graphicly to succeed in the market: it’s obviously run by people who love comics, and they advocate open, standardized formats that put the reader in control. But this kind of philosophy is a sure way to alienate publishers, and it’s a miracle to me that they still got, among others, Marvel or Image on board somehow, even if it’s only for a small percentage of their catalog (Marvel currently has 125 series on Graphicly and Image 111, compared to respectively 525 and 336 on Comixology).

So even though you could buy some mainstream comics on Graphicly, I’d have a hard time recommending it – you would have to split your collection between there and over at Comixology eventually, and, as we’ll see shortly, it’s better to not go through intermediaries.

Still, Graphicly has some value because they have the biggest indie comics catalog.

edit 2012/05/04: Graphicly stopped being a digital store.

The Fine Print

At this point, you would think everything’s wonderful: those apps are way more convenient than piracy, comics are available as soon as possible and everywhere (as far as I can tell – I’m in Canada), the prices are a bit high but not outrageous, you can read your books on a lot of different devices, and most of the stuff you want to buy is available to begin with (something that would seem like “yeah, duh”, but is still not obvious to the movie and TV people)… they even get a few more things right, like giving away for free the first issue of many critically acclaimed series. But it’s not all roses, sadly.

First, you don’t really own your books – they’re more licensed to you than anything else. They’re stored in a somewhat obfuscated manner on your device, or in your web-browser’s cache, and that means you can never get to the files in case you want a personal backup, or just want to read them in a different comic reader whose interface you prefer. Not that this was ever a real problem so far, but it sure is bugging me.

Second, because we’re dealing with cloud storage, usual questions like “what happens to my purchases if Comixology or Graphicly goes bankrupt?” will pop up in your head every now and then. My only solution to that problem is to cut the middle man and, as much as possible, buy your comics from the source. This means buying Marvel comics from their own digital store, DC comics from Comixology (which is their official digital store) and so on. Sadly, it means pushing guys like Graphicly out of the game (except for indie comics), but at least your money and purchase records are stored with the guys you really got your stuff from, and that’s your best chance of not getting screwed in a few years.

Third, whatever app you choose to buy a comic through will be the app you need to read it with – as if you had to use a different music player depending on where you bought a song. It’s another non-problem – as long as all readers have a decent interface and rendering engine – but it’s also slightly annoying.

The Marvel Problem

added 2012/03/30

It should be noted that Marvel is its own little world of problems at the moment. Early on, their digital strategy was quite confusing. Some of those problems disappeared – I can’t seem to find comics priced differently across apps anymore – but some remain:

  1. As far as I know, Marvel is the only publisher that uses Comixology software with their own database. Both DC and IDW apps are Comixology based, and comics bought through their store are also available in the main Comixology app (and vice versa). Not so much with Marvel, where the 2 apps are completely separate.
  2. The Marvel Unlimited Subscription sounds like a good deal: for a flat monthly fee you can read as many comics as you want. You may not get the full Marvel catalog or all the new hot releases, but it’s very interesting if you want to read all the famous golden and silver age story arcs from a few decades ago. The problem is that the Marvel Unlimited Subscription is not available on mobile devices. Yes, you read that right: the only sensible way to read a digital comic is not acceptable when it comes to reading a shitload of comics. And Marvel will not quite tell you in a straight way: instead they just mention, in small print, that it “requires Flash & internet-connected PC or Mac”. You have to guess that this excludes tablets and phones… or you do like me: get the subscription, realize after 30 seconds that it doesn’t work in their own fucking app, and ask for a refund. Marvel, you are fucked up.

Conclusion

A summary of all of the above is that I read my Marvel comics on the Marvel app, my Dark Horse comics on the Dark Horse app, and everything else on Comixology. And when I need to buy something, I avoid the in-app purchases and Apple’s 30% tax, and go instead to the app’s web store in Safari.

In the next step we’ll deal with reading digital mangas, and then move on to the pros and cons and whether digital comics are right for you.


Who Buys Books?

Tim Bray on buying books:

This works because Amazon doesn’t mind multiple devices at once having access to a book; and because our “Amazon identity” is a lightweight shopping-context thing, not like a “This is really me” Facebook or G+ identity.

This highlights a very important thing about Internet identity: identity is not something that can be modeled easily, and it’s certainly not something that’s unique, whatever Mark Zuckerberg may think.

I use the same scheme as Tim when it comes to buying Kindle books – right now I only share with my wife but the kids will get on board when they’re old enough – and that’s OK because our Amazon account reflects the family unit as the customer: when you buy a book or a movie or, for that matter, a TV or a car, you don’t buy it as yourself but as a member of a group. Some companies may have thought otherwise all these years, but it’s always been the case.


Piecrust 0.6.0

I’ve been focusing a lot of my free time on PieCrust these days – to the point where my other projects are suffering from it – but I’m getting close to a possible 1.0 release, which is good! But in the meantime, here’s version 0.6.0, which is not very big but still has some goodness in it.

Rhubarb Apple Pie

You can go read the newly created CHANGELOG file for the whole list of changes, new features and bug fixes, but here are the most important ones, right after the break.

  • Twig and LessPHP have been updated to their latest version.
  • Added a chef prepare command to quickly create pages and posts files. For example, if you type chef prepare post my-new-whipped-cream-recipe, Chef will create a post file at the appropriate location (depending on your posts file-system setting) for the current date and time.
  • Added a wordcount Twig filter which does pretty much what the name says, although the count is likely to be off by a few words since the counting algorithm is extremely naive and is run before Markdown or Textile formatting. Still, I think it’s a good indicator of how long the article is – maybe I’ll revisit the algorithm if people express interest in a more accurate one (although it could quickly become complex if you consider internationalization).
  • Added a --nocache parameter to Chef if caching should be disabled for the current command.
  • Chef’s --debug parameter used to also kinda change how PieCrust is running. Not anymore: it’s now just changing the verbosity of Chef, just like --quiet.

Big thanks to the people who reported bugs and helped me fix them.


Showing off your dotfiles

With the introduction of my first Apple laptop a few years ago, my home computers went from being half Unix-like (I had a healthy mix of Linux and Windows machines) to mainly (two thirds) Unix-like. With it came a change in the kind of software I use on a daily basis and an increased need to synchronize the configuration of those programs between my machines.

Enter the “dotfiles community”: an informal group of people who, as Zach Holman puts it, think that “dotfiles are meant to be forked”.

“Dotfiles” are rooted in Unix culture – the name refers to the configuration files starting with a dot that clutter your home directory like crazy. This means you will mostly find Mac and Linux users in there (that’s ok, they’re pretty nice… usually), but to me it’s mostly about putting all your configuration files in source control in a way that makes it easy to setup new machines and share with others.

Show-off :-)

So like everybody else, I put my dotfiles out there for anyone to poke around. They’re mostly boring, but you may find a few useful things, like those I outline below (after the break). Nothing earth-shattering, but if it saves you the 15 minutes needed to write it, that’s 15 minutes you can spend on doing actual stuff.

Boostraping

Most people store their dotfiles in a Git or Mercurial repository, and then create symlinks from their home directory into the repo (like, for instance, linking $HOME/.vimrc into $HOME/DotFiles/vim/.vimrc). Because I also need some of those configuration files on Windows, I can’t really hard-code paths like this.

As a result, I opted for generating some of my dotfiles when I run my install script. Those dotfiles mostly only include the real ones from the repo. This lets me clone my dotfiles repo anywhere I want – no need to hard-code anything.

Mercurial config includes

An often overlooked feature of Mercurial’s config files is the %include statement which lets you include other config files. This lets me specify OS-specific config files to my hgrc, and even optionally have a local config file (since the %include statement will quietly fail if the included file doesn’t exist).

Cross-platform, multi-language Vim

If you’re running Vim on both MacOS and Windows, you may be interested in a few lines from my .vimrc, like when it figures out the directory for all the Vim runtime files (.vim on MacOS, vimfiles on Windows).

You may also be interested in a couple of international features I have:

  • A mapping to switch keyboard layouts in input mode (I switch between English and French)
  • A mapping to switch spell-checking on and off, and the language it will be checking against is in sync with the input mode keyboard layout.

That’s it! I hope somebody finds it helpful in some way.


Lawrencium — A Mercurial Wrapper For Vim

I’ve been using Vim for quite a while now, and by no means am I an expert in it (I’m still learning all kinds of cool tricks every week), but I recently decided it was time to write my first plugin. And because I mostly use Vim at home, where I work with Mercurial, I figured I could write a Mercurial plugin for Vim.

vim

Steve Losh had been asking for such a plugin for quite some time so I thought that might be helpful to at least another guy besides me. And ironically enough, I started learning Vimscript with Steve’s very own book-in-progress, “Learn Vimscript the hard way”.

The result of this initiative is Lawrencium, which is available on Bitbucket and at Vim.org.

There’s a good description of how it works on the Bitbucket page, and you’ll see it’s inspired in some parts by Tim Pope’s Fugitive plugin, which wraps Git workflows and features inside Vim.

It’s still a work in progress so be sure to leave some feedback here or in the issue tracker.


Navigation menu in PieCrust

Here’s another post in the PieCrust cookbook series, this time focusing on a classic web-design pattern: the navigation menu.

Menu

It’s really just a bunch of links that you can put somewhere around each page’s content, but the trick here is to tell the user which page he’s currently on. This is pretty easy to do using Twig macros and the data exposed by PieCrust, assuming of course you’re using PieCrust’s default template engine.

Let’s start by building a simple layout. I skipped the parts that are not relevant:

    <!doctype html>
    <html>
    <body>
        <div id="content">
            {{ content|raw }}
        </div>
        <div id="navigation">
            <ul>
                <li><a href="{{ pcurl('') }}">Home</a></li>
                <li><a href="{{ pcurl('something/foo') }}">Foo!</a></li>
                <li><a href="{{ pcurl('about') }}">About</a></li>
                <li><a href="{{ pcurl('contact') }}">Contact</a></li>
            </ul>
        </div>
    </body>
    </html>

This is a pretty standard PieCrust layout, but we want the user to know which one of those 4 navigation links is the current page. Here’s a way to do it.

Step 1: Write the macro

You can write a macro that, depending on the current page’s “slug” (the page’s URL name1), prints either a link or just some text with the active class.

{% macro nav_entry(slug, current, label) %}
{% spaceless %}
{% if current == slug %}
<span class="active">{{ label }}</span>
{% else %}
<a href="{{ pcurl(slug) }}">{{ label }}</a>
{% endif %}
{% endspaceless %}
{% endmacro %}

Note the use of the spaceless tag to make sure we don’t have ugly carriage returns and spaces in our resulting markup (we want everything on one line). This is not required – it just makes the HTML prettier.

Step 2: Import the macro in the layout

You can either put the above macro in a separate file (say, _content/templates/nav_macros.html), or at the beginning of your layout file – it depends on whether you want to reuse those macros elsewhere, and whether you want to keep your layout markup cleaner.

If you put the macro in a separate file, you’ll need to import it in your layout file with Twig’s import tag:

{% import "nav_macros.html" as nav %}

Here, we imported in the nav namespace, so you can call your macro with nav.nav_entry.

If you put the macro right there in the layout file, you have to prefix the calls with _self like so: _self.nav_entry.

For more information, see the Twig documentation on macros.

Now you can replace the navigation links with calls to the macro:

    <div id="navigation">
        <ul>
            <li>{{ nav.nav_entry('', page.slug, 'Home') }}</li>
            <li>{{ nav.nav_entry('something/foo', page.slug, 'Foo!') }}</li>
            <li>{{ nav.nav_entry('about', page.slug, 'About') }}</li>
            <li>{{ nav.nav_entry('contact', page.slug, 'Contact') }}</li>
        </ul>
    </div>

Unfortunately, you need to pass page.slug to the macro every time because the macro doesn’t have access to the current context as far as I can tell.

Add a bunch of CSS styles that will handle the active class and voilà, you’ve got a nice navigation menu.

I’ve slapped together a little demo website here so you can see it in action.


  1. Strictly speaking, PieCrust’s definition of “slug” is not quite correct since it includes the root-relative folders that contain the resource, but… well… whatever. ↩︎


The Journey to Digital Comics: Reading Device

The first step in the journey to digital comics is to figure out what you’re going to read them on. These days, the answer is pretty much going to always be “a tablet”… but which one?

I had a quick look at the market back in late 2011 and here’s how I made up my mind. First, I focused on the main ~10 inch tablets of the market. This included, for instance, the Motorola Xoom, the Asus Transformer and the Apple iPad 2.

Orientation

Can you see the most obvious difference between the iPad and the other two?

I made it easy for you by showing the iPad in the vertical position, because that’s its natural position: the home button is at the bottom, and the front camera is at the top. In constrast, the other tablets’ natural position is horizontal, with their front camera and power/sleep buttons placed accordingly.

Since reading a comic-book happens almost always in portrait mode, I figured I’d might as well choose a device that’s also designed for that orientation, if possible.

Aspect Ratio

Another important spec for me was the aspect ratio. The iPad has a 4/3 ratio whereas pretty much every other tablet on the market has a widescreen ratio, most of the time 16/10 (which is the case for the Xoom and Transformer).

I don’t know about you but holding a widescreen device vertically just feels wrong to me – it’s too narrow and too high, like I’m reading a mutated book. It’s entirely subjective, of course, and you may not mind at all.

Display Size

Of course, there’s the matter of effective size of the display. Assuming a vertical orientation, here are the pixel densities and screen sizes of each tablet:

  • Xoom: 160ppi, 12.7cm x 20.3cm.
  • Transformer: 149ppi, 13.6cm x 21.8cm.
  • iPad 2: 132ppi, 14.7cm x 19.7cm.

A standard American comic-book is 17cm x 26cm, so no tablet comes even close to reproducing that real-world reading experience (I wish somebody would make a bigger tablet!), but you can still figure out which one gives the best reading experience.

Here is a comparison of all 3 tablets’ screens (black borders indicate parts of the screen that would not be covered by the comic-book page):

The Xoom and the Transformer have the same resolution, which is higher than the
iPad’s, and it’s obvious you’d get a finer picture on them. However, if you
scale the screens so that they match their relative physical world size, here’s
what you get:

Here you can see that a comic-book displayed on a Xoom would be pretty much the same size as on the iPad – sure, you would get a better picture thanks to the higher resolution, making reading captions slightly more possible, but not any more comfortable without zooming a bit. The Transformer is clearly better here: the displayed page is bigger and it’s got a higher resolution to back it up.

Final Choice

With digital comics as the only requirement for your choice of tablet, the Asus Transformer Prime is the winner for me. However, I also had some secondary requirements:

  • Help me get through my RSS feeds more efficiently.
  • Let me read my Instapaper queue in a comfortable way.

The sad thing is that Flipboard, on iPad, really blew my mind for reading RSS feeds, and there’s no good Instapaper client on Android yet. It was a tough choice, as I went back and forth for a long time between the iPad and the Transformer, but I picked the iPad in the end. I figured that the loss in the comic-book reading experience was not too bad compared to the significant advantages I would get on my other use-cases.

There was of course the issue of my control over the device – something that always annoys me with Apple products (I ditched my iPhone for a Galaxy S Captivate because of that). But given my requirements, it wasn’t such a problem: both digital comics and RSS feeds are managed on the cloud, and most other applications did a good job of working around Apple by supporting 3rd party services like Dropbox for storage and syncing. If you have secondary requirements involving heavier stuff like music or video and you don’t like to play (pay?) by Apple’s rules, you may again want to choose the Transformer.

Spending the money on the tablet was not too hard. I sold some of my collection (mostly single issue series I either planned to replace with TPBs, or get rid of altogether), and that alone pretty much paid for it. That’s how much comics surplus I have in my home, begging to get uncluttered through the sweet release of digital media!


PieCrust 0.4.0

The holidays have not just been a time spent with the family eating unhealthy amounts of equally unhealthy food: it was also a time of great changes for PieCrust. So much, actually, that I bumped the version number up twice. This is not just because those changes are pretty significant but also because they break things a bit.

Apple pie

Table of Contents

Plugins!

Yes, at last, PieCrust officially supports plugins! The code was already somewhat designed as such, but there was no easy way to write, install and manage plugins before.

Now, it’s pretty simple: each plugin is a bunch of files contained in a directory located in the _content/plugins directory. If you want to share plugins between several websites, you can specify additional directories in which PieCrust will look in a similar way you specify additional template directories: you add it to the site/plugins_dirs configuration setting.

For more information, read the official documentation on plugins.

To celebrate the occasion, I also did some cleanup of the default PieCrust install: the PhamlP features (the Haml template engine and formatter, along with the Sass processor) and the Dwoo template engine have been removed altogether from PieCrust, and moved into their own plugins. Dwoo didn’t add much to the plate that Twig, the default template engine, didn’t have already, and PhamlP is just not working very well (it’s good enough for simple cases, but breaks down if you give it heavier things like the Compass framework files).

Two more plugins have been written:

The new Chef

Chef, the PieCrust command line executable, has changed. For starters, it now behaves like git or hg, in the sense that it knows if it is being run from a directory within a PieCrust website (it will look for a _content/config.yml file somewhere up in the current hierarchy). This makes it a lot easier to use because there’s barely ever a need to specify the root directory of the website it should act upon. In turn, it streamlines the usage of most commands, making them more natural. However, it means the old parameters and options won’t work anymore – you will get an error instead.

With the new chef also comes a few new commands:

  • root: returns the root directory of the website.
  • plugins: shows a list of the plugins loaded for the current website.
  • stats: shows some stats about the website.
  • tags: lists the tags used in the website.
  • categories: lists the categories used in the website.

The nice thing about the new chef is that, coupled with the new plugin architecture, it knows about site-specific plugins that could expose new commands. This is very similar to how Mercurial lets you use extensions on a per-repository basis.

That’s about it! I hope you’ll be happy with this major milestone. I’ll merge those changes into the stable branch within a week unless something goes wrong. As always, use the BitBucket or GitHub issue trackers to notify me of the many bugs I likely introduced.