<?xml version="1.0"?>
<News hasArchived="true" page="8899" pageCount="10712" pageSize="10" timestamp="Wed, 01 Jul 2026 13:01:30 -0400" url="https://my3.my.umbc.edu/posts.xml?page=8899">
<NewsItem contentIssues="true" id="27048" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27048">
<Title>Taming Slim 2.0</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <a href="http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=30669&amp;c=319574359" rel="nofollow external" class="bo"><img src="http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=30669&amp;c=319574359" alt="" style="max-width: 100%; height: auto;"></a><p><a href="http://www.slimframework.com/" rel="nofollow external" class="bo">Slim</a> is a lightweight framework that packs a lot of punch for its tiny footprint. It has an incredible routing system, and offers a solid base to work from without getting in your way. Let me show you!</p>
    <p></p>
    <p>But that’s not to say that Slim doesn’t has some issues; it’s one-file setup becomes cluttered as your application grows. In this article, we’ll review how to structure a Slim application to not only sustain, but improve its functionality and keep things neat and systematic.</p>
    <hr>
    <h2>Vanilla Slim</h2>
    <p>Let’s begin by looking at some common Slim code to identify the problem. After you’ve install Slim through <a href="http://net.tutsplus.com/tutorials/php/easy-package-management-with-composer/" rel="nofollow external" class="bo">Composer</a>, you need to create an instance of the <code>Slim</code> object and define your routes:</p>
    <pre>&lt;?php&#x000A;    &#x000A;    $app = new \Slim\Slim;&#x000A;    &#x000A;    $app-&gt;get('/', function(){&#x000A;        echo "Home Page";&#x000A;    }); &#x000A;    &#x000A;    $app-&gt;get('/testPage', function() use ($app) {&#x000A;        $app-&gt;render('testpage.php');&#x000A;    });&#x000A;    &#x000A;    $app-&gt;run();&#x000A;    </pre>
    <blockquote><p>Let’s turn the Slim object into the “controller.”</p></blockquote>
    <p>The first method call sets a new route for the root URI (<code>/</code>), and connects the given function to that route. This is fairly verbose, yet easy to setup. The second method call defines a route for the URI <code>testPage</code>. Inside the supplied method, we use Slim’s <code>render()</code> method to render a view.</p>
    <p>Here lies the first problem: this function (a closure) is not called in the current context and has no way of accessing Slim’s features. This is why we need to use the <code>use</code> keyword to pass the reference to the Slim app.</p>
    <p>The second issue stems from Slim’s architecture; it’s meant to be defined all in one file. Of course, you can outsource the variable to another file, but it just gets messy. Ideally, we want the ability to add controllers to modularize the framework into individual components. As a bonus, it would be nice if these controllers offered native access to Slim’s features, removing the need to pass references into the closures.</p>
    <hr>
    <h2>A Little Reverse Engineering</h2>
    <p>It’s debatable whether reading source code from an open-source project is considered reverse engineering, but it’s the term I’ll stick with. We understand how to use Slim, but what goes on under the hood? Let’s look at a more complicated route to get to the root of this question:</p>
    <pre>$app-&gt;get('/users/:name', function($name){&#x000A;        echo "Hello " . $name;&#x000A;    });&#x000A;    </pre>
    <p>This route definition uses a colon with the word, <code>name</code>. This is a placeholder, and the value used in its place is passed to the function. For example, <code>/users/gabriel</code> matches this route, and ‘gabriel’ is passed to the function. The route, <code>/users</code>, on the other hand, is not a match because it is missing the parameter.</p>
    <p>If you think about it logically, there are a number of steps that must complete in order to process a route.</p>
    <ul>
    <li>
    <strong>Step One</strong>: check if the route matches the current URI.</li>
    <li>
    <strong>Step Two</strong>: extract all parameters from the URI.</li>
    <li>
    <strong>Step Three</strong>: call the connected closure and pass the extracted parameters.</li>
    </ul>
    <p>To better optimize the process, Slim — using regex callbacks and groups — stores the placeholders as it checks for matches. This combines two steps into one, leaving only the need to execute the connected function when Slim is ready. It becomes clear that the route object is self-contained, and frankly, all that is needed.</p>
    <p>In the previous example, we had access to Slim’s features when parsing the routes, but we needed to pass a Slim object reference because it would otherwise be unavailable within the function’s execution context. That’s all you need for most applications, as your application’s logic should occur in the controller.</p>
    <p>With that in mind, let’s extract the “routing” portion into a class and turn the Slim object into the “controller.”</p>
    <hr>
    <h2>Getting Started</h2>
    <p>To begin, let’s download and install “vanilla Slim” if you haven’t done so already. I’m going to assume that you have Composer installed, but if not, <a href="http://getcomposer.org/doc/00-intro.md#globally" rel="nofollow external" class="bo">follow the steps </a>.</p>
    <p>Within a new directory, create a file named <code>composer.json</code>, and append the following:</p>
    <pre>{&#x000A;        "name": "nettuts/slim-mvc",&#x000A;        "require": {&#x000A;            "slim/slim": "*",&#x000A;            "slim/extras": "*",&#x000A;            "twig/twig": "*"&#x000A;        }&#x000A;    }&#x000A;    </pre>
    <p>In a terminal window, navigate to said directory and type <code>composer install</code>. I’ll walk you through these packages, if this is you’re first time using Slim.</p>
    <ul>
    <li>
    <strong>slim/slim</strong> – the actual Slim framework.</li>
    <li>
    <strong>slim/extras</strong> – a set of optional classes to extend Slim.</li>
    <li>
    <strong>twig/twig</strong> – the <a href="http://twig.sensiolabs.org/" rel="nofollow external" class="bo">Twig templating engine</a>.</li>
    </ul>
    <p>You technically don’t need the the Slim extras or Twig for this tutorial, but I like using Twig instead of standard PHP templates. If you use Twig, however, you need the Slim extras because it provides an interface between Twig and Slim.</p>
    <p>Now lets add our custom files, and we’ll start by adding a directory to the <code>vendors</code> folder. I’ll name mine <code>Nettuts</code>, but feel free to name yours whatever you wish. If you are still in the terminal, ensure that your terminal window is in the project’s directory and type the following:</p>
    <pre>mkdir vendor/Nettuts</pre>
    <p>Now, edit <code>composer.json</code> by adding the reference to this new folder:</p>
    <pre>{&#x000A;      "name": "nettuts/slim-mvc",&#x000A;      "require": {&#x000A;            "slim/slim": "*",&#x000A;            "slim/extras": "*",&#x000A;            "twig/twig": "*"&#x000A;      },&#x000A;        "autoload": {&#x000A;            "psr-0": {&#x000A;                "Nettuts": "vendor/"&#x000A;            }&#x000A;        }&#x000A;    }&#x000A;    </pre>
    <p>We want our app to automatically load classes from the <code>Nettuts</code> namespace, so this tells Composer to map all requests for <code>Nettuts</code> to the PSR-0 standard starting from the <code>vendor</code> folder.</p>
    <p>Now execute:</p>
    <pre>composer dump-autoload</pre>
    <p>This recompiles the autoloader to include the new reference. Next, create a file, named <code>Router.php</code>, within the <code>Nettuts</code> directory, and enter the following:</p>
    <pre>&lt;?php&#x000A;    &#x000A;    namespace Nettuts;&#x000A;    &#x000A;    Class Router&#x000A;    {&#x000A;    }&#x000A;    </pre>
    <p>We saw that each route object has a self-contained function that determines if it matches the provided URI. So, we want an array of routes and a function to parse through them. We’ll also need another function to add new routes, and a way to retrieve the URI from the current HTTP request.</p>
    <p>Let’s begin by adding some member variables and the constructor:</p>
    <pre>Class Router&#x000A;    {&#x000A;        protected $routes;&#x000A;        protected $request;&#x000A;    &#x000A;        public function __construct()&#x000A;        {&#x000A;            $env = \Slim\Environment::getInstance();&#x000A;            $this-&gt;request = new \Slim\Http\Request($env);&#x000A;            $this-&gt;routes = array();&#x000A;        }&#x000A;    }&#x000A;    </pre>
    <p>We set the <code>routes</code> variable to contain the routes, and the <code>request</code> variable to store the Slim <code>Request</code> object. Next, we need the ability to add routes. To stick with best practices, I will break this into two steps:</p>
    <pre>public function addRoutes($routes)&#x000A;    {&#x000A;        foreach ($routes as $route =&gt; $path) {&#x000A;    &#x000A;            $method = "any";&#x000A;    &#x000A;            if (strpos($path, "@") !== false) {&#x000A;                list($path, $method) = explode("@", $path);&#x000A;            }&#x000A;            &#x000A;            $func = $this-&gt;processCallback($path);&#x000A;    &#x000A;            $r = new \Slim\Route($route, $func);&#x000A;            $r-&gt;setHttpMethods(strtoupper($method));&#x000A;    &#x000A;            array_push($this-&gt;routes, $r);&#x000A;        }&#x000A;    }</pre>
    <p>This public function accepts an associative array of routes in the format of <code>route =&gt; path</code>, where <code>route</code> is a standard Slim route and <code>path</code> is a string with the following convention:</p> <img src="http://cdn.tutsplus.com/net.tutsplus.com/authors/gabriel-manricks/Slim_Path.png" alt="path syntax" style="max-width: 100%; height: auto;"><p>Optionally, you can leave out certain parameters to use a default value. For example, the class name will be replaced with <code>Main</code> if you leave it out, <code>index</code> is the default for omitted function names, and the default for the HTTP method is <code>any</code>. Of course, <code>any</code> is not a real HTTP method, but it is a value that Slim uses to match all HTTP method types.</p>
    <p>The <code>addRoutes</code> function starts with a <code>foreach</code> loop that cycles through the routes. Next, we set the default HTTP method, optionally overriding it with the provided method if the <code>@</code> symbol is present. Then we pass the remainder of the path to a function to retrieve a callback, and attach it to a route. Finally, we add the route to the array.</p>
    <p>Now let’s look at the <code>processCallback()</code> function:</p>
    <pre>protected function processCallback($path)&#x000A;    {&#x000A;        $class = "Main";&#x000A;    &#x000A;        if (strpos($path, ":") !== false) {&#x000A;            list($class, $path) = explode(":", $path);&#x000A;        }&#x000A;    &#x000A;        $function = ($path != "") ? $path : "index";&#x000A;    &#x000A;        $func = function () use ($class, $function) {&#x000A;            $class = '\Controllers\\' . $class;&#x000A;            $class = new $class();&#x000A;    &#x000A;            $args = func_get_args();&#x000A;    &#x000A;            return call_user_func_array(array($class, $function), $args);&#x000A;        };&#x000A;    &#x000A;        return $func;&#x000A;    }</pre>
    <blockquote><p>The second issue stems from Slim’s architecture; it’s meant to be defined all in one file.</p></blockquote>
    <p>We first set the default class to <code>Main</code>, and override that class if the colon symbol is found. Next, we determine if a function is defined and use the default method <code>index</code> if necessary. We then pass the class and function names to a closure and return it to the route.</p>
    <p>Inside the closure, we prepend the class name with the namespace. We then create a new instance of the specified class and retrieve the list of arguments passed to this function. If you remember, while Slim checks if a route matches, it slowly builds a list of parameters based on wildcards from the route. This function (<code>func_get_args()</code>) can be used to get the passed parameters in an array. Then, using the <code>call_user_func_array()</code> method enables us to specify the class and function, while passing the parameters to the controller.</p>
    <p>It’s not a very complicated function once you understand it, but it is a very good example of when closures come in handy.</p>
    <p>To recap, we added a function to our <code>Router</code> that allows you to pass an associative array containing routes and paths that map to classes and functions. The last step is to process the routes and execute any that match. Keeping with the Slim naming convention, let’s call it <code>run</code>:</p>
    <pre>public function run()&#x000A;    {&#x000A;        $display404 = true;&#x000A;        $uri = $this-&gt;request-&gt;getResourceUri();&#x000A;        $method = $this-&gt;request-&gt;getMethod();&#x000A;    &#x000A;        foreach ($this-&gt;routes as $i =&gt; $route) {&#x000A;            if ($route-&gt;matches($uri)) {&#x000A;                if ($route-&gt;supportsHttpMethod($method) || $route-&gt;supportsHttpMethod("ANY")) {&#x000A;                    call_user_func_array($route-&gt;getCallable(), array_values($route-&gt;getParams()));&#x000A;                    $display404 = false;&#x000A;                }&#x000A;            }&#x000A;        }&#x000A;    &#x000A;        if ($display404) {&#x000A;            echo "404 - route not found";&#x000A;        }&#x000A;    }&#x000A;    </pre>
    <p>We begin by setting the <code>display404</code> variable, representing no routes found, to <code>true</code>. If we find a matching route, we’ll set this to <code>false</code> and bypass the error message. Next, we use Slim’s request object to retrieve the current URI and HTTP method.</p>
    <blockquote><p>We’ll use this information to cycle through and find matches from our array.</p></blockquote>
    <p>Once the route object’s <code>matches()</code> function executes, you are able to call <code>getParams()</code> to retrieve the parsed parameters. Using that function and the <code>getCallable()</code> method, we are able to execute the closure and pass the necessary parameters. Finally, we display a 404 message if no route matched the current URI.</p>
    <p>Let’s create the controller class that holds the callbacks for these routes. If you have been following along, then you may have realized that we never forced a protocol or class type. If you don’t want to create a controller class, then any class will work fine.</p>
    <p>So why are create a controller class? The short answer is we still haven’t really used Slim! We used parts of Slim for the HTTP request and routes, but the whole point of this was to have easy access to all of Slim’s properties. Our controller class will extend the actual Slim class, gaining access to all of Slim’s methods.</p>
    <p>You can just as easily skip this and subclass Slim directly from your controllers.</p>
    <hr>
    <h2>Building the Controller</h2>
    <p>This controller basically allows you to modify Slim while still keeping it vanilla. Name the file <code>Controller.php</code>, and write the following code:</p>
    <pre>&lt;?php&#x000A;    &#x000A;    namespace Nettuts;&#x000A;    &#x000A;    Class Controller extends \Slim\Slim&#x000A;    {&#x000A;        protected $data;&#x000A;    &#x000A;        public function __construct()&#x000A;        {&#x000A;            $settings = require("../settings.php");&#x000A;            if (isset($settings['model'])) {&#x000A;                $this-&gt;data = $settings['model'];&#x000A;            }&#x000A;            parent::__construct($settings);&#x000A;        }&#x000A;    }</pre>
    <p>When you initialize Slim, you can pass in a variety of settings, ranging from the application’s debug mode to the templating engine. Instead of hard coding any values in the constructor, I load them from a file named <code>settings.php</code> and pass that array into the parent’s constructor.</p>
    <blockquote><p>Because we are extending Slim, I thought it would be cool to add a ‘model’ setting, allowing people to hook their data object directly into the controller.</p></blockquote>
    <p>That’s the section you can see in the middle of the above code. We check if the <code>model</code> setting has been set and assign it to the controller’s <code>data</code> property if necessary.</p>
    <p>Now create a file named <code>settings.php</code> in the root of your project (the folder with the <code>composer.json</code> file), and enter the following:</p>
    <pre>&lt;?php&#x000A;    &#x000A;    $settings = array(&#x000A;        'view' =&gt; new \Slim\Extras\Views\Twig(),&#x000A;        'templates.path' =&gt; '../Views',&#x000A;        'model' =&gt; (Object)array(&#x000A;            "message" =&gt; "Hello World"&#x000A;        )&#x000A;    );&#x000A;    &#x000A;    return $settings;</pre>
    <p>These are standard Slim settings with the exception of the model. Whatever value is assigned to the <code>model</code> property is passed to the <code>data</code> variable; this could be an array, another class, a string, etc… I set it to an object because I like using the <code>-&gt;</code> notation instead of the bracket (array) notation.</p>
    <p>We can now test the system. If you remember in the <code>Router</code> class, we prepend the class name with the “<code>Controller</code>” namespace. Open up <code>composer.json</code> add the following directly after the psr-0 definition for the <code>Nettuts</code> namespace:</p>
    <pre>{&#x000A;      "name": "nettuts/slim_advanced",&#x000A;      "require": {&#x000A;            "slim/slim": "2.2.0",&#x000A;            "slim/extras": "*",&#x000A;            "twig/twig": "*"&#x000A;      },&#x000A;        "autoload": {&#x000A;            "psr-0": {&#x000A;                "Nettuts": "vendor/",&#x000A;                "Controller": "./"&#x000A;            }&#x000A;        }&#x000A;    }</pre>
    <p>Then like before, just dump the autoloader:</p>
    <pre>composer dump-autoload</pre>
    <p>If we just set the base path to the root directory, then the namespace <code>Controller</code> will map to a folder named “<code>Controller</code>” in the root of our app. So create that folder:</p>
    <pre>mkdir Controller</pre>
    <p>Inside this folder, create a new file named <code>Main.php</code>. Inside the file, we need to declare the namespace and create a class that extends our <code>Controller</code> base class:</p>
    <pre>&lt;?php&#x000A;    &#x000A;    namespace Controller;&#x000A;    &#x000A;    Class Main extends \Nettuts\Controller&#x000A;    {&#x000A;        public function index()&#x000A;        {&#x000A;            echo $this-&gt;data-&gt;message;&#x000A;        }&#x000A;    &#x000A;        public function test()&#x000A;        {&#x000A;            echo "Test Page";&#x000A;        }&#x000A;    }</pre>
    <p>This is not complicated, but let’s take it in moderation. In this class, we define two functions; their names don’t matter because we will map them to routes later. It’s important to notice that I directly access properties from the controller (i.e. the model) in the first function, and in fact, you will have full access to all of Slim’s commands.</p>
    <p>Let’s now create the actual public file. Create a new directory in the root of your project and name it <code>public</code>. As its name implies, this is were all the public stuff will reside. Inside this folder, create a file called <code>index.php</code> and enter the following:</p>
    <pre>&lt;?php&#x000A;    &#x000A;    require("../vendor/autoload.php");&#x000A;    &#x000A;    $router = new \Nettuts\Router;&#x000A;    &#x000A;    $routes = array(&#x000A;        '/' =&gt; 'Main:index@get',&#x000A;        '/test' =&gt; 'Main:test@get'&#x000A;    );&#x000A;    &#x000A;    $router-&gt;addRoutes($routes);&#x000A;    &#x000A;    $router-&gt;run();</pre>
    <p>We include Composer’s autoloading library and create a new instance of our router. Then we define two routes, add them to the router object and execute it.</p>
    <p>You also need to turn on mod_rewrite in Apache (or the equivalent using a different web server). To set this up, create a file named <code>.htaccess</code> inside the <code>public</code> directory and fill it with the following:</p>
    <pre>RewriteEngine On&#x000A;    RewriteCond %{REQUEST_FILENAME} !-f&#x000A;    RewriteRule ^ index.php [QSA,L]</pre>
    <p>Now all requests to this folder (that do not match an actual file) will be transferred to <code>index.php</code>.</p>
    <p>In your browser, navigate to your <code>public</code> directory, and you should see a page that says “Hello World”. Navigate to “<code>/test</code>“, and you should see the message “Test Page”. It’s not terribly exciting, but we have successfully moved all the logic code into individual controllers.</p>
    <hr>
    <h2>Round Two</h2>
    <blockquote><p>Slim is not CodeIgniter, it’s not Symfony and it’s not Laravel.</p></blockquote>
    <p>So we have basic functionality, but there are a few rough edges. Let’s start with the router.</p>
    <p>As of right now, we display a simple error message if a route doesn’t exist. In a real application, we want the same functionality as loading a regular page. We want to take advantage of Slim’s ability to load views, as well as set the response’s error code.</p>
    <p>Let’s add a new class variable that holds an optional path (just like the other routes). At the top of the file, add the following line directly after the request object definition:</p>
    <pre>protected $errorHandler;</pre>
    <p>Next, let’s create a function that accepts a path and assigns it a callback function. This is relatively simple because we already abstracted this functionality:</p>
    <pre>public function set404Handler($path)&#x000A;    {&#x000A;        $this-&gt;errorHandler = $this-&gt;processCallback($path);&#x000A;    }</pre>
    <p>Now let’s adjust the <code>run</code> command to optionally execute the callback instead of just displaying the error message:</p>
    <pre>if ($display404) {&#x000A;        if (is_callable($this-&gt;errorHandler)) {&#x000A;            call_user_func($this-&gt;errorHandler);&#x000A;        } else {&#x000A;            echo "404 - route not found";&#x000A;        }&#x000A;    }</pre>
    <p>Open the controller class. This is where you can adjust Slim’s functionality to your own personal preferences. For example, I would like the option to omit the file extension when loading views. So instead of writing <code>$this-&gt;render("home.php");</code>, I just want to write: <code>$this-&gt;render("home");</code>. To do this let’s override the render method:</p>
    <pre>public function render($name, $data = array(), $status = null)&#x000A;    {&#x000A;        if (strpos($name, ".php") === false) {&#x000A;            $name = $name . ".php";&#x000A;        }&#x000A;        parent::render($name, $data, $status);&#x000A;    }</pre>
    <p>We accept the same parameters as the parent function, but we check if the file extension is provided and add it if necessary. After this modification, we pass the file to the parent method for processing.</p>
    <p>This is just a single example, but we should put any other changes here in the <code>render()</code> method. For example, if you load the same header and footer pages on all your documents, you can add a function <code>renderPage()</code>. This function would load the passed view between the calls to load the regular header and footer.</p>
    <p>Next, let’s take a look at loading some views. In the root of your project create a folder named “<code>Views</code>” (the location and name can be adjusted in the <code>settings.php</code> file). Let’s just create two views named <code>test.php</code> and <code>error.php</code>.</p>
    <p>Inside <code>test.php</code>, add the following:</p>
    <pre>&lt;h1&gt;{{title}}&lt;/h1&gt;&#x000A;    &#x000A;    &lt;p&gt;This is the {{name}} page!&lt;/p&gt;</pre>
    <p>And inside the <code>error.php</code> file, enter this:</p>
    <pre>&lt;h1&gt;404&lt;/h1&gt;&#x000A;    &#x000A;    &lt;p&gt;The route you were looking for could not be found&lt;/p&gt;</pre>
    <p>Also, modify the <code>Main</code> controller by changing the <code>index()</code> function to the following:</p>
    <pre>public function index()&#x000A;    {&#x000A;        $this-&gt;render("test", array("title" =&gt; $this-&gt;data-&gt;message, "name" =&gt; "Home"));&#x000A;    }</pre>
    <p>Here, we render the test view that we just made and pass it data to display. Next, let’s try a route with parameters. Change the <code>test()</code> function to the following:</p>
    <pre>public function test($title)&#x000A;    {&#x000A;        $this-&gt;render("test", array("title" =&gt; $title, "name" =&gt; "Test"));&#x000A;    }</pre>
    <p>Here, we take it one step further by retrieving the page’s title from the URI itself. Last, but not least, let’s add a function for the 404 page:</p>
    <pre>public function notFound()&#x000A;    {&#x000A;        $this-&gt;render('error', array(), 404);&#x000A;    }</pre>
    <p>We use the <code>render()</code> function’s third optional parameter, which sets the response’s HTTP status code.</p>
    <p>Our final edit is in <code>index.php</code> to incorporate our new routes:</p>
    <pre>$routes = array(&#x000A;        '/' =&gt; '',&#x000A;        '/test/:title' =&gt; 'Main:test@get'&#x000A;    );&#x000A;    &#x000A;    $router-&gt;addRoutes($routes);&#x000A;    &#x000A;    $router-&gt;set404Handler("Main:notFound");&#x000A;    &#x000A;    $router-&gt;run();</pre>
    <p>You should now be able to navigate to the three routes and see their respective views.</p>
    <hr>
    <h2>Conclusion</h2>
    <p>With everything that we accomplished, you sure have a few questions about why Slim does not already offer these modifications. They seem logical, they don’t stray from Slim’s implementation too far, and they make a lot of sense. <a href="http://www.newmediacampaigns.com/about/team/josh-lockhart" rel="nofollow external" class="bo">Josh Lockhart</a> (Slim’s creator) put it best:</p>
    <blockquote><p>“Slim is not CodeIgniter, it’s not Symfony, and it’s not Laravel. Slim is Slim. It was built to be light-weight and fun, while still able to solve about 80% of the most common problems. Instead of worrying about the edge cases, it focuses on being simple and having an easy-to-read codebase.”</p></blockquote>
    <p>Sometimes, as developers, we get so caught up covering crazy scenarios that we forget about what’s really important: the code. Mods, like the one in this tutorial, are only possible because of the code’s simplicity and verbosity. So yes, there may be some edge cases that need special attention, but you get an active community, which in my opinion, heavily out-weighs the costs.</p>
    <p>I hope you enjoyed this article. If you have any questions or comments, leave a message down below. You can also contact me through IRC channel on Freenode at the <em>#nettuts</em> channel.</p>
    </div>
]]>
</Body>
<Summary>Slim is a lightweight framework that packs a lot of punch for its tiny footprint. It has an incredible routing system, and offers a solid base to work from without getting in your way. Let me show...</Summary>
<Website>http://feedproxy.google.com/~r/nettuts/~3/G2g641Y1Od4/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27048/guest@my.umbc.edu/914bcdfba9507aac5e4f417b2a10f551/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>slim</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, 01 Apr 2013 14:31:08 -0400</PostedAt>
<EditAt>Mon, 01 Apr 2013 14:31:08 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="27038" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27038">
<Title>The Danger of A Single Story</Title>
<Tagline>TED Talk : Chimamanda Adichie</Tagline>
<Body>
<![CDATA[
    <div class="html-content"> Novelist Chimamanda Adichie tells the story of how she found her 
    authentic cultural voice -- and warns that if we hear only a single 
    story about another person or country, we risk a critical 
    misunderstanding. <br><br><a href="http://www.youtube.com/watch?v=D9Ihs241zeg&amp;feature=youtu.be">http://www.youtube.com/watch?v=D9Ihs241zeg&amp;feature=youtu.be</a> <br><br>Check it out, hear her story, and post your own! Can you relate? Is Chimamanda right? We'd love to hear from you!<br>
    </div>
]]>
</Body>
<Summary> Novelist Chimamanda Adichie tells the story of how she found her  authentic cultural voice -- and warns that if we hear only a single  story about another person or country, we risk a critical...</Summary>
<Website>http://www.youtube.com/watch?v=D9Ihs241zeg&amp;feature=youtu.be</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27038/guest@my.umbc.edu/56f41487151fab5faf1f71cab64db0ad/api/pixel</TrackingUrl>
<Group token="themosaic">The Mosaic: Center for Cultural Diversity </Group>
<GroupUrl>https://my3.my.umbc.edu/groups/themosaic</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/079/8da8369525d899e6fa49decd5a80b73f/xsmall.png?1755890395</AvatarUrl>
<AvatarUrl size="original">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/079/8da8369525d899e6fa49decd5a80b73f/original.png?1755890395</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/079/8da8369525d899e6fa49decd5a80b73f/xxlarge.png?1755890395</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/079/8da8369525d899e6fa49decd5a80b73f/xlarge.png?1755890395</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/079/8da8369525d899e6fa49decd5a80b73f/large.png?1755890395</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/079/8da8369525d899e6fa49decd5a80b73f/medium.png?1755890395</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/079/8da8369525d899e6fa49decd5a80b73f/small.png?1755890395</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/079/8da8369525d899e6fa49decd5a80b73f/xsmall.png?1755890395</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/079/8da8369525d899e6fa49decd5a80b73f/xxsmall.png?1755890395</AvatarUrl>
<Sponsor>The Office of Student Life's Mosaic Center</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 01 Apr 2013 13:52:07 -0400</PostedAt>
<EditAt>Mon, 01 Apr 2013 13:52:36 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="27036" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27036">
<Title>Center For Urban Families Honors Bell-McKoy &#8217;73, Soc</Title>
<Body>
<![CDATA[
    <div class="html-content">The Center for Urban Families will honor Diane Bell-McKoy ’73, sociology, CEO of Associated Black Charities, at its 2nd annual Urban Visionary Award (UVA) ceremony later this month, the group announced. Read more about Bell-McKoy in UMBC Magazine. CFUF, which was … <a href="http://umbcalumni.wordpress.com/2013/04/01/center-for-urban-families-honors-bell-mckoy-73-soc/" rel="nofollow external" class="bo">Continue reading <span>→</span></a>
    </div>
]]>
</Body>
<Summary>The Center for Urban Families will honor Diane Bell-McKoy ’73, sociology, CEO of Associated Black Charities, at its 2nd annual Urban Visionary Award (UVA) ceremony later this month, the group...</Summary>
<Website>http://umbcalumni.wordpress.com/2013/04/01/center-for-urban-families-honors-bell-mckoy-73-soc/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27036/guest@my.umbc.edu/8dcb43bc80e7e76c389c2a42a600df04/api/pixel</TrackingUrl>
<Tag>70s-alums</Tag>
<Tag>arts-and-humanities</Tag>
<Group token="retired-20">UMBC Alumni</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-20</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xsmall.png?1280681147</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/original.png?1280681147</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xxlarge.png?1280681147</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xlarge.png?1280681147</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/large.png?1280681147</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/medium.png?1280681147</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/small.png?1280681147</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xsmall.png?1280681147</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xxsmall.png?1280681147</AvatarUrl>
<Sponsor>UMBC Alumni</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 01 Apr 2013 13:42:47 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="27129" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27129">
<Title>Center For Urban Families Honors Bell-McKoy &#8217;73, Soc</Title>
<Body>
<![CDATA[
    <div class="html-content">The Center for Urban Families will honor Diane Bell-McKoy ’73, sociology, CEO of Associated Black Charities, at its 2nd annual Urban Visionary Award (UVA) ceremony later this month, the group announced. Read more about Bell-McKoy in UMBC Magazine. CFUF, which was … <a href="https://umbcalumni.wordpress.com/2013/04/01/center-for-urban-families-honors-bell-mckoy-73-soc/" rel="nofollow external" class="bo">Continue reading <span>→</span></a>
    </div>
]]>
</Body>
<Summary>The Center for Urban Families will honor Diane Bell-McKoy ’73, sociology, CEO of Associated Black Charities, at its 2nd annual Urban Visionary Award (UVA) ceremony later this month, the group...</Summary>
<Website>https://umbcalumni.wordpress.com/2013/04/01/center-for-urban-families-honors-bell-mckoy-73-soc/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27129/guest@my.umbc.edu/8a653ba7a9badd041f7122e742048375/api/pixel</TrackingUrl>
<Tag>70s-alums</Tag>
<Tag>arts-and-humanities</Tag>
<Group token="retired-20">UMBC Alumni</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-20</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xsmall.png?1280681147</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/original.png?1280681147</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xxlarge.png?1280681147</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xlarge.png?1280681147</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/large.png?1280681147</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/medium.png?1280681147</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/small.png?1280681147</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xsmall.png?1280681147</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xxsmall.png?1280681147</AvatarUrl>
<Sponsor>UMBC Alumni</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 01 Apr 2013 13:42:47 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="107027" important="false" status="posted" url="https://my3.my.umbc.edu/posts/107027">
<Title>Center For Urban Families Honors Bell-McKoy &#8217;73, Soc</Title>
<Body>
<![CDATA[
    <div class="html-content">The Center for Urban Families will honor Diane Bell-McKoy ’73, sociology, CEO of Associated Black Charities, at its 2nd annual …</div>
]]>
</Body>
<Summary>The Center for Urban Families will honor Diane Bell-McKoy ’73, sociology, CEO of Associated Black Charities, at its 2nd annual …</Summary>
<Website>https://magazine.umbc.edu/center-for-urban-families-honors-bell-mckoy-73-soc/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/107027/guest@my.umbc.edu/7eacd739772500ad88ac7d13c0775105/api/pixel</TrackingUrl>
<Tag>alumni</Tag>
<Group token="retired-1945">UMBC Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-1945</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/images/avatars/group/8/xsmall.png?1782921639</AvatarUrl>
<AvatarUrl size="original">https://assets3-my.umbc.edu/images/avatars/group/8/original.png?1782921639</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/images/avatars/group/8/xxlarge.png?1782921639</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/images/avatars/group/8/xlarge.png?1782921639</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/images/avatars/group/8/large.png?1782921639</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/images/avatars/group/8/medium.png?1782921639</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/images/avatars/group/8/small.png?1782921639</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/images/avatars/group/8/xsmall.png?1782921639</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets1-my.umbc.edu/images/avatars/group/8/xxsmall.png?1782921639</AvatarUrl>
<Sponsor>UMBC Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 01 Apr 2013 13:42:47 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="27034" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27034">
<Title>Accessing the Device Camera with getUserMedia</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>One of the funnest technologies to come to web browsers in the last couple years is the ability to access the webcam and microphone without the need for a third party plugin. When you combine these native media streams with the new CSS3 filters you have a recipe for awsomeness.</p>
    <p>In this blog post you are going to learn how to access the device camera using <code>getUserMedia</code> and stream this input into a <code>&lt;video&gt;</code> element. To finish up you will play around with using CSS3 filters to add cool effects to the video.</p>
    <h2>Browser Support for getUserMedia</h2>
    <p><a href="http://blog.teamtreehouse.com/wp-content/uploads/2013/03/browser-support.png" rel="nofollow external" class="bo"><img alt="browser-support" src="http://blog.teamtreehouse.com/wp-content/uploads/2013/03/browser-support.png" width="150" height="54" style="max-width: 100%; height: auto;"></a></p>
    <p>Before we start it’s worth taking a look at browser support. Support for <code>getUserMedia</code> has been around in desktop browsers for a little while now.</p>
    <p>Google Chrome (stable) has supported <code>getUserMedia</code> since v24. However the API is currently still prefixed as <code>webkitGetUserMedia</code>.</p>
    <p>Firefox has support for the API through <code>mozGetUserMedia</code>. You may need to enable media support though. To do this go to <a href="config" rel="nofollow external" class="bo">about:config</a> and toggle the <code>media.navigator.enabled</code> option to true.</p>
    <p>Opera supports the unprefixed <code>getUserMedia</code> function.</p>
    <p>Unfortunately IE and Safari don’t currently support <code>getUserMedia</code>.</p>
    <p>For more detailed information on browser support check out the compatibility table on <a href="http://caniuse.com/#feat=stream" rel="nofollow external" class="bo">caniuse.com</a></p>
    <h2>Setting Up The Demo</h2>
    <p>Lets dive in and create a demo so that you can see how to use <code>getUserMedia</code>.</p>
    <p>First you need to create a HTML file for your markup. Create a new file called <code>index.html</code> and save it in a folder that is accessible from your local development server.</p>
    <hr>
    <p><strong>Note:</strong> You cannot use <code>getUserMedia</code> on web pages served using <code>file://</code> URLs.</p>
    <hr>
    <p>Copy the following code into your <code>index.html</code> file. This will setup a basic web page with a <code>&lt;video&gt;</code> element and a <code>&lt;div&gt;</code> that will be used for styling purposes.</p>
    <pre>&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;HTML5 Demo: getUserMedia (Treehouse Blog)&lt;/title&gt;&#x000A;      &lt;link rel="stylesheet" href="style.css"&gt;&#x000A;    &lt;/head&gt;&#x000A;    &lt;body&gt;&#x000A;      &lt;div id="video-container"&gt;&#x000A;        &lt;video id="camera-stream" width="500" autoplay&gt;&lt;/video&gt;&#x000A;      &lt;/div&gt;&#x000A;      &lt;script src="script.js"&gt;&lt;/script&gt;&#x000A;    &lt;/body&gt;&#x000A;    &lt;/html&gt;</pre>
    <hr>
    <p><strong>Pro Tip</strong>: Adding a <code>controls</code> attribute to the video will allow you to pause the video stream and go fullscreen.</p>
    <hr>
    <p>Now create a new stylesheet called <code>style.css</code> and save it in the same folder as your <code>index.html</code> file. Copy the following CSS code into your new stylesheet.</p>
    <pre>body {&#x000A;      background: #F7F7F7;&#x000A;      margin: 0;&#x000A;      padding: 0;&#x000A;    }&#x000A;    &#x000A;    #video-container {&#x000A;      margin: 2em auto 0;&#x000A;      width: 500px;&#x000A;      padding: 2em;&#x000A;      background: white;&#x000A;      -webkit-box-shadow: 0 1px 10px #D9D9D9;&#x000A;      -moz-box-shadow: 0 1px 10px #D9D9D9;&#x000A;      -ms-box-shadow: 0 1px 10px #D9D9D9;&#x000A;      -o-box-shadow: 0 1px 10px #D9D9D9;&#x000A;      box-shadow: 0 1px 10px #D9D9D9;&#x000A;    }</pre>
    <p>Finally you need to setup a JavaScript file that will contain the code used to access the camera. Name this file <code>script.js</code> and save it in the same folder as your other assets. The code below will alias the vendor prefixed versions of <code>getUserMedia</code> so that you only need to call <code>navigator.getUserMedia</code> once rather than having to call of the vendor prefixed versions seperately in order to get your demo working across browsers.</p>
    <pre>window.onload = function() {&#x000A;    &#x000A;      // Normalize the various vendor prefixed versions of getUserMedia.&#x000A;      navigator.getUserMedia = (navigator.getUserMedia ||&#x000A;                                navigator.webkitGetUserMedia ||&#x000A;                                navigator.mozGetUserMedia || &#x000A;                                navigator.msGetUserMedia);&#x000A;    &#x000A;    }</pre>
    <h2>Accessing The Camera</h2>
    <p>Now that you have all of your assets setup it’s time to take a look at <code>getUserMedia</code> in more detail.</p>
    <p>The <code>getUserMedia</code> function takes three parameters:</p>
    <ul>
    <li>
    <strong><code>constraints</code></strong> – This should be an object that specifies which media streams you would like to access. For example, to get both video and audio you would use: <code>{ video: true, audio: true }</code>
    </li>
    <li>
    <strong><code>successCallback</code></strong> – A function that will be called if the media stream is successfully loaded. The function will be passed a <code>LocalMediaStream</code> object.</li>
    <li>
    <strong><code>errorCallback</code></strong> (optional) – A function that will be called if the media stream cannot be loaded.</li>
    </ul>
    <p>Copy the following code into your <code>script.js</code> file, just inside the last curly brace.</p>
    <pre>// Check that the browser supports getUserMedia.&#x000A;    // If it doesn't show an alert, otherwise continue.&#x000A;    if (navigator.getUserMedia) {&#x000A;      // Request the camera.&#x000A;      navigator.getUserMedia(&#x000A;        // Constraints&#x000A;        {&#x000A;          video: true&#x000A;        },&#x000A;    &#x000A;        // Success Callback&#x000A;        function(localMediaStream) {&#x000A;    &#x000A;        },&#x000A;    &#x000A;        // Error Callback&#x000A;        function(err) {&#x000A;          // Log the error to the console.&#x000A;          console.log('The following error occurred when trying to use getUserMedia: ' + err);&#x000A;        }&#x000A;      );&#x000A;    &#x000A;    } else {&#x000A;      alert('Sorry, your browser does not support getUserMedia');&#x000A;    }</pre>
    <p>This code first does a check to see if the <code>getUserMedia</code> function is available in the browser. If it’s not it will show an alert to the user.</p>
    <p>Once it has been established that the browser supports <code>getUserMedia</code> we issue the function call, passing in a constraints object that specifies we want a video stream; a callback function; and an error handler that will log any errors to the console.</p>
    <div>
    <a href="http://blog.teamtreehouse.com/wp-content/uploads/2013/03/getusermedia-permissions.png" rel="nofollow external" class="bo"><img alt="getUserMedia Permissions Dialog" src="http://blog.teamtreehouse.com/wp-content/uploads/2013/03/getusermedia-permissions.png" width="616" height="36" style="max-width: 100%; height: auto;"></a><p>getUserMedia Permissions Dialog</p>
    </div>
    <p>When the function is called the user will be presented with a permissions dialog (like the one in the image above) giving them the ability to allow or deny access to the camera. This is a very important privacy feature which stops websites from being able to spy on users without their knowledge.</p>
    <h2>Hooking Up The Video Stream</h2>
    <p>The final thing to do in order to get your video stream working is to hook up the <code>LocalMediaStream</code> object to the <code>&lt;video&gt;</code> element in your HTML markup.</p>
    <hr>
    <p><strong>Note:</strong> The <code>LocalMediaStream</code> object is passed into the success callback through the  <code>localMediaStream</code> parameter you specified in the previous section.</p>
    <hr>
    <p>Add the following code to the success callback in your <code>getUserMedia</code> call.</p>
    <pre>// Get a reference to the video element on the page.&#x000A;    var vid = document.getElementById('camera-stream');&#x000A;    &#x000A;    // Create an object URL for the video stream and use this &#x000A;    // to set the video source.&#x000A;    vid.src = window.URL.createObjectURL(localMediaStream);</pre>
    <p>Here you first get a reference to the <code>&lt;video&gt;</code> element on your web page. You then generate an object URL for the LocalMediaStream provided by <code>getUserMedia</code> and use this URL as the <code>src</code> for the video. You can use an <a href="https://developer.mozilla.org/en-US/docs/DOM/window.URL.createObjectURL" rel="nofollow external" class="bo">object URL</a> just like you would any other URL.</p>
    <p>Now if you load up your demo page and accept the permissions dialog you should see the video feed from your camera being displayed on the page, as shown in the figure below.</p>
    <p><a href="http://blog.teamtreehouse.com/wp-content/uploads/2013/03/getusermedia-normal.png" rel="nofollow external" class="bo"><img alt="getusermedia-video" src="http://blog.teamtreehouse.com/wp-content/uploads/2013/03/getusermedia-normal.png" width="605" height="482" style="max-width: 100%; height: auto;"></a></p>
    <p>Congratulations! You now know how to access the webcam without using any third-party plugins. It’s really not as hard as you might have thought.</p>
    <p>You could stop here, but if you’re feeling a little adventurous, continue on to see how you can use CSS3 filters to add effects to the video stream.</p>
    <h2>Adding Effects with CSS3 Filters</h2>
    <div>
    <a href="http://blog.teamtreehouse.com/wp-content/uploads/2013/03/filter-effects.jpeg" rel="nofollow external" class="bo"><img alt="CSS3 Filter Effects" src="http://blog.teamtreehouse.com/wp-content/uploads/2013/03/filter-effects.jpeg" width="680" height="510" style="max-width: 100%; height: auto;"></a><p>CSS3 Filter Effects</p>
    </div>
    <p>CSS3 Filters allow you to easily add effects like grayscale, blur and sepia to your video stream. This works by using the <code>-webkit-filter</code> CSS rule directly on the <code>&lt;video&gt;</code> element on your web page. It’s super easy so lets give it a go!</p>
    <p>Add the following CSS code to your <code>style.css</code> file. This will add a sepia effect to the video stream.</p>
    <pre>#camera-stream {&#x000A;      -webkit-filter: sepia(1);&#x000A;    }</pre>
    <p>Now if you reload the page you should the sepia effect on the video. Pretty nifty!</p>
    <p>Here are some other CSS3 filters for you to play around with.</p>
    <pre>-webkit-filter: blur(3px);&#x000A;    -webkit-filter: grayscale(1);&#x000A;    -webkit-filter: sepia(1);&#x000A;    -webkit-filter: brightness(2.5);&#x000A;    -webkit-filter: contrast(5);&#x000A;    -webkit-filter: hue-rotate(125deg);&#x000A;    -webkit-filter: invert(1);&#x000A;    -webkit-filter: saturate(3);&#x000A;    -webkit-filter: opacity(0.3);</pre>
    <h2>Summary</h2>
    <p>I hope you’ve had as much fun playing around with <code>getUserMedia</code> as I did when I was writing this article!</p>
    <p>Being able to access device hardware like the webcam and microphone without the need for third-party plugins is a big step forward for the web. There are already a number of web applications that are taking advantage of this emerging technology and I’m excited to see what developers are going to do with it in the future.</p>
    <p>How do you plan to use <code>getUserMedia</code> in your projects?</p>
    <p>The post <a href="http://blog.teamtreehouse.com/accessing-the-device-camera-with-getusermedia" rel="nofollow external" class="bo">Accessing the Device Camera with getUserMedia</a> appeared first on <a href="http://blog.teamtreehouse.com" rel="nofollow external" class="bo">Treehouse Blog</a>.</p>
    </div>
]]>
</Body>
<Summary>One of the funnest technologies to come to web browsers in the last couple years is the ability to access the webcam and microphone without the need for a third party plugin. When you combine...</Summary>
<Website>http://feedproxy.google.com/~r/teamtreehouse/~3/Z4SYm-zHcy8/accessing-the-device-camera-with-getusermedia</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27034/guest@my.umbc.edu/e8253645a7ef86c864200708dbb2f079/api/pixel</TrackingUrl>
<Tag>android</Tag>
<Tag>camera</Tag>
<Tag>code</Tag>
<Tag>css</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>getusermedia</Tag>
<Tag>html</Tag>
<Tag>html5</Tag>
<Tag>ios</Tag>
<Tag>javascript</Tag>
<Tag>responsive</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, 01 Apr 2013 13:30:28 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="27031" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27031">
<Title>Save these Spring/Summer 2013 dates! May 4: Cookout; July 9-12: Dissertation House; August  16-17: SSI</Title>
<Tagline>Mark your calendars!</Tagline>
<Body>
<![CDATA[
    <div class="html-content">
    <p>Dear Graduate Students, Postdoctoral Fellows, Faculty, Staff, and Friends of PROMISE:</p>
    <p><em>Please save the following dates for Spring and Summer 2013:</em></p>
    <ul>
    <li><strong>SATURDAY, May 4, 2013: Annual PROMISE Friends and Family &amp; Celebration of Graduates Cookout </strong></li>
    </ul>
    <p>Location:<br>
    High Ridge Park<br>
    10100 Superior Ave<br>
    Laurel, MD 20723</p>
    <p>1:00 – 4:00 PM</p>
    <p>All PROMISE participants who are graduating with masters or doctoral degrees from any school within the University System of Maryland will be celebrated. If you are graduating this May or August, please send your name, school, department, and degree to <a href="mailto:promisestaff@gmail.com">promisestaff@gmail.com</a>. (Graduates will be recognized at 3PM.) Family and friends are invited to celebrate with you. This cookout is for graduate students from all disciplines, part-time/full-time, and at all levels (1st year graduate student to PhD candidate.) Faculty, postdocs, alumni, staff, plus your family and friends are invited. This event is free, but please register so that we can have an accurate count and can use our funds wisely.</p>
    <p><em>Please register for the cookout here:</em> <a href="http://promisecookout2013.eventbrite.com/" rel="nofollow external" class="bo">http://promisecookout2013.eventbrite.com/</a></p>
    <p><a href="http://www.eventbrite.com/event/6218480643?ref=ebtn" rel="nofollow external" class="bo"><img alt="Eventbrite - PROMISE Friends and Family Cookout &amp; Celebration of Graduates 2013" src="http://www.eventbrite.com/custombutton?eid=6218480643" style="max-width: 100%; height: auto;"></a></p>
    <p>————————————————————————————————-</p>
    <p><em>SAVE THE DATES! More information on the events below will be posted soon!</em></p>
    <ul>
    <li>
    <strong>June 12, 2013: “Introduction to the PMP (Project Management Professional – Leadership Training): Credentials and Certification” </strong>
    <ul>
    <li>Special guest facilitator: Dr. Don Engel, UMBC’s Assistant Vice President for Research</li>
    <li>RSVP: <a href="http://my.umbc.edu/groups/promise/events/17433" rel="nofollow external" class="bo">http://my.umbc.edu/groups/promise/events/17433</a>
    </li>
    </ul>
    </li>
    </ul>
    <ul>
    <li>
    <strong>July 9-12, 2013: Dissertation House at UMBC with Dr. Wendy Carter-Veale</strong>
    <ul>
    <li>Also during this week on the 3rd floor of the Commons at UMBC:
    <ul>
    <li><em>Writing for Publication</em></li>
    <li><em>Postdoctoral Writing Suite (with Dr. Judith Pollack)</em></li>
    <li><em>Practice for the PMP Exam (with Dr. Don Engel)</em></li>
    </ul>
    </li>
    <li>Dissertation House at UMCP TBA</li>
    </ul>
    </li>
    </ul>
    <p>More information about applying for the 2013 Dissertation House at UMBC can be found here: <a href="http://dissertationhouse.wordpress.com/2013/04/09/save-the-date-summer-dissertation-house-july-9-12-2013-umbc/" rel="nofollow external" class="bo">http://dissertationhouse.wordpress.com/2013/04/09/save-the-date-summer-dissertation-house-july-9-12-2013-umbc/</a><a href="http://dissertationhouse.wordpress.com/2013/04/09/save-the-date-summer-dissertation-house-july-9-12-2013-umbc/#comment-7854" rel="nofollow external" class="bo"><br>
    </a></p>
    <ul>
    <li><strong>July 2013: SUMMER HORIZONS (Preparation for Graduate School Workshops) – TBA</strong></li>
    </ul>
    <p>Hosted by PROMISE, The Graduate School at UMBC, and the Graduate Meyerhoff Fellows Program</p>
    <ul>
    <li><strong>August 16-17: PROMISE SUMMER SUCCESS INSTITUTE (SSI)</strong></li>
    </ul>
    <p>Hosted by UMB (University of Maryland, Baltimore – The Founding Campus)<br>
    <a href="http://www.umaryland.edu/smccampuscenter/" rel="nofollow external" class="bo">SMC Campus Center</a><br>
    621 W. Lombard St.<br>
    Baltimore, MD 21201</p>
    <p>Graduate students, Postdoctoral Fellows, and Professionals from any school within the USM are invited to attend.  An Eventbrite RSVP invitation page will be posted soon. Remembering SSI from past years:</p>
    <p><a href="http://promiseagep.wordpress.com/2012/06/29/2012-summer-success-institute-august-17-18-2012-umbc-the-hotel-at-arundel-preserve/" rel="nofollow external" class="bo">SSI 2012</a></p>
    <p><a href="http://promisesuccessseminars.wordpress.com/promise-summer-success-institute-ssi/" rel="nofollow external" class="bo">SSI 2011 (includes links to SSI events from 2003 to 2011.) </a></p>
    <h6>Related articles</h6>
    <ul>
    <li>
    <a href="http://promisesuccessseminars.wordpress.com/2013/03/27/april-2013-seminars-1-april-3-career-paths-for-graduate-students-umbc-2-april-26-dissertation-proposals-college-park/" rel="nofollow external" class="bo">April 2013 Seminars: 1) April 3: “Career Paths for Graduate Students” @ UMBC, 2) April 26: “Dissertation Proposals” @ College Park</a> (promisesuccessseminars.wordpress.com)</li>
    </ul>
    <br>   </div>
]]>
</Body>
<Summary>Dear Graduate Students, Postdoctoral Fellows, Faculty, Staff, and Friends of PROMISE:   Please save the following dates for Spring and Summer 2013:     SATURDAY, May 4, 2013: Annual PROMISE...</Summary>
<Website>http://promiseagep.wordpress.com/2013/04/01/save-these-springsummer-dates-may-4-cookout-july-9-12-dissertation-house-august-16-17-ssi/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27031/guest@my.umbc.edu/09fa8e52fcd677b921dbdf037e248d86/api/pixel</TrackingUrl>
<Tag>advising</Tag>
<Tag>agep</Tag>
<Tag>community-building</Tag>
<Tag>development</Tag>
<Tag>dissertation-house</Tag>
<Tag>gradschool</Tag>
<Tag>gradstudents</Tag>
<Tag>graduate-school</Tag>
<Tag>learning</Tag>
<Tag>maryland</Tag>
<Tag>nsf</Tag>
<Tag>p</Tag>
<Tag>ph-d-completion</Tag>
<Tag>pmp</Tag>
<Tag>postdoc</Tag>
<Tag>professor</Tag>
<Tag>professoriate</Tag>
<Tag>project-management</Tag>
<Tag>promise</Tag>
<Tag>seminars-and-workshops</Tag>
<Tag>success-seminars-and-workshops</Tag>
<Tag>summer-success-institute-ssi</Tag>
<Tag>support</Tag>
<Tag>teaching</Tag>
<Tag>umbc</Tag>
<Tag>university-of-maryland-baltimore-county</Tag>
<Tag>wendy-carter-veale</Tag>
<Tag>writing-suite</Tag>
<Group token="gspd">Grad Student &amp;amp; Postdoc Development </Group>
<GroupUrl>https://my3.my.umbc.edu/groups/gspd</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/xsmall.png?1781730740</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/original.png?1781730740</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/xxlarge.png?1781730740</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/xlarge.png?1781730740</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/large.png?1781730740</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/medium.png?1781730740</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/small.png?1781730740</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/xsmall.png?1781730740</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/xxsmall.png?1781730740</AvatarUrl>
<Sponsor>PROMISE @ UMBC: Graduate Student Development</Sponsor>
<ThumbnailUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/027/031/9e3a7911950eab6a8924acece3960e02/xxlarge.jpg?1365046442</ThumbnailUrl>
<ThumbnailUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/027/031/9e3a7911950eab6a8924acece3960e02/xlarge.jpg?1365046442</ThumbnailUrl>
<ThumbnailUrl size="large">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/027/031/9e3a7911950eab6a8924acece3960e02/large.jpg?1365046442</ThumbnailUrl>
<ThumbnailUrl size="medium">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/027/031/9e3a7911950eab6a8924acece3960e02/medium.jpg?1365046442</ThumbnailUrl>
<ThumbnailUrl size="small">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/027/031/9e3a7911950eab6a8924acece3960e02/small.jpg?1365046442</ThumbnailUrl>
<ThumbnailUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/027/031/9e3a7911950eab6a8924acece3960e02/xsmall.jpg?1365046442</ThumbnailUrl>
<ThumbnailUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/027/031/9e3a7911950eab6a8924acece3960e02/xxsmall.jpg?1365046442</ThumbnailUrl>
<PawCount>2</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 01 Apr 2013 13:06:19 -0400</PostedAt>
<EditAt>Mon, 01 Apr 2013 13:06:19 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="28017" important="false" status="posted" url="https://my3.my.umbc.edu/posts/28017">
<Title>Save these Spring/Summer 2013 dates! May 4: Cookout; July 9-12: Dissertation House; August  16-17: SSI</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>Dear Graduate Students, Postdoctoral Fellows, Faculty, Staff, and Friends of PROMISE:</p>
    <p><em>Please save the following dates for Spring and Summer 2013:</em></p>
    <ul>
    <li><strong>SATURDAY, May 4, 2013: Annual PROMISE Friends and Family &amp; Celebration of Graduates Cookout </strong></li>
    </ul>
    <p>Location:<br>
    High Ridge Park<br>
    10100 Superior Ave<br>
    Laurel, MD 20723</p>
    <p>1:00 – 4:00 PM</p>
    <p>All PROMISE participants who are graduating with masters or doctoral degrees from any school within the University System of Maryland will be celebrated. If you are graduating this May or August, please send your name, school, department, and degree to <a href="mailto:promisestaff@gmail.com">promisestaff@gmail.com</a>. (Graduates will be recognized at 3PM.) Family and friends are invited to celebrate with you. This cookout is for graduate students from all disciplines, part-time/full-time, and at all levels (1st year graduate student to PhD candidate.) Faculty, postdocs, alumni, staff, plus your family and friends are invited. This event is free, but please register so that we can have an accurate count and can use our funds wisely.</p>
    <p><em>Please register for the cookout here:</em> <a href="http://promisecookout2013.eventbrite.com/" rel="nofollow external" class="bo">http://promisecookout2013.eventbrite.com/</a></p>
    <p><a href="http://www.eventbrite.com/event/6218480643?ref=ebtn" rel="nofollow external" class="bo"><img alt="Eventbrite - PROMISE Friends and Family Cookout &amp; Celebration of Graduates 2013" src="http://www.eventbrite.com/custombutton?eid=6218480643" style="max-width: 100%; height: auto;"></a></p>
    <p>————————————————————————————————-</p>
    <p><em>SAVE THE DATES! More information on the events below will be posted soon!</em></p>
    <ul>
    <li>
    <strong>June 12, 2013: “Introduction to the PMP (Project Management Professional – Leadership Training): Credentials and Certification” </strong>
    <ul>
    <li>Special guest facilitator: Dr. Don Engel, UMBC’s Assistant Vice President for Research</li>
    <li>RSVP: <a href="http://my.umbc.edu/groups/promise/events/17433" rel="nofollow external" class="bo">http://my.umbc.edu/groups/promise/events/17433</a>
    </li>
    </ul>
    </li>
    </ul>
    <ul>
    <li>
    <strong>July 9-12, 2013: Dissertation House at UMBC with Dr. Wendy Carter-Veale</strong>
    <ul>
    <li>Also during this week on the 3rd floor of the Commons at UMBC:
    <ul>
    <li><em>Writing for Publication</em></li>
    <li><em>Postdoctoral Writing Suite (with Dr. Judith Pollack)</em></li>
    <li><em>Practice for the PMP Exam (with Dr. Don Engel)</em></li>
    </ul>
    </li>
    <li>Dissertation House at UMCP TBA</li>
    </ul>
    </li>
    </ul>
    <p>More information about applying for the 2013 Dissertation House at UMBC can be found here: <a href="http://dissertationhouse.wordpress.com/2013/04/09/save-the-date-summer-dissertation-house-july-9-12-2013-umbc/" rel="nofollow external" class="bo">http://dissertationhouse.wordpress.com/2013/04/09/save-the-date-summer-dissertation-house-july-9-12-2013-umbc/</a><a href="http://dissertationhouse.wordpress.com/2013/04/09/save-the-date-summer-dissertation-house-july-9-12-2013-umbc/#comment-7854" rel="nofollow external" class="bo"><br>
    </a></p>
    <ul>
    <li><strong>July 2013: SUMMER HORIZONS (Preparation for Graduate School Workshops) – TBA</strong></li>
    </ul>
    <p>Hosted by PROMISE, The Graduate School at UMBC, and the Graduate Meyerhoff Fellows Program</p>
    <ul>
    <li><strong>August 16-17: PROMISE SUMMER SUCCESS INSTITUTE (SSI)</strong></li>
    </ul>
    <p>Hosted by UMB (University of Maryland, Baltimore – The Founding Campus)<br>
    <a href="http://www.umaryland.edu/smccampuscenter/" rel="nofollow external" class="bo">SMC Campus Center</a><br>
    621 W. Lombard St.<br>
    Baltimore, MD 21201</p>
    <p>Graduate students, Postdoctoral Fellows, and Professionals from any school within the USM are invited to attend.  An Eventbrite RSVP invitation page will be posted soon. Remembering SSI from past years:</p>
    <p><a href="http://promiseagep.wordpress.com/2012/06/29/2012-summer-success-institute-august-17-18-2012-umbc-the-hotel-at-arundel-preserve/" rel="nofollow external" class="bo">SSI 2012</a></p>
    <p><a href="http://promisesuccessseminars.wordpress.com/promise-summer-success-institute-ssi/" rel="nofollow external" class="bo">SSI 2011 (includes links to SSI events from 2003 to 2011.) </a></p>
    <h6>Related articles</h6>
    <ul>
    <li>
    <a href="http://promisesuccessseminars.wordpress.com/2013/03/27/april-2013-seminars-1-april-3-career-paths-for-graduate-students-umbc-2-april-26-dissertation-proposals-college-park/" rel="nofollow external" class="bo">April 2013 Seminars: 1) April 3: “Career Paths for Graduate Students” @ UMBC, 2) April 26: “Dissertation Proposals” @ College Park</a> (promisesuccessseminars.wordpress.com)</li>
    </ul>
    <br>   </div>
]]>
</Body>
<Summary>Dear Graduate Students, Postdoctoral Fellows, Faculty, Staff, and Friends of PROMISE:   Please save the following dates for Spring and Summer 2013:     SATURDAY, May 4, 2013: Annual PROMISE...</Summary>
<Website>https://promiseagep.wordpress.com/2013/04/01/save-these-springsummer-dates-may-4-cookout-july-9-12-dissertation-house-august-16-17-ssi/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/28017/guest@my.umbc.edu/ccad7df7aa57d15b2b3973b06d421932/api/pixel</TrackingUrl>
<Tag>advising</Tag>
<Tag>agep</Tag>
<Tag>community-building</Tag>
<Tag>development</Tag>
<Tag>dissertation-house</Tag>
<Tag>gradschool</Tag>
<Tag>gradstudents</Tag>
<Tag>graduate-school</Tag>
<Tag>learning</Tag>
<Tag>maryland</Tag>
<Tag>nsf</Tag>
<Tag>p</Tag>
<Tag>ph-d-completion</Tag>
<Tag>pmp</Tag>
<Tag>postdoc</Tag>
<Tag>professor</Tag>
<Tag>professoriate</Tag>
<Tag>project-management</Tag>
<Tag>promise</Tag>
<Tag>seminars-and-workshops</Tag>
<Tag>success-seminars-and-workshops</Tag>
<Tag>summer-success-institute-ssi</Tag>
<Tag>support</Tag>
<Tag>teaching</Tag>
<Tag>umbc</Tag>
<Tag>university-of-maryland-baltimore-county</Tag>
<Tag>wendy-carter-veale</Tag>
<Tag>writing-suite</Tag>
<Group token="gspd">Grad Student &amp;amp; Postdoc Development </Group>
<GroupUrl>https://my3.my.umbc.edu/groups/gspd</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/xsmall.png?1781730740</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/original.png?1781730740</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/xxlarge.png?1781730740</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/xlarge.png?1781730740</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/large.png?1781730740</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/medium.png?1781730740</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/small.png?1781730740</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/xsmall.png?1781730740</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/066/4b2a0ea3017d894b96de7bd4a45729d5/xxsmall.png?1781730740</AvatarUrl>
<Sponsor>PROMISE @ UMBC: Graduate Student Development</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 01 Apr 2013 13:06:19 -0400</PostedAt>
<EditAt>Mon, 01 Apr 2013 13:06:19 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="27029" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27029">
<Title>500 Startups Opens Up New Manhattan Co-Working Space. Should You Join?</Title>
<Body>
<![CDATA[
    <div class="html-content">With another coworking space opening its doors, does it make sense for your startup to apply?</div>
]]>
</Body>
<Summary>With another coworking space opening its doors, does it make sense for your startup to apply?</Summary>
<Website>http://feedproxy.google.com/~r/YoungentrepreneurcomBlog/~3/Onjt5qtmGg0/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27029/guest@my.umbc.edu/c0cb4aaed3760c5b8f5ff19fbdd062bd/api/pixel</TrackingUrl>
<Tag>incubators</Tag>
<Tag>lean-startups</Tag>
<Tag>office-space</Tag>
<Tag>starting-a-business</Tag>
<Tag>startup</Tag>
<Tag>startup-news</Tag>
<Tag>startups</Tag>
<Tag>tech-startups</Tag>
<Tag>technology-news</Tag>
<Group token="entrepreneurship">Alex. Brown Center for Entrepreneurship</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/entrepreneurship</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/xsmall.png?1771000363</AvatarUrl>
<AvatarUrl size="original">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/original.jpg?1771000363</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/xxlarge.png?1771000363</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/xlarge.png?1771000363</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/large.png?1771000363</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/medium.png?1771000363</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/small.png?1771000363</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/xsmall.png?1771000363</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/xxsmall.png?1771000363</AvatarUrl>
<Sponsor>The Alex. Brown Center for Entrepreneurship</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 01 Apr 2013 12:30:42 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="27028" important="false" status="posted" url="https://my3.my.umbc.edu/posts/27028">
<Title>SVG Patterns Gallery</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>Using SVG for background patterns is great because they 1) are very small 2) are vector, thus crisp at any screen resolution and 3) work in IE 9 (unlike gradients). Gallery by Philip Rogers.</p>
    <p><a href="http://philbit.com/svgpatterns/" title="Direct link to featured article" rel="nofollow external" class="bo">Direct Link to Article</a> — <a href="http://css-tricks.com/svg-patterns-gallery/" rel="nofollow external" class="bo">Permalink</a></p>
    <p><small><a href="http://css-tricks.com/svg-patterns-gallery/" rel="nofollow external" class="bo">SVG Patterns Gallery</a> is a post from <a href="http://css-tricks.com" rel="nofollow external" class="bo">CSS-Tricks</a></small></p>
    </div>
]]>
</Body>
<Summary>Using SVG for background patterns is great because they 1) are very small 2) are vector, thus crisp at any screen resolution and 3) work in IE 9 (unlike gradients). Gallery by Philip Rogers....</Summary>
<Website>http://philbit.com/svgpatterns/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/27028/guest@my.umbc.edu/4b1d1fcae8c91d49fba9d6773086701d/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>link</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>tricks</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, 01 Apr 2013 12:04:52 -0400</PostedAt>
<EditAt>Mon, 01 Apr 2013 12:04:52 -0400</EditAt>
</NewsItem>

</News>
