Log in

entries friends calendar profile Elf Sternberg's Pendorwright Projects Previous Previous
Elf M. Sternberg
I wandered through a casino this weekend, and while I didn't play anything, I was systematically overwhelmed by the sheer volume of art, both 2D and 3D, produced by young men and women whose entire income is based off separating pensioners from their savings accounts.

There's a staggering amount of original art, intellectual property, and 3D rendering that goes into the modern video casino. The Game of Thrones machine looks like a driving video game, with comfortably reclined bucket seats and a multi-screen wrap-around view that obstructs you from seeing anything other than that you're playing poker with Daenerys Targaryen. Both actual scenes from the series and 3D maps of various settings flicker at the periphery of your vision, an effect which, like the low-level tobacco smell and the constant sounds and music, work hard to grab your attention and sap your reasoning skills. To the left, three slot machines with pictures from the original Wonder Woman TV series with Lynda Carter play on while the credits roll overhead. Down one entire aisle there's a collection of video poker machines where comic book and fantasy-tinged half-naked women cavort to convince you to put more of your money in.

Nobody ever talks about the graphic design jobs that aren't admired in art schools. All of my friends who went to art school wanted to do their own comic books, be a lead on a Pixar film, or get a cover illo on a magazine. People who want to win an Oscar, a Webby, or even a Clio.

Nobody talks about the poor schlubs who end up designing new hazard warning signs for municipalities, slaving away in some county back office. Nobody talks about the graphic designers who end up working for Monsanto, illustrating the guides on how to use their seeds in a way that even the illiterate understand. And nobody talks about the men and women who pull down insane amounts of money because they've been asked to create art for the explicitly immoral gain of depriving the weak-willed of whatever money they've managed to carry into their retirement years.

Current Mood: thoughtful thoughtful
Current Music: Jean Michel Jarre, Fishing Junks at Sunset

4 comments or Leave a comment

Pandastrike has a really good article called Facebook Relay: An Evil And/Or Incompetent Attack On REST, in which the author basically takes Facebook to the woodshed for not understanding REST, trying to break REST, and generally being your classic embrace / extend / extinguish (or etouderie, a beautiful word that has sadly fallen out of the English lexicon) big company imposing its will on everyone else.  As a graphQL fan, I wanted to like Relay, but every time I played with it my principle reaction was, “Okay, what is this really for?”  Pandastrike goes on to say that it’s good for only one thing, namely social networking data at the massive scale Facebook faces.

But, Pandastrike make one really terrible faux pax of their own in the article.  They make a point of quoting Ray Fielding, but then in the section on REST endpoints and type safety, write:

Although JSON Schema is not part of HTTP proper… if you use content types correctly, and also use JSON Schema with JSCK, you get strong typing over HTTP.

This is true, as far as it goes.  But it misses two incredibly important parts of Ray Fielding’s work, and makes me suspect their intentions.  JSCK, you see, is a product produced by Pandastrike.  And Fielding himself has said that doing REST with JSON is incredibly hard.  So hard, in fact, that the original work in REST mentioned that the transfer of representational state automatically implied hypertext as the representative of state transfer.  JSON is a terrible tool for hypertext.  You know what’s a great tool?  HTML: Hypertext Markup Language.  It’s not just for the browser and the page itself, it’s for every transaction that you commit between the browser and the server, and it carries with it all the metadata needed to make sense of the content.  Even better, unlike JSON, HTML has its own type checking mechanism that is part of the HTTP/HTML dual standard: its DTD, or Document Type Definition.  You’re not required to use the whole HTML standard, and you can even use XML with a stripped-down version that still comes with a DTD.

Pandstrike goes on about Facebook’s raking attack on a behavior scheme that’s been around for, oh, call it ten years.  But HTML and DTDs have been around for twenty years.

I’ll be fair: Working with HTML and XML on the browser is painful compared to JSON.  It uses more CPU to render and it takes more tooling to program correctly.  Nobody does it that way.  But to ignore it and imply you have a magic solution to an unsolved problem is to be as deceitful as the people you’re criticizing.


Leave a comment
I am in California for a company-sponsored retreat, one in which experienced developers and newbies get together and create new applications on top of our custom search engine. I had expected the trip to be something of a disaster; I tend to take a while to mesh with a good team, I'm not all that interested in big data. My notions of good code center around readability and elegance, not lines of code or cycles saved. When encouraged to "think of something you do that can be quantified!" I was like, "Uh, my daily word count?" The scale of my drawings? No, wait, the latter won't do; I'm fairly monogamous to my LT1917 sketchpads.

Instead, it turns out that I'm going to leave here with a large number of kudos under my belt. Our product is used mostly for network monitoring, but my team is developing tools for using it for scientific computing. This evening, I was able to show on a satellite map where weasels live in a small farm community in Illinois using tracking tag data. The best anomaly: way off from most weasel stalking grounds, we found a previously unknown colony living next a U-store-it place isolated from other businesses and next to a culvert. Weasels like living near water, and the U-store-it must be crawling with mice.

Even better, I found that a visualization protocol I had developed three years ago and thought everyone had forgotten had been adopted by the core team. This made me ecstatic, and since I had developed the protocol, I was the best guy to test it out outside of the original development team. It let me integrate a satellite mapping system with our in-house data management tools almost trivially.

I also found a major bug in their version of the protocol, logged it, and have already talked with the lead developer over a bottle of Scotch. He's going to fix it tomorrow.

I had expected to leave with nothing. I'm going to walk out of here with not one, but two consumer-facing tools, a major upgrade to the visualization integrator, and a documentation credit.

This evening, I finished my Scotch and rose from the bar. "I'm going to bed."

"Go ahead," one of my teammates said. "You worked hard today. You earned it, man."

I paused for a moment and gave him a funny look. I knew what he meant: of all of us, I had the most to show for the day's work. But, you see, today was nothing but (a) solving a puzzle I'm already eminently qualified to solve, and (b) wrestling with Javascript's horrible dynamic typing. Which was the hard work? Fixing the fucking typos that arise because of dynamic typing (fix typo -> reload -> run -> repeat until not broken) or reading the docs and just, y'know, gluing the parts together?

I patted him on the shoulder, then wandered off to write this.

Today, I sat at a table with cheerful peers, while staff brought me high-quality food at breakfast and lunch, fresh coffee and tea throughout the daylight hours, and wine as night fell. I did the one thing I'm truly good at-- software development, integration, and exegesis. I spent most of the afternoon in a deep state of flow.

Y'know what's hard work? Going back to the office and wrestling with custom configuration files for specific vendor needs. Finding a reason to get out of bed when that, a series of spreadsheets full of "We can't figure out how to make it go!" is what awaits you. Every flamin' day. For months on end.

But today I didn't work hard. Today I did what I'm good at.

Current Mood: confused confused

1 comment or Leave a comment
Because if you want me to “act professional”, I can tell you that I’m not interested. I’m sitting in my home office wearign a bathrobe. The same way I’m not going to start wearing ties, I’m also not going to buy into the fake politeness, the lying, the office politics and backstabbing, the passive aggressiveness, and the buzzwords. Because THAT is what “acting professionally” results in: people resort to all kinds of really nasty things because they are forced to act out their normal urges in unnatural ways.

If that sounds exactly like some MRA complaining about how the standards for treating women 'interfere' with his 'natural urges,' you'd only be half-right. No, that's Linus Torvalds making excuses for his willingness to spew vitriol and anger from the safety of his basement and bathrobe.

But it's the same mindset. "I have natural urges, and I act them out, and if you don't like it then this isn't the space for you" poisons the space around us, and makes every single one of us feel more comfortable in our locked, armored basements than anywhere else in the world. It's the poison of the open source community; it's the poison of the atheist community; it's the poison of the BDSM community; it's the poison of every church and mosque and synagogue and retreat in America.

Current Mood: annoyed annoyed

5 comments or Leave a comment

This is my very simple secret weapon in doing complicated data transforms on the client side, which I do a lot of when I’m working with Splunk data.

_ = require('underscore');

    makerail: function(predicate) {
        if (_.isUndefined(predicate)) {
            predicate = _.isUndefined;
        return function() {
            var args = arguments;
            return function() {
                var result = args[0].apply(this, arguments);
                if (predicate(result)) {
                    return result;
                for(var i = 1, l = args.length; i < l; i++) {
                    result = args[i].call(this, result);
                    if (predicate(result)) {
                        return result;
                return result;

_.mixin({rail: _.makerail()});

In its default configuration, rail() calls each argument in the sequence, much like compose(), passing to the first function in any arguments to the resultant composed function call, then passing the result of that function to each subsequent function. It’s basically like the arrow operator in Lisp, performing each step in a left-to-right fashion, rather than the right-to-left of underscore’s compose function. However, it also *terminates* the moment any function produces undefined as a result, shorting out the composition and returning undefined right then.

It’s possible to call makerail with an alternative predicate:


var railway = _.makerail(function(result) {
    return (result instanceof Error);

In this example, makerail() is describing what F#calls “railway oriented programming”, whereby when any function returns an object of the exception class, all the other functions are immediately skipped without generating an exception and all of the performance or flow-control headaches of invoking the exception handler.  It’s actually rather nifty, and encourages a much more holistic approach to dealing with long data flows.

Leave a comment

The past two weeks I have volunteered a couple hours of my time at the local high school to teach a small class of the kids in the fine art of HTML and CSS. I have only one hour of interaction with the kids each week, but I spend about two to three hours beforehand prepping materials and getting ready.

The first class was a blitzkrieg of ideas. A bit of “A website is a collection of web pages around an idea” and “A webpage is a chunk of HTML filled in with other stuff to give you one view of the idea” and so on. A map of a fairly complex web production environment: The “business thing”, the business logic, routers, databases, HTML, CSS, Javascript, Canvas, SVG, WebGL, etc. etc. etc. The number of websites I’ve built where “the business” was a completely separate server with a simple frontend written in Django, Catalyst, or Express shows the maturity of the model.

And then we hit the wall. As a demo, I wanted them to all open up a file, edit an eight-line HTML file (HTML, HEAD, TITLE, BODY, PARAGRAPH, CONTENT, plus closures), save it, and view it in the browser.

The enly tool these kids have for this is a bunch of Chromebooks. Most of them can’t afford laptops. The school provides them the Chromebooks, and their own Google Drive locations and accounts. So that’s what we had to work with.

Problem number 1: These kids have no idea what “plain text” is. Every tool they’ve ever used comes with options to pick a font, do bold, do italics. When I asked them how the computer “knew” to use bold or italics, they shrugged. I had to explain that the zeros and ones saved to their storage contained extra zeros and ones to describe the decoration, the bolding, the italicizing, the font selection. We were going to add the decoration back ourselves, using HTML. But before we could do that, we needed to use the most simple storage format there was, the one with no decoration, the one where every character you saw was the same the one you saved, with no additions, to annotations, no decorations.

The ease and convenience of RTF and other “printable” or “web-ready” formats has completely ruined these kids’ understanding of what actually happens underneath the covers.

Problem number 2: These kids have no way to correlate files to URLs. The lack of a traditional storage medium, and the introduction of Google Drive, means these kids have no mental map for associating a “web location” with a “filesystem location”. Everything is seemingly ad-hoc and without a real-world physical reference. This is probably the lesser problem, as storage is already very weird and about to get weirder, and we’re all just going to have to live with that fact.

The second class went better, and I went much, much slower. This is a hands-on class where I lead them through a couple of exercises and help them figure out weird things they can do with HTML. We figured out work-arounds for Google Drive and practiced our first, basic HTML, like headers, lists, and so on. And I gave them their first styles. They had fun figuring out random colors that seemed to work for their backgrounded objects.

There’s that Simpsons episode where some adult male says “Am I out of touch? No! It is the children who are wrong!” Well, maybe I am out of touch, but it really seems to me that Chromebooks may be fine for accessing the World Wide Web, but as a tool for developing on the web, they’re more a hindrance than a help.

1 comment or Leave a comment

Seeing as it’s January, that means that we go through many accounting phases about what happened last year. Most of the ones we go through publicly are ones about how we spent our time: did we work out enough, write enough, study enough, love enough. Others we Americans tend to go through with a deep sense of reserve and privacy, mostly about money.

Last year I made what is, to me, an insane amount of money. Far more than I ever thought I’d be making in any given year. And it’s more than the year before that; in fact, it’s been steadily going up every year since the 2008 recession. Even after adjusting for inflation, I’m still making more per year than my father did, which I have to say is utterly mind-boggling, since he was a radiologist, a pioneer in nuclear medicine, and a real estate mogul all at the same time.

Yet, I’ve never felt the connection between work and reward feel more tenuous.

I’m currently in a large infrastructure position where, nominally, I was hired for my skills as a software developer, yet I now joke that I write code during the commute because they don’t let me write it at work. Instead, I manage configuration files. I worked on fleshing out a platforming initiative for a massive chunk of network monitoring software; that platform is now mature enough that the skills I initially brought to the table are no longer needed. The real skills I spent twenty years acquiring are now being allowed to decay while I fiddle around the edges of an impressively large but intellectually dull enterprise software product.

On the other hand, because it is a network monitoring tool that helps prevent enterprise-scale service failure, finacial loss, and outright fraud, there is an unbelievable amount of money sloshing around the sector, and my company has seen fit to reward me repeatedly with bonuses, raises, and stock options.

And yet, I know I don’t work nearly as hard as the average apple picker in the agricultural regions just east of where I live. I am not as ambitious or go-getter as many of my co-workers; I’m consciously on a daddy track and I’m not going to sacrifice my family’s time to my employer. I do my job, hopefully well, and go home at the end of the work day. The maturity and prosaic nature of the project, I confess, leaves me cold with desire to push the state-of-the-art. (This is the flipside of my time at IndieFlix or Spiral Genetics, where I worked like a dog and put in evenings because the project was flippin’ cool.)

I really don’t have ambition to “maximize shareholder value” except to the point that I’m currently a shareholder myself. I have an ambition to make the world a better place. Every job I’ve had of the first type paid excessively well; every job of the last type was inspiring and made me feel good about myself.

When I read about that weird Silicon Valley meme that “we work hard, so our rewards are commensurate with what we do,” I have to shake my head and wonder: really? Canada’s Micronutrient Initiative’s costs about $200 million, and has prevented almost 400 million cases of life-threatening birth defects in India, Canada, and North Africa; Candy Crush is worth $7.1 billion, and I doubt it’s developers actually work as hard as the people hauling sacks of iodine crystals through the third world’s back roads.

The disconnect between effort and reward has never been as stark or as absurd as it is today. My experience is a microcosm of that disconnect. I’m happy to do my job, and happy to get paid to do it, but I can’t help but feel that there’s something very off about the relationship between the two.

5 comments or Leave a comment
It's realy weird to think how far we've come. In a conversation about buying sex toys, I mentioned just how hard it was to buy my first sex toy years ago. A woman who said, "Wait, I'm 29. Why was it hard to buy a sex toy the year I was born?"

This is what I told her:

You really have to internalize the idea that "the past is another country." 1986 was the first year the US Government acknowledged that gay men had been dying of AIDS for six years already. Although HIV had already been discovered, nobody knew where it came from or its transmission vector. There was no Internet at all; everything you knew about the world came to you through newspapers and television stations owned by large corporations. The television stations were more strongly regulated by the government regarding what they could say, and so blatant lying was out (FOX news would never have survived) but telling only one side of a story was very do-able. On the one hand, Playboy, Penthouse and Forum magazine were slowly making their push into the mental territory of America; on the other hand, all the media you had available to you were full of stories about how one night of sex with the wrong person will kill you and watching hardcore porn is a sure step to ruin. In 1986, it was still illegal to act gay. Just buying bondage equipment was used in several cases to prosecute people for intent to commit assault.

This isn't some wacky preacher or billboard. This is everything. This is every news channel, every newspaper, every magazine-- and there was no internet to call bullshit on any of it. There was no way to buy toys on-line. There was no on-line.

The only place to buy sex toys were these hole-in-the wall places, often in strip malls in the most depressed neighborhoods and so run down they had no choice but to lease store space to the skeeviest businesses imaginable: pawn shops, convenience stores that specialized in alcohols for homeless people, and sex stores. You had to drive there, and then enter the store.

The store was typically painted in the ugliest yellow-beige. And while behind the broad counter the guy running the store might pointedly ignore you while reading something distinctly non-porny, the other patrons were usually men desperate to not be seen in a store like that. In a store where death and ruin waited, and only a twisted and evil interpretation of the First Amendment stopped the cops from shutting it down. Three of the four walls were dedicated to magazines, and the fringe guys reading bondage magazines or gay magazines really didn't want to be seen. Eye contact was absolutely forbidden. Often, these stores were part of a small public theater (or worse, individual booths) where really ancient porn movies were being shown, and desperately lonely men went to masturbate, so the air in the store smelled like a mixture of semen and hospital disinfectant.

Off the one wall racked with toys, you had to pull one off, and then have a face-to-face transaction with the guy across the counter to buy it. Meanwhile, all the other guys are watching what you just did, and judging you.

Then you had to go back out, and hope that a cop wasn't sitting in the parking lot photographing your license plate. If he was, you (or if you were married, your wife) might get a letter warning you for "visiting a known location for prostitution and pornography."

You had to be really, really fuckin' horny for that toy to buy it.

Tags: ,
Current Mood: nostalgic nostalgic
Current Music: NPR, Wait Wait, Don't Tell Me

3 comments or Leave a comment
I hate to say this, but I really wanted to like The Force Awakens more than I did. I can't, and for one simple reason: JJ Abrams.

Spoilers...Collapse )

I liked the movie, but I would have liked it more had it been in the hands of less inept director. Any depth to the film was not Abrams's fault.

Tags: ,
Current Mood: annoyed annoyed

9 comments or Leave a comment

Writing this year was a terribly mixed bag. I finished a novel, but you're not likely to ever read it. It's 100,257 words and I keep it in my Nook and re-read it because I'm actually proud of it, but unless you have very particular tastes, it's not going to appeal to you at all.

Other than that, I didn't do much. It was a lot of fun, and the fanbase that did coalesce around it was very worthwhile, but these days I'm having trouble getting excited about my older work, and don't really have the gumption to push forward. I'm especially worried about become

a certain kind of writer as I get older.


This was a terrible year for me. Professionally, I worked at the same job and actually shipped a couple of projects, but I wouldn't call them "interesting." My skillset continues to be stuck in 2012, the year they hired me, with jQuery and Backbone being the two technologies I still work with on a regular basis.

The world is passing me by. Clojurescript and React are new hotnesses, along with Purescript and Elm, and I really should learn them, but the time needed to do so is desperately hard to come by.

I did read a lot of papers. But that's not the same thing as practically developing code.


This was pretty much the best part of 2015. I got the backyard shed done, Omaha, RaenSpirit and I went to many plays, ballets, and symphonies, we had a lot of fun. We rode our bicycles to the train station, which took us to Portland, and rode around Portland, visiting book stores, shopping malls, and by sheer accident meeting the mayor.

Storm graduated, and went off to college, and pretty much disappeared from our lives. That was mostly her choice, and I'm saddened by it, but I did the best I can to get her to adulthood, and let's see where she takes things from here.

Overall, 2015 was a year of some stasis. We all got older, kids grew up. I met some new friends and re-met up with some old ones. But I didn't make anything big this year, and that's a little disappointing.

Tags: ,
Current Mood: tired tired
Current Music: Digital Droo, "Active Lancer"

Leave a comment