Oh my zsh

That version of bash we’ve been using on MacOS since forever hasn’t been updated since forever (for GPL licensing reasons). With Catalina, Apple finally got with the program and pushed bash into the background in favor of zsh. Nothing earth-shattering there – zsh has been available forever, but now it’s the default, and the Terminal will bug you on every launch if you don’t follow its instructions to migrate.

Once you do move over, run don’t walk to Oh My Zsh for a wonderful rabbit hole of themes, plugins, and configuration options to make zsh sing for you. By default, it knows how to detect whether the current directory contains a git checkout, and will show the active branch in the prompt, which is worth the price of admission alone.

New features in django-todo

If you haven’t checked out django-todo for a while, the project has been super-active lately! In the past few months it’s gained support for file attachments, batch-task-import via CSV, and a fully integrated email tracker. Now at version 2.4.6 on pipy, or check out the live demo site.

I started this project as a small demo more than ten years ago, and it’s evolved into a piece of staple software in the Django ecosystem. Proud of what it’s become!

TrackerBase

Around 20 years ago, enthralled by the database-like properties of the Be File System in BeOS, I decided to see if I could use the filesystem itself as a backing database for a live web server application. I ultimately wrote TrackerBase, and served betips.net from a BeBox in my home for a few years.

The basic idea was that BeOS let you create custom filetypes with custom attributes, and provided APIs for querying those attributes. The rest was just custom database query code, but without an actual database.

Fast forward two decades. I’m all-Mac now. I recently stumbled across the original .pkg installer for TrackerBase and wanted to have a look. Discovered that there was no way to open the package from the Mac side, and reached out to the Haiku community (Haiku is the open-source successor to BeOS). Within an hour, a community member provided me with a tarball, and I was able to see that code again for the first time in a long time.

It’s always embarrassing to look back on old code, but that was especially true in this case. And Perl? What was I thinking? Anyway, these days we have github, so I’ve just published the original code on github, untouched, for posterity’s sake. MIT license.

Irrelevant as it may be today, I’m still proud of it as  a novel application of an innovative filesystem.

Geo contribution to Python faker lib

Like most devs, I often have a need to generate tons of fake data to fill out models – addresses, usernames, “news” content, locations, IP addresses, you name it. Data-mocking libraries are invaluable for creating data factories for use in unit tests, and for populating a site under development with realistic content. For Python, I use the Faker lib in conjunction with FactoryBoy.

Recently I was working on a site that required generating a lot of maps, and realized that randomly chosen geographical coordinates were most often over ocean (since earth is mostly water). Realizing that the right way to solve this was to include a hash of locations known to exist on land and to then pull randomly from those, I started a pull request, which evolved over the past few weeks into a whole new geo module for the lib.

I started with the open source data sets at GeoNames, converted one of their databases into a Python tuple, then extracted every fifth entry to keep the dataset down to a manageable size. Pretty certain I’ve got every country on earth represented, but let me know if you find any missing.

I ended up bringing geographic features from other Faker modules into the new geo module, and added the ability to specify the country you want random land coords for. As of this morning pull request merged!

Crappy Mobile Photo Uploads to Facebook is the Default

Just discovered that if you upload a photo to Facebook from your phone, then upload the exact same image to the same post from desktop, the quality difference is huge. FB compresses the crap out of phone uploads.

Here’s proof — I uploaded these images from phone, didn’t give it much thought. Then later that day viewed the post on desktop/web and realized they looked like crap. My normal workflow is to do all posting from desktop, so I don’t typically see this effect, but this time, it was dramatic. I then added the same images to the post from desktop and arranged them side-by-side for easy comparison. FB doesn’t just compress a little from the phone, they compress like crazy.

Enough to get a feller running back to Flickr… but then I thought this must be an option or a setting. Went digging and sure enough… On the phone, go into Settings | Videos and Photos | Upload HD  to force the mobile app to upload your actual photos rather than compressed versions.

 

Interrobang

Whazzup‽ When “the interrobang” was introduced in 1962, virtually no typewriters or printing presses supported new glyphs, so it didn’t get traction. These days, almost everything you read supports a huge amount of glyph flexibility thanks to Unicode (emoji, right?).

Unfortunately, there’s no easy way to type an interrobang – unless you’re a super-nerd, you have to copy/paste them into your text. Same with a ton of other crazy glyphs that are probably supported by the font you’re using right now but not by the keyboard you’re typing on. IOTW we can see a lot more characters than we can type. You’re stuck (though fortunately you have easy access to the #octothorpe). Excellent episode of 99% Invisible:

Interrobang – 99% Invisible

Interrobang – 99% Invisible

In the beginning was the word, and the word was … well, actually, there was just one word … one long, endless word. For thousands of years, in some written languages, there was no space between words. People were expected figure out sentences and clauses while reading aloud. Scriptio continua was the dominant form of

Source: 99percentinvisible.org/episode/interrobang/

University CompSci Plagiarism

I’ve worked really hard on django-todo over the years, so was very dismayed to receive email recently from a CompSci student at the University of Western Australia informing me that the department had taken the django-todo source code, removed the license file and all attribution, and included its code in one of their assignments.

Of course I’m all for open source software being used for educational purposes, and would have been honored and pleased if they had done this in an OSS-respecting manner, but they chose to take the legally shady route instead, and to leave students with the impression that this was their original code. This is not how we educate students to become productive, respectful members of the open source software world.

The offending distribution is linked to from the CITS5501 Software Testing and Quality Assurance page – download the file cits5501-project-v2.zip.

I do hope the university takes some form of disciplinary action against the professor, who obviously knows better. And I hope the professor does the right thing. In case it’s not clear what “the right thing” is, I’ll spell it out: Restore the license file, and restore attribution from the files you removed it from. Better yet, save yourself a bunch of work and don’t include a copy of the software in your assignment download at all – just link to the github repo! That’s what it’s there for.

Ambient Humanity – Notes on a Month Without Facebook

A month ago, I decided to take a mental health break from Facebook. Between the Cambridge Analytica mess, the cognitive pressures of always trying to juggle half a dozen ongoing conversations, and a creeping sense of “opinion exhaustion” (tired of my own and everyone else’s too), something had to give.

Alamere Falls / Coastal Trail
Winter rains pouring over the cliff into the sand at Alamere Falls, Pt. Reyes

The timing was good, and necessary. Over the past month, I’ve gone through one of the most intense work-stress periods of my life, so leftover mental energy was at a premium. When I did have time to unwind, I replaced the usual Facebook time with attention to platforms I knew were great (but very different) – Quora, Reddit, Twitter, and an endless supply of news and blogs aggregated via Feedly. All of them were interesting in their own ways, I was missing something crucial – what Kottke calls “ambient humanity“:

It is psychological gravity, not technical inertia, however, that is the greater force against the open web. Human beings are social animals and centralized social media like Twitter and Facebook provide a powerful sense of ambient humanity — the feeling that “others are here” — that is often missing when one writes on one’s own site. Facebook has a whole team of Ph.D.s in social psychology finding ways to increase that feeling of ambient humanity and thus increase your usage of their service.

Kind of hard to put my finger on why things feel so different outside of the Facebook bubble. Sure there are a zillion people having interesting conversations on other platforms, and I’m more than comfortable jumping in a pool with strangers, but the discussions are like drive-bys — I don’t feel invested the same way I do with people on Facebook. There’s something qualitatively different about talking things through with people you know or have known, compared to leaving one of a thousand comments on a topic with a bunch of random humans.

And there’s a level of civility on Facebook that I am not finding anywhere else. We are, for the most part, polite with people we actually know, and sadly, way too often rude with strangers.

Then there’s the news aggregation aspect. I found interesting content everywhere, of course, and wandered into great threads all over the place, but haven’t been able to shake the feeling that Facebook is not only great at social, it’s also among the best at news aggregation. Twitter is too noisy, even with tuning. Quora really isn’t about news. Reddit can be about news if you use it that way, but I find it much better for surfacing random stuff than for seeing what’s going on the world today/now. A dedicated RSS reader (I use Feedly) is right up there with Facebook, but feels “cold” in comparison.

But wasn’t this exactly what I was looking for — a break from the continual pressure to engage? If I so much as look at Facebook, I’ll post or comment. And when someone responds, I’m obliged to return and continue the conversation (you can’t just ignore a friend when they’re talking, right?). Outside of Facebook, that pressure vanishes. It’s exactly what I wanted, but it felt… empty somehow. The “ambient humanity” was missing.

There was a huge benefit to getting out of the Facebook bubble for a while — I felt and became a calmer version of myself, which allowed me to be more focused on the work stuff. There’s something about Facebook that seems to amplify outrage. “If you’re not outraged, you’re not paying attention.” Now more true than ever, and Facebook does make me feel more “in touch” than any other platform, but here’s the thing: Outrage is a drug. However justified your outrage may be, however much this messed-up world is pissing you off, this remains true: Start down the outrage path, and pretty soon you’re subconsciously looking for things to be outraged by, taking cues from your tribe on the daily outrages, dwelling on outrage, going to sleep and waking up with outrage.

Miles and Mardo, Frozen Shady Oak
Winter lake, Minnesota 2018

The paradox is that if you want to stay aware, you’re going to be outraged. But continuous outrage is a super-unhealthy state of being. Ditch Facebook for a while and tell me you don’t feel the difference. It’s lovely to check out of that hotel for a while.

I had intended to do a lot more blogging this month, but didn’t, because you know, work. I still want to. But paradoxically, I find myself longing for this month to be over so I can return to Facebook. Weird, right?

Announcing django-todo 2.0

django-todo is a pluggable, multi-user, multi-group, multi-list todo and ticketing system – a reusable app designed to be dropped into any existing Django project. Users can create tasks for themselves or for others, or create ”assigned tasks” that will be filed into a specific list (public tickets).

That was the original project description, and it hasn’t changed in 10+ years.

When I first created django-todo, it was a simple “let’s learn Django” project I gave to myself. I open sourced it, it’s been relatively successful, and the project has received numerous contributions over the years (grateful!). When I heard that it wasn’t compatible with Django 2.0, I looked back on that old code and realized it was time for a major refactor/upgrade. I’ve been working on the update for the past couple of months (evenings only).

Virtually every module and template has been refactored, much more in line with current best practices. The update started small, but by the end, I had made 75 commits and written the first suite of working tests (finally!). And I adopted Bootstrap as the default layout engine. And finally got around to creating a live demo site for the project.

django-todo 2.0 requires Django 2.0 and Python 3.x – no apologies. Unfortunately, this is a backwards-incompatible update (you’ll need to migrate old data manually, if you have any).

Hope it’s useful to a few teams or individuals out there. Contributions still very much welcome.

ALL YOUR FRIENDS ARE HERE

Ello was founded as a social network devoted to never selling or sharing your data. Diaspora was founded as a social network devoted to decentralization so no one could “own” your data. Google Plus offered a better experience than Facebook in dozens of ways. There have been heaps of Facebook alternatives over the years, and they’re all virtual ghost towns. Why can’t any of them succeed? Because Facebook has one feature no one else can replicate: ALL OF YOUR FRIENDS ARE HERE. Now, with many of us fed up and looking for alternatives, I’m asking: How can we break FB’s monopoly on ALL YOUR FRIENDS ARE HERE? Until we do, the number of people who truly leave the platform will be close to zero.