Wednesday, March 07, 2012

Oroppas, by St Clement

So it was finally time to open and drink my flight of St Clement's Oroppas wine (info on 2007 bottling). It's been waiting too long, so the wife and I decided to cook a wonderful dinner and start popping open bottles.

Flight of Oroppas, 1995 through 2002
My oldest bottle was from 1995. Waiting 17 years is certainly too long, but what's done is done. The 1995 still had a lot of flavor, rich notes, but with a very short finish (as expected).

Sunday night, we opened up the first four bottles (1995, 1996, 1997, and 1998). Since these bottles were old, I figured they wouldn't be strong representatives of Oroppas. So... I also opened up a 2007 Oroppas; the tasting notes said it was just getting ready to drink. The 2007 was our "control" bottle to really show the bold, smooth flavors of St Clement's Oroppas series.

As I mentioned, the 1995 was still good, but with a short finish. The 1996 was tasty, starting to show some of Oroppas' deeper flavor.

Strangely enough, the 1997 was a step backwards. The wine was a bit sharp and acidic, unlike the big bold flavor of the 2007. Even the 1996 demonstrated some of that boldness. Given the usual success of Napa wines from 1997, I was quite surprised. Thankfully, moving onwards to the 1998 put everything back on track. The 1998 was a good representatve of that Oroppas flavor and style. Bold and smooth, with lots of rich flavor and a great mouth feel. The 2007 had even more flavor, but still contained some of the rough tannins of a young wine; the 1998 had none of that roughness and much (though not all) of the flavor. I will probably wait at least two or three years before opening more of the 2007, to age away some of the tannins.

By mid-evening on Monday, we had finished off the 1995, 1996, and 1997. We kept around some of the 1998 and the 2007 for comparison, as I popped open the 1999 and 2000. The progression from 1998 was quite obvious with the 1999 wine -- the flavor and finish just got bigger. But the 2000 was missing the strong berry and fruit undertones, leaving just a woody finish. The 1999 was the clear winner in these few years.

Tuesday night, we opened the last two... the 2001 and 2002. This pair was very similar to Monday night's bottles: one smooth and full-bodied, and the other was a bit less. The 2001 was excellent. It had all the favor, smoothness, fruit and berry, and richness expected. The 2002 was a bit weaker on the fruit and the tannins were starting to creep in.

Okay... Wednesday evening, we opened a 2004 Oroppas as the final bottle in this tasting. It was hiding behind the flight, in the picture above (along with the 2007). Based on tasting all of these wines, I have to say: the 2004 is the absolute best of the entire pack. It has all of the fruit, boldness, smooth flavor, and only a little tannin. I would suggest that holding Oroppas for right around eight years (from the vintage date) is its ideal. (well... based on my tastes)

Overall, please remember that I'm talking comparisons here. All of these bottles were very tasty. There is just no way to call any of these bad wines. As expected, the 1995 had weaker flavor yet no tannins. Moving forward in time, the flavor definitely improved, but the true Oroppas boldness did not show up until about 1998 or so. Around 2001 or 2002, a light shade of tannins started to arrive. The 2004 seemed to be the peak in the bottles that I had.

I've been a club member of St Clement for 10 or 15 years. Their whites, reds, and specialities like the Oroppas are all fabulous wines. Their winery is a big Victorian up on a hill; it is beautiful, with a wonderful view over Napa Valley. I'm definitely a fan, and this flight has been an awesome experience. I highly recommend their wines, and a visit to their wonderful property.

Cheers!

Sunday, March 04, 2012

Lots of Stuff

I spent a good amount of time in front of my television. Watching shows (cable and Netflix streaming) or playing video games. The TV occupies a large portion of my life. Good? Bad? Who knows. But that isn't the topic for today...

Lately, I've been fascinated watching the show Hoarders on A&E. The show is like a train wreck -- you just can't stop watching. It is a bit sad once you truly understand that hoarding is a psychological disorder, but it is so hard to stop watching. The things that people collect, that get hoarded, the condition of the house, etc ... there is always something new on the show.

But here is where the "Stuff" from my post title comes in. There are a number of shows on that focus on "stuff". Hoarders is one show, but TLC has a similar show named Hoarding: Buried Alive. The show title is a bit crazy, given that it actually happens.

It doesn't stop there. Those two shows are about people collecting. But there are shows on the other side of the equation, too. Hoarding is about acquiring, but the stuff (sometimes) needs to go away, too. Storage Wars is about lockers that get auctioned off when people don't pay their bill. In many cases, the lockers were owned by hoarders, and all kinds of awesome stuff is found in there.

And then you have the show, American Pickers. The show is extremely fascinating. Mike and Frank find lots of stuff in peoples' hoards, but they concentrate on old items, and the history behind them. As a big History Channel fan, American Pickers is an interesting lens into history. Old cars, music legends, bicycles, cars, and other memorabilia.

The stuff that people accumulate is incredibly fascinating, and these shows provide a broad view into history, people, and an endless variety of "stuff".

Monday, October 31, 2011

Installing Zabbix on Mac OS (Leopard)

My friend Sam Ruby dabbles in a lot of technology, and he tends to do writeups on his blog as he experiments with the stuff. I figured to take a page from his book, and share my own issues/troubles getting Zabbix up and running on my MacBook (running Leopard).

I grabbed the 1.8.8 tarball and unpacked it. For my scenario, I needed the server, the agent, and the frontend (but not the proxy). For simplicity in testing, and because I don't need to monitor bunches o' boxes, I decided to go with SQLite for the database. Zabbix uses the standard "configure/make/make install" pattern, so no hassle so far.

Burp. The compilation failed. Investigating, I found that I needed to apply the patch from ZBX-4085. The build completed, so started to look at the frontend.

The Frontend is written in PHP, which is natively available (along with Apache) on my laptop. With some configuration, I got the frontend to load in my browser. There is a click-through GPL license (huh?) and then a really awesome page that checks your setup. I quickly realized that the builtin PHP was not going to work. Sigh.

I've got MacPorts installed on my laptop, so I just continued with that. Homebrew is all the new rage with the kids, but it doesn't have builtin recipes for PHP. There are a few out on the 'net, but I really didn't want to monkey with that stuff.

Lots of packages were needed: php5, php5-gd, php5-mbstring, php5-sockets, php5-sqlite3, sqlite3. A hojillion dependencies were installed, including another copy of Apache (sigh).

Reloading the setup page, it continued to say SQLite wasn't installed. Looking at the frontend source, it was using a function named sqlite3_open(). With some investigation, I found an email describing the SQLite interfaces for PHP. Zabbix was using an unmaintained version. Rather than monkeying with that, I just edited the code to use the preferred PHP SQLite interface, and filed issue ZBX-4289 to push my changes upstream.

Finally, I needed to tweak /opt/local/etc/php5/php.ini for the recommended Zabbix settings (after copying php.ini-development to php.ini). This included some timezone settings, timeouts, upload sizes, etc. The Zabbix setup page is quite good about guiding you here.

So I created my initial SQLite .db file based on the instructions from the manual and pointed the Zabbix configuration page at it (taking a moment to realize it wanted the pathname put into the database field of the form). The test connection worked and then Zabbix saved the configuration file into frontends/php/conf/zabbix.conf.php. It looks like there is a "download" option for that configuration file, which I presume appears when the conf directory is not writeable. The Apache server (running from MacPorts now, using the MacPorts PHP) was running as myself, so it had no problem writing that configuration file.

Next up: wrestling with the zabbix-server. The first annoying problem was that you cannot give it a configuration file in the current directory. It fails trying to lock "." for some dumb reason. Solution: pass an absolute path to the custom configuration file (the default is in /etc or somesuch, which I didn't want to monkey with). Getting the server running was very frustrating because it spawns multiple processes which communicate using shared memory. It kept failing with errors about not being able to allocate the shared memory segments. After some research, I found that Mac OS defaults to some pretty small limits. Given that I wasn't about to reconfigure my kernel (using sysctl and some recipes I found on the web), I went to rejigger all the various cache sizes in the zabbix_server.conf file.

It ended up that I had to drop all the sizes to their minimum 128k setting: CacheSizeHistoryCacheSizeTrendCacheSizeHistoryTextCacheSize. Each were set to 131072. Finally, the server started. Whew.

When I returned to the frontend to "Finish" the installation and bring up the console... it hung. No response from the server. Huge sigh. With a bunch of investigation, I found that something was holding an exclusive lock on the whole damned SQLite file. Nothing else could write to it (and it seems the frontend likes to test its writability by creating/dropping a dummy table).

Fuck. Time to scrap the whole damned "simple SQLite" idea. Fine... I've used MySQL before, so I went with that. Back to MacPorts to install MySQL, the server, and the PHP driver for MySQL. Then I fired it up, created a "zabbix" user, loaded in all the tables, and zapped the zabbix.conf.php file to trigger reconfiguration (after noting to restart Apache to pick up the PHP changes).

The frontend looked happy now, so I tweaked the server's configuration file for MySQL and restarted the server. No workee. Damn. Forgot to reconfigure the server using --with-mysql=/opt/local/lib/mysql5/bin/mysql_config. After reconfiguring, the link failed with unsatisfied references to iconv(), iconv_open(), and iconv_close(). The MySQL interface in the server needs these for some UTF-8 conversions. The builtin Mac OS libiconv should work, but my MacPorts copy of libiconv was interfering, and these functions are named libiconv(), libiconv_open(), and libiconv_close(). My patience was ending, so I was not about to delve into autoconf bullshit and conditional compilation and all that. I simply edited src/libs/zbxcommon/str.c to call the libiconv* versions of the functions. The compile and link succeeded, and I re-installed the newly built server.

Yay! The server restarted, and the website loads up with a nifty little default console.

After a day to get this sucker installed, now I gotta start figuring out how to use it. Oh, joy.

I hope this post will help some future person treading these waters. Good luck!

ps. I may have missed some steps or packages to install or whatever. YMMV, but I think that I've got most of it down. Zabbix is supposed to be some hotness, and I do like its custom agent capability. But hoo-wee. Not a simple package to bring up (I hope it will be easier on a recent Ubuntu, than it was on my creaky Leopard install).

Monday, August 15, 2011

Blast from the past: removing the GIL

Way back in 1996, I created a patch to remove the GIL from Python's interpreter (version 1.4!). Dave Beazley just picked up the patch and tore it apart, and writing a fantastic blog post. It is quite nostalgic for me, from back in the day when I was working at Microsoft on their electronic commerce efforts.

[ I commented on Dave's post; it provides some context that you may also be interested in reading ]

Monday, November 29, 2010

Open Languages are Not Required

I just posted again to Apache Asserts on Computerworld UK: Open Languages are Not Required.

And please note that I'm speaking primarily to enterprise (internal) software developers, who are the vast majority of developers on the planet. They shouldn't really have to worry about the language that they use for their development. Having an open language is critical for us FLOSS developers, but that is an entirely separate discussion. (hat tip to webmink, to clarify my point here)


Note: the publish date is wrong (says last month); dunno what's up with that.

Update: corrected link after the publish date was fixed.

Friday, October 29, 2010

Are You An Open Source Friend?

The Apache Software Foundation was invited to find some people for Computerworld UK to write for a new blog named "Apache Asserts". Myself and a few others were selected to post our thoughts on open source, the enterprise, and whatever else we may find interesting.

My first post has been published... check it out!

Sunday, August 15, 2010

Android uses Java? Um... no

I've seen a lot of misinformation over the weekend, talking about the Oracle/Google lawsuit. Many of these blog posts and article talks about how "Android uses Java". Heh. That simply isn't true.

Android applications are written using the Java programming language. True. But those applications run on the Dalvik virtual machine. Not the Java virtual machine. Source code is owned/copyright by the author and is entirely unbound from any intellectual property concerns based around the syntax/grammar of that language.

Class libraries? Not Java either. Much of the core libraries come from Apache Harmony, and the rest are libraries that Google wrote. Given that Apache was never provided access to the Java Compatibility Kit, Harmony is not labeled as "Java-certified". Also note that Harmony is a clean-room implementation of the Java class libraries.

So, people: stop saying that Android "uses Java". It doesn't.

(obviously, some of these various components may trample on Oracle's patents; I have no idea, and that is an entirely separate question)

Wednesday, August 04, 2010

Outcomes

Nights out with a friend can be quite interesting. Especially if they are single and "looking". I've found there are generally three possible outcomes with these nights out:

  1. The Cock-Block.
    Your friend is trying to hook up or otherwise get especially friendly with somebody, but you monopolize the "target's" attention in some way to distract them from your friend's intent. Obviously, this outcome is "poor", unless you're some kind of dickhead that doesn't want your friend departing early with the target. Quite selfish, to try and keep them out with you. Of course, there are all sorts of minor rules variants here, that are rather crass: e.g if you're both interested in the target, who steps forward, who holds back? It's simply best to avoid this scenario because it never turns out well.
  2. The Wingman.
    Oh yah. We all know this one... the friend who props up the other and makes them ever more desirable. Talk up their strengths, ensure that the person-of-interest gets excited to know more about your friend. This is the ideal outcome, especially if they make some kind of lasting connection.
  3. The Bus-Tosser.
    This isn't nearly as bad as the Cock-Block, but your friend isn't going to be all that happy with you. At least for a short while. This is where you think your friend is interested in somebody, so you move into Wingman mode. Provide lots of opportunity for the two to talk and hang out, provide some good commentary, etc. Like any good Wingman would do. But afterwards, you find out your friend was not interested. At all. This is the "thanks for throwing me under the bus" maneuver, putting your friend into harms way. Especially if the purported target is interested and giving undue attention to your friend. ... Thankfully, in the long run, this provides lots of laughable material for how you sucked as a myopic Wingman.
I think the best answer all around is to simply go out and have a great time with your friend. Anything that will involve a possible third person can fall into a poor outcome, or simply distract from an awesome evening with a friend.

Wednesday, May 19, 2010

svn stash

This is the third of (at least four) posts in my miniseries about Subversion's next-generation working copy library. See the introduction and what we're doing to fix things.

Once we have this fancy new code, it will provide a stable and robust base for building new features. The DVCS systems have done a great job exploring new areas and needs of version control users. One feature in particular is called stashing or shelving (see "git stash" and "hg shelve").

For those not familiar with the stash concept: consider the scenario where you've been doing some work, and a high-priority bug arrives, needing to be fixed right away. Classically, a Subversion user would check out a fresh working copy, fix the bug, perform the commit, and go back to their work in the original working copy. Instead, when using stash, it takes all of your current work and sets it aside, leaving you with an unchanged working copy, ready for your bug-fix work. After your commit, you retrieve the changes that were stashed. The presumption here, of course, is that stashing is a much faster and simpler operation than setting up a new working copy.

We'll be able implement this feature quite easily using the WC-NG datastore. It will take just a few operations:

  1. preserve all metadata about local changes
  2. place a copy of each locally-modified into pristine storage, recording their SHA-1 key with the stashed metadata
  3. revert all local changes
Since the metadata is recorded in a single SQLite database, step 1 is "simply" some copying of those changes off to a separate set of tables. The pristine storage is a generalized mapping of SHA-1 keys to file contents that we'll be using for storing more things (such as merge sources, pending conflict resolution), so it can easily hold stashed items. And step 3 has been in Subversion for a long time :-)

Recovering the changes from the stash is effectively running a big "svn merge" operation. The merge is required because you may have made other changes to the working copy (your bug-fix) and/or updated to the latest revision.

Other features, such as multiple stashes, management of those changes, applying subsets, and whatnot would be added, too. The feature set has not (yet) been designed, so I have no idea what is required or how we would present this to our users. We'll definitely be looking at git and hg as we explore the needs around stashing/shelving.

"When?" is your next question, I'm sure :-) ... Well, we're releasing WC-NG in Subversion 1.7. That will probably happen this fall. We want to get those changes out the door since that will mark 18 months of development time. WC-NG is a feature in itself, and we want to get it into people's hands without further delays [waiting for additional features]. After that, I'm interested in adding stash support (and a "checkpoint" feature (described in my next post)). So let's say stashing will appear in 1.8 which should be released around this time next year.

Wednesday, May 05, 2010

Heading to Berlin!

In June, in Berlin, elego is hosting a "Subversion Day", along with workshops and a hackathon/sprint. And with great thanks to elego, I will be able to attend and contribute to the event. I'll be in Berlin from June 9th through the 14th.

As always, I'm looking forward to meeting up with my fellow Subversion developers, but there are quite a few others in Berlin that I want to spend time with. Torsten, Valerie, Erik -- I'm looking at you! Julian: road trip from Münster? Who else am I missing? Torsten says that he'll arrange for one of the regular Apache-people dinners. Want to join?

Monday, April 26, 2010

WC-NG Changes

In my last post, I described how libsvn_wc had become brittle and hard to manage. The WC-NG process is working to solve that problem, and though we're not yet done, I believe we're on the right path.

The basic question that needed answering is, "where did we go wrong?" While version control is a hard problem (especially if you version directories!), it does not inherently lead to a brittle library. Somewhere, we had gone wrong in the design, the data model, or simply the implementation.

Before I had started working on the problem (almost) two years ago, one of the Subversion developers (Erik Hülsmann, I believe) laid out his thoughts for a next-generation library. In those notes, he postulated on what I now call the Three-Tree Model:
  • the tree you checked out
  • the above tree, plus structural changes (add, delete, move, copy)
  • the above tree, plus content changes (file edits, property edits)
Any working copy operation generally affects one of these trees. svn update and svn switch work on the first tree. svn add and svn merge modify the second tree. Your editor and svn propset affect the last tree.

This was the key insight. In our "wc-1" implementation, the svn_wc_entry_t structure blended all three trees together. Making a change to that structure could have been operating on any of the three trees depending on its flags. Its checksum field could correspond to a checked-out file, or a locally-copied file. To determine, you had to look at the schedule field and the copied field. And hell will rain upon you, should you mess up the flags or forget to check one.

For WC-NG, we have built a new data storage system with an API designed around this three-tree model. This has isolated our storage mechanism behind a solid encapsulation (wc-1 code had too much knowledge of the old "entries" storage model). Operations are now understandable: "copy nodes in the restructuring tree" instead of "set entry->schedule".

This new storage subsystem could produce an entire post on its own. It is radically different from the prior model (a single .svn subdir at the root of the working copy and SQLite-based storage). This is causing huge challenges in upgrades/migrations to the new format, and backwards compatibility for our classic APIs.

Another radical change was our move to using absolute paths to refer to items. The prior model used an "access baton" which implied a relative directory, along with a path relative to that baton. These relative batons and paths caused enormous problems because it led to the question, "relative to what?" In most cases, the answer was "the operating system's current working directory," which is a terrible basis for a deterministic API. In switching to absolute paths, this rendered the access batons obsolete. Since they were a core part of the public API for libsvn_wc (not to mention the widespread internal changes!), this has had a huge impact on the API and its users (such as Subversion's libsvn_client library and its command-line tools).

These two items (data model and absolute paths) are the core changes in WC-NG. The ripple effect from just these two items is immense. We will need to rewrite almost every one of the 40,000 lines of code in the library. And given our incremental approach, many of those will be changed multiple times. We're a solid year into this (although we saw downtime last fall due to our move to the Apache Software Foundation), and we probably have another several months of basic grunt work ahead of us. Stabilization and testing will put our 1.7 release into late summer or possibly this fall.

I could really go on and on about this stuff, but I hope this post provides some basic background on the WC-NG efforts. Please feel free to post any questions (I have no idea what aspects you may want to hear more about!), and I'll work on answering them.

Tuesday, April 13, 2010

What is Subversion's WC-NG?

When I started working on the Subversion project (again) back in August 2008, I wanted to do something that was interesting, technically challenging, and important to the project. For many years, the developers had been complaining about the "working copy" (WC) library. This library was one of the first that we worked on back in June 2000, and had grown (ahem) "organically" over the following eight years. By "organically", I mean it had become a rat's nest of brittle code. Hard to work with, not fun to modify, and difficult as hell to build new features reliably. Over such a lengthy time frame, most actively-developed code tends to end up like this, unless you work real hard against it.

In 2000, we didn't even know all the requirements for the library. Nobody had ever done versioning for directories. Just files. In fact, I think that Subversion may (still) be the only version control system (VCS) out there which treats a directory as a first-class object. It is a very difficult problem, along with being able to work with only pieces of your repository (which leads to "mixed-revision" working copies; something that distributed VCS systems like Git and Mercurial don't have to deal with, much to their enjoyment!).

So we started the library and figured things out as we went. Then it was too slow, so we added stuff to make it work faster. Then we added more features. And revamped some stuff to make it go faster again. More features. And even more.

By this time, the library had become brittle. Adding a feature usually broke something else. There were too many considerations, and internal layering/hiding was not present. Everything could, and did, manipulate a public structure (called svn_wc_entry_t). If you didn't do it right, then something broke. And there was some very deep and hard to understand relationships in the handling of data in that structure. Forward progress was being stifled.

The developers had been talking about fixing the WC library for years, but most of them had other priorities. I had no such baggage, and the WC problem had everything I was looking for: interesting problems to fix, challenging to accomplish, and very important to Subversion's future. Some people had already written up some thoughts on a next generation of the WC library, calling it "WC-NG". After I started digging in, and some other developers joined, the project took on the WC-NG title in earnest and in day-to-day use.

WC-NG is Subversion's name for an entirely new working copy library. We have a new design, and we're incrementally rebuilding the library towards this new design. Due to stringent backwards-compatibility requirements, and the complexity of the system, we cannot simply "rewrite from scratch". This effort is the current focus of our upcoming 1.7 release, and it will provide a Subversion client that will be vastly faster, much more robust and capable, and provide a solid foundation for new features.

In future posts, I'll provide some more detail about WC-NG's design (and how the original WC was broken). I also want to talk about a couple of these new features that will be implemented upon this new foundation. Stay tuned!

Monday, March 29, 2010

Version Control

Last week, I spent some time in NYC with friends of mine talking about Subversion. The conversion focused around the long-term vision and roadmap. I'll post more on that soon, along with some specific ideas on how I'd like to build some features that other version control (VC) systems have demonstrated as useful and demanded by users.

For this post, I wanted to share a discussion document written by Martin Fowler. This is one of the best, level-headed comparisons between Subversion, Git, and Mercurial. I believe these are the Big Three VC systems that the industry will be using over the next decade, and to see a useful discussion, absent of rhetoric, is very encouraging.

Monday, March 15, 2010

Are Insurers the real Bad Guys?

"In 2009, the largest 14 insurers had profits of roughly $9 billion; that approached 0.4 percent of total health spending of $2.472 trillion. This hardly explains high health costs." -- Robert J. Samuelson, Washington Post.

yet...
"the five largest health-insurance companies racked up combined profits of $12.2 billion, up 56 percent over 2008" -- Noam N. Levey, The Seattle Times.

Which is right? But then again... who cares? Either value is small compared to the total costs (given by Samuelson, and Wikipedia). So why ostracize and penalize insurers? They're just the middlemen. What am I missing?

My belief is that a lack of cost/value/benefit feedback is the basic problem. There is no pricing-pushback from the consumer, so the prices escalate without control. (you ever see the prices for toothbrush, toothpaste, or slippers in a hospital stay?) We've seen similar problems with higher education where financial aid covered "any" gap between ability to pay, and the amount requested, so the schools simply requested more.

So why all the rhetoric against insurers? Removing all of their profit will reduce overall health care purchasing by less than one percent. It appears they are a scapegoat, to be blamed in lieu of proper analysis and approaches at reducing health care costs.

Monday, January 25, 2010

Columbia Code Camp, and my Subversion talk

I'm going to be at the Columbia Code Camp this-coming Saturday (January 30th). If you're in the Columbia, SC area, then come find me. Join in the Code Camp, or we can meet in the evening to share some beers.

I'll be talking about the rewrite of the working copy library in Subversion (see the "Rebuilding Subversion's Working Copy Library" on the sessions page).

Wednesday, January 06, 2010

100k apps ... so what?

Why do people keep saying that the iPhone App Store has an "advantage" over others because it has 100,000 applications?

Would it still have an advantage at 90,000? 50,000? How many does it really take?

A month or so ago, Apple wiped out all 1000 applications from a single vendor. Did anybody miss those applications? Probably not. So how many other thousands could be wiped out without taking a hit to its success?

Google stopped putting the "pages indexed" on its front page many years ago because it realized a key principle: the value is in the results, not the quantity.

The Android Market is definitely behind -- it is missing some nice applications. But not many! All the apps that I used to have on my iPhone are now available on my Android phone. Thus, Apple's App Store has zero "advantage" for me. How many other people are like me? Or conversely, how many people want and use all of those 100k applications?

I think the conversation should be rephrased into "do the apps exist, that a typical consumer wants?" rather than focusing on a mere count. That is the success of any app store.

Sunday, December 13, 2009

How to Screw Your (Open Source Software) Customers

I've been reading with interest (and amusement) a lot of the brouhaha around Oracle's acquisition of Sun, with specific relation to Sun's ownership of the MySQL database. The first salvo came from Stallman's concerns about MySQL being licensed under the GPL (ha!!) (also see Matt Asay's review of that event). Next up was Monty's discussion of MySQL's licensing, followed by yesterday's request to "save MySQL".

My opinion: the GPL has screwed customers worldwide.

All those customers who believed they were buying an Open Source database were misled. They bought a proprietary database, plain and simple. The GPL version was not available to them because they needed a license that didn't not require them to GPL their own software. They needed a version that could be combined with their own proprietary software.

Monty is entirely correct -- Oracle can totally screw them. It could raise licensing prices or even discontinue that licensing. It can cease development and third-parties could not fork and continue development under the MySQL name (it's trademarked).

But the fault lies in MySQL AB's choice of a business model. They chose to develop the software under GPL and require customers to pay for a less-restrictive license. Now that the software has moved beyond their control, their customers are subject to the whim's of Oracle. I'm making no predictions of Oracle's behavior, but there is no doubt who holds all the cards.

Much of the problem lies in the chosen business model (GPL with pay-for-permissive), but the enabler here is the GPL license. It gives undue control to the copyright owner. When that owner changes hands... the customers lose.

Contrast with a permissive license, such as the Apache License. Absolutely none of this discussion would have happened. Everybody would have rights to use the software, in exactly the same way. Customers could not market under the (MySQL) trademark, but they wouldn't care -- the database is a component in a larger system they are delivering to their own customers. There would not be a need to discuss the internal pieces, though they could still say "this produce includes MySQL(tm) software" and the trademark owner could not do anything about it.

If you are developing Open Source software for use by your customers, and you care about those customers, then choose a permissive license. You have no idea who will own the copyrights in the future (shoot... you might be trying for an acquisition!).

Sure, a permissive license will prevent this kind of business model, but we've now seen the dangers of the model.

Find a better model rather than hanging your customers out to dry.

Update: PJ has written a great article about this topic over at Groklaw

Monday, October 26, 2009

SubConf and ApacheCon

I'm about to head to the airport, leaving for Munich, Germany. SubConf is happening there this week. Last year, I gave a keynote; this year, I'm not giving any talks, but simply attending to work with the other Subversion committers. CollabNet, elego, and WANdisco have all pitched in to make my trip possible (thanks, guys!). Their businesses are built on Subversion, and getting committers together is a great way to make Subversion better, and grow their business.

I guess that I don't post enough about my hacking here, but Subversion has been occupying all my coding over the past year+. I'm working on rebuilding its "working copy library" -- the library that manages all those ".svn" subdirectories you see when using Subversion. There are several other people in the community that are working on this change, too. It is a huge amount of work, but will make Subversion much, much faster. The new library will appear in Subversion 1.7, which should be released early next year.

After SubConf, then I'm flying off to San Francisco. Going to see a bunch of people over the weekend, bar crawl on Halloween, and then spend next week at ApacheCon in Oakland. This is going to be a big event, as we're celebrating the ten year anniversary of the Apache Software Foundation. Huge milestone!

Friday, October 23, 2009

Posting about the Xbox again

For a couple years, I posted quite regularly to my Xbox blog. Then... nothing for pretty much the past three years.

Well. I've got my Xbox plugged in again. I've got the time. And I've been playing.

... so I started posting again. Go check it out, if you're a gamer.

Monday, September 14, 2009

OpenBSD and (oops!) NO threads

Wow.

I just found out that OpenBSD only has user-space threads.

User. Space.

This came up because stdout doesn't work quite right, apparently. My friend says that OpenBSD sets it to non-blocking. In general, non-blocking means "try to write to , and what isn't written... try it later." But every program I've ever seen assumes stdout is blocking, so in the OpenBSD environment the unwritten data will just get dropped on the floor. Answer: build as an unthreaded application so stdout will work appropriately. Are you kidding?

How can an operating system claim to be Modern, yet lack something as basic as kernel threads?

Insanity.