Link: Help Get Sita out of Copyright Jail

The fun of watching cartoons plus the smugness of giving to a good cause: I encourage you to Help Get Sita out of Copyright Jail

You might remember the cartoonist Nina Paley. Or you might not remember her--you've had a while to forget her. She went off for a few years and made an animated movie, "Sita Sings the Blues". I hear that's it's pretty good. If I were to pass along a verbal description, it would sound artsy-fartsy--but it's by Nina Paley, so it's probably pretty funny. Roger Ebert liked it plenty. Yeah, I hear that it's pretty good.

But I can only tell you second-hand reports. I can't see the movie because if anyone were to try to distribute this movie, they'd get sued back to the stone age. There's some music in the movie, old old music that is nevertheless still under copyright. Nina is taking out a huge loan to pay off the copyright holders. And then she's going to make her movie available for free. You can donate to help her pay off the loan. Remember when I Twittered "So, what do religious fundamentalists and big media corporations have in common? They believe that they own culture."? I was quoting Nina, reflecting on her troubles getting this movie into the public eye.

Labels: , ,

Book Report: Pirate Freedom

If you travel through time, are you free? Or are you hemmed in by predestination? (Postdestination? What do you call destiny when time travel is involved?) That's a complicated question, and fortunately Gene Wolfe mostly ignores it, giving us a fun pirate story. Well, maybe "fun" isn't the right word. It's brutal in places. It's... it's a good book. Check it out.

Labels: , ,

Book Report: the Castaway Pirates

Last night, I played Modern Art with some folks. It was a high-stakes game. One of us (not me) had revealed that he was one of the top five players of Caylus (a geeky German boardgame) on Brettspielwelt (a geeky German online boardgaming site). But he wouldn't tell us his "handle", the name he used on Brettspielwelt. So we played Modern Art, with the stakes: if he didn't win, he had to tell us his handle. But he won. So we still don't know his handle.

When I got home, I looked at Brettspielwelt's list of top-ranked players.

Pos.NameAlltime ScorePointsGames PlayedWon%age

Hmm, I can't figure out which of these "handles" is most likely to belong to this guy. Hmm. Then again, maybe there's another approach. Maybe I can just start calling this guy... "SuperMouflette". If you didn't choose "SuperMouflette" as your handle, you might be kinda insulted if someone else claimed that you had. You might say, "My handle isn't 'SuperMouflette', you cretin, it's ____________."

Sooner or later, we'll get an answer out of this guy. Oh, wait, but that wasn't my point. My point was a book report.

I caught a ride from the restaurant to the game-playing spot with Michelle, who works at Chronicle books. Thus, it's not so surprising that she had a book in her car. She said, "You might want to check that book out." Stealing a joke from Kevin L. at work, I said "Is it a pop-up book?" Michelle said, "Yeah." Not the answer I was expecting. Now I had to look at the book.

The pop-up book was The Castaway Pirates. It's the most elaborate pop-up book I've ever seen. Michelle mentioned that a "paper engineer" had worked on it, and I think this "paper engineer" earned that title. There was a splash of water, rendered in pop-up. There were interlocked loops of rope, rendered in popup.

I'm not sure if a verbal explanation is sufficient. Oh, lookie, here's a video I can embed.

The Castaway Pirates

Labels: , ,

Puzzle Hunts are Everywhere: an elegant Mastermind Crawler

Last time, I wrote about a brute force web crawler. This time, I'm writing about an elegant web crawler. As you would expect from elegant code, I didn't write it.

The Pirates BATH game had a pregame website. Teams could log in to the web site. There was a web form which I'd programmed before I'd dropped out of Game Control. This web form allowed teams to "search for treasure": enter a string of text. Game Control gave them some strings of text that they could enter: entering one of those into the web form yielded puzzles. When a team solved the puzzle, the answer was a phrase: entering the phrase into the web form yielded a hint which would be useful during the upcoming game.

If they entered text that wasn't a puzzle and wasn't an answer, they were told that they'd found nothing. And if they paid attention, they also noticed some black dots, some white dots, and some xs. These were a "Mastermind" puzzle. If they entered a nonsense phrase, a program figured out which "useful" word was closest; it would then display one white dot for each letter in the correct place; a black dot for each correct letter in the wrong place; an X for each incorrect letter. So if "BELOW" was a word and someone entered "BLOW", they'd see a white dot (for the B), three black dots (for L, O, and W), and an X (for the E).

This was the way to find one game hint: no puzzles solved to the correct word for this hint. But four puzzles gave words that didn't actually yield hints--but instead were just near to the word to enter for this special hint.

What if a team just tried to guess every possible text string? They could guess A B C ... Y Z AA AB AC ... ZY ZZ AAA AAB AAC ... Of course, that would take a long time. It would probably take less time to just solve the puzzles.

So I was kind of surprised when my pager started buzzing one day: BATH Game Control was sending me messages: Team Scoobies had set up a bot to crawl the server! The Scoobies had found puzzles that they couldn't have found!

I looked over the logs. There was a program crawling the system, but the Scoobies weren't running it. Team Blood was running it. The bot was not brute-forcibly checking every possible text string. It was playing Mastermind!

It would guess "A". If it got back a white dot, it knew that at least one word started with A. If it got back a white dot, it knew that at least one word started with A. (A white dot meant right letter in right place.) Next it would try try AA AB AC AD AE ... AZ. If AA returned just one white dot (not two), then the bot knew no words started with AA (e.g., no word was AARDVARK). So it never tried AAA AAB AAC... Thus, it didn't need to check so many things. Thus, elegance.

When I reported my findings to Game Control, they decided that this thing must be stopped. Though it was elegant, what if it allowed the team to bypass puzzles? Game Control figured that this would be unfair.

Hmm, how to stop the bot without disrupting other teams? How did the bot work? Team Blood was running it. Rich Bragg captained Team Blood. I worked at the same company as Rich. Maybe he'd written this program while at work? And maybe he'd left the program somewhere where I could find it? I thought about it: If I were Rich and I'd written this program at work, where would I have put the source code? I looked there: no program. Then I tried my second guess and saw a file: Bingo. It was a web crawler, a very specialized web crawler.


import cookielib
import re
import time
import urllib2

def Login():
   print "Logging in..."
   cj = cookielib.CookieJar()
   opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))"",
   return opener

def NumMatches(html_data, substring):
   matches = re.findall(substring, html_data)
   if not matches:
       return 0   
   return len(matches)

def NumLettersCorrect(html_data):
   return NumMatches(html_data, "dot_white.gif")

def FoundTreasure(html_data):
   return NumMatches(html_data, "No treasure found.") == 0

def SearchOne(opener, results, query):
   data ="" +
   letters_correct = NumLettersCorrect(data)
   print "Query:", query, "had", letters_correct, "of", len(query), "letters"
   all_correct = letters_correct == len(query)
   if all_correct and FoundTreasure(data):
       print "Found:", query              
   return all_correct

def SearchAll(opener, results, query_prefix = ''):
   alphabet = list('abcdefghijklmnopqrstuvwxyz')
   for letter in alphabet:
       if SearchOne(opener, results, query_prefix + letter):
           SearchAll(opener, results, query_prefix + letter)

def Run(query_prefix = ''):
   opener = Login()
   results = []
   SearchAll(opener, results, query_prefix)
   print "Results: ", len(results), "words starting with '%s'" % query_prefix
   for word in results:
       print word      


Aha, the code was checking for text in the page: dot_white.gif and No treasure found. If I just added some visible-to-bots-but-invisible-to-humans text like that, I could fool the bot into mis-counting white dots or what-have-you. So that's what I did. (Security-minded folks in the audience might say: uhm, but what about stopping the general case of bots? Yeah, I set up code for that too, but wanted to let Game Control configure it to say how much guessing was "too much", and that took a while. Fooling Rich's bot--that was a quick-n-dirty fix.)

(I notice that this code imports the "time" module, but doesn't use it. I wonder if an earlier version of code politely "slept" a little between queries--but maybe Rich figured out that the server was waiting a second between responding to a team's queries anyhow, and that the sleep was thus not so useful...)

Rich noticed when his bot started generating garbage results. He mailed Game Control to make sure there were no hard feelings. Game Control asked him to stop running it, and he did. He said that this script was basically another monitor: it alerted the team to the presence of new puzzles; thus no-one had to go re-check the web site each day.

In hindsight, when I programmed that web form, we should have used it only for entering answers, not for getting puzzles. We should have used some other way to distribute puzzles. Thus, a team could monitor that to look for puzzles and Game Control wouldn't need to panic that someone was bypassing the puzzles to get the answers.

Labels: , ,

Quechup: Do NOT trust them with your address book

Quechup is a new spam site disguised as a social network. When you join up, they ask for your address book. Then they send invite emails to every address in your address book.

If you receive a Quechup "invite" from a friend, I suggest you ignore it. I've received a couple of them... and was saved from joining only because the main thing that I saw when I googled [quechup] was a lot of apologies from people who discovered that they had spammed all of their electronic acquaintances.

Labels: , ,

Pirate-themed Puzzle Hunts are Everywhere, even the Castro

Even if it didn't conflict with No More Secrets weekend, I'm not sure I'd play in a treasure hunt run by the Sisters of Perpetual Indulgence. That sounds like more fun than I could stand.

Labels: , ,

Puzzle Hunts are Everywhere, Even my Head

Last weekend was a puzzle playtest party for BATH3. BATH is a sort of pot-luck puzzle hunt in which each team makes up one puzzle. Game Control strings all of the puzzles together and runs a game around it. Part of running the game: organizing play-tests. I went for a few hours, wrestled with a few puzzles. There were a couple which made me think "Well... that's why you playtest." E.g., the one where we commented "The puzzle activity was fun, once we figured out what we were supposed to do, ahem, 55 minutes after we received the puzzle."

But there was this one puzzle that was just so elegant it made the whole day worthwhile. I shouldn't say anything about the puzzle, of course. All these things are still secret, secret until the game happens. I shouldn't even say which team's puzzle it was. Otherwise, teams trying to solve it would have a big hint: "Hey, guys, this is Team Such-and-Such's puzzle. I read about this one in a blog. If you find yourself considering a solution that is anything less than totally elegant, you're on the wrong track." I worked on it with Justin Graham and some guy named Josh. As the puzzle unfolded, I was so overcome with joy that I came as close to hugging Justin Graham as I ever expect to in my life.

On Sunday, I worked on constructing little puzzles. The BATH3 folks could use some mini-puzzles for pre-clues and such. So I've been picking up piece-work. I've been trying to make puzzles of various standard types. Some puzzle types which I always assumed to be nigh impossible to construct are easy. At least one which I thought would be easy to construct is nigh impossible. I wasted hours on Sunday on one puzzle which was easy to construct--but nigh impossible to tweak in the elegant way that I wanted.

One of my little puzzles got rejected because it was too similar to a regular puzzle which a team had made. During the play-test, I noticed that another team-submitted puzzle used a similar pirate-y puzzle-y gimmick as one of my little puzzles. Maybe I should be sad that we won't use my ideas. But I'm happy to find out that I'm starting to think like these people do.

But just starting. That elegant puzzle? I wouldn't have thought of that in years. For that, I think I need to watch the world around me, keep my eyes open. If I'm ever going to come up with something really creative, I need to think about everything.

Labels: , ,

Book Report: Treasure Island

I kicked myself off of Game Control for the Pirate BATH game. I was getting tired of reading about nothing but pirates. Factual pirate research isn't much fun. Pirates were bullies, they killed people, they enslaved people, they set peoples' homes on fire. Awful people, just awful. Pirate fiction is often pretty good, though. Does that count as research? Maybe. I remember that over the holidays, I was talking with friends when conversation drifted, as it does, to Genghis Khan. We were trying to figure out if Genghis Khan had been tall or short. Someone pointed out that in the movie "Time Bandits", Napoleon had mentioned Genghis Khan as one of the small-but-powerful forces of history. I pointed out that in Bill & Ted's Excellent Adventure, Genghis Khan hadn't seemed so short. Could we trust Napoleon? In the end, we decided to trust Napoleon because Time Bandits felt like it had been more carefully researched than Bill & Ted.

I forget what my original point was.

Oh, right, so I read Treasure Island by Robert Louis Stevenson. If you want to know where that "Black Spot" from the Pirates of the Caribbean movie came from--it's from Treasure Island. "15 Men on a Dead Man's Chest"--that song is either from Treasure Island or else popularized by it. The story itself is fluffy, a ripping adventure yarn. Still, it does a good job of portraying the pirates as horrid people. They are treacherous and dissolute--and that is their undoing. Overall, it was a fun read.

Labels: , ,

Puzzle Hunts are Everywhere, but where will Zorg start?

Yesterday, we of Team Mystic Fish got our collective act together long enough to figure out the time & location of the start of the The Apprentice Zorg game. This was, of course, a puzzle. Or, rather it was 12 mini-puzzles plus one meta-puzzle.

This puzzle is disguised as a list of teams participating in the game. That is not a coincidence. Game Control asked each time to submit a "team photo", a piece of media to represent their team. 12 teams were asked to encode a Game-Control-supplied message into their medium.

So if you look at that page, click on the "team photos" that are bordered in red. Each of them contains a secret message. When you have the solutions to (most of) those puzzles, you can apply those to the green-bordered puzzle. (For the red-bordered puzzles, you can ignore the text on the right half of the Teams page--it's not part of the puzzle.)

My personal favorite of these puzzles is Team Briny Deep's; it made me laugh. Usually audio puzzles make me groan. If I told you why this puzzle made me laugh, you wouldn't think it was funny. You need to listen to the puzzle, form a hypothesis as to its encoding, listen closely, think your method is working, think your method is failing--and then realize your method is working after all, but only seemed to be failing because of a joke. And then this feeling of joy and relief washes over you and you laugh uncontrollably. Oh, wait, did I say "you"? I meant "me".

Labels: , ,

Book Report: Polly and the Pirates #1

In this comic by Ted Naifeh, a girl is kidnapped from a boarding school to become a pirate queen aboard the Titania. This comic shows promise: all it needs now are monkeys, ninjas, and robots.

Tags:  |  |  |

Labels: ,

[Powered by Blogger | Feed | Feeds I Like ]

home |