Home

Nothing long, nothing pithy. It’s just good to be home. Follow-up appointments start tomorrow.

Now, Charlie and I did have an interesting discussion about what was The Hulk’s alter ego (turns out the TV series differs from the comic books–who knew?). And owning cats with claws is gonna be challenging while on blood thinners, but I’ve dealt with worse in the last week.

My INR is 2.2! Although I didn’t know what INR was a week ago, I knew enough today to be ecstatic about that, since it means I can stop taking the blood thinner that comes in an injection (which either Charlie or I would have given me).

It’s just good to be home.

Leave a Comment

Beep. Beep. Beep. Beep. Fuck. Beep.

What do they call the person to graduate at the bottom of their class at Med School? Doctor.

When do they put on the weakest staff at this hospital? Apparently Friday night.

Okay, I made a special request of them that they forgot (to come back after rounds so I could get out of the room and walk–ah, COVID restrictions!). And they mentioned something they needed to do that they forgot. Just another vitals check; not a big deal.

But shortly after I decided to get some sleep, the alarm on my monitor went off. So I rang them, asked them to turn it off, they came and got it off in about 10 minutes. Good. I can sleep again.

Until the alarm goes off again in less than 15 minutes. And they come back and take 10 more minutes and get it to stay off for long enough to get out of the room.

And the alarm goes off again. For the whole night.

Okay, I can see not trying to fix the bigger problem the first time it happens. Or the second. Or the third. But by the 5th, 8th, 10th, 15th, um, maybe you need to do something else.

Finally, after about 12 hours of this, they need to take my blood pressure, using the monitor. And the button to do so doesn’t work. And they fuss for over 30 minutes because all of a sudden, their lives are inconvenienced, their button is broken. Me not sleeping all night? Not their problem. But they do replace the monitor, finally. I got a 90 minute nap this afternoon that was delightful, but was too tired to do much more. (And so what if they got my drugs wrong and gave me the 10 mg instead of the 7.5 that was prescribed…can 1/3 more matter? I got to sleep!)

Fun thing to do when you have a beeping problem in a hospital: press the call button each time it beeps to share the joy of the repeated chiming with the nurse’s desk!

I did complain bitterly to the day staff and got apologies. And so far, it’s been good. Tonight’s night staff asked for permission to take vitals if I was asleep since they changed my meds and really need the data.

I am really, really good at bitching, but really don’t like having to demonstrate that skill. Or, as David Banner puts it “Don’t make me angry. You wouldn’t like me when I’m angry.”

Leave a Comment

Hello from Denial

TL;DR I am getting the medical attention I really, really need. My head just isn’t around the fact that I really, really need it (and that denial may be keeping me a whole bunch calmer than I have a right to be).

The “Too Long” stuff:

I started coughing when the air got bad in Seattle, around September 7.  No biggie, the air sucked.

The air got better around September 19.  I kept coughing.  I found Charlie’s blood ox meter and was in the 80s.  This is not good.  

I did a video appointment Sunday the 20th.  With fever and cough, they treated me for pneumonia.  My primary care agreed the next day and told me not to come in.  They didn’t want nasty coughing people in their nice clinic.  (Especially since they’d’ve given me the same meds if they confirmed pneumonia.)

My fever went down a bit, my blood ox went up a little, I kept coughing.

That Wednesday, I emptied the litter box, involving 25 pound boxes of litter and a 50 pound bag of dirty litter and got a COVID test.  (The litter box actually matters, really.)

Thursday, the COVID test was negative.

Saturday morning I gave a remote workshop early.  I jumped out of bed, got tangled in the blanket, and was out of breath when I got to the bathroom, 15 feet away, but I figured I’d hurried.  The workshop went well.

Sunday afternoon I was a little out of breath a few times.

Monday September 28, I couldn’t go more than 10 feet without taking a break, so we came to the ER Monday night.

I got lots of tests.  No pneumonia, but a large pulmonary embolism.  I’ve since learned it is a remarkably large embolism, since my doctor said she’d never seen one cover all 5 lobes of the lungs.  Until me.  Why am I still breathing?  Damned if they know!

Embolisms can hurt the right ventricle, so I had some more tests.  And the left ventricle of my heart was effectively pumping nothing,  Since the doctors, unlike Charlie, know the difference between left and right, this was curious.

I got moved to the hospital in town with a Cardiac ICU for surgery to remove the embolism, but they decided against that since my heart was a mess.  So they scheduled me to see the Heart Failure Specialist.  Talk about rotten branding.

But they all came to see me because, other than the not walking thing, I’m fine.  Normally people with so little blood flow are not conscious, can’t talk, don’t have the ability to reason, and certainly don’t tell dad jokes.  I apparently am a medical curiosity.

Since I wasn’t obviously that sick, they moved me from ICU so someone with open heart surgery had a bed there.  They’ve continued to run tests that confuse them.  Did the embolism come from blood clots in my legs?  Nope, no evidence of clots there.  Was the test showing no blood flow wrong?  A little low, but not a lot.  Did chemo 15 years ago cause the heart problem?  Are we grasping at straws? 

I kept trying to explain I was going to die of cancer, Parkinson’s, or road rage, not a heart thing! I still haven’t really internalized any of this. I think, on the whole, that is a good thing.

I’m getting lots of drugs, starting to eat again, and talk to lots of specialists.  I’ve told them not to send me home until I can walk the 50 feet from the elevator to the apartment without crying.  Sadly, the blood thinners don’t affect the existing clots which the body will absorb in time.  (In too damn much time if you ask me.)

But after barely being able to walk 2 feet to the bedside commode Tuesday and just making it the 10 feet to the real bathroom yesterday, I met with the physical therapist today. We went for a walk in the big hall. Like, outside my room. She followed behind with a wheelchair, walker, and oxygen, ready to catch me when I fell. (Charlie was not allowed out of the room–COVID restrictions.) We went to the end of the hall, and back. And then did it again. Then did it without the safety equipment a couple more times. Hundreds of feet.

Modern medicine is simply amazing.

Of course, it also gives us fun things like life vests, which due to a few arhythmias (is that the plural? I’m learning a lot now), I’m going to wear for the next 3-6 months. If my heart misbehaves, it will shock it back. An external defibrillator? I dunno, that’s tomorrow.

And after taking the ambulance to Cardiac ICU on Tuesday, it’s great to have “tomorrow” again!

Leave a Comment

Looking out my backdoor (that ugly building)

So, the real reason I decided to start paying more attention to my neighborhood was the building below:

1122 3rd Ave.

See that big flat gray building in the middle? I’d never really noticed it before, but it really stands out. At first, I just thought it was a really ugly building. But I got curious. Why is it such an ugly building? What is it there for?

If you’re like me and can’t go wondering around downtown Seattle to get a better view of this building, take a look on Google Maps Street View. And look up, look way up, to appreciate the massive, solid nature of this building.

So, after looking out at this for a few weeks, I decided it’s not all that ugly. But I had no idea what it was. So, I poked around (yeah, starting in Google Maps and then a little searching) and discovered this isn’t the FBI building (that’s next door). Instead, it’s 1122 3rd Ave., which is just a happy address for those of us who like patterns. (If it was on 33rd Ave. I couldn’t see it, so I’m okay that it’s on 3rd instead.)

So, what is it, if it’s not the FBI building? Just a 15 story, concrete (like I had to tell you that) office building, dating back to 1955 according to this site. It was originally a Northwest Bell telco central office (thanks to this site). Apparently there were lots of building like this in big cities back then. Because of their limited signal strength, there are also a lot of old telco offices around town.

Which leads into another lesser known Seattle site: The Communications Museum. Okay, I know it by its older name, the Telecommunications Museum and if you try to follow the link you may get a certificate error (I did) so they may not be great with the modern stuff, but it is an amazing experience (let’s hope it opens again). After a few hours with their docents, you’ll feel you understand exactly how telephones worked for the last hundred years or so. You get to watch actual working switching systems switch and you get the feeling the docents were the ones who ran it all. I can’t see it from my apartment though, so no picture.

Everyone who visits Seattle sees the Space Needle. By visiting Seattle virtually, you just got to be one of the few to see 1122 3rd!

Leave a Comment

Looking out my backdoor

So, I’m realizing this “shelter at home” thing is gonna last a long time.  One result of working for such a large employer is when they announce we probably won’t be going back to the office until 2021, I can find out from the news instead of any silly internal memo.

And I’m starting to adjust.  I will admit, I was a bit shocked when the security guard at the local Walgreens greeted me as if it was a regular day, not like we were both wearing masks and staying 6 feet apart.  It is now a regular day.

But I do spend a lot more time looking out the window and I’m finally paying attention to the things around me.  I’m fortunate enough to live in the middle of some real interesting stuff too, it turns out.  And since many of won’t be coming to Seattle any time soon (please don’t!), I figured it would be good for me to write down some of the things I’m discovering about all the places around me.

So, let’s start with something uplifting that’s trying to be a symbol of Seattle, the Great Wheel.   If you are any sort of a modern Ferris wheel snob, well, it just isn’t that great.  (I don’t think of myself as a Ferris wheel snob, but my first experience in one was the London Eye and the Great Wheel is a very different and much smaller experience.) And doesn’t every major city have a Ferris wheel now?  (Go on, check your favorite example of a US city.  Oklahoma City?  Yep.  Oakland, where there is no there?  Yelp lists 10.  I’m not sure which is the big fancy one, but does it matter?)

But oh, the light show at the Great Wheel is fantastic.  And creative–candy canes at Christmas, a football during the season, all purple on the night Prince died, great colorful spirals, red, white, and blue on federal holidays, etc.. (Apparently they also do gender reveal, but then again, doesn’t everyone?)

And recently, there have been a lot of nights with just a heart.  Which, for these times, is just right.

greatwheel

 

Leave a Comment

Back to this blog’s (pink) roots…

So, it’s only the first week of October and I’m already completely fed up with Breast Cancer Awareness Month. This must be some sort of record. It is going to be a long month.

Really. Is there anyone out there who is not aware of breast cancer who is going to be made aware of it as a result of BCAM? Will they see the pink bottles of 24 Hour Energy or pink cans of Campbell’s soup or the new password in the Crown Room Club and suddenly realize there’s breast cancer in the world? Does the NFL really expect conversations like:

“Hey Jimmy Joe, what’s with the pink socks on our team? Did the equipment manager throw a red shirt in with them by mistake when washing them?”

“No Bobby Ray, the socks are for breast cancer awareness.”

“Breast cancer?”

“Yeah, it’s a disease that thefreedictionary.com says ‘is caused by the development of malignant cells in the breast. The malignant cells originate in the lining of the milk glands or ducts of the breast (ductal epithelium), defining this malignancy as a cancer.'”

“Wow Jimmy Joe, sounds important. I’m sure glad they’re wearing them pink socks so I could learn about breast cancer!”

Even worse is when some awareness events badly send the wrong message. A local hospital all of a sudden has a whole bunch of plastic pink flamingos in front of it. “How cool” you might think. “Neat to have so many of those pretty birds” you might say. “Nice to see so many of them.”

But in fact, it’s not nice to see so many of them. Each represents a breast cancer patient the hospital has had in the last 2 years. You should want to see fewer of them, not more. But they picked something cool like flamingos to represent the patients, really screwing up the message. (The library in Macon puts out a bunch colorful pinwheels once a year. Really pretty until you realize each represents a report of child abuse. So then you feel bad at liking all the pretty pinwheels. Shesssh.)

Cancer does suck. I’m coming up on 10 years since I was diagnosed with breast cancer. My mother was diagnosed with breast cancer almost 40 years ago and it was much worse then. Her treatment was so hard on her, she decided not to go through it again and died of cancer at age 60. I on the other hand was back at work the day after chemo. Lots of progress has been made, but not much as a result of pink inner tubes, I don’t think.

But let me tell you, as I was dealing with breast cancer 10 years during BCAM, all the pink sure didn’t make it easier on me. I was really looking forward to a weekend at Florida Tech since that seemed like a place that wouldn’t be overflowing with pink. I was wrong and still resent all the “Real Men Wear Pink” posters I had to deal with between my biopsy and getting the final diagnosis.

Yes, breast cancer is a problem. It killed over 41,000 in the US in 2013. But colon cancer killed over 52,000 and lung cancer killed over 156,000. Still, it’s not as sexy to go around with ribbons and soup cans and flamingos for colons. (They’d have to be brown, wouldn’t they?)

And lung cancer, well, that’s all the victim’s fault, right?

It’s gonna be a long month. I think I’d be happier (oh, let’s be honest, I know I’d be happier) if I thought all this pink was really doing something more than letting people give an extra dollar for a pink lemonade or ribbon shaped bagel and feel like they’ve done their part toward curing cancer.

So, if you care, please don’t just buy a pink ribbon (magnetic or fabric). Don’t buy a super special pink thing where they’ll give extra money to breast cancer. (The worst example of this that I know of is not breast cancer related. It’s SmileTrain’s association with Vertu cell phones–buy a $5,000 phone and they’ll give $250 to charity. Sheesh–why not buy a $1,000 phone and give $4,000 to charity? Well, then you won’t have a $5,000 cell phone.)
Give platelets. Knit a tit. Or a shawl or a cap. If you know someone dealing with cancer, take them dinner, even if she says she doesn’t need it–it really makes a difference (thanks Bob!) Or take them to chemo. Or watch their kids. Or just go out drinking for an evening and let her pretend everything is normal (thanks Fran and Ann and all my church ladies). Or send them a funny card (thanks Carol!). Or give money directly to some cancer charity or other or hospice for when it gets really bad.

At least I’m not alone in this…yay think before you pink!

Leave a Comment

The Good Stuff of Day 2, Lua Metatables

The “Seven Languages” books (and probably all of the “Seven in Seven Weeks” series) is more a collection of amuse bouche (amuse bouches? amuses bouche? amusi bouchi? nahh) than of entrees or even appetizers. And that makes sense because there’s no way to fit all the details on seven languages in one book. But it also means you read a section and find yourself going “What the heck was that? It was really tasty, but I really want more.”

So it was when I read the section on metatables. Sure there is some info on metatables in Seven More Languages but I really wanted more. I found the Lua book at http://www.lua.org/pil/13.html to be very useful in augmenting it. All of chapter 13 is devoted to metatables and metamethods. I also figured out why the object-oriented stuff got put in Day 2.

So, metatables!

The Amuse Bouche

All tables have metatables, but by default the metatables are empty. You can get to a metatable for a table using getmetatable(sometable) . And, hopefully not surprisingly, you can change a metatable for a table using setmetatable(table, new_metatable) .

So, how do you create a new metatable? And what can go there?

Recall the Florida info table:

stateFL = {
    capital = 'Tallahassee',
    bird = 'mockingbird',
    population = 19890000
}

Trying to print it just gives its address, as is done in many languages.

> print(stateFL)
table: 0050D708

But you can create a function to convert the table to a proper string:

function to_string(t)
    local result = {}
    for k, v in pairs(t) do
        result[#result + 1] = k .. ": " .. v
    end
    return table.concat(result, "\n")
end

Of course, you could just print the table using this new function print(to_string(stateFL)) but that’s not noteworthy. Instead, assign the __tostring function of the metatable. One way to do this is to create a metatable with the function as its only member and make it the metatable of stateFL

mt = {
   __tostring = to_string
}

setmetatable(stateFL, mt)

Then printing the table does the expected thing:

> print(stateFL)
bird: mockingbird
capital: Tallahassee
population: 19890000

There are lots of operators which can be overriden using metatables, including +, -, /, *, <, <=, and ==. You can also override the action when reading and writing to the table to provide different default values, tracking of all changes to the table, and read only tables.

Even though Lua has a mechanism for object oriented programming, you can use metatables to quickly create classes. The Lua book on-line shows how to create a Set class with just metatables. I’ve got a copy in the file Set.lua on my Github account.

The Set class is pretty cool and it points out another feature of Lua, that it’s a prototype rather than object oriented language. Since the first book covered Io, another prototype language, that’s not a new idea for me, but I’ll still finish up day 2 with finding out how Lua handles prototyping.

Leave a Comment

Day 2 begins: Lua Tables

A quick improvement. I complained about the code necessary to load a file into the REPL. The assert(loadfile('file.lua'))() seemed a bit long. There is a better way:

dofile('file.lua')

That’s more like it!

In writing this, I’ve come across numerous places where I’d like to add even more examples that I’ve created to try things out. If you ever want to try something for yourself, you don’t need to go to the trouble to install Lua (or, since you’re better than I am, build it for yourself). There’s an on-line interpreter with some demos at http://www.lua.org/cgi-bin/demo .

So, do you find that having one data structure that is indexed by integers and another that’s indexed by field names confusing? Would you prefer to be able to do:

a[3] = 4
a.name = 'Numbers'

Yep, Lua lets you! This is the table data structure that makes Lua worth learning.  Or so says Tate.

Table Basics

So, you can use tables for named fields as in:

stateFL = {
   capital = 'Tallahassee',
   bird = 'mockingbird',
   population = 19890000
}
stateFL.nickname = 'Sunshine State'

A quick function to step through all the entries is:

function print_table(t)
    for k, v in pairs(t) do
        print (k .. ": " .. v)
    end
end

And when printed you get:

population: 19890000
bird: mockingbird
capital: Tallahassee
nickname: Sunshine State

Okay, that looks like a dictionary like thing in many scripting languages. But then the fun begins.

You can also create an array with similar syntax:

citiesFL = {
   'Gainesville',
   'Jacksonville',
   'Miami',
   'Tampa'
}

citiesFL[5] = 'North Palm Beach'

And as output, get:

1: Gainesville
2: Jacksonville
3: Miami
4: Tampa
5: North Palm Beach

There is something a little surprising to those of us who have been in CS for way too long. The list begins at position 1, not position 0. Remember when we used to start counting with 1? Yeah, me neither.

Things get to be fun when you combine these, as in (using the previous state table):

stateFL[1] = 'Gainesville'
stateFL[2] = 'Jacksonville'
stateFL[3] = 'Miami'
stateFL[4] = 'Tampa'
stateFL[53] = 'Newberry'

Of course, there’s no need to have the numbers in consecutive order. You could even get crazy and add:

stateFL[-12] = 'Key West'

and if you really need to have an element at position 0, sure, go ahead:

stateFL[0] = 'Alachua'

It’s not like the data is stored in separate areas. In fact, the numbered data is mixed with the named data:

1: Gainesville
2: Jacksonville
3: Miami
4: Tampa
population: 19890000
-12: Key West
0: Alachua
53: Newberry
bird: mockingbird
capital: Tallahassee
nickname: Sunshine State

If you’re thinking “Well, no big deal, the number is just converted to a string,” nope. Florida is getting full, so let’s move north a bit:

citiesGA = {}
citiesGA[1] = 'Macon'
citiesGA[4] = 'Savannah'
citiesGA['1'] = 'Atlanta'
citiesGA['01'] = 'Richmond Hill

Printing this gives:

1: Macon
1: Atlanta
4: Savannah
01: Richmond Hill

A little more fun with the basics. You can access the named fields using the array notation as well, as in citiesFL["capital"] . And, just as with traditional arrays and dictionaries, this doesn’t need to be a string, so

item = 'capital'
print (citiesFL[item])

works just fine. And you do know that citiesFL.item is something completely different, right?

Still, this is not worth a whole new language. Not yet. Lua tables allow you to customize how the table works. Want to create a sparse matrix and have a different value returned? That’s where metatables come into play, but this is long enough for now, so that’ll have to wait until tomorrow.

Leave a Comment

More of Lua, Day 1: Tail Recursion Optimization

So, Lua optimizes tail recursion calls.

At first glance, this is no big deal. Very few recursive functions are tail recursive, that is, have the recursive call as the very last thing in the function, at first glance.

Consider the recursive factorial, for a real easy example.

function fact_1(num)
   if num <= 1 then
      return 1
   else
      return num * fact_1 (num - 1)
   end
end

While it looks like the recursive call is the last thing in the function, it really isn’t. The multiplication of num and the result of the result of the recursive call is the last thing done in the function, so this isn’t tail recursion.

But it can be “easily” turned into a function that is tail recursive. I quote “easily” since the first two or three or ten times you see the “easy” translation, you may not believe it, or at least may not believe it’s really easier. (I had students who figured it out the first time and others who took a lot more tries.  A lot more.)

What you have to do is carry the result with you down into the recursion. You’ll update the solution as you go, so that when you finally get to the base case, you’ll have the result ready to return. As the last step of the function. Thus, tail recursion. Code to do this is:

function fact_2 (num, result)
   if num <= 1 then
      return result
   else
      return fact_2 (num - 1, result * num)
   end
end

The only thing left to do is to rewrite the main factorial function to use this tail recursive version:

function factorial (num)
   return fact_2(num, 1)
end

Does it really matter? Does Lua really optimize tail recursion?

I tried the following non-tail recursive code and could compute up to 19,997 before getting a stack overflow error.

function sum_badly(max)
   if max <= 1 then
      return max
   end
   local other_sum = sum_badly(max - 1)
   return other_sum + max
end

And sure enough, the tail recursive version below allowed me to go to at least 100,000,000, so I’m convinced Lua does optimize tail recursion.

function sum_well_helper(max, current)
   if max < 1 then
      return current
   else
      return sum_well_helper(max -1, current + max)
   end
end

function sum_well(max)
   return sum_well_helper(max, 0)
end

The code is in my GitHub account if you want to see for yourself. The solutions to the Day 1 problems are also there.

That’s enough of Day 1 for now. Onto to tables.

Leave a Comment

Lua Function Basics

So, sorry profs who might use this book as a text. I’m going to post my solutions to the book’s problems here and/or on GitHub. (Of course, that might just be an empty set, now that I’m no longer teaching, so I’m probably not bothering many people. It’s a pity; this is an excellent book for students to work through.)

First, so I don’t have to look it up again…one of the things I asked students to do in their “Get Acquainted” assignments for each language was to figure out how to enter code in a file and then use it in the REPL. Since I’m doing functions now and it’s a pain to retype functions each time I change them, now is the time to figure that out. And Lua continues to be different from other languages. To read the file samples.lua into the REPL, use the line:

assert(loadfile('sample.lua'))()

Okay. Good thing the REPL lets me arrow up to repeat commands. That’s a bunch of typing (more than any of the Seven Languages, I think).

Function Basics

Function syntax is unsurprising and makes me happy once again I know Pascal. The first exercise asks us to write a function that will return whether or not the last digit of a number (when expressed in base 10) is 3. If I take negative values into account, a solution looks like:

function ends_in_3(num)
   return math.abs(num) % 10 == 3
end

You can return two values (or more) as shown in the function that computes the roots of ax^2 + bx + c:

function get_roots (a, b, c)
	if b^2 - 4 * a * c < 0 then
		return
	elseif b^2 - 4 * a * c > 0 then
		local root1 = (-b + math.sqrt(b^2 - 4 * a * c)) / (2 * a)
		local root2 = (-b - math.sqrt(b^2 - 4 * a * c)) / (2 * a)
		return root1, root2
	else
		return (-b + math.sqrt(b^2 - 4 * a * c)) / (2 * a)
	end
end

Along with showing how to return 0, 1, or 2 values, the code above illustrates how to create local variables. By default, variables “declared” in functions in Lua are global. If you don’t want to type this all in yourself, take a look at the function set_some_stuff in my GitHub account.

Closures

Since functions are first class items, they can be returned by other functions. So you can build a function to multiply by a given value with:

function build_multiplier(factor)
	f = function (val)
		return val * factor
	end
	return f
end

Then create a couple of functions that do multiplication:

times_3 = build_multiplier (3)
times_8 = build_multiplier (8)

And, sure enough, that non-local variable factor in the function that’s built gets assigned the correct thing, each time. So

print ("4 times 3 is "..times_3(4))

prints

4 times 3 is 12

and

print ("4 times 8 is "..times_8(4))

prints

4 times 8 is 32

Finishing Day 1

There’s a bit more in the book about functions at this point, including how you can “fake” named parameter passing and have variable number of parameters. Both of these take tables, which is the big area of focus for Day 2, so I’ll skip them for now.

I’ve got a big example working that convinces me that there really is optimization of tail recursion in Lua. Convincing anyone else will take a bit more space than I’m willing to use now, so, like the author, I’ll make it a side bar and give it its own post. (If you’re really anxious, it’s in my GitHub repo now.)

For my final words on Day 1, let me quote Bruce Tate, the author, since he did a pretty good job of reading my mind at this point:

At this point, you’re probably thinking Lua is an easy-to-use scripting language, but with nothing particular to make it stand out in a crowd. That was certainly my first reaction when I encountered the language.

Yep. I definitely agree with this. Let’s hope I can agree with his next line as well:

Then I ran into Lua’s killer feature that makes its expressiveness possible: tables.

Leave a Comment

Older Posts »