Bechdel Test

So, I was thinking about the “Bechdel test” the other day, since sexism has been the “in” thing for the past few weeks. Also other reasons. Basically, it’s a test to highlight gender inequality in fiction (thank you, Wikipedia, for that description). There are three criteria that must be met to pass:

  1. There must be at least two (named) women in the movie,
  2. These two women must talk to each other,
  3. About something other than a man.

Then you score the movie out of three points. Higher is better.

This is great at first blush, but there are a few problems with it. First off, it doesn’t account for movies for which an active female role doesn’t mean that they must talk to each other. I don’t have any examples, so take this with a grain of salt.

But on the other end of the spectrum, any reasonable pornographic film will have two women that talk to each other (and probably a reasonable number will talk about something besides a man, though I lack the data), and I hardly consider that a particularly gender-equal medium.

Honestly, though, that’s not my point. More on topic for this blog (ha, is joke), there’s a website which provides vast quantities of user-rated bechdel test scores. I downloaded this data and did some simple number-crunching in Python.

The data comes as ratings (on a scale from 0 to 3, of the number of criteria met) for a few thousand movies, each linked to an IMDB ID. Using my TMDB database, I can download things like year and genre.

So a first test, just to make sure everything’s working, is to graph the average movie score against time:

What to make of this? With my many years of sociology research, here’s my interpretation:

  • Early movies didn’t typically have women in leading roles.
  • During World War 1, movies started passing the Bechdel test more and more.
  • Then the Roaring Twenties came, and women went back to their more ornamental state.
  • The Wall Street crash, heralding the Great Depression, and we stopped being rich enough to trample on women in film.
  • Then the ratings held steady until, ironically, second-wave feminism came about in the sixties, where the ratings dropped.
  • From there, the noise in the dataset lowered and the average has roughly steadily increased to present day. A lot of this is just because there are more rated movies from this time period.

That was a nifty graph. I mentioned earlier that I had genre data for all of the movies, what if we find the average Bechdel rating for each genre?

             War 1.449 
         Western 1.467 
          Action 1.762 
           Crime 1.826 
       Adventure 1.856 
         History 1.856 
 Science Fiction 1.903 
     Documentary 1.929 
       Animation 1.981 
        Thriller 2.028 
         Fantasy 2.096 
         Mystery 2.188 
           Drama 2.200 
          Family 2.227 
          Comedy 2.229 
          Horror 2.278 
           10769 2.320 
           Music 2.412 
         Romance 2.431 
        TV Movie 2.587

That’s the list of genres with their corresponding ratings, sorted increasing down. Movies are from all time periods, averaged together.

Right off the bat: Genre “10769” is a genre that, for some reason, TMDB won’t identify in their API (it turns out to be the Foreign genre). It appears to be largely bizarre international films, including the Japanese fantasy drama horror romance action comedy movie “Negative Happy Chain Saw Edge.”

Update from a friend who can read Japanese: That’s not a mistranslation.

But, the rest of the genres are familiar to us Americans. Interestingly, if I were to rank these genres from “most manly” to “least manly,” this is about the order I would put them in (notably, I don’t by default rank them from “most manly” to “most girly”, I don’t think of these as opposite).

On the one hand, you have War, Western, Action, and Crime movies. I thought Saving Private Ryan was a good movie, but to be honest, I’d have been really uncomfortable if half the squad had been female. Saving Private Ryan fails the Bechdel test with 0 out of 3 criteria met. So War movies get a free ticket.

Jennifer Lawrence, you were good in the Hunger Games, but I don’t consider that a war movie in the same vein as Saving Private Ryan. So don’t try to do a remake of that movie. I don’t like imagining my future wives getting hurt.

Tom Hanks, you’re cool, but you’re on your own in this regard. Man up.

Western, Action, and Crime movies are in a similar boat, though much less extreme. Spectre passed only 1 of the 3 criteria, which makes sense, but the movie wouldn’t have been worse had more females talked.

Science Fiction, though, has no excuse. We put a (black!) woman on the bridge of a starship in the sixties, and we still can’t pass the Bechdel Test more often than thriller movies? How can you do worse than the Fast and the Furious movies?

Oh well. I’m not a movie maker. I’m just here to make graphs and complain about society.

Speaking of graphs, what if we look at the difference between the most manly and the least manly genres, on a per-year basis? In principle, in a very unequal world, we would expect there to be a large gap across genres – some genres would be considered manly, and others not. In a perfectly equal society, every genre would have the exact same representation.

So let’s make that graph!

And look at that, in recent years the graph has been trending downwardish for the past 20-30 years. So that’s good, I suppose.

Fair warning: The amount of data per point in this graph is just a few data points. There’s only ~7000 movies in the database, divided into 100 years is ~70 movies/year, divided into 20 genres is only ~3 movies/year/genre.

This issue is compounded by the fact that the movies are not distributed uniformly across time. Early on there were fewer movies than there are today.

I don’t have a graph of number of movies in the dataset against time, that’s left as an exercise to the reader.

Of course, the part that you all are curious about: the code. Boys and girls, this is what real I-have-to-analyze-some-data-real-quick-I’ll-comment-it-later Python code looks like:


Posted in Uncategorized | Leave a comment

The Programmer’s Cookbook: Stuffed Pizza

I don’t really like food. This is surprising, since being a programmer I get exposed to a variety of foods from around the world, ranging from Greece to the Golden Triangle to America (U.S., Canada, and Central America).

I guess “around the world” actually means “the Northern hemisphere” in this context.

And yes, I recognize that what I eat from restaurants near my workplace hardly counts as authentically from those locations. But I’ll take what I can get.

But that said, I like pizza.

In general, my favorite tends to be deep dish pizzas. Super thin (New York style) pizzas are good as well, but in my opinion don’t stack up as well. My long-time favorite is a Chicago style stuffed crust pizza that comes from Mangia’s in North Austin. Recently I was introduced to the Detroit style of pizza (from Via 313, also from Austin in case you had any doubts about where I lived), which prides itself on being made in automobile parts trays, after the car industry they built the city on. These are both delicious deep dish pizzas.

More modern Detroit style pizzas are baked in an abandoned factory with broken windows and rusty parts trays.

Anyway, since I moved and started shopping for myself it’s become easier to cook for myself beyond just warming up frozen pizza. And I’ve found it’s surprisingly easy to make not terrible pizza from some flour and some sauce and some cheese. So I do that, because it’s good food and it’s cheaper than eating out all the time and maybe also cheaper than eating frozen pizzas, or at least about the same cost. Either way it’s tastier (though nobody other than I has taste-tested my cooking, so I could be lying). But, these are simple single-layer pizzas, and I do miss the taste of more complicated pizzas.

So, I took on the challenge of making a stuffed crust pizza. This is my recipe and my results, put in terms a non-chef would understand.

Note: Here one pizza is enough for two people, i.e. suitable for you and a hot date or (more likely) you and future you looking for leftovers. It is assumed neither you nor your hot date are professional pizza-eating-contest-contestants. If so, double the recipe.

Also worth noting is this recipe is currently in early development, I find it to be very doughy. You may want to halve the amount of dough used. I will update as I see fit.

Step 1: The Dough

The result of this step: Two covered bowls full of risen dough. (rised bread? It’s not bread unless you bake it, though)

This part is surprisingly easy, especially if you grew up around bread machines. I had always assumed that bread machines were really important for all things yeast.

And they are. Just not for pizza. You don’t need a bread machine, just a bowl and a willingness to make a mess.

Here’s a list of tools you will need:

  • A mixing bowl, ideally approximately one forearm’s diameter.
  • A 1 cup measuring cup (and a knife with a flat edge).
  • A 1 tablespoon measure.
  • A 1 teaspoon measure.
  • A big spoon for mixing.
  • 2 bowls.
  • Plastic wrap.
  • Thermometer to determine water temperature. (though you don’t have to be very exact)

Here’s the list of ingredients:

  • 3 cups flour. I buy it 5lbs at a time of the store brand, because that’s cheapest.
  • 1 tablespoon of sugar.
  • 1 teaspoon of salt. The one with the little girl with the umbrella is fine.
  • 1 packet of yeast. Most recipes say “1/4 cup of yeast,” but it’s sold in 1/4 cup packets, so just get a packet (actually it’s sold in sets of three 1/4 cup packets).
  • Heatable water. None of that ice-nine stuff.

Here’s the procedure (read before doing!):

  1. Pour 3 cups of flour into your mixing bowl. To do this you can scoop a heaping pile of flour, then use the back of a knife to scrape the heap back into the bag. Measuring cups measure to the brim.
  2. Pour 1 tablespoon of sugar into the mixing bowl.
  3. Pour 1 teaspoon of salt into the mixing bowl.
  4. Take a packet of yeast, and cut the corner off. Empty the contents into the bowl.
  5. Mix the dry goods.
  6. Fill your cup measure with warm (110 degree) water. You can do this using a thermometer for the first few times. I found it’s approximately between “warm” and “hot” water. If the temperature isn’t exact, that’s fine – I’ve never had dough fail to rise because the water was too warm. Remember that a thermometer will take some time to heat up.
  7. As soon as you poured the water in, take your big spoon and start mixing. The goal is to get the dry goods to mix with the water. Generally at the beginning (first few seconds) I will push the dry goods to the edges of the bowl, into the water, with my spoon. Then I will scrape along the sides of the bowl toward me, and then squish the spoon through the middle of the bowl to the far side (in a sort of pressing motion).
  8. After a minute or so, the dough should start to pull together into small strandy dough-like bits. You should be able to reach in with your hands and smoosh all of the dough together. Some bits will fall off, that’s fine. Sometimes if they’re big you can stick them back on. Gather all of the bits you can reasonably hold.
  9. Now knead the dough. Press it like you’re giving someone a massage, except you can physically push your hands through them and they are a ball of dough. I keep it suspended in the air over the bowl. Squeeze it, then fold it back into a ball shape and squeeze it again. The goal is to mix it even better, I guess. Do this until your hands get tired and the floury dough has magically turned into sticky homogenous not-floury dough.
  10. Split the dough in two, place each into a bowl, and cover each bowl with some sort of plastic wrap.
  11. Place each bowl on top of a computer running Tensorflow or other heavy computation (at least 300W with heavy CPU and GPU utilization is ideal). A webserver may be fine as well. (but seriously, the temperature should be at least 78 degrees and ideally 80 degrees for the bread to rise. This can be a problem if you like your apartment cold. 74 degrees is too cold)

Step 2: The Toppings

The result of this step: The toppings I used when I made this post (onions and peppercini).

You can do this step concurrently with the next step if you wish. This is mostly just a placeholder step so that you remember to make toppings, which involves buying them and buying the tools you need.

Here’s a list of tools you will need:

  • Sharp knife.
  • Cutting board. I use one of those small flexible non-stick ones I found at a grocery store.
  • Bowl. Or, somewhere to put the ingredients before you put them on a pizza.

Here’s a list of ingredients:

  • Peppercini peppers (pronounced “pepper-ch-eeny”). Not the similar-looking but different banana peppers. If you have to buy a bunch of pizzas from Papa John’s just for the peppers, do it. You will need approximately 3 peppers for a whole pizza, adjust to your liking.
  • An onion.

Here’s the procedure (Read before doing!):

  1. Cut a thick (1/2″) slice of onion. Remove center, cut onion slice into quarters. Set aside. (note: This actually produces much more onion than is probably ideal, if you’re doing something else that requires half an onion slice then go for it)
  2. Chop peppercinis into ~3/8″ slices. You should get ~4 slices out of each pepper. Set aside.

Step 3: The Pizza

The result of this step: A stuffed crust pizza.

Here’s a list of tools you will need:

  • Cutting board
  • Pizza cutter
  • Rolling pin
  • Pie pan (Mine is 8″ in diameter and 1 1/4″ tall, taller would work but I wouldn’t go shorter)
  • Cookie sheet (note: This is just to roll the dough out onto)
  • Spoon (for spreading sauce)
  • 1 tablespoon measure.
  • Oven mitt.

Here’s a list of ingredients:

  • Dough (both bowls of dough from Step 1 – this is a two-dough recipe)
  • Toppings (from Step 2)
  • 1 tablespoon of olive oil.
  • Mozzarella cheese. So much mozzarella. On the order of 8-12 ounces of mozzarella. I buy the pre-shredded variety that comes in bags at the grocery store.
  • Pizza sauce. This part is being a little finicky with me, you can make your own or you can buy a jar of pizza sauce from the store. It doesn’t provide a majority of the taste.

Here’s the procedure (Read before doing!):

  1. Preheat oven to 450 degrees Fahrenheit.
  2. Roll out 1 pizza dough. It should be about 1/4″ thick.
  3. Roll out the other pizza dough. It should also be about 1/4″ thick.
  4. Spread dough in pie pan. Be careful to press the dough into the corners of the pan. The dough should lie along the bottom of the pan and up to the rim. It may overhang the rim of the pan if you want.
  5. Pour 1 tablespoon of oil onto the dough (not more! Even if you’re tempted). Then spread it around with the back of a spoon (or similar) until it evenly coats the dough.
  6. Place the pizza in a 450 degree oven for 5 minutes to toast the lower crust.
  7. Remove pizza. Place a layer of cheese on the pizza. The layer should be at least 1/2″ thick, consisting of several handfuls of cheese. This layer uses half of the cheese on the pizza.
  8. Place toppings on the cheese layer.
  9. Place the second layer of cheese. This layer should be about the same size as the first layer, and should come to the rim of the pie pan.
  10. Place pizza in a 375 degree oven for 5 minutes to let the cheese melt. Remove pizza.
  11. Add the second crust to the top of the cheese layer. Tear off any pieces of dough that go outside the pie pan. Note that, because of the cheese, this dough may end up well above the rim of the pie pan. Pinch this layer of dough to the edge of the first layer of dough, so that the cheese and toppings have nowhere to escape to. Warning: The pie pan may be hot.
  12. Place pizza in a 375 degree oven for 15 minutes.
  13. Remove pizza onto cutting board. Cut into slices. Consume pizza as desired. Note that the pizza may be messy, so don’t eat it in a bathtub full of cash.


Someday I’ll fix the image rotations, I promise.

So, there you have it, that’s my current recipe. Here’s the fine print: It’s honestly not all that great, both times I’ve made it it turned out to be extremely doughy (as in, the pizza was more loaf of bread with cheese in it than cheese with crust around it). I suspect this is because I use two doughs, I intend to try using one dough and splitting it in two for top and bottom. I will update this recipe as I see fit.

Comment below with your questions and results! Actually, don’t, except as a last resort. If you’re reading this you probably either a) can contact me directly or b) can contact me through somebody who knows me directly.


Posted in Uncategorized | Leave a comment

On Thermostats

So I recently moved, in case you’re new to the blog, which has entailed me becoming comfortable in a new home. Or, making the new home mine.

It has also entailed me learning about apartments. This being my first one, I’m… a little surprised by the cost cutting measures. The apartment’s great, don’t get me wrong, but I think it would’ve been nice if during the recent renovation (which I’m paying premo for) they had bothered to install actual drawer mechanisms that, you know, actually open and close without sticking and going all over the place. I may be slightly spoiled from spending my entire life so far in a house with drawer slides.

But, more to the point, I pay for electricity and my thermostat doesn’t have a schedule feature. It just holds whatever temperature you set. So I could turn it off when I leave in the morning and on when I get back, but then I not only have to spend my first half-hour home from work in sweltering heat but I have to remember to turn it off, which I won’t. I barely remember how to get to my building, how am I supposed to remember to turn off my A/C?

So, solution time. I had a few weeks before work started to think something up. I could buy an off-the-shelf solution, but that’s both expensive and a cop-out and it won’t necessarily work with the installed HVAC system (the thermostat mounts onto a 4-wire header sticking out of the wall, so anything I buy would have to conform to that standard).

My second option would be to rig up some relays to the 4-pin header sticking out of the wall. The problem here is I’d risk blowing out the circuitry that’s hidden behind the wall, and that’s almost certain to not get me my security deposit back. Also I have to deal with all of the weird cases that thermostats deal with – things like compressor protection.

That leaves me with the third option: Build a device to press the buttons on the thermostat for me. And that is what I did, with the help of my trusty 3D printer.

Sorry the image is sideways, I still haven’t figured out image rotation.

As you can see, there are three parts: A servo (partially hidden) to press the buttons, a webcam to view the current temperature, and a Raspberry Pi to control the entire charade. The cost of parts was $0, because I still have all of those Pi 3s from when I built the Pi cluster.

The Pi 3 has WiFi, so I don’t need to run an ethernet cable to it – all I need to do is get 5V USB power to the Pi. This is how the Internet of Things is supposed to look, not to snub the people who use “Nest” or whatever. (machine learning thermostat? What is there to machine learn?)

Building the hardware was, as always, an iterative process, made vastly easier by owning a 3D printer because I can run a print, see if it worked, tweak it, and repeat. Productivity is inversely proportional to the edit/compile/run cycle, and cutting down the weeks and $10s of dollars spent outsourcing builds to hours and pennies has been possibly one of the greatest quality-of-life improvements I’ve experienced of all time.

For example, here’s the five and a half prototypes I printed for the servo rocker arm (the thermostat has two buttons, up and down – the servo is configured so that if it rotates one way it presses up and if it rotates the other it presses down):

The first iteration was the bottom-center one, which was printed such that the support material filled the hole for the servo. Then came the ones on the bottom left and right, which are similar save for a slight change in hole size. Once the rocker fit the servo, I printed the top-right one, which featured a redesign of the arms – the straight arms tended to snag on the edge of the raised buttons, and I didn’t want to damage the buttons so I put a curve on the end of the arms to prevent snag. The top-right one had the curve built such that the ends of the arm stuck together, so when one compressed against a button the other did too, pressing both buttons simultaneously. So I printed the top-center one, which fixed that, but then I realized that the method of mounting to the servo was flawed, since the 3D print couldn’t grip the grooves along the servo head. So, I prototyped a mount for cross-arms, and the final print is what’s mounted. (a nice thing about using OpenSCAD for designing is I can select just a region of the part to print, if I don’t want to waste time and filament printing a whole part just to test one bit)

The rest of the thermostat mount came together in a similar fashion, I won’t bore you with the details. There are two main parts, the left mount and the right mount, which bolt together to secure themselves to the thermostat. The Pi mount on the left half is a shortened form of the Pi mount from my cluster (another nice thing about OpenSCAD – copying/pasting libraries). The webcam mount took some clever design to fit on my printer, it’s exactly big enough to be running against the size limit.

The LED mount was an afterthough. Originally, there was no LED, but night tests showed that the webcam couldn’t read the display well enough, so I added a red LED.

Now that I’ve discussed the hardware at length, let’s dive into the software.

Oddly, the system is open-loop. That is, the system doesn’t make decisions based on the temperature. This is strange because the system knows the temperature, because of the webcam. Instead, the webcam and the servo control are separate entities software-wise.

The servo control works by storing the last-set setpoint in a file, and there is a Python script that checks what the setpoint is and what it should be and moves the servo to match (this is how I get around the open-loop problem: the system just remembers what the setpoint is supposed to be). The actual mechanics of managing the servo (driving PWM values, etc) are done through shell scripts using the wiring-pi command, because for some reason the Python module kept crashing my Pi when I re-initialized the PWM output. So the high level Python script calls out to the shell scripts via the subprocess module to manipulate the thermostat.

Of course, this raises the question of how does the script know what the setpoint should be? First off, a schedule is nice, but how should the schedule be represented, and what should happen for non-scheduled events? In terms of representation, the schedule should probably be able to at least support weekend/weekday differences, because that’s the point of the whole system (I don’t want the A/C to turn off on the weekends, because I’m home then). But should it support having different schedules on, say, Monday than Tuesday? Or Sunday from Saturday? (I don’t go to church, but that’s really the only use case I can think of there) If I do support having different schedules on different days, how do I want to represent that? If I want the same schedule for every day, do I have to copy and paste the schedule? (which would be bad design, because then a change to one day’s schedule won’t propagate to all)

If you like thinking about such things, then congratulations in your career in software engineering, and take a moment to think about how you would do it in your situation.

How I ended up doing it was by building an ordered-override system, where files specify time ranges and apply to specific days (of the week). A file does not need to specify the temperature for all of the times in a day. Files are named like 012-myname, where the number in the beginning is used to sort the files and the name is just a human-readable name. Higher-numbered files override lower-numbered files in areas where they overlap.

For example, here’s a set of configuration files:

pi@rpi06:~ $ cat schedules/000-night  
# This is the default schedule for overnight: 9PM to 6AM 
pi@rpi06:~ $ cat schedules/010-workday  
# This is the monday-friday workday schedule for summer. 
 6:30- 8:00=80 
     -16:30=92 # While we're away for the day 
     -20:00=82 # When we're home 
     -21:00=80 # Gradually decreasing for bedtime 
pi@rpi06:~ $ cat schedules/011-weekend  
# The saturday/sunday summer schedule 
 6:30-11:30=80 # Stay cool for the morning 
     -18:00=84 # Moderately cool for the afternoon 

This is a hypothetical user, not me. Please don’t rob me while I’m away from home.

There are three files here, specifying the “overnight” schedule, the workday schedule, and the weekend schedule, respectively (and, they apply in that order). Note how the overnight schedule applies to all days, but only specifies temperatures from 9:00PM to 6:00AM, whereas the workday and weekday schedules both start at 6:30AM. This means that 6:00AM to 6:30AM is unspecified. In this case, the default is to leave the thermostat as it was (the goal there being to change the thermostat as little as possible).

This schedule system works pretty well – it allows day-level granularity, while also not duplicating schedules unnecessarily (notice how above, the night schedule is only specified once). It also allows temporarily dropping in a new schedule file, if I (for example) go on vacation for a few weeks.

However, it doesn’t account for one thing very well: events and outings. Sure, whenever I go somewhere I could drop a temporary “100-sallys-party” file in, but that requires me to know in advance when I’ll get home (if I want to cool my apartment off before I get back).

Introducing the notion of “holds.” A hold is just a temperature for a one-time range – for example, hold 92 degrees (i.e. turn off the A/C) until 6:00PM today.

This doesn’t immediately solve the problem, except with the addition of two things: The smart home controller and a cellphone.

The smart home controller is just a Pi with a touchscreen mounted next to my door (it isn’t mounted yet, hence no picture). The touchscreen shows some useful facts, like the time and the temperature and the forecast, but it also has a button that says “Leave”, which when pressed submits a 92-degree hold for several thousand hours (effectively forever). This means as I walk out the door I can turn off the A/C with a single press of the button.

That’s handy, but then to solve the opposite problem (cooling down the apartment on my way home) we turn to the wonderful API from Twilio.

Twilio lets you setup a fully featured voice (or SMS) app using nothing but a few bucks and a PHP server. When your phone number receives an incoming call, they send a request to your webserver to figure out what to do, and that goes back and forth (they have excellent documentation you can check out). You can configure it to do the whole “press a button for a menu” deal, so that’s what I did. Now I have a lovely British lady in my speed dial that I can call to cancel a hold (or, receive a weather forecast for the next day).

So that’s it. Press a button when I walk out the door, make a 15 second phone call when I’m heading back. It’s a perfect system.

Well, except for one thing. I haven’t discussed the webcam setup.

Partially because the webcam is much less elegant. Much, much less elegant.

Basically, it can be summed up by: Every minute, the Raspberry Pi captures an image with the webcam (script in a crontab). Every 15 minutes, the Raspberry Pi processes all of the images to read the current temperature and whether the A/C was running.

The image processing script works by comparing the average brightness of fixed regions in the image. For example, I’ve hard coded the position of each of the seven segments within the image. The reason for this is a) it works and b) I don’t have enough test data to come up with a cool machine learning algorithm to do it any other way. The reason for both of these is that the webcam is fixed relative to the thermostat, so it works.

It’s just hackish.

To be completely fair, there is an auto-tuning script which will go through a bunch of labelled samples and figure out the right coefficients for comparing region brightnesses, but I still have to hand-code the locations of the regions.

Either way, once the data are computed, the Pi sends it off to a mongo server running on my main server.

I can query the mongo server to make cool graphs such as this one:

Which graphs the temperature inside my apartment against the time for the past few days.

There are still a few bugs left to work out in the vision system. For one, the data is a little hard to read since it comes back on integer degrees. For two, I recently hung a Star Wars poster above my couch, in the reflection of the webcam, which is causing some spurious readings. Sometimes it’s hard to predict where bugs will come from.

The source code is a bit gnarly, paths are hardcoded, and so on, so I haven’t posted it online, but it is open-source. In the sense that if you ask me for it, I’ll happily post it.


Posted in Uncategorized | Leave a comment

…and moved.

Welcome back to month two of Lane Kolbly’s “I have a blog, I should probably write in it, but I’m tired and doing other things so I’ll wait until the last possible minute.”

In my defense, I moved and there was a hurricane 100 miles away from where I lived. It was quite nice (I like rain, at least when I can curl up under a blanket and watch movies while it pours outside. I’m not so fond of interacting with the rain).

So I thought I’d take this time to briefly revisit a topic that’s dear to my heart, sexism in programming, and share an interesting epiphany I had about my psychology (though I’m neither a shrink nor very self aware, I think that’s the right way to say that).

Just to clarify, I think sexism is bad, it shouldn’t be practiced, if you’re given the choice.

A while ago, for a class, I wrote a blog post as an upper-middle-class white male theorizing on why women aren’t as prevalent in the Computer Sciences as men. Incidentally this also satisfied all of the requirements for my Psychology Ph.D.

Reading back through that post reminded me of this “Imagine The Possibilities” advertisement by Barbie: It’s an adorable ad, until the very end where it’s revealed that Mattel is actually saying “look at all the things a girl can be! In her head, that is. While playing with her dolls, which is her rightful place. In a few years she will be a fully grown woman, and can serve Totino’s pizza rolls.”

But I digress. In the lab at university, I’ve found myself to be quite sexist when it comes to programming, I don’t know if that’s good or bad. Whenever I meet someone talking about programming, if they are a guy I will require some burden of proof that they know what they know what they’re talking about. If they’re a girl, though, I generally automatically assume they are brilliant programmers (or, have the potential to be, if they go to Degobah).

This is opposite of most traditional sexism, so I’ve never understood where the traditional sexism comes from. I still don’t. But I think I understand where mine comes from.

I’ve met a decent number of people, male and female, in the Computer Science department. The males I’ve met are from all walks of life, and all skill levels. Common is the man who knows just enough to get by, or the one who’s just here for the money but they don’t really want to be here. Sure, there are any number of brilliant male programmers, but there are any number of not brilliant ones also (I place myself somewhere in the middle).

On the other hand, the females I’ve met are the ones that stuck around through all the industry sexism, and all that’s left for me to meet are females who excel and are passionate about programming. (realize that they could have been dissuaded from a very young age, or simply weren’t given the opportunity to try, I don’t mean that the ho-hum female programmers were in a CS program and then dropped out because they felt out of place)

The end result is there are three types of people I meet: brilliant male programmers, brilliant female programmers, and ho-hum male programmers. If I see a female programmer, I automatically put them into the brilliant category, because that’s what I grew up experiencing.

Which, to be honest, is I believe where most -isms come from. Being raised in a situation where there were a lot of good apples and one bad mango. You’ll associate all mangos with that one.

But, that is my story. Take it with salt, mull it over. The way to stop sexism is to see how it works, and think about it, and discuss it.

No, that doesn’t mean comments are now an open free-for-all (though I do receive submitted comments), go start your own dang blog. Or just tell me your thoughts next time you see me.



Posted in Uncategorized | Leave a comment

Moving In Three, Two, …

I’m back from Europe, then took a short jaunt up the road to Dallas with the family before changing gears.

I spent a few weeks cranking out pull requests for cuberite, a lightweight Minecraft server written in C++ (and so avoiding the myriad problems of Java). Being essentially a fan project run by a small core group, without any support from Mojang itself, the server is perpetually behind the curve of the latest features Microsoft has released. Being a clean-room design, a lot of the weird intricacies don’t carry over from “vanilla” Minecraft – many subtle bugs that were exploited to build machines in the original don’t work here.

But, minigames (games built within Minecraft) don’t care about this sort of thing, generally. They care about things like armor and swords and hitpoints. These are often played on multi-thousand player commercial servers, where performance is the chief concern. Cuberite fits this niche exactly, in my mind.

So I’ve started a project to build a decent minigame in cuberite. Along the way I’ve been submitting PRs on GitHub (and you can, too).

If you’re into programming, it’s good to contribute to open-source projects. It helps you hone your skills, and you have fun along the way. I do it for the latter, mostly. For the former, it helps you hone the skills you don’t learn from a classroom, that are crucial for any real work. The ability to dive into a pre-existing codebase, and build a feature, I’ve found is not often taught (nor, really, can it be, not directly).

If you’re not into programming, submitting PRs just means I’m contributing my time and code to the common cause for fun. Yes, I enjoy my work.

In the midst of all of this coding, I’ve also been packing up to move out. I’ve lived with my parents my entire life (well, my Mother), now I have an apartment closer to where I’ll work (I start work in September). This entails much furniture shopping, etc., which is why this July post was posted on the 31st at 11P.M.

Busy, busy, busy. Just the way I like it.


Posted in Uncategorized | Leave a comment

Day 25: This is the end…

I didn’t want to tempt the travel gods, so I didn’t plan on writing about day 25, the day we go home. So I won’t.

Not that it was eventful – we woke up early, around 6:45 Munich time, and took trains and planes until we fell asleep in Austin at bedtime, around 4:30 Munich time.

I got a stuffed bear hat, so that helped pass the time.

But I will use this post to summarize the trip. As a whole, the trip was, as my brother would say, “pretty rad” (as in “radical”, or he would call it “lit”, as in “that’s lit”). I would call the trip “rad potatoes” (as in, “the trip to Europe was rad potatoes”).

T-shirts are being made, of course.

The trip was fast-paced, sleeping in 4 countries in as many weeks. This was as interesting as it was exhausting. We got to compare the different countries, and we got to see the highlights of each country.

Being a fast survey trip, every country deserves more time. Even a trip of their own. My Grandparents (mother’s side) did a thing where every year they traveled to a different European country.

As they got older the countries got more obscure, of course.

Maybe I could do that.

Regardless, we got to scratch the surface of a lot of different countries. This was the goal.

The goal was accomplished. Fun was had by all. I rate the trip 5 out of 5 stars, would go again.

A quick note on the pictures: Most of the pictures were taken with a Canon Rebel DSLR. By the end of the trip that camera had taken just over 3,800 pictures. Also, every was equipped with a smart phone that had a camera, and collectively around 2,000 pictures were taken with those, for a total of about 6,000 pictures (about 240 per day, taking up 160GB of storage).

Of these, there are about 218 pictures in these blog posts.

Generally, the blog posts were written in several stages, not always in real-time-order. First, at the end of the day I would create the post, with the title and a short note about what happened that day (it became surprisingly hard to remember what happened the day before, let alone several days before). Then, every few days I would sit down and write all of the blog posts up to that day. After I’d written all the words for all the posts, we would download the photos from the camera, and I would add them to the blog post, adding more words to make the pictures make sense.

In general, Ellen, Jason, and I would separate from Dad, Kayla, and Ryan, and only one group would have the camera (usually they had it in museums, and we had it the rest of the time). Thus sometimes the pictures don’t quite match my experience (for example, in the Deuches Museum, they didn’t visit the astronomy section so there are no pictures of it).

Anyway, here’s a table-of-contents of all the posts, with a short summary for each. Also note that these posts were published in-order, with nothing in-between them, so you can click the previous/next links on each page to read the next day’s entry.

Day 1: Austin to London. The Kolbly family boards a plane for the adventure of their lifetimes.

Day 2: Frankfurt, Dusseldorf, and London. The crew awakens several hundred miles from London, and has to find their way.

Day 3: Sex and the City. After arriving in London, the family goes to a candy store to find chocolate. But the candy store is not as it seems.

Day 4: Modern Art, and the Confluence of Round. Trapped in a modern art museum for hours, the younger boys find a way to keep themselves entertained.

Day 5: Friends Seen Long Ago, Artifacts From Long Before. The game is on for the family as they visit the exterior filming location for the Sherlock series.

Day 6: Paris, but like with an accent. The family takes a train to Paris. But when they arrive, will they be able to find food?

Day 7: Triomphing over the Eiffel Tower. After a night of hard rock, the family decides to visit the iconic Paris landmarks.

Day 8: Don’t you Louvre my baby. Time is running out as the family races through the largest art museum in the world.

Day 9: Rest, and Relaxation. Will the family be able to figure out how to use the washer in time?

Day 10: The Thinker, The Kiss, and All the Arts. The family is ready for more art, and the youngest boys reveal a hidden talent.

Day 11: Notre Dame and The Oranges. On their last day in Paris, the family tries to cram in as many iconic locations as they can.

Day 12: Montreux. The family rents a car to drive through the alps, and find out that European streets are not the same as American streets.

Day 13: Montreux, Part Deux. The family meets up with a local girl and visits the Callier factory and the Giger cafe.

Day 14: European Council for Nuclear Research. After visiting Mecca, Jason wants to swim, but can he take the cold?

Day 15: Up. The Italian driving stereotype turns out not to be a stereotype.

Day 16: Our Lot. After stopping in Pisa, events seem to go south for the family.

Day 17: My Own Room. Relieved at getting room to sleep in, the family tours Florence in an afternoon.

Day 18: Wine Country. Arriving in Verona the family finds beauty in the rolling hills.

Day 19: Venice. Resting in the hill country, the family decides to find as much gelato as possible in Venice.

Day 20: Goodbye, Italy. The family marvels at the differences between Italy and Germany.

Day 21: Beers, Boobs, and Pretzels. The Kolbly family gets drunk on beer and coca-cola.

Day 22: All The Crazies. The family is slowly going crazy from exhaustion, when they visit the castle of a reclusive king.

Day 23: Into The Fountain…. A day full of shopping and water fountains.

Day 24: She Blinded Me! With Science! On their last day in Europe, the family tours a local science museum.

Day 25: This is the end…. The season finale finds the family safe in Austin.


Posted in Uncategorized | Leave a comment

Day 24: She Blinded Me! With Science!

Today, our last full day in Munich (and our last full day in Europe), we visited the Deutches Museum. That’s the museum that sits on the island in the river through town. It’s essentially a science and tech museum. Our AirBnB host, David Tennant, said it was a long museum. He was right. We got through only a fraction of it.

I would recommend spending at least a full 8 hours there. We only spent 4 hours, and it was not enough for all of the science.

Ellen, Jason, and I split off from the others, since we usually do. That’s our mojo.

There were exhibits of all sorts. There was a boat exhibit, where they had cut an actual sailing ship in half to show what it looked like inside.

There was a steam engine exhibit, which showed off those giant old-timey cast-iron steam engines which filled a room, created a never-before-heard amount of noise, and were as powerful as a modern lawnmower.

There was an astronomy exhibit, which I think was Ellen’s favorite. It might have been my favorite as well, I have a small past in astronomy.

I’ve mentioned this before, but the museums here in Europe seem better (and more hands-on). I noticed in the astronomy section at Deutches, they had a bunch of exhibits on things like how light splits into colors and how stars have different temperatures and brightness and on Hertzsprung-Russell diagrams. But they order the exhibits so that it’s natural to walk through them in that order – where you learn about the concepts in the same order that humanity did (H-R diagrams make no sense if you don’t know much about star color or size. They sort the stars into classes based on their color and size). Maybe I just don’t visit enough museums in the U.S., or just haven’t noticed it until now.

The exhibits are arranged in a way to actually effectively teach you a rough outline of astronomy, and they aren’t arranged randomly with one of the exhibits being “history of astronomy.” Granted, just because they’re ordered in a smart way doesn’t mean that we didn’t walk through them backwards. It was slightly confusing.

After the astronomy section, we wandered down to the power line section.

Yes, there was a whole section on power lines.

To be fair, it was under the guise of electricity in general, but it was mostly filled with undersea cables and high voltage transformers.

There they also had an electricity demonstration every few hours, where they charged up some tesla coils and zapped some things. I don’t know what they were demonstrating, since they spoke in German, but it certainly seemed cool.

I also don’t know German for “cover your ears,” but I just covered my ears whenever everyone else did.

At the end of the day, the science museum was a pretty neat way to end the trip.


Posted in Uncategorized | Leave a comment

Day 23: Into The Fountain…

We had no distinct plan for today, other than rest and take it easy. We slept in, played cards, played video games, and so forth until around one or so when we all left to go shopping.

Generally when I travel I like to do a electronic-detox strategy, since I spend so much time connected in the rest of my life (being a programmer). This is why I’m highly unresponsive to e-mail (or however it is people try to contact me). But I’m writing this on the Internet with a laptop, so I’m doing it a little less hardcore this trip. Hence the occasional video game.

Anyway, Dad and Kayla left to return the car this morning, which I hear was an adventure. Remember, the car we had picked up from Avis in Lyon broke down in Pisa and ended up at a local garage, so we got another car. When they showed up at the Avis drop off (which was not trivial – it was hidden, and the garage entrance was too short for the full-sized van), the Avis reps weren’t expecting a van. Apparently the key wasn’t even a Avis key. Eventually Dad and Kayla managed to convince them that it was their van, and they wrote us a receipt.

Hopefully that’s the last we hear of that, and Avis doesn’t come knocking in a few weeks asking “so… where’s that Renault we lent you?”

After they got back, they wanted to go shopping, and I didn’t want to sit around all day, so we all set off to the train station, which is apparently tourist central. We found a place to eat while Kayla went off shopping for things for her classroom (she teaches German at a college, so she’s been collecting tidbits for her classroom along the way. She’s also been our German translator – where in the other countries we communicated by grunting, here we can actually communicate with people).

On the way we came across a statue of Juliet, from Romeo and Juliet. Apparently there’s a tradition where you grab her right breast, whether for luck I don’t know. We know it’s a thing, because other people did it and while she is entirely green, from the rust, her breast has been polished by hundreds of years of groping.

It gets creepier once you realize that in the play, Juliet is thirteen years old.

Anyway, we had lunch at a film cafe, which is essentially a restaurant that’s movie-themed. They had a James Bond-themed salad menu, with such salads as the “Goldfinger” salad or the “Octopussy” salad (I don’t know why they thought salads were quintessentially Bond).

In keeping with the movie theme, I did my Princess Leia impression.

For dessert us three boys all had Emma Stone.

(Emma Stone is what they call three scoops of ice cream with whipped cream on top)

We were to meet Kayla by a fountain, so we spent a few minutes there. We saw a dog playing in the fountain, and then we had an idea…

First, we had to don some sunglasses, to exude coolness.

Then we emerged from the mist like action heroes.

Posted in Uncategorized | Leave a comment

Day 22: All The Crazies

I think either 21 days is the perfect length for a vacation, or I need to take a break at some point. Even Jason says I seem tired, and that’s the pot calling the kettle black.

So while we’re all slowly going crazy, and having a great time doing it, a long time ago there was a king, King Ludwig, who through various political twists and turns in the mid-to-late-1800s had and lost political power. When he lost it, he too went crazy and claimed a mountain has his own and built a castle on it, modeling it after the castles of the medieval times and exerting absolute power over the region.

Today, millions of people visit Neuschwanstein every year. Disney used it as an inspiration for the Cinderella castle (and Chillon was apparently the inspiration for the Sleeping Beauty castle, so that’s two we’ve visited).

They don’t permit photographs inside the Neuschwanstein, so there’s a dearth of photos today.

It was interesting to visit someone’s copy of a medieval castle after visiting an actual medieval castle. Some things got lost in translation. The general architecture, the exterior lines and the vaulted ceilings, were largely retained. However, the practicality found in the castle Chillon was lost in translation. While the doors and stairways did become larger, sometimes the spiral staircases spiraled the wrong way (spiral staircases spiral one particular way, to hinder attackers coming up while swinging a sword). The windows had beveled interior edges, as if they were archery posts, but the windows were wide so the bevels didn’t give archers any extra elbow room.

This is fine, though, because the castle was never functional as a castle. It was only barely functional as a palace, Ludwig only stayed there a handful of days before he died. Much of the castle was never completed, he died in debt and construction was largely abandoned.

We can only access the inside the castle via guided tours with no photographs allowed, so my descriptions will have to suffice.

The castle can be described in two terms: it’s inspired by the knights of the round table, and Ludwig liked swans. Throughout the castle are murals of the exploits of the round table, with random swans added in. One depicted a knight crossing a river in a boat to meet some people. The boat was being pulled by a swan.

One room had over 170 paintings and engravings of swans.

Another room had a life-sized porcelain swan, which was hollowed out to serve as a flower vase.

After the tour, we went out on a balcony that overlooked the valley, and admired the beauty of the scenery. The mountain range stretched into the haze, fading into silhouettes before smoothly fading into the gray horizon in the distance. Below several lakes were nestled in between the mountains, their waters reflecting the setting sun.

Worth going, if only for the view.

The castle sits on a foothill that’s immediately before the mountains, with a dramatic gorge going up into them. Where there’s a gorge, there’s a waterfall.

Here there were several, threading their way through the hills.


Posted in Uncategorized | Leave a comment

Day 21: Beers, Boobs, and Pretzels

I saw a postcard today that was of a buxom lady, framed on her chest, holding a beer in one hand and a pretzel in the other. I felt like it decently well summarized the day.

The beer comes from when we went to the beer garden for lunch and the haufbierhouse for dinner/afternoon snack. They served pretzels at both of these locations.

The boobs, of course, come from the unusually high number of erotic shops we walked by.

Welcome to Germany, I guess.

We didn’t have any distinct plans for the day, other than wander around the nearby city. Around 11 we set out to forage for lunch, walking across the brook by our house to the courtyard of the Deutches Museum to the other side of the river. There was a beach on the river, complete with sand and waves. After the cold water of Lake Geneva, Jason seemed a little less excited to go to this beach, perhaps afraid it would be cold as well.

One thing I’ve seen throughout Munich (and a few places in Florence as well) is padlocks with peoples names on them padlocked to bridges. A strange declaration of love, I’ve always thought, but one that we’ve come across from time to time. And here in Munich the padlocks are spread out geographically – they aren’t all put in a single bridge, but there’s generally a half dozen on every bridge we walk across.

Halfway across the river, on a river-island, is a technology museum called the Deutches Museum. We didn’t go in, but based on the things they had in the courtyard, we decided that we simply had to go at some point. Admission is cheapest on Sundays, we’re planning to go then.

Finding food that was acceptable to everyone was no easy task. We discussed at least four different places, but with Kayla vetoing pizza, the younger three only eating pizza and American steak, me only willing to try European foods, and Dad wanting a traditional German breakfast, finding a place became difficult.

We did walk by a Pizza Hut. The word “hut” in German translates to “hat” in English, and Pizza Hut’s logo is a hat. So Germans read it as “Pizza Hat.”

We did eventually find a beer garden everyone agreed on (well, the older three. The younger three didn’t have a choice). I had a currywurst, which is essentially a giant hot dog covered in a slightly spicy ketchup (technically it’s a sausage, but the texture was more hot dog than sausage).

I thought it would be the wurst, but it actually ended up being my favorite food of the trip so far. (Just kidding, I actually thought it would be pretty good)

Yes, it even surpassed the many Italian pizzas we’ve had so far. And I’m quite the pizza aficionado.

Afterward, we wandered down to an old cathedral, built in a characteristic super ornate gothic style. It had a clock on it, which at noon and five some marionettes came out and did a performance detailing the marriage of a royal family as well as the end of the Black Plague.

A strange juxtaposition, to be sure, although technically both are things to celebrate.

We arrived shortly after the noon performance, so we decided to come back for the 5:00 show. We headed through a market, looking at some of the wares they had, and then split into two groups: Kayla, Ellen, and I stayed in a bookstore and looked at postcards while the other three went back to the apartment for water and rest.

It turns out they have the same respect for Donald Trump as we do back in the states.

Along the way we saw a street performer playing with cups of water. As in, a table full of water cups filled to varying levels were his instrument. Ryan was quite impressed by the feat – in school a few semesters ago he had built a similar instrument, albeit with fewer water cups.

Here in Germany there’s a lot more public water fountains. Not the ones in America where you push the button and get a tiny stream of almost-boiling water. These are a continuous stream of cold, refreshing, drinkable water. On the hot day that it was, it was nice just to splash some cold water on your face. We also tried to drink from it, since we were pretty thirsty, but ultimately mostly failed in catching the water in our hands and bringing it to our mouths.

Despite the failure, we still had fun trying.

There’s also a lot more children in the streets, it seems, and groups of people in general (up to about college-aged). In Italy there were a lot of couples, but here children seem to be the rule. I suppose they’re less lazy here than in other places, like the U.S.

The marionette show was nifty – some marionettes went in a circle, and some knight marionettes jousted and (spoiler alert) the red one lost.

The other three joined us immediately after the show, as they had arrived from the apartment just as the show ended. We decided we’d have to come back another day.

After they joined us we decided to go to the haufbeerhouse (I’m largely unfamiliar with German, so I have trouble remembering the names of things, unlike with the romantic languages we’ve been immersed in so far).

At time of adding pictures, I’ve learned that it’s actually spelled Hofbräuhaus. (these diaries are written in stages – the day of, I create the post and add a few random notes so I remember which day it was, which is surprisingly hard. Then a few days later, generally two or three, I write the post. Then I go back later and add pictures, usually adding more words to go with the pictures.)

The Hofbräuhaus was, essentially, a giant hall in which people drank beer and ate pretzels. The noise was deafening. I’m a loud person normally, especially when I get excited, but even I had to speak up to be heard. It was arranged a bit like Hogwarts, with long wooden tables laid out under the arching ceiling. People in blue dresses walked around holding pretzels high in the air, selling giant pretzels to any who wanted one.

We sat down, and the four of us children ordered cokes – I’m not really a fan of the taste of alcohol. We got coke in half-liter steins, though, so we still got the experience. Dad and Kayla got beer in even bigger steins.

The noise was deafening, but once the indoor tuba band started playing traditional German drinking songs I thought it would be impossible to maintain a normal conversation. A friend of Kayla’s met us, and the two of them yelled at each other over the table while we played cards.

Dad and Ryan left eventually, to renew the parking and get some rest, so the remaining four of us hung out for a bit.

Apparently it’s traditional to carve your name into the table. So we did. Apparently some of the tables are the original tables from several hundred years ago, so it was like carving our names into the Pantheon.

Drunk on a liter of coke (we eventually got seconds), we started taking some silly pictures of each other. I don’t know if that’s traditional, maybe it should become traditional.

On the way back to our house, we ran across a club called “Distorted People.” Its logo was a razor and a meat cleaver.

That pretty much filled up our creepiness quotient for the day.


Posted in Uncategorized | Leave a comment