<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>m i k e  b r e v o o r t &#187; Technology</title>
	<atom:link href="http://mike.brevoort.com/category/technology/feed/" rel="self" type="application/rss+xml" />
	<link>http://mike.brevoort.com</link>
	<description>life technology etc</description>
	<lastBuildDate>Wed, 03 Mar 2010 22:04:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Grails Solr Plugin Progress Screencast</title>
		<link>http://mike.brevoort.com/2010/03/03/grails-solr-plugin-progress-screencast/</link>
		<comments>http://mike.brevoort.com/2010/03/03/grails-solr-plugin-progress-screencast/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 07:34:51 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[solr]]></category>

		<guid isPermaLink="false">http://mike.brevoort.com/?p=242</guid>
		<description><![CDATA[I started work on this plugin back in December based on the work I did for Patheos.com and by the graces of my employer Avalon Consulting LLC and Patheos, they allowed me to open source the plugin and continue working on it. This week I had some time to get back to it, and today I started [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fmike.brevoort.com%2F2010%2F03%2F03%2Fgrails-solr-plugin-progress-screencast%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fmike.brevoort.com%2F2010%2F03%2F03%2Fgrails-solr-plugin-progress-screencast%2F" height="61" width="51" /></a></div><p>I started work on this plugin back in December based on the work I did for <a href="http://patheos.com">Patheos.com</a> and by the graces of my employer <a href="http://avalonconsult.com">Avalon Consulting LLC</a> and Patheos, they allowed me to open source the plugin and continue working on it. This week I had some time to get back to it, and today I started creating a basic reference implementation application that will accompany the documentation. Below is a screencast demo of this application which indexes an export of songs from my iTunes library metadata and makes them searchable.</p>
<p>The <a href="http://github.com/mbrevoort/grails-solr-plugin">code for the plugin</a> is at Github and is still a work in progress.  I&#8217;m pushing towards a 0.1 release next week with the bulk of the work I still need to do in the form of documentation and clean-up.</p>
<p>So please watch the screencast, and I would love feedback.  I will certainly take offers to help continue the development of the plugin but would like to get 0.1 out first to round out my train of thought and not further delay that basic milestone. </p>
<p><object width="575" height="395"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9875630&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=9875630&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="575" height="395"></embed></object>
<p><a href="http://vimeo.com/9875630">Grails Solr Plugin pre-0.1 Demo</a> from <a href="http://vimeo.com/user229324">mbrevoort</a> on <a href="http://vimeo.com">Vimeo</a>.</p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-enjoy">
<ul class="socials">
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://mike.brevoort.com/2010/03/03/grails-solr-plugin-progress-screencast/&amp;t=Grails+Solr+Plugin+Progress+Screencast" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Grails+Solr+Plugin+Progress+Screencast+-+http://bit.ly/dk7SwJ+(via+@mbrevoort)" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://mike.brevoort.com/2010/03/03/grails-solr-plugin-progress-screencast/&amp;title=Grails+Solr+Plugin+Progress+Screencast&amp;summary=I%20started%20work%20on%20this%20plugin%20back%20in%20December%20based%20on%20the%20work%20I%20did%20for%C2%A0Patheos.com%20and%20by%20the%20graces%20of%20my%20employer%C2%A0Avalon%20Consulting%20LLC%20and%20Patheos%2C%20they%20allowed%20me%20to%20open%20source%20the%20plugin%20and%20continue%20working%20on%20it.%20This%20week%20I%20had%20some%20time%20to%20get%20back%20to%20it%2C%20and%20today%20I%20started%20creating&amp;source=m i k e  b r e v o o r t" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-friendfeed">
			<a href="http://www.friendfeed.com/share?title=Grails+Solr+Plugin+Progress+Screencast&amp;link=http://mike.brevoort.com/2010/03/03/grails-solr-plugin-progress-screencast/" rel="nofollow" title="Share this on FriendFeed">Share this on FriendFeed</a>
		</li>
		<li class="sexy-technorati">
			<a href="http://technorati.com/faves?add=http://mike.brevoort.com/2010/03/03/grails-solr-plugin-progress-screencast/" rel="nofollow" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://mike.brevoort.com/2010/03/03/grails-solr-plugin-progress-screencast/&amp;title=Grails+Solr+Plugin+Progress+Screencast" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-yahoobuzz">
			<a href="http://buzz.yahoo.com/submit/?submitUrl=http://mike.brevoort.com/2010/03/03/grails-solr-plugin-progress-screencast/&amp;submitHeadline=Grails+Solr+Plugin+Progress+Screencast&amp;submitSummary=I%20started%20work%20on%20this%20plugin%20back%20in%20December%20based%20on%20the%20work%20I%20did%20for%C2%A0Patheos.com%20and%20by%20the%20graces%20of%20my%20employer%C2%A0Avalon%20Consulting%20LLC%20and%20Patheos%2C%20they%20allowed%20me%20to%20open%20source%20the%20plugin%20and%20continue%20working%20on%20it.%20This%20week%20I%20had%20some%20time%20to%20get%20back%20to%20it%2C%20and%20today%20I%20started%20creating&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" title="Buzz up!">Buzz up!</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://mike.brevoort.com/2010/03/03/grails-solr-plugin-progress-screencast/&amp;title=Grails+Solr+Plugin+Progress+Screencast" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-mail">
			<a href="mailto:?subject=%22Grails%20Solr%20Plugin%20Progress%20Screencast%22&amp;body=I%20thought%20this%20article%20might%20interest%20you.%0A%0A%22I%20started%20work%20on%20this%20plugin%20back%20in%20December%20based%20on%20the%20work%20I%20did%20for%C2%A0Patheos.com%20and%20by%20the%20graces%20of%20my%20employer%C2%A0Avalon%20Consulting%20LLC%20and%20Patheos%2C%20they%20allowed%20me%20to%20open%20source%20the%20plugin%20and%20continue%20working%20on%20it.%20This%20week%20I%20had%20some%20time%20to%20get%20back%20to%20it%2C%20and%20today%20I%20started%20creating%22%0A%0AYou%20can%20read%20the%20full%20article%20here%3A%20http://mike.brevoort.com/2010/03/03/grails-solr-plugin-progress-screencast/" rel="nofollow" title="Email this to a friend?">Email this to a friend?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->

]]></content:encoded>
			<wfw:commentRss>http://mike.brevoort.com/2010/03/03/grails-solr-plugin-progress-screencast/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Issue negotiating SSL connections from Weblogic</title>
		<link>http://mike.brevoort.com/2010/02/16/issue-negotiating-ssl-connections-from-weblogic/</link>
		<comments>http://mike.brevoort.com/2010/02/16/issue-negotiating-ssl-connections-from-weblogic/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 03:41:25 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[weblogic]]></category>

		<guid isPermaLink="false">http://mike.brevoort.com/?p=240</guid>
		<description><![CDATA[This was one of those tough to track down issues that yielded very little in terms of actionable solutions vs. confirmation of similar problems while I Googled the problem symptoms.  I recently upgraded a Grails app from Weblogic 8 to 10.3. The app allowed users to upload videos to Youtube using the Youtube APIs, using [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fmike.brevoort.com%2F2010%2F02%2F16%2Fissue-negotiating-ssl-connections-from-weblogic%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fmike.brevoort.com%2F2010%2F02%2F16%2Fissue-negotiating-ssl-connections-from-weblogic%2F" height="61" width="51" /></a></div><p>This was one of those tough to track down issues that yielded very little in terms of actionable solutions vs. confirmation of similar problems while I <em>Googled</em> the problem symptoms.  I recently upgraded a Grails app from Weblogic 8 to 10.3. The app allowed users to upload videos to Youtube using the Youtube APIs, using <a href="http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html">ClientLogin</a> for authentication. The problem was after the upgrade the connection to <em>https://www.google.com/accounts/ClientLogin</em> was failing during the SSL negotiation phase.  The errors in the log were</p>
<blockquote><p><span style="font-family: 'courier new', monospace;">java.lang.IllegalStateException: Cipher not initialized<br />
at javax.crypto.Cipher.c(DashoA13*..)<br />
at javax.crypto.Cipher.update(DashoA13*..)<br />
at com.certicom.tls.provider.Cipher.update(Unknown Source)<br />
&#8230; </span></p></blockquote>
<p>and</p>
<blockquote><p><span style="font-family: 'courier new', monospace;">java.security.InvalidKeyException: Illegal key size</span></p></blockquote>
<p>Thankfully I found <a href="http://kr.forums.oracle.com/forums/thread.jspa?threadID=974009&amp;tstart=45">this thread</a> on a Korean Oracle forum. The solution is to add this JVM parameter:</p>
<blockquote><p><span style="font-family: 'courier new', monospace;">-Dweblogic.security.SSL.nojce=true</span></p></blockquote>
<p>This enables Weblogic to use a <a href="http://en.wikipedia.org/wiki/FIPS_140-2">FIPS 140-2 compliant</a> crypto module in the server&#8217;s SSL implementation.  FIPS 140-2 is a standard that describes U.S. Federal government requirements for sensitive, but unclassified use.</p>
<p>If you have this problem, I hope you stumble upon this post and it helps you.</p>
<p><span style="font-family: 'courier new', monospace;"><br />
</span></p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-enjoy">
<ul class="socials">
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://mike.brevoort.com/2010/02/16/issue-negotiating-ssl-connections-from-weblogic/&amp;t=Issue+negotiating+SSL+connections+from+Weblogic" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Issue+negotiating+SSL+connections+from+Weblogic+-+http://bit.ly/cXntnO+(via+@mbrevoort)" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://mike.brevoort.com/2010/02/16/issue-negotiating-ssl-connections-from-weblogic/&amp;title=Issue+negotiating+SSL+connections+from+Weblogic&amp;summary=This%20was%20one%20of%20those%20tough%20to%20track%20down%20issues%20that%20yielded%20very%20little%20in%20terms%20of%20actionable%20solutions%20vs.%20confirmation%20of%20similar%20problems%20while%20I%20Googled%20the%20problem%20symptoms.%20%C2%A0I%20recently%20upgraded%20a%20Grails%20app%20from%20Weblogic%208%20to%2010.3.%20The%20app%20allowed%20users%20to%20upload%20videos%20to%20Youtube%20using%20th&amp;source=m i k e  b r e v o o r t" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-friendfeed">
			<a href="http://www.friendfeed.com/share?title=Issue+negotiating+SSL+connections+from+Weblogic&amp;link=http://mike.brevoort.com/2010/02/16/issue-negotiating-ssl-connections-from-weblogic/" rel="nofollow" title="Share this on FriendFeed">Share this on FriendFeed</a>
		</li>
		<li class="sexy-technorati">
			<a href="http://technorati.com/faves?add=http://mike.brevoort.com/2010/02/16/issue-negotiating-ssl-connections-from-weblogic/" rel="nofollow" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://mike.brevoort.com/2010/02/16/issue-negotiating-ssl-connections-from-weblogic/&amp;title=Issue+negotiating+SSL+connections+from+Weblogic" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-yahoobuzz">
			<a href="http://buzz.yahoo.com/submit/?submitUrl=http://mike.brevoort.com/2010/02/16/issue-negotiating-ssl-connections-from-weblogic/&amp;submitHeadline=Issue+negotiating+SSL+connections+from+Weblogic&amp;submitSummary=This%20was%20one%20of%20those%20tough%20to%20track%20down%20issues%20that%20yielded%20very%20little%20in%20terms%20of%20actionable%20solutions%20vs.%20confirmation%20of%20similar%20problems%20while%20I%20Googled%20the%20problem%20symptoms.%20%C2%A0I%20recently%20upgraded%20a%20Grails%20app%20from%20Weblogic%208%20to%2010.3.%20The%20app%20allowed%20users%20to%20upload%20videos%20to%20Youtube%20using%20th&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" title="Buzz up!">Buzz up!</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://mike.brevoort.com/2010/02/16/issue-negotiating-ssl-connections-from-weblogic/&amp;title=Issue+negotiating+SSL+connections+from+Weblogic" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-mail">
			<a href="mailto:?subject=%22Issue%20negotiating%20SSL%20connections%20from%20Weblogic%22&amp;body=I%20thought%20this%20article%20might%20interest%20you.%0A%0A%22This%20was%20one%20of%20those%20tough%20to%20track%20down%20issues%20that%20yielded%20very%20little%20in%20terms%20of%20actionable%20solutions%20vs.%20confirmation%20of%20similar%20problems%20while%20I%20Googled%20the%20problem%20symptoms.%20%C2%A0I%20recently%20upgraded%20a%20Grails%20app%20from%20Weblogic%208%20to%2010.3.%20The%20app%20allowed%20users%20to%20upload%20videos%20to%20Youtube%20using%20th%22%0A%0AYou%20can%20read%20the%20full%20article%20here%3A%20http://mike.brevoort.com/2010/02/16/issue-negotiating-ssl-connections-from-weblogic/" rel="nofollow" title="Email this to a friend?">Email this to a friend?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->

]]></content:encoded>
			<wfw:commentRss>http://mike.brevoort.com/2010/02/16/issue-negotiating-ssl-connections-from-weblogic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DOSUG Solr in 5 Minutes Ingnite Presentation</title>
		<link>http://mike.brevoort.com/2010/02/04/dosug-solr-in-5-minutes-ingnite-presentation/</link>
		<comments>http://mike.brevoort.com/2010/02/04/dosug-solr-in-5-minutes-ingnite-presentation/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 14:57:41 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[dosug]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[solr]]></category>

		<guid isPermaLink="false">http://mike.brevoort.com/?p=229</guid>
		<description><![CDATA[On Tuesday (2/2/2010) I participated in the Denver Open Source User Group&#8217;s first Ignite night. My presentation was an quick overview of Solr, the java based open-source search engine.  This was my first Ignite style presentation, and the format is challenging! The presentations were each 5 minutes with a 20 slide deck auto advancing [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fmike.brevoort.com%2F2010%2F02%2F04%2Fdosug-solr-in-5-minutes-ingnite-presentation%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fmike.brevoort.com%2F2010%2F02%2F04%2Fdosug-solr-in-5-minutes-ingnite-presentation%2F" height="61" width="51" /></a></div><p>On Tuesday (2/2/2010) I participated in the <a href="http://www.denveropensource.org/">Denver Open Source User Group&#8217;s</a> first Ignite night. My presentation was an quick overview of <a href="http://lucene.apache.org/solr/">Solr</a>, the java based open-source search engine.  This was my first Ignite style presentation, and the format is challenging! The presentations were each 5 minutes with a 20 slide deck auto advancing every 15 seconds. I stumbled a bit out of the gate with the cold start but was able to get it back on the rails though I felt as if I was trying to dig myself out of quicksand through the rest of it. Overall it was a lot of fun.</p>
<p>The room was packed, somewhere in the neighborhood of 100 people, and overall the quality of the presentations were very good. You can check out the <a href="http://www.slideshare.net/group/denver-open-source-users-group">slide decks on Slideshare here</a>. Here are my slides:</p>
<p style="text-align: center;"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=id=3050502&amp;doc=11-brevoort-solr-dosug-ignite-100201194603-phpapp01" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><param name="wmode" value="transparent" /><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=id=3050502&amp;doc=11-brevoort-solr-dosug-ignite-100201194603-phpapp01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355" wmode="transparent"></embed></object></p>
<p>And here is a dry-run of my presentation I recorded while practicing the day of:</p>
<p style="text-align: center;"><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/ClhrrPzJWmI&#038;fs=1" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed src="http://www.youtube.com/v/ClhrrPzJWmI&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-enjoy">
<ul class="socials">
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://mike.brevoort.com/2010/02/04/dosug-solr-in-5-minutes-ingnite-presentation/&amp;t=DOSUG+Solr+in+5+Minutes+Ingnite+Presentation" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=DOSUG+Solr+in+5+Minutes+Ingnite+Presentation+-+http://bit.ly/dxXUL1+(via+@mbrevoort)" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://mike.brevoort.com/2010/02/04/dosug-solr-in-5-minutes-ingnite-presentation/&amp;title=DOSUG+Solr+in+5+Minutes+Ingnite+Presentation&amp;summary=On%20Tuesday%20%282%2F2%2F2010%29%20I%20participated%20in%20the%20Denver%20Open%20Source%20User%20Group%27s%20first%20Ignite%20night.%20My%20presentation%20was%20an%20quick%20overview%20of%20Solr%2C%20the%20java%20based%20open-source%20search%20engine.%20%20This%20was%20my%20first%20Ignite%20style%20presentation%2C%20and%20the%20format%20is%20challenging%21%20The%20presentations%20were%20each%205%20minutes%20&amp;source=m i k e  b r e v o o r t" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-friendfeed">
			<a href="http://www.friendfeed.com/share?title=DOSUG+Solr+in+5+Minutes+Ingnite+Presentation&amp;link=http://mike.brevoort.com/2010/02/04/dosug-solr-in-5-minutes-ingnite-presentation/" rel="nofollow" title="Share this on FriendFeed">Share this on FriendFeed</a>
		</li>
		<li class="sexy-technorati">
			<a href="http://technorati.com/faves?add=http://mike.brevoort.com/2010/02/04/dosug-solr-in-5-minutes-ingnite-presentation/" rel="nofollow" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://mike.brevoort.com/2010/02/04/dosug-solr-in-5-minutes-ingnite-presentation/&amp;title=DOSUG+Solr+in+5+Minutes+Ingnite+Presentation" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-yahoobuzz">
			<a href="http://buzz.yahoo.com/submit/?submitUrl=http://mike.brevoort.com/2010/02/04/dosug-solr-in-5-minutes-ingnite-presentation/&amp;submitHeadline=DOSUG+Solr+in+5+Minutes+Ingnite+Presentation&amp;submitSummary=On%20Tuesday%20%282%2F2%2F2010%29%20I%20participated%20in%20the%20Denver%20Open%20Source%20User%20Group%27s%20first%20Ignite%20night.%20My%20presentation%20was%20an%20quick%20overview%20of%20Solr%2C%20the%20java%20based%20open-source%20search%20engine.%20%20This%20was%20my%20first%20Ignite%20style%20presentation%2C%20and%20the%20format%20is%20challenging%21%20The%20presentations%20were%20each%205%20minutes%20&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" title="Buzz up!">Buzz up!</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://mike.brevoort.com/2010/02/04/dosug-solr-in-5-minutes-ingnite-presentation/&amp;title=DOSUG+Solr+in+5+Minutes+Ingnite+Presentation" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-mail">
			<a href="mailto:?subject=%22DOSUG%20Solr%20in%205%20Minutes%20Ingnite%20Presentation%22&amp;body=I%20thought%20this%20article%20might%20interest%20you.%0A%0A%22On%20Tuesday%20%282%2F2%2F2010%29%20I%20participated%20in%20the%20Denver%20Open%20Source%20User%20Group%27s%20first%20Ignite%20night.%20My%20presentation%20was%20an%20quick%20overview%20of%20Solr%2C%20the%20java%20based%20open-source%20search%20engine.%20%20This%20was%20my%20first%20Ignite%20style%20presentation%2C%20and%20the%20format%20is%20challenging%21%20The%20presentations%20were%20each%205%20minutes%20%22%0A%0AYou%20can%20read%20the%20full%20article%20here%3A%20http://mike.brevoort.com/2010/02/04/dosug-solr-in-5-minutes-ingnite-presentation/" rel="nofollow" title="Email this to a friend?">Email this to a friend?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->

]]></content:encoded>
			<wfw:commentRss>http://mike.brevoort.com/2010/02/04/dosug-solr-in-5-minutes-ingnite-presentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>This is Not Comcastic</title>
		<link>http://mike.brevoort.com/2009/10/10/this-is-not-comcastic/</link>
		<comments>http://mike.brevoort.com/2009/10/10/this-is-not-comcastic/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 06:40:34 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[comcast]]></category>

		<guid isPermaLink="false">http://mike.brevoort.com/?p=194</guid>
		<description><![CDATA[I wrote a script that pings the IP of the first node outside of my house into Comcast&#8217;s network.  It pings every two seconds and logs when the connection is up or down based on the ping success.  Last week Comcast came and checked my line and said everything looked great and that [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fmike.brevoort.com%2F2009%2F10%2F10%2Fthis-is-not-comcastic%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fmike.brevoort.com%2F2009%2F10%2F10%2Fthis-is-not-comcastic%2F" height="61" width="51" /></a></div><p>I wrote a script that pings the IP of the first node outside of my house into Comcast&#8217;s network.  It pings every two seconds and logs when the connection is up or down based on the ping success.  Last week Comcast came and checked my line and said everything looked great and that it may be the onslaught of the cold weather. I&#8217;ve been working through Comcast support via Twitter which has been sporadic but convenient when they respond.  Today I couldn&#8217;t get a response from them (<a href="http://twitter.com/comcastmelissa">@comcastmelissa</a> and <a href="http://twitter.com/comcaststeve">@comcaststeve</a>) and today sucked:</p>
<blockquote>
<pre>Fri Oct 09 08:20:12 MDT 2009 DOWN!
Fri Oct 09 08:23:41 MDT 2009 UP
Fri Oct 09 09:31:39 MDT 2009 DOWN!
Fri Oct 09 09:31:39 MDT 2009 UP
Fri Oct 09 09:32:15 MDT 2009 DOWN!
Fri Oct 09 09:32:26 MDT 2009 UP
Fri Oct 09 09:33:27 MDT 2009 DOWN!
Fri Oct 09 09:33:27 MDT 2009 UP
Fri Oct 09 09:33:48 MDT 2009 DOWN!
Fri Oct 09 09:33:48 MDT 2009 UP
Fri Oct 09 09:34:14 MDT 2009 DOWN!
Fri Oct 09 09:34:14 MDT 2009 UP
Fri Oct 09 09:34:30 MDT 2009 DOWN!
Fri Oct 09 09:34:30 MDT 2009 UP
Fri Oct 09 09:34:56 MDT 2009 DOWN!
Fri Oct 09 09:34:56 MDT 2009 UP
Fri Oct 09 09:36:13 MDT 2009 DOWN!
Fri Oct 09 09:36:13 MDT 2009 UP
Fri Oct 09 09:37:24 MDT 2009 DOWN!
Fri Oct 09 09:37:46 MDT 2009 UP
Fri Oct 09 09:38:42 MDT 2009 DOWN!
Fri Oct 09 09:38:42 MDT 2009 UP
Fri Oct 09 09:39:28 MDT 2009 DOWN!
Fri Oct 09 09:39:51 MDT 2009 UP
Fri Oct 09 09:41:37 MDT 2009 DOWN!
Fri Oct 09 09:41:37 MDT 2009 UP
Fri Oct 09 09:42:43 MDT 2009 DOWN!
Fri Oct 09 09:42:43 MDT 2009 UP
Fri Oct 09 09:44:50 MDT 2009 DOWN!
Fri Oct 09 09:44:50 MDT 2009 UP
Fri Oct 09 09:45:21 MDT 2009 DOWN!
Fri Oct 09 09:45:21 MDT 2009 UP
Fri Oct 09 09:46:02 MDT 2009 DOWN!
Fri Oct 09 09:46:13 MDT 2009 UP
Fri Oct 09 09:47:25 MDT 2009 DOWN!
Fri Oct 09 09:47:25 MDT 2009 UP
Fri Oct 09 09:47:56 MDT 2009 DOWN!
Fri Oct 09 09:47:56 MDT 2009 UP
Fri Oct 09 09:48:22 MDT 2009 DOWN!
Fri Oct 09 09:48:22 MDT 2009 UP
Fri Oct 09 09:50:08 MDT 2009 DOWN!
Fri Oct 09 09:50:08 MDT 2009 UP
Fri Oct 09 09:51:40 MDT 2009 DOWN!
Fri Oct 09 09:51:40 MDT 2009 UP
Fri Oct 09 09:52:06 MDT 2009 DOWN!
Fri Oct 09 09:52:06 MDT 2009 UP
Fri Oct 09 09:52:37 MDT 2009 DOWN!
Fri Oct 09 09:52:37 MDT 2009 UP
Fri Oct 09 09:53:08 MDT 2009 DOWN!
Fri Oct 09 09:53:08 MDT 2009 UP
Fri Oct 09 09:53:44 MDT 2009 DOWN!
Fri Oct 09 09:53:44 MDT 2009 UP
Fri Oct 09 09:54:25 MDT 2009 DOWN!
Fri Oct 09 09:54:25 MDT 2009 UP
Fri Oct 09 09:54:51 MDT 2009 DOWN!
Fri Oct 09 09:54:51 MDT 2009 UP
Fri Oct 09 09:55:38 MDT 2009 DOWN!
Fri Oct 09 09:55:49 MDT 2009 UP
Fri Oct 09 09:57:00 MDT 2009 DOWN!
Fri Oct 09 09:57:00 MDT 2009 UP
Fri Oct 09 09:57:16 MDT 2009 DOWN!
Fri Oct 09 09:57:16 MDT 2009 UP
Fri Oct 09 09:57:42 MDT 2009 DOWN!
Fri Oct 09 09:57:42 MDT 2009 UP
Fri Oct 09 09:57:58 MDT 2009 DOWN!
Fri Oct 09 09:57:58 MDT 2009 UP
Fri Oct 09 09:58:39 MDT 2009 DOWN!
Fri Oct 09 09:59:12 MDT 2009 UP
Fri Oct 09 09:59:28 MDT 2009 DOWN!
Fri Oct 09 09:59:28 MDT 2009 UP
Fri Oct 09 09:59:55 MDT 2009 DOWN!
Fri Oct 09 10:00:17 MDT 2009 UP
Fri Oct 09 10:00:43 MDT 2009 DOWN!
Fri Oct 09 10:00:43 MDT 2009 UP
Fri Oct 09 10:02:24 MDT 2009 DOWN!
Fri Oct 09 10:02:24 MDT 2009 UP
Fri Oct 09 10:02:45 MDT 2009 DOWN!
Fri Oct 09 10:02:45 MDT 2009 UP
Fri Oct 09 10:03:11 MDT 2009 DOWN!
Fri Oct 09 10:03:11 MDT 2009 UP
Fri Oct 09 10:03:37 MDT 2009 DOWN!
Fri Oct 09 10:03:37 MDT 2009 UP
Fri Oct 09 10:04:14 MDT 2009 DOWN!
Fri Oct 09 10:04:25 MDT 2009 UP
Fri Oct 09 10:04:56 MDT 2009 DOWN!
Fri Oct 09 10:04:56 MDT 2009 UP
Fri Oct 09 10:05:12 MDT 2009 DOWN!
Fri Oct 09 10:05:12 MDT 2009 UP
Fri Oct 09 10:05:33 MDT 2009 DOWN!
Fri Oct 09 10:05:55 MDT 2009 UP
Fri Oct 09 10:06:11 MDT 2009 DOWN!
Fri Oct 09 10:06:11 MDT 2009 UP
Fri Oct 09 10:06:27 MDT 2009 DOWN!
Fri Oct 09 10:06:49 MDT 2009 UP
Fri Oct 09 10:07:05 MDT 2009 DOWN!
Fri Oct 09 10:07:05 MDT 2009 UP
Fri Oct 09 10:07:21 MDT 2009 DOWN!
Fri Oct 09 10:07:32 MDT 2009 UP
Fri Oct 09 10:07:48 MDT 2009 DOWN!
Fri Oct 09 10:07:59 MDT 2009 UP
Fri Oct 09 10:08:15 MDT 2009 DOWN!
Fri Oct 09 10:08:37 MDT 2009 UP
Fri Oct 09 10:08:53 MDT 2009 DOWN!
Fri Oct 09 10:08:53 MDT 2009 UP
Fri Oct 09 10:09:14 MDT 2009 DOWN!
Fri Oct 09 10:09:14 MDT 2009 UP
Fri Oct 09 10:10:10 MDT 2009 DOWN!
Fri Oct 09 10:10:11 MDT 2009 UP
Fri Oct 09 10:10:37 MDT 2009 DOWN!
Fri Oct 09 10:10:37 MDT 2009 UP
Fri Oct 09 10:11:38 MDT 2009 DOWN!
Fri Oct 09 10:11:38 MDT 2009 UP
Fri Oct 09 10:13:04 MDT 2009 DOWN!
Fri Oct 09 10:13:04 MDT 2009 UP
Fri Oct 09 10:14:21 MDT 2009 DOWN!
Fri Oct 09 10:14:21 MDT 2009 UP
Fri Oct 09 10:15:07 MDT 2009 DOWN!
Fri Oct 09 10:15:07 MDT 2009 UP
Fri Oct 09 10:15:43 MDT 2009 DOWN!
Fri Oct 09 10:15:43 MDT 2009 UP
Fri Oct 09 10:15:59 MDT 2009 DOWN!
Fri Oct 09 10:15:59 MDT 2009 UP
Fri Oct 09 10:30:30 MDT 2009 DOWN!
Fri Oct 09 10:30:30 MDT 2009 UP
Fri Oct 09 10:30:56 MDT 2009 DOWN!
Fri Oct 09 10:30:56 MDT 2009 UP
Fri Oct 09 10:32:07 MDT 2009 DOWN!
Fri Oct 09 10:32:07 MDT 2009 UP
Fri Oct 09 10:33:18 MDT 2009 DOWN!
Fri Oct 09 10:33:18 MDT 2009 UP
Fri Oct 09 10:33:34 MDT 2009 DOWN!
Fri Oct 09 10:33:34 MDT 2009 UP
Fri Oct 09 10:36:26 MDT 2009 DOWN!
Fri Oct 09 10:36:26 MDT 2009 UP
Fri Oct 09 13:12:12 MDT 2009 DOWN!
Fri Oct 09 13:15:30 MDT 2009 UP
Fri Oct 09 13:52:12 MDT 2009 DOWN!
Fri Oct 09 13:53:08 MDT 2009 UP
Fri Oct 09 14:34:14 MDT 2009 DOWN!
Fri Oct 09 14:35:09 MDT 2009 UP
Fri Oct 09 15:08:11 MDT 2009 DOWN!
Fri Oct 09 15:11:29 MDT 2009 UP
Fri Oct 09 16:26:15 MDT 2009 DOWN!
Fri Oct 09 16:29:22 MDT 2009 UP
Fri Oct 09 17:26:26 MDT 2009 DOWN!
Fri Oct 09 17:26:26 MDT 2009 UP
Fri Oct 09 17:27:17 MDT 2009 DOWN!
Fri Oct 09 17:27:17 MDT 2009 UP
Fri Oct 09 17:29:14 MDT 2009 DOWN!
Fri Oct 09 17:29:14 MDT 2009 UP
Fri Oct 09 17:30:35 MDT 2009 DOWN!
Fri Oct 09 17:30:35 MDT 2009 UP
Fri Oct 09 17:31:21 MDT 2009 DOWN!
Fri Oct 09 17:31:22 MDT 2009 UP
Fri Oct 09 17:31:58 MDT 2009 DOWN!
Fri Oct 09 17:31:58 MDT 2009 UP
Fri Oct 09 17:33:14 MDT 2009 DOWN!
Fri Oct 09 17:33:14 MDT 2009 UP
Fri Oct 09 18:25:03 MDT 2009 DOWN!
Fri Oct 09 18:25:03 MDT 2009 UP</pre>
</blockquote>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-enjoy">
<ul class="socials">
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://mike.brevoort.com/2009/10/10/this-is-not-comcastic/&amp;t=This+is+Not+Comcastic" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=This+is+Not+Comcastic+-+http://bit.ly/3q1Hj2+(via+@mbrevoort)" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://mike.brevoort.com/2009/10/10/this-is-not-comcastic/&amp;title=This+is+Not+Comcastic&amp;summary=I%20wrote%20a%20script%20that%20pings%20the%20IP%20of%20the%20first%20node%20outside%20of%20my%20house%20into%20Comcast%27s%20network.%20%20It%20pings%20every%20two%20seconds%20and%20logs%20when%20the%20connection%20is%20up%20or%20down%20based%20on%20the%20ping%20success.%20%20Last%20week%20Comcast%20came%20and%20checked%20my%20line%20and%20said%20everything%20looked%20great%20and%20that%20it%20may%20be%20the%20onsla&amp;source=m i k e  b r e v o o r t" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-friendfeed">
			<a href="http://www.friendfeed.com/share?title=This+is+Not+Comcastic&amp;link=http://mike.brevoort.com/2009/10/10/this-is-not-comcastic/" rel="nofollow" title="Share this on FriendFeed">Share this on FriendFeed</a>
		</li>
		<li class="sexy-technorati">
			<a href="http://technorati.com/faves?add=http://mike.brevoort.com/2009/10/10/this-is-not-comcastic/" rel="nofollow" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://mike.brevoort.com/2009/10/10/this-is-not-comcastic/&amp;title=This+is+Not+Comcastic" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-yahoobuzz">
			<a href="http://buzz.yahoo.com/submit/?submitUrl=http://mike.brevoort.com/2009/10/10/this-is-not-comcastic/&amp;submitHeadline=This+is+Not+Comcastic&amp;submitSummary=I%20wrote%20a%20script%20that%20pings%20the%20IP%20of%20the%20first%20node%20outside%20of%20my%20house%20into%20Comcast%27s%20network.%20%20It%20pings%20every%20two%20seconds%20and%20logs%20when%20the%20connection%20is%20up%20or%20down%20based%20on%20the%20ping%20success.%20%20Last%20week%20Comcast%20came%20and%20checked%20my%20line%20and%20said%20everything%20looked%20great%20and%20that%20it%20may%20be%20the%20onsla&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" title="Buzz up!">Buzz up!</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://mike.brevoort.com/2009/10/10/this-is-not-comcastic/&amp;title=This+is+Not+Comcastic" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-mail">
			<a href="mailto:?subject=%22This%20is%20Not%20Comcastic%22&amp;body=I%20thought%20this%20article%20might%20interest%20you.%0A%0A%22I%20wrote%20a%20script%20that%20pings%20the%20IP%20of%20the%20first%20node%20outside%20of%20my%20house%20into%20Comcast%27s%20network.%20%20It%20pings%20every%20two%20seconds%20and%20logs%20when%20the%20connection%20is%20up%20or%20down%20based%20on%20the%20ping%20success.%20%20Last%20week%20Comcast%20came%20and%20checked%20my%20line%20and%20said%20everything%20looked%20great%20and%20that%20it%20may%20be%20the%20onsla%22%0A%0AYou%20can%20read%20the%20full%20article%20here%3A%20http://mike.brevoort.com/2009/10/10/this-is-not-comcastic/" rel="nofollow" title="Email this to a friend?">Email this to a friend?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->

]]></content:encoded>
			<wfw:commentRss>http://mike.brevoort.com/2009/10/10/this-is-not-comcastic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yammer, Socialcast, Present.ly&#8230; and SocialWok</title>
		<link>http://mike.brevoort.com/2009/10/10/yammer-socialcast-presently-and-socialwok/</link>
		<comments>http://mike.brevoort.com/2009/10/10/yammer-socialcast-presently-and-socialwok/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 06:16:25 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[microblogging]]></category>
		<category><![CDATA[social]]></category>

		<guid isPermaLink="false">http://mike.brevoort.com/?p=184</guid>
		<description><![CDATA[I&#8217;ve spent the last several weeks diving into many of the &#8220;enterprise&#8221;/private SaaS microblogging services available (a.k.a Twitter for the enterprise).  Wow it&#8217;s been quite a while since I blogged! I&#8217;ve spend most of my &#8220;sharing&#8221; time on Twitter the last year.
This all began when I was trying out the new &#8220;social&#8221; features of Confluence.  [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fmike.brevoort.com%2F2009%2F10%2F10%2Fyammer-socialcast-presently-and-socialwok%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fmike.brevoort.com%2F2009%2F10%2F10%2Fyammer-socialcast-presently-and-socialwok%2F" height="61" width="51" /></a></div><p>I&#8217;ve spent the last several weeks diving into many of the &#8220;enterprise&#8221;/private <a href="http://en.wikipedia.org/wiki/Software_as_a_Service">SaaS</a> <a href="http://en.wikipedia.org/wiki/Microblogging">microblogging</a> services available (a.k.a <a href="http://twitter.com">Twitter</a> for the enterprise).  Wow it&#8217;s been quite a while since I blogged! I&#8217;ve spend most of my &#8220;sharing&#8221; time on Twitter the last year.</p>
<p>This all began when I was trying out the new &#8220;social&#8221; features of <a href="http://www.atlassian.com/software/confluence/">Confluence</a>.  I really like confluence, and I like the new features like status updates and following other users, but it still is a bit limited.  So I started poking around and tried out <a href="http://socialtext.com">SocialText</a> and my first impression was that it felt disheveled; it&#8217;s much more than a micro-blogging platform and more comparable to Confluence in fact.  I decided to turn my focus on the more pure play microblogging apps.  So I began a series of twitter searches to see what people were mentioning most with respect to &#8220;enterprise twitter&#8221;, &#8220;micro-blogging&#8221;, etc.  So I decided to take a look at: <a href="http://yammer.com">Yammer</a>, <a href="http://socialcast.com">Socialcast</a> and <a href="http://presentlyapp.com/">Present.ly</a>.</p>
<p>I created accounts in each of these and invited a couple coworkers.  My general first impression of each was as follows.  Yammer was very clean and unintimidating; it felt like you could just jump in and start using it.  Socialcast&#8217;s UI turned me off right away as it &#8220;felt&#8221; a bit dated (a little petty I know, but a first impression none the less).  There seemed to be a little more to it than yammer with the categorizations and the ability to import from a list of outside services (Flickr, YouTube, Digg, Facebook, Slideshare, etc.).  Present.ly was the only one of the three to impose the 140 character status limit but would allow you to attach text or a file, and it was &#8220;busy&#8221;. There were giant question mark icons and @ symbols next to some updates.  Given these first impressions, I picked Yammer for my organizational experiment.  I wanted to see how micro-blogging fit culturally and within the dynamics of my organization.</p>
<p>So we&#8217;re trying out Yammer, but also spent some additional time with Present.ly and Socialcast.  Overall the micro-blogging &#8220;experiment&#8221; is going really well and here&#8217;s my quick take on each service.</p>
<div class="wp-caption alignleft" style="width: 135px"><a href="https://assets2.yammer.com/images/YammerIconApp126x126.jpg?1255141358"><img title="Yammer" src="https://assets2.yammer.com/images/YammerIconApp126x126.jpg?1255141358" alt="Yammer" width="125" height="126" /></a><p class="wp-caption-text">Yammer</p></div>
<p>Overall Yammer has a very low barrier to entry, easy to register and easy to begin contributing.  The feed can display as threaded or mixed chronological (like Twitter).  The threaded view is only a single level threading though.  Yammer comes in three levels: Basic (free), Silver ($3/user/mo) and Gold ($5/user/mo) and only has a SaaS hosting model so there is no longer a behind the firewall option.  Yammer segments your network strictly by email domain and you cannot invite members outside of your domain unless you are at a paid level.  At the Basic level each user &#8220;owns&#8221; their data where with the paid version the user owns the data and you can&#8217;t get an export of the data unless you are at the Gold level.</p>
<p>Yammer&#8217;s desktop client is mediocre and the search capability is basically dysfunctional.  There is a 3rd party Mac OS native application called <a href="http://erikhinterbichler.com/software/gabble/">Gabble</a> that is a big improvement over the official yammer desktop client.  You have a threaded view capability but no search capability.  There&#8217;s a Firefox extension that works much like the Twitter extension that  works well to keep you in the loop announcing &#8220;YAM&#8221; every time a new message was posted and twitter integration allowing twitter updates to flow into Yammer if you add the tag #yam to your tweet.  There&#8217;s <a href="https://www.yammer.com/company/applications">several other extension</a> that I didn&#8217;t try.  Yammer&#8217;s new iPhone app is really, really good.  There&#8217;s a push capability and the ability to post photos.  One of my coworkers said the <a href="http://nullwire.com/yowl">3rd party Android app </a>worked well, but as I tried to find a link for it at <a href="http://nullwire.com">nullwire</a> all of the information is gone and the site is pretty much stripped.</p>
<p>Yammer&#8217;s group capability allows for public or private groups and what is really nice is the ability for each user to specify notification preferences for each group (email, IM or SMS).  The profile has a good mix of data but doesn&#8217;t allow for custom fields.  There&#8217;s also a very nice self directed org chart feature that allows each user to specify who they report to, manage and work with.  I did not try the <a href="https://www.yammer.com/api_doc.html">API</a>.</p>
<div class="wp-caption alignleft" style="width: 290px"><a href="http://www.socialcast.com"><img title="Socialcast" src="http://c1.socialcastcontent.com/801245/assets1.socialcast.com/stylesheets/../images/corporate/logo_newlight.png" alt="Socialcast" width="280" height="53" /></a><p class="wp-caption-text">Socialcast</p></div>
<p>Though I didn&#8217;t pick Socialcast for the experiment, there&#8217;s something about them that makes me want to like them.  Maybe it&#8217;s how responsive and friendly they are (thanks <a href="http://twitter.com/carrieyoung">@carrieyoung</a> <a href="http://twitter.com/socialcast">@socialcast</a>); I don&#8217;t know.  This week <a href="http://blog.socialcast.com/%E2%80%9Ca-whole-new-experience%E2%80%9D-%E2%80%93-the-debut-of-the-latest-socialcast-platform/">Socialcast released a new version</a> that included a a UI overhaul which is MUCH better.  They also launched a <a href="http://blog.socialcast.com/socialcast-introduces-social-business-intelligence%C2%AE-microblogging-analytics/">Social Business Intelligence</a> capability that looks really compelling.  With Socialcast you own your own data and can request a full data export even in the free version.  They offer two <a href="http://www.socialcast.com/enterprise.html">version</a>s: Basic (Free, SaaS) and Enterprise (Behind the firewall virtual appliance, price? offered as SaaS as well?).  Even in the basic version you can &#8220;claim&#8221; your administration rights and then set your theme, upload a custom logo, manage various metadata and view reports.  You can also send a broadcast messages to the entire community.</p>
<p>In Socialcast you can create custom streams based on people or tags/keywords.  There is similar group functionality as in Yammer, but Socialcast doesn&#8217;t have the custom notification settings I liked in Yammer.  The profile is similar to Yammer though you can add custom profile questions.</p>
<p>The desktop app is functional, bland from a UI perspective.  You can&#8217;t seem to filter by custom streams or groups but you can filter by categories or types of messages.  The search works much better than Yammer&#8217;s desktop search.  They have an iPhone optimized mobile site that works well, but no native mobile apps.  They do have a nice Google gadget though that&#8217;s perfect for those organizations using Google Apps.   The REST API looks very capable.</p>
<div class="wp-caption alignleft" style="width: 255px"><a href="http://presentlyapp.com/"><img title="Present.ly" src="http://presentlyapp.com/images/logo_presently_header.png" alt="Present.ly" width="245" height="50" /></a><p class="wp-caption-text">Present.ly</p></div>
<p>I spent the least amount of time using Present.ly though it is a very capable service as well.  There is a free SaaS version and an enterprise behind the firewall version with <a href="http://presentlyapp.com/enterprise/pricing">perpetual licenses by number of users</a>.  Even the free version has a superior array of configurability allowing you to set custom mail servers, LDAP servers, etc.  There&#8217;s a nice array of <a href="http://presentlyapp.com/native_apps">apps</a> including an iPhone, Android, Blackberry and Windows mobile versions.  I did discover that if you upload a video file (in this case an avi) that Present.ly would process it and render in an integrated player &#8211; that was sweet.</p>
<div class="wp-caption alignleft" style="width: 253px"><a href="http://www.socialwok.com/"><img title="SocialWok" src="http://www.socialwok.com/themes/socialwok/images/logo.png" alt="SocialWok" width="243" height="47" /></a><p class="wp-caption-text">SocialWok</p></div>
<p>At the tail end of my research I stumbled upon <a href="http://socialwok.com/">SocialWok</a> &#8211; basically a social app for <a href="http://www.google.com/apps/">Google Apps</a> that runs on Google App Engine.  Since we use Google Apps internally I was excited by the prospect of this app.  With many thousands of companies using Google Apps, already having taken the SaaS cloud plunge, I believe SocialWok is in an incredible sweet spot.  IMO there&#8217;s still some key areas of development to be done, specifically there are not private groups and though the UI is a blatant (and intentional) Google copy it&#8217;s still rough around the edges in places.  However, the core functionality is there and there&#8217;s a solid foundation to build on.  I&#8217;m certainly going to keep my eye on SocialWok.</p>
<p>Overall I learned a lot from my survey of these services.  Yammer was the simplest to use and had a stable of applications and even some 3rd party apps.  They seem to have the most momentum and the largest user base.  Thus you have to pay for data &#8220;ownership&#8221;, the ability to export, etc. Socialcast in my mind is the most exciting given their new Social Business Intelligence capabilities and the strength of their platform as a whole.  Like I said before, for some reason I just like them.  Present.ly seems very capable and would certainly warrant more time if I had it.  SocialWok has reinvented itself exclusively for Google Apps, and they are going to develop the hell out of the niche they are in.</p>
<p>So there are some key differences between each of these services, some others I didn&#8217;t mention and many features and capabilities that I just didn&#8217;t have time to mention.  In truth I just scratched the surface.  The best way to learn about these services is to sign up for account and try them out first hand.  It&#8217;s so easy to get going that it&#8217;s scary.  I can only imagine that there are 1000&#8217;s of rogue yammer communities out there operating under the noses of organizations.  These things can be very difficult to control once they proliferate.  Now I wonder when Twitter will join the party?  With a $1B valuation and very little revenue you would think that enterprise micro-blogging would be a strategic opportunity for growth&#8230;</p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-enjoy">
<ul class="socials">
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://mike.brevoort.com/2009/10/10/yammer-socialcast-presently-and-socialwok/&amp;t=Yammer%2C+Socialcast%2C+Present.ly...+and+SocialWok" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Yammer%2C+Socialcast%2C+Present.ly...+and+SocialWok+-+http://bit.ly/ONR7w+(via+@mbrevoort)" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://mike.brevoort.com/2009/10/10/yammer-socialcast-presently-and-socialwok/&amp;title=Yammer%2C+Socialcast%2C+Present.ly...+and+SocialWok&amp;summary=I%27ve%20spent%20the%20last%20several%20weeks%20diving%20into%20many%20of%20the%20%22enterprise%22%2Fprivate%20SaaS%20microblogging%20services%20available%20%28a.k.a%20Twitter%20for%20the%20enterprise%29.%20%C2%A0Wow%20it%27s%20been%20quite%20a%20while%20since%20I%20blogged%21%20I%27ve%20spend%20most%20of%20my%20%22sharing%22%20time%20on%20Twitter%20the%20last%20year.%0D%0A%0D%0AThis%20all%20began%20when%20I%20was%20trying%20o&amp;source=m i k e  b r e v o o r t" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-friendfeed">
			<a href="http://www.friendfeed.com/share?title=Yammer%2C+Socialcast%2C+Present.ly...+and+SocialWok&amp;link=http://mike.brevoort.com/2009/10/10/yammer-socialcast-presently-and-socialwok/" rel="nofollow" title="Share this on FriendFeed">Share this on FriendFeed</a>
		</li>
		<li class="sexy-technorati">
			<a href="http://technorati.com/faves?add=http://mike.brevoort.com/2009/10/10/yammer-socialcast-presently-and-socialwok/" rel="nofollow" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://mike.brevoort.com/2009/10/10/yammer-socialcast-presently-and-socialwok/&amp;title=Yammer%2C+Socialcast%2C+Present.ly...+and+SocialWok" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-yahoobuzz">
			<a href="http://buzz.yahoo.com/submit/?submitUrl=http://mike.brevoort.com/2009/10/10/yammer-socialcast-presently-and-socialwok/&amp;submitHeadline=Yammer%2C+Socialcast%2C+Present.ly...+and+SocialWok&amp;submitSummary=I%27ve%20spent%20the%20last%20several%20weeks%20diving%20into%20many%20of%20the%20%22enterprise%22%2Fprivate%20SaaS%20microblogging%20services%20available%20%28a.k.a%20Twitter%20for%20the%20enterprise%29.%20%C2%A0Wow%20it%27s%20been%20quite%20a%20while%20since%20I%20blogged%21%20I%27ve%20spend%20most%20of%20my%20%22sharing%22%20time%20on%20Twitter%20the%20last%20year.%0D%0A%0D%0AThis%20all%20began%20when%20I%20was%20trying%20o&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" title="Buzz up!">Buzz up!</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://mike.brevoort.com/2009/10/10/yammer-socialcast-presently-and-socialwok/&amp;title=Yammer%2C+Socialcast%2C+Present.ly...+and+SocialWok" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-mail">
			<a href="mailto:?subject=%22Yammer%2C%20Socialcast%2C%20Present.ly...%20and%20SocialWok%22&amp;body=I%20thought%20this%20article%20might%20interest%20you.%0A%0A%22I%27ve%20spent%20the%20last%20several%20weeks%20diving%20into%20many%20of%20the%20%22enterprise%22%2Fprivate%20SaaS%20microblogging%20services%20available%20%28a.k.a%20Twitter%20for%20the%20enterprise%29.%20%C2%A0Wow%20it%27s%20been%20quite%20a%20while%20since%20I%20blogged%21%20I%27ve%20spend%20most%20of%20my%20%22sharing%22%20time%20on%20Twitter%20the%20last%20year.%0D%0A%0D%0AThis%20all%20began%20when%20I%20was%20trying%20o%22%0A%0AYou%20can%20read%20the%20full%20article%20here%3A%20http://mike.brevoort.com/2009/10/10/yammer-socialcast-presently-and-socialwok/" rel="nofollow" title="Email this to a friend?">Email this to a friend?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->

]]></content:encoded>
			<wfw:commentRss>http://mike.brevoort.com/2009/10/10/yammer-socialcast-presently-and-socialwok/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Making Relative URLs Absolute with Groovy</title>
		<link>http://mike.brevoort.com/2008/12/21/making-relative-urls-absolute-with-groovy/</link>
		<comments>http://mike.brevoort.com/2008/12/21/making-relative-urls-absolute-with-groovy/#comments</comments>
		<pubDate>Sun, 21 Dec 2008 22:47:11 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://mike.brevoort.com/?p=165</guid>
		<description><![CDATA[I’m working on a project where I am using Grails as a content delivery layer for an XML based content management system.  The content management system has the ability to publish XHTML content with inline links and images; however the inline img and a tags reference the content as relative paths.  I need the links [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fmike.brevoort.com%2F2008%2F12%2F21%2Fmaking-relative-urls-absolute-with-groovy%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fmike.brevoort.com%2F2008%2F12%2F21%2Fmaking-relative-urls-absolute-with-groovy%2F" height="61" width="51" /></a></div><p>I’m working on a project where I am using <a href="http://grails.org">Grails</a> as a content delivery layer for an XML based content management system.  The content management system has the ability to publish XHTML content with inline links and images; however the inline img and a tags reference the content as relative paths.  I need the links to internal pages to be absolute from the server root (ie /sub/content.html rather than sub/content.html) and I am hosting all static content like images at <a href="http://aws.amazon.com/s3/">Amazon S3</a> so I need the image links to be absolute to a different DNS name (ie http://media.mywebsite.com/images/image.jpg rather than images/image.jpg).
</p>
<p>Instead of implementing some hacks in the CMS itself, I opted to do the transformation in Grails as the content was rendered allowing greater flexibility.  I created a taglib for rendering the XHTML block that does a <a href="http://groovy.codehaus.org/Regular+Expressions">Groovy replaceAll with regular expressions</a>.  The tag gets called like this: &lt;g:processXHTML content=&#8221;${content.mainBody.text()}&#8221;/&gt; .  My <a href="http://grails.org/doc/1.0.x/guide/6.%20The%20Web%20Layer.html#6.2%20Groovy%20Server%20Pages">GSP</a> has reference to a content variable that is an <a href="http://groovy.codehaus.org/Reading+XML+using+Groovy%27s+XmlSlurper">XMLSlurped</a> xml document with a mainBody tag.  Here is the code for the tag:
</p>
<pre class="brush: java">
/**
 * Given XHTML content will return the same content with any relative a tag hrefs prefixed with a /
 * and any relative images prefixed with the mediaURL
 */

def processIngeniuxXHTML = {attrs -&gt;
  def content = attrs.content
  def rootURL = grailsApplication.config.mediaURL

  if (content) {
    // first look for links within the content that are relative URLS and prefix with a slash so they are
    // resolved from the root rather than the current context
    def regex = /(&lt; \s*a\s+[^&gt;]*href\s*=\s*[\&quot;&#039;])(?!http)([^\&quot;&#039;&gt;]+)[\&quot;&#039;&gt;]/
    def replace = { fullMatch, a, b -&gt;
      if (b[0] != &quot;/&quot;){
        // for some reason it&#039;s not outputing the closing quote so I added it at then end explicitly
        &quot;${a}/${b}\&quot;&quot;
      } else
        &quot;${fullMatch}&quot;
    }

    content = content.replaceAll(regex, replace)

    // second if there are any images referenced with relative URLs, prefix with the DNS for the S3 bucket
    regex = /(&lt; \s*img\s+[^&gt;]*src\s*=\s*[\&quot;&#039;])(?!http)([^\&quot;&#039;&gt;]+)[\&quot;&#039;&gt;]/
    replace = { fullMatch, a, b -&gt;
      if (b[0] != &quot;/&quot;){
        // for some reason it&#039;s not outputing the closing quote so I added it at then end explicitly
        &quot;${a}${rootURL}/${b}\&quot;&quot;
      } else
        &quot;${fullMatch}&quot;
    }

    out &lt; &lt; content.replaceAll(regex, replace)
  }
}
</pre>
<p>And here are the test conditions to demonstrate what&#8217;s expected:</p>
<pre class="brush: java">
void testProcessXHTML() {
  ContentUtilTagLib tl = new ContentUtilTagLib()

  def i = &quot;&quot;&quot;&lt;div&gt;&lt;a href=&quot;Explore/test&quot;/&gt;&quot;&quot;&quot;
  def o = &quot;&quot;&quot;&lt;div&gt;&lt;a href=&quot;/Explore/test&quot;/&gt;&lt;/div&gt;&quot;&quot;&quot;

  tl.processXHTML(content: i)
  assertEquals o, out.toString()
  out.getBuffer().setLength(0)

  i = &quot;&quot;&quot;&lt;div&gt;&lt;a alt=&quot;blah&quot; href=&quot;Explore/test&quot;/&gt;&lt;/div&gt;&quot;&quot;&quot;
  o = &quot;&quot;&quot;&lt;div&gt;&lt;a alt=&quot;blah&quot; href=&quot;/Explore/test&quot;/&gt;&lt;/div&gt;&quot;&quot;&quot;

  tl.processXHTML(content: i)
  assertEquals o, out.toString()
  out.getBuffer().setLength(0)

  i = &quot;&quot;&quot;&lt;div&gt;&lt;a href=&quot;Explore/test&quot;/&gt;&lt;img width=&quot;100&quot; src=&quot;myImage/a.jpg&quot;/&gt;&lt;/div&gt;&quot;&quot;&quot;
  o = &quot;&quot;&quot;&lt;div&gt;&lt;a href=&quot;/Explore/test&quot;/&gt;&lt;img width=&quot;100&quot; src=&quot;http://stub/myImage/a.jpg&quot;/&gt;&lt;/div&gt;&quot;&quot;&quot;

  tl.processXHTML(content: i)
  assertEquals o, out.toString()
  out.getBuffer().setLength(0)

  i = &quot;&quot;&quot;&lt;div&gt;&lt;a href=&quot;/Explore/test&quot;/&gt;&lt;/div&gt;&quot;&quot;&quot;
  o = &quot;&quot;&quot;&lt;div&gt;&lt;a href=&quot;/Explore/test&quot;/&gt;&lt;/div&gt;&quot;&quot;&quot;

  tl.processXHTML(content: i)
  assertEquals o, out.toString()
  out.getBuffer().setLength(0)

  i = &quot;&quot;&quot;&lt;div&gt;&lt;a href=&quot;http://Explore/test&quot;/&gt;&lt;img width=&quot;100&quot; src=&quot;http://anotherhost/myImage/a.jpg&quot;/&gt;&lt;/div&gt;&quot;&quot;&quot;
  o = &quot;&quot;&quot;&lt;div&gt;&lt;a href=&quot;http://Explore/test&quot;/&gt;&lt;img width=&quot;100&quot; src=&quot;http://anotherhost/myImage/a.jpg&quot;/&gt;&lt;/div&gt;&quot;&quot;&quot;

  tl.processXHTML(content: i)
  assertEquals o, out.toString()
  out.getBuffer().setLength(0)

}
</pre>
<p>More related to this project to come&#8230;</p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-enjoy">
<ul class="socials">
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://mike.brevoort.com/2008/12/21/making-relative-urls-absolute-with-groovy/&amp;t=Making+Relative+URLs+Absolute+with+Groovy" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Making+Relative+URLs+Absolute+with+Groovy+-+http://bit.ly/32ip32+(via+@mbrevoort)" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://mike.brevoort.com/2008/12/21/making-relative-urls-absolute-with-groovy/&amp;title=Making+Relative+URLs+Absolute+with+Groovy&amp;summary=I%E2%80%99m%20working%20on%20a%20project%20where%20I%20am%20using%20Grails%20as%20a%20content%20delivery%20layer%20for%20an%20XML%20based%20content%20management%20system.%C2%A0%20The%20content%20management%20system%20has%20the%20ability%20to%20publish%20XHTML%20content%20with%20inline%20links%20and%20images%3B%20however%20the%20inline%20img%20and%20a%20tags%20reference%20the%20content%20as%20relative%20paths.&amp;source=m i k e  b r e v o o r t" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-friendfeed">
			<a href="http://www.friendfeed.com/share?title=Making+Relative+URLs+Absolute+with+Groovy&amp;link=http://mike.brevoort.com/2008/12/21/making-relative-urls-absolute-with-groovy/" rel="nofollow" title="Share this on FriendFeed">Share this on FriendFeed</a>
		</li>
		<li class="sexy-technorati">
			<a href="http://technorati.com/faves?add=http://mike.brevoort.com/2008/12/21/making-relative-urls-absolute-with-groovy/" rel="nofollow" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://mike.brevoort.com/2008/12/21/making-relative-urls-absolute-with-groovy/&amp;title=Making+Relative+URLs+Absolute+with+Groovy" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-yahoobuzz">
			<a href="http://buzz.yahoo.com/submit/?submitUrl=http://mike.brevoort.com/2008/12/21/making-relative-urls-absolute-with-groovy/&amp;submitHeadline=Making+Relative+URLs+Absolute+with+Groovy&amp;submitSummary=I%E2%80%99m%20working%20on%20a%20project%20where%20I%20am%20using%20Grails%20as%20a%20content%20delivery%20layer%20for%20an%20XML%20based%20content%20management%20system.%C2%A0%20The%20content%20management%20system%20has%20the%20ability%20to%20publish%20XHTML%20content%20with%20inline%20links%20and%20images%3B%20however%20the%20inline%20img%20and%20a%20tags%20reference%20the%20content%20as%20relative%20paths.&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" title="Buzz up!">Buzz up!</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://mike.brevoort.com/2008/12/21/making-relative-urls-absolute-with-groovy/&amp;title=Making+Relative+URLs+Absolute+with+Groovy" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-mail">
			<a href="mailto:?subject=%22Making%20Relative%20URLs%20Absolute%20with%20Groovy%22&amp;body=I%20thought%20this%20article%20might%20interest%20you.%0A%0A%22I%E2%80%99m%20working%20on%20a%20project%20where%20I%20am%20using%20Grails%20as%20a%20content%20delivery%20layer%20for%20an%20XML%20based%20content%20management%20system.%C2%A0%20The%20content%20management%20system%20has%20the%20ability%20to%20publish%20XHTML%20content%20with%20inline%20links%20and%20images%3B%20however%20the%20inline%20img%20and%20a%20tags%20reference%20the%20content%20as%20relative%20paths.%22%0A%0AYou%20can%20read%20the%20full%20article%20here%3A%20http://mike.brevoort.com/2008/12/21/making-relative-urls-absolute-with-groovy/" rel="nofollow" title="Email this to a friend?">Email this to a friend?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->

]]></content:encoded>
			<wfw:commentRss>http://mike.brevoort.com/2008/12/21/making-relative-urls-absolute-with-groovy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NFJS Rocky Mountain Software Symposium Debrief</title>
		<link>http://mike.brevoort.com/2008/11/17/nfjs-rocky-mountain-software-symposium-debrief/</link>
		<comments>http://mike.brevoort.com/2008/11/17/nfjs-rocky-mountain-software-symposium-debrief/#comments</comments>
		<pubDate>Mon, 17 Nov 2008 06:45:25 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[hudson]]></category>
		<category><![CDATA[nfjs]]></category>

		<guid isPermaLink="false">http://mike.brevoort.com/?p=164</guid>
		<description><![CDATA[This weekend I attended the NFJS Rocky Mountain Software Symposium in Lone Tree, CO.  It was hard to pass up a NFJS conference that&#8217;s 15 minutes from home.  Overall the sessions were excellent.  There wasn&#8217;t a single session I attended that sucked or was a waste of time, a first for any conference I&#8217;ve attended.  [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fmike.brevoort.com%2F2008%2F11%2F17%2Fnfjs-rocky-mountain-software-symposium-debrief%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fmike.brevoort.com%2F2008%2F11%2F17%2Fnfjs-rocky-mountain-software-symposium-debrief%2F" height="61" width="51" /></a></div><p>This weekend I attended the <a href="http://www.nofluffjuststuff.com">NFJS</a> <a href="http://www.nofluffjuststuff.com/conference/denver/2008/11/index.html">Rocky Mountain Software Symposium</a> in Lone Tree, CO.  It was hard to pass up a NFJS conference that&#8217;s 15 minutes from home.  Overall the sessions were excellent.  There wasn&#8217;t a single session I attended that sucked or was a waste of time, a first for any conference I&#8217;ve attended.  I seemed to gravitate toward sessions by <a href="http://kensipe.blogspot.com/">Ken Sipe</a> and <a href="http://blog.thinkrelevance.com/">Stu Halloway</a> followed by Groovy and Grails presentations by <a href="http://javajeff.blogspot.com/">Jeff Brown</a> and <a href="http://www.davisworld.org/blojsom/blog/">Scott Davis</a>.</p>
<p>I gleaned several consistent overarching themes at the conference:</p>
<ul>
<li>Java is essentially Dead (<a href="http://blog.thinkrelevance.com/">Stu Halloway</a> leading this sentiment)</li>
<li>BUT the JVM is alive and well.  In fact the JVM has transitioned from a write once run <span style="text-decoration: underline;">Java</span> anywhere runtime to a dynamic platform for many languages (<a href="http://groovy.codehaus.org/">Groovy</a>, <a href="http://jruby.codehaus.org/">JRudy</a>, <a href="http://www.scala-lang.org/">Scala</a>, <a href="http://clojure.org/">Clojure</a>, Javascript, etc&#8230;. oh yeah and Java)</li>
<li>Not doing Test Driven Development is basically irresponsible, especially with the explosion of dynamic languages</li>
<li>Not doing Continuous Integration is basically irresponsible</li>
</ul>
<p>I learned the <a href="http://javajeff.blogspot.com/">Jeff Brown</a> has developed and is about to announce a new <a href="https://hudson.dev.java.net/">Hudson</a> plugin for building <a href="http://grails.org">Grails</a> projects in Hudson, a big and welcome improvement on <a href="http://mike.brevoort.com/2008/01/21/building-grails-applications-with-hudson/">specifying new ant targets</a>, using the shell script option or whatever.  Jeff also echoed much of what has already been said about the <a href="http://graemerocher.blogspot.com/2008/11/groovy-and-grails-join-spring-family.html">recent Spring Source acquisition of G2</a>:</p>
<ul>
<li>Deeper integration between Grails and Sprint MVC</li>
<li>The Groovy Spring bean builder will be moved into Spring</li>
<li>And of course there will be closer collaboration between the Groovy, Grails, and Spring development teams, though the team will remain distinct.</li>
</ul>
<p>I&#8217;m super excited about <a href="http://git.or.cz/">Git</a> though <a href="http://denverdev.blogspot.com/">Matt McCullough</a> urged me to take a look at <a href="http://www.selenic.com/mercurial/wiki/">Mercurial</a>&#8230;</p>
<p>Anyway, fantastic event and kudos to <a href="http://www.nofluffjuststuff.com">No Fluff Just Stuff</a>.</p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-enjoy">
<ul class="socials">
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://mike.brevoort.com/2008/11/17/nfjs-rocky-mountain-software-symposium-debrief/&amp;t=NFJS+Rocky+Mountain+Software+Symposium+Debrief" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=NFJS+Rocky+Mountain+Software+Symposium+Debrief+-+http://bit.ly/4djUP2+(via+@mbrevoort)" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://mike.brevoort.com/2008/11/17/nfjs-rocky-mountain-software-symposium-debrief/&amp;title=NFJS+Rocky+Mountain+Software+Symposium+Debrief&amp;summary=This%20weekend%20I%20attended%20the%20NFJS%20Rocky%20Mountain%20Software%20Symposium%20in%20Lone%20Tree%2C%20CO.%C2%A0%20It%20was%20hard%20to%20pass%20up%20a%20NFJS%20conference%20that%27s%2015%20minutes%20from%20home.%C2%A0%20Overall%20the%20sessions%20were%20excellent.%C2%A0%20There%20wasn%27t%20a%20single%20session%20I%20attended%20that%20sucked%20or%20was%20a%20waste%20of%20time%2C%20a%20first%20for%20any%20conferenc&amp;source=m i k e  b r e v o o r t" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-friendfeed">
			<a href="http://www.friendfeed.com/share?title=NFJS+Rocky+Mountain+Software+Symposium+Debrief&amp;link=http://mike.brevoort.com/2008/11/17/nfjs-rocky-mountain-software-symposium-debrief/" rel="nofollow" title="Share this on FriendFeed">Share this on FriendFeed</a>
		</li>
		<li class="sexy-technorati">
			<a href="http://technorati.com/faves?add=http://mike.brevoort.com/2008/11/17/nfjs-rocky-mountain-software-symposium-debrief/" rel="nofollow" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://mike.brevoort.com/2008/11/17/nfjs-rocky-mountain-software-symposium-debrief/&amp;title=NFJS+Rocky+Mountain+Software+Symposium+Debrief" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-yahoobuzz">
			<a href="http://buzz.yahoo.com/submit/?submitUrl=http://mike.brevoort.com/2008/11/17/nfjs-rocky-mountain-software-symposium-debrief/&amp;submitHeadline=NFJS+Rocky+Mountain+Software+Symposium+Debrief&amp;submitSummary=This%20weekend%20I%20attended%20the%20NFJS%20Rocky%20Mountain%20Software%20Symposium%20in%20Lone%20Tree%2C%20CO.%C2%A0%20It%20was%20hard%20to%20pass%20up%20a%20NFJS%20conference%20that%27s%2015%20minutes%20from%20home.%C2%A0%20Overall%20the%20sessions%20were%20excellent.%C2%A0%20There%20wasn%27t%20a%20single%20session%20I%20attended%20that%20sucked%20or%20was%20a%20waste%20of%20time%2C%20a%20first%20for%20any%20conferenc&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" title="Buzz up!">Buzz up!</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://mike.brevoort.com/2008/11/17/nfjs-rocky-mountain-software-symposium-debrief/&amp;title=NFJS+Rocky+Mountain+Software+Symposium+Debrief" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-mail">
			<a href="mailto:?subject=%22NFJS%20Rocky%20Mountain%20Software%20Symposium%20Debrief%22&amp;body=I%20thought%20this%20article%20might%20interest%20you.%0A%0A%22This%20weekend%20I%20attended%20the%20NFJS%20Rocky%20Mountain%20Software%20Symposium%20in%20Lone%20Tree%2C%20CO.%C2%A0%20It%20was%20hard%20to%20pass%20up%20a%20NFJS%20conference%20that%27s%2015%20minutes%20from%20home.%C2%A0%20Overall%20the%20sessions%20were%20excellent.%C2%A0%20There%20wasn%27t%20a%20single%20session%20I%20attended%20that%20sucked%20or%20was%20a%20waste%20of%20time%2C%20a%20first%20for%20any%20conferenc%22%0A%0AYou%20can%20read%20the%20full%20article%20here%3A%20http://mike.brevoort.com/2008/11/17/nfjs-rocky-mountain-software-symposium-debrief/" rel="nofollow" title="Email this to a friend?">Email this to a friend?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->

]]></content:encoded>
			<wfw:commentRss>http://mike.brevoort.com/2008/11/17/nfjs-rocky-mountain-software-symposium-debrief/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Rocky Mountain Software Symposium</title>
		<link>http://mike.brevoort.com/2008/11/14/rocky-mountain-software-symposium/</link>
		<comments>http://mike.brevoort.com/2008/11/14/rocky-mountain-software-symposium/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 05:51:35 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://mike.brevoort.com/?p=163</guid>
		<description><![CDATA[This weekend I&#8217;m attending the NFJS Rocky Mountain Software Symposium.  Today I attended a few really good sessions specifically Java Memory, Performance and the Garbage Collector presented by Ken Sipe and a very enthusiastic Groovy Metaprogramming tour by Scott Davis.  Though I&#8217;ve been using Groovy for quite a while, primarily inconjuction with Grails, Scott&#8217;s presentation [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fmike.brevoort.com%2F2008%2F11%2F14%2Frocky-mountain-software-symposium%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fmike.brevoort.com%2F2008%2F11%2F14%2Frocky-mountain-software-symposium%2F" height="61" width="51" /></a></div><p>This weekend I&#8217;m attending the <a href="http://www.nofluffjuststuff.com">NFJS</a> <a href="http://www.nofluffjuststuff.com/conference/denver/2008/11/index.html">Rocky Mountain Software Symposium</a>.  Today I attended a few really good sessions specifically Java Memory, Performance and the Garbage Collector presented by <a href="http://kensipe.blogspot.com/">Ken Sipe</a> and a very enthusiastic Groovy Metaprogramming tour by <a href="http://www.davisworld.org/blojsom/blog/">Scott Davis</a>.  Though I&#8217;ve been using Groovy for quite a while, primarily inconjuction with <a href="http://grails.org">Grails</a>, Scott&#8217;s presentation really helped fill some gaps for me.   Ken&#8217;s presentation on JVM memory managemant was a great primer.  I&#8217;m looking forward to profiling a few of the Grails apps I&#8217;m working on vith <a href="https://visualvm.dev.java.net/">VisualVM</a> to see how I can optimize New vs Old space as well as preset the PermGen space to speed up <a href="http://grails.org">Grails</a> start-up.</p>
<p>I&#8217;m looking forward to the coming two days of sessions though I REALLY could have used a weekend.  At least the conference is 15 minutes from home.  I&#8217;ll post my thoughts/reactions to the other session this weekend.</p>
<p>After a nudging from Ken during his presentation to &#8216;increase your digital footprint&#8217; and <a href="http://blogs.atlassian.com/rebelutionary/archives/2008/11/return_of_the_charlie.html">Cannon-Brookes return to blogging</a> (congrats on your <a href="http://blogs.atlassian.com/news/2008/11/come_with_me_on.html">recent position on the Gartner Magic Quadrant for Social Software</a> &#8211; well deserved&#8230;) I&#8217;m renewing my commitment to start blogging again and this time more focused on my &#8220;work&#8221; life, choosing to use Facebook for sharing personal updates.</p>
<p>Congrats to <a href="http://www.springsource.com/g2one">G2 for the Spring Source aquisition</a> and the release today of Grails 1.0.4.  And I just saw that the <a href="http://www.groovygrails.com/gg/2gexperience">Groovy/Grails Experience</a> has been scheduled for February 2009&#8230; in Denver!</p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-enjoy">
<ul class="socials">
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://mike.brevoort.com/2008/11/14/rocky-mountain-software-symposium/&amp;t=Rocky+Mountain+Software+Symposium" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Rocky+Mountain+Software+Symposium+-+http://bit.ly/1GsuP4+(via+@mbrevoort)" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://mike.brevoort.com/2008/11/14/rocky-mountain-software-symposium/&amp;title=Rocky+Mountain+Software+Symposium&amp;summary=This%20weekend%20I%27m%20attending%20the%20NFJS%20Rocky%20Mountain%20Software%20Symposium.%C2%A0%20Today%20I%20attended%20a%20few%20really%20good%20sessions%20specifically%20Java%20Memory%2C%20Performance%20and%20the%20Garbage%20Collector%20presented%20by%20Ken%20Sipe%20and%20a%20very%20enthusiastic%20Groovy%20Metaprogramming%20tour%20by%20Scott%20Davis.%C2%A0%20Though%20I%27ve%20been%20using%20Groo&amp;source=m i k e  b r e v o o r t" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-friendfeed">
			<a href="http://www.friendfeed.com/share?title=Rocky+Mountain+Software+Symposium&amp;link=http://mike.brevoort.com/2008/11/14/rocky-mountain-software-symposium/" rel="nofollow" title="Share this on FriendFeed">Share this on FriendFeed</a>
		</li>
		<li class="sexy-technorati">
			<a href="http://technorati.com/faves?add=http://mike.brevoort.com/2008/11/14/rocky-mountain-software-symposium/" rel="nofollow" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://mike.brevoort.com/2008/11/14/rocky-mountain-software-symposium/&amp;title=Rocky+Mountain+Software+Symposium" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-yahoobuzz">
			<a href="http://buzz.yahoo.com/submit/?submitUrl=http://mike.brevoort.com/2008/11/14/rocky-mountain-software-symposium/&amp;submitHeadline=Rocky+Mountain+Software+Symposium&amp;submitSummary=This%20weekend%20I%27m%20attending%20the%20NFJS%20Rocky%20Mountain%20Software%20Symposium.%C2%A0%20Today%20I%20attended%20a%20few%20really%20good%20sessions%20specifically%20Java%20Memory%2C%20Performance%20and%20the%20Garbage%20Collector%20presented%20by%20Ken%20Sipe%20and%20a%20very%20enthusiastic%20Groovy%20Metaprogramming%20tour%20by%20Scott%20Davis.%C2%A0%20Though%20I%27ve%20been%20using%20Groo&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" title="Buzz up!">Buzz up!</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://mike.brevoort.com/2008/11/14/rocky-mountain-software-symposium/&amp;title=Rocky+Mountain+Software+Symposium" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-mail">
			<a href="mailto:?subject=%22Rocky%20Mountain%20Software%20Symposium%22&amp;body=I%20thought%20this%20article%20might%20interest%20you.%0A%0A%22This%20weekend%20I%27m%20attending%20the%20NFJS%20Rocky%20Mountain%20Software%20Symposium.%C2%A0%20Today%20I%20attended%20a%20few%20really%20good%20sessions%20specifically%20Java%20Memory%2C%20Performance%20and%20the%20Garbage%20Collector%20presented%20by%20Ken%20Sipe%20and%20a%20very%20enthusiastic%20Groovy%20Metaprogramming%20tour%20by%20Scott%20Davis.%C2%A0%20Though%20I%27ve%20been%20using%20Groo%22%0A%0AYou%20can%20read%20the%20full%20article%20here%3A%20http://mike.brevoort.com/2008/11/14/rocky-mountain-software-symposium/" rel="nofollow" title="Email this to a friend?">Email this to a friend?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->

]]></content:encoded>
			<wfw:commentRss>http://mike.brevoort.com/2008/11/14/rocky-mountain-software-symposium/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Active Directory Authentication Part II</title>
		<link>http://mike.brevoort.com/2008/09/27/active-directory-authentication-part-ii/</link>
		<comments>http://mike.brevoort.com/2008/09/27/active-directory-authentication-part-ii/#comments</comments>
		<pubDate>Sat, 27 Sep 2008 06:19:01 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[active directory]]></category>
		<category><![CDATA[LDAP]]></category>

		<guid isPermaLink="false">http://mike.brevoort.com/?p=113</guid>
		<description><![CDATA[This is a long overdue follow-up to my Active Directory Authentication post.  I had all the best intentions of quickly following this post up with a second post so this is long overdue.  It&#8217;s been just over a year though so there are lots of cobwebs so this is going to be a [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fmike.brevoort.com%2F2008%2F09%2F27%2Factive-directory-authentication-part-ii%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fmike.brevoort.com%2F2008%2F09%2F27%2Factive-directory-authentication-part-ii%2F" height="61" width="51" /></a></div><p>This is a long overdue follow-up to my <a href="http://mike.brevoort.com/2007/09/25/active-directory-authentication/">Active Directory Authentication</a> post.  I had all the best intentions of quickly following this post up with a second post so this is long overdue.  It&#8217;s been just over a year though so there are lots of cobwebs so this is going to be a stream of consciousness dump&#8230;</p>
<p>First, there are two books that I found indespensible and the best resources I could find for detailed information about integrating with Active Directory and Windows security.  The LogonUser and SSPI approach I mentioned in my first post a year ago originated from these books.</p>
<ul>
<li><a href="http://www.amazon.com/Developers-Directory-Programming-Microsoft-Development/dp/0321350170/ref=pd_bxgy_b_text_b">The .NET Developer&#8217;s Guide to Directory Services Programming</a></li>
<li><a href="http://www.amazon.com/Developers-Windows-Security-Microsoft-Development/dp/0321228359/ref=pd_bbs_sr_3?ie=UTF8&#038;s=books&#038;qid=1222493272&#038;sr=8-3">The .NET Developer&#8217;s Guide to Windows Security</a></li>
</ul>
<p>In an effort to just get some follow-up out there since I tend to get regular inquiries about my original post, Here&#8217;s a <a href="http://mike.brevoort.com/wp-content/uploads/2008/09/adauthfiles.zip">zip file of some sanitized code</a> that includes the code for LogonUser, SSPI and a few other classes I used.<br />
In the end I settled on LogonUser which seemed to give the best overall performance in a very decentralized, many sub-domain environment.  There were also less anomalies as well.  When using SSPI I found that if typical authentication took 140ms, some calls were taking 60.140s and 120.140s in one or two domains.  This was rare and most likely a result of some sort of timeout and retry or fallback to another domain controller.  I was not able to identify the root cause. </p>
<p>One side note regarding the LogonUse API.  When the authentication type is set to &#8220;LOGON32 LOGON NETWORK&#8221; the LastLogon and LastLogonTimeStamp attributes on the domain controllers are not updated when authentication occurs.   If you have any logic that relies on these attributes (For example if you to run a script against AD to check for user account inactivity), change the authentication type to &#8220;LOGON32 LOGON INTERACTIVE&#8221; to have these attributes updated as expected.</p>
<p>Lastly to test the differences between the three authentication types, I created a method to log detailed information about each authentication attempt including: elapsed time, samAccountName, domain, authentication result, user ip, domain server authenticated against (if I could figure it out), authentication web server.  Without going into too much detail, I logged this info into a row in a database table on each attempt (this also inherently created a great resource for security auditing).  This way I could query the data very easily to roll-up statistics based on which domain, what server, the IP subnet of the user, particular users, etc.  Key to this though was to avoid any additional latency on the authentication request or a database dependency on the success of the authentication request, I created a BlockingQueue that waited for a log message to be placed on the queue and inserted it into the database.  This happened out of band in another thread and if there was some failure, the queue would just continue to grow until the problem was resolved.  This was very effective in measuring the performance of these different authentication methods.</p>
<p>Feel free to comment with any questions, I&#8217;ll do my best to recollect.  </p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-enjoy">
<ul class="socials">
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://mike.brevoort.com/2008/09/27/active-directory-authentication-part-ii/&amp;t=Active+Directory+Authentication+Part+II" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Active+Directory+Authentication+Part+II+-+http://bit.ly/4qmzMM+(via+@mbrevoort)" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://mike.brevoort.com/2008/09/27/active-directory-authentication-part-ii/&amp;title=Active+Directory+Authentication+Part+II&amp;summary=This%20is%20a%20long%20overdue%20follow-up%20to%20my%20Active%20Directory%20Authentication%20post.%20%20I%20had%20all%20the%20best%20intentions%20of%20quickly%20following%20this%20post%20up%20with%20a%20second%20post%20so%20this%20is%20long%20overdue.%20%20It%27s%20been%20just%20over%20a%20year%20though%20so%20there%20are%20lots%20of%20cobwebs%20so%20this%20is%20going%20to%20be%20a%20stream%20of%20consciousness%20d&amp;source=m i k e  b r e v o o r t" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-friendfeed">
			<a href="http://www.friendfeed.com/share?title=Active+Directory+Authentication+Part+II&amp;link=http://mike.brevoort.com/2008/09/27/active-directory-authentication-part-ii/" rel="nofollow" title="Share this on FriendFeed">Share this on FriendFeed</a>
		</li>
		<li class="sexy-technorati">
			<a href="http://technorati.com/faves?add=http://mike.brevoort.com/2008/09/27/active-directory-authentication-part-ii/" rel="nofollow" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://mike.brevoort.com/2008/09/27/active-directory-authentication-part-ii/&amp;title=Active+Directory+Authentication+Part+II" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-yahoobuzz">
			<a href="http://buzz.yahoo.com/submit/?submitUrl=http://mike.brevoort.com/2008/09/27/active-directory-authentication-part-ii/&amp;submitHeadline=Active+Directory+Authentication+Part+II&amp;submitSummary=This%20is%20a%20long%20overdue%20follow-up%20to%20my%20Active%20Directory%20Authentication%20post.%20%20I%20had%20all%20the%20best%20intentions%20of%20quickly%20following%20this%20post%20up%20with%20a%20second%20post%20so%20this%20is%20long%20overdue.%20%20It%27s%20been%20just%20over%20a%20year%20though%20so%20there%20are%20lots%20of%20cobwebs%20so%20this%20is%20going%20to%20be%20a%20stream%20of%20consciousness%20d&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" title="Buzz up!">Buzz up!</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://mike.brevoort.com/2008/09/27/active-directory-authentication-part-ii/&amp;title=Active+Directory+Authentication+Part+II" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-mail">
			<a href="mailto:?subject=%22Active%20Directory%20Authentication%20Part%20II%22&amp;body=I%20thought%20this%20article%20might%20interest%20you.%0A%0A%22This%20is%20a%20long%20overdue%20follow-up%20to%20my%20Active%20Directory%20Authentication%20post.%20%20I%20had%20all%20the%20best%20intentions%20of%20quickly%20following%20this%20post%20up%20with%20a%20second%20post%20so%20this%20is%20long%20overdue.%20%20It%27s%20been%20just%20over%20a%20year%20though%20so%20there%20are%20lots%20of%20cobwebs%20so%20this%20is%20going%20to%20be%20a%20stream%20of%20consciousness%20d%22%0A%0AYou%20can%20read%20the%20full%20article%20here%3A%20http://mike.brevoort.com/2008/09/27/active-directory-authentication-part-ii/" rel="nofollow" title="Email this to a friend?">Email this to a friend?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->

]]></content:encoded>
			<wfw:commentRss>http://mike.brevoort.com/2008/09/27/active-directory-authentication-part-ii/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Expanding on Jira&#8217;s LDAP Integration</title>
		<link>http://mike.brevoort.com/2008/04/08/syncing-jira-with-ldap/</link>
		<comments>http://mike.brevoort.com/2008/04/08/syncing-jira-with-ldap/#comments</comments>
		<pubDate>Tue, 08 Apr 2008 22:23:32 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[active directory]]></category>
		<category><![CDATA[Jira]]></category>
		<category><![CDATA[LDAP]]></category>

		<guid isPermaLink="false">http://mike.brevoort.com/?p=123</guid>
		<description><![CDATA[I recently had the opportunity to do a fresh installation of Atlassian Jira and was faced again with how to integrate Jira with LDAP (in this case Active Directory).  Jira does support simple authentication integration with LDAP via OSUser but requires that each LDAP user exist in Jira first.  So if an LDAP [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fmike.brevoort.com%2F2008%2F04%2F08%2Fsyncing-jira-with-ldap%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fmike.brevoort.com%2F2008%2F04%2F08%2Fsyncing-jira-with-ldap%2F" height="61" width="51" /></a></div><p>I recently had the opportunity to do a fresh installation of <a href="http://www.atlassian.com">Atlassian</a> <a href="http://www.atlassian.com/software/jira/">Jira</a> and was faced again with how to integrate Jira with LDAP (in this case Active Directory).  Jira does support <a href="http://www.atlassian.com/software/jira/docs/latest/ldap.html">simple authentication integration</a> with LDAP via <a href="http://www.opensymphony.com/osuser/">OSUser</a> but requires that each LDAP user exist in Jira first.  So if an LDAP user needs access to Jira, I have to go to Jira and create a new corresponding user record with the same user id as LDAP (sAMAccountName in this case).  Ideally I would like Jira to synchronize LDAP users based on some query filter.</p>
<p>Luckily Jira has a perfect way to address this &#8220;opportunity&#8221;: <a href="http://www.atlassian.com/software/jira/docs/latest/services.html">Services</a>.  Jira Services are asynchronous scheduled units of work configured to run within Jira.  I created a new service using JNDI called LDAPUserSyncService that can periodically query LDAP user objects based on configurable filter and create new Jira users for new users it finds in LDAP.  I also added the ability to put a subset of users in a group called &#8220;internal-users&#8221; for users whose email matched a particular domain.</p>
<p>Its pretty simple.  When the service runs, it queries LDAP, iterates through each user checking if the user already exists in LDAP, if not it created the user and puts it in the jira-users group and then checks if the email address contains myco.com (fictitious domain for this example) and if so put the user in the internal group as well.  I just realized as I&#8217;m writing this though that I didn&#8217;t do anything to handle paging or results if the number of users is greater than the max returned by LDAP.  Oh well, maybe another time&#8230;</p>
<pre class="prettyprint" style="line-height:normal;width:500px;font-size:11px;overflow:auto">
public class LDAPUserSyncService extends AbstractService {

    private static org.apache.log4j.Category log =
            org.apache.log4j.Category.getInstance(LDAPUserSyncService.class);

    public static String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory";
    public static String GROUP_INTERNAL =  "Internal-Users";
    public static String LDAP_USER_ID_ATTRIBUTE = "sAMAccountName";

    public void run() {
        try {
            log.debug("Running com.myco.jira.service.LDAPUserSyncService");
            String LDAP_HOST = getProperty("LDAP_HOST");
            String LDAP_USER = getProperty("LDAP_USER");
            String LDAP_PASSWORD = getProperty("LDAP_PASSWORD");
            String LDAP_SEARCHBASE = getProperty("LDAP_SEARCHBASE");
            String LDAP_FILTER = getProperty("LDAP_FILTER");   

            Hashtable env = new Hashtable();
            env.put(Context.INITIAL_CONTEXT_FACTORY, INITCTX);
            env.put(Context.PROVIDER_URL, LDAP_HOST);
            env.put(Context.SECURITY_AUTHENTICATION, "simple");
            env.put(Context.SECURITY_PRINCIPAL, LDAP_USER);
            env.put(Context.SECURITY_CREDENTIALS, LDAP_PASSWORD);

            DirContext ctx = new InitialDirContext(env);

            SearchControls constraints = new SearchControls();
            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

            NamingEnumeration results = ctx.search(LDAP_SEARCHBASE, LDAP_FILTER, constraints);

            while(results != null &#038;&#038; results.hasMore()) {
                SearchResult sr = (SearchResult) results.next();
                Attributes attrs = sr.getAttributes();
                log.debug("Processing " + attrs.get("dn"));

                // need sn, givenName, mail
                String first = (attrs.get("givenName") != null) ? (String) attrs.get("givenName").get() : null;
                String last = (attrs.get("sn") != null) ? (String) attrs.get("sn").get() : null;
                String mail = (attrs.get("mail") != null) ? (String) attrs.get("mail").get() : null;
                String userId = (attrs.get(LDAP_USER_ID_ATTRIBUTE) != null) ? (String) attrs.get(LDAP_USER_ID_ATTRIBUTE).get() : null;

                if(first != null &#038;&#038; last != null &#038;&#038; mail != null &#038;&#038; userId != null) {

                    // check if user is in Jira
                    if(!userExists(userId.toLowerCase())) {

                        // create user, if a myco company user then add to internal group
                        if(createJiraUser(userId, first, last, mail) != null) {
                            if(mail.contains("myco.com"))
                                addUserGroup(userId, GROUP_INTERNAL);
                        } else {
                            log.error("LDAP User " + userId + " could not be created");
                        }
                    }
                }
            }
        } catch (NamingException nex) {
            log.error("Caught exception trying to Synch LDAP Users: " + nex.toString());
        } catch (ObjectConfigurationException oce) {
            log.error("Caught exception trying to Synch LDAP Users.  Configuration setup failed: " + oce.toString());
        }
    }

    private User createJiraUser(String userId, String fname, String lname, String email) {

        UserManager userMgr = UserManager.getInstance();
        User osUser = null;
        try {
            osUser = userMgr.createUser(userId.toLowerCase());
            osUser.setFullName(fname + " " + lname);
            osUser.setEmail(email);

            Group jiraUserGroup = userMgr.getGroup("jira-users");
            osUser.addToGroup(jiraUserGroup);
            osUser.store();
            log.debug("Successfully added LDAP user "+ userId);
        } catch (ImmutableException e) {
            log.error("Error creating User in Jira: " + userId, e);
        } catch (DuplicateEntityException e) {
            log.error("Error creating User in Jira: " + userId, e);
        } catch (EntityNotFoundException e) {
            log.error("Could not find group jira-users.  Error creating User in Jira: " + userId, e);
        }

        // to be sure the user was created, return the reloaded user from Jira
        return osUser;

    }

    private boolean userExists(String userId) {
        UserManager userMgr = UserManager.getInstance();
        boolean exists = false;
        try {
            if(userMgr.getUser(userId) != null)
                exists = true;
        } catch (EntityNotFoundException e) {
            exists = false;
        }

        return exists;
    }

    private void addUserGroup(String userId, String groupName){
        UserManager userMgr = UserManager.getInstance();

        try {
            User osUser = userMgr.getUser(userId);

            Group group = userMgr.getGroup(groupName);
            osUser.addToGroup(group);
            osUser.store();
            log.debug("Successfully added LDAP user " + userId + " to group: " + groupName);
        } catch (ImmutableException e) {
            log.error("Error adding User to acis-users group: " + userId, e);
        } catch (EntityNotFoundException e) {
            log.error("Could not find group acis-users.  Error adding User to acis-users group:  " + userId, e);
        }
    }

    public ObjectConfiguration getObjectConfiguration() throws ObjectConfigurationException {
        return getObjectConfiguration("LDAPUSERSYNCSERVICE", "com/myco/jira/service/LDAPUserSyncService.xml", null);
    }
}
</pre>
<p>To configure a service within Jira navigate to Services in the System section of the Administration interface:<br />
<center><img src="/wp-content/uploads/2008/04/jira-services-menu.png" alt="" title="jira-services-menu" width="189" height="272" class="aligncenter size-full wp-image-124" /></center></p>
<p>Here I&#8217;ve added the service you can see the parameters that can be customized for the service:<br />
<img src="http://mike.brevoort.com/wp-content/uploads/2008/04/jira-service-ldap.png" alt="" title="jira-service-ldap" width="500" height="103" class="aligncenter size-full wp-image-125" /></p>
<p>The parameters are configured in an XML file that is referenced by the getObjectConfiguration() method in the service code above: </p>
<pre class="prettyprint" style="line-height:normal;width:500px;font-size:11px;overflow:auto">
&lt;debugservice id="LDAPUserSyncService"&gt;
    &lt;description&gt;
    &lt;/description&gt;
    &lt;properties&gt;

        &lt;property&gt;
            &lt;key&gt;LDAP_HOST&lt;/key&gt;
            &lt;name&gt;LDAP Host (format: ldap://myco.com:389)&lt;/name&gt;
            &lt;type&gt;string&lt;/type&gt;
        &lt;/property&gt;
        &lt;property&gt;
            &lt;key&gt;LDAP_USER&lt;/key&gt;
            &lt;name&gt;LDAP User DN&lt;/name&gt;
            &lt;type&gt;string&lt;/type&gt;
        &lt;/property&gt;
                &lt;property&gt;
            &lt;key&gt;LDAP_PASSWORD&lt;/key&gt;
            &lt;name&gt;LDAP Password)&lt;/name&gt;
            &lt;type&gt;string&lt;/type&gt;
        &lt;/property&gt;
        &lt;property&gt;
            &lt;key&gt;LDAP_SEARCHBASE&lt;/key&gt;
            &lt;name&gt;LDAP Search Base DN&lt;/name&gt;
            &lt;type&gt;string&lt;/type&gt;
        &lt;/property&gt;
        &lt;property&gt;
            &lt;key&gt;LDAP_FILTER&lt;/key&gt;
            &lt;name&gt;LDAP Search Filter&lt;/name&gt;
            &lt;type&gt;string&lt;/type&gt;
        &lt;/property&gt;

    &lt;/properties&gt;
&lt;/debugservice&gt;
</pre>
<p>And that&#8217;s it.  New users are automatically created in Jira within 30 minutes of being created in LDAP.  Ooo Rah.</p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-enjoy">
<ul class="socials">
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://mike.brevoort.com/2008/04/08/syncing-jira-with-ldap/&amp;t=Expanding+on+Jira%27s+LDAP+Integration" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Expanding+on+Jira%27s+LDAP+Integration+-+http://bit.ly/4DGBKw+(via+@mbrevoort)" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://mike.brevoort.com/2008/04/08/syncing-jira-with-ldap/&amp;title=Expanding+on+Jira%27s+LDAP+Integration&amp;summary=I%20recently%20had%20the%20opportunity%20to%20do%20a%20fresh%20installation%20of%20Atlassian%20Jira%20and%20was%20faced%20again%20with%20how%20to%20integrate%20Jira%20with%20LDAP%20%28in%20this%20case%20Active%20Directory%29.%20%20Jira%20does%20support%20simple%20authentication%20integration%20with%20LDAP%20via%20OSUser%20but%20requires%20that%20each%20LDAP%20user%20exist%20in%20Jira%20first.%20%20So%20if&amp;source=m i k e  b r e v o o r t" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-friendfeed">
			<a href="http://www.friendfeed.com/share?title=Expanding+on+Jira%27s+LDAP+Integration&amp;link=http://mike.brevoort.com/2008/04/08/syncing-jira-with-ldap/" rel="nofollow" title="Share this on FriendFeed">Share this on FriendFeed</a>
		</li>
		<li class="sexy-technorati">
			<a href="http://technorati.com/faves?add=http://mike.brevoort.com/2008/04/08/syncing-jira-with-ldap/" rel="nofollow" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://mike.brevoort.com/2008/04/08/syncing-jira-with-ldap/&amp;title=Expanding+on+Jira%27s+LDAP+Integration" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-yahoobuzz">
			<a href="http://buzz.yahoo.com/submit/?submitUrl=http://mike.brevoort.com/2008/04/08/syncing-jira-with-ldap/&amp;submitHeadline=Expanding+on+Jira%27s+LDAP+Integration&amp;submitSummary=I%20recently%20had%20the%20opportunity%20to%20do%20a%20fresh%20installation%20of%20Atlassian%20Jira%20and%20was%20faced%20again%20with%20how%20to%20integrate%20Jira%20with%20LDAP%20%28in%20this%20case%20Active%20Directory%29.%20%20Jira%20does%20support%20simple%20authentication%20integration%20with%20LDAP%20via%20OSUser%20but%20requires%20that%20each%20LDAP%20user%20exist%20in%20Jira%20first.%20%20So%20if&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" title="Buzz up!">Buzz up!</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://mike.brevoort.com/2008/04/08/syncing-jira-with-ldap/&amp;title=Expanding+on+Jira%27s+LDAP+Integration" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-mail">
			<a href="mailto:?subject=%22Expanding%20on%20Jira%27s%20LDAP%20Integration%22&amp;body=I%20thought%20this%20article%20might%20interest%20you.%0A%0A%22I%20recently%20had%20the%20opportunity%20to%20do%20a%20fresh%20installation%20of%20Atlassian%20Jira%20and%20was%20faced%20again%20with%20how%20to%20integrate%20Jira%20with%20LDAP%20%28in%20this%20case%20Active%20Directory%29.%20%20Jira%20does%20support%20simple%20authentication%20integration%20with%20LDAP%20via%20OSUser%20but%20requires%20that%20each%20LDAP%20user%20exist%20in%20Jira%20first.%20%20So%20if%22%0A%0AYou%20can%20read%20the%20full%20article%20here%3A%20http://mike.brevoort.com/2008/04/08/syncing-jira-with-ldap/" rel="nofollow" title="Email this to a friend?">Email this to a friend?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->

]]></content:encoded>
			<wfw:commentRss>http://mike.brevoort.com/2008/04/08/syncing-jira-with-ldap/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>
