Android

1 Articles
Can you Write Code on a Chromebook?

Can you Write Code on a Chromebook?

This is an update to Can you Write Code on an iPad?, in which I tried writing...

Apple

1 Articles
Time Is a Circle: Apple Watch and the Geometry of Time

Time Is a Circle: Apple Watch and the Geometry of Time

In 2013, archaeologists digging in the Valley of the Kings found one of the o...

Books

5 Articles
Revisiting Umberto Eco's Future of the Book

Revisiting Umberto Eco's Future of the Book

In 2003 Umberto Eco gave a talk at the opening of the Bibliotheca Alexandrina...

Sharp Edges: Protecting Ourselves from Digital Publishing

Sharp Edges: Protecting Ourselves from Digital Publishing

Nicholas Carr wrote in a recent article that he considered the ability of pub...

Self-Reliant Veganism

Self-Reliant Veganism

“Trust thyself: every heart vibrates to that iron string.” When I first read...

Coastal Bookstores

Coastal Bookstores

Kim and I are heading to Coos Bay this week to celebrate Thanksgiving with th...

Reading Murakami Five Years Later

Reading Murakami Five Years Later

Kim and I have been reading The Wind-up Bird Chronice, one of Haruki...

Buddhism

1 Articles
On Starting a Daily Meditation Practice

On Starting a Daily Meditation Practice

The single thing that improved my daily life the most in 2013 was starting a ...

Chromebooks

1 Articles
Can you Write Code on a Chromebook?

Can you Write Code on a Chromebook?

This is an update to Can you Write Code on an iPad?, in which I tried writing...

Cross-posts

3 Articles
Becoming a Better Learner

Becoming a Better Learner

My post Becoming a better learner went up on the Safari blog recently. I real...

Protect Against Bias While Hiring

Protect Against Bias While Hiring

I wrote a post recently on the Safari blog, this time about how to protect ag...

How to Thrive as a Remote Worker

How to Thrive as a Remote Worker

I wrote a post this week about remote work, specifically how to avoid going c...

Databases

1 Articles
Scaling Django with Postgres Read Replicas

Scaling Django with Postgres Read Replicas

Replication is a feature of PostgreSQL that you typically use to achieve high...

Django

7 Articles
Scaling Django with Postgres Read Replicas

Scaling Django with Postgres Read Replicas

Replication is a feature of PostgreSQL that you typically use to achieve high...

The Temple of Django Database Performance Is on Sale Now

The Temple of Django Database Performance Is on Sale Now

A year ago, I set out to write the book on Django database performance. Not ...

How Does Django's StreamingHttpResponse Work, Exactly?

How Does Django's StreamingHttpResponse Work, Exactly?

This post tries to explain just what goes on when you use Django’s StreamingH...

One Year Later: An Epic Review of PyCharm 2.7 from a Vim User's Perspective

One Year Later: An Epic Review of PyCharm 2.7 from a Vim User's Perspective

This is a review of PyCharm 2.7 that covers all of the features of the editor...

Using IPython Notebook with Django

Using IPython Notebook with Django

IPython has a relatively new featured called the “Notebook,” which improves o...

Set an ImageField path in Django manually

Set an ImageField path in Django manually

Apparently this is a confusing topic. Let’s say you have a Django model with ...

Instant Django Dev Environments with Tmux, Tmuxinator, and Virtualenvwrapper

Instant Django Dev Environments with Tmux, Tmuxinator, and Virtualenvwrapper

This post describes how to use a few common tools to instantly set up and tea...

Ethics

1 Articles
What Are We Doing Here?

What Are We Doing Here?

[T]hough it is worthwhile to attain the end merely for one man, it is fine...

Family

2 Articles
Dear Alma: How to Quit Drinking

Dear Alma: How to Quit Drinking

Dear Alma, I assume that if you’re reading this letter for its true purpose,...

Dear Alma: One Day Left to Live

Dear Alma: One Day Left to Live

Dear Alma, Last night, I took a walk under the evening sky as it showed a co...

FastAPI

1 Articles
Rewriting an API to Use FastAPI: Benchmarks and Lessons Learned

Rewriting an API to Use FastAPI: Benchmarks and Lessons Learned

A question has bothered me for the past year or more: is FastAPI a fad, or sh...

Fiction

1 Articles
Story: David Browning

Story: David Browning

Download audio version My name is David Browning. I ...

Food

2 Articles
Self-Reliant Veganism

Self-Reliant Veganism

“Trust thyself: every heart vibrates to that iron string.” When I first read...

No More Supermarket Blues

No More Supermarket Blues

A few weeks ago, Kim and I were riding home from our weekly trip to Fred Meye...

Games

1 Articles
This Time It’s War

This Time It’s War

My favorite board game ever has to be Aliens, published in 1989 by Leading Ed...

Ghosts

1 Articles
Story: Hunting Ghosts

Story: Hunting Ghosts

Download audio version The night sky above Interstat...

Go

1 Articles
Porting a Geographic Nearest-Neighbor Python Web Service to Go

Porting a Geographic Nearest-Neighbor Python Web Service to Go

I wrote a blog post recently at work that described my experience porting a g...

Learning

1 Articles
Ten Years of Learning Investments

Ten Years of Learning Investments

I’m coming up on ten years as a professional software developer. On...

Life

8 Articles
Dear Alma: Do You Have to Achieve an Act of Greatness for Your Life to Matter?

Dear Alma: Do You Have to Achieve an Act of Greatness for Your Life to Matter?

After the movie The Social Network came out, I saw a post on the internet wri...

Dear Alma: How to Quit Drinking

Dear Alma: How to Quit Drinking

Dear Alma, I assume that if you’re reading this letter for its true purpose,...

Self-Reliant Veganism

Self-Reliant Veganism

“Trust thyself: every heart vibrates to that iron string.” When I first read...

No More Supermarket Blues

No More Supermarket Blues

A few weeks ago, Kim and I were riding home from our weekly trip to Fred Meye...

Riding the Springwater Corridor

Riding the Springwater Corridor

This weekend, Kim and I rode bikes from our apartment in the Lloyd District...

This Time It’s War

This Time It’s War

My favorite board game ever has to be Aliens, published in 1989 by Leading Ed...

Coastal Bookstores

Coastal Bookstores

Kim and I are heading to Coos Bay this week to celebrate Thanksgiving with th...

Reading Murakami Five Years Later

Reading Murakami Five Years Later

Kim and I have been reading The Wind-up Bird Chronice, one of Haruki...

Markdown

1 Articles
Coding on an iPad Pro in 2019

Coding on an iPad Pro in 2019

Download audio version In 2017 I asked, “Can You Wri...

Meditation

1 Articles
On Starting a Daily Meditation Practice

On Starting a Daily Meditation Practice

The single thing that improved my daily life the most in 2013 was starting a ...

Poetry

1 Articles
Why Is Poetry Essential to the Modern Python Stack?

Why Is Poetry Essential to the Modern Python Stack?

A Story February 2021. Maintainers of the cryptography package release a new...

PostgreSQL

1 Articles
Scaling Django with Postgres Read Replicas

Scaling Django with Postgres Read Replicas

Replication is a feature of PostgreSQL that you typically use to achieve high...

Programming

2 Articles
PyCharm: Open the Current File in Vim, Emacs or Sublime Text

PyCharm: Open the Current File in Vim, Emacs or Sublime Text

Even though I use PyCharm, I still drop into Vim occasionally to edit configu...

Four Things I Learned about Software Engineering from Programming MUDs as a Teenager

Four Things I Learned about Software Engineering from Programming MUDs as a Teenager

In job interviews I try to casually drop that I learned how to program as a t...

Publishing

3 Articles
So You Want to Self-Publish a Technical Book

So You Want to Self-Publish a Technical Book

Download audio version In 2019, I spent most of my f...

The Temple of Django Database Performance Is on Sale Now

The Temple of Django Database Performance Is on Sale Now

A year ago, I set out to write the book on Django database performance. Not ...

Starting a Publishing Company: Month 1

Starting a Publishing Company: Month 1

I started a publishing company! Spellbook Press launched this week, taking pr...

Python

18 Articles
What is Python's Default Hash Algorithm?

What is Python's Default Hash Algorithm?

A friend of mine wondered recently, What is Python’s default hash algorit...

Why Is Poetry Essential to the Modern Python Stack?

Why Is Poetry Essential to the Modern Python Stack?

A Story February 2021. Maintainers of the cryptography package release a new...

Rewriting an API to Use FastAPI: Benchmarks and Lessons Learned

Rewriting an API to Use FastAPI: Benchmarks and Lessons Learned

A question has bothered me for the past year or more: is FastAPI a fad, or sh...

Scaling Django with Postgres Read Replicas

Scaling Django with Postgres Read Replicas

Replication is a feature of PostgreSQL that you typically use to achieve high...

Building Implicit Interfaces in Python with Protocol Classes

Building Implicit Interfaces in Python with Protocol Classes

Python 3.8 shipped one of the coolest features I’ve seen in a recent Python v...

Why Does Python Have a len() Function?

Why Does Python Have a len() Function?

New Python users are often surprised to learn that you call a global function...

Demonstrating Timeouts, Retries, and Circuit Breakers with an Outage Simulator

Demonstrating Timeouts, Retries, and Circuit Breakers with an Outage Simulator

I’ve seen quite a few outages and outage-like scenarios caused by improper ha...

Mixins in Python and Ruby Compared

Mixins in Python and Ruby Compared

The venerable “mixin” is a technique I learned as a Python developer. Now, af...

How Does Django's StreamingHttpResponse Work, Exactly?

How Does Django's StreamingHttpResponse Work, Exactly?

This post tries to explain just what goes on when you use Django’s StreamingH...

PyCharm: Open the Current File in Vim, Emacs or Sublime Text

PyCharm: Open the Current File in Vim, Emacs or Sublime Text

Even though I use PyCharm, I still drop into Vim occasionally to edit configu...

Video Of My DjangoCon talk “The Evolution of a RESTful Django Backend”

Video Of My DjangoCon talk “The Evolution of a RESTful Django Backend”

The video of my first ever conference talk is now available on YouTube. Check...

An Epic Review of PyCharm 3 from a Vim User's Perspective

An Epic Review of PyCharm 3 from a Vim User's Perspective

This review is for the Professional Edition of PyCharm 3. I’ll try to cut str...

Porting a Geographic Nearest-Neighbor Python Web Service to Go

Porting a Geographic Nearest-Neighbor Python Web Service to Go

I wrote a blog post recently at work that described my experience porting a g...

One Year Later: An Epic Review of PyCharm 2.7 from a Vim User's Perspective

One Year Later: An Epic Review of PyCharm 2.7 from a Vim User's Perspective

This is a review of PyCharm 2.7 that covers all of the features of the editor...

Build an In-Memory Proximity Search Web Service with Python, SciPy and Heroku

Build an In-Memory Proximity Search Web Service with Python, SciPy and Heroku

In this post I’m going to look at a concrete example of building an in-memory...

Using IPython Notebook with Django

Using IPython Notebook with Django

IPython has a relatively new featured called the “Notebook,” which improves o...

Python: How to tell what class a decorated method is in at runtime

Python: How to tell what class a decorated method is in at runtime

When profiling a Python app, it’s helpful to have a decorator that wraps func...

Instant Django Dev Environments with Tmux, Tmuxinator, and Virtualenvwrapper

Instant Django Dev Environments with Tmux, Tmuxinator, and Virtualenvwrapper

This post describes how to use a few common tools to instantly set up and tea...

Reliability

1 Articles
Demonstrating Timeouts, Retries, and Circuit Breakers with an Outage Simulator

Demonstrating Timeouts, Retries, and Circuit Breakers with an Outage Simulator

I’ve seen quite a few outages and outage-like scenarios caused by improper ha...

Ruby

1 Articles
Mixins in Python and Ruby Compared

Mixins in Python and Ruby Compared

The venerable “mixin” is a technique I learned as a Python developer. Now, af...

Safari

1 Articles
Will iOS 13 Add Support for Safari Extensions?

Will iOS 13 Add Support for Safari Extensions?

The lack of a desktop-class web browser on iOS is one of several things missi...

Technology

41 Articles
So You Want to Self-Publish a Technical Book

So You Want to Self-Publish a Technical Book

Download audio version In 2019, I spent most of my f...

Time Is a Circle: Apple Watch and the Geometry of Time

Time Is a Circle: Apple Watch and the Geometry of Time

In 2013, archaeologists digging in the Valley of the Kings found one of the o...

Coding on iPadOS: Browser Dev Tools with Inspect

Coding on iPadOS: Browser Dev Tools with Inspect

If you’re a web developer who uses an iPad, you will eventually need access t...

Will iOS 13 Add Support for Safari Extensions?

Will iOS 13 Add Support for Safari Extensions?

The lack of a desktop-class web browser on iOS is one of several things missi...

Coding on an iPad Pro in 2019

Coding on an iPad Pro in 2019

Download audio version In 2017 I asked, “Can You Wri...

What Are We Doing Here?

What Are We Doing Here?

[T]hough it is worthwhile to attain the end merely for one man, it is fine...

Using Windows 10 and the Surface Book 2 for Web Development

Using Windows 10 and the Surface Book 2 for Web Development

I’ve been a web developer who uses a Mac for almost ten years, but lately I’m...

Demonstrating Timeouts, Retries, and Circuit Breakers with an Outage Simulator

Demonstrating Timeouts, Retries, and Circuit Breakers with an Outage Simulator

I’ve seen quite a few outages and outage-like scenarios caused by improper ha...

Can you Write Code on a Chromebook?

Can you Write Code on a Chromebook?

This is an update to Can you Write Code on an iPad?, in which I tried writing...

Mixins in Python and Ruby Compared

Mixins in Python and Ruby Compared

The venerable “mixin” is a technique I learned as a Python developer. Now, af...

Ten Years of Learning Investments

Ten Years of Learning Investments

I’m coming up on ten years as a professional software developer. On...

The Rule of Three

The Rule of Three

Many programmers feel a desire to create reusable components early in the dev...

Can You Write Code on an iPad?

Can You Write Code on an iPad?

The merit in all things consists in the difficulty. – Aramis This is ...

My Ideal Software Development Environment

My Ideal Software Development Environment

Someone who looks for me in form or seeks me in sound is on a mistaken pat...

Refactoring Search from Django App to Microservice

Refactoring Search from Django App to Microservice

One of my favorite technical book series is The Architecture of Open Source A...

Video Of My DjangoCon talk “The Evolution of a RESTful Django Backend”

Video Of My DjangoCon talk “The Evolution of a RESTful Django Backend”

The video of my first ever conference talk is now available on YouTube. Check...

An Epic Review of PyCharm 3 from a Vim User's Perspective

An Epic Review of PyCharm 3 from a Vim User's Perspective

This review is for the Professional Edition of PyCharm 3. I’ll try to cut str...

Porting a Geographic Nearest-Neighbor Python Web Service to Go

Porting a Geographic Nearest-Neighbor Python Web Service to Go

I wrote a blog post recently at work that described my experience porting a g...

One Year Later: An Epic Review of PyCharm 2.7 from a Vim User's Perspective

One Year Later: An Epic Review of PyCharm 2.7 from a Vim User's Perspective

This is a review of PyCharm 2.7 that covers all of the features of the editor...

Reading List for an Apprentice Web Developer

Reading List for an Apprentice Web Developer

Here are a few books that I found useful when I was starting out as a web dev...

Wrap Comments and Text to Column Width in IntelliJ Editors

Wrap Comments and Text to Column Width in IntelliJ Editors

One of the small annoyances I found after switching to PyCharm recently was t...

Build an In-Memory Proximity Search Web Service with Python, SciPy and Heroku

Build an In-Memory Proximity Search Web Service with Python, SciPy and Heroku

In this post I’m going to look at a concrete example of building an in-memory...

Revisiting Umberto Eco's Future of the Book

Revisiting Umberto Eco's Future of the Book

In 2003 Umberto Eco gave a talk at the opening of the Bibliotheca Alexandrina...

Set an ImageField path in Django manually

Set an ImageField path in Django manually

Apparently this is a confusing topic. Let’s say you have a Django model with ...

Go: How to Get the Directory of the Current File

Go: How to Get the Directory of the Current File

In Python I often use the __file__ constant to get the directory of the curre...

Run Django Unit Tests in a Sublime Text 2 Build System

Run Django Unit Tests in a Sublime Text 2 Build System

With the dev builds of Sublime Text 2, you can easily set up a build system t...

Python: How to tell what class a decorated method is in at runtime

Python: How to tell what class a decorated method is in at runtime

When profiling a Python app, it’s helpful to have a decorator that wraps func...

Make Sublime Text 2 More like Vim: Wrap Code, Go To Last Edit, Jump Back, and More

Make Sublime Text 2 More like Vim: Wrap Code, Go To Last Edit, Jump Back, and More

I’ve been trying out Sublime Text 2 as a replacement for Vim. While I enjoy u...

Sharp Edges: Protecting Ourselves from Digital Publishing

Sharp Edges: Protecting Ourselves from Digital Publishing

Nicholas Carr wrote in a recent article that he considered the ability of pub...

iA Writer and Notational Velocity

iA Writer and Notational Velocity

The OS X apps iA Writer and Notational Velocity are great for writing and tak...

How to Fix Slow Scrolling in Vim and MacVim on macOS

How to Fix Slow Scrolling in Vim and MacVim on macOS

Vim, Neovim, and MacVim can all exhibit slow scrolling in macOS. In some case...

Instant Django Dev Environments with Tmux, Tmuxinator, and Virtualenvwrapper

Instant Django Dev Environments with Tmux, Tmuxinator, and Virtualenvwrapper

This post describes how to use a few common tools to instantly set up and tea...

Sound Problems with Ubuntu

Sound Problems with Ubuntu

The other day, I stopped hearing any sound effects on my Toshiba Satellite wo...

No NIC on a Windows 7 VMWare image

No NIC on a Windows 7 VMWare image

Today I ran into trouble configuring a Windows 7 guest on a Linux host: Windo...

Deploying Fat Free CRM to Heroku

Deploying Fat Free CRM to Heroku

</p> I just finished deploying a Fat Free CRM install with all the und...

How to Extract Craigslist Locations with Nokogiri

How to Extract Craigslist Locations with Nokogiri

Solace is a web app I created to search multiple Craigslist locations for the...

CiviCRM Views 2 integration with a remote CiviCRM database

CiviCRM Views 2 integration with a remote CiviCRM database

Note: This is an outdated, unmaintained, archived post. Proceed with caution....

Linux: Remove all empty files from a directory

Linux: Remove all empty files from a directory

One-liner to remove all empty files from a directory: ls -s | grep -e '^ 0' ...

Problems and Solutions to Problems: Views 2, CiviCRM, and Drupal 6

Problems and Solutions to Problems: Views 2, CiviCRM, and Drupal 6

The following is a quick run-down of problems you might run into using Views ...

Vim for Thunderbird: Muttator extension External Editor extension

Vim for Thunderbird: Muttator extension External Editor extension

In my quest for the Holy Grail of daily Internet use (IE, how to get vim-styl...

Even Better GNU Screen

Even Better GNU Screen

GNU Screen is one of my favorite applications because of its simplicity and u...

Time

1 Articles
Time Is a Circle: Apple Watch and the Geometry of Time

Time Is a Circle: Apple Watch and the Geometry of Time

In 2013, archaeologists digging in the Valley of the Kings found one of the o...

Unix

2 Articles
Coding on iPadOS: Browser Dev Tools with Inspect

Coding on iPadOS: Browser Dev Tools with Inspect

If you’re a web developer who uses an iPad, you will eventually need access t...

Synchronizing the iOS Clipboard with a Remote Server Using Command-Line Tools

Synchronizing the iOS Clipboard with a Remote Server Using Command-Line Tools

When developing on a remote computer over SSH from iOS, one problem has vexed...

Windows

1 Articles
Using Windows 10 and the Surface Book 2 for Web Development

Using Windows 10 and the Surface Book 2 for Web Development

I’ve been a web developer who uses a Mac for almost ten years, but lately I’m...

Writing

1 Articles
So You Want to Self-Publish a Technical Book

So You Want to Self-Publish a Technical Book

Download audio version In 2019, I spent most of my f...

asyncio

1 Articles
Rewriting an API to Use FastAPI: Benchmarks and Lessons Learned

Rewriting an API to Use FastAPI: Benchmarks and Lessons Learned

A question has bothered me for the past year or more: is FastAPI a fad, or sh...

iOS

11 Articles
Recording Pro Audio and Video at Home with iPads and iPhones

Recording Pro Audio and Video at Home with iPads and iPhones

In January, I started a new job writing and producing technical education vid...

iPad Play Dates in the Time of Coronavirus

iPad Play Dates in the Time of Coronavirus

Oregon schools closed over two months ago to prevent the spread of COVID-19. ...

Handoff from Vim over SSH to Working Copy on iPad

Handoff from Vim over SSH to Working Copy on iPad

Have you ever been working in Vim over SSH on an iPad and wanted to open up t...

Copying to the iOS Clipboard Over SSH with Control Codes

Copying to the iOS Clipboard Over SSH with Control Codes

Let’s delve again into copying text to the iOS clipboard from a remote comput...

Coding on iPadOS: Browser Dev Tools with Inspect

Coding on iPadOS: Browser Dev Tools with Inspect

If you’re a web developer who uses an iPad, you will eventually need access t...

Will iOS 13 Add Support for Safari Extensions?

Will iOS 13 Add Support for Safari Extensions?

The lack of a desktop-class web browser on iOS is one of several things missi...

Synchronizing the iOS Clipboard with a Remote Server Using Command-Line Tools

Synchronizing the iOS Clipboard with a Remote Server Using Command-Line Tools

When developing on a remote computer over SSH from iOS, one problem has vexed...

Coding on an iPad Pro in 2019

Coding on an iPad Pro in 2019

Download audio version In 2017 I asked, “Can You Wri...

Can you Write Code on a Chromebook?

Can you Write Code on a Chromebook?

This is an update to Can you Write Code on an iPad?, in which I tried writing...

Can You Write Code on an iPad?

Can You Write Code on an iPad?

The merit in all things consists in the difficulty. – Aramis This is ...

My Ideal Software Development Environment

My Ideal Software Development Environment

Someone who looks for me in form or seeks me in sound is on a mistaken pat...

iPad

3 Articles
Recording Pro Audio and Video at Home with iPads and iPhones

Recording Pro Audio and Video at Home with iPads and iPhones

In January, I started a new job writing and producing technical education vid...

iPad Play Dates in the Time of Coronavirus

iPad Play Dates in the Time of Coronavirus

Oregon schools closed over two months ago to prevent the spread of COVID-19. ...

Will iOS 13 Add Support for Safari Extensions?

Will iOS 13 Add Support for Safari Extensions?

The lack of a desktop-class web browser on iOS is one of several things missi...

iPhone

1 Articles
Recording Pro Audio and Video at Home with iPads and iPhones

Recording Pro Audio and Video at Home with iPads and iPhones

In January, I started a new job writing and producing technical education vid...

pip

1 Articles
Why Is Poetry Essential to the Modern Python Stack?

Why Is Poetry Essential to the Modern Python Stack?

A Story February 2021. Maintainers of the cryptography package release a new...

security

1 Articles
What is Python's Default Hash Algorithm?

What is Python's Default Hash Algorithm?

A friend of mine wondered recently, What is Python’s default hash algorit...

technology

8 Articles
What is Python's Default Hash Algorithm?

What is Python's Default Hash Algorithm?

A friend of mine wondered recently, What is Python’s default hash algorit...

Building Implicit Interfaces in Python with Protocol Classes

Building Implicit Interfaces in Python with Protocol Classes

Python 3.8 shipped one of the coolest features I’ve seen in a recent Python v...

Why Does Python Have a len() Function?

Why Does Python Have a len() Function?

New Python users are often surprised to learn that you call a global function...

Recording Pro Audio and Video at Home with iPads and iPhones

Recording Pro Audio and Video at Home with iPads and iPhones

In January, I started a new job writing and producing technical education vid...

iPad Play Dates in the Time of Coronavirus

iPad Play Dates in the Time of Coronavirus

Oregon schools closed over two months ago to prevent the spread of COVID-19. ...

Handoff from Vim over SSH to Working Copy on iPad

Handoff from Vim over SSH to Working Copy on iPad

Have you ever been working in Vim over SSH on an iPad and wanted to open up t...

Copying to the iOS Clipboard Over SSH with Control Codes

Copying to the iOS Clipboard Over SSH with Control Codes

Let’s delve again into copying text to the iOS clipboard from a remote comput...

Synchronizing the iOS Clipboard with a Remote Server Using Command-Line Tools

Synchronizing the iOS Clipboard with a Remote Server Using Command-Line Tools

When developing on a remote computer over SSH from iOS, one problem has vexed...