Training Jam 2016 post-mortem

Sunday was the final day of the inaugural Training Jam event. A not-quite-two-day game-creating jam hosted by OpenSesame, a curator/marketplace for electronic learning solutions. It took place at DeskHub, an office-location-for-rent that serves small businesses and startups with a place to share, and stake out some desks for your team, with conference rooms and teleconferencing equipment, and a decent break area with plenty of supplies for coffee, food, etc. The staff from OpenSesame kept us fed with excellent catered meals, and lots of soda, water bottles, and energy drinks. They were also extremely helpful and encouraging to the jammers. The overall energy was very positive and uplifting.

The challenge was to use the time to create games that teach—training that’s “not training”. Not simply “gamified” training solutions, but games that are fun to play, and while you’re playing you just happen to come out of it with solid, usable knowledge. Check-in was Friday at 6, but the event kicked off with a keynote at 7, so actual coding (well… conceptualizing) probably started at 7:30-ish, at which point the five themes to choose from were revealed. Pencils-down happened at 2pm Sunday, so we were really about 5½ hours short of 2 days available to write a game-that-trains from start to finish.

The themes available were chosen based on the top-selling elearning courses at OpenSesame, and had to do with things like work safety, time management, and customer support. I teamed up with my buddy Randy, who created the artwork for the game while I did the code, and we chose Fire Extinguisher Safety as our theme.

Rather than cover the entire range of information that comprises a complete training in that topic, which among other things would require that we essentially take the training and slap “game-like” things on it—contrary to the spirit and intention of the program—we chose to concentrate on matching the correct type of fire extinguisher to various classes of fire (from sources such as wood, grease/oil, or combustible metals).

A screenshot from the finished Training Jam game.

We decided to create an arcade shoot-em-up game that caricatures reality with moving/reacting blazing fire “baddies”, against which you would use different extinguishers as appropriate. Grease fires and a magnesium fire would react very poorly to being extinguished with water-based solutions, and choosing the right tool for the job would become crucial. Up-front instruction would be minimal, relying on the gameplay itself to teach which tools work best. Of course, some amount of textual instruction is unavoidable: using an inappropriate device would produce dire consequences (or at least be less effective than another choice), but also the game would pause momentarily as the game advises the user about the reason for the poor reaction, and advice on making better choices in extinguishing devices.

Alas, pretty much none of that made into the product we wound up with at the end of ~42 hours. You can try it out here (note, the initial loading time will take several seconds). There’s not much to it. You can move your extinguisher guy around using AWSD (or the arrow keys), and swap between devices with the Tab key. You can’t actually activate the extinguisher in any way, and the baddies fire off at you and then just bounce around the screen slowly, never hurting you. If you hit Backspace, you’ll instantly kil the fire (wherever it may be, and regardless of what device you’re using. There simply wasn’t time to get more into the game.

I think Randy and I are a bit disappointed with the lack of features we wanted to get in, but are nonetheless happy that we learned a lot in the process, and are happy that we at least managed to have something coherent to show to the judges. Randy got all the basic art that we needed done (and did a good job of it!), though he definitely needed all the time leading up to the end, but I was a bit slow with the code, and couldn’t do everything we hoped to with the assets we had (though we did use all the assets he created).

Both of us struggled a lot with making progress on Saturday, the only full day available for working, and the day we actually started coding (as Friday night was spent finalizing our plans). For my part, I was using an existing code base I’d created for some other games I’ve been working on, but one basic piece of functionality needed to be added to it (panning a camera over a larger playing field—so far I’d only been writing single-screen games), and struggles with other pieces of the code slowed me down considerably (basically, it turns out my experiment with enforced unit-measurement types in JavaScript ultimately causes more problems than it solves, at least where timeliness is concerned—it needs to be something more ingrained into the language—switching back and forth between simple numbers and the unit typing was the source of too many points of failure).

On Randy’s part, he was using graphical tools (GIMP and Blender3D) that weren’t terribly familiar to him, and was struggling with their many idiosyncrasies. Blender3D can be particularly frustrating to deal with, as they change their UI quite often, so any documentation you find is guaranteed not to map quite right with the version you happen to be using. By the end of Saturday he had become much more comfortable with his tools, and I with mine, but by then there was precious little time remaining to get the bulk of the work done.

It was an excellent learning experience for me, though. Clearly, it was unwise to put myself in a situation with extreme time constraints, and then be building not only the game itself, but also still much of the underlying engine as well. In the future I’d really do well to use only a preexisting engine that has all the features I’ll need it to have , and with which I already have the familiarity I’ll need to make it do what I need it to, without scouring the docs to solve puzzles (or, perhaps, to work around by not using such features in the first place—we’d have been much more productive if I’d just gone with another single-screen game like my others, since avoiding that spent way too many precious hours on Saturday).

OTOH, the time pressure of game jams, and the challenge it presents, is an excellent way to motivate me to learn new tools and technologies, and get familiar with things I’d been meaning to learn about. That’s certainly what happened with my first game jam, which was my first venture into using HTML5 to create a game. And unlike some of the other contestants in jams like these, I’m not really in it to win anything or gain notoriety; I just enjoy the challenge, and find it a fun time (stressful, but fun).

I think I’ve also finally found my breaking point with using pure JavaScript for the logic. I think I may well focus my future game-making efforts on using Elm to code with. Having a proper, strict type system prevents so many accidental goofs in code, and going without them in JavaScript can get to be a real pain (in particular, the existence of null, or passing an object of the wrong type, or an object that lacks properties it’s meant to have had—such things are impossible in Elm). The purely functional nature of it also greatly aids debugging—which is all the more enhanced by Elm features such as the Time-Traveling Debugger feature, which allows you to step back and replay the state as it changed over time, to see what was going wrong. You can also modify the code on the fly as it’s running (and not just modifying variables as in JS), to see how things change. It’s also more concise and readable than JavaScript, so it’s basically win-win-win-win.

There are some things about Elm I’m decidedly not a fan of… it lends itself to a style of web development that I rather detest, which is when all of the actual substantive content of a page is not to be found in the HTML, but is generated/produced by JavaScript. (The Elm site itself is an excellent example of this.) This is decidedly unfriendly to a host of useful web tools, and the spirit of the web as seen by many of those who were instrumental in bringing it about. But for game programming? I believe it’ll be great. The only thing I’m not entirely certain of is how easy it’ll be to control image preloading… but I’m certain that can be hacked in if absolutely necessary, and meanwhile the other features aiding more rapid productivity are sure to be a boon.

Update (the next morning): Or maybe PureScript instead. I really like the elegance of Elm’s FRP approach; but maybe not so much as I’m likely to miss Haskell features like typeclasses or equivalent tools for ad-hoc polymorphism (that is, using a single function definition to work with many different types that share certain characteristics). PureScript has the same strong typing guarantees that make Elm attractive, though it lacks the awesome debugger. Maybe I’ll just try making or rewriting some of my games in each language before I settle on one.

Elm totally plans on adding typeclasses or something that solves the same problems. But it’s not there at the moment, and I expect that’s going to be hard. It certainly makes it much harder for me to visualize how I’m going to treat, for example, a wide selection of various sprites with different behaviors, as variants of the same thing. Perhaps has-a instead of is-a relationships may save me, but I think I’d have to play around with it more to know for sure.

One thing I really, really like about my current pure-JavaScript engine, is that my sprites are defined in a simple, declarative style:

I can just plop in new behaviors in there to change the movement and features, and AI, of sprites. It works using closures, and is really powerful – but of course it works by mutating underlying data in the object that calls them (particularly, coordinates and velocity values). If I can find a way to do things in a similarly convenient way in Elm or PureScript, I will. I obviously can’t do it this way, but Pure functional languages are often this succinct as a natural product of their purity, so I may gain as much as I lose.

StarfishJS

I’ve finished porting a substantial chunk of (now completely) my friend Mars Saxman‘s Starfish—a C program for generating seamlessly tiled procedurally-generated wallpapers—into HTML5/JavaScript. You can try it out here, or there are some samples of some of the wallpaper tiles it has generated:

turvey-green-cream-dunes fuscia-avocado-storm regal-age blue-glisten

The original program has five different image-generating algorithms, that are chosen at random, coloried and layered one upon another; my current JavaScript port has only three of the original algorithms (one of them modified), but I’m already so pleased with the results I decided to post the program as it currently stands. I’ll probably get the remaining two image generators ported in the next week (Starfish’s C code is surprisingly easy to adapt into JavaScript). (StarfishJS now has all the layer-generators of the original. Some of them have been modified to my taste.)

If you want a little peak under the hood, you can see the individual image-generating algorithms at play: the three generators currently available are Coswave, Spinflake, Rangefrac, Flatwave, and Bubble.

The image generators all operate in monochrome values, and translated into color later. Some of the generated images aren’t displayed directly, but instead are used to hide/reveal pixels of other layers.

A units-of-measure implementation in JavaScript

I made something kinda interesting this week in JavaScript. It probably qualifies as “over-engineering”, but it was for my use, to meet my needs, and I had making it, and I’m having fun using it (so there! :-p).

It’s an implementation of measurable units of various types that I tend to use in my recent JavaScript-games-making excursions: such as seconds, milliseconds, pixels, radians, and frames. It lets you express that quantities are in rad/s, f/s, px/s^2 (for acceleration values), etc, and convert between them via multiplication and division (px/s divided by a time value results in px/s^2 (pixels-per-second-per-second), or if multiplied produces a value in number-of-pixels). It throws an error if you mix up which units you meant to use, which helps enforce the sanity of the arithmetic you’re performing.

Usage looks something like this:

The reason for this little library is that I’ve frequently run into problems thinking in the wrong units in my games. One variable might hold a length of time in seconds, another in milliseconds (from new Date()), and I’ll try to use them together, forgetting to convert between them. In MajicUnits, they’re all represented in seconds under the hood, and I can specify what unit I want when pulling them back out.

Or I often forget to scale a velocity or acceleration by the inter-frame time before adding to current state, resulting in a full second’s acceleration taking place in a single frame. Using MajicUnits, I’ll see an exception thrown if I forget to multiply by the frame delta.

It’s the sort of stupid error that led to NASA losing its $125 mil Mars orbiter because one group coded for metric units while another used imperial. If you have a language to express (and enforce!) unit types being used, you’ll catch the problem. Better, of course, if you can do it at compile-time, without requiring the offending code to run before you can catch it, but this is JavaScript, and writing my own to-JavaScript compiler that adds units of measure as strictly-enforced types at the language level would be really drastically over-engineering. 🙂

The library’s pretty crude at the moment: I’ve coded exactly as much as I need for the moment. There are places you could feed it bad input and break its assumptions. It automatically creates plural versions of your added units, adding ‘es’ if it ends in ‘s’, otherwise adding ‘s’. That obviously wouldn’t work with ‘activity’ (-> ‘activitys’), and can’t handle exceptions like ‘forum’ -> ‘fora’ or something. Rather than have an automatic pluralizer, I should be having the user explicitly specify when they register the unit… (All of the above is no longer accurate.)

A bigger problem is that when an exception is thrown I can’t currently just find what line of code went wrong. I throw an Error object (which includes file and line number info), but it points at the place inside the library that threw the exception, rather than at the failing invocation that caused the exception. Most implementations of Error provide some sort of stacktrace, so perhaps I can generate one and then turn it into a string that includes that stacktrace info… because when it comes out on my Firefox console I don’t get the stacktrace currently. Anyway.

You can see the current implementation (as of this writing) here (UPDATED), if you’re curious and/or masochistic (it does some magic with JS prototypes to do its job, and lacks any useful documentation/comments, though I plan to add some).

It’s written as one part of this game Gate Arena that I’ve been working on lately, but am rewriting to emphasize a more declarative style of expressing objects and logic and their relationships, to increase code reuse and the ease of adding new enemy types, etc. I plan to reuse the resulting engine for further games, increasing my flexibility for participation in game jams and whatnot.

What’s Wrong with the Star Wars Prequels?

This was in response to a question by my brother Tim on his Facebook feed. Putting it here because it should be somewhere more permanent than a Facebook comment. Here’s his post:

I don’t get why the Star Wars episodes 1-3 are so frowned upon. I honestly loved them and thought Hayden Christensen did a good job as Anikin. However I totally understand the annoyingness of Jar Jar Binks and a few other cheesy qwerks but in all, I’ve always enjoyed them. I mean I was born just a couple years before The Phantom Menace was released… so I grew up with the originals and the prequel influencing my imagination and it was all fun. But of course nothing beats the originals.

Okay, so here’s the deal, to me. The original Star Wars certainly had its share of bad actors (I’m looking at you, Mark Hamill) and a few groaners of its own. But the story, and the universe, was completely unique, and compelling, and often kept you guessing at what would happen. It might not be the best story ever, but it’s damn good anyway, and when you throw in jaw-droppingly good production values (especially considering when it was made), it puts it well out of orbit. Nothing else could even remotely compare with how great Star Wars was, for _decades_.

And it had mystery, and a space-age version of an age of samurai, and the mystery and power of the force.

As to the prequel trilogy, where to begin? The story, you could pick a random junior higher who could tell a story about as compelling, and with the same competence.

The production? Despite vastly more resources to spend, and decades of progress in technology, most of the special effects are clearly _inferior_ to what was in the original trilogy. If the original trilogy was well past state-of-the art, the prequels were well under the line. Before it came out, I’d _already_ seen much better production than they offered me, and had been seeing it for years. CGI in those years was popular, but still not really ready yet for something like this, and it showed. And there were people doing it better than Lucas did. Maybe not by much, but at any rate, it didn’t have the jaw-dropping factor the earlier stuff did, relative to what else was available at the time. Hell, the original trilogy _still_ looks amazing to me (and would look better still if Lucas hadn’t tried to add all those other effects in after the fact. :-P)

I’ll skip over the acting, and just talk about the characters. NO depth whatsoever, especially for Anakin, who is literally a bag full of teen angst, hormones, and NOTHING else. Well, okay… midichlorians, too. So many situations were so cliche, and EVERYTHING, you just see EVERYTHING coming miles and miles and miles away. Except maybe for his sudden rampaging, against the sand people and those in the Jedi Academy, and the fact that there was no real hesitation in either case… he went from angsty and manipulated to purely and devotedly evil so fast it made my head spin. He never, at any point in the second and third movies, showed even the barest ounce of self control in anything he did, which just makes him one of the douchiest protagonists I’ve ever seen. And completely prevents me from ever feeling any real empathy for him, which is a pretty major flaw in a series that seems to at least be trying to drum that up.

You lose both the samurai feel of the Jedi, and the mystery of the force. It’s just “weird science” now, the super-powered micro-cells in your body exerting their supreme influence over the rest of the universe. Seems decidedly less universal (must not actually bind all things together if it’s only concentrated in those things that contain blood that could have midichlorians), and completely kills the mystery (especially since they don’t explore it any further than that, where you could doubtless find more mystery again). Also, something of a rip-off of both Madeleine L’engle’s “A Wind in the Door” (well, a bit anyway), and (especially) Square’s “Parasite Eve” game, which had already explored the “the separate cell-like organelles known as mitochondria in your body are really super-powered alien creatures whose full potential has yet to be discovered” theme in detail.

Forget Jar-Jar. Sure, he’s annoying, but he’s just a mildly sloppy attempt at slapstick humor. Far more grating to me, was C-3PO, particularly in the far-too-many-close-calls-to-be-credible-OR-funny factory, there and directly after, where he lets loose a string of the WORST puns ever, without even pausing long enough between them to let them breathe.

To be fair, by this point, the original Star Wars is put on too high a pedestal, and probably can’t get a fair treatment or critical eye. It’s far, far less compelling a story when you take away the brilliant production values… but it’d still probably be up there thanks to how much they lucked out with Harrison Ford, and also due to the fact that the characters themselves are written with at least some modicum of depth. The relationships have complexity, especially the love-triangle-light that Han, Luke, and Leia present. And the differences between how they view themselves, the masks they present to the world, and what they really reveal themselves to be, make them far more interesting than any given character in the prequel series, every one of whom is exactly who they appear to be at a glance.

Farewell to a Long-Held Email Address

I no longer have access to micah@cowan.name.
I now answer to micah@addictivecode.org

I’ve had the @cowan.name for over a decade. You’ll find Google search results for it up the wazoo, long-term mailing list and usenet activity, and it’s been my contact email throughout my tenure as a project maintainer for a few GNU projects… But it’s gone now. 🙁

Really boring technical explanation

Okay, so the .name TLD has been a really funky thing ever since it was started. For starters, you were originally only able to buy at the third level (john.smith.name, never *.smith.name). I bought micah.cowan.name and sara.cowan.name, but no one (at the time) could ever buy cowan.name—it was only sold at the third level.

Today, if no one has already bought at the third level, it’s permitted to buy at the second level. Which really just complicates spam filtering more than accomplishing anything else, because filters have a hard time telling whether to block everything coming from @smith.name, or just @john.smith.name.

Anyway, you could buy at the third domain level, but it would also automatically include appropriate email address forwarding to wherever you wanted, for (in my case) micah@cowan.name and sara@cowan.name.

I registered them ages ago, on register.com. But they’re rather expensive, and I finally got sick of paying way more than these domains are worth, so I transferred everything to another registrar, gandi.net, including those two.

I knew at the time that the new registrar didn’t handle administrating the email forwarding, but I figured as long as I left them at their current values, they’d be fine anyway.

Well, they both suddenly stopped working early on the morning of Thursday, 2014 April 16 (yesterday at the time of this writing). If they’d stayed at the former registrar, they would have expired last month, which seemed a little too coincidental.

After some digging, VeriSign, the administrators of the .name TLD, told me that while the new registrar did indeed have micah.cowan.name and sara.cowan.name, the email forwarding objects are separate, sort of “not-domains” domains, and would have had to have been explicitly requested as part of the transfer (but were not). So they remained with the former registrar (hidden from the UI, basically).

Register.com, AFAICT, no longer even has a UI for managing the email forwarding, but would hopefully have allowed me to change it by mailed request or something. But the whole thing’s a mess.

I could conceivably transfer the domains back to Register.com and ask them to reinstate the email forwarding (they’ll have expired, so probably re-request from Verisign, assuming no one else has bought those non-domain “domains” in the interim?) the email forwarding. I could also conceivably go to some cheaper registrar that handles .name forwarding (many today do not).

But all this seems time-consuming, by which point I’d probably already have gone a week or more without the address. If I’m already having to work around it, I might as well stick with it, especially if it’s liable to remain this cumbersome in the future.

So farewell, prized micah@cowan.name address of mine. You served me well, even if occasionally some web app or other would refuse to believe it was real, forcing me to use some alternative address instead.

The ordeal is quite a bit less of an obstacle for my wife (who had sara@cowan.name); she just used it for a few friends, and one or two online accounts. I’ve got hundreds of online accounts to sift through and change email for… 😕

Japan Trip, Days 1 and 2

(Pictures in this post are sparse; my photo album in Facebook is shared publicly, so provided you have an account, you can see the full set of pictures there.)

I’ve been wanting to make a trip to Japan since I first started learning the language 25 years ago. I’ve never even left North America. I’ve barely traveled a little ways into Canada, and a little ways into Mexico, and the last time I did either of those was when I was 18.

The high school student that stayed with our family for a year, Kanako Maezato, was graduating high school (has now graduated, at the time I’m writing this), and had asked us to come see her. We both wanted to come, but Japanese schools end after February, and of course our three kids are still in school, so it would have been difficult for us both to come. My wife Sara doesn’t like to travel alone, so I ended up coming by myself. I’m spending a week in Okinawa, where our homestay student lives (her family is hosting me), and then most of a week in Tokyo, with a weekend diversion in Osaka.

I decided not to mess around, and chose to fly with JAL, which has a reputation for being an excellent airline (they certainly lived up to it as far as I’m concerned).

While waiting for the plane to take me to Tokyo (where I spent one night before proceeding to Okinawa), I saw the flight attendants pass through the boarding area to the jet walkway. Each and every one of them, before entering, would turn and bow to the patrons seated. Which, at the time, was mostly just me, and maybe a couple other people, which was highly amusing, and probably made me feel a bit the VIP. 🙂

Aboard the plane, service was beyond exceptional. As expected, everything with a smile, but something I didn’t expect was that, between meal and snack and drink times, they would still be trawling the aisles on a regular basis, quietly presenting various conveniences, such as blankets or earplugs or eyemasks or a small tray of snacks with a couple drinks, on the off chance anyone felt the need for such a thing. You don’t really ever have to hit the assistance button (not even sure there was one? Didn’t see it up by the lights, where I’ve usually seen them before on airplanes), because they’re always just there when you need them.

Also, the meals on the flight were amazing. A variety of things to eat, all of which were good.

At one point in the flight the next day to Okinawa, they served a few candies. One of them tasted like mint and brown sugar, so I asked the flight attendant if that’s what it was, and she took the time to explain that it was and that it was an Okinawan specialty, and did I want some more? I politely declined, but she came back a few moments later with a little packet she’d prepared for me, with a couple more of those candies, and a couple other varieties as well.

Backing up to my first night, in Tokyo. I’d decided to rent a mobile phone and wifi hotspot for the duration of my stay in Japan, so I went to the store at the airport where that’s available. It was ridiculously easy. I gave them my credit card and passport (for ID), and filled out, like, a few lines on an application. They then explained to me that I would not be charged on the card until I brought back the devices, at which time they would charge the card for the rental fee, and any minutes I’d used on the phone (no charge for minutes or bandwidth on the hotspot device).

What. How… what?! That would never happen in America. You’d definitely pay a hefty deposit in advance for the devices, and probably in advance for the minutes too (prepaid?). At the very, very least, you’d pay for the minutes as you use them. Granted, that’d kind of suck, since the bank will charge a currency conversion fee, but no American company would ever be so trusting in their arrangements. Especially without a credit check. I’m not even sure how that can work for them – what if someone gave them their credit card info, and then proceeded to max that card out during their stay, and screwed them over when they returned? Even contesting the charge seems like it’d make things pretty difficult for the rental company, given how hard it is to pursue legal action and such things against someone in another country. I was completely amazed.

The hotel I was staying at was the Grand Park Hotel Panex (booking.com). I took a bus from the airport, but missed the stop (I recognized when it was coming, but stupidly forgot to hit the “please stop” button). So I had to get off a stop or two later, and catch a taxi back. It was under $3, though, because I was still relatively close (tipping is not expected in Japan, and sometimes considered insulting, so I didn’t add it).

The hotel’s elevators were annoying… the doors close, literally about three or four seconds after opening them. I had two large bags, and there was no “rushing” through those doors. They closed on me and my bags about three or four times as I got them out (both that night, and the next morning). Odd.

Once I arrived at my room, I could not for the life of me figure out how to turn any of the lights on. There was a small glowing panel (looked like a button, but wasn’t pushable) next to a switch that appeared to be for the room’s main light, but hitting the switch didn’t do anything. Bathroom light wouldn’t turn on either. It was midnight, so this wasn’t fun for me. There was some writing under that glowing panel, but the panel’s light was too dim to make out what it said.

keyfob inserted into slot, next to switchI found a (very convenient!) flashlight attached to the bedside, and brought that back to get a better look at the text. I figured out it was saying that I should insert the hotel keyfob (a long plastic stick thingy) into a slot in order to provide power to the room. If I couldn’t read Japanese at all, there would have been no possibility to avoid a call to the front desk to ask about the power (which would have been equally pointless, as the receptionist didn’t speak English anyway).

I really haven’t experienced any jet lag at all (this is my third day here). Probably because I made a point to attempt to adjust my sleeping patterns to the Japanese time zone a couple days before I left (having a flexible work schedule definitely has its advantages). I haven’t found that I sleep quite as long at night as I might want to—it gets cut shorter by an hour so—but nothing horrible, and I generally feel pretty wakeful up until 10 or so at night.

breakfastIn the morning, after I checked out, I saw that there was an amazing breakfast spread set out. I didn’t see any prices on any of the items, so I figured it must be the most amazing complimentary hotel breakfast I’d ever heard of. Turned out I was wrong; it wasn’t priced individually, you had to buy a breakfast ticket at the reception.

In the morning, I needed to get back to Haneda airport, so I tried to take the train. I ended up going to the wrong train station, though, which took me a bit to figure out (I still had plenty of time). Once there, I got myself a Pasmo card, which I charged up with some money to use on the Tokyo train system (you can also use it at station vending machines, which is fairly cool).

At the rail station, there were gates to use your card at for entry. I saw a slot in the gate, so I stuck the card in. It was accepted oddly. I took a closer look and realized the slot was for paper tickets, and I was supposed to swipe the card over an RFID-type scanner. Whoops. Fortunately, at all the station gates there’s at least one attendant right by, so I got their attention and the gate machinery was opened and my undamaged card handed back (all within mere seconds). Really efficient. And embarrassing.

That’s about it for this post, except I’ll mention that, since there’s no tipping in Japan, and sales tax is always included in the listed price, figuring out totals at stores and restaurants is way easier than in the US. Especially since they mostly don’t follow the practice of pricing things at $4.99. Japanese vendors are not afraid to call 500 yen, 500 yen.

Suggested Improvements to the UC Merced “Expanding Your Horizons” Event

This is an open letter to the Expanding Your Horizons network, and to the Women in Science and Engineering of UC Merced, in regards to the disappointing experience we had with the Expanding Your Horizons Conference for girls in junior and high school, offered at the UC Merced campus on Saturday, February 22, 2014, which was sufficiently poor that we decided to leave before the workshops had even started—even though we had pre-registered and paid for the event, and driven for an hour to arrive there, on time.

But first, I want to start by expressing my gratitude for your organizations, for the programs you offer, and for working to encourage girls and young women to enter fields in science and engineering. Women are clearly underrepresented in those fields, and I firmly support any effort made to close the gap between the current state of science engineering, and a more diverse population of scientists, engineers, and other workers in related fields.

And the fact that you are able to offer such events at the ridiculously low cost of $5 per participant (covering both a tee shirt and a lunch), is simply amazing, and I want to express my deep gratitude to your respective donors for making such a thing possible, as clearly that is not nearly sufficient to cover the costs of putting on a program such as this, and offering low entry costs makes your program accessible to girls of all income brackets.

My 7th-grade daughter, Joy, who turns 14 next week, has long been very interested in pursuing a career in entomology (bugs), or possibly a related field such as biological illustration (she is a gifted artist). Geeky, exuberant girls with a love for science and discovery tend to find today that they have trouble finding people, whether adults or peers, that can easily relate to them, or who can encourage (or even just abstain from discouraging) them in their interests and life goals, so both she and I were very excited to learn about this even taking place near to us.

Unfortunately, as I said, we found our immediate experience at the event to be so off-putting, that she elected for us to turn around and head back on the hour trek home (making some mood-restoring stops along the way). To be sure, I bear at least some responsibility for this, as some aspects of our experience would have been improved had I made a greater effort to contact your organizations to fill in some of the information gaps left by the event website and confirmation emails.

But I would definitely like to make both organizations aware of some suggestions for improvements to future program events, that I believe would have made for a much, much more positive experience for my daughter and myself. These suggestions are, ordered by our expectations of greatest improvement to students’ experience:

  • To strive harder to match participants with workshops suited to their expressed interests, or when this is not possible, to provide advance notification to that effect.
  • To be able to more quickly inform registrants who’ve received their name badges regarding what workshops they have been assigned.
  • To include better information (quantity, quality, and accuracy) about the program and its workshops and activities on the website. In particular, to more accurately describe how participants are matched to workshops, and to reflect what level of participation is permitted to young students’ parents and guardians.
  • To provide directions, signs, or maps, to the event location within the campus.
  • To better train and inform the staff about the program and its particulars, with particular stress on providing as overwhelmingly welcoming an environment as possible.

To communicate why I believe there are improvements to be made in these areas, I will give an outline of our experience.

I heard about the program through local news sources in the areas surrounding Merced. I found the local event website, but was disappointed by the fact that there were really only about three paragraphs of information about the event taking place, along with a list of topics that would be covered. I would very much have liked to find more details about subtopics covered within those broad subjects, or descriptions of what sorts of activities would be involved or included in those workshops. Ideally, bios about the workshop leaders would be nice too.

The website was not explicit about it, but seemed to me to indicate that parents/guardians could attend the workshops with their daughters (which I later learned was not the case). After further consideration of the website and the pre-registration process, I can see some signs that perhaps should have led me to suspect this, but I still feel justified in having interpreted the information on the website the way I did (further explanation some paragraphs below), and would appreciate it if your organizations would take care to be more explicit about this matter. Of course, I should also have verified my mistaken assumptions by explicitly contacting you.

When we arrived on the UC Merced campus, there were helpful signs clearly directing us where to find parking. However, there were no signs or staff within sight at the parking lot to give us any further direction as to where we should go on campus to find the event. Directions had been provided via an email link, but only to UC Merced itself, and not to any point within the campus.

So we charged into the campus for a while, deciding we were probably amongst dormitory apartments, and ended up circling back to the parking lot. At this point, we did encounter two staff members, who were stationed at the farthest point from the parking entry, and were not particularly visible from anywhere that timely arrivals were likely to be. We also would not have identified them as event staff, though they were wearing event tee shirts, as the coloring on the staff tee shirts makes it difficult to make out the design unless you are very close by.

They sent us in the right general direction, but without further signs or indicators we still got a bit lost and nearly entered an entirely different event (which turned out to be for martial arts practitioners).

When we did finally arrive at the event site, she got her name badge and a tee shirt. I had trouble determining how to pay for my own participation (as I expected to do), and they seemed to think the parent can participate, and enjoy the lunch, with just the child’s admission fee (which had been paid online). This seemed unlikely to me, so they said they’d check. But they never got back to me (probably overwhelmed with new registrant arrivals).

So I found someone else to ask, and was then informed that parents are not participants, and must leave the campus after dropping their daughter off. I replied that this contradicted what I’d understood from the website. I was then told that I could accompany her, but could not buy a lunch or tee shirt (which suited me fine).

I then wanted to determine which workshops she’d been assigned, so I could confirm that at least some portion of the day would be spent on subjects of interest to her. They could not immediately determine this information, despite the fact that color-coded dots had been placed on participants’ name badges to identify their group. They had to run and find someone with more information, who then gave them what they needed to look up which group she was in by what color she had, and determine which workshops she would participate in.

I feel it would have been much more helpful to have a large sign in the registration area, indicating which colors included which workshops—or much better, to notify pre-registered participants of their workshops as soon as this information was known.

We were dismayed to discover that none of the workshops she was assigned were in any way related to the interests she’d indicated on her pre-registration form online (Animals, Science, and Computer Science, though that last was really just in order to fill a thirmaked choice). Instead she was assigned to things related to earth mechanics, and design-and-architecture. We expressed our dissatisfaction and lack of interest in these subjects, and the cheery and somewhat dismissive response was, “well, that’s what you’re here for, to learn!”

Which is perhaps an acceptable perspective to take regarding girls who have not yet obtained an interest in science or engineering, or whose interest was still of a general nature, but is to my view, less helpful in nurturing the enthusiasm of a young girl who already has fairly solid ideas about what areas in science (specifically, and not so much engineering) she wants to pursue. We also felt it was a pretty dismissive, unwelcoming response.

To be sure, not greatly unwelcoming, but certainly not positively welcoming and encouraging. And please remember, much of the reason that organizations and events like this are necessary, is that the world is already a decidedly unwelcoming place for women in science, engineering, or technology. And as much as delivering disappointing news and the stress of dealing with hundreds of registrants (others of which must surely have had to be disappointed) is a part of handling events such as these, it seems crucial to me not only to go out of the way to avoid anything that might make a girl feel unwanted or unwelcome, or dismissed, but to strive to provide an overwhelmingly, even ridiculously, safe and welcoming haven for girls to foster their interest in technical fields.

I do not want to overstate the case, of course. While Joy did indicate later that she felt it was unfriendly, I don’t think that she felt actually unwanted or anything like that. Her decision to leave at that point was primarily due to the disconnect between the workshops to which she’d been assigned, and the science-related interests that she actually holds.

Naturally, we do completely understand that it isn’t always possible to closely match students with the interests they had indicated.However, the information we’d been given had clearly and explicitly stated that early arrival would improve the chances of getting into the desired workshops, whereas the programs had already been assigned to students well before anyone’s arrival, since they’d been marked on the students’ name badges before people could come to collect them. A more accurate description of that process would have been greatly appreciated.

And of course, given that these programs had in fact been determined ahead of time, an advance notice of her assigned program would have allowed us to make our decision on whether to participate before conducting an hour-long drive to reach the campus.

Regarding my mistaken impression that parents could participate in the program: this impression was gained mainly from the following sentence from the faqs page:

The student fee is $5 and the adult fee is $5

Now, having later re-examined the website, and finding an empty section on “adult workshops”, I suspect that this line exists because EYH may in fact have other events that do offer adult workshops, and this line is left-over from faqs used to describe such events. Further, I probably should have suspected something when, on being invited to pay for my student, I was not offered an option to pay for myself. I also later found a sentence elsewhere on the website that stated that parents that arrived too late to participate in campus tours, would be asked to sign the liability waiver and then leave the campus—that was not precisely my situation, since I had arrived before 8, but it would have hinted that parents do not participate.

It would have been quite a bit easier if the website had explicitly stated this information. The consistently repeated language on the website was that parents and guardians “do not have to” remain for the event, but there was no place that made it clear that they could not.

Again, please understand that I hold both of your organizations in high regard, and am excited about the work you are doing and have done. I understand that my situation may well be an isolated case (though I suspect that many participants and their parents experienced at least a few of the same issues, particularly in regards to lack of website information, and directions within the campus), and hope that the overall experience was a very positive one to the many other young girls who came to learn about science and technical fields. And I do hope you return to provide this excellent event again in the future, particularly if you choose to implement some of the suggested improvements that I’ve offered.

Sincere Regards,
Micah John Cowan.

Is the World Getting Better, or Worse?

A FaceBook friend posed this question. It was a good opportunity to give a reasonable summary of my current thoughts on the world, so I’m also placing my answer here. (Revised 23 January 2014)

Better. But I have to keep reminding myself that.

Everything looks pretty horrible at the moment, but I think it’s largely because, having made such great strides over the last few centuries, and even the last few decades, some of us are more keenly aware of how very far we have yet to go, than anyone was before. Continue reading

Evidence for Macroevolution

On Facebook recently, my brother asked why, if “macroevolution” is real, there aren’t more variety “in between” the species that exist today. I thought the answer to that question might be worth posting here.

The context of the question, was as comments to a tweet in which I thanked Richard Dawkins, citing his The Selfish Gene and The Ancestors Tales as having been instrumental in my scientific re-education, coming from a creationist homeschooler’s background (which my brother shares).

Among other things, all those in-between species did exist, and we’ve found scads and scads and scads of their fossiles. Most didn’t survive to today (except as fossils), because they were far less fit to compete with both descendents and cousins who were much better suited to their respective environments than today. Evolutionary jumps tend to happen when something in the environment or situation changes in a way that effects survival rates. This tends to provide strong death rates in the members that are poorly suited to deal with the change, providing a huge opportunity for members who are even just slightly better-suited to reproduce exponentially. Every small variation that is introduced that provides any sort of benefit in the new environment, reproduces quickly, because of its usefulness.

But the biggest evidence is in our genes. Continue reading

Lying system calls

Only Debian hackers are likely to grok this.

I just spent a week, maybe more, trying to look into a variety of very bizarre build failures for some packages, after building and installing newer versions of coreutils, dpkg and debhelper. Things like “install -d” dying because its destination wasn’t a directory (I’d check afterwards, it was), tar complaining about a file changing out from under it (always about symlink files, where the block of code in tar that could generate that error could never be evaluated for symlink files), and dpkg-deb –build complaining that a pre-installation script wasn’t executable, when it clearly was.

Of course, I was mostly treating these as separate, bizarre problems that happened to start up within a similar timeframe. Tonight it suddenly dawned on me that maybe all these system calls appear to be lying to me, because they are. They are, and building a package in fact typically involves running a program whose job is specifically to make system calls lie: “fakeroot”.

Fakeroot is of course only intended to lie just enough so that programs think they’re running as root, even though they really aren’t. But fakeroot’s documentation clearly states that it will not work correctly if the programs running underneath it are linked against a different version of the system libraries. The seeds of this problem were sown some years ago when we built and installed a newer version of libc6, but the problem didn’t manifest itself until now, because the most commonly-used utilities for building packages are dpkg, debhelper, and coreutils, all or most of which were not updated until I updated them just a week or so ago. Gah!