All the Dave Johnson Feeds
(Last week, I returned after a week of vacation and a week of conferences in the SF bay area. Instead of posting my trip reports to the limited audience that reads my internal IBM blog, I'm going to post them here so that everybody can benefit from them.)

shindig logo

Here's my report from ApacheCon US, focusing on the projects I'm involved with: Roller, Shindig and SocialSite.

Roller session

In my session, I covered the new features in 5.0, Roller history and sort of a Roller state of the union. I explained that nobody is working full-time on Roller these days, it's an all volunteer effort with about three people active and if folks want us to keep on making official Apache releases then those very same folks had better step-up and get involved so we can knight some new PMC members. I also did a demo of the new features in Roller 5.0 including OpenID and the file upload and management improvements.

Shindig session

After my Roller talk and in the same room, I attended Paul Lindner's talk on Apache Shindig. Paul has worked on OpenSocial implementations at Hi5 and LinkedIn and he's also a committer on the Apache Shindig project.

I'm familiar with Shindig so this was mostly review for me. I liked Paul's assessment of Shindig quality, saying that they have good processes in place, use code reviews and have good test coverage. Paul acknowledged problems with Shindig's developer friendly-ness and said that the community is working to fix them. I've heard similar complaints from multiple source and seen myself that it's not as easy as it should be to understand the codebase, figure out how to plug-into it and understand which parts are really required for OpenSocial and which are just sample code.

Paul also talked about the Open Stack concept, a set of open standards that enable social networking interoperation including OpenSocial, OAuth, OpenID and portable contacts. He said that Shindig is the best way to implement the stack and keep up with the evolving standards. He had a nice quote about "Shindig is to OpenSocial as Apache HTTPD is to HTTP"

Social Widgets / Gadgets meetup

On Thursday night, I attended Social Widgets / Gadgets meetup which brought together members of the Apache Shindig, Apache SocialSite and Apache Wookie Communities.

There were about 25 people there including folks from Google, Atlassian, Yahoo, Ning, LinkedIn, Hippo (CMS/portals ISV) and, I'm guessing, a bunch of SF bay area startups. The meetup started around 8PM and lasted over two hours.

I presented a lightning talk on Apache SocialSite using a couple of slides from the JavaOne talk and including a quick status report. Status is this: still waiting on Sun to come through on code grant, Globant is having some success with SocialSite in production and work is almost complete in converting the build over to Maven. I also did a quick talk about the Enterprise 2.0 OpenSocial panel, which occurred the day before.

Next, Jas Nagra did a very entertaining and informative mini-presentation on Caja, complete with XMen 2 references. Caja is a way to run Javascript code (e.g. gadgets) loaded from different locations, each in its own secure sandbox where it can't interfere with others and can't do evil -- but without relying on iframes. Shindig uses Caja, but it's optional and off by default.

After that Paul Linder did a quick talk on the Open Stack idea and revised his Shindig quote to "Shindig is to the Open Stack as Apache HTTPD is to HTTP." Then we broke up and folks stuck around to talk about APIs, projects, possibilities and everything else for quite some time.

That's all I've got for now. I hope to document some of my experiences on the "Enterprise OpenSocial" panel at Enterprise 2.0 later, possibly in a blog post on the OpenSocial blog.

(I just returned to work after vacation and a week of conferences in the SF bay area. Instead of posting my trip reports to the limited audience that reads my internal IBM blog, I'm going to post them here so that everybody can benefit from them.)

couchdb logo

After arriving at ApacheCon on Monday night and eating way too much sushi with Cote, I realized that there was a NoSQL meetup in progress and free beer was involved. Needless to say, I was there.

At NoSQL Oakland, there were talks on CouchDB, Hadoop, JCR, Voldemort, PNUTS and Cassandra. I was surprised how many people were in attendance; the idea of "no SQL" is apparently very popular about the alpha-geek Apache crowd.

I arrived a little late and saw that the Hadoop talk was packed, as usual for Hadoop. J. Chris Anderson's CouchDB talk was also packed, but I managed to find a seat. Chris is a very entertaining speaker and I learned a lot about CouchDB. Some keys points that Chris made were that CouchDB is "of the web" -- you interact with it via a RESTful protocol and it accepts, returns and stores JSON formatted data. CouchDB is schema-less. CouchDB is "fast by default" due in part to it's append-only approach to data storage. It's written in Erlang and therefore perfect for use in small devices.

A core feature of CouchDB is replication and that's one of the reasons it is now included in Ubuntu Linux, keeping contact/address data in sync across desktop and mobile devices. Chris said that, in 50 years, all applications will replicate in CouchDB fashion. Chris also delved into the details of how CouchDB stores data, complete with detailed hand-drawn diagrams. Want to learn more:

See also:

I will be posting more about the ApacheCon and Enterprise 2.0 conferences, but not until tomorrow or later...
(I just returned to work after vacation and a week of conferences in the SF bay area. Instead of posting my trip reports to the limited audience that reads my internal IBM blog, I'm going to post them here so that everybody can benefit from them.)

social web camp logo

On Monday Nov. 2, I attended Social Web Camp at Sun's Santa Clara campus. There were about 40 people in attendance. The event was organized by Sun's Henry Story, an expert in semantic web technologies and inventor of the FOAF+SSL approach to implementing Social Networking features (relationship based privacy). Unfortunately, Henry was not able to attend the conference because he was detained by US immigration.

During the camp, I lead a session on OpenSocial using my "What's up with OpenSocial" slides from BarCampRDU. Surprisingly, very few people were familiar with OpenSocial, so this was an introductory level discussion.

I participated in a session on enterprise social networking and shared a little about we do with micro-blogging inside IBM, mentioning BlueTwit and the new features in Lotus Connections. A couple of folks from Boeing were present and described the home-grown social networking and micro-blogging system.

John Panzer of Google pitched his new Salmon protocol, a distributed commenting system that allows comments made on items in downstream systems (e.g. aggregators, social networks, FriendFeed, etc.) to find their way back upstream to the source item. The protocol is based, in part, on AtomPub. Comments are signed and posted back upstream. Seems like this could be useful in both Lotus Connections river of news feature, Jazz-based products and Roller; so I'll going to track this one closely. It might be fun to try to implement Salmon for Roller.

I missed a little of the conference because I had lunch with some of my former co-worker from Sun and I left a little early to return my vacation rental car and make my way to Oakland for ApacheCon US 2009. More about that later...

On Wednesday November fourth I'll be speaking at two conferences on the same day: ApacheCon US in Oakland, CA and Enterprise 2.0 in San Francisco. Here's a write-up of what I will be speaking about.

Enterprise 2.0: Enterprise OpenSocial. This will be a panel discussion with representatives from Atlassian, SocialText, Exo and I'll be representing IBM. I'll be prepared to talk about what IBM is doing with OpenSocial and to give some specifics about what we're doing in Jazz to support OpenSocial Gadgets and other web UI plugin technologies. I'll also be prepared to give an update on Project SocialSite and it's move to the Apache Incubator.

ApacheCon: What's new in Roller 5.0. I'll cover the state of Roller, explain the new features coming in Roller 5.0 and make some suggestions for the future of the Roller code base. I will also explain what folks can do to help ensure that Roller can continue to improve, make releases and avoid getting yanked up into the attic.

It's been a while since I have blogged about it, but I haven't completely stopped working on Roller. In case you're wondering what's up in Roller-land, here's an update based on an email I recently sent to the Roller dev mailing list.

I've been doing some weekend and evening work on Roller 5.0 to get it ready for release. Ganesh and Tanuja did great work on the new Media Blogging features, but there were a couple of significant pieces missing such as data migration and I18N. I had hoped to finish that work during the summer, but life got in the way. Now I'm scrambling to wrap things up. I'll be speaking at ApacheCon US 2009 in November on the topic of What's New in Roller 5.0, so I'd really like to have a 5.0 release candidate ready by then.

Just as a reminder, here's what's currently on the 5.0 feature list:

  • Media Blogging Support
  • Externalizable User Management
  • OpenID Support
  • Tag Data API
  • OpenSearch
  • OAuth for AtomPub
  • See the full list on the Roller wiki

Except for Media Blogging, all of those features are complete. My plan is this. I'll do some more cleanup work on Media Blogging, which is the major new feature in 5.0, fix some bugs and then I'll cut an RC.

barcamprdu logo

BarCampRDU 2009 was a great success, if I don't say so myself. Here's my brief review. We had excellent turn-out, lots of great session pitches and lots of great sessions. Everything went very smoothly and our estimates for meals, t-shirts and party-budget were spot on. We received lots of positive feedback on Twitter and blogs and at the event. We did have some difficulties with the PA system and a couple of projectors, but we got past them with a little help from our friends.

Here are the links I've rounded up since the event. If you want a taste of BarCampRDU 2009 then check Robert Fischer's excellent podcast and Tanner Lovelace's very-cool time-lapse set to spooky music.

We might have to do it again next year ;-)

Apache 10th anniversary logo

The early-bird special ends on August 14, so you'd better get moving.

Sign up for ApacheCon US by 14 August and save up to $500!

This year's ApacheCon US promises to deliver our most extensive program to date, and largest anticipated gathering of the global Apache community to celebrate the ASF's milestone 10th Anniversary. The San Francisco Bay Area is where the very first ASF official user conference was held, and we hope that you will join us in celebrating the ASF's success!

Apache members, code contributors, users, developers, system administrators, business managers, service providers, and vendors will convene 2-6 November in Oakland, California, for a week of training, presentations, sharing and hacking. ApacheCon US 2009 features new content tracks, MeetUps, and GetTogethers, as well as a number of events open to the public free of charge, such as the Hackathon and 2-day BarCampApache, in appreciation of their support over the past decade.

Be sure to register by 14 August to save up to $500! To sign up, visit http://www.us.apachecon.com

I'll be there and speaking on the topic of What's New in Roller 5.0. I also plan to attend the Social and Widgets Meetup with folks from Shindig, SocialSite and Wookie. I hope to see you there.

(Note that I wrote this over weekend, before we all learned about Facebook acquiring FriendFeed. It's hard thinking about how things will change because we have no idea what Facebook will do with FriendFeed, but I'm guessing that this acquisition will end-up making Google Reader a more central part of my flow.)

Every time I find something that I want to share with others online, I have to think about how I want to share and whom I want to share it with. Perhaps I've created too much complexity for myself. This diagram below illustrates the situation. It's my social data flow diagram. Take a look and then I'll explain.

flow diagram

The diagram

The boxes are web sites and the arrows indicate data that flows automatically between those sites. I think of the sites on the left as source sites, places where I share blog entries, post photographs, tag interesting articles and indicate that I like specific songs. The sites in the middle are aggregation sites. Things I share on my source sites are aggregated together so that my Facebook and FriendFeed friends see the things that I do on those source sites and make comments.

Different audiences

I treat Facebook and FriendFeed differently. I try to be Facebook "friends" with only people that I know and trust. I feel more free to share some personal things there; family news, political views, etc. because, in theory, only my good friends can see them. For some reason, I'm leery of Facebook and I don't feel like committing too much information to them. For example, I'd rather upload photos to Flickr. That's one of reasons I share on other sites like FriendFeed, Twitter and Delicious.

FriendFeed, on the other hand, I treat as totally public. Everybody can see what I post there and I'll follow people I don't know so well. In fact, everything I do except for Facebook and some Flickr photos is public. This brings me to the topic of Twitter.

Reducing complexity

Since I'm a geek, I don't mind a little complexity. The one part of my flow that I would like to simplify is link sharing. I use Google Reader heavily but when I want to share a link, I feel that I need to post it over to Delicious because I've got a wealth of links there and infrastructure in place to send daily "Latest Links" post over to my blog. Now that Reader has made it so easy to share, tag and comment on links I'm considering dropping Delicious and doing all of my sharing through Reader. Another thing I'm considering is a little more automation.

Automate everything?

To me, Twitter is like a huge public chat-room where you only have to listen to the people you want to listen to. All of my tweets are automatically posted to my FriendFeed account. Because of the chat-room nature of Twitter and the fact that many of my Facebook friends don't understand Twitter, I don't like automatically pumping my entire Twitter stream into Facebook. I use Facebook Application callled Selective Twitter so that only tweets that include the string "#fb" go to Facebook.

I don't like automatically pumping things into Twitter either. I often re-share things that I have shared on my blog by posting them to Twitter, usually using a URL shortening service (bit.ly) because tweets must be short (max ~140 characters). This is not an automatic process and I do it only for specific things that I want to share and comment about on Twitter.

Question is: should I automate the flow between FriendFeed and Twitter? If I did so, my Twitter followers would see a tweet every time I share something on any of my source sites. That would be good, right? The conventional social media wisdom for success on Twitter seems to be that you should ABC or "always be linking." Sounds a little slutty, sure, but there is something to that approach: the more you share, the better your chances of connecting with interesting people. I haven't done it yet because I worry that it's too spammy in a chat-room like setting.

barcamprdu logo

As you might know, I'm involved with organizing BarCampRDU again this year, doing the sponsor-wrangling and attendee registration duties. It's been a lot easier and stress-free than last year because I've been through it once before and so has most of the committee. No matter the stress-level, the end-result is well worth the effort.

Wrangling sponsors was surprisingly easy, even with a bad economy. Basically, all I have to do is chase 'em down, convince them to sponsor, make sure they pay and then ensure that they're recognized on the blog, t-shirt, signage and during the event. Event registration was easy too as we used Eventbrite, which is free for free events like BarCampRDU. My only complaint is there's no automated way for an attendee to cancel a ticket and no automated way to do a waiting-list.

Most of the remaining work was done by my wife Andi and our friend Alicia Weller. Andi took care of vendor selection and coordination and Alicia took up volunteer coordination and t-shirts. I think you're going to like what Alicia did with the t-shorts; very nice colors this time.

What's a little nerve-wracking about running a BarCamp is the estimations you have to make. Once it's time to order t-shirts, food and drink we have a fixed budget but the number of attendees can vary wildly. Last year, we had 250 registered attendees and only 140 showed up. We can't assume we'll have the same registered/attended ratio this year because we've been sending out a lot more email reminders. Anyhow, long story short: we did our best but if everybody currently registered shows up, some folks are not going to get a t-shirt and a lunch.

At this point, all we can really do is enjoy the show and I'm really looking forward to it. This year, I'm going to pitch a session on OpenSocial. Here's the write-up from the proposed session page:

A quick intro to OpenSocial explaining what it is, how it works and why it matters using these What's up with OpenSocial slides. Then a group discussion.on.

It's just about time to head down to the pre-party at Flying Saucer. I hope to see you there.

Crammed into one post...

After a month of blog neglect, the automatic Latest Links posts from my Delicious.com account started to pile up in my blog editor. Back in the glory days of this blog, I blogged about things instead just saving links or tweeting about them and would never have let a month go by without blogging. I realized that, by adding some commentary/opinion for each, I could turn a month's worth of links into a month's worth of blog posts and thus gain total absolution for my sin of going a full month without a post. So that's what I did.

Category: Blogging

Category: Feeds

  • pubsubhubbub - Google Code
    "A simple, open, server-to-server web-hook-based pubsub (publish/subscribe) protocol as an extension to Atom." Collaboration between Google and SixApart folks to allow quick notifiation of new content to feed subscribers and reduce load on feed publishers. Hub implementations are underway for AppEngine/Python, Erlang, Python and Ruby. Hmm... no Java?

Category: General

Category: IBM

  • Integrating and Extending Rational Team Concert 2.0
    Great guide and presentation on Team Concert development via the Jazz Server SDK. Referring to this a lot these days.
  • Eclipse Galileo for Mac: Cocoa or Carbon?
    "Carbon is more mature and thoroughly tested, the new Cocoa implementation offers advantages and improvements." And the answer is: 32-bit Cocoa. Yep, I'm paying attention to Eclipse again. It's really the only way to do Jazz development.
  • Whitepaper: e4 Technical Overview
    Lots of detail on the apparently massive changes coming in Eclipse e4 including the ability write Eclipse components in JavaScript and to run "existing SWT applications to be executed on web platforms such as ActionScript/Flash."

Category: Java

Category: Open Source

Category: Social Software

  • Creating a Google Data Gadget - Google Data APIs - Google Code
    "This article will walk you through creating a Blogger gadget." Google and OpenSocial Gadget support for OAuth makes things easier, but it's still a PITA.
  • Writing OAuth Gadgets - Gadgets API - Google Code
    "send mail to oauthproxyreg@google.com with the following information to register your OAuth Consumer Secret." If you want to write a Gadget that uses OAuth to access Twitter there's an icky manual registration step involved. Apparently the solution to this problem is for Twitter.com to enhance their "OAuth configuration to accept digital signatures directly from iGoogle."

Category: Sun

  • The end of Sun
    "And that is why Schwartz isn't here, I believe. Because he genuinely loved Sun and its employees." A depressing article for former Sun employee to read, or anybody I guess. I do think there is something to this quote about Scwhartz.
  • Oracle-Sun Creating Churn - Forbes.com
    "Suns loyal customers are defecting in droves." Not really very surprising considering the conventional wisdom, which seems to be that Oracle will gut Sun's software efforts and ditch the hardware entirely.
  • Computerworld Blogs: Is Oracle getting ready to kill OpenSolaris? -
    "Sun, Oracle and third-party sources are telling me that OpenSolaris developers are afraid." This article is typical of what I've seen from the author: dumb speculation of the mean-spirited variety.
  • Justice department extends Oracle-Sun probe
    "All that's left is one narrow issue about the way rights to Java are licensed." I don't there's a chance in hell that it is, but wouldn't it be fun if this was all about the Sun-Apache Terms of Use controversy?

Web development

And now, back to your regular schedule of blogging, or not.

SLA

I think can stand behind a Service Level Agreement (SLA) of one blog post per month. Oh look, it's August 1st. I'm done for the month.

;-)

IBM Rational has just released a 64-page book on Collaborative Application Life-cycle Management (C/ALM) that explains in detail how Rational's Jazz-based tools fit together to support the full software development and delivery life-cycle.

You can get the book at InfoQ. Registration is required (and free):

Scaling Agile with C/ALM
by Carolyn Pampino, Erich Gamma and John Wiegand
cover of book

I'm finding this book very useful because I'm still coming up to speed with Jazz and Jazz's notion of "Data integration via linked artifacts across repositories using RESTful interfaces." The book shows how Jazz works in practice with examples that illustrate how a requirement can be linked to work-items, source code change-sets and tests. Products covered are: Team Concert, Requirements Composer and Quality Manager.

Scaling Agile with C/ALM also explains how Open Services for Life-cycle Collaboration (OSLC) fits into the picture. The OSLC project is working to standardize the RESTful interfaces needed to integrate development tools. Once vendors adopt these interfaces, it will be much easier to mix and match For example, if Atlassian JIRA supported OSLC, you could use it instead of Team Concert's built-in issue tracking.

See also: Ask Jazz Technical Lead Erich Gamma.

BarCampRDU 2009 is rapidly approaching (August 8, 2009) and the event is sold out with 250 registered attendees. Problem is, we're only about halfway to our funding goal. I guess it could be the economy or maybe it's event overload; doesn't it seem like we had a heckuva lot of tweetup-camp-athons around here lately?

Either way, we're not ready to give up yet. We're doing another call for sponsors and trying to open up as many sponsor opportunities as possible. Check out the BarCampRDU blog for more information.

picture of the CD

To follow-up on my previous post on the topic: my father is starting to publish excerpts from his book Science for the Curious Photographer on Luminous Landscape.

His first piece is titled The Quest for Good Photographs and How the Brain Perceives Images and it's one of my favorite parts.

By the way, he's still trying to figure out the best way to publish the book.

Wondering how Google Wave will impact the enterprise collaboration market? Look no further than the great collected wisdom of Twitter. Given that X equals Lotus Notes, Microsoft Sharepoint or Microsoft Exchange we have:
  • #googlewave will be major competition for X
  • #googlewave will drive positive change in X
  • #googlewave is X 2.0
  • #googlewave is X done right
  • #googlewave is X for 2009
  • #googlewave is X for 2010
  • #googlewave looks like X on the web
  • #googlewave is what X never became
  • #googlewave is the final nail in the coffin of X
  • #googlewave will destroy X
  • #googlewave will kill X, death to X!
  • #googlewave flatters X by imitation
  • #googlewave is just hosted version of X
  • #googlewave is a custom version of X, good for SEO

How can industry analysts survive with people giving away this stuff for free?

RSC logo

I've attended every JavaOne since 2004, but this year I've got new job and a new conference to attend. This year I'll be traveling to Orlando, FL and attending the Rational Software Conference also known as #rsc2000 in the twit'o'sphere.

I'm not going to be giving a talk, but I will be manning a demo pedestal and showing some of what I've been working on in my first couple of months at IBM: working on getting Rational Team Concert and other Jazz-based products to work well with Lotus Connections, IBM's social software suite which includes communities, forums, blogs, bookmarking, social networking and wikis (coming soon in Connections 2.5).

Connections logo

Why would you want to use Team Concert with Connections? It's all about connecting developers to community, helping developers use social software tools to inform, share and collaborate with the wider community of people that support, manage, sell and use the software.

Jazz logo

The tentative plan that we've outlined for all (registered users) to see on the Jazz.net is all about making it easy to setup and integrate community infrastructure for a new software project.

For example, wouldn't it be nice if, when you setup a new project in Team Concert you'd have the option of setting up an integrated Lotus Connections community complete with a project blog, discussion forum, wiki space and shared bookmarks? Shouldn't those blogs, forums and wikis be searched when you do a project search and shouldn't it be dead-simple to fire-off a blog entry or forum post to start a community conversation about a work-item or any other Team Concert artifact? We think so and we think that's just a start; there's lots more we can do.

If you're going to be at RSC 2009, please stop by and say hi. I'll be on duty from 5-8PM on Monday and most of the day Tuesday. Whether you're there or not, if you've got ideas about developer tool and social software integration, I'd love to hear from you.

I've been at IBM for one month now and I'm just now starting to settle in and make some progress. I'm going to try to work some blogging back into my schedule and tell you about what I'm doing at work. For starters, here's a quick summary of my first impressions.

People

I'm working in IBM's Rational division, home of software development tools from compilers and SCM systems to UML modeling tools and IDEs. The developers I've met in person here have been smart, mostly young and very web savvy folk working on Jazz and emerging technologies.

I've been pretty happy to find the same culture of transparency that I found at Sun, at least in the groups I've interacted with. The Jazz team shares everything via blogs, wikis, makes source control and issue tracking available to the public even though it is not an open source project. I've found IBM's centrally hosted internal blogs, social bookmarking and community sites, many of which are powered by Lotus Connections, to be really useful. So far, the "corporate culture" isn't really all that different than what I saw in Sun, but I've only been here a month.

Software

All of the software I use on a daily basis has changed. I feel like I'm living in an alternate universe. I'm using Lotus Notes for email, calendar and SameTime instant messaging instead of Mac Mail, Calendar and GTalk. I'm using Eclipse and Websphere instead of Netbeans and Glassfish, DB2 instead of MySQL and blogging with Lotus Connections instead of plain old Roller. I'm adjusting pretty well I think; took me about a month. I've heard lots of complaints about Notes in IBM and elsewhere, but it is nice to have everybody hooked into integrated mail, calendar and instant messaging. At Sun everybody seemed to be using a slightly different set of communication tools.

My first assignments involve Jazz (see also From the Eclipse Platform to Jazz), which is new architecture and foundation for Rational's product line. Rational Team Concert (RTC) and two other products so far are built on Jazz which provides a repository, source code control, integrated bug tracking as well as infrastructure for RESTful web services interfaces and an Ajax-based clients ends. The Web UI and the Eclipse UI are great and that's what makes RTC a pleasure to use. And unlike pretty much every other piece of software I've dealt with here Jazz is very easy to install.

The Jazz internals are pretty interesting too and another alternate universe for me. The architecture is basically the Eclipse plugin architecture, powered by the Equinox OSGi container and running in Eclipse, in a Servlet Container and in the browser. The whole system is made up of OSGi bundles and each bundle is also an Eclipse plugin. This is true for the Java code and the Dojo-powered JavaScript code in the web-client because Jazz includes the necessary infrastructure for JavaScript OSGi bundles. I've got to become an expert on this stuff, and fast.

Office

Big changes here as well. I've been working from home for almost 5 years so it's great to have local co-workers and an office. IBM has a couple of huge complexes in the Research Triangle Park (RTP), which is about a 20 minute drive for me. The building I'm in is basically a giant cube farm, but it's modern, set in the woods with lots of windows and the cubes are very nice, as cubes go. The cafeteria is reasonable and about like the one at Sun's California campuses. Much of the Jazz team works here in RTP, which is convenient for me, but my immediate co-workers on the CTO team are scattered around the country. Like Sun, most folks seem to do a mix of office and work-from-home and I'm doing the same.

You can probably tell already that I like the job a lot and I haven't even told you what I'm working on yet. I'll have to start telling you about that in a later post.

Word went out this morning via Twitter and other places but I'm just now getting to it here on my blog. Sorry folks, but you're the last to know. Like I said, they're going fast. At this point there are about 50 spots left. More than enough for all of my readers! Here's the registration link:

http://barcamprdu2009.eventbrite.com/

I took a break from blogging during my first couple of weeks at IBM. My blog broke and it took me a while to find the time and motivation to fix it, but now it's time to return. I think. I have been doing some internal blogging at IBM, but so far it's been mostly boring stuff: status reports and the like.

What I want to talk about today is Project SocialSite. Since my last post, where I mentioned that Sun is willing to contribute SocialSite to Apache, I did some work to move things along. I wrote an Apache Incubator proposal, started a discussion and this week calling for a vote on the proposal. Here are the relevant links:

Proposal: Apache SocialSite

Discussion and vote thread on the Incubator General mailing list

Subscripton info for the Incubator mailing lists

If you want to support the project, and especially if you're on the Incubator's Project Management Committee, now's the time to do so.

Since January, the future of Project SocialSite has been in the hands of the SocialSite community. During that time, I continued working on the project almost because I think it's got great potential and I would really like to see it live on in some form. That's also why I continued to talk to Sun about the project.

Today, I'm very happy to announce that Sun Microsystems is willing to contribute Project SocialSite to the Apache Software Foundation. It's not clear whether SocialSite should be contributed into Shindig or as a new incubator project, but either way I think this is the best thing for the project and will give it the best possible chances for building a thriving community. I've started some discussions about this on Apache-private mailing lists and I'll let you know what happens next.

This post brings to an end my series of posts about Shindig for blogs and wikis. Here are links to the earlier posts:

By the way, I delivered my Shindig talk just a couple of minutes ago. It was well-attended and I think it went pretty well. You can find the slides online at the ApacheCon EU 2009 site here: Shindig for Blogs and Wikis. Now back to your regularly scheduled programming...

In my earlier OAuth everywhere post I explained at a high level "how I got a Roller Gadget working, one that uses OAuth to call Roller and enables Roller to use OAuth to call back to the social network." I ended with some unanswered questions:
  • How do I add my gadget to SocialSite so users can install and use it?
  • How does SocialSite get the Consumer Key and Secret needed for calling Roller?
  • How does Roller get the Consumer Key and Secret needed for calling SocialSite?
  • How does the user authorize Roller's access to his Profile information in SocialSite?
  • When is OAuth support coming to the Roller trunk and can you use it for AtomPub?

(that last question was answered in OAuth for AtomPub in Roller earlier this week)

Now that I've wrapped up my work on OAuth in SocialSite and OAuth in Roller, I'm prepared to answer those questions. I'll do it by reviewing how I developed my Social Roller gadget and set it up to work on http://rollerweblogger.org, my Roller and SocialSite powered site.

Along the way, I'll provide links to source code and screen-shots. I'll be referring to the diagram from first post, so I'll reproduce it here for the sake of convenience:

http://rollerweblogger.org/roller/resource/oauth-roller-socialsite.jpg

NOTE: this post is based on the current code in the Project SocialSite SVN trunk. The things described below WILL NOT work with the SocialSite M3 release.

Step 1 - Develop an OpenSocial Application

My first step was to develop an OpenSocial application for Roller. This application is made up of the three parts listed below. These are the parts show in light-blue in the diagram above.

  1. An OpenSocial Gadget for Roller that a user can install into his SocialSite profile. An OpenSocial Gadget is defined by Gadget Specification, an XML file with the metadata, HTML, CSS and JavaScript that render the gadget's user interface. I developed my gadget as a Roller page template and you can view it's source code here: gadget.xml
  2. A gadget setup page, a new JSP page in Roller that is called by the gadget to enable and disable Activity posting. This JSP page is protected by OAuth and returns data in JSON format to the gadget. View the source code here setupgadget.jsp
  3. A Roller Task that runs periodically, checks to see if any gadget users have created new blog posts and if they have, posts a Activity to SocialSite for each, by calling the OAuth-protected OpenSocial REST API provided by SocialSite. View the source code here SocialRollerTask.java

Step 2 - Register gadget with SocialSite

This section answers the question "How do I add my gadget to SocialSite so users can install and use it?"

My next step was to register my application. Remember that SocialSite is intended to add social features to existing web sites and has very little user interface of its own, it's mostly made up of gadgets. So, the way you register a new application on a SocialSite-enabled site is to sign-up as a user of that site, go to your profile page, install the SocialSite Developer Gadget and then use that gadget to register your new application.

You can see a screenshot of the SocialSite Developer Gadget below. In the simplest case, you just enter the URL of your Gadget Specification, but I needed to take a couple of extra steps because my gadget needs to call an OAuth protected resource in Roller.

This next paragraph answers the question "How does SocialSite get the Consumer Key and Secret needed for calling Roller?"

I need my gadget to call back to the Roller setupgadget.jsp page (that's part #4 in the diagram above) to enable/disable activity posting. Because that page is protected by OAuth, I had to go into Roller and get Roller's site-wide OAuth key and secret (see also: OAuth for Roller) and then enter those it the Developer Gadget. SocialSite stores them and will use them to take care of the OAuth authentication process on each gadget call to Roller (in part #2 above).

Step 3 - Approve gadget registration

Since I'm the administrator of my site, I approved my own gadget registration. I did this by logging into my site's SocialSite admin console, went to the Gadget Management tab, saw my new gadget registration request and approved it. Here's a screenshot of the Gadget Registration approval page:

Step 4 - Add OAuth consumer key and secret to Roller

This next paragraph answers the question "How does Roller get the Consumer Key and Secret needed for calling SocialSite?"

After your gadget is approved for use on a SocialSite enabled site, you'll find the consumer key and secret that Roller needs to call the OpenSocial REST API (that's step #6 above) in the SocialSite Developer Gadget. Here's what you see in the Developer Gadget once you gadget is approved.

My OpenSocial Roller application needs to know about those keys, so I put them in its configuration. For simplicity's sake, I'm not going to go into the details of this step.

Step 5 - install the Social Roller gadget

Finally, the OpenSocial Roller application is ready for use. To install it, I went to my profile page, clicked the Gadget Directory button, browsed through the gadgets until I found it and then clicked the install button. Here's a screenshot of the SocialSite Gadget Directory, which you can access from the SocialSite Profile Gadget:

The Social Roller Gadget is the last item in the list, the "Simple Roller Gadget."

Step 6 - authorize and enable the Social Roller gadget

After I installed the gadget, it appeared in my Profile page as you can see in the screenshot below. It's installed and ready to run, but it's not yet authorized to access my Roller account so it tells me "Before you can use this gadget, you must authorize it to access your Roller account."

Finally, I can answer the question "How does the user authorize Roller's access to his Profile information in SocialSite?"

I want the gadget to access my Roller account so I clicked on the authorize link and saw this page popup, directly from Roller, which asks me to take the final step to authorize access.

After I clicked the authorize button, page disappeared and the Social Roller gadget redisplayed itself as you can see in the screenshot below. The gadget is now ready to access my Roller account and is asking me to enable activity posting:

I clicked the enable posting button and saw this:

And now, whenever I post a new blog entry, an activity is added to my profile. Here's proof in the form of a screenshot:

Conclusion

I've done the work to enable OAuth in SocialSite and Roller, so now it's possible to develop OpenSocial gadgets for Roller that will work with SocialSite and other OpenSocial containers. The Roller side of this work is now available in Apache Roller (in the SVN trunk), but the future of the SocialSite is still uncertain.

I think SocialSite still has great potential. That's why I'm spending so much time promoting it and moving it forward, but I can't do it all myself. I'm joining IBM next week and as far as I know, SocialSite will NOT be part of my job. I'll wrap up this series of posts tomorrow with a post discussing the future of Project SocialSite.

The value of Project SocialSite is that it allows you to add social networking features, including the ability to run OpenSocial gadgets, to existing web sites and have those sites all using the same "social graph" of data about people and relationships. To demonstrate this, I've deployed SocialSite to my site, http://rollerweblogger.org, and finally implemented those things I described in my August 2008 Social Roller post (except for protected entries).

My site includes a blog and a wiki, Roller and JSPWiki, so it's a pretty good candidate for demonstrating how SocialSite can work with multiple existing webapps. It's not perfect because it's got a very small number of users, less than a dozen, and because it's private; you have to login to see the social features, but it'll have to do. In this post, I'll explain the steps you have to take to add SocialSite to a multi-application web site and I'll illustrate the steps with examples, links to source code and screenshots from my work on this site.

three little fishies

NOTE: this post is based on the current code in the Project SocialSite SVN trunk. The things described below may or may not work with the SocialSite M3 release.

Step 1 - Setup an Authentication Delegate page in your site

SocialSite doesn't do any user management, it leaves that to the sites that it enables. In my case, I've got Roller and JSPWiki setup to authenticate against the same database table of usernames and passwords, and I've got Tomcat's simple SSO setup so that logins work across both webapps. I want SocialSite to depend on Roller to verify that users are logged. SocialSite's Authentication Delegation mechanism makes this possible.

Here's how SocialSite Authentication works. You add a delegate page, a dynamic page (JSP, PHP, etc.) to the webapp that is to do the authentication, configure SocialSite to trust that webapp and then at runtime, SocialSite will call that delegate page to verify user logins. In my case, I want Roller to do the authentication so I added a delegate page to Roller called socialsite_context.jsp.

When a SocialSite gadget running inside of Roller needs to call back to the OpenSocial API provided by SocialSite it will pass Roller's login cookie with the call, an assertion about who the logged-in user is and the URL of Roller's authentication delegate page (socialsite_context.jsp). SocialSite will then call that delegate, pass the cookie and verify that assertion. SocialSite expects the delegate to return some JSON data like this:

Example: JSON data from socialsite_context.jsp


  {
    'timeout': 30,
    'assertions': {
      'containerId': 'rollerweblogger.org',
        'viewer': davej,
        'owner': davej,
      }
    }
  }

In the above example, Roller is confirming the assertion that the user is 'davej' and the owner of the page containing the gadget is also 'davej'. Knowing this, SocialSite can decide what data the caller is allowed to access.

Step 2 - configure SocialSite to trust your Authentication Delegate page

SocialSite won't trust just any authentication delegate page. Once you have created your page, you must configure SocialSite to trust it. You do this by editing a SocialSite configuration file in WEB-INF/classes/socialsite_context.xml. Here's an example that sets up a trust relationship with Roller's socialsite_context.jsp page:

Example: socialsite_context.xml in SocialSite


  <rules>
    <rule>
      <sources>
        <indirect>*</indirect>
      </sources>
      <assertions>
        <reject>*</reject>
      </assertions>
    </rule>

    <rule>
      <sources>
        <direct>http://rollerwebogger.org/socialsite_context.jsp</direct>
        <direct>*</direct>
      </sources>
      <assertions>
        <accept>*</accept>
      </assertions>
    </rule>
  </rules>

Step 3 - Add SocialSite Context declarations to target pages

Once the Authentication Delegate page is in place, you're just about ready to start adding gadgets to the pages of your web applications. Each page that includes gadgets will need to include a couple of SocialSite scripts and information about the SocialSite context, i.e. the URL of the authentication delegate. Here's an example of the the JavaScript that I include include in Roller pages that use SocialSite gadgets:

Example: SocialSite context declaration for a Roller page template


  #set($viewer = $utils.getAuthenticatedUser().getUserName())
  #set($userName = $model.getRequestParameter("user"))
  #if ($userName)
    #set($owner = $userName)
  #else
    #set($owner = $viewer)
  #end
  #set($contextURL = "${url.absoluteSite}/socialsite_context.jsp")
  <script type="text/javascript" 
    src="${url.absoluteSite}/social/js/consumer.jsp"></script>
  <script type="text/javascript">
    socialsite.setContext({
      'delegate': {
        'method': 'GET',
        'url': '$contextURL?owner=$owner&amp;viewer=$viewer',
        'headers': {
          'cookie': document.cookie
        }
      }
    });
  </script>

The above code pulls in some JavaScript from SocialSite and sets up the context necessary for gadgets to call back to SocialSite. It uses Roller's $utils.getAuthenticatedUser() to determine the logged-in user and a request parameter 'user' to determine who owns the page.

Step 4 - decide where to put key social networking pages

Finally, you're ready to add gadgets to the pages of your site. First, you'll want to do some planning. You'll want to decide where to place some key pages. The SocialSite widgets are designed to support a dashboard page, which allows users to browse people, make friends and receive messages. They also support both personal and group profile pages.

For rollerweblogger.org, I decided to use one Roller page template 'people' to act as both the Dashboard and Profile page. If you access the page with a URL that specifies a user, then you'll see the profile page of that user. If you access the page with without specifying a user, then you'll see your dashboard page. Here's what I put in the socialsite.properties file to set all this up:

Example: SocialSite URL properties from socialsite.properties


  # People page shows your Dashboard
  socialsite.dashboard.url=\
    http://rollerweblogger.org/project/page/people

  # People page with user parameter shows profile of specified user
  socialsite.profile.url=\
    http://rollerweblogger.org/project/page/people?user=${userid}

  # Group profile page will be hosted in JSPWiki
  socialsite.group.url=\
    http://rollerweblogger.org/wiki/Wiki.psh?page=${groupid}

NOTE that in the above configuration, I'm using my wiki to host group profile pages; more about that later.

Step 5 - add OpenSocal Gadgets

Once you've decided how to set things up, you're ready to start adding gadgets. Assuming that you've added the SocialSite context declarations in your pages, you can add a gagdet with a single line of JavaScript. For example, to add the SocialSite Owner Activities Gadget you'd add this code:

Example: add gadget code from a Roller page template


  <script type="text/javascript">
    socialsite.addGadget({'spec':'local_gadgets/owner_activities.xml', 
      'removable':false, 'height':75, 'includeChrome':true});
  </script><br/><br/>

NOTE that you can add any OpenSocial gadget by specifying its URL in the spec argument of the socialsite.addGadget() call.

Screenshots

It's screenshot time. I've included small thumbnail images belo, which you can click for a closer view. If you're on my site, photos will display in a light-box. First up, is the new People page that you will see if you are logged into rollerweblogger.org. It uses the SocialSite Profile, Face, Status, Friends and Activities gadgets.

SocialSite Profile Gadgets in Roller">

Next up, the dashboard page. It uses just one gadget, the SocialSite Dashboard, which provides a bunch of different features and was introduced in the SocialSite M2 release. In one tab you can see the most recent activities of your friends or any of your groups:

SocialSite Dashboard in Roller: Activities">

In the second tab of the Dashboard Gadget, you can search and filter the people in the social network. You can filter by friends or by your groups. You can also create new relationships and accept or ignore relationship requests from this view.

SocialSite Dashboard in Roller: People search and browse">

In the last tab of the Dashboard Gadget, you can view and manage incoming messages and friendships requests:

SocialSite Dashboard in Roller: Messages">

Want to see the source code? You can see the page template code for my People page in the Roller page templates people, which contains the SocialSite context declaration, and people, which contains the main body of the page.

Finally, let's take a look at an example group profile page, which is located in my wiki.

SocialSite Gadgets in JSPWiki">

Hmm... I never explained how I got SocialSite gadgets working in JSPWiki. Better fix that now.

A note about SocialSite in JSPWiki

To get SocialSite gadgets working in JSPWiki, I had to to a little extra work. In my instance of JSPWiki, I don't allow HTML so I couldn't just drop in the JavaScript code necessary to declare the SocialSite context and make the socialsite.addGadget() calls. What I had to do was to create a couple of JSPWiki plugins, one for the SocialSite context and one for the add-gadget call. Here the raw wiki text of the Atomic Group page pictured above:


  !!!SocialSite Group: Atomic

  [{SocialSiteGroupContext group='atomic' 
    consumerUri='http://rollerweblogger.org/social/js/consumer.jsp' 
    authUri='http://rollerweblogger.org/socialsite_context.jsp'}]

  Demonstrates the SocialSite Group gadgets, running in JSPWiki.

  !!Group Profile Gadget

  Below is the Group Profile for group __Atomic__. You can use the buttons at 
  the bottom to edit the group's profile properties, to send a message to 
  the group and to add OpenSocial gadgets to this page.

  [{SocialSiteAddGadget spec='/local_gadgets/group_profile.xml' removable='true'}]

  !!Installed Gadgets

  This is where the group's OpenSocial gadgets will appear.
  [{SocialSiteAddGadget collection='GROUP'}]

And here are links to the source code for the two plugins: SocialSiteContext.java and SocialSiteAddGadget.java.

Conclusion

That should give you a pretty good idea of what you can do with SocialSite. Don't be dissappointed if the gadgets don't look like exactly what you want. The important thing is that SocialSite gives you a centralized social graph service and the infrastructure needed to add social networking features to your sites via OpenSocial gadgets. If you don't like the gadgets that come with SocialSite, you easily write your own using the standard OpenSocial APIs and the SocialSite extensions to those APIs.

ROME logo

Yesterday I wrote about OAuth support in the upcoming Roller 5.0 release. Today I'm following up with a post about OAuth support in ROME Propono.

As you may remember, ROME Propono is a subproject of ROME, the Java-based RSS/Atom feed library. ROME Propono includes an AtomPub server library and an AtomPub client. I added OAuth support to the AtomPub client and in this post, I'll show how you can use it to post to the Roller 5.0-dev (i.e. the snapshot build that I made available yesterday).

ROME 1.0 and coming soon: ROME Propono 1.0

In case you haven't already heard, thanks to the recent hard work of Nick Lothian, ROME 1.0 is now available. You can find downloads at rome.dev.java.net and a list of changes in the Change Log there. To celebrate this momentous event, I'm planning on releasing ROME Propono 1.0 as well, and in preparation, I've made a release candidate available. The new Propono includes ROME 1.0 and support for OAuth. You can get it via the links below:

rome-propono-1.0RC1.tar.gz (2.0 mb)

rome-propono-1.0RC1.zip (3 mb)

Posting to Roller via AtomPub and OAuth

To use the Propono AtomPub client, you place the Propono jars in your Java VM classpath and then call the AtomClientFactory to get started, as described in the ROME Propono 1.0 Javadocs.

Below is a Groovy example that shows how to post a blog entry to Roller via AtomPub and OAuth. You can get the consumer key, secret and URLs you need to call your instance of Roller from the OAuth Credentials page in the Roller admin interface.


  import com.sun.syndication.propono.atom.client.*
  import com.sun.syndication.feed.atom.*

  def authStrategy = new OAuthStrategy(
    "roller",                               // username
    "55132608a2fb68816bcd3d1caeafc933",     // consumer key
    "bb420783-fdea-4270-ab83-36445c18c307", // consumer secret
    "HMAC-SHA1",                            // key type
    "http://blogs.example.com/roller-services/oauth/requestToken",
    "http://blogs.example.com/roller-services/oauth/authorize",
    "http://blogs.example.com/roller-services/oauth/accessToken")

  // get the AtomPub service
  def appService = AtomClientFactory.getAtomService(
    "http://blogs.example.com/roller-services/app", authStrategy)

  // find workspace of my blog
  def blog = appService.findWorkspace("Blogging Roller")

  // find collecton that will accept entries
  def entries = blog.findCollection(null, "application/atom+xml;type=entry")

  // create and post an entry
  def entry = entries.createEntry()
  entry.title = "TestPost"
  def content = new Content()
  content.setValue("This is a test post. w00t!")
  entry.setContent([content])
  entries.addEntry(entry)

If you have questions or feedback about ROME Propono 1.0 RC1, please post them to the ROME dev mail list and I'll do my best to respond there.

powered by Roller badge

Over the past month or so I've been adding OAuth support to just about every open source project that I can commit to. I added OAuth support to Roller so that you can now use OAuth to protect Roller's AtomPub server and other things. I also added OAuth support to ROME Propono's AtomPub client so you can now use Propono to post to Roller (more about that later). Here's a quick overview of how OAuth in Roller works.

NOTE that this post applies to Roller 5.0, which has not yet been officially released.

Setting up OAuth for AtomPub in Roller

If you want to use OAuth with AtomPub on your Roller site, go to the Server Admin page and find the Web Services section, enable AtomPub and specify 'oauth' as the authentication mechanism, like so:

OAuth config in Roller 5.0-dev

Getting your OAuth key, secret and URLs

Once you've done the setup, you'll find an OAuth Credentials link on the Roller Main Menu page, which will lead you a page like the one below showing your OAuth consumer key & secret and, if you are a site admin user, the site-wide key & secret. Currently, there's only one set of site-wide credentials; I plan to fix that.

OAuth keys page in Roller 5.0-dev

Of course, those aren't my real keys. You'll want to keep your OAuth keys secret as they can enable anybody to access your Roller account via AtomPub.

Want to try it yourself?

I mentioned that Roller 5.0 has not yet been released and that's true. There's still a lot of work to be done on 5.0, but that doesn't mean you can't get your hands on the code and binaries now. To make it easy, I've made an unofficial snapshot version of Roller 5.0-dev available for testing purposes only. It's what I'm running on my site. You can get it here in two flavors:

apache-roller-5.0-dev-20090321-SNAPSHPOT.tar.gz (31 mb)

apache-roller-5.0-dev-20090321-SNAPSHPOT.zip (31 mb)

The instructions in the old Roller 4.0 installation guide should work fine, so follow them to install and configure the 5.0-dev SNAPSHOT. Please send questions and feedback to either the Roller dev mail list and I'll do my best to respond there.

You'll also need an OAuth capable AtomPub client. More on that topic tomorrow...

OAuth logo

I'm going to be following up my OAuth everywhere! post, with several more OAuth related posts this week. So, just in case you are wondering "why is Dave going off on this cockamamie OAuth tangent?", I'll take some time now to explain a little about OAuth to help you understand.

OAuth is a emerging protocol that one web site can use to access your data on another website without asking you to reveal your username and password. For example, when the sinister BuddyNet9000(TM) Social Network site wants to access your GMail account so it can spam your "friends" on your behalf, you can use OAuth to give it access without telling it your username and password. Why risk your GMail security when all you want to do is spam some people? There are less snarky examples, but that one makes the point well, I think.

There's a good end-user oriented introduction on OAuth.net titled Beginner’s Guide to OAuth: Protocol Workflow. OAuth is not that widely deployed yet, and is not perfect, but it is emerging and going the IETF standards route.

I'm interested in OAuth because it's part of the OpenSocial spec, used to authorize access to the OpenSocial REST API and to enable OpenSocial Gadgets to call out to OAuth protected resources. Also, because it's used to protect AtomPub-based services, including the Google Data APIs. I needed to learn about it for my Roller and SocialSite work and if you're going to be doing much OpenSocial work, you'll need to learn about it too.

View of art center (foreground) and Movenpick Hotel

I'm off to ApacheCon EU 2009 tomorrow in Amsterdam to speak on the topic of Shindig for Blogs and Wikis. I'm really looking forward to catching up with my Apache friends and colleagues. That's the conference venue in the photo on the right, the Mövenpick hotel (in the background behind the music hall).

I'm staying a couple of extra days, so I hope to have time for bicycling around the city as I've done in the past (see also: Flickr photo sets for 2007 and 2008). Unfortunately, the weather forecast stinks. There's a 60% chance of rain every day that I'm in town. Oh well; guess I'll have plenty of time for blogging.

Speaking of blogging.This week, I'll be posting some blog entries to highlight the work that I've done in preparation for my talk. Here's what I plan to cover:

  • Monday: OAuth for AtomPub in Roller
  • Tuesday: OAuth for ROME Propono
  • Wednesday: SocialSite on rollerweblogger.org
  • Thursday: OAuth everywhere (continued)
  • Friday: the future of Project SocialSite

If you plan to attend my talk, at 4:30PM on Friday March 27, then you should follow along. Pay special attention to the SocialSite on rollerweblogger.org and OAuth everywhere (continued) posts, which will include detailed background info. I'm looking forward to seeing you there.