The rebuilt TurnKey GNU/Linux home page running locally in a browser

Blog

Moving TurnKeyLinux.org from Drupal to Hugo

TurnKeyLinux.org has accumulated a lot since the first Drupal version went online: appliance pages, documentation, release notes, screenshots, FAQs, blog posts, taxonomy terms and …

Blog

Core & TKLDev v18.0 Stable Release

Happy to announce the stable release of Turnkey v18.0. Took a little longer than I had hoped and there are only two this time. Regardless, we've finally made it to the stable …

Blog

Core & TKLDev v18.0 Release Candidates are LIVE!!

I'm happy to announce the pre-release of the next major version of TurnKey GNU/Linux. The first v18.0 Release Candidates of Core and TKLDev are ready for download, inspection and …

Blog

Install newer (or latest) PostgreSQL on TurnKey

TurnKey Hub user Vishal recently asked about installing PostgreSQL v14+ on TurnKey. He noted that he was interested in Postgres 14 or higher because of the new IVM extension …

Blog

Core v16.0 RC (Release Candidate) is on the way...

Update 2020-05-04: We've finally published our first batch of 10 v16.0 appliances. Please see the full announcement for details. Update 2020-03-10: v16.0rc1 ISOs of both Core and …

Blog

v15.0 Stable Release #4 - final appliance roundup

I'm pleased to announce the 4th and final stage of the v15.0 release. This final instalment consists of 31 new, updated and/or bugfixed appliances. It follows release parts 1, 2 …

Blog

TurnKey v15.0 RC1 is LIVE!

UPDATE: Stage 1 of v15.0 stable release is now available. It includes 47 updated appliance ISOs. Stage 2 includes OVA/VM, OpenStack and Xen. Docker and Proxmox/LXC builds …

Blog

v14.2 Release Update #1 - 27 more appliances

Wow, has it really been almost a month since I announced v14.2 Core?! Looks like it has! Time flies when you're having fun I guess... :) I'm pleased to announce 27 new updated …

Blog

v14.1 Release - Bugfixes, Maintenance and More

About seven months after the release of v14.0 we are proud to announce the updated v14.1 release. All of the v14.1 appliances are available for immediate launch in the cloud via …

Blog

Python's timeless principles of good software

$ python -c 'import this' The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than …

Blog

Bug hunting with the scientific method

I've never come across a problem I couldn't solve using the following technique / problem solving methodology, and I've come across some tough ones. …

Blog

v14.0 stable release - Massive Community Effort!

Drum roll please... May I proudly introduce: The TurnKey Linux v14.0 release! A long time coming... Wow is it mid September already!? What has happened to the year?! To be honest …

Blog

Marching towards v14.0 RC2

Update: v14.0 stable is available in all build types: OVA & VMDK, Proxmox, OpenNode & Docker (Proxmox build is somewhat generic LXC/OpenVZ container) and Xen & …

Blog

How to build a TurnKey appliance ISO from source

[UPDATE:] This blog post has been converted to a Doc page and has had some updates since this post was published. For the upcoming v14.0 stable release, we are doing things a …

Blog

TurnKey v14.0 RC1 is LIVE! (aka we need YOU!)

Update: v14.0 stable is available in all build types: OVA & VMDK, Proxmox, OpenNode & Docker (Proxmox build is somewhat generic LXC/OpenVZ container) and Xen & …

Blog

Invalidating the disk cache on Linux

Here's a super easy way to invalidate the disk cache, which is useful for testing IO performance in the real world, where you can't rely on all of your reads being served up from …

Blog

pyproject-pub: A simple Python project template

I hate repeating myself. It's boring. Life is too short. Like any self respecting hacker I will go out of my way to avoid it, even when I suspect it would cost me more to automate …

Blog

Getting started with Python and Lisp

A few weeks ago I talked with a friend studying computer science who I discovered had never experienced the joy of programming with a high level language. Not only that but he …

Blog

Why parallel programming is hard

Implementing Cloudtask took more time than I had planned due mainly to the challenges of parallel programming, which I hadn't done that much of before. Also, parallel programming …

Blog

Three strikes - time to automate!

I caught myself today repeating a few basic operations by hand what seemed like a zillion times. Over and over again. I didn't really notice it at the time but it was really …

Blog

Python optimization principles and methodology

Methodology The basic methodology for optimization: Discover where you program is spending its time (hotspots vs coolspots) A good way to get an overview is to use the Python …

Blog

4 simple software optimization tips

1) Always be experimenting! Trying to squeeze out more performance out of your program? Don't be afraid to experiment! In practice what that means is you setup small, simple …

Blog

Tips for the Object Oriented Programming novice

The following is written for programmers who don't really understand object oriented programming yet. They probably understand the language semantics, but don't really understand …

Blog

TurnKey 13.0 ready for community development

Want to roll your own Debian Wheezy based images? You're in luck because we just finished upgrading TurnKey's build chain, including new versions of TKLDev and TurnKey Core ready …

Blog

Python iterators considered harmful

I just tracked down a nasty bug in my code to a gotcha with Python iterators. Consider the following code... class Numbers(list): def even(self): for val in self: if val % 2 == 0: …

Blog

How to write a good changelog

In a nutshell, think of your users. They read top to bottom. They have a very limited attention span. Even if they read all the way through, they're probably going to pay more …

Blog

Python property gotcha

If you like using a single getter/setter function for your properties, watch out if using None for the default. If you do that you won't be able to set your property to None! …

Blog

Use the stash, Luke (git-stash)

I was in the middle of developing a new feature for the TurnKey Hub when I received a bug report that needed to be fixed. What to do? Throw away my current changes? Checkout a …

Blog

My code refactoring algorithm

You're looking at a block of Python code. It's not immediately obvious what it does. It's sort of a mess and you realize it needs to be refactored. But how? What mental algorithm …

Blog

Growl type notifications in Django

First, a little background Django has an excellent messages framework which provides support for cookie and session-based messaging, for both anonymous and authenticated users. …

Blog

Prevent double click on form submission

Recently I've been going over the Hub logs and fixing issues which have caused exceptions to be raised in the application. One in particular had me stumped for a while. An …

Blog

Practical guidelines for beautiful Python code

Every now and then Liraz and I find ourselves chatting about how much we love Python, but more so the lessons we have learned from coding, and how to apply them to create …

Blog

Git - Fixing commit mistakes

I use Git. I use it a lot. I basically use it for everything I do, from code revision control to revisioning my notes, my journal, even my email archive (don't ask, it's a long …

Blog

Tweaking Django exceptions with custom middleware

When settings.DEBUG is set to False, exception tracebacks will be sent to settings.ADMINS. To make it simpler to track down how and why the exception was raised, it's beneficial …

Blog

Programming insight that helped unblock me

I'm finding a big part of the context switch involved in getting back to a high level of productivity on my programming is relearning old lessons. In particular one of the most …

Blog

To Lisp or not to Lisp, that is the question.

Musings on Lisp by a routinely Pythonic programmer Last week I did some maintenance on various Python projects I haven't touched in years (literally), and I was surprised by how …

Blog

Django settings.py for development and production

So you developed a Django web application and now need to deploy it into production, but still need to actively continue development (bugfixes, tweaks, adding and testing new …

Blog

Django navigation bar (active link highlighting)

Every web application needs a navigation bar. Common practice is to indicate to the user where he or she is, and is usually implemented by using a visual aid such as a bold …

Blog

Optimizing Django: tricks for faster page loads

By reducing the file size of your CSS, JavaScript and images, as well as the number of unnecessary browser requests made to your site, load time of your applications pages can be …

Blog

CSS cheat sheet

While reading CSS books and experimenting I found it helpful to take notes and put together a cheat sheet for quick reference. I figured others might find it useful so I'm …

Blog

Python symmetric encryption with CRC

Recently I needed to transfer data between entities, but I needed to keep the data secure from prying eyes, and its integrity intact from busy little fingers on the wire. I needed …

Blog

9 things about CSS any web developer should know

9 things I didn't know about CSS that I should have known years ago but I only picked up from a couple of good CSS books. Having dabbled in web development over the years, I've …

Blog

Django User Profiles - Simple yet powerful

So you're building a web application, and using the excellent contrib.auth subsystem to manage user accounts. Most probably you need to store additional information about your …

Blog

Good automation vs bad automation

I recently eliminated a bit of code that was supposed to handle upgrading our build infrastructure from using one distribution (e.g., Ubuntu 8.04 LTS) to another (e.g., Ubuntu …

Blog

Friends don't let friends program in shell script

Lately I've been going over a hellish patch-work of old shell scripts we wrote to automate some internal processes and I realized something: friends shouldn't let friends program …