<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Technistas</title>
	<atom:link href="http://technistas.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://technistas.com</link>
	<description>Matthew D. Laudato writes about software and technology</description>
	<lastBuildDate>Tue, 03 Jan 2012 16:23:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='technistas.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Technistas</title>
		<link>http://technistas.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://technistas.com/osd.xml" title="Technistas" />
	<atom:link rel='hub' href='http://technistas.com/?pushpress=hub'/>
		<item>
		<title>Building an OAuth enabled website using Java</title>
		<link>http://technistas.com/2011/06/28/building-an-oauth-enabled-website-using-java/</link>
		<comments>http://technistas.com/2011/06/28/building-an-oauth-enabled-website-using-java/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 21:46:51 +0000</pubDate>
		<dc:creator>Matthew D. Laudato</dc:creator>
				<category><![CDATA[Constant Contact]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[sample code]]></category>
		<category><![CDATA[scribe-java]]></category>

		<guid isPermaLink="false">http://technistas.com/?p=163</guid>
		<description><![CDATA[For me, it&#8217;s always been about the APIs. I write them. I use them. I have built and continue to grow my career around them. So as it became clear over the past few years that OAuth has become the de facto standard for API authentication, I took the plunge and figured out how to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=163&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>For me, it&#8217;s always been about the APIs. I write them. I use them. I have built and continue to grow my career around them. So as it became clear over the past few years that OAuth has become the de facto standard for API authentication, I took the plunge and figured out how to do practical things with OAuth-based APIs. Since Java is my preferred language, and since I&#8217;m now the Product Manager at Constant Contact for the Platform and Partner Integrations, the natural path for my latest project was to build a website using Java that lets users authenticate to Constant Contact via OAuth.</p>
<p>That said, here&#8217;s the basics of the application and how it works. The technology stack looks like this:</p>
<p>Web UI: HTML, CSS, JavaScript<br />
Application Services: Java Servlets, JavaScript (Ajax), Scribe-Java (OAuth Java library), REST calls to the Constant Contact API<br />
Database (for storing OAuth tokens and secrets): Hibernate, MS-SQL Server</p>
<p>These are all tools that should be in any programmers toolbox, so the application also serves as a good training app and sample code if you&#8217;re trying to get familiar with this stack. The code is available on Github (you do have a Github account, don&#8217;t you??). Just fork <a href="https://github.com/matthewdlaudato/CTCTSampleApp" title="my repo">my repo</a> and you should be ready to go.</p>
<p>Since the main point of this article building an OAuth based website, let&#8217;s get right into it. If you want your users to display their data on your website, you as the website owner must let your users grant access to their data. In my case, the data is coming from Constant Contact, so I implemented what is known as the &#8216;web flow&#8217; for authentication. The flow uses a series of callbacks and goes roughly like this:</p>
<p>- Get a request token from Constant Contact<br />
- Redirect the user to Constant Contact&#8217;s OAuth endpoint and ask the end user to authenticate and grant access to their data<br />
- Exchange the authenticated request token for a valid access token and secret and have OAuth redirect the user back to your site.</p>
<p>Now, most of us are not hard-core security programmers, and trust me, if you (like me) prefer to focus on the functionality of your app and not on plumbing, you should use an OAuth library. In my case I chose scribe-java, an excellent open source library for Java OAuth programmers. I submitted the Constant Contact API to the project so that the rest of you can easily authenticate to Constant Contact. You can get scribe-java from github at <a href="https://github.com/fernandezpablo85/scribe-java" title="this url">this url</a>.</p>
<p>I handle the callbacks through two Java servlets. AuthServlet.java makes the initial request for an OAuth Request token, and if successful, redirects to Constant Contact to let the user authenticate and grant access. The basic code looks like this:</p>
<p><code><br />
	OAuthService service = new ServiceBuilder()<br />
        .provider(ConstantContactApi.class)<br />
        .callback("http://localhost:8080/CTCTWeb/OAuthCallbackServlet.do")<br />
        .apiKey(apiKeyProperties.getProperty("apiKey"))<br />
        .apiSecret(apiKeyProperties.getProperty("apiSecret"))<br />
        .build();<br />
	httpsession.setAttribute("oauth.service", service);</p>
<p>	Token requestToken = service.getRequestToken();<br />
	httpsession.setAttribute("oauth.request_token", requestToken);</p>
<p>	String confirmAccessURL = service.getAuthorizationUrl(requestToken);</p>
<p>	System.out.println(confirmAccessURL);<br />
	try {<br />
		res.sendRedirect(res.encodeRedirectURL(confirmAccessURL));<br />
	} catch (Exception e) {<br />
		System.out.println(e.getMessage());<br />
	}</p>
<p></code></p>
<p>The simplicity of the code is due to scribe-java. A couple of things to notice. First, we tell scribe-java what the callback URL is when we create the service object. Second, we store the request_token in the httpsession object. This isn&#8217;t strictly necessary (we could just store the request token secret, and then reconstruct the request token in the callback), but it is convenient. The reason for this has to do with the scribe-java Token class &#8211; it isn&#8217;t really a Token per-se, it&#8217;s a token-secret pair. I suspect that the author of the library did it this way because token-secret pairs are ubiquitous in OAuth. In any case, when the callback is invoked, it winds up in OAuthCallbackServlet.java. The relevant code looks like this:</p>
<p><code><br />
	String oauth_token = req.getParameter("oauth_token");<br />
	String oauth_verifier = req.getParameter("oauth_verifier");<br />
	String username = req.getParameter("username");</p>
<p>	if (oauth_verifier.length() &gt; 0) {<br />
		Verifier verifier = new Verifier(oauth_verifier);</p>
<p>		HttpSession httpsession = req.getSession(true);<br />
		OAuthService service = (OAuthService) httpsession.getAttribute("oauth.service");<br />
		Token requestToken = (Token) httpsession.getAttribute("oauth.request_token");<br />
		httpsession.setAttribute("username", username);</p>
<p>		Token accessToken = service.getAccessToken(requestToken, verifier);<br />
		httpsession.setAttribute("oauth.access_token", accessToken);</p>
<p>		Long accessTokenId = null;<br />
		AccessToken at = new AccessToken();<br />
		at.setLoginName(username);<br />
		at.setAccessToken(accessToken.getToken());<br />
		at.setSecret(accessToken.getSecret());<br />
		Date dt = new Date();<br />
		Timestamp ts = new Timestamp(dt.getTime());<br />
		at.setModifiedDate(ts);</p>
<p>		Session session = HibernateUtil.getSessionFactory().openSession();<br />
		Transaction transaction = null;<br />
		try {<br />
			transaction = session.beginTransaction();<br />
			accessTokenId = (Long) session.save(at);<br />
			transaction.commit();<br />
		} catch (HibernateException e) {<br />
			transaction.rollback();<br />
			e.printStackTrace();<br />
		} finally {<br />
			session.close();<br />
		}<br />
	}<br />
</code></p>
<p>Again, refer to the full source code on github. There&#8217;s several things going on here. First, the entry point to the call back is a servlet URL, which the Constant Contact OAuth implementation has called with three parameters. The oauth_token is the same request token that you generated earlier (but just the token, not the secret). Because I stored the request-token/secret pair earlier, I just ignore this parameter (but see the earlier comment &#8211; you could store the secret and then reconstruct the scribe-java Token object). The verifier is a string that the OAuth server creates when the user authenticates and then grants access. The magic is in the call to service.getAccessToken, where you trade in the (now verified) request token for a valid access token. Once you have the token, you need to do something with it so that the next time your user visits the website they can access their Constant Contact data. In my case, I opted to store the username, access token and the token secret in a SQL database. The schema for the database is pretty simple, and Hibernate makes it fairly trivial to store and retrieve the token and secret.</p>
<p>That&#8217;s about it for now. Happy coding!</p>
<p>- Matt</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mlaudato.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mlaudato.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mlaudato.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mlaudato.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mlaudato.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mlaudato.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mlaudato.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mlaudato.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mlaudato.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mlaudato.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mlaudato.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mlaudato.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mlaudato.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mlaudato.wordpress.com/163/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=163&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technistas.com/2011/06/28/building-an-oauth-enabled-website-using-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/90efc31e9a7f560c2586a27fb4ef2a0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matthew D. Laudato</media:title>
		</media:content>
	</item>
		<item>
		<title>A Framework for Evaluating Continuous Integration Tools</title>
		<link>http://technistas.com/2010/06/16/a-framework-for-evaluating-continuous-integration-tools/</link>
		<comments>http://technistas.com/2010/06/16/a-framework-for-evaluating-continuous-integration-tools/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 18:36:57 +0000</pubDate>
		<dc:creator>Matthew D. Laudato</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[Software Configuration Management]]></category>

		<guid isPermaLink="false">http://technistas.com/?p=157</guid>
		<description><![CDATA[For those of you interested in the methodology behind my ongoing series on CI tools, you should check out a new article that I wrote for CMCrossroads. In it I provide a framework for evaluating CI tools, and give you a checklist and ranking system to help you organize and rate your evalution. The 2nd [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=157&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>For those of you interested in the methodology behind my ongoing series on CI tools, you should check out a new article that I wrote for <a title="A Framework for Evaluating Continuous Integration Tools" href="http://www.cmcrossroads.com/cm-journal-articles/13530-an-evaluation-framework-for-continuous-integration-tools" target="_blank">CMCrossroads</a>. In it I provide a framework for evaluating CI tools, and give you a checklist and ranking system to help you organize and rate your evalution.</p>
<p>The 2nd installment of the hands-on tool evaluation is a few days away &#8211; stay tuned for how the four tools (Hudson, Mojo, Bamboo and TeamCity) fare on providing access to common development tools and on enabling you to assemble complex build workflows.</p>
<p>Happy Building!</p>
<p>- Matt</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mlaudato.wordpress.com/157/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mlaudato.wordpress.com/157/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mlaudato.wordpress.com/157/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mlaudato.wordpress.com/157/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mlaudato.wordpress.com/157/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mlaudato.wordpress.com/157/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mlaudato.wordpress.com/157/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mlaudato.wordpress.com/157/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mlaudato.wordpress.com/157/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mlaudato.wordpress.com/157/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mlaudato.wordpress.com/157/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mlaudato.wordpress.com/157/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mlaudato.wordpress.com/157/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mlaudato.wordpress.com/157/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=157&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technistas.com/2010/06/16/a-framework-for-evaluating-continuous-integration-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/90efc31e9a7f560c2586a27fb4ef2a0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matthew D. Laudato</media:title>
		</media:content>
	</item>
		<item>
		<title>Comparing Continuous Integration Tools, Part 1</title>
		<link>http://technistas.com/2010/06/07/comparing-continuous-integration-tools-part-1/</link>
		<comments>http://technistas.com/2010/06/07/comparing-continuous-integration-tools-part-1/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 16:09:55 +0000</pubDate>
		<dc:creator>Matthew D. Laudato</dc:creator>
				<category><![CDATA[build management]]></category>
		<category><![CDATA[Bamboo]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Mojo]]></category>
		<category><![CDATA[TeamCity]]></category>

		<guid isPermaLink="false">http://technistas.com/?p=151</guid>
		<description><![CDATA[One of the more enjoyable parts of my job at OpenMake Software is getting to examine and analyze the various build tools on the market. This is partly to see what the competition is up to, and partly to make sure that I can effectively communicate the technical bits with our customers, many of whom have multiple [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=151&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>One of the more enjoyable parts of my job at <a title="OpenMake Software Website" href="http://www.openmakesoftware.com" target="_blank">OpenMake Software</a> is getting to examine and analyze the various build tools on the market. This is partly to see what the competition is up to, and partly to make sure that I can effectively communicate the technical bits with our customers, many of whom have multiple build tools in their environments.</p>
<p>To that end, I recently embarked on a continuous integration tool evaluation. I chose to look at <a title="Hudson Website" href="http://hudson-ci.org/" target="_blank">Hudson</a>, an opensource tool commercially supported by Sun Microsystems;  <a title="TeamCity Website" href="http://www.jetbrains.com/teamcity/" target="_blank">TeamCity</a>, a commercial tool from JetBrains;  <a title="Bamboo Website" href="http://www.atlassian.com/software/bamboo/" target="_blank">Bamboo</a>, a commercial tool from Atlassian; and <a title="Mojo Website" href="http://www.openmakesoftware.com/MojoHome" target="_blank">Mojo</a>, a freeware and commercially supported tool from OpenMake Software. My goal was to compare the tools along several vectors:</p>
<ul>
<li>Installation</li>
<li>Configuration</li>
<li>Running a simple job</li>
<li>Viewing logs</li>
<li>Interacting with source control</li>
<li>Performing complex distributed build workflows</li>
</ul>
<p>I decided to break the effort into two parts. The first part, covered in this post, is the &#8216;getting my feet wet&#8217; portion of the evaluation. I tackled the first four bullets above to get a sense of how the tools were installed and configured, and to see if I could get them each to do something useful. The useful thing was to run a job that spits out the current environment, the equivalent of running the &#8216;set&#8217; command from a DOS prompt in Windows.</p>
<p>The table below summarizes my findings, and below that, I give some general impressions about the tools and the evaluation process.</p>
<table border="1">
<col style="width:155pt;" span="1" width="207"></col>
<col style="width:191pt;" span="1" width="255"></col>
<col style="width:193pt;" span="1" width="257"></col>
<col style="width:192pt;" span="1" width="256"></col>
<col style="width:193pt;" span="1" width="257"></col>
<tbody>
<tr style="height:15pt;">
<td style="width:155pt;height:15pt;" width="207" height="20">PRODUCT:</td>
<td style="width:191pt;" width="255">Mojo</td>
<td style="width:193pt;" width="257">Bamboo</td>
<td style="width:192pt;" width="256">Hudson</td>
<td style="width:193pt;" width="257">Team City</td>
</tr>
<tr style="height:15pt;">
<td style="width:155pt;height:15pt;" width="207" height="20">FEATURE:</td>
<td style="width:191pt;" width="255"> </td>
<td style="width:193pt;" width="257"> </td>
<td style="width:192pt;" width="256"> </td>
<td style="width:193pt;" width="257"> </td>
</tr>
<tr style="height:15pt;">
<td style="width:155pt;height:15pt;" width="207" height="20">Version</td>
<td style="width:191pt;" width="255">7.31</td>
<td style="width:193pt;" width="257">2.5.5</td>
<td style="width:192pt;" width="256">1.332</td>
<td style="width:193pt;" width="257">5.1.1</td>
</tr>
<tr style="height:15pt;">
<td style="width:155pt;height:15pt;" width="207" height="20">Installation<br />
method</td>
<td style="width:191pt;" width="255">Windows installer</td>
<td style="width:193pt;" width="257">Windows installer</td>
<td style="width:192pt;" width="256">Executable war file</td>
<td style="width:193pt;" width="257">Windows installer</td>
</tr>
<tr style="height:15pt;">
<td style="width:155pt;height:15pt;" width="207" height="20">Download<br />
size</td>
<td style="width:191pt;" width="255">50M</td>
<td style="width:193pt;" width="257">84M</td>
<td style="width:192pt;" width="256">27M</td>
<td style="width:193pt;" width="257">268M</td>
</tr>
<tr style="height:15pt;">
<td style="width:155pt;height:15pt;" width="207" height="20">Need<br />
License?</td>
<td style="width:191pt;" width="255">Free, unlimited<br />
single-server license</td>
<td style="width:193pt;" width="257">30 day trial</td>
<td style="width:192pt;" width="256">Free, unlimited<br />
single-server license</td>
<td style="width:193pt;" width="257">Free, unlimited<br />
single-server license</td>
</tr>
<tr style="height:105pt;">
<td style="width:155pt;height:105pt;" width="207" height="140">Installation<br />
notes</td>
<td style="width:191pt;" width="255">Does not ask for default<br />
port as part of install. That is configured once you have started the client.<br />
Server starts as part of installation and gets installed as Windows service.<br />
Start Menu group and icons installed for access to thick and web client.</td>
<td style="width:193pt;" width="257">Asks for default port as<br />
part of install. Does not start server as part of startup. When you do start<br />
the server, does not recognize your port choice.</td>
<td style="width:192pt;" width="256">No issues. Hard to figure<br />
out how to change the default ports.</td>
<td style="width:193pt;" width="257">No issues. Asked for<br />
default port in install wizard. Starts server and build agent as windows<br />
service as part of install and then runs web interface.</td>
</tr>
<tr style="height:60pt;">
<td style="width:155pt;height:60pt;" width="207" height="80">Initial<br />
setup</td>
<td style="width:191pt;" width="255">None. If you like the<br />
defaults, then you can create a workflow immediately through the thick client</td>
<td style="width:193pt;" width="257">Asks you to &#8216;Create a Plan&#8217;<br />
as the first activity. Did not like this as it forces me to digest their<br />
meaning of the generic word &#8216;Plan&#8217;</td>
<td style="width:192pt;" width="256">None. If you like the<br />
defaults, then you can create a workflow immediately.</td>
<td style="width:193pt;" width="257">Wants you to create<br />
projects and build configurations but does not define exactly what these are.</td>
</tr>
<tr style="height:165pt;">
<td style="width:155pt;height:165pt;" width="207" height="220">Configuring<br />
a simple job (ENVPEEK - prints build server environment vars to build log)</td>
<td style="width:191pt;" width="255">Easy. Create a workflow,<br />
add a &#8216;Mojo | Execute shell command&#8217; activity, and type in the command<br />
(&#8216;set&#8217;).</td>
<td style="width:193pt;" width="257">Difficult. In order to<br />
&#8216;Create a Plan&#8217; you need to go through an 8 step wizard. The second wizard<br />
screen requires you to select an SCM system and a repository location. I had<br />
to give it a repository location from my Subversion server to get past this<br />
screen. Annoying, since for this job I don&#8217;t care about SCM. Rest of the<br />
wizard was OK, but way too many steps just to set up a simple job.</td>
<td style="width:192pt;" width="256">Easy. Create a new build<br />
job. Use the &#8216;Execute Windows batch command&#8217; option and type in the command<br />
(&#8216;set&#8217;).</td>
<td style="width:193pt;" width="257">Moderate. Team City asks<br />
you to create a project, which is pretty easy. You then have to create at<br />
least one Build Configuration. There is a web-based wizard that like Bamboo<br />
has an SCM screen, but you can choose to ignore it. You can then choose a<br />
command line Build Runner, in which you specify the &#8216;set&#8217; command.</td>
</tr>
<tr style="height:135pt;">
<td style="width:155pt;height:135pt;" width="207" height="180">Running<br />
a simple job</td>
<td style="width:191pt;" width="255">Easy. Open the workflow,<br />
either in the thick client or in the web interface, and press the run button.<br />
Runs successfully</td>
<td style="width:193pt;" width="257">Moderate. From the Bamboo<br />
home, select the Plan, then select &#8216;Run Build&#8217; from the Plan Actions menu on<br />
the right. Because of the SCM choice, even jobs that don&#8217;t require SCM will<br />
check out from Subversion. Tool is geared for building code projects &#8211; does not appear to be a general workflow tool.</td>
<td style="width:192pt;" width="256">Easy. Select the job and<br />
select the &#8216;Schedule a build&#8217; button.</td>
<td style="width:193pt;" width="257">Easy. From the Project tab,<br />
find the project that you want to run and then click on the Run… button.</td>
</tr>
<tr style="height:120pt;">
<td style="width:155pt;height:120pt;" width="207" height="160">Viewing<br />
job logs</td>
<td style="width:191pt;" width="255">Easy. In the thick client,<br />
open the workflow, and go to the History/Trends tab. Select the run that you<br />
want to see and double-click. In the web interface, select the workflow and<br />
submit a query to retrieve the run information. Select the specific run you<br />
want to view.</td>
<td style="width:193pt;" width="257">Moderate. You have to click<br />
on the plan, then the Completed Builds tab, then click on the build you want,<br />
then click on its Logs tab. Lots of drilling down required.</td>
<td style="width:192pt;" width="256">Easy. Click on the Job name<br />
and then select any link from the Build History link.</td>
<td style="width:193pt;" width="257">Easy. From the Projects<br />
tab, click on the Project that you want to view. Select the link for the run<br />
that you want to view.</td>
</tr>
</tbody>
</table>
<p> </p>
<p>Overall, Hudson and Mojo were the easiest tools to install and use. Hudson definitely takes the cake when it comes to installation, since you don&#8217;t have to install it &#8211; you just run the executable war file from the command line. Mojo, TeamCity and Bamboo have more traditional installers, of which the Mojo install was the most straight-forward, asking the fewest questions before proceeding with the install. Atlassian&#8217;s Bamboo has the most restrictive trial license, but Mojo, Hudson and TeamCity all have a more open approach &#8211; you can use them in very useful forms without any cost or special licensing.</p>
<p>Once the tools were installed, I next looked to do any initial configuration, which I define loosely as &#8216;stuff the tool requires me to do before it lets me do what I really want to do&#8217;. On this measure, I again put Mojo and Hudson in the lead, as I didn&#8217;t have to do anything &#8211; I just went straight to thinking about the job I wanted to run. TeamCity wanted me to create a project and a build configuration, which was fairly easy &#8211; but I had to figure out what they meant by &#8216;project&#8217; and &#8216;build configuration&#8217;. Bamboo was by far the most difficult tool to configure. Any time I see an 8-step wizard just to turn the engine over and get the motor running, my initial response is &#8216;who wrote this thing&#8217;?</p>
<p>Getting the actual job configured was again easy in Mojo and Hudson. The Mojo interface is very straight-forward &#8211; you select a machine to run on, and then start adding workflow steps (called activities). There is a large built-in list of activities (around 50) for interacting with commercial and opensource tools. I used the &#8216;Execute shell script&#8217; activity type to run the set command, and that constituted the entirely of my &#8216;ENVPEEK&#8217; job. Hudson was also easy to set up. TeamCity and Bamboo were the most painful to set up for actual jobs &#8211; you are forced into their concepts, instead of just being able to think about the job at hand. The other comment on both TeamCity and Bamboo is that they are both very &#8216;source code biased&#8217;. By that I mean that they have an implicit assumption that your jobs require interaction with source control. In both tools I was required to specify a location in a source control tool (I used Subversion from Collabnet). Since my initial job was a codeless one, this was annoying.</p>
<p>Running jobs in all tools is fairly easy, as is reviewing the logs &#8211; though in Bamboo I did have drill down quite a bit to get to my logs. Going back to my &#8216;source control bias&#8217; comment, Bamboo needed to check out code from a repository location that I specified &#8211; and then ignored it since my inital job was just to run &#8216;set&#8217;.</p>
<p>Next installment: doing actual code builds with each of the tools, and then putting together complex build processes.</p>
<p>Happy Building!</p>
<p>- Matt</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mlaudato.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mlaudato.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mlaudato.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mlaudato.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mlaudato.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mlaudato.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mlaudato.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mlaudato.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mlaudato.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mlaudato.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mlaudato.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mlaudato.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mlaudato.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mlaudato.wordpress.com/151/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=151&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technistas.com/2010/06/07/comparing-continuous-integration-tools-part-1/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/90efc31e9a7f560c2586a27fb4ef2a0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matthew D. Laudato</media:title>
		</media:content>
	</item>
		<item>
		<title>The Build Engineer&#8217;s Desktop</title>
		<link>http://technistas.com/2010/03/22/the-build-engineers-desktop/</link>
		<comments>http://technistas.com/2010/03/22/the-build-engineers-desktop/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 14:00:34 +0000</pubDate>
		<dc:creator>Matthew D. Laudato</dc:creator>
				<category><![CDATA[build management]]></category>
		<category><![CDATA[build engineer]]></category>
		<category><![CDATA[desktop environment]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://technistas.com/?p=144</guid>
		<description><![CDATA[Programming environments have come a long way from when I started in this business. I can recall loading programs from cassette tape into my Timex Sinclair computer in high school, and fumbling with the VAX editor in college. By the early 80&#8242;s, I found my self in graduate school with a mix of new (a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=144&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Programming environments have come a long way from when I started in this business. I can recall loading programs from cassette tape into my Timex Sinclair computer in high school, and fumbling with the VAX editor in college. By the early 80&#8242;s, I found my self in graduate school with a mix of new (a microVAX) and old (a military surplus Raytheon 700, on which debugging amounted to reading hex codes from lights on the front panel and literally pressing the &#8216;step&#8217; switch to move through the program).</p>
<p>Fast forward through the 90&#8242;s and into the new century, and things have changed quite a bit. Java programmers have Eclipse and other rich programming environments. If you work with the Microsoft technologies, Visual Studio has given you an increasingly powerful and convenient desktop over the past 15 years. Even database engineers have integrated environments where they can program and manage their database deployments. It seems that no matter what your role in the software business, there is a desktop tool for you. Which brings me to the topic of today&#8217;s post &#8211; the build engineer&#8217;s desktop.</p>
<p>It seems to me that the build engineer has drawn the short straw from software vendors. From this engineer we expect solutions to hard problems &#8211; complex compile and link sequences, deployments to test, staging and production environments, and a great deal of programming to make it all happen. But as a build engineer, your tool set is limited. You are expected to code, debug and deploy using a plain text editor, and cobble your scripts together <em>ad hoc</em>, with no centralized platform or desktop environment to act as your command center.</p>
<p>Enter <a href="http://www.openmakesoftware.com/MeisterHome">OpenMake Meister</a>. If you&#8217;re a build engineer, sitting down at the Meister client is like stepping into the cockpit of a 747. In one powerful desktop environment, you can assemble complex compile, link and archive services, manage deployments, do dependency analysis, create distributed workflows, write reusable scripts, and fully control the build, test and deploy services that your company demands of you.</p>
<p>I won&#8217;t go into all the details here, but build engineers, here&#8217;s a tip for you: stop scripting and start managing your build process. Take a look at <a href="http://www.openmakesoftware.com/MeisterHome">OpenMake Meister</a>, the build engineer&#8217;s desktop.</p>
<p>Happy Building!</p>
<p>- Matt</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mlaudato.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mlaudato.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mlaudato.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mlaudato.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mlaudato.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mlaudato.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mlaudato.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mlaudato.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mlaudato.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mlaudato.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mlaudato.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mlaudato.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mlaudato.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mlaudato.wordpress.com/144/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=144&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technistas.com/2010/03/22/the-build-engineers-desktop/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/90efc31e9a7f560c2586a27fb4ef2a0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matthew D. Laudato</media:title>
		</media:content>
	</item>
		<item>
		<title>Continuous Build Automation with Subversion and Meister</title>
		<link>http://technistas.com/2010/01/22/continuous-build-automation-with-subversion-and-meister/</link>
		<comments>http://technistas.com/2010/01/22/continuous-build-automation-with-subversion-and-meister/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 19:59:00 +0000</pubDate>
		<dc:creator>Matthew D. Laudato</dc:creator>
				<category><![CDATA[agile software development]]></category>
		<category><![CDATA[build management]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[SCM]]></category>

		<guid isPermaLink="false">http://technistas.com/?p=132</guid>
		<description><![CDATA[I recently got a chance to work on a project using Collabnet Subversion and OpenMake Meister and put together a short demo on how to get the two tools to work together doing continuous integration. You can view it at http://www.openmakesoftware.com/flashdemo/Meister-SVN/omsvn_small/omsvn_small.html Meister like most CI tools has several ways to kick off a CI build. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=132&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I recently got a chance to work on a project using Collabnet Subversion and OpenMake Meister and put together a short demo on how to get the two tools to work together doing continuous integration. You can view it at <a title="Continuous Builds with Meister and Subversion" href="http://www.openmakesoftware.com/flashdemo/Meister-SVN/omsvn_small/omsvn_small.html" target="_blank">http://www.openmakesoftware.com/flashdemo/Meister-SVN/omsvn_small/omsvn_small.html</a></p>
<p>Meister like most CI tools has several ways to kick off a CI build. You can do a scheduled build, or you can poll the SCM system. The third way of doing a CI build is to call the build from a Subversion hook. In the demo I show two of these methods: a scheduled build in Meister, and calling Meister from the Subversion post commit hook.</p>
<p>The setup is pretty simple. I have a repository in Subversion that has working copies for developers, and what I&#8217;ll call a &#8216;hands off&#8217; working copy that only the build process uses (meaning, no developers are ever in that copy making changes. It receives changes strictly through a &#8216;svn update&#8217; command run by the CI process). In Meister, I have a workflow that knows how to build a small DOS application from some code in the repository.</p>
<p>In the demo, I first show Meister running a build on a schedule. Meister updates the &#8216;hands off&#8217; working copy and then compiles and links the code. In the second case, I turn off the scheduler, and instead activate the post commit hook in the Subversion repository. The hook code calls the Meister command line, which looks like this:</p>
<p>&nbsp;</p>
<pre>java -cp c:\openmake-meister\client\bin\omcmdline.jar com.openmake.cmdline.Main
-BUILD "WINDOWS BUILD WITH SVN"</pre>
<p>&nbsp;</p>
<p>The same workflow runs in both cases. The advantage of running from the hook is that you are always guaranteed that every transaction in Subversion gets built. On the other hand, setting a scheduler to run every hour is easy and might be more appropriate for shops with less frequent code changes. In both cases Meister is driving the build with its dependency analysis engine, so the builds are fast and highly parallelized.</p>
<p>Overall it was pretty easy both to get the Subversion repository configured, and to get the Meister workflow up and running. The Meister command line lets you do things like set environment variables (not shown above), so you can control the workflow at a fine level of detail.</p>
<p>Happy Building!<br />
- Matt</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mlaudato.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mlaudato.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mlaudato.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mlaudato.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mlaudato.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mlaudato.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mlaudato.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mlaudato.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mlaudato.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mlaudato.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mlaudato.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mlaudato.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mlaudato.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mlaudato.wordpress.com/132/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=132&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technistas.com/2010/01/22/continuous-build-automation-with-subversion-and-meister/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/90efc31e9a7f560c2586a27fb4ef2a0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matthew D. Laudato</media:title>
		</media:content>
	</item>
		<item>
		<title>Practical Salesforce Programming</title>
		<link>http://technistas.com/2009/12/09/practical-salesforce-programming/</link>
		<comments>http://technistas.com/2009/12/09/practical-salesforce-programming/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 15:43:19 +0000</pubDate>
		<dc:creator>Matthew D. Laudato</dc:creator>
				<category><![CDATA[Salesforce programming]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Salesforce API]]></category>
		<category><![CDATA[SOAP]]></category>

		<guid isPermaLink="false">http://technistas.com/?p=122</guid>
		<description><![CDATA[As most of my readers know, I like to write about work-related items &#8211; a webinar I&#8217;m hosting, a review of an article that is relevant to my day-to-day work in the software business, or some such thing. But every now and then I need to remind myself of what got me into this business [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=122&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>As most of my readers know, I like to write about work-related items &#8211; a webinar I&#8217;m hosting, a review of an article that is relevant to my day-to-day work in the software business, or some such thing. But every now and then I need to remind myself of what got me into this business in the first place &#8211; a sheer love of figuring out how to program something.</p>
<p>Last week, the something was Salesforce.com, the leading customer relations management software product on the web. We use Salesforce at the company I work for (<a title="OpenMake Software, Inc." href="http://www.openmakesoftware.com" target="_blank">OpenMake Software, Inc.</a>) to help track how we communicate with customers and prospects. One of the cool things that Salesforce lets you do is to send out an email to a large list &#8211; no, not spam, but legitimate communications to people who have agreed to hear from you. As anyone who has tried to send out a mass mailing knows, all email lists are dirty &#8211; meaning, there are addresses on the list that are no longer valid and that result in a bounced email. So my task was to figure out a way to programatically set the email &#8216;opt out&#8217; bit on the associated record in Salesforce.</p>
<p>Salesforce has an excellent web services API that gives you complete access to the underlying data model. I decided to tackle the problem using my favorite Swiss-army bazooka, Perl, along with a Perl module that I found on the internet called &#8216;Salesforce&#8217;. Once I installed the Salesforce module, the code was pretty easy to write.</p>
<p>The program assumes that you have a text file that contains a list of the email addresses that have bounced, separated by a newline character. Here&#8217;s the code:</p>
<pre>use Salesforce;
use Getopt::Long;

# Gather command line parms
my ($user, $password, $bounceFileName, $update);
my $result = GetOptions ("user=s" =&gt; \$user,
			"password=s" =&gt; \$password,
			"bounceFileName=s" =&gt; \$bounceFileName,
			"update" =&gt; \$update);

# Set up the SOAP service and login
my $service = new Salesforce::SforceService();
my $sf = $service-&gt;get_port_binding('Soap');
my $login_ok = $sf-&gt;login('username' =&gt; $user, 'password' =&gt; $password);
die "Bad login" unless $login_ok;
print "Login OK";

# Loop through the bounce file and process each bounced email address
open (BOUNCE, $bounceFileName) || die "Can't open file: $bounceFileName";
while (&lt;BOUNCE&gt;) {

	# Get the lead from SF
	chomp($_);
	my $leadEmail = $_;
	print "\nProcessing lead email: $leadEmail ";
	my $result = $sf-&gt;query('query' =&gt; "select id, hasoptedoutofemail from
                                             lead where email='$leadEmail'",
                                             'limit' =&gt; '1');
	my $leadID = $result-&gt;result-&gt;{'records'}-&gt;{'Id'}[0];
	my $hasOptedOut = $result-&gt;result-&gt;{'records'}-&gt;{'HasOptedOutOfEmail'};
	print "Lead id is: $leadID. Opt out status is: $hasOptedOut\n";

	if ($update) {
		my $lead = $result-&gt;result-&gt;{'records'};
		$lead-&gt;{'Id'} = "$leadID";
		$lead-&gt;{'HasOptedOutOfEmail'} = 'true';

		my $updateresult = $sf-&gt;update(%$lead);
		my $updreshash = $updateresult-&gt;result;
		print "Update status: $updreshash-&gt;{success}\n";
	}
}
close (BOUNCE);

1;</pre>
<p> </p>
<p>As you can see, the code is pretty simple. In the initial block, we use the standard getopt functionality to get the name of the bounce file, along with the Salesforce userid and password. One comment about the password, you need to append your Salesforce security token to your standard Salesforce password &#8211; this is a standard technique in Salesforce and in many other cloud computing environments. We also set an &#8216;update&#8217; flag &#8211; if it is set, we will not only query the database for the existence of a bounced email record, but we will also attempt to update the opt out bit.</p>
<p>The next block sets up the Salesforce SOAP service and binds to it. Once this is done, you are ready to make queries and update the Salesforce database. Salesforce uses the SOQL query language to interact with its database. In the code, we first open up and then iterate over the bounce file. Each time through the loop, we perform a query to pull the record associated with the bounced email address from the Salesforce database. If the update flag is set, we then prepare the record (as a Perl hash) for update and use the &#8216;update&#8217; method to push the change to Salesforce.</p>
<p>I found working with the Salesforce API to be fairly straightforward. The only hard part was figuring out the exact format of the records that come back from Salesforce &#8211; in some earlier versions of the code, I just used Data::Dumper to peek inside the SOAP envelopes to determine the structure. All in all, it was a few hours of learning the API and the data formats, with the end result being a functional and useful piece of code.</p>
<p>Hope this helps, and happy coding!</p>
<p>- Matt</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mlaudato.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mlaudato.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mlaudato.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mlaudato.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mlaudato.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mlaudato.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mlaudato.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mlaudato.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mlaudato.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mlaudato.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mlaudato.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mlaudato.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mlaudato.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mlaudato.wordpress.com/122/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=122&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technistas.com/2009/12/09/practical-salesforce-programming/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/90efc31e9a7f560c2586a27fb4ef2a0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matthew D. Laudato</media:title>
		</media:content>
	</item>
		<item>
		<title>Speedy Java builds slow down productivity</title>
		<link>http://technistas.com/2009/12/03/speedy-java-builds-slow-down-productivity/</link>
		<comments>http://technistas.com/2009/12/03/speedy-java-builds-slow-down-productivity/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 20:27:57 +0000</pubDate>
		<dc:creator>Matthew D. Laudato</dc:creator>
				<category><![CDATA[build management]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[java build speed]]></category>

		<guid isPermaLink="false">http://technistas.com/?p=111</guid>
		<description><![CDATA[I never cease to be amazed at how software development management ignores the build problem. In a recent article in SDTimes, Alex Handy reports on a survey undertaken by RedMonk that found Java developers spend nearly 8 minutes per hour doing software builds. In round numbers, that&#8217;s an hour a day, 5 hours a week, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=111&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I never cease to be amazed at how software development management ignores the build problem. In a <a title="Speedy Java Builds" href="http://www.sdtimes.com/SURVEY_FINDS_THAT_INCREMENTAL_JAVA_BUILDS_ARE_SPEEDING_UP/By_Alex_Handy/About_JAVA_and_ZEROTURNAROUND/33867" target="_blank">recent article in SDTimes</a>, <a title="Alex Handy" href="http://www.sdtimes.com/about/AlexHandy" target="_blank">Alex Handy</a> reports on a survey undertaken by RedMonk that found Java developers spend nearly 8 minutes per hour doing software builds. In round numbers, that&#8217;s an hour a day, 5 hours a week, and for a typical 48 week year, nearly 30 work days every year. Let me repeat that. Your Java developers, who are presumably paid $80-120k per year, are spending 30 days per year staring at their screens waiting for builds. If we take the middle of this range, this is a productivity loss of over $12,000 per year per developer. For a small 5-10 person team, you could hire an extra developer just with the savings from improving your build process.</p>
<p>The article goes on to say that Java developers &#8220;have learned to build smaller portions of their projects at a time, or to compile small pieces of code and inject them into running applications&#8221;. I&#8217;m trying to think of two worse practices in professional software development. If you build a smaller portion of your project, you risk having unsatisfied dependencies, and thus wasting time when your runtime fails to operate properly. Similarly, injecting code into a running application is dangerous even in a test environment for similar reasons &#8211; you haven&#8217;t spent any time understanding the dependencies, and therefore are at risk of dependency-related failures.</p>
<p>As my readers know, I work for a software company (<a title="OpenMake Software" href="http://www.openmakesoftware.com/Get-Meister/" target="_blank">OpenMake Software</a>) that sells a software build and workflow automation product. We have tens of thousands of Java developers using our product through our <a title="Meister for Eclipse" href="http://www.eclipseplugincentral.com/Web_Links-index-req-viewlink-cid-977.html" target="_blank">Eclipse plugin</a>, which gives you true incremental builds that take dependencies into account. You can build, test and do a test deploy all from within Eclipse, and not have to resort to trickery such as injecting partial code into your test server. Since the cost of Meister (which I am not at liberty to publish here) is significantly less per developer than the annual productivity loss calculated above, it makes sense for development managers to move their Java developers away from the wild west of desktop builds, and consider a formal build system. Anything less and you&#8217;re ignoring one of your primary missions as a manager: controlling the development process.</p>
<p>Happy Building!</p>
<p>- Matt</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mlaudato.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mlaudato.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mlaudato.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mlaudato.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mlaudato.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mlaudato.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mlaudato.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mlaudato.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mlaudato.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mlaudato.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mlaudato.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mlaudato.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mlaudato.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mlaudato.wordpress.com/111/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=111&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technistas.com/2009/12/03/speedy-java-builds-slow-down-productivity/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/90efc31e9a7f560c2586a27fb4ef2a0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matthew D. Laudato</media:title>
		</media:content>
	</item>
		<item>
		<title>Life in the Inner Circle</title>
		<link>http://technistas.com/2009/11/19/life-in-the-inner-circle/</link>
		<comments>http://technistas.com/2009/11/19/life-in-the-inner-circle/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 01:49:38 +0000</pubDate>
		<dc:creator>Matthew D. Laudato</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://technistas.com/?p=108</guid>
		<description><![CDATA[The Microsoft Inner Circle, that is. OpenMake Software, the company I am proud to work for, has announced our new status as a Microsoft Inner Circle Partner. For the details, you can read the press release here. This is great news for OpenMake and for Microsoft. Microsoft will get our willing help in improving the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=108&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The Microsoft Inner Circle, that is. OpenMake Software, the company I am proud to work for, has announced our new status as a Microsoft Inner Circle Partner. For the details, you can read the press release <a href="http://www.prnewswire.com/news-releases/openmake-software-joins-the-microsoft-inner-circle-70359407.html">here</a>.</p>
<p>This is great news for OpenMake and for Microsoft. Microsoft will get our willing help in improving the ALM processes of its customers, and OpenMake will participate in important product launches such as the upcoming Visual Studio 2010 release.</p>
<p>Happy Building!</p>
<p>- Matt</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mlaudato.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mlaudato.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mlaudato.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mlaudato.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mlaudato.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mlaudato.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mlaudato.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mlaudato.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mlaudato.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mlaudato.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mlaudato.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mlaudato.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mlaudato.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mlaudato.wordpress.com/108/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=108&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technistas.com/2009/11/19/life-in-the-inner-circle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/90efc31e9a7f560c2586a27fb4ef2a0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matthew D. Laudato</media:title>
		</media:content>
	</item>
		<item>
		<title>Integrating OpenMake Meister with Archiva</title>
		<link>http://technistas.com/2009/11/12/integrating-openmake-meister-with-archiva/</link>
		<comments>http://technistas.com/2009/11/12/integrating-openmake-meister-with-archiva/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 03:12:19 +0000</pubDate>
		<dc:creator>Matthew D. Laudato</dc:creator>
				<category><![CDATA[build management]]></category>
		<category><![CDATA[OpenMake Meister]]></category>
		<category><![CDATA[Software Configuration Management]]></category>
		<category><![CDATA[software process automation]]></category>

		<guid isPermaLink="false">http://technistas.com/?p=66</guid>
		<description><![CDATA[Archiva (http://archiva.apache.org) is an open source repository manager that lets users access binary and other objects for use during software builds and deploys. Its functionality is similar in many ways to traditional version control systems, and OpenMake Meister (http://www.openmakesoftware.com) integrates with it as such. There are three ways to integrate with Archiva using Meister. 1.       Via the file [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=66&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Archiva (<a title="http://archiva.apache.org" href="http://archiva.apache.org" target="_blank">http://archiva.apache.org</a>) is an open source repository manager that lets users access binary and other objects for use during software builds and deploys. Its functionality is similar in many ways to traditional version control systems, and OpenMake Meister (<a title="http://www.openmakesoftware.com" href="http://www.openmakesoftware.com" target="_blank">http://www.openmakesoftware.com</a>) integrates with it as such. There are three ways to integrate with Archiva using Meister.</p>
<p>1.       Via the file system. Archiva stores objects transparently in a structured way on the file system. To include the contents of an Archiva repository, create an entry in a Meister Dependency Directory with an appropriate name, that contains a path to the repository location. For example, the default archiva installation includes JUnit 3.8.1. Creating a Dependency directory with the name ‘JUNIT381’ and the value ‘C:\tools\archiva-1.2.2\data\repositories\internal\junit\junit\3.8.1’ will enable Meister to include any libraries found in this directory as part of Meister builds. I don&#8217;t really recommend this method, since someday the transparency of the files may change in Archiva. But it works in a quick and dirty way.</p>
<p>2.       Through a webdav client. The native interface to Archiva is WebDAV (see <a title="http://www.ietf.org/rfc/rfc2518.txt" href="http://www.ietf.org/rfc/rfc2518.txt" target="_blank">http://www.ietf.org/rfc/rfc2518.txt</a> for the WebDAV RFC). A Meister activity can be easily created to execute a command line GET operation against the Archiva repository. For example, if you use the BitKinex file transfer client, you can retrieve junit-3.8.1.jar by using a Meister activity that runs the following command:</p>
<pre style="text-align:justify;">URL=http://localhost:8080/archiva/repository/internal/junit/junit/3.8.1/junit-3.8.1.jar</pre>
<pre style="text-align:justify;">bitkinex.exe cp /noinfo /force $(URL) c:\temp</pre>
<p>
<p>
This retrieves the file and copies it to c:\temp, where it can be used as part of a build. This is probably the best solution. When building, you really want a local copy of the files, at the very least for audit purposes, and there are plenty of WebDAV clients out there.</p>
<p>3.       Mapping a web drive. Most operating systems support mapping a network drive to a web location. For example, on Windows, you can add access to the JUnit 3.8.1 repository by mapping a drive in DOS as:</p>
<pre>net use Z: “http://localhost/archiva/repository/internal/junit/junit/3.8.1”</pre>
<p>
<p>
Once this is complete, you can access the files in the repository simply by referencing drive Z: in a Meister Dependency Directory. One restriction, on Windows XP your repository must be running on port 80, as Windows does not support web drives on any other port. This is also a pretty good method, but it eats up drive letters fairly quickly if you have many libraries that you want to uniquely map.</p>
<p>I&#8217;ve tried all three methods in my build lab, and while I don&#8217;t think I would use Archiva in a production environment (my bias is towards actual SCM systems or a managed file system for storing 3rd party build dependencies), it definitely &#8216;worked&#8217; and was fairly easy to integrate with.</p>
<p>Happy Building!</p>
<p>- Matt</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mlaudato.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mlaudato.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mlaudato.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mlaudato.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mlaudato.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mlaudato.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mlaudato.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mlaudato.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mlaudato.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mlaudato.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mlaudato.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mlaudato.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mlaudato.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mlaudato.wordpress.com/66/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=66&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technistas.com/2009/11/12/integrating-openmake-meister-with-archiva/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/90efc31e9a7f560c2586a27fb4ef2a0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matthew D. Laudato</media:title>
		</media:content>
	</item>
		<item>
		<title>A Tale of Four Builds</title>
		<link>http://technistas.com/2009/10/16/a-tale-of-four-builds/</link>
		<comments>http://technistas.com/2009/10/16/a-tale-of-four-builds/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 13:09:49 +0000</pubDate>
		<dc:creator>Matthew D. Laudato</dc:creator>
				<category><![CDATA[build management]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[OpenMake Meister]]></category>
		<category><![CDATA[Software Configuration Management]]></category>
		<category><![CDATA[software process automation]]></category>

		<guid isPermaLink="false">http://technistas.com/?p=61</guid>
		<description><![CDATA[After a long break from blogging, I&#8217;m back. I&#8217;d like to invite all my viewers to a webinar that I&#8217;m hosting on Wednesday October 21, 2pm EST. The webinar is titled &#8216;A Tale of Four Builds&#8217;. In it I take a single piece of code and build it using four different build technologies. This survey [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=61&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>After a long break from blogging, I&#8217;m back. I&#8217;d like to invite all my viewers to a webinar that I&#8217;m hosting on Wednesday October 21, 2pm EST. The webinar is titled &#8216;A Tale of Four Builds&#8217;. In it I take a single piece of code and build it using four different build technologies. This survey of build methodologies moves from manual, error-prone processes to highly controlled and repeatable processes. If you&#8217;re a software engineer, development manager or build and tools manager, this webinar will help you sort out the pros and cons of the various build technologies that are common in today&#8217;s software environment.</p>
<p>Hope to see you there. To register, go to: <a href="https://www1.gotomeeting.com/register/554771256">https://www1.gotomeeting.com/register/554771256</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mlaudato.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mlaudato.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mlaudato.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mlaudato.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mlaudato.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mlaudato.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mlaudato.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mlaudato.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mlaudato.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mlaudato.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mlaudato.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mlaudato.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mlaudato.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mlaudato.wordpress.com/61/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technistas.com&amp;blog=2548132&amp;post=61&amp;subd=mlaudato&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technistas.com/2009/10/16/a-tale-of-four-builds/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/90efc31e9a7f560c2586a27fb4ef2a0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matthew D. Laudato</media:title>
		</media:content>
	</item>
	</channel>
</rss>
