Maker Faire 2009

There were stickers scattered randomly around this year’s Maker Faire: “Last year was better.” The weird thing was that whoever made them would had to have printed them up before the fair began. How could they know in advance? What would have happened if this year had been better than ever? Unfortunately, the stickers were right.

We’ve attended all four years of Maker Faire now, so Miles has been there at ages 3, 4, 5 and 6 (does that qualify as a tradition?) I still think it’s one of the Bay Area’s most amazing explosions of talent and creativity — there’s nothing else like it. But this year there were noticeably fewer amazing giant steel sculptures, a much smaller presence from the incredible Cyclecide, more guard rails and safety precautions, more people (again), and more attendance from professional organizations. Year by year, the fair is starting to feel a bit less like a family-friendly version of Burning Man, a bit more like an opportunity for professional Lego collectors to network.

I don’t want to make too much of that though – Maker Faire most definitely has NOT started to suck. It’s still dazzling, inspiring, amazing. Just that it’s started to feel a bit… safer than it once did.

That said, Miles and I had an amazing day watching the Giant Mouse Trap, building inventions with computer scrap parts, learning about the SCA, “driving” the amazing snail car, watching the human llama wobble around, riding the wooden bikes (my fave part of every MF), digging on a thousand kinds of robots, taking on challenges at the Instructables booth, spending way too much time at the various Legos exhibits, eating great good food on a perfect spring day. And the R2D2 Miles wanted so badly to see last year finally showed up – the little Padouin was beaming with happiness.

This year’s photo gallery (63 images and 10 videos):

Click icon at lower right after starting to view full-screen.
View the whole set at Flickr (includes captions you don’t get with the slideshow).

See also: my photos from Maker Faires 2008, 2007 and 2006.

Fidelity

This week’s California Supreme Court Ruling to uphold the voters’ recent decision to bake discrimination into the Constitution was tragic, though it was made for reasons that have little to do with the Supremes’ actual position on gay marriage.

That’s OK. Now we’ve got two years to ramp up a properly prepared campaign for the 2010 elections, in which we can upend this topsy turvy, nonsensical situation and restore reason and compassion to our state.

Courage Campaign has launched a pledge campaign to overturn Prop 8 by 2010. It may take all we can muster to turn this around, but it’s the duty of every person who considers themselves a fair, honest human being with a basic, non-negotiable conviction in basic equal rights. Please join us.

This excellent Fidelity video is already starting to air on TV across the state:

Price of Sex

Birdhouse Hosting is proud to welcome a chilling, but expertly produced new web site by photojournalist Mimi Chakarova, priceofsex.org:

Chakarova has spent more than six years reporting on sex trafficking in Eastern Europe and parts of the Middle East. The site features a series of interviews with young women sold into prostitution against their will, multimedia video pieces, reporting notes, previous work that launched on PBS’ Frontline/World, NGO resources and ways to get involved. Chakarova says:

Please spread the word and leave comments on the site. Your input is invaluable. And as always, I am grateful for your support and interest in my work.

Webcasting with Django

The Knight Digital Media Center, which runs on Django, hosts week-long workshops for working journalists who come from around the country to learn multimedia and internet technology skills. We fill many of our lunch and dinner sessions with talks by journalism industry experts and pundits, and webcast their presentations live. After workshops are over, we post the archived video for posterity. There’s more to handling multi-day, multi-part live and archived video with Django and a genuine streaming server than meets the eye, so thought I’d break it down.

An “event” can last any number of days, and can include any number of presentations, each of which may or may not include a webcast. While the event is in progress, you want the ability to advertise a single URL, where all of the live webcasts will happen. But for the archives, which is where the vast majority of viewing happens over the course of time, you want a separate page/URL for each presentation. Presentation pages include details on that speaker, summaries of what was presented, and optional downloads of PowerPoint or Keynote presentations. Our Presentation model is foreign-keyed to a master Event model (or, in our case, the Workshop model).

Because they’re time-based, synchronous events, webcasts are different from typical web pages. There are five possible “states” a webcast page can be in at any given time, all of which require different things to be inserted into the view:

Upcoming: The event is announced but there’s nothing yet to show. Tell user that webcast will be live at posted time (along with schedule).

In progress: The event is occurring. Insert appropriate object code to embed live QuickTime stream.

Concluded: The live webcast has ended, but the archives haven’t yet been prepared and posted (this can take us a few days). Tell user to come back soon.

Archive: The archived video is prepared and available on the streaming server for posterity. Insert appropriate object code to display streamed archive file from QuickTime Streaming Server.

External: We sometimes host events at other locations on campus, in which case UC Berkeley handles the webcasting rather than us. If so, we need to link from our events database to theirs. Insert appropriate message and link.

In Django, we represent these choices with the typical CHOICES construct:

webcast_state = models.CharField(max_length=4,choices=WEBCAST_STATE_CHOICES)

… which ends up looking like this in the Django admin:

webcast_state

Depending on the current state, different content (text or object/embed code) is inserted into the page in real time (using simple conditionals in Django templates). The Django admin thus becomes a handy tool our student helpers can use to make the master workshop page embed the right thing in the right place at the right time without requiring tech skills. Remember, during the course of a workshop week, all video is happening in the master Workshop page – later, streaming video archives will go into separate Presentation pages and be automatically linked to from the parent Workshop page.

Stream Handles

At the J-School, we use QuickTime Streaming Server, in part because it’s free, and in part because all of our  workstations and most of our servers are Macs. We’ve contemplated switching to Flash streaming, but the simplicity of keeping everything Mac-native keeps us on QTSS for now.

Embedding a stream from an external QTSS server is not quite as straightforward as embedding a typical QuickTime movie. Video comes from QTSS over the rtsp:// protocol, rather than http://. And there’s the catch: You can’t embed an rtsp stream directly into a web page — instead, you need to embed a fake QuickTime movie (a “reference movie”), which is actually a text file with the .mov extension. That text file simply references the full URL of the rtsp stream coming from QTSS. The contents of a reference movie file might look like this:




Here’s where things get interesting as far as Django is concerned. We don’t want to have to create a physical reference movie for every single stream we serve. And yet, at the HTML level, we have to embed something that looks like a reference to a physically external movie file, e.g.:


 
 
 
 

So how can we make Django think that /presentations/webcast-archive.227.ref.mov is an actual file on the server, which in turn contains the correct reference to the rtsp stream coming from the streaming server? In effect, it’s a “view within a view.”

webcast_setup
Click for larger version

Displaying the presentation page is straightforward Django – I won’t get into that here. But here’s how the “view within a view” stuff works. In the object section of the presentation page template there is a reference to:


which resolves to something like:


When the browser hits that line, it requests /presentations/webcast-archive.267.ref.mov from the server, which in turn triggers this entry in urls.py:

url(r'^presentations/webcast-archive.(?P\d+).ref.mov$',
'workshops.views.presentation_webcast_archive',
name='workshops_presentation_webcast_archive'),

So after the presentation page has been rendered by Django and sent to the browser, a second (very simple) view, presentation_webcast_archive, is called, which is simply:

def presentation_webcast_archive(request, pres_id):
    """
    Generate a virtual QuickTime reference movie on the fly,
    to be embedded in presentation webcast pages.
    """

    pres = get_object_or_404(Presentation,id=pres_id) 

    return render_to_response( 'workshops/presentation_webcast_archive.txt',
        {
            'p': pres,
        }, context_instance=RequestContext(request),
    )

That view spits out the same presentation object to a different template, presentation_webcast_archive.txt, which consists of:




Where webcast_path and webcast_filename are fields on the model representing the physical location of the QuickTime media on the streaming server (not the web server). After a workshop week is over, staff only need to hint the saved archive files, upload them to a directory and filename on the streaming server, enter those paths in the Django admin, and check the “Has Webcast” box. The rest is automatic.

In a previous, PHP-based version of this system, we had to prepare an actual reference movie for every archive stream we hosted. By using this “view within a view” technique, Django has let us remove that part of the workflow.