<?xml version="1.0"?>
<News hasArchived="true" page="8050" pageCount="10853" pageSize="10" timestamp="Mon, 05 Oct 2026 12:02:07 -0400" url="https://my3.my.umbc.edu/posts.xml?mode=activity&amp;page=8050&amp;range=30">
<NewsItem contentIssues="true" id="39723" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39723">
<Title>Building Multi-Touch Web Applications</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>With mobile web browsing now accounting for <a href="http://www.slideshare.net/kleinerperkins/kpcb-internet-trends-2013" rel="nofollow external" class="bo">15% of all global internet traffic</a> building web applications targeted at mobile has become more important than ever. Building for mobile is very different to creating web applications targeted at the desktop environment. The way in which we interact with mobile devices is inherently different and therefore requires a different approach when it comes to designing our applications.</p>
    <p>In this blog post we are going to be focussing on the how we interact with multi-touch displays. You are going to be learning about the APIs that are available for building multi-touch web applications. After a quick bit of initial theory you’ll build a fully-functional multi-touch drawing app that works great on your phone or tablet.</p>
    <p>Lets get started!</p>
    <h2>A Primer on Touch Events</h2>
    <p>Before we dive into the demo, lets quickly take a look at the events and objects that you will be using to create multi-touch web applications.</p>
    <h3>Types of Touch Events</h3>
    <p>There a six types of touch events:</p>
    <ul>
    <li>
    <code>touchstart</code> – Triggered when a pointer first touches the screen.</li>
    <li>
    <code>touchmove</code> – Triggered when a pointer is moved on the screen.</li>
    <li>
    <code>touchend</code> – Triggered when a pointer leaves the screen.</li>
    <li>
    <code>touchcancel</code> – Triggered when a pointer is disrupted. This could be for a number of reasons:
    <ul>
    <li>Another event occurred that disrupted the touch.</li>
    <li>The pointer left the window and entered another area, such as the browser’s UI.</li>
    <li>There are more pointers on the screen than the browser supports. If this happens the first touch that is being tracked will be cancelled.</li>
    </ul>
    </li>
    <li>
    <code>touchenter</code> – Triggered when the pointer enters the target element.</li>
    <li>
    <code>touchleave</code> – Triggered when the pointer leaves the target element.</li>
    </ul>
    <hr>
    <p><strong>Note</strong>: Both touch and mouse events are triggered to make sure that non-touch-specific code still runs correctly on mobile devices. If you don’t want the mouse events to be triggered make sure that you use <code>event.preventDefault()</code> in your event handlers.</p>
    <hr>
    <p>Each <a href="https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent" rel="nofollow external" class="bo"><code>TouchEvent</code></a> has a number of properties. For the purpose of this post we’re just interested in one, <code>changedTouches</code>. This property contains a list of all the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Touch" rel="nofollow external" class="bo"><code>Touch</code></a> objects that changed with the event.</p>
    <p>There is also a property named <code>touches</code> which contains a full list of all the active touch points.</p>
    <h3>Touch Objects</h3>
    <p>Each <code>Touch</code> object includes a number of properties that provide information about the position of the pointer on the screen. For this blog post you are just going to focus on three properties: <code>identifier</code>, <code>pageX</code>, and <code>pageY</code>.</p>
    <ul>
    <li>
    <code>identifier</code> – A unique ID for the touch object. This allows you to track an individual pointer throughout an interaction with the device.</li>
    <li>
    <code>pageX</code> – The position of the touch point relative to the left of the screen. This property includes any scroll offset.</li>
    <li>
    <code>pageY</code> – The position of the touch point relative to the top of the screen, including any scroll offset.</li>
    </ul>
    <hr>
    <p><strong>Note</strong>: Take a look at the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Touch" rel="nofollow external" class="bo">documentation</a> for a full list of properties that are available on <code>Touch</code> objects.</p>
    <hr>
    <h3>Browser Support</h3>
    <p>Chrome, Firefox and Opera all include support for touch events on the desktop. Chrome even includes a method of emulating touch events using non-touch devices (i.e. a mouse). This comes in handy when testing your applications. You’ll learn how to enable that feature later in this post.</p>
    <table>
    <thead>
    <tr>
    <th>IE</th>
    <th>Firefox</th>
    <th>Chrome</th>
    <th>Safari</th>
    <th>Opera</th>
    </tr>
    </thead>
    <tbody>
    <tr>
    <td>-</td>
    <td>18.0+</td>
    <td>22.0+</td>
    <td>-</td>
    <td>15+</td>
    </tr>
    </tbody>
    </table>
    <p>As you might expect, support for touch events across mobile browsers is very good. All the major mobile browsers support touch events. The outlier is in IE which supports <a href="http://msdn.microsoft.com/en-us/library/ie/dn433244(v=vs.85).aspx" rel="nofollow external" class="bo">Pointer Events</a> instead.</p>
    <table>
    <thead>
    <tr>
    <th>iOS Safari</th>
    <th>Android Browser</th>
    <th>Blackberry Browser</th>
    <th>Opera Mobile</th>
    <th>Chrome for Android</th>
    <th>Firefox for Android</th>
    <th>IE Mobile</th>
    </tr>
    </thead>
    <tbody>
    <tr>
    <td>3.2+</td>
    <td>2.1+</td>
    <td>7.0+</td>
    <td>11.0+</td>
    <td>31.0</td>
    <td>25.0</td>
    <td>-</td>
    </tr>
    </tbody>
    </table>
    <p>Source: <a href="http://caniuse.com/touch" rel="nofollow external" class="bo">http://caniuse.com/touch</a></p>
    <h2>Building a Multi-Touch Drawing App</h2>
    <p><a href="http://blog.teamtreehouse.com/wp-content/uploads/2013/12/touch-app-demo.gif" rel="nofollow external" class="bo"><img alt="touch-app-demo" src="http://blog.teamtreehouse.com/wp-content/uploads/2013/12/touch-app-demo.gif" width="864" height="353" style="max-width: 100%; height: auto;"></a></p>
    <p>For the remainder of this post you’re going to build a multi-touch drawing app using touch events and the Canvas API. The primer on touch events has already covered all of the things that you need to know to handle interactions. Don’t worry if you haven’t worked with the Canvas API before, I’ll walk you through all the code as we go.</p>
    <p><a href="http://codepen.io/matt-west/full/nwCqB" rel="nofollow external" class="bo">See the Demo</a> <a href="http://codepen.io/matt-west/share/zip/nwCqB" rel="nofollow external" class="bo">Download The Code</a> <a href="http://codepen.io/matt-west/pen/nwCqB" rel="nofollow external" class="bo">View on CodePen</a></p>
    <hr>
    <p><strong>Note</strong>: If you want to learn more about the 2D Canvas API check out <a href="http://blog.teamtreehouse.com/getting-started-with-the-canvas-api" rel="nofollow external" class="bo">my previous article</a> on the subject.</p>
    <hr>
    <h3>Setting up the HTML and CSS</h3>
    <p>The first job is to set up the HTML and CSS for your application. Create a new file called <code>index.html</code> and copy in the following code.</p>
    <pre><code>&lt;!doctype html&gt;&#x000A;    &lt;html lang="en"&gt;&#x000A;    &lt;head&gt;&#x000A;        &lt;meta charset="UTF-8"&gt;&#x000A;        &lt;title&gt;Touch Event Demo&lt;/title&gt;&#x000A;    &#x000A;        &lt;meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"&gt;&#x000A;    &#x000A;        &lt;style&gt;&#x000A;        body, html {&#x000A;            margin: 0;&#x000A;        }&#x000A;        &lt;/style&gt;&#x000A;    &lt;/head&gt;&#x000A;    &lt;body&gt;&#x000A;        &lt;canvas id="myCanvas" width="500" height="500"&gt;&lt;/canvas&gt;&#x000A;        &lt;script src="app.js"&gt;&lt;/script&gt;&#x000A;    &lt;/body&gt;&#x000A;    &lt;/html&gt;</code></pre>
    <p>Here you’ve set up a simple page that contains a <code>&lt;canvas&gt;</code> element. You don’t need much CSS for this demo so you’ve placed this with the <code>&lt;head&gt;</code>.</p>
    <p>A key element in this markup is the meta viewport tag.</p>
    <pre><code>&lt;meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"&gt;</code></pre>
    <p>This tag will disable pinch-zoom on mobile devices; that feature can often get in the way when creating multi-touch applications.</p>
    <h3>Emulating Touch Events with Chrome Dev Tools</h3>
    <p>Before we go any further lets quickly take a look at how you can emulate touch events in Google Chrome. This will come in handy when testing your applications.</p>
    <div>
    <a href="http://blog.teamtreehouse.com/wp-content/uploads/2013/12/chrome-dev-tools-touch-emulation.png" rel="nofollow external" class="bo"><img alt="Emulating touch events using Chrome dev tools." src="http://blog.teamtreehouse.com/wp-content/uploads/2013/12/chrome-dev-tools-touch-emulation.png" width="667" height="734" style="max-width: 100%; height: auto;"></a><p>Emulating touch events using Chrome dev tools.</p>
    </div>
    <ol>
    <li>Launch the Chrome Developer Tools.
    <ul>
    <li>Mac: <code>Command</code> + <code>Option</code> + <code>I</code>
    </li>
    <li>Windows: <code>Ctrl</code> + <code>Shift</code> + <code>I</code>
    </li>
    </ul>
    </li>
    <li>Now open the settings page (cog in bottom right corner).</li>
    <li>Click on the <strong>Overrides</strong> tab on the left-hand side.</li>
    <li>Tick <strong>Enable</strong>.</li>
    <li>Tick <strong>Emulate touch events</strong>.</li>
    </ol>
    <p>Enabling this feature will cause Chrome to fire touch events as you interact with the app using your mouse. As you build the demo application you will want to have this feature enabled.</p>
    <h3>Getting Started on the JavaScript</h3>
    <p>In this section you are going to make a start on the JavaScript that will power your multi-touch application.</p>
    <p>Create a new file called <code>app.js</code> and save it in the same folder as your <code>index.html</code> file.</p>
    <p>Copy the following code into your <code>app.js</code> file.</p>
    <pre><code>(function(){&#x000A;    &#x000A;        // Get the canvas.&#x000A;        var canvas = document.getElementById('myCanvas');&#x000A;    &#x000A;        // Set the canvas to fill the screen.&#x000A;        canvas.width = window.outerWidth;&#x000A;        canvas.height = window.outerHeight;&#x000A;    &#x000A;        // Get a 2d drawing context.&#x000A;        var ctx = canvas.getContext('2d');&#x000A;    &#x000A;        // Used to keep track of active touches.&#x000A;        var currentTouches = new Array;&#x000A;    &#x000A;        // The rest of the code goes here...&#x000A;    &#x000A;    }());</code></pre>
    <p>This code mainly handles setting up the canvas. You have created a <code>canvas</code> variable and initialized it by fetching the <code>&lt;canvas&gt;</code> element in your HTML markup.</p>
    <p>You then set the <code>width</code> and <code>height</code> properties of the canvas so that it fills the entire window.</p>
    <p>Next you create a 2D drawing context by calling the <code>getContext('2d')</code> method on your canvas. This is then stored in the <code>ctx</code> variable. If you’re not familiar with the Canvas API think of the drawing context like you would a pen or pencil when drawing on paper. It provides a number of methods that can be used for drawing objects on your canvas.</p>
    <p>Finally, you create an array called <code>currentTouches</code>. This will be used to keep track of the touch points that are currently active on the screen.</p>
    <p>Now add the following code to your <code>app.js</code> file. This should replace the last comment in your current code.</p>
    <pre><code>// Returns a random color from an array.&#x000A;    var randomColor = function () {&#x000A;        var colors = ['#3F3F3F', '#929292', '#00A3EE', '#F5D908', '#D80351'];&#x000A;        return colors[Math.floor(Math.random() * colors.length)];&#x000A;    };&#x000A;    &#x000A;    // Finds the array index of a touch in the currentTouches array.&#x000A;    var findCurrentTouchIndex = function (id) {&#x000A;        for (var i=0; i &lt; currentTouches.length; i++) {&#x000A;            if (currentTouches[i].id === id) {&#x000A;                return i;&#x000A;            }&#x000A;        }&#x000A;    &#x000A;        // Touch not found! Return -1.&#x000A;        return -1;&#x000A;    };</code></pre>
    <p>In this code snippet you have created two helper functions, <code>randomColor</code> and <code>findCurrentTouchIndex</code>. You will be using these later on.</p>
    <p>The <code>randomColor</code> function will return a color from the <code>colors</code> array. Every new touch on the screen will be assigned a color using this function.</p>
    <p>The <code>findCurrentTouchIndex</code> function will loop through the <code>currentTouches</code> array until it finds an object with the desired <code>id</code>. The position of that object in the array is then returned. We can’t modify a <code>Touch</code> object itself so in order to store the color that is associated with a pointer we have to save this information in a separate array.</p>
    <h3>Handling New Touches</h3>
    <p>In this section you’re going to be writing the code that will handle new touch events. Lets start by defining the <code>touchStart</code> function.</p>
    <p>Add the following code to your <code>app.js</code> file.</p>
    <pre><code>// Creates a new touch in the currentTouches array and draws the starting&#x000A;    // point on the canvas.&#x000A;    var touchStarted = function (event) {&#x000A;        var touches = event.changedTouches;&#x000A;    &#x000A;        for (var i=0; i &lt; touches.length; i++) {&#x000A;            var touch = touches[i];&#x000A;            var touchColor = randomColor();&#x000A;    &#x000A;            currentTouches.push({&#x000A;                id: touch.identifier,&#x000A;                pageX: touch.pageX,&#x000A;                pageY: touch.pageY,&#x000A;                color: touchColor&#x000A;            });&#x000A;    &#x000A;            ctx.beginPath();&#x000A;            ctx.arc(touch.pageX, touch.pageY, 2.5, Math.PI*2, false);&#x000A;            ctx.fillStyle = touchColor;&#x000A;            ctx.fill();&#x000A;        }&#x000A;    };</code></pre>
    <p>Here you have started by accessing the <code>changedTouches</code> array that is present on the <code>TouchEvent</code> object. You then loop through this array to access each of the individual <code>Touch</code> objects.</p>
    <p>For each touch you first generate a random color using the <code>randomColor</code> function you created earlier. You then push a new object into the <code>currentTouches</code> array. This object contains four properties: <code>id</code>, <code>pageX</code>, <code>pageY</code>, and <code>color</code>. The first three of these are set using the corresponding properties from the <code>Touch</code> object.</p>
    <p>The code will then draw the initial touch point on the canvas. The call to <code>beginPath</code>creates a new path to draw from.</p>
    <hr>
    <p><strong>Note</strong>: Objects on the canvas are mainly drawn using lines (with a few exceptions), just as you would if you were drawing with a pen and paper.</p>
    <hr>
    <p>The call to the <code>arc</code> method draws the outline of a circle. Don’t worry too much about the syntax here. It looks a bit funky because this method is used to draw more than just circles.</p>
    <p>You then set the <code>fillStyle</code> property of the drawing context using the color that you generated for this touch. The call to <code>fill</code> will color in the circle and close the path.</p>
    <p>Now all that’s left is to add the event listener that will call the <code>touchStarted</code> function when the <code>touchstart</code> event is fired.</p>
    <p>Add the following to your <code>app.js</code> file.</p>
    <pre><code>// Set up an event listener for new touches.&#x000A;    canvas.addEventListener('touchstart', function(e) {&#x000A;        e.preventDefault();&#x000A;        touchStarted(event);&#x000A;    });</code></pre>
    <h3>Drawing on The Move</h3>
    <p>Your next task is to write the code that will draw a line as the user drags their finger (or other touch pointer) across the screen.</p>
    <p>Copy this code into your <code>app.js</code> file.</p>
    <pre><code>// Draws a line on the canvas between the previous touch location and&#x000A;    // the new location.&#x000A;    var touchMoved = function (event) {&#x000A;        var touches = event.changedTouches;&#x000A;    &#x000A;        for (var i=0; i &lt; touches.length; i++) {&#x000A;            var touch = touches[i];&#x000A;            var currentTouchIndex = findCurrentTouchIndex(touch.identifier);&#x000A;    &#x000A;            if (currentTouchIndex &gt;= 0) {&#x000A;                var currentTouch = currentTouches[currentTouchIndex];&#x000A;    &#x000A;                ctx.beginPath();&#x000A;                ctx.moveTo(currentTouch.pageX, currentTouch.pageY);&#x000A;                ctx.lineTo(touch.pageX, touch.pageY);&#x000A;                ctx.lineWidth = 4;&#x000A;                ctx.strokeStyle = currentTouch.color;&#x000A;                ctx.stroke();&#x000A;    &#x000A;                // Update the touch record.&#x000A;                currentTouch.pageX = touch.pageX;&#x000A;                currentTouch.pageY = touch.pageY;&#x000A;    &#x000A;                // Store the record.&#x000A;                currentTouches.splice(currentTouchIndex, 1, currentTouch);&#x000A;            } else {&#x000A;                console.log('Touch was not found!');&#x000A;            }&#x000A;    &#x000A;        }&#x000A;    };</code></pre>
    <p>The <code>touchMoved</code> function again starts by fetching the <code>changedTouches</code> array and then looping through each of the <code>Touch</code> objects.</p>
    <p>For each <code>Touch</code> object we start by using the <code>findCurrentTouchIndex</code> function to find the position of the corresponding object in the <code>currentTouches</code> array. If the object exists, a value larger or equal to zero will be returned. You can then retrieve the stored object from the <code>currentTouches</code> array using this index. This object contains the <code>color</code> that will be used for the line as well as the <code>pageX</code> and <code>pageY</code> coordinates that represent the position of the previous touch point.</p>
    <p>You then call <code>beginPath</code> to create a new path to draw from. The call to <code>moveTo</code> sets the start position for this path to the location of the previous touch point (i.e. the current end of the line on the canvas). Using the <code>lineTo</code> method you draw a path from the start point to the new touch position.</p>
    <p>For this path to become visible you set the <code>lineWidth</code> and <code>strokeStyle</code> properties of the drawing context and then call the <code>stroke</code> method to color the path.</p>
    <p>Now you’re done drawing on the canvas, you update the <code>pageX</code> and <code>pageY</code> properties of the <code>currentTouch</code> object and store this back in the <code>currentTouches</code> array. This is so that you know where to draw the next part of the line from when the pointer moves.</p>
    <p>To finish up you just need to add an event listener that will call the <code>touchMoved</code> function when the <code>touchmove</code> event is fired.</p>
    <pre><code>// Set up an event listener for when the touch instrument is moved.&#x000A;    canvas.addEventListener('touchmove', function(e) {&#x000A;        e.preventDefault();&#x000A;        touchMoved(e);&#x000A;    });</code></pre>
    <h3>Letting Go</h3>
    <p>When the user removes the pointer from the screen you need to draw the final touch position and then remove the corresponding object from the <code>currentTouches</code> array.</p>
    <p>Start by adding the following code to your <code>app.js</code> file.</p>
    <pre><code>// Draws a line to the final touch position on the canvas and then&#x000A;    // removes the touh from the currentTouches array.&#x000A;    var touchEnded = function (event) {&#x000A;        var touches = event.changedTouches;&#x000A;    &#x000A;        for (var i=0; i &lt; touches.length; i++) {&#x000A;            var touch = touches[i];&#x000A;            var currentTouchIndex = findCurrentTouchIndex(touch.identifier);&#x000A;    &#x000A;            if (currentTouchIndex &gt;= 0) {&#x000A;                var currentTouch = currentTouches[currentTouchIndex];&#x000A;    &#x000A;                ctx.beginPath();&#x000A;                ctx.moveTo(currentTouch.pageX, currentTouch.pageY);&#x000A;                ctx.lineTo(touch.pageX, touch.pageY);&#x000A;                ctx.lineWidth = 4;&#x000A;                ctx.strokeStyle = currentTouch.color;&#x000A;                ctx.stroke();&#x000A;    &#x000A;                // Remove the record.&#x000A;                currentTouches.splice(currentTouchIndex, 1);&#x000A;            } else {&#x000A;                console.log('Touch was not found!');&#x000A;            }&#x000A;    &#x000A;        }&#x000A;    };</code></pre>
    <p>The code here is much the same as in <code>touchMoved</code>. However instead of updating and storing the <code>currentTouch</code> object you remove it from the <code>currentTouches</code> array.</p>
    <p>The <code>touchEnded</code> function should be called if either the <code>touchend</code> or <code>touchleave</code> event is fired.</p>
    <p>Add the following event listeners to your <code>app.js</code> file.</p>
    <pre><code>// Set up an event listener for when a touch ends.&#x000A;    canvas.addEventListener('touchend', function(e) {&#x000A;        e.preventDefault();&#x000A;        touchEnded(e);&#x000A;    });&#x000A;    &#x000A;    // Set up an event listener for when a touch leaves the canvas.&#x000A;    canvas.addEventListener('touchleave', function(e) {&#x000A;        e.preventDefault();&#x000A;        touchEnded(e);&#x000A;    });</code></pre>
    <h3>Handling Cancelled Touches</h3>
    <p>The last event you need to deal with is cancelled touches. A touch can be cancelled for a number of reasons. This usually happens if something else takes control of the touch (like the browser UI), or if there are too many touch points on the screen (in which case the first touch point gets cancelled).</p>
    <p>If a touch gets cancelled you want to immediately remove the corresponding object from the <code>currentTouches</code> array. There’s no need to draw anything on the canvas.</p>
    <p>Copy the following JavaScript code into your <code>app.js</code> file.</p>
    <pre><code>// Removes cancelled touches from the currentTouches array.&#x000A;    var touchCancelled = function (event) {&#x000A;        var touches = event.changedTouches;&#x000A;    &#x000A;        for (var i=0; i &lt; touches.length; i++) {&#x000A;            var currentTouchIndex = findCurrentTouchIndex(touches[i].identifier);&#x000A;    &#x000A;            if (currentTouchIndex &gt;= 0) {&#x000A;                // Remove the touch record.&#x000A;                currentTouches.splice(currentTouchIndex, 1);&#x000A;            } else {&#x000A;                console.log('Touch was not found!');&#x000A;            }&#x000A;        }&#x000A;    };</code></pre>
    <p>This <code>touchCancelled</code> function will loop through each of the <code>changedTouches</code> and remove the corresponding objects from the <code>currentTouches</code> array.</p>
    <p>Now you just need to add an event listener that calls <code>touchCancelled</code> when the <code>touchcancel</code> event is fired.</p>
    <pre><code>// Set up an event listener to catch cancelled touches.&#x000A;    canvas.addEventListener('touchcancel', function(e) {&#x000A;        touchCancelled(e);&#x000A;    });</code></pre>
    <h3>Finishing Up</h3>
    <p>That completes your multi-touch drawing application. Fire it up on a mobile device and give it a go!</p>
    <p><a href="http://codepen.io/matt-west/full/nwCqB" rel="nofollow external" class="bo">See the Demo</a> <a href="http://codepen.io/matt-west/share/zip/nwCqB" rel="nofollow external" class="bo">Download The Code</a> <a href="http://codepen.io/matt-west/pen/nwCqB" rel="nofollow external" class="bo">View on CodePen</a></p>
    <p>For extra credit you could try adding UI elements that allow you to manipulate the width of the lines, or the colors that are available.</p>
    <h2>Summary</h2>
    <p>In this blog post you’ve learned about touch events, and have created your very own multi-touch drawing application.</p>
    <p>Mobile web usage is growing at a staggering pace. Taking full advantage of this platform shift goes way beyond just responsive design. By using these platform-specific APIs we can make sure that our web applications are delivering a great user experience across multiple devices.</p>
    <h2>Useful Links</h2>
    <ul>
    <li><a href="https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Events/Touch_events" rel="nofollow external" class="bo">Touch Events Documentation (MDN)</a></li>
    <li><a href="http://www.w3.org/TR/touch-events/" rel="nofollow external" class="bo">Touch Events W3C Specification</a></li>
    <li><a href="http://www.html5rocks.com/en/mobile/touch/" rel="nofollow external" class="bo">Multi-Touch Web Development (HTML5 Rocks)</a></li>
    </ul>
    <p>The post <a href="http://blog.teamtreehouse.com/building-multi-touch-web-applications" rel="nofollow external" class="bo">Building Multi-Touch Web Applications</a> appeared first on <a href="http://blog.teamtreehouse.com" rel="nofollow external" class="bo">Treehouse Blog</a>.</p>
    </div>
]]>
</Body>
<Summary>With mobile web browsing now accounting for 15% of all global internet traffic building web applications targeted at mobile has become more important than ever. Building for mobile is very...</Summary>
<Website>http://feedproxy.google.com/~r/teamtreehouse/~3/td1phUft33g/building-multi-touch-web-applications</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39723/guest@my.umbc.edu/b6a8e464c9121d2a53be00d1835466e9/api/pixel</TrackingUrl>
<Tag>android</Tag>
<Tag>code</Tag>
<Tag>css</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>html5</Tag>
<Tag>ios</Tag>
<Tag>javascript</Tag>
<Tag>learn-to-code</Tag>
<Tag>mobile</Tag>
<Tag>multi-touch</Tag>
<Tag>responsive</Tag>
<Tag>touch</Tag>
<Tag>web</Tag>
<Tag>web-apps</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 23 Dec 2013 13:02:20 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="39722" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39722">
<Title>Empty Shelves Signal Revival in Game Consoles</Title>
<Body>
<![CDATA[
    <div class="html-content">Those sales bolster the view that the console business is turning into a two-horse race, with Nintendo a distant third.<br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F12%2F24%2Ftechnology%2Fstrong-sales-make-xbox-one-and-playstation-4-hard-to-find.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Empty+Shelves+Signal+Revival+in+Game+Consoles" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F12%2F24%2Ftechnology%2Fstrong-sales-make-xbox-one-and-playstation-4-hard-to-find.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Empty+Shelves+Signal+Revival+in+Game+Consoles" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F12%2F24%2Ftechnology%2Fstrong-sales-make-xbox-one-and-playstation-4-hard-to-find.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Empty+Shelves+Signal+Revival+in+Game+Consoles" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F12%2F24%2Ftechnology%2Fstrong-sales-make-xbox-one-and-playstation-4-hard-to-find.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Empty+Shelves+Signal+Revival+in+Game+Consoles" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F12%2F24%2Ftechnology%2Fstrong-sales-make-xbox-one-and-playstation-4-hard-to-find.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Empty+Shelves+Signal+Revival+in+Game+Consoles" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    <br><br><a href="http://da.feedsportal.com/r/184842134123/u/0/f/640387/c/34625/s/352471c2/sc/15/rc/1/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/184842134123/u/0/f/640387/c/34625/s/352471c2/sc/15/rc/1/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/184842134123/u/0/f/640387/c/34625/s/352471c2/sc/15/rc/2/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/184842134123/u/0/f/640387/c/34625/s/352471c2/sc/15/rc/2/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/184842134123/u/0/f/640387/c/34625/s/352471c2/sc/15/rc/3/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/184842134123/u/0/f/640387/c/34625/s/352471c2/sc/15/rc/3/rc.img" style="max-width: 100%; height: auto;"></a><br><br><a href="http://da.feedsportal.com/r/184842134123/u/0/f/640387/c/34625/s/352471c2/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/184842134123/u/0/f/640387/c/34625/s/352471c2/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>Those sales bolster the view that the console business is turning into a two-horse race, with Nintendo a distant third.      </Summary>
<Website>http://www.nytimes.com/2013/12/24/technology/strong-sales-make-xbox-one-and-playstation-4-hard-to-find.html?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39722/guest@my.umbc.edu/46be971ec755e3ab4f8b063c7adc5e7d/api/pixel</TrackingUrl>
<Tag>best-buy-company-inc-bby-nyse</Tag>
<Tag>computer-and-video-games</Tag>
<Tag>microsoft-corporation-msft-nasdaq</Tag>
<Tag>new</Tag>
<Tag>nintendo-co-ltd</Tag>
<Tag>shopping-and-retail</Tag>
<Tag>sony-corporation-sne-nyse</Tag>
<Tag>technology</Tag>
<Tag>twitter-twtr-nyse</Tag>
<Tag>verizon-communications-inc-vz-nyse</Tag>
<Tag>york</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 23 Dec 2013 12:46:28 -0500</PostedAt>
<EditAt>Mon, 23 Dec 2013 12:46:28 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="39728" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39728">
<Title>The Appraisal: Still Unconvinced, Home Buyer? Check Out the View From the Drone</Title>
<Body>
<![CDATA[
    <div class="html-content">When terrestrial images simply cannot do multimillion-dollar homes justice, more agents are capturing aerial views and luring buyers with drones.<br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F12%2F24%2Fnyregion%2Fstill-unconvinced-home-buyer-check-out-the-view-from-the-drone.html%3Fpartner%3Drss%26emc%3Drss&amp;t=The+Appraisal%3A+Still+Unconvinced%2C+Home+Buyer%3F+Check+Out+the+View+From+the+Drone" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F12%2F24%2Fnyregion%2Fstill-unconvinced-home-buyer-check-out-the-view-from-the-drone.html%3Fpartner%3Drss%26emc%3Drss&amp;t=The+Appraisal%3A+Still+Unconvinced%2C+Home+Buyer%3F+Check+Out+the+View+From+the+Drone" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F12%2F24%2Fnyregion%2Fstill-unconvinced-home-buyer-check-out-the-view-from-the-drone.html%3Fpartner%3Drss%26emc%3Drss&amp;t=The+Appraisal%3A+Still+Unconvinced%2C+Home+Buyer%3F+Check+Out+the+View+From+the+Drone" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F12%2F24%2Fnyregion%2Fstill-unconvinced-home-buyer-check-out-the-view-from-the-drone.html%3Fpartner%3Drss%26emc%3Drss&amp;t=The+Appraisal%3A+Still+Unconvinced%2C+Home+Buyer%3F+Check+Out+the+View+From+the+Drone" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F12%2F24%2Fnyregion%2Fstill-unconvinced-home-buyer-check-out-the-view-from-the-drone.html%3Fpartner%3Drss%26emc%3Drss&amp;t=The+Appraisal%3A+Still+Unconvinced%2C+Home+Buyer%3F+Check+Out+the+View+From+the+Drone" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    </div>
]]>
</Body>
<Summary>When terrestrial images simply cannot do multimillion-dollar homes justice, more agents are capturing aerial views and luring buyers with drones.      </Summary>
<Website>http://www.nytimes.com/2013/12/24/nyregion/still-unconvinced-home-buyer-check-out-the-view-from-the-drone.html?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39728/guest@my.umbc.edu/0362e61ca6b856314c86c3b8cbe1e884/api/pixel</TrackingUrl>
<Tag>alchemy-properties-inc</Tag>
<Tag>amazon-com-inc-amzn-nasdaq</Tag>
<Tag>brown-harris-stevens</Tag>
<Tag>drones-pilotless-planes</Tag>
<Tag>federal-aviation-administration</Tag>
<Tag>greenwich-conn</Tag>
<Tag>halstead-property-company</Tag>
<Tag>new</Tag>
<Tag>photography</Tag>
<Tag>real-estate-and-housing-residential</Tag>
<Tag>real-estate-brokers</Tag>
<Tag>technology</Tag>
<Tag>york</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 23 Dec 2013 12:41:10 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="39720" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39720">
<Title>BDD With Behat</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <a href="http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=36171&amp;c=2087447360" rel="nofollow external" class="bo"><img src="http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=36171&amp;c=2087447360" alt="" style="max-width: 100%; height: auto;"></a><p>The BDD PHP framework <a href="http://behat.org/" rel="nofollow external" class="bo">Behat</a>, allows you to test your PHP applications using human-readable sentences to write features and scenarios about how your applications should behave in order to test out its functionality. We can then run these tests to see if our application is behaving as expected. Let’s spend about 15 minutes quickly going over Behat’s installation process and learn how we can test our PHP applications behavior using the basics.</p>
    <p></p>
    <hr>
    <h2>Installation</h2>
    <p>To begin testing with Behat, we just need to install it on our local development machine. I’ll be using Composer, but you can <a href="http://docs.behat.org/quick_intro.html#installation" rel="nofollow external" class="bo">take a look at a the documentation</a> for additional installation methods.</p>
    <p>Within your PHP application (I have a blank PHP app named <code>phpbehat</code> created in advance) create a <code>composer.json</code> file with the following code to load in Behat:</p>
    <pre>{&#x000A;    	"require": {&#x000A;    		"behat/behat": "2.4.*@stable"&#x000A;    	},&#x000A;    	"minimum-stability": "dev",&#x000A;    	"config": {&#x000A;    		"bin-dir": "bin/"&#x000A;    	}&#x000A;    }&#x000A;    </pre>
    <p> In your terminal we can install it using the following command:</p>
    <pre>composer update</pre>
    <p>We should now be able to run the <code>bin/behat</code> command to work with Behat.</p>
    <hr>
    <h2>Creating Features</h2>
    <p>We always begin by creating a new <em>feature</em>. A feature is something that we can use to describe a feature of our application and then implement it to get the test to pass.</p>
    <p>A feature, at its simplest, consists of:</p>
    <ul>
    <li>Human-readable, plain text.</li>
    <li>Uses a <code>.feature</code> extension.</li>
    <li>Contains the feature’s benefit, role, and the feature itself.</li>
    <li>May hold a list of scenarios.</li>
    </ul>
    <p>Now I can’t show you how to test all possible features for an application, as that would take far too long. But what I can do is show you how to go about writing a basic feature and you can adapt this code to make it work for your specific application.</p>
    <h3>Testing the Phpadder Class</h3>
    <p>To avoid complicating the learning process, let’s create a very simple <code>Phpadder.php</code> file which contains a couple methods that we can use to add two numbers together and display their sum.</p>
    <pre>class Phpadder {&#x000A;    &#x000A;    	private $a;&#x000A;    	private $b;&#x000A;    	public $sum;&#x000A;    &#x000A;    	public function __construct($a, $b) {&#x000A;    		$this-&gt;a = $a;&#x000A;    		$this-&gt;b = $b;&#x000A;    	}&#x000A;    &#x000A;    	public function add() {&#x000A;    		$this-&gt;sum = $this-&gt;a + $this-&gt;b;&#x000A;    	}&#x000A;    &#x000A;    	public function display() {&#x000A;    		return $this-&gt;sum;&#x000A;    	}&#x000A;    }&#x000A;    </pre>
    <p>This creates a new class named <code>Phpadder</code>. We have a few properties to hold the first (<code>$a</code>) and second (<code>$b</code>) numbers to be added, as well as a <code>$sum</code> property to hold the values’s sum.</p>
    <p>Next, we have our constructor which initializes our properties. Then we have an <code>add</code> method to add the two numbers together and finally a <code>display</code> method to display the sum of the two numbers.</p>
    <h3>Adder Feature</h3>
    <p>Let’s now test this <code>Phpadder</code> class. Create a new <code>.feature</code> file along with the following code:</p>
    <pre># features/phpadder.feature&#x000A;    Feature: adder&#x000A;    	In order to display the sum of two numbers&#x000A;    	As anybody&#x000A;    	I need to provide two numbers&#x000A;    </pre>
    <p>We start out by giving our feature a name of <code>adder</code>. Then we specify, on three lines, the feature’s benefit, role, and finally the feature itself. It should be fairly self explanatory.</p>
    <p>Now that we have our feature, let’s start writing our scenarios.</p>
    <hr>
    <h2>Creating Scenarios</h2>
    <p>Anytime we create a feature we can define scenarios that describe how that feature behaves given certain conditions. Scenario’s follow the same basic layout consisting of the scenario’s description, a context, an event, and an outcome.</p>
    <p>Let’s create a scenario to test out our <code>Phpadder</code> application:</p>
    <pre>Scenario: Display the sum of two provided numbers&#x000A;    	Given I have the number 50 and the number 25&#x000A;    	When I add them together&#x000A;    	Then I should get 75&#x000A;    </pre>
    <p>We begin with our scenario description, we then list out that we start with the two numbers of 50 and 25 and when they are added together it should display the sum of 75.</p>
    <p>You can also have multiple contexts, events, and outcomes as well using the following keywords: <code>And</code> and <code>But</code>. Here’s a modified example of the previous scenario where we’ll use <code>And</code>:</p>
    <pre>Scenario: Display the sum of two provided numbers&#x000A;    	Given I have the number 50 and the number 25&#x000A;    	And I have a third number of 25&#x000A;    	When I add them together&#x000A;    	Then I should get 100&#x000A;    </pre>
    <hr>
    <h2>Creating Step Definitions</h2>
    <p>A step is nothing more than a PHP function which is made up of a keyword, a regular expression, and a callback function. Each statement within your scenario will be matched to a step. These steps define what should happen given one of your statements are called within a scenario. You store all of your steps within the <code>features/bootstrap/FeatureContext.php</code> file.</p>
    <h3>The “Given” Step</h3>
    <p>In our <code>FeatureContext.php</code> file (you may need to create this), we need to write a step for each of our statements, using its name as the function name. We’ll start with the <code>"Given I have the number"</code> statement:</p>
    <pre># features/bootstrap/FeaturesContext.php&#x000A;    &#x000A;    require("Phpadder.php");&#x000A;    &#x000A;    use Behat\Behat\Context\BehatContext, &#x000A;    	Behat\Behat\Exception\PendingException;&#x000A;    &#x000A;    use Behat\Gherkin\Node\PyStringNode,&#x000A;    	Behat\Gherkin\Node\TableNode;&#x000A;    	&#x000A;    class FeatureContext extends BehatContext {&#x000A;    &#x000A;    	private $Adder;&#x000A;    	&#x000A;    	/**&#x000A;    	 * @Given /^I have the number (\d+) and the number (\d+)$/&#x000A;    	 */&#x000A;    	public function iHaveTheNumberAndTheNumber($a, $b) {&#x000A;    		$this-&gt;Adder = new Phpadder($a, $b);&#x000A;    	}&#x000A;    </pre>
    <p>First, we create a new PHP file, require in our <code>Phpadder.php</code> file (the file that we’re testing), and then we use a few Behat classes with <code>use</code> statements, right after.</p>
    <p>Next, we create our <code>FeatureContext</code> class and have it extend the <code>BehatContext</code> class.</p>
    <p>Our class has only one property, <code>$Adder</code>, which will hold a <code>Phpadder</code> object.</p>
    <p>Finally, we create a method for our first step using the same name as the statement. Our step has a regular expression, found within the method’s comment. This regular expression is used to match the step to a scenario statement. Within this method we simply assign a new <code>Phpadder</code> object to our <code>$this-&gt;Adder</code> property so that the rest of our methods have access to the same <code>Phpadder</code> object.</p>
    <p>Now, you’ve probably noticed the <code>@Given</code> keyword within your function’s comment, this is actually an annotation so that the different types of steps can be identified. You can use <code>@Given</code>, <code>@When</code>, and <code>@Then</code>.</p>
    <p>Now we just need to write the last two steps.</p>
    <h3>The “When” Step</h3>
    <pre>/**&#x000A;     * @When /^I add them together$/&#x000A;     */&#x000A;    public function iAddThemTogether() {&#x000A;    	$this-&gt;Adder-&gt;add();&#x000A;    }&#x000A;    </pre>
    <p>This step simply uses our <code>$this-&gt;Adder</code> object’s <code>add</code> method to add the two numbers together.</p>
    <h3>The “Then” Step</h3>
    <pre>/** &#x000A;     * @Then /^I should get (\d+)$/ &#x000A;     */&#x000A;    public function iShouldGet($sum) {&#x000A;    	if ($this-&gt;Adder-&gt;sum != $sum) {&#x000A;    		throw new Exception("Actual sum: ".$this-&gt;Adder-&gt;sum);&#x000A;    	}&#x000A;    	$this-&gt;Adder-&gt;display();&#x000A;    }&#x000A;    </pre>
    <p>This step starts off by checking if the actual sum (retrieved using our <code>$this-&gt;Adder</code> object and its <code>sum</code> property) is <em>not</em> equal to the expected sum. If this evaluates to true that means we need to have Behat show a failure. To do so, we’ll just throw a new exception displaying the actual sum so we can compare. Otherwise, we call our <code>display</code> method.</p>
    <p>Time to run the tests.</p>
    <hr>
    <h2>Running the Tests</h2>
    <p>Now that we have our features, scenarios, and steps laid out, let’s run our tests using the following command:</p>
    <pre>bin/behat&#x000A;    </pre>
    <p>You should see the following success messages inside of your terminal:</p>  <img src="http://cdn.tutsplus.com/net/uploads/2013/12/testing-success.png" alt="testing-success" width="576" height="371" style="max-width: 100%; height: auto;"><br> <p>You can ensure that your tests are running correctly, by simply breaking something in your <code>Phpadder.php</code> file so that it doesn’t run quite the same way your test expects it to. For example, if we change the <code>add</code> method to instead use subtraction, like so:</p>
    <pre>public function add() {&#x000A;    	$this-&gt;sum = $this-&gt;a - $this-&gt;b;&#x000A;    }&#x000A;    </pre>
    <p>And then we rerun our tests: <code>bin/behat</code>. You can see in our terminal, we now have a failing test, because it’s no longer adding our numbers but subtracting them:</p>  <img src="http://cdn.tutsplus.com/net/uploads/2013/12/testing-fail.png" alt="testing-fail" width="576" height="371" style="max-width: 100%; height: auto;"><br> <hr>
    <h2>Conclusion</h2>
    <p>In conclusion, you can follow a small four step process for testing your PHP apps using Behat:</p>
    <ol>
    <li>Define a Feature</li>
    <li>Define a Scenario</li>
    <li>Define Step Definitions</li>
    <li>Run the tests using <code>bin/behat</code>
    </li>
    </ol>
    <p>So, with just that small amount of code, we should now have a basic understanding of how to work with Behat to test our PHP applications. For more information about working with Behat please checkout their <a href="http://docs.behat.org/" rel="nofollow external" class="bo">documentation</a>.</p>
    </div>
]]>
</Body>
<Summary>The BDD PHP framework Behat, allows you to test your PHP applications using human-readable sentences to write features and scenarios about how your applications should behave in order to test out...</Summary>
<Website>http://feedproxy.google.com/~r/nettuts/~3/7YvArN5gNz8/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39720/guest@my.umbc.edu/d89d9dc61374bbb9643b27c1fbe3a2b0/api/pixel</TrackingUrl>
<Tag>bdd</Tag>
<Tag>behat</Tag>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>tutorials</Tag>
<Tag>wed</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 23 Dec 2013 11:24:44 -0500</PostedAt>
<EditAt>Mon, 23 Dec 2013 11:24:44 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="39721" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39721">
<Title>Bits Blog: A Start-Up Moves Teachers Past Data Entry</Title>
<Body>
<![CDATA[
    <div class="html-content">Clever, a San Francisco start-up, enables teachers to enroll and track students, normally a time-consuming process. Its software is now in 15,000 schools.<br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2013%2F12%2F23%2Fa-start-up-moves-teachers-past-data-entry%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+A+Start-Up+Moves+Teachers+Past+Data+Entry" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2013%2F12%2F23%2Fa-start-up-moves-teachers-past-data-entry%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+A+Start-Up+Moves+Teachers+Past+Data+Entry" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2013%2F12%2F23%2Fa-start-up-moves-teachers-past-data-entry%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+A+Start-Up+Moves+Teachers+Past+Data+Entry" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2013%2F12%2F23%2Fa-start-up-moves-teachers-past-data-entry%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+A+Start-Up+Moves+Teachers+Past+Data+Entry" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2013%2F12%2F23%2Fa-start-up-moves-teachers-past-data-entry%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+A+Start-Up+Moves+Teachers+Past+Data+Entry" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    <br><br><a href="http://da.feedsportal.com/r/184842121623/u/0/f/640387/c/34625/s/3523f9c8/sc/4/rc/1/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/184842121623/u/0/f/640387/c/34625/s/3523f9c8/sc/4/rc/1/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/184842121623/u/0/f/640387/c/34625/s/3523f9c8/sc/4/rc/2/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/184842121623/u/0/f/640387/c/34625/s/3523f9c8/sc/4/rc/2/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/184842121623/u/0/f/640387/c/34625/s/3523f9c8/sc/4/rc/3/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/184842121623/u/0/f/640387/c/34625/s/3523f9c8/sc/4/rc/3/rc.img" style="max-width: 100%; height: auto;"></a><br><br><a href="http://da.feedsportal.com/r/184842121623/u/0/f/640387/c/34625/s/3523f9c8/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/184842121623/u/0/f/640387/c/34625/s/3523f9c8/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>Clever, a San Francisco start-up, enables teachers to enroll and track students, normally a time-consuming process. Its software is now in 15,000 schools.      </Summary>
<Website>http://bits.blogs.nytimes.com/2013/12/23/a-start-up-moves-teachers-past-data-entry/?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39721/guest@my.umbc.edu/6e97d0b00aea9d3b07d7b6d8b47a1726/api/pixel</TrackingUrl>
<Tag>computers-and-the-internet</Tag>
<Tag>education</Tag>
<Tag>education-k-12</Tag>
<Tag>new</Tag>
<Tag>teachers-and-school-employees</Tag>
<Tag>technology</Tag>
<Tag>york</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 23 Dec 2013 11:19:44 -0500</PostedAt>
<EditAt>Mon, 23 Dec 2013 14:33:33 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="39719" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39719">
<Title>CFP: Buffy to Batgirl</Title>
<Tagline>Women and Gender in Science Fiction, Fantasy, and Comics</Tagline>
<Body>
<![CDATA[
    <div class="html-content">Interdisciplinary conference being held this May on the Camden campus
     of Rutgers University - "Buffy to Batgirl: Women and Gender in Science Fiction, Fantasy, and 
    Comics." <br><br>We invite paper or panel submissions on any aspect of 
    female representation in science fiction and fantasy books, television 
    shows, films, and comics. The conference is open to faculty, graduate 
    students, and undergraduate students, although we ask that undergraduate
     students submit the name of a faculty mentor who will assist them in 
    developing their presentation. <br><br>Please distribute this call to anyone who might be interested.<br><br>The CFP can be found here: <a href="http://libguides.rutgers.edu/buffytobatgirl" rel="nofollow external" class="bo">http://libguides.rutgers.edu/buffytobatgirl</a>
    </div>
]]>
</Body>
<Summary>Interdisciplinary conference being held this May on the Camden campus  of Rutgers University - "Buffy to Batgirl: Women and Gender in Science Fiction, Fantasy, and  Comics."   We invite paper or...</Summary>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39719/guest@my.umbc.edu/fa1b649b740c62b707addfc455a399d2/api/pixel</TrackingUrl>
<Group token="llc">Language, Literacy and Culture Doctoral Program</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/llc</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xsmall.png?1375383725</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/original.jpg?1375383725</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xxlarge.png?1375383725</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xlarge.png?1375383725</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/large.png?1375383725</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/medium.png?1375383725</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/small.png?1375383725</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xsmall.png?1375383725</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xxsmall.png?1375383725</AvatarUrl>
<Sponsor>Language, Literacy and Culture Doctoral Program</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 23 Dec 2013 11:10:37 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="39718" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39718">
<Title>The bwtech@UMBC CyberHive Welcomes Its First Four Companies</Title>
<Tagline>Three new companies, one expanding company move to CyberHive</Tagline>
<Body>
<![CDATA[
    <div class="html-content">
    <h6><span>NEWS
    RELEASE –December 2013<br><span>Contact:<br></span><span>Alexandra Gold<br></span><span>bwtech@UMBC Research and Technology Park<br></span><span>443.543.5047<br></span><span><a href="mailto:alexandragold@umbc.edu">alexandragold@umbc.edu</a></span></span></h6>
    <span> <br></span><strong><span>CyberHive Welcomes First
    Four Companies</span></strong>
    
    
    
    
    
    
    
    
    
    <p><em>Three new companies and one expanding
    company move into bwtech@UMBC’s newest space</em></p>
    
    <p><span><br>
    </span></p>
    <p>Baltimore, MD (December 23, 2013) – bwtech@UMBC is pleased to announce the
    arrival of the first four companies to its newest space, the CyberHive.
    ParaTools, Inc., Integrata Security, LLC, and CloudCover, Ltd. have moved into
    the recently completed space down the hall from the Cyber Incubator located at
    5520 Research Park Drive, Baltimore, Maryland. The fourth new CyberHive tenant
    is current Cyber Incubator company Fearless Solutions, LLC, who has expanded
    into the new CyberHive office.</p>
    
    <p> </p>
    
    <p>The CyberHive was developed to
    accommodate bwtech@UMBC’s growing incubator program, which continues to accept,
    nurture, and graduate companies on a regular basis. The first company to join
    the CyberHive was <strong>ParaTools, Inc</strong>.,
    <a href="http://www.paratools.com">www.paratools.com</a>, devoted to the development and application of tools for
    parallel computing systems, with specific expertise in high performance
    computing and performance analysis. Most notable in their parallel tool
    development portfolio is the TAU Performance System® in use at research
    laboratories across the United States.</p>
    
    <p> </p>
    
    <p>The second,<strong> Integrata
    Security, LLC</strong>, <a href="http://www.integratasecurity.com">www.integratasecurity.com</a>, has developed the world's most
    advanced and effective system for protecting wireless networks.  With
    technology exclusively licensed from the Department of Defense, Integrata's
    solution allows enterprises and governments to finally take advantage of safe
    wireless networking and safely manage the bring-your-own-device (BYOD)
    movement.</p>
    
    <p> </p>
    
    <p>The third new company to call CyberHive home is <strong>CloudCover, Ltd</strong>. Headquartered in Burnsville,
    MN, CloudCover, <a href="http://www.cloudcover.net">www.cloudcover.net</a>, is a cyber-risk insurance entity
    uniquely aligned with cyber security technology focused on underwriting
    and insuring data security and privacy within online networks. The company’s
    core solution, known as CloudCover Data Insurance™(CDI), represents a
    new category of insurance providing continuous data risk governance, as
    well as active risk transfer protection collectively known as the CloudCover Protocol™.</p>
    
    <p> </p>
    
    <p>“CloudCover is excited and feels
    honored to participate in one of the most advanced, if not the best
    cyber-technology development incubator, whose primary focus is protecting our
    country's cyber security and privacy,” said Stephen Cardot, President of
    CloudCover.</p>
    
    <p> </p>
    
    <p>Fearless Solutions joined the Cyber Incubator in June 2010
    with one employee, the founder, President, and UMBC graduate, Delali Dzirasa. Since
    its inception, the company has grown to twelve employees and has won several
    large contracts in the federal space. “Despite government shutdowns and
    sequestration, we still managed to grow in the Cyber Incubator and that has
    been the direct result of our partnership with bwtech@UMBC.  We're excited to expand into the CyberHive
    and further benefit from the resources that the incubator has to offer,”
    said Dzirasa. </p>
    
    <p> </p>
    
    <p><strong>Fearless Solutions, LLC</strong>, <a href="http://www.fearlesssolutions.com">www.fearlesssolutions.com</a>, is a minority-owned business that serves a
    variety of federal, state and local government clients as well as commercial
    sector clients. The company's core competencies include: visualization, rapid
    prototyping / proof of concept, software engineering / web application
    development, development infrastructure setup, project and program management,
    and equipment procurement.</p>
    
    <p> </p>
    
    <p>"We are very excited that
    ParaTools, Integrata and CloudCover have joined the CyberHive here at the Cyber
    Incubator@bwtech, and that Fearless Solutions is expanding into this new space
    as well,” said Jennifer Reynolds, the Director of Venture Creation at
    bwtech@UMBC. “We are always looking for new, innovative cyber businesses and
    technologies to add to bwtech’s already large cyber security community. 
    We are eager to support each of these companies and look forward to their
    growth and anticipated positive impact on economic development for the
    region."</p>
    
    <p> </p>
    
    <p> </p>
    
    <p> </p>
    
    <p> </p>
    
    <p> </p>
    
    <p> </p>
    
    <p> </p>
    
    <p> </p>
    
    <p><strong>About CyberHive:</strong> The CyberHive, located at the Cyber Incubator at
    bwtech@UMBC, offers a unique business development co-working environment for
    cyber companies seeking opportunities with the government, military and
    commercial sectors. CyberHive participants enjoy business support services from
    bwtech@UMBC’s experienced entrepreneurial services team, robust and redundant
    data connectivity, shared reception areas, private phone booths, coffee lounge,
    and conference rooms. "Hive" participants also have the opportunity
    to regularly interact with bwtech@UMBC's cyber security community, which
    includes over 45 companies and agencies at bwtech@UMBC, as well as UMBC
    students, faculty and other resources</p>
    
    <p> </p>
    
    <p><strong>About bwtech@UMBC: </strong>bwtech@UMBC, <a href="http://www.bwtechumbc.com">www.bwtechumbc.com</a>,
    is a 71-acre research and technology community at the University of Maryland,
    Baltimore County (UMBC). With over 500,000 square feet of office and laboratory
    space, it is home to nearly 120 technology and life science companies at all
    stages of development. bwtech@UMBC offers collaboration with university faculty
    and students and enjoys a strategic and convenient location, close to downtown
    Baltimore, BWI Thurgood Marshall Airport, and Washington, D.C. Its annual
    economic impact on the state is estimated to be over $300 million.</p>
    
    <p> </p>
    
    <p> </p>
    
    </div>
]]>
</Body>
<Summary>NEWS RELEASE –December 2013 Contact: Alexandra Gold bwtech@UMBC Research and Technology Park 443.543.5047 alexandragold@umbc.edu   CyberHive Welcomes First Four Companies           Three new...</Summary>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39718/guest@my.umbc.edu/656db4b3f17ed5c69205b6f71831c4d3/api/pixel</TrackingUrl>
<Group token="bwtech">bwtech@UMBC Research and Technology Park</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/bwtech</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/xsmall.png?1760034935</AvatarUrl>
<AvatarUrl size="original">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/original.png?1760034935</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/xxlarge.png?1760034935</AvatarUrl>
<AvatarUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/xlarge.png?1760034935</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/large.png?1760034935</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/medium.png?1760034935</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/small.png?1760034935</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/xsmall.png?1760034935</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/xxsmall.png?1760034935</AvatarUrl>
<Sponsor>bwtech@UMBC</Sponsor>
<ThumbnailUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/039/718/8f710edafdc90994483871689f56d98c/xxlarge.jpg?1387814786</ThumbnailUrl>
<ThumbnailUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/039/718/8f710edafdc90994483871689f56d98c/xlarge.jpg?1387814786</ThumbnailUrl>
<ThumbnailUrl size="large">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/039/718/8f710edafdc90994483871689f56d98c/large.jpg?1387814786</ThumbnailUrl>
<ThumbnailUrl size="medium">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/039/718/8f710edafdc90994483871689f56d98c/medium.jpg?1387814786</ThumbnailUrl>
<ThumbnailUrl size="small">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/039/718/8f710edafdc90994483871689f56d98c/small.jpg?1387814786</ThumbnailUrl>
<ThumbnailUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/039/718/8f710edafdc90994483871689f56d98c/xsmall.jpg?1387814786</ThumbnailUrl>
<ThumbnailUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/039/718/8f710edafdc90994483871689f56d98c/xxsmall.jpg?1387814786</ThumbnailUrl>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 23 Dec 2013 11:04:57 -0500</PostedAt>
<EditAt>Mon, 23 Dec 2013 11:07:37 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="39717" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39717">
<Title>Reminder: TOEFL Grants and Awards</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <div>
    <span>This is a reminder that the deadline for applications for TOEFL</span><span> </span><span>Grants and Awards is</span><span> </span><span><span>February 15th</span>, 2014</span><span>.  </span><span>Awards are available in a variety of categories and provide funding for 
    activities, projects and research in the field of international 
    education and </span><span>foreign or second language assessment. Among them are the <span><a href="http://www.ets.org/toefl/grants/doctoral_research_grant_second_language" rel="nofollow external" class="bo">Small Grants for Doctoral Research in Second or Foreign Language Assessment</a></span></span><span> </span><span>to help students complete the research for their dissertations in a timely manner. The others include:</span>
    </div>
    <div><span><br></span></div>
    <p><span>·<span>        </span></span><span><span><a href="http://www.ets.org/toefl/grants/board_grants" rel="nofollow external" class="bo"><span>TOEFL Board Grants</span></a></span></span></p>
    <p><span>·<span>        </span></span><span><span><a href="http://www.ets.org/toefl/grants/international_speaker_grant" rel="nofollow external" class="bo"><span>TOEFL International Speaker Grants</span></a></span></span></p>
    <p><span>·<span>        </span></span><span><span><a href="http://www.ets.org/toefl/grants/library_resource_center_award" rel="nofollow external" class="bo"><span>Library and Resource Center Award</span></a></span></span></p>
    <p><span>·<span>        </span></span><span><span><a href="http://www.ets.org/toefl/grants/outstanding_young_scholar" rel="nofollow external" class="bo"><span>TOEFL Outstanding Young Scholar Award</span></a></span></span></p>
    <div><span><br></span></div>
    <div>
    <span>Applications received after</span><span> </span><span>February</span><span> </span><span>15th will be considered for the next application deadline in</span><span> </span><span>October.</span>
    </div>
    <span>For more information about the awards, please visit</span><span> </span><span><a rel="nofollow external" class="bo">www.ets.org/toefl/awards</a></span><span>.</span>
    </div>
]]>
</Body>
<Summary>This is a reminder that the deadline for applications for TOEFL Grants and Awards is February 15th, 2014.  Awards are available in a variety of categories and provide funding for  activities,...</Summary>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39717/guest@my.umbc.edu/8db2a20deeca7402fd3b4bd1e4c59659/api/pixel</TrackingUrl>
<Group token="llc">Language, Literacy and Culture Doctoral Program</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/llc</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xsmall.png?1375383725</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/original.jpg?1375383725</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xxlarge.png?1375383725</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xlarge.png?1375383725</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/large.png?1375383725</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/medium.png?1375383725</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/small.png?1375383725</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xsmall.png?1375383725</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xxsmall.png?1375383725</AvatarUrl>
<Sponsor>Language, Literacy and Culture Doctoral Program</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 23 Dec 2013 11:03:19 -0500</PostedAt>
<EditAt>Mon, 23 Dec 2013 11:03:44 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="39715" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39715">
<Title>HTML5 Canvas : Gradients and Patterns</Title>
<Body>
<![CDATA[
    <div class="html-content">In HTML5 canvas, you can fill or stroke shapes and text using stroke() or fill() method. When we draw on text or shapes it uses the current stroke or fill style. The stroke or fill style can be set to a color, a pattern, or a gradient.</div>
]]>
</Body>
<Summary>In HTML5 canvas, you can fill or stroke shapes and text using stroke() or fill() method. When we draw on text or shapes it uses the current stroke or fill style. The stroke or fill style can be...</Summary>
<Website>http://feedproxy.google.com/~r/w3resource/~3/Poab3v0KxKQ/html5-canvas-gradients-patterns.php</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39715/guest@my.umbc.edu/1c82f6629c57c6ea58d52d844667cd51/api/pixel</TrackingUrl>
<Tag>backend</Tag>
<Tag>css</Tag>
<Tag>frontend</Tag>
<Tag>html</Tag>
<Tag>html5</Tag>
<Tag>javascript</Tag>
<Tag>nosql</Tag>
<Tag>sql</Tag>
<Tag>xhtml</Tag>
<Tag>xml</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 23 Dec 2013 11:01:25 -0500</PostedAt>
<EditAt>Thu, 15 May 2014 09:16:23 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="39716" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39716">
<Title>HTML5 Canvas Rectangle</Title>
<Body>
<![CDATA[
    <div class="html-content">To draw a rectangle, specify the x and y coordinates (upper-left corner) and the height and width of the rectangle.</div>
]]>
</Body>
<Summary>To draw a rectangle, specify the x and y coordinates (upper-left corner) and the height and width of the rectangle.</Summary>
<Website>http://feedproxy.google.com/~r/w3resource/~3/uNkCkBPzEo0/html5-canvas-rectangle.php</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39716/guest@my.umbc.edu/e7490a81941945a5a7f6af25f2371062/api/pixel</TrackingUrl>
<Tag>backend</Tag>
<Tag>css</Tag>
<Tag>frontend</Tag>
<Tag>html</Tag>
<Tag>html5</Tag>
<Tag>javascript</Tag>
<Tag>nosql</Tag>
<Tag>sql</Tag>
<Tag>xhtml</Tag>
<Tag>xml</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 23 Dec 2013 11:01:25 -0500</PostedAt>
<EditAt>Thu, 15 May 2014 09:16:23 -0400</EditAt>
</NewsItem>

</News>
