├── bored.rkt ├── codescript.rkt ├── coding └── refactor.rkt ├── dfgraphics.rkt ├── fitness ├── coinfast.rkt ├── dicebell.rkt ├── dicefast.rkt ├── gripper.rkt └── hydrate.rkt ├── flipism.md ├── games.rkt ├── ideas.md ├── index.md ├── machinery ├── rng.rkt └── skillcheck.rkt ├── music.rkt ├── readme.md ├── references └── cocres10.jpg ├── social ├── attention.rkt └── engagetroll.rkt ├── stats.rkt ├── status ├── tasklists ├── day-tasks.txt └── instant-tasks.txt ├── tasks.rkt ├── todayscript.rkt ├── todo.txt └── userinterface.md /bored.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | (require "machinery/rng.rkt") 4 | 5 | (provide bored) 6 | 7 | ;; TODO: Have hydrate/gripper/etc pipe into activities 8 | 9 | (define activities 10 | (list 11 | "Do 20 kettlebell swings" 12 | "Do 10 pullups" 13 | "Do 20 band pull aparts" 14 | "Do 10 goblet squats" 15 | "Hop on bike, ride 5km fast as possible" 16 | "Make a cup of coffee" 17 | "Make a cup of tea" 18 | "Look up a good recipe" 19 | "Put on some different music" 20 | "Read a book" 21 | "Log heart rate" 22 | "Play some guitar" 23 | "Play some bongo" 24 | "Pet a cat" 25 | "Take a selfie" 26 | "Do some gtypist exercises" 27 | "Study some code" 28 | "Go down a wikipedia rabbit hole" 29 | "Get trapped in TVTropes" 30 | "Clean something" 31 | "Summon an elder god" 32 | "Take a nice hot shower")) 33 | 34 | (define (bored) 35 | (define activity (randomchoice activities)) 36 | (printf "~a~n" activity)) 37 | 38 | (bored) 39 | ;; TODO: Make it easy to extend to such as a round of swings, pullups, etc 40 | -------------------------------------------------------------------------------- /codescript.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | ;; Determine a coding session 4 | 5 | (require "coding/refactor.rkt") 6 | 7 | (dotask) 8 | -------------------------------------------------------------------------------- /coding/refactor.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | ;; I have a problem when coding. I have a hard time deciding whether to do new 4 | ;; stuff, or clean up and refactor what I've already done. Sometimes my 5 | ;; productivity just crashes because I'm torn between trying to do both at once, 6 | ;; and I end up getting absolutely nothing done. 7 | 8 | (require "../machinery/rng.rkt" 9 | "../machinery/skillcheck.rkt" 10 | "../stats.rkt") 11 | 12 | (provide dotask) 13 | 14 | (define (dotask) 15 | (define (refactor?) 16 | (define result (skillcheck hubris)) 17 | result) 18 | (if (equal? #t (refactor?)) 19 | (printf "Clean up some code~n") 20 | (printf "Write new code~n"))) 21 | -------------------------------------------------------------------------------- /dfgraphics.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | ; Randomly decide which graphics pack to use for Dwarf Fortress 4 | 5 | (require "machinery/rng.rkt") 6 | 7 | (provide choose-graphic) 8 | 9 | (define graphics 10 | (list 11 | 'ascii 12 | 'bisasam_20x20_ascii 13 | 'mayday 14 | 'obsidian 15 | 'spacefox 16 | 'taffer 17 | 'tergel 18 | 'wanderlust)) 19 | 20 | (define (choose-graphic) 21 | (define graphic (randomchoice graphics)) 22 | (printf "Use this Dwarf Fortress graphics pack: ~a~n" graphic)) 23 | 24 | ; Semantic satiation for a 100, Alex. 25 | -------------------------------------------------------------------------------- /fitness/coinfast.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | ;; I've been doing a stochastic intermittent fast, based on coinflips. 4 | ;; Each morning, flip a coin. Heads, eat. Tails, fast. 5 | ;; The EV of heads over 7 days is 3.5, same as scheduled ADF. 6 | 7 | (require "../machinery/rng.rkt") 8 | 9 | (provide feast?) 10 | 11 | ;; I want to be able to easily change the meaning, so that say at maintenance 12 | ;heads becomes tdee+15%, etc. 13 | (define rules "Heads feast, tails fast.") 14 | 15 | (define (feast?) 16 | (printf "~a You got: ~a ~n" rules (coinflip))) 17 | 18 | ;; TODO: save to a ring buffer of last 7 days 19 | 20 | -------------------------------------------------------------------------------- /fitness/dicebell.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | ;; I've been determining kettlebell swings by rolling 2d6 and multiplying by 4 | ;10. But, I may as well simplify a bit. Instead, n*d6. 40 gives a minimum of 40 5 | ;swings, an average of 140, and a max of 240. Go up to 50 and the max hits 6 | ;300. 7 | 8 | (require "../machinery/rng.rkt") 9 | 10 | (provide doswings) 11 | 12 | ;; TODO: Make multipler toggle based on day's coinflip 13 | (define multiplier 40) 14 | 15 | (define swings (* multiplier (rolld6))) 16 | 17 | (define (doswings) 18 | (printf "Do ~a swings today~n" swings)) 19 | 20 | ;; TODO: Save to ring buffer of last 7 days. Decouple the dice roll. 21 | -------------------------------------------------------------------------------- /fitness/dicefast.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | ;; Going to switch from coin to 2d6. Rolling a 6- will happen ~41% of the time, 4 | ;; or about 3/7 days. A bit under the EV of a coin. 7-9 will happen about 42% of 5 | ;; the time. 10+ about 16.6% of the time. 6 | 7 | ;; This'd give more range of gradations, and room for using a stat to adjust the 8 | ;; frequency in a single spot (say, start with -1 and over time increase it to 9 | ;; +1). 10 | 11 | (require "../machinery/rng.rkt") 12 | 13 | (provide fast?) 14 | 15 | (define threshold 6) 16 | 17 | (define (fast?) 18 | (if (<= (roll2d6) threshold) 19 | (printf "Fast") 20 | (printf "Eat"))) 21 | -------------------------------------------------------------------------------- /fitness/gripper.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | (require "../machinery/rng.rkt" 4 | "../machinery/skillcheck.rkt" 5 | "../stats.rkt") 6 | 7 | (provide crush) 8 | 9 | ;; Idea: Roll to see whether to do a set of grippers, and which one to do. 10 | ;; Actually, why not generalize this. A script to assign N reps in M activities: 11 | ;pullups, swings, gripper, band pull aparts, etc. 12 | 13 | (define gripper? (skillcheck laziness)) 14 | 15 | (define (reps) 16 | (roll2d6)) 17 | 18 | (define (crush) 19 | (if (equal? #t gripper?) 20 | (printf "Do ~a reps~n" (reps)) 21 | (printf "Relax~n"))) 22 | 23 | (crush) 24 | -------------------------------------------------------------------------------- /fitness/hydrate.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | (require "../machinery/skillcheck.rkt" 4 | "../stats.rkt") 5 | 6 | (provide hydrate) 7 | 8 | (define drink? (skillcheck laziness)) 9 | 10 | (define (hydrate) 11 | (if (equal? #t drink?) 12 | "Guzzle a cupful" 13 | "You're good")) 14 | 15 | (hydrate) 16 | -------------------------------------------------------------------------------- /flipism.md: -------------------------------------------------------------------------------- 1 | I should write a bit about flipism. 2 | 3 | Flipism, the idea that life choices can be outsourced to randomness, is like all 4 | things [the product of a Donald Duck comic](https://en.wikipedia.org/wiki/flipism). 5 | 6 | In the comic, he becomes a fervent flipist after a snake-oil philosopher 7 | convinces him of its merit. Donald gets in a car accident after flipping a coin 8 | to decide whether to hit the gas or the brake, etc. It catastrophically fucks up 9 | his life due to him making absurd decisions at the literal flip of a coin. 10 | 11 | In the decades since, people played around with the idea. Obviously flipping a 12 | coin for *every* decision is absurd. But are there some decisions where you'd be 13 | better off by flipping a coin? Which decisions in fact are benefitted by 14 | outsourcing one's executive functioning to an entropy source? 15 | 16 | Game theorists noted that the introduction of randomness allows for mixed 17 | strategies, ensuring Nash equilibria where previously none could exist. Flipping 18 | a coin could literally turn an unwinnable game into one that could be beaten. 19 | 20 | Psychologists like Daniel Kahneman, noted the cognitive strain caused by even 21 | simple decisions, and how terrible humans are at estimating and calibrating on 22 | probabilities. Outsourcing executive functioning can relieve that cognitive 23 | overhead as well as produce decisions which inherently adhere to actual 24 | probability rather than skewed and biased models. 25 | 26 | So, there are some decisions that do in fact benefit from being outsourced to 27 | randomness. My goal here is to explore pragmatic flipism: which decisions, in 28 | practice, are better done by stochastic decision-making processes? 29 | -------------------------------------------------------------------------------- /games.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | ;; I hate games, and can usually only stand to play about 20 minutes total per 4 | ;year. But Cataclysm and Dwarf Fortress, I can stand and enjoy. 5 | 6 | (require "machinery/rng.rkt") 7 | 8 | (provide playthis) 9 | 10 | (define games 11 | (list 12 | 'cataclysm 13 | 'dwarf-fortress)) 14 | 15 | (define (playthis) 16 | (define game (randomchoice games)) 17 | (printf "Play ~a~n" game)) 18 | 19 | (playthis) 20 | -------------------------------------------------------------------------------- /ideas.md: -------------------------------------------------------------------------------- 1 | In translating my routine I made some small changes. Dice kettlebell now uses 2 | one die and a larger multiplier, etc. I could make it determine time rather than raw swings. 3 | 4 | Hm. Say I set a weekly quota on swings, by number or by time. Each day is 5 | randomly determined up til that quota, at which point the result defaults to 0. 6 | 7 | https://twitter.com/pookleblinky/status/959083637403783168 Spoonsaving 8 | scripts that solve the packing problem by learning the difficulty of 9 | various tasks in the manner of Anki or Mnemosyne spaced repetition 10 | flashcards and then mapping them to a hidden markov state of 11 | general energy levels. Over time tasks get done, without overexerting oneself. 12 | 13 | Idea: add gripper script to determine whether to do a set of gripper crushes. 14 | 15 | Idea: Stochastic distribution of attention. 16 | https://twitter.com/pookleblinky/status/959488083363270657 17 | 18 | Basically: give yourself permission via a diceroll to not feel it necessary to 19 | weigh in on everything at once. On average, others are saying what you want to 20 | say, and over time you will get the chance to join them. Just not today, just 21 | not about everything. Maybe a personal killfile for issues/events that gives you 22 | permission to focus and not feel obligated to be torn apart by competing streams 23 | of dystopia. 24 | 25 | Idea: extract thirst/fuckslevel etc into a literal statsheet that those scripts 26 | look at. Change em all in one spot. Done. Later I'll have to alter savingthrow. 27 | 28 | cleaning.rkt: Should it be a general tasks script, or specifically for cleaning? 29 | 30 | Idea: a CW/TW quarantine. Populate triggers.txt, and it'll process it into 31 | various forms ready to be plopped into browser extensions and such. Pipe it to a 32 | function that'll produce json, and connect it to rotten tomatoes and netflix to 33 | produce a script that'll add warnings on mouse-over for movies. Connect it to 34 | goodreads, and add nice warnings next to titles, etc. 35 | 36 | Should add a file for UI (or lack thereof). 37 | -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | So far: 2 | 3 | Top level: 4 | - bored.rkt Randomly assign something to do 5 | - codescript.rkt Determine coding session 6 | - dfgraphics.rkt Decide which graphics to use on Dwarf Fortress 7 | - flipism.md About flipism 8 | - games.rkt Randomly decide what game to play 9 | - music.rkt Randomly decide the day's music genre 10 | - skills.rkt A literal goddamn skill sheet. 11 | - stats.rkt A literal statsheet using Call of Cthulhu attributes 12 | - status todayscript > status 13 | - tasks.rkt Randomly decide which task to do next 14 | - todayscript.rkt Determine coinfast and kettlebell 15 | 16 | Social 17 | - attention.rkt Randomly choose one issue/event to focus on 18 | - engagetroll.rkt Engage with a troll, or ignore/mute? 19 | 20 | Fitness 21 | - coinfast.rkt Flip coin to determine fast days 22 | - dicebell.rkt Roll dice to determine day's kettlebell swings 23 | - gripper.rkt Roll dice to determine whether to use gripper 24 | - hydrate.rkt Roll dice to determine whether to drink some water 25 | 26 | Coding 27 | - refactor.rkt Roll dice to decide whether to refactor 28 | - 29 | - 30 | 31 | Tasklists 32 | - day-tasks.txt List of bigger, harder tasks 33 | - instant-tasks.txt List of small, easy tasks 34 | -------------------------------------------------------------------------------- /machinery/rng.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | (provide coinflip 4 | rolld6 5 | roll2d6 6 | roll3d6 7 | rolld20 8 | rolld100 9 | randomchoice) 10 | 11 | (define (coinflip) 12 | (if (zero? (random 2)) "HEADS" "TAILS")) 13 | 14 | (define (rolld6) 15 | (random 1 7)) 16 | 17 | (define (roll2d6) 18 | (random 1 13)) 19 | 20 | (define (roll3d6) 21 | (random 1 19)) 22 | 23 | (define (rolld20) 24 | (random 1 21)) 25 | 26 | (define (rolld100) 27 | (random 1 101)) 28 | 29 | (define (randomchoice lst) 30 | (define selection (random (length lst))) 31 | (list-ref lst selection)) 32 | -------------------------------------------------------------------------------- /machinery/skillcheck.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | (require "rng.rkt") 4 | 5 | ;; So, I never played rpg's as a kid, despite devouring the rulebooks and such. 6 | ; My original model of saving throws was wrong. 7 | ; I'm using Call of Cthulhu stats, too, so it was not even wrong. 8 | 9 | ;; Given an attribute or skill, roll a d100. If the result is lower, success. 10 | ;; But, I started off backwards and upside down. 11 | 12 | (provide skillcheck) 13 | 14 | (define (skillcheck numbertobeat) 15 | (define result (rolld100)) 16 | (< result numbertobeat)) 17 | 18 | ; TODO: switch to 2d6+modifier for bell curve and gradations 19 | -------------------------------------------------------------------------------- /music.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | ;; Idea: randomly determine the music of the day 4 | 5 | (require "machinery/rng.rkt") 6 | 7 | (provide listen) 8 | 9 | ;; These are all valid genres. 10 | (define genres 11 | (list 12 | 'MFDOOM 13 | 'OST 14 | 'bebop 15 | 'biggie 16 | 'bluegrass 17 | 'boardsofcanada 18 | 'cake 19 | 'chaos 20 | 'chicagoblues 21 | 'classical 22 | 'darkcabaret 23 | 'deltablues 24 | 'dubstep 25 | 'femalejazzvocals 26 | 'glitchcore 27 | 'gorillaz 28 | 'griot 29 | 'hendrix 30 | 'hiphop 31 | 'indian 32 | 'jazz 33 | 'klezmer 34 | 'metal 35 | 'nightcore 36 | 'nightvale 37 | 'numetal 38 | 'paganini 39 | 'poetry 40 | 'sufi 41 | 'surf 42 | 'theloniousmonk 43 | 'tomwaits 44 | 'vocals 45 | 'witchhouse 46 | 'wutang)) 47 | 48 | (define (listen) 49 | (define genre (randomchoice genres)) 50 | (printf "Today's genre: ~a~n" genre)) 51 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | So I have been doing stochastic intermittent fasting for a while, and recently 2 | started doing stochastic cardio. 3 | 4 | Coinfasting: flip a coin in the morning. Heads eat, tails fast. Over 7 days the 5 | expected value is 3.5, identical to a scheduled ADF. The randomness makes it 6 | easier to calibrate on the right number of calories: you can't just binge 7 | because the next few days may also be heads, and you can't do too much 8 | restriction because the next few days may also be tails. 9 | 10 | Coin cardio: 20 minutes cycling every morning. Heads days, an extra 30 minutes 11 | cycling in the afternoon. 140 minutes baseline, which is the minimum suggested 12 | dose, averages to 245 minutes, maximum 350 minutes. 450 minutes is the maximum 13 | suggested dose of cardio beyond which diminishing returns kick in 14 | (https://well.blogs.nytimes.com/2015/04/15/the-right-dose-of-exercise-for-a-longer-life/). 15 | 16 | Dice Kettlebell: What I had been doing was: roll 2d6, multiply by a number. Do 17 | that many swings. I decided to simplify this a bit by just increasing the 18 | multiplier and rolling one die. 19 | 20 | Basically: I am enjoying the hell out of adding all this randomness to my life. 21 | I want to add more, hence this project. 22 | 23 | I want to automate this stuff and make it easy to extend flipism to other parts 24 | of my life. 25 | 26 | What I've been doing is recording the day's results of the coinflip and dice roll in a 27 | pinned Keep note. Note to self: check if Keep has an API that I can use to send 28 | stuff to from racket. 29 | 30 | I had originally envisioned simple decision scripts, some depending on the 31 | decisions of the last week. Drink some water? How many kettlebell swings should 32 | I do today? etc. For some reason I am now making an RPG. There's a statsheet. 33 | I'm gonna go with the flow and see where it ends up. 34 | 35 | Check out index.md to see what I'm already working on. 36 | 37 | Note: I do not believe in adding UI. I prefer building my own UI on the fly, and 38 | view even the existence of UI as too opinionated for my tastes. Do not expect 39 | user friendliness. 40 | 41 | This work is licensed under a [Creative Commons 42 | Attribution-NonCommercial-ShareAlike 4.0 International 43 | License](http://creativecommons.org/licenses/by-nc-sa/4.0) 44 | -------------------------------------------------------------------------------- /references/cocres10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pookleblinky/lifescripts/eab3fe5aaf2c9f5ee9baaa441cb5d556cd7a3a78/references/cocres10.jpg -------------------------------------------------------------------------------- /social/attention.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | ;;; tiny proof of concept. What I want now is to simply choose, at random, one 4 | ;issue/news event to focus on at a time. 5 | 6 | (require "../machinery/rng.rkt") 7 | 8 | (provide boost-topic) 9 | 10 | ;; Now the hard part: seeding the topics list 11 | (define topics 12 | (list 13 | 'foo 14 | 'bar 15 | 'baz)) 16 | 17 | (define (boost-topic) 18 | (define topic (randomchoice topics)) 19 | (printf "Today's topic to boost: ~a~n" topic)) 20 | 21 | -------------------------------------------------------------------------------- /social/engagetroll.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | ;; Roll a saving throw to determine whether to respond to an argument, and how. 4 | 5 | (require "../machinery/skillcheck.rkt" 6 | "../stats.rkt") 7 | 8 | (provide engage cussout) 9 | 10 | (define parry? (skillcheck hubris)) 11 | 12 | (define cuss? (skillcheck impatience)) 13 | 14 | (define (engage) 15 | (if (equal? #t parry?) "Engage" "Ignore")) 16 | 17 | (define (cussout) 18 | (if (equal? #t (and parry? cuss?)) 19 | "Cuss em out" "Ignore/mute")) 20 | 21 | (cussout) 22 | -------------------------------------------------------------------------------- /stats.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | (provide hubris 4 | impatience 5 | laziness) 6 | 7 | (define hubris 20) 8 | (define impatience 50) 9 | (define laziness 70) 10 | -------------------------------------------------------------------------------- /status: -------------------------------------------------------------------------------- 1 | Heads feast, tails fast. You got: TAILS 2 | Do 120 swings today 3 | Today's genre: dubstep 4 | Today's topic to boost: foo 5 | Use this Dwarf Fortress graphics pack: tergel 6 | Unfuck this thing now: sweep & mop kitchen 7 | -------------------------------------------------------------------------------- /tasklists/day-tasks.txt: -------------------------------------------------------------------------------- 1 | laundry 2 | clean litter boxes 3 | sweep & mop kitchen 4 | -------------------------------------------------------------------------------- /tasklists/instant-tasks.txt: -------------------------------------------------------------------------------- 1 | Organize cables 2 | get keyboard/mouse for rpi 3 | get more ssd/hdd storage for rpi 4 | get power strip 5 | backup rpi sdcard labeled as stable 6 | -------------------------------------------------------------------------------- /tasks.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | ;; tasks.rkt 4 | 5 | ;; 1. Make a list of things to clean that takes a short amount of time. 6 | ;; 2. Randomly choose one to do at intervals. Every hour, every 3, once a day, 7 | ;; etc. 8 | ;; 3. Once that list's crossed off, make another list of tasks that's a bit more 9 | ;; effortful. Rinse and repeat. 10 | ;; Spoon-conserving, flexible, outsources executive functioning. 11 | 12 | ;; For now, just randomly spit out a task with no concern for tracking or 13 | ;; anything. Not even an argv or nice way to add tasks. 14 | 15 | ;; Reads task lists from instant-tasks and day-tasks files. 16 | 17 | (require "machinery/rng.rkt" 18 | "machinery/skillcheck.rkt" 19 | "stats.rkt") 20 | 21 | (provide dotask instant-tasks day-tasks) 22 | 23 | ;; Task files 24 | (define instant-tasks-file "tasklists/instant-tasks.txt") 25 | (define day-tasks-file "tasklists/day-tasks.txt") 26 | 27 | ;; Slurp lines into list 28 | (define instant-tasks (file->lines instant-tasks-file)) 29 | (define day-tasks (file->lines day-tasks-file)) 30 | 31 | ;; Spit out a random task 32 | (define (dotask taskslist) 33 | (define task (randomchoice taskslist)) 34 | (printf "Unfuck this thing now: ~a~n" task)) 35 | -------------------------------------------------------------------------------- /todayscript.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | ;; The various scripts can all end up invoked here. 4 | 5 | (require "dfgraphics.rkt" 6 | "fitness/coinfast.rkt" 7 | "fitness/dicebell.rkt" 8 | "social/attention.rkt" 9 | "music.rkt" 10 | "tasks.rkt") 11 | 12 | (feast?) 13 | (doswings) 14 | (listen) 15 | (boost-topic) 16 | (choose-graphic) 17 | (dotask day-tasks) 18 | -------------------------------------------------------------------------------- /todo.txt: -------------------------------------------------------------------------------- 1 | integrate barbell scheduling to dicebell 2 | let tasks dump into buckets 3 | switch dice to 2d6 with gradations 4 | -------------------------------------------------------------------------------- /userinterface.md: -------------------------------------------------------------------------------- 1 | I don't like adding UI's. I prefer to make my own on the fly, fiddle around with 2 | stuff until it works the way I like. I view UI as an unnecessary, opinionating 3 | addition. 4 | 5 | Here I'll just describe how I'm using stuff. 6 | 7 | I have a fish function called today, it runs todayscript.rkt, and >'s it into 8 | status. Another function called agenda, that cats status to show me the day's 9 | agenda. 10 | 11 | I use tmux. One window is always split into three: a vim, a racket repl, and a 12 | terminal. I prefer loading things into the repl to run them, rather than adding 13 | output to the file to be executed. 14 | 15 | Someone else could do things entirely differently, without being constrained by 16 | my own preferences for UI. 17 | 18 | Basically, don't expect much in the way of user interface except at the most 19 | minimal levels. 20 | --------------------------------------------------------------------------------