Skip to main content
 

nice iron work at the secret wine shop.

nice iron work at the secret wine shop.

 

I feel compelled to post something to counteract the dozen reshares of Christian's Google+ for business post..

I feel compelled to post something to counteract the dozen reshares of Christian's Google+ for business post..

I hope this season of Torchwood is decent. It can be pretty hit or miss, but when it hits it's pretty darn good.

 

Apache Invites.. Looking forward to connecting with more people here.

Apache Invites.. Looking forward to connecting with more people here.

[email protected]

VP Apache Shindig

 

Remember Vox?

Remember Vox? I had the good fortune to be at Six Apart for it's development and launch. A lot of amazing work went into it and sadly it is no more. Vox was ahead of it's time and I feel that Google+ has much of what I liked about it.

You see back then Six Apart acquired Livejournal for it's amazing technology and it's foothold into the social space beyond blogging. There was a hitch though, LJ code was open sourced and GPL'd. It would be hard to sell a rebranded LJ to people like NTT, or other Typepad partners.. Also as a service LJ had developed it's own culture that might not benefit from a wave of mommy bloggers, nor would said bloggers be comfortable with the cutters and goths over at LJ.

Thus Comet was born and launched as Vox. You could follow with Friends/Family groups. Each post could be as private and public as you liked. You could cross-post to LJ, apply stylish themes to your blog and there was the (question of the day) which sparked up some great conversations and helped build a sense of community.

Some of the features found their way into Typepad, and Typepad's profiles. Sadly, many did not.

What do you think Six Aparters? What features do you miss that you'd like to see here?

 

 

Spent some time mapping the shortcuts my neighborhood using Google Mapmaker.

Spent some time mapping the shortcuts my neighborhood using Google Mapmaker. Luckily I was able to get most of my data from the Oakland Urban Paths database.

My mapmaker profile is here:

http://www.google.com/mapmaker?gw=66&uid=216375860650465931580

The crazy thing is despite being a tech lead for Google+ Connected Sites I didn't have this in our node mapper system. I'll have to get right on that :-)

 

Picked up one of these this weekend at Peets. It makes great iced coffee!

Picked up one of these this weekend at Peets. It makes great iced coffee!

(Obligatory Google+ tip: This was shared directly from http://shopping.google.com/ which uses http://schema.org markup to help make sharing easier!)

 

Airship Ventures is on tour and coming to Minneapolis July 12 - 17, here are some pictures from our zeppelin ride...

Airship Ventures is on tour and coming to Minneapolis July 12 - 17, here are some pictures from our zeppelin ride last February. Highly recommended.

 

Pseudo invite to Google+

Pseudo invite to Google+

Hi Oren,

Senidng on behalf of Byrne Reese.. I'm pretty sure this post will send you a Google+ invite. If not please email me at [email protected] and I'll get you when the next window cracks open.

Paul

 

 

Help your friends find you! - another Google+ tip...

Help your friends find you! - another Google+ tip...

Add and verify all of your email addresses to your Google Account here:

https://plus.google.com/settings/general

This makes it easier for your friends to find you now and in the future! I've found that I don't know the gmail address of many people, but I do know their corp email or another alias. Plus if you lose your password you can send a recovery email to your alternate address.

Be aware that you can only associate one email per Google account and you can't add another gmail address to another account. If you want to associate email addresses to your primary account you can visit this page:

https://www.google.com/accounts/EditUserInfo

1) If the email is listed as a secondary address, remove it on the old account and add to the primary.

2) If the email is primary you can change the email address of the unused account and replace it with something like [email protected]. Then add the renamed email to the primary account.

Cheers.

 

Hi Opensocial folks.

Hi Opensocial folks. As you may have noticed that I'm a bit busy lately. Tonight I'm going to catch up on shindig/spec work.

Thanks to everyone in this community for making Opensocial a success!

 

Hi current and former Six Apart folks..

Hi current and former Six Apart folks..

Hope you're enjoying your foray's into Google+.. Sending this out so some of you might receive invites. (It's somewhat non-deterministic, so I'm not sure if it'll go out..)

Feel free to hit the send feedback link in the lower right or ping me. Also I'm happy to work with anyone on driving deeper connectivity to Six Apart or other properties. (My main focus is on connecting sites, contacts, activities, all that..)

 

 

A couple of people have asked about importing facebook contacts.

A couple of people have asked about importing facebook contacts. Sadly we cannot do that, however there is a workaround:

* Import Your facebook friends via Yahoo:

http://www.ymailblog.com/blog/2010/03/facebook-friends-meet-yahoo-contacts/

* Then connect your yahoo account to Google+ here:

http://plus.google.com/circles/find

 

Myspace...

Poor poor myspace...

Email sent to me today...

 

A whole new class of Google+ jokes has sprung up....

A whole new class of Google+ jokes has sprung up....

Originally shared by Anil Dash

Your moms so fat, she huddle all by herself.

 

Welcome aboard Google+!

Welcome aboard Google+!

Invites are still flowing out, so pay attention to your inbox (and hopefully not your spam folder!)

 

Paul Lindner changed his profile photo.

Paul Lindner changed his profile photo.

 

Hope you'll take the plunge into Google+ -- It has a lot of the Vox vibe that I miss so much!

Hope you'll take the plunge into Google+ -- It has a lot of the Vox vibe that I miss so much!

Also I'm doing connected sites work (try connecting your yahoo/live account!) there's a lot of cool stuff we can do together. Just let me know at [email protected]

 

Alfresco coding

Alfresco coding !

 

Farmville 1970

Farmville 1970 props to Rohit

 

Rainbows over Oakland

Rainbows over oakland

 

Yelp

Yelp warnings at the vet. I imagine the next step is binding arbitration??

 

Opensocial...

I'm at the San Francisco office today putting the socialism back into Social Standards.

From 1-5pm see talks about OpenSocial and OpenSocial v2.0. It's in Duboce Tech talk.. Then at 5 there's a reception with beer, wine, snaks and *10* vendors demoing OpenSocial apps and containers.

And.... If you want to volunteer to register attendees I can hook you up with a snazzy t-shirt with the v2 logo!

 

 

Goats!

Now if only I could cross post this to livejournal...

 

Opensocial...

Oh fun, this years Opensocial event is going to have a snazzy tee.

 

wfh

Going to WFH today. Have to be here for an inspection of the foundation plus keep an eye on the jackhammering.

 

Following

A better follower email might make all the difference to the people that complain that ES is spam.

Here's the flickr follower email. Nice and concise, it illustrates the asymmetrical nature of the relationship and provides some useful information. Furthermore there are two calls-to-action that reinforce the viral loop, specifically asking you to check out the _contacts_ of the person.

https://picasaweb.google.com/107786897865850743842/April252011?authkey=Gv1sRgCKnsktjV2sD36gE#5599453...

 

 

 

Taco

Okay, giving this another try...

Since it says 'notify 11 people by email' I'm betting this goes through this time...

Also please comment on this taco if you're on ES so I can stop sending you invites :)

And here's something to make you laugh..

 

Making the Internet Better - Google Edition

I've been very fortunate in my career.  I've had many opportunities and been successful in making the Internet a better place for end-users and developers.  From the early days of Gopher to the mainstreaming of open-source at Red Hat to the rise of blogging at Six Apart and on to forming the social web with Opensocial -- I've been a part of many game-changing technologies first hand.   It's one of the most satisfying parts of my work.

That's why I'm happy to announce that I'm joining Google today.  My gut tells me that this is the right company, the right team, and the right time to contribute to and help define another major change that betters the internet and the entire world.

The decision to work for Google did not come easy.  My time at LinkedIn has been truly amazing. The people are smart, the technology is stellar and the opportunities to learn and contribute are limitless.   In the past year and half the company doubled in size while the Platform team launched dozens of great new products and enhancements. I'm especially proud of the small parts that I played in helping launch LinkedIn's open developer program and am equally excited about a number of future projects that will launch in the near future.  I cherish the friendships and knowledge gained and will miss everyone there greatly.

I look forward to the exciting things that I'll be able to accomplish soon.  Here's to the next evolution and revolution!

 

 

paul.vox.com lives here now...

I just completed exporting my Vox to Typepad. Quite a trip down memory lane; back to the golden age of blogging. I'm thinking kind thoughts for Six Apart right now -- I know this can't be an easy transition they're going through.

 

Fedora 12, Dracut, dmraid, mdadm, oh my!

It appears that Fedora 12 moved to a new boot init system called dracut.  Sadly due to a number of odd circumstances this has caused me much pain.  Here's my basic config

 
  • /boot and /  on /dev/sda
  • /var and /home on a partitioned software raid on /dev/sd{cd}
 
After an yum-based upgrade to Fedora 12 I rebooted.  We get to the point where we initialize the software raid and boom.  failure.  I'd seen this before, partitioned raid has always had some trouble in fedora.  Previously I had to modify the rc.sysinit script to reset the raid partitions, so I tried that again, moving that init to later in the boot sequence.  Reboot and yes, it works..
 
However then I noticed some odd things.  I was only getting a single drive in my mirrored RAID.  Further investigation revealed that I had a device dm-1 instead of sdc or sdd listed in /proc/mdstat...  Uh oh..
 
Looking more closely it appears that my drives were getting set up by dmraid as a fake-raid mirror:  
 

# dmraid -r 
/dev/sdd: sil, "sil_aiabafajfgba", mirror, ok, 488395120 sectors, data@ 0
/dev/sdc: sil, "sil_aiabafajfgba", mirror, ok, 488395120 sectors, data@ 0

 
I tried adding the nodmraid option to grub.conf but then the new dracut system started an infinite spew of messages generated by this mdadm error message string (lifted from Assemble.c)
 

fprintf(stderr, Name ": WARNING %s and %s appear"
" to have very similar superblocks.\n"
" If they are really different, "
"please --zero the superblock on one\n"
" If they are the same or overlap,"
" please remove one from %s.\n",
devices[best[i]].devname, devname,
inargv ? "the list" :
"the\n DEVICE list in mdadm.conf"

 

Drats! the mirrored fake raid had already mangled my second drive by duplicating the superblock!  Plus since all this was going on in dracut I couldn't fix it.  So I removed the nodmraid option in grub during boot and dug a little deeper. I found that I could keep dracut from doing all this nonsense by adding the following kernel options:

 

rd_NO_MD rd_NO_DM nodmraid

This allows for a minimal boot without dmraid or mdadm.  After that I was dropped into single user mode with the dupe superblock message.  To fix this required zeroing the superblock of sdd
 

mdadm --zero-superblock /dev/sdd1

 

And then rebooting (again!)

 
Once past this things started working somewhat normally.  To get my raid mirrored again I did the normal thing:
 

# mdadm --manage /dev/md_d0 --add /dev/sdd1

 

To get rid of the false-positive fake raid setup I found that you can do this with the dmraid tool itself:

 

[root@mirth ~]# dmraid -E -r /dev/sdd

Do you really want to erase "sil" ondisk metadata on /dev/sdd ? [y/n] :y

[root@mirth ~]# dmraid -E -r /dev/sdc

Do you really want to erase "sil" ondisk metadata on /dev/sdc ? [y/n] :y

 
The really odd thing about this whole incident is that I never had these drives in a fake raid setup before. 
 
In any case, hope this helps the few other people who might have this same problem.
 

 

Gopher on MTV

I dug this little gem out of the archives.  Enjoy!

Gopher World Tour T-Shirt on MTV

 

Email Clients Full Circle

In the beginning I used elm to read my mail.  This was somewhat radical, especially as I worked with the team that created POPMail for the mac and Minuet for the PC, and everyone else moved to pine.  Then came Mutt -- happy days -- I was able to slice and dice email with amazing speed.

A couple of years ago I converted over to Mail.app -- mostly because of the contacts and calendar integrations, and the fact that I could merge personal email and corp email accounts.  In the intervening time I had to move to comcast, which meant running my own imap server proved more difficult than it was worth, so I moved to Google Apps for Your Domain, all of a sudden my personal domain is running Gmail, and I discovered it has key bindings.
All of a sudden it's mutt deja-vu. navigation with vi j/k keys? yes.  Single window view (inbox/message)? yes again.  Tagging messages? yes.  Blazingly fast? you bet.  The only thing I miss is keystroke filtering of messages.
That's one reason why I see things like Google Wave working out so well, I might be late to the gmail party, but plenty of folks have been using this as their primary mode of communication for a long long time.
 

Tomcat and SSL Accelerators

Using an SSL Accelerator like a Netscaler is really useful, you can offload a lot of work to a device that supports this in hardware and can use SSL session affinity to send requests to the same backend.  In the simplest setup the SSL Accelerator accepts the request and proxies it to your internal set of hosts running on port 80.

However, code that generates redirects and URLs works poorly because the servletRequest.getScheme(), getSecure() and getServerPort() will return http/false/80 for SSL and non-SSL connections.
One way to solve this is listen on multiple ports.  Create a Connection on 80 and 443, but do not run SSL on either port.  Then for the 443 port you configure it with secure="true" and scheme="https".  This is suboptimal however as then you have to manage yet another server pool in your load balancer and you end up sending twice the health checks.  Not so good.
You might try to solve this by using a ServletFilter.  You can use an HttpServletRequestWrapper instance to change the scheme/port/and secure flag.  Sadly this doesn't work, because of the way tomcat implements HttpServletResponse, it uses the original request object to ascertain the scheme/secure flag/port.  Overriding these will allow application logic to see the updated values.  You get into trouble when you call encodeRedirectURL() or sendRedirect() with non-absolute URLs.
Lucky for us Tomcat supports a way to inject code into the connection handling phase via Valves.  A valve can query and alter the Catalina and Coyote request objects before the first filter is run.  
To make your Valve work you'll need to configure your load balancer to send a special header when SSL is in use.  On the Netscaler this can be done by setting owa_support on.  With that enabled the http header Front-End-Https: On is sent for requests that use SSL.
Once we have these pieces in place the Valve is fairly straightforward:

import java.io.IOException;

import javax.servlet.ServletException;

import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;

public class NetscalerSSLValve extends ValveBase {

        @Override
        public void invoke(Request req, Response resp) throws IOException, ServletException {
                if ("On".equals(req.getHeader("Front-End-Https"))) {
                    req.setSecure(true);
                    req.getCoyoteRequest().scheme().setString("https");
                    req.getCoyoteRequest().setServerPort(443);
                }
                if ( getNext() != null ) {
                        getNext().invoke(req, resp);
                }
        }
}

Compile this, stick it in the tomcat lib directory, add an entry in your server.xml and away you go.

 

July Update of InApps Plaform Imminent

Hi folks, just a quick note to let you know that we're about to refresh the InApps platform with some new features and fixes. I'm sure Taylor's probably let you know this already, but some things to be aware of:

* isOwner, isViewer in json-rpc requests are not present unless true. This reduces the size of the rpc responses significantly.
* Data-Pipelining and Opensocial templates have much greater functionality.
* content-rewrite feature is available and can be used to consolidate css/javascript in your gadget.

More info to come...

Paul

 

Google I/O Today

Speaking at "Meet the Containers", "Shindig 101" and "OpenSocial Fireside Chat".

All at Moscone West, check it out!

http://code.google.com/events/io/

 

The Mysteries of Java Character Set Performance

"Two Characters Sets?  Seems like plenty!"

 

So I've been pushing Java to it's limits lately and finding some real nasty concurrency issues inside the JRE code itself.  Here's one particulary ugly one -- we had 700 threads stuck here:

 
       java.lang.Thread.State: BLOCKED (on object monitor)                                                                    
         at sun.nio.cs.FastCharsetProvider.charsetForName(FastCharsetProvider.java:118)
         - waiting to lock <0x00002aab4cdf91b8> (a sun.nio.cs.StandardCharsets)
         at java.nio.charset.Charset.lookup2(Charset.java:450) 
         at java.nio.charset.Charset.lookup(Charset.java:438)
         at java.nio.charset.Charset.isSupported(Charset.java:480) 
         at java.lang.StringCoding.lookupCharset(StringCoding.java:85) 
         at java.lang.StringCoding.decode(StringCoding.java:165)                                                                      
         at java.lang.String.(String.java:516) 
 
Digging deeper we find the lookupCharset is called all over the place.  The app in question is functions as a web proxy, so it's constantly reading and writing data from web pages in a variety of character sets.  The method charsetForName() uses a synchronized data structure to lookup defined character sets.  (Yay serialized access....)
 
But wait, lookup and lookup2 provide us with a cache so we can avoid the big bad synchronized method..  Sigh, here's the implementation:
 
     private static Charset lookup(String charsetName) {
         if (charsetName == null)
             throw new IllegalArgumentException("Null charset name");
 
         Object[] a;
         if ((a = cache1) != null && charsetName.equals(a[0]))
             return (Charset)a[1];
         // We expect most programs to use one Charset repeatedly.
         // We convey a hint to this effect to the VM by putting the
         // level 1 cache miss code in a separate method.
         return lookup2(charsetName);
     }
 
     private static Charset lookup2(String charsetName) {
         Object[] a;
         if ((a = cache2) != null && charsetName.equals(a[0])) {
             cache2 = cache1;
             cache1 = a;
             return (Charset)a[1];
         }
 
         Charset cs;
         if ((cs = standardProvider.charsetForName(charsetName)) != null ||
             (cs = lookupExtendedCharset(charsetName))           != null ||
             (cs = lookupViaProviders(charsetName))              != null)
         {
             cache(charsetName, cs);
             return cs;
         }
 
         /* Only need to check the name if we didn't find a charset for it */
         checkName(charsetName);
         return null;
     }
 
Yes, a whopping 2-entry cache!!
 
Also, the keys used are not canonical, so if my app asks for "UTF-8", "utf-8", and "ISO-8859-1" with regularity this 2 entry cache is worthless, every call ends up blocking in the evil thread-synchronized data structure.
 
Someone send them a copy of the ConcurrentHashMap doc.  please.
 
....
 
 

Social Graph Meat-up

Dinner not for vegans at O'Reilly.

Social Graph Meat-up

Social Graph Meat-up

 

 

Tired

Why am I so tired?

Been working hard to implement features decribed here..:

hi5 Launches New Music Applications By iLike and Qloud

No more music royalties for hi5.  Cost center is now a profit center...


 

 

OpenSocial Roundup

 At hi5 we've been busy busy busy getting OpenSocial up and running.  We released our developer sandbox, and are rapidly implementing features.  So check out the following URLs

 

 

 

Also, here's a copy of my response to Tim O'Reilly's blog post:

OpenSocial: It's the data, stupid

Hi folks,

Good comments all around. However I'd like to posit that data access is _not_ the problem. We've had universal standards for years now with little uptake. Tribe.net, Typepad, LiveJournal and others have supported FOAF for many, many years, which encompasses the OpenSocial Person and Friends APIs. Not much has come of that -- there isn't a large enough base there to get people interested.

Now you have a broad industry consensus on a single way to provide all of the above plus activity stream data. You have a rich client platform that allows you to crack open that data and use it in interesting ways, and finally you have a common standard for social networks to interact with each other based on the REST api.

So Patrick's statement at the Web 2.0 Expo is correct, a app running inside a container only allows you to see what that container shows you. However that does not mean that a container could not contain friend references to external social networks via it's own federation mechanism. Movable Type 4.0 has shown that you can support any OpenID login in a single system, there's no reason to believe that social networks could not leverage OAuth to do the same.

And here's a final point to consider -- you have Myspace opening up to developers. That's huge. That alone is going to draw more developer attention to this problem than much of the oh-so academic discussions of the past few years.

I suggest people that _want_ OpenSocial to solve all the social graph ills get involved on the API mailing list and make sure that those elements are addressed as OpenSocial evolves.

There's a tremendous amount of momentum. Let's not waste this chance.