<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="https://raibledesigns.com/roller-ui/styles/rss.xsl" media="screen"?><rss version="2.0" 
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:atom="http://www.w3.org/2005/Atom" >
<channel>
  <title>Raible Designs</title>
  <link>https://raibledesigns.com/rd/</link>
      <atom:link rel="self" type="application/rss+xml" href="https://raibledesigns.com/rd/feed/entries/rss?tags=linkedin" />
    <description>Raible Designs is an Enterprise Open Source Consulting company. We specialize in UI and Full Stack Architectures using HTML5, CSS, JavaScript and Java. We love HTML5, Angular, Bootstrap, Spring Boot, and especially JHipster.</description>
  <language>en-us</language>
  <copyright>Copyright 2026</copyright>
  <lastBuildDate>Mon, 30 Mar 2026 03:31:45 -0600</lastBuildDate>
  <generator>Apache Roller (incubating) 5.0.3 (1388864191739:dave)</generator>
        <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/grails_oauth_and_linkedin_apis</guid>
    <title>Grails OAuth and LinkedIn APIs</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/grails_oauth_and_linkedin_apis</link>
        <pubDate>Tue, 22 Dec 2009 15:37:57 -0700</pubDate>
    <category>Java</category>
    <category>grails</category>
    <category>github</category>
    <category>linkedin</category>
    <category>profile</category>
    <category>oauth</category>
            <description>Back in November, I wrote about &lt;a href=&quot;http://raibledesigns.com/rd/entry/gwt_oauth_and_linkedin_apis&quot;&gt;how to talk to LinkedIn APIs with GWT&lt;/a&gt;. A week later, I &lt;a href=&quot;http://twitter.com/mraible/status/6195066631&quot;&gt;figured out how to do it with Grails&lt;/a&gt; and contributed a &lt;a href=&quot;http://code.google.com/p/grails-oauth/issues/detail?id=1&quot;&gt;patch&lt;/a&gt; to the grails-oauth plugin. 
&lt;/p&gt;
&lt;p&gt;Since then, a few folks have asked how I did it. Since code speaks louder than words, I took some time and 1) verified the oauth plugin works as expected and 2) created an example application demonstrating functionality. You can find the results in &lt;a href=&quot;http://github.com/mraible/grails-oauth&quot;&gt;my fork of grails-oauth on GitHub&lt;/a&gt;. You can also &lt;a href=&quot;http://demo.raibledesigns.com/grails-oauth&quot;&gt;view the example online&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;border-bottom: 1px dotted silver; padding-bottom: 5px&quot;&gt;Below is a quick tutorial explaining how to integrate LinkedIn into your Grails application.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://www.grails.org/Download&quot;&gt;Download&lt;/a&gt; and install Grails 1.1.2.&lt;/li&gt;
&lt;li&gt;Run &lt;em&gt;grails create-app&lt;/em&gt; to create your application.&lt;/li&gt;
&lt;li&gt;Add the following to the bottom of &lt;em&gt;grails-app/conf/Config.groovy&lt;/em&gt;:
&lt;pre class=&quot;brush: java&quot;&gt;
oauth {
    linkedin {
        requestTokenUrl=&quot;https://api.linkedin.com/uas/oauth/requestToken&quot;
        accessTokenUrl=&quot;https://api.linkedin.com/uas/oauth/accessToken&quot;
        authUrl=&quot;https://api.linkedin.com/uas/oauth/authorize&quot;
        consumer.key=&quot;XXX&quot;
        consumer.secret=&quot;XXX&quot;
    }
}
&lt;/pre&gt;
You can get your consumer.key and consumer.secret at &lt;a href=&quot;https://www.linkedin.com/secure/developer&quot;&gt;https://www.linkedin.com/secure/developer&lt;/a&gt;. Make sure to set the &lt;em&gt;OAuth Redirect URL&lt;/em&gt; to http://localhost:8080/{your.app.name}/oauth/callback for testing.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/mraible/grails-oauth/archives/master&quot;&gt;Download&lt;/a&gt; the oauth-plugin, extract it and build it using &lt;em&gt;grails package-plugin&lt;/em&gt;. Install it in your project using &lt;em&gt;grails install-plugin path/to/zip&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Add a link to the GSP you want to invoke LinkedIn Authentication from:
&lt;pre class=&quot;brush: html&quot;&gt;
&amp;lt;g:oauthLink consumer=&apos;linkedin&apos; returnTo=&quot;&amp;#91;controller:&apos;profile&apos;&amp;#93;&quot;&amp;gt;
    Login with LinkedIn
&amp;lt;/g:oauthLink&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Create &lt;em&gt;grails-app/controllers/ProfileController.groovy&lt;/em&gt; to access your LinkedIn Profile.
&lt;pre class=&quot;brush: java&quot;&gt;
class ProfileController {
    def apiUrl = &quot;http://api.linkedin.com/v1/people/~&quot;
    def oauthService
    
    def index = {
 
        if (session.oauthToken == null) {
            redirect(uri:&quot;/&quot;)
        }
 
        if (params?.apiUrl) apiUrl = params.apiUrl
        
        def response = oauthService.accessResource(
                apiUrl, &apos;linkedin&apos;, &amp;#91;key:session.oauthToken.key, secret:session.oauthToken.secret&amp;#93;, &apos;GET&apos;)
 
        render(view: &apos;index&apos;, model: &amp;#91;profileXML: response, apiUrl: apiUrl&amp;#93;)
    }
 
    def change = {
        if (params?.apiUrl) {
            println(&quot;Setting api url to &quot; + params.apiUrl)
            apiUrl = params.apiUrl
        }
        
        redirect(action:index,params:params)
    }
}
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Create &lt;em&gt;grails-app/views/profile/index.gsp&lt;/em&gt; to display the retrieved profile and allow subsequent API calls.
&lt;pre class=&quot;brush: html&quot;&gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Your Profile&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;a class=&quot;home&quot; href=&quot;${createLinkTo(dir:&apos;&apos;)}&quot;&amp;gt;Home&amp;lt;/a&amp;gt;
&amp;lt;g:hasOauthError&amp;gt;
    &amp;lt;div class=&quot;errors&quot;&amp;gt;
        &amp;lt;g:renderOauthError/&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/g:hasOauthError&amp;gt;

&amp;lt;g:form url=&quot;&amp;#91;action:&apos;change&apos;,controller:&apos;profile&apos;&amp;#93;&quot; method=&quot;get&quot;&amp;gt;
    Your LinkedIn Profile:
    &amp;lt;textarea id=&quot;payload&quot; style=&quot;width: 100%; height: 50%; color: red&quot;&amp;gt;${profileXML}&amp;lt;/textarea&amp;gt;
    &amp;lt;p&amp;gt;
        &amp;lt;g:textField name=&quot;apiUrl&quot; value=&quot;${apiUrl}&quot; size=&quot;100%&quot;/&amp;gt;
        &amp;lt;br/&amp;gt;
        &amp;lt;g:submitButton name=&quot;send&quot; value=&quot;Send Request&quot;/&amp;gt;
    &amp;lt;/p&amp;gt;
&amp;lt;/g:form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Start your app using &lt;em&gt;grails run-app&lt;/em&gt; and enjoy.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 5px&quot;&gt;As mentioned earlier, you can &lt;a href=&quot;http://github.com/mraible/grails-oauth/archives/master&quot;&gt;download the grails-oauth-example&lt;/a&gt; or &lt;a href=&quot;http://demo.raibledesigns.com/grails-oauth&quot;&gt;view it online&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;One improvement I&apos;d like to see is to simplify the parsing of XML into a Profile object, much like the &lt;a href=&quot;http://pivotallabs.com/users/will/blog/articles/1096-linkedin-gem-for-a-web-app&quot;&gt;linkedin gem&lt;/a&gt; does for Rails. 
&lt;/p&gt;
&lt;p&gt;
If you&apos;re interested in learning more about LinkedIn and OAuth, I encourage you to checkout &lt;a href=&quot;http://www.linkedin.com/in/taylorsingletary&quot;&gt;Taylor Singletary&apos;s&lt;/a&gt; presentation &lt;a href=&quot;http://www.slideshare.net/episod/linkedin-oauth-zero-to-hero&quot;&gt;LinkedIn OAuth: Zero to Hero&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I &lt;a href=&quot;http://github.com/mraible/grails-oauth/commit/6db20f3b8341383b869f49d6ca126ebd99ccb364&quot;&gt;updated&lt;/a&gt; the oauth-plugin so it&apos;s backwards-compatible with OAuth 1.0 and added Twitter to the example application to prove it. If you&apos;re seeing &quot;Cannot invoke method remove() on null object&quot;, it&apos;s likely caused by your redirect URL pointing to an application on a different domain.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/gwt_oauth_and_linkedin_apis</guid>
    <title>GWT OAuth and LinkedIn APIs</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/gwt_oauth_and_linkedin_apis</link>
        <pubDate>Tue, 24 Nov 2009 15:46:05 -0700</pubDate>
    <category>The Web</category>
    <category>api</category>
    <category>gwt</category>
    <category>oauth</category>
    <category>linkedin</category>
    <category>profile</category>
    <category>google</category>
    <category>twitter</category>
            <description>&lt;a href=&quot;http://www.linkedin.com&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/linkedin-logo.gif&quot; width=&quot;129&quot; height=&quot;36&quot; alt=&quot;LinkedIn Logo&quot; class=&quot;picture&quot; style=&quot;border: 0&quot; /&gt;&lt;/a&gt;
When I worked at LinkedIn last year, I received a lot of inquiries from friends and developers about LinkedIn&apos;s APIs. After a while, I started sending the following canned response:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
For API access to build LinkedIn features into your application, fill
out the following form:
&lt;br/&gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;http://www.linkedin.com/static?key=developers_apis&quot;&gt;http://www.linkedin.com/static?key=developers_apis&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
For requests to build an application, go to:
&lt;br/&gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;http://www.linkedin.com/static?key=developers_opensocial&quot;&gt;http://www.linkedin.com/static?key=developers_opensocial&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
I talked with the API team and they did say they look at every request that&apos;s sent via these forms. They don&apos;t respond to all of them b/c they know that many people would be angry if they told them &quot;no&quot;, so they&apos;d rather not have that headache.
&lt;/p&gt;
&lt;p&gt;Yesterday, I was pumped to see that they&apos;ve finally decided to &lt;a href=&quot;http://blog.linkedin.com/2009/11/23/linkedin-platform-launch/&quot;&gt;open up their API to Developers&lt;/a&gt;.
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Starting today, developers worldwide can integrate LinkedIn into their business applications and Web sites.  &lt;a href=&quot;http://developer.linkedin.com/&quot;&gt;Developer.linkedin.com&lt;/a&gt; is now &lt;strong&gt;live &lt;/strong&gt;and open for business.
&lt;/p&gt;
&lt;p&gt;First of all, congratulations to the API team on finally making this happen! I know it&apos;s no small feat. Secondly, it&apos;s great to see them using &lt;a href=&quot;http://www.jivesoftware.com/products&quot;&gt;Jive SBS&lt;/a&gt; for their API documentation and developer community. My current client uses this to facilitate development and I love how it integrates a wiki, JIRA, FishEye, Crucible and Bamboo into one central jumping off point.&lt;/p&gt;
&lt;p&gt;I&apos;ve always been a fan of LinkedIn, ever since I joined way back in &lt;a href=&quot;http://raibledesigns.com/rd/entry/happy_cinco_de_linko&quot;&gt;May 2003&lt;/a&gt;. However, I&apos;ve longed for a way to access my data. &lt;a href=&quot;http://developer.linkedin.com/community/widgets&quot;&gt;LinkedIn Widgets&lt;/a&gt; are nice, but there&apos;s something to be said for the full power of an API. Last night, I sat down for a couple hours and enhanced my &lt;a href=&quot;http://raibledesigns.com/rd/entry/implementing_oauth_with_gwt&quot;&gt;Implementing OAuth with GWT&lt;/a&gt; example to support LinkedIn&apos;s API.&lt;/p&gt;
&lt;p&gt;I&apos;m happy to report my experiment was a success and you can &lt;a href=&quot;http://static.raibledesigns.com/downloads/gwt-oauth-1.2.zip&quot;&gt;download GWT OAuth 1.2&lt;/a&gt; or &lt;a href=&quot;http://demo.raibledesigns.com/gwt-oauth&quot;&gt;view it online&lt;/a&gt;. For now, I&apos;m simply &lt;a href=&quot;http://developer.linkedin.com/docs/DOC-1008&quot;&gt;authenticating with OAuth&lt;/a&gt; and accessing the &lt;a href=&quot;http://developer.linkedin.com/docs/DOC-1002&quot;&gt;Profile API&lt;/a&gt;. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://demo.raibledesigns.com/gwt-oauth&quot; title=&quot;OAuth with GWT Demo&quot;&gt;&lt;img src=&quot;//farm3.static.flickr.com/2655/4132814004_b423779e59.jpg&quot; width=&quot;453&quot; height=&quot;326&quot; alt=&quot;OAuth with GWT&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In the process, I learned a couple things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LinkedIn&apos;s OAuth implementation returns an &lt;a href=&quot;http://wiki.oauth.net/Signed-Callback-URLs&quot;&gt;oauth_verifier&lt;/a&gt; parameter after authenticating, whereas Google and Twitter do not. This parameter needs to be included when calling the &lt;em&gt;Access token path&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;The Profile API example I implemented gets the current user&apos;s profile with &lt;a href=&quot;http://api.linkedin.com/v1/people/~&quot;&gt;http://api.linkedin.com/v1/people/~&lt;/a&gt;. This returns a &quot;light&quot; version of your profile. To get a more detailed version, you need to use &lt;a href=&quot;http://developer.linkedin.com/docs/DOC-1014&quot;&gt;Field Selectors&lt;/a&gt;. For example:
&lt;span style=&quot;display: block; margin: 5px 5px&quot;&gt;
&lt;a href=&quot;http://api.linkedin.com/v1/people/~:(id,first-name,last-name,picture-url,headline,summary,positions,educations)&quot;&gt;http://api.linkedin.com/v1/people/~:(id,first-name,last-name,picture-url,headline,summary,positions,educations)&lt;/a&gt;
&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn&apos;s API only supports passing OAuth parameters in a header, rather than query parameters. To make this work, I modified my &lt;a href=&quot;http://raibledesigns.com/rd/entry/how_to_do_cross_domain#proxyServlet&quot;&gt;ProxyServlet&lt;/a&gt; to convert query parameters to an &quot;Authorization&quot; header at the end of the &lt;em&gt;setProxyRequestHeaders()&lt;/em&gt; method.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
// For LinkedIn&apos;s OAuth API, convert request parameters to an AuthorizationHeader
if (httpServletRequest.getRequestURL().toString().contains(&quot;linkedin-api&quot;)) {
    String&amp;#91;&amp;#93; parameters = httpServletRequest.getQueryString().split(&quot;&amp;amp;&quot;);
    StringBuilder sb = new StringBuilder(&quot;OAuth realm=\&quot;http://api.linkedin.com/\&quot;,&quot;);
    for (int i = 0; i &amp;lt; parameters.length; i++) {
        sb.append(parameters&amp;#91;i&amp;#93;);
        if (i &amp;lt; parameters.length - 1) {
            sb.append(&quot;,&quot;);
        }
    }

    Header authorization = new Header(&quot;Authorization&quot;, sb.toString());
    httpMethodProxyRequest.setRequestHeader(authorization);
}
&lt;/pre&gt;
&lt;p&gt;You might recall that my previous example had issues authenticating with Google, but worked well with Twitter. LinkedIn&apos;s authentication seems to work flawlessly. This leads me to believe that Twitter and LinkedIn have a much more mature OAuth implementation than Google.&lt;/p&gt;
&lt;p style=&quot;padding-top: 5px; border-top: 1px dotted silver; color: #666&quot;&gt;&lt;em&gt;&lt;strong&gt;Related OAuth News&lt;/strong&gt;: Apache Roller 5 will be shipping with OAuth support. See &lt;a href=&quot;http://rollerweblogger.org/roller&quot;&gt;Dave Johnson&apos;s&lt;/a&gt; &lt;a href=&quot;http://www.slideshare.net/snoopdave/whats-new-in-roller5&quot;&gt;What&apos;s New in Roller 5 presentation&lt;/a&gt; for more information.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update December 6, 2009:&lt;/strong&gt; I modified the gwt-oauth project to use GWT 1.7.1 and changed to the &lt;a href=&quot;http://mojo.codehaus.org/gwt-maven-plugin/&quot;&gt;Maven GWT Plugin&lt;/a&gt; from Codehaus. &lt;a href=&quot;http://static.raibledesigns.com/downloads/gwt-oauth-1.3.zip&quot;&gt;Download GWT OAuth 1.3&lt;/a&gt; or &lt;a href=&quot;http://demo.raibledesigns.com/gwt-oauth&quot;&gt;view it online&lt;/a&gt;.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/the_good_ol_job_hunt1</guid>
    <title>The good ol&apos; Job Hunt</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/the_good_ol_job_hunt1</link>
        <pubDate>Fri, 26 Jun 2009 15:30:42 -0600</pubDate>
    <category>Java</category>
    <category>recruiters</category>
    <category>career</category>
    <category>job</category>
    <category>evite</category>
    <category>linkedin</category>
    <category>jobhunt</category>
            <description>Just over two years ago, I wrote about the &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_good_ol_job_hunt&quot;&gt;good ol&apos; job hunt&lt;/a&gt;. Today, I find myself in a very similar situation. My Evite gig ends in a couple hours and I&apos;m heading to &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_cabin&quot;&gt;The Cabin&lt;/a&gt; on Monday for a month of vacation. Similar to last time, there are opportunities out there, but most of them come through recruiters. 
&lt;/p&gt;
&lt;p&gt;I have to admit - it seems like I got lucky the last couple times I tried to find a gig. I simply blogged I was looking and found myself negotiating with companies a few days later. Getting &lt;a href=&quot;http://raibledesigns.com/rd/entry/linkedin_cuts_10_a_k&quot;&gt;laid off from LinkedIn&lt;/a&gt; was awesome in that a few companies contacted me about hiring the whole team the next day. The ability to blog-and-get-a-gig was a great way to cut out the middle-man.&lt;/p&gt;
&lt;p&gt;Unfortunately, I think I got spoiled by my blog-and-get-a-gig success. I figured it would happen again this time... 
&lt;/p&gt;
&lt;p&gt;Not so much. 
&lt;/p&gt;
&lt;p&gt;
I don&apos;t know if it&apos;s because of the down economy or because I took the year off from speaking at conferences. Regardless, I&apos;m in an interesting situation since I &lt;a href=&quot;http://raibledesigns.com/rd/entry/new_office_and_new_bike&quot;&gt;signed a 1-year lease&lt;/a&gt; on an office in downtown Denver.  It&apos;s easy to market to companies in Denver, but if I land a gig here, there&apos;s a good chance the client is going to want me in the office everyday. That leaves me wondering: what&apos;s the best way to market to companies outside of Colorado? My ideal contract is one that 1) allows me to work remotely and 2) only requires me to travel once or twice a month. 
&lt;/p&gt;
&lt;p&gt;
I believe my ideal gigs are out there, but I think it&apos;s difficult to convince companies I&apos;m a good remote worker. In an attempt to convince them otherwise, I&apos;d like to offer recommendations from my last two clients.&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
&quot;Matt contributed dramatically to the engineering practice at Evite, both directly and indirectly.  Directly, he lead the effort to define and prove a successful new web UI architecture for us.  Indirectly, he brought senior engineering talent into the organization, and energized the existing team.  We are significantly better positioned to deliver on our Product goals as a result of having worked with Matt.  I&apos;d love to work with him again someday.&quot;
&lt;span style=&quot;text-align: right; color: #666; display: block&quot;&gt;
&lt;em&gt;&lt;a href=&quot;http://www.linkedin.com/profile?viewProfile=&amp;amp;key=494619&amp;amp;authToken=iMtW&amp;amp;authType=name&quot; title=&quot;View David&apos;s Profile&quot;&gt;David Thomas&lt;/a&gt;, VP of Technology, Evite&lt;/em&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
&quot;Matt has unique abilities in the realm of software engineering. He brings great energy, an amazing breadth of knowledge in UI technologies, along with a can-do attitude that&apos;s refreshing to interact with. He is a great leader and communicator. In addition, Matt can apply his deep understanding of the technologies in question pragmatically to the engineering problem at hand, leading his team in execution and delivery. He&apos;s an excellent technical visionary to complement any team.&quot;
&lt;span style=&quot;text-align: right; color: #666; display: block; margin-top: 5px&quot;&gt;
&lt;em&gt;&lt;a href=&quot;http://www.linkedin.com/profile?viewProfile=&amp;amp;key=3115840&amp;amp;authToken=xnlz&amp;amp;authType=name&quot; title=&quot;View Arnold&apos;s Profile&quot;&gt;Arnold Goldberg&lt;/a&gt;, Vice President  Platform Engineering, LinkedIn&lt;/em&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
If you&apos;re looking to hire someone with &lt;a href=&quot;http://www.linkedin.com/in/mraible&quot;&gt;my skills&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/contact.jsp&quot;&gt;let me know&lt;/a&gt; - there&apos;s a good chance you&apos;ll be glad you did. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/creating_a_facebook_style_autocomplete</guid>
    <title>Creating a Facebook-style Autocomplete with GWT</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/creating_a_facebook_style_autocomplete</link>
        <pubDate>Fri, 5 Jun 2009 07:05:10 -0600</pubDate>
    <category>Java</category>
    <category>autocomplete</category>
    <category>facebook</category>
    <category>linkedin</category>
    <category>jquery</category>
    <category>gwt-autocomplete</category>
    <category>gwt</category>
            <description>Have you used the &quot;To:&quot; widget on on Facebook or LinkedIn when composing a message? It&apos;s an autocompleter that looks up contact names and displays them as you type. It looks like a normal textbox (a.k.a. &amp;lt;input type=&quot;text&quot;&amp;gt;), but wraps the contact name to allow you to easily delete it. Here&apos;s a screenshot of what Facebook&apos;s widget looks like.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;img src=&quot;//farm3.static.flickr.com/2468/3595186177_5334fff971.jpg&quot; width=&quot;500&quot; height=&quot;233&quot; alt=&quot;Facebook Autocomplete&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;Last week, I was asked to create a similar widget with GWT. After searching the web and &lt;a href=&quot;
http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/627687a4b607ce02&quot;&gt;not finding much&lt;/a&gt;, I decided to try writing my own. The best example I found on how to create this widget was from James Smith&apos;s &lt;a href=&quot;http://loopj.com/2009/04/25/jquery-plugin-tokenizing-autocomplete-text-entry/&quot;&gt;Tokenizing Autocomplete jQuery Plugin&lt;/a&gt;. I used its &lt;a href=&quot;http://loopj.com/tokeninput/demo.html&quot;&gt;demo&lt;/a&gt; to help me learn how the DOM changed after you selected a contact. 
&lt;/p&gt;
&lt;p&gt;GWT&apos;s &lt;a href=&quot;http://gwt.google.com/samples/Showcase/Showcase.html#CwSuggestBox&quot;&gt;SelectBox&lt;/a&gt; allows you to easily create an autocompleter. However, &lt;a href=&quot;http://code.google.com/p/google-web-toolkit/issues/detail?id=3044&amp;amp;can=5&quot;&gt;it doesn&apos;t have support for multiple values&lt;/a&gt; (for example, a comma-delimited list). The good news is it&apos;s not difficult to add this functionality using &lt;a href=&quot;http://ljvjonok.blogspot.com/2008/10/gwt-suggestbox-how-to-make-multiple.html&quot;&gt;Viktor Zaprudnev&apos;s HowTo&lt;/a&gt;. Another feature you might want in a SelectBox is to populate it with POJOs. &lt;a href=&quot;http://eggsylife.co.uk/2008/08/25/gwt-suggestbox-backed-by-dto-model/&quot;&gt;GWT SuggestBox backed by DTO Model&lt;/a&gt; is a good blog post that shows how to do this.&lt;/p&gt;
&lt;p&gt;Back to the Facebook Autocompleter. To demonstrate how to create this widget in GWT, I put together a simple application. You can &lt;a href=&quot;http://demo.raibledesigns.com/gwt-autocomplete&quot;&gt;view the demo&lt;/a&gt; or &lt;a href=&quot;http://static.raibledesigns.com/downloads/gwt-autocomplete-1.0.zip&quot;&gt;download it&lt;/a&gt;. The meat of this example is in an InputListWidget. After looking at the jQuery example, I learned the widget was a &amp;lt;div&amp;gt; with a unordered list (&amp;lt;ul&amp;gt;). It starts out looking like this:&lt;/p&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;
&amp;lt;ul class=&quot;token-input-list-facebook&quot;&amp;gt;
    &amp;lt;li class=&quot;token-input-input-token-facebook&quot;&amp;gt;
        &amp;lt;input type=&quot;text&quot; style=&quot;outline-color: -moz-use-text-color; outline-style: none; outline-width: medium;&quot;/&amp;gt;
    &amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/pre&gt;
&lt;p&gt;I did this in GWT using custom BulletList and ListItem widgets (contained in the download).&lt;/p&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
final BulletList list = new BulletList();
list.setStyleName(&quot;token-input-list-facebook&quot;);

final ListItem item = new ListItem();
item.setStyleName(&quot;token-input-input-token-facebook&quot;);

final TextBox itemBox = new TextBox();
itemBox.getElement().setAttribute(&quot;style&quot;, 
        &quot;outline-color: -moz-use-text-color; outline-style: none; outline-width: medium;&quot;);

final SuggestBox box = new SuggestBox(getSuggestions(), itemBox);
box.getElement().setId(&quot;suggestion_box&quot;);

item.add(box);
list.add(item);
&lt;/pre&gt;
&lt;p&gt;After tabbing off the input, I noticed that it was removed and replaced with a &amp;lt;p&amp;gt; around the value and a &amp;lt;span&amp;gt; to show the &quot;x&quot; to delete it. After adding a couple items, the HTML is as follows:&lt;/p&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;
&amp;lt;ul class=&quot;token-input-list-facebook&quot;&amp;gt;
    &amp;lt;li class=&quot;token-input-token-facebook&quot;&amp;gt;
        &amp;lt;p&amp;gt;What&apos;s New Scooby-Doo?&amp;lt;/p&amp;gt;
        &amp;lt;span class=&quot;token-input-delete-token-facebook&quot;&amp;gt;x&amp;lt;/span&amp;gt;
    &amp;lt;/li&amp;gt;
    &amp;lt;li class=&quot;token-input-token-facebook&quot;&amp;gt;
        &amp;lt;p&amp;gt;Fear Factor&amp;lt;/p&amp;gt;
        &amp;lt;span class=&quot;token-input-delete-token-facebook&quot;&amp;gt;x&amp;lt;/span&amp;gt;
     &amp;lt;/li&amp;gt;
     &amp;lt;li class=&quot;token-input-input-token-facebook&quot;&amp;gt;
         &amp;lt;input type=&quot;text&quot; style=&quot;outline-color: -moz-use-text-color; outline-style: none; outline-width: medium;&quot;/&amp;gt;
     &amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/pre&gt;
&lt;p&gt;To do this, I created a &lt;code&gt;deselectItem()&lt;/code&gt; method that triggers the DOM transformation.
&lt;/p&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
private void deselectItem(final TextBox itemBox, final BulletList list) {
    if (itemBox.getValue() != null &amp;&amp; !&quot;&quot;.equals(itemBox.getValue().trim())) {
        /** Change to the following structure:
         * &amp;lt;li class=&quot;token-input-token-facebook&quot;&amp;gt;
         * &amp;lt;p&amp;gt;What&apos;s New Scooby-Doo?&amp;lt;/p&amp;gt;
         * &amp;lt;span class=&quot;token-input-delete-token-facebook&quot;&amp;gt;x&amp;lt;/span&amp;gt;
         * &amp;lt;/li&amp;gt;
         */

        final ListItem displayItem = new ListItem();
        displayItem.setStyleName(&quot;token-input-token-facebook&quot;);
        Paragraph p = new Paragraph(itemBox.getValue());

        displayItem.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent clickEvent) {
                displayItem.addStyleName(&quot;token-input-selected-token-facebook&quot;);
            }
        });

        Span span = new Span(&quot;x&quot;);
        span.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent clickEvent) {
                list.remove(displayItem);
            }
        });

        displayItem.add(p);
        displayItem.add(span);
        
        list.insert(displayItem, list.getWidgetCount() - 1);
        itemBox.setValue(&quot;&quot;);
        itemBox.setFocus(true);
    }
}
&lt;/pre&gt;
&lt;p&gt;This method is called after selecting a new item from the SuggestBox:&lt;/p&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
box.addSelectionHandler(new SelectionHandler&amp;lt;SuggestOracle.Suggestion&amp;gt;() {
    public void onSelection(SelectionEvent selectionEvent) {
        deselectItem(itemBox, list);
    }
});
&lt;/pre&gt;
&lt;p&gt;I also added the ability for you to type in an e-mail address manually and to delete the previous item when you backspace from the input field. Here&apos;s the handler that calls &lt;code&gt;deselectItem()&lt;/code&gt; and allows deleting with backspace:&lt;/p&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
// this needs to be on the itemBox rather than box, or backspace will get executed twice
itemBox.addKeyDownHandler(new KeyDownHandler() {
    public void onKeyDown(KeyDownEvent event) {
        if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
            // only allow manual entries with @ signs (assumed email addresses)
            if (itemBox.getValue().contains(&quot;@&quot;))
                deselectItem(itemBox, list);
        }
        // handle backspace
        if (event.getNativeKeyCode() == KeyCodes.KEY_BACKSPACE) {
            if (&quot;&quot;.equals(itemBox.getValue().trim())) {
                ListItem li = (ListItem) list.getWidget(list.getWidgetCount() - 2);
                Paragraph p = (Paragraph) li.getWidget(0);

                list.remove(li);
                itemBox.setFocus(true);
            }
        }
    }
});
&lt;/pre&gt;
&lt;p&gt;I&apos;m happy with the results, and grateful for the &lt;a href=&quot;http://loopj.com/tokeninput/token-input-facebook.css&quot;&gt;jQuery plugin&apos;s CSS&lt;/a&gt;. However, it still has one issue that I haven&apos;t been able to solve: I&apos;m unable to click on a list item (to select it) and then delete it (with the backspace key). I believe this is because I&apos;m unable to give focus to the list item. Here&apos;s the code that highlights the item and you can see the commented-out code that doesn&apos;t work.
&lt;/p&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
displayItem.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent clickEvent) {
        displayItem.addStyleName(&quot;token-input-selected-token-facebook&quot;);
    }
});

/** TODO: Figure out how to select item and allow deleting with backspace key
displayItem.addKeyDownHandler(new KeyDownHandler() {
    public void onKeyDown(KeyDownEvent event) {
        if (event.getNativeKeyCode() == KeyCodes.KEY_BACKSPACE) {
            list.remove(displayItem);
        }
    }
});
displayItem.addBlurHandler(new BlurHandler() {
    public void onBlur(BlurEvent blurEvent) {
        displayItem.removeStyleName(&quot;token-input-selected-token-facebook&quot;);
    }
});
*/
&lt;/pre&gt;
&lt;p&gt;If you know of a solution to this issue, please let me know. Feel free to use this widget and improve it as you see fit. I&apos;d love to see this as a native widget in GWT. In the meantime, here&apos;s the &lt;a href=&quot;http://demo.raibledesigns.com/gwt-autocomplete&quot;&gt;GWT Facebook-style Autocomplete demo&lt;/a&gt; and &lt;a href=&quot;http://static.raibledesigns.com/downloads/gwt-autocomplete-1.0.zip&quot;&gt;code&lt;/a&gt;.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/bye_bye_dream_machine</guid>
    <title>Bye Bye Dream Machine</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/bye_bye_dream_machine</link>
        <pubDate>Mon, 26 Jan 2009 22:18:33 -0700</pubDate>
    <category>Mac OS X</category>
    <category>linkedin</category>
    <category>macpro</category>
    <category>dreammachine</category>
            <description>&lt;a href=&quot;http://raibledesigns.com/rd/entry/new_mac_pro&quot; title=&quot;Mac Pro&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3049/2555084936_c6c0ec5a4b_t.jpg&quot; width=&quot;51&quot; height=&quot;100&quot; alt=&quot;Mac Pro&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;/&gt;&lt;/a&gt;
This evening, I&apos;m shipping back one of my &lt;a href=&quot;http://raibledesigns.com/rd/entry/new_mac_pro&quot;&gt;favorite machines of all time&lt;/a&gt;. I received a fully-loaded Mac Pro as part of my employment with &lt;a href=&quot;http://www.linkedin.com&quot;&gt;LinkedIn&lt;/a&gt; last June. It was necessary to run the LinkedIn application locally and I thoroughly enjoyed using it for the last 6 months. With 12GB of RAM and two 23&quot; monitors, it was a great employee perk. 
&lt;/p&gt;
&lt;p&gt;
When I became a &lt;a href=&quot;http://raibledesigns.com/rd/entry/what_s_next&quot;&gt;contractor again&lt;/a&gt;, they let me take my dream machine home. I promptly plugged in my &lt;a href=&quot;http://raibledesigns.com/rd/entry/life_with_a_30_monitor&quot;&gt;30&quot; monitor&lt;/a&gt; and I&apos;ve been loving my home work environment ever since. I could have bought the machine from LinkedIn, but I discovered I can buy a brand new machine with similar specs for less than their asking price. 
&lt;/p&gt;
&lt;p&gt;The good news is I&apos;m now able to answer the question I asked a couple years ago: &lt;a href=&quot;http://raibledesigns.com/rd/entry/one_30_monitor_or_two&quot;&gt;One 30&quot; monitor or two 23&quot; monitors?&lt;/a&gt; IMO, one 30&quot; monitor is definitely better and two 30&quot; monitors would be awesome.
&lt;/p&gt;
&lt;p&gt;
In addition to the Mac Pro, I&apos;ll also be shipping back the 15&quot; MacBook Pro they gave me. This leaves me with my &lt;a href=&quot;http://raibledesigns.com/rd/entry/macbook_pro_kicking_ass_and&quot;&gt;17&quot; MacBook Pro&lt;/a&gt; and an old &lt;a href=&quot;http://raibledesigns.com/rd/entry/new_computer_should_i_keep&quot;&gt;HP Pavilion&lt;/a&gt; with Windows XP. I was hoping to plug my 30&quot; into the HP, but I discovered I don&apos;t have a DVI card that will handle it. Over the next few months, I do plan on buying a new MacBook Pro (for work) and a Mac Pro (for home). With my &lt;a href=&quot;http://raibledesigns.com/rd/entry/running_to_work&quot;&gt;running commute&lt;/a&gt;, I need to leave one machine downtown and I like to have one at home for the kids + late night hacking. 
&lt;/p&gt;
&lt;p&gt;
I&apos;m currently having a hard time deciding if I should buy a MacBook Pro now or make do with what I have and just buy a new DVI card for my Windows box. I&apos;m leaning towards a new 15&quot; MacBook Pro (17&quot; is too big to travel with). If I could get one with a 256GB SSD, I&apos;d definitely be sold. 
&lt;/p&gt;
&lt;p&gt;
What would you do?</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/linkedin_cuts_10_a_k</guid>
    <title>LinkedIn Cuts 10% (a.k.a. The Journey is Over)</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/linkedin_cuts_10_a_k</link>
        <pubDate>Wed, 5 Nov 2008 15:10:06 -0700</pubDate>
    <category>Java</category>
    <category>linkedin</category>
    <category>career</category>
    <category>job</category>
            <description>This morning, my co-workers and I discovered that &lt;a href=&quot;http://www.linkedin.com&quot;&gt;LinkedIn&lt;/a&gt; decided to trim 10% of its employees. The Denver Office was among those that were laid off. I can&apos;t say we didn&apos;t see the writing on the wall. In fact, on the evening of October 15, I sent the following e-mail to my co-workers:&lt;/p&gt;
&lt;p class=&quot;quote&quot; style=&quot;color: #666; margin: 20px&quot;&gt;
LinkedIn&apos;s  top investor[1] is Sequoia Capital and they recently
	posted this presentation on the web.
&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;http://www.slideshare.net/eldon/sequoia-capital-on-startups-and-the-economic-downturn-presentation?type=powerpoint&quot;&gt;http://www.slideshare.net/eldon/sequoia-capital-on-startups-and-the-economic-downturn-presentation?type=powerpoint&lt;/a&gt;
	&lt;br/&gt;&lt;br/&gt;
	Notice the reduce head count recommendations. ... Oh well, life goes on. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;
&lt;br/&gt;&lt;br/&gt;
	Raible
&lt;br/&gt;&lt;br/&gt;
	[1] &lt;a href=&quot;http://www.linkedin.com/static?key=investors&quot;&gt;http://www.linkedin.com/static?key=investors&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, as of today, there is no LinkedIn Denver office. While I had a lot of fun being a UI Architect and managing Engineers, I&apos;m somewhat happy this has happened. After all, now I get to enjoy the best perk about being an employee: the good ol&apos; severance package! &lt;!-- Also, I think it&apos;s ironic that I&apos;ll be using my last job&apos;s website to find my next gig. --&gt;&lt;/p&gt;
&lt;p&gt;If you&apos;re looking for good Engineers, I highly recommend all of the guys who worked for me during this journey. You can read more about the skills they possess and what they&apos;re looking for by viewing their LinkedIn Profiles:&lt;/p&gt;
&lt;table style=&quot;width: 400px; margin: 0 auto&quot;&gt;
&lt;tr&gt;
	&lt;td style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;http://www.linkedin.com/in/scottthomasnicholls&quot;&gt;&lt;img src=&quot;//media.linkedin.com/mpr/pub/image-ltL_Cyi-OLqdx0s0z4zKC5iWBxB8iNg0zTNMCJnbvjmGZJC3/scott-nicholls.jpg&quot; width=&quot;80&quot; height=&quot;80&quot;/&gt;&lt;br/&gt;Scott Nicholls&lt;/a&gt;&lt;/td&gt;
	&lt;td style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;http://www.linkedin.com/in/bryannoll&quot;&gt;&lt;img src=&quot;//media.linkedin.com/mpr/mpr/shrink_80_80/p/1/000/014/3d4/2d57d27.jpg&quot; width=&quot;80&quot; height=&quot;80&quot;/&gt;&lt;br/&gt;Bryan Noll&lt;/a&gt;&lt;/li&gt;

	&lt;td style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;http://www.linkedin.com/in/jgoodwill&quot;&gt;&lt;img src=&quot;//media.linkedin.com/mpr/mpr/shrink_80_80/p/3/000/005/115/370ccbb.jpg&quot; width=&quot;80&quot; height=&quot;80&quot;/&gt;&lt;br/&gt;James Goodwill&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;As for me, I&apos;m definitely in the market as well. You can view &lt;a href=&quot;http://www.linkedin.com/in/mraible&quot;&gt;My LinkedIn Profile&lt;/a&gt; to see if I might be a good fit for your organization. I&apos;m willing to travel up to 25%, but would prefer not to. After all, ski season is right around the corner. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Lastly, I just wanted to say that I really enjoyed working at LinkedIn. I&apos;ve never worked with a smarter group of Engineers, nor been so excited about a company&apos;s product and vision. I know that LinkedIn will be highly successful and I hope to use their site to find gigs for many years to come. </description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/building_linkedin_s_next_generation</guid>
    <title>Building LinkedIn&apos;s Next Generation Architecture with OSGi by Yan Pujante</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/building_linkedin_s_next_generation</link>
        <pubDate>Mon, 20 Oct 2008 11:20:09 -0600</pubDate>
    <category>Java</category>
    <category>rpc</category>
    <category>eclipse</category>
    <category>glassfish</category>
    <category>yanpujante</category>
    <category>linkedin</category>
    <category>infiniflow</category>
    <category>tomcat</category>
    <category>apache</category>
    <category>osgi</category>
    <category>spring</category>
    <category>architecture</category>
    <category>softwaresummit</category>
            <description>This week, I&apos;m attending the &lt;a href=&quot;http://softwaresummit.com&quot;&gt;Colorado Software Summit&lt;/a&gt; in Keystone, Colorado. Below are my notes from an &lt;strong&gt;OSGi at LinkedIn&lt;/strong&gt; presentation I attended by &lt;a href=&quot;http://www.linkedin.com/in/yan&quot;&gt;Yan Pujante&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
LinkedIn was created in March of 2003. Today there&apos;s close to 30M members. In the first 6 months, there was 60,000 members that signed up. Now, 1 million sign up every 2-3 weeks. LinkedIn is profitable with 5 revenue lines and there&apos;s 400 employees in Mountain View.
&lt;/p&gt;
&lt;p&gt;
Technologies: 2 datacenters (~600 machines). SOA with Java, Tomcat, Spring Framework, Oracle, MySQL, Servlets, JSP, Cloud/Graph, OSGi. Development is done on Mac OS X, production is on Solaris.
&lt;/p&gt;
&lt;p&gt;
The biggest challenges for LinkedIn are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Growing Engineering Team on a monolithic code base (it&apos;s modular, but only one source tree)&lt;/li&gt;
&lt;li&gt;Growing Product Team wanting more and more features faster&lt;/li&gt;
&lt;li&gt;Growing Operations Team deploying more and more servers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Front-end has many BL services in one webapp (in Tomcat). The backend is many wars in 5 containers (in Jetty) with 1 service per WAR. Production and Development environments are very different. Total services in backend is close to 100, front-end has 30-40.
&lt;p&gt;
&lt;strong&gt;Container Challenges&lt;/strong&gt;&lt;br/&gt;
1 WAR with N services does not scale for developers (conflicts, monolithic). N wars with 1 service does not scale for containers (no shared JARs). You can add containers, but there&apos;s only 12GB of RAM available.
&lt;/p&gt;
&lt;p&gt;
Upgrading back-end service to new version requires downtime (hardware load-balancer does not account for version). Upgrading front-end service to new version requires redeploy. Adding new backend services is also painful because there&apos;s lots of configuration (load-balancer, IPs, etc.).
&lt;/p&gt;
&lt;p&gt;
Is there a solution to all these issues? Yan believes that OSGi is a good solution.  OSGi stands for &lt;strong&gt;Open Services Gateway initiative&lt;/strong&gt;. Today that term doesn&apos;t really mean anything. Today it&apos;s a spec with several implementations: Equinox (Eclipse), Knoplerfish and Felix (Apache). 
&lt;/p&gt;
&lt;p&gt;
OSGi has some really, really good features. These include smart class loading (multiple versions of JARs is OK), it&apos;s highly dynamic (deploy/undeploy built-in), it has a service registry and is highly extensible/configurable. An OSGi bundle is simply a JAR file with an OSGi manifest.
&lt;/p&gt;
&lt;p&gt;
In LinkedIn&apos;s current architecture, services are exported with Spring/RPC and services in same WAR can see each other. The problem with this architecture comes to light when you want to move services to a 2nd web container. You cannot share JARs and can&apos;t talk directly to the other web app. With OSGi, the bundles (JARs) are shared, services are shared and bundles can be dynamically replaced. OSGi solves the container challenge.
&lt;/p&gt;
&lt;p&gt;
One thing missing from OSGi is allowing services to live on multiple containers. To solve this, LinkedIn has developed a way to have &lt;strong&gt;Distributed OSGi&lt;/strong&gt;. Multicast is used to see what&apos;s going on in other containers. Remote servers use the OSGi lifecycle and create dynamic proxies to export services using Spring RPC over HTTP. Then this service is registered in the service registry on the local server. 
&lt;/p&gt;
&lt;p&gt;
With Distributed OSGi, there&apos;s no more N-1 / 1-N problem. Libraries and services can be shared in one container (memory footprint is much smaller). Services can be shared across containers. The location of the services is transparent to the clients. There&apos;s no more configuration to change when adding/removing/moving services. This architecture allows the software to be the load balancer instead of using a hardware load balancer.
&lt;/p&gt;
&lt;p&gt;
Unfortunately, everything is not perfect. OSGi has quite a few problems. OSGi is great, but the tooling is not quite there yet. Not every library is a bundle and many JARs doesn&apos;t have OSGi manifests. OSGi was designed for embedded devices and using it for the server-side is very recent (but very active).
&lt;/p&gt;
&lt;p&gt;
OSGi is pretty low-level, but there is some work being done to hide the complexity. Spring DM helps, as do vendor containers. SpringSource has Spring dm Server, Sun has GlassFish, and Paremus has Infiniflow. OSGi is container centric, but next version will add distributed OSGi, but will have no support for load-balancing.
&lt;/p&gt;
&lt;p&gt;
Another big OSGi issue is version management. If you specify &lt;code&gt;version=1.0.0&lt;/code&gt;, it means &lt;code&gt;[1.0.0, &amp;#8734;]&lt;/code&gt;. You should at least use &lt;code&gt;version=[1.0.0,2.0.0]&lt;/code&gt;. When using OSGi, you have to be careful and follow something similar to &lt;a href=&quot;http://apr.apache.org/versioning.html&quot;&gt;Apache&apos;s APR Project Versioning Guidelines&lt;/a&gt; so that you can easily identify release compatibility.
&lt;/p&gt;
&lt;p&gt;At LinkedIn, the OSGi implementation is progressing, but there&apos;s still a lot of work to do. First of all, a bundle repository needs to be created. Ivy and bnd is used to generate bundles. Containers are being evaluated and Infiniflow is most likely the one that will be used. LinkedIn Spring (an enhanced version of Spring) and SCA will be used to deploy composites. Work on load-balancing and distribution is in progress as is work on tooling and build integration (Sigil from Paremus). 
&lt;/p&gt;
&lt;p&gt;In conclusion, LinkedIn will definitely use OSGi but they&apos;ll do their best to hide the complexity from the build system and from developers. For more information on OSGi at LinkedIn, stay tuned to the &lt;a href=&quot;http://blog.linkedin.com/blog/engineering/&quot;&gt;LinkedIn Engineering Blog&lt;/a&gt;. Yan has promised to blog about some of the challenges LinkedIn has faced and how he&apos;s fixed them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Yan has posted his presentation on the &lt;a href=&quot;http://blog.linkedin.com/blog/2008/10/colorado-softwa.html&quot;&gt;LinkedIn Engineering Blog&lt;/a&gt;.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/why_such_a_busy_week</guid>
    <title>Why such a busy week?</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/why_such_a_busy_week</link>
        <pubDate>Mon, 25 Aug 2008 07:54:18 -0600</pubDate>
    <category>General</category>
    <category>linkedin</category>
    <category>birthday</category>
    <category>jack</category>
    <category>status</category>
            <description>&lt;a href=&quot;http://www.brainopolis.com/roller/page/lance&quot;&gt;Lance&lt;/a&gt; sent me the following e-mail this morning:&lt;/p&gt;&lt;p class=&quot;quote&quot;&gt;
Just saw your status message, I think you&apos;d better blog an explanation!&lt;br/&gt;&lt;br/&gt;
&quot;Matt Raible is getting ready for one of the busiest weeks of his life.&quot;
&lt;/p&gt;
&lt;p&gt;I couldn&apos;t think of a good reason not to blog an explanation, so here goes.&lt;/p&gt;
&lt;p&gt;I&apos;m currently sitting at Denver&apos;s airport ready to hop on a flight to Mountain View. I&apos;ll be at LinkedIn&apos;s HQ for two days helping tidy up plans for a release in early September that I&apos;m in charge of. It&apos;s my first time being a &lt;em&gt;Release Owner&lt;/em&gt;, but it should be pretty painless so I&apos;m not too worried. Whenever I travel to Mountain View, I always have a good time, but I&apos;m constantly being pulled into meetings, or arranging meetings myself. I have a presentation to write that I&apos;m delivering on Wednesday. It describes the changes we&apos;ve made to make the backend of LinkedIn much more stateless and therefore better and faster.&lt;/p&gt;
&lt;p&gt;In my hotel room at night, I&apos;ll be writing &lt;a href=&quot;http://www.softwaresummit.com/2008/speakers/raible.htm&quot;&gt;my presentations for the Colorado Software Summit&lt;/a&gt;. Having to write 3 presentations in one week always makes me feel super-busy.&lt;/p&gt;
&lt;p&gt;On Wednesday night, I fly home late (likely after a game of hoops with co-workers). Thursday is Jack&apos;s birthday, so I hope to take the day off and spend the day with him. Thursday night is sleepover night. Being a single parent with two kids is never easy, but always fun. Friday it&apos;s back to work, wrapping up things for the week (status reports, bug fixes, etc.) and likely marveling at the traffic from the &lt;a href=&quot;http://www.demconvention.com/&quot;&gt;DNC&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Friday night there&apos;s a 9-hour cocktail party with a good friend from Vancouver, BC.&lt;/p&gt;
&lt;p&gt;Saturday is the super-busy day. It&apos;s time for Jack&apos;s birthday party and if &lt;a href=&quot;http://raibledesigns.com/rd/date/20070828&quot;&gt;last year&lt;/a&gt; is any evidence, it&apos;s one of those 8-hour cleaning and decorating situations. 
&lt;/p&gt;
&lt;p&gt;I&apos;m sure I&apos;ll have a busier week sometime in the future, but this one will surely be one to remember (especially since it&apos;s blogged into history now &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;). </description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/linkedin_tech_talk_kevin_brown</guid>
    <title>LinkedIn Tech Talk: Kevin Brown on Shindig</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/linkedin_tech_talk_kevin_brown</link>
        <pubDate>Thu, 17 Jul 2008 07:04:24 -0600</pubDate>
    <category>Java</category>
    <category>opensocial</category>
    <category>kevinbrown</category>
    <category>google</category>
    <category>shindig</category>
    <category>linkedin</category>
            <description>Last Thursday, Kevin Brown visited LinkedIn&apos;s Mountain View office to do a presentation on &lt;a href=&quot;http://incubator.apache.org/shindig&quot;&gt;Shindig&lt;/a&gt;, an &lt;a href=&quot;http://code.google.com/apis/opensocial/&quot;&gt;OpenSocial&lt;/a&gt; Reference Implementation. Below are my notes from his talk.

&lt;/p&gt;
&lt;p&gt;
In September 2007, Google started thinking about Social APIs. Google Gadgets would be better with access to Social Data ... but that&apos;s just Google. It was recognized that this is something that many others would like access to. OpenSocial was &lt;a href=&quot;http://radar.oreilly.com/2007/10/google-announces-the-opensocia.html&quot;&gt;announced&lt;/a&gt; in November 2007. It&apos;s an open standard for developer platforms that has a strong emphasis on &quot;social&quot; data. It&apos;s based on gadgets which is now covered by &lt;a href=&quot;http://opensocial.org&quot;&gt;The Open Social Foundation&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
In November, many Googlers started working on a Google Code project based on Java and iGoogle. However, there was too much proprietary code. In December, Brian McCallister of Ning created an ASF Proposal for Shindig. It was a rough port of iGoogle but with Ning&apos;s PHP code. This turned out to be a great starting point. It immediately got interest from Google, Hi5, MySpace and others. While most committers are still from Google, there are 12 developers that work on it full time and they&apos;re adding 2 committers each month. Shindig is a Java/PHP implementation of OpenSocial. &lt;a href=&quot;http://www.opencampfire.net/&quot;&gt;Open Campfire&lt;/a&gt; is an Apache-licensed .NET implementation that hopes to eventually merge into Shindig.
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.linkedin.com/blog/2008/07/linkedin-tech-t.html&quot;&gt;Read more on the LinkedIn Blog &amp;raquo;&lt;/a&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/linkedin_has_the_biggest_rails</guid>
    <title>LinkedIn has the Biggest Rails app in the World</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/linkedin_has_the_biggest_rails</link>
        <pubDate>Tue, 24 Jun 2008 13:25:16 -0600</pubDate>
    <category>Java</category>
    <category>scalability</category>
    <category>rails</category>
    <category>linkedin</category>
    <category>java</category>
    <category>macs</category>
            <description>From the &lt;a href=&quot;http://blog.linkedin.com/blog/2008/06/web-scalability.html&quot;&gt;LinkedIn Engineering Blog&lt;/a&gt;:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
&lt;a href=&quot;http://blog.linkedin.com/blog/2008/06/web-scalability.html&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3277/2607726721_3918baac8c_o.gif&quot; width=&quot;194&quot; height=&quot;61&quot; alt=&quot;LinkedIn loves Rails&quot; class=&quot;picture&quot; style=&quot;border: 0&quot; /&gt;&lt;/a&gt;
Bumper Sticker started as a small experiment in August, 2007. Facebook had released their development platform while we were hard at work on our own. We were curious to experiment and discover some of the characteristics of an application platform built on a social network and to see what, if any, learning we could apply to our own efforts. After noticing that professional and business-related applications weren&apos;t flourishing in the Facebook ecosystem, a few of our Product folks put their heads together while out for a run; one engineer, one week, and a few Joyent accelerators later, Bumper Sticker was born.
&lt;br/&gt;&lt;br/&gt;
We&apos;d be lying if we said that anyone was prepared for the kind of success Bumper Sticker has had since then - though we should have expected it, given the excellent Product team here at LinkedIn. Here&apos;s a quick snapshot of Bumper Sticker statistics at this moment: &lt;a href=&quot;http://blog.linkedin.com/blog/2008/06/web-scalability.html&quot;&gt;Read More &amp;raquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &quot;biggest Rails app in the world&quot; claim comes from &lt;a href=&quot;http://joyent.vo.llnwd.net/o25/videos/LinkedIn-Bumpersticker-LED-Scaling-Rails.m4v&quot;&gt;this video&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;In addition to having a kick-ass RoR team at LinkedIn, we also &lt;a href=&quot;http://blog.linkedin.com/blog/2008/06/linkedin-is-99.html&quot;&gt;do a lot with Java and love our Macs&lt;/a&gt;. Why wouldn&apos;t you want to &lt;a href=&quot;http://www.linkedin.com/static?key=jobs&amp;amp;trk=hb_ft_work&quot;&gt;work here&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;If you &lt;a href=&quot;http://www.linkedin.com/e/jsc/linkedin/&quot;&gt;find a gig&lt;/a&gt; you like, or simply have mad programming skills, &lt;a href=&quot;http://raibledesigns.com/contact.jsp&quot;&gt;contact me&lt;/a&gt; and I&apos;ll see if I can hook you up. And yes, we are hiring at LinkedIn Denver.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/is_it_possible_to_replace</guid>
    <title>Is it possible to replace the syntax parser in Eclipse or IDEA&apos;s JSP Plugin?</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/is_it_possible_to_replace</link>
        <pubDate>Mon, 23 Jun 2008 12:21:36 -0600</pubDate>
    <category>Java</category>
    <category>idea</category>
    <category>jsp</category>
    <category>eclipse</category>
    <category>linkedin</category>
            <description>&lt;img src=&quot;//farm4.static.flickr.com/3281/2605087266_6eeb5d149a_o.png&quot; width=&quot;268&quot; height=&quot;254&quot; alt=&quot;JSP in Eclipse&quot; class=&quot;picture&quot; style=&quot;border: 0&quot; /&gt;
At LinkedIn, &lt;a href=&quot;http://blog.linkedin.com/blog/2008/06/osgi-at-linke-1.html&quot;&gt;we have our own JSP Compiler&lt;/a&gt;. Our version of JSP is more like &lt;a href=&quot;http://freemarker.org&quot;&gt;FreeMarker&lt;/a&gt; than JSP since it solves many of the deficiencies of JSP. Since we allow a different syntax than standard JSP (more powerful EL, new tags for looping, loading from classpath), we (like FreeMarker) don&apos;t get much love from IDEs.
&lt;/p&gt;
&lt;p&gt;
We don&apos;t get much in the way of syntax-highlighting or code completion. However, since we use &lt;a href=&quot;https://javacc.dev.java.net/&quot;&gt;JavaCC&lt;/a&gt;/&lt;a href=&quot;https://javacc.dev.java.net/doc/JJTree.html&quot;&gt;JJTree&lt;/a&gt; for parsing, I&apos;m wondering if Eclipse or IDEA (or even NetBeans) allows replacing the default syntax definition with a new one.&lt;/p&gt;
&lt;p&gt;Has anyone extended one of these IDEs to enhance its JSP syntax highlighting and compilation? If so, I&apos;d love to hear about it. If not, it&apos;s likely we&apos;ll be doing it in the near future. </description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/traveled_coast_to_coast_last</guid>
    <title>Traveled Coast to Coast Last Week</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/traveled_coast_to_coast_last</link>
        <pubDate>Mon, 23 Jun 2008 11:40:22 -0600</pubDate>
    <category>General</category>
    <category>cabf</category>
    <category>americanrevolution</category>
    <category>mountainview</category>
    <category>beer</category>
    <category>linkedin</category>
    <category>shotheardroundtheworld</category>
    <category>softball</category>
    <category>boston</category>
            <description>&lt;a href=&quot;http://farm4.static.flickr.com/3141/2594598219_394f686808_o.jpg&quot; title=&quot;Coaches Jen and Jimmy&quot; rel=&quot;lightbox[coasttocoast]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3141/2594598219_78ffa158e6_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Coaches Jen and Jimmy&quot; class=&quot;picture&quot; /&gt;&lt;/a&gt;
Last week I traveled from Denver to Mountain View with the UI Frameworks Team. It was the first time all four of us traveled together and we had a great time. On Monday night, I helped LinkedIn Softball beat the only undefeated team in our league. Pitchers were a flowin&apos; at a &lt;a href=&quot;http://www.yelp.com/biz/the-oasis-beer-garden-menlo-park&quot;&gt;nearby beer garden&lt;/a&gt; afterwards to celebrate.&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3235/2602941462_4f3b604035_o.jpg&quot; title=&quot;New House in Concord&quot; rel=&quot;lightbox[coasttocoast]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3235/2602941462_f002115e82_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;New House in Concord&quot; class=&quot;picture&quot; /&gt;&lt;/a&gt;

On Wednesday evening, we returned to Denver and I enjoyed a night with the kids before flying out on Friday to Boston for the &lt;a href=&quot;http://beeradvocate.com/acbf/&quot;&gt;American Craft Beer Fest&lt;/a&gt;. The flight was no fun as it took me 12 hours door-to-door (on the way home too). I stayed with friends in Concord, Mass. and enjoyed the &quot;country livin&apos;&quot; a whole lot. They had just moved in a few weeks before, and it was awful nice being in an area with huge lots (1 acre +) and neighbors that come over and talk for hours.
&lt;/p&gt;
&lt;p&gt;On Saturday, we had a great time at the ACBF and even ran into some good friends (Chad and Mike) from Denver. Amazingly enough, both of these guys are going to &lt;a href=&quot;http://raibledesigns.com/rd/entry/2008_the_year_of_beer&quot;&gt;Oktoberfest&lt;/a&gt; at the same time we are. Below are some photos from the festivities (&lt;a href=&quot;http://flickr.com/photos/mraible/sets/72157605764189835/&quot;&gt;more on Flickr&lt;/a&gt;).&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3092/2602122825_789bde4b6b_o.jpg&quot; title=&quot;Line for the Craft American Beer Fest&quot; rel=&quot;lightbox[coasttocoast]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3092/2602122825_d6ff5ecbd3_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Line for the Craft American Beer Fest&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3147/2602956180_afa04edf08_o.jpg&quot; title=&quot;Yeee hawwww&quot; rel=&quot;lightbox[coasttocoast]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3147/2602956180_b266e2603f_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Yeee hawwww&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3099/2602138693_9122ba1ccf_o.jpg&quot; title=&quot;Good Times&quot; rel=&quot;lightbox[coasttocoast]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3099/2602138693_a2a7b4a1d0_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Good Times&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3177/2602127975_e4619da0b8_o.jpg&quot; title=&quot;These guys are going to Oktoberfest too!&quot; rel=&quot;lightbox[coasttocoast]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3177/2602127975_ef8f7b1c89_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;These guys are going to Oktoberfest too!&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;On Sunday, we went to the &lt;a href=&quot;http://en.wikipedia.org/wiki/Old_North_Bridge,_Concord,_Massachusetts&quot;&gt;Old North Bridge&lt;/a&gt; and learned some fascinating stuff about the beginning of the American Revolution. Did you know that 1/2 of the British Regiment that went to Concord stopped for pints at 9 in the morning? If they hadn&apos;t, they would have been able to surprise the Minutemen from behind and the American Revolution may never have happened. I also liked the fact that after the British were fired upon they ran back to town and then had breakfast for a couple hours. Maybe I should modify &lt;a href=&quot;http://en.wikipedia.org/wiki/Battle_of_Lexington_and_Concord&quot;&gt;this Wikipedia page&lt;/a&gt; to add these tidbits we learned from our tour guide? &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;All in all, it was a great week of traveling. The flights to and from Boston were way to long, but the memories I created were worth it. I&apos;ll be in Denver all week, enjoying &lt;a href=&quot;http://www.drcog.org/btwd2008/&quot;&gt;Bike to Work Day&lt;/a&gt; on Wednesday and then heading off on vacation for a week. I love summertime.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/linkedin_s_engineering_blog</guid>
    <title>LinkedIn&apos;s Engineering Blog</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/linkedin_s_engineering_blog</link>
        <pubDate>Fri, 13 Jun 2008 08:30:19 -0600</pubDate>
    <category>Java</category>
    <category>linkedin</category>
    <category>engineering</category>
    <category>blogging</category>
    <category>java</category>
            <description>&lt;a href=&quot;http://blog.linkedin.com/blog/&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/linkedin-blog-logo.gif&quot; width=&quot;184&quot; height=&quot;33&quot; alt=&quot;LinkedIn Blog&quot; class=&quot;picture&quot; style=&quot;border: 0&quot; /&gt;&lt;/a&gt;

Have you been curious about LinkedIn&apos;s &lt;a href=&quot;http://hurvitz.org/blog/2008/06/linkedin-architecture&quot;&gt;architecture&lt;/a&gt; or how they&apos;re using Grails and Rails? If so, you might be interested in LinkedIn&apos;s &lt;a href=&quot;http://blog.linkedin.com/blog/engineering/index.html&quot;&gt;Engineering Blog&lt;/a&gt;. Over the past couple of weeks, a few Engineers have starting writing about our architecture, OpenSocial, RailsConf, YUI, Grails and OSGi. Below is a complete listing of Engineering posts.
&lt;/p&gt;

&lt;ul class=&quot;glassList&quot;&gt;
                &lt;li&gt;&lt;a href=&quot;http://blog.linkedin.com/blog/2008/06/osgi-at-linke-1.html&quot;&gt;OSGi at LinkedIn: Java Compilation in OSGi&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;http://blog.linkedin.com/blog/2008/06/grails-at-linke.html&quot;&gt;Grails at LinkedIn&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;http://blog.linkedin.com/blog/2008/06/osgi-at-linkedi.html&quot;&gt;OSGi at LinkedIn&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;http://blog.linkedin.com/blog/2008/06/linkedin-speaks.html&quot;&gt;LinkedIn Speaks YUI&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;http://blog.linkedin.com/blog/2008/06/enlightenments.html&quot;&gt;Enlightenments from RailsConf 2008&lt;/a&gt;&lt;/li&gt;

                &lt;li&gt;&lt;a href=&quot;http://blog.linkedin.com/blog/2008/06/google-io-confe.html&quot;&gt;Google I/O and LinkedIn&apos;s Open Social Integration&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;http://blog.linkedin.com/blog/2008/05/linkedin-at-jav.html&quot;&gt;LinkedIn at JavaOne 2008&lt;/a&gt;&lt;/li&gt;
        
      &lt;/ul&gt;
&lt;p&gt;If there are topics you&apos;d like to see us blog about, please let me know. I&apos;ve somehow landed in the role of Editor for the Engineering Blog, so I should be able to hook you up if I can find an engineer to blog about what you&apos;re interested in.
&lt;/p&gt;
&lt;p&gt;On a related note, &lt;a href=&quot;http://www.linkedin.com/in/robgetzschman&quot;&gt;Rob Getzschman&apos;s&lt;/a&gt; entry &lt;a href=&quot;http://blog.linkedin.com/blog/2008/06/linkedin-discov.html&quot;&gt;LinkedIn discovers the truth about Cannes&lt;/a&gt; is quite entertaining. Highly recommended.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/share_on_linkedin</guid>
    <title>Share on LinkedIn</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/share_on_linkedin</link>
        <pubDate>Thu, 5 Jun 2008 22:13:04 -0600</pubDate>
    <category>The Web</category>
    <category>linkedin</category>
    <category>news</category>
            <description>This is a test to see if I can get the &lt;a href=&quot;http://blog.linkedin.com/blog/2008/06/share-news-with.html&quot;&gt;Share on LinkedIn&lt;/a&gt; widget working on this site. Click below to invoke.
&lt;/p&gt;
&lt;p style=&quot;padding: 10px&quot;&gt;
&lt;span style=&quot;border: 1px outset #94D4FF; background: #0099CC; padding: 5px 7px&quot; onmouseover=&quot;this.style.border=&apos;1px inset #94D4FF&apos;&quot; onmouseout=&quot;this.style.border=&apos;1px outset #94D4FF&apos;&quot;&gt;
&lt;a style=&quot;color: white&quot; href=&quot;javascript:function%20liSub(_LIN_sU){_LIN_t=document.title;_LIN_sT=%27%27;try{_LIN_sT=((window.getSelection%20&amp;amp;&amp;amp;%20window.getSelection())%20||%20(document.getSelection%20&amp;amp;&amp;amp;%20document.getSelection())%20||%20(document.selection%20&amp;amp;&amp;amp;%20document.selection.createRange%20&amp;amp;&amp;amp;%20document.selection.createRange().text));}catch(e){_LIN_sT=%27%27;};_LIN_sU+=%27&amp;amp;summary=%27+encodeURIComponent(_LIN_sT)+%27&amp;amp;title=%27+encodeURIComponent(_LIN_t)+%27&amp;amp;url=%27+encodeURIComponent(location.href);_LIN_w=window.open(_LIN_sU,%27News%27,%27width=520,height=570,toolbar=0,location=0,status=0,scrollbars=yes%27);};void(liSub(%27http://www.linkedin.com/shareArticle?mini=true%27));&quot;&gt;Share on LinkedIn&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;Seems to work pretty well. I like how you can select text and it&apos;ll automatically populate the summary. You can drag the link above to your toolbar in Safari and Firefox if you want to use it like a &lt;a href=&quot;http://tantek.com/favelets/&quot;&gt;favelet&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Now I just need to get one of the &lt;a href=&quot;http://tinyurl.com/4sl2jq&quot;&gt;designers&lt;/a&gt; to create a nifty little &quot;Share on LinkedIn&quot; icon so I can add it to all my entries by default.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/why_no_more_that_500</guid>
    <title>Why no more than 500 connections?</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/why_no_more_that_500</link>
        <pubDate>Sun, 1 Jun 2008 18:40:59 -0600</pubDate>
    <category>The Web</category>
    <category>linkedin</category>
            <description>I recently updated my status on &lt;a href=&quot;http://www.linkedin.com&quot;&gt;LinkedIn&lt;/a&gt; to read:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Matt is determined not to have 500+ connections. Will start removing connections soon.
&lt;/p&gt;
&lt;p&gt;A couple of days later, I received the following message from a connection:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I noticed the other day you mentioned that you are determined to not have over 500 LinkedIn connections. I&apos;m wondering what the reason is? Not just because LinkedIn shows 500+ after that, is it? As you work for LinkedIn, I assume there&apos;s some other reason. I&apos;m interested to know what it is...
&lt;/p&gt;
&lt;p&gt;I joined LinkedIn May 27, 2003, 22 days after it initially launched. For the first few years, I accepted invitations when I received them. Some folks I knew, some I didn&apos;t. When I started consulting for LinkedIn last summer, I had somewhere between 200 and 300 connections. Most of them were people who had contacted me, not folks I had contacted. 
&lt;/p&gt;
&lt;p&gt;
One day, I used the &lt;a href=&quot;https://www.linkedin.com/secure/uploadContacts?displayWebMail=&quot;&gt;import webmail contacts&lt;/a&gt; feature to pull in my contacts from Gmail. My number of connections quickly jumped by 100 and it&apos;s increased quite a bit since then (mostly due to co-workers from LinkedIn). Of the almost 500 connections I have, I believe there&apos;s a good 100-200 of them that are folks I don&apos;t know, have never had contact with, and will likely never benefit from being &quot;connected&quot; with. 
&lt;/p&gt;
&lt;p&gt;
I guess the main reason I&apos;m planning on trimming my connections is to make my network higher quality. I admit I&apos;m somewhat motivated by the 500+ icon, but it&apos;s also a genuine feeling that there&apos;s quite a few folks I won&apos;t benefit from being connected to. I&apos;m not a &lt;a href=&quot;http://www.themetanetwork.com/&quot;&gt;LION&lt;/a&gt; after all. I believe my LinkedIn network should resemble my real-world network.&lt;/p&gt;
&lt;p&gt;What&apos;s your opinion? Should I have folks in my network that know me, but I don&apos;t know them?</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/linkedin_groups</guid>
    <title>LinkedIn Groups</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/linkedin_groups</link>
        <pubDate>Tue, 20 May 2008 14:16:18 -0600</pubDate>
    <category>The Web</category>
    <category>linkedin</category>
            <description>&lt;a href=&quot;http://www.linkedin.com&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/linkedin-logo.gif&quot; alt=&quot;LinkedIn&quot; width=&quot;129&quot; height=&quot;36&quot; class=&quot;picture&quot; style=&quot;border: 0&quot; /&gt;&lt;/a&gt;
This afternoon, I noticed there&apos;s a &lt;a href=&quot;http://blogs.sun.com/theaquarium/entry/linkedin_glassfish_group_now_available&quot;&gt;LinkedIn &quot;GlassFish&quot; group now available&lt;/a&gt; and it reminded me of a couple things:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;LinkedIn currently doesn&apos;t have a way to search for groups, but Jason Bailes has setup a &lt;a href=&quot;http://www.google.com/coop/cse?cx=012022021532202637257%3An0e8vkkccdq&quot;&gt;LinkedIn Groups Search&lt;/a&gt; with Google Custom Search. &lt;em&gt;Thanks Jason!&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;I created a &lt;a href=&quot;http://www.linkedin.com/groupInvitation?groupID=35000&amp;amp;sharedKey=59AF23639168&quot;&gt;Apache Software Foundation&lt;/a&gt; group on LinkedIn a few months ago. If you&apos;re a committer or member, you&apos;re more than welcome to join the group.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LinkedIn Groups don&apos;t provide a whole lot of functionality at this point, but I&apos;ve heard there&apos;s big things in store for them. Chances are they&apos;ll be very valuable in the future.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/happy_cinco_de_linko</guid>
    <title>Happy Cinco de Linko!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/happy_cinco_de_linko</link>
        <pubDate>Mon, 5 May 2008 08:40:46 -0600</pubDate>
    <category>General</category>
    <category>holiday</category>
    <category>cincodemayo</category>
    <category>linkedin</category>
            <description>&lt;a href=&quot;http://www.linkedin.com&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/linkedin-logo.gif&quot; width=&quot;129&quot; height=&quot;36&quot; alt=&quot;LinkedIn Logo&quot; class=&quot;picture&quot; style=&quot;border: 0&quot; /&gt;&lt;/a&gt;
Today is packed full of celebrations and traveling for me. First of all, it&apos;s &lt;a href=&quot;http://en.wikipedia.org/wiki/Cinco_de_Mayo&quot;&gt;Cinco de Mayo&lt;/a&gt;, which is always a good excuse for a margarita. Secondly, I&apos;m heading to Mountain View to assist my co-workers in celebrating &lt;a href=&quot;http://blog.linkedin.com/blog/2008/05/happy-cinco-de.html&quot;&gt;Cinco de Linko&lt;/a&gt;. After that, I&apos;m pitching in a LinkedIn softball game trying to beat the #1 team in our league. Then I&apos;ll be heading up to the festivities of JavaOne. It&apos;s likely I won&apos;t be &quot;&lt;a href=&quot;http://raibledesigns.com/rd/entry/javaone_where_are_the_good&quot;&gt;networking&lt;/a&gt;&quot; until late night. I&apos;ll be &lt;a href=&quot;http://twitter.com/mraible&quot;&gt;twittering&lt;/a&gt; all week if want to know where the good parties are. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I just learned how to find out when you first joined LinkedIn. Click on &quot;Account &amp;amp; Settings&quot; at the top of any LinkedIn page. On that page, in the upper-right corner in grey text, you should see &quot;User since: &quot; and the date you joined. Interestingly enough, I joined May 27, 2003 - just 22 days after the launch.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/the_linkedin_journey_continues</guid>
    <title>The LinkedIn Journey Continues</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/the_linkedin_journey_continues</link>
        <pubDate>Thu, 6 Mar 2008 08:00:49 -0700</pubDate>
    <category>Java</category>
    <category>grails</category>
    <category>java</category>
    <category>productivity</category>
    <category>rails</category>
    <category>career</category>
    <category>linkedin</category>
    <category>webframeworks</category>
            <description>As you might know, I&apos;ve spent the last several months working for one of the coolest clients ever: &lt;a href=&quot;http://www.linkedin.com&quot;&gt;LinkedIn&lt;/a&gt;. They hired me back in July 2007 and I was &lt;a href=&quot;http://raibledesigns.com/rd/entry/first_day_at_linkedin&quot;&gt;impressed on day one&lt;/a&gt;. I was originally hired to help them evaluate open source Java web frameworks and try to determine if moving from their proprietary one to an open source one would help improve developer productivity.&lt;/p&gt;
&lt;p&gt;After looking at all the options, I recommended we look at Struts 2 and Spring MVC - primarily because they seemed to be the best frameworks for a LinkedIn-type of application. Another Engineer and I prototyped with Struts 2 for about 6 weeks and came up with a prototype that worked quite well. While our mission was successful, we found a &lt;a href=&quot;http://raibledesigns.com/rd/entry/does_struts_2_suck&quot;&gt;couple&lt;/a&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/proposed_tomcat_enhancement_add_flag&quot;&gt;issues&lt;/a&gt; with Struts 2 and standard JSP that might actually hurt developer productivity more than it helped.&lt;/p&gt;
&lt;p&gt;Following this project, I worked on the New Homepage Team, which is &lt;a href=&quot;http://blog.linkedin.com/blog/2008/02/the-new-look-of.html&quot;&gt;now visible&lt;/a&gt; to everyone that logs onto LinkedIn. My role was minimal, but it was still a very fun project to work on. You know those widgets in the right panel? I did the initial UI and backend integration for those. All the business logic, Ajax/JavaScript, CSS, and optimization was done by other folks on the team. Shortly after this project went live in November, I started prototyping again with Spring MVC + JSP.&lt;/p&gt;
&lt;p&gt;The reason I was asked to prototype with Spring MVC was because they were using Spring on the backend, Spring MVC in a couple other projects, and a new project was being kicked off that used Grails. Rather than add &lt;em&gt;another&lt;/em&gt; framework (Struts 2) to the mix, they wanted to see if they could suppress any further framework proliferation.&lt;/p&gt;
&lt;p&gt;After a month of prototyping with Spring MVC + JSP, my results weren&apos;t as good as Struts 2. With Struts 2, I was able to use OGNL to do all the things their current JSP implementation allows them to do (call methods with arguments, use statics in EL, etc.). With standard JSP, a lot of this wasn&apos;t possible. If it was - it required writing lots of tag libraries and made it more cumbersome for developers to do certain things. At the end of that project, I determined that using FreeMarker might solve these problems. I also determined that neither Struts 2 nor Spring MVC would solve the ultimate problem of developer productivity. Neither framework would allow developers to go from make-a-change-and-deploy, wait-3-minutes-to-see-change-in-browser to make-a-change, save and wait-15-seconds-to-see-change-in-browser.
&lt;/p&gt;
&lt;p&gt;
I recommended that this be the ultimate goal - to get rid of the deployment cycle and to allow minimal turnaround when deploying modified classes. After that problem was solved, it&apos;s true that moving to an open source web framework would likely provide an easier-to-remember API. However, the problem with moving to a new web framework would be that everything used to construct the existing site would suddenly become legacy code.&lt;/p&gt;
&lt;p&gt;In the end, we concluded that the best solution might be to &lt;em&gt;enhance&lt;/em&gt; the existing framework to be more like the available open source options. This would allow existing applications to keep using their code -- and if we enhance properly -- new applications can use a simpler, less verbose API and a templating framework that&apos;s easier to understand. We can make LinkedIn&apos;s version of JSP more like standard JSP while allowing its powerful EL to remain. We can add support for JSP Tag Libraries and Tag Files.&lt;/p&gt;
&lt;p&gt;One of the benefits of moving to an open source web framework is there&apos;s a community, documentation and books that describe the best (or most common) ways to solve problems with the framework. LinkedIn has this, but it&apos;s all in code and no one seems to have a high-level of confidence that the way that they did it is the &quot;best&quot; way. Developers communicate well, but all the knowledge is stuck in their heads and inboxes - there&apos;s no way for new developers to search this knowledge and figure it out on their own without asking somebody.
&lt;/p&gt;
&lt;p&gt;
By adopting an open source web framework, it&apos;s possible to solve part of this problem, but I think it&apos;s still going to exist - where a few engineers know how to use the framework really well (for the specific application) and the rest don&apos;t. We determined that regardless of open source vs. proprietary framework, what was needed was a set of developers that acted as authorities on how to develop web applications at LinkedIn. A UI Frameworks Team if you will. This would be their only job and they would never get pulled from this to work on projects or complete tasks related to LinkedIn&apos;s products. Some developers mentioned that they&apos;d been asking for this for years, and some folks had even been hired for this. However, the formulation of this group has never happened and it&apos;s obvious (now more than ever) that it&apos;d be awesome to have them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The UI Frameworks Team&lt;/strong&gt;&lt;br/&gt;
At the end of 6 months, it seemed my work was done at LinkedIn. I liked the idea of a UI Frameworks Team and recommended they start it with the authors of the existing web framework. They agreed this was a good idea. A few days later, I was pulled into the CTO&apos;s office and he offered me the job. He offered me the challenge of building this team and told me I could do it remotely (from Denver) and hire my own people to help me with it. I gulped as I realized I&apos;d just been offered the opportunity of a lifetime. I knew that while this might not be the best option for LinkedIn, it certainly was an excellent opportunity for me. I said I&apos;d think about it.&lt;/p&gt;
&lt;p&gt;In the meantime, I was given a project which you might&apos;ve read about. They asked me to &lt;a href=&quot;http://raibledesigns.com/rd/entry/migrating_a_rails_app_to&quot;&gt;migrate a Rails application to Grails&lt;/a&gt; and try to determine if &lt;a href=&quot;http://raibledesigns.com/rd/entry/is_there_room_for_both&quot;&gt;they really needed both frameworks&lt;/a&gt;. I spent 2 weeks coming up to speed on both and flew to Mountain View to deliver my conclusion. Here&apos;s an excerpt from an internal blog post I wrote.&lt;/p&gt;
&lt;div class=&quot;smokey&quot; style=&quot;border: 1px solid silver; background: #eee; padding: 10px; margin-bottom: 10px&quot;&gt;
&lt;p style=&quot;margin-top: 0&quot;&gt;As far as I know, Rails has been used at LinkedIn for well over 6 months and Grails has been used for a similar duration. Both projects that&apos;ve used these technologies have enjoyed extreme success. Both projects have been fun for the developers working on them and both have improved the technologies/frameworks they&apos;re using. &lt;/p&gt;

&lt;p&gt;Here&apos;s an interesting quote about the Rails application:&lt;/p&gt;

&lt;blockquote style=&quot;padding: 0px 10px&quot;&gt;
Another app you might want to look at is BumperSticker, our facebook app. Interestingly we heard through joyent that DHH (the creator of Rails) told them that BumperSticker is the biggest rails app in the world (in terms of page views) - we are closing in on 1 billion monthly page views and we have 1 million unique users per day (about 10 million installs on FB). It&apos;s a little trickier to setup in a dev environment since you need to be running on FB, but the code itself is pretty interesting since we&apos;ve iterated on it a bunch of times and are making extensive use of third party libraries such as memcached.&lt;/blockquote&gt;

&lt;p&gt;This quote loosely translates to &quot;We have some Rails Ninjas on staff and we&apos;ve been quite successful in developing with it and making it scale&quot;.&lt;/p&gt;

&lt;p&gt;Both platforms have allowed developers to iterate quickly and turbo-charge their productivity.&lt;/p&gt;

&lt;p&gt;My Conclusion: &lt;b&gt;&lt;em&gt;Allow Both&lt;/em&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;If you have talented developers that can whip out kick-ass code with either platform, pay them and pay them well. Passion is the most important part of any job. If developers are passionate about the application they&apos;re developing and the language they&apos;re using (notice language is secondary) - they can do great things.&lt;/p&gt;

&lt;p&gt;I know this probably isn&apos;t the answer you wanted to hear, but it&apos;s what I believe. I think both frameworks are very similar. I believe the knowledge you gain from learning one framework is transferable to the other. A lot of the things I learned about Rails worked with Grails. Ruby&apos;s syntax is similar to Groovy&apos;s. &lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0&quot;&gt;There&apos;s a natural synergy between these two frameworks. The hard part is figuring out when to use which one.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The application that I was asked to port from Rails to Grails? The one that was launched last week - &lt;a href=&quot;http://blog.linkedin.com/blog/2008/02/linkedin-mobile.html&quot;&gt;LinkedIn Mobile&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After doing this research, I stepped up to the plate and accepted the offer to start a UI Frameworks Team and recruited some kick-ass Java Developers I know to be the founding members. Last week, I flew out to Mountain View to do some kickoff meetings and start getting the infrastructure in place so we can document, support and release code like a well-oiled open source project. There&apos;s nothing saying we won&apos;t use an open source web framework as the underlying engine, but I think this should be an excellent chance to see the power of open source governance and development style in a corporate environment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Director of Engineering, Core Experience&lt;/strong&gt;&lt;br/&gt;
I should mention one last thing. If you&apos;re an experienced Java Developer/Architect with a passion and deep knowledge of UI development (JavaScript, CSS, HTML), we&apos;ve got a &lt;a href=&quot;http://www.linkedin.com/jobs?viewJob=&amp;amp;jobId=483817&amp;amp;fromSearch=39&amp;amp;sik=1204111006804&quot;&gt;Director of Engineering, Core Experience&lt;/a&gt; position with your name on it. I might even get to interview you if you apply for this job. Furthermore, whoever gets hired will likely work very closely with my team. What&apos;s not to like about that!? &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/what_s_the_job_market</guid>
    <title>What&apos;s the Java Job Market like in Denver?</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/what_s_the_job_market</link>
        <pubDate>Fri, 22 Feb 2008 21:59:22 -0700</pubDate>
    <category>Java</category>
    <category>linkedin</category>
    <category>career</category>
    <category>java</category>
    <category>denver</category>
            <description>I recently received an e-mail from someone asking me a number of questions about Denver&apos;s Java Job Market. He&apos;s moving from Seattle to Denver and asked me the questions below. Since Denver is one of the best places to live on Earth, I figured some other folks might like to hear my answers.
&lt;/p&gt;
&lt;p&gt;-------------------------------------&lt;p&gt;
&lt;p&gt;
&lt;strong&gt;For senior architect types, is the market strong?&lt;/strong&gt;&lt;br/&gt;
I believe it is. I haven&apos;t looked for a local gig in quite some time,
but when I did back in June - there was lots of opportunities.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Any good employers you could recommend?&lt;/strong&gt;&lt;br/&gt;
Not really, I&apos;ve done contracting for the most part for the last 11
years. I&apos;ve always enjoyed smaller companies. The best place to find Java jobs is by subscribing to the &lt;a href=&quot;http://denverjug.org&quot;&gt;Denver JUG&lt;/a&gt; Jobs mailing list. There&apos;s jobs posted several times
per week (both full time and contract).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Any companies to avoid?&lt;/strong&gt;&lt;br/&gt;
Not that I know of.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For senior types, what type of salaries or hourly rates should I expect to find?&lt;/strong&gt;&lt;br/&gt;
I think you&apos;ll be lucky to make over $100K as a full-time employee. You
can certainly work your way to 110-120K after a couple years, but I
think it&apos;s tough to hire into that. I&apos;d expect 90+. As a contractor,
you can expect $60-70/hour. There&apos;s definitely opportunities to get
90-100/hour, but they&apos;re hard to find because you have to eliminate
the middle-man (recruiters).
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Are Colorado Springs or Boulder good options for looking for jobs?&lt;/strong&gt;&lt;br/&gt;
Boulder is definitely hopping. Colorado Springs - not so much.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Are contract positions good in Denver?&lt;/strong&gt;&lt;br/&gt;
I&apos;ve always liked contract positions.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Any recruiters that would be good talk to?&lt;/strong&gt;&lt;br/&gt;
&lt;a href=&quot;http://www.linkedin.com/in/lrford&quot;&gt;Lauren Ford&lt;/a&gt; is a good resource
I&apos;ve worked with in the past. You can tell her I sent you if you send
her an e-mail.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anything else you&apos;d recommend?&lt;/strong&gt;&lt;br/&gt;
If you can, get a gig downtown. Baseball Season starts in April and
downtown has a buzz about it that&apos;s very enjoyable. Either that or
Golden so you can be close to Mountain Biking. 
&lt;/p&gt;
&lt;p&gt;-------------------------------------&lt;p&gt;
&lt;p&gt;One thing I forgot to mention in my reply is how valuable &lt;a href=&quot;http://www.linkedin.com&quot;&gt;LinkedIn&lt;/a&gt; has become when searching for jobs. I&apos;ve always believed being well connected is the key to career success and LinkedIn allows you to use the power of network very easily. You may think I&apos;m biased because I work there - but how do you think I &lt;a href=&quot;http://raibledesigns.com/rd/entry/summer_gigs&quot;&gt;got the job&lt;/a&gt; there in the first place? &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/google_calendar_sync_for_blackberry</guid>
    <title>Google Calendar Sync for BlackBerry</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/google_calendar_sync_for_blackberry</link>
        <pubDate>Wed, 12 Dec 2007 13:41:49 -0700</pubDate>
    <category>The Web</category>
    <category>linkedin</category>
    <category>blackberry</category>
    <category>google</category>
            <description>&lt;a href=&quot;http://www.google.com/mobile/sync/index.html&quot;&gt;&lt;img src=&quot;//www.google.com/mobile/images/sync/overview_sync.gif&quot; alt=&quot;Google Sync&quot; width=&quot;250&quot; height=&quot;243&quot; class=&quot;picture&quot; style=&quot;border: 0&quot; /&gt;&lt;/a&gt;
A couple of days ago, I said the &lt;a href=&quot;http://raibledesigns.com/rd/entry/linkedin_s_new_homepage&quot;&gt;Network Updates feature on LinkedIn&apos;s New Homepage is kinda boring&lt;/a&gt;. I still agree with this, but I think the new &lt;strong&gt;LinkedIn News&lt;/strong&gt; provides some real value. Today my homepage had a link to &lt;a href=&quot;http://googlesystem.blogspot.com/2007/12/google-calendar-sync-for-blackberry.html&quot;&gt;Google Calendar Sync for BlackBerry&lt;/a&gt;. This is something I&apos;ve been looking for for quite some time.&lt;/p&gt;
&lt;p&gt;If you have a BlackBerry, you can install it from &lt;a href=&quot;http://m.google.com/sync&quot;&gt;http://m.google.com/sync&lt;/a&gt;. I use &lt;a href=&quot;http://spanningsync.com/&quot;&gt;Spanning Sync&lt;/a&gt; to allow me to synch my Google Calendar in iCal and it works awesome. Having a sync to my BlackBerry was the missing part that I really wanted - and now I have it. &lt;em&gt;Thanks LinkedIn!&lt;/em&gt; (and Google of course)
&lt;/p&gt;
&lt;p&gt;As far as LinkedIn&apos;s &lt;a href=&quot;http://www.linkedin.com/?beta&quot;&gt;New Homepage&lt;/a&gt;, I think the biggest improvement would be to add Atom/RSS Feeds so I could get all my homepage updates (news, network updates and widget updates) in NetNewsWire. I asked about this last week and they said this should be coming in Q1 2008.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/linkedin_s_new_homepage</guid>
    <title>LinkedIn&apos;s New Homepage</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/linkedin_s_new_homepage</link>
        <pubDate>Mon, 10 Dec 2007 11:16:02 -0700</pubDate>
    <category>The Web</category>
    <category>linkedin</category>
    <category>beta</category>
            <description>Dion has a post about &lt;a href=&quot;http://almaer.com/blog/linkedin-beta-small-steps&quot;&gt;LinkedIn&apos;s New Homepage&lt;/a&gt;. In addition to Dion&apos;s post, this seems to be a popular topic on &lt;a href=&quot;http://www.techmeme.com/071210/h1420&quot;&gt;Techmeme&lt;/a&gt;. I&apos;m proud to say I played a small part in this project and enjoyed working with the fabulous &quot;Homepage Team&quot; that put this together. We celebrated the launch last week while I was out in Mountain View.
&lt;/p&gt;

&lt;p&gt;To learn more about LinkedIn&apos;s New Homepage and the News feature, see the &lt;a href=&quot;http://blog.linkedin.com/blog/2007/12/announcing-link.html&quot;&gt;LinkedIn Blog&lt;/a&gt;.

&lt;p&gt;Back to Dion&apos;s post. He says:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
The network connections portion shows me what is wrong with LinkedIn. On Facebook I can see interesting things that my friends have done. On LinkedIn, I see that a connection has added another 6 connections. Who cares?
&lt;/p&gt;
&lt;p&gt;I agree that Network Updates are kinda boring on LinkedIn. However, I don&apos;t find my Facebook News Feed very interesting either. Is your Facebook News Feed interesting? If so, why?&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;img src=&quot;//static.raibledesigns.com/repository/images/facebook-newsfeed.png&quot; width=&quot;442&quot; height=&quot;356&quot; alt=&quot;Facebook News Feed&quot; style=&quot;border: 1px solid silver&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/going_to_see_fake_steve</guid>
    <title>Going to see Fake Steve Jobs Tonight</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/going_to_see_fake_steve</link>
        <pubDate>Tue, 6 Nov 2007 14:41:15 -0700</pubDate>
    <category>Mac OS X</category>
    <category>linkedin</category>
            <description>One of the perks of working at LinkedIn, and being out in Mountain View this week, is I get to attend a talk tonight where &lt;a href=&quot;http://blog.linkedin.com/blog/2007/10/linkedin-qa-eve.html&quot;&gt;Guy Kawasaki interviews Fake Steve Jobs&lt;/a&gt;. It&apos;s my first trip to the Computer History Museum, so it should be a fun show. If you&apos;re not able to make it tonight, it looks like they&apos;ll be &lt;a href=&quot;http://blog.linkedin.com/blog/2007/11/linkedin-qa-eve.html&quot;&gt;live streaming the event from the LinkedIn blog&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;My only question is - do you think FSJ will act like Jobs or himself? I&apos;m hoping for the former.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; That was an &lt;em&gt;awesome&lt;/em&gt; event. Thanks to LinkedIn for hosting it and for &lt;a href=&quot;http://fakesteve.blogspot.com/&quot;&gt;Fake Steve&lt;/a&gt; for the great stories behind his journey.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; The LinkedIn Blog has &lt;a href=&quot;http://blog.linkedin.com/blog/2007/11/videos-from-the.html&quot;&gt;videos from the event&lt;/a&gt;.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/want_a_kick_ass_java</guid>
    <title>Want a kick-ass Java/UI Engineering Job in Mountain View?</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/want_a_kick_ass_java</link>
        <pubDate>Fri, 17 Aug 2007 10:24:00 -0600</pubDate>
    <category>Java</category>
    <category>job</category>
    <category>linkedin</category>
    <category>java</category>
            <description>The last month working at &lt;a href=&quot;http://linkedin.com&quot;&gt;LinkedIn&lt;/a&gt; has been an absolute blast. I&apos;m new to the whole &quot;treating developers like royalty&quot; thing, so that&apos;s taken a while to get used to. It&apos;s definitely nice, especially when the company gives you ownership of the things you&apos;re working on. Sure, there&apos;s schedules and priorities, but it seems like each and every engineer has control of their own destiny. As a consultant, I&apos;ve been very impressed with the way I&apos;ve been embraced and folded into the team like a regular employee. There&apos;s lots of team lunches, a tech meetup every now and then, and I even played hoops with a bunch of guys last night. This is probably the coolest company I&apos;ve ever worked for.
&lt;/p&gt;
&lt;p&gt;Wanna have fun like I am? LinkedIn is looking to hire quite aggressively over the next several months. There&apos;s new faces almost every week and hopefully I can &quot;hook you up&quot; to be a part of the festivities. Below is a position that we&apos;re currently hiring for in the UI Engineering team. Working remotely is not an option at this time, you need to live in (or relocate to) the Bay Area.
&lt;/p&gt;
&lt;div class=&quot;smokey&quot; style=&quot;margin-left: 0; padding-bottom: 0; margin-bottom: 10px&quot;&gt;LinkedIn is an online network of more than 11 million experienced
professionals from around the world, representing 150 industries. We are
four years old, profitable and one of the fastest growing pre-IPO Web 2.0
companies in Silicon Valley.
&lt;br/&gt;&lt;br/&gt;
LinkedIn is developing the UI infrastructure for our next generation
applications.  This is a strategic initiative that will enable LinkedIn to
develop highly interactive and intuitive applications leveraging the latest
Web UI technologies. We are looking for a world-class software engineer to
work on this critical component of our infrastructure, in partnership with
one or more technical leads, the engineering and the product team.
&lt;br/&gt;&lt;br/&gt;
POSITION REQUIREMENTS:
&lt;ul class=&quot;glassList&quot; style=&quot;padding-bottom: 0; margin-bottom: 0&quot;&gt;
&lt;li&gt;EXPERIENCE:
&lt;ul style=&quot;margin-bottom: 0&quot;&gt;&lt;li&gt;3+ years of overall professional work experience&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
SKILLS &amp; ABILITIES:
&lt;ul style=&quot;margin-bottom: 0&quot;&gt;
&lt;li&gt;In depth and hands on knowledge of Java, the J2EE platform and
experience working with relevant tools (IDEs, ant, junit, etc.)&lt;/li&gt;
&lt;li&gt;A passion for UI frameworks: JSF and Facelets experience preferable.&lt;/li&gt;
&lt;li&gt;In depth knowledge of JSP, JSTL.&lt;/li&gt;
&lt;li&gt;Experience with Ajax.&lt;/li&gt;
&lt;li&gt;Experience with portal technologies.&lt;/li&gt;
&lt;li&gt;I18n experience a plus.&lt;/li&gt;
&lt;li&gt;Solid understanding of design, coding and testing patterns&lt;/li&gt;
&lt;li&gt;Ability to work in a fast paced, test-driven collaborative and
iterative programming environment&lt;/li&gt;
&lt;li&gt;Ability to effectively interact with product managers and other
organizational units such as QA and CS&lt;/li&gt;
&lt;li&gt;Excellent communication skills&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
EDUCATION:
&lt;ul style=&quot;margin-bottom: 0&quot;&gt;&lt;li&gt;B.S./M.S in Computer Science or equivalent experience.&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;I don&apos;t know if JSF and Facelets experience is still a requirement (now that I&apos;m here &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;), but a passion for UI frameworks and web development is. You should know &lt;strong&gt;at least two&lt;/strong&gt; leading Java frameworks and have a lot of experiencing with testing web applications out-of-container. We&apos;re not looking for Java Developers turned web developers, we&apos;re more looking for Web Developers that know Java.
&lt;/p&gt;
&lt;p&gt;If this sounds interesting to you, shoot me your resume in an &lt;a href=&quot;mailto:mraible@linkedin.com?Subject=Java/UI Developer at LinkedIn&quot;&gt;e-mail&lt;/a&gt;. Don&apos;t forget to include a link to your LinkedIn Profile.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/first_day_at_linkedin</guid>
    <title>First Day at LinkedIn</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/first_day_at_linkedin</link>
        <pubDate>Mon, 9 Jul 2007 23:51:18 -0600</pubDate>
    <category>Java</category>
    <category>macbookpro</category>
    <category>linkedin</category>
            <description>&lt;a href=&quot;http://www.linkedin.com&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/linkedin-logo.gif&quot; width=&quot;129&quot; height=&quot;36&quot; alt=&quot;LinkedIn Logo&quot; class=&quot;picture&quot; style=&quot;border: 0&quot; /&gt;&lt;/a&gt;
Today was my first day onsite at &lt;a href=&quot;http://www.linkedin.com&quot;&gt;LinkedIn&lt;/a&gt; in Mountain View, California. I&apos;m very impressed by two things so far: they gave me a new MacBook Pro and Sushi is on tap for lunch tomorrow. Of course, there&apos;s a lot more impressive things going on there, but the new MacBook was today&apos;s highlight. The strange thing is I don&apos;t need one - I just &lt;a href=&quot;http://raibledesigns.com/rd/entry/a_new_17_powerhouse&quot;&gt;got a new 17&quot; a few months ago&lt;/a&gt;. Nevertheless, I received and configured a new 15&quot; today. It&apos;s not the machine that impresses me, but the company&apos;s willingness to buy the best machines for its developers.&lt;br/&gt;&lt;br/&gt;
I was introduced to almost the entire company this morning, and I only saw one Windows machine in a sea of Macs. My favorite quote? &quot;If the MacBook Pro isn&apos;t fast enough for you, we can see about getting you a Mac Pro.&quot; I like a company that knows what developers like and doesn&apos;t have a problem treating them well.
&lt;br/&gt;&lt;br/&gt;
The last time I received a new computer as part of a contract or full-time position? I believe that was way back in 2002. Working at LinkedIn seems like a developer&apos;s paradise. Does your company provide new MacBook Pros and Cinema Displays to its developers?</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/summer_gigs</guid>
    <title>Summer Gigs</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/summer_gigs</link>
        <pubDate>Mon, 18 Jun 2007 13:10:32 -0600</pubDate>
    <category>Java</category>
    <category>career</category>
    <category>linkedin</category>
            <description>I&apos;m happy to report that after posting &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_good_ol_job_hunt&quot;&gt;The good ol&apos; Job Hunt&lt;/a&gt; last week, I had a prosperous week searching for my next gig. I got an offer from a local company in Denver on Tuesday and had 5 interviews on Thursday with various companies. I ended up accepting an offer from &lt;a href=&quot;http://linkedin.com&quot;&gt;LinkedIn&lt;/a&gt; for a 3-month contract that starts in a few weeks (thanks for the hookup &lt;a href=&quot;http://www.linkedin.com/in/brianguan&quot;&gt;Brian&lt;/a&gt;!). 
&lt;br/&gt;&lt;br/&gt;
I also landed a 2-week contract that&apos;ll keep me occupied through the end of June. There&apos;s a nice week between the two gigs where we&apos;re heading to The Cabin for the 4th. I&apos;m currently working on getting an &quot;anchor desk&quot; at the &lt;a href=&quot;http://hivecoop.pbwiki.com/&quot;&gt;Hive Coorperative&lt;/a&gt;, but unfortunately won&apos;t be able to use it much in July. I&apos;ll be in Mountain View the first couple weeks, followed by Portland (for OSCON) at the end of the month. 
&lt;br/&gt;&lt;br/&gt;
Anyone out there interested in a tech meetup in Mountain View in July? My birthday is the 16th - maybe we could meet up around then?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; My &lt;a href=&quot;http://raibledesigns.com/rd/entry/first_day_at_linkedin&quot;&gt;first day at LinkedIn rocked&lt;/a&gt;.</description>          </item>
  </channel>
</rss>