<?xml version="1.0"?>
<News hasArchived="true" page="8718" pageCount="10719" pageSize="10" timestamp="Wed, 08 Jul 2026 04:01:54 -0400" url="https://my3.my.umbc.edu/posts.xml?page=8718">
<NewsItem contentIssues="false" id="123300" important="false" status="posted" url="https://my3.my.umbc.edu/posts/123300">
<Title>Thomas Schaller, Political Science, in the Baltimore Sun</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><a href="/wp-content/uploads/2012/08/tom-schaller-11.jpg" rel="nofollow external" class="bo"><img alt="Tom Schaller" src="/wp-content/uploads/2012/08/tom-schaller-11.jpg?w=150" width="150" height="100" style="max-width: 100%; height: auto;"></a>In his latest opinion column for the <a href="http://articles.baltimoresun.com/2013-05-14/news/bs-ed-schaller-guns-20130514_1_gun-owners-gun-access-gun-advocates" rel="nofollow external" class="bo"><em>Baltimore Sun</em></a>, UMBC political science professor Thomas F. Schaller takes on accusations surrounding the recent U.S. Department of Homeland Security purchase of large quantities of ammunition (up to 1.6 billion rounds in some reports)—including claims that the Obama administration is arming itself while simultaneously trying to disarm the citizenry through gun control legislation.</p>
    <p>In researching the purchase, Schaller found:</p>
    <blockquote><p>It turns out the order is closer to 750 million rounds and covers a five-year period and the 70,000 federal officers who require firearm certification or retraining. That’s roughly 2,200 rounds per officer per year; recreational gun users often dispense several hundred rounds during a single firing range visit.</p></blockquote>
    <p>Schaller concludes that this “scandal” is more conspiracy than legitimate critique of government overreach. He suggests that gun advocates would benefit from ignoring such distractions and instead focusing on what he identifies as real examples of government abuse of power, or addressing the risks that can come with gun ownership.</p>
    </div>
]]>
</Body>
<Summary>In his latest opinion column for the Baltimore Sun, UMBC political science professor Thomas F. Schaller takes on accusations surrounding the recent U.S. Department of Homeland Security purchase of...</Summary>
<Website>https://umbc.edu/stories/thomas-schaller-political-science-in-the-baltimore-sun-26/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/123300/guest@my.umbc.edu/de7b51ebdf7b4a9a725c30336aa1797f/api/pixel</TrackingUrl>
<Tag>cahss</Tag>
<Tag>policy-and-society</Tag>
<Tag>politicalscience</Tag>
<Group token="umbc-news-magazine">UMBC News &amp;amp; Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news-magazine</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/original.png?1748556657</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/large.png?1748556657</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/medium.png?1748556657</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/small.png?1748556657</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxsmall.png?1748556657</AvatarUrl>
<Sponsor>UMBC News &amp; Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Wed, 15 May 2013 19:55:14 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="30013" important="false" status="posted" url="https://my3.my.umbc.edu/posts/30013">
<Title>Google&#8217;s Social Network Gets Smarter</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>With dozens of new features, Google’s social network is becoming more like a photo service and a news site.</p>
    <p>Despite the 190 million people that Google says use its social network every month, Google Plus has always struggled to escape Facebook’s shadow and seem like a hopping social destination.</p>
    </div>
]]>
</Body>
<Summary>With dozens of new features, Google’s social network is becoming more like a photo service and a news site.  Despite the 190 million people that Google says use its social network every month,...</Summary>
<Website>http://www.technologyreview.com/news/514836/googles-social-network-gets-smarter/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/30013/guest@my.umbc.edu/5ee042487cc4a2400204722b3399b25f/api/pixel</TrackingUrl>
<Tag>development</Tag>
<Tag>internet</Tag>
<Tag>mit</Tag>
<Tag>technology</Tag>
<Tag>web</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>Wed, 15 May 2013 19:22:00 -0400</PostedAt>
<EditAt>Wed, 15 May 2013 19:22:00 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="29527" important="false" status="posted" url="https://my3.my.umbc.edu/posts/29527">
<Title>Art and Revolution</Title>
<Tagline>UMBC's Polish Solidarity collection: posters, cartoons, news</Tagline>
<Body>
<![CDATA[
    <div class="html-content">
    <p><span>Did you know that art played a pivotal role in Poland’s 1989 Solidarity Movement?  Solidarity was a broad anti-bureaucratic, workers-rights movement in 1980s Poland that eventually became a powerful political force. In addition to publishing over 500 newspapers and broadcasting their message via pirate radio stations, the Solidarity movement used art, particularly posters, to communicate their revolutionary message,  and even created a new school of art—The Polish Poster School—along the way.  Special Collections has a treasure trove of hundreds of posters, handouts, and newspapers. There are copies of the iconic work of graphic designer Jerzy Janiszewski (who created a style of writing known as Solidaric)  as well as Tomasz Sarnecki’s well-known poster that features an image of Gary Cooper from the 1952 film “High <span><span>Noon</span></span>.”</span></p>
    <p><span>View the <a href="http://aok2.lib.umbc.edu/specoll/Solidarity/index.php" rel="nofollow external" class="bo">finding aid</a> for this collection, now available online, for more information about the Solidarity movement and the Solidarity materials held in the Library:</span><span> </span><a href="http://aok2.lib.umbc.edu/specoll/Solidarity/index.php" rel="nofollow external" class="bo">http://aok2.lib.umbc.edu/specoll/Solidarity/index.php</a><span>.</span></p>
    <p><span>Want to come look at the records yourself? Contact Special Collections to set up an appointment at x52353 or <a href="mailto:speccoll@umbc.edu" rel="nofollow external" class="bo">speccoll@umbc.edu</a>. We also hold open research hours <span><span>on Monday</span></span> through <span><span>Friday</span></span>, <span><span>1pm to 4pm</span></span>, with additional hours from <span><span>4pm to 8pm Thursday</span></span> nights.</span></p>
    <p><span><br></span></p>
    <p><span><em>This post was written by Theresa Donnelly</em></span></p>
    </div>
]]>
</Body>
<Summary>Did you know that art played a pivotal role in Poland’s 1989 Solidarity Movement?  Solidarity was a broad anti-bureaucratic, workers-rights movement in 1980s Poland that eventually became a...</Summary>
<Website>http://aok2.lib.umbc.edu/specoll/Solidarity/index.php</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/29527/guest@my.umbc.edu/f7953a3d1fc91052babfcf34343da255/api/pixel</TrackingUrl>
<Tag>active</Tag>
<Tag>archives</Tag>
<Tag>history</Tag>
<Tag>poland</Tag>
<Tag>posters</Tag>
<Tag>solidarity-collection</Tag>
<Tag>special-collections</Tag>
<Group token="library">Albin O. Kuhn Library &amp;amp; Gallery</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/library</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/016/854d6fae5ee42911677c739ee1734486/xsmall.png?1279120404</AvatarUrl>
<AvatarUrl size="original">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/016/854d6fae5ee42911677c739ee1734486/original.png?1279120404</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/016/854d6fae5ee42911677c739ee1734486/xxlarge.png?1279120404</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/016/854d6fae5ee42911677c739ee1734486/xlarge.png?1279120404</AvatarUrl>
<AvatarUrl size="large">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/016/854d6fae5ee42911677c739ee1734486/large.png?1279120404</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/016/854d6fae5ee42911677c739ee1734486/medium.png?1279120404</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/016/854d6fae5ee42911677c739ee1734486/small.png?1279120404</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/016/854d6fae5ee42911677c739ee1734486/xsmall.png?1279120404</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/016/854d6fae5ee42911677c739ee1734486/xxsmall.png?1279120404</AvatarUrl>
<Sponsor>Albin O. Kuhn Library &amp; Gallery</Sponsor>
<ThumbnailUrl size="xxlarge">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/029/527/8b159f0c33071ee7811ca65a505be650/xxlarge.jpg?1368651979</ThumbnailUrl>
<ThumbnailUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/029/527/8b159f0c33071ee7811ca65a505be650/xlarge.jpg?1368651979</ThumbnailUrl>
<ThumbnailUrl size="large">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/029/527/8b159f0c33071ee7811ca65a505be650/large.jpg?1368651979</ThumbnailUrl>
<ThumbnailUrl size="medium">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/029/527/8b159f0c33071ee7811ca65a505be650/medium.jpg?1368651979</ThumbnailUrl>
<ThumbnailUrl size="small">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/029/527/8b159f0c33071ee7811ca65a505be650/small.jpg?1368651979</ThumbnailUrl>
<ThumbnailUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/029/527/8b159f0c33071ee7811ca65a505be650/xsmall.jpg?1368651979</ThumbnailUrl>
<ThumbnailUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/029/527/8b159f0c33071ee7811ca65a505be650/xxsmall.jpg?1368651979</ThumbnailUrl>
<PawCount>14</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 15 May 2013 17:34:11 -0400</PostedAt>
<EditAt>Thu, 16 May 2013 10:39:28 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="29530" important="false" status="posted" url="https://my3.my.umbc.edu/posts/29530">
<Title>Architect: DevOps or Dodos?</Title>
<Body>
<![CDATA[
    <div class="html-content">Avoid extinction by aligning development and operations.</div>
]]>
</Body>
<Summary>Avoid extinction by aligning development and operations.</Summary>
<Website>http://www.oracle.com/technetwork/issue-archive/2013/13-may/o33architect-1935575.html</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/29530/guest@my.umbc.edu/2491a35824572fb94283f382ccd8b9e2/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>oracle</Tag>
<Tag>pl-sql</Tag>
<Tag>sql</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>Wed, 15 May 2013 17:24:15 -0400</PostedAt>
<EditAt>Wed, 15 May 2013 17:24:15 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="29523" important="false" status="posted" url="https://my3.my.umbc.edu/posts/29523">
<Title>Sustainable Design: Green features of our new PAHB building!</Title>
<Tagline>Recycling rain, reducing pollution &amp; saving waver &amp; energy!</Tagline>
<Body>
<![CDATA[
    <div class="html-content">
    <p>The new Performing Arts and Humanities Building is certainly a hub of creativity. But the building is more than a shell to house the arts, it has state of the arts innovations built into it's very structure! </p>
    <p>The new building is still under construction, of course, but in the design, UMBC takes the natural environment into consideration. Protecting health and protecting nature go hand in hand and from non-toxic materials, reducing pollution, and protecting clean water, we have taken things to a whole new level. </p>
    <p>Read on and follow the link below to get the whole picture!</p>
    <p>Enjoy!<br>Tanvi</p>
    <p><a href="http://www.umbc.edu/pahb/sustainable_design.html" rel="nofollow external" class="bo">http://www.umbc.edu/pahb/sustainable_design.html</a></p>
    <p> </p>
    <h2>Sustainable Design Strategies</h2>
    <p><img alt="LEED facts" src="http://www.umbc.edu/pahb/images/leed_facts.jpg" style="max-width: 100%; height: auto;"><br><br><em>SITE<br></em>Rainwater Harvesting (for on-site irragation)<br>Reduce Impervious Area (increased storm water drainage)<br>Pervious Concrete Sidewalks<br>Reduced Light Pollution<br>White Roof (reducing urban heat island effect)<br>Integrated With Proximity to Public Transportation<br>Promote Bicycle Usage<br><br><em>ENERGY &amp; WATER<br></em>HVAC Energy Modeling Design (reduce building operating cost)<br>Enhanced Commissioning (Increase efficiency and operation of HVAC and lighting systems)<br>Zero USe of CFC-based Refrigerants<br>HVAC System (flush out prior to occupancy)<br>Reduce Water Consumption by 40%<br>Sun Control Devices<br>Work With UMBC on Purchasing Green Power<br><br><em>INDOOR ENVIRONMENT QUALITY<br></em>Controllability of Systems (lighting and temperature controls)<br>Daylighting and Views of 75% of Space (creates healthier learning environment, increased attendance and grades)<br>Materials (regional, low-emitting, and no-VOC)<br>Implement Indoor Air Quality Management Plan During Construction (monitor to ensure appropriate ventilation)</p>
    </div>
]]>
</Body>
<Summary>The new Performing Arts and Humanities Building is certainly a hub of creativity. But the building is more than a shell to house the arts, it has state of the arts innovations built into it's very...</Summary>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/29523/guest@my.umbc.edu/c9c00549edb7076ca20f042fb178b06f/api/pixel</TrackingUrl>
<Tag>biking</Tag>
<Tag>design</Tag>
<Tag>energy</Tag>
<Tag>environment</Tag>
<Tag>green</Tag>
<Tag>impervious</Tag>
<Tag>irragation</Tag>
<Tag>leed</Tag>
<Tag>pollution</Tag>
<Tag>power</Tag>
<Tag>rain</Tag>
<Tag>recycling</Tag>
<Tag>stormwater</Tag>
<Tag>sustainability</Tag>
<Tag>transportation</Tag>
<Tag>water</Tag>
<Tag>watershed</Tag>
<Group token="sustainability">Sustainability Matters at UMBC</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/sustainability</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/086/91091ac32f525d88daa6d6b721420ac1/xsmall.png?1586269437</AvatarUrl>
<AvatarUrl size="original">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/086/91091ac32f525d88daa6d6b721420ac1/original.png?1586269437</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/086/91091ac32f525d88daa6d6b721420ac1/xxlarge.png?1586269437</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/086/91091ac32f525d88daa6d6b721420ac1/xlarge.png?1586269437</AvatarUrl>
<AvatarUrl size="large">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/086/91091ac32f525d88daa6d6b721420ac1/large.png?1586269437</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/086/91091ac32f525d88daa6d6b721420ac1/medium.png?1586269437</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/086/91091ac32f525d88daa6d6b721420ac1/small.png?1586269437</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/086/91091ac32f525d88daa6d6b721420ac1/xsmall.png?1586269437</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/086/91091ac32f525d88daa6d6b721420ac1/xxsmall.png?1586269437</AvatarUrl>
<Sponsor>UMBC SUSTAINABILITY</Sponsor>
<ThumbnailUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/029/523/7a769d43321df14f25c7a2318bb8c4a5/xxlarge.jpg?1368649272</ThumbnailUrl>
<ThumbnailUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/029/523/7a769d43321df14f25c7a2318bb8c4a5/xlarge.jpg?1368649272</ThumbnailUrl>
<ThumbnailUrl size="large">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/029/523/7a769d43321df14f25c7a2318bb8c4a5/large.jpg?1368649272</ThumbnailUrl>
<ThumbnailUrl size="medium">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/029/523/7a769d43321df14f25c7a2318bb8c4a5/medium.jpg?1368649272</ThumbnailUrl>
<ThumbnailUrl size="small">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/029/523/7a769d43321df14f25c7a2318bb8c4a5/small.jpg?1368649272</ThumbnailUrl>
<ThumbnailUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/029/523/7a769d43321df14f25c7a2318bb8c4a5/xsmall.jpg?1368649272</ThumbnailUrl>
<ThumbnailUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/029/523/7a769d43321df14f25c7a2318bb8c4a5/xxsmall.jpg?1368649272</ThumbnailUrl>
<PawCount>3</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 15 May 2013 16:58:04 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="30014" important="false" status="posted" url="https://my3.my.umbc.edu/posts/30014">
<Title>Google Wants to Help Apps Track You</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>Google will help people who build Android apps follow their users around without draining too much battery life.</p>
    <p>Google is giving mobile app creators more ways to tap into people’s activities and locations without draining too much phone battery power.</p>
    </div>
]]>
</Body>
<Summary>Google will help people who build Android apps follow their users around without draining too much battery life.  Google is giving mobile app creators more ways to tap into people’s activities and...</Summary>
<Website>http://www.technologyreview.com/news/514956/google-wants-to-help-apps-track-you/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/30014/guest@my.umbc.edu/1e3474641ba02594217f1d0f0621d3a2/api/pixel</TrackingUrl>
<Tag>development</Tag>
<Tag>internet</Tag>
<Tag>mit</Tag>
<Tag>technology</Tag>
<Tag>web</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>Wed, 15 May 2013 16:19:21 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="29524" important="false" status="posted" url="https://my3.my.umbc.edu/posts/29524">
<Title>Congratulations to our New Officers</Title>
<Body>
<![CDATA[
    <div class="html-content">Our new officers were announced this afternoon at our End of Year Social. They are:<div>President: Donald Richardson</div>
    <div>Vice-President: Dean Weiss</div>
    <div>Secretary: Lauren Adamsen</div>
    <div>Treasure: Pranjal Singh</div>
    <div>Webmaster: Julian Sass</div>
    <div><br></div>
    <div>Congratulations and good luck in the coming year!</div>
    </div>
]]>
</Body>
<Summary>Our new officers were announced this afternoon at our End of Year Social. They are: President: Donald Richardson  Vice-President: Dean Weiss  Secretary: Lauren Adamsen  Treasure: Pranjal Singh...</Summary>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/29524/guest@my.umbc.edu/9c5ec9e62c82a998cf62e1599dbf0158/api/pixel</TrackingUrl>
<Group token="retired-433">Pi Mu Epsilon</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-433</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/images/avatars/group/10/xsmall.png?1783426507</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/images/avatars/group/10/original.png?1783426507</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/images/avatars/group/10/xxlarge.png?1783426507</AvatarUrl>
<AvatarUrl size="xlarge">https://assets3-my.umbc.edu/images/avatars/group/10/xlarge.png?1783426507</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/images/avatars/group/10/large.png?1783426507</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/images/avatars/group/10/medium.png?1783426507</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/images/avatars/group/10/small.png?1783426507</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/images/avatars/group/10/xsmall.png?1783426507</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/images/avatars/group/10/xxsmall.png?1783426507</AvatarUrl>
<Sponsor>Pi Mu Epsilon</Sponsor>
<PawCount>1</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 15 May 2013 16:19:14 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="29520" important="false" status="posted" url="https://my3.my.umbc.edu/posts/29520">
<Title>How to Write Testable and Maintainable Code in PHP</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <a href="http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=31726&amp;c=1165275806" rel="nofollow external" class="bo"><img src="http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=31726&amp;c=1165275806" alt="" style="max-width: 100%; height: auto;"></a><p>Frameworks provide a tool for rapid application development, but often accrue technical debt as rapidly as they allow you to create functionality. Technical debt is created when maintainability isn't a purposeful focus of the developer. Future changes and debugging become costly, due to a lack of unit testing and structure.</p>
    <p>Here's how to begin structuring your code to achieve testability and maintainability – and save you time.</p>
    <p></p>
    <hr>
    <h2>We'll Cover (loosely)</h2>
    <ol>
    <li>DRY</li>
    <li>Dependency Injection</li>
    <li>Interfaces</li>
    <li>Containers</li>
    <li>Unit Tests with PHPUnit</li>
    </ol>
    <p>Let's begin with some contrived, but typical code. This might be a model class in any given framework.</p>
    <pre>class User {&#x000A;    &#x000A;    public function getCurrentUser()&#x000A;    {&#x000A;        $user_id = $_SESSION['user_id'];&#x000A;    &#x000A;        $user = App::db-&gt;select('id, username')&#x000A;                        -&gt;where('id', $user_id)&#x000A;                        -&gt;limit(1)&#x000A;                        -&gt;get();&#x000A;    &#x000A;        if ( $user-&gt;num_results() &gt; 0 )&#x000A;        {&#x000A;                return $user-&gt;row();&#x000A;        }&#x000A;    &#x000A;        return false;&#x000A;    }&#x000A;    &#x000A;    }&#x000A;    </pre>
    <p>This code will work, but needs improvement:</p>
    <ol>
    <li>This isn't testable.<ul>
    <li>We're relying on the <code>$_SESSION</code> global variable. Unit-testing frameworks, such as PHPUnit, rely on the command-line, where <code>$_SESSION</code> and many other global variables aren't available.</li>
    <li>We're relying on the database connection. Ideally, actual database connections should be avoided in a unit-test. Testing is about code, not about data.</li>
    </ul>
    </li>
    <li>This code isn't as maintainable as it could be. For instance, if we change the data source, we'll need to change the database code in every instance of <code>App::db</code> used in our application. Also, what about instances where we don't want just the current user's information?</li>
    </ol>
    <h4>An Attempted Unit Test</h4>
    <p>Here's an attempt to create a unit test for the above functionality.</p>
    <pre>class UserModelTest extends PHPUnit_Framework_TestCase {&#x000A;    &#x000A;        public function testGetUser()&#x000A;        {&#x000A;            $user = new User();&#x000A;    &#x000A;            $currentUser = $user-&gt;getCurrentUser();&#x000A;    &#x000A;            $this-&gt;assertEquals(1, $currentUser-&gt;id);&#x000A;        }&#x000A;    &#x000A;    }&#x000A;    </pre>
    <p>Let's examine this. First, the test will fail. The <code>$_SESSION</code> variable used in the <code>User</code> object doesn't exist in a unit test, as it runs PHP in the command line.</p>
    <p>Second, there's no database connection setup. This means that, in order to make this work, we will need to bootstrap our application in order to get the <code>App</code> object and its <code>db</code> object. We'll also need a working database connection to test against.</p>
    <p>To make this unit test work, we would need to:</p>
    <ol>
    <li>Setup a config setup for a CLI (PHPUnit) run in our application</li>
    <li>Rely on a database connection. Doing this means relying on a data source separate from our unit test. What if our test database doesn't have the data we're expecting? What if our database connection is slow?</li>
    <li>Relying on an application being bootstrapped increases the overhead of the tests, slowing the unit tests down dramatically. Ideally, most of our code can be tested independent of the framework being used.</li>
    </ol>
    <p>So, let's get down to how we can improve this.</p>
    <hr>
    <h2>Keep Code DRY</h2>
    <p>The function retrieving the current user is unnecessary in this simple context. This is a contrived example, but in the spirit of DRY principles, the first optimization I'm choosing to make is to generalize this method.</p>
    <pre>class User {&#x000A;    &#x000A;        public function getUser($user_id)&#x000A;        {&#x000A;            $user = App::db-&gt;select('user')&#x000A;                            -&gt;where('id', $user_id)&#x000A;                            -&gt;limit(1)&#x000A;                            -&gt;get();&#x000A;    &#x000A;            if ( $user-&gt;num_results() &gt; 0 )&#x000A;            {&#x000A;                return $user-&gt;row();&#x000A;            }&#x000A;    &#x000A;            return false;&#x000A;        }&#x000A;    &#x000A;    }&#x000A;    </pre>
    <p>This provides a method we can use across our entire application. We can pass in the current user at the time of the call, rather than passing that functionality off to the model. Code is more modular and maintainable when it doesn't rely on other functionalities (such as the session global variable).</p>
    <p>However, this is still not testable and maintainable as it could be. We're still relying on the database connection.</p>
    <hr>
    <h2>Dependency Injection</h2>
    <p>Let's help improve the situation by adding some Dependency Injection. Here's what our model might look like, when we pass the database connnection into the class.</p>
    <pre>class User {&#x000A;    &#x000A;        protected $_db;&#x000A;    &#x000A;        public function __construct($db_connection)&#x000A;        {&#x000A;            $this-&gt;_db = $db_connection;&#x000A;        }&#x000A;    &#x000A;        public function getUser($user_id)&#x000A;        {&#x000A;            $user = $this-&gt;_db-&gt;select('user')&#x000A;                            -&gt;where('id', $user_id)&#x000A;                            -&gt;limit(1)&#x000A;                            -&gt;get();&#x000A;    &#x000A;            if ( $user-&gt;num_results() &gt; 0 )&#x000A;            {&#x000A;                return $user-&gt;row();&#x000A;            }&#x000A;    &#x000A;            return false;&#x000A;        }&#x000A;    &#x000A;    }&#x000A;    </pre>
    <p>Now, the dependencies of our <code>User</code> model are provided for. Our class no longer assumes a certain database connection, nor relies on any global objects.</p>
    <p>At this point, our class is basically testable. We can pass in a data-source of our choice (mostly) and a user id, and test the results of that call. We can also switch out separate database connections (assuming that both implement the same methods for retrieving data). Cool.</p>
    <p>Let's look at what a unit test might look like for that.</p>
    <pre>&lt;?php&#x000A;    &#x000A;    use Mockery as m;&#x000A;    use Fideloper\User;&#x000A;    &#x000A;    class SecondUserTest extends PHPUnit_Framework_TestCase {&#x000A;    &#x000A;        public function testGetCurrentUserMock()&#x000A;        {&#x000A;            $db_connection = $this-&gt;_mockDb();&#x000A;    &#x000A;            $user = new User( $db_connection );&#x000A;    &#x000A;            $result = $user-&gt;getUser( 1 );&#x000A;    &#x000A;            $expected = new StdClass();&#x000A;            $expected-&gt;id = 1;&#x000A;            $expected-&gt;username = 'fideloper';&#x000A;    &#x000A;            $this-&gt;assertEquals( $result-&gt;id, $expected-&gt;id, 'User ID set correctly' );&#x000A;            $this-&gt;assertEquals( $result-&gt;username, $expected-&gt;username, 'Username set correctly' );&#x000A;        }&#x000A;    &#x000A;        protected function _mockDb()&#x000A;        {&#x000A;            // "Mock" (stub) database row result object&#x000A;            $returnResult = new StdClass();&#x000A;            $returnResult-&gt;id = 1;&#x000A;            $returnResult-&gt;username = 'fideloper';&#x000A;    &#x000A;            // Mock database result object&#x000A;            $result = m::mock('DbResult');&#x000A;            $result-&gt;shouldReceive('num_results')-&gt;once()-&gt;andReturn( 1 );&#x000A;            $result-&gt;shouldReceive('row')-&gt;once()-&gt;andReturn( $returnResult );&#x000A;    &#x000A;            // Mock database connection object&#x000A;            $db = m::mock('DbConnection');&#x000A;    &#x000A;            $db-&gt;shouldReceive('select')-&gt;once()-&gt;andReturn( $db );&#x000A;            $db-&gt;shouldReceive('where')-&gt;once()-&gt;andReturn( $db );&#x000A;            $db-&gt;shouldReceive('limit')-&gt;once()-&gt;andReturn( $db );&#x000A;            $db-&gt;shouldReceive('get')-&gt;once()-&gt;andReturn( $result );&#x000A;    &#x000A;            return $db;&#x000A;        }&#x000A;    &#x000A;    }&#x000A;    </pre>
    <p>I've added something new to this unit test: Mockery. Mockery lets you "mock" (fake) PHP objects. In this case, we're mocking the database connection. With our mock, we can skip over testing a database connection and simply test our model.</p>
    <blockquote><p>Want to <a href="http://net.tutsplus.com/tutorials/php/mockery-a-better-way/" rel="nofollow external" class="bo">learn more about Mockery</a>?</p></blockquote>
    <p>In this case, we're mocking a SQL connection. We're telling the mock object to expect to have the <code>select</code>, <code>where</code>, <code>limit</code> and <code>get</code> methods called on it. I am returning the Mock, itself, to mirror how the SQL connection object returns itself (<code>$this</code>), thus making its method calls "chainable". Note that, for the <code>get</code> method, I return the database call result – a <code>stdClass</code> object with the user data populated.</p>
    <p>This solves a few problems:</p>
    <ol>
    <li>We're testing only our model class. We're not also testing a database connection.</li>
    <li>We're able to control the inputs and outputs of the mock database connection, and, therefore, can reliably test against the result of the database call. I know I'll get a user ID of "1" as a result of the mocked database call.</li>
    <li>We don't need to bootstrap our application or have any configuration or database present to test.</li>
    </ol>
    <p>We can still do much better. Here's where it gets interesting.</p>
    <hr>
    <h2>Interfaces</h2>
    <p>To improve this further, we could define and implement an interface. Consider the following code.</p>
    <pre>interface UserRepositoryInterface {&#x000A;        public function getUser($user_id);&#x000A;    }&#x000A;    &#x000A;    class MysqlUserRepository implements UserRepositoryInterface {&#x000A;    &#x000A;        protected $_db;&#x000A;    &#x000A;        public function __construct($db_conn)&#x000A;        {&#x000A;            $this-&gt;_db = $db_conn;&#x000A;        }&#x000A;    &#x000A;        public function getUser($user_id)&#x000A;        {&#x000A;            $user = $this-&gt;_db-&gt;select('user')&#x000A;                        -&gt;where('id', $user_id)&#x000A;                        -&gt;limit(1)&#x000A;                        -&gt;get();&#x000A;    &#x000A;            if ( $user-&gt;num_results() &gt; 0 )&#x000A;            {&#x000A;                return $user-&gt;row();&#x000A;            }&#x000A;    &#x000A;            return false;&#x000A;        }&#x000A;    &#x000A;    }&#x000A;    &#x000A;    class User {&#x000A;    &#x000A;        protected $userStore;&#x000A;    &#x000A;        public function __construct(UserRepositoryInterface $user)&#x000A;        {&#x000A;            $this-&gt;userStore = $user;&#x000A;        }&#x000A;    &#x000A;        public function getUser($user_id)&#x000A;        {&#x000A;            return $this-&gt;userStore-&gt;getUser($user_id);&#x000A;        }&#x000A;    &#x000A;    }&#x000A;    </pre>
    <p>There's a few things happening here.</p>
    <ol>
    <li>First, we define an interface for our user <em>data source</em>. This defines the <code>addUser()</code> method.</li>
    <li>Next, we implement that interface. In this case, we create a MySQL implementation. We accept a database connection object, and use it to grab a user from the database.</li>
    <li>Lastly, we enforce the use of a class implementing the <code>UserInterface</code> in our <code>User</code> model. This guarantees that the data source will always have a <code>getUser()</code> method available, no matter which data source is used to implement <code>UserInterface</code>.</li>
    </ol>
    <blockquote><p>Note that our <code>User</code> object type-hints <code>UserInterface</code> in its constructor. This means that a class implementing <code>UserInterface</code> MUST be passed into the <code>User</code> object. This is a guarantee we are relying on – we need the <code>getUser</code> method to always be available.</p></blockquote>
    <p>What is the result of this?</p>
    <ul>
    <li>Our code is now <em>fully</em> testable. For the <code>User</code> class, we can easily mock the data source. (Testing the implementations of the datasource would be the job of a separate unit test).</li>
    <li>Our code is <em>much</em> more maintainable. We can switch out different data sources without having to change code throughout our application.</li>
    <li>We can create <em>ANY</em> data source. ArrayUser, MongoDbUser, CouchDbUser, MemoryUser, etc.</li>
    <li>We can easily pass any data source to our <code>User</code> object if we need to.  If you decide to ditch SQL, you can just create a different implementation (for instance, <code>MongoDbUser</code>) and pass that into your <code>User</code> model.</li>
    </ul>
    <p>We've simplified our unit test, as well!</p>
    <pre>&lt;?php&#x000A;    &#x000A;    use Mockery as m;&#x000A;    use Fideloper\User;&#x000A;    &#x000A;    class ThirdUserTest extends PHPUnit_Framework_TestCase {&#x000A;    &#x000A;        public function testGetCurrentUserMock()&#x000A;        {&#x000A;            $userRepo = $this-&gt;_mockUserRepo();&#x000A;    &#x000A;            $user = new User( $userRepo );&#x000A;    &#x000A;            $result = $user-&gt;getUser( 1 );&#x000A;    &#x000A;            $expected = new StdClass();&#x000A;            $expected-&gt;id = 1;&#x000A;            $expected-&gt;username = 'fideloper';&#x000A;    &#x000A;            $this-&gt;assertEquals( $result-&gt;id, $expected-&gt;id, 'User ID set correctly' );&#x000A;            $this-&gt;assertEquals( $result-&gt;username, $expected-&gt;username, 'Username set correctly' );&#x000A;        }&#x000A;    &#x000A;        protected function _mockUserRepo()&#x000A;        {&#x000A;            // Mock expected result&#x000A;            $result = new StdClass();&#x000A;            $result-&gt;id = 1;&#x000A;            $result-&gt;username = 'fideloper';&#x000A;    &#x000A;            // Mock any user repository&#x000A;            $userRepo = m::mock('Fideloper\Third\Repository\UserRepositoryInterface');&#x000A;            $userRepo-&gt;shouldReceive('getUser')-&gt;once()-&gt;andReturn( $result );&#x000A;    &#x000A;            return $userRepo;&#x000A;        }&#x000A;    &#x000A;    }&#x000A;    </pre>
    <p>We've taken the work of mocking a database connection out completely. Instead, we simply mock the data source, and tell it what to do when <code>getUser</code> is called.</p>
    <p>But, we can still do better!</p>
    <hr>
    <h2>Containers</h2>
    <p>Consider the usage of our current code:</p>
    <pre>// In some controller&#x000A;    $user = new User( new MysqlUser( App:db-&gt;getConnection("mysql") ) );&#x000A;    $user-&gt;id = App::session("user-&gt;id");&#x000A;    &#x000A;    $currentUser = $user-&gt;getUser($user_id);&#x000A;    </pre>
    <p>Our final step will be to introduce <em>containers</em>. In the above code, we need to create and use a bunch of objects just to get our current user. This code might be littered across your application. If you need to switch from MySQL to MongoDB, you'll <em>still</em> need to edit every place where the above code appears. That's hardly DRY. <a href="http://pimple.sensiolabs.org/" rel="nofollow external" class="bo">Containers</a> can fix this.</p>
    <p>A container simply "contains" an object or functionality. It's similar to a registry in your application. We can use a container to automatically instantiate a new <code>User</code> object with all needed dependencies. Below, I use <a href="http://pimple.sensiolabs.org/" rel="nofollow external" class="bo">Pimple</a>, a popular container class.</p>
    <pre>// Somewhere in a configuration file&#x000A;    $container = new Pimple();&#x000A;    $container["user"] = function() {&#x000A;        return new User( new MysqlUser( App:db-&gt;getConnection('mysql') ) );&#x000A;    }&#x000A;    &#x000A;    // Now, in all of our controllers, we can simply write:&#x000A;    $currentUser = $container['user']-&gt;getUser( App::session('user_id') );&#x000A;    </pre>
    <p>I've moved the creation of the <code>User</code> model into one location in the application configuration. As a result:</p>
    <ol>
    <li>We've kept our code DRY. The <code>User</code> object and the data store of choice is defined in one location in our application.</li>
    <li>We can switch out our <code>User</code> model from using MySQL to any other data source in <strong>ONE</strong> location. This is vastly more maintainable.</li>
    </ol>
    <hr>
    <h2>Final Thoughts</h2>
    <p>Over the course of this tutorial, we accomplished the following:</p>
    <ol>
    <li>Kept our code DRY and reusable</li>
    <li>Created maintainable code – We can switch out data sources for our objects in one location for the entire application if needed</li>
    <li>Made our code testable – We can mock objects easily without relying on bootstrapping our application or creating a test database</li>
    <li>Learned about using Dependency Injection and Interfaces, in order to enable creating testable and maintainable code</li>
    <li>Saw how containers can aid in making our application more maintainable</li>
    </ol>
    <p>I'm sure you've noticed that we've added much more code in the name of maintainability and testability. A strong argument can be made against this implementation: we're increasing complexity. Indeed, this requires a deeper knowledge of code, both for the main author and for collaborators of a project.</p>
    <p>However, the cost of explanation and understanding is far out-weighed by the extra overall <em>decrease</em> in technical debt.</p>
    <ul>
    <li>The code is vastly more maintainable, making changes possible in one location, rather than several.</li>
    <li>Being able to unit test (quickly) will reduce bugs in code by a large margin – especially in long-term or community-driven (open-source) projects.</li>
    <li>Doing the extra-work up front <em>will</em> save time and headache later.</li>
    </ul>
    <h3>Resources</h3>
    <p>You may include <strong>Mockery</strong> and <strong>PHPUnit</strong> into your application easily using <a href="http://getcomposer.org/" rel="nofollow external" class="bo">Composer</a>. Add these to your "require-dev" section in your <code>composer.json</code> file:</p>
    <pre>"require-dev": {&#x000A;        "mockery/mockery": "0.8.*",&#x000A;        "phpunit/phpunit": "3.7.*"&#x000A;    }&#x000A;    </pre>
    <p>You can then install your Composer-based dependencies with the "dev" requirements:</p>
    <pre>$ php composer.phar install --dev&#x000A;    </pre>
    <p>Learn more about Mockery, Composer and PHPUnit here on Nettuts+.</p>
    <ul>
    <li><a href="http://net.tutsplus.com/tutorials/php/mockery-a-better-way/" rel="nofollow external" class="bo">Mockery: A Better Way</a></li>
    <li><a href="http://net.tutsplus.com/tutorials/php/easy-package-management-with-composer/" rel="nofollow external" class="bo">Easy Package Management With Composer</a></li>
    <li><a href="http://net.tutsplus.com/sessions/test-driven-php/" rel="nofollow external" class="bo">Test-Driven PHP</a></li>
    </ul>
    <p>For PHP, consider using Laravel 4, as it makes exceptional use of <a href="http://four.laravel.com/docs/ioc" rel="nofollow external" class="bo">containers</a> and other concepts written about here.</p>
    <p>Thanks for reading!</p>
    </div>
]]>
</Body>
<Summary>Frameworks provide a tool for rapid application development, but often accrue technical debt as rapidly as they allow you to create functionality. Technical debt is created when maintainability...</Summary>
<Website>http://feedproxy.google.com/~r/nettuts/~3/l6VzPp300us/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/29520/guest@my.umbc.edu/b5f3015696a42eef6d710a874e1f0af2/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>tdd</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>Wed, 15 May 2013 16:08:11 -0400</PostedAt>
<EditAt>Wed, 15 May 2013 16:08:11 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="29525" important="false" status="posted" url="https://my3.my.umbc.edu/posts/29525">
<Title>User Modeling for Accessibility - Online Symposium - Call for Papers</Title>
<Body>
<![CDATA[
    <div class="html-content"><p>The <a href="http://www.w3.org/WAI/RD" rel="nofollow external" class="bo">Research and Development Working Group (RDWG)</a> will hold an online symposium to explore user modeling for accessibility, an approach for generating and adapting user interfaces to address particular user needs and preferences. The <a href="http://www.w3.org/WAI/RD/2013/user-modeling/cfp.html" rel="nofollow external" class="bo">Call for Papers</a> is open until 6 June 2013. Learn more about the <a href="http://www.w3.org/WAI/RD/2013/user-modeling/" rel="nofollow external" class="bo">User Modeling for Accessibility Symposium</a> to be held on 15 July 2013, and the Web Accessibility Initiative (<a href="http://www.w3.org/WAI/" rel="nofollow external" class="bo">WAI</a>).</p></div>
]]>
</Body>
<Summary>The Research and Development Working Group (RDWG) will hold an online symposium to explore user modeling for accessibility, an approach for generating and adapting user interfaces to address...</Summary>
<Website>http://www.w3.org/News/2013.html#entry-9823</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/29525/guest@my.umbc.edu/1f6957de747216b61e842e701fe27890/api/pixel</TrackingUrl>
<Tag>browsers-and-authoring-tools</Tag>
<Tag>css</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>home-page-stories</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>sql</Tag>
<Tag>w3</Tag>
<Tag>web</Tag>
<Tag>web-design-and-applications</Tag>
<Tag>web-of-services</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>Wed, 15 May 2013 16:04:51 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="110158" important="false" status="posted" url="https://my3.my.umbc.edu/posts/110158">
<Title>Thomas Schaller, Political Science, in the Baltimore Sun</Title>
<Body>
<![CDATA[
    <div class="html-content">In his latest opinion column for the Baltimore Sun, UMBC political science professor Thomas F. Schaller takes on accusations surrounding the recent U.S. Department of Homeland Security purchase of large quantities of ammunition (up to 1.6 billion rounds in some reports)—including claims that the Obama administration is arming itself while simultaneously trying to disarm the citizenry through gun control legislation. In researching the purchase, Schaller found: It turns out the order is closer to 750 million rounds and covers a five-year period and the 70,000 federal officers who require firearm certification or retraining. That’s roughly 2,200 rounds per officer per …</div>
]]>
</Body>
<Summary>In his latest opinion column for the Baltimore Sun, UMBC political science professor Thomas F. Schaller takes on accusations surrounding the recent U.S. Department of Homeland Security purchase of...</Summary>
<Website>https://news.umbc.edu/thomas-schaller-political-science-in-the-baltimore-sun-26/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/110158/guest@my.umbc.edu/e4230d275e053da7835df3dd423381be/api/pixel</TrackingUrl>
<Tag>cahss</Tag>
<Tag>policy-and-society</Tag>
<Tag>politicalscience</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>Wed, 15 May 2013 15:55:14 -0400</PostedAt>
</NewsItem>

</News>
