session eight | Oblivion

I dropped off more equipment at the castle and took the time and safety afforded by its walls (despite its history) to make use of the many herbs and other ingredients that I had collected thus far. With the alchemical equipment I had just plundered from the small ruin held by Diedre cultists. I prepared not a few potions for myself, and poisons for my arrows.

Wandering about outside for the remainder of the day, I happened upon another nirnroot. Perhaps I will satisfy the Skingrad alchemist after all!

Oblivion

Andi wanted to play Oblivion ever since she heard someone mention it on Loading Ready Run. I've wanted to play it, too; but neither of us wanted to put the isolated time required into finishing such a long, in-depth game. (Especially since I got it on Steam, so it's not something you can just sit down and play in the living room.)

Our solution has been to play together, on the same character. We're taking turns alternating playing and taking notes, and we're posting the results (for better or for worse) here.

webbrowser | Python Batteries

Today’s reverse spelunking through the Python standard library reveals the webbrowser module. As a library, it allows a Python application to interact with the default web browser on the host OS, opening a url in a new browser window or tab. This functionality is exposed at the shell, as well:

$ python -m webbrowser
Usage: /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/webbrowser.py [-n | -t] url
    -n: open new window
    -t: open new tab

You can use the webbrowser module like this to open web pages from any shell or shell script.

$ python -m webbrowser -t http://www.civilfritz.net/

The module does what it can to do the right thing given your environment, and will open a browser on X11, OS X, Windows, and will even open a text–mode browser if no graphical browser is available.

I noticed (on OS X, anyway) that if you don’t specify a protocol (e.g., http) you get an exception.

$ python -m webbrowser -n www.civilfritz.net
0:39: execution error: An error of type -2110 has occurred. (-2110)

The browser still opened successfully, though.

You can find more information on the webbrowser module at the Python website.

Getting things done after Getting Things Done

I first looked into Getting Things Done my first year out of university. Though I suppose having some sense of personal organization and time management would have been nice to have in the seventeen years of study prior, my new state as an employee sent me searching for something more than excuses and a general habit of procrastination.

I'm the kind of person who visits a bookstore just to hang out. (If I ever conquer my own commercialism I'll hopefully transform into a library patron.) It was at one of my many trips to the local Barnes & Noble that I saw a copy of David Allen's book. Though I had heard of the book before, but the simple cover, pleasing proportions, and unassuming title shone through my initial cynicism. I picked up paperback, and made short order.

Getting Things Done, by David Allen

Soon my life was awash in contexts… lists… habits… projects… actions. I had a little paper notebook that contained everything I needed to not have to remember; I had 43 folders in my desk and in my reader, and even more manilla in a box full of files; I had an other box full of "stuff" that kept the stuff out of sight; and I was trying (mostly failing) to have weekly reviews about what I had done, what I was doing, and what I needed to do next.

This actually worked pretty well. I spent less time worrying about forgetting things, because if I needed to remember it, I just wrote it down. I spent less time trying to spin up to productivity because I already had "next actions" for all of my "projects."

I even had an empty email inbox.

…but all of this new headroom gave me the freedom to notice seams between David Allen's proposed system and my own requirements. First was in the sense of contexts: though, in a corporate office, simple things like "@phone" or "@desk" or "@home" effectively partition a task space into appreciable chunks, I work in computers. The vast majority of my tasks are "@computer" or, at the very most, "@Internet." That doesn't do much to calm the mind when you're staring at a long to–do list.

I liked the ubiquity and tactility of paper, but the medium has its faults. Completed tasks clutter up the page, and to clear them you have to transcribe any remaining items to a new page. Reorganizing items into different contexts bring the same problem. There's no way to archive (let alone audit) task history without even more transcription, since tasks for different projects are physically intermingled. Most damningly, separating tasks from the notes that go with them is both a mental and physical context–switch that plagues every non-trivial task.

For its faults, GTD had actually taught me a lot of really good lessons:

  1. The brain is way better at thinking than remembering.

  2. The less you have to remember, the more you can think.

  3. The more you need to think, the less you want to think.

  4. Don't waste time making the same decision twice.

  5. Lists add a sense of progression to otherwise intangible work.

  6. There is too much to do to consider all at once.

All existing GTD software was powerless to placate a sysadmin's sensibilities. It's all point–and–clicky, high–friction, and, worst case, web-based. I did the only thing I could do: I moved all my lists to text files, added one project ("write command-line GTD software" and one action ("brainstorm requirements for GTD software").

That project didn't go so well; but it's ok, because since then I've migrated to Emacs Org-Mode.

The Org–Mode Unicorn

Rather than being a software environment that I had to re–factor my workflow into, Org–Mode provides a rich set of (extensible and seemingly–infinitely–configurable) functions to manipulate my text lists–cum–text–files as I see fit. All of that on top of a mature <strike>text editor</strike>lisp runtime (albeit one with which I had no experience).

First off, I configured Org–Mode with some familiar list item types:

(setq org-todo-keywords
      '((type "ACTION(a!)"            "|" "DONE(d!)")
        (type "PROJECT(p!)"           "|" "DONE(d!)")
        (type "WAITING(w!)"           "|" "DONE(d!)")
        (type "SOMEDAY(s)" "MAYBE(m)" "|")
        (type                         "|" "DELEGATED(g@)" "CANCELLED(x@)")))

…then configured some simple logging:

(setq org-log-into-drawer t)
(setq org-log-reschedule 'note)
(setq org-log-redeadline t)
(setq org-log-done 'time)

Suddenly my lists grew automatic logging in the form of the LOGBOOK drawer:

* PROJECT make a new first post on civilfritz
:LOGBOOK:
- State "PROJECT"    from ""           [2011-08-15 Mon 21:04]
:END:
** DONE figure out the post sorting problem
CLOSED: [2011-08-16 Tue 20:35]
:LOGBOOK:
- State "DONE"       from "PROJECT"    [2011-08-16 Tue 20:35]
- State "PROJECT"    from "ACTION"     [2011-08-16 Tue 08:04]
- State "ACTION"     from ""           [2011-08-15 Mon 22:31]
:END:
** ACTION write about getting things done after getting things done
SCHEDULED: <2011-08-16 Tue>
:LOGBOOK:
- State "ACTION"     from ""           [2011-08-16 Tue 21:09]
:END:

Of course, that's a lot of clutter, too; but that's just what's physically stored in the file. Org–Mode provides a flexible view of the outline. For example:

* PROJECT make a new first post on civilfritz
  :LOGBOOK:...
  * DONE figure out the post sorting problem...
  * ACTION write about getting things done after getting things done
    SCHEDULED: <2011-08-16 Tue>
    :LOGBOOK:...

That's much easier to look at. In Emacs, color is used to make the content even clearer.

As simple as these little bits of text are, the triviality of their automation means that they can be parsed by other parts of Org–Mode. Most notably, by the agenda.

(defun org-find-agenda-files ()
  (find-lisp-find-files "~/agenda" "\.org$"))
(setq org-agenda-files (org-find-agenda-files))
(setq org-agenda-start-on-weekday 6)
(setq org-agenda-skip-scheduled-if-done t)
(setq org-agenda-skip-deadline-if-done t)
(setq org-agenda-custom-commands
      '(("S" "Unscheduled actions" tags-todo "TODO=\"ACTION\"+SCHEDULED=\"\"")
        ("D" "Undefined deadlines" tags-todo "TODO=\"WAITING\"+DEADLINE=\"\"")))
(setq org-stuck-projects
      '("TODO=\"PROJECT\""
        ("ACTION" "WAITING")
        nil
        nil))
Org-Mode agenda view

The agenda serves the same function as the context "next action" lists from GTD; except where contexts are static, the agenda is dynamic, built on-demand and filtered by arbitrary tags (which replace contexts themselves). Further, the "stuck projects," "unscheduled actions," and "undefined deadlines" lists make it easy to find orphaned tasks (now a part of my weekly review).

* ACTION [#A] weekly review                                       :work:home:
  SCHEDULED: <2011-08-20 Sat ++1w>
  :LOGBOOK:...
  :PROPERTIES:...
  - Review stuck projects (C-c a #)
  - Review unscheduled tasks to be done this week. (C-c a S)
  - Review waiting items with no specified deadlines. (C-c a D)
  - Review someday/maybe items. (C-c a t 5 r, C-c a t 6 r)
  - Review the past week's accomplishments. (C-c a a l v w b)
  - Review the upcomming week's actions. (C-c a a v w)

All of the historical logbook data is pulled together in the global logbook view, which I can now inspect separately (again, as part of my weekly review).

Org–Mode logbook view

I use Org–Mode to record virtually everything that I do or need to do, either at work or at home. It really has become my post-GTD, and I have yet to find a requirement that surpasses it. On the contrary, I often find new solutions just as streamlining reveals deeper bottlenecks.

I'll post more of my .emacs and workflow in the future, I'm sure. Until then, feel free to send any questions or comments my way.

session seven | Oblivion

We headed into Bruma with very little incident. Thank the 9. I thought for sure we'd be set upon again by something or other. Nothing has gone particularly smooth up to this point. In Bruma I stopped to sleep a bit and do some errands. I joined the mage's guild and learned of opportunities to join the Arcane University with the proper recommendation. I will have to visit every mage's guild in the country an do various tasks, but it might just be worth it.

I didn't dally long in Bruma as I was eager to drop off Martin and Jaufree. I felt so exposed with them tagging behind me. All of Oblivion would see them dead! The Blades were eager to receive us, and to receive Martin as their new Emperor. Martin himself seemed rather uncomfortable with the situation, but tried his best. I think he will except what has been thrust upon him, but he definitely hasn't had royal upbringing. He gave a simple, albeit awkwardly phrased, speech to the men. I think he will grow into it. I spoke to him after and he hinted at a somewhat dark past, but what is that to me? I carry my own secrets and yet I defend the entire Empire and carry their safety on my shoulders. I do not know if I will complete the task, but there is honor in that.

Jaufree invited me to join the Blades, but I have put him off for now. Maybe another day. For now, I have all the burdens I can handle. I decided to seek out nearby Frostcrag Spire for respite and peace before I move on to my next task. I think I may also try my hand at some alchemy. I stayed at Olav's for the night to rest and seek wisdom on all that has transpired.

The next morning I rode to Frostcrag. My horse is amazingly adept at finding ways up sheer cliffs! He climbs places when I think he should be tumbling straight down to his death! It was terrifying, but a very useful talent to have in a horse. Frostcrag Spire itself was a treasure! It is the perfect place for any mage. I should definitely work to advance my craft! The garden is quite extensive and I have managed to gather a rare root called Nirnroot. I should inquire more about it with alchemists. I warped from Frostcrag spire to the Imperial City. Upon asking their alchemist, I was directed to Skingrad about the Nirnroot. Afterwards, I decided to wander from the city for some adventuring.

I found a small ruin infested with Skeletons and full of Welkynd Stones. The skeletons were easy to kill and the stones very valuable indeed. It was a good find. I wandered from there to another ruin guarded by mages and the same sorts of creatures that the Diedre use. I decided they must be hiding something sinister, and possibly things of value. I think the Sorcerer's themselves were in fact participating in some sort of Diedre worship. The books and items they kept made my skin crawl. I managed to kill a slew of them, all untrustworthy folk and more of those creatures. I found many items of sorcery as I expected and items for potion making. I also wandered across a poor dead treasure hunter. I hoped that it was the sorcerer's I had killed who killed him, and hastened from the cave. I did a little underground swimming, but felt nervous the entire time. Something didn't feel right there.

I left the ruins, relieved to be in daylight, and went on to Skingrad. I inquired about the price of housing, but was turned away. People seem to be protective of their realestate in this town. I inquired about Nirnroot and was asked to collect 9 more samples in order to make an explorer's elixer of sorts. I shall think on it. It may be worth my right. I visited to Mage's guild for recommendation and was given more petty tasks. This recommendation is silly and based on the laziness of the local mages!

I sold many of my goods in town and did my best haggling. I shall have to try to get better yet. I moved on to Battle horn Castle to lighten my load and leave many of the valuables I have found on my journey. It is getting to be too heavy and I need to make room for new finds!

session six | Oblivion

I was almost out of arrows as we entered Kvatch; but there was no time to resupply: it's time to drive out the stragglers! I downed a few potions to recover from my brief delve into Oblivion, while we ran up the hill.

We prevailed against initial forces, besting a few scamps and a daedre. Savlian Matius led us into the chapel to search for survivors; hopefully also the heir.

Amidst the few huddled survivors I found brother Martin. I pulled him aside and tried to explain the situation, but he was noticeably shaken by recent events, and mostly heard a vague indication that the horror that had befallen him and his might be on his account. Before he knew what was happening, I'm sure, I had dragged him behind me, and headed out the door toward Weynon Priory.

Martius stopped me before I left, requesting further aid in retaking Kvatch; but how could I drop this task with Martius at my side? Not when I was so close to putting this whole mess behind me. No: I must head to the Priory.

On the way down the hill, we met a patrolman heading our way. I didn't dare to share with him the real purpose of our journey, but he had already heard of me time spent in Oblivion: how I had close the gate at Kvatch. He stayed with us for a time, and for once, I was glad of the presence of the guard. If only he knew that he may be escorting the future emperor... but no: we cannot risk exposure at this stage.

On the journey, Martin displayed considerable proficiency through a few minor skirmishes with beasts and the like. Nothing too threatening, but it was enough to redeem his display in Kvatch. I suppose the gates of Oblivion opening into your home would disturb most: he should not be judged on that alone.

Ernor met us on the road to Weynon Priory to inform us of an attack that was underway! Though the incumbents appeared as heavily armored soldiers, as they were struck down (as they were wont to do under our force) their armor and weapons vanished, revealing more of the same men that I had fought with the emperor!

We found Jaufree in the chapel, fighting of a band of assassins that had surrounded him. He led us to a safe house where he had stored the amulet of kings; but it had been stolen!

The Priory was no longer safe: we took mounts (I that of the fallen Prior Maborel) and headed to Cloud ruler Temple, where Jaufree hoped Martin might be safe.

session four | Oblivion

I headed toward Battlehorn castle where I assisted in defense from a pack of marauding bandits. For my troubles, I was given ownership of the fortification. How troubled must these people be, that they would turn their livelihood over to me for so small a thing? Of course, ownership comes not as a boon, but as an implied responsibility: now they expect me to restore this heap to its alleged once greatness, all by the weight of my own coin. And for what? To provide a cushy home for men that couldn't even defend themselves in battle?

And to top it all off, my horse rode off (taking my new armor with it) during the fight.

I spent some time examining my acquisition, but nothing changed my first impression. There is a blacksmith here, but he presumes to still charge for his services? Are his rates even any better than those in the market?

Back on foot once again, I headed back to Chorral to unload some of the spoils of the conflict on the market. On the way, I discovered a fallen mage in the road, his horse standing by the presumably fresh kill. He had a tome on him... a spell called "burdening touch" seemed interesting enough... but not much else. Typical enough for a mage, I suppose. The guard at Chorral didn't take too kindly to me riding into town on the mage's horse, though. The way I see it, he didn't need it any longer; but I still find little use arguing with the soldiers: they have their uses, too.

Rumors throughout the town seemed to be centered on this woman named Bruiant. I tracked her down, but her demeanor didn't mesh well with mine. By the end of it, it took some coin for her to quiet down. No matter: I don't see what all the fuss was about.

Twice robbed of my horse, I checked at the stables to see what was available; but all available were far beyond my means. I wonder if they'll take a money pit of a castle in trade?

Back in Weynon Priory, Brother Piner gave me a copy of "The warp in the West" and told me of the close relationship between his order and the Blades. Mundane stuff, really: it's not as though this wasn't already apparent.

By his father's request, I met up with Rallus Odiil to defend their settlement from marauding goblins or some other such monster. Though they fought valiantly, the brothers fell in battle: I alone survived to bring the news of the fight to their father. Valius took the news hard, and left to prepare for his sons' burial.

session five | Oblivion

I have decided to head to Kvatch to continue with my most important quest. I seem to be side tracked very easily. This could not have been illustrated any more clearly to me than in a cave I found on the WAY to Kvatch. The spoils were quite good, but the creatures inside were almost not worth the trouble. I believe the cave is known as the Wind Cave. It was absolutely crawling with Imps! Fearsome little creatures. I got into such a tizzy trying to rid the cave of them that they had me horribly exhausted and bleeding beyond a state I should have let myself get into in such a cave. Clean forgot about my healing potions! Oh well, I made off with some money and jewels and left. I also got some very nice new magical clothing which I believe will come in handy.

I left the cave and scouted across the wilderness trying to work on my potions ingredients store. I thought it would be a quiet trip, but no less than 3 bears pursued me in one afternoon! Not long after, I found a farmer who said the bears had been terrorizing his flock. He offered mea reward to kill at least 3 more and present him with evidence. I did that and more. Stupid things. Even after I'd killed six 2 or 3 more sill managed to find me. If I didn't thin the bear population enough after that, there's no hope because they are magical bears sprouting from the fields like daisies and will soon over run us all. Stupid beasts. The farmer only gave me a book, but I suppose knowledge is power and it wasn't much trouble at that. Blasted beasts were hunting me anyway.

I went on and found all sorts of ruins in the country side. Also, a few alters that gave me a sort of chilled, but good feeling. I stopped and prayed. I don't know if anyone was listening, but I guess it couldn't hurt and any extra aid, even the possibility of it, is appreciated. After a stretch of peace, I happened upon a large ruin of a chapel. It looked to be the sort of place that could hold some real value, so I thought I'd explore it a bit. I found some goblins outside frying fish. People in this part of the country call them "bitter-fish goblins." They smelled it too. I dispatched them without too much trouble and took some small trinkets from their stores. Then I went to explore the building beneath the ruins. Nothing could have convinced me to give up treasure hunting for awhile more effectively than what I found. ZOMBIES! I whole horde! It was awful! I always thought zombies would be hulking and slow, but these were lightening fast and stronger than anything I had encountered before them. I turned around and ran as fast as I could. I shook most of them off, but one followed me! It took forever to kill and hurt me something awful. I will have revenge one day! But for now, I think I shall leave the zombies to adventurers stronger than I.

I continued on to the plateaued city of Kvatch. Just down the main road leading up to the city, I found a man nearly out of his mind in terror! He grabbed me and told me of a terrifying tale of gateways opening into Oblivion. OBLIVION! It gave me shivers just thinking about the possibilities. Apparently there are already those who would stop Martin from reaching the throne. I was hoping it had not been discovered so soon. I ran up the road to find more frightened refugees, and at the top a smoldering window into Oblivion itself! Soldiers were doing everything they could to kill anything coming out, but the troops looked ragged and exhausted. In a moment of insanity I agreed to go into the portal to look for lost soldiers and to close the gate. I don't know what possessed me...

Inside, I found one lone soldier and a pit of hell every bit as bad as anything I'd ever imagined. The soldier agreed to help me as we were set upon by the devilish creatures within. The Daedre themselves were more frightening still! Huge beasts with bows and war hammers. It was a blessing to find out that my cold touch had particular effect on them. I don't know what I would have done otherwise. I spent most of my arrows getting through that nightmare and I feared my magic and sword skills would not be enough. At one point, I faced so many enemies that I jumped from a bridge to a small ledge over a terrifying height jut to get away. It was madness! I should have died! Remarkably, the stupid creatures tried to follow me and fell to the terrifying depths below. It was a miracle. I could never have defeated them all. Unfortunately, I lost the soldier who followed me (who I think also fell) and was unable to lead anyone out. But, I did close the gate. I more heroic feat I have never attempted. I can't believe I did it. I tried to take some of the fearsome weapons and armor I found on the Daedre within, but they were far too heavy. I did however, bring some of their hearts. A gruesome thing, but they must be invaluable in potions. Right?

The soldiers were glad to see my victory and led me to fight any straggling enemies in the city... I don't know how much help I'll be with so few arrows. I'll look to the cold touch again.

bash ‘local’ directive eats status codes

Did you know that the local directive in bash returns a status code? I didn’t.

#!/bin/bash

function return_nonzero
{
    return 1
}

function main
{
    v=$(return_nonzero)
    echo $?

    local v=$(return_nonzero)
    echo $?

    local v
    v=$(return_nonzero)
    echo $?
}

main

At runtime:

$ bash local-return-code.sh
1
0
1

At least some bugs teach you something new.

Numbers 12

Then Miriam and Aaron spoke against Moses because of the Cushite woman whom he had married (for he had married a Cushite woman); and they said, “Has the LORD indeed spoken only through Moses? Has He not spoken through us as well?” And the LORD heard it.

Now the man Moses was very humble, more than any man who was on the face of the earth.

Suddenly the LORD said to Moses and Aaron and to Miriam, “You three come out to the tent of meeting.” So the three of them came out. Then the LORD came down in a pillar of cloud and stood at the doorway of the tent, and He called Aaron and Miriam.

When they had both come forward, He said, “Hear now My words: If there is a prophet among you, I, the LORD, shall make Myself known to him in a vision. I shall speak with him in a dream. Not so, with My servant Moses: he is faithful in all My household; with him I speak mouth to mouth, even openly, and not in dark sayings, and he beholds the form of the LORD. Why then were you not afraid to speak against My servant, against Moses?”