Binge-Purge

$ history | grep freeciv
  605  freeciv
  606  sudo apt-get install freeciv
  607  sudo apt-get remove freeciv
  652  rm -rf ~/.freeciv/
  706  sudo apt-get install freeciv
  722  sudo apt-get remove freeciv
  735  rm -rf ~/.freeciv/
  752  sudo apt-get install freeciv
  754  sudo apt-get remove freeciv
  768  rm -rf ~/.freeciv/
  785  history | grep freeciv

"Give Anything"

As a freshman on my high school's cross country team, our captain told me that to be a good runner, you needed to love pain.

I objected: a great runner could love to race, I said, and endure the pain only for the sake of competing and winning.

It's only fifteen years later (practically one foot in the grave), that I now see that I was wrong and he was right.

You can run out of habit or you can run because Coach would notice if you skip practice, but you cannot run because of the strictly instrumental effect that not-running would have on your goals. Our minds aren't built that way; what is separable conceptually is not separable architecturally.

Ultimately, to not sacrifice the gift, you have to love pain. You have to love life.

Cranberry Bliss!

(Previously.)

It's the tenth day of the third November of my life (that I am willing to admit to), and I am determined to wring some sort of high-sounding interpretation out of the cool air and damp sidewalks: perhaps a contrast, something about the events that directly prompt fundamental life changes (on the one hand), and the events that indirectly catalyze fundamental life changes by means of enabling the construction of a legible narrative in which the changes can be plausibly attributed to them (on the other).

Today I am constructing a narrative about my life fundamentally changing because the coffee hegemon has started selling those medicinal (right) cranberry/cream-cheese triangles again. Not that hastening my inevitable horrible cardiac death with dessert bars is like a series arc or anything, but it's a thing I learned today that is salient enough to be repurposed as a trigger, a reminder that the autumn–winter windustrial complex is upon us again, that this is supposed to be my favorite time of year, that there simply is no reason I won't attune myself to perceive nature's cyclic harmonies, then perform every San Francisco software engineer's sacred duty and disrupt the living fuck out of them.

Lipschitz

—and the moment or more than a moment when the dam breaks, when the damned break and the void inside their skulls is filled (the atmosphere rushing in quickly, but not so quickly that one couldn't sense its motion) with the terror that is knowledge of the specter of continuity: that there have never been, and can never be, any miracles.

For to be saved is only to be some distance in the initial conditions from being damned, some lesser distance from being half-damned ... some δ-distance from being ε-damned. And the complement of the shadow we cast on the before-time contains its limits.

Some Excuse for a RustConf 2017 Travelogue

(Previously, previously on An Algorithmic Lucidity.)

Wow, has it already been a year since last RustConf?—give or take the exact date of the event sliding a bit between years—and give a month-and-a-half of procrastination before being truly struck by the mounting realization that my opportunity to blog something about it before the opportunity expires has almost—but crucially, not quite—faded into oblivion. And a year-and-a-quarter since my first contribution to the compiler? I've recently moved into the top hundred contributors by commit count, because GitHub's contributors graph page only goes down to a hundred and my life is controlled by what things GitHub happens to provide graphs for.

So in the evening of Wednesday 15 August, I boarded the Amtrak Coast Starlight at Jack London Square station in Oakland for the long pilgrimage north to Portland to visit friend of the blog Sophia and attend this year's RustConf.

The train was nearly three hours late. (More like Slowest Starlight, am I right?)

On Thursday, I convened a Berkeley Slate Star Codex meetup in exile with Sophia and another local.

I don't think I was very well-prepared to take advantage of the conference itself this time around. I attended the Friday "advanced" training session, but the content was mostly the same as last year (I probably should have chosen the Tock session instead), and I don't actually own a laptop (I used "my" employer-owned laptop last year), and trying to make do with my accessorized phone and the playground was not an optimized experience.

Then the day of the conference itself, I overslept (and left my badge at Sophia's house), and had a high-neuroticism day induced by social-media drama that I had inflicted on myself the previous night, which distracted me from the content of the talks and the challenge of actually connecting with people on the hallway track (the most valuable part of any conference).

But, you know, there will be other conferences. Rust isn't going anywhere. And neither am I.

Except, you know, to Portland or wherever for the occasional conference.

I Meant to Do That

I quit my dayjob a few months ago. I said I was taking a sabbatical from my programming career to work on my own projects: there's a lot of math that I've been wanting to learn properly for a long time (game theory, Bayesian networks/structual causal models, analysis), and there's a lot of writing that I fear I must do (although for branding and market-segmentation purposes, I'm pretending that's someone else's story).

I have made some progress on these goals, but—as one would have predicted from an Outside (i.e., No Fun) View model trained on my historical behavior during periods of underemployment- or school-holiday-induced freedom—it's been disappointingly slow on a day-to-day level: it is easier to let an hour blur by in daydreams or low-quality internet reading than it is to actually study or actually write, and a day is only made of so many hours.

My dominant emotions surrounding this observation are guilt and shame. Guilt: that I'm failing my moral responsibility to be intellectually productive, a duty owed to the human spirit and maybe even the Bayes-structure itself. Shame: that a hypothetical adversary could use the fact of my slothfulness as evidence against my beauty, that the failure to live up to the promise of my ideals could be construed to deny or disparage the ideal itself.

Well, I do have a moral responsibility to be intellectually productive which is owed to the human spirit; this cannot be doubted. But I've been wondering lately if it might be better to let go of the shame and even most of the guilt. This not because shame and guilt can't be useful emotions, but rather that I might be thought of as having outgrown them.

I think the shame is born of insecurity: I spent a lot of years resenting school and resenting a culture that didn't have a concept of intellectual life or paths to economic success outside of school, resulting in a desperate need to prove myself: if I don't create given the time and freedom to do so, couldn't pawns of the system use it as ammunition to sneer at me and proclaim that no one can possibly do anything worthwhile without a teacher to command them to do it? And if I don't create, would they even be wrong?

Having something to prove was a useful motivation—it drove me to learn math, at least, to an extent that's probably hard to motivate without a status gradient at work. But now, at age 29—thanks to the software industry for a niche where my talents are economically legible, thanks to the aspiring-rationalist subculture for a community where I feel respected—I think I've exited the world I resented. Whatever I had to prove, I've either proved it by now or have extracted myself from the need to please any doubters.

What, then, should take the place of a desperate need to prove one's value as a source of motivation? What is to be the new emotional reaction to observations of slow progress, if not shame and horror and fear at what my enemies would make of this?

Shame creates an incentive to deny or minimize the culpable action, to distort the map of what actually happened in order to protect oneself: "I didn't do that; it's not what it looks like." I think I would prefer to draw on sources of motivation that don't have this property, that can accept the reality of what actually happened without pain ...

Ideas Have Expirations

One often-overlooked aspect of the crime of not-writing is that the harm isn't just about the things that deserve to be said that you never get around to saying because you don't put in the time and effort. It's also about the things that you can't say anymore even if you suddenly had the will, because the opportunity to say it was bound to a particular time, and trying to recapitulate the thoughts months or years after the fact would be irrelevant, or impossible.

This phenomenon comes in degrees. Start with irrelevance. Often the inadmissibility of tardy words isn't absolute: you could say things late, but the product would be less valuable than if it were timely—especially in a medium like blogging, where the posts being dated and displayed reverse-chronologically creates an expectation that the entries are associated with a particular point in time—at least, that they were written not too long before their publication date, even if the actual content isn't about the ephemera of the day or season. This has contributed to An Algorithmic Lucidity not being as good of a blog as it could be.

Continue reading

Attentional Shunt

#!/usr/bin/env python3

# Copyright © 2015 Zack M. Davis

# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

"""
Configure the machine to shunt traffic to distracting sites to localhost,
preserving attention.
"""

import os
import argparse
import subprocess
import sys
from datetime import datetime, timedelta

ETC_HOSTS = os.path.join(os.sep, 'etc', 'hosts')
HEADER = "# below managed by attentional shunt"
INVERSE_COMMANDS = {'enable': "disable", 'disable': "enable"}

DISTRACTING_HOSTS = (  # modify as needed
    'news.ycombinator.com',
    'math.stackexchange.com',
    'scifi.stackexchange.com',
    'worldbuilding.stackexchange.com',
    'workplace.stackexchange.com',
    'academia.stackexchange.com',
    'codereview.stackexchange.com',
    'puzzling.stackexchange.com',
    'slatestarcodex.com',
    'twitter.com',
    'www.facebook.com',
    'slatestarscratchpad.tumblr.com',
)
SHUNTING_LINES = "\n{}\n{}\n".format(
    HEADER,
    '\n'.join("127.0.0.1 {}".format(domain)
              for domain in DISTRACTING_HOSTS)
)


def conditionally_reexec_with_sudo():
    if os.geteuid() != 0:
        os.execvp("sudo", ["sudo"] + sys.argv)


def enable_shunt():
    if is_enabled():
        return  # nothing to do
    with open(ETC_HOSTS, 'a') as etc_hosts:
        etc_hosts.write(SHUNTING_LINES)


def disable_shunt():
    with open(ETC_HOSTS) as etc_hosts:
        content = etc_hosts.read()
    if SHUNTING_LINES not in content:
        return  # nothing to do
    with open(ETC_HOSTS, 'w') as etc_hosts:
        etc_hosts.write(content.replace(SHUNTING_LINES, ''))


def is_enabled():
    with open(ETC_HOSTS) as etc_hosts:
        content = etc_hosts.read()
    return HEADER in content


def status():
    state = "enabled" if is_enabled() else "disabled"
    print("attentional shunt is {}".format(state))


def schedule(command, when):  # requires `at` job-scheduling utility
    timestamp = when.strftime("%H:%M %Y-%m-%d")
    at_command = ['at', timestamp]
    at = subprocess.Popen(
        at_command,
        stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE
    )
    at.communicate(command.encode())


if __name__ == "__main__":
    arg_parser = argparse.ArgumentParser(description=__doc__)
    arg_parser.add_argument('command',
                            choices=("enable", "disable", "status"))
    arg_parser.add_argument('duration', nargs='?', type=int,
                            help=("revert state change after this many "
                                  "minutes"))
    args = arg_parser.parse_args()
    if args.command == "status":
        status()
    else:
        conditionally_reexec_with_sudo()
        if args.command == "enable":
            enable_shunt()
        elif args.command == "disable":
            disable_shunt()

        if args.duration:
            now = datetime.now()
            inverse_command = INVERSE_COMMANDS[args.command]
            schedule(
                "{} {}".format(os.path.realpath(__file__), inverse_command),
                now + timedelta(minutes=args.duration)
            )

Back from Running

[16:03:37] <alice>  I'm back from literally running, metaphorically from
                    figurative demons
[16:03:50] <alice>  including the celebrity demon-prince Rateirs-Blak
[16:05:37] <carol>  alice: ?
[16:05:49] <carol>  oh
[16:05:55] <alice>  there's no canonical Latin-alphabet transliteration of his
                    name, because mortals fear to set it in writing
[16:06:08] <alice>  or maybe they just can't think of how or never make
                    the effort to do so; it's unclear

The Second R

I want to code all of the things, but I also want to write at least some of the things, but sometimes putting things in words—simple things, things I know—can be hard. Every other day I dream of getting in some writing in the night after I return from the code mines across the bay, but the box where the writing tool lives is the same as the box where you can read everything that anyone else has ever written, and you can guess what I really do then, when it's easier to read than to farm, to eat than to write.

But writing is important, because we can imagine nearby possible worlds in which the distribution of verbal skills is incompetenceward of our own, and the people in those worlds are sadder and poorer than us, the clumsiness of their attempts at communication leaving them less effective at coordinating their activities to dominate nature: colleagues maneuver against each other, ineffectually; television is less interesting; lovers stare into each others' eyes having less idea than you of what they're really looking at.

And in our own world, where people can say more, but not enough—I can read, but I'm missing something ... I can reckon with 'rithmetic, which serves a purpose, but cannot in human terms express the richness of vision that courses through ... something. And it cannot be a part of inner peace and glory until paired with something that does, high though the price may be for that something!

The second R, which is yet not an R. I want this more than I can say.

Permalink or It Didn't Happen

As far as I can tell, I don't have any kind of synesthesia. You can't be too sure (which means, you can easily be entirely too sure), what with our na(t)ive theories of psychology being so inadequate that everything we believe about other minds is but a filament of noise and conjecture, but your probability distribution about the mapping of sensory inputs to perceptions for me is probably not so different as mine of the same for you (dear reader of whom I know nothing)—roses seem red, violets would seem blue if we spoke a language that didn't already have a word for violet—which means that when I tell you that there's a musty, stale odor around a blog that hasn't been updated in a month and change, it's only a trite metaphor and not a perceptual reality of any sort. Still, even if you can't smell it (if your senses are like mine; if your fox, like mine, still hasn't bothered to implement the HTML5 <aroma> element), it's an ominous thing, to see a blog hovering near the boundary between life and death, a corpus perhaps on the way to being a corpse. The internet is littered with the latter, monuments to people who reliably had something to say, month after month ... until they missed a month, and then it wasn't long before they missed another.

my_block_of_squares

Now I can assure you that that will never happen to this place while I'm still breathing—this blog lives exactly as long as I do—only that's not a precise way of speaking; what I can do is offer you my assurance, which is a different thing from you actually feeling assured, which is a different thing still from that which was assured against actually never coming to pass. But I think these differences—between feeling and reality, between saying and reality—I think these enormous differences are much greater than the tiny, barely-perceptible gap between seeing so many gloriously intricate things to say, and making the time and words to express them on your blog when you are so busy with your trade in the manufacture of useful machinery (and the green tiles which are its highly-coveted industrial byproduct). But if all I can observe is that the gap is barely perceptible, then by the enormity of the earlier differences, I am not licensed to infer that the gap is tiny, not when the only reason I am telling you this is that I would die of shame if my monthly archives sidebar skipped a month for the first time since May of 'aught-twelve, not during this second year of my life in which I am supposed to write a compiler and a bad novelette even though it is for all intents and tens of intensive purposes practically March.

Growl

Dear reader, imagine you have an idea for a work of prose that you want to have finished by Election Day for reasons which will become clear later, and you're not sure how long it should end up being, but you think maybe around twelve thousand words. When considering what you can do to ensure that this feat will actually be accomplished, it occurs to you that you could start writing now. Or

Continue reading

Motivation

The blog has been silent for two weeks plus and, dear reader—that is, if there are any of you still remaining—dear reader, the thought occurs to me that maybe I should keep my drafts in a Git repository with a remote on GitHub, not because I need the full power of version control (I do not), but because then I would be rewarded for writing with those contemptible green contribution squares.

My Squares

It's an anthropomorphism to think that humans have goals, that we do things because we've computed that they'll increase expected beauty or rightness in the world. We do things for the immediate reinforcement. You eat the candy because it tastes good and you show up to work on time because if you didn't, then your colleagues would notice. Serious long-term risks of diabetes or unemployment are too distant and too abstract to enter in the equation; far more effective is something immediately noticeable, even something as trivial as an integer being incremented or a square turning a darker shade of green. I tell myself that I code because it's fun and useful and lucrative (though I'm never explicit about whether that's descending or ascending order of importance), but would I be quite so diligent without the implicit gamification of my virtue? Would it be enough to have done good work, without wasting a few minutes here and there to gaze admiringly at commit diffs and contribution squares which manifest my moral worth in red and green and green?

Dear reader, I want you to picture yourself reclining at the end of a long day near the end of long career filled with great or terrible deeds. A young minion at the start of their own career will look at you and ask in awe, "O Master, what motivated you, all that time? What drove you on in your hour of deepest exhaustion? Was the it money, the fame, the men or women? Was it your ideological fervor or spirit of generosity?"

"No," you'll reply. "I did it for the green squares. And given the same circumstanstances ... I'd do it all again."

"You mean, you made the right choices? You have no regrets?"

"No, you fool!" you'll shout. "Don't you understand? I said, I'd do it again."

Thinking About Writing

"I've been thinking about writing a novel."

"I don't understand."

"I said, I've been thinking about writing a novel. What's there not to understand?"

"The phrase thinking about writing. Is that even grammatical? And if so, what could it possibly mean?"

"What? It's perfectly gram—oh, I get it. Fine. No hedging: I am going to write a novel!"

"Sorry, I still don't get it. I know what it means to have written something, or to be at a keyboard writing something. But to be going to write something, in the unobservable future? Even if the concept is coherent—and I'm not sure it is—how could you possibly know?"

Mode Lock

I'm afraid—it seems like (or maybe the weak phrasing seems like is just a form of denial, when the proposition under consideration should actually just be considered obvious) there's this terrible, terrible psychological trade-off, that there are some valuable qualities that you can't have without neglecting other valuable qualities, not just because you don't have enough time to fully develop too many different skills, but because when your brain is specialized in one direction, there are other things you can't learn.

Oftentimes I feel like I don't want or know how to do anything except read and think ... which might be fine if I were independently wealthy and there wasn't any actual work left to do in the world, but in our current situation, it would be nice to make some money and actually accomplish something. There's a Trope for "Shapeshifter Mode Lock" but the cognitive equivalent is arguably more serious as disabilities go.

Library Fines

Overdue book fines are a terrible sin, not because of the harm done to other library stakeholders, but because of what they say about you as a person: not only did you not get around to finishing the books you (apparently erroneously) thought you wanted to read, but you weren't even responsible enough to bring them back on time.

Dreams

Friend of the blog Alicorn tweets:

Why is the word "dreams" used to describe both pseudorandom nocturnal hallucinations and also heartfelt aspirations for real life?

A cynic might reply: because both the nocturnal hallucinations and the heartfelt aspirations are, for the most part, composed of lies. How many people, what proportion of the time, will actually lift a finger (or open a book, or make a telephone call) to work towards actually achieving what they believe to be heartfelt aspirations?