I'm Paul Bissex. I build web applications using open source software, especially Django. Started my career doing graphic design for newspapers and magazines in the '90s. Then wrote tech commentary and reviews for Wired, Salon, Chicago Tribune, and others you never heard of. Then I built operations software at a photography school. Then I helped big media serve 40 million pages a day. Then I worked on a translation services API doing millions of dollars of business. Now I'm building the core platform of a global startup accelerator. Feel free to email me.
I co-wrote "Python Web Development with Django". It was the first book to cover the long-awaited Django 1.0. Published by Addison-Wesley and still in print!
Built using Django, served with gunicorn and nginx. The database is SQLite. Hosted on a FreeBSD VPS at Johncompanies.com. Comment-spam protection by Akismet.
Bitbucket, Debian Linux, Django, Emacs, FreeBSD, Git, jQuery, LaunchBar, macOS, Markdown, Mercurial, Python, S3, SQLite, Sublime Text, xmonad
At least 236675 pieces of comment spam killed since 2008, mostly via Akismet.
This is a function that takes an integer and returns its ordinal representation, e.g. "1st" for 1 and so on.
It's not the most readable thing, but once I saw the pieces falling into place I couldn't help myself. Repetition of the "th" literal is the only thing that bugs me. Oh well.
ord_text = lambda n: "%d%s" % (n, "th" if 10 < n % 100 < 14 else {1:"st", 2:"nd", 3:"rd"}.get(n % 10, "th"))
Comes with a one-line test suite!
for t in "1st 2nd 3rd 4th 11th 12th 13th 21st 22nd 23rd 111th 112th 113th".split(): assert(ord_text(int(t[:-2])) == t)
Excelllent catch, Matt, thanks! Fixed.
And yes, I should have mentioned that this is Python 2.5+ only, due to the ternary logic.
Unfortunately, your one-liner is so desirous to be a one-liner that on my resolution it reaches way out of the central column of your layout and past the 'Atom feed' link.
Great! Now add internationalization for Russian, Swahili, and Chinese.
Here's a version that eliminates the repeated "th" AND runs in both Python 2.3 and 2.5.
ord_text = lambda n: str(n) + {1: 'st', 2: 'nd', 3: 'rd'}.get(n % (10 < n % 100 < 14 or 10), 'th')
Hi,
Excellent blogroll/site there. Infact I was happy to find this site running on Django. However, the CSS (I believe, since I'm not too good with web-technologies), may need some mending, because using Google Chrome (or even IE), in a 800px wide window the code-snippets run outside the central pane boundary, and onto the right pane, rendering the text undreadable. Hope that you fix it.
cheers, Banibrata
Banibrata, thanks for the note. Keep in mind that the lines above are extra-wide by design -- they're supposed to look too long for their own good. Though a style makeover of the site is inevitable, this post won't be driving it!
How I became a software engineer, 8-bit version
My 100x ROI as accidental domain speculator
Neo4J and Graph Databases
1 comment
The Riak key-value database: I like it
Jacinto
Neo4J and Graph Databases
198 days ago
ANOTHER SPAMMER WITH BROKEN SOFTWARE
How to install the open source application Darktable on OS X
1203 days ago
SPAMMER WHOSE COMMENT GENERATOR IS BROKEN
How to install the open source application Darktable on OS X
1214 days ago
Alfred Nutile
Switching from OS X to Ubuntu
1255 days ago
Spammer
The story of dpaste.com 2.0
1433 days ago
Copyright 2018
by Paul Bissex
and E-Scribe New Media
I think you might need to add 111th, 112th and 113th to the string in your test suite.
(Can't be certain though because I get a SyntaxError when trying to run your one-liner in python 2.3.4)