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

<channel>
	<title>From The Trenches Of IT &#187; Steve McDonald</title>
	<atom:link href="http://sites.tufts.edu/trenchesofit/author/smcdon08/feed/" rel="self" type="application/rss+xml" />
	<link>http://sites.tufts.edu/trenchesofit</link>
	<description></description>
	<lastBuildDate>Wed, 13 Apr 2011 13:19:12 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Web Operations</title>
		<link>http://sites.tufts.edu/trenchesofit/2011/02/27/web-operations/</link>
		<comments>http://sites.tufts.edu/trenchesofit/2011/02/27/web-operations/#comments</comments>
		<pubDate>Sun, 27 Feb 2011 18:27:05 +0000</pubDate>
		<dc:creator>Steve McDonald</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://sites.tufts.edu/trenchesofit/?p=111</guid>
		<description><![CDATA[Web Operations is a terrific book. Baron Schwarz&#8217;s chapter on web-centric database is especially strong. For databases that serve web sites, availability is key. This is a change from traditional systems, for example back office financial database where consistency was probably most important. Web based databases tend to be read dominated and deal with simple [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://oreilly.com/catalog/0636920000136">Web Operations</a> is a terrific book.  <a href="http://www.xaprb.com/blog/">Baron Schwarz&#8217;s</a> chapter on web-centric database is especially strong.  For databases that serve web sites, availability is key.  This is a change from traditional systems, for example back office financial database where consistency was probably most important.  Web based databases tend to be read dominated and deal with simple queries.  Writes, when they occur, tend to affect only a single row.  Schwarz emphasizes simplicity wherever possible, to the extent of avoiding stored procedures, foreign key constraints, triggers or views.  These features negatively affect performance and complicate solution that address scaling.  </p>
<p>When trying to improve performance, caching is usually an easy win.  Its also important to apply user quotas to potentially costly resources.  (For example, enforcing a maximum number of friends may significantly decrease the load to compute a page.)  Since web applications are read dominated, they can often be supported by a database servers in a master/slave hierarchy.  Only database writes are sent directly to the master.  These updates are duplicated on the slaves in a timely manner.  All read operations use a slave server.  One slave is often assigned to backup and computationally expensive tasks.  Instead of master/slave servers one can use knowledge about the application and partition the database across functional requirements.  Instead of a series of identical slaves, the data is divided based on value, required access time or some other intelligent metric.</p>
<p>Schwartz gives a nice discussion of sharding and why it often isn&#8217;t he right solution.   Under a section titled more risky solutions that should not be used, he lists multiple write masters, multilevel replication, ring replication, and entity attribute value databases.</p>
]]></content:encoded>
			<wfw:commentRss>http://sites.tufts.edu/trenchesofit/2011/02/27/web-operations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introduction To NetApp</title>
		<link>http://sites.tufts.edu/trenchesofit/2011/02/16/introduction-to-netapp/</link>
		<comments>http://sites.tufts.edu/trenchesofit/2011/02/16/introduction-to-netapp/#comments</comments>
		<pubDate>Wed, 16 Feb 2011 20:10:37 +0000</pubDate>
		<dc:creator>Steve McDonald</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://sites.tufts.edu/trenchesofit/?p=88</guid>
		<description><![CDATA[I sat in on part of a 2-day NetApp presentation. Going in I knew basically nothing about the issues they address. I had to look up NAS, SAN and WORM. The bottom of NetApp&#8217;s architecture diagram contains one or more RAIDs. Above that sits a NetApp aggregate. The aggregate manages the storage resources. An administrator [...]]]></description>
				<content:encoded><![CDATA[<p>I sat in on part of a 2-day <a href="http://www.netapp.com/us/">NetApp</a> presentation.  Going in I knew basically nothing about the issues they address.  I had to look up <a href="http://en.wikipedia.org/wiki/Network-attached_storage">NAS</a>, <a href="http://en.wikipedia.org/wiki/Storage_area_network">SAN</a> and <a href="http://en.wikipedia.org/wiki/Write_Once_Read_Many">WORM</a>. </p>
<p>The bottom of NetApp&#8217;s architecture diagram contains one or more RAIDs.  Above that sits a NetApp aggregate.  The aggregate manages the storage resources.  An administrator creates volumes within the aggregate to provide resources to developers and applications.  One volume can, for example, be configured to provide SAN storage to an Exchange box while another volume provides NSF mounted NAS storage to a research group.   Each volume enforces policies such as WORM storage, data encryption data, provide frequent snapshots, etc.  Via a Gateway, NetApp manages non-NetApps storage resources.</p>
<p>A virtual volume provides data for testing (and may have other uses).  It can provide a zero-storage copy of production data to developers.  </p>
<p>NetApps boxes contain many interface options (GigE, fiber, etc.).  In-box redundant controllers share non-volatile memory so if one controller fails the second continues without the loss of any data.</p>
<p>The storage managed by an aggregate can be increased by adding more drives.  Volumes may be resized on the fly.  The minimum volume size is 20MB.  </p>
]]></content:encoded>
			<wfw:commentRss>http://sites.tufts.edu/trenchesofit/2011/02/16/introduction-to-netapp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing With Selenium 2</title>
		<link>http://sites.tufts.edu/trenchesofit/2011/02/05/testing-with-selenium-2/</link>
		<comments>http://sites.tufts.edu/trenchesofit/2011/02/05/testing-with-selenium-2/#comments</comments>
		<pubDate>Sat, 05 Feb 2011 03:00:07 +0000</pubDate>
		<dc:creator>Steve McDonald</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://sites.tufts.edu/trenchesofit/?p=73</guid>
		<description><![CDATA[With Selenium 2 you can test your web application. The test code basically requires 4 steps: Creates a browser object Sends it to a URL Manipulates UI elements Screen scrapes to verify correct results Its easy, although the screen scraping can be (not surprisingly) a little fragile. I have used Selenium 2 to construct end-to-end [...]]]></description>
				<content:encoded><![CDATA[<p>With <a href="http://seleniumhq.org/docs/09_webdriver.html">Selenium 2</a> you can test your web application.  The test code basically requires 4 steps:</p>
<ul>
<li>Creates a browser object</li>
<li>Sends it to a URL</li>
<li>Manipulates UI elements</li>
<li>Screen scrapes to verify correct results</li>
</ul>
<p>Its easy, although the screen scraping can be (not surprisingly) a little fragile.</p>
<p>I have used Selenium 2 to construct end-to-end tests for the <a href="http://geoportal-demo.atech.tufts.edu">Geo Portal</a>.  The portal is a search tool for an institution&#8217;s repository of geographic information.  The repository holds many thousand layers so the portal must provide appropriate, well-ranked search results.  </p>
<p>When using Selenium 2, you must first create a web browser object and send it to the portal page we want to test:<br />
<code><br />
WebDriver webDriver =  new FirefoxDriver();<br />
webDriver.get("http://geoportal-demo.atech.tufts.edu");<br />
</code></p>
<p>With the browser object in place, the first two steps are complete.  The only things left to do are manipulate UI elements and screen scrape.</p>
<p>For every search the portal executes it, like Google, displays the number of results where each result is a geographic data layer.  These total number of results are displayed in a SPAN element.  Since my tests often rely on the number of layers found, I wrote a function to screen scrape and return the search result count.  The code simply gets the relevant DOM element by its ID, obtains the text and strips of the &#8220;(&#8221; and &#8220;)&#8221; characters that surround  the number.<br />
<code><br />
public static int getSearchResultsCount(WebDriver webDriver)<br />
	{<br />
		WebElement spanElement = webDriver.findElement(By.id("resultsNumber"));<br />
		String text = spanElement.getText();<br />
		String temp = text.replace("(", "");<br />
		temp = temp.replace(")", "");<br />
		int layerCount = Integer.parseInt(temp);<br />
		return layerCount;<br />
	}<br />
</code></p>
<p>The portal supports geo-coding.  That is, there is a text field for the user to enter an address or a place name.  If a location is entered, the application uses Google to obtain geodetic coordinates for the place and uses the type of place to determine the zoom level.  Then, the map is updated and a search for geographic data centered on the new map is performed and the results are displayed.</p>
<p>An easy way to grossly test this functionality is to zoom the map all the way out and note how many layers the search returned.  Then, enter a location to zoom in on a region and note how many layers the search returned.  Since we zoomed in to a small region, many layers should have been considered not relevant and filtered out of the result set.  Therefore, the number of search results should have decreased if the geo-coding worked.  Here&#8217;s the code that performs the geo-coding test:<br />
<code><br />
private static void geoCodingTest(WebDriver webDriver)<br />
	{<br />
		logger.info("  in geoCodingTest");<br />
		zoomToWorld(webDriver);<br />
		pause();<br />
		int startResultsCount = getSearchResultsCount(webDriver);<br />
		setLocation(webDriver, "Boston, MA");<br />
		pause();<br />
		int endResultsCount = getSearchResultsCount(webDriver);<br />
		assertTrue("geoCoding test failed", startResultsCount > endResultsCount);<br />
	}<br />
</code><br />
The function zoomToWorld simply clicks the UI button to zoom the map all the way out.  The function pause sleeps for a second.  This is important because the operation like zooming the map to view the entire world is not instantaneous.  Map tiles and search results must be obtained via AJAX and displayed.  Finally, JUnit&#8217;s assert it used to check the observed results.</p>
<p>Entering text into a UI element is very simple:<br />
<code><br />
private static void setField(WebDriver webDriver, String fieldId, String value)<br />
	{<br />
		WebElement field = webDriver.findElement(By.id(fieldId));<br />
		field.clear();<br />
		field.sendKeys(value);<br />
	}<br />
</code></p>
<p>Note that the main test function is trivial.  This means you can quickly develop many tests.  Then, whenever the application changes one can simply run the tests to see if anything might have unexpectedly broken.  This is especially if your modifying code you did not write or wrote a while ago.  Instead of haphazardly testing an application you&#8217;re not intimately familiar with and hoping for the best you can run a real test suite and have confidence the application works.</p>
]]></content:encoded>
			<wfw:commentRss>http://sites.tufts.edu/trenchesofit/2011/02/05/testing-with-selenium-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSONP and Better Designs</title>
		<link>http://sites.tufts.edu/trenchesofit/2011/01/24/jsonp-and-better-designs/</link>
		<comments>http://sites.tufts.edu/trenchesofit/2011/01/24/jsonp-and-better-designs/#comments</comments>
		<pubDate>Mon, 24 Jan 2011 01:50:37 +0000</pubDate>
		<dc:creator>Steve McDonald</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://sites.tufts.edu/trenchesofit/?p=61</guid>
		<description><![CDATA[JSONP enables more efficient, more client-centric designs. I wish I would have understood it better when I started building the Tufts GIS portal. The portal is a nice single-page web app that helps users find GIS data layers. It uses Solr to quickly generate search results. The original design was straightforward. The page has a [...]]]></description>
				<content:encoded><![CDATA[<p>
<a href="http://en.wikipedia.org/wiki/JSON#JSONP">JSONP</a> enables more efficient, more client-centric designs.  I wish I would have understood it better when I started building the <a href="http://geoportal-demo.atech.tufts.edu">Tufts GIS portal</a>.
</p>
<p>
The portal is a nice single-page web app that helps users find GIS data layers.  It uses Solr to quickly generate search results.  The original design was straightforward.  The page has a map, a keyword field,  and several other controls for search parameters.  When the user initiates a search the JavaScript code sends an AJAX call back to the web server.  The server computes a Solr search query based on the passed parameters.  Then, it sends the query to the Solr server, gets the search results and returns them as the return value to the AJAX call.  The Solr query is fairly complicated, it takes a couple hundred lines of Java code on the server to generate.
</p>
<p>
This original design works very well but it can be significantly improved because Solr supports JSONP.  Instead of computing the Solr search string on the web server, the client can generate it.  Then, the client can send off the request directly to the Solr server.  This has several obvious advantages.  It will be a little faster since the web server hop is eliminated.  The load on the web server is reduced.  Much more importantly, we have ported a chunck of server-side Java code to JavaScript runningnon the client.  I care about this because some institutions might want to stand-up an instance of the portal but they might not be Java shops.  By eliminating server side code, I can make the portal server-side technology agnostic.  If the portal only uses HTML and JSONP, it can be easily deployed by php shops, Java shops, etc.
</p>
<p>
Its was easy to change the portal to use JSONP.  A couple hundred lines of Java code had to be ported to JavaScript.  Since the AJAX call was already returning a JSON object, it was trivial to change the AJAX call to JSONP.  The only concern with adding client code is that it typically runs in the UI thread.  Having the client compute the Solr search string instead of the server is an additional client side computational load. However, it is of order O(1) and only involves some  concatenation to generate a string that is under two kilobytes in length.  It is a negligible load. </p>
<p/>
<p>
I put the JavaScript code to generate Solr search strings in its own JavaScript file.  Now, anyone can integrate the Tufts GIS data repository into their own portal.  They simply include our JavaScript file on their page and call is functions to perform searches.  They don&#8217;t need detailed knowledge of our Solr instance and its schema.  Instead, the JavaScript library provides a high level API.
</p>
<p>
The JSONP based approach makes the portal independent of server-side technology.  It also provides a high level API that our portal and other institutions can use.  Both are big wins.</p>
]]></content:encoded>
			<wfw:commentRss>http://sites.tufts.edu/trenchesofit/2011/01/24/jsonp-and-better-designs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spark Usage</title>
		<link>http://sites.tufts.edu/trenchesofit/2011/01/18/spark-usage/</link>
		<comments>http://sites.tufts.edu/trenchesofit/2011/01/18/spark-usage/#comments</comments>
		<pubDate>Tue, 18 Jan 2011 15:02:12 +0000</pubDate>
		<dc:creator>Steve McDonald</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[capacity]]></category>
		<category><![CDATA[spark]]></category>

		<guid isPermaLink="false">http://sites.tufts.edu/trenchesofit/?p=19</guid>
		<description><![CDATA[David set Spark up with Google Analytics so we could track usage.   Here&#8217;s the Fall 2010 semester: This graph shows page views for Spark for the entire semester.  Usage is highest mid-week (Tuesday through Thursday) and typically peaks on Wednesday.  Over the semester, Spark had nearly 106000 page views.  Peak usage was on Oct [...]]]></description>
				<content:encoded><![CDATA[<p>David set Spark up with Google Analytics so we could track usage.   Here&#8217;s the Fall 2010 semester:</p>
<p><a href="http://sites.tufts.edu/trenchesofit/files/2011/01/SparkDailyPageViews.png"><img class="aligncenter size-full wp-image-20" title="SparkDailyPageViews" src="http://sites.tufts.edu/trenchesofit/files/2011/01/SparkDailyPageViews.png" alt="" width="700" height="207" /></a></p>
<p>This graph shows page views for Spark for the entire semester.  Usage is highest mid-week (Tuesday through Thursday) and typically peaks on Wednesday.  Over the semester, Spark had nearly 106000 page views.  Peak usage was on Oct 20 with almost 3400 page loads.  On this peak day, the peak hour saw 330 page loads.  Heaviest usage on Oct 20 was between 5pm and 8pm.</p>
<p>Here&#8217;s a graph of page views broken down by time of day:</p>
<p><a href="http://sites.tufts.edu/trenchesofit/files/2011/01/SparkHourlyPageViews.png"><img class="aligncenter size-full wp-image-21" title="SparkHourlyPageViews" src="http://sites.tufts.edu/trenchesofit/files/2011/01/SparkHourlyPageViews.png" alt="" width="700" height="208" /></a></p>
<p>Usage peaks in the morning and again after 4pm.  This latter peak suggests significant use by students.</p>
<p>
The following table shows page views over the past three fall semesters:
</p>
<p><br/></p>
<table width="40%">
<tr>
<td><b>Semester</b></td>
<td><b>Page Views</b></td>
</tr>
<tr>
<td>Fall 2008</td>
<td>52,358</td>
</tr>
<tr>
<td>Fall 2009</td>
<td>79,413</td>
</tr>
<tr>
<td>Fall 2010</td>
<td>105,724</td>
</tr>
</table>
<p>It is difficult to predict the future, but we should plan on Spark receiving at least 150000 page views in the Fall 2011 semester.</p>
]]></content:encoded>
			<wfw:commentRss>http://sites.tufts.edu/trenchesofit/2011/01/18/spark-usage/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Art Of Capacity Plannning</title>
		<link>http://sites.tufts.edu/trenchesofit/2011/01/17/art-of-capacity-plannning/</link>
		<comments>http://sites.tufts.edu/trenchesofit/2011/01/17/art-of-capacity-plannning/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 17:20:59 +0000</pubDate>
		<dc:creator>Steve McDonald</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[book]]></category>

		<guid isPermaLink="false">http://sites.tufts.edu/trenchesofit/?p=15</guid>
		<description><![CDATA[The Art of Capacity Planing, by John Allspaw, is a fast, interesting read. It goes over the expected topics and supplies many links to specific useful resources. The book talk about all the different things that should be measured. This includes low level operations (e.g., disk read/writes), mid-level operations (Apache or database operations) and high/application [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://my.safaribooksonline.com/book/technology-management/9780596518578">The Art of Capacity Planing</a>, by John Allspaw, is a fast, interesting read.  It goes over the expected topics and supplies many links to specific useful resources.</p>
<p>The book talk about all the different things that should be measured.  This includes low level operations (e.g., disk read/writes), mid-level operations (Apache or database operations) and high/application level operations.  All must be measured so you fully understand the system.  With this data you can identify potential bottlenecks and understand trends.</p>
<p>The book uses data from Flickr avoid exclusively dealing with abstract issues.  For example, Flickr disk drive usage increases at the rate of 1% per month.</p>
<p>Many web sites are limited by the performance of their database servers.  Depending on the site, the issue could be CPU, network or disk I/O.  The book describes the open-source tools needed to determine which issue is the limiting factor on any given site.</p>
<p>Understanding usage trends is important not just for customer satisfaction but also to avoid buying hardware early.  Buying capacity before it is really needed just means you&#8217;ll pay more to get something less capable.</p>
<p>The book has a chapter on deployment.  It reviews what tools to use (e.g., PXE, iClassify and Puppet) to centrally control a large number of servers.</p>
<p>Most surprisingly, the book describes approaches to test load on production servers with production data (httpref, JoeDog&#8217;s Siege).  The author doesn&#8217;t like relying on artificially generated data and test hardware to understand system performance.</p>
]]></content:encoded>
			<wfw:commentRss>http://sites.tufts.edu/trenchesofit/2011/01/17/art-of-capacity-plannning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript and the Browser UI</title>
		<link>http://sites.tufts.edu/trenchesofit/2011/01/08/javascript-and-the-browser-ui/</link>
		<comments>http://sites.tufts.edu/trenchesofit/2011/01/08/javascript-and-the-browser-ui/#comments</comments>
		<pubDate>Sat, 08 Jan 2011 01:04:48 +0000</pubDate>
		<dc:creator>Steve McDonald</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://sites.tufts.edu/trenchesofit/?p=7</guid>
		<description><![CDATA[High Performance JavaScript by Nicholas Zakas covers some interesting JavaScript issues I didn&#8217;t know. Typically, browsers have a single thread that is shared between the page&#8217;s JavaScript code and user interface updates. The also share a single queue of tasks for the thread to run. When JavaScript code is running, no UI updates can occur. [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://my.safaribooksonline.com/book/programming/javascript/9781449382308">High Performance JavaScript</a> by Nicholas Zakas covers some interesting JavaScript issues I didn&#8217;t know.  Typically, browsers have a single thread that is shared between the page&#8217;s JavaScript code and user interface updates.  The also share a single queue of tasks for the thread to run.  When JavaScript code is running, no UI updates can occur.  They are blocked until the JavaScript code ends, freeing the thread.  When the JavaScript code updates a DOM element no visible change is immediately made.  Instead a new task is queued on the shared queue.  </p>
<p>New browsers (Firefox 3.5) support &#8220;Web Workers&#8221;.  Each new worker is given a new thread that is initialized by code loaded from the specified JavaScript file (e.g., new Worker(&#8220;foo.js&#8221;)).   Worker threads can not update the UI; they don&#8217;t have access to the DOM and a bunch of other global variables.  However they can send messages (with serializable objects) back and forth to code running in the shared UI thread.  In the UI thread you could use a timer to periodically check for new messages and use their contents to modify the DOM.</p>
]]></content:encoded>
			<wfw:commentRss>http://sites.tufts.edu/trenchesofit/2011/01/08/javascript-and-the-browser-ui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NERCOMP Workshop</title>
		<link>http://sites.tufts.edu/trenchesofit/2011/01/07/hello-world/</link>
		<comments>http://sites.tufts.edu/trenchesofit/2011/01/07/hello-world/#comments</comments>
		<pubDate>Fri, 07 Jan 2011 13:35:25 +0000</pubDate>
		<dc:creator>Steve McDonald</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[nercomp]]></category>

		<guid isPermaLink="false">http://sites.tufts.edu/trenchesofit/?p=1</guid>
		<description><![CDATA[Mike Korcynski and Steve McDonald are giving a NERCOMP workshop this summer that focuses on tools and technologies to develop better web applications.   We&#8217;re asking for the help of Tufts&#8217; IT community!  Is there a technology that we&#8217;re presenting that you&#8217;re interested in?  You could review our presentation and provide some feedback.  Is there a [...]]]></description>
				<content:encoded><![CDATA[<p>Mike Korcynski and Steve McDonald are giving a NERCOMP workshop this summer that focuses on tools and technologies to develop better web applications.   We&#8217;re asking for the help of Tufts&#8217; IT community!  Is there a technology that we&#8217;re presenting that you&#8217;re interested in?  You could review our presentation and provide some feedback.  Is there a technology you&#8217;re experienced in?  We could use your help to create the presentation.  What tools and technologies do you find important but not yet broadly used?  Let us know what you think.  Here&#8217;s the description of the workshop we wrote for NERCOMP:</p>
<p>This workshop will focus  on tools and technologies to develop better web applications. It will  combine presentations, attendee demonstrations and breakout/development  sessions. This workshop is for technical staff that build, support or  maintain web-centric solutions. While many general concepts will be  discussed, most specific solutions will be oriented towards Java based  development.  Attendees will also be invited to deliver presentations.   This presentations may review successful technologies and solutions or  seek suggestions to address persistent problems. The list of  technologies and techniques the organizers will present include:</p>
<ul>
<li>Rapid application  development with Spring Roo</li>
<li>Injecting test data  with DBUnit</li>
<li>Automating end to end testing via  Selenium 2.0</li>
<li>Measuring test coverage using Emma</li>
<li>Writing client-side  code with JQuery</li>
<li>Improving web site performance with  Firebug and PageSpeed</li>
<li>Providing excellent  search results with Solr/Lucene</li>
</ul>
<p>After each topic has  been presented, students can complete a hands-on exercise.  This  exercise will emphasize developing code with new technology.   Alternatively, students may join a discussion group with an organizer  to explore how the technology might impact their institution’s specific  needs.</p>
]]></content:encoded>
			<wfw:commentRss>http://sites.tufts.edu/trenchesofit/2011/01/07/hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
