New trick to track physical Inbox Zero with Beeminder, or how to beemind „do every so often” goals

Daniel Reeves from Beeminder recently announced that you can now use that service to help you keep your GMail inbox down to zero, as suggested by Merlin Mann in his kinda-famous Google Tech Talk.

You know what? That’s fine for Merlin, but I don’t have a problem with e-mail stacking in my inbox. My physical inbox is my weak point, especially a pile of receipts waiting to be entered into my personal finance app. Chores can be ordered from least troubling to most troubling, and something has to be at the end of that list, right?

Getting Things Done (which is copyright DavidCo 2001) really stresses the importance of regular review. There’s no point in having inbox that you’ll never look at. In my case this pile of receipts developed into a kind of an ugh field, which discourages me from processing my inbox in a timely manner.

There must be a way to use Beeminder to help with this problem. Prima facie there is no easy way to quantify how much should be done. Counting how many items are there in my physical inbox would be a tremendous waste of time. I think I’ll make do with something simpler. Quantifying time spent on processing this inbox isn’t a good idea either. Once I’m done, I’m done, so I might lose simply by running out of work to do.

The idea is to simply count days when I did any amount of work, not
necessarily until the mythical Zero state. Getting a little bit done every so
often should do the trick. There’s also a big chance that once I start work, I
wont stop for a while because of simple inertia.

So, here’s a day counter written in python, using the recently announced Beeminder API. It will help me process my inbox in a timely manner, and can be used to track any „do every so often” type of goal.

#!/usr/bin/python

#Beeminder Day Counter by Tadeusz Andrzej Kadłubowski.

#A simple Beeminder utility to increment yesterday goal value by one.


import argparse
import httplib
import json
import sys
import time

parser = argparse.ArgumentParser(description='Increment yesterday Beeminder goal value.')
parser.add_argument('--user', dest='username', help='Beeminder username')
parser.add_argument('--goal', dest='goal', help='Goal')
parser.add_argument('--auth_token', dest='auth_token', help='Authentication token (from https://www.beeminder.com/api/v1/auth_token.json)')

args = parser.parse_args()
username = args.username
goal = args.goal
auth_token = args.auth_token
if not username or not goal or not auth_token:
	parser.print_help()
	sys.exit(1)

def entered_yesterday(datapoint):
	yesterday = time.localtime(time.time() - 24 * 60 * 60)
	datapoint_time = time.localtime(datapoint["timestamp"])
	return yesterday.tm_yday == datapoint_time.tm_yday \
		and yesterday.tm_year == datapoint_time.tm_year

def get_yesterday_value():
	connection = httplib.HTTPSConnection('www.beeminder.com')
	connection.request("GET", "/api/v1/users/%s/goals/%s/datapoints.json?auth_token=%s"%(
		username,
		goal,
		auth_token
	))
	datapoints = json.loads(connection.getresponse().read())
	return min([dp["value"] for dp in datapoints if entered_yesterday(dp)])

def add_today_datapoint(value):
	connection = httplib.HTTPSConnection('www.beeminder.com')
	connection.request("POST", "/api/v1/users/%s/goals/%s/datapoints.json?auth_token=%s&timestamp=%d&value=%d&comment=%s"%(
		username,
		goal,
		auth_token,
		int(time.time()),
		int(value),
		"created+automatically"
	))
	reply = json.loads(connection.getresponse().read())
	print reply

add_today_datapoint(get_yesterday_value() + 1)

You can download this script from github.

It’s to be placed in a crontab somewhere and run once a day in the middle of the night

30 3 * * *        beem_day_counter.py --user=joe_doe --auth_token=abc123abc123 --goal=inbox >> $HOME/log/day_counter.log 2>&1

(Grab your personal authentication token on https://www.beeminder.com/api/v1/auth_token.json)

To use this script with Beeminder create a new custom goal. Pick initial value that is equal to your desired frequency (in the example below I’ll go with „at least once every 4 days”). Start with a flat Yellow Brick Road.

create_custom_goal

You must also set two advanced options. Set good side of the road to (obviously) „below”, and aggday to „min”. The latter means that Beeminder will pick the lowest out of multiple values for each day. Once you’re done for a day simply enter „0″ data point: it’s 0 day’s since you’ve last done the task. The python day counter will start again from 1 tomorrow. That’s it.

That’s my current setup. We’ll see if it makes any sense in the long-term.

Opublikowano Uncategorized | 3 komentarzy

Current evolutionary pressures on human culture

When I’ve read Stephen M. Omohundro’s article titled „The Basic AI Drives,” several insights suddenly clicked together in my head. He discusses drives or instincts that we can expect to find in all self-aware goal-optimizing systems, including potential AIs we might create, and more importantly human beings.

The most interesting drive that Omohundro proposes is that self-aware goal-optimizing systems will try to prevent counterfeit utility. Each such system necessarily in order to act rationally must have a method to measure utility. In case of human beings, it is a complex neurochemical mechanism that evolved biologically.

This neurochemical mechanism isn’t foolproof. A drug addict might experience several neurochemical aspects of doing really great, but we still have a strong intuition that smoking crack is not the right way to have a good life.

Each goal-optimizing system faces this problem. Utility measurement mechanism can be manipulated by external factors. Rationality fails if your utility measurements are corrupted. This fact about general mind architecture is exploited by many different professions — from drug lords to marketers to pornographers to politicians. It is irrelevant if people using this manipulation to their benefit openly admit to that or rationalize it somehow.

SEO is an example of the same manipulation in case of an AI system as we know it now. Google wants to provide the users with high quality search results, and uses measurement of the pagerank algorithm to judge the quality. This proxy measurement is subject to all kinds of manipulation by the SEO industry, while the Google Search Quality team constantly strives to improve the secret algorithms to detect and stop manipulation.

I believe that the same arms-race is currently happening in human culture. Humans might be good at detecting manipulation in ancestral situations of tribal life on African savanna. Recent developments of (a) communication technology, and (b) psychology and cognitive science suddenly introduced many new ways to induce humans to act irrationally. In order to defend against this tendency we must improve our rationality and get a better explicit understanding of our goals and values.

Opublikowano Uncategorized | Dodaj komentarz

Which year in the XX century was the best to be born in?

I’ve played with wikipedia API for a while. For example, I’ve downloaded all the statistics about famous people born in the XX century (i.e. articles belonging to „19YY births” categories). Did you know that of all the people born in 1963, it’s Whitney Houston that has the longest wikipedia article? It’s longer than Johnny Depp‚s and Quentin
Tarantino
‚s wikipedia articles put together.

I then compared this data with global population numbers. It turned out that year 1947 was the best year to be born in the XX century. One person in every 3000 people born in that year now has a wikipedia article. For comparison, there is only one wikipedia article per 5000 people born in 1931.

number of wikipedia articles per 1 million people

The world immediately after World War II was a good place to be born in. Let us look at the most prominent people born in 1947 (i.e. those with the longest articles). I’ve found a broad bi-partisan selection of political crooks. Hillary Clinton, Mitt Romney, Jon Corzine, and Tom DeLay. Poor Tom DeLay not only got 3 years for money laundering, but also had to withdraw from 9th season of Dancing with the Stars due to bone fracture in his foot.

Opublikowano Uncategorized | Dodaj komentarz

How to LeechBlock Instapaper into write-only mode.

LeechBlock and Instapaper keep me sane. Today I thought of one new way to combine the two.

In LeechBlock I have a „Total Lockdown” set that blocks everything (*) with maybe half a dozen exceptions, like Lua 5.1 Reference Manual. The exceptions are things that I actually do need to work.

The idea: add +instapaper.com/bookmarklet to the „Total Lockdown” LeechBlock set. That white-lists Instapaper bookmarklet. You can’t read that Paul Krugman NYT blog you bookmarked yesterday, but you can still bookmark new thigs for future use. With catch-all * LeechBlock blacklist and this bookmarklet exceptionInstapaper becomes write-only.

So that’s the tip. Now get back to work.

PS. If you really do read Paul Krugman in NYT, please read also Krugman-in-Wonderland. That’s yet another thing that keeps me sane.

Opublikowano Uncategorized | Dodaj komentarz

Solarized colors using ANSI color codes.

I’ve been playing with the Solarized color scheme recently. For better or for worse, I’m stuck with 16 ANSI color codes in my terminal emulators (i.e. Konsole and Terminal.app). Some ammount of trickery is needed to map 8 dark colors and 8 bright colors into 8 accent colors and 8 shades of gray.

The main problem is that the ANSI-colored backgrounds are always dark. The intensity bit is used only on foreground. You simply can’t get bright background colors.

In this case the only sane solution is to map color accents to the bright colors, and the grays to the dark colors. To get maximum flexibility you can map one accent (the red is a good choice) as a dark color, so that it can be used as a background in big, flashing TODO markers.

Opublikowano Uncategorized | Dodaj komentarz

Compiling vim with python scripting support on OS X.

Here’s a tricky bug. I wanted to learn how to script vim with python. Neither
vim shipped by Apple as a part of OS X Snow Leopard, nor the one installed via
MacPorts had +python feature compiled in.

No problem. I’ve downloaded the latest vim 7.3 sources from vim home page and ran:

./configure --enable-pythoninterp=yes

It worked. Well, kind of worked:

:py vim.current.buffer[0] = "Hello world"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
TypeError: bad argument type for built-in operation

I’ve spent several hours tracking this bug down. Funny sys.path was the biggest clue. At compile time vim used MacPorts-installed python 2.7, but at runtime it dynamically loaded Apple’s python 2.5. For some reason it didn’t simply crash and burn. After some trial and error I make it work this way:

LDFLAGS="-F/opt/local/Library/Frameworks/" ./configure --enable-pythoninterp --with-python-config-dir=/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config/

Unfortunatelly, python’s config scripts are unaware of the OS X concept of Frameworks, so I had to manually pass the -F flag to the linker.

Opublikowano Uncategorized | Dodaj komentarz

Tłumaczenie Hoppego

Ostatnio intensywnie pracuję nad tłumaczeniem na polski artykułu “Of Private, Common, and Public Property and the Rationale for Total Privatization” Hansa Hermana Hoppego znalezionego w Libertarian Papers.

Mała próbka orginału:

Rather, to avoid all otherwise unavoidable conflict, the original privatization of goods must occur through actions: through acts of original appropriation of what were previously “things.” Only through actions, taking place in time and space, can an objective—intersubjectively ascertainable— link be established between a particular person and a particular good. And only the first appropriator of a previously unappropriated thing can acquire this thing without conflict. For, by definition, as the first appropriator he cannot have run into any conflict with anyone in appropriating the good in question, as everyone else appeared on the scene only later. All property must go back, then, directly or indirectly, through a chain of mutually beneficial and hence likewise conflict-free property-title transfers, to original appropriators and acts of original appropriation.

Moja wersja:

Pierwotne przywłaszczenie dóbr musi nastąpić poprzez działanie. Tylko akty objęcia w posiadanie tego, co wcześniej było „rzeczami” pozwala uniknąć konfliktów. Działanie, mające miejsce w określonym miejscu i czasie, tworzy obiektywną (czyli intersubiektywnie sprawdzalną) więź pomiędzy konkretną osobą, a konkretnym dobrem. Tylko pierwszy przywłaszczający może bez konfliktu objąć w posiadanie rzecz wcześniej niczyją. Nie może wejść z nikim w konflikt podczas przywłaszczania danego dobra dlatego, że z definicji wszyscy pozostali byli później. Wszelka własność musi zatem mieć swoje źródło w aktach pierwotnego przywłaszczenia przez pierwszych właścicieli — bezpośrednio, lub pośrednio, poprzez szereg wzajemnie korzystnych, czyli bezkonfliktowych przenosin tytułu własności.

Taka praca stymuluje wyobraźnię językową lepiej od najlepszej krzyżówki.

Opublikowano Uncategorized | Dodaj komentarz