ApacheCon US 2009 Draws Unprecedented Support From the Global Open Source Community and Recognition for the 10th Anniversary and Influence of The Apache Software Foundation

California Governor Arnold Schwarzenegger and Oakland Mayor Ron Dellums recognize The Apache Software Foundation for a decade of open source leadership and technology innovation

FOREST HILL, Md., Nov. 11 /PRNewswire-USNewswire/ -- Closing out the celebrations for its 10th anniversary, The Apache Software Foundation (ASF) today announced highlights from ApacheCon US 2009, which took place November 2-6, 2009 in Oakland, Calif. The Foundation received unprecedented support and recognition as testament to the growing strength and influence of the global Apache community. During the week, The ASF was honored by California Governor Arnold Schwarzenegger and by Oakland City Mayor Ron Dellums for the key technologies developed, overseen, and shepherded by the all-volunteer organization over the last decade. November 4 has been designated Apache Software Foundation Day.

ApacheCon is the official user conference for The ASF. The event attracted more than 600 attendees from the global Apache community, and featured the most extensive conference program to date with more than 100 hours of trainings, over 90 sessions, 25 BarCampApache discussion groups, 11 project MeetUps, two days of code collaboration at the Hackathon, and numerous entertaining Lightning Talks. Dozens of corporate sponsors, exhibitors, and community and media partners helped make this year's ApacheCon among the most popular events to date.

Conference highlights include:

Thought-provoking keynotes, including the Apache Pioneers Panel reuniting ASF founding members and early contributors; Brian Behlendorf on how the Open Source movement has positively impacted social change; and Kirrily Robert on the role of women in Open Source.

Subversion, the award-winning Open Source version control and software configuration management tool, formally submitted itself to the Apache Incubator with the aim of becoming an ASF Top-Level Project.

Several Apache projects also celebrated their 10th anniversary, including Apache XML, Apache Jakarta, Apache Cocoon, Apache Xerces, Apache Ant, and Apache Tomcat, who debuted Tomcat 7.0 during the conference.

The Apache Directory project announced a newly-formed alliance between the OpenLDAP Foundation and the ASF, created to drive various industry standards. The Project also released version 1.5 of its Apache Directory Studio product during the event.

ASF Platinum Sponsor Microsoft announced that they will be renewing their sponsorship for the upcoming year, bolstering both their involvement in the ASF as well as with numerous Apache projects.

An unprecedented number of MeetUps were held throughout the week drawing attendees en masse to participate in discussions on popular Open Source projects such as NoSQL, Apache Tomcat, Apache Hadoop, Apache Maven, OSGi, and Subversion.

The ASF's 10th Anniversary was cited by numerous publications, members of the Open Source community, industry foundations, corporate users, and individuals.

The ASF's Big Feather Birthday Bash was followed by a rave-style afterparty that kicked off with music DJ'ed by "Vitamin B" -- a.k.a. ASF co-founder Brian Behlendorf.

Community Driven, Community Supported

New to ApacheCon US 2009 was the project-driven conference program, whose scope, sessions, and speakers were selected by the Apache Projects themselves for their respective tracks. Since its incorporation, The ASF has maintained a strong focus on developing leading software through a meritocratic process supported by the community and fueled by the passion and ideas of the community. Through the support of its Membership, committers, sponsors, partners, and other Open Source software communities, The ASF continues to develop quality software the "Apache Way."

ApacheCon extends its utmost gratitude to supporters and to sponsors of this year's conference, which include:

Platinum Sponsors Microsoft and thawte;

Premier Sponsors CollabNet, Hewlett-Packard, Hippo, HotWax Media, Lucid Imagination, Progress Software, SourceForge, and SpringSource;

Community Sponsors and Exhibitors The Apache Software Foundation, Aster Data Systems, Cloudera, Day Software, Facebook, HALO Worldwide, LinkedIn, Mark Logic, MuleSoft, Ning, OSS Watch, Sun Microsystems, ThinkGeek, and WSO2; and

Community and Media Partners: FeatherCast, Linux Journal, LinuxPro Magazine, Manning Publications, Methods & Tools, MOO, NLUUG, Opensourc3, openSUSE, OStatic, Slashdot, Sourcesense, The Bitsource, WiLine, and WSO2 Oxygen Tank.

The ASF continues its outreach to local communities with the upcoming ApacheCon Roadshow Asia, taking place in Beijing, China 28-29 November, and Colombo, Sri Lanka 3-5 December 2009.

Event Resources

Recorded Sessions: With the support of LinuxPro Magazine and CollabNet, The ASF was able to "live stream" select sessions from ApacheCon US 2009. Archived recordings will be available November 13 at http://www.techcast.com/events/apacheconus09/.

Presentations: Slides from ApacheCon sessions will be posted off the ApacheCon website at: http://www.us.apachecon.com/c/acus2009/.

Video Shout Outs: Many attendees and community members shared their thoughts on Apache. Check out a catalog of videos on the Apache community YouTube channel: http://www.youtube.com/user/TheApacheWay.

Upcoming Events: Stay on top of upcoming ApacheCon events and BarCamps by following @ApacheCon on Twitter.

About ApacheCon

The official user conference, trainings, and expo of The Apache Software Foundation draws attendees from the global Open Source community for unparalleled educational, networking, hacking, and social opportunities. ApacheCon is co-produced by The Apache Software Foundation and Stone Circle Productions, and has grown to be among the premier events for cutting-edge Open Source technologies and industry best practices. Held semi-annually in Europe and North America, smaller ApacheCon community-focused events also take place in Asia. For more information, visit http://www.apachecon.com/.

SOURCE Apache Software Foundation

