Sun, 01 May 2005
Its rough, its dirty, its still pretty cool. Diana and I originally put together a mockup for the RH blog aggregator, to replace the existing monstrosity:
It sounds like the RH blog aggregator will be moving to Planet soon anyway, so I thought I'd get an early start on the template/CSS munging. And since I was already doing it for Planet, I figured, why not take a whirl at the Planet I know and love?
Here's Planet Gnome with the new template/css. Obviously I'm not running the planet.py updater periodically, so its fixed where I left it last night. Lots of little cleanups left to do, like using day names instead of dates, hardcoding the little image sizes to improve render speed, making it work at narrower sizes, make titles link, etc. There's also a couple visual details off relative to the mockup (some of the spacing, the blog entry titles should be darker which looks better and is easier to read). I chose the colors 10 seconds ago, so they suck :-)
This design isn't just purty, its designed to improve reading too.
- The primary contextual information used for orienting the conent of a blog entry is "who". I think most regular readers are picking up the "who" from photos, so those are visually distinct off to the left.
- The name and face are also grouped closely together, which should help people build the association.
- Your eye can skim down the un-noisy left hand side (also note that we break days using a color band with the day name, so the lightly coloured bar at the left is basically the orientation/skimming bar) to find entries
- Once you've located the start of an entry (this isn't just for "searching" through the page, its a frequent orientation procedure while you read), your eye shifts over to the text in a familiar left-to-right reading direction (compare with the existing layout where people's eyes tend to try and scan on the right which is mixed with noisy text, then once they are oriented/context loaded as to the person, have to scan left and find the start of the text line to read... the little bits of extra work add up :-).
- Most of the white on the page is inside the actual blog entry content boxes (in the word balloons). Restricting white like this draws your eye into the boxes. This reduces some of the visual overload problems in the existing pgo (its even worse in the RH blog aggregator right now). In other words, the layout draws your eye into the text, which is what the blog is really about, and also keeps the amount of text from seeming overwhelming (which is what "wandering eye with no strong visual reference" tends to do to people). The existing pgo has a strong wandering eye effect, which seriously discourages people from actually reading, whereas if the text seems more managable people are more likely to dive in.
- I think the titles of blog entries are usually useless, so I almost dropped them altogether, but didn't, as you can tell.
- We avoided strong visual lines and dividers to make it easier to pleasantly "read through" the whole page. Lines get in the way of your eye, so they should only be used when you actually want to disrupt or control the eye's flow.
- As far as high level design goals, I think the "word balloon" increases the feeling of attribution. Its suggestive that there's a real person saying these things. I think its less of an issue for pgo, but for Red Hat that both improves the humanness of the blogs (the main reason companies are starting to have them, I think), and it makes it clear that the statements are individual opinions. Its subtle, but I think it has impact on how people interpret the information.
- The width of text is restricted. Its easier to read relatively narrow text columns.
Since he caught a glimpse of Kristian's wobbly windows, Bryan has stalked Red Hat's dark and hallowed halls, breathing fire, demanding his chance in the directorial seat. So it is that we bring you Monkey Hoot productions first, uh, production. Since a lot of people have asked, these videos show Luminocity running on two different laptops, both with fairly slow/old video cards (Intel i830 and ATI Radeon 7500 mobility) and open source drivers.
Luminocity
Kristian showing off his spring-modeled "wobbly windows" effect in Luminocity,Owen's crack-tastic OpenGL based window/compositing manager. This is the only effect that requires GL hardware acceleration in Luminocity (and not even much at that, Kristian's development machine uses an embedded Intel video card). Notice that menus and tooltips are also animated as they pop on and off the screen. The animation effects on window impulses are implementable in a modular manner, allowing anyone to write new effects. Monkey Hoot productions would like to thank "The Blair Witch Project" for its inspirational camera work and lighting, and apologize to our viewers.
Physics Models for Window Moving
The wobbly window effect is mildly addictive. Kristian hasn't gotten much work done since he wrote it. He (and now I) spends all day moving windows around and watching them settle. This video shows off the motion a little better. It also demonstrates Luminocity's live workspace switcher (aka pager) which updates in synch with the screen. We were surprised by how much more tangible windows felt when they gave a little (i.e. less than in this video) as you moved them (like a real world object). Of course, we turned the effect on "high" for this demo so it'd be very visible.
Live Updating Workspace Switcher
The workspace switcher in luminocity is updated in-synch with the window contents. Also notice that the workspace switcher renders each window rather than just "capturing" what each workspace looks like (this can be seen in the absence of a background in the pager), allowing us to do nice UI tricks in the future. Since its just re-using the existing window textures, applying them to a new (smaller) surface, the workspace switcher has basically no performance overhead when using hardware accel (other than a few new surfaces for your graphics card to render, no biggie for the card). Its a little hard to see in this video, but Luminocity also has a nifty workspace switching animation. It zooms out as it pans down to the next workspace and then zooms back in. Of course, since its also the compositing manager, any on screen action doesn't freeze as you switch workplaces. Watch for this as we switch into the 3rd workspace containing an animated circle-o-icons, the icons keep spinning as you switch.
Movies Still Play as the Window is Warped
A GStreamer movie pipeline rendering into Luminocity. Notice that its warping the movie as it plays without slowdown (and of course, updating the workspace switcher live, which is just re-using the same GL texture rendered onto a smaller surface).
OpenGL Accelerated Alpha Compositing
Luminocity uses GL for hardware accelerated alpha compositing. It works well with software GL implementations too. Of course, since Luminocity is a technology testbed, we use it for "unfocused windows" here, probably not a very good long term use ;-). In one of his earlier demos Owen hijacked the mouse scroll wheel to control window transperancy. Bad Owen! This video also has another nice demonstration of wobbly menus. They feel really nice, though they'll probably need to be faster in a "real world" version. The screenshot shows fdclock rendering in Luminocity. fdclock, unlike the video, actually uses a 32-bit ARGB visual to specify where (and how much) transparency it wants. No videos because our camera man is tired (you can run it yourself with "fdclock -ts").
Border/Contents Resize Synchronization
Wicked, naughty, camera man.
And there's only one punishment...
Cairo
While not as sexy as the Luminocity videos, here (finally) are screenshots of GTK+ themes rendering with Cairo enhancements. Cairo both increases the rendering quality of GTK+ widgets, and allows for widgets that scale beautifully to different sizes (of course, we also have a Cairo driven SVG renderer, knock yourself out). When you get your 600 dpi monitor, we'll be there :-)
Dynamic Themes - each widget unique
In my last X rendering post I discussed dynamic theme rendering, where every time a widget is rendered it looks slightly different. By writing algorithmic renders rather than fixed pixbuf based widgets, we can increase how dramatic the visual effects are without driving people nuts. For example, the tiger stripe buttons have proved very reasonable for long term use. However, any single rendering of a tiger stripe button would get old very quickly when repeated all over the screen ad nauseum. Currently visual designers are extremely restricted in what they can do without a theme being unusable. That's largely the reason all themes look basically the same. We hope dynamic themes will allow visual designers to increase the variety of their palette without producing themes that wear quickly. Of course, its still easy to go overboard, *grin*. By providing higher level drawing primitives, Cairo makes it much easier to implement dynamic themes.Resolution Independent Rendering

Cairo makes it easy to draw well rendered custom-widgets. Here's an example of how the GTK+ color picker looked before and after Cairo integration.
Getting Luminocity
It took me about half an hour of work (and some compiling time) to get Luminocity running using jhbuild. Eventually we'll add a jhbuild target for compiling Luminocity. Luminocity is not intended to turn into a real world window/compositing manager. Instead, its a technology test bed. We're trying stuff out in Luminocity and will be rolling them into Metacity (and hence stock GNOME) as they mature. Don't expect Luminocity to have the frills and smarts you'd expect from a normal window manager. You'll need hardware GL acceleration enabled to have wobbly windows work, though you can try the other bits of luminocity without it. Emebedded Intel video cards (which have open source DRI drivers) will work just fine. ATI and NVidia cards, of course, work even better.
This section has been superceded by the Luminocity wiki page which has simpler more up to date build instructions
- If you have not used jhbuild, get jhbuild from Gnome CVS module 'jhbuild'. Then run jhbuild bootstrap to compile basic tools such as autoconf and automake (just agree with its defaults).
- Run jhbuild build xserver Xcomposite Xdamage Xrender Xext Xcursor X11 Xtst. This will build the freedesktop.org xserver, including the damage and composite extensions, and the Xephyr/Xfake nested X servers.
- Apply a small patch that evilly hacks around some issues with DAMAGE in the X server
- Checkout module "luminocity" from Gnome CVS.
- With the jhbuild buildroot at the start of your PATH (so you get autoconf, automake, etc from the buildroot): from the luminocity directory run ./autogen.sh --prefix=PATH_TO_JHBUILD_TREE, then make and finally make install. Alternatively, see README.jhbuild for instructions on adding a "luminocity" target to jhbuild (eventually we should just include this in jhbuild).
- Now to get things running. Luminocity grabs windows from an existing X server and renders them in its own GL context. This technique is not intended to be particularly efficient, but it works surprisingly well for a development testbed. We will use "Xfake" as the X server. Xfake doesn't display windows sent to it, so they only get rendered on screen once (by luminocity). Xfake is included in the "xserver" module built by jhbuild above. If you are running at 1024x768, run jhbuild run Xfake -ac -screen 1024x3072x32 :1 to start Xfake on display :1. Basically, use XRESULTIONx(4*YRESOLUTION)x32. This is because Luminocity starts with 4 workspaces by default.
- Now lets display something on the Xfake display. From a new window, set DISPLAY to ":1" (e.g. export DISPLAY=:1). Then run any program you want to use, e.g. gnome-terminal. Of course, you won't see a window since its displaying to the fake X server.
- Start Luminocity with luminocity -f :1 PATH_TO_BACKGROUND_IMAGE. Including a background image is important since a bug in the wobbly windows rendering code causes major performance problems when the background is missing. Luminocity should now be running fullscreen, display whatever application you launched earlier (in this example, gnome-terminal). Another bug in wobbly windows increases the animation timeout every time you open a new window. This means that for every window you open, wobbly windows get jerkier and jerkier. Oops! Don't worry, this is a silly bug and not a sign that we're overloading your card or something.
- Sometimes windows start with their titlebars off screen. To move them onto the screen, you'll need to drag them while holding down the super key (if you have a Windows key on your keyboard, try this). You may have to remap your super key to make this work, esp. if you have no Windows key, e.g. xmodmap -e 'keycode 95=Super_L', which will then allow you to move windows by dragging them while holding down the F11 key.
If you need help, or you're interested in contributing to Luminocity etc, you can probably find some knowledgable people on #fedora-desktop on irc.gnome.org (naturally, you don't have to be running fedora ;-) Eventually we'll probably have a channel for this. People to look out for are: "owen", "ssp" (Soeren Sandmann), "krh" (Kristian Ho/gsberg) and "seth" (Though I'm just a user, *grin*).
Update: I wrote a little more explaining how Luminocity relates to xcompmgr/metacity/Xgl in another blog entry
Update: People have been asking what sort of hardware this was done on. Videos were shot on a mix of an IBM thinkpad X30 (with a paltry Intel i830 video card using open source drivers) and an IBM thinkpad T41 (with a slightly beefier but still pretty old Radeon Mobility 7500, also using open source drivers). Everything we're doing so far is light on hardware requirements. FYI, a locking bug was introduced in Luminocity that causes wobbly windows to get increasingly jerky as more windows are opened (or if there's no background image present, go figure!). This is not related to its CPU or graphics card use, and should be easy to fix without major codebase changes.
Update: If you're having build problems, I've updated the "jhbuild" line to include more luminocity dependencies than just xserver. Also added a note about "jhbuild bootstrap" for building the initial dev environment (auto*, etc).
Update: Build section now superceded by the Luminocity Wiki page
Just created a wiki page for Luminocity with improved build instructions. Should be a lot easier now, esp. thanks to all the people who have reported problems and found solutions on #fedora-desktop. Its basically "jhbuild build xserver luminocity" at this point, except that a patch has to be applied to xserver first.
Relation to Metacity
When it has proved itself, Luminocity's compositing manager will probably be moved into Metacity (along with any effects / extra features we consider good and stable). We originally considered doing the work in Metacity itself, but didn't want to destabilize it until various approaches were tested. Luminocity is, effectively, a testbed for Metacity. It provides a smaller/simpler codebase to test interesting rendering code with, and means we don't have to worry about fucking up Metacity in the process. Soeren's computer is (as of tonight, at least, that's the first I saw of it) running a version of Metacity that's apparently using the compositing manager code from Luminocity to render to a GL context.
Relation to xcompmgr
Luminocity has an internal compositing manager that performs the same function as xcompmgr. The compositing manager / window manager integration allows Luminocity to do things that an individual compositing manager or window manager couldn't. Of course, Luminocity composites using OpenGL, unlike xcompmgr. This apparently can be an upside and a downside, but I don't know anything about it so I'll shut my trap.
Relation to Xgl
This is the complicated one :-). I'm loathe to stick my toes in these waters because I'm the wrong person to do it, but I'm also afraid that we're going to end up with two rendering infrastructures down the road and no clarity for application developers as to which (if either) they can use. I don't know if that's where we're headed, I hope not, but I have this vague (probably, hopefully unfounded) fear... The effect will be slow adoption and general suck. I should premise this by saying that I have no direct knowledge of the Xgl codebase. I have knowledgable sources, and I know what Xgl generally is, but I haven't personally used Xgl, let alone looked at its codebase (I've barely looked at the Luminocity codebase either, for that matter).
Xgl is an X server implementation that, rather than directly accessing chip specific hardware drivers, does its low-level drawing using OpenGL calls. That means Xgl is functionally equivalent to a traditional X server, it just uses a different rendering path. Put another way, Xgl is to X11 as Glitz is to Cairo: it provides the same APIs rendered in a much smarter way.
Luminocity, on the other hand, is a compositing manager / window manager fusion that composites using OpenGL. Compositing and Window managing are all about what you do with client-rendered windows. Luminocity doesn't know what's inside windows, and it doesn't care. Xgl, on the other hand, I would characterize as primarily being about how the contents of windows are drawn (in this case: quickly and with less CPU load, *grin*). Xgl can do some other non-inside-window things like drop shadows, but I'm going to argue later those are mostly expedient demos of cool technology and Xgl is probably not the place we want to be doing those things long term. From the perspective that Luminocity is mostly about rendering windows and Xgl is mostly about rendering window contents, they are theoretically complimentary. At the moment, they can not be used in conjuction with one another (since they both want to directly drive the GL hardware), but they're goals are at least compatible.
Neither Xgl nor Luminocity are complete on their own. Xgl provides an X server and requires a window manager (and a compositing manager?) (and an X server for doing GL calls into, but see below, that will hopefully cease to be an issue eventually). Luminocity provides a window manager and a compositing manager but requires an X server (currently using Xfake or Xephyr, though supposedly there's some plan for modifying the core fd.o X server so Luminocity will work using only the host X server?). With some hand waving (in particular there's no way to hand OpenGL textures residing in the video card between processes), perhaps we could get Xgl to render windows into textures on the video card, and then use Luminocity to figure out what do with those textures. All graphics computations are done by the card, and data flows only once to the card. Perfect! Other than those niggly make-or-break technical details ;-)
As far as I know (and I'm pretty sure of this), there is no systematic way (besides GLX inside a running XFree86 / fdo.o X server) to access the "hardware accelerated OpenGL drivers". That means that Xgl and Luminocity are currently forced to have a traditional host X server, open a fullscreen window on the host server and draw into it using OpenGL. Both Luminocity and Xgl are premised on OpenGL as the standard API through which vendors can provide graphics hardware acceleration (as opposed to, say, RENDER).
Update: Soeren, one of our X hackers, thinks that Xgl actually includes no cross-window stuff but just uses an existing compositing manager (and of course, accelerates its rendering). In that case, the next couple paragraphs are totally unnecessary. Like I said above, I don't know anything about the Xgl codebase.
In addition to traditional X server features, Xgl performs some cross-window effects (such as drop shadows). This is the main area where Luminocity and Xgl could be seen as overlapping. As a mentioned before, I would argue that the X server (including Xgl) should not be doing these things long term, for a few reasons. I am not sure if David considers this point contentious or not. It could well be that he too considers these effects just a quick way to get some neat effects in play, not the best way long term, I have no idea.
- Drawing drop shadows on windows in the X server is equivalent to drawing titlebars on windows in the X server (instead of the window manager). One (dumb) example is that this will mean they are outside the purvue of themes (short of having an "X server theme", *wink*). If you believe in the separation of window manager and xserver (fwiw, I think its valid to believe that wm and xserver should be merged), that's an argument against doing this sort of effect in Xgl.
- The X server does not have high-level information available to it, compared with the information made available to the compositing/window managers. For example, using our drop shadow example again, window manager hints will let applications tell the window manager not to shadow something (say, the gnome panel). An X server like Xgl is forced to resort to guessing (of course, sometimes window managers resort to guessing too since WM hints are often vague and implemented differently ;-). To give another example, consider the window border/contents synchronization on resize feature of luminocity. This relies on WM<->application communication to specify when a redraw has been completed so the WM doesn't draw its borders to the screen until the application is redrawn, and compositing manager support to double buffer the change when its actually applied, removing the last little bit of flicker. If its even possible to do this in the X server, its going to require some serious hackery (with the emphasis on hack), and probably some guessing in addition.
- Loosely related to both #1 and #2, putting this stuff in the X server means you have to upgrade your xserver (or add some sort of effects plugin system to the xserver) to get changes to the visuals. It sort of defeats the idea of the X server as the low-level no-nonsense piece.
I would not take something I say here as authoritative! My knowledge of this stuff only scratches the surface. But many people have been saying even less informed things, so I wanted to get slightly more accurate info out there (esp. on online forum comments). Enjoy :-)
The three immediate design stakeholders in the 'enterprise desktop' are: end users, help desk staff, and desktop system administrators. Most design work for GNOME has gone into improving the end user experience, which is really the dominant stakeholder of those three. Some improvements aimed at end-users, like promoting preferences instead of settings you can get wrong, have also made life a little easier for help desk staff (as people are that much less likely to hose things). Recently Mark's work on Vino has added a very large improvement for help desk staff: the ability to remotely view and operate user's desktops (there is nothing more frustrating than blindly stepping people through computer operations over the phone).
So what about sysadmins? Sabayon is GNOME's first major design targeted at improving the user experience for people who administer GNOME systems, and hopefully the start of an initiative toward designing for this important group of users. I'm jazzed about Sabayon as the first step toward a historic goal: GNOME as the definitive desktop management experience for sysadmins. We have a long way to go, but if there's a hundred possible improvements to make over Windows and MacOS/X toward the end-user experience, there's a thousand for admins. But big things start with small steps, right? I see promise for Sabayon as the ground floor of the revolution! <seth takes a deep breath and returns back to earth> In any case, whatever the future holds, this is fertile territory because the status quo is so much worse than it needs to be.
GConf, with its support for mandatory settings and system defaults, was supposed to be a big improvement for system administrators, but it ended up being something of a boondogle because the features were hard for sysadmins to use. In most cases it actually made things harder as sysadmins struggled through the giant XML files for defaults (most probably tried to edit schemas instead, which isn't even the right thing, but its not their fault because we didn't publicize this well). Even apart from the XML files being long and verbose, remember that most sysadmins in the world (think Windows), esp. desktop sysadmins, are not uber-leet Unix haxors who adore vi and the command-line.
Speaking of leetness, two super-leet Red Hat desktop hackers with funny accents are kicking off work on Sabayon: Mark McLoughlin (panel maintainer, etc) and Daniel Veillard (libxml & gamin maintainer). There was a tuffle over the name, but the French (what with their centuries of cultural sophistication and all) beat out the elves. As Mark explains it, DV probably just wanted to be able to say, "Hello I'm Daniel Veillard and I pronounce Sabayon 'Sa-ba-yon'". Our Irish hackers really are like little elves that write code. You go to bed and when you wake up in morning a bunch of code has magically appeared. In retaliation, I was assigned the mythical character of a "Troll" by DV, but this does not hinder my speaking the truth. I may be a troll, but I am a truthful troll. The only thing that serves to dampen Mark's elf-nature is when he lights up like a chimney stack, strangles me with scarves, whacks me with bats, drives through red lights and otherwise engages in behavior liable to result in death. But back to Sabayon.
Humble Beginnings, What Sabayon Does Today
First and foremost, Sabayon provides a sane way to edit GConf defaults and GConf mandatory keys: the same way you edit your desktop. Sabayon launches profiles in an Xnest window. Any changes you make in the Xnest window are saved back to the profile file, which can then be applied to user's accounts. Want to add a new applet to the panel? Right click on the panel and add one just like you usually would. Of course, you're also free to use gconf-editor to change keys at a lower level, or download any GNOME setting tweaking program from the internet and use that. Sabayon also uses gamin to watch changes you make to the filesystem. So if you want to change the font for your users, you can drag a TTF to ~/.fonts, change it in "Font Preferences", and voila. When you're done making changes, you can save the profile. A change log will automatically be generated so an organization with a number of sysadmins can track down what changed when. Hopefully in the future we'll also have revision support for desktop profiles.
Right now Sabayon has support for tracking: GConf settings, panel applet addition/removal, general files and special Firefox profile support.
The Illustrated Tour of Sabayon HEAD
-
First we launch Sabayon (if a non-root user it uses console helper to get root).

-
Lets create a new profile for panty-waist designers. We base it off our existing Office Desktop profile.

-
Sabayon starts an instance of that profile in an Xnest, including the sabayon monitor window.
-
Designers need to be coddled, we create a welcoming text file for them and save it to the desktop.
-
In response to saving the new text file, two new entries appear in the sabayon monitor. We don't actually want to change the recently used list, so we tell sabayon to ignore that setting.
-
We drag a new Gimp launcher to the panel. Gimp is like crack for designers.
-
In response to the new launcher, sabayon monitor shows some new entries (and I have a continuity error in taking screenshots, there should still be the two items for creating the text file because we haven't yet saved, oops). Notice that Sabayon records a "Panel object added" change rather than a dozen GConf keys being added. Sabayon can be taught to aggregate standard groups of changes together to make it clearer to admins what's going on when they read through the change log.
-
Designers like pretty things, lets change the background. (As a total aside... the background capplet rewrites its GConf keys constantly a couple times a second whether they have changed or not, which makes the sabayon monitor flash a bunch in the background. The monitor has been interesting in revealing a lot of apps that are setting keys / saving settings files at weird times, which would be sucky in a networked environment)

-
And, as expected, the Sabayon monitor shows a bunch of GConf keys being changed. We've also gone ahead and checked the keys for adding the Gimp launcher to be "mandatory". That means users that have this profile applied will be unable to remove the Gimp launcher. Unexpectedly, there's a bunch of ".fonts.cache" files in the list too. Sabayon has a list of files and directories to ignore, but its not complete yet. For now, some operations will generate a bunch of file change noise.
-
If we just quit now, the all-in-one Desktop Designer.zip profile in /etc/desktop-profiles would not have been updated. If we're happy with the changes, we can save them back to the profile.
-
The profile can then be distributed to computer(s) and applied to the relevant user's homedirs. We haven't started working on the mechanisms for this yet, Sabayon is the first piece in a bigger framework. For example, once we get the Netscape directory server code released and have a robust free ldap server, we can potentially host e.g. the GConf settings there and push to the server instead of applying bits to actual hard drives (or NFS shares).
In the interim, the SabayonProfile class already knows how to apply profiles onto a directory. Actually, every time you edit a profile, a new temp directory is created first, and the profile is then applied to it. Consequently, it should be pretty easy for sysadmins to cook up their own python scripts using the SabayonProfile class that work on their custom systems today.
To Infinity, And Beyond!
Sabayon is just the first step in improving the manageability of GNOME. We (well, I) wanted to get something concrete landed that will help us focus on sysadmins as users, rather than designing a bunch of abstract features. It also exposes manageability features GNOME has theoretically had, but never exposed in a way people could easily exploit, which is good. I'm rambling now, again, but here are some random things markmc, dv and jdennis might be working on in the future:
- Making sabayon solid. Its still a very young project (its one month birthday is tomorrow), and is rather rough around the edges. Things are falling into place pretty quickly now, but there's a lot of work still to go just in making the current feature set work better. Some simple improvements like expanding the "ignore changes to these directories" list will make things a lot better. We also have a number of UI features that aren't in the current codebase.
- Supporting revision history on profiles
- Figure out how Stateless Linux (in a nutshell, where the root partition is mounted read-only and synched transparently with a central source, giving the central-state advantages of thin client with the low hardware and network infrastructure costs of cheap-intel-box thick client) and Sabayon work together. Stateless Linux makes it easier for one admin to support many machines. Sabayon (particularly sabayon of the future) will make it easier for one admin to support many users. The intersection of these two is a very nice place to be!
- We might try to figuring out a short term solution to distributing profiles to user home-directories (whether those be on an NFS share or spread across a couple dozen computer hard drives).
- A real icon and a logo, because self-respecting GNOME projects these days need kewl logos from day one. By showing the world the icon I barfed up (
), Diana will be forced to make us a new icon, pronto. Designers can't stand ugly graphics. - Backing GConf with some sort of network store, perhaps LDAP. If we could get a drop in and run GConf server using the better-be-freed-soon netscape directory code, that would be awesome.
- Reducing the pain of panel management and upgrading by moving to a new layout/storing model where applets are either "on" or "off". Panel cursors allow control over where applets go. This means adding/removing/changing applets in upgrades becomes possible. Currently it breaks everything, which is a management nightmare for distros, let alone the lone sysadmin
- Figuring out how to improve managebility of the Frankendesktop (word thanks to Luis). OO.o and Firefox mean that GConf support alone isn't enough for now. But if we're tied into supporting all these systems, we may never have the ability to do something as nice and universal as Windows group policy. So one project is to figure out if we can back OO.o and Firefox preferences using GConf. Then we can support GConf with all our heart, soul and mind in the tools and on the server.
- Extend GConf to support features that allow small numbers of admins to support hundreds or thousands of users (such as group policy). We don't just want to copy giant technical architectures blindly, and we haven't started looking into this design yet, so its very vague for now.
Getting Sabayon
Sabayon is a little buggy atm, but its pretty easy to get running :-). Python source is available from the sabayon module in GNOME cvs. The major dependencies are pygtk and the gamin python bindings (these are available in fedora core HEAD, but gamin-python is not in FC3, I think). I think the GConf parts will still work even if you don't have the gamin python bindings, but YMMV. You'll also have to paste in two one-line text files in /etc/gconf/2 as per the README, but its pretty easy.
And now for a less sexy blog post. I just sent this message to desktop-devel, but as per the message, I know many GNOME hackers no longer read lists completely, soooo....:
We need to get desktop-devel back to the useful hacker exchange it once was (probably only in the soft glow of memory, but hey). That means not only do GNOME enthusiasts need to be more restrained, but we (the core hacking community) need to get back on the list, start using shared channels like #gnome-hackers (even for hacker-to-hacker social purposes) again, etc.
Forward: For a drawn out post on next-generation X rendering, this blog entry is really short on eye candy. I apologize, but I'm at home, separated from my beloved eye candy, and figured I should write this while I felt motivated. As a way of forcing my own hand, I'm making a link now to a blog entry I haven't yet written that will contain screenshots in the future :-)
Next-Generation Rendering For the Free Desktop
For the past half year or so Red Hat's desktop team has had people working toward making accelerated graphics rendering on the free desktop badass, but doing an ass job of actually talking about what they're doing in a larger public / GNOME context. They've been doing a combination of experimentation (from that cracktastic OpenGL compositing/window manager luminocity to xsnow for the Xcomposite generation) and knuckle-down no-holds-barred infrastructure work (like making Win32 GTK work on Cairo so GTK can move to cairo as the default backend). With RHEL4 kicked out the door we've been able to rebalance day-to-day work on GTK and X onto other people to give the nextgenren hackers free hands. Currently the full-time nextgenren team at Red Hat is Owen Taylor (gtk/pango maintainer), Søren Sandmann (x hacker), Diana Fong (visual designer), Kristian Høgsberg (x hacker) and Carl Worth (cairo maintainer).
I'm really excited because these guy's expertise is across a broad chunk of the rendering pipeline, from the toolkit down to the x server, which is going to give this effort the ability to work on this from a global perspective rather than optimizing the bits where we happen to have influence in. I'm doubly excited because other companies (well, Novell at least, but hopefully others will join) are starting to invest in this effort too!
I'm hoping to drag Owen into spinning this off into an umbrella effort (ala project utopia) to help maintain a coherent story/platform even as lots of people pour work into lots of different packages and distros. There are so many different ways to attack the X rendering issue that I'm a little worried about seeing a lot of fragmentation of effort and the result not being particularly coherent. I do hope people experiment with lots of different approaches, but I also really hope that in we can give developers a consistent platform for doing cool graphics on the free desktop. It would be a real shame to end up with the message in two years being "well, platform X has the feature you want, but you have to worry about also working with Y because X won't work well on distro Z". This sort of technology-choice morass can really dampen developers playing with this stuff and adding support all over GNOME, which is exactly the sort of quick-fiddling big-payoff stuff I think we'll see a lot of as soon as this stuff starts landing. In other words, lets push toward the point where people can feel confident and start hacking up cool things for this system inside GNOME.
What It Might Look Like
A really good system needs to have lots of pieces in place all hooked together....its not something that can be hacked apart and replaced by arbitrary random incompatible bits (though there are points of commonality, such as OpenGL or Render). For example the pieces in one imaginable architecture - by no means the decided-upon final one or anything - might look like:
- A sophisticated drawing layer (cairo using glitz/opengl or render as backends)
- Stock renderers built on top of that drawing layer (pdf/ps rendering backed by cairo - such as Alex Larsson's xpdf fork in evince, svg rendering backed by cairo, etc)
- A toolkit that agressively takes advantage of the features in the drawing layer, exposing them to applications and themes (gtk+)
- A window+compositing manager that can work closely with the toolkit but essentially takes the window contents as a static image in compositing (metacity with luminocity-like GL compositing manager features fused in to deal with window effects, synching up smooth resizing, live window thumbnailing, crazy pagers, etc)
- A hardware driver system to expose a low-level hardware accelerated rendering path to the drawing layer (opengl or render with hardware accel)
With that model we can implement things like:
- Toolkit themes that draw with layer blending effects, delightful bezier curves, and irritating alpha gradients
- Indiana Jones buttons that puff out smoothly animated clouds of smoke when you click on them
- Alpha transparency in applications whenever and wherever the urge strikes us
- Live window thumbnails
- Hardware accelerated PDF viewers
- Hundreds of spinning soft snowflakes floating over your screen.... without messing up nautilus
- A photograph of a field of long dry savanna grass as your desktop background... where the grass is gently swooshed around by a breeze created by moving your mouse across the background
- Windows that shrink scale and move all over the fucking place with cool animations
- Synchronized smooth resizing so there's no disjunct between window borders moving and the contents redrawing (you should see the demos of this in luminocity... it really makes a difference in how real the interface feels, just as double-buffering did for stuff moving)
- A shared path between on-screen display and printing (using Cairo's PDF/PS backends)
- Vector icons with very occasional super subtle animations rendered in realtime...a tiny fly which buzzes around the trash every several minutes, etc... think mood animations as in Riven (which as a total random aside is still a shockingly beautiful and atmospheric game years after it came out, postage stamp sized multimedia videos notwithstanding)
- Workspace switching effects so lavish they make Keynote jealous
- Brush stroke / Sumi-e, tiger striped, and other dynamically rendered themes where every button, every line looks a little different (need to post shots / explanation of this stuff, but another day)
- Progress bars made with tendrils of curves that smoothly twist and squirm like a bucket of snakes as the bar grows
- Text transformed and twisted beyond recognition in a manner both unseemly and cruel
- A 10% opaque giant floating head of tigert overlayed above all the windows and the desktop.
- etc etc. In short: awesome.
And that's a conservative approach to this: each window essentially renders into a texture which are then combined in a separate rendering pass by the compositing manager. A lot of the work Diana does challenges our assumptions about what this rendering system should be able to do. For example, something as simple as a swoosh that cuts across both the window and the titlebar is currently very tricky. Diana's work has illustrated something that may be obvious, but seems to be forgotten in the excitement to build the One True Graphics Pipeline (this does not exist!): Its very important to figure out many of the things you want to do with the graphics system before you get in too deep and dirty, because there are a lot of directions we could go that call for rather different architectural choices. To give one example, if we decided we really cared about having lots of animations throughout GNOME (this isn't something we're pushing, but we talked about it) that would dictate a very different approach from a graphics system where we really really cared about printing. You can't always have your cake and eat it too... especially not when you consider implementation constraints.
Another example of how prioritizing "what do we want to improve with this" can change the direction: Since taking advantage of these new toys would require a new theme system, Havoc and I have been talking about how a very different theme / widget rendering system might work with this that allows for custom design of any window, widget, or anything in between. One of the things us designers have been experimenting with behind closed doors is what you can do with a window's design when its not drawn out of a bunch of stock widgets but you have a freer hand. (This does not mean visual inconsistency, just as a magazine can maintain a consistent look but still do a fresh layout for each page using a mix of stock and new elements.) The results can be really good. No matter how good the artist, you can only get so far designing a crude palette of some fixed number of widgets which are then used in preset. A good theme/widget rendering framework would help us negotiate this balance between re-using stock elements, and overriding the rendering of widgets at appropriate points to customize how a "Control Center Preference Page" is drawn or to simply shift the text in buttons over 10 pixels to the left. Figuring out how this stuff works, or if we just want to leave the theming issue alone (which would sort of be a shame given how much of the old flooring we're tearing up around it), may also have a significant impact on the final architecture.
A radical model (which also avoids multi-pass rendering without opening up security issues present in sharing direct access to existing graphic cards between processes) might involve a centrally rendered scene-graph where each client is given a subtree to add higher-level primitives. That could give us access to candy like pixel and vertex shaders (which we experimented with several months ago as part of rendering subtle but live backgrounds of grass fields, etc), which are attached to nodes on the render tree. Of course, there are many paths for leveraging shaders short of a full scene graph system. The scene graph model has a lot of significant concerns that are not as relevant to, say, 3D games where this model is common. Text rendering is one example.
Owen and company have slides from the X dev conf, but the punks did them as SVGs so unless you have their k-rad Cairo backed SVG slide presentation program, or if you're willing to view slides in Inkscape... they're not much good (though it is cool that you can find the slide you need using Nautilus thumbnails, but I digress) (hmmm, you can also open them in eog). Honestly, not the most inspiring OR detailed slides in the world either. I don't think they'd had much sleep when they wrote them up. *grin*
Anyway... I'm rambling. I've given a couple points too much depth, most points not enough depth, many points I've missed, and doubtless some I've gotten wrong, but I knew if I waited to write the perfect post on this there'd be only more backlog of material to share... so a braindump it was. :-) I guess in the end I'm pretty excited. It feels like we're running the last couple miles to get to the giant great-rendering payoff Keith Packard kicked off in the X world several years ago.
Code and stuff
- Cairo I think everyone knows about... writing for Cairo in Python or Mono is especially cool. Its really easy to get something that looks good going in short order. If you haven't played with it, you should!
- Luminocity is in GNOME cvs with the module name 'luminocity'
- Metacity compositing work is in 'metacity' with the branch 'spiffifity'
- GTK+ / Cairo integration.... gtk+ HEAD!
Apparently they also have a jhbuild setup that'll build all this stuff thats headed for CVS in fairly short order.
And for my last point...
Hula!
I promised my next blog manifesto would be handed over to The Journal, and, behold, the latest GNOME Journal is upon us.
In it, I chronicle the rise and fall of GNOME. Its a rousing tale of charred corpses and classical chrome starring Enlightenment as the wayward prostitute and George Jirka as Her Royal Majesty the Queen of England. Cameos by Beagle, PyGTK, and the cultural revolution.
In all seriousness (well, more seriousness, at least), I hope after reading the article people will at least talk about the problem: GNOME is sort of boring right now. When you interpret usability soley as restraint and polishing it can really dampen project enthusiasm over time. All work and no play makes jack a dull boy.
Design not UsabilityThe partial solution I would proffer is to focus on design instead of usability. There's a big difference. I'm sure there will be a big hoopla over Apple today owing to the expo, and they deserve it. I think it would be very hard to argue that the things Apple does are not interesting. Part of the reason Apple is interesting is because they encourage designs that change market norms. Good design is challenging. I mean that two ways: both that it is hard to do, and that it tends to shake things up.
Extreme shaftation is an oft used and effective approach to producing really good designs. That's part of the reason its far harder to do a good design in a non-1.0 product. In a 1.0 product you don't have existing users, there's nobody to shaft. You can choose who you want to target, and do it well (unless you position yourself, say, as a Microsoft Word replacement in which case you inherit the set of expectations!). As soon as you have users, its very very hard to drop things from the requirements list. The point of the shafting isn't to remove individual features, or to increase simplicity (necessarily). Simplicity sucks if it doesn't do anything. The point is expand the scope of possible designs, its to let you do new and more interesting things.
Focusing on usability devolves into a sort of bean counting. You divide up the "requirements list" and figure out how to cram all of it in, and then trying to organize the minutia (button labels, menu organization, etc) so it somehow still all makes sense. The result isn't very sexy, and is agressively mediocre. Every point on the requirements list pins you down. In the end the requirements list does the design instead of you. When everybody else is producing nutso apps with a billion buttons and no sort of consistency (c.f. GNOME 1.x), the result of usability looks pretty good. But by shedding some constraints, losing most of the requirements, and focusing carefully you can usually make something much better.
Shedding the Requirements List by Zeroing User Expectations (MS Office)Microsoft Office exemplifies usability in action. They have a huge list of features that Office must have or users will be angry. They have done a good job of taking that massive list and producing something sane. I am sure that every dialogue and menu in MS Office is poured over with excruciating care: "Will that wording confuse people?", "What are people most likely to be looking for in this menu?" etc. It shows. Office is very polished. Its also a very poor design.
If I were commissioned by Microsoft to dramatically improve Office, my first step would be to position the project not as a next-generation Microsoft Office, but as a new product. I might even start with the Office codebase, but I sure as hell couldn't work with the smothering mantle of user expectations that looms over Office. Done well, I think you'd largely displace Office in the market (assuming this was a Microsoft product, I don't mean to imply that anybody could just make a better product and flounce Office in the market). So you are meeting the goals people have in using Office. What you're not doing is slogging through trying to meet the specific needs people have of the existing software. If you do that, you'll just end up writing Office again.
New Software Resets the Requirements List Anyway (E-mail)Its important to understand that most 'feature' or 'requirements' lists are a reflection of user's needs and desires relative to existing implementations. If you improve the model enough, most of this is renegotiable.
E-mail is a great example of this. Lets say the internet hadn't appeared until 2004. You are right now in the process of designing the first E-mail app. Clearly users need the ability to make tables, right? I mean, that's "word processing 101". And to format them precisely, oh and insert drawings. And equations. And to edit graphs inline, and to set the margins and page settings. etc etc.
You could easily end up with the requirements list for Microsoft Word: a design for creating multi-page labour intensive laid-out documents. These are the requirements you'd extract from the "word processor + postal mail" model. But E-mail totally renegotiated this. Short little messages are the norm, not multi-page documents. You receive many dozens of mails a day, not several. There's no question that being able to insert a table here and there would be nice, but its by no means a requirement. E-mail's one compelling feature, instant and effortless transmission of text, renders the old model's "must have requirements" list a moot point.
Dear Professor Harris, your course has been remarkably useful to me. I recently discovered I can view archived copies of your past lectures through stanford online. Reliving those memories has helped me recapture something I had lost since leaving your class. Now whenever I find myself off-center, struggling with my personal demon, I log on to the website and help is only a few key clicks away. (P.S, the issue I've been struggling with is insomnia)
Just released gnome-blog 0.8. New features include drag and drop uploading of images (to compatible blog software), spell checking, more blogs supported, and proxy support. Currently we are known to support: pyblosxom, advogato.org, blogger.com, movable type, livejournal.com, and wordpress. It should work with any MetaWeblog or bloggerAPI compatible blog, but YMMV.
See the gnome-blog web site for more info, tarballs, rpms, etc
I wrote this article the better part of a year ago and forgot about it. I just noticed it was pushed live:
Improving Usability: Principles and Steps for Better Software
Actually, I don't see any steps in there. Apparently I was also interested in the history of design at the time (which is a cool topic, really, so I guess I'm still interested). But I enjoyed rereading it, and its nice to notice that, while I would have written the article from a very different angle today, the principles are still the same. You know its been a good year when your principles are still the same at the end of it. :-)
Executive Summary:
The article covers a number of design principles, situating them in the historical context that made the principle relevant. The principles are:
- User Knowledge Principle Figure out who your user is, what they do, and what they need.
- Feature Bloat Principle Recognize the cost of each feature you add and each exceptional use case you accommodate.
- Focus Principle Good design requires editing. Focus the design on one principle class of users.
- Abstraction Principle Keep track of conceptual model your software requires, and work at making it simpler. Reduce cognitive friction.
- Direct Manipulation Principle Enable the illusion of direct manipulation when there is a reasonable physical metaphor.
Then the article dives through four of the most important phases (suppose this is the wrong word since they often overlap, repeat, occur simulateously, etc) of software design.
|
Jamie's Silhouette in Prague Castle |
I was on vacation
last week in the Czech republic with Jamie. We ended up spending most
of the week in Prague, but did
escape into the countryside a little. Photographic Glut Before we left Jamie said she was bringing a digital camera. I delivered my usual spiel about how "anything worth remembering doesn't require a photograph to remember it". Alas, while my relationship with the camera was initially frigid I warmed up to it. Eventually it possessed me, and I'm afraid I might be hooked on photography now. Jamie can attest that I tried to stop: "this is the last photograph, last photograph, really. this time." Currently I am staving off the desire to drop $1400 on a Nikon D70 digital SLR. Bad Seth! So that is my excuse why this blog entry is a series of photographs instead of a long winded trip journal. Actually, that doesn't sound so bad. Nobody reads long textual things anyway. In fact, I doubt anybody has read this far (except my grandmother) and have instead prefererred scanning through the photos. I'm too lazy to make all these pictures in the blog link to the full sized image, but they're all found in my "best of prague" 2004 designer collection. I've also got a larger 70 photo album. |
Czech Countryside
The Shows
I can not recommend Prague too highly if you like "high art" performances and/or are a miser. There are at least a half dozen chamber music performances every night, the opera is cheap (we paid $15/ticket for very reasonable seats), and unconventional performance art forms abound (of note were the national marionette theatre and Laterna Magicka).
The marionette theatre performed Mozart's Don Giovanni, which might sound dry, but it was amply laced with humour and was somewhat vulgar - true to traditional puppetry. The entire audience was in hysterics by the end. That said, their performance didn't make a mockery of the opera at all. They found a perfect balance between sucking you into the drama, and then breaking up the boring bits with comic relief. This is particularly impressive because, of course, all the spoken (well, sung) words were in Italian; though I'm familiar with the material, so that might have aided with the dramatic bits.
Prague in one photo: gothic spire, quaint old buildings, 1960s Soviet cement block apartments
Laterna Magicka is possibly the best performance I have ever seen. It was certainely the weirdest. It is basically ballet with some silent (good) acting. The catch is that they use three movie projectors projecting onto white cloth to construct the "set". The characters move in and out of the "movie" part seemless and interact across the boundary. For example, a live actor will run through the sheet and suddenly pop up in that location on the projected image. They'll then turn around and continue a conversation with a live actor on the stage. Laterna also has a penchant for flying objects and people on ropes. For example, they'll remove the middle projection cloth, and a character on the left projection will toss a rose to the right. A physical rose will then go flying through the air (and do a loop or something) in the middle. Its very hard to explain, but the net effect is abstract, colorful, and a total mindfuck. In a way, I would say that Laterna is a spiritual extension of (the impressive but often tedious) non-narrative cinema that uses the presence of physical actors to draw the audience in and keep them interested. Its engaging high art. Very cool.
In the realm of the national opera, we were fortunate enough to catch Verdi's Aida, one of the "great operas". The national opera was having a Verdi week with a different opera of his each day. This was definitely the most well known, and we were able to warp our schedules to make it (thanks Jamie!). I was not familiar enough with Aida to closely follow the plot (what opera has a good plot and libretto anyway?!? I think if we're honest most operas' plots suck. its about the music stupid). However, the music was absolutely terrific, and the performances were top notch. I really liked the lead tenor (who played Radames) vocal performance, but his acting was terribly rigid. He didn't seem able to emote and/or move and sing at the same time. Oh well. The mezzo who played Amneris was both a fluid actress and delivered a phenomenal vocal performance. Aida herself was also good, though her voice lost some resonance seemed thin in its upper register (of course, she had resonance to lose...). Oh how easy it is to be a critic *grin*. Anyway, the long and short is that they delivered a "world class" opera performance at prices that mortals can absorb without getting a nosebleed.
Speaking of Verdi, we sadly missed a performance of Verdi's Requiem in favor of visiting the Church of St. Nicholas...which turned out to be closed. Too bad because its one of my favorite choral worksi, and the performance was in a large gothic church which would have doubless contributed an interesting mood (not to mention the effect on the timbre!).
Rail Control Station |
Charles Bridge over the Vltava River |
Carved Doorway in a Sidestreet |
The Sights
My favorite sights were non-historical: sitting on a bench and watching the river, walking down random sidestreets in Prague, riding the underground aimlessly and popping out at random stations to see what's there, visiting a department store to czech out the latest clothing fashions (I swear I will never use that pun again, please keep reading) and grocery items, watching people cavort around the town square at 1am, and strolling through the countryside. Jamie was more into visiting all the "must see" locations, and this generated a little friction for the first few days. Fortunately we resolved this and the rest of the trip was marvelous.
Rowboats on the Vltava River
Of course, many of the historical things we saw were incredible too. I was particularly pleased wit the St. Vitus Cathedral and Karlštejn Castle. Many period religious structures (*cough* church of st. nicholas) are terribly ornate. I tend not to appreciate structures just because they are old. Many grand and/or famous old structures do have beautiful design that tickle my fickle modern aesthetic sensibilities. Many do not. In any case, the Cathedral, while painfully gothic and overwrought on the outside, is composed internally with sparse shapely arches and the best stained glass I have ever seen.
The tower of the St. Vitus Cathedral is quite a ways up and is accessed by a narrow spiral staircase with no windows or railing. The tower is, I am sure, eminently defensible, but not pleasant when jammed with people going up and down with barely enough room. It was particularly unpleasant when the lights went out. However, the view from the top paid us back with double dividends. Many of the best photos from the trip were taken from the tower, which affords a panoramic view of the city with few obstructions. Its also perfectly situated along the river to capture many of the arching stone bridges.
Old Town Square in Prague |
Karlštejn Castle |
Food & Beer
What can I say, beer was literally cheaper than water. Food was a mixed bag. I wasn't blown away by "local cuisine" (I mean, ghoulash is fine, but its not thrilling). On the other hand, restaurants were very cheap and Prague has reasonably good foreign food (particularly a lot of Italian). Lots of hitting cafes at night for hot chocolate or coffee. We ate at KFC once (I take full responsibility for this, I was stressed out, hungry, and things were closed. Jamie was dragged there). We hit a grocery store and went through grabbing things that looked interesting. The result was a basket piled with chocolate and junk food. The cashier looked at us funny. I am pleased to report that the Czechs apparently share my affinity for hazlenuts. Juice, tarts, and other fruity things were a highlight of the trip, particularly for Jamie. I probably should have indulged in juice more, but I was too happy to have cheap decent espresso.
We finally stumbled upon an absolutely stupendous "fancy restaurant" one night for desert. We'd gone up the funicalar railway into the hills around Prague at night to see the view of the city. We never got a really satisfactory view (though it did provide a nice walk), but one of the stops was for a high class restaurant. We got out on a whim and grabbed desert and coffee there. Fresh rasberry, pear and lemon sorbets, and a desert cheese filled with pear chunks and drizzled in a tangy sauce, open night view of prague, live piano, a silky cappucino, cool night air. Completely-off-the-charts sort of good. We came back the next day (our last) for dinner, and had 4 incredible courses for $15 a head (starting with those sorbets... yum). Main courses (Saffron, mint. Enough said.), which we split for maximuum effect, were not just delicious but beautifully arranged. It was a perfect way to end the trip... we left for the airport 5 hours later.
St. Vitus Cathedral over the Vltava River |
Statue At Bat |
Broken Ankle
My broken ankle has mostly mended, so I was able to get around pretty well. Some days it didn't feel as good as others and I wore my "robo leg" brace, but most days I got away with a shoe-compatible brace designed for sprained ankles. We mostly took the underground around prague, and walked from point to point. Prague also has a nice tram and bus system, but we didn't figure out the routes until the last couple days. Too bad, it would have been interesting to ride a tram around the town. Just yesterday I extracted begrudging permission from the physical therapist to start cycling again. She walked back in a minute later and asked how far I was planning to ride. Busted! We compromised on 10 miles. I'm going stir crazy: haven't ridden this whole year. First it was winter, and then right when spring was coming and I had gotten my bike back into shape (lost the rear wheel in transit across the US) I did my ankle in.
Taking pictures of people still elludes me. It didn't help that the camera had a 4 second delay from when you squeezed the button to when it took the picture; ruins the possibility of capturing spontaneous moments, save by freak accident.
Jamie in the Great Hall of Prague Castle |
Jamie Outside Something-or-Other |
A 30 photo album is here, which is a subset of a larger 70 photo album. All the photos here are in the 30 photo album.
Let the record show...
I'd just like to state, for the record, that Owen Taylor has sullied his fancy-pants GTK engineering self. Not content merely to perpetuate and even initiate nasty hacks on python internals, his lust for for evil not sated by working on an IRC bot. No! Owen had to go and work on an X-Chat plugin. Is this really a man you'd trust your widgets with?
Whiteboard!
So a number of us (owen, colin, jrb, bryan, blizzard, j5 and myself) hacked this weekend on an allegedly multiprotocol whiteboard that currently supports direct TCP connections and, most notably, IRC. Hopefully we'll get jabber support and gossip integration too. There's an X-Chat plugin for it. There's also a plugin for SupyBot for keeping a whiteboard with persistent state sitting on a channel. It doesn't look pretty atm, but its a pretty good technology foundation.
Despite my constant bitching and moaning about having to implement the whiteboard protocol in the model, its actually pretty cool. Clients broadcast actions to create/delete generic objects or modify their properties. Currently we only support text and stroke objects, but it should be pretty easy to add others to the system now that the base infrastructure is in place. The protocol looks something like this:
WHITEBOARD [channelname] 0+ <create ><text requestId="[uuid]" x="0" y="0", text="Hello"/>
If you're using the SupyBot, it serves as the authoritative "master client" and echoes back actions if it accepts them or rejects them. The client-side model (this is the part I'm obsessed with because its where I spent most of my time) journals actions it initiates, and can snoop the channel when other clients broadcast (so you don't have to wait for the server to echo, reduces latency which is important w/ IRC rate limiting) but only commits the changes as authoritative when the master client confirms them (otherwise they are rolled back).
I'm particularly proud to be able to say that I'm doing transaction stream compression by smooshing sequential modifications together before comitting them to the journal. "Look mommy, I'm Hans Reiser!". OK, so its not really that hard, but it sounds 31337. Humor me, ok?
Code is in CVS module 'whiteboard'. Its all written in python with pygtk and shouldn't need anything special to work except for Cairo and pycairo. Now that we've done a good pass at the base pieces I think the actual drawing bits will get some more love/features in the next few days. High on my list are: erasing (*cough*), variable line width, hand-drawn-shape smoothing, and a highlighter. I've also got most of the pieces done for adding graphics tablet support. All that should be pretty easy except maybe shape smoothing (just don't know how hard the algorithms for doing this are).
- 2:00 AM: Set alarm for 10 am (physical switch)
- 2:03 AM: Tape piece of paper over alarm with the text "Why are you ruining my life?"
- 2:07 AM: Go to bed
- 2:15 AM: Fall asleep ??? AM: Alarm is switched off, and the piece of paper is retaped over the alarm by a mysterious force. Abducted by aliens? Gremlins? Cruel alter ego?
- 12:17 PM: Wake up with no memory of the alarm being disabled. Paper is still taped over the alarm like the alarm was never turned off (?!?)
- 12:18 PM: Perform thorough exam for signs of alien abduction: scars, incisions, chips in the back of my neck, probes in various orifices. Results, negative
- 12:19 PM: Inspect apartment security fixtures. Deadbolt: in place. Physical chain slider thing: in place. Pole blocking sliding glass door: in place. Grill over fan vent in bathroom: in place. Gremlin trap: empty
Conclusion: I have a cruel alter ego who wakes up when the alarm goes off, disables it for who knows what reason, laughs mischeviously, and then goes back to bed.
Solution: Tie myself up before going to bed.
Problem: How do I get out of bed when I'm back to my calm mild mannered normal self?
I get a lot of messages asking me to compare and contrast Storage, WinFS, and sometimes Dashboard and Medusa. More recently, I've gotten a lot of questions about Spotlight and Beagle. I've generally avoided commenting (which usually means not answering the e-mail...) on these things both because its impossible for me to do an unbiased comparison, and because the goals seem to be quite different.
- Medusa, Beagle & Spotlight are similar, though of course Spotlight is much more mature. I would call them metadata index systems.
- Storage & WinFS are similar, though of course WinFS is much more mature. I would call them document stores.
Caveat: If indexing and search were the primary goals, a document store would be a ridiculously overengineered approach. The medusa/beagle/spotlight model is much more sane if this is your only or primary goal. I'm not saying this to suggest document stores are better or worse than metadata indexing systems, only to point out that there's an element of apple-orange comparison at work here.
Metadata Index Systems
Medusa:
Medusa was originally written by Eazel integrated tightly with Nautilus 1.0 and was slated for inclusion with the GNOME 1.4 release. It was primarily written by Rebecca Schulman, but also had major contributions from Maciej Stachowiak & some by myself. Medusa ran as root, which worried some people (but of course, so does updatedb for slocate...), but unfortunately had a major bug that caused it to be pulled from GNOME 1.4 at the last minute. Rebecca fixed the bug after the release, and re-architected Medusa to run as a normal user. But unfortunately Eazel collapsed before GNOME 2.0 and nobody promoted its inclusion. Curtis Hovey & I ported it to GNOME 2.x platform later, and Curtis is currently maintaining it and adding lots of new features / fixes. In particular he seems to be working on a UI for it. Medusa allowed very fast searches over large indexes. Indexes were built by scanning the disk every night (like slocate, unlike Spotlight which does things better). It also provided a search: URI scheme that allowed creation of dynamic "search folders". So you could have a "Spreadsheets" folder for example that always contained any spreadsheets on your system. The biggest hurdle for Medusa today is that the set of indexers is not very extensible, and so it doesn't know how to index very many different file types.
Spotlight:
Of course I haven't looked at Spotlight's code or used it, so what I know about it is from what Apple has published and discussions with friends at Apple. Spotlight appears to be a sophisticated well implemented approach to building a metadata layer an top of an existing file system. Changes to files appear to be noticed at the kernel layer, and indexers are quickly run to update the metadata cache (with information about filename, album name, size, file contents, keywords, etc). I don't know whether it is guaranteed that indexers will be run before the data can be accessed, but it is supposed to happen very quickly in any case so it appears instant to the user. Spotlight is the work of (among others, there are probably more people I just don't know) Pavel Cisler (BeOS tracker & Eazel Nautilus) & Dominic Giampaolo (BeOS BFS, which had a similar sophisticated metadata system). Spotlight also has a lot of work gone into the UI, for doing grouping, measuring relevance, etc. Its easy to underestimate how much work this is, in some ways the "indexing" is the easy part. Spotlight appears to index a lot more than just the filesystem, including things like calendar and mail, but I don't know the full extent of what it can do.
Beagle:
My knowledge of Beagle is based on playing with it and reading through a fair bit of the code, but I could definitely be missing large aspects because I haven't talked with Jon. Beagle's code appears to be fairly immature at the moment, but I would expect it to grow. It uses a port of Apache Jarkarta's Lucene. Lucene primarily provides a way to *store* indexed metadata and do fast *searches* over lots of metadata (including full text, of course), but it doesn't provide the indexers for specific file types. In some sense, Lucene as a specialized "database" for storing the results of indexers. Currently Beagle has indexers for HTML, JPEG, MP3, OpenOffice.org (very cool) and Text. Unlike Medusa (I have no idea about Spotlight for this) Beagle is designed to index "byte streams" rather than files, so it can index, e.g. "The current page you are looking at in Epiphany". This makes it very compatible w/ Dashboard, since Dashboard wants to index any and all contextual data, not just things on the hard disk. At the moment Beagle appears to contain only very simple UI, so its primarily a document indexing system.
On the filesystem side, Beagle currently works like Medusa and requires a "crawler" to update its metadata cache (say nightly), vs. spotlight which updates instantly. Beagle also has crawlers for Mail and IM logs. Beagle also includes a renderer system for displaying the relevant metadata etc for different file type results. AFAIK, Jon Trowbridge at Novell is the person mainly hacking on Beagle atm, but I think the code was refactored out of Dashboard, and a number of other contributors are listed.
Document Stores
Both WinFS & Storage are aimed at doing a lot more than document indexing... in many ways document indexing is only a nice side effect of their larger aims. Storage and (AFAICT) to a lesser extent WinFS both intend to store the actual documents themselves inside the store. That means that more than just metadata is inside the store. Both WinFS & Storage provide a query system, though WinFS' has developed a nice object oriented language (which I think they compile to SQL) whereas Storage currently uses straight SQL which is harder for other developers to use.
Storage:
I know most about this so I'll talk about it most of course ;-) Storage is fairly immature, and the architecture has shifted a lot in the past few months.
"storage-store" provides a DBus service that allows fetching objects over the FreeDesktop DBus getting their attributes, relating them to eachother, running queries etc. "storage-store" uses postgresql to store the structured objects and perform queries. Because objects are accessed "live" rather than as "buffers", changes are instantly propagated across the bus, so multiple applications or users can work on the same document and instantly see changes other people make.
I'm currently working on architecture to storage-store into standard IM presence information so you will be able to see buddy icons of other people and what part of the document they are working on inside storage applications. I have a lot of user experience goals for Storage (or more accurately, for applications and desktop that use storage). You can find information about most of them on my blog and at the storage homepage. Though these goals are more important to me than document indexing, and have a lot more impact on Storage's architecture as a result, I will focus on document indexing in order to compare and contrast with the other systems.
libstorage-translators provides a framework for translators that can take structured object data in the store (metadata and the actual data itself) and translate it to and from byte streams (such as files). The goal is not indexing files, but for providing a way to move files in and out of the store. So for example, if your friend sent you a PDF file by e-mail, you could drag that file into your local store and the libstorage-translators will automatically decompose the information for placing in the store (and of course extract lots of metadata like album name, description, image width, etc etc in the process). Currently I have only worked on the "importer" side of translators, not the "exporter", so they are effectively like indexers. There are currently importers for: DocBook, HTML, any image format supported by gdk-pixbuf (JPEG, PNG, BMP, GIF, and several more obscure formats), PDF, text, and any format supported by gstreamer (MP3, OGG, AVI, MPEG2, etc). Importers can also create thumbnails for the data for convenient display later. Storage also includes a renderer system for displaying the relevant metadata etc for different sorts of results to a query. A major drawback is that I don't have translators for common document formats like Gnumeric or OO.o at the moment.
Queries can either be performed using an SQL-like format (slightly higher level than SQL but not much, it gets translated to SQL) or using natural language queries. A large chunk of storage code is currently in its NL system which uses very sophisticated HPSG grammars and other techniques to translate human language phrases into the SQL query format.
A storage:/// VFS URI is provided which automatically invokes translators when files are dragged into the store. That means you can, e.g. open a nautilus window to storage:/// and drag files in to add them to the store. It also provides query folders like Medusa. So for example you can have a folder "spreadsheets" or "songs by John Lennon that don't have the word 'love' in them" that is live updated to contain objects matching those criteria.
WinFS:
I know the least about WinFS of any of the systems discussed here. I need to read up on it more... but the last time I looked at it heavily was more than a year ago when MS was still very ellusive. It looks like a lot of info is up on the web now, so what I'm saying could be out of date. WinFS is backed by both NTFS & Microsoft's SQL server. It provides a very nice API for querying and working with objects. Currently the set of object types it can used is fixed and predefined by MS (but the list is long). In the future they will probably open this up and allow anyone to define new object types. AFAICT, WinFS is currently targeting primarily the storage of metadata, though it is tightly coupled to the files themselves stored as byte streams in NTFS. It does look like in the future they intend to more completely store things in WinFS. WinFS provides a very cool set of hooks for performing actions in response to changes in the store. WinFS uses this to provide indexing services, but users can also define their own actions (e.g. you could say, "whenever an e-mail from George is created, copy it into my "to burn" directory").
Unfortunately my ankle was fractured pretty badly and it was important I have surgery on Wednesday. Unfortunately this precluded my flying to Norway for GUADEC on saturday. I actually proposed that I fly to Norway on Saturday to my orthopaedic surgeon. He gave me a look that was darker than oil at midnight, and went back to what he was doing without saying anything. Some people tell me I should have interpreted this as a "sounds ok". However, he later said some things about our goal being to "reduce the chance of having arthritis in the ankle for the rest of your life". That scared me into behaving.
There's a more formalish storage paper for the occasion here. But honestly, I think the speaking notes are more informative for getting at the soul of the material. In my experience that's often true of talks vs accompanying papers. So I'm including my speaking notes here. I blame oxycontin for any incoherent bits. They're a little random but I hope you press through because some of the good stuff is near the middle/end ;-). Maybe I'll do sketches on whiteboards for all the places I was going to do live sketches and take pictures, but for now the notes are all booooring woooords. Unfortunately in many cases the sketches are the meat of the thing, but I think you can get some idea what I'm talking about from the text. I've fleshed it out past the notes in some places where it was totally incomprehensible:
Storage is designed to support a more general user experience than just “find files more easily”. Storage isn't a silver bullet, but it can serve as a toolkit for making new user experiences easier to extend across the desktop. In the process it helps dissolve the application/desktop boundary a little.
The Experience
Intro: Related to many existing systems
Wiki – anybody can edit or work with information. Information is not super formal to start with, but can become “formalized”. Unlike wiki, allow for rich in place editing and better tie in to the OS for noticing changes and tracking “change threads” (which are themselves communication often).
Whiteboard – support quick informal live collaborations. Don't force things into a particular “format” or medium but allow people to mix it up. Share a space with lots of presence information, etc. Also envision this working when people are in the same place.
Groupware – handle objects that people need to deal with to get their job done. People, teams, projects, tasks, deadlines. These are more central to knowledge workers than even documents. Like groupware, track threads of communication, but don't tie people down to text messages. Let them respond with people, projects, tasks, etc. Rather than “posting to lists” you just append items to a topic in the (or a) central store.
Bugzilla – tasks, and schedules, process, status, owner, etc. Track more interesting metadata in a way that people can shape to their organization.
Build “objects people care about”
This is more about what gets built on top of Storage, but its a major part of the overall experience. The file manager (atop the filesystem) is about managing formal documents and folders to group documents in large concrete chunks. The <some name here> (atop storage) should focus on objects that fill people's daily lives.
People, Projects, Teams, Tasks, Messages, Topics, Discussions, Managers, Proposals, etc, etc, etc (and yes, Documents too) are objects people care about. Many others that are specific to particular industries and job roles. Some of these objects currently live in specialized applications like evolution, and most of these will still be handled primarily through a specialized interface. <sketch the two specialized interfaces>.
Its usually a good idea to have specialized tools for targeting specific use cases.
OTOH, although we work on text documents mostly in the office suite, we still expose common operations to the base OS (the filemanager mostly in this case). How can we extend the set of useful things that can be done with information across the information boundary? In a less generic sense, can we build support for the objects people deal with on a day to day basis more deeply into the OS. It doesn't have to be done by a univeral component system, but base libraries like storage can make it easier to support the important “one off” optimizations in the base OS (such as for projects).
Support informal work
Most office applications are focused on producing deliverables: formal documents. But deliverables are the exception. Most knowledge workers spend most of their time processing, sharing, and extending information not producing deliverables. We want to build interfaces that allow for some degree of information soup. <sketch the process flow for organzing SubsByTheInch2005>
Informal work can eventually turn into formal deliverables. Make this process as convenient as possible.
Information is information, don't force large chunks
We currently have odd granularities of information. “Files” in the case of “formal documents” (but since we don't have informal constructs, many things are pushed into this).
Access items within large bodies of information
The storage “research-y” solution to this is object reference using human language phrases
This aspect of storage still interests me, and has been where most of the work has gone until now.... but it is more researchy because it is prone to being technically infeasible (jury is still out ;-). As such, other parts of storage are not predicated on it.
Provide the components for collaboration
If storage is the physics, social interaction is the chemistry. Storage needs to provide some very basic structures that will give rise (when people, environments, tasks, etc) are thrown into the mix to social interactions. Rather than trying to control things rigidly, as traditional computer environments have done, we allow social behaviors to regulate things more (as things work normally outside computer world).
Presence information is the substrate for coordinating social interactions. Who is where and doing what is the most relevant context for social interactions.
Access by multiple threads/computers/people. Rather than “versioning” documents and the associated problems (e.g. merging is a nearly insoluable UI problem) we allow “live” (or at least effectively live) access to documents.
Fine granularity. If we have access from multiple places, the temptation is to use locking of “documents”. Even inside formal documents, however, this will greatly limit collaborative ability. If we have rich fine grained presence information, combined with very fine grained data access, we can provide the ability to socially manage interactions rather than requiring “forced” lockouts.
Track information flow
E-mail showed the importance of threads of communication between people. An e-mail thread morphs into a task (like a bug), which morphs into a few more tasks (which might have discussions associated with them), which turns into a full fledged project with an associated team, which eventually produces a policy document. All this stays tied together. <show interface idea>
A Brief History (aka excuse):
Storage was initially implemented as project Gargamel by a team of Stanford CS (and one EE, and yours truly) students as a senior project. Brian Quistorf, James Farwell, Khalil Bey, Josh Radel. It gets to a nice demo-able point before they graduate.
It gets even more finished as I work on it after graduation while not looking for work. Web page is written, screenshots made, etc.
I foolishly decide to rewrite the NL parser (and lose the old CVS history when importing to cvs.gnome.org). I get sidetracked writing the NL parser.
Slashdot etc hit. Lots of developer interest, but I'm snowed for other reasons and don't succesfully get development moving with other people. Plus I still have to finish the NL rewrite before things will function again.
The summer is completely crazy, and I stop working on Storage for 8 months.
Today: NL rewrite is now done. Its a much stronger foundation, but the semantic grammar is still small. However, even with the small grammar it can do very sophisticated (correct) interpretations of phrases like “songs that aren't by 'John Lennon' but have the word 'love' in them”. This would be very difficult to parse with a traditional “naive” scavanging search interpretation. Marco is also contributing to Storage, as well as some other Epiphany dudes. Things are starting to pick up, and I'm determined to not kill storage by bottlenecking again. I'm looking for a “project manager”.
What's there today:
Non-NL
storage-store – manages the postgresql server, handles notification
libstorage – GObject interface to store items
libstorage-translators – serializes / deserializes data streams from / to storage items'
GnomeVFS module – automatically invokes translators on read/write into the store allowing existing GNOME apps to use the store like a normal filesystem
NL
PET – parses sentences into Head-Phrase Structure Grammar (HPSG) trees, by Dr. Ullrich Callmeier.
libmrs – interface to the Minimal Recursion 'Semantics' information in the HPSG tree
libmrs-converters – translates MRS into a more meaningful XML statement using a client chosen semantic grammar
libstorage-nl – translates using storage-specific semantic grammar into the intermediate XML form, and then to an SQL query
What's in the near future:
Currently libstorage, the VFS module, and some translators directly access the postgresql server. This is undesirable: it means permissions on a shared store would have to be enforced using a collection of SQL views, it means locking becomes very tricky, and it means that libstorage and other things link directly against postgresql libraries (though this could be addressed by gnome-db).
Support for NL searches in select non-English languages (probably Spanish first, but perhaps Japanese). Storage is built on a “language neutral framework”, but grammar engineering is a very difficult task. Some of the availability of NL searches will depend on what the linguistics community produces and distributes freely.
A nifty collaborative application to provide a test bed for the collaboration/locking framework. <sketch collaborative whiteboard/wiki design> (also shows informal work) Ideas? ;-)
<demo NL search interface>
<show NL slides and explain basic NL process>
A slivver more than two weeks ago I "sprained" my left ankle playing barefoot soccer. The ankle felt like it was getting better, but as swelling receded my foot felt awful. I could step on it, but the first few steps hurt like crazy. Other steps hurt but I didn't have to brace myself for them. I finally caved and decided to see a doctor.
Unfortunately, as predicted, this turned out to be a very frustrating affair. I know some people like lots of choice in Doctor, etc. But I sort of like the Kaiser-Permanente (HMO? in CA) model where they have their own big buildings with everything in it. You show up, and they'll figure out what to do with you. Anyway, I called the Blue Cross Blue Shield of North Carolina (*sigh*, since RH is based in Raleigh) advice nurse line twice. They were both confident I should go to an urgent care facility, and were basically unwilling to believe there are no urgent care facilities here.
There are tons in Conneticut, there are tons in Rhode Island, there are tons in North Carolina, and there are tons in California. There are almost no urgent care facilities in New Hampshire or Massachusetts. Some puritans probably made a law against them a few hundred years ago. Or maybe, its because human life is oh so critically important that even non-emergencies should go to the emergency room "just in case". Or maybe its because the NE sucks in general. I dunno.
I finally decided to just drive to Rhode Island, because I really hate the thought of going to an emergency room for a non-emergency. Despite having to clutch with my hurt ankle/foot (which fortunately you don't have to do much on an interstate... just stay in 5th), it was actually a very positive drive. I was feeling pretty blue, and driving into the sunset in the outdoors is really nice. So I drive across Massachusetts and show up at this small town urgent care center. They X-Ray my foot, and my ankle. Nothing seems wrong, which surprises them given how my foot looks. Anyway, they X-Rayed my leg and it turns out my fibula (the small bone of the lower leg) is pretty badly fractured. So they splinted the area, and told me to go to an orthopaedic surgeon.
Lovely. Very strange that the pain was in my foot. I'm still a little paranoid that there's an occult fracture of the fifth metatarsal causing the foot pain. So the good side to all this is they gave me the X-Rays to take to the orthopaedic surgeon. I've been studying them and reading medical research papers from medline about what I see. I'm finding this very interesting. Ankle fractures (and sprains) turn out to be extremely varied. Looking at the damage from lots of different angles has also made it possible to reconstruct in more detail how I must have fallen.
Anyway, I don't have a scanner but I (very appropriately) gimped an online X-Ray of a healthy ankle to be a fairly good replica of mine. I cheated a little because I made it look like my posterior projection of my left foot. The online image is, I believe, a front projection of a right foot. From other projections it looks like this may be a spiral fracture, but from this projection it looks mostly like an oblique fracture. I'm not really sure either way, they apparently often look very similar from non-axial projections. I also labelled some stuff to give bearings.
The yellow areas are the (from left to right) lateral and medial malleolus. That's the boney bump on the left and right of your ankle. The pink area is the tibiofibular syndesmosis, which connects the fibula (smaller bone) and tibia (the larger weight bearing bone) together. Sprains are often a result of stretching this. Anyway, because the fracture is proximal to the tibiofibular syndesmosis, this is probably a suppination with external rotation (Weber B). That means the injury probably occurred with the weight leaned on the outside edge of the foot, and then the foot was rotated. It is possible that its pronation with external rotation (a form of Weber C).
So the bad news is that most Weber C injuries require open reduction (reduction is placing the bones so they align for healing). That would mean cutting my poor ankle open, and possibly even using syndesmotic screws that would have to be removed some weeks later :-/ The other problem with open reduction, besides the fact I'd need surgery, is that studies of outcomes suggest that open reduction results in a far slower recovery and goes awry far more often. With any luck its a Weber B.
Its 2:30 pm, I've been awake for a little over an hour, and this is turning out to be a very miserable day. Actually, take that back, its an agressively bad day. The context for this, is that I managed to sprain my ankle pretty badly over the weekend. So I figured there are two common sets of "bad things" in daily life: things that are annoying, and things that hurt. Sprained ankles have a way of taking the set of things that are annoying and making them also lie in the set of things that hurt. Trying to fall asleep is one of those things. I've been having trouble sleeping because, despite the ankle not hurting much during the day anymore, it always manages to throb at night. So I wake up to get a drink, hobble over to the sink, and then lie awake for another couple hours.
So to start my day, last night I forgot to reset my alarm clock which had been wiped by a power outage. Anyone who knows me knows the results of this: rather than waking up at 10am, I woke up at 1:15pm (and I'm lucky it wasn't 4pm) and missed an important meeting. I feel totally shitty about this. So I stormed off to the shower (well, limped agressively), and turned it on w/o thinking. It was freezing cold because I forgot to warm it a little first. In my panic, I put more weight than I should have on my hurt ankle, and fell. My head just missed the faucet, but I did manage to hit my head into the wall and felt dazed for a minute or two.
After a hasty shower (which I hate and makes my eyes feel sleepy the rest of the day, but I hold out hope that I won't entirely miss all the meeting) I go to get tylenol and a drink of water from the kitchen. In the process, I knock over the knife block and it falls to the floor. One of the knives hits handle first with the weight of the block behind it and the blade bends. Fortunately one of the cheaper crappy knives, but I still have enough scotsman in me to be very grumpy about this.
And to add insult to injury, I get stuck behind a dump truck going 20 mph for 2/3 of my commute. Normally I'm very intentional about not getting worked up about this sort of thing, because it doesn't really matter, but I get really annoyed. This only makes things worse. Of course, its also one of those ratty diesel things, so I'm stuck between sucking down fumes or roasting in the car with the windows shut and only internal ventilation on (no A/C).
So its now 2:41pm. I'll probably be at work at work until midnight, and head straight to bed. That gives the day 9 more hours to take me down.
Apparently, according to an article in the Economist, cicadas have prime-numbered life cycles of 17 or 13 years. Simplistically, when the number of prey increase after some time lag the number of predators increases, driving the number of prey down, resulting in equalibrium. Call this smoothly varying population. Prey that have a cycle where you spike every n years rather than smoothly varying have a leg up on a smoothly varying predator. When cicadas bloom there is a number of predators appropriate to no cicada. They reproduce before predator numbers rise, and then disappear. Effectively non-smoothly varying popultions can avail of the time lag before predator numbers rise to match prey.
This results in selection pressure for predators that have the same length of cycle as the prey. While same length is perfect, a predator cycle that is a factor of the prey length will also work. E.g. if prey has a cycle of 6 years, a predator with a cycle of 3 years can still arise in numbers to consume the prey. So the problem, from the predator phenotype's non-existantperspective is to guess (through random mutations, etc) the cycle length that overlaps most frequently with the prey. Factors of the prey's cycle length will, of course, overlap more frequently. The best length the largest factor of the prey's cycle length, namely the prey's cycle length itself. (As an aside, interesting abstract algebra connections with cyclic groups, etc.)
From the prey phenotype's non-existant perspective: It now becomes an information hiding game. Given a cyclic group of order t (constant time between cycles), how do we minimize the overlap with groups of all other orders? The answer is choose a large t with the fewest factors, i.e. to choose a long cycle that is also a prime number. Cicada's long prime cycles are a very rudimentary form of encryption to keep random mutations in predators from "guessing" a compatible cycle length. Cool!
Now of course, using a non constant function for time_between_cycles(cycle_number) would work even better. And in some sense Cicadas have that too by having two different cycle lengths. According to the economist article populations have even been observed shifting from a 17 year to a 13 year cycle in response to selection pressures caused by a fungus that developed a 17 yeard cycle.
Argument In Brief
- Microsoft's C#/CLI licensing people, at high levels, are aware of us.
- Microsoft can choose to do damaging things in the current C#/CLI licensing ambiguity.
- Microsoft considers the free software / Linux community to be a major competitive threat
- Microsoft does not "compete" gently
- A + B + C + D = ?
The word pile amassed below defends points (1) and, in particular, (2). I take points (3) and (4) as given. I leave point (5) an exercise for the reader. ;-)
Stupid Disclaimer
Since I'm not a lawyer, I don't know if these disclaimers are important. But given the nature of the topic, I'll play it safe and write one. I'm not a lawyer, and this ain't legal advice, its just a dump my current thinking on an issue. It does not represent my employer's opinion. It may represent my cat's opinion, but only on the second tuesday of summer months.
Restatement of the Issue
Miguel has repeatedly stated that the patents necessary to implement the standards ECMA-334 (C#) and ECMA-335 (CLI) are available from Microsoft "RAND + Royalty Free". This seems like an effective open patent grant and encouraged me initially that we could do Mono. I really like Mono. Its terrific technically, and I'd love to be able to use it. But two problems upon further consideration the past couple months:
- I've not seen an official statement by Microsoft that will let me trust the royalty free assertion. I think we are remiss if we do not assume Microsoft is looking for ways to, quite frankly, screw us. So unless there is a statement from Microsoft that they will have to stick to in a court, I feel (at the very least) uncomfortable.
- "RAND + royalty free", can still seriously screw Free Software. I think this is more important than the first point. Even with RAND + royalty free you still have to execute a license agreement with Microsoft, and license agreements can stipulate things that are RAND from a corporation perspective but still screw over Free Software. Also, there is evidence that key Microsoft people are already aware of (or planned?) incompatibilities between the licensing scheme for C#/CLI and, at least, the GPL. The eye of Sauron is upon us. RAND + royalty free is very different from a patent grant.
In short, we are in an adversarial situation. Microsoft does not want us to succeed. Thus we cannot trust Microsoft, even if we'd like to, and must consider Mono based upon the question "What is the worst thing MS can reasonably do?". We can only trust Mono if we are convinced Microsoft doesn't have weasel room. The current situation appears, to me, to have lots of weasel room. The technical merits of Mono are basically irrelevant if its a trojan horse in the long term.
The Horror Story
So here's the obligatory horror story based upon what I see as our current course. Actually, I don't think this is taken to extremes at all. The GNOME actions look to me like the path we are currently on, and the Microsoft actions are not out of character, and look legally tenable based on what I know today. Microsoft can choose to not exercise these actions, but they will have the possibility (and will be more likely to the more successful the Linux desktop is).
- Act 1 - Novell hackers continue to push Mono. Novell hackers code most new independent programs/functionality in Mono and gradually start writing extensions to software like Evolution in Mono. Evolution's core continues to remain Mono free, but if you want features X, Y, and Z you have to use Mono. A few GNOME hackers write apps in Mono, some as toys, and perhaps a cou







