<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>

document.getElementById('switchlink').href="javascript:rewriteStory()";
function rewriteStory()
{
document.getElementById('story').innerHTML=document.getElementById('story').innerHTML.replace(/builder/g,'software engineer');
document.getElementById('story').innerHTML=document.getElementById('story').innerHTML.replace(/walls/g,'software');
document.getElementById('story').innerHTML=document.getElementById('story').innerHTML.replace(/quote/g,'interview');
document.getElementById('story').innerHTML=document.getElementById('story').innerHTML.replace(/bricks/g,'Java classes');
document.getElementById('story').innerHTML=document.getElementById('story').innerHTML.replace(/mortar/g,'interfaces');
document.getElementById('switchlink').href="javascript:originalStory()";
}
function originalStory()
{
document.getElementById('story').innerHTML=document.getElementById('story').innerHTML.replace(/software engineer/g,'builder');
document.getElementById('story').innerHTML=document.getElementById('story').innerHTML.replace(/software/g,'walls');
document.getElementById('story').innerHTML=document.getElementById('story').innerHTML.replace(/interview/g,'quote');
document.getElementById('story').innerHTML=document.getElementById('story').innerHTML.replace(/Java classes/g,'bricks');
document.getElementById('story').innerHTML=document.getElementById('story').innerHTML.replace(/interfaces/g,'mortar');
document.getElementById('switchlink').href="javascript:rewriteStory()";
}


Software Engineer, Musician, Mathematician &amp; novice Archer.  Currently living in London
See my homepage for an overview of my Java projects and commercial experience.</description><title>Michael Lavelle</title><generator>Tumblr (3.0; @michaellavelle)</generator><link>http://michaellavelle.tumblr.com/</link><item><title>“Random Access Memories” joins Mylo’s...</title><description>&lt;iframe class="spotify_audio_player" src="https://embed.spotify.com/?uri=spotify%3Aalbum%3A4m2880jivSbbyEGAKfITCa&amp;view=coverart" frameborder="0" allowtransparency="true" width="500" height="580"&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;“Random Access Memories” joins Mylo’s “Destroy Rock &amp; Roll” and Chromeo’s “Business Casual” in my top 3 “albums that blow you away”&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/50937659800</link><guid>http://michaellavelle.tumblr.com/post/50937659800</guid><pubDate>Mon, 20 May 2013 23:03:00 +0100</pubDate><category>music</category><category>nu disco</category></item><item><title>BalletBoyz - “Void”</title><description>&lt;object id="flashObj" width="400" height="225" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,47,0"&gt;&lt;param name="movie" value="http://c.brightcove.com/services/viewer/federated_f9?isVid=1&amp;isUI=1" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;param name="flashVars" value="videoId=2378572464001&amp;playerID=1150175498001&amp;playerKey=AQ~~,AAABC-FjfjE~,nGj2b_nKunIqSQQqUGbs78br6OLNR72t&amp;domain=embed&amp;dynamicStreaming=true" /&gt;&lt;param name="base" value="http://admin.brightcove.com" /&gt;&lt;param name="seamlesstabbing" value="false" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="swLiveConnect" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://c.brightcove.com/services/viewer/federated_f9?isVid=1&amp;isUI=1" bgcolor="#FFFFFF" flashvars="videoId=2378572464001&amp;playerID=1150175498001&amp;playerKey=AQ~~,AAABC-FjfjE~,nGj2b_nKunIqSQQqUGbs78br6OLNR72t&amp;domain=embed&amp;dynamicStreaming=true" base="http://admin.brightcove.com" name="flashObj" width="400" height="225" seamlesstabbing="false" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" swliveconnect="true" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.balletboyz.com" target="_blank"&gt;&lt;strong&gt;BalletBoyz &lt;/strong&gt;&lt;/a&gt;- “Void”&lt;/strong&gt;&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/50734054967</link><guid>http://michaellavelle.tumblr.com/post/50734054967</guid><pubDate>Sat, 18 May 2013 16:37:00 +0100</pubDate><category>balletboyz</category></item><item><title>Machine Learning 2 : Reinforcement Learning vs. Supervised Learning </title><description>&lt;div class="page" title="Page 1"&gt;
&lt;div class="layoutArea"&gt;
&lt;div class="column"&gt;
&lt;p&gt;&lt;span&gt;&amp;#8220;Reinforcement learning (RL) and supervised learning are usually portrayed as distinct methods of learning from experience. RL methods are often applied to problems involving sequential dynamics and optimization of a scalar performance objective, with online exploration of the effects of actions. Supervised learning methods, on the other hand, are frequently used for problems involving static input-output mappings and minimization of a vector error signal, with no explicit dependence on how training examples are gathered. As discussed by Barto and Dietterich (this volume), the key feature distinguishing RL and supervised learning is whether training information from the environment serves as an evaluation signal or as an error signal&amp;#8230;&amp;#8221;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;[Source :  &lt;/span&gt;&lt;a href="http://www-anw.cs.umass.edu/pubs/2004/rosenstein_b_ADP04.pdf"&gt;Supervised Actor-Critic Reinforcement Learning&lt;/a&gt; - paper discussing problems where both kinds of feedback ( evaluation signal/error signals ) are available to a learning system &lt;em&gt;at the same time) &lt;/em&gt;]&lt;a href="http://www-anw.cs.umass.edu/pubs/2004/rosenstein_b_ADP04.pdf"&gt;&lt;br/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8220;&lt;span&gt;Having discussed key differences between reinforcement learning and supervised learning, the question arises as to whether these differences are fundamental or merely superficial differences that can be eliminated with suitable problem reformulation.&amp;#8221;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;[ Source&amp;#160;: &lt;/span&gt;&lt;br/&gt;&lt;a href="http://all.cs.umass.edu/pubs/2004/barto_d_04.pdf"&gt;Reinforcement Learning and its Relationship to Supervised Learning&lt;/a&gt; ]&lt;/p&gt;
&lt;/div&gt;
&lt;div class="column"&gt;Further reading:&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="http://webdocs.cs.ualberta.ca/~sutton/papers/sutton-92-ISKIT.pdf"&gt;Reinforcement Learning Architectures&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www-anw.cs.umass.edu/pubs/2004/rosenstein_b_ADP04.pdf"&gt;Supervised Actor-Critic Reinforcement Learning&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cs.utexas.edu/~pstone/Papers/bib2html-links/AAMAS09-hester.pdf"&gt;Generalized Model Learning for Reinforcement Learning in Factored Domains&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://books.nips.cc/papers/files/nips16/NIPS2003_CN07.pdf"&gt;Autonomous Helicopter flight via Reinforcement learning&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://x86.cs.duke.edu/~forbes/papers/aaai00.pdf"&gt;Real-time reinforcement learning in continuous domains&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dl.acm.org/citation.cfm?id=2298811"&gt;Reinforcement learning for rule extraction from a labeled dataset&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://arxiv.org/abs/1009.2566"&gt;Reinforcement Learning by Comparing Immediate Reward&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.sciencedirect.com/science/article/pii/S0957417405002228"&gt;Maximum reward reinforcement learning: A non-cumulative reward criterion&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.compapp.dcu.ie/~humphrys/PhD/ch2.html"&gt;http://www.compapp.dcu.ie/~humphrys/PhD/ch2.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://webdocs.cs.ualberta.ca/~sutton/book/ebook/node7.html"&gt;http://webdocs.cs.ualberta.ca/~sutton/book/ebook/node7.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://pages.cs.wisc.edu/~finton/what-rl.html"&gt;http://pages.cs.wisc.edu/~finton/what-rl.html&lt;/a&gt;&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/49538036369</link><guid>http://michaellavelle.tumblr.com/post/49538036369</guid><pubDate>Fri, 03 May 2013 22:28:36 +0100</pubDate><category>machine learning</category><category>reinforcement learning</category><category>supervised learning</category><category>software engineering</category></item><item><title>Machine Learning 1 : Overview</title><description>&lt;p&gt;&lt;em&gt;These notes are my own observations and questions from my study of the material on &lt;a href="http://see.stanford.edu/see/courseinfo.aspx?coll=348ca38a-3a6d-4052-937d-cb017338d7b1"&gt;Stanford&amp;#8217;s Engineering Everywhere Machine Learning Course&lt;/a&gt;&lt;/em&gt;&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Machine Learning&lt;/strong&gt;&lt;em&gt; :  a scientific discipline concerned with the design and development of&lt;/em&gt; &lt;strong&gt;algorithms&lt;/strong&gt;&lt;em&gt; that allow machines (computers) &lt;strong&gt;to make decisions&lt;/strong&gt; &lt;strong&gt;or&lt;/strong&gt; even &lt;strong&gt;evolve behaviors&lt;/strong&gt; &lt;strong&gt;based on&lt;/strong&gt; collection of &lt;strong&gt;empirical data&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;algorithms&lt;/strong&gt; of machine learning fall into the following primary categories ( source&amp;#160;: Wikipedia )&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Unsupervised Learning&lt;/strong&gt; :  the problem of trying to find hidden structure in unlabeled data&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Supervised Learning&lt;/strong&gt;&amp;#160;: inferring a function from labeled training data&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Reinforcement Learning&lt;/strong&gt;&amp;#160;: concerned with how an &lt;em&gt;agent&lt;/em&gt; ought to take &lt;em&gt;actions&lt;/em&gt; in an &lt;em&gt;environment&lt;/em&gt; so as to maximize some notion of cumulative &lt;em&gt;reward&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;em&gt;( There are other classifications of algorithms, however these three classes are the major types discussed in the reference material I&amp;#8217;ve encountered so far  ) &lt;br/&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Supervised vs. Unsupervised Learning&lt;/strong&gt;&lt;em&gt;&lt;br/&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We can see that S&lt;em&gt;upervised Learning&lt;/em&gt; and Uns&lt;em&gt;upervised Learning&lt;/em&gt; are mutually exclusive categories if the training data is either all &lt;strong&gt;labelled&lt;/strong&gt; or all &lt;strong&gt;unlabelled.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;What does it mean to say data is labelled&amp;#160;?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Alternative definitions of the Supervised and Unsupervised learning from a &lt;a href="http://robotics.stanford.edu/~ronnyk/glossary.html"&gt;Stanford University glossary &lt;/a&gt;help us see what it means to say data is labelled:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Supervised Learning:  Learning techniques used to learn the relationship between independent attributes and a designated dependent attribute (the label)&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Unsupervised Learning&amp;#160;: Learning techniques that group instances without a pre-specified dependent attribute.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;We can say from these definitions that &lt;em&gt;training data is said to be labelled when&lt;/em&gt; the data being analysed is comprised of pairs consisting of a set of independent &lt;strong&gt;input&lt;/strong&gt; attributes and a dependent &lt;strong&gt;output&lt;/strong&gt; attribute (the label), whereas with unlabeled data there is no pre-specified dependent attribute.&lt;/p&gt;
&lt;p&gt;When a dataset is &lt;strong&gt;unlabeled&lt;/strong&gt;, we may wish to use an &lt;strong&gt;Unsupervised Learning algorithm&lt;/strong&gt; to find patterns within the structure of this data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When a dataset contains labels,&lt;/strong&gt; the label is often referred to as the &amp;#8220;correct&amp;#8221; or desired answer, and may wish to use a &lt;strong&gt;Supervised Learning&lt;/strong&gt; algorithm to infer a function which &lt;em&gt;predicts&lt;/em&gt; this &amp;#8220;right answer&amp;#8221; given a set of input attributes.&lt;/p&gt;
&lt;p&gt;&amp;#8220;To describe the Supervised Learning algorithm slightly more formally, our goal is, given a training set, to learn a function h&amp;#160;: X → Y so that h(x) is a “good” &lt;em&gt;predictor&lt;/em&gt; for the corresponding value of y. For historical reasons, this function h is called a hypothesis.&amp;#8221;&lt;/p&gt;
&lt;p&gt;( here X denotes the space of input values, and Y the spaces of output values.)&lt;/p&gt;
&lt;p&gt;[Source: &lt;a href="http://see.stanford.edu/materials/aimlcs229/cs229-notes1.pdf" target="_blank"&gt;CS229 Lecture Notes - 1&lt;/a&gt; ]&lt;/p&gt;
&lt;p&gt;( The terms &lt;em&gt;predict&lt;/em&gt; and &lt;em&gt;predictor&lt;/em&gt; are highlighted in the above text as we will shortly attempt to define what we mean by these terms in more detail. )&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples of Unsupervised/Supervised Learning&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If we had a dataset consisting of the location coordinates of houses within a given city, we could say this is an unlabelled data set and we could use an Unsupervised Learning algorithm to find clusters of homes in the city.  &lt;/p&gt;
&lt;p&gt;If our dataset included the price of each house in addition to the location attributes, we could use a Supervised Learning algorithm to look for a function which predicted the price of the house given its location.&lt;/p&gt;
&lt;div class="page" title="Page 5"&gt;
&lt;div class="layoutArea"&gt;&lt;span&gt;&lt;strong&gt;Where does Reinforcement Learning fit in - is it Supervised or Unsupervised Learning?&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="layoutArea"&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="layoutArea"&gt;&lt;span&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="layoutArea"&gt;
&lt;p&gt;Reinforcement Learning&amp;#160;: concerned with how an &lt;em&gt;agent&lt;/em&gt; ought to take &lt;em&gt;actions&lt;/em&gt; in an &lt;em&gt;environment&lt;/em&gt; so as to maximize some notion of cumulative &lt;em&gt;reward&lt;/em&gt;&lt;/p&gt;
&lt;span&gt;&lt;strong&gt;&amp;#8220;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;Somewhere between supervised and unsupervised learning is &lt;/span&gt;&lt;span&gt;reinforcement &lt;/span&gt;&lt;span&gt;learning. Reinforcement learning is primarily used in control systems that might take a sequence of steps over a period of time to arrive at a desired outcome. We may know what that outcome should be, but we may not know whether any particular step is a good one (advances us toward the goal) or a bad one. Like unsupervised learning, reinforcement learning systems are trained with unlabeled data (the “right answer” is not given), but are then “rewarded” for making positive progress or achieving a goal, or “punished” for poor progress or an undesirable outcome. “Positive progress” may be counter-intuitive if it is sometimes necessary to proceed in ways that temporarily seem wrong in order to avoid an obstacle, and reinforcement learning has a general “credit assignment problem” across all the steps in a sequence when evaluating how to apportion blame for an undesirable outcome to the intermediate steps that achieved it. It would be incorrect to assume, for example, that applying the brakes caused crashes in autonomous cars simply because every failed self- driving attempt terminated with the brakes applied as the control system tried to avoid the crash. Instead, blame (negative credit) should be levied to the actions that led, perhaps much earlier, to the crash&amp;#8221;&lt;br/&gt;&lt;br/&gt;[ Source :  &lt;a href="http://www.ca.com/us/~/media/files/articles/ca-technology-exchange/machine-learning-cognition-and-big-data-oberlin.aspx" target="_blank"&gt;&amp;#8220;&lt;/a&gt;&lt;a href="http://www.ca.com/us/~/media/files/articles/ca-technology-exchange/machine-learning-cognition-and-big-data-oberlin.aspx"&gt;Machine Learning, Cognition, and Big Data&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.ca.com/us/~/media/files/articles/ca-technology-exchange/machine-learning-cognition-and-big-data-oberlin.aspx"&gt;by Steve Oberlin, Senior Vice President and Distinguished Engineer, CA Technologies&amp;#8221; &lt;/a&gt;]&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/49528348809</link><guid>http://michaellavelle.tumblr.com/post/49528348809</guid><pubDate>Fri, 03 May 2013 20:11:00 +0100</pubDate><category>machine learning</category><category>supervised learning</category><category>reinforcement learning</category><category>artificial intelligence</category><category>cs229</category><category>unsupervised learning</category><category>software engineering</category></item><item><title>A Month Of Saturdays Playlist : April 2013</title><description>&lt;p&gt;&lt;iframe frameborder="no" height="550" scrolling="no" src="https://w.soundcloud.com/player/?url=http%3A%2F%2Fapi.soundcloud.com%2Fplaylists%2F5795007" width="100%"&gt;&lt;/iframe&gt;&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/50723083936</link><guid>http://michaellavelle.tumblr.com/post/50723083936</guid><pubDate>Wed, 01 May 2013 13:15:00 +0100</pubDate><category>music</category><category>electropop</category></item><item><title>Making Connections with Spring Social</title><description>&lt;p&gt;&lt;iframe frameborder="0" height="315" src="http://www.youtube.com/embed/boUwhyLdMBs" width="560"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;Craig Walls talks at SpringOne 2GX 2012 about Spring Social.&lt;/p&gt;
&lt;p&gt;Check out the &amp;#8220;Spring Social Project Family&amp;#8221; slide.  Feel proud that my &lt;a href="https://github.com/michaellavelle/spring-social-lastm"&gt;Last.Fm&lt;/a&gt;, &lt;a href="https://github.com/michaellavelle/spring-social-soundcloud"&gt;SoundCloud&lt;/a&gt; and &lt;a href="https://github.com/michaellavelle/spring-social-mixcloud"&gt;Mixcloud&lt;/a&gt; modules are listed as members :-)&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/45879755260</link><guid>http://michaellavelle.tumblr.com/post/45879755260</guid><pubDate>Fri, 26 Apr 2013 17:41:00 +0100</pubDate><category>SpringSocial</category><category>java</category><category>software engineering</category></item><item><title>exfm-oauth-api-proxy</title><description>&lt;p&gt;&lt;em&gt;exfm-oauth-api-proxy&amp;#160;: A proxy to Ex.Fm&amp;#8217;s API supporting OAuth2 Authentication - currently deployed to &lt;a href="http://exfmproxy.socialsignin.org" target="_blank"&gt;exfmproxy.socialsignin.org&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Some time ago I wanted to provide &amp;#8220;login with Ex.Fm&amp;#8221; functionality on a number of my websites and to access authenticated methods of Ex.Fm&amp;#8217;s API on behalf of my logged in users.&lt;em&gt;&lt;br/&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I started work on a &lt;a href="/post/43881809173/spring-social-exfm"&gt;spring-social-exfm&lt;/a&gt; module that acts as a Java client, but as Ex.Fm&amp;#8217;s API does not currently support OAuth this module was limited in terms of it&amp;#8217;s compatibility with the Spring Social framework, requiring a user to explicitly provide a username and password to access authenticated API methods.&lt;/p&gt;
&lt;p&gt;I started experimenting with creating a proxy to Ex.Fm&amp;#8217;s API that supports OAuth2 authentication, which would then mean I could develop a Spring Social module for Ex.Fm which could be used as an OAuth client should Ex.Fm implement OAuth in their API in future.&lt;/p&gt;
&lt;p&gt;The result is &lt;a href="https://github.com/socialsignin/exfm-oauth-api-proxy" target="_blank"&gt;exfm-oauth-api-proxy&lt;/a&gt; - currently deployed to &lt;a href="http://exfmproxy.socialsignin.org" target="_blank"&gt;exfmproxy.socialsignin.org&lt;/a&gt; - a simple webapp which delegates requests for a select subset of Ex.Fm&amp;#8217;s API methods to Ex.Fm itself, but which also translates OAuth2 authenticated requests into username/password encoded requests before proxying the requests onwards.&lt;/p&gt;
&lt;p&gt;This proxy is currently being used to support the &amp;#8220;login/connect with exfm&amp;#8221; use-cases at the following sites:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://michaellavelle.tumblr.com/post/43883165938/api-cloudplaylists-com"&gt;api.cloudplaylists.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://michaellavelle.tumblr.com/post/43881849900/socialsignin-org"&gt;socialsignin.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/socialsignin/exfm-oauth-api-proxy" target="_blank"&gt;exfm-oauth-api-proxy &lt;/a&gt;webapp was created from the sparklr2 sample in the &lt;a href="https://github.com/SpringSource/spring-security-oauth" target="_blank"&gt;spring-security-oauth&lt;/a&gt; project and provides the following OAuth2 endpoints that can be used to configure &lt;a href="/post/43881809173/spring-social-exfm"&gt;spring-social-exfm&lt;/a&gt; so it can be used within Spring Social enabled applications:&lt;/p&gt;
&lt;p&gt;exfm.oauthTokenUrl=/oauth/token&lt;br/&gt;exfm.oauthAuthorizeUrl=/oauth/authorize&lt;/p&gt;
&lt;p&gt;exfm.oauthApiBaseUrl=/api/v3&lt;/p&gt;
&lt;p&gt;Client Ids, Secrets and Redirect Uris are configured within the&lt;/p&gt;
&lt;pre&gt;&lt;span class="nt"&gt;oauth:client-details-service&lt;/span&gt; &lt;/pre&gt;
&lt;p&gt;element in spring-config.xml&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/43881837781</link><guid>http://michaellavelle.tumblr.com/post/43881837781</guid><pubDate>Fri, 26 Apr 2013 09:30:00 +0100</pubDate><category>java</category><category>software engineering</category><category>exfm</category><category>oauth2</category></item><item><title>The Java software engineer interview process</title><description>&lt;div id="story"&gt;
&lt;p&gt;&lt;em&gt;An experienced, qualified and enthusiastic builder is looking for his next job.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;He is a builder that takes pride in the quality of his work and has found that this has pleased his previous clients who have all subsequently offered him follow-on projects.&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;The builder spots an advert online - a potential new client has a requirement to rebuild some of their walls - it&amp;#8217;s a large project, maybe 6 months in duration, and they need a builder. No detail is given about the project other than the skills the builder must possess to do the job.&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;The builder does have the listed skills and he responds to the advert, sending through details of his previous clients, his online portfolio, and details of his accreditation (all of which is independently verifiable).&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;The client suggests a time he can call the builder to discuss the project further.  When the time comes,  the client introduces himself, and immediately starts to ask the builder the following questions:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;#8220;What is the best way to build walls?&amp;#8221;&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;&amp;#8220;Are all bricks concrete?&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;&amp;#8220;What is the difference between bricks and mortar&amp;#8221;&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;The builder is taken aback and bemused but answers the client&amp;#8217;s questions politely.  To his surprise the questions keep coming, maybe another dozen or so.  After 15 minutes the client stops asking questions and asks if the builder has any of his own.  The builder replies:&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;&amp;#8220;Perhaps you could give me some detail about the project you advertised online&amp;#8221;&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;The client tells the builder that the project is to replace some existing walls but that the builder will have the opportunity to find out more should he be invited to quote. The phone call ends with the builder not really any the wiser about the project specified in the ad.&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;A short while later an invitation to quote is sent to the builder.  Attached to the invite are details of a task that the builder must complete before attending the quote - a requirement to build some very elementary walls out of plain old bricks and mortar. When complete, evidence of this task completion must be sent to the client where it will be assessed and discussed at the forthcoming quote.&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;By now the builder is pretty confused. He definitely remembered submitting details of his online portfolio showcasing his work to the client even before the initial phone call.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;#8220;I&amp;#8217;m a builder&amp;#8221;, he thinks to himself, &amp;#8220;it&amp;#8217;s what I do, I build walls built out of plain old bricks and mortar all the time.  There are examples of &lt;/em&gt;&lt;em&gt;walls I&amp;#8217;ve built clearly visible before on my online portfolio.&amp;#8221;&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;&amp;#8220;How could I have been worked with my previous clients if I didn&amp;#8217;t know how to put together simple walls like this?&amp;#8221;&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;&amp;#8220;How could I have gained my accreditation with the company that created these very bricks we are using if I didn&amp;#8217;t have this skill?&amp;#8221;&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;Against his better judgement, the builder sighs and gets set to complete the walls task.  The task is simple to do, perhaps something like the walls he first learned to build in his youth, but it is boring and takes some time to complete - almost half a day in total.  &amp;#8220;This project had better be worth bidding for&amp;#8221; the builder thinks, shaking his head in bewilderment as he sends through evidence of his completed walls to the client.&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;To be continued&amp;#8230;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;a href="#" id="switchlink"&gt;Switch the context of this story&lt;/a&gt; to be that of a software engineer &lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;interviewing for a contract and this unlikely story becomes all too familiar&amp;#8230;&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&lt;br/&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Just replace the following words in the story to change context:&lt;br/&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;builder -&amp;gt; software engineer&lt;br/&gt;bricks -&amp;gt; Java classes&lt;br/&gt;mortar -&amp;gt; interfaces&lt;br/&gt;walls -&amp;gt; software&lt;br/&gt;quote -&amp;gt; interview&lt;br/&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/48807900895</link><guid>http://michaellavelle.tumblr.com/post/48807900895</guid><pubDate>Thu, 25 Apr 2013 14:17:00 +0100</pubDate><category>software engineering</category><category>interview process</category><category>recruitment</category><category>java</category></item><item><title>A Month Of Saturdays Playlist : March 2013</title><description>&lt;p&gt;&lt;iframe frameborder="no" height="550" scrolling="no" src="https://w.soundcloud.com/player/?url=http%3A%2F%2Fapi.soundcloud.com%2Fplaylists%2F5795001" width="100%"&gt;&lt;/iframe&gt;&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/50723454514</link><guid>http://michaellavelle.tumblr.com/post/50723454514</guid><pubDate>Mon, 01 Apr 2013 13:25:00 +0100</pubDate><category>music</category><category>electropop</category></item><item><title>socialsignin.org</title><description>&lt;p&gt;Check out &lt;a href="http://socialsignin.org" target="_blank"&gt;&lt;a href="http://socialsignin.org"&gt;http://socialsignin.org&lt;/a&gt;&lt;/a&gt; for a working deployed version of the &lt;a href="https://github.com/socialsignin/socialsignin-showcase" target="_blank"&gt;socialsignin showcase&lt;/a&gt; webapp.&lt;/p&gt;
&lt;p&gt;This webapp demonstrates using &lt;a href="/post/43881740847/spring-social-security"&gt;spring-social-security&lt;/a&gt; to delegate authentication to third party providers.&lt;/p&gt;
&lt;p&gt;Other modules showcased are:&lt;/p&gt;
&lt;p&gt;spring-social-lastfm&lt;/p&gt;
&lt;p&gt;spring-social-soundcloud&lt;/p&gt;
&lt;p&gt;&lt;a href="http://michaellavelle.tumblr.com/post/43881809173/spring-social-exfm"&gt;spring-social-exfm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;spring-social-mixcloud&lt;/p&gt;
&lt;p&gt;&lt;a href="http://michaellavelle.tumblr.com/post/43881796615/spring-social-cloudplaylists"&gt;spring-social-cloudplaylists&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SocialSignin provider wrappers are used around the corresponding Spring Social modules to provide auto-registration of Spring Social components through component scanning and to provide an abstraction layer allowing the application to deal with API clients for a number of common use-cases instead of interacting with lower-level connection API&lt;/p&gt;
&lt;p&gt;Users can create accounts with &lt;a href="http://socialsignin.org" target="_blank"&gt;&lt;a href="http://socialsignin.org"&gt;http://socialsignin.org&lt;/a&gt;&lt;/a&gt; by logging in with one of the available providers and once logged in can additionally connect their accounts with the remaining providers.&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/43881849900</link><guid>http://michaellavelle.tumblr.com/post/43881849900</guid><pubDate>Sun, 17 Mar 2013 09:52:00 +0000</pubDate><category>java</category><category>software engineering</category><category>SpringSocial</category></item><item><title>opensource.cloudplaylists.com</title><description>&lt;a href="http://opensource.cloudplaylists.com"&gt;opensource.cloudplaylists.com&lt;/a&gt;: &lt;p&gt;The original beta version of &lt;a href="/post/43883065959/cloudplaylists-com"&gt;cloudplaylists.com&lt;/a&gt; was really a prototype, an experimental site that I used as a proof of concept for a new playlist sharing service that I could use to demo my work with Spring Social.&lt;/p&gt;
&lt;p&gt;At the time, I hadn’t yet launched &lt;a href="/post/43883165938/api-cloudplaylists-com"&gt;api.cloudplaylists.com&lt;/a&gt;, or written the &lt;a href="/post/43881796615/spring-social-cloudplaylists"&gt;spring-social-cloudplaylists &lt;/a&gt;client module, and as a consequence the original CloudPlaylists code was pretty bloated, with code spanning MVC layer and persistence deployed within the same application.&lt;/p&gt;
&lt;p&gt;Since launching the API I wanted to re-launch the site, using a different model where the website code was much more lightweight, providing a UI on top of the functionality provided by the API.&lt;/p&gt;
&lt;p&gt;I’ve deployed an initial version of this much more lightweight web app to &lt;a href="http://opensource.cloudplaylists.com" target="_blank"&gt;&lt;a href="http://opensource.cloudplaylists.com"&gt;http://opensource.cloudplaylists.com&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a simple web application with skeleton HTML code, using &lt;a href="/post/43881740847/spring-social-security"&gt;spring-social-security&lt;/a&gt; and &lt;a href="/post/43881796615/spring-social-cloudplaylists"&gt;spring-social-cloudplaylists&lt;/a&gt; modules to delegate authentication, business logic and persistence to the CloudPlaylists API&lt;/p&gt;
&lt;p&gt;This revamped site provides additional functionality over and above the original beta site, such as integration with Ex.Fm.&lt;/p&gt;
&lt;p&gt;The intention is to open-source the entire code base for this site down the line - for now I’ve &lt;a href="https://github.com/cloudplaylists/opensource.cloudplaylists.com" target="_blank"&gt;open-sourced the very basic skeleton HTML for the site on GitHub&lt;/a&gt; with the hope that someone with the right skill set can style this site to look beautiful.&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/43883474299</link><guid>http://michaellavelle.tumblr.com/post/43883474299</guid><pubDate>Sun, 24 Feb 2013 10:44:00 +0000</pubDate><category>cloudplaylists</category><category>SpringSocial</category><category>java</category><category>software engineering</category></item><item><title>spring-social-cloudplaylists</title><description>&lt;p&gt;Spring Social module for CloudPlaylists - acting as a Java API client and allowing Spring-Social applications to provide &amp;#8220;login with CloudPlaylists&amp;#8221; functionality&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/43881796615</link><guid>http://michaellavelle.tumblr.com/post/43881796615</guid><pubDate>Sun, 24 Feb 2013 10:02:00 +0000</pubDate><category>cloudplaylists</category><category>SpringSocial</category><category>java</category><category>software engineering</category></item><item><title>api.cloudplaylists.com</title><description>&lt;a href="http://api.cloudplaylists.com"&gt;api.cloudplaylists.com&lt;/a&gt;: &lt;p&gt;Opening up the API for CloudPlaylists&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/43883165938</link><guid>http://michaellavelle.tumblr.com/post/43883165938</guid><pubDate>Sun, 24 Feb 2013 10:01:00 +0000</pubDate><category>cloudplaylists</category><category>SpringSocial</category><category>oauth2</category><category>java</category><category>software engineering</category></item><item><title>cloudplaylists.com</title><description>&lt;a href="http://cloudplaylists.com"&gt;cloudplaylists.com&lt;/a&gt;: &lt;p&gt;The original &lt;a href="http://cloudplaylists.com" target="_blank"&gt;beta version of CloudPlaylists&lt;/a&gt; - a site allowing playlists of SoundCloud tracks to be created quickly and easily, showcasing connectivity to SoundCloud and Last.Fm and delegating authentication to Spring-Social-Security to provide “login with SoundCloud” and “login with Last.Fm” functionality&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/43883065959</link><guid>http://michaellavelle.tumblr.com/post/43883065959</guid><pubDate>Sun, 24 Feb 2013 10:00:00 +0000</pubDate><category>cloudplaylists</category><category>SpringSocial</category><category>java</category><category>software engineering</category></item><item><title>spring-social-exfm</title><description>&lt;p&gt;I&amp;#8217;ve open-sourced an initial cut of &lt;a href="https://github.com/michaellavelle/spring-social-exfm" target="_blank"&gt;spring-social-exfm&lt;/a&gt; - a Java client for Ex.Fm&amp;#8217;s API.&lt;/p&gt;
&lt;p&gt;Spring Social modules can normally be registered within a Spring Social enabled webapp which is then able to perform the OAuth authentication dance with an API - passing back a session token after user approval which can then be used for subsequent requests which require authentication.   This means that it&amp;#8217;s the third party website which collects username/password details from a user and the client application is only aware of access tokens.&lt;/p&gt;
&lt;p&gt;Unfortunately at the time of writing, Ex.Fm&amp;#8217;s API doesn&amp;#8217;t support OAuth - - instead operations which require authorization on behalf of a particular user require username and password to be sent as request parameters.&lt;/p&gt;
&lt;p&gt;The consequence of this is that In terms of using this module to interact with Ex.Fm&amp;#8217;s API directly, this module can only really be used as a standalone Java client, and can&amp;#8217;t be fully &amp;#8220;plugged-in&amp;#8221; to Spring Social enabled webapps in the same way as for other providers.&lt;/p&gt;
&lt;pre&gt;&lt;span class="nf"&gt;ExFm exFm = new ExFmTemplate("http://&lt;/span&gt;&lt;span class="nf"&gt;ex.fm/api/v3"."username","password");&lt;br/&gt;ExFmProfile profile = exfm.meOperations().getUserProfile();&lt;br/&gt;&lt;/span&gt;&lt;span class="o"&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;However, In the event that Ex.Fm do support an OAuth2 authentication for their API in future, I&amp;#8217;ve added support for this to the spring-social-exfm module and have created a &lt;a href="/post/43881837781/exfm-oauth-api-proxy"&gt;simple oauth proxy to Ex.Fm&amp;#8217;s API for showcase purposes&lt;/a&gt; which I&amp;#8217;ve used to test the module.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve provided an ExFmConnectionFactory which can be constructed with client keys, secrets and the auth endpoints provided by this proxy ( or with the auth endpoints of an OAuth API from Ex.Fm should one be implemented in the future).&lt;/p&gt;
&lt;div class="line"&gt;&lt;/div&gt;
&lt;div class="line" id="LC28"&gt;
&lt;pre&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ExFmConnectionFactory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;clientId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;clientSecret&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;oauthAuthorizeUrl&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;oauthTokenUrl&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;oauthApiBaseUrl&lt;/span&gt;&lt;span class="o"&gt;) {...}&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;</description><link>http://michaellavelle.tumblr.com/post/43881809173</link><guid>http://michaellavelle.tumblr.com/post/43881809173</guid><pubDate>Sun, 24 Feb 2013 09:51:00 +0000</pubDate><category>springsocial</category><category>java</category><category>software engineering</category><category>exfm</category></item><item><title>spring-social-security</title><description>&lt;p&gt;&lt;em&gt;&lt;a href="https://github.com/socialsignin/spring-social-security" target="_blank"&gt;spring-social-security&lt;/a&gt;&amp;#160;: an add-on for spring-social webapps, achieving sign-in-with-provider capability directly within the Spring Security filter chain, delegating authentication for your application to SaaS providers.&lt;br/&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Spring Social provides a number of controllers which can be used within Spring MVC webapps to handle authorization flow with SaaS providers - namely ConnectController and ProviderSignInController.&lt;/p&gt;
&lt;p&gt;These controllers assume that there is the concept of a local user within your web application - in other words that your web application is using some sort of security framework.&lt;/p&gt;
&lt;p&gt;When I first started using the spring social framework I found myself having to set up Spring Security in my application as a pre-requesite of enabling users to connect to third party providers. &lt;/p&gt;
&lt;p&gt;In my first attempts, this meant using an authentication filter such as UsernamePasswordAuthenticationFilter,  writing a UserDetailsService etc - and the result was that &amp;#8220;login with provider xyz&amp;#8221; functionality ended up being an option that sat alongside standard &amp;#8220;login with username/password&amp;#8221;.  The Spring Security framework had no awareness of the Spring Social implementation - when requesting protected resources the user would be faced with a username/password login page and I was unable to specify that I would like the user to connect with a certain provider in order to access a particular resource.&lt;/p&gt;
&lt;p&gt;In fact, what I wanted to achieve was almost the reverse of this set up - I wanted users to be able to authenticate with a third party provider, and for this third party authentication to drive the authentication in my application.  I wanted to protect resources in my application based on the users&amp;#8217; authentication status with a third party - for example to be able to specify access to  certain resource requires authentication with Twitter, or perhaps with Last.Fm.  I didn&amp;#8217;t want to provide a username/password store for my application - instead I wanted to do away with the concept of a local username/password entirely and use a third party&amp;#8217;s authentication functionality to identify users.  &lt;/p&gt;
&lt;p&gt;I wanted to address these concerns and so I set about creating and open-sourcing &lt;a href="https://github.com/socialsignin/spring-social-security" target="_blank"&gt;Spring Social Security&lt;/a&gt;  -  the aim of the module is to put Spring Social at the centre of a site&amp;#8217;s security configuration, to make the Security configuration of a Spring Social web application easy to set up and fully aware of the connectivity a user has with third party providers.&lt;/p&gt;
&lt;p&gt;Resources can be protected based on whether the user has connected with a external account from a specified third party provider.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;intercept-url pattern="/sendTweet" &lt;br/&gt;access="hasRole('ROLE_USER_TWITTER')" /&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;intercept-url pattern="/scrobble" &lt;br/&gt;access="hasRole('ROLE_USER_LASTFM')" /&amp;gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Provider-specific access denied handling is enabled so as to prompt users to connect with the required provider in order to gain access to the resource.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/socialsignin/spring-social-security" target="_blank"&gt;Spring-Social-Security module&lt;/a&gt; comes with a set of out-of-the-box components which can be registered by simple component scanning, and by adding the SpringSocialSecurityAuthenticationFilter to the Spring Security filter chain.&lt;/p&gt;
&lt;p&gt;Also provided is a default SpringSocialSecuritySignUpController which uses the UsersConnectionRepository provided by Spring Social to store details of registered users.  This behaviour can be customised if required in order to save registered users details in a separate user details store - this is discussed further in &lt;a href="/post/32122397048/using-spring-social-security-with-custom-signup"&gt;this blog post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more details on using this module please see &lt;a href="https://github.com/socialsignin/spring-social-security" target="_blank"&gt;Spring Social Security on GitHub.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/43881740847</link><guid>http://michaellavelle.tumblr.com/post/43881740847</guid><pubDate>Sun, 24 Feb 2013 09:49:00 +0000</pubDate><category>SpringSocial</category><category>java</category><category>software engineering</category></item><item><title>The dance music of 1987 still an influence 25 years later</title><description>&lt;p&gt;2012:&lt;/p&gt;
&lt;p&gt;&lt;iframe frameborder="0" height="236" src="http://www.youtube.com/embed/8bFK986sLaI" width="420"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;1987:&lt;/p&gt;
&lt;p&gt;&lt;iframe frameborder="0" height="315" src="http://www.youtube.com/embed/R2h9nwRWX5o" width="420"&gt;&lt;/iframe&gt;&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/20742088046</link><guid>http://michaellavelle.tumblr.com/post/20742088046</guid><pubDate>Sun, 09 Dec 2012 00:08:00 +0000</pubDate><category>1987</category><category>music</category></item><item><title>Writing custom ConnectionRepository implementations for Spring Social</title><description>&lt;p&gt;Spring Social requires that your application provides implementations of &lt;a href="https://github.com/SpringSource/spring-social/blob/master/spring-social-core/src/main/java/org/springframework/social/connect/ConnectionRepository.java" title="ConnectionRepository" target="_blank"&gt;ConnectionRepository&lt;/a&gt; and &lt;a href="https://github.com/SpringSource/spring-social/blob/master/spring-social-core/src/main/java/org/springframework/social/connect/UsersConnectionRepository.java" title="UsersConnectionRepository" target="_blank"&gt;UsersConnectionRepository&lt;/a&gt; - these components are used for the persistence of users third party API connection details.&lt;/p&gt;
&lt;p&gt;There are JDBC versions that ship with spring-social-core, the JdbcConnectionRepository and the JdbcUsersConnectionRepository which need a table to exist in your database created by with a structure such as that provided by &lt;a href="https://github.com/SpringSource/spring-social/blob/master/spring-social-core/src/main/resources/org/springframework/social/connect/jdbc/JdbcUsersConnectionRepository.sql" title="JdbcUsersConnectionRepository.sql" target="_blank"&gt;JdbcUsersConnectionRepository.sql&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve needed to use a couple of alternative implementations over the past months and thought I&amp;#8217;d share them on GitHub.  &lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/michaellavelle/spring-social-roo-connectionrepository" title="spring-social-roo-repository"&gt;spring-social-roo-connectionrepository&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/michaellavelle/spring-social-hibernate-jpa" title="spring-social-hibernate-jpa"&gt;spring-social-hibernate-jpa&lt;/a&gt;     ( Hibernate implementation of &lt;a href="https://github.com/mschipperheyn/spring-social-jpa" title="spring-social-jpa" target="_blank"&gt;spring-social-jpa&lt;/a&gt; )&lt;/p&gt;
&lt;p&gt;There are also two in-memory implementations embedded within other projects I&amp;#8217;ve worked on - &lt;a href="https://github.com/michaellavelle/spring-social-core-extension/blob/master/src/main/java/org/springframework/social/extension/connect/inmemory/InMemoryUsersConnectionRepository.java" title="InMemoryConnectionRepository"&gt;InMemoryUsersConnectionRepository&lt;/a&gt; and &lt;a href="https://github.com/socialsignin/socialsignin-provider/blob/master/src/main/java/org/socialsignin/springsocial/connect/quickstart/QuickstartUsersConnectionRepository.java" title="QuickstartUsersConnectionRepository"&gt;QuickstartUsersConnectionRepository&lt;/a&gt; which could help when setting up a project quickly in development mode.&lt;/p&gt;
&lt;p&gt;To test the implementations I&amp;#8217;ve created an abstract test harness which can be subclassed by developers writing their own ConnectionRepository components to help with testing.  &lt;a href="https://github.com/michaellavelle/spring-social-core-extension/blob/master/src/main/java/org/springframework/social/extension/connect/jdbc/AbstractUsersConnectionRepositoryTest.java" title="AbstractUsersConnectionRepositoryTest"&gt;AbstractUsersConnectionRepositoryTest&lt;/a&gt; is a essentially a modified version of JdbcUsersConnectionRepositoryTest from spring social core - examples of implementation-specific subclasses in use can be found in any of the above named projects.&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/32554947058</link><guid>http://michaellavelle.tumblr.com/post/32554947058</guid><pubDate>Sun, 30 Sep 2012 00:32:00 +0100</pubDate><category>software engineering</category><category>SpringSocial</category><category>java</category></item><item><title>Using Spring-Social-Security with custom SignUp requirements</title><description>&lt;p&gt;By default &lt;a href="/post/43881740847/spring-social-security"&gt;Spring-Social-Security&lt;/a&gt; ships with a set of components which handle the creation of new local accounts for users of your application when they first connect with a third party provider. &lt;/p&gt;
&lt;p&gt;These components are found within the &amp;#8220;signup&amp;#8221; package and are registered by default component scanning.  With the &amp;#8220;signup&amp;#8221; package excluded from component scan, these default components could be explicitly registered as follows:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;context:component-scan base-package="org.socialsignin.springsocial.security" &amp;gt;&lt;br/&gt;  &amp;lt;!-- Exclude signup components from Spring Social Security  --&amp;gt;&lt;br/&gt;  &amp;lt;context:exclude-filter type="regex" expression=".*\.signup\..*"/&amp;gt;&lt;br/&gt;&amp;lt;/context:component-scan&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;    &amp;lt;bean id="springSocialSecuritySignUpService" &lt;br/&gt;class="org.socialsignin.springsocial.security.signup.ConnectionRepositorySignUpService" /&amp;gt; &lt;br/&gt;&lt;br/&gt;    &amp;lt;bean id="springSocialSecuritySignUpController" &lt;br/&gt;class="org.socialsignin.springsocial.security.signup.SpringSocialSecuritySignUpController" /&amp;gt;&lt;br/&gt; &lt;br/&gt;    &amp;lt;bean id="springSocialSecurityProfileFactory" &lt;br/&gt;class="org.socialsignin.springsocial.security.demo.CustomUserProfileFactory" /&amp;gt; &lt;br/&gt;&lt;br/&gt;    &amp;lt;bean id="springSocialSecurityConnectionSignUp" &lt;br/&gt;class="org.socialsignin.springsocial.security.signup.SpringSocialSecurityConnectionSignUp" /&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To customise signup behavior, replace any or all of these beans with your own custom implementations. &lt;/p&gt;
&lt;p&gt;&lt;br/&gt;For an example of an custom signup configuration, where registered users&amp;#8217; details are stored in a separate User table using JPA, please see the following fork of the spring-social-security-demo project&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/michaellavelle/spring-social-security-demo"&gt;https://github.com/michaellavelle/spring-social-security-demo&lt;/a&gt;&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/32122397048</link><guid>http://michaellavelle.tumblr.com/post/32122397048</guid><pubDate>Sun, 23 Sep 2012 15:22:00 +0100</pubDate><category>springsocial</category><category>java</category><category>software engineering</category></item><item><title>Provider-specific access control in Spring-Social-Security</title><description>&lt;p&gt;The &lt;a href="https://github.com/socialsignin/spring-social-security" title="latest release of SocialSignin's Spring-Social-Security" target="_blank"&gt;latest release of SocialSignin&amp;#8217;s Spring-Social-Security&lt;/a&gt; allows resources to be protected based on whether the user has connected with a external account from a specified third party provider.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;intercept-url pattern="/sendTweet" &lt;br/&gt;access="hasRole('ROLE_USER_TWITTER')" /&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;intercept-url pattern="/scrobble" &lt;br/&gt;access="hasRole('ROLE_USER_LASTFM')" /&amp;gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Provider-specific access denied handling prompts users to connect with the required provider in order to gain access to the resource.&lt;/p&gt;</description><link>http://michaellavelle.tumblr.com/post/32092742023</link><guid>http://michaellavelle.tumblr.com/post/32092742023</guid><pubDate>Sun, 23 Sep 2012 03:11:00 +0100</pubDate><category>SpringSocial</category><category>software engineering</category><category>java</category></item></channel></rss>
