Contact Info

(for those who care)

Instant Gratification   

Thu, 17 Sep 2020

Waffles (by weight)

Great waffle recipe, but measure everything “by weight” into two large bowls (dry, wet)

Measure the small amounts (less than 10g) very slowly, or by teaspoons.

Mix/sift dry ingredients.

Stir wet ingredients.

Gently fold dry into wet (do not overmix, should be like a fluffy cake batter)

Makes 4 waffles.

13:46 CST | category / entries / recipes
permanent link | comments?

Fri, 12 Jun 2020

Chili California Salsa

Boil, Blend, Strain.

Works especially well for “red” chilaquiles.

14:34 CST | category / entries / recipes
permanent link | comments?

Pan Cake Waffles



Barely mix into cake-like batter (fold, don’t whip)

Heat waffle iron (4-plate)

Spread batter/dough onto waffle iron.

Cook until crisp (I checked/re-placed around halfway through when it was steaming a lot)

Serve with butter and syrup

12:59 CST | category / entries / recipes
permanent link | comments?

Fri, 28 Feb 2020

Did You Know That `gofmt` Emits Tabs(?!)

For God so loved his children that we finally have a programming language that has solved the tabs v. spaces debate!

This is truly exciting news! In recent years, I’d resigned my position to “use spaces everywhere” because of two justifications:

However golang bucks tradition in a particularly compelling way: Tabs are indeed control characters (increasing indent for control-flow modification), and due to near-ubiquitous use of gofmt, it’s also near-impossible to mess up(!).

If you control exactly the language, the compiler, and the formatter, it’s an incredibly compelling simplification to use tabs. Most editors “support them as expected” such that backspace and tab are commutative. This is effectively an upgrade for a moderate amount of people who were stuck backspacing over spaces.

Any misbehaving editor or stubborn user who uses spaces instead will simply get processed through the mold of gofmt … their transgressions are short-lived and forgivable.

Small victories may lead to large victories… with the tabs v. spaces debate definitively settled, mayhaps we finally can move on to figuring out Elastic Tabstops.

00:47 CST | category / entries
permanent link | comments?

Sun, 30 Sep 2018

Really Good Baked Potato Soup

Cook potatoes until tender (recommend: properly microwave).

Dice potatoes into ~1/2 inch cubes.

Coat with salt, pepper, chicken bouillon powder, set aside.

Melt butter in soup pot, dice onions, vegetables, etc

Cook until onions are translucent, add garlic towards the end (so as not to burn)

Mix together vegetables and coated potatoes in the soup pot.

Add enough boiling water to barely cover / float potatoes, and simmer ~30 minutes.

In separate frying pan, melt butter and mix with flour to make a roux.

Temper in milk/cream, and herbs.

Transfer herbed milk roux to soup pot.

Blend ~50% of the soup to thicken.

Serve, top with bacon or croutons.

20:13 CST | category / entries / recipes
permanent link | comments?

Sun, 17 Jun 2018

Trompo de Pastor

Preheat oven to 300 degrees farenheit

Blend spices into slightly watery paste (using lime juice)

Slice meat into medallions, coat with paste in a bowl.

Refrigerate covered bowl for 30 minutes

Slice vegetables for fajita/veggie mixture into a bowl.

Coat vegetables with salt, peper, olive oil.

Slide meat onto skewers, use onion halves as base and skewers as the “trompo”

(Pierce skewers into onion, straight down, such that the meat is free-standing)

alternately, cook the meet on a wire rack with a pan to catch the drippings

Cook meat on skewers in 300 degree oven for 1.5 hrs

Remove meat, slice, dice, arrange on a baking tray beside coated and spiced vegetables.

Cover meat with a layer of tortillas and aluminum foil

Broil pan underneath broiler ~10-15m until veggies get sweated / roasted.

00:38 CST | category / entries / recipes
permanent link | comments?

Wed, 11 Oct 2017

What does #BleedPurple mean to you?

“What shirt should I wear to work today?” was my thought while standing in the closet, excited about our team’s new hire and some exciting news on the products our team works on.

My “” shirt, I thought. I want to be reminded of the potential. Not many people remember Upcoming, but it was a Yahoo! acquisition many years ago. Along with and Flickr it really defined Web2.0, moving from a web of documents to apps, UGC and crowd-sourcing.

Upcoming had a kickstarter (that’s where I got the shirt), trying to recapture the magic. The ghost of lives on- acquired by Yahoo!, spun-off, and re-acquired by a startup that was originally inspired by

I get compliments all the time about the quality of work and the quality of people at Yahoo! (with exclamation point #grump). It’s easy to forget that for years at Yahoo! we solved problems w/o thinking that eventually became startups!

When Hadoop was spun off and open-sourced, it started a wave of companies, big and small, that came together around “Big Data” which led to “Machine Learning” and quickly commoditizing into “Data Science”.

What will happen with Vespa? How will its ghost live on, what impact to the global economy will it have?

See more ...

11:31 CST | category / entries
permanent link | comments?

Thu, 10 Aug 2017

Ruth Woodard’s Spaghetti

* 1lb bacon, cooked, drained, and crumbled (reserve grease)

* 1 lb cheddar cheese, sharp

Cook bacon, drain and reserve grease

Heat bacon grease + flour until combined and slightly browned (do not burn)

Cook sliced onions in bacon grease w/ salt and pepper to taste

Add stewed tomatoes and oregano, simmer 30m

Cut or blend large tomato chunks

Add cheddar cheese, crumbled bacon, stir into cooked pasta

20:15 CST | category / entries / recipes
permanent link | comments?

Sun, 27 Nov 2016

Molasses Sugar Cookies

Melt shortening in saucepan or microwave.

Remove and let cool (otherwise egg will cook).

Add sugar, molasses, and egg, mix well.

Sift together all dry ingredients.

Add dry ingredients to wet ingredients and mix well.

Wrap and chill thoroughly.

Roll into 1 inch balls, roll in sugar.

Bake at 350 degrees for 8 minutes and let cool on wire racks.

15:31 CST | category / entries / recipes
permanent link | comments?

Tue, 26 Apr 2016

Writing my First Watchface for Pebble

For the longest time I’ve had an idea for a binary clock that’s easier to read than the traditional “powers of two” ones you’ll find at the nerd stores.

The design I came up with has some inspirations from a very old linux desktop gizmo I believe from the GNUStep era. I don’t remember the name of that little clock app but I think I’ve done enough refinement and design to claim this design as my own.

You’ll see in the image below that “X” is located at the traditional “12:00” position on an analog clock and “Y” is located just before the “6:00” position (meaning it’s indicating “5:00”. This setup makes it easy to see at a glance what the hour hour is and while “binary” is really much closer to the hour hands of an analog clock.


    . . X . X . .  
    . . . . . . . 
  / . . . . . . . \
 9  . . . . . . .  3
  \ . . . . . . . /
    . . . . . . . 
    . . . . Y . Y 


Now the question is how to indicate minutes? Following a similar line of reasoning, you start counting from zero at the 12:00 position down towards the middle in groups of five. It works out that you can fit a full “minute hand” that grows inwards from the edges and covers all 60 minutes contained in an hour.

  . . X 1 X . .    . . X . X . .  
  . . . 2|. . .    . . . . . . . 
  . . . 3V. . .    . . .35 . . . 
  . . . 4 . . .    . . .34 . . . 
  . . . 5 . . .    . . .33^. . . 
  . . . . . . .    . . .32|. . . 
  . . . . . . .    . . .31 . . . 

My experiences working with the Pebble SDK

It has been a long time since I’ve written C code, but the SDK has good documentation, quick start guides and examples to build from.

Memory management hasn’t been too much of an issue since the trend for watchfaces seems to be “assume you’re the only thing running, and don’t be too afraid of global variables”. The code isn’t something I’d be proud of if I were shipping this as a library or if I were a professional C programmer, but so far it seems to work well enough.

Using C, pointers, static initializers, etc. really makes me appreciate dynamic languages a lot more and efforts around modernizing low-level languages that you see with Rust and others. It’s so convenient to have sane initializers, data access, iterators, and parameter passing for programmer comfort even though it can compile down to the same bytecode or instruction sequence. With raw C it seems like it’s always a struggle to factor out some code into a function call, much more so than in a dynamic language.

Making a “Professional” Watchface

I didn’t want to just build a static watch face. Once I got the basics working, I wanted to experiment with having a settings panel at least to flip between having a light background or dark background.

The settings infrastructure is honestly a weak point of the Pebble SDK. Each watchface can have an app.js which triggers a simple Pebble.openURL( 'http://...' ). You have access to basically a full web browser for users to configure the watchface but there were several problems I had working with it.

The basic demo configuration was OK and a good starting point, but I’d love a pebble new-config "KEY_FOO=toggle, KEY_BAR=color, KEY_BAZ=radio(1,2,3)". As it is now, there’s a lot of copying/pasting and trying to find examples that makes things more difficult.

Even better would be to have some sort of Pebble.js included or injected automatically so that you can simply say: Pebble.fetch( { "KEY_FOO": function() { ... }, "KEY_BAR": "#key_bar.value" } ); … handle the common cases easily and avoid as much code duplication as possible, especially on the frontend.

Also I don’t like that you have to have the configuration page hosted somewhere on the internet. Tying watchface configuration to public URLs will lead to watchface decay as developer domain names expire, heroku accounts get abandoned, etc.

I’ve experimented with using modern browser Blob and createObjectURL API’s to bundle the whole config page into the *.pbw itself, but it gets tricky to dynamically integrate that with the full build process. It’s an awful lot of somewhat risky work to be done to replace something that’s working fine right now so I’ve currently punted on investing programming time in that.

Areas for Improvement

It’d be great to have a set of open source modules for building watch faces, pebble grab-lib weather-access, or pebble grab-lib bluetooth-loss-vibrate. It’d be much more convenient to have some infrastructure in place to help raise the bar as to what users expect a watchface to have and to be pleasantly surprised when more watchfaces support more features.

Overall I’m very happy with the development process. It was fun to have a fast iteration cycle and to literally see the changes happening on my wrist as I was making changes to bitmasks and graphics calls. There was an immediacy around controlling a physical object through code that pebble has really nailed in their developer experience, and this doesn’t even begin to cover the fantastic CloudSDK or JS watchfaces.

The results of this work has gotten me featured in the “Brain Teaser” category of watchfaces and at least a few installs. It’s been a really fun process and has gotten me searching for cheap Pebble Time watches on Craigslist so I can experiment with color, hopefully pick up even more users and installs.

12:37 CST | category / entries
permanent link | comments?

Previous 10 entriesNext 10 entries

Like what you just read? Subscribe to a syndicated feed of my weblog, brought to you by the wonders of RSS.

Thanks for Visiting!