smashing pumpkins

Well over a month since we saw the show in Woodlands with friends, but still (re)enjoying the pumpkins after a brief hiatus. The very generous set included perennial favorites today and cherub rock, accompanied by witty banter between james and billy, more than once discussing the Houston heat. Noel Gallagher and High Flying Birds put on a rousing show as well, graciously throwing out a few Oasis tracks to close out the set. Much like the Beck + Cage the Elephant show the month prior, a wonderful welcome home to warm and friendly TX.

20190825_215822

tttaocp

Here’s a short series of articles I wrote while parallel computing SIG leader at Schlumberger entitled “Travels Through The Art of Computer Programming”. This series was inspired by reading through Knuth’s famous TAOCP volumes and covers various topics. For example, I give a RNG based on the unpredictability of the GPU warp scheduler, cover topics in polynomial and number theory, Pade approximants, encryption, graph algorithms, memory, CPU performance, blockchain, distributed networks, REST and more.

goodbye gorgeous old gal

After twelve years, alas, it was finally time to let go of our first home. Nestled in the bucolic hills of central PA, we bought her during our first stint in PA, a couple years before this blog began. The old antebellum home has a long and patchy history, as evidenced by the deteriorated state we found her in. It was a great joy to restore the grand old place here and there casually over the course of time. One of my very first posts was on the concrete counter created for the industrial looking kitchen, lifted into place by yours truly and a buddy. We almost did our backs in. I remember vividly many days and nights ripping lumber with the table saw for finishing inside the house and out. Precarious outings onto largely missing upper decking and dilapidated shed roofing. Dusty work sessions in basement and attic. So many memories and wonderful gatherings of friends new and old, kind and generous neighbors with deep wells of patience for our inexperience, particularly when it came to preparing for winter or gardening. We’ll miss the old place dearly and hope she’ll be every bit the blessing to the new owners and she was to us.

 

IMG_1819

20th

Can’t believe it’s been 20+ years with this incredible lady. Of all the things I could say, and have probably said, one of my favorites is paraphrased from thelma ritter in rear window as stella : “When I married [bec], we were both a couple of maladjusted misfits. We are still maladjusted misfits, and we have loved every minute of it.”

IMG_0877

TIR

Made it through my first Texas Independence Relay back in March, herewith a photo of the fine folks in my team. I was quite surprised with how much I enjoyed the race, especially considering it was twice my current weekly miles. Compressed into 24 hours. Special thanks to Alex for inviting me to join his team and the epic trek through bucolic hill country, along winding highways and byways into Houston from Gonzalez.

tir

david byrne

Austin usually gets all the credit, however htown continues to attract a bevy of brilliant acts eg., cults 11/13/17, ghostland observatory 12/30/17, brmc 01/20/18, sleigh bells 02/07/2018, david byrne at WOMH last night. To see him in particular was really sentimental, considering talking heads was among the first few bands I heard and fell in love with as a kid. David Byrne doesn’t seem to lose an ounce of creativity or relevance as the years go by; a remarkable talent to say the least.

IMG_0386

20171230_224154

IMG_0539

IMG_0591

IMG_0886

the f250

a story for moth night at the ledbetters

1. After finishing grad school in Williamsburg, Virginia and knowing we would move within a few months, we decided not to renew our lease. For this reason, we spent about 4 months toward the end of the year, effectively homeless, all our worldly possessions in storage and ready for the move. A good friend was in India for a stretch, and he kindly sublet his basement apartment to us. Virginia in the tidewater area is like Houston in terms of climate, and our basement was quite dank and smelly, pungent with the fragrance of body spray, curry and mold. Occasionally bec could be heard gently sobbing in the shower over the chirps of crickets, keeping her company in there. At least 2-3 times a week, the undergraduates upstairs played beer pong, balls and solo cups connecting loudly with the wooden floor among the clatter of feet and drunken revelry. Vijay returned a little early, and in October or November found ourselves moving on to a hotel by the edge of town.

2. The hotel on the surface was much better than the basement, no crickets in the shower and we had a free continental breakfast every day, as well as a decent pool and Jacuzzi. We did notice a few other residents milling about, one room in particular attracted a lot of attention. This was obviously the local crack house or muster point for the Mormons, hard to tell based on the random clientele and their states of dress. Bicycle was also the preferred mode of transportation. Missing a stove or kitchen, we ate microwave lasagnas almost nightly and to this day get a little queasy at the thought of Stouffers. The hotel was to be our last stop in Williamsburg, and early December after a final interview at Penn State we began to plot our escape from the second worst hotel in Williamsburg. The worst in our experience was another hotel on the outskirts, our first stop in Williamsburg when fresh off the boat in 2000. It had what looked like a meth lab but no Jacuzzi.

3. Around Christmas we’d found a lease to take over for a few months in state college PA, with room for a little furniture, and so we started to look at truck rentals. One way seemed a little pricey, especially considering we’d need to repeat the trip for the rest of our goods when we’d found a house eventually. We both enjoy exotic vehicles (although Bec prefers her to be in good running order), therefore we decided to buy an old truck to carry us up there. Our reasoning was that we would have a memorable trip and a practical vehicle to enjoy and use afterwards. We consulted the classifieds and possibly craigslist, finding what looked like a suitable candidate, a 68 ford f250, located just south of Williamsburg in Newport News. The truck was to be a Christmas present of sorts, and Bec for her troubles received some clothes I picked hastily at the local target. Turns out they were radically the wrong size. There were more tears, this time by the light of our small garish Christmas tree. Also from target.

4. When I first laid eyes on the f250, it did appear a little worse for wear but lovingly maintained by the owner. A closer inspection revealed a hand painted powder blue and cream body, including some thinly veiled rust in the truck bed. However, the new engine leads, hoses, plugs and brakes seemed promising. We took it for a spin, and it handled like an Abrams tank. A standard transmission with four on the floor, little to no power steer and drum brakes made for an exciting and challenging drive. No matter I said, with my usual reckless abandon, it’ll do. And the price was right; for 500 bucks, it was a steal. We set out back to the burg on interstate 64, temporary truck permit in place and ready for anything. In what turned out to be a portent of things to come, I ran out of gas, finding out the hard way the gas gauge didn’t work. My resolve hadn’t weakened much. No tears from bec this time, just a nervous smile at my bravado, as we brought a jerry can of gas to our crippled truck resting suspiciously by what was a CIA facility. Keep in mind this is mid 2000s and the truck looked like something out of Mad Max, a generous assessment.

5. Sometime in January, we loaded up the f250 with a selection of items from the storage unit, including a large collection of CDs, books, appliances and small furniture. These were all held in place by a queen mattress ensemble, tied down with elastic netting, overall resembling a gypsy wagon. We loaded Bec and our neon up with clothing and perishables, leaving Williamsburg in convoy, by way of interstate 64 and Richmond to the North, then interstate 95 and DC before hitting MD and ultimately interstate 99 to state college in PA. We had completed the route some weeks prior for the final interview in December, last time in heavy snow, which the locals declared I was crazy to drive in. I get called crazy *a lot*. During that particular trip we noticed how many more trucks there were up North, mostly due to the snow and hills. I felt good leaving Williamsburg in a truck, a feeling which turned out to be short lived.

6. Somewhere North of Richmond and after a refill, I sensed the occasional bump against the truck body. It was hard to pinpoint and not very loud, so I thought nothing of it for a while. Over the next half hour, the frequency and volume of the noise increased, and bemusement turned to mild panic, something was obviously wrong. I pulled off near Fredericksburg with Bec in tow, and did a quick walk around the vehicle. The problem took a while to register, it was so far outside my experience. Apparently, my tires were disintegrating; I’d never seen anything like it, large chunks of rubber had fallen away, the tires resembling swiss cheese. This was just prior to smart phones, and at the time we had no AAA, so we decided to head off from 95 in search of new shoes for the horse.

7. I drove gingerly around the country highways of greater Fredericksburg in search of a tire yard. I don’t remember how we found the place, maybe we relented and asked directions. I do remember pulling up into what used to be a gas station and feeling a sense of relief; driving 95 is stressful at the best of times, let alone when your tires are made of cheddar cheese. A couple of surly guys eventually offered to help. After a quick study of the truck, they took on horrified expressions beneath the grease and sweat on their faces. It had been a harrowing experience, not to mention couple of months; our nerves were getting raw at this point. The more affable guy tried to explain that the truck had antique tires (I had picked up on that one) but what was much worse, were fitted with split or suicide rims, otherwise known as widow makers. Take them off wrong and they can decapitate or otherwise maim you. Suffice it to say, they wouldn’t touch the tires unless we also replaced the rims. I mentally sobbed in the shower, I think Bec was holding up better than I at this point.

8. Our cheerful mechanics pointed us to a junkyard out in king and queen county to the south, where we could buy some used rims. It was a long journey, practically back to Richmond, and there we also encountered unsympathetic junkyard workers. Nonetheless they loaded us up in the neon with some sooty ford rims, one on bec’s lap, three in the back seat and trunk, taking up all the room we had left. We made it back just before closing and thankfully our greasy saviors took pity on us, fitting rims and tires. Our two hour trip had turned into about seven by this point, so we charged out from VA into MD, stopping just briefly for food before finally hitting 99 North in PA around 10 pm. Even in the darkness we could see the beautiful vista of central PA open up before us. Not for the first or last time we felt like Ulysses, beset by endless challenges on the quest to find the way home. Eventually we would sell the truck, extracting the roughly 900 dollars we’d sunk into it, but not before I was pulled over by the cops, losing my license for a couple of days on one occasion. A story for another time.

basic python gui

It feels like years since I posted something technical; I have a busy day job and at least one side gig to thank for that. Thought I’d share the following python code, handy for wrapping a terse command line app (myApp) in a slightly more user friendly/cross platform gui. Don’t forget to re-introduce the persnickety python formatting 😉


from tkinter import *
from tkinter import ttk
from tkinter import filedialog
import subprocess
import time
import os
root = Tk()

# initialize parameters
programArgs = (' --a ', ' --b ', ' --c ')
argumentNames = ('Input File', 'Output Log', 'Output Directory', 'Output Prefix')
initMessage = 'Required'
argumentMap = { }
processID = ''
baseCommand='myApp.exe'
pathSep='\\'

# adapt syntax to OS
if os.name == 'posix':
baseCommand='myApp.x'
pathSep='/'

# test availability of binary
testCommand=''
try:
testCommand = subprocess.check_output(baseCommand, stdout=subprocess.PIPE)
if "allowed options" not in testCommand.communicate()[0]:
print('please install the myApp executable and make sure your PATH is correct')
time.sleep(3)
root.quit
except:
pass

# select a file or directory
def openFileDir(entry,field):

f=StringVar()
if 'Dir' not in field:
if 'Input' not in field:
f = filedialog.asksaveasfilename()
else:
f = filedialog.askopenfilename()
else:
f = filedialog.askdirectory()

if len(f) > 1:
argumentMap[field] = f
entry.delete(0,END)
entry.insert(0,f)
else:
argumentMap[field] = ''
entry.delete(0,END)
entry.insert(0,initMessage)

# get entry for prefix
def updateArgument(entry,field):

f=entry.get()

if "Required" not in f:
argumentMap[field]=f
else:
argumentMap[field]=''

# inform the user, uninitialized params
def printArgumentError(f):
msg="Please set a value for the parameter: "
msg+=f
print("%s" % (msg))

# create command
def createCommand():

v=StringVar()
comm=baseCommand + programArgs[0];
v=argumentMap[argumentNames[0]]
if len(v) <= 1:
printArgumentError(argumentNames[0])
return ''

comm+=v
comm+=programArgs[1];
v=argumentMap[argumentNames[1]]
if len(v) <= 1:
printArgumentError(argumentNames[1])
return ''

comm+=v
comm+=programArgs[2];
v=argumentMap[argumentNames[2]]
if len(v) <= 1:
printArgumentError(argumentNames[2])
return ''

comm+=v
comm+=pathSep
updateArgument(e4,argumentNames[3])
v=argumentMap[argumentNames[3]]
if len(v) <= 1:
printArgumentError(argumentNames[3])
return ''

comm+=v
print('%s' % comm)
time.sleep(10)
return comm

# run command
def runCommand():

comm=StringVar()
comm=createCommand()

if len(comm) <= 1:
msg="Can't execute myApp; missing required parameters"
print('%s' % msg)
return

subprocess.Popen(comm, stdout=subprocess.PIPE)

# create and grid the form
c = ttk.Frame(root)
c.grid(sticky="nsew")
c.master.title("myApp")

# create the widgets, first grid
# label, entry and browser for input
f1 = argumentNames[0];
l1 = ttk.Label(c, width=20, text=f1)
e1 = ttk.Entry(c,width=30)
e1.insert(0, initMessage)
b1 = ttk.Button(c, text='Browse',
command=lambda: openFileDir(e1,f1))
argumentMap[f1] = ' '

# label, entry and browser for output log
f2 = argumentNames[1]
l2 = ttk.Label(c, width=20, text=f2)
e2 = ttk.Entry(c,width=30)
e2.insert(0, initMessage)
b2 = ttk.Button(c, text='Browse',
command=lambda: openFileDir(e2,f2))
argumentMap[f2] = ' '

# label, entry and browser for output file
f3 = argumentNames[2]
l3 = ttk.Label(c, width=20, text=f3)
e3 = ttk.Entry(c,width=30)
e3.insert(0, initMessage)
b3 = ttk.Button(c, text='Browse',
command=lambda: openFileDir(e3,f3))
argumentMap[f3] = ' '

# label, entry for prefix
f4 = argumentNames[3]
l4 = ttk.Label(c, width=20, text=f4)
e4 = ttk.Entry(c,width=30)
e4.insert(0, initMessage)
argumentMap[f4] = ' '

# grid all the widgets
# first row, input
l1.grid(row=0, column=0, padx=5, pady=10)
e1.grid(row=0, column=1, pady=10)
b1.grid(row=0, column=2, padx=5)

# second row, output log
l2.grid(row=1, column=0, padx=5, pady=2)
e2.grid(row=1, column=1, pady=10)
b2.grid(row=1, column=2, padx=5)

# third row, output ldf
l3.grid(row=2, column=0, padx=5, pady=10)
e3.grid(row=2, column=1)
b3.grid(row=2, column=2, padx=5, pady=2)

# fourth row, output prefix
l4.grid(row=3, column=0, padx=5, pady=10)
e4.grid(row=3, column=1)

c.grid_columnconfigure(0, weight=1)
c.grid_columnconfigure(1, weight=1)
c.grid_columnconfigure(2, weight=1)
c.grid_rowconfigure(0, weight=1)
c.grid_rowconfigure(1, weight=1)
c.grid_rowconfigure(2, weight=1)
c.grid_rowconfigure(3, weight=1)

# second grid, action buttons
d = ttk.Frame(root)
d.grid(sticky="nsew")
b4 = Button(d, text='Quit', command=root.quit)
b5 = Button(d, text='Start', command=lambda: runCommand(),bg="green")
b6 = Button(d, text='Stop', command=root.quit,bg="red")
b4.grid(row=0, column=0, padx=5, pady=2)
b5.grid(row=0, column=1, padx=5, pady=2)
b6.grid(row=0, column=2, padx=5, pady=2)

# fix size
root.update()
root.minsize(root.winfo_width(), root.winfo_height())
root.maxsize(root.winfo_width(), root.winfo_height())

# run
root.mainloop()