<?xml version="1.0"?>
<News hasArchived="true" page="7924" pageCount="10750" pageSize="10" timestamp="Fri, 14 Aug 2026 02:15:36 -0400" url="https://my3.my.umbc.edu/posts.xml?mode=activity&amp;page=7924">
<NewsItem contentIssues="true" id="39967" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39967">
<Title>New Tickets on Sale at the CIC!</Title>
<Tagline>Tubing Bus Trip!</Tagline>
<Body>
<![CDATA[
    <div class="html-content">
    <div><strong>Stop by the Campus Information Center in The Commons to purchase the tickets listed below!</strong></div>
    <div><br></div>
    <div>
    <div><strong><a href="http://my.umbc.edu/groups/seb/events/21555" rel="nofollow external" class="bo">Tubing Bus Trip (seb)</a></strong></div>
    <div><em>     Friday, January 17th</em></div>
    <div><em>     Bus Departs: Commons Loop @ 6:15pm</em></div>
    <div><em>     All Guests = $15.00</em></div>
    <div><em><strong>     We are on Ticket 1 of 49</strong></em></div>
    <div><br></div>
    </div>
    <div>
    <span><span><div><strong>Also, don't forget to check out these events happening this week!</strong></div></span></span><div><span><br></span></div>
    <div>
    <strong><a href="http://my.umbc.edu/events/21552" rel="nofollow external" class="bo">Craft: Terrariums (seb)</a></strong> - Tuesday, January 7th 12pm-1pm. <span>Come out to Mainstreet at noon to take a break from Winter classes and do some crafting! (seb) will help you make a free terrarium!</span><span> </span>
    </div>
    <div><span><br></span></div>
    <div>
    <span><strong><a href="http://my.umbc.edu/events/21550" rel="nofollow external" class="bo">Hot Chocolate, Cider &amp; Reverse S'mores (seb)</a></strong> - Thursday, January 9th 12pm-1pm. </span><span>Come to Mainstreet at noon for round two of free hot chocolate &amp; cider and </span><span>eat some delicious reverse s'mores! You won't regret it!</span><span> </span>
    </div>
    </div>
    </div>
]]>
</Body>
<Summary>Stop by the Campus Information Center in The Commons to purchase the tickets listed below!      Tubing Bus Trip (seb)       Friday, January 17th       Bus Departs: Commons Loop @ 6:15pm       All...</Summary>
<Website>https://www.facebook.com/UMBC.CIC</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39967/guest@my.umbc.edu/b64726deda40b3756cbb4a042da895ce/api/pixel</TrackingUrl>
<Group token="cic">Campus Information Center (CIC)</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/cic</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/311/7180ee78abc8c4401d89f708582062e4/xsmall.png?1318518699</AvatarUrl>
<AvatarUrl size="original">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/311/7180ee78abc8c4401d89f708582062e4/original.png?1318518699</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/311/7180ee78abc8c4401d89f708582062e4/xxlarge.png?1318518699</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/311/7180ee78abc8c4401d89f708582062e4/xlarge.png?1318518699</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/311/7180ee78abc8c4401d89f708582062e4/large.png?1318518699</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/311/7180ee78abc8c4401d89f708582062e4/medium.png?1318518699</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/311/7180ee78abc8c4401d89f708582062e4/small.png?1318518699</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/311/7180ee78abc8c4401d89f708582062e4/xsmall.png?1318518699</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/311/7180ee78abc8c4401d89f708582062e4/xxsmall.png?1318518699</AvatarUrl>
<Sponsor>Campus Information Center (CIC)</Sponsor>
<ThumbnailUrl size="xxlarge">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/039/967/20dd4cde4ef566b0b6756dbbcb6cebc9/xxlarge.jpg?1389036845</ThumbnailUrl>
<ThumbnailUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/039/967/20dd4cde4ef566b0b6756dbbcb6cebc9/xlarge.jpg?1389036845</ThumbnailUrl>
<ThumbnailUrl size="large">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/039/967/20dd4cde4ef566b0b6756dbbcb6cebc9/large.jpg?1389036845</ThumbnailUrl>
<ThumbnailUrl size="medium">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/039/967/20dd4cde4ef566b0b6756dbbcb6cebc9/medium.jpg?1389036845</ThumbnailUrl>
<ThumbnailUrl size="small">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/039/967/20dd4cde4ef566b0b6756dbbcb6cebc9/small.jpg?1389036845</ThumbnailUrl>
<ThumbnailUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/039/967/20dd4cde4ef566b0b6756dbbcb6cebc9/xsmall.jpg?1389036845</ThumbnailUrl>
<ThumbnailUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/039/967/20dd4cde4ef566b0b6756dbbcb6cebc9/xxsmall.jpg?1389036845</ThumbnailUrl>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 06 Jan 2014 14:36:10 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="39966" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39966">
<Title>Apply Online by Valentine's!</Title>
<Tagline>The 2014/15 FAFSA is now available!</Tagline>
<Body>
<![CDATA[
    <div class="html-content">Go to <a href="https://fafsa.ed.gov/" rel="nofollow external" class="bo">https://fafsa.ed.gov/</a> to fill out your Free Application for Federal Student Aid (FAFSA) today!</div>
]]>
</Body>
<Summary>Go to https://fafsa.ed.gov/ to fill out your Free Application for Federal Student Aid (FAFSA) today!</Summary>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39966/guest@my.umbc.edu/dc68313efd3207d4799694eba7c3e277/api/pixel</TrackingUrl>
<Group token="cnmsadvising">College of Natural and Mathematical Sciences Advising</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/cnmsadvising</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/xsmall.png?1654873031</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/original.png?1654873031</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/xxlarge.png?1654873031</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/xlarge.png?1654873031</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/large.png?1654873031</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/medium.png?1654873031</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/small.png?1654873031</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/xsmall.png?1654873031</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/475/61f5727176d8301926b7c19064396eb6/xxsmall.png?1654873031</AvatarUrl>
<Sponsor>College of Natural and Mathematical Sciences Advising</Sponsor>
<ThumbnailUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/039/966/4f10de210e8a97dc7da37f6148508ac1/xxlarge.jpg?1389035036</ThumbnailUrl>
<ThumbnailUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/039/966/4f10de210e8a97dc7da37f6148508ac1/xlarge.jpg?1389035036</ThumbnailUrl>
<ThumbnailUrl size="large">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/039/966/4f10de210e8a97dc7da37f6148508ac1/large.jpg?1389035036</ThumbnailUrl>
<ThumbnailUrl size="medium">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/039/966/4f10de210e8a97dc7da37f6148508ac1/medium.jpg?1389035036</ThumbnailUrl>
<ThumbnailUrl size="small">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/039/966/4f10de210e8a97dc7da37f6148508ac1/small.jpg?1389035036</ThumbnailUrl>
<ThumbnailUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/039/966/4f10de210e8a97dc7da37f6148508ac1/xsmall.jpg?1389035036</ThumbnailUrl>
<ThumbnailUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/039/966/4f10de210e8a97dc7da37f6148508ac1/xxsmall.jpg?1389035036</ThumbnailUrl>
<PawCount>1</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 06 Jan 2014 14:05:39 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="39965" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39965">
<Title>Writing Robust Web Applications &#8211; The Lost Art of Exception Handling</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <a href="http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=36395&amp;c=1961517588" rel="nofollow external" class="bo"><img src="http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=36395&amp;c=1961517588" alt="" style="max-width: 100%; height: auto;"></a><p>As developers, we want the applications we build to be resilient when it comes to failure, but how do you achieve this goal? If you believe the hype, micro-services and a <a href="http://net.tutsplus.com//en.wikipedia.org/wiki/Byzantine_fault_tolerance" rel="nofollow external" class="bo">clever communication protocol</a> are the answer to all your problems, or maybe <a href="http://net.tutsplus.com//www.dnsmadeeasy.com/services/dns-failover-system-monitoring/" rel="nofollow external" class="bo">automatic DNS failover</a>. While that kind of stuff has its place and makes for an <a href="http://net.tutsplus.com//www.slideshare.net/adrianco/dystopia-as-a-service" rel="nofollow external" class="bo">interesting conference presentation</a>, the somewhat less glamorous truth is that making a robust application begins with your code. But, even well designed and well tested applications are often lacking a vital component of resilient code – exception handling.</p>
    <p></p>
    <p>I never fail to be amazed by just how under-used exception handling tends to be even within mature codebases. Let’s look at an example.</p>
    <hr>
    <h2>What Can Possibly Go Wrong?</h2>
    <p>Say we have a <a href="http://rubyonrails.org/" rel="nofollow external" class="bo">Rails</a> app, and one of the things we can do using this app is fetch a list of the latest tweets for a user, given their handle. Our <code>TweetsController</code> might look like this:</p>
    <pre>class TweetsController &lt; ApplicationController&#x000A;      def show&#x000A;        person = Person.find_or_create_by(handle: params[:handle])&#x000A;        if person.persisted?&#x000A;          @tweets = person.fetch_tweets&#x000A;        else&#x000A;          flash[:error] = "Unable to create person with handle: #{person.handle}"&#x000A;        end&#x000A;      end&#x000A;    end</pre>
    <p>And the <code>Person</code> model that we used might be similar to the following:</p>
    <pre>class Person &lt; ActiveRecord::Base&#x000A;      def fetch_tweets&#x000A;        client = Twitter::REST::Client.new do |config|&#x000A;          config.consumer_key        = configatron.twitter.consumer_key&#x000A;          config.consumer_secret     = configatron.twitter.consumer_secret&#x000A;          config.access_token        = configatron.twitter.access_token&#x000A;          config.access_token_secret = configatron.twitter.access_token_secret&#x000A;        end&#x000A;        client.user_timeline(handle).map{|tweet| tweet.text}&#x000A;      end&#x000A;    end</pre>
    <p>This code seems perfectly reasonable, there are dozens of apps that have code just like this sitting in production, but let’s look a little more closely.</p>
    <ul>
    <li>
    <code>find_or_create_by</code> is a Rails method, it’s not a ‘bang’ method, so it shouldn’t throw exceptions, but if we <a href="http://net.tutsplus.com//api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-find_or_create_by" rel="nofollow external" class="bo">look at the documentation</a> we can see that due to the way this method works, it can raise an <code>ActiveRecord::RecordNotUnique</code> error. This won’t happen often, but if our application has a decent amount of traffic it’s occurring more likely than you might expect (I’ve seen it happen many times).</li>
    <li>While we’re on the subject, any library you use can throw unexpected errors due to bugs within the library itself and Rails is no exception. Depending on our level of paranoia we might expect our <code>find_or_create_by</code> to throw any kind of unexpected error at any time (a healthy level of paranoia is a good thing when it comes to building robust software). If we have no global way of handling unexpected errors (we’ll discuss this below), we might want to handle these individually.</li>
    <li>Then there is <code>person.fetch_tweets</code> which instantiates a <a href="http://net.tutsplus.com//twitter.com/" rel="nofollow external" class="bo">Twitter</a> client and tries to fetch some tweets. This will be a network call and is prone to all sorts of failure. We may want to read the documentation to figure out what the possible errors we might expect are, but we know that errors are not only possible here, but quite likely (for example, the <a href="http://net.tutsplus.com//dev.twitter.com/" rel="nofollow external" class="bo">Twitter API</a> might be down, a person with that handle might not exist etc.). Not putting some exception handling logic around network calls is asking for trouble.</li>
    </ul>
    <p>Our tiny amount of code has some serious issues, let’s try and make it better.</p>
    <hr>
    <h2>The Right Amount of Exception Handling</h2>
    <p>We’ll wrap our <code>find_or_create_by</code> and push it down into the <code>Person</code> model:</p>
    <pre>class Person &lt; ActiveRecord::Base&#x000A;      class &lt;&lt; self&#x000A;        def find_or_create_by_handle(handle)&#x000A;          begin&#x000A;            Person.find_or_create_by(handle: handle)&#x000A;          rescue ActiveRecord::RecordNotUnique&#x000A;            Rails.logger.warn { "Encountered a non-fatal RecordNotUnique error for: #{handle}" }&#x000A;            retry&#x000A;          rescue =&gt; e&#x000A;            Rails.logger.error { "Encountered an error when trying to find or create Person for: #{handle}, #{e.message} #{e.backtrace.join("\n")}" }&#x000A;            nil&#x000A;          end&#x000A;        end&#x000A;      end&#x000A;    end</pre>
    <p>We’ve handled the <code>ActiveRecord::RecordNotUnique</code> according to the documentation and now we know for a fact that we’ll either get a <code>Person</code> object or <code>nil</code> if something goes wrong. This code is now solid, but what about fetching our tweets:</p>
    <pre>class Person &lt; ActiveRecord::Base&#x000A;      def fetch_tweets&#x000A;        client.user_timeline(handle).map{|tweet| tweet.text}&#x000A;      rescue =&gt; e&#x000A;        Rails.logger.error { "Error while fetching tweets for: #{handle}, #{e.message} #{e.backtrace.join("\n")}" }&#x000A;        nil&#x000A;      end&#x000A;    &#x000A;      private&#x000A;    &#x000A;      def client&#x000A;        @client ||= Twitter::REST::Client.new do |config|&#x000A;          config.consumer_key        = configatron.twitter.consumer_key&#x000A;          config.consumer_secret     = configatron.twitter.consumer_secret&#x000A;          config.access_token        = configatron.twitter.access_token&#x000A;          config.access_token_secret = configatron.twitter.access_token_secret&#x000A;        end&#x000A;      end&#x000A;    end</pre>
    <p>We push instantiating the Twitter client down into its own private method and since we didn’t know what could go wrong when we fetch the tweets, we rescue everything.</p>
    <p>You may have heard somewhere that you should always <a href="http://net.tutsplus.com//stackoverflow.com/questions/426346/is-this-a-bad-practice-to-catch-a-non-specific-exception-such-as-system-exceptio" rel="nofollow external" class="bo">catch specific errors</a>. This is a laudable goal, but people often misinterpret it as, “if I can’t catch something specific, I won’t catch anything”. In reality, if you can’t catch something specific you should catch everything! This way at least you have an opportunity to do something even if it’s only to log and re-raise the error.</p>
    <h3>An Aside on OO Design</h3>
    <p>In order to make our code more robust, we were forced to refactor and now our code is arguably better than it was before. You can use your desire for more resilient code to inform your design decisions.</p>
    <h3>An Aside on Testing</h3>
    <p>Every time you add some exception handling logic to a method, it’s also an extra path through that method and it needs to be tested. It’s vital you test the exceptional path, perhaps more so than testing the <a href="http://net.tutsplus.com//en.wikipedia.org/wiki/Happy_path" rel="nofollow external" class="bo">happy path</a>. If something goes wrong on the happy path you now have the extra insurance of the <code>rescue</code> block to prevent your app from falling over. However, any logic inside the rescue block itself has no such insurance. Test your exceptional path well, so that silly things like mistyping a variable name inside the <code>rescue</code> block don’t cause your application to blow up (this has happened to me so many times – seriously, just test your <code>rescue</code> blocks).</p>
    <hr>
    <h2>What to Do With the Errors We Catch</h2>
    <p>I’ve seen this kind of code countless times through the years:</p>
    <pre>begin&#x000A;      widgetron.create&#x000A;    rescue&#x000A;      # don't need to do anything&#x000A;    end</pre>
    <p>We rescue an exception and don’t do anything with it. This is <a href="http://net.tutsplus.com//stackoverflow.com/questions/3335376/why-do-good-programmers-sometimes-silently-swallow-exceptions" rel="nofollow external" class="bo">almost always a bad idea</a>. When you’re debugging a production issue six months from now, trying to figure our why your ‘widgetron’ isn’t showing up in the database, you won’t remember that innocent comment and hours of frustration will follow.</p>
    <p>Don’t swallow exceptions! At the very least you should log any exception that you catch, for example:</p>
    <pre>begin&#x000A;      foo.bar&#x000A;    rescue =&gt; e&#x000A;      Rails.logger.error { "#{e.message} #{e.backtrace.join("\n")}" }&#x000A;    end</pre>
    <p>This way we can trawl the logs and we’ll have the cause and stack trace of the error to look at.</p>
    <p>Better yet, you may use an error monitoring service, such as <a href="http://net.tutsplus.com//rollbar.com/" rel="nofollow external" class="bo">Rollbar</a> which is pretty nice. There are many advantages to this:</p>
    <ul>
    <li>Your error messages aren’t interspersed with other log messages</li>
    <li>You will get stats on how often the same error has happened (so you can figure out if it’s a serious issue or not)</li>
    <li>You can send extra information along with the error to help you diagnose the problem</li>
    <li>You can get notifications (via email, pagerduty etc.) when errors occur in your app</li>
    <li>You can track deploys to see when particular errors were introduced or fixed</li>
    <li>etc.</li>
    </ul>
    <pre>begin&#x000A;      foo.bar&#x000A;    rescue =&gt; e&#x000A;      Rails.logger.error { "#{e.message} #{e.backtrace.join("\n")}" }&#x000A;      Rollbar.report_exception(e)&#x000A;    end</pre>
    <p>You can, of course, both log and use a monitoring service as above.</p>
    <p>If your <code>rescue</code> block is the last thing in a method, I recommend having an explicit return:</p>
    <pre>def my_method&#x000A;      begin&#x000A;        foo.bar&#x000A;      rescue =&gt; e&#x000A;        Rails.logger.error { "#{e.message} #{e.backtrace.join("\n")}" }&#x000A;        Rollbar.report_exception(e)&#x000A;        nil&#x000A;      end&#x000A;    end</pre>
    <p>You may not always want to return <code>nil</code>, sometimes you might be better off with a <a href="http://net.tutsplus.com//en.wikipedia.org/wiki/Null_Object_pattern" rel="nofollow external" class="bo">null object</a> or whatever else makes sense in the context of your application. Consistently using explicit return values will save everyone a lot of confusion.</p>
    <p>You can also re-raise the same error or raise a different one inside your <code>rescue</code> block. One pattern that I often find useful is to wrap the existing exception in a new one and raise that one so as not to lose the original stack trace (I even <a href="http://net.tutsplus.com//github.com/skorks/nesty" rel="nofollow external" class="bo">wrote a gem for this</a> since Ruby doesn’t provide this functionality out of the box). Later on in the article when we talk about external services, I will show you why this can be useful.</p>
    <hr>
    <h2>Handling Errors Globally</h2>
    <p>Rails lets you specify how to handle requests for resources of a certain format (HTML, XML, JSON) by using <code>respond_to</code> and <code>respond_with</code>. I rarely see apps that correctly use this functionality, after all if you don’t use a <code>respond_to</code> block everything works fine and Rails renders your template correctly. We hit our tweets controller via <code>/tweets/yukihiro_matz</code> and get an HTML page full of <a href="http://net.tutsplus.com//en.wikipedia.org/wiki/Yukihiro_Matsumoto" rel="nofollow external" class="bo">Matzs’</a> latest tweets. What people often forget is that it’s very easy to try and request a different format of the same resource e.g. <code>/tweets/yukihiro_matz.json</code>. At this point Rails will valiantly try to return a JSON representation of Matzs’ tweets, but it won’t go well since the view for it doesn’t exist. An <code>ActionView::MissingTemplate</code> error will get raised and our app blows up in a spectacular fashion. And JSON is a legitimate format, in a high traffic application you’re just as likely to get a request for <code>/tweets/yukihiro_matz.foobar</code>. <a href="http://net.tutsplus.com//hub.tutsplus.com/" rel="nofollow external" class="bo">Tuts+</a> gets these kinds of requests all the time (likely from bots trying to be clever).</p>
    <p>The lesson is this, if you’re not planning to return a legitimate response for a particular format, restrict your controllers from trying to fulfill requests for those formats. In the case of our <code>TweetsController</code>:</p>
    <pre>class TweetsController &lt; ApplicationController&#x000A;      respond_to :html&#x000A;    &#x000A;      def show&#x000A;        ...&#x000A;        respond_to do |format|&#x000A;          format.html&#x000A;        end&#x000A;      end&#x000A;    end</pre>
    <p>Now when we get requests for spurious formats we’ll get a more relevant <code>ActionController::UnknownFormat</code> error. Our controllers feel somewhat tighter which is a great thing when it comes to making them more robust.</p>
    <h3>Handling Errors the Rails Way</h3>
    <p>The problem we have now, is that despite our semantically pleasing error, our application is still blowing up in our users’ face. This is where global exception handling comes in. Sometimes our application will produce errors that we want to respond to consistently, no matter where they come from (like our <code>ActionController::UnknownFormat</code>). There are also errors that can get raised by the framework before any of our code comes into play. A perfect example of this is <code>ActionController::RoutingError</code>. When someone requests a URL that doesn’t exist, like <code>/tweets2/yukihiro_matz</code>, there is nowhere for us to hook in to rescue this error, using traditional exception handling. This is where Rails’ <code>exceptions_app</code> comes in.</p>
    <p>You can configure a <a href="http://net.tutsplus.com//rack.github.io/" rel="nofollow external" class="bo">Rack</a> app in <code>application.rb</code> to be called when an error that we haven’t handled is produced (like our <code>ActionController::RoutingError</code> or <code>ActionController::UnknownFormat</code>). The way you will <a href="http://agileleague.com/2012/12/rails-3-2-custom-error-pages-the-exceptions_app-and-testing-with-capybara/" rel="nofollow external" class="bo">normally see this used</a> is to configure your routes app as the <code>exceptions_app</code>, then define the various routes for the errors you want to handle and route them to a special errors controller that you create. So our <code>application.rb</code> would look like this:</p>
    <pre>...&#x000A;    config.exceptions_app = self.routes&#x000A;    ...</pre>
    <p>Our <code>routes.rb</code> will then contain the following:</p>
    <pre>...&#x000A;    match '/404' =&gt; 'errors#not_found', via: :all&#x000A;    match '/406' =&gt; 'errors#not_acceptable', via: :all&#x000A;    match '/500' =&gt; 'errors#internal_server_error', via: :all&#x000A;    ...</pre>
    <p>In this case our <code>ActionController::RoutingError</code> would be picked up by the <code>404</code> route and the <code>ActionController::UnknownFormat</code> will be picked up by the <code>406</code> route. There are <a href="http://net.tutsplus.com//github.com/rack/rack/blob/master/lib/rack/utils.rb#L547" rel="nofollow external" class="bo">many possible errors</a> that can crop up. But as long as you handle the common ones (<code>404</code>, <code>500</code>, <code>422</code> etc.) to start with, you can add others if and when they happen.</p>
    <p>Within our errors controller we can now render the relevant templates for each kind of error along with our layout (if it’s not a 500) to maintain the branding. We can also log the errors and send them to our <a href="http://net.tutsplus.com//rollbar.com/" rel="nofollow external" class="bo">monitoring service</a>, although most monitoring services will hook in to this process automatically so you don’t have to send the errors yourself. Now when our application blows up it does so gently, with the right status code depending on the error and a page where we can give the user some idea regarding what happened and what they can do (contact support) – an infinitely better experience. More importantly, our app will seem (and will actually be) much more solid.</p>
    <h3>Multiple Errors of the Same Type in a Controller</h3>
    <p>In any Rails controller we can define specific errors to be handled globally within that controller (no matter which action they get produced in) – we do this via <a href="http://api.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html" rel="nofollow external" class="bo">rescue_from</a>. The question is when to use <code>rescue_from</code>? I usually find that a good pattern is to use it for errors that can occur in multiple actions (for example, the same error in more than one action). If an error will only be produced by one action, handle it via the traditional <code>begin...rescue...end</code> mechanism, but if we’re likely to get the same error in multiple places and we want to handle it the same way – it’s a good candidate for a <code>rescue_from</code>. Let’s say our <code>TweetsController</code> also has a <code>create</code> action:</p>
    <pre>class TweetsController &lt; ApplicationController&#x000A;      respond_to :html&#x000A;    &#x000A;      def show&#x000A;        ...&#x000A;        respond_to do |format|&#x000A;          format.html&#x000A;        end&#x000A;      end&#x000A;    &#x000A;      def create&#x000A;        ...&#x000A;      end&#x000A;    end</pre>
    <p>Let’s also say that both of these actions can encounter a <code>TwitterError</code> and if they do we want to tell the user that something is wrong with Twitter. This is where <code>rescue_from</code> can be really handy:</p>
    <pre>class TweetsController &lt; ApplicationController&#x000A;      respond_to :html&#x000A;    &#x000A;      rescue_from TwitterError, with: twitter_error&#x000A;    &#x000A;      private&#x000A;    &#x000A;      def twitter_error&#x000A;        render :twitter_error&#x000A;      end&#x000A;    end</pre>
    <p>Now we don’t need to worry about handling this in our actions and they will look much cleaner and we can/should – of course – log our error and/or notify our error monitoring service within the <code>twitter_error</code> method. If you use <code>rescue_from</code> correctly it can not only help you make your application more robust, but can also make your controller code cleaner. This will make it easier to maintain and test your code making your application that little bit more resilient yet again.</p>
    <hr>
    <h2>Using External Services in Your Application</h2>
    <p>It’s difficult to write a significant application these days without using a number of external services/APIs. In the case of our <code>TweetsController</code>, Twitter came into play via a Ruby gem that wraps the <a href="http://net.tutsplus.com//github.com/sferik/twitter" rel="nofollow external" class="bo">Twitter API</a>. Ideally we would make all our external API calls asynchronously, but we’re not covering asynchronous processing in this article and there are plenty of applications out there that make at least some API/network calls in-process.</p>
    <p>Making network calls is an extremely error prone task and good exception handling is a must. You can get authentication errors, configuration problems, and connectivity errors. The library you use can produce any number of code errors and then there is a matter of slow connections. I am glossing over this point, but it’s oh so crucial since you can’t deal with slow connections via exception handling. You need to appropriately <a href="http://ruby-doc.org/stdlib-2.0.0/libdoc/net/http/rdoc/Net/HTTP.html#attribute-i-read_timeout" rel="nofollow external" class="bo">configure timeouts</a> in your network library, or if you’re using an API wrapper make sure it provides hooks to configure timeouts. There is no worse experience for a user than having to sit there waiting without your application giving any indication of what’s happening. Just about everyone forgets to configure timeouts appropriately (I know I have), so take heed.</p>
    <p>If you’re using an external service in multiple places within your application (multiple models for example), you expose large parts of your application to the full landscape of errors that can be produced. This is not a good situation. What we want to do is limit our exposure and one way we can do this is putting all access to our external services behind a <a href="http://en.wikipedia.org/wiki/Facade_pattern" rel="nofollow external" class="bo">facade</a>, rescuing all errors there and re-raising one semantically appropriate error (raise that <code>TwitterError</code> that we talked about if any errors occur when we try to hit the Twitter API). We can then easily use techniques like <code>rescue_from</code> to deal with these errors and we don’t expose large parts of our application to an unknown number of errors from external sources.</p>
    <p>An even better idea might be to make your facade an error free API. Return all successful responses as is and return nils or null objects when you rescue any sort of error (we do still need to log/notify ourselves of the errors via some of the methods we discussed above). This way we don’t need to mix different types of control flow (exception control flow vs if…else) which may gain us significantly cleaner code. For example, let’s wrap our Twitter API access in a <code>TwitterClient</code> object:</p>
    <pre>class TwitterClient&#x000A;      attr_reader :client&#x000A;    &#x000A;      def initialize&#x000A;        @client = Twitter::REST::Client.new do |config|&#x000A;          config.consumer_key        = configatron.twitter.consumer_key&#x000A;          config.consumer_secret     = configatron.twitter.consumer_secret&#x000A;          config.access_token        = configatron.twitter.access_token&#x000A;          config.access_token_secret = configatron.twitter.access_token_secret&#x000A;        end&#x000A;      end&#x000A;    &#x000A;      def latest_tweets(handle)&#x000A;        client.user_timeline(handle).map{|tweet| tweet.text}&#x000A;      rescue =&gt; e&#x000A;        Rails.logger.error { "#{e.message} #{e.backtrace.join("\n")}" }&#x000A;        nil&#x000A;      end&#x000A;    end</pre>
    <p>We can now do this: <code>TwitterClient.new.latest_tweets('yukihiro_matz')</code>, anywhere in our code and we know that it will never produce an error, or rather it will never propagate the error beyond <code>TwitterClient</code>. We’ve isolated an external system to make sure that glitches in that system won’t bring down our main application.</p>
    <hr>
    <h2>But What if I Have Excellent Test Coverage?</h2>
    <p>If you do have well-tested code, I commend you on your diligence, it will take you a long way towards having a more robust application. But a good test suite can often provide a false sense of security. Good tests can help you refactor with confidence and protect you against regression. But, you can only write tests for things you expect to happen. Bugs are, by their very nature, unexpected. To use our tweets example, until we choose to write a test for our <code>fetch_tweets</code> method where <code>client.user_timeline(handle)</code> raises an error thereby forcing us to wrap a <code>rescue</code> block around the code, all our tests will have been green and our code would have remained failure-prone.</p>
    <p>Writing tests, doesn’t absolve us of the responsibility of casting a critical eye over our code to figure out how this code can potentially break. On the other hand, doing this kind of evaluation can definitely help us write better, more complete test suites.</p>
    <hr>
    <h2>Conclusion</h2>
    <p>Resilient systems don’t spring forth fully formed from a weekend hack session. Making an application robust, is an ongoing process. You discover bugs, fix them, and write tests to make sure they don’t come back. When your application goes down due to an external system failure, you isolate that system to make sure the failure can’t snowball again. Exception handling is your best friend when it comes to doing this. Even the most failure-prone application can be turned into a robust one if you apply good exception handling practices consistently, over time.</p>
    <p>Of course, exception handling is not the only tool in your arsenal when it comes to making applications more resilient. In subsequent articles we will talk about asynchronous processing, how and when to apply it and what it can do in terms of making your application fault tolerant. We will also look at some deployment and infrastructure tips that can have a significant impact without breaking the bank in terms of both money and time – stay tuned.</p>
    </div>
]]>
</Body>
<Summary>As developers, we want the applications we build to be resilient when it comes to failure, but how do you achieve this goal? If you believe the hype, micro-services and a clever communication...</Summary>
<Website>http://feedproxy.google.com/~r/nettuts/~3/U8bRmX2uAlA/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39965/guest@my.umbc.edu/21fde2a08f6b58a0adfdaee68f41f4eb/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>exception-handling</Tag>
<Tag>fault-tolerance</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>ruby</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, 06 Jan 2014 13:43:52 -0500</PostedAt>
<EditAt>Mon, 06 Jan 2014 13:43:52 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="109883" important="false" status="posted" url="https://my3.my.umbc.edu/posts/109883">
<Title>Rebecca Adelman, Media and Communication Studies, Op-Ed in The Baltimore Sun</Title>
<Body>
<![CDATA[
    <div class="html-content">In an op-ed published in The Baltimore Sun, media and communication studies assistant professor Rebecca Adelman describes how pictures and video of chemical weapons casualties in the Syrian civil war did not follow the traditional model for war images. In her op-ed titled “Atypical images of war,” Adelman writes about how the images required extensive explanation and interpretation due to what they were depicting: The amateur photos and videos of the victims of the attacks do not follow the familiar model of the war casualty image. They were recognizable as such primarily in their quantitative aspects: the number of images and the …</div>
]]>
</Body>
<Summary>In an op-ed published in The Baltimore Sun, media and communication studies assistant professor Rebecca Adelman describes how pictures and video of chemical weapons casualties in the Syrian civil...</Summary>
<Website>https://news.umbc.edu/rebecca-adelman-media-and-communication-studies-op-ed-in-the-baltimore-sun/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/109883/guest@my.umbc.edu/55307bbf340ce6393e097873a8e0e66a/api/pixel</TrackingUrl>
<Tag>cahss</Tag>
<Tag>mcs</Tag>
<Tag>policy-and-society</Tag>
<Group token="umbc-news">UMBC News</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xsmall.png?1632921809</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/original.png?1632921809</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xxlarge.png?1632921809</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xlarge.png?1632921809</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/large.png?1632921809</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/medium.png?1632921809</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/small.png?1632921809</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xsmall.png?1632921809</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xxsmall.png?1632921809</AvatarUrl>
<Sponsor>UMBC News</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 06 Jan 2014 12:19:47 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="109884" important="false" status="posted" url="https://my3.my.umbc.edu/posts/109884">
<Title>Donald Norris, Public Policy, in The Baltimore Sun</Title>
<Body>
<![CDATA[
    <div class="html-content">When Maryland state lawmakers return to Annapolis this week to begin the annual legislative session, raising the minimum wage, the state online health insurance exchange, and stormwater fees are expected to be leading items on the agenda. The session comes this year in the midst of an election season where campaigning overlaps with lawmaking. The filing deadline is February and many sitting lawmakers are running for higher office. In an article in The Baltimore Sun, public policy professor and chair Donald Norris said legislative sessions during election years tend to be politics-heavy  without significant legislative achievements. “I suspect there will …</div>
]]>
</Body>
<Summary>When Maryland state lawmakers return to Annapolis this week to begin the annual legislative session, raising the minimum wage, the state online health insurance exchange, and stormwater fees are...</Summary>
<Website>https://news.umbc.edu/donald-norris-public-policy-in-the-baltimore-sun-25/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/109884/guest@my.umbc.edu/9b89da955df5936d4ca799e72d6a1773/api/pixel</TrackingUrl>
<Tag>cahss</Tag>
<Tag>policy-and-society</Tag>
<Tag>publicpolicy</Tag>
<Group token="umbc-news">UMBC News</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xsmall.png?1632921809</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/original.png?1632921809</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xxlarge.png?1632921809</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xlarge.png?1632921809</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/large.png?1632921809</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/medium.png?1632921809</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/small.png?1632921809</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xsmall.png?1632921809</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xxsmall.png?1632921809</AvatarUrl>
<Sponsor>UMBC News</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 06 Jan 2014 12:18:55 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="39963" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39963">
<Title>Bits: AT&amp;T Allows Advertisers to Sponsor Mobile Data</Title>
<Body>
<![CDATA[
    <div class="html-content">Businesses working with AT&amp;T can pay for the data that is used to consume their content or services so that it does not show up on a customer’s phone bill.<br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2014%2F01%2F06%2Fatt-allows-advertisers-to-sponsor-mobile-data%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits%3A+AT%26T+Allows+Advertisers+to+Sponsor+Mobile+Data" 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%2F2014%2F01%2F06%2Fatt-allows-advertisers-to-sponsor-mobile-data%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits%3A+AT%26T+Allows+Advertisers+to+Sponsor+Mobile+Data" 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%2F2014%2F01%2F06%2Fatt-allows-advertisers-to-sponsor-mobile-data%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits%3A+AT%26T+Allows+Advertisers+to+Sponsor+Mobile+Data" 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%2F2014%2F01%2F06%2Fatt-allows-advertisers-to-sponsor-mobile-data%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits%3A+AT%26T+Allows+Advertisers+to+Sponsor+Mobile+Data" 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%2F2014%2F01%2F06%2Fatt-allows-advertisers-to-sponsor-mobile-data%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits%3A+AT%26T+Allows+Advertisers+to+Sponsor+Mobile+Data" 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/186528247875/u/0/f/640387/c/34625/s/3590acd3/sc/5/rc/1/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186528247875/u/0/f/640387/c/34625/s/3590acd3/sc/5/rc/1/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/186528247875/u/0/f/640387/c/34625/s/3590acd3/sc/5/rc/2/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186528247875/u/0/f/640387/c/34625/s/3590acd3/sc/5/rc/2/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/186528247875/u/0/f/640387/c/34625/s/3590acd3/sc/5/rc/3/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186528247875/u/0/f/640387/c/34625/s/3590acd3/sc/5/rc/3/rc.img" style="max-width: 100%; height: auto;"></a><br><br><a href="http://da.feedsportal.com/r/186528247875/u/0/f/640387/c/34625/s/3590acd3/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186528247875/u/0/f/640387/c/34625/s/3590acd3/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>Businesses working with AT&amp;T can pay for the data that is used to consume their content or services so that it does not show up on a customer’s phone bill.      </Summary>
<Website>http://bits.blogs.nytimes.com/2014/01/06/att-allows-advertisers-to-sponsor-mobile-data/?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39963/guest@my.umbc.edu/a4651efc4609af9fef5f80814a9b29ca/api/pixel</TrackingUrl>
<Tag>advertising-and-marketing</Tag>
<Tag>at-and-t-inc</Tag>
<Tag>c-e-s-2014</Tag>
<Tag>cellular-telephones</Tag>
<Tag>mobile</Tag>
<Tag>new</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, 06 Jan 2014 12:05:34 -0500</PostedAt>
<EditAt>Mon, 06 Jan 2014 17:58:56 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="39961" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39961">
<Title>Retriever Love: Catherine and Josh Kruder</Title>
<Body>
<![CDATA[
    <div class="html-content">Editor’s note: Students come to UMBC to get an education, but they end up getting so much more. Catherine ’12, English, and Josh Kruder ’11, computer science, happened to fall in love. Lucky for us, they were generous enough to … <a href="http://umbcalumni.wordpress.com/2014/01/06/retriever-love-catherine-and-josh-kruder/" rel="nofollow external" class="bo">Continue reading <span>→</span></a>
    </div>
]]>
</Body>
<Summary>Editor’s note: Students come to UMBC to get an education, but they end up getting so much more. Catherine ’12, English, and Josh Kruder ’11, computer science, happened to fall in love. Lucky for...</Summary>
<Website>http://umbcalumni.wordpress.com/2014/01/06/retriever-love-catherine-and-josh-kruder/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39961/guest@my.umbc.edu/f3b4e31178e2aad6b2977bb5fd117e21/api/pixel</TrackingUrl>
<Tag>10s-alums</Tag>
<Tag>news-and-updates</Tag>
<Tag>retriever-love</Tag>
<Tag>umbc</Tag>
<Tag>university-of-maryland-baltimore-county</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, 06 Jan 2014 11:59:55 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="106887" important="false" status="posted" url="https://my3.my.umbc.edu/posts/106887">
<Title>Retriever Love: Catherine and Josh Kruder</Title>
<Body>
<![CDATA[
    <div class="html-content">Editor’s note: Students come to UMBC to get an education, but they end up getting so much more. Catherine ’12, …</div>
]]>
</Body>
<Summary>Editor’s note: Students come to UMBC to get an education, but they end up getting so much more. Catherine ’12, …</Summary>
<Website>https://magazine.umbc.edu/retriever-love-catherine-and-josh-kruder/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/106887/guest@my.umbc.edu/896800fd69392ff7b24fb54b930cbae1/api/pixel</TrackingUrl>
<Tag>alumni</Tag>
<Tag>retriever-love</Tag>
<Tag>umbc</Tag>
<Tag>university-of-maryland-baltimore-county</Tag>
<Group token="retired-1945">UMBC Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-1945</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/images/avatars/group/8/xsmall.png?1786448318</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/images/avatars/group/8/original.png?1786448318</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/images/avatars/group/8/xxlarge.png?1786448318</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/images/avatars/group/8/xlarge.png?1786448318</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/images/avatars/group/8/large.png?1786448318</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/images/avatars/group/8/medium.png?1786448318</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/images/avatars/group/8/small.png?1786448318</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/images/avatars/group/8/xsmall.png?1786448318</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/images/avatars/group/8/xxsmall.png?1786448318</AvatarUrl>
<Sponsor>UMBC Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 06 Jan 2014 11:59:55 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="39960" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39960">
<Title>Join Rick Hammond for our FREE Project Management Professional (PMP) Certificati...</Title>
<Body>
<![CDATA[
    <div class="html-content">Join Rick Hammond for our FREE Project Management Professional (PMP) Certification Webinar - this Wednesday!<br> <a href="http://www.facebook.com/l.php?u=http%3A%2F%2Fow.ly%2FrGeb1&amp;h=DAQHVs-cm&amp;s=1" rel="nofollow external" class="bo">http://ow.ly/rGeb1</a><br><br><a href="http://www.facebook.com/l.php?u=http%3A%2F%2Fow.ly%2FrGeb1&amp;h=_AQGzvEZ4&amp;s=1" title="" rel="nofollow external" class="bo"><img src="https://fbexternal-a.akamaihd.net/safe_image.php?d=AQB0WT_KY7zUFuIT&amp;w=154&amp;h=154&amp;url=http%3A%2F%2Fwww.umbctraining.com%2FImages%2Ftemplate%2FUMBC-TC-color.aspx%3Fwidth%3D209%26height%3D93%26ext%3D.jpg" alt="" style="max-width: 100%; height: auto;"></a><br><a href="http://www.facebook.com/l.php?u=http%3A%2F%2Fow.ly%2FrGeb1&amp;h=rAQEiXWM3&amp;s=1" rel="nofollow external" class="bo">Events</a><br><a href="http://www.umbctraining.com">www.umbctraining.com</a><br>Events. RSVP for one of UMBC Training Centers upcoming events.</div>
]]>
</Body>
<Summary>Join Rick Hammond for our FREE Project Management Professional (PMP) Certification Webinar - this Wednesday!  http://ow.ly/rGeb1   Events www.umbctraining.com Events. RSVP for one of UMBC Training...</Summary>
<Website>http://www.facebook.com/umbctraining/posts/10151793210131076</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39960/guest@my.umbc.edu/2c7c626b1f58a759cde25e2a0c34f915/api/pixel</TrackingUrl>
<Tag>ccna</Tag>
<Tag>ceh</Tag>
<Tag>centers</Tag>
<Tag>cisco</Tag>
<Tag>cyber</Tag>
<Tag>cybersecurity</Tag>
<Tag>information</Tag>
<Tag>it</Tag>
<Tag>leadership</Tag>
<Tag>management</Tag>
<Tag>microsoft</Tag>
<Tag>project</Tag>
<Tag>security</Tag>
<Tag>technology</Tag>
<Tag>training</Tag>
<Tag>umbc</Tag>
<Group token="retired-575">UMBC Training Centers</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-575</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/xsmall.png?1361981335</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/original.jpg?1361981335</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/xxlarge.png?1361981335</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/xlarge.png?1361981335</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/large.png?1361981335</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/medium.png?1361981335</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/small.png?1361981335</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/xsmall.png?1361981335</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/xxsmall.png?1361981335</AvatarUrl>
<Sponsor>UMBC Training Centers</Sponsor>
<PawCount>1</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 06 Jan 2014 11:16:29 -0500</PostedAt>
<EditAt>Mon, 06 Jan 2014 11:16:29 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="39964" important="false" status="posted" url="https://my3.my.umbc.edu/posts/39964">
<Title>How to create a slidable grid with jQuery</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><img alt="thumbnail" src="http://netdna.webdesignerdepot.com/uploads/2014/01/thumbnail3.jpg" width="200" height="160" style="max-width: 100%; height: auto;">This grid is a fun and pleasing way to show multiple pieces of information in the same amount of space, by having each section of the grid slide away on click or hover, and display extra content.</p> <p>In the creation process we’ll look at the necessary markup, some styling and making the grid responsive as well as the implementation of an icon web font. We’ll also study the jQuery needed as well as the different options available.</p> <p>This is what it’ll look like once we’ve finished:</p> <p></p> <p> </p> <h1>Creating the grid in HTML</h1> <p>The markup for our grid system is very simple and will pretty much work whatever way you want to build it, but let me explain the essentials: there needs to be a wrapping element around our grid. Then there must be individual sections inside, that will have relative positioning (these will be the visible boxes that make up the grid). Inside of each of those will be two further areas, which will have absolute positioning and fill the entire width and height of their parent element (the box). Then we’ll animate their positions so they’re either “off-screen” or visible.</p> <p>Here’s the code I’m using in the example:</p> <pre>&lt;div id="services" class="cf"&gt;<br>        &lt;section class="service"&gt;<br>              &lt;div class="service-icon"&gt;&lt;span class="icon-web"&gt;&lt;/span&gt;&lt;br/&gt;Web Design&lt;/div&gt;<br>              &lt;div class="service-description"&gt;&lt;p&gt;Something descriptive about web design. And what you offer as a service.&lt;/p&gt;&lt;/div&gt;<br>       &lt;/section&gt;<br>       &lt;section class="service"&gt;<br>              &lt;div class="service-icon"&gt;&lt;span class="icon-graphic"&gt;&lt;/span&gt;&lt;br/&gt;Graphic Design&lt;/div&gt;<br>              &lt;div class="service-description"&gt;&lt;p&gt; ... &lt;/p&gt;&lt;/div&gt;<br>       &lt;/section&gt;<br>       &lt;section class="service"&gt;<br>              &lt;div class="service-icon"&gt;&lt;span class="icon-logo"&gt;&lt;/span&gt;&lt;br/&gt;Logo Design&lt;/div&gt;<br>              &lt;div class="service-description"&gt;&lt;p&gt; ... &lt;/p&gt;&lt;/div&gt;<br>       &lt;/section&gt;<br>       &lt;section class="service"&gt;<br>              &lt;div class="service-icon"&gt;&lt;span class="icon-dev"&gt;&lt;/span&gt;&lt;br/&gt;Web Development&lt;/div&gt;<br>              &lt;div class="service-description"&gt;&lt;p&gt; ... &lt;/p&gt;&lt;/div&gt;<br>       &lt;/section&gt;<br>       &lt;section class="service"&gt;<br>              &lt;div class="service-icon"&gt;&lt;span class="icon-3d"&gt;&lt;/span&gt;&lt;br/&gt;3D Design&lt;/div&gt;<br>              &lt;div class="service-description"&gt;&lt;p&gt; ... &lt;/p&gt;&lt;/div&gt;<br>       &lt;/section&gt;<br>       &lt;section class="service"&gt;<br>              &lt;div class="service-icon"&gt;&lt;span class="icon-illustration"&gt;&lt;/span&gt;&lt;br/&gt;Illustration&lt;/div&gt;<br>              &lt;div class="service-description"&gt;&lt;p&gt; ... &lt;/p&gt;&lt;/div&gt;<br>       &lt;/section&gt;<br>&lt;/div&gt; &lt;!-- END #services --&gt;</pre> <p>So as you can see, pretty simple! There’s a div with an ID of ‘services’ and with a clear float class name. Then inside of that are six different &lt;section&gt; elements. Then as we said earlier, there are two DIVs inside that, one with a span to make our icon using an icon font, and a title. Then there’s a second where you can put the extra content.</p> <p>This is as simple as we’ll go with the markup, that means that if there’s no JavaScript and no CSS it won’t actually break our content, it will still be visible (apart from the icons, but as they’re empty spans we wont see them anyway). So this is our backup, no styles and no JavaScript content:</p> <p><img src="http://netdna.webdesignerdepot.com/uploads/2014/01/slide_001.jpg" width="650" alt="How to create a slidable grid with jQuery" style="max-width: 100%; height: auto;"></p> <p>Now that we’re sure the content is safe. We can move on to our CSS to make it look nice, but more importantly set it up for the jQuery functionality.</p> <p> </p> <h1>Styling the grid with CSS</h1> <p>Let’s break the CSS into three parts; the essential that’s needed to make our jQuery work, the icon font code, and then the final styles to make it look nice. So here’s the first section:</p> <pre>#services .service {<br>        width: 33%;<br>       float: left;<br>       padding: 0.5em;<br>       min-height: 200px;<br>       overflow: hidden;<br>       position: relative;<br>       border: 1px solid #eee;<br>}<br><br>@media screen and (max-width: 600px) {<br>       #services .service {<br>              width: 50%;<br>       }<br>}<br><br>@media screen and (max-width: 320px) {<br>       #services .service {<br>              width: 100%;<br>       }<br>}<br><br>#services .service .service-icon, #services .service .service-description {<br>       position: absolute;<br>       width: 100%;<br>       height: 100%;<br>       top: 0;<br>       left: 0;<br>       background: #fff;<br>       padding: 50px 0;<br>       color: #222;<br>}<br><br>#services .service .service-description {<br>       left: 100%;<br>       background: #249EC2;<br>       color: white;<br>       padding: 50px;<br>}<br><br>#services .service .service-description:hover { cursor: pointer; }</pre> <p>So let’s go through what’s going on here. We’re first targeting the individual box wrappers (.service) and arranging them into the grid shape, by giving them a fluid width, a minimum height and floating them left (that’s why the overall wrapper has a clearfloat fix). Then importantly making their overflow hidden (otherwise we’d see the extra content at all times) and their position relative. We’re then also making this grid more responsive friendly by using a couple media queries for some different screen sizes, and increasing the width of each cell. This code means that our grid will start at a 3 column design at full desktop size, and pass through a two column, and then finally a one column while decreasing screen size.</p> <p>Now that the outer boxes are in place, we target the inner sections, the .service-icon and .service-description. We make these absolute positioned (hence the minimum height in the previous style) and position them both in the top left (we’ll change the description’s position in a moment). We then make them 100% wide and high so they fill their parent element, and the rest is for visual effect only. Finally we target purely the description div, and make the left value 100%. This pushes the entire box off to the right, and out of sight due to the overflow hidden on the .service div. This ‘left’ position value is what we’ll be targeting and animating with the jQuery, and that is why it’s important to define it now.</p> <p> </p> <h1>The icon font</h1> <p>Let’s move on to the next step, here we’ll use @font-face to get our icon font and define the class names that we’ve already used in the HTML to appear as the right icons. The first step is finding an online resource that can create an icon font suited to your needs, there are quite a few out there but for this example I’ve decided to use <a href="http://fontastic.me" rel="nofollow external" class="bo">Fontastic</a>. On the site you first pick the icons you want to use, this obviously changes for whatever project you’re working on. But then you can change some info, like the class names of the icons and the font name like this:</p> <p><img src="http://netdna.webdesignerdepot.com/uploads/2014/01/slide_005.jpg" width="650" alt="How to create a slidable grid with jQuery" style="max-width: 100%; height: auto;"></p> <p>So as you can see I’ve chosen the class names that we used in the HTML so they will match up with no hassle. The service then gives you a download of a ‘fonts’ folder and some code. Place the ‘fonts’ folder in your css folder (or wherever suits you). Then take the code they give and add it to your css file. Here’s what you need:</p> <pre>@font-face {<br>       font-family: "slidable-grid";<br>       src:url("fonts/slidable-grid.eot");<br>       src:url("fonts/slidable-grid.eot?#iefix") format("embedded-opentype"),<br>              url("fonts/slidable-grid.woff") format("woff"),<br>              url("fonts/slidable-grid.ttf") format("truetype"),<br>              url("fonts/slidable-grid.svg#slidable-grid") format("svg");<br>       font-weight: normal;<br>       font-style: normal;<br>}<br><br>[class^="icon-"]:before,<br>[class*=" icon-"]:before {<br>       font-family: "slidable-grid" !important;<br>       font-style: normal !important;<br>       font-weight: normal !important;<br>       font-variant: normal !important;<br>       text-transform: none !important;<br>       speak: none;<br>       font-size: 4em;<br>       line-height: 1;<br>       -webkit-font-smoothing: antialiased;<br>       -moz-osx-font-smoothing: grayscale;<br>}<br><br>.icon-web:before {<br>       content: "a";<br>}<br><br>.icon-graphic:before {<br>       content: "b";<br>}<br><br>.icon-logo:before {<br>       content: "c";<br>}<br><br>.icon-dev:before {<br>       content: "d";<br>}<br><br>.icon-3d:before {<br>       content: "e";<br>}<br><br>.icon-illustration:before {<br>       content: "f";<br>}</pre> <p>And there you have it. If you reload the project, the icons will appear. Now all that’s left is to finish styling to make it look like the final demo.</p> <p> </p> <h1>Final styles</h1> <p>Let’s finish off quickly with the final styles that are left. Here is nothing essential, only design to make it look like we want, so it’s all pretty self explanatory. Here’s the code to center the grid and give it it’s maximum width. Also to make the nice hover effect on the icons:</p> <pre>@import url(reset.css);<br><br>* { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; }<br><br>.cf:before, .cf:after { content: " "; /* 1 */ display: table; /* 2 */ }<br>.cf:after { clear: both; }<br>.cf { *zoom: 1; }<br><br>body {<br>       font-family: 'Exo 2', sans-serif; /* Google Font <a href="http://google.com/fonts">http://google.com/fonts</a> */<br>       text-align: center;<br>       color: #999;<br>       background: #444;<br>       -webkit-font-smoothing: antialiased;<br>}<br><br>#services {<br>       max-width: 850px;<br>       margin: 0 auto;<br>}<br><br>#services .service .service-icon:hover {<br>       cursor: pointer;<br>       color: #249EC2;<br>}<br><br>#services .service .service-icon span {<br>       display: block;<br>       -webkit-transition: all 0.1s linear;<br>       -moz-transition: all 0.1s linear;<br>       transition: all 0.1s linear;<br>}<br><br>#services .service .service-icon:hover span {<br>       position: relative;<br>       bottom: 5px;<br>}</pre> <p> </p> <h1>jQuery functionality</h1> <p>Our goal with the jQuery is to reuse the same snippet of code for the whole grid. We’re going to listen for a click event (on the service box) then when that happens we’ll animate the icon position to move it away, and bring the description in, we’ll also be adding a class name to help with functionality. So first include jQuery on your page, then add our code either in another script file, or inside a &lt;script&gt; tag on the page:</p> <pre>$(document).ready(function() {<br>       $('.service').click(function() {<br>              var $this = $(this);<br>              if ($this.hasClass("open")) {<br>                     $this.find('.service-icon').animate({left: "0"});<br>                     $this.find('.service-description').animate({left: "100%"});<br>                     $this.removeClass("open");<br>              }<br>              else {<br>                     $this.find('.service-icon').animate({left: "-100%"});<br>                     $this.find('.service-description').animate({left: "0"});<br>                     $this.addClass("open");<br>              }<br>       });<br>});</pre> <p>When the page is ready, and when a <em>.service</em> block is clicked, we’re looking to see if the block already has a class name of ‘open’ or not. As they don’t start with one the first ‘if’ section will be ignored. So inside the ‘else’ we’re looking inside the .service block and finding the icon div. We animate the ‘left’ position to -100%. We then find the description block and animate its left position to 0. This brings it into view. Finally we need to add the class of ‘open’ to our service block. That means when it’s clicked and it shows the extra content it will have an added class of <em>open</em> as you can see here:</p> <p><img src="http://netdna.webdesignerdepot.com/uploads/2014/01/slide_007.jpg" width="650" alt="How to create a slidable grid with jQuery" style="max-width: 100%; height: auto;"></p> <p>So now looking back at the ‘if’ statement from earlier, we can see that if we click on a <em>.service</em> block that also has a class of <em>open,</em> then we animate the icon back to 0, and send the description back to 100%. We then remove the class ‘open’ so it is reusable and we can click more than once.</p> <p> </p> <h1>Conclusion and ideas</h1> <p>There it is. This now is a working ‘grid’ system, where each cell has a second side and has two ‘states’. I hope you gained something from this tutorial, this idea is very changeable and adaptable.</p> <p>As you can see in the demo, there’s a second example where the open state is triggered by a hover and not a click. Simply by changing the .click() function in the jQuery to a .hover(). So it’s up to you how far you want to push it. You could animate the position from any direction by simply changing the left to something else, or change the speed.</p> <p>But it should be used in moderation, to add something to the user experience. It’s a useful little snippet to upgrade a simple grid and display content in an interesting way.</p> <p> </p> <p><em><strong>Have you used this code in a project? Do you have a similar method? Let us know in the comments.</strong></em></p> <p><br><br> </p>
    <table width="100%"> <tbody>
    <tr> <td> <a href="http://www.mightydeals.com/deal/respublika-fy-font.html?ref=inwidget" rel="nofollow external" class="bo"><strong>Respublika Font Family (10 styles) – 88% off!</strong></a> </td> <td> <a href="http://www.mightydeals.com/?ref=inwidget" rel="nofollow external" class="bo"><br> <img src="http://mightydeals.com/web/images/widget-logo.png" height="40" width="90" alt="How to create a slidable grid with jQuery" style="max-width: 100%; height: auto;"><br> </a> </td> </tr> </tbody>
    </table> <p><br> </p> <a href="http://www.webdesignerdepot.com/2014/01/how-to-create-a-slidable-grid-with-jquery/" rel="nofollow external" class="bo">Source</a> <br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2014%2F01%2Fhow-to-create-a-slidable-grid-with-jquery%2F&amp;t=How+to+create+a+slidable+grid+with+jQuery" 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.webdesignerdepot.com%2F2014%2F01%2Fhow-to-create-a-slidable-grid-with-jquery%2F&amp;t=How+to+create+a+slidable+grid+with+jQuery" 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.webdesignerdepot.com%2F2014%2F01%2Fhow-to-create-a-slidable-grid-with-jquery%2F&amp;t=How+to+create+a+slidable+grid+with+jQuery" 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.webdesignerdepot.com%2F2014%2F01%2Fhow-to-create-a-slidable-grid-with-jquery%2F&amp;t=How+to+create+a+slidable+grid+with+jQuery" 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.webdesignerdepot.com%2F2014%2F01%2Fhow-to-create-a-slidable-grid-with-jquery%2F&amp;t=How+to+create+a+slidable+grid+with+jQuery" 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/186528246421/u/49/f/661066/c/35285/s/35909798/sc/4/rc/1/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186528246421/u/49/f/661066/c/35285/s/35909798/sc/4/rc/1/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/186528246421/u/49/f/661066/c/35285/s/35909798/sc/4/rc/2/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186528246421/u/49/f/661066/c/35285/s/35909798/sc/4/rc/2/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/186528246421/u/49/f/661066/c/35285/s/35909798/sc/4/rc/3/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186528246421/u/49/f/661066/c/35285/s/35909798/sc/4/rc/3/rc.img" style="max-width: 100%; height: auto;"></a><br><br><a href="http://da.feedsportal.com/r/186528246421/u/49/f/661066/c/35285/s/35909798/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186528246421/u/49/f/661066/c/35285/s/35909798/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>This grid is a fun and pleasing way to show multiple pieces of information in the same amount of space, by having each section of the grid slide away on click or hover, and display extra content....</Summary>
<Website>http://rss.feedsportal.com/c/35285/f/661066/s/35909798/sc/4/l/0L0Swebdesignerdepot0N0C20A140C0A10Chow0Eto0Ecreate0Ea0Eslidable0Egrid0Ewith0Ejquery0C/story01.htm</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/39964/guest@my.umbc.edu/602e88a0dbea5e20d811af30e62667d6/api/pixel</TrackingUrl>
<Tag>art</Tag>
<Tag>css</Tag>
<Tag>css-tutorial</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>html5</Tag>
<Tag>illustrator</Tag>
<Tag>javascript</Tag>
<Tag>jquery</Tag>
<Tag>jquery-animation</Tag>
<Tag>jquery-tutorial</Tag>
<Tag>mysql</Tag>
<Tag>oracle</Tag>
<Tag>photoshop</Tag>
<Tag>php</Tag>
<Tag>slidable-grid</Tag>
<Tag>slidable-panel</Tag>
<Tag>sql</Tag>
<Tag>ux-techniques</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, 06 Jan 2014 11:15:07 -0500</PostedAt>
<EditAt>Mon, 06 Jan 2014 11:15:07 -0500</EditAt>
</NewsItem>

</News>
