Good Villain, Bad Villain

The difference between a well-done villain like Ursula in Disney’s The Little Mermaid and a poorly done one like Rasputin in Don Bluth’s Anastasia is actually pretty simple. With a well-done villain, you can understand and sympathize with whatever made them who they are… you just can’t agree with the decisions they made as a result of that past. With a sub-standard villain, they come across as too simplistic.

Rasputin is a good example of this because his primary motivator is obsession. While that’s a perfectly realistic motivator, it takes a lot of work to make obsession work in a literary context even though it’s actually a fairly simple emotion. (I know people who are at least as obsessive as Rasputin and have hurt others along the way, but truth is stranger than fiction after all.)

If you compare Ursula, she’s actually a surprisingly well-rounded villain for a Disney cartoon. Especially when you realize that, in a setting that seems completely innocent, she sings a “villain song” that hints at prior experience with misogyny and offers a readily metaphorical deal where a young girl can get her man but must give up her voice and her family.

Good characters lend themselves more readily to more constructive adjectives like “cynical” and “misanthropic” (Ursula) which, even on their own, readily imply potential character histories. Rasputin’s descriptors, by contrast (obsessive, evil, undead, basket-case), aren’t as helpful.

In other words, a good villain is someone who could have been a sympathetic protagonist but chose to go about things in a completely unacceptable way.

Posted in Writing | Leave a comment

Freeman’s Mind, Humor, And Themes As A Writing Aid

From a structural standpoint, one of the biggest reasons Freeman’s Mind works so well as humor is that, in the Half-Life story, Ross Scott’s version of Gordon Freeman embodies not one or even two, but three humorous juxtapositions which can take turns to ensure a steady flow of humor.

First, since Half-Life’s story and character interactions were written to imply a mature, serious, respectable silent protagonist, it’s quite amusing to see an immature character with an apparent lax sense of right and wrong slotted into those interactions (As long as it’s done so it still makes sense) …not to mention the inherent humor potential in characters who somehow managed to achieve a university-level vocabulary and understanding of science, philosophyand history without gaining any maturity in the process.

Second, most of the time, Scott’s Freeman seems to treat his mental tangents with equal importance to the serious, immediate concerns of his surroundings. For example, when he returns to the giant, noise-making alien in the rocket test chamber and, having just been daydreaming about riding a sea turtle to rob cruise ships, comments “Wow. You may be a reptile, but you’re really dangerous. You’re not like a turtle at all. I don’t like that.”

Both are forms of generating humor by denying a person or situation the respect/reverence/seriousness/deference we expect and, by using two or more humorous themes, you reduce the need to have one carry the whole burden of finding something to laugh about in every location or interaction.

Finally, Freeman tends to come to conclusions very notably different from what the designers of Half-Life intended (eg. that the soldiers who are trying to kill him are obviously immature jerks who don’t understand the meaning of “rescue operation”) and occasionally make obvious-in-retrospect comments to support those viewpoints. (Jokes based around not ignoring the rough edges in the immersiveness of the game can also fall into this category.)

Fundamentally, all three boil down to the same core pattern which underlies all humor on the listener’s side: Make sure the audience has expectations, then break them in a way that doesn’t cause them discomfort. (Humor on the joke-teller’s side is generally rooted in empathy and social connectedness since it’s usually impossible to tell a joke properly before you’ve let its effect on you wear out)

Obviously these aren’t magic bullets but, by providing three different “jokes in the abstract”, they make it much easier for someone with a sense of humor to know where to start looking to find humor in any given situation. In other words, they’re excellent as guards against writer’s block or tools for coming up with multiple jokes and then keeping only the best one.

You can even go further and subdivide your themes into more specific areas if you feel it’ll help you to keep better track of which topics are getting overused and which ones might offer alternative jokes.

Posted in Writing | Leave a comment

My Sites: Now 100% Google-free (FeedBurner excepted)

I’ve been meaning to minimize Google’s ability to track me and my visitors for quite a while now, but this post about Google+ which I stumbled across recently came as an appropriately timed reminder.

I’d like to announce that every site I remember running (it’s conceivable I forgot ones on free hosting similar to GitHub Pages) is now free of Google Libraries API and Google Analytics (I use a private Piwik install for stats now and I can assure you I’ve dialed data retention way down). I’ve never had a need to use reCAPTCHA even back when they weren’t owned by Google.

I still need to find alternatives to FeedBurner, FriendFeed (owned by Facebook), and Google Docs and find time to replace GMail and Google Talk with stuff I host myself, but it’s a good start.

(You never really realize how much Google knows about you until you start migrating yourself off them)

In the interest of full disclosure, here’s an up-to-date list of all 3rd-party dependencies in my sites which could theoretically be reworked for abuse:

blog.ssokolow.com
  • ProjectWonderful Ad
  • FriendFeed sidebar widget
  • Flattr buttons (Live counts require external requests)
  • FeedBurner feed analytics
Vanished FanFic Archive
  • Fic downloads are currently served separately from Dropbox.com
  • FeedBurner feed analytics
GitHub Pages: QuickTile
  • Flattr button
  • GitForked Button
GitHub Pages: The Procrastinator’s Timeclock
  • Flattr Button
  • GitForked Button
Gender-Bending Index
  • FeedBurner feed analytics
Fanfiction Story Ideas
  • FeedBurner feed analytics
Posted in Geek Stuff | 4 Comments

WordPress: Flushing Spam Comments Quickly

While I love a well-configured copy of Spam Karma 2 as an effortless way to keep my blog free of spam, it doesn’t seem to have a way to automatically purge/expire comments after they sit in the spam bin for a while.

Until I can come up with a more automatic solution, here’s the simplest way to purge all binned spam in a few seconds using the phpMyAdmin SQL query window (it’s an icon in the sidebar once you’ve picked a database):

  1. Delete all comments marked as spam:
    DELETE FROM wp_comments WHERE comment_approved="spam";
  2. Look up all newly orphaned comment metadata entries:
    SELECT m.comment_id FROM wp_commentmeta AS m 
      WHERE (SELECT COUNT(c.comment_ID) FROM wp_comments AS c 
        WHERE m.comment_id = c.comment_ID) = 0;
  3. Click “Check All” at the bottom of the results list. (MySQL doesn’t let you subquery a table you’re deleting from)
  4. Click “Delete” to the right of “Check All”.

How much faster is this? In the same time it took me to purge 20 comments via the WordPress web interface, I used this process to remove the remaining thousand or so. The actual SQL statements took fractions of a second.

Still… this is a bit outside my usual area of SQL expertise (I normally work mostly with SQLite and simple INNER JOINs), so I welcome cleaner, more automatic ways to do this without resorting to a little PHP or Python script to pass lists of IDs between statements.

Posted in Geek Stuff | 2 Comments

Open-Source Licensing For The Lay Programmer

When trying to get a new project off the ground, there’s no doubt that community is important, but from all the stuff I’ve run across, one of the least understood and most important aspects of doing so seems to be licensing. Your project’s license is its constitution. It tells potential users and contributors what your attitude is and sets the tone of the dialogue… and if you get it wrong, you can easily prevent like-minded people from joining you by accidentally picking a license that doesn’t actually allow what you think it does.

What follows is a lay programmer’s quick overview of the relevant terms, followed by a guide to choosing the most appropriate license. Not all of the terms are exact, but they should be understandable and that’s what’s most important.

Important: Because of the legal consequences of a misunderstanding, it is important to keep things simple by minimizing the number of licenses in use in the wild. This page lists the most popular license for each scenario you might find yourself in and choosing an alternative to the licenses here is strongly discouraged.

Terms

Derivative vs. Aggregate
The law makes a distinction between “derivative” works like modifying an icon, forking a project, or linking against a shared library and “aggregate” works like zip files and DVDs full of things.
That means that you can put two things with incompatible licenses in the same zip file or on the same DVD because that’s “aggregation”. This is a popular way to freely release a game’s engine for any use but restrict the game’s resources (level files, graphics, music, etc.) so only the original creator can sell them.
Licenses can set terms on aggregation, but generally that only happens in the kind you find in commercial software. For example, you’re not allowed to put Flash on a Linux CD. End users have to individually download it from Adobe’s site. (though that process can be automated by Linux package managers)
Free Software
The term “open source” is a fairly weak term and doesn’t encompass all of the freedoms we’ve come to expect in popular licenses. “Free software” is the older, more strict (but less popular) term coined by Richard Stallman to talk about licenses which explicitly grant these freedoms.
It is variously referred to by the terms FOSS, FLOSS, Free/Libre Software, and various others because English doesn’t have a word specifically meaning “free as in freedom”. (“Libre” is French, from the same Latin root as “Liberty”)
Copyleft and ShareAlike
A “copyleft” or “ShareAlike” license is a license which requires you to give others the same rights you received… so if you have access to the source code, you must give others access to the source for any modified versions you make.
Copyleft and “Distribution”
With one exception (The Affero GPL), copyleft licenses like the GNU GPL only require you to share your source if you share something built from it. Keep the binaries to yourself, and you have no obligation to share your changes.
For this reason, requiring end users to click “agree” in an installer is meaningless. Free Software licenses aren’t EULAs.
“Creative Commons License”
The term “Creative Commons License” is practically meaningless in and of itself, much like a “you must be human to ride” sign at an amusement park. The term refers to a large family of licenses with various properties and using the term without being more specific only makes things worse by spreading the misconception that it’s OK.
License Incompatibility
When two licenses require conflicting things, they’re said to be incompatible.
For example, the GNU GPL forbids people from imposing additional restrictions down the line and requires that derivative works also be GPLed. The license for Douglas Crockford’s JSMin contains a line that says “The Software shall be used for Good, not Evil.” (An admirable sentiment, but dangerously ambiguous) Because that counts as an additional restriction, you can’t use GPLed code and code from JSMin in the same program.
Dual/Triple-License
When a piece of software is “dual-licensed” or “triple-licensed”, it means that its creators have granted you permission to use it under your choice of two or more licenses.
While this is a perfectly acceptable option, it generally makes things more complicated and combinations like BSD/GPL should be avoided since, if you’re willing to license under BSD, you’re already GPL-compatible.

Licenses for Code

License Compatible with… Use when…
MIT or 2-clause BSD Everything You just want credit for your work. Others can use it however they want. (Also a good alternative to public domain. Not all countries recognize the right to give up your copyright.)
CC-BY 3.0 Everything You want MIT/BSD-like terms, but with a pretty icon and some RDFa metadata to embed.
Apache 2.0 CC-BY, MPL 1.1+, LGPL 3.0+, GPL 3.0+, AGPL 3.0+ You don’t mind being incompatible with “GPL 2.0 only” libraries and you want BSD-like terms, but with clearer legal language and an explicit patent grant.
MPL 2.0 Apache, GPL 2.0+, LGPL 2.1+, AGPL 3.0+ You want to copyleft-protect changes on a file-by-file basis but you don’t care what happens to the program as a whole.
LGPL 2.1+ LGPL 2.1+, GPL 2.0+, AGPL 3.0+ You want modifications to your library to be copyleft but use in closed-source programs is fine and you want to stay compatible with projects that removed the “or later” line from their LGPL declarations.
LGPL 3.0+ LGPL 3.0+, GPL 3.0+, AGPL 3.0+ You want modifications to your library to be copyleft but use in closed-source programs is fine and you want an explicit patent grant on contributed code.
GPL 2.0+ GPL 2.0+, AGPL 2.0+ You want project-level copyleft licensing while staying compatible with projects that removed the “or later” line from their GPL declarations.
GPL 3.0+ GPL 3.0+, AGPL 3.0+ You want project-level copyleft licensing with an explicit patent grant and the option to forbid companies from using your software on devices which control upgrades with DRM.
Affero GPL 3.0+ Itself only You want websites using your code to share their changes… assuming any are willing to use your code in the first place.

There are also various community licenses like the Python Software Foundation license and the Artistic License which you might want to use to follow community conventions.

When you are unsure about what a community-specific license entails, convention for large, popular communities is usually safe to follow. If in doubt, either dual-license between the community recommendation and one of the licenses listed here or pick one from this list that’s permissive enough to be compatible with the community preference.

Important:Unless you really know what you’re doing, don’t remove the “or any later version” clauses from GPL-family license declarations. If unsure, keep in mind that 3.0-series GPL-family licenses do allow you to specify a person responsible for making that judgement call on behalf of all contributors at a later date.

Licenses for Resources

As long as you’re not embedding them in your .exe files, your images (eg. icons), sounds, and so on don’t have to share the same license as your code. In fact, it’s better they don’t because someone might want to produce a derivative work and copyleft code licenses are incompatible with copyleft non-code licenses. (You can’t combine a GPLed image and a CC-BY-SA image into a new poster, for example)

License Compatible with… Use when…
CC-BY 3.0 Everything You just want credit for your work. You can specify how people must credit you, but remember that you’re competing with the world and don’t get too greedy.
CC-BY-SA 3.0 Itself only You want CC-BY’s attribution provisions, but you also want people to have to share derivative works under the same terms. (This is the recommended way to scare off predatory commercial use)

Important: The NoDerivs and NonCommercial variants of Creative Commons licenses are not included here because they have non-intuitive consequences, don’t achieve what is generally intended, and their incompatibility with the popular CC-BY-SA variant makes them a deal-breaker for many potential users/fans.

Posted in Geek Stuff | Leave a comment

Second-Tier Cartoon Classics and The Effects of Perspective

I just discovered something rather interesting about the cartoons I and those of my generation grew up with. If you ask us about companies, everyone can probably name the top-tier ones: Disney, Warner Brothers and Hanna-Barbera… and deservedly so. Walt Disney wasn’t the only innovator around and, while Disney was the best at what they did, quantity does have a quality all its own (a quote usually credited to Josef Stalin) …especially in reruns.

What I just realized is that many of the things we remember from our childhood were actually from a single source, rather than a mish-mash of one-hit wonders like The Swan Princess, Ferngully, and The Nutcracker Prince. (Or the ones like Quest for Camelot which just didn’t shout out that Warner Brothers made them.)

The more aware of you might be thinking I’m going to be talking about Don Bluth, who brought us cartoons like The Land Before Time, An American Tail, The Secret of NIMH, Thumbelina, and Anastasia (among many other less classic ones), but this isn’t about him.

This is about a little company named Rankin/Bass Productions which sometimes published through Warner Brothers, but was quite visibly not them.

Do you remember those old stop-motion holiday films like Rudolph or Here Comes Peter Cottontail? Early Rankin/Bass Productions.

How about the animated version of The Hobbit or things like Flight of Dragons and The Last Unicorn, which, as an adult, I now find deeper than their better-drawn Disney contemporaries in some ways? You guessed it. Rankin/Bass again.

Incidentally, they contracted a Japanese studio named Topcraft to do the animation. The core members of Topcraft would later found Studio Ghibli, (And The Snow Queen was one of Hayao Miyazaki‘s big inspirations, but that’s as far off-track as I’ll let myself go.)

So, is there a point to this ramble? I suppose, if anything, it’s that, nostalgia and re-examining old favorites aside, learning details like these can help to see your past in a new light. I don’t know about you, but I love that feeling of understanding that comes when a new detail finally “clicks”.

For example, If you’ve watched any significant number of Miyazaki films, take a look at The Snow Queen. It’s fascinating to see what thematic and stylistic elements of it he chose to borrow and refine. Sailor Moon wasn’t on the TV channels I got as a kid but, if you watched it, you probably weren’t aware that it basically introduced the idea of magical girls working in a group to fight off large-scale villains. (Up until that point, that was the domain of Super Sentai. Stuff like Voltron and Power Rangers which I also didn’t watch.)

As for comments, what do you find most memorable about these second-tier classics? The song, This Is My Idea, from The Swan Princess? Amalthea’s words from the end of The Last Unicorn? The intro? James Horner’s soundtrack for the original The Land Before Time? Share it.

Posted in Otaku Stuff, Web Wandering & Opinion | Leave a comment

A Few New Projects Up on GitHub

Over the last few days, I’ve been trying to clean out a bunch of old TODO notes. One of the more procrastinated ones has been to tidy up as many of my in-progress projects as possible and get them up on GitHub, both so they’ll have some offsite backup, and so I’m practicing what I preach.

So far, here are the ones I’ve added:

  • gvrun (A partially complete gmrun clone written in Vala and begun as a port of the address_bar.py backend I wrote for IceWM)
  • png2pdf (Python script for turning a bunch of PNGs into a PDF, with partial caching on regeneration. Uses PyPDF and ImageMagick. Uses far less memory than letting ImageMagick do the whole process but still has room for improvement.)
  • languagetool-fanfiction (In-development set of LanguageTool rules for catching common fanfiction grammar and spelling mistakes)

I should probably also draw attention to these specific, older gists, since they can easily get lost among the ones I’ve already blogged about:

Posted in Geek Stuff | Leave a comment