Friday, April 3, 2026

No, It's Not the Journey; It's the Destination

I don't hate vacations. I hate traveling. And the more complex the traveling, the more variables and uncontrollable vectors there are that will come into direct conflict with my plans and expectations, the more I will hate it.

We're not going to ever invent teleportation. That's just not ever going to be a thing. But if I subscribe to the belief that the world stops existing when I'm asleep, the next best thing would be to just knock myself the fuck out for an entire trip. Think the shuttle to Fhloston Paradise in The Fifth Element: you show up, get on the shuttle, get in your little sleep cupboard, and you're put to sleep for the entire trip. Nobody reclining their seat into your lap, no passive-aggressive armrest battles, no chump in the window seat squeezing by you 12 times to go to the bathroom--sounds like the ideal transit to me.

In fact, I'll go one better. Those pods that all the truck rental companies have now where they dump it in your driveway, you fill it up, and then they show up and haul it to wherever you're moving to? Yeah, do that, except with people. The travel company drops off the coffins at your house. (They're going to be called something less death-related, like "Somnus Capsules", but, yeah, everyone's going to call them "coffins".) At the appropriate time, you get in, the coffin gasses you to sleep, the transport picks up you and your family and takes you to the transit craft, you get shipped to your destination, and they wake you up with gentle music, a back rub, and a frozen margarita.

Now, I'm sure there are going to be concerns with human trafficking with this mode of transportation, but let's not throw the baby out with the bathwater. We'll figure out a way to ensure that anyone getting into a Somnus Capsule is doing so of their own free will, and is 100% aware of the location to which they're being transported.

I, for one, would LOVE to go to sleep in a coffin in my driveway, not regaining consciousness until I got to Europe. 

Saturday, January 31, 2026

What Comes After

One common misconception about atheists is that we're all convinced that we know for a fact that there is no god, that there is no heaven and no hell. That's not true.

As an atheist, I believe I have no reason to pretend that I know that there is a god, heaven, hell, or whatever. I also don't think there's any way I can say definitively that there isn't. So, what's left? Belief and hope.

What I believe is that if there is a heaven, it's not nearly as rules-based as humanity's religions pretend it is. If there is someone or something above everything that set things in motion, it's not at all as capricious,  cruel, vindictive, illogical, or even at all as concerned with our thoughts and actions as the typical myths of a god or gods profess.

What I hope, and this probably surprises most people who aren't atheists, is that there is something that comes after all this, and that we will retain memories, emotions, and the ability to recognize and interact with individuals from this plane of existence.

Simply put, I hope I'll get to see my mom again. I hope I get to snuggle the cats who have been an important part of my life but who have passed on. I look forward to these things; I simply have no inclination to act as if they are absolute certainties but only if I act a certain way or say a certain prayer to a certain deity.

Saturday, January 10, 2026

Who's Got Time for Memoirs?

I have no idea why I'm even doing this.

I found an old export I made from my blogging years before I closed my LiveJournal account, and I've been copy/pasting a few entries here. Just because.

I don't think I'm going to end up putting everything here (I wrote a lot of cringe self-pitying posts. Like, a lot a lot.) But every now and then, I may continue adding a handful of old blog posts. It's kind of fun.

Well, maybe not fun, but definitely interesting. To me. Somewhat.

Saturday, April 27, 2024

Overlap, Iowa

Overlap is the largest city in central Iowa right on the border, a rural metropolis and the smallest ghost town in the United States. It is known for its sprawling fields, bustling suburbs, desolate swamps, congested coastlines, abandoned territories, and for absolutely nothing at all.

The reason for its paradoxically muddled description is that Overlap, Iowa is the specific convergence point of all timelines, plot lines, parallel universes, and alternate realities.

There is no continuity in Overlap whatsoever. A particular person might be a sheriff one day and a custodian at a secret government research facility the next. Come next week, they might not even have ever existed.

The population of Overlap are not aware of their unique cosmic positioning. They simply go about their days as they always have, never realizing that their yesterday had no bearing at all on today, while tomorrow is a completely random concept.

Saturday, April 20, 2024

A Dewey Decimal System of My Own

 Since I abandoned the social media platform previously known as, well, as not a single-letter name, I've been using and enjoying Mastodon, a decentralized version of microblogging. In a nutshell, anyone can start a Mastodon server, and there's no corporate overlord making crappy decisions designed to tank its stock value on purpose. Also, there's no stock value.

Mastodon is part of what's been named the Fediverse, which is the umbrella term for all sorts of decentralized versions of popular web sites. Even better, these federated sites are designed to work in concert with each other, which in my opinion is one of the main goals of an altruistic version of what the Internet can be.

Another part of the Fediverse is BookWyrm, a federated version of Goodreads. I used to try to use Goodreads to track my books and my reading, but I fell out of using it for some reason. With an exploration of the Fediverse and my discovery of BookWyrm, I've found myself back in the world of obsessively tracking the books I own, and which ones I've read or not.

I think part of what caused me to drift away from Goodreads was that I felt like I was being too obsessive about tracking everything: what was wrong with just reading and enjoying a good book? Did I have to enter it into a database and categorize it and rate it and review it?

Getting back into tracking my books has made me realize I think I was growing embarrassed about how much I enjoyed sorting and updating my own library. It was weird, right? But now, I don't think I care. At least, I'm trying not to care.

Taking things that are disorganized (or poorly organized) and applying some kind of logical order to them actual gives me joy. I can admit that now. I like tidying up when my office gets overly cluttered. It not only gives me a sense of satisfaction, but I feel I've accomplished something by making it better. In this case, keeping better track of books I've read and books I want to read, and books I own or that I once owned and can't remember if I got rid of them for some reason.

It's kind of a large undertaking, since I possess far too many books (especially now that I've started using my Kindle more and more). But as long as I only do maybe a shelf a night, and only then if I feel like it and not because I have to keep at it until it's done, it's been pretty enjoyable.

And regarding the title of this post: I don't actually have any kind of self-created system for categorizing my books. I just liked the sound of it as the title of a blog entry. Again: possibly showing my weird to the world, but I care less and less about that. And that's good.

Sunday, April 14, 2024

Off.

 I finally get it.

I never really understood why people who were on medication would ever intentionally stop taking them, short of the medication making them feel worse than they did without it.

But what about making them feel less than they did without it?

I've noticed during the past few years that I wasn't crying at movies anymore, even movies that were once guaranteed to make me at least tear up, no matter how many times I'd seen them. I could sense the emotions present in YouTube videos of animals rescued from abusive situations or military personnel surprising their kids by returning from overseas and showing up at some school event. Both of those used to be automatic waterworks triggers but now, nothing.

I missed it. I missed the emotional release of letting tears flow, then gathering myself with a few breaths and moving on.

Wednesday, April 3, 2019

Creating and Updating Jira Issues with PowerShell

In attempting to find a way to programmatically manipulate Jira, I discovered that the information out there on the Internet is somewhat scattered. I couldn't find one central location that gave me everything I needed to move forward. After a period of trial and error, I managed to piece together the disparate parts into a PowerShell solution.

This is my basic function for getting a user's name and password.

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

function IdentifyUser
    {
    # Prompt user for logon credentials.
    $script:MyCredential = Get-Credential -Message "Please enter your network user ID and password:" -UserName $env:UserName
    if ($script:MyCredential)
        {
        $script:attemptConnection = $true
        $script:username = $script:MyCredential.Username
        $script:password = $script:MyCredential.GetNetworkCredential().password
        }
    else
        {
        Write-Host ""
        Write-Host $script:equalsLine
        Write-Host "Logon canceled by user."
        Write-Host $script:equalsLine
        }
    }  #IdentifyUser


This function contains many of the fields associated with a Jira issue. This is where values would be altered for creating or updating a specific case.

function InitializeVariables
    {
    $script:target = "https://[your Jira base URL]"
    $script:projectKey = "[your Jira project key]";

#===================================
#   Available variables/Jira fields
#-----------------------------------

    $script:createOrUpdate = "update"
    $script:issueKey = "$script:projectKey-1" # this is ignored if creating an issue

    $script:acceptanceCriteria = "If you build it, they will come."
    $script:assignee = "[a Jira user name]"
    $script:description = "This issue was created from PowerShell using Jira REST API."
    $script:dueDate = "2020-01-01"
    $script:issueType = "Task"
    $script:label_1 = "Development"
    $script:label_2 = "Request"
    $script:priority = "Lowest"
    $script:summary = "Jira workflow examination"

#===================================

    $script:attemptConnection = $false
    $script:equalsLine = "=" * 130

    if ($script:createOrUpdate.ToLower() -eq "create")
        {
        $script:method = "POST"
        $script:requestUri = "$script:target/jira/rest/api/latest/issue"
        }
    elseif ($script:createOrUpdate.ToLower() -eq "update")
        {
        $script:method = "PUT"
        $script:requestUri = "$script:target/jira/rest/api/latest/issue/$script:issueKey"
        }
    else
        {
        $script:method = "[ error ]"
        $script:requestUri = "[ error ]"
        }
    }  #InitializeVariables


Here I create the JSON structure containing the field values and submit it to my Jira instance. The REST method invoked is POST for creating an issue, and PUT for updating one (this has been established in the InitializeVariables function.).

function PerformOperation
    {
    if ($script:attemptConnection)
        {
        $bodyString = @{
            update = @{
            }

            fields=@{

            project=@{key="$script:projectKey"} # can be omitted when updating an issue; or it can just "change" it to the value it already has

            #assignee = @{name = "$script:assignee"}
            description = "$script:description"
            duedate = "$script:dueDate"
            issuetype = @{name = "$script:issueType"}
            labels =  [string[]]"$script:label_1"
            priority = @{name = "$script:priority"}
            summary = "$script:summary"
            
            # comment out a line to omit it from item creation/update

            }}

        $bodyJSON = $bodyString | ConvertTo-Json -Depth 2 #-Compress

        try {
            $basicAuth = "Basic " + [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes("$($script:Username):$script:password"))
            $headers = @{
                "Authorization" = $basicAuth
                "Content-Type"="application/json"
                }

            $response = Invoke-RestMethod -Uri $script:requestUri -Method $script:method -Headers $headers -Body $bodyJSON -UseBasicParsing

            if ($script:createOrUpdate.ToLower() -eq "create")
                {
                Write-Output "ID: $($response.id)"
                Write-Output "Key: $($response.key)"
                Write-Output "Self: $($response.self)"    
                }
            }
        catch {
            Write-Warning "Remote Server Response: $($_.Exception.Message)"
            Write-Output "Status Code: $($_.Exception.Response.StatusCode)"
            }
        }
    }  #PerformOperation


All that's left is to call these functions in sequence.

InitializeVariables
IdentifyUser
PerformOperation

Thursday, February 21, 2019

Discovering Active Directory groups with PowerShell

I wrote a PowerShell program that reads in a comma-separated list of user names, looks them up in the Windows Active Directory, and then outputs a comma-separated file listing each user's groups, with one group per line.

In most programs I write, you'll probably find an InitializeVariables function. While some variables sometimes need to be set at the top of the program, this function will usually hold the majority of my variables' starting values.


function InitializeVariables
    {
    $script:input_file = ""
    $script:output_file = ""
    $script:not_found_file = ""

    # Set the input + output files, depending on the presence of invocation parameters.
    if (-not $script:in)
        {
        $script:input_file = $script:default_input_file
        }
    else
        {
        $script:input_file = $script:in
        }

    if (-not $script:out)
        {
        $script:output_file = $script:default_output_file
        }
    else
        {
        $script:output_file = $script:out
        }

    if (-not $script:lost)
        {
        $script:not_found_file = $script:default_not_found_file
        }
    else
        {
        $script:not_found_file = $script:lost
        }
    }  #InitializeVariables

In the interest of flexibility, I give the user the option of overwriting the output of previous runs or retaining them with a timestamp.


function CleanOutputFiles
    {
    # Remove existing output files, first preserving them if instructed.

    $overwrite_time = Get-Date -Format "yyyyMMdd-HHmmss"

    if ($script:preserve_previous_output -and (Test-Path -LiteralPath $script:output_file))
        {
        $old_output_file = $script:output_file.Replace(".csv", "-$overwrite_time.csv")
        Rename-Item $script:output_file $old_output_file
        }
    elseif (Test-Path -LiteralPath $script:output_file)
        {
        Remove-Item $script:output_file
        }

    if ($script:preserve_previous_output -and (Test-Path -LiteralPath $script:not_found_file))
        {
        $old_not_found_file = $script:not_found_file.Replace(".txt", "-$overwrite_time.txt")
        Rename-Item $script:not_found_file $old_not_found_file
        }
    elseif (Test-Path -LiteralPath $script:not_found_file)
        {
        Remove-Item $script:not_found_file
        }
    }  #CleanOutputFiles

A fairly standard reading of the input file.


function ReadUserList
    {
    $script:user_list = Get-Content $script:input_file
    if (-not $script:suppress_screen_output)
        {
        Write-Host ""
        Write-Host "user_list is" $script:user_list.count "lines long."
        }
    }  #ReadUserList

This is the meat of the program. The users are stored internally in a multidimensional arraylist--an arraylist whose members are arraylists--as a method of keeping users together with their groups, even if at some point in the future I add sorting functionality.


function CreateUserGroupList
    {
    # Create the main/outer arraylist that will hold user arraylists.
    $script:user_group_list = New-Object System.Collections.ArrayList

    forEach ($user in $script:user_list)
        {
        # Create an arraylist for each user.
        $single_user = New-Object System.Collections.ArrayList

        # The first element in a user's arraylist is the user's name.
        [void]$single_user.Add("$user")

        # Add the user's arraylist as an element of the main arraylist.
        [void]$script:user_group_list.Add($single_user)
        }

    if ($script:strip_header_from_input)
        {
        [void]$script:user_group_list.Remove($script:user_group_list[0])
        }

    if (-not $script:suppress_screen_output)
        {
        Write-Host "user_group_list is" $script:user_group_list.Count "items long" -NoNewline

        if ($script:strip_header_from_input)
            {
            Write-Host " (the header line has been stripped)."
            Write-Host ""
            }
        else
            {
            Write-Host "."
            Write-Host ""
            }
        }

    for($loopCounter = 0; $loopCounter -lt $script:user_group_list.Count; $loopCounter++)
        {
        try
            {
            $AD_entry = (New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($script:user_group_list[$loopCounter][0])))")).FindOne().GetDirectoryEntry().memberOf

            forEach ($line in $AD_entry)
                {
                # Extract the Common Name from each line, which is structured as:
                #   CN=[Common Name],OU=[Organizational Unit],OU=[Organizational Unit],DC=[Domain Component],[Domain Component],[Domain Component]
                [void]$script:user_group_list[$loopCounter].Add($line.Substring(3, $line.IndexOf(",") - 3))
                }

            if (-not $script:suppress_screen_output)
                {
                $user_number = $loopCounter + 1
                $user_name = $script:user_group_list[$loopCounter][0]
                $group_count = $script:user_group_list[$loopCounter].Count - 1

                $output_line = "${user_number}: $user_name, $group_count groups."
                Write-Host $output_line
                Write-Host ""
                }
            }  #try

        catch [System.Management.Automation.RuntimeException]
            {
            # The user was not found in the Active Directory search.

            if (-not $script:suppress_screen_output)
                {
                $user_number = $loopCounter + 1
                $user_name = $script:user_group_list[$loopCounter][0]

                $output_line = "${user_number}: $user_name was not found."
                Write-Host $output_line
                Write-Host ""
                }

            Write-Output $script:user_group_list[$loopCounter][0] >> $script:not_found_file
            }  #catch
        }  #loopCounter
    }  #CreateUserGroupList

Constructing the output file. In this case, the specs required that each line start with a user name, followed by one user group name.


function WriteOutputFile
    {
    if (-not $script:suppress_screen_output)
        {
        Write-Host ""
        Write-Host "Writing output file..."
        Write-Host ""
        }

    forEach($user_group in $script:user_group_list)
        {
        for($loopCounter = 1; $loopCounter -lt $user_group.Count; $loopCounter++)
            {
            # Each line in the output file will be formatted as:
            #   [user name], [one user group]
            $output_line = $user_group[0] + "," + $user_group[$loopCounter]
            Write-Output $output_line >> $script:output_file
            }
        }
    }  #WriteOutputFile

Here is the structure of the remainder of the program, beginning with (optional) parameters and concluding with the trail of function calls that do the actual work of the program


param (
    [string]$in,
    [string]$out,
    [string]$lost
)

#********************************************************************************
#
# This program can be invoked with or without file name parameters:
#
# powershell -File AD_user_groups.ps1
# powershell -File AD_user_groups.ps1 myinput.csv myoutput.csv not_found.txt
# powershell -File AD_user_groups.ps1 -in myinput.csv -out myoutput.csv -lost not_found.txt
# powershell -File AD_user_groups.ps1 -in myinput.csv
# powershell -File AD_user_groups.ps1 -out myoutput.csv
# powershell -File AD_user_groups.ps1 -lost not_found.txt
#
# A default file will be used if a file name is not specified.
#
#********************************************************************************

# Set to $true to rename previous output files before overwriting them.
$script:preserve_previous_output = $true

# Set to $true if the input file contains a header row.
$script:strip_header_from_input = $true

# Set to $false to see program progress on the screen.
$script:suppress_screen_output = $true

# These are the file names that will be used if file names are not provided as program parameters.
$script:default_input_file = "$PSScriptRoot\users.csv"
$script:default_output_file = "$PSScriptRoot\user_groups.csv"
$script:default_not_found_file = "$PSScriptRoot\users_not_found.txt"

#********************************************************************************


# Function definitions appear here.


#********************************************************************************


InitializeVariables
CleanOutputFiles
ReadUserList
CreateUserGroupList
WriteOutputFile

Wednesday, January 9, 2019

Ctrl+X, Ctrl+V

This project is noteworthy to me because of how little intention was involved. I have long been frustrated by a lack of time, energy, and drive to create new art. I often think I've built it up so much that I needed whatever I make next to be PHENOMENAL and noteworthy and laden with meaning. This has created a sort of creativity paralysis, where I was unsure where to start. Forget the fear of a blank page or blank canvas, I couldn't even break out a sketchbook.

However, this past weekend brought a bit of unfocused inspiration. I couldn't say why, but the idea of making a collage crossed my mind. It has been forever since I did anything like this, but it seemed a very low pressure piece to do.

So Saturday I went to Michaels (no relation) arts and crafts store to buy our old friend Mod Podge. I picked up the classic jar along with one that provided an antique (read: yellowing/browning) effect. It was very relaxing to snip out pictures and words from a newspaper and arrange them not-quite-haphazardly on a large piece of paper.

Sunday I decided I wanted even more material, so I went to a convenience store to pick up a few more newspapers. I didn't have any specific subject matter in mind, so as long as they had a variety of types of photos, graphics, and headlines, I was satisfied.


Honestly, I still don't know where I'm going with this, but it sure is fun--and relaxing! It's interesting to give a certain amount of thought to the position and orientation of snippets and then randomly slap something on top of it later, obscuring it anyway.

I'm toying with the idea of making this the groundwork of some drawing or painting, using the collage as more of a visually textured paper upon which I draw something else. That may take some trial and error, because I didn't give any thought to the option of drawing on top of it, so I'm not certain what I can use that won't be hampered by the glossy coatings of Mod Podge.

Saturday, December 29, 2018

Sleeping Single in a Single Bed

I am aging. I'm not yet falling apart, but the flaws in my construction are becoming more and more pronounced. Most recently, I am in an ongoing battle with sleep. I fall asleep after reading only a few pages of my book, but then I wake up a few hours later. I stay awake for at least two hours (which often extends to three or four.) This, of course, means that once I finally manage to fall back asleep, I am in no way ready to wake up when I'm "supposed to."

I'm not (completely) ignorant of factors contributing to this chronic restlessness. Diet, caffeine intake, exercise: these are all areas in which I need to make drastic improvements. But if I'm being meticulous in my examination of potential factors, I must include environment.

Am I at that point where I consider having my own bedroom? Looked at logically, it simply doesn't make sense to assume that two people will continue to have the exact same sleep cycles and routines as one another, or even retain complementary habits, for decades.

Every time I wake up and leave the room, I feel like I'm waking up my wife. And I don't want to wake her up again by coming back to bed hours later, so I end up sleeping on the couch or spare bed anyway.

Add in blanket preference, room temperature, music, lights out time, and--let's face it: snoring, it makes complete sense that Grammie and Poppa had separate bedrooms. Maybe if I bit the bullet and did that, I wouldn't have insomnia to the degree that I've experienced for quite some time.

One of the more dangerous aspects of this sleeplessness is that the products in some of these late-night commercials are starting to sound pretty good...

Wednesday, March 25, 2015

"Magic is a drug. Careful how you use it."

You can't judge a book by its cover--granted. However, a really great cover did entice me to pick up Dirty Magic from the shelf of my local bookstore. Once I read the back of the book and flipped through a few random pages to get a sense of the writing style, I knew I'd be taking the book home with me. After reading a few chapters, I knew I'd be picking up the rest of the series (however long it went) and also adding the author's name to my list of "always keep on the radar; buy anything written by".



Jaye Wells has created a world (continued in Cursed Moon and Deadly Spells) with a tremendous amount of depth and a wealth of enticing characters. Magic exists, but unfortunately can be as addictive and detrimental as drugs. The lead character is Kate Prospero, a magic adept and police officer. As the trilogy is named "Prospero's War", you know you'll be delving into her life for at least the duration of the series, and you won't be disappointed. However, even the supporting characters are so well fleshed out that it's difficult to think of them as "supporting". I wanted to learn so much more about Kate's colleagues, and I think there's at least a novel's worth of exploration for each and every character Wells devised. And that's only if the author gets bored of the world of Babylon, Ohio. She could do a series featuring any one of the members of the Magical Enforcement Agency task force and I'd be all in, each and every time!



Both the author and the main character are women. The only reason this is noteworthy is because it appears that women are still given short shrift in the world of fantasy/science fiction literature, even after so many strong female characters and so many incredibly talented female authors.It is my hope that the works created by brilliant authors such as Jaye Wells help to dissolve this issue once and for all. Personally, I didn't consider NOT purchasing Dirty Magic because of the gender of the author nor of the hero. It was an intriguing premise set in a fascinating world--that's why I bought it. I have no reservations about recommending these novels to anyone interested in supernatural fiction, urban fantasy, or crime stories, simply because the writing is "too feminine"--whatever that might mean. It is flat out a great series written by an incredible author.


I don't pre-order many books these days, simply because the "to be read" stack on my bookshelf has grown so large that it is now spawning little offspring stacks. But in this case, I bought Cursed Moon and pre-ordered Deadly Spells at the same time, because I knew I'd be anxious to read the third installment ASAP after finishing the second. Jaye published the novella Fire Water between books two and three as an e-book. I purchased that one as well; it was a nice diversion while waiting for the third book's release date (but it made the wait for a longer adventure that much more difficult!)


I'm now making my way through some of the author's other series, and what I've read so far is as engrossing as this one. However, "Prospero's War" will always be the series that introduced Jaye Wells to my bookshelves, and so I'll always feel a special affinity for the gritty world of Babylon, Ohio.

Monday, April 21, 2014

The Discard Pile

Perhaps I'm becoming something of a wastrel in my old age, but I think I'm pretty much done saving things just in case they might one day come in handy.

If I use three inches of black electrical tape per year, I think I'd rather go out and buy a new roll of tape, use the required amount, and throw away the rest of the roll. Then the next time I need black electrical tape, I know my first step is to go out and buy some black electrical tape.

In terms of the amount of time spent looking for the tape each year and the ratio of "stuff we have that goes years without being used" to "amount of space we have in our house", I think I'll still come out far ahead.

Sunday, June 16, 2013

Taking a Stand

A few months ago, I decided to try a standing workstation at my job. I'm a computer programmer; I know I slump and slouch throughout the day. I also know that's not the healthiest position for me.

Because I don't currently have a medical problem with my back, my employer won't provide me with one of those nifty electric adjustable desks that go from sitting height to standing height with the press of a button. (HR gets them regardless of physical condition, but that's a rant for another entry. Possibly.)

I decided it was important enough to me to consider paying for a standing workstation out of my own wallet. I poked around on-line and found a few candidates, but those started at around $400 and went up from there. I might even have considered that kind of investment, but none of the stores around me had anything like those models for me to examine, and I certainly wasn't going to mail-order something that pricey without physically seeing it first. Your loss, Staples and Office Depot.

So one day during my lunch hour I went to Menard's to see if there was some kind of bookshelf or other shelving unit I could easily adapt to my purposes. Nothing I saw there really struck a chord with me, so I headed for the exit. I was about to consider the entire idea a wash until I saw some stackable shelving crates on an endcap near the front of the store.

They're called "Stackübes" (I'm pretty sure they threw an umlaut over the U to make one think of Ikea), and they're fairly basic: a plain, white wooden box, open on the top with handles in two sides. Turn it on its side, and it's a component that can be added to other Stackübes for an entire shelving unit. I spent a few minutes trying both the small and the large boxes on their sides and upside down, and thought they were close enough to what I was looking for that I bought two large boxes and a small one.

Back at work, I put the boxes together and put my two monitors on the large ones, turned upright. Because the monitors are adjustable within a range of a few inches, I was able to get them to just the correct height for my eye level. I put the keyboard on the overturned small box; it was close, but not quite to where I could hold my arms at the ergonomically correct position.

I pulled down one monitor and tried the keyboard on the large box. Put on its side, the box positioned the keyboard pretty much exactly where it needed to be. So that same day after work, I went back to Menard's to buy one more of both the large and the small Stackübes.

It even adds storage space
The next day, I finished my desktop by adding the new large box for the keyboard, turning the small box on its end for the mouse (it matches the height of the large box in that position), and using the new small box (also on its end) for my phone. Strictly speaking, I'm not on the phone nearly enough to really need the phone elevated like everything else, but I felt it completed the setup.

I've been standing with my computer like this for about 3 months, now. The adjustment took only a couple of weeks. I brought in a stool so I could lean/sit for a bit when my legs got tired, but I've pretty much stopped using the stool at all.

The only problem that persisted after those first few weeks was that my feet were a little sore by the end of the day. Not having to consider shoes for being on my feet all day since my stint at Best Buy, my shoes weren't the kindest to me in that respect. A co-worker who also assembled her own version of a standing desk mentioned that she had a simple mat on the floor, and that helped her a lot. Since our floor is a thin institutional carpet on concrete or something just as unforgiving, I thought that was a good idea.

Memory Foam bath mat on top
I went to Bed, Bath, and Beyond to see what they could offer me, and I selected a bath mat with Memory Foam. It seemed pretty soft, so I gave it a try. After a few days of realizing that it was good but not great, I returned to Bed, Bath, and Beyond for an upgrade.

My next purchase was a GelPro chef's mat. This was more expensive, but I was all in at this point. It's a nice, thick, cushiony mat that has some give to it, but it still keeps a layer of gel between my feet and the floor.

GelPro chef's mat underneath
I considered using only the chef's mat, but since I already had the bath mat at work, I wondered what they would be like together. It actually works really well. The texture of the chef's mat along with the bottom of the bath mat keeps them from sliding against each other at all. Together, I get the softness of the bath mat with the cushioning of the gel mat.

I do take my shoes off when standing on my floor mats. The gel mat says it can resist breaking even when shoes are worn, although it does advise against wearing high heels on it. (Probably good advice for me in any situation.) But slipping off my shoes makes the mats that much more comfortable, and I don't have to worry about cleaning the bath mat as often. That is, unless my co-workers continue to not observe cubicle etiquette and tramp all over my rugs even when I'm standing there in sock feet. How rude!

So now I have my own standing workstation, and it's pretty much exactly what I want. It's comfortable to stand and do my work for the entire day, and I feel like I'm being a little more friendly to my own back. Unfortunately, I don't have the easy option of sitting down that those with the adjustable desks do. I have worked out that if I absolutely have to sit down and even the stool doesn't cut it, I only need to pull down one monitor and my keyboard/mouse. So I won't have to rearrange my entire desktop if I need some chair time.


Of course, nothing can stay perfect for long. Shortly after putting the finishing touches on my arrangement, my department was informed that it was time for our cubicles to be rearranged and condensed (translated: shrunk from 8x9 to 6x9 sq. ft.) so we would be moving into a temporary space, one cubicle row at a time.

This past Thursday was my move-out day. I considered storing my crates in my car for the week, but then I decided that I wouldn't allow them to shake up my new standing regimen.

Temporarily in cramped quarters
Even though we were supposed to let a PC Tech move our computers, I moved all of my own stuff the night before. It's simply easier to set up the computer at the same time as the crates, rather than letting them move the computer first and then try to work the crates in under everything.

My temporary desk is more shallow than my previous one, so it took a half-hour of tweaking the setup. I eventually got everything to fit--well enough, at least, for my week's stay. When I move back to my smartsized cubicle I'll still have the same desktop area I had before, minus one section, and I've already determined my original arrangement will fit there just fine. (I honestly think one thing they're counting on is that a week exiled to the "study carrels" will make us pine for the smaller cubicles.)

Some co-workers have asked how much I spent on this or that item, and they usually seem a bit shocked when I tell them. I haven't added up the total for anyone here for fear of completely blowing their minds:

Stackubes (large): 3 @ $19.99
Stackubes (small): 2 @ $14.99
Memory Foam bath mat:  $24.99
GelPro chef's mat:     $69.99
Total with tax:       $196.93

Now don't get me wrong: I would love to not have had to spend that two hundred dollars. I can find many more enjoyable ways to spend $200, even if it's only to give it to the credit card company to cover some other purchase I've already made. But I don't want to wait for my company to decide they can finally afford to give everybody the adjustable desks we were promised. And I'm at my desk for 7-8 hours a day, 40 hours a week; I don't want to cheap out on my own physical well-being. I consider that $200 well-spent.

Tuesday, May 1, 2012

Superhero No More

April 30, 2012. I'd never thought I'd be able to specifically pinpoint the (hopefully distant) future point at which I ceased to be everything in my little girl's eyes. But today, I broke something.

Don't get me wrong--I know she still loves me, and I also know that she knows I love her with all my heart. But I managed to disappoint her in a way I have thus far been able to avoid.

Her 2nd grade class is going to a local park/nature preserve tomorrow. Each 2nd grade class goes twice: once in the fall and again in the spring. A couple of years ago, Alex missed the fall trip due to illness but when his class went to the park in the spring, I was able to chaperone. This past fall, I went along with Cassie's class. I planned all along to skip the spring trip, since now I've made one trip with each child. For me, the day at the park gets really long, and to be honest, I'm not at my best with a group of kids; I just don't have that kind of innate patience. I thought Cassie had known I wasn't going all along. At least, I thought that when I said I'd join her class on their last two visits to the senior home this year, that I also mentioned that I wasn't signing up for the upcoming park trip.

At dinner tonight, she made some comment like, "Don't forget tomorrow!" I had a sneaking suspicion what she meant, so I asked, "What about tomorrow?" "It's the trip to the park, silly!" I asked, "Who's going to the park?" with a sense of dread. I knew where she was going with this. "You and me, Daddy."

I started to explain, "I thought you knew I wasn't going on this trip, sweetie." She looked at me with a smile and said, "Are you joking again?" To be fair, I joke with my kids a lot; they've learned to be skeptical.

"No, I'm really not," I started, trying to think what I could say to ease the blow. As she looked at me, I could see the tears welling up in her eyes. I asked if I made her sad, and she looked away and said into her sandwich, "A little." She was trying to be brave and hide how it made her feel, but the way her voice broke simply killed me.

I've made her cry before, usually for getting upset at the way she and her brother sometimes fight, or for some mess or other that she was responsible for. But the disappointment I instilled upon her tonight crushed me to an extent that losing my cool in front of the kids hasn't before.

I think today was the day I made her grow up a little and start to realize that I'm just a regular person.

Friday, March 23, 2012

Daddy/Daughter Photo

I finally took a few minutes to scan the photo Cassandra and I had taken at the Sweetheart Dance in February. Cassandra is always much more lively in her candid photos, but she still looks lovely here--if a little too grown-up too soon for Daddy!


And I have to admit that this is one of the best pictures of me in a long time. Yep, that's as good as it gets, folks.

Tuesday, February 28, 2012

I Finally Bought Some Big Boy Clothes

The local Girl Scout Council was holding a Sweetheart Dance, also known as a Daddy/Daughter Dance. Cassandra wanted to go this year, so I talked myself into it.

The poster said "semi-formal", which is pretty-close-but-not-quite-the-exact opposite of how I dress now. I have a few pairs of black pants, a couple of button-down shirts (I wouldn't even call them "dress shirts"), a drawer full of sweaters that are slightly younger than my children, and a Santa Claus tie. I forgot that I also had a lone suit in my closet that had gone neglected for so long it was practically a blind spot in there, but it's just as well that I had--when I tried it on later, my waistline said, "Yeah, forget about it."

I decided I needed to buy some new clothes for the event. This was momentous because I am not a good clothes shopper. I usually get frustrated and angerbuy a few shirts on my way out of the store, and then I don't venture out clothes shopping again for at least 6 months.

I was thinking of getting an entire suit, or at least a blazer. I wasn't sure what would be worse: if I were left to my own devices, or if I went somewhere with salespeople to help dress me. I ended up at Kohl's, for no reason other than it seemed as good a place as any to start.

I spent probably an hour trying on various coats and suits, slacks and a few shirts. I surprised myself with how much I ended up getting, but in the back of my head I was thinking, "If I bring home a few choices, maybe at least one will end up looking presentable." I had a pretty good haul for just under $500: 3 suit coats/sports jackets, 3 pairs of pants, 3 dress shirt/tie combos (a godsend for someone like me who would panic at having to select both a shirt AND the tie to go with it), a pair of dress shoes, a few undershirts, and a wool coat. I figured at 41, I should stop being okay with the winter-jacket-over-suit-coat look that seemed fairly reasonable when I was 25.

$500 seems to me like a large amount of clothes to purchase at one time, even though I know real, actual grown-ups might not even blink at that. And, hey--if I believe the Kohl's propaganda they print on their receipt, I SAVED $900! I'm a little bummed they didn't make me feel really good about my purchase by arbitrarily making the "original" price 2 or 3 times higher, so I could have saved even more.

So now I have a few more outfits in my closet that will help me not dress like an eternal twentysomething. I just have to remember to take them out and put them on once in a while.

Tuesday, January 24, 2012

Build-A-Bribe


"Are you here today for a birthday or special occasion?" asked the cheerful Build-A-Bear employee as she led us to the giant blowy stuffing machine.

Bribery.

Cassandra has had a slight eye turn problem for the past couple of years. It's not at all noticeable just by looking at her. We only see it when we bring a pencil slowly towards her nose, the way someone learns to cross their eyes. At a certain point close to her nose, one or both eyes give up and shoot in the opposite direction. This could be a horrible hindrance to her future, severely limiting her opportunities in the pencil-staring industry.

Actually, it could cause problems with her reading ability, if gone unchecked. Something to do with her eyes converging on the page. So we have her in vision therapy, doing eye exercises on the computer. It was supposed to be weekly, and now we're back to four times a week. With homework, dance, gymnastics, and play dates there's never a good time to do these exercises. Therefore, it has become quite a struggle to get her to put much effort into them at all. (I have to admit that it's my wife bearing the lion's share of this burden.)

In an effort to keep Cassandra interested, we've turned to the tried-and-true parenting technique of bribery. She'd been asking for another trip to Build-A-Bear Workshop for a while, and I wondered if letting her pick out six or seven outfits along with a new friend would give her weekly incentives to do her eye exercises without complaining. A few weekends ago, we went and picked out a koala Cassandra had seen in the catalogue and accessorized with a box full of outfits. KiKi (inexplicably pronounced "kay-kay") was the reward for that first week of exercises, and she has since earned KiKi's glasses.

We weren't sure what to do about Alex. If he got a bear not as a reward but just as a gift, would that diminish Cassandra's incentive? If he didn't get one, would it be punishing him for not having to do eye exercises? We really didn't have any comparable task or behavior-change for him to achieve. I was also wondering, would he even want one--is he too old for this now? (I don't think so, but then I was the guy with stuffed Chip 'N Dale dolls in my college dorm room.)

Things actually worked out about as well as we could have hoped. Alex was interested in getting a new friend and a single outfit, and Cassandra didn't say anything about it being unfair that he got a bear without having to "earn" it. Alex doesn't play with Donou (the bear comes with a doughnut, as well as sprinkles on his ears and nose) as much as Cassandra plays with her animals, but he still likes having him around.

My children are growing up quickly, but in this era where it seems everything is pushing them to mature more quickly than ever, it's nice to see that there's still "kid" in them, yet.


And this was way cheaper than American Girl would've been.


Wednesday, January 18, 2012

The Lunch Date and the Nearly Broken Promise


Two weeks ago, I used my lunch hour to drop off a too-large-for-the-bus art project at school and stayed to have lunch with Cassandra in the school cafeteria. I asked Alex what day in the next week he'd like me to have lunch with him, and we decided on Friday.

Last Friday, I was running errands over the lunch hour with absolutely no memory of making that lunch date until it hit me out of the blue. Unfortunately, I don't have a brain that alerts me before I'm going to miss something. No, my brain alarm goes off when "HOLY CRAP YOU'RE SUPPOSED TO BE SOMEWHERE ELSE RIGHT NOW". That's useful.

Sometimes that alarm means a mad dash (and questionable driving etiquette) to get somewhere only fifteen or twenty minutes late. In this case, though, that wasn't an option. The kids get only about half an hour to eat lunch before they're ushered outside, and I was across town. I probably wouldn't have even made it to the lunchroom before Alex went outside.

So I spent the rest of my afternoon feeling pathetic, and apologized to Alex when I got home that night. I had considered stopping at Subway to take home the cookie he was looking forward to sharing with me at lunch, but I knew that Friday dinners are usually eaten at restaurants with ice cream or shakes as dessert. It turned out just as well that I decided not to, since he had a special presentation in one of his classes that included a couple of snacks for the kids attending.

This Tuesday, I asked Alex which day I should come to lunch, and he said Wednesday. Part of me wondered if that was so that if I screwed up again, I'd have two more opportunities to try again.

I made a note on my Google calendar, put a Post-It note in my bag with my wallet and keys, and wrote a reminder on my cubicle white board. I couldn't blow this again.

Today when I got to school with my standard lunch-date bag of Subway, I waited for Alex's class to come downstairs for lunch. I had made sure to ask him this morning which set of stairs they use, and I wanted to be there plenty early so I wouldn't have to try to find him in the crowded cafeteria. Especially these days, when individual kids are obscured in a blurry sea of winter coats and hats.

Alex was second in line when his class came downstairs, and he was rubbing his eye. As I said hi and fell in step beside him, he leaned his head into my side in a way I understood to mean he was a little upset about something. I imagined it was something that hadn't gone his way this morning, or some interaction with a classmate had upset him. He wasn't crying, but I could tell something was bothering him enough to make him hold back the tears. I planned to ask him if he felt like talking about it as soon as we sat down, or if he wanted to wait until tonight so it wouldn't be in front of his classmates.

As we found our table, he told me what was bothering him: "I thought you weren't coming again." I felt like I been punched in the stomach; I had no idea that I was what he had been sad about.

Because I hadn't said specifically where I would meet him, he thought I'd be outside his room. I usually wait somewhere between their classrooms and the cafeteria, and I thought the foot of the stairs right in front of the cafeteria entrance made sense. So it was really just a simple misunderstanding, and one that didn't even last that long. It can't have been more than five minutes from getting their winter gear on and lining back up upstairs to the time they came down, but I can't imagine what he was thinking for those five minutes.

I know there will always be times when I make my children angry with me, whether it's for insisting they pick up their mess, help with a chore, turn off the TV, or finish their video game time. But I honestly didn't expect to cause them such disappointment. Not at this age, anyway. Perhaps when they're teenagers and realize I'm not Superman, but not now.

Even though today's lunch worked out and Alex seemed to get over things quickly enough, now I can't stop wondering what he was feeling last week as it dawned on him, "Daddy's really not coming today."

Parenting is hard. Especially when you're not Superman.

Sunday, December 18, 2011

New Year, New Blog, Same Grievances

So this is where I've decided to throw down some stakes.

As we (far too) slowly unravel unto the holiday season, it seems like as good a time as any to establish some roots, post a few blog entries, and try to find a foothold into somewhat regularly updating the world re: my muddled thinkings.

I have no idea what this will be. I have no idea what my intended audience is. I have no idea how long I will continue to update this before it atrophies into my typical "is he even updating any more?"

But let's get started, shall we?

Wednesday, May 1, 2002

Salvaged from LiveJournal: May 1st, 2002

black and white

moodpensive pensive

music: Jewel

A glimmer of hope on the job front

This morning I got a call from the HR department of one of the places where I applied for a job. Even though I felt there were a few places where I stumbled conversationally (I had just woken up about 10 minutes earlier) I think it went well. She said she's going to pass my file over to the web development area, and if they're interested they'll call later in the week or next week.

The job is in Des Moines Iowa, which moves me 4 hours away from my closest family, but people survive not being in the same city as their families, right? And my parents will be in Utah for at least a few more years, so they wouldn't see that much of us anyway.

Looking into Des Moines, it could be a nice place to live. Big enough to have places to go but not Chicago-sized. Reasonably priced housing and cost of living.

I just dread the process of putting my house on the market, finding a house in Iowa, and acquiring financing. This being a real buyer's market (I count at least 6 houses right in my neighborhood for sale), I'm not optimistic about a quick and profitable sale of this house. And then there's the fun of packing up everything I own and schlepping it halfway across Iowa.

Can we please just fast-forward to six months from now when we're all settled in our new home and completely done with this one? But I guess I'm getting ahead of myself. Gotta get the job first.