Jan. 16, 2014

A few weeks ago I made a little book of advice for my daughter in a what-if-i-die-in-a-plane-crash frenzy before taking an international flight. The content comes mostly from a blog post I wrote during the week after her birth. Here is the book on Archive.org if you are interested. It is Creative Commons licensed so go nuts. This is a technical blog post about getting the book ready for the JIT printing process.

I used several free software tools in the process:

  • vim (gvim specifically) is my editor of choice.
  • Inkscape - vector graphics, layout.
  • Ghostscript - PDF formatting.
  • PDFtk - PDF manipulation.

I used blurb.com to print the book.

The following makefile converts the source SVG files for each page and the cover into separate PDF files, then assembles them into a single document, and then transforms the document into the PDF-X3 format that blurb.com requires.

SVGS=$(shell ls pages/*.svg)
PDFS=$(SVGS:.svg=.pdf)
PDFS_BLANK=$(foreach pdf,$(PDFS),$(pdf) page-blank.pdf)

all: we-can-do-this-cover_x3.pdf pages_x3.pdf

%.pdf: %.svg
    inkscape --without-gui --file=$< --export-pdf=$@ #--export-text-to-path

pages.pdf: $(PDFS) page-blank.pdf
    pdftk $(PDFS_BLANK) cat output pages.pdf

%_x3.pdf: %.pdf
    gs -dPDFX -dBATCH -dNOPAUSE -dNOOUTERSAVE -dUseCIEColor -sDEVICE=pdfwrite -sProcessColorModel=DeviceCMYK -sOutputFile=$(<:.pdf=_x3.pdf) -dPDFSETTINGS=/prepress ./PDFX_def_wecandothis.ps $<

clean:
    rm -f pages/*.pdf
    rm -f *.pdf
    rm -f _x3.pdf

To get these programs issue sudo apt-get install inkscape make pdftk ghostscript on Debian GNU/Linux or Ubuntu. You can get the complete source files for the book on GitHub so that you can use this as a template to make your own book. The SVG images for the pages are in the pages subdirectory and the cover is we-can-do-this-cover.svg. The makefile builds a "Small Square" (7 × 7 in / 18 × 18 cm) book but you should be able to change the source SVG sizes to make a different sized book.

The font is my own handwriting. The original TTF is here.

Dec. 17, 2013

Here is how you can have a lockscreen on Xubuntu that just displays a custom logo/graphic and asks for your password. The graphic I have used is a white logo on black background, so the background/foreground settings reflect that but you can change these colours to match whatever graphic you use.

sketch of a padlock

First, you need to create a script in $HOME/bin/xflock4 - this should override the default xflock4 script on your system that XFCE uses as a proxy for launching the lock screen. Here are the contents, which just run the xlock program:

#!/bin/sh
xlock

Don't forget to make it executable with chmod 755 ~/bin/xflock4.

Next, you should create an xpm version of the graphic that you want to use, for example in $HOME/.lock.xpm - you can use the Imagemagick convert program (sudo apt-get install imagemagick) to convert some other image into the correct xpm format like this:

convert myimage.png ~/.xlock.xpm

Make a note of the dimensions of your image as you will need them for the 'icongeometry' option below. The largest size appears to be 256x256 pixels and the man page advises to make it as close to square as possible. You will set the 'image.bitmap' setting below to the location of the xpm file. Finally, you should add the following configuration options to a file called $HOME/.Xdefaults:

XLock*mode: image
XLock*image.bitmap: /home/chrism/.lock.xpm
XLock*image.count: 1
XLock*image.erasedelay: 0
XLock*erasedelay: 0
XLock*icongeometry: 180x180
XLock*background: Black
XLock*foreground: White
XLock*description: off
XLock*info:

You can find out other options by running man xlock.

To test select 'Lock Screen' from the user menu.

Enjoy!

Sept. 2, 2013

IMAG0516.jpg

Snug.

June 10, 2013

deviator-sydney.png

Deviator, the show I worked on with PVI Collective and friends, is playing in Sydney, Australia starting tomorrow night. Get in there, tickets sell fast!

March 18, 2013

sunset-newhouse.jpg

These days I am using Bitbucket for the git repository hosting and task management on my commercial projects. One thing I often need to do is fetch a list of current tasks so that I can update a client with what is on our current agenda for them, get feedback about priorities etc. Here's a short Python script I hacked together to do that based on some other public domain scripts I found out there:

import base64
import cookielib
import urllib2
import json

class API:
    api_url = 'http://api.bitbucket.org/1.0/'

    def __init__(self, username, password, proxy=None):
        encodedstring = base64.encodestring("%s:%s" % (username, password))[:-1]
        self._auth = "Basic %s" % encodedstring
        self._opener = self._create_opener(proxy)

    def _create_opener(self, proxy=None):
        cj = cookielib.LWPCookieJar()
        cookie_handler = urllib2.HTTPCookieProcessor(cj)
        if proxy:
            proxy_handler = urllib2.ProxyHandler(proxy)
            opener = urllib2.build_opener(cookie_handler, proxy_handler)
        else:
            opener = urllib2.build_opener(cookie_handler)
        return opener

    def get_issues(self, username, repository, arguments):
        query_url = self.api_url + 'repositories/%s/%s/issues/' % (username, repository)
        if arguments:
            query_url += "?" + "&".join(["=".join(a) for a in arguments])
        try:
            req = urllib2.Request(query_url, None, {"Authorization": self._auth})
            handler = self._opener.open(req)
        except urllib2.HTTPError, e:
            print e.headers
            raise e
        return json.load(handler)

if __name__ == "__main__":
    import sys
    if len(sys.argv) < 5:
        print "Usage: %s username password baseuser repository" % (sys.argv[0],)
    else:
        result = API(sys.argv[1], sys.argv[2]).get_issues(sys.argv[3], sys.argv[4], (("status", "new"), ("status", "open"), ("limit", "50")))
        for p in result["issues"]:
            print " *%s %s" % (p.has_key("responsible") and "**" or "", p["title"])
            #print p["content"]
            print

Run it to get a usage message.

I secretly wish that bzr had won the distributed version control wars because of its superior user interface, but these days I am resigned to using git because pretty much everybody I have to inter-operate with is using it. It's not that bad.